From 03dfd8c7c1f6b02fbf3d645e096cf2a65f36cb17 Mon Sep 17 00:00:00 2001 From: david Date: Tue, 19 Jan 2010 16:32:53 +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.SpTBXLib@4 aa3591e4-a9f2-482a-ba07-9d38a056ee4e --- .../2.4.4/1/Demos/Customizer/Customizer.dpr | 15 + internal/2.4.4/1/Demos/Customizer/Unit1.dfm | 1602 +++ internal/2.4.4/1/Demos/Customizer/Unit1.pas | 363 + internal/2.4.4/1/Demos/Customizer/Unit2.dfm | 1230 ++ internal/2.4.4/1/Demos/Customizer/Unit2.pas | 78 + .../2.4.4/1/Demos/Customizer/advanced.txt | 55 + internal/2.4.4/1/Demos/Customizer/faq.txt | 33 + .../2.4.4/1/Demos/Customizer/gnugettext.pas | 2995 +++++ .../2.4.4/1/Demos/Customizer/langcodes.txt | 16 + .../locale/ar/LC_MESSAGES/default.mo | Bin 0 -> 5570 bytes .../locale/ar/LC_MESSAGES/default.po | 561 + .../locale/de/LC_MESSAGES/default.mo | Bin 0 -> 3551 bytes .../locale/de/LC_MESSAGES/default.po | 558 + .../1/Demos/Customizer/locale/default.po | 561 + .../locale/es/LC_MESSAGES/default.mo | Bin 0 -> 4897 bytes .../locale/es/LC_MESSAGES/default.po | 558 + .../locale/fi/LC_MESSAGES/default.mo | Bin 0 -> 3175 bytes .../locale/fi/LC_MESSAGES/default.po | 558 + .../locale/fr/LC_MESSAGES/default.mo | Bin 0 -> 3181 bytes .../locale/fr/LC_MESSAGES/default.po | 558 + .../2.4.4/1/Demos/Customizer/locale/ignore.po | 62 + .../locale/ja/LC_MESSAGES/default.mo | Bin 0 -> 3366 bytes .../locale/ja/LC_MESSAGES/default.po | 557 + .../locale/ko/LC_MESSAGES/default.mo | Bin 0 -> 5026 bytes .../locale/ko/LC_MESSAGES/default.po | 557 + .../locale/nl/LC_MESSAGES/default.mo | Bin 0 -> 3150 bytes .../locale/nl/LC_MESSAGES/default.po | 557 + .../locale/pt_BR/LC_MESSAGES/default.mo | Bin 0 -> 3227 bytes .../locale/pt_BR/LC_MESSAGES/default.po | 558 + .../locale/ru/LC_MESSAGES/default.mo | Bin 0 -> 3776 bytes .../locale/ru/LC_MESSAGES/default.po | 557 + .../locale/sr_Cyrillic/LC_MESSAGES/default.mo | Bin 0 -> 3808 bytes .../locale/sr_Cyrillic/LC_MESSAGES/default.po | 557 + .../locale/sr_Latin/LC_MESSAGES/default.mo | Bin 0 -> 3189 bytes .../locale/sr_Latin/LC_MESSAGES/default.po | 557 + .../locale/sv/LC_MESSAGES/default.mo | Bin 0 -> 3103 bytes .../locale/sv/LC_MESSAGES/default.po | 557 + .../locale/tr/LC_MESSAGES/default.mo | Bin 0 -> 3239 bytes .../locale/tr/LC_MESSAGES/default.po | 557 + .../locale/zh_CN/LC_MESSAGES/default.mo | Bin 0 -> 3101 bytes .../locale/zh_CN/LC_MESSAGES/default.po | 491 + .../2.4.4/1/Demos/Customizer/translations.txt | 28 + .../1/Demos/FormPopupMenu/FormPopupMenu.dpr | 17 + .../2.4.4/1/Demos/FormPopupMenu/Unit1.dfm | 200 + .../2.4.4/1/Demos/FormPopupMenu/Unit1.pas | 123 + .../2.4.4/1/Demos/FormPopupMenu/Unit2.dfm | 27 + .../2.4.4/1/Demos/FormPopupMenu/Unit2.pas | 50 + .../2.4.4/1/Demos/FormPopupMenu/Unit3.dfm | 36 + .../2.4.4/1/Demos/FormPopupMenu/Unit3.pas | 102 + internal/2.4.4/1/Demos/Overview/Overview.dpr | 13 + .../2.4.4/1/Demos/Overview/Skins/WMP11.skn | 380 + internal/2.4.4/1/Demos/Overview/Unit1.dfm | 1901 +++ internal/2.4.4/1/Demos/Overview/Unit1.pas | 431 + internal/2.4.4/1/Demos/Overview/hint.bmp | Bin 0 -> 21654 bytes internal/2.4.4/1/LICENSE.txt | 9 + .../2.4.4/1/Lib/D11/SpTBXColorPickerForm.dcu | Bin 0 -> 19043 bytes .../2.4.4/1/Lib/D11/SpTBXColorPickerForm.dfm | 3025 +++++ internal/2.4.4/1/Lib/D11/SpTBXControls.dcu | Bin 0 -> 142754 bytes internal/2.4.4/1/Lib/D11/SpTBXCustomizer.dcu | Bin 0 -> 47667 bytes .../2.4.4/1/Lib/D11/SpTBXCustomizerForm.dcu | Bin 0 -> 17016 bytes .../2.4.4/1/Lib/D11/SpTBXCustomizerForm.dfm | 282 + .../2.4.4/1/Lib/D11/SpTBXDefaultSkins.dcu | Bin 0 -> 58646 bytes internal/2.4.4/1/Lib/D11/SpTBXDkPanels.dcu | Bin 0 -> 84541 bytes internal/2.4.4/1/Lib/D11/SpTBXEditors.dcu | Bin 0 -> 105355 bytes internal/2.4.4/1/Lib/D11/SpTBXExtEditors.dcu | Bin 0 -> 34385 bytes .../2.4.4/1/Lib/D11/SpTBXFormPopupMenu.dcu | Bin 0 -> 31331 bytes internal/2.4.4/1/Lib/D11/SpTBXGlyphs.res | Bin 0 -> 3788 bytes internal/2.4.4/1/Lib/D11/SpTBXItem.dcu | Bin 0 -> 258253 bytes internal/2.4.4/1/Lib/D11/SpTBXLibDsgn_d11.bpl | Bin 0 -> 165888 bytes internal/2.4.4/1/Lib/D11/SpTBXLibDsgn_d11.dcp | Bin 0 -> 13350 bytes internal/2.4.4/1/Lib/D11/SpTBXLibDsgn_d11.dcu | Bin 0 -> 5201 bytes internal/2.4.4/1/Lib/D11/SpTBXLib_d11.bpl | Bin 0 -> 780288 bytes internal/2.4.4/1/Lib/D11/SpTBXLib_d11.dcp | Bin 0 -> 853501 bytes internal/2.4.4/1/Lib/D11/SpTBXLib_d11.dcu | Bin 0 -> 3855 bytes internal/2.4.4/1/Lib/D11/SpTBXMDIMRU.dcu | Bin 0 -> 23770 bytes .../2.4.4/1/Lib/D11/SpTBXPageScroller.dcu | Bin 0 -> 26500 bytes internal/2.4.4/1/Lib/D11/SpTBXReg.dcu | Bin 0 -> 12455 bytes internal/2.4.4/1/Lib/D11/SpTBXSkins.dcu | Bin 0 -> 77962 bytes internal/2.4.4/1/Lib/D11/SpTBXTabs.dcu | Bin 0 -> 91275 bytes internal/2.4.4/1/MPL-LICENSE.txt | 469 + .../2.4.4/1/Packages/SpTBXLibDsgn_d10.bdsproj | 175 + .../2.4.4/1/Packages/SpTBXLibDsgn_d10.dpk | 42 + .../2.4.4/1/Packages/SpTBXLibDsgn_d10.res | Bin 0 -> 32 bytes .../2.4.4/1/Packages/SpTBXLibDsgn_d11.bdsproj | 175 + .../2.4.4/1/Packages/SpTBXLibDsgn_d11.dpk | 43 + .../2.4.4/1/Packages/SpTBXLibDsgn_d11.dproj | 587 + .../2.4.4/1/Packages/SpTBXLibDsgn_d11.res | Bin 0 -> 5056 bytes .../2.4.4/1/Packages/SpTBXLibDsgn_d12.dpk | 40 + .../2.4.4/1/Packages/SpTBXLibDsgn_d12.dproj | 116 + .../2.4.4/1/Packages/SpTBXLibDsgn_d12.res | Bin 0 -> 32 bytes .../2.4.4/1/Packages/SpTBXLibDsgn_d14.dpk | 40 + .../2.4.4/1/Packages/SpTBXLibDsgn_d14.dproj | 116 + .../2.4.4/1/Packages/SpTBXLibDsgn_d14.res | Bin 0 -> 32 bytes internal/2.4.4/1/Packages/SpTBXLibDsgn_d7.dpk | 42 + internal/2.4.4/1/Packages/SpTBXLibDsgn_d7.res | Bin 0 -> 32 bytes internal/2.4.4/1/Packages/SpTBXLibDsgn_d9.dpk | 42 + internal/2.4.4/1/Packages/SpTBXLibDsgn_d9.res | Bin 0 -> 32 bytes .../2.4.4/1/Packages/SpTBXLib_d10.bdsproj | 175 + internal/2.4.4/1/Packages/SpTBXLib_d10.dpk | 51 + internal/2.4.4/1/Packages/SpTBXLib_d10.res | Bin 0 -> 32 bytes .../2.4.4/1/Packages/SpTBXLib_d11.bdsproj | 175 + internal/2.4.4/1/Packages/SpTBXLib_d11.dcu | Bin 0 -> 3855 bytes internal/2.4.4/1/Packages/SpTBXLib_d11.dpk | 52 + internal/2.4.4/1/Packages/SpTBXLib_d11.dproj | 588 + internal/2.4.4/1/Packages/SpTBXLib_d11.res | Bin 0 -> 5056 bytes .../1/Packages/SpTBXLib_d11Group.groupproj | 44 + internal/2.4.4/1/Packages/SpTBXLib_d12.dpk | 51 + internal/2.4.4/1/Packages/SpTBXLib_d12.dproj | 128 + internal/2.4.4/1/Packages/SpTBXLib_d12.res | Bin 0 -> 32 bytes internal/2.4.4/1/Packages/SpTBXLib_d14.dpk | 51 + internal/2.4.4/1/Packages/SpTBXLib_d14.dproj | 128 + internal/2.4.4/1/Packages/SpTBXLib_d14.res | Bin 0 -> 32 bytes internal/2.4.4/1/Packages/SpTBXLib_d7.dpk | 51 + internal/2.4.4/1/Packages/SpTBXLib_d7.res | Bin 0 -> 32 bytes internal/2.4.4/1/Packages/SpTBXLib_d9.dpk | 51 + internal/2.4.4/1/Packages/SpTBXLib_d9.res | Bin 0 -> 32 bytes internal/2.4.4/1/Readme.txt | 63 + internal/2.4.4/1/Registration.txt | 27 + .../2.4.4/1/Source/SpTBXColorPickerForm.dfm | 3025 +++++ .../2.4.4/1/Source/SpTBXColorPickerForm.pas | 534 + internal/2.4.4/1/Source/SpTBXControls.pas | 4306 +++++++ internal/2.4.4/1/Source/SpTBXCustomizer.pas | 1636 +++ .../2.4.4/1/Source/SpTBXCustomizerForm.dfm | 282 + .../2.4.4/1/Source/SpTBXCustomizerForm.pas | 529 + internal/2.4.4/1/Source/SpTBXDefaultSkins.pas | 2171 ++++ internal/2.4.4/1/Source/SpTBXDkPanels.pas | 3669 ++++++ internal/2.4.4/1/Source/SpTBXEditors.pas | 3769 ++++++ internal/2.4.4/1/Source/SpTBXExtEditors.pas | 1076 ++ .../2.4.4/1/Source/SpTBXFormPopupMenu.pas | 1192 ++ internal/2.4.4/1/Source/SpTBXGlyphs.res | Bin 0 -> 3788 bytes internal/2.4.4/1/Source/SpTBXItem.pas | 10073 ++++++++++++++++ internal/2.4.4/1/Source/SpTBXMDIMRU.pas | 794 ++ internal/2.4.4/1/Source/SpTBXPageScroller.pas | 943 ++ internal/2.4.4/1/Source/SpTBXReg.dcr | Bin 0 -> 125196 bytes internal/2.4.4/1/Source/SpTBXReg.pas | 301 + internal/2.4.4/1/Source/SpTBXSkins.pas | 3678 ++++++ internal/2.4.4/1/Source/SpTBXTabs.pas | 3493 ++++++ internal/2.4.4/1/SpTBXLib-LICENSE.txt | 57 + 138 files changed, 66982 insertions(+) create mode 100644 internal/2.4.4/1/Demos/Customizer/Customizer.dpr create mode 100644 internal/2.4.4/1/Demos/Customizer/Unit1.dfm create mode 100644 internal/2.4.4/1/Demos/Customizer/Unit1.pas create mode 100644 internal/2.4.4/1/Demos/Customizer/Unit2.dfm create mode 100644 internal/2.4.4/1/Demos/Customizer/Unit2.pas create mode 100644 internal/2.4.4/1/Demos/Customizer/advanced.txt create mode 100644 internal/2.4.4/1/Demos/Customizer/faq.txt create mode 100644 internal/2.4.4/1/Demos/Customizer/gnugettext.pas create mode 100644 internal/2.4.4/1/Demos/Customizer/langcodes.txt create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/ar/LC_MESSAGES/default.mo create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/ar/LC_MESSAGES/default.po create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/de/LC_MESSAGES/default.mo create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/de/LC_MESSAGES/default.po create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/default.po create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/es/LC_MESSAGES/default.mo create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/es/LC_MESSAGES/default.po create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/fi/LC_MESSAGES/default.mo create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/fi/LC_MESSAGES/default.po create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/fr/LC_MESSAGES/default.mo create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/fr/LC_MESSAGES/default.po create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/ignore.po create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/ja/LC_MESSAGES/default.mo create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/ja/LC_MESSAGES/default.po create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/ko/LC_MESSAGES/default.mo create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/ko/LC_MESSAGES/default.po create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/nl/LC_MESSAGES/default.mo create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/nl/LC_MESSAGES/default.po create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/pt_BR/LC_MESSAGES/default.mo create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/pt_BR/LC_MESSAGES/default.po create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/ru/LC_MESSAGES/default.mo create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/ru/LC_MESSAGES/default.po create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/sr_Cyrillic/LC_MESSAGES/default.mo create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/sr_Cyrillic/LC_MESSAGES/default.po create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/sr_Latin/LC_MESSAGES/default.mo create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/sr_Latin/LC_MESSAGES/default.po create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/sv/LC_MESSAGES/default.mo create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/sv/LC_MESSAGES/default.po create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/tr/LC_MESSAGES/default.mo create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/tr/LC_MESSAGES/default.po create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/zh_CN/LC_MESSAGES/default.mo create mode 100644 internal/2.4.4/1/Demos/Customizer/locale/zh_CN/LC_MESSAGES/default.po create mode 100644 internal/2.4.4/1/Demos/Customizer/translations.txt create mode 100644 internal/2.4.4/1/Demos/FormPopupMenu/FormPopupMenu.dpr create mode 100644 internal/2.4.4/1/Demos/FormPopupMenu/Unit1.dfm create mode 100644 internal/2.4.4/1/Demos/FormPopupMenu/Unit1.pas create mode 100644 internal/2.4.4/1/Demos/FormPopupMenu/Unit2.dfm create mode 100644 internal/2.4.4/1/Demos/FormPopupMenu/Unit2.pas create mode 100644 internal/2.4.4/1/Demos/FormPopupMenu/Unit3.dfm create mode 100644 internal/2.4.4/1/Demos/FormPopupMenu/Unit3.pas create mode 100644 internal/2.4.4/1/Demos/Overview/Overview.dpr create mode 100644 internal/2.4.4/1/Demos/Overview/Skins/WMP11.skn create mode 100644 internal/2.4.4/1/Demos/Overview/Unit1.dfm create mode 100644 internal/2.4.4/1/Demos/Overview/Unit1.pas create mode 100644 internal/2.4.4/1/Demos/Overview/hint.bmp create mode 100644 internal/2.4.4/1/LICENSE.txt create mode 100644 internal/2.4.4/1/Lib/D11/SpTBXColorPickerForm.dcu create mode 100644 internal/2.4.4/1/Lib/D11/SpTBXColorPickerForm.dfm create mode 100644 internal/2.4.4/1/Lib/D11/SpTBXControls.dcu create mode 100644 internal/2.4.4/1/Lib/D11/SpTBXCustomizer.dcu create mode 100644 internal/2.4.4/1/Lib/D11/SpTBXCustomizerForm.dcu create mode 100644 internal/2.4.4/1/Lib/D11/SpTBXCustomizerForm.dfm create mode 100644 internal/2.4.4/1/Lib/D11/SpTBXDefaultSkins.dcu create mode 100644 internal/2.4.4/1/Lib/D11/SpTBXDkPanels.dcu create mode 100644 internal/2.4.4/1/Lib/D11/SpTBXEditors.dcu create mode 100644 internal/2.4.4/1/Lib/D11/SpTBXExtEditors.dcu create mode 100644 internal/2.4.4/1/Lib/D11/SpTBXFormPopupMenu.dcu create mode 100644 internal/2.4.4/1/Lib/D11/SpTBXGlyphs.res create mode 100644 internal/2.4.4/1/Lib/D11/SpTBXItem.dcu create mode 100644 internal/2.4.4/1/Lib/D11/SpTBXLibDsgn_d11.bpl create mode 100644 internal/2.4.4/1/Lib/D11/SpTBXLibDsgn_d11.dcp create mode 100644 internal/2.4.4/1/Lib/D11/SpTBXLibDsgn_d11.dcu create mode 100644 internal/2.4.4/1/Lib/D11/SpTBXLib_d11.bpl create mode 100644 internal/2.4.4/1/Lib/D11/SpTBXLib_d11.dcp create mode 100644 internal/2.4.4/1/Lib/D11/SpTBXLib_d11.dcu create mode 100644 internal/2.4.4/1/Lib/D11/SpTBXMDIMRU.dcu create mode 100644 internal/2.4.4/1/Lib/D11/SpTBXPageScroller.dcu create mode 100644 internal/2.4.4/1/Lib/D11/SpTBXReg.dcu create mode 100644 internal/2.4.4/1/Lib/D11/SpTBXSkins.dcu create mode 100644 internal/2.4.4/1/Lib/D11/SpTBXTabs.dcu create mode 100644 internal/2.4.4/1/MPL-LICENSE.txt create mode 100644 internal/2.4.4/1/Packages/SpTBXLibDsgn_d10.bdsproj create mode 100644 internal/2.4.4/1/Packages/SpTBXLibDsgn_d10.dpk create mode 100644 internal/2.4.4/1/Packages/SpTBXLibDsgn_d10.res create mode 100644 internal/2.4.4/1/Packages/SpTBXLibDsgn_d11.bdsproj create mode 100644 internal/2.4.4/1/Packages/SpTBXLibDsgn_d11.dpk create mode 100644 internal/2.4.4/1/Packages/SpTBXLibDsgn_d11.dproj create mode 100644 internal/2.4.4/1/Packages/SpTBXLibDsgn_d11.res create mode 100644 internal/2.4.4/1/Packages/SpTBXLibDsgn_d12.dpk create mode 100644 internal/2.4.4/1/Packages/SpTBXLibDsgn_d12.dproj create mode 100644 internal/2.4.4/1/Packages/SpTBXLibDsgn_d12.res create mode 100644 internal/2.4.4/1/Packages/SpTBXLibDsgn_d14.dpk create mode 100644 internal/2.4.4/1/Packages/SpTBXLibDsgn_d14.dproj create mode 100644 internal/2.4.4/1/Packages/SpTBXLibDsgn_d14.res create mode 100644 internal/2.4.4/1/Packages/SpTBXLibDsgn_d7.dpk create mode 100644 internal/2.4.4/1/Packages/SpTBXLibDsgn_d7.res create mode 100644 internal/2.4.4/1/Packages/SpTBXLibDsgn_d9.dpk create mode 100644 internal/2.4.4/1/Packages/SpTBXLibDsgn_d9.res create mode 100644 internal/2.4.4/1/Packages/SpTBXLib_d10.bdsproj create mode 100644 internal/2.4.4/1/Packages/SpTBXLib_d10.dpk create mode 100644 internal/2.4.4/1/Packages/SpTBXLib_d10.res create mode 100644 internal/2.4.4/1/Packages/SpTBXLib_d11.bdsproj create mode 100644 internal/2.4.4/1/Packages/SpTBXLib_d11.dcu create mode 100644 internal/2.4.4/1/Packages/SpTBXLib_d11.dpk create mode 100644 internal/2.4.4/1/Packages/SpTBXLib_d11.dproj create mode 100644 internal/2.4.4/1/Packages/SpTBXLib_d11.res create mode 100644 internal/2.4.4/1/Packages/SpTBXLib_d11Group.groupproj create mode 100644 internal/2.4.4/1/Packages/SpTBXLib_d12.dpk create mode 100644 internal/2.4.4/1/Packages/SpTBXLib_d12.dproj create mode 100644 internal/2.4.4/1/Packages/SpTBXLib_d12.res create mode 100644 internal/2.4.4/1/Packages/SpTBXLib_d14.dpk create mode 100644 internal/2.4.4/1/Packages/SpTBXLib_d14.dproj create mode 100644 internal/2.4.4/1/Packages/SpTBXLib_d14.res create mode 100644 internal/2.4.4/1/Packages/SpTBXLib_d7.dpk create mode 100644 internal/2.4.4/1/Packages/SpTBXLib_d7.res create mode 100644 internal/2.4.4/1/Packages/SpTBXLib_d9.dpk create mode 100644 internal/2.4.4/1/Packages/SpTBXLib_d9.res create mode 100644 internal/2.4.4/1/Readme.txt create mode 100644 internal/2.4.4/1/Registration.txt create mode 100644 internal/2.4.4/1/Source/SpTBXColorPickerForm.dfm create mode 100644 internal/2.4.4/1/Source/SpTBXColorPickerForm.pas create mode 100644 internal/2.4.4/1/Source/SpTBXControls.pas create mode 100644 internal/2.4.4/1/Source/SpTBXCustomizer.pas create mode 100644 internal/2.4.4/1/Source/SpTBXCustomizerForm.dfm create mode 100644 internal/2.4.4/1/Source/SpTBXCustomizerForm.pas create mode 100644 internal/2.4.4/1/Source/SpTBXDefaultSkins.pas create mode 100644 internal/2.4.4/1/Source/SpTBXDkPanels.pas create mode 100644 internal/2.4.4/1/Source/SpTBXEditors.pas create mode 100644 internal/2.4.4/1/Source/SpTBXExtEditors.pas create mode 100644 internal/2.4.4/1/Source/SpTBXFormPopupMenu.pas create mode 100644 internal/2.4.4/1/Source/SpTBXGlyphs.res create mode 100644 internal/2.4.4/1/Source/SpTBXItem.pas create mode 100644 internal/2.4.4/1/Source/SpTBXMDIMRU.pas create mode 100644 internal/2.4.4/1/Source/SpTBXPageScroller.pas create mode 100644 internal/2.4.4/1/Source/SpTBXReg.dcr create mode 100644 internal/2.4.4/1/Source/SpTBXReg.pas create mode 100644 internal/2.4.4/1/Source/SpTBXSkins.pas create mode 100644 internal/2.4.4/1/Source/SpTBXTabs.pas create mode 100644 internal/2.4.4/1/SpTBXLib-LICENSE.txt diff --git a/internal/2.4.4/1/Demos/Customizer/Customizer.dpr b/internal/2.4.4/1/Demos/Customizer/Customizer.dpr new file mode 100644 index 0000000..0202e78 --- /dev/null +++ b/internal/2.4.4/1/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/internal/2.4.4/1/Demos/Customizer/Unit1.dfm b/internal/2.4.4/1/Demos/Customizer/Unit1.dfm new file mode 100644 index 0000000..49d0b7f --- /dev/null +++ b/internal/2.4.4/1/Demos/Customizer/Unit1.dfm @@ -0,0 +1,1602 @@ +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 + AutoDropDownWidth = True + 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 TBControlItem5: TTBControlItem + Control = SpTBXColorEdit1 + 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 + object SpTBXColorEdit1: TSpTBXColorEdit + Left = 190 + Top = 0 + Width = 99 + Height = 21 + TabOrder = 2 + SelectedColor = clBlack + SelectedFormat = cttHTML + end + end + object tbMenuBar: TSpTBXToolbar + Left = 0 + Top = 0 + CloseButton = False + DockPos = 0 + FullSize = True + Images = ImageList1 + ProcessShortCuts = True + ShrinkMode = tbsmWrap + TabOrder = 0 + Caption = 'Menu' + Customizable = False + MenuBar = True + 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 = 0 + TabOrder = 0 + DesignSize = ( + 125 + 343) + object SpTBXLabel1: TSpTBXLabel + Left = 7 + Top = 32 + Width = 111 + Height = 81 + 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 + MenuBar = tbMenuBar + OnCreateCustomizeForm = SpTBXCustomizer1CreateCustomizeForm + 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 cSelectAll: TSpTBXItem + Caption = 'Select All' + ShortCut = 16449 + OnClick = ActionsExecute + end + object cExit: TSpTBXItem + Caption = 'Exit' + OnClick = ActionsExecute + end + end +end diff --git a/internal/2.4.4/1/Demos/Customizer/Unit1.pas b/internal/2.4.4/1/Demos/Customizer/Unit1.pas new file mode 100644 index 0000000..ecf61ea --- /dev/null +++ b/internal/2.4.4/1/Demos/Customizer/Unit1.pas @@ -0,0 +1,363 @@ +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, + SpTBXExtEditors, 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; + 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; + SpTBXColorEdit1: TSpTBXColorEdit; + TBControlItem5: TTBControlItem; + 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); + procedure SpTBXCustomizer1CreateCustomizeForm(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); +end; + +procedure TForm1.aCustomizeExecute(Sender: TObject); +begin + SpTBXCustomizer1.Show; +end; + +procedure TForm1.aEmbeddedCustomizeExecute(Sender: TObject); +begin + if not Form2.Visible and not SpTBXCustomizer1.Showing 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 + if SpTBXCustomizer1.Showing then + SpDxGetTextChangeLanguage(tLanguages.Text, [Self, Form2, SpTBXCustomizer1.CustomizeForm]) + else + SpDxGetTextChangeLanguage(tLanguages.Text, [Self, Form2]); + end; +end; + +procedure TForm1.SpTBXCustomizer1CreateCustomizeForm(Sender: TObject); +begin + // Don't translate the skins combobox + gnugettext.TP_Ignore(SpTBXCustomizer1.CustomizeForm, 'cbSkins'); + // Make sure the Customizer form is translated + gnugettext.TranslateComponent(SpTBXCustomizer1.CustomizeForm); +end; + +procedure TForm1.FormCreate(Sender: TObject); +begin + SpDxGetTextInitialize('en', [Self], True, True); + tLanguages.Items.LoadFromFile('langcodes.txt'); + tLanguages.ItemIndex := 2; +end; + +end. diff --git a/internal/2.4.4/1/Demos/Customizer/Unit2.dfm b/internal/2.4.4/1/Demos/Customizer/Unit2.dfm new file mode 100644 index 0000000..954ddc4 --- /dev/null +++ b/internal/2.4.4/1/Demos/Customizer/Unit2.dfm @@ -0,0 +1,1230 @@ +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 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 + object ButtonsPanel: TSpTBXPanel + Left = 0 + Top = 388 + Width = 370 + Height = 37 + Align = alBottom + TabOrder = 2 + Borders = False + TBXStyleBackground = True + 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 + 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/internal/2.4.4/1/Demos/Customizer/Unit2.pas b/internal/2.4.4/1/Demos/Customizer/Unit2.pas new file mode 100644 index 0000000..dfb6414 --- /dev/null +++ b/internal/2.4.4/1/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; + TitlePanel: TSpTBXLabel; + ButtonsPanel: TSpTBXPanel; + 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/internal/2.4.4/1/Demos/Customizer/advanced.txt b/internal/2.4.4/1/Demos/Customizer/advanced.txt new file mode 100644 index 0000000..bed4456 --- /dev/null +++ b/internal/2.4.4/1/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/internal/2.4.4/1/Demos/Customizer/faq.txt b/internal/2.4.4/1/Demos/Customizer/faq.txt new file mode 100644 index 0000000..d6adc52 --- /dev/null +++ b/internal/2.4.4/1/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/internal/2.4.4/1/Demos/Customizer/gnugettext.pas b/internal/2.4.4/1/Demos/Customizer/gnugettext.pas new file mode 100644 index 0000000..bcc3054 --- /dev/null +++ b/internal/2.4.4/1/Demos/Customizer/gnugettext.pas @@ -0,0 +1,2995 @@ +{*------------------------------------------------------------------------------ + 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 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 MSWINDOWS} + Windows, +{$else} + Libc, +{$ifdef FPC} + CWString, +{$endif} +{$endif} + Classes, StrUtils, SysUtils, TypInfo; + +(*****************************************************************************) +(* *) +(* MAIN API *) +(* *) +(*****************************************************************************) + +type + {$IFNDEF UNICODE} + UnicodeString=WideString; + RawUtf8String=AnsiString; + RawByteString=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 + {$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 gettext_NoExtract(const szMsgId: MsgIdString): TranslatedUnicodeString; + function ngettext(const singular,plural:MsgIdString;Number:longint):TranslatedUnicodeString; overload; virtual; + function ngettext_NoExtract(const singular,plural:MsgIdString;Number:longint):TranslatedUnicodeString; + 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 + {$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 dgettext_NoExtract(const szDomain: DomainString; const szMsgId: MsgIdString): TranslatedUnicodeString; + function dngettext(const szDomain: DomainString; const singular,plural:MsgIdString;Number:longint):TranslatedUnicodeString; overload; virtual; + function dngettext_NoExtract(const szDomain: DomainString; const singular,plural:MsgIdString;Number:longint):TranslatedUnicodeString; + 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+} + +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 UNICODE} +function TGnuGettextInstance.dgettext(const szDomain: DomainString; const szMsgId: ansistring): TranslatedUnicodeString; +begin + Result:=dgettext(szDomain, ansi2wideDTCP(szMsgId)); +end; +{$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.dgettext_NoExtract(const szDomain: DomainString; + const szMsgId: MsgIdString): TranslatedUnicodeString; +begin + // This one is very useful for translating text in variables. + // This can sometimes be necessary, and by using this function, + // the source code scanner will not trigger warnings. + Result:=dgettext(szDomain,szMsgId); +end; + +function TGnuGettextInstance.GetCurrentLanguage: LanguageString; +begin + Result:=curlang; +end; + +function TGnuGettextInstance.getcurrenttextdomain: DomainString; +begin + Result := curmsgdomain; +end; + +{$ifndef UNICODE} +function TGnuGettextInstance.gettext( + const szMsgId: ansistring): TranslatedUnicodeString; +begin + Result := dgettext(curmsgdomain, szMsgId); +end; +{$endif} + +function TGnuGettextInstance.gettext( + const szMsgId: MsgIdString): TranslatedUnicodeString; +begin + Result := dgettext(curmsgdomain, szMsgId); +end; + +function TGnuGettextInstance.gettext_NoExtract( + const szMsgId: MsgIdString): TranslatedUnicodeString; +begin + // This one is very useful for translating text in variables. + // This can sometimes be necessary, and by using this function, + // the source code scanner will not trigger warnings. + Result:=gettext (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 + ppi:PPropInfo; + ws: TranslatedUnicodeString; + old: TranslatedUnicodeString; + 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} + 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; + {$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 + 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; + 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; +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; + ObjectPropertyIgnoreList.Duplicates:=dupIgnore; + ObjectPropertyIgnoreList.CaseSensitive:=False; + DoneList.Duplicates:=dupError; + DoneList.CaseSensitive:=True; + + 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; + + Count := GetPropList(AnObject, PropList); + try + 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 + if Count<>0 then + FreeMem (PropList); + 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; + +function TGnuGettextInstance.dngettext_NoExtract(const szDomain: DomainString; + const singular, plural: MsgIdString; + Number: Integer): TranslatedUnicodeString; +begin + // This one is very useful for translating text in variables. + // This can sometimes be necessary, and by using this function, + // the source code scanner will not trigger warnings. + Result:=dngettext(szDomain,singular,plural,Number); +end; + +{$ifndef UNICODE} +function TGnuGettextInstance.ngettext(const singular, plural: ansistring; + Number: Integer): TranslatedUnicodeString; +begin + Result := dngettext(curmsgdomain, singular, plural, Number); +end; +{$endif} + +function TGnuGettextInstance.ngettext(const singular, plural: MsgIdString; + Number: Integer): TranslatedUnicodeString; +begin + Result := dngettext(curmsgdomain, singular, plural, Number); +end; + +function TGnuGettextInstance.ngettext_NoExtract(const singular, + plural: MsgIdString; Number: Integer): TranslatedUnicodeString; +begin + // This one is very useful for translating text in variables. + // This can sometimes be necessary, and by using this function, + // the source code scanner will not trigger warnings. + Result:=ngettext(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 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} + +{ TClassMode } + +constructor TClassMode.Create; +begin + PropertiesToIgnore:=TStringList.Create; + PropertiesToIgnore.Sorted:=True; + PropertiesToIgnore.Duplicates:=dupError; + PropertiesToIgnore.CaseSensitive:=False; +end; + +destructor TClassMode.Destroy; +begin + FreeAndNil (PropertiesToIgnore); + inherited; +end; + +{ TFileLocator } + +procedure TFileLocator.Analyze; +var + s:RawByteString; + i:integer; + offset:int64; + fs:TFileStream; + fi:TEmbeddedFileInfo; + filename:FilenameString; + filename8bit:RawByteString; +const + arrch:array[0..43] of ansichar='6637DB2E-62E1-4A60-AC19-C23867046A89'#0#0#0#0#0#0#0#0; +begin + // Copy byte by byte, compatible with Delphi 2009 and older + SetLength (s,high(arrch)-low(arrch)+1); + for i:=0 to 43 do + s[i+1]:=arrch[i]; + + 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 (filename8bit, offset-fs.position); + fs.ReadBuffer (filename8bit[1],offset-fs.position); + filename:=trim(utf8decode(filename8bit)); + 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; + MoFiles.Duplicates:=dupError; + MoFiles.CaseSensitive:=False; + {$ifdef MSWINDOWS} + filelist.Duplicates:=dupError; + filelist.CaseSensitive:=False; + {$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; + ppi:PPropInfo; +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); + 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; + 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/internal/2.4.4/1/Demos/Customizer/langcodes.txt b/internal/2.4.4/1/Demos/Customizer/langcodes.txt new file mode 100644 index 0000000..fd86faf --- /dev/null +++ b/internal/2.4.4/1/Demos/Customizer/langcodes.txt @@ -0,0 +1,16 @@ +[ar] Arabic +[de] German +[en] English +[es] Spanish +[fi] Finnish +[fr] French +[ja] Japanese +[ko] Korean +[nl] Dutch +[pt_BR] Brazilian Portuguese +[ru] Russian +[sr_Cyrillic] Serbian Cyrillic +[sr_Latin] Serbian Latin +[sv] Swedish +[tr] Turkish +[zh_CN] Chinese \ No newline at end of file diff --git a/internal/2.4.4/1/Demos/Customizer/locale/ar/LC_MESSAGES/default.mo b/internal/2.4.4/1/Demos/Customizer/locale/ar/LC_MESSAGES/default.mo new file mode 100644 index 0000000000000000000000000000000000000000..028d50b91922de17e06d57bec6bc0d8f4a54e1be GIT binary patch literal 5570 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 U>y+U%dpXxmyZ@@*yZngxKXt^YmjD0& literal 0 HcmV?d00001 diff --git a/internal/2.4.4/1/Demos/Customizer/locale/ar/LC_MESSAGES/default.po b/internal/2.4.4/1/Demos/Customizer/locale/ar/LC_MESSAGES/default.po new file mode 100644 index 0000000..79d04ed --- /dev/null +++ b/internal/2.4.4/1/Demos/Customizer/locale/ar/LC_MESSAGES/default.po @@ -0,0 +1,561 @@ +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Ammar I , 2009. +msgid "" +msgstr "" +"Project-Id-Version: Customizer Demo\n" +"POT-Creation-Date: 2005-08-09 16:55\n" +"PO-Revision-Date: 2009-09-12 17:42-0300\n" +"Last-Translator: \n" +"Language-Team: Sptbxlib\n" +"Language: ar\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" +"X-Generator: Virtaal 0.4.0\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 customize them" +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..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 "Ø­ÙØ¸ التصميم الحالي باسم :" + +# Customizer Form +msgid "Toolbars" +msgstr "اشرطة الادوات" + +msgid "Commands" +msgstr "الاوامر" + +msgid "Shortcuts" +msgstr "الاختصارات" + +msgid "&Default Options" +msgstr "استعادة الا&ÙØªØ±Ø§Ø¶ÙŠ" + +msgid "&Close" +msgstr "ا&غلاق" + +msgid "&Visible" +msgstr "&ظاهر" + +msgid "T&ext Options" +msgstr "خيارات ال&نص" + +msgid "Icons + Selective Text" +msgstr "الايقونات + النص المنتقى" + +msgid "Icons" +msgstr "الايقونات" + +msgid "Icons + Text" +msgstr "الايقونات والنص" + +msgid "Text" +msgstr "النص" + +msgid "&Icon Options" +msgstr "خيارات ال&ايقونات" + +msgid "Large Icons" +msgstr "ايقونات كبيرة" + +msgid "Small Icons" +msgstr "ايقونات صغيرة" + +msgid "&Skins" +msgstr "&سمات" + +msgid "C&hange" +msgstr "&تغيير" + +msgid "[ Separator ]" +msgstr "[ شريط ÙØ§ØµÙ„ ]" + +msgid "[ Blank Separator ]" +msgstr "[ شريط ÙØ§ØµÙ„ ÙØ§Ø±Øº ]" + +msgid "To add command buttons, drag and drop commands onto a toolbar. To remove command buttons, drag them off the toolbar and drop them on the commands list." +msgstr "Ù„Ø§Ø¶Ø§ÙØ© ازرار اوامر, اسحب الامر (من اللائحة) ثم اÙلته ÙÙŠ شريط الادوات. لازالة ازرار الاوامر, اسحبه خارج شريط الادوات Ùˆ اÙلتة ÙÙŠ لائحة الاوامر." + +msgid "Change Shortcut" +msgstr "تغيير الاختصار" + +msgid "The shortcut is already being used by the \"%s\" command. Do you want to reassign it to the \"%s\" command?" +msgstr "الاختصار مستخدم الآن بواسطة الامر \"%s\" , هل تريد اعادة نسبة الى الامر \"%s\" ØŸ" + +# ColorEdit Form +msgid "Transparent Color" +msgstr "لون Ø´ÙØ§Ù" + +msgid "Color Picker" +msgstr "منتخب الالوان" + +msgid "Drag && Drop" +msgstr "اسحب && اÙلت" + diff --git a/internal/2.4.4/1/Demos/Customizer/locale/de/LC_MESSAGES/default.mo b/internal/2.4.4/1/Demos/Customizer/locale/de/LC_MESSAGES/default.mo new file mode 100644 index 0000000000000000000000000000000000000000..1469abf7860532087a05949c2d4fbec14b5c8b92 GIT binary patch literal 3551 zcmZvdO>87b6@ZImlMT)fAt67I0L4!x1L8+;L5s4Af-I1b;1CWVafmoX2(c2EL^&X>#P_yn2L&XX|FA_^D5OUVyhVejeTghn@*M z%6JU#hA;T}m*Jg^zwPIL3U6Wjn&h!He)l_yxcI0+jb&g!jO2`0o1U>dV@yv{oRkRL0Nwb-U|Qi=Wpf`V*edb_CEl{P7TGr$DsK0 z7$j8c6qJ1phzhmpxdr9D3sCHAdxm~KhO&PTieJ72AB8VL(f0}zyIzC$!9PH;_f05z zule_H@>7q{9DSEk$D!DB5+$O)4#odx{rGcG-jATzmq4-a z^M3xTe*6-Y_r427|1aT(;4APw@UMRUpHS?3+mEk9Irk`y=)W80euk2_8j8LrJfDXA z)GCeKX9tSDE|h&S$_Mi6i=b_}wXQAwmq1cf@(ep+4LHK1T`Sb%Q z`hEmu-_M}j_X>O;{0$U){|sf{-=N&@AD-_(@zW6|=i$9j_HRP5<1_HX@FJA^d<{yx zz7ECi??XB77f|BzYbg6(h2oFjLVoIX8q!HUj(h}JMZ~^OAo4tc%peaTi-?>p&l2(& zvWAGAqFc^ChDiKH_s0>9$RoDTA$3IRKn*#C+>ac778tA`6=W8XTr3~CM-`Fp=xIMG zwRYO~dsKq$ysKqRbOq!@hVB02A4P#T| zOh+~1D0X@)Y!8fMaOg&jcr;dxEJ@>GxR+aYFf!BA(~|-3`CZ28(&h$^T5>^8S1NkR z#UqvbXL;B%osQ|~gEvIe@?~7N670q7%A>8j0j zwK+02Z^X>rW0XMr{ln=(KNi zTBJlmN4HB4%F0kRgI$w1x-h@!w=?I6n~w72(Lu7HnkI1VK8Q>^)%7S+&0!El{_bVE zsAft8cF>G*J1(%vD9APC(O1vfj&V_F1>dtt?QK`9{9vekLXiw^PKX8djpL%v@r8+;^ zC->_bS6#O4xWl)%pyyj*I(4CX+F0X?b2^uMCKX+JW_lJgY%e3K)g2QIF+x?=Y&TZT zO1mG0X8(I6L1n%8HsXBS1pZy9oyWpPAUe(@zELtau3R>PHZt2O>c-;4$;$-Ov?Okn30-I|PFXaD9JU8V z1SJv=W|~=kn`XQ3!ftA%l=yzn?f;6{Jn_M&HFY9H{k-FJM=lb}`#@b3AOt z6xM@!652tcgDfe7LQUDf`rkz*Q_WZ^f=iA5f8M6T?0>V{wbO>3!DG| literal 0 HcmV?d00001 diff --git a/internal/2.4.4/1/Demos/Customizer/locale/de/LC_MESSAGES/default.po b/internal/2.4.4/1/Demos/Customizer/locale/de/LC_MESSAGES/default.po new file mode 100644 index 0000000..656caa9 --- /dev/null +++ b/internal/2.4.4/1/Demos/Customizer/locale/de/LC_MESSAGES/default.po @@ -0,0 +1,558 @@ +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Customizer Demo\n" +"POT-Creation-Date: 2005-08-09 16:55\n" +"PO-Revision-Date: 2009-09-10 22:53-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 "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 customize them" +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..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:" + +# Customizer Form +msgid "Toolbars" +msgstr "" + +msgid "Commands" +msgstr "" + +msgid "Shortcuts" +msgstr "" + +msgid "&Default Options" +msgstr "" + +msgid "&Close" +msgstr "S&chließen" + +msgid "&Visible" +msgstr "&Sichtbar" + +msgid "T&ext Options" +msgstr "" + +msgid "Icons + Selective Text" +msgstr "" + +msgid "Icons" +msgstr "" + +msgid "Icons + Text" +msgstr "" + +msgid "Text" +msgstr "" + +msgid "&Icon Options" +msgstr "" + +msgid "Large Icons" +msgstr "Große Symbole" + +msgid "Small Icons" +msgstr "Kleine Symbole" + +msgid "&Skins" +msgstr "" + +msgid "C&hange" +msgstr "" + +msgid "[ Separator ]" +msgstr "" + +msgid "[ Blank Separator ]" +msgstr "" + +msgid "To add command buttons, drag and drop commands onto a toolbar. To remove command buttons, drag them off the toolbar and drop them on the commands list." +msgstr "" + +msgid "Change Shortcut" +msgstr "" + +msgid "The shortcut is already being used by the \"%s\" command. Do you want to reassign it to the \"%s\" command?" +msgstr "" + +# ColorEdit Form +msgid "Transparent Color" +msgstr "Transparent" + +msgid "Color Picker" +msgstr "Farbwähler" + +msgid "Drag && Drop" +msgstr "Drag und Drop" + diff --git a/internal/2.4.4/1/Demos/Customizer/locale/default.po b/internal/2.4.4/1/Demos/Customizer/locale/default.po new file mode 100644 index 0000000..f0cd02a --- /dev/null +++ b/internal/2.4.4/1/Demos/Customizer/locale/default.po @@ -0,0 +1,561 @@ +# 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: 2009-09-04 22:58-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 customize them" +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..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 "" + +# Customizer Form +msgid "Toolbars" +msgstr "" + +msgid "Commands" +msgstr "" + +msgid "Shortcuts" +msgstr "" + +msgid "&Default Options" +msgstr "" + +msgid "&Close" +msgstr "" + +msgid "&Visible" +msgstr "" + +msgid "T&ext Options" +msgstr "" + +msgid "Icons + Selective Text" +msgstr "" + +msgid "Icons" +msgstr "" + +msgid "Icons + Text" +msgstr "" + +msgid "Text" +msgstr "" + +msgid "&Icon Options" +msgstr "" + +msgid "Large Icons" +msgstr "" + +msgid "Small Icons" +msgstr "" + +msgid "&Skins" +msgstr "" + +msgid "C&hange" +msgstr "" + +msgid "[ Separator ]" +msgstr "" + +msgid "[ Blank Separator ]" +msgstr "" + +msgid "To add command buttons, drag and drop commands onto a toolbar. To remove command buttons, drag them off the toolbar and drop them on the commands list." +msgstr "" + +msgid "Change Shortcut" +msgstr "" + +msgid "The shortcut is already being used by the \"%s\" command. Do you want to reassign it to the \"%s\" command?" +msgstr "" + +# ColorEdit Form +msgid "Transparent Color" +msgstr "" + +msgid "Color Picker" +msgstr "" + +msgid "Drag && Drop" +msgstr "" + diff --git a/internal/2.4.4/1/Demos/Customizer/locale/es/LC_MESSAGES/default.mo b/internal/2.4.4/1/Demos/Customizer/locale/es/LC_MESSAGES/default.mo new file mode 100644 index 0000000000000000000000000000000000000000..d0162af11517d44aa4907c0dc73839c9b814490d GIT binary patch literal 4897 zcmZ{mYit}>6@V{kXsIcWq@|Qc!)<66l4f1UZHnWjkM-J4+}MusIuEESalLcBo_Ka< zJ2UIVQ7I^>@TUj~QHoR*DF`YG2-H+mNRdE_|D-AiA|X{gS_B9bexV`?LPZtdxpT*B zM`5&QzPayn&pG$peQoRJCl${_$cK@CZc^%V@aJ#m#dF~rrLKlAdHxE%i}EY*z3?wk zy8g@azmT8W^bV!2hka1mw?P?qE0l4AzP%3lsiU5sfwEo*x4;g(7M_MO&l8ZJ`l>HK z4L4IhV zK+)@$P{#cpz7zf#%J{$g_J2c}XEVx+{@3yny>EcxhnpZSS398e+XZF(ZqL1tpQ`ba z^(Q@Nef=>g{hLtiwFGy<6)5w48;V}f!S}--L(%sake~WBFH}^2fYR@85YwwSpp1VD zIzP}TWAG{XIFxZWV-$&-3Y2+=pv2(_lzEQ8Yu=_*;L8z}qW>u3Uh=#MrQdI$jQ^cd>ZU)Le9))yOU-0Fx`SR0H_WJ`U z<6nfb{!gLkeG$&WSA2OVjS|-bP~zzV~ z|L#TPsUqS}xpU;HA^VUi&PdOJCO33_8;5eenfmL@gR>zK8oCi$a4=efk=Fa4|gJjuk*_=d;qx* z`8aYbBF_P2(0vtmuK!d={fETHr;%gGr+ghDp>`po$SiUTB9FxL5#)9$RBH1{H&>N< zlw=kp?Y4=7Oiv~)RT;GlrW@t@P$v(QI8&9eAf)ej7}0e+N!vzBj(Hfj^jwle^Cnf5 z12*cY%0x4Xdt)cf3M*y3PSa*NY#EukSGTrOBMhvYs<9Nx%8eYgOd9mM`o(BF6512; z&cb;Vt93fjiW)J^B{h;nfg0&XkG@N};gF+J`etJ?X5ddN<3Hc6iF|V69~P`}=zZCh)y%x@L(wi;SkGr7IOZ znkF6PtUA`7w?SY7y*5H-8as)>$IWt*hPlm@SYF<7pvIFp*VCqLi?2p_O1_*+zzIyH zoEHv+sF|)PaYk0W_3gT0BiqcwWvl1x$$YK4DC8yzn`+XeEvt)R-gj!!F68<_wiGU` zs3{wFRnLiP8ZS(D*#=hCrPU7|REIh?b}!jb>EIc|Sy)(a=ianMYwQ~R z_)JFxTR(caG=PGsiL;Jz_IAfg9gYK=MqzB#LwY1K@e(mW2SbSJhpAg%A{LJ0km^KG zJz~?0JTcrm9H|~f_r94!bJaTbk}OgkHMt$ug98J5sslsSfxUY7-NSqK(5E_Um&p$6 zyX>XCx_dwm4i4|Rt2%J!z(C(5aaeUKN21TL?wgvJ8tbjSyMLgsjuDBT>fB0)rE((R zj!tC4_#WL{G-+n@dk@czSBHB2!~zR8t&YXbBp?cg_0W8n_Z_S5x3P8m9@fFhmd#}@ zy}N%9HR4v6(@~wXri~J$=%!7ZMh7mpRO&WO$+5Gxg|X9wYF)tr_&dosUQM=XGu^?U zlD{!vQsiyP%QfOWT&6bWgP$=nnRE_WoVR$1u=rZm*s&3|C)> z*Hy=yxRxnuE2S!`;>HmixFZ`?Z&$p#Hu;dHmlDk{_4Q} zf#q1zP;+5W+#aEc+!etzMJRBCNWx1vuf;u*T-Kl_+$Cbl>iwL90FRHZ51is65jVM$ zB*`fu+12`ctRT(QL@&|yUwwxy0VJoFw1#Yb$1OFr9|5p^|K-f zvdd#wOP15^GA`+;_IJ6Y(ZN%1I8;}vlsugbmkxBMm;H(P5(3+W^O}cd>?2)^XEQan zcDzO{$%}tA<iX(NY1b0m$nx($*w%h{k`0^;lvhy0oUDL{Ez6)r)EX+M|nwcK*i;9i#3yVmzUH(to{f5Tz)

, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Customizer Demo\n" +"POT-Creation-Date: 2005-08-09 16:55\n" +"PO-Revision-Date: 2009-09-10 22:54-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 customize them" +msgstr "Click derecho en las barras de herramientas para modificarlas" + +#. 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..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:" + +# Customizer Form +msgid "Toolbars" +msgstr "Barra de herramientas" + +msgid "Commands" +msgstr "Comandos" + +msgid "Shortcuts" +msgstr "Atajos" + +msgid "&Default Options" +msgstr "Opciones por &Defecto" + +msgid "&Close" +msgstr "&Cerrar" + +msgid "&Visible" +msgstr "&Visible" + +msgid "T&ext Options" +msgstr "Opciones de T&exto" + +msgid "Icons + Selective Text" +msgstr "Iconos + Texto Selectivo" + +msgid "Icons" +msgstr "Iconos" + +msgid "Icons + Text" +msgstr "Iconos + Texto" + +msgid "Text" +msgstr "Texto" + +msgid "&Icon Options" +msgstr "Opciones de &Iconos" + +msgid "Large Icons" +msgstr "Iconos Grandes" + +msgid "Small Icons" +msgstr "Iconos Pequeños" + +msgid "&Skins" +msgstr "&Pieles" + +msgid "C&hange" +msgstr "&Modificar" + +msgid "[ Separator ]" +msgstr "[ Separador ]" + +msgid "[ Blank Separator ]" +msgstr "[ Separador en Blanco ]" + +msgid "To add command buttons, drag and drop commands onto a toolbar. To remove command buttons, drag them off the toolbar and drop them on the commands list." +msgstr "Para agregar comandos arrastrarlos a la barra de herramientas. Para quitar comandos arrastrarlos desde la barra de herramientas a la lista de comandos." + +msgid "Change Shortcut" +msgstr "Modificar Atajo" + +msgid "The shortcut is already being used by the \"%s\" command. Do you want to reassign it to the \"%s\" command?" +msgstr "El atajo esta siendo usado por el comando \"%s\". Desea reasignarlo al comando \"%s\"?" + +# ColorEdit Form +msgid "Transparent Color" +msgstr "Color Transparente" + +msgid "Color Picker" +msgstr "Selector de Color" + +msgid "Drag && Drop" +msgstr "Arrastrar y Soltar" + diff --git a/internal/2.4.4/1/Demos/Customizer/locale/fi/LC_MESSAGES/default.mo b/internal/2.4.4/1/Demos/Customizer/locale/fi/LC_MESSAGES/default.mo new file mode 100644 index 0000000000000000000000000000000000000000..711ace51b71149b836052ecf0ef8082940f9158f GIT binary patch literal 3175 zcmZXVO^h5z6@Uxk5VGJvOacT9>4Y%ggx<`qy~%ovN!F8H$JyB*dB#?Z6rtMb+TGgj z=^AxcPdq;6f;fOcDEwSFpv{e+Z~?>tA#DUgLL9;k337o8NRdDm65;^g>#6bBq13Ow z`gv9L>b+Mpe?D>SRYhqdCy_JnR_Yq;9HXMVez#KZfj@!A;m;wT`gP#%;63!;gdc)` z4C8OZ57NIG#_wj6_tJkT@KJa_{U_kP@H|9ST@2iSVnR3YMJVUI1o@PqlKnFHepo@# ze+7!2Uk>B1!a4fihbQ0<;a%`oQ1st`55nJu{##J&`3n?#-VWn8!}z}g@4^_G>Npg; z9-xx_PKN#?Q07mCeiMqF%TV-Iq1g2T6nm~f@z*s-2-E=-y#eG?Mc@r6>t2Ck-&X^_ z8OFa0`P3nm_~8fearg@;`~4NZ5B?2)1pW((o%i8P+4n&xevPO^{}hz@c_@Bag7>^j zsb?Ucy2zm1Ya2@cB`A8kfkXIV`Zu81`;E~5HvB04A3-_yH-T?L$)i8P``|yI>?=x` zs_uo-zaKKCJ_beau`quc@~LxFa?dp=_Fsmw?i%D%JAnfz@xKmb|E~pp3rc=|56b%2 zq1^LlP|ke=ihq6&<(xkRz6Ir+ze7HClS=gd8^({JEdAq9_BjD1?kAy~A46HU1V!&z z_z+x$k{4eJ<2z9F_n_?K;0NFsioIV6^IwNz_jjP^y#~c!KZd8_FQM4`Pbl~O4}1(B zXOW!02u1&CDDhi^vVSMA3;EO+sYr{uNW5ij6JfhrUw&J}&(9!YXAAih@-!lODn;Th zY}A@uh0(yl*nqHn}&2Nz@&-x7~28+EwY@z}~2BxYaZB^YgP#aa%K* zTGz%G_2pLwJ0?j?5>2&dWxKaOJ9N_PV^kXXeG~afj7u6( zKe&_8eKSy9Ju-C_P0XLP`&Cg8ktnOPA<|__b&W3i`yexYAFX7Wn#P=l8>$|=VbGO4 zF-2x`vDF=*8edA{tEMPPnAR)+Mf98*xVi1EUfeEB9oqOg?M*9MY&MtT=5pLT8!bH5 zT3SLUzHCNTHkhfLWjTt|{Wxyzdg8ODkI5v3~Bw_@c>8 zF*zr>zGuAb6)ns!Vn)7K5x2N!^Z+ANqi2nG2U<1O-GIYg=2EK~8Z~g4h&5aL2Rz~x?DXdUChH_~)xT+yX`c7B{q)^$NuP0tq1mWs)<9cI(DCTV|}Hvs)6Qw(O|mUw&OikYTXtG zIu8a-oy#wQFKzvvZ64)zaI2lV)N$m*-)I?=504JHWbN$96Ss1s+^MPOz3S;w>u7{| z{M7PGrmpf6kh0S(3hGM5iM(}FIGa>FraOJbqhA@308)tu?hMl%SLdpPp;u+(iB?+! zn-hnsN(kvTwvHy#wMovVrZ#9LBS1PDnoMgJ;LCa{6*Cz@N8cWOb08, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Customizer Demo\n" +"POT-Creation-Date: 2005-08-09 16:55\n" +"PO-Revision-Date: 2009-09-10 22:54-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 customize them" +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..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ä:" + +# Customizer Form +msgid "Toolbars" +msgstr "" + +msgid "Commands" +msgstr "" + +msgid "Shortcuts" +msgstr "" + +msgid "&Default Options" +msgstr "" + +msgid "&Close" +msgstr "" + +msgid "&Visible" +msgstr "" + +msgid "T&ext Options" +msgstr "" + +msgid "Icons + Selective Text" +msgstr "" + +msgid "Icons" +msgstr "" + +msgid "Icons + Text" +msgstr "" + +msgid "Text" +msgstr "" + +msgid "&Icon Options" +msgstr "" + +msgid "Large Icons" +msgstr "" + +msgid "Small Icons" +msgstr "" + +msgid "&Skins" +msgstr "" + +msgid "C&hange" +msgstr "" + +msgid "[ Separator ]" +msgstr "" + +msgid "[ Blank Separator ]" +msgstr "" + +msgid "To add command buttons, drag and drop commands onto a toolbar. To remove command buttons, drag them off the toolbar and drop them on the commands list." +msgstr "" + +msgid "Change Shortcut" +msgstr "" + +msgid "The shortcut is already being used by the \"%s\" command. Do you want to reassign it to the \"%s\" command?" +msgstr "" + +# ColorEdit Form +msgid "Transparent Color" +msgstr "" + +msgid "Color Picker" +msgstr "" + +msgid "Drag && Drop" +msgstr "" + diff --git a/internal/2.4.4/1/Demos/Customizer/locale/fr/LC_MESSAGES/default.mo b/internal/2.4.4/1/Demos/Customizer/locale/fr/LC_MESSAGES/default.mo new file mode 100644 index 0000000000000000000000000000000000000000..8ecb197ea3d546703234c027b4140aace9964729 GIT binary patch literal 3181 zcmZXVU5I4G6@W|E_%n%aGUi9)U-{Q-jCZzYc4vP^$E2rsc4y-3Y`fDdh6tgyyQaJ1 z?Rz_Q@15Q8L3~jV1W8QZ5=g`cCj=3Rf*=aE4~Y*V_#%it1tKVl4^c1(e&=@ecCRV= z)K_(?Zq+%b>QsL)ebFBkWeK?!x#L2mehKfoh>G%;Zz**#{42a1J`4G&mjYjbm(YJ5 zUJ2g}`VZiD>HjW1hJS{;;PX)C|0D2aD0aLG#g2al{aZo*PT>2HpZX7#*z*aL zbv_UM|3Q9g7lSfBMJ4u4Lz#C26nk!gV#i)6aoPt7y*dJA-Z98etpzrreD?qp`#OQW zpwA#b^)QwA{}{X-{sGE*ufcD_H{g%p+feNM5X!orLW$>>Q0DKVBjcAsiOX(y$puPX z4Q2fsQ404$8DFGgNF9SLp&IZ9@O~)vCh*5FhgZWVq0HZb;{OX!>>7mrdr<8981hqJ zP>KB)pcMNqhqCT8l>M#>)KKiY4T}8-psc?bxE}axcn$hKlzC4;vF9l$>-{P4nV|oB z;EPbs?Nun>y&m{4DBrye#lCkTKlMJ9totDp`#*zX&sR|9U4fFOx)RFw*F&+t0_8sJ zhqBK>C~>$O%DfdQ@oI$eE|h&zDEI9wYEC`ri-S4;PW2BNCG(M9Lf@XD9blVqZmWMdaQPHdRBU$o-Qdas64@;@sg+ zkVD8m(N$`v(;`=udfMxmq@C%tw4*A^ZHMlti!F8Pdq#RCbC+~`pNmg|_@rO8-#qA&eSRW@APmLG5AY-oIYJSVKnr2CvbqiX$rysef@>p``Y z#%;A!#IemYRX0h?#;R_U+?i50y5Y>)Dx^nQ_NYH1){3IPY3N?220kCtasI-gMY&Vbp^M?Pcx&TTOn|0ySAq`%$6-HJv4vV zZWZ1WdmWeOu1&U}HmvcjE{JU_*R?oSqtm64_EnSBFz8g$wmx==*qZ)^snKdXy3hKI ztFfR*r)IrAVteUS<3uy6ds`l2bj0L#LC;mI^HKFsR6VR`4=l{jGbcJ}x1206o^qJ+ zXtt{7<`(AnN7a4R>eLz$ikjXeS!_6#1wD0q_4x95@7bB^RGpK>uc*1*XRF+v&G+_W zYpVxKI0R$L6w@o}HP) zjHFX=Zc)>k9!99aBf8S(#L`TTmgLjnHWRJN;BoR0&m$RYtdJIHf|A20PyH0DR+{bLUzq2eOe7m|NT2#7w*^ zGuQpLz~F`-?6d|uZQ`nqd6TI|(ZaP_k`yt+lEcg>9d8YvAV$eyakjz5NRx#0$%ctM zp|D=!HK7>J2wv#6)g;0BU)R$DojMoPdke?G_>kq2-DQl~zH7P6jI5_U)ijP*XO!U^ zh1)W?QU-dM;o|2o$)zzF?ONDX%dJK)_eM|D, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Customizer Demo\n" +"POT-Creation-Date: 2005-08-09 16:55\n" +"PO-Revision-Date: 2009-09-10 22:54-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 customize them" +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..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:" + +# Customizer Form +msgid "Toolbars" +msgstr "" + +msgid "Commands" +msgstr "" + +msgid "Shortcuts" +msgstr "" + +msgid "&Default Options" +msgstr "" + +msgid "&Close" +msgstr "" + +msgid "&Visible" +msgstr "" + +msgid "T&ext Options" +msgstr "" + +msgid "Icons + Selective Text" +msgstr "" + +msgid "Icons" +msgstr "" + +msgid "Icons + Text" +msgstr "" + +msgid "Text" +msgstr "" + +msgid "&Icon Options" +msgstr "" + +msgid "Large Icons" +msgstr "" + +msgid "Small Icons" +msgstr "" + +msgid "&Skins" +msgstr "" + +msgid "C&hange" +msgstr "" + +msgid "[ Separator ]" +msgstr "" + +msgid "[ Blank Separator ]" +msgstr "" + +msgid "To add command buttons, drag and drop commands onto a toolbar. To remove command buttons, drag them off the toolbar and drop them on the commands list." +msgstr "" + +msgid "Change Shortcut" +msgstr "" + +msgid "The shortcut is already being used by the \"%s\" command. Do you want to reassign it to the \"%s\" command?" +msgstr "" + +# ColorEdit Form +msgid "Transparent Color" +msgstr "" + +msgid "Color Picker" +msgstr "" + +msgid "Drag && Drop" +msgstr "" + diff --git a/internal/2.4.4/1/Demos/Customizer/locale/ignore.po b/internal/2.4.4/1/Demos/Customizer/locale/ignore.po new file mode 100644 index 0000000..eec136a --- /dev/null +++ b/internal/2.4.4/1/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/internal/2.4.4/1/Demos/Customizer/locale/ja/LC_MESSAGES/default.mo b/internal/2.4.4/1/Demos/Customizer/locale/ja/LC_MESSAGES/default.mo new file mode 100644 index 0000000000000000000000000000000000000000..f1a39da9d12e3aca07a3409408c3a784cbf694fb GIT binary patch literal 3366 zcmZvce{fXQ6~|9SN}DSF#2>A#Pugx1?Z!9rr-1S zE(?V_d+z6+^Ugi*+;i^RzutNC2w@~34?tGkMD#q^dNU@B>7_*91kZrCg6Bc}=ySzC zfXkr&3A_vZi?Uw^Z-@T1vM)uDZ$ZCbaV2;M^hdyNgKI&!(t5>BAg9o&_#DXZc>%aO8*IX49NLx0l8k!gJ=Q01hQWm#E%@s zT_ErCK+bPaai6k}g80!mCa%N#;KSf7$ngU3JK#USd%=H!oab^BljE)cxvm-}_OAi? zc`e9wX#kgfgXl?+{nx{I54ag*-2nL$U4R@nr|biYZ-M;&QKcVKJOy&RGwS*8K#uz*$Z`G* zavqnJ{huJ;i<{uY_N5@ly#?er_kg@F0^&zcU}C?GAV2Q_`MfWJye|tr4E_pazX_1{ zPbvFn%KjC|`~R)31tOfIo*cLAW;jpUUGg2=|V^SH9bIkO+jo zdz6*dL3n(xgz)=)O09naa-Y^fR->ETZ>@|%(j!( zSqteJR=3t=+vYaip~wbdW+>9C_aa8NVs6uS7~Q&S*jB~Xo?$&pkxnBe!p)s7UZ^{% zijRs5r>%x~g_<%MvzONC$(L!JZKh~l&NPLarG#!Jg-Hovxxx`Cx+eF8o#~}SF6-K9 zV^^5N6;0IE)>ahfs-;%WE`eHvhi^`A6RDI)Y2{Gi=H{KKON+k4b_`c!i3`NDm7*5g zaVT|gp*cEzqC%~90wiI%Yz?T$p&J0gm>xNZVB% z?OoA?Bf{23pVnOw*Xm=jhG?uY8e5~)t&TS|z$dy{>@YY$#bphiN9$r*eSN%PRW$Zk zELPQu3Prmd-O8Fe+7j2QHf`M0TzPk0ZLBJR&f;9ruHFn@<%*r|qZv~-tjD!vkM3lJ zyLL-gOSG}#$KkdMC)#W!?G!$jxYoGMaI2n+t{0YYO7BVS>=rJ^(&}pKk%rZsL*JrZ zLQf+JD*C&F-<+wAG}VywK9K$q>0^Ff`UUAtS4R>xG(R)3cxX>`q!}Lmi1fy!H!l6t z)sdDODjqr?TpYS;Dg9yTUknY>KL|JJAE=IO;H~fTKJTdXPDsD6?AOXq`lY{5dS|gw zdNa~L8KzK*)5d9?LXay@sw3@eI~QhwJWGC^$Yo-*IJ^HUgY;kHkeoxwsjG$-#wO;+ zXR9MyYiKe5-u&AWRP4JTy#WfwPX&boG(Wkw`0f~vCG&%LOF{a_I2-Q*!qD9LLNGoF zbEQsNsZb@`+jt#Tr=|Ci^e%BN`NYVea<1zi&+;dA-KO8(z@+_OB`E0IE4}_;Xg_Av zrt7!OYQe7uq?cd#d>0tM94sdmIsW^Uk{==gs+k0U@ z`hsCpgfD>7RS&#bbqi?m)w9xj6+Wu(6r4F;EPP1C{fFm1-Us_NH-Lhf6T#GLGJgn9 z#-u+W{o`T%Zgd?GV|wAl5EUoSEewA=KXNJM7V2Ce`6~*V|XxleGrjL*~$C~ pU7*B;KxKZ3hDFhBDS{STjm<>3GT literal 0 HcmV?d00001 diff --git a/internal/2.4.4/1/Demos/Customizer/locale/ja/LC_MESSAGES/default.po b/internal/2.4.4/1/Demos/Customizer/locale/ja/LC_MESSAGES/default.po new file mode 100644 index 0000000..f448e00 --- /dev/null +++ b/internal/2.4.4/1/Demos/Customizer/locale/ja/LC_MESSAGES/default.po @@ -0,0 +1,557 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: Customizer Demo\n" +"POT-Creation-Date: 2005-08-09 16:55\n" +"PO-Revision-Date: 2009-09-10 22:54-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 "é–‹ã..." + +#. 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 customize them" +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..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 "レイアウトã«åå‰ã‚’付ã‘ã¦ä¿å­˜" + +# Customizer Form +msgid "Toolbars" +msgstr "" + +msgid "Commands" +msgstr "" + +msgid "Shortcuts" +msgstr "" + +msgid "&Default Options" +msgstr "" + +msgid "&Close" +msgstr "" + +msgid "&Visible" +msgstr "" + +msgid "T&ext Options" +msgstr "" + +msgid "Icons + Selective Text" +msgstr "" + +msgid "Icons" +msgstr "" + +msgid "Icons + Text" +msgstr "" + +msgid "Text" +msgstr "" + +msgid "&Icon Options" +msgstr "" + +msgid "Large Icons" +msgstr "" + +msgid "Small Icons" +msgstr "" + +msgid "&Skins" +msgstr "" + +msgid "C&hange" +msgstr "" + +msgid "[ Separator ]" +msgstr "" + +msgid "[ Blank Separator ]" +msgstr "" + +msgid "To add command buttons, drag and drop commands onto a toolbar. To remove command buttons, drag them off the toolbar and drop them on the commands list." +msgstr "" + +msgid "Change Shortcut" +msgstr "" + +msgid "The shortcut is already being used by the \"%s\" command. Do you want to reassign it to the \"%s\" command?" +msgstr "" + +# ColorEdit Form +msgid "Transparent Color" +msgstr "" + +msgid "Color Picker" +msgstr "" + +msgid "Drag && Drop" +msgstr "" + diff --git a/internal/2.4.4/1/Demos/Customizer/locale/ko/LC_MESSAGES/default.mo b/internal/2.4.4/1/Demos/Customizer/locale/ko/LC_MESSAGES/default.mo new file mode 100644 index 0000000000000000000000000000000000000000..f440ac00191b31a9f806061a3587df4260bcf0dc GIT binary patch literal 5026 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 literal 0 HcmV?d00001 diff --git a/internal/2.4.4/1/Demos/Customizer/locale/nl/LC_MESSAGES/default.po b/internal/2.4.4/1/Demos/Customizer/locale/nl/LC_MESSAGES/default.po new file mode 100644 index 0000000..b3847a9 --- /dev/null +++ b/internal/2.4.4/1/Demos/Customizer/locale/nl/LC_MESSAGES/default.po @@ -0,0 +1,557 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: Customizer Demo\n" +"POT-Creation-Date: 2005-08-09 16:55\n" +"PO-Revision-Date: 2009-09-10 22:56-0300\n" +"Last-Translator: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: dxgettext 1.2\n" +"Language-Team: \n" + +#. Form1..SpTBXDock1..tbStandard..Caption +#: Unit1.dfm:29 +msgid "Standard" +msgstr "Standaard" + +#. Form1..SpTBXDock1..tbStandard..tNew..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mFile..mNew..CaptionW +#. Form1..TntActionList1..aNew..Caption +#: Unit1.dfm:37 +#: Unit1.dfm:159 +#: Unit1.dfm:1559 +msgid "New" +msgstr "Nieuw" + +#. Form1..SpTBXDock1..tbStandard..tOpen..CaptionW +#: Unit1.dfm:41 +msgid "Open" +msgstr "Open" + +#. Form1..SpTBXDock1..tbStandard..tSave..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mFile..mSave..CaptionW +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayoutSave..CaptionW +#. Form1..TntActionList1..aSave..Caption +#: Unit1.dfm:45 +#: Unit1.dfm:167 +#: Unit1.dfm:318 +#: Unit1.dfm:1573 +msgid "Save" +msgstr "Opslaan" + +#. Form1..SpTBXDock1..tbStandard..tCut..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCut..CaptionW +#. Form1..TntActionList1..aCut..Caption +#: Unit1.dfm:51 +#: Unit1.dfm:184 +#: Unit1.dfm:1585 +msgid "Cut" +msgstr "Knippen" + +#. Form1..SpTBXDock1..tbStandard..tCopy..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mCopy..CaptionW +#. Form1..TntActionList1..aCopy..Caption +#: Unit1.dfm:55 +#: Unit1.dfm:188 +#: Unit1.dfm:1592 +msgid "Copy" +msgstr "Kopiëren" + +#. Form1..SpTBXDock1..tbStandard..tPaste..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mPaste..CaptionW +#. Form1..TntActionList1..aPaste..Caption +#: Unit1.dfm:60 +#: Unit1.dfm:192 +#: Unit1.dfm:1599 +msgid "Paste" +msgstr "Plakken" + +#. Form1..SpTBXDock1..tbStandard..tFind..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mFind..CaptionW +#. Form1..TntActionList1..aFind..Caption +#: Unit1.dfm:67 +#: Unit1.dfm:206 +#: Unit1.dfm:1612 +msgid "Find" +msgstr "Zoeken" + +#. Form1..SpTBXDock1..tbStandard..tThemes..CaptionW +#: Unit1.dfm:73 +msgid "Themes" +msgstr "Thema's" + +#. Form1..SpTBXDock1..tbFormat..Caption +#. Form1..TntActionList1..aBold..Category +#. Form1..TntActionList1..aItalic..Category +#. Form1..TntActionList1..aUnderline..Category +#. Form1..TntActionList1..aLeftJustify..Category +#. Form1..TntActionList1..aRightJustify..Category +#. Form1..TntActionList1..aCentered..Category +#. Form1..TntActionList1..aBullets..Category +#. Form1..TntActionList1..aNumberedBullets..Category +#: Unit1.dfm:99 +#: Unit1.dfm:1618 +#: Unit1.dfm:1625 +#: Unit1.dfm:1632 +#: Unit1.dfm:1639 +#: Unit1.dfm:1645 +#: Unit1.dfm:1651 +#: Unit1.dfm:1657 +#: Unit1.dfm:1663 +msgid "Format" +msgstr "Opmaak" + +#. Form1..SpTBXDock1..tbFormat..tFont..Caption +#: Unit1.dfm:106 +msgid "Font Name" +msgstr "Font Naam" + +#. Form1..SpTBXDock1..tbFormat..tFontSize..Caption +#: Unit1.dfm:116 +msgid "Font Size" +msgstr "Font Grootte" + +#. Form1..SpTBXDock1..tbFormat..tBold..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBold..CaptionW +#. Form1..TntActionList1..aBold..Caption +#: Unit1.dfm:132 +#: Unit1.dfm:213 +#: Unit1.dfm:1619 +msgid "Bold" +msgstr "Vet" + +#. Form1..SpTBXDock1..tbFormat..tItalic..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mItalic..CaptionW +#. Form1..TntActionList1..aItalic..Caption +#: Unit1.dfm:136 +#: Unit1.dfm:217 +#: Unit1.dfm:1626 +msgid "Italic" +msgstr "Cursief" + +#. Form1..SpTBXDock1..tbFormat..tUnderline..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mUnderline..CaptionW +#. Form1..TntActionList1..aUnderline..Caption +#: Unit1.dfm:140 +#: Unit1.dfm:221 +#: Unit1.dfm:1633 +msgid "Underline" +msgstr "Onderstreept" + +#. Form1..SpTBXDock1..tbMenuBar..Caption +#: Unit1.dfm:146 +msgid "Menu" +msgstr "Menu" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..CaptionW +#: Unit1.dfm:156 +msgid "&File" +msgstr "&Bestand" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mOpen..CaptionW +#. Form1..TntActionList1..aOpen..Caption +#: Unit1.dfm:163 +#: Unit1.dfm:1566 +msgid "Open..." +msgstr "Open..." + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mPrint..CaptionW +#. Form1..TntActionList1..aPrint..Caption +#. Form1..SpTBXCustomizer1..cPrint..CaptionW +#: Unit1.dfm:171 +#: Unit1.dfm:1670 +#: Unit1.dfm:1744 +msgid "Print" +msgstr "Afdrukken" + +#. Form1..SpTBXDock1..tbMenuBar..mFile..mExit..CaptionW +#. Form1..TntActionList1..aExit..Caption +#. Form1..SpTBXCustomizer1..cExit..CaptionW +#: Unit1.dfm:177 +#: Unit1.dfm:1580 +#: Unit1.dfm:1776 +msgid "Exit" +msgstr "Afsluiten" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..CaptionW +#: Unit1.dfm:181 +msgid "&Edit" +msgstr "Be&werken" + +#. Form1..SpTBXDock1..tbMenuBar..mEdit..mSelectAll..CaptionW +#. Form1..TntActionList1..aSelectAll..Caption +#. Form1..SpTBXCustomizer1..cSelectAll..CaptionW +#: Unit1.dfm:198 +#: Unit1.dfm:1606 +#: Unit1.dfm:1772 +msgid "Select All" +msgstr "Alles Selecteren" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..CaptionW +#: Unit1.dfm:210 +msgid "&Format" +msgstr "&Opmaak" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mLeftJustify..CaptionW +#. Form1..TntActionList1..aLeftJustify..Caption +#. Form1..SpTBXCustomizer1..cLeftJustify..CaptionW +#: Unit1.dfm:227 +#: Unit1.dfm:1640 +#: Unit1.dfm:1748 +msgid "Left Justify" +msgstr "Links Uitlijnen" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mCentered..CaptionW +#. Form1..TntActionList1..aCentered..Caption +#. Form1..SpTBXCustomizer1..cCentered..CaptionW +#: Unit1.dfm:231 +#: Unit1.dfm:1652 +#: Unit1.dfm:1752 +msgid "Centered" +msgstr "Centreren" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mRightJustify..CaptionW +#. Form1..TntActionList1..aRightJustify..Caption +#. Form1..SpTBXCustomizer1..cRightJustify..CaptionW +#: Unit1.dfm:235 +#: Unit1.dfm:1646 +#: Unit1.dfm:1756 +msgid "Right Justify" +msgstr "Rechts Uitlijnen" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mBullets..CaptionW +#. Form1..TntActionList1..aBullets..Caption +#. Form1..SpTBXCustomizer1..cBullets..CaptionW +#: Unit1.dfm:241 +#: Unit1.dfm:1658 +#: Unit1.dfm:1760 +msgid "Bullets" +msgstr "Opsommingstekens" + +#. Form1..SpTBXDock1..tbMenuBar..SpTBXSubmenuItem1..mNumberedBullets..CaptionW +#. Form1..TntActionList1..aNumberedBullets..Caption +#. Form1..SpTBXCustomizer1..cNumBullets..CaptionW +#: Unit1.dfm:245 +#: Unit1.dfm:1664 +#: Unit1.dfm:1764 +msgid "Numbered Bullets" +msgstr "Nummering" + +#. Form1..SpTBXDock1..tbMenuBar..mView..CaptionW +#: Unit1.dfm:249 +msgid "&View" +msgstr "Beel&d" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..CaptionW +#: Unit1.dfm:251 +msgid "&Sidebar" +msgstr "&Zijbalk" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mCommandsLog..CaptionW +#: Unit1.dfm:254 +msgid "&Commands Log" +msgstr "&Commando's Log" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mOptions..CaptionW +#: Unit1.dfm:258 +msgid "&Options" +msgstr "&Opties" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mSidebar..mmHelp..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mHelp..CaptionW +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mmmHelp..CaptionW +#: Unit1.dfm:262 +#: Unit1.dfm:286 +#: Unit1.dfm:288 +msgid "&Help" +msgstr "&Help" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..CaptionW +#: Unit1.dfm:266 +msgid "&Toolbars" +msgstr "&Werkbalken" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mStandardToolbar..CaptionW +#: Unit1.dfm:269 +msgid "&Standard Toolbar" +msgstr "&Standaard Werkbalk" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..tLayoutsToolbar..CaptionW +#: Unit1.dfm:273 +msgid "&Layouts Toolbar" +msgstr "&Weergave Werkbalk" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mFormattingToolbar..CaptionW +#: Unit1.dfm:277 +msgid "&Formatting Toolbar" +msgstr "&Opmaak Werkbalk" + +#. Form1..SpTBXDock1..tbMenuBar..mView..mToolbars..mNavigationToolbar..CaptionW +#: Unit1.dfm:281 +msgid "&Navigation Toolbar" +msgstr "&Navigatie Werkbalk" + +#. Form1..SpTBXDock1..tbMenuBar..mHelp..mAbout..CaptionW +#: Unit1.dfm:291 +msgid "&About" +msgstr "&Over" + +#. Form1..SpTBXDock1..tbLayouts..Caption +#. Form1..SpTBXDock1..tbLayouts..Layouts..SpTBXLabelItem1..CaptionW +#. Form1..SpTBXDock1..tbLayouts..Layouts..tLayouts..Caption +#: Unit1.dfm:298 +#: Unit1.dfm:305 +#: Unit1.dfm:308 +msgid "Layouts" +msgstr "Weergaven" + +#. Form1..SpTBXMultiDock1..dpLog..Caption +#: Unit1.dfm:332 +msgid "Commands Log" +msgstr "Opdrachtenlog" + +#. Form1..SpTBXMultiDock1..dpOptions..Caption +#: Unit1.dfm:352 +msgid "Customizer Options" +msgstr "Opties voor Aanpassingen" + +#. Form1..SpTBXMultiDock2..dpHelp..Caption +#: Unit1.dfm:368 +msgid "Help" +msgstr "Help" + +#. Form1..SpTBXMultiDock2..dpHelp..SpTBXLabel1..Caption +#: Unit1.dfm:380 +msgid "Right click the toolbars to customize them" +msgstr "Rechtsklik op de werkbalk om af te spelen" + +#. Form1..SpTBXDock2..tbNavigation..Caption +#. Form1..TntActionList1..aBack..Category +#. Form1..TntActionList1..aForward..Category +#. Form1..TntActionList1..aStop..Category +#. Form1..TntActionList1..aRefresh..Category +#. Form1..TntActionList1..aSearch..Category +#. Form1..TntActionList1..aFavs..Category +#: Unit1.dfm:402 +#: Unit1.dfm:1675 +#: Unit1.dfm:1681 +#: Unit1.dfm:1687 +#: Unit1.dfm:1693 +#: Unit1.dfm:1699 +#: Unit1.dfm:1705 +msgid "Navigation" +msgstr "Navigatie" + +#. Form1..SpTBXDock2..tbNavigation..tBack..CaptionW +#. Form1..TntActionList1..aBack..Caption +#: Unit1.dfm:409 +#: Unit1.dfm:1676 +msgid "Back" +msgstr "Terug" + +#. Form1..SpTBXDock2..tbNavigation..tForward..CaptionW +#. Form1..TntActionList1..aForward..Caption +#: Unit1.dfm:413 +#: Unit1.dfm:1682 +msgid "Forward" +msgstr "Vooruit" + +#. Form1..SpTBXDock2..tbNavigation..tRefresh..CaptionW +#. Form1..TntActionList1..aRefresh..Caption +#: Unit1.dfm:417 +#: Unit1.dfm:1694 +msgid "Refresh" +msgstr "Vernieuwen" + +#. Form1..SpTBXDock2..tbNavigation..tStop..CaptionW +#. Form1..TntActionList1..aStop..Caption +#: Unit1.dfm:421 +#: Unit1.dfm:1688 +msgid "Stop" +msgstr "Stoppen" + +#. Form1..SpTBXDock2..tbNavigation..tSearch..CaptionW +#. Form1..TntActionList1..aSearch..Caption +#: Unit1.dfm:425 +#: Unit1.dfm:1700 +msgid "Search" +msgstr "Zoeken" + +#. Form1..TntActionList1..aNew..Category +#. Form1..TntActionList1..aOpen..Category +#. Form1..TntActionList1..aSave..Category +#. Form1..TntActionList1..aExit..Category +#. Form1..TntActionList1..aPrint..Category +#: Unit1.dfm:1558 +#: Unit1.dfm:1565 +#: Unit1.dfm:1572 +#: Unit1.dfm:1579 +#: Unit1.dfm:1669 +msgid "Files" +msgstr "Bestanden" + +#. Form1..TntActionList1..aCut..Category +#. Form1..TntActionList1..aCopy..Category +#. Form1..TntActionList1..aPaste..Category +#. Form1..TntActionList1..aSelectAll..Category +#. Form1..TntActionList1..aFind..Category +#: Unit1.dfm:1584 +#: Unit1.dfm:1591 +#: Unit1.dfm:1598 +#: Unit1.dfm:1605 +#: Unit1.dfm:1611 +msgid "Edit" +msgstr "Bewerken" + +#. Form1..TntActionList1..aCustomize..Category +#. Form1..TntActionList1..aEmbeddedCustomize..Category +#: Unit1.dfm:1711 +#: Unit1.dfm:1716 +msgid "Customization" +msgstr "Aanpassingen" + +#. Form1..TntActionList1..aCustomize..Caption +#. Form1..SpTBXPopupMenu1..pCustomize..CaptionW +#: Unit1.dfm:1712 +#: Unit1.dfm:1731 +msgid "Customize..." +msgstr "Aanpassen..." + +#. Form1..TntActionList1..aEmbeddedCustomize..Caption +#. Form1..SpTBXPopupMenu1..pEmbeddedCustomize..CaptionW +#: Unit1.dfm:1717 +#: Unit1.dfm:1735 +msgid "Embedded Customize..." +msgstr "Geïntegreerd Aanpassen..." + +#. Form2..Caption +#: Unit2.dfm:7 +msgid "Options" +msgstr "Opties" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tProperties..CaptionW +#: Unit2.dfm:49 +msgid "Properties" +msgstr "Eigenschappen" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tPageSetup..CaptionW +#: Unit2.dfm:58 +msgid "Page Setup" +msgstr "Pagina Instellingen" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tHistory..CaptionW +#: Unit2.dfm:67 +msgid "History" +msgstr "Geschiedenis" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tFavorites..CaptionW +#: Unit2.dfm:76 +msgid "Favorites" +msgstr "Favorieten" + +#. Form2..SpTBXDock1..SpTBXToolbar1..tCustomize..CaptionW +#. Form2..LeftPanel..TitlePanel..Caption +#: Unit2.dfm:85 +#: Unit2.dfm:168 +msgid "Customizer" +msgstr "Aanpassen" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton1..Caption +#: Unit2.dfm:122 +msgid "OK" +msgstr "OK" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton2..Caption +#: Unit2.dfm:137 +msgid "Cancel" +msgstr "Annuleren" + +#. Form2..LeftPanel..ButtonsPanel..SpTBXButton3..Caption +#: Unit2.dfm:152 +msgid "Apply" +msgstr "Toepassen" + +#: Unit1.pas:235 +msgid "Save Layout" +msgstr "Weergave Opslaan" + +#: Unit1.pas:235 +msgid "Save current layout as:" +msgstr "Huidige weergave opslaan als:" + +# Customizer Form +msgid "Toolbars" +msgstr "" + +msgid "Commands" +msgstr "" + +msgid "Shortcuts" +msgstr "" + +msgid "&Default Options" +msgstr "" + +msgid "&Close" +msgstr "" + +msgid "&Visible" +msgstr "" + +msgid "T&ext Options" +msgstr "" + +msgid "Icons + Selective Text" +msgstr "" + +msgid "Icons" +msgstr "" + +msgid "Icons + Text" +msgstr "" + +msgid "Text" +msgstr "" + +msgid "&Icon Options" +msgstr "" + +msgid "Large Icons" +msgstr "" + +msgid "Small Icons" +msgstr "" + +msgid "&Skins" +msgstr "" + +msgid "C&hange" +msgstr "" + +msgid "[ Separator ]" +msgstr "" + +msgid "[ Blank Separator ]" +msgstr "" + +msgid "To add command buttons, drag and drop commands onto a toolbar. To remove command buttons, drag them off the toolbar and drop them on the commands list." +msgstr "" + +msgid "Change Shortcut" +msgstr "" + +msgid "The shortcut is already being used by the \"%s\" command. Do you want to reassign it to the \"%s\" command?" +msgstr "" + +# ColorEdit Form +msgid "Transparent Color" +msgstr "" + +msgid "Color Picker" +msgstr "" + +msgid "Drag && Drop" +msgstr "" + diff --git a/internal/2.4.4/1/Demos/Customizer/locale/pt_BR/LC_MESSAGES/default.mo b/internal/2.4.4/1/Demos/Customizer/locale/pt_BR/LC_MESSAGES/default.mo new file mode 100644 index 0000000000000000000000000000000000000000..4352dcbe5dc32bb180d0100e17245de4256a3a64 GIT binary patch literal 3227 zcmZvcU5sQ!6@W|m(@|DkK}Aq&5gT@~hn`_)oo!sOr*~!EtvT5jL! zt$Vwf*_fDY{7Ez>B#Ood5>XRgAi*exkQhydm=Jg}fd?P(0epZ&UL+*G`JLO<+q2P| zd+NJYb?&KC=bWlH4`2JF;%OqcA;&+g)T40iS{k0`uT$!J_&azbd=c`hzec_WZ=nA- z_-Xj}IQ|~|B>nf}_;nch2>n|kZ-<|ve>eOnJOxozXCl|3xX_Ax1j;(!guKeqh`khk z91fxAUxwo6599cgaEAV`;bHh3yaxUSivG*+X820%{{xCYZ$t6ty*U1U9RE+`H8{hk zx)F+BH_?c_+hYF+l=-8vUxVW3A{4!4D1JQz#h-If;`Jyb1?mD6y*}hsA@UNG|1LxE z?55(~^3`+bqAf{9TnNlg_RYRK3!0$q_^K&TcJ_Y5!7a*^CmF5t9J@RcR|NR?^ z-5Hz{9)@D)^Ra&f@~WdWvhHyx`#S}1f~!#UzXc_}7JdSbV*dwF>i!o{{{I6M{XfB5 z;LA|r@Fv6+^%fMpf5rX>Q1T#)ihtKb$@3v7dbdKEzXPJGj>Yi>DEYY`%DGvCvd*_5 zud=a!G4@AL>f$mKd*6p*|HqL(gHqp5#rfys_#dJ8^JggjzXnC`4R{K^17*K=q9lII z!Y{!kDEb{J@k*iW?>kV||6b&epzP}jNLiGRh2L#oJE5Xpr+Qakd<9%d1#nXe*~=L?gM$S=YZh>rc+p~USdBKMEPK%UPb z_mp4M7Q73&BlhPbk3=rQyOFQQzSNmK3&{OQ1CiLtohr}0h~!Spf!icl3cI(o~kS-j98PRE34cg>&)v_jZcR*^pg>Iy&n&g}hKTvI~ z;n2A(u_1Mt`06j9T3t=5=WWO-nEEsUL7%pLKeM&jt~P@$Q(HZ43R~Cnwc0|pwpgv5 z)N?253k&E}&)Sg_15=fg%va}XdVapXaH3kfw^o~3BSO`7Fj<}&(o)wm>#OU_)3xVj zYcowU%f71Zy#Y%VcDJ}^kQ$fWr@K2QKU8aFkUCw?b$+X>ABf?+{k)E@>XqI)5i%8iSGnUrh1f1@H(+tPAKQab2y|x<@7be z#i1Md$!&bi=wl=_)}$baMe7= zoa1KFs9xDJNf6_e^7mX;U9l|RCs;4I=WILXwkQpsm5Ss29T*6577p~s3X`pflm9b$)^>dm-(p-3C8Pi5Qkp+C6+!70y%inUX eaKbU&9wwgaZd{OCtQl0>_D!x@!%i7RrvD3Xq|hS( literal 0 HcmV?d00001 diff --git a/internal/2.4.4/1/Demos/Customizer/locale/pt_BR/LC_MESSAGES/default.po b/internal/2.4.4/1/Demos/Customizer/locale/pt_BR/LC_MESSAGES/default.po new file mode 100644 index 0000000..88d2358 --- /dev/null +++ b/internal/2.4.4/1/Demos/Customizer/locale/pt_BR/LC_MESSAGES/default.po @@ -0,0 +1,558 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: Customizer Demo\n" +"POT-Creation-Date: 2005-08-09 16:55\n" +"PO-Revision-Date: 2009-09-10 22:56-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 "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 customize them" +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..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:" + +# Customizer Form +msgid "Toolbars" +msgstr "" + +msgid "Commands" +msgstr "" + +msgid "Shortcuts" +msgstr "" + +msgid "&Default Options" +msgstr "" + +msgid "&Close" +msgstr "" + +msgid "&Visible" +msgstr "" + +msgid "T&ext Options" +msgstr "" + +msgid "Icons + Selective Text" +msgstr "" + +msgid "Icons" +msgstr "" + +msgid "Icons + Text" +msgstr "" + +msgid "Text" +msgstr "" + +msgid "&Icon Options" +msgstr "" + +msgid "Large Icons" +msgstr "" + +msgid "Small Icons" +msgstr "" + +msgid "&Skins" +msgstr "" + +msgid "C&hange" +msgstr "" + +msgid "[ Separator ]" +msgstr "" + +msgid "[ Blank Separator ]" +msgstr "" + +msgid "To add command buttons, drag and drop commands onto a toolbar. To remove command buttons, drag them off the toolbar and drop them on the commands list." +msgstr "" + +msgid "Change Shortcut" +msgstr "" + +msgid "The shortcut is already being used by the \"%s\" command. Do you want to reassign it to the \"%s\" command?" +msgstr "" + +# ColorEdit Form +msgid "Transparent Color" +msgstr "" + +msgid "Color Picker" +msgstr "" + +msgid "Drag && Drop" +msgstr "" + diff --git a/internal/2.4.4/1/Demos/Customizer/locale/ru/LC_MESSAGES/default.mo b/internal/2.4.4/1/Demos/Customizer/locale/ru/LC_MESSAGES/default.mo new file mode 100644 index 0000000000000000000000000000000000000000..13808d3d9e7b4a062805878b16c71c38f71c71cc GIT binary patch literal 3776 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 literal 0 HcmV?d00001 diff --git a/internal/2.4.4/1/Demos/Customizer/locale/sr_Latin/LC_MESSAGES/default.po b/internal/2.4.4/1/Demos/Customizer/locale/sr_Latin/LC_MESSAGES/default.po new file mode 100644 index 0000000..b15ae0c --- /dev/null +++ b/internal/2.4.4/1/Demos/Customizer/locale/sr_Latin/LC_MESSAGES/default.po @@ -0,0 +1,557 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: Customizer Demo\n" +"POT-Creation-Date: 2005-08-09 16:55\n" +"PO-Revision-Date: 2009-09-10 22:58-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 "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 customize them" +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..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:" + +# Customizer Form +msgid "Toolbars" +msgstr "" + +msgid "Commands" +msgstr "" + +msgid "Shortcuts" +msgstr "" + +msgid "&Default Options" +msgstr "" + +msgid "&Close" +msgstr "" + +msgid "&Visible" +msgstr "" + +msgid "T&ext Options" +msgstr "" + +msgid "Icons + Selective Text" +msgstr "" + +msgid "Icons" +msgstr "" + +msgid "Icons + Text" +msgstr "" + +msgid "Text" +msgstr "" + +msgid "&Icon Options" +msgstr "" + +msgid "Large Icons" +msgstr "" + +msgid "Small Icons" +msgstr "" + +msgid "&Skins" +msgstr "" + +msgid "C&hange" +msgstr "" + +msgid "[ Separator ]" +msgstr "" + +msgid "[ Blank Separator ]" +msgstr "" + +msgid "To add command buttons, drag and drop commands onto a toolbar. To remove command buttons, drag them off the toolbar and drop them on the commands list." +msgstr "" + +msgid "Change Shortcut" +msgstr "" + +msgid "The shortcut is already being used by the \"%s\" command. Do you want to reassign it to the \"%s\" command?" +msgstr "" + +# ColorEdit Form +msgid "Transparent Color" +msgstr "" + +msgid "Color Picker" +msgstr "" + +msgid "Drag && Drop" +msgstr "" + diff --git a/internal/2.4.4/1/Demos/Customizer/locale/sv/LC_MESSAGES/default.mo b/internal/2.4.4/1/Demos/Customizer/locale/sv/LC_MESSAGES/default.mo new file mode 100644 index 0000000000000000000000000000000000000000..1e50a7085da7d98297daa454a61d7e9e24f5c2a7 GIT binary patch literal 3103 zcmZXVZ-`u16~IqzliJl(+osjps<*Wro7UOPZoBPfYpk2eZZ_S2Au|aL(hqm%-JN}z zH}5^}do#)8V?q3+2-2e8L=wNKpkGoEL2*PVD59T4L=hCkLa|T;LBZd7b0^d4WzPNG zbKkw^o_p>&yMMg*j#q`&L>@+-d7sE7xOE2|?fZvB4#OY7Bk+fipZp^5m+(&X-@^Og z@5B6C@Wbfug!w}lc|ZDtfsev_(4T^L!IO}sawc#astc{am!O{WGUO+YPVFV|gKz+K z{VP!Y{8E^I70#i53*HOA2XBWzg}VOd@P7D4(EkM0pT9u$=dCdRPMH5!;O#iWP>w+L z>nNStdpPKiK>dC!=nbfTE<;_n2Gy?@q55+HYP>E%oF#0Or3y6+XJ{(U*{ zYhnHyke^(q(>Qz=J_&yW)!tv>2jJh~N8mr9`gu3ORJ->>jjN&4^~a!opNATkC3xp; zA}>Jo`wWx%j+;=wzf7m=yHM?=@Bui293@|c8i%h#-FE}3Kd(c6GN!v5{wnYfQ1AIB zRC{kjj+TEzJ^v7sI)4|Po_iGP_lKay^D(IBE3aR!qVaqI(fh6-pF*BP)E{m7 z_e0w!5xvv%NF8|`c@WX2Ijc=;c^=W&d({t`Ahg=o{b zYtuaXybfreMxI1YAkQFDTiweBrPP{Pzi-p1Fk4wyYHLx<+nym?TS#&XWS7bHM zlaZXVot~V^l1NSslEjsTG;P{(i8NhWI`1NRkMGSaA4zjilvzK%R{3yCbMy1_GsVAa zXr|sZiA8n!wf>%qA{UvdscQ4uRpPR4hnbH{SBM5k`!tgEEG^BB?YqgS6<^a)6*+K) zYf2TYjTq1TNY0ivi8~TPCtGg6G%w|4#`t^Q?R!@o$oaT?FgtXjb#SU@$^&Q0$r~38 zOechs*#p;?mL0mPGZXhGT7nHrS-E>{i5>)39~YL0B=sael~Y*w_R^~S3Pb0v@P9=S!^_x>W$@kyx<^~TeU#@rSWs<*vOi^TFQD`sx{?DpF1?1lNp zT$7jOUiJ1U=cv+MEsy7kjnn5%=fL{Hl_xK>*Xzr(b!u+k`TAPg$s)>S#Vqf|<=jj4 zGcI+0a!z!$>q@m{7UmamBkc}&w|d*zK2At&w=cELNl9i0Rm#LYshxLG+{FY{>wEEV zT9cERG`B@z4RPz0qi(T3zMfFE8<*j&8V!@P+?p<1O(><5m|~Oy&2377)uyi%w*8Ok zi*aE^=Zcau5^2W?e-(OG)*bmaNPA_1=T=sSdwx___mdE;GwYow|$imQS zVozrII&*O|iSyi0s<#4iHr*R_yOEihsJ0G^WPk_LiuE#yTWfr?CvDg1xwJ^*veaz! ziR*=mRbSSGi65=;0Ti#%EKw1t%-8wH9$JbM;%wMKNbRV@ldQa_+Fi-L7%_B1j z2&FrIEzeUMP`Nt09r2&kkZ{kU^wz|ww0b@s>Xp~JINh@pvs}pYi2Uc&jqy$LV(P<0 z>uD)llaFth;k$FfrDlJ8(;Hisrl%=p;_mncF>mD-Q&oSfuyx9$gCU?ur?p*VeTrLy cxNUt82aHWfwrRRdU%c)3molktu0govzyEugvH$=8 literal 0 HcmV?d00001 diff --git a/internal/2.4.4/1/Demos/Customizer/locale/sv/LC_MESSAGES/default.po b/internal/2.4.4/1/Demos/Customizer/locale/sv/LC_MESSAGES/default.po new file mode 100644 index 0000000..0dc5c2c --- /dev/null +++ b/internal/2.4.4/1/Demos/Customizer/locale/sv/LC_MESSAGES/default.po @@ -0,0 +1,557 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: Customizer Demo\n" +"POT-Creation-Date: 2005-08-09 16:55\n" +"PO-Revision-Date: 2009-09-10 22:57-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 "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 customize them" +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..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:" + +# Customizer Form +msgid "Toolbars" +msgstr "" + +msgid "Commands" +msgstr "" + +msgid "Shortcuts" +msgstr "" + +msgid "&Default Options" +msgstr "" + +msgid "&Close" +msgstr "" + +msgid "&Visible" +msgstr "" + +msgid "T&ext Options" +msgstr "" + +msgid "Icons + Selective Text" +msgstr "" + +msgid "Icons" +msgstr "" + +msgid "Icons + Text" +msgstr "" + +msgid "Text" +msgstr "" + +msgid "&Icon Options" +msgstr "" + +msgid "Large Icons" +msgstr "" + +msgid "Small Icons" +msgstr "" + +msgid "&Skins" +msgstr "" + +msgid "C&hange" +msgstr "" + +msgid "[ Separator ]" +msgstr "" + +msgid "[ Blank Separator ]" +msgstr "" + +msgid "To add command buttons, drag and drop commands onto a toolbar. To remove command buttons, drag them off the toolbar and drop them on the commands list." +msgstr "" + +msgid "Change Shortcut" +msgstr "" + +msgid "The shortcut is already being used by the \"%s\" command. Do you want to reassign it to the \"%s\" command?" +msgstr "" + +# ColorEdit Form +msgid "Transparent Color" +msgstr "" + +msgid "Color Picker" +msgstr "" + +msgid "Drag && Drop" +msgstr "" + diff --git a/internal/2.4.4/1/Demos/Customizer/locale/tr/LC_MESSAGES/default.mo b/internal/2.4.4/1/Demos/Customizer/locale/tr/LC_MESSAGES/default.mo new file mode 100644 index 0000000000000000000000000000000000000000..9647d3dae58c1873f732bea25db2910ed6d1ab6b GIT binary patch literal 3239 zcmZXVPi$OA9mfaSQff#Gr3DHtOj}q;+jZ7X9h@y8*lWj0?ATUz6V-=GjCaTD>ApX! z_s7W^A)#{c1tcU?3MV7fDyjrhd_f5LP_!G=Ry}b*f4Bztp-=XOF2NXT;`~KU$|G%DhA%POB?~maF_}4u5pp1J3ik?@YtivIcIB&ow;hPXC z>ffFpK*=YfWc+4rBqW?#}|Hn|`{}jr5zkqCu;`%(TXs=*|FY?N_Mb6n-OzKs|p2WU|i5|J+`ytm? zG0Lo-!^+s#u}3huWUb_qy)lVN?q{&k_1NgfQ)+h#)83c8DDyau$$Fi^Q9DV0pU}@tdG~yM^T-4T$I1V;V zqDtp&&{d@s(<4SY?p`%Ju5B_GN8`S=uK1}c)m_ULFV`~?nxr)z*p@n?y%u+Ss+Ol&9J<{?!-t-ooSYmx$sM

9huBm+K)Qa88^hH#=t)9AMqg;(^s8*@PYK|Z#t4BpxTUKjb8x@Vr zYczv()3&;9v%IU;O`2J?p13HZjk`9<9C|O?t;D9=>auHZkCP6)CZakz+qOCzu5rqZ zZu)Z4yKO^NH#@dy^iclrzL_TpE24v9H)xYqRo$ATxeWr_%=BCksL`5p6L(dEXb8Fz zwQLf&NVLW;GPHc5RlaJIlnqlIFF>LfY#2|huQkfG#1>0iUND)h>gh^lrd*jVS5E7x zQ`MOn#*{DH9VY?CLr(L&JXO)t)72U7PgW`uD^#f5NKBLlhGnVhiAxtQEsk?fO;#pq ztSs{?H+o%CW%hb@q8k_&J*S)7CP{5}=1SvSd3HQb!fn~4ycjj(7RRNkXE$9o@qBs7 zMm8DdX?Q}!ND?}&ftLKp-Rhfm}h#ae;5V*!@++4P?Z+? zhr2f5OfJM}k0JA}f5U~G<;3)F=>A^5nGg1JJ?su_)N+XnTrcLtZm<&v2Ok|xdToxmi61H$)zmoSz7VW_V3 z+Ie8ql1-diHUZOBbr-hTEQz{mcH1OWYYFGXMB(7z*1q~^C6+ntJXignQ;)#j+Rt1P z+RhPQ4#%C(*^a}R=;53L+jC8}idtqXjw*}HuzyIwDWb%+5vrU%5~sg6IADo}=h@`txxw&vNA#Zg5kg^L)5AO9%`daR)c$E72LM5(TOr z2SzU#CQUrP6YK`RU~0p%e0(NMA{8Sa^$v={=?}}=Frf+69EHWCFr!)&u}yD_;Ig-f zv|+k3w~ROuA}Ukw%p4%p1d<85teM zd1^HgbV>wG8g@ue_Q0~~wQT0+?6h~KCi0Qct)V{MDTY;xLZ7$YlufH;Hlt4r5%NSe TY)Ca&j(`lD47c0nB&h!b%lG;5 literal 0 HcmV?d00001 diff --git a/internal/2.4.4/1/Demos/Customizer/locale/tr/LC_MESSAGES/default.po b/internal/2.4.4/1/Demos/Customizer/locale/tr/LC_MESSAGES/default.po new file mode 100644 index 0000000..21bdcf7 --- /dev/null +++ b/internal/2.4.4/1/Demos/Customizer/locale/tr/LC_MESSAGES/default.po @@ -0,0 +1,557 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: Customizer Demo\n" +"POT-Creation-Date: 2005-08-09 16:55\n" +"PO-Revision-Date: 2009-09-10 22:59-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 "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 customize them" +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..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:" + +# Customizer Form +msgid "Toolbars" +msgstr "" + +msgid "Commands" +msgstr "" + +msgid "Shortcuts" +msgstr "" + +msgid "&Default Options" +msgstr "" + +msgid "&Close" +msgstr "" + +msgid "&Visible" +msgstr "" + +msgid "T&ext Options" +msgstr "" + +msgid "Icons + Selective Text" +msgstr "" + +msgid "Icons" +msgstr "" + +msgid "Icons + Text" +msgstr "" + +msgid "Text" +msgstr "" + +msgid "&Icon Options" +msgstr "" + +msgid "Large Icons" +msgstr "" + +msgid "Small Icons" +msgstr "" + +msgid "&Skins" +msgstr "" + +msgid "C&hange" +msgstr "" + +msgid "[ Separator ]" +msgstr "" + +msgid "[ Blank Separator ]" +msgstr "" + +msgid "To add command buttons, drag and drop commands onto a toolbar. To remove command buttons, drag them off the toolbar and drop them on the commands list." +msgstr "" + +msgid "Change Shortcut" +msgstr "" + +msgid "The shortcut is already being used by the \"%s\" command. Do you want to reassign it to the \"%s\" command?" +msgstr "" + +# ColorEdit Form +msgid "Transparent Color" +msgstr "" + +msgid "Color Picker" +msgstr "" + +msgid "Drag && Drop" +msgstr "" + diff --git a/internal/2.4.4/1/Demos/Customizer/locale/zh_CN/LC_MESSAGES/default.mo b/internal/2.4.4/1/Demos/Customizer/locale/zh_CN/LC_MESSAGES/default.mo new file mode 100644 index 0000000000000000000000000000000000000000..3060db2d4adb2b5217e0f365106d4116233e05a5 GIT binary patch literal 3101 zcmZvcU2GiH6~_-Bfnq*dzC%mNK-&ouw&t7CQ+zc4Rvdc|g@<_u3wqomtJ! znmBzip^0t4acJx$Ev6;LY0?lo4up8)ujHWuRYg1?!~>ODsoJ}{<^gy>e7qq3XZAR2 zB(C<{-#ur}oO|v$clN(GT{%h^G02^ehb|}D0XAQW31fN{(N*9X@Om%{;z#cY-vh6P z{sDM1__5eO1%Cql3$d?4kRL(6LwFB(BlP>hYryp&Txp|l3&<(73!emepQk|lNMYi5 zHh3MF0oi{K$a(gQeH5&KJ`UalPJ&l}7eV&_CwMFPFVX)8ay~hb^Z8WlUx@u1;T1>* zOS&H9yl%n7@$MA;Zjhf>i5>wt&w7yk8bQwMagg)b26DZ2fM@|d4YFSn#E(4TZjj&G z19E;t!h>S}Gl(BeVB$KQ0`CK7L5`=vYr#*z+rckE&hrKoljGhBa$OBf>|X`)^J7n0{6g=|6918 zk3zWKQOGYKzlLz%dGI~qu?B*&&?AsAQWVi|9{p)c&vsz7_5kX3RXgXDSEB&ZecxmKjb%}-y*C7e+y}Va839>mB(5L zf7ATE^0!h02|@U~N7-ltga_B12j8#X@dD#s2={3n=cEX&0fSvm(49^kJV-Rmg|<tr;i z6l%8;DtNiw$A+etDEmlUIBmDov(%7E*}b&Ej6XvgTsuJ>|&@zaQMdLPL)Wggs~hdc)4*G>e6KP zxSr*!G;x7=b`sR&I=<0jCRJ(GZtdn(P&wdP9Fu}#ZL*M=*Grpy)3)LyrK4um=^KwD zYpb)DwkRh<Rj13cp~m2@k%wswSLo(ftUe$4b$)ToU_>cWxwaAciP^Ki7T4nE;F)njphvdcO= z57$JD+S+Ix)@vh?ie^+O+~Ju{+BVUas8O+H^OnZ)-Zj;ciWoYJbA>y4Q`pK^yZi@J zwrM$!81Zh?ODliB^vQ;SOackp$_zZ{=q9SB4s@NWZ+0o14fVKBg}mt_;Phs4#!1xcG8qsIiLj zhx&7K=PE-@SiUx|=Z9A;^~^E7cP9T@$)>YY`h|Z~hBhH!_IZ7#Z^h$g*iO$E2TrcA zwN%kk-{8{G^Od32D#|S$FD{-BVzu*D{knhO3TN0>XdUqQ+p)sfiU$_3#Yo;Y0az1EkOF&1EOQcU;mFLwevG75h)>slVjT z50+Pa<#x2}*f#8&I;hmtGw&PAwJ|rclNs#j|Gv zr=e+7?yvd2^>5ch{R*JCFx^(U8o0g34TIX(Q=(#RB!Qat+7rNU6|!mE1nh(L~` zr}ycFgE)6dFS+Ehv!Bf)-2-EVv*Wn0Cs2C18Kj>Z%TJC|E<3k0j#$|j^}wGBvlr+) DV(daX literal 0 HcmV?d00001 diff --git a/internal/2.4.4/1/Demos/Customizer/locale/zh_CN/LC_MESSAGES/default.po b/internal/2.4.4/1/Demos/Customizer/locale/zh_CN/LC_MESSAGES/default.po new file mode 100644 index 0000000..91d6097 --- /dev/null +++ b/internal/2.4.4/1/Demos/Customizer/locale/zh_CN/LC_MESSAGES/default.po @@ -0,0 +1,491 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: Customizer Demo\n" +"POT-Creation-Date: 2005-08-09 16:55\n" +"PO-Revision-Date: 2009-09-10 22:59-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..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 "将当å‰å¸ƒå±€ä¿å­˜ä¸ºï¼š" + +# Customizer Form +msgid "Toolbars" +msgstr "" + +msgid "Commands" +msgstr "" + +msgid "Shortcuts" +msgstr "" + +msgid "&Default Options" +msgstr "" + +msgid "&Close" +msgstr "" + +msgid "&Visible" +msgstr "" + +msgid "T&ext Options" +msgstr "" + +msgid "Icons + Selective Text" +msgstr "" + +msgid "Icons" +msgstr "" + +msgid "Icons + Text" +msgstr "" + +msgid "Text" +msgstr "" + +msgid "&Icon Options" +msgstr "" + +msgid "Large Icons" +msgstr "" + +msgid "Small Icons" +msgstr "" + +msgid "&Skins" +msgstr "" + +msgid "C&hange" +msgstr "" + +msgid "[ Separator ]" +msgstr "" + +msgid "[ Blank Separator ]" +msgstr "" + +msgid "To add command buttons, drag and drop commands onto a toolbar. To remove command buttons, drag them off the toolbar and drop them on the commands list." +msgstr "" + +msgid "Change Shortcut" +msgstr "" + +msgid "The shortcut is already being used by the \"%s\" command. Do you want to reassign it to the \"%s\" command?" +msgstr "" + +# ColorEdit Form +msgid "Transparent Color" +msgstr "" + +msgid "Color Picker" +msgstr "" + +msgid "Drag && Drop" +msgstr "" + diff --git a/internal/2.4.4/1/Demos/Customizer/translations.txt b/internal/2.4.4/1/Demos/Customizer/translations.txt new file mode 100644 index 0000000..82aa654 --- /dev/null +++ b/internal/2.4.4/1/Demos/Customizer/translations.txt @@ -0,0 +1,28 @@ + +The Customizer Demo uses dxgettext (http://dxgettext.po.dk) to translate the strings to various languages. +Unfortunately the translations are not complete: + +ar (Arabic): 100% translated (Ammar I) +de (German): 73% translated (Thomas Speck) +es (Spanish): 100% translated (Robert Lee) +fi (Finnish): 73% translated (Tapio Saarikumpu) +fr (French): 73% translated (Bob Baudewyns) +ja (Japanese): 73% translated (Minoru Yoshida) +ko (Korean): 100% translated (Hyeonwoo Oh) +nl (Dutch): 73% translated (Alfred Vink) +pt_BR (Brazilian): 73% translated (Mauricio Magnani) +ru (Russian): 73% translated (Alexey Naumov) +sr_Cyrillic (Serbian): 73% translated (Marko Binic) +sr_Latin (Serbian): 73% translated (Marko Binic) +sv (Swedish): 73% translated (Mattias Andersson) +tr (Turkish): 73% translated (Zylar) +zh_CN (Chinese): 73% translated (Beta Xiong) + +You can edit the translations with Notepad, just open the corresponding po file of the language. +For example to edit the Chinese translation open the \locale\zh_CN\LC_MESSAGES\default.po file with Notepad and edit the msgstr entries. +You can also use a PoEdit (http://poedit.sourceforge.net) to edit the files. + +To create a new translation for a different language use the default.po file template located in the locale directory. + +If you improve one of the translations please send it to me, my mail address is on: +http://www.silverpointdevelopment.com/sptbxlib/support.htm \ No newline at end of file diff --git a/internal/2.4.4/1/Demos/FormPopupMenu/FormPopupMenu.dpr b/internal/2.4.4/1/Demos/FormPopupMenu/FormPopupMenu.dpr new file mode 100644 index 0000000..be00fa9 --- /dev/null +++ b/internal/2.4.4/1/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/internal/2.4.4/1/Demos/FormPopupMenu/Unit1.dfm b/internal/2.4.4/1/Demos/FormPopupMenu/Unit1.dfm new file mode 100644 index 0000000..e026cd8 --- /dev/null +++ b/internal/2.4.4/1/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/internal/2.4.4/1/Demos/FormPopupMenu/Unit1.pas b/internal/2.4.4/1/Demos/FormPopupMenu/Unit1.pas new file mode 100644 index 0000000..07f5a3c --- /dev/null +++ b/internal/2.4.4/1/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/internal/2.4.4/1/Demos/FormPopupMenu/Unit2.dfm b/internal/2.4.4/1/Demos/FormPopupMenu/Unit2.dfm new file mode 100644 index 0000000..4828692 --- /dev/null +++ b/internal/2.4.4/1/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/internal/2.4.4/1/Demos/FormPopupMenu/Unit2.pas b/internal/2.4.4/1/Demos/FormPopupMenu/Unit2.pas new file mode 100644 index 0000000..89faf97 --- /dev/null +++ b/internal/2.4.4/1/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/internal/2.4.4/1/Demos/FormPopupMenu/Unit3.dfm b/internal/2.4.4/1/Demos/FormPopupMenu/Unit3.dfm new file mode 100644 index 0000000..21fa118 --- /dev/null +++ b/internal/2.4.4/1/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/internal/2.4.4/1/Demos/FormPopupMenu/Unit3.pas b/internal/2.4.4/1/Demos/FormPopupMenu/Unit3.pas new file mode 100644 index 0000000..584a423 --- /dev/null +++ b/internal/2.4.4/1/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/internal/2.4.4/1/Demos/Overview/Overview.dpr b/internal/2.4.4/1/Demos/Overview/Overview.dpr new file mode 100644 index 0000000..5ead0c3 --- /dev/null +++ b/internal/2.4.4/1/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/internal/2.4.4/1/Demos/Overview/Skins/WMP11.skn b/internal/2.4.4/1/Demos/Overview/Skins/WMP11.skn new file mode 100644 index 0000000..74985f9 --- /dev/null +++ b/internal/2.4.4/1/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 1/3 Mirror Gradient, uses 4 colors) +; 8 (Horizontal 1/3 Mirror Gradient, uses 4 colors) +; 9 (Vertical Office 2007 Gradient, uses 4 colors) +; 10 (Horizontal Office 2007 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/internal/2.4.4/1/Demos/Overview/Unit1.dfm b/internal/2.4.4/1/Demos/Overview/Unit1.dfm new file mode 100644 index 0000000..1d2b7b8 --- /dev/null +++ b/internal/2.4.4/1/Demos/Overview/Unit1.dfm @@ -0,0 +1,1901 @@ +object Form1: TForm1 + Left = 279 + Top = 147 + Caption = 'SpTBXLib Demo' + ClientHeight = 555 + ClientWidth = 716 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Shell Dlg 2' + Font.Style = [] + OldCreateOrder = False + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object SpTBXSplitter1: TSpTBXSplitter + Left = 273 + Top = 72 + Height = 457 + Cursor = crSizeWE + end + object SpTBXSplitter2: TSpTBXSplitter + Left = 575 + Top = 72 + Height = 457 + Cursor = crSizeWE + Align = alRight + end + object SpTBXMultiDock1: TSpTBXMultiDock + Left = 0 + Top = 72 + Width = 273 + Height = 457 + object SpTBXDockablePanel1: TSpTBXDockablePanel + Left = 0 + Top = 0 + Width = 273 + Height = 303 + Caption = 'Options Panel' + DockPos = 0 + TabOrder = 0 + object SpTBXSubmenuItem1: TSpTBXSubmenuItem + Options = [tboDropdownArrow] + CustomHeight = 15 + LinkSubitems = subSkins + end + object SpTBXTabControl2: TSpTBXTabControl + Left = 0 + Top = 19 + Width = 269 + Height = 280 + Align = alClient + OnResize = SpTBXTabControl2Resize + ActiveTabIndex = 0 + HiddenItems = <> + object SpTBXTabItem1: TSpTBXTabItem + Caption = 'Controls' + Checked = True + end + object SpTBXTabItem6: TSpTBXTabItem + Caption = 'Editors' + end + object SpTBXTabItem3: TSpTBXTabItem + Caption = 'Misc' + end + object SpTBXTabSheet3: TSpTBXTabSheet + Left = 0 + Top = 23 + Width = 269 + Height = 257 + Caption = 'Misc' + ImageIndex = -1 + DesignSize = ( + 269 + 257) + TabItem = 'SpTBXTabItem3' + object SpTBXGroupBox5: TSpTBXGroupBox + Left = 8 + Top = 8 + Width = 252 + Height = 177 + Caption = 'Links' + Anchors = [akLeft, akTop, akRight] + TabOrder = 0 + object SpTBXLabel2: TSpTBXLabel + Left = 8 + Top = 24 + Width = 151 + Height = 19 + Caption = 'Go to Silverpoint Development' + LinkText = 'http://www.silverpointdevelopment.com' + end + object SpTBXLabel3: TSpTBXLabel + Left = 8 + Top = 48 + Width = 156 + Height = 19 + Caption = 'Go to Toolbar2000 newsgroups' + LinkText = 'news://news.jrsoftware.org' + end + object SpTBXLabel4: TSpTBXLabel + Left = 8 + Top = 72 + Width = 128 + Height = 19 + Caption = 'Open the Windows folder' + end + object SpTBXLabel7: TSpTBXLabel + Left = 8 + Top = 144 + Width = 105 + Height = 19 + Cursor = crHandPoint + Caption = 'View the sourcecode' + LinkText = 'notepad.exe' + end + object SpTBXLabel5: TSpTBXLabel + Left = 8 + Top = 96 + Width = 106 + Height = 19 + Caption = 'Open it with the tree' + end + object SpTBXLabel6: TSpTBXLabel + Left = 8 + Top = 120 + Width = 74 + Height = 19 + Caption = 'Open WinAmp' + end + end + end + object SpTBXTabSheet6: TSpTBXTabSheet + Left = 0 + Top = 23 + Width = 269 + Height = 257 + Caption = 'Editors' + ImageIndex = -1 + DesignSize = ( + 269 + 257) + TabItem = 'SpTBXTabItem6' + object SpTBXPanel2: TSpTBXPanel + Left = 8 + Top = 112 + Width = 252 + Height = 124 + Anchors = [akLeft, akTop, akRight, akBottom] + TabOrder = 4 + HotTrack = True + object Memo2: TMemo + Left = 2 + Top = 22 + Width = 248 + Height = 100 + Align = alClient + BorderStyle = bsNone + Lines.Strings = ( + 'To add hottrack borders to your controls:' + '1) Drop a TSpTBXPanel and set HotTrack to true' + '2) Drop a control inside' + '3) Set the control Align to alClient' + '4) Set the control BorderStyle to bsNone' + '4) Change the skin to other than Default') + TabOrder = 0 + end + object Panel2: TPanel + Left = 2 + Top = 2 + Width = 248 + Height = 20 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object SpTBXSpeedButton1: TSpTBXSpeedButton + Left = 0 + Top = 0 + Width = 81 + Height = 20 + Caption = 'Column 1' + Align = alLeft + OnDraw = SpTBXSpeedButton1Draw + end + object SpTBXSpeedButton2: TSpTBXSpeedButton + Left = 81 + Top = 0 + Width = 96 + Height = 20 + Caption = 'Column 2' + Align = alLeft + OnDraw = SpTBXSpeedButton1Draw + end + object SpTBXSpeedButton3: TSpTBXSpeedButton + Left = 177 + Top = 0 + Width = 71 + Height = 20 + Caption = 'Column 3' + Align = alClient + OnDraw = SpTBXSpeedButton1Draw + end + end + end + object SpTBXButtonEdit1: TSpTBXButtonEdit + Left = 8 + Top = 48 + Width = 121 + Height = 21 + TabOrder = 2 + Text = 'SpTBXButtonEdit' + EditButton.Left = 97 + EditButton.Top = 0 + EditButton.Width = 20 + EditButton.Height = 17 + EditButton.Caption = '...' + EditButton.Align = alRight + end + object SpTBXComboBox2: TSpTBXComboBox + Left = 136 + Top = 16 + Width = 121 + Height = 21 + ItemHeight = 13 + TabOrder = 1 + Text = 'SpTBXComboBox' + end + object SpTBXEdit1: TSpTBXEdit + Left = 8 + Top = 16 + Width = 121 + Height = 21 + TabOrder = 0 + Text = 'SpTBXEdit' + end + object SpTBXSpinEdit1: TSpTBXSpinEdit + Left = 136 + Top = 48 + Width = 121 + Height = 21 + TabOrder = 3 + SpinButton.Left = 100 + SpinButton.Top = 0 + SpinButton.Width = 17 + SpinButton.Height = 17 + SpinButton.Align = alRight + end + object SpTBXColorEdit1: TSpTBXColorEdit + Left = 8 + Top = 80 + Width = 121 + Height = 21 + TabOrder = 5 + SelectedColor = clBlack + end + object SpTBXFontComboBox1: TSpTBXFontComboBox + Left = 136 + Top = 80 + Width = 121 + Height = 21 + ItemHeight = 23 + ItemIndex = 0 + TabOrder = 6 + Text = 'Arial' + SelectedFont = 'Arial' + end + end + object SpTBXTabSheet1: TSpTBXTabSheet + Left = 0 + Top = 23 + Width = 269 + Height = 257 + Caption = 'Controls' + ImageIndex = -1 + DesignSize = ( + 269 + 257) + TabItem = 'SpTBXTabItem1' + object progressAnimate: TSpTBXButton + Left = 80 + Top = 98 + Width = 65 + Height = 25 + Caption = 'Animate' + TabOrder = 5 + OnClick = progressAnimateClick + end + object progressInc: TSpTBXButton + Left = 48 + Top = 98 + Width = 33 + Height = 25 + Caption = '+' + TabOrder = 4 + OnClick = progressIncClick + Repeating = True + end + object SpTBXGroupBox6: TSpTBXGroupBox + Left = 8 + Top = 52 + Width = 252 + Height = 17 + Caption = 'ProgressBar' + Anchors = [akLeft, akTop, akRight] + TabOrder = 2 + Borders = False + end + object SpTBXGroupBox1: TSpTBXGroupBox + Left = 8 + Top = 8 + Width = 252 + Height = 17 + Caption = 'Button' + Anchors = [akLeft, akTop, akRight] + TabOrder = 0 + Borders = False + end + object SpTBXGroupBox2: TSpTBXGroupBox + Left = 8 + Top = 130 + Width = 252 + Height = 17 + Caption = 'Trackbar' + Anchors = [akLeft, akTop, akRight] + TabOrder = 8 + Borders = False + end + object SpTBXButton1: TSpTBXButton + Left = 110 + Top = 24 + Width = 75 + Height = 25 + Caption = 'Button' + TabOrder = 1 + end + object progressDec: TSpTBXButton + Left = 16 + Top = 98 + Width = 33 + Height = 25 + Caption = '-' + TabOrder = 3 + OnClick = progressDecClick + Repeating = True + end + object progressFiles: TSpTBXCheckBox + Left = 160 + Top = 102 + Width = 85 + Height = 21 + Caption = 'File progress' + TabOrder = 6 + OnClick = progressFilesClick + end + object SpTBXProgressBar1: TSpTBXProgressBar + Left = 80 + Top = 71 + Width = 150 + Height = 17 + Caption = '30%' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Shell Dlg 2' + Font.Style = [fsBold] + ParentFont = False + Position = 30 + OnProgressChange = SpTBXProgressBar1ProgressChange + end + object SpTBXTrackBar1: TSpTBXTrackBar + Left = 72 + Top = 147 + Width = 150 + Height = 45 + TabOrder = 9 + end + object trackTickmarks: TSpTBXRadioGroup + Left = 13 + Top = 194 + Width = 241 + Height = 49 + Caption = 'Tickmarks' + Anchors = [akLeft, akTop, akRight] + TabOrder = 10 + TabStop = True + OnClick = TrackbarTickMarksRadioClick + Columns = 4 + ItemIndex = 0 + Items.Strings = ( + 'Bottom' + 'Top' + 'Both' + 'Center') + end + end + end + end + object SpTBXDockablePanel2: TSpTBXDockablePanel + Left = 0 + Top = 303 + Width = 273 + Height = 154 + Caption = 'Skins Options' + DockPos = 303 + TabOrder = 1 + DesignSize = ( + 269 + 150) + object rgSkinType: TSpTBXRadioGroup + Left = 8 + Top = 32 + Width = 252 + Height = 105 + Caption = 'Skin Type' + Anchors = [akLeft, akTop, akRight] + TabOrder = 1 + TabStop = True + OnClick = rgSkinTypeClick + ItemIndex = 2 + Items.Strings = ( + '&None' + '&Windows' + '&Skins') + end + object skinButton: TSpTBXSpeedButton + Left = 70 + Top = 111 + Width = 86 + Height = 18 + Caption = 'Load Skin ...' + OnClick = skinButtonClick + end + end + end + object SpTBXDock1: TSpTBXDock + Left = 0 + Top = 0 + Width = 716 + Height = 72 + object SpTBXToolbar1: TSpTBXToolbar + Left = 0 + Top = 0 + ShrinkMode = tbsmNone + Stretch = True + TabOrder = 0 + Caption = 'SpTBXToolbar1' + object SpTBXLabelItem4: TSpTBXLabelItem + Caption = 'Options:' + end + object subLang: TSpTBXSubmenuItem + Caption = 'Languages' + Options = [tboDropdownArrow] + end + object subSkins: TSpTBXSubmenuItem + Caption = 'Skins' + Options = [tboDropdownArrow] + object SpTBXSkinGroupItem1: TSpTBXSkinGroupItem + end + end + object subColor: TSpTBXSubmenuItem + Caption = 'Color' + Options = [tboDropdownArrow, tboToolbarStyle] + ToolBoxPopup = True + object SpTBXColorPalette1: TSpTBXColorPalette + end + object SpTBXSeparatorItem1: TSpTBXSeparatorItem + end + object SpTBXItem5: TSpTBXItem + Caption = 'More Colors...' + end + end + object SpTBXSeparatorItem8: TSpTBXSeparatorItem + end + object SpTBXItem2: TSpTBXItem + Caption = 'Options Panel' + Control = SpTBXDockablePanel1 + end + object SpTBXItem7: TSpTBXItem + Caption = 'TabControl' + Control = SpTBXTabControl1 + end + end + object SpTBXToolbar3: TSpTBXToolbar + Left = 0 + Top = 23 + DockPos = 0 + DockRow = 1 + ShrinkMode = tbsmNone + Stretch = True + TabOrder = 1 + Caption = 'SpTBXToolbar3' + DesignSize = ( + 706 + 22) + object SpTBXLabelItem3: TSpTBXLabelItem + Caption = '&Address:' + Control = SpTBXComboBox1 + end + object TBControlItem3: TTBControlItem + Control = SpTBXComboBox1 + end + object SpTBXSeparatorItem6: TSpTBXSeparatorItem + Blank = True + end + object SpTBXItem1: TSpTBXItem + Caption = 'Go' + DisplayMode = nbdmImageAndText + ImageIndex = 1 + Images = ImageList1 + end + object SpTBXComboBox1: TSpTBXComboBox + Left = 53 + Top = 0 + Width = 605 + Height = 21 + Anchors = [akLeft, akTop, akRight] + ItemHeight = 13 + TabOrder = 0 + Text = + 'The AccelChar (Alt+A) of the Address label will focus the ComboB' + + 'ox control' + end + end + object SpTBXToolbar2: TSpTBXToolbar + Left = 0 + Top = 49 + DockPos = 8 + DockRow = 2 + ShrinkMode = tbsmNone + Stretch = True + TabOrder = 2 + Caption = 'SpTBXToolbar2' + object SpTBXItem3: TSpTBXItem + Caption = 'Custom Sized Item (Width = 200)' + CustomWidth = 200 + end + object SpTBXSeparatorItem7: TSpTBXSeparatorItem + end + object SpTBXItem4: TSpTBXItem + Caption = 'Anchored Item' + Anchored = True + CustomWidth = 497 + end + end + end + object SpTBXMultiDock3: TSpTBXMultiDock + Left = 580 + Top = 72 + Width = 136 + Height = 457 + Position = dpxRight + object DP1: TSpTBXDockablePanel + Left = 0 + Top = 0 + Width = 136 + Height = 159 + Caption = 'Panel1' + DockPos = 0 + TabOrder = 0 + Images = ImageList1 + Options.Close = False + Options.Minimize = True + Options.Maximize = True + object SpTBXLabel1: TSpTBXLabel + Left = 8 + Top = 32 + Width = 0 + Height = 33 + Caption = 'Panel Properties:' + Wrapping = twWrap + Underline = True + UnderlineColor = clBlue + end + object SpTBXLabel8: TSpTBXLabel + Left = 8 + Top = 48 + Width = 58 + Height = 19 + Caption = '- Resizable' + end + object SpTBXLabel9: TSpTBXLabel + Left = 8 + Top = 64 + Width = 74 + Height = 19 + Caption = '- Can minimize' + end + object SpTBXLabel10: TSpTBXLabel + Left = 8 + Top = 80 + Width = 78 + Height = 19 + Caption = '- Can maximize' + end + end + object DP2: TSpTBXDockablePanel + Left = 0 + Top = 159 + Width = 136 + Height = 134 + Caption = 'Panel2' + DockPos = 159 + TabOrder = 1 + Images = ImageList1 + Options.ButtonBorders = False + Options.Close = False + Options.Minimize = True + Options.MinimizeImageIndex = 5 + Options.MaximizeImageIndex = 8 + Options.RestoreImageIndex = 6 + object SpTBXLabel11: TSpTBXLabel + Left = 8 + Top = 32 + Width = 0 + Height = 33 + Caption = 'Panel Properties:' + Wrapping = twWrap + Underline = True + UnderlineColor = clBlue + end + object SpTBXLabel12: TSpTBXLabel + Left = 8 + Top = 48 + Width = 58 + Height = 19 + Caption = '- Resizable' + end + object SpTBXLabel13: TSpTBXLabel + Left = 8 + Top = 64 + Width = 74 + Height = 19 + Caption = '- Can minimize' + end + end + object DP3: TSpTBXDockablePanel + Left = 0 + Top = 293 + Width = 136 + Height = 164 + Caption = 'Panel3' + DockPos = 293 + TabOrder = 2 + Images = ImageList1 + Options.ButtonBorders = False + Options.Close = False + Options.Minimize = True + Options.MinimizeImageIndex = 5 + Options.MaximizeImageIndex = 8 + Options.RestoreImageIndex = 6 + object SpTBXLabel15: TSpTBXLabel + Left = 8 + Top = 32 + Width = 0 + Height = 33 + Caption = 'Panel Properties:' + Wrapping = twWrap + Underline = True + UnderlineColor = clBlue + end + object SpTBXLabel16: TSpTBXLabel + Left = 8 + Top = 48 + Width = 58 + Height = 19 + Caption = '- Resizable' + end + object SpTBXLabel17: TSpTBXLabel + Left = 8 + Top = 64 + Width = 74 + Height = 19 + Caption = '- Can minimize' + end + end + end + object Panel1: TPanel + Left = 278 + Top = 72 + Width = 297 + Height = 457 + Align = alClient + BevelOuter = bvNone + TabOrder = 2 + object Image1: TImage + Left = 16 + Top = 248 + Width = 100 + Height = 72 + AutoSize = True + Picture.Data = { + 07544269746D617096540000424D965400000000000036000000280000006400 + 000048000000010018000000000060540000C40E0000C40E0000000000000000 + 0000CAE0DCCAE0DCC8DFDCC7DFDBC6DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDB + C5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DE + DBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5 + DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDB + C5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DE + DBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5 + DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDB + C5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DE + DBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5DEDBC5 + DEDBC5DEDBC5DEDBC4DEDBC2DCD9CACFD0B0B4B5B3BABAE4EEEFE0EDEFDFECEF + DFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFEC + EFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDF + ECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEF + DFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFEC + EFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDF + ECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEF + DFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFEC + EFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDF + ECEFDFECEFDFECEFDFECEFDFECEFDFECEFDFECEFDEECEEDAE9EBC5C6C1C3C5C0 + C2C5C0C0C4C0BEC3BFBEC3BFBEC3BFBEC3BFBEC3BFBEC3BFBEC3BFBEC3BFBFC5 + C1DFE6E7DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DBE2E2DFE5E5DF + E5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5 + DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5 + E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DF + E5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5 + DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE5E5DFE6E7DDE4E5DFE6E8DFE6E8DFE6 + E8DFE6E8DFE6E8DFE6E8DFE6E8DFE6E8DFE6E8DFE6E8DFE6E8C1C6C3BEC3BFBE + C3BFBEC3BFBEC3BFBEC3BFBEC3BFBEC3BFBEC3BFBEC3BFBEC3BFBEC3BFBEC3BF + BACCC9B4CBC6B7B3A8B7B3A8B7B3A8B7B3A8B7B3A8B7B3A8B7B3A8B7B3A8B7B3 + A8B7B3A8B7B3A8B7B3A8BAB7ADFFFEFD92887F91877EA1968BA0968BCBBDB0B9 + ADA1A69B90968C82B2A69A9F948AAFA398A99E93FFEEDDFFEEDDFFEEDDFFEEDD + FFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEE + DDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFF + EEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDD + FFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFFA + F5FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFBEBAB1B7B3A8B7B3A8B7B3A8B7B3A8B7B3A8B7B3A8B7B3A8B7B3A8 + B7B3A8B7B3A8B7B3A8B7B3A8BBCDC4B1CBC1B8B4A9B8B4A9B8B4A9B8B4A9B8B4 + A9B8B4A9B8B4A9B8B4A9B8B4A9B8B4A9B8B4A9B8B4A9BBB7ADFFFEFEFFFAF5FF + FAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5 + FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFA + F5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FFFAF5FF + FAF5FFFAF5FFFAF5FFFAF5F9F4EFEFEBE5EFEBE5EFEBE5EFEBE5EFEBE5EFEBE5 + EFEBE5EFEBE5EFEBE5EFEBE5EFEBE5EFEBE5EFEBE5EFEBE5EFEBE5EFEBE5EFEB + E5EFEBE5F8F4EFFFFAF5FFFDFCFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBEBBB1B8B4A9B8B4A9B8B4A9B8B4A9 + B8B4A9B8B4A9B8B4A9B8B4A9B8B4A9B8B4A9B8B4A9B8B4A9E1E6E4EFF3F3B9B5 + AAB9B5AAB9B5AAB9B5AAB9B5AAB9B5AAB9B5AAB9B5AAB9B5AAB9B5AAB9B5AAB9 + B5AABCB8AEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F3F2EFF3F4EFF3F4 + EFF3F4EFF3F4EFF3F4EFF3F4EFF3F4EFF3F4EFF3F4EFF3F4EFF3F4EFF3F4EFF3 + F4EFF3F4EFF3F4EFF3F4EFF3F4EFF3F4EDEEEEFFFFFFFFFFFFFAFAFAFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBCB2 + B9B5AAB9B5AAB9B5AAB9B5AAB9B5AAB9B5AAB9B5AAB9B5AAB9B5AAB9B5AAB9B5 + AAB9B5AAE6EAE9F7FAFABAB7ACBAB7ACBAB7ACBAB7ACBAB7ACBAB7ACBAB7ACBA + B7ACBAB7ACBAB7ACBAB7ACBAB7ACBDB9B0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF2F3F2EEF3F4EAE8CBEBECDBCED2D3DBE0E1D6DBDCD6DBDCD1D6D7D3D7 + D8D4D8D9D6DADBD4D8D9ECF1F2EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4ECEEEEFF + FFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFC0BDB4BAB7ACBAB7ACBAB7ACBAB7ACBAB7ACBAB7ACBAB7 + ACBAB7ACBAB7ACBAB7ACBAB7ACBAB7ACE6EAE9F7FAFAB9B7ACB9B7ACB9B7ACB9 + B7ACB9B7ACB9B7ACB9B7ACB9B7ACB9B7ACB9B7ACB9B7ACB9B7ACBCBAB0FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F3F2EEF3F4C9B598E0D2BBC8CDCDC0C4 + C5C1C5C6C9CECEC4C8C9C2C6C6CED3D3CBCFD0CBCFD0EBF0F1EEF3F4EEF3F4EE + F3F4EEF3F4EEF3F4ECEEEEFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBDB4B9B7ACB9B7ACB9B7 + ACB9B7ACB9B7ACB9B7ACB9B7ACB9B7ACB9B7ACB9B7ACB9B7ACB9B7ACE6EAEAF7 + FAFABAB8ADBAB8ADBAB8ADBAB8ADBAB8ADBAB8ADBAB8ADBAB8ADBAB8ADBAB8AD + BAB8ADBAB8ADBDBBB1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F3F2EEF3 + F4EBEFF0ECF1F1EBF0F1EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4EE + F3F4EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4ECEEEEFFFFFFFFFFFFFAFAFA + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFC0BEB5BAB8ADBAB8ADBAB8ADBAB8ADBAB8ADBAB8ADBAB8ADBAB8ADBAB8ADBA + B8ADBAB8ADBAB8ADE6EAEAF7FAFABCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAF + BCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBEBCB2FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF2F3F2EEF3F4EAEBEBE1E4E4ABAFB0AEB2B2B3B7B7B4B8B9B5 + B9BAA5A8A9B7BBBCBDC1C2EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4 + ECEEEEFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFC1BFB6BCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBC + BAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAFE6EAEAF7FAFABCBAAFBCBAAF + BCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBEBD + B3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F3F2EEF3F4E9EDEEEBEFF0EE + F3F4EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4EEF3F4 + EEF3F4EEF3F4EEF3F4EEF3F4ECEEEEFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2C0B7BCBAAFBC + BAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAFBCBAAF + E6EBEAF7FAFABEBCB1BEBCB1BEBCB1BEBCB1BEBCB1BEBCB1BEBCB1BEBCB1BEBC + B1BEBCB1BEBCB1BEBCB1C0BEB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 + F3F2EFF3F4E3E1DCDBDBD8CBCFD0CFD2D3C1C5C6C6CACBE5EAEAEFF3F4EEF3F4 + EEF3F4EFF3F4EEF3F4EFF3F4EEF3F4EFF3F4EFF3F4EFF3F4EDEEEEFFFFFFFFFF + FFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFC3C1B8BEBCB1BEBCB1BEBCB1BEBCB1BEBCB1BEBCB1BEBCB1BEBCB1 + BEBCB1BEBCB1BEBCB1BEBCB1E7EBEAF7FAFABEBCB1BEBCB1BEBCB1BEBCB1BEBC + B1BEBCB1BEBCB1BEBCB1BEBCB1BEBCB1BEBCB1BEBCB1C0BFB5FFFFFFF0F0F0D5 + D5D5D5D5D5D8D8D8CDCDCDD0D0D0E4E4E4D5D5D5EBEBEBD0D0D0C9C9C9D6D6D6 + D2D2D2D4D4D4E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF3F3F2F1F4F5E2E1DCE1E2DEDFE2E3DFE2E3E9EDED + DEE1E2EFF2F3F0F4F5F0F4F5F0F4F5F1F4F5F0F4F5F0F4F5F1F4F5F0F4F5F0F4 + F5F1F4F5EDEEEEFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C2B8BEBCB1BEBCB1BEBCB1BEBCB1 + BEBCB1BEBCB1BEBCB1BEBCB1BEBCB1BEBCB1BEBCB1BEBCB1E7EBEAF7FAFAC0BE + B3C0BEB3C0BEB3C0BEB3C0BEB3C0BEB3C0BEB3C0BEB3C0BEB3C0BEB3C0BEB3C0 + BEB3C1C0B6FFFFFFFAFAFAE4E4E4D6D6D6E3E3E3D0D0D0DBDBDBE1E1E1E3E3E3 + E5E5E5D6D6D6D1D1D1DADADAE5E5E5EEEEEEF2F2F2FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F2F3F6F6E7E5DF + E8E7E3EAEDEEE2E5E6E4E6E7F1F4F5F3F6F6F3F5F6F3F5F6F3F5F6F3F5F6F3F5 + F6F3F5F6F3F5F6F3F5F6F3F5F6F3F6F6EDEFEEFFFFFFFFFFFFFAFAFAFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4C3B9 + C0BEB3C0BEB3C0BEB3C0BEB3C0BEB3C0BEB3C0BEB3C0BEB3C0BEB3C0BEB3C0BE + B3C0BEB3E7EBEAF7FAFAC1BFB4C1BFB4C1BFB4C1BFB4C1BFB4C1BFB4C1BFB4C1 + BFB4C1BFB4C1BFB4C1BFB4C1BFB4C3C1B7FFFFFFF3F3F3D7D7D7DDDDDDE3E3E3 + E0E0E0D9D9D9DADADAE5E5E5EFEFEFD8D8D8DEDEDEE2E2E2D7D7D7FDFDFDFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF3F3F2F5F7F7BFCBB1CACCBECDCECFD7D8D9CFD0D0EDEEEFF5F7F7F5F7 + F7F5F7F7F5F7F7F5F7F7F5F7F7F5F7F7F5F7F7F5F7F7F5F7F7F5F7F7EDEFEEFF + FFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFC6C4BBC1BFB4C1BFB4C1BFB4C1BFB4C1BFB4C1BFB4C1BF + B4C1BFB4C1BFB4C1BFB4C1BFB4C1BFB4E7EBEBF7FAFAC2C0B5C2C0B5C2C0B5C2 + C0B5C2C0B5C2C0B5C2C0B5C2C0B5C2C0B5C2C0B5C2C0B5C2C0B5C4C2B8FFFFFF + F1F1F1CFCFCFCDCDCDBFBFBFCECECEDCDCDCCCCCCCC5C5C5C3C3C3CACACAD8D8 + D8D3D3D3C8C8C8C4C4C4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F4F3F8F8F9F7F8F8F8F9F8F7F8F9F8F8 + F9F7F8F9F8F8F9F8F8F9F8F8F8F8F8F9F7F8F8F7F8F8F8F8F8F7F8F9F8F8F9F8 + F8F8F8F8F9F8F8F9EEEFEEFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7C5BCC2C0B5C2C0B5C2C0 + B5C2C0B5C2C0B5C2C0B5C2C0B5C2C0B5C2C0B5C2C0B5C2C0B5C2C0B5E7EBEBF7 + FAFAC3C1B7C3C1B7C3C1B7C3C1B7C3C1B7C3C1B7C3C1B7C3C1B7C3C1B7C3C1B7 + C3C1B7C3C1B7C4C3BAFEFEFEBFBFBFC7C7C7CFCFCFC5C5C5E8E8E8C7C7C7C7C7 + C7CDCDCDC5C5C5DCDCDCD3D3D3C2C2C2D8D8D8D7D7D7D5D5D5C4C4C4C9C9C9C1 + C1C1CACACAFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F4F3FAF9 + FACACACAACACACA1A1A1DADADAFAF9FAFAFAFAFAFAFAFAFAFAFAF9FAFAFAFAFA + FAFAFAF9FAFAFAFAFAFAFAFAF9FAFAF9FAFAF9FAEEEFEEFFFFFFFFFFFFFAFAFA + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFC7C5BDC3C1B7C3C1B7C3C1B7C3C1B7C3C1B7C3C1B7C3C1B7C3C1B7C3C1B7C3 + C1B7C3C1B7C3C1B7E7EBEBF7FAFAC4C2B8C4C2B8C4C2B8C4C2B8C4C2B8C4C2B8 + C4C2B8C4C2B8C4C2B8C4C2B8C4C2B8C4C2B8C5C4BAFFFFFFF1F1F1E9E9E9D6D6 + D6DFDFDFDDDDDDD9D9D9D0D0D0E8E8E8D0D0D0D5D5D5DCDCDCD9D9D9E3E3E3EC + ECECD1D1D1F1F1F1CECECEDFDFDFCBCBCBF2F2F2E4E4E4DEDEDEECECECDBDBDB + DADADAD9D9D9E7E7E7D5D5D5E0E0E0E9E9E9E0E0E0DEDEDEE0E0E0FFFFFFFFFF + FFFFFFFFFFFFFFF4F4F3FCFBFAE9E7E8DCDADBDBDADAEEEDEDFCFBFAFCFBFBFC + FBFBFCFBFBFCFBFBFCFBFBFCFBFAFCFBFAFCFAFBFCFBFBFCFBFBFCFBFBFCFBFB + EEEFEEFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFC8C6BEC4C2B8C4C2B8C4C2B8C4C2B8C4C2B8C4 + C2B8C4C2B8C4C2B8C4C2B8C4C2B8C4C2B8C4C2B8E8ECEBF7FAFAC5C3B8C5C3B8 + C5C3B8C5C3B8C5C3B8C5C3B8C5C3B8C5C3B8C5C3B8C5C3B8C5C3B8C5C3B8C6C4 + BBFFFFFFFAFAFABFBFBFE1E1E1D4D4D4DCDCDCD7D7D7E7E7E7DADADAD7D7D7DA + DADADCDCDCECECECF2F2F2F7F7F7F1F1F1F5F5F5ECECECEFEFEFE4E4E4F4F4F4 + DADADAE7E7E7E9E9E9E7E7E7ECECECEEEEEEF6F6F6F2F2F2EAEAEAEDEDEDE6E6 + E6EAEAEAE0E0E0FFFFFFFFFFFFFFFFFFFFFFFFF5F4F3FDFBFBFDFBFBFDFBFBFD + FBFCFDFBFBFDFBFBFDFBFBFDFBFCFDFBFBFDFBFBFDFBFBFDFBFBFDFCFBFDFCFB + FDFBFBFDFBFBFDFBFBFDFBFBEEEFEFFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9C7BEC5C3B8C5 + C3B8C5C3B8C5C3B8C5C3B8C5C3B8C5C3B8C5C3B8C5C3B8C5C3B8C5C3B8C5C3B8 + E8ECEBF7FAFAC6C4BAC6C4BAC6C4BAC6C4BAC6C4BAC6C4BAC6C4BAC6C4BAC6C4 + BAC6C4BAC6C4BAC6C4BAC7C5BCFFFFFFEEEEEEB8B8B8CBCBCBD0D0D0B8B8B8CE + CECEEAEAEADADADADBDBDBD9D9D9E4E4E4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 + F4F3EDEBEBDBD9D9DEDCDCE8E6E6E1E5E4DBE4E4DAE4E4D8E3E4D7E3E3D6E3E3 + D5E2E3D4E2E3D3E2E3D2E1E3D1E1E2D0E1E2CFE0E2CEE0E2EAF2F3FFFFFFFFFF + FFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFCAC8BFC6C4BAC6C4BAC6C4BAC6C4BAC6C4BAC6C4BAC6C4BAC6C4BA + C6C4BAC6C4BAC6C4BAC6C4BAE8ECECF7FAFAC7C5BBC7C5BBC7C5BBC7C5BBC7C5 + BBC7C5BBC7C5BBC7C5BBC7C5BBC7C5BBC7C5BBC7C5BBC8C7BEFFFFFFBBBBBBCC + CCCCCACACAD8D8D8C4C4C4DCDCDCC9C9C9CDCDCDBCBCBCCACACACDCDCDDFDFDF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFEAEEF3BFCBDDB1BED0B5C2D3BDCADCDCE4EAEBF0F0 + E9F0F0E8EFF0E6EFF0E4EFEFE3EEEFE1EEEFE0EDEFDEECEFDCECEFDBEBEED9EB + EED7EAEEEEF6F8FFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBC9C1C7C5BBC7C5BBC7C5BBC7C5BB + C7C5BBC7C5BBC7C5BBC7C5BBC7C5BBC7C5BBC7C5BBC7C5BBE8ECECF7FAFAC8C6 + BCC8C6BCC8C6BCC8C6BCC8C6BCC8C6BCC8C6BCC8C6BCC8C6BCC8C6BCC8C6BCC8 + C6BCC9C7BEFFFEFEE8E4DFE5E1DDECE8E3E9E4E0F2EDE8F0EBE6ECE8E3EDE8E4 + E6E2DEEDE9E4F3EEE9E9E5E0ECE8E3F0EBE6EFEAE6E7E3DEECE8E3E7E3DFEBE7 + E2EBE7E2EBE7E2F5F0EBF0EBE7EAE6E1E5E1DCE7E3DEEBE6E2F0ECE7EBE6E2EE + EAE5FFF9F3FFF9F3FFF9F3FFF9F3FFF9F3FFF9F3FFF9F3FBF6F2EDEDEEEDEDEE + EDEDEEEDEDEEF7F4F0FCF6F1FBF6F1FBF6F1FBF6F1FAF6F0FAF6F0FAF6F0FAF6 + F0F9F6F0F9F6F0F9F5F0F8F5F0F8F5F0FCF7F2FFF9F3FFFDFBFAFAFAFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCAC2 + C8C6BCC8C6BCC8C6BCC8C6BCC8C6BCC8C6BCC8C6BCC8C6BCC8C6BCC8C6BCC8C6 + BCC8C6BCE8ECECF7FAFAC9C7BDC9C7BDC9C7BDC9C7BDC9C7BDC9C7BDC9C7BDC9 + C7BDC9C7BDC9C7BDC9C7BDC9C7BDCAC8BFFFFEFDCDC0B2AA9F93B2A69AD3C5B7 + D3C5B7B6AA9EB2A69AB2A69AACA095C4B7AAD2C4B6BBAEA2BBAFA2B5A89CB5A9 + 9DABA094AEA296A0958ABEB1A4A79C91B6AA9ED9CBBCC8BBADB5A99DB5A99DBD + B0A3AFA398C7BAADA0958BD8CABBFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDD + FFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEE + DDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFFEEDDFF + EEDDFFFAF5FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFCDCBC3C9C7BDC9C7BDC9C7BDC9C7BDC9C7BDC9C7BDC9C7 + BDC9C7BDC9C7BDC9C7BDC9C7BDC9C7BDE8ECECF7FAFACBC9BFCBC9BFCBC9BFCB + C9BFCBC9BFCBC9BFCBC9BFCBC9BFCBC9BFCBC9BFCBC9BFCBC9BFCBC9C1FFFEFE + FFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFE + FEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFF + FEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFE + FFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFDFDFCF9F9 + F9F8F9F8F8F9F8F8F9F9F8F9F9F8F9F9F8F9F9F9F9F9F8F9F9F8F9F9FAFBFAFF + FEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFAFAFAFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCECCC4CBC9BFCBC9BFCBC9 + BFCBC9BFCBC9BFCBC9BFCBC9BFCBC9BFCBC9BFCBC9BFCBC9BFCBC9BFE8EDECF7 + FAFACCCAC0CCCAC0CCCAC0CCCAC0CCCAC0CCCAC0CCCAC0CCCAC0CCCAC0CCCAC0 + CCCAC0CCCAC0CCCBC2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF9F9F9E9EAEAE4E5E5E4E5E5E4E5E5E4E5E5E4E5E5E4E5E5E4 + E5E5E4E5E5E4E5E5E1E3E4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFA + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFCFCDC5CCCAC0CCCAC0CCCAC0CCCAC0CCCAC0CCCAC0CCCAC0CCCAC0CCCAC0CC + CAC0CCCAC0CCCAC0E9EDECF7FAFACDCBC1CDCBC1CDCBC1CDCBC1CDCBC1CDCBC1 + CDCBC1CDCBC1CDCBC1CDCBC1CDCBC1CDCBC1CDCBC2FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F6F6F6F6F6F6F6F6F6BC + BCBCC4C4C4C9C9C9BBBBBBDEDEDEF6F6F6F6F6F6E4E5E5FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFCFCEC5CDCBC1CDCBC1CDCBC1CDCBC1CDCBC1CD + CBC1CDCBC1CDCBC1CDCBC1CDCBC1CDCBC1CDCBC1E9EDEDF7FAFACECCC2CECCC2 + CECCC2CECCC2CECCC2CECCC2CECCC2CECCC2CECCC2CECCC2CECCC2CECCC2CECC + C4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 + F8F8F6F6F6F6F6F6F6F6F6EDEDEDF3F3F3F6F6F6F6F6F6F3F3F3F6F6F6F6F6F6 + E5E5E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0CFC6CECCC2CE + CCC2CECCC2CECCC2CECCC2CECCC2CECCC2CECCC2CECCC2CECCC2CECCC2CECCC2 + E9EDEDF7FAFACECDC3CECDC3CECDC3CECDC3CECDC3CECDC3CECDC3CECDC3CECD + C3CECDC3CECDC3CECDC3CECDC4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF8F8F8F7F7F7F7F7F7F7F7F7C9C9C9C7C7C7C4C4C4 + E4E4E4F7F7F7F7F7F7F7F7F7E5E5E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFD0CFC7CECDC3CECDC3CECDC3CECDC3CECDC3CECDC3CECDC3CECDC3 + CECDC3CECDC3CECDC3CECDC3E9EDEDF7FAFACFCEC4CFCEC4CFCEC4CFCEC4CFCE + C4CFCEC4CFCEC4CFCEC4CFCEC4CFCEC4CFCEC4CFCEC4CFCEC5FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F6F6F6F6F6F6 + F6F6F6E8E8E8F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6E6E6E6FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1D0C8CFCEC4CFCEC4CFCEC4CFCEC4 + CFCEC4CFCEC4CFCEC4CFCEC4CFCEC4CFCEC4CFCEC4CFCEC4E9EDEDF7FAFAD0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF8F8F8F7F7F7F7F7F7F7F7F7D3D3D3CFCFCFE0E0E0F7F7F7F7F7F7F7F7 + F7F7F7F7E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFAFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2D1C9 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5E9EDEDF7FAFAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F6F6F6F6F6F6F6F6F6F6F6F6F6F6 + F6F2F2F2F6F6F6F6F6F6F6F6F6F6F6F6E7E6E6FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFD2D1C9D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5E9EDEDF7FAFAD0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC6FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F7F7 + F7F7F7F7F7F7F7E7E7E7EFEFEFD8D8D8F2F2F2F7F7F7F7F7F7F7F7F7E7E7E7FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2D1C9D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5E9EDEDF7 + FAFAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF8F8F8F6F6F6F6F6F6F6F6F6DBDBDBDBDBDBDEDEDEECECECF6 + F6F6F6F6F6F6F6F6E8E7E7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFA + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFD2D1C9D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5E9EDEDF7FAFAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC6FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F7F7F7F7F7F7F7F7F7F1 + F1F1DBDBDBDEDEDEEEEEEEF7F7F7F7F7F7F7F7F7E8E7E7FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFD2D1C9D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5E9EDEDF7FAFAD0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 + F8F8F7F7F7F7F7F7F7F7F7B3B3B39C9C9CA6A6A6D4D4D4F7F7F7F7F7F7F7F7F7 + E9E7E7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2D1C9D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + E9EDEDF7FAFAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF8F8F8F6F6F6F6F6F6F6F6F6E4E4E4F4F4F4EBEBEB + EDEDEDF6F6F6F6F6F6F6F6F6E5E5E5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFD2D1C9D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5E9EDEDF7FAFAD0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC6FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F7F7F7F7F7F7 + F7F7F7ABABABB8B8B8A4A4A4BDBDBDF7F7F7F7F7F7F7F7F7E9E8E8FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2D1C9D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5E9EDEDF7FAFAD0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC6FFFFFFF3F3F3C2C2C2CDCDCDD0D0D0CECECEC8C8C8E6E6E6CBCBCB + C4C4C4C2C2C2CECECECECECEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF8F7F7F1DCA3F5E8B2E9C37DE8BF78E8BF78E8BF78E8BF78E8BF78E8BF + 78E9C483E0E0DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFAFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2D1C9 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5E9EDEDF7FAFAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC6FFFFFFF0F0F0DCDCDCCDCDCDE1E1E1 + D0D0D0CDCDCDD9D9D9CFCFCFEEEEEECBCBCBD9D9D9E4E4E4FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8E9C775EDD790E3A73AE8B967E8B5 + 5CE9B760E8B459E2A232E2A232E4A942E4E4E4FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFD2D1C9D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5E9EDEDF7FAFAD0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC6FFFFFF + F7F7F7DDDDDDD3D3D3DBDBDBE0E0E0D8D8D8E6E6E6D4D4D4E4E4E4D8D8D8EAEA + EAF7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F0DA + B6F2E0C4EBCB94ECCD97EDD09DEDD09EEBCB93EACA90EACA90EBCD98E6E5C4FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2D1C9D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5C0D1CAB1 + CAC1D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC6FFFFFFF6F6F6CBCBCBE2E2E2D3D3D3DBDBDBD2D2D2E8E8 + E8CECECEDBDBDBE8E8E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F4 + F4FEFEFEFFFFFFF8F8F8F7F7F7F7F7F7F7F7F7BBBBBBB8B8B8B6B6B6CDCDCDF7 + F7F7F7F7F7F7F7F7D2C39BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6 + F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9 + F9D2D1C8D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5B2C9BE94B7AAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC6FFFFFFF1F1F1CFCFCFCDCD + CDBFBFBFCECECEDCDCDCBABABAD2D2D2DCDCDCCDCDCDD3D3D3FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFF5F5F5BEBEBEFAFAFAFFFFFFF8F8F8F6F6F6F6F6F6F6F6F6EE + EEEEF6F6F6EAEAEAF2F2F2F6F6F6F6F6F6F6F6F6CECBC9FFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFEDEDECD3CEC3CDC7BAB8AF9BC9C2B4CCC7B9E1DFD9ECEB + EAECEBEAECEBEAECEBEAECEBEAD1D0C7D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5B1C9BE93B7AAD0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C6FFFFFFF1F1F1DADADACDCDCDC3C3C3CECECED8D8D8CCCCCCC8C8C8C7C7C7C1 + C1C1D8D8D8D3D3D3C8C8C8C7C7C7FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5E2E2E2FFFFFFFFFFFFF7 + F7F7F6F6F6F6F6F6F6F6F6C7C7C7B0B0B0BEBEBEE9E9E9F6F6F6F6F6F6F6F6F6 + ABC0BAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBEBEADFDED8E6E6E3E5E4 + E0E5E5E1E3E2DDE5E4E0E9E9E7E9E9E7E9E9E7E9E9E7E9E9E7D1D0C7D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + B1C9BE93B7AAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC6FFFFFFF3F3F3BDBDBDD6D6D6D0D0D0C7C7C7D6 + D6D6EBEBEBDEDEDEDADADAFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFF1F1F1F1F1F1F1F1F1F1F1F1E0E0E0E7E7E7E3E3E3 + F0F0F0F1F1F1F1F1F1F1F1F1B5C1BDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFEDECEBD2CEC3D1CCC1C8C2B4CFCABFCAC4B6D7D3CACFCABECBC5B8D0CCC0C6 + C0B1E6E6E2D1D0C7D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5B1C9BE93B7AAD0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC6FFFFFFF8F8F8C1 + C1C1D6D6D6D4D4D4C4C4C4D9D9D9E0E0E0D0D0D0DADADAF3F3F3F4F4F4FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8E3E3E3E7E7E7 + DADADAE0E0E0E6E6E6ECECECD6D6D6D1D1D1C9C9C9DFDFDFF6F6F6FFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFECECEBDBD8D0E4E3DFDDDBD3E6E5E1E2E1DBE2 + E0DBDEDCD5DCDAD2E4E3DEE3E2DDE8E8E5D1D0C7D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5B2C9BE94B7AAD0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC6FFFFFFEDEDEDB1B1B1C6C6C6CBCBCBB1B1B1CACACAEAEAEAD2D2D2 + CECECED5D5D5DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFF6F6F6BEBEBEBEBEBEB1B1B1BDBDBDCBCBCBE4E4E4DBDBDBE0E0E0E5E5 + E5E1E1E1F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBEBEAD5D1C8D0 + CBC1CDC8BCCAC4B6D1CDC3C8C2B4CBC5B8E8E7E5E9E9E8E9E9E8E9E9E8D1D0C7 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5B2C9BE94B7AAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC6FFFEFED9D2CBD3CCC6D4CDC6D1CAC4 + CCC6C0D6CFC8ECE4DCD8D1CACAC4BED3CCC5CBC4BEE9E1D9D6CFC9D7D0C9D6CF + C8DED7CFDED6CFCBC5BFD0C9C3D8D1CADAD3CBFFF5EBFFF5EBFFF5EBFFF5EBFF + F5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EB + FFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5 + EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFFF5EBFF + F5EBFFFCF9EDECEBDAD7CFE2E0DAE0DED7D9D5CCE2E0DBE2E0DBD8D5CBEAEAE7 + EBEBE8EBEBE8EBEBE8D1D0C7D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5B2C9BE94B7AAD0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC6FFFEFE + C8BEB4C9BFB5D5CABFD4C9BEC0B6ADCBC1B7D9CDC2DBD0C4C2B8AFCDC3B8CFC5 + BAD8CDC2CDC2B8D2C7BCD5CABFD9CEC3D5CABFC9BFB5D6CBC0D2C7BCD9CEC3FF + F1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3 + FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1 + E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FFF1E3FF + F1E3FFF1E3FFF1E3FFF1E3FFF1E3FFFBF7EBEBEAD8D5CDCFCABFD5D1C8D1CCC2 + D7D3CBCAC5B8E9E9E7E9E9E7E9E9E7E9E9E7E9E9E7D1D0C7D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5B2C9BE94 + B7AAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECEA + D9D6CDDDDBD4CFCABED1CDC1DDDAD3D0CBBFEAEAE7EAEAE7EAEAE7EAEAE7EAEA + E7D1D0C7D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5B2C9BE94B7AAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC6EEEEEED7D7D7E2E2E2DEDE + DEDBDBDBE4E4E4DFDFDFE0E0E0E9E9E9DCDCDCD9D9D9E6E6E6DEDEDEDFDFDFD6 + D6D6DDDDDDD2D2D2CBCBCBEEEEEEE0E0E0F4F4F4DCDCDCEBEBEBDEDEDEDEDEDE + D4D4D4DBDBDBD7D7D7DFDFDFE0E0E0EAEAEAE8E8E8D3D3D3D8D8D8EAEAEADBDB + DBE3E3E3E4E4E4D8D8D8D9D9D9DEDEDEDADADADADADAD7D7D7DCDCDCD5D5D5E4 + E4E4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFECECEBDDDBD5D4D1C7D2CEC4D9D6CEEAEAE9EAEAE9EAEA + E9EAEAE9EAEAE9EAEAE9EAEAE9D1D0C7D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5B1C9BE93B7AAD0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C6EFEFEFEDEDEDDADADAE8E8E8EBEBEBEBEBEBF0F0F0F6F6F6F2F2F2F5F5F5E4 + E4E4EDEDEDEFEFEFF2F2F2F3F3F3E9E9E9F2F2F2EDEDEDE9E9E9ECECECE9E9E9 + E1E1E1EFEFEFEFEFEFECECECEDEDEDF0F0F0EEEEEEE7E7E7F1F1F1F1F1F1F2F2 + F2E7E7E7E7E7E7ECECECE7E7E7EDEDEDE8E8E8E2E2E2F3F3F3ECECECF2F2F2E1 + E1E1EDEDEDF0F0F0EBEBEBF2F2F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECEAD5D2C8D8D4CBD6D2 + C8DBD8D0EAE9E7EAE9E7EAE9E7EAE9E7EAE9E7EAE9E7EAE9E7D1D0C7D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + B1CABF93B8ABD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC6FAFAFAFAFAFAD5D5D5FAFAFAFAFAFAFAFAFAFA + FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA + FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA + FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA + FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA + FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA + FAF8F9F8F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9 + F9F9F9F9F9D2D1C8D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5B2CAC095B9ACD0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC6D3D3D371717173 + 73739999999A9A9AA3A3A37979799D9D9D9595957979798686868787879A9A9A + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2D1C9D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5B2C9BE94B7AAD0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC6AEAEAE6F6F6FADADADADADAD626262777777565656898989989898 + 8888889F9F9F737373B6B6B6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2D1C9 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5B2C9BE94B7AAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9F8F8F8FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFD2D1C9D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5B1C9BE93B7AAD0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC6FEFEFE + E4E4E4E3E3E3E2E2E2F0F0F0F8F8F8EAEAEAE4E4E4E7E7E7E7E7E7EAEAEAE0E0 + E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2D1C9D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5B1C9BE93 + B7AAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5EBEAE7E7E7E4EBEAE7EBEAE7EBEAE7E8E8E5E5E5E1E9E9 + E6E2E2DFE8E7E4E7E7E4E7E7E4EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EB + EAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7 + EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEA + E7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EB + EAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7 + EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEAE7EBEA + E7D1D0C7D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5B1C9BE93B7AAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5B2C9BE94B7AAD0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5C5C4BAC6C5BBD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5CBCAC0C0BFB5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + B2C9BE94B7AAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5A5A49C7877719F9F97 + 91918A8E8D867D7D77B6B5AD7A79738F8F88888881908F88545450A3A29A6F6F + 69A7A69E898982888881888881888781AEADA5BDBDB36D6C678C8C859E9D9579 + 7872ADACA4797973A8A79F7776708E8D869998916E6E6899989145444193938C + 93928B8888818888818E8D867B7A748888818E8D86A7A69E8A8982D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5B2C9BE94B7AAD0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5A5A49C4F4F4B7776716565605454505A5A5661615C3A393764645F4241 + 3E7C7B7559585441403D71706B62625D5757533D3D3A4D4D49484844BEBDB4B1 + B0A775746E52514D5756524A4A465B5B5661605B5655514D4D4964645F4C4C48 + 73726C61605B5454504A49464545413A3A374645424646424A494653534F3F3F + 3C72716C8D8C85D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5B2C9BE94B7AAD0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5A09F9871716B9A9992919089676762C0BF + B6BCBBB2BAB9B0C3C2B9B8B7AEBAB9B0B0AFA6CAC9C0B1B0A8CBCAC08C8B84B6 + B5ACBEBEB474746EC2C1B7B8B7AE5D5C5875756FC8C7BEB5B4ABB9B8AFC5C4BB + C3C2B8B1B0A8908F88A6A59DB0AFA7C9C8BFB0AFA6C1C0B7B3B2AABCBBB2BAB9 + B0C3C2B8BABAB1BBBAB1BAB9B096958EA1A098D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5B2C9BE94B7AAD0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5B8CEC49FBFB3D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0 + CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5 + D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CF + C5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5D0CFC5BDCFC7AE + C8BED0D4CECDD1CCCED2CDCED2CDCDD2CDCDD1CCCED2CDCED2CDCDD1CCCDD2CD + CDD2CCCDD2CDCDD2CDCCD1CCCDD2CDCDD2CDCDD2CCCDD2CDC5CEC7C4CDC6C4CD + C6C4CDC6C4CDC6C4CDC6C4CDC6C4CDC6C4CDC6C4CDC6C4CDC6C4CDC6C4CDC6C4 + CDC6C4CDC6C4CDC6C4CDC6C4CDC6C4CDC6C4CDC6C4CDC6C4CDC6C4CDC6C4CDC6 + C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CD + C6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3 + CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6C3CDC6 + C2CDC6C2CDC6C2CDC6C2CDC6C2CDC6C2CDC6C2CDC6C2CDC6C9D1CCC8CFCAC9D1 + CCC9D1CCC9D1CCC2CDC6C2CDC6C2CDC6C2CDC6C2CDC6C2CDC6C2CDC6C2CDC6C2 + CDC6C2CDC6C2CDC6BACFCAB6CCC8DBE0E0C0C4C4E0E6E6E2E8E8D5DADAC0C4C4 + E2E9EAE1E5E6E4B39CE0B19EE1E8E8CDD1D1DAE1E2A7AFB0A4AEC0C5E0D080BD + 8DDCE7E8E4E3DDEDD3C6EFEFEFCDCDCDCFCFCFCECECECACACAD8D8D8C9C9C9B9 + B9B9CECECEC9C9C9D7D7D7C9C9C9CFCFCFCDCDCDC5C5C5C4C4C4C7C7C7CACACA + D0D0D0C8C8C8C5C5C5D2D2D2C2C2C2CFCFCFC1C1C1D4D4D4DADADACBCBCBF9F9 + F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1CA + C0A1C1B6CBDADDA9BDA9CAD2D2B0C0C3CCDFE2DAD0BDCDC8C1E2E2E2FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5E5E6E7E9E9D1D3D2 + E6EAE9E4E8E7E3E6E5CCCFCEE7ECEBE5E7E6F1D9CEE3BAAAEAEFEEE1E5E4E4E9 + E9CCAD9FC9C5C2DBE5E7C2DDD7D7E1E3E4E7E1EBDDD4EAEEEDE3E7E6EFF3F2E3 + E7E6E8ECEAE9EDECE9EDECE7EBEAEFF3F2E5EAE8F0F4F3EDF1F0E9EDECE7EBE9 + EFF3F1EDF1F0E7ECEAE6EAE8EFF4F2E8EDEBE1E6E4EEF2F0DDE1E0E5E9E7E8EC + EAF0F4F3E7ECEAE8EDEBF5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5 + F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8 + F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9 + F8F5F9F8F5F9F8F5F9F8BBD2C8ACC9BED3E4E7B7CEC3CCD8DAC4D6D8D5E8EBD7 + D4C2CBD4CFF5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8F5F9F8 + F5F9F8D2E4E4EBEEEDE9ECEBE9ECEBE9ECEBE9ECEBE8ECEBE8ECEBE8ECEBE8EC + EBE7ECEBE7ECEBE7ECEBE7ECEBE7ECEBE7EBEBE6EBEBE6EBEBE6EBEBE4EAE9E3 + EAE9E3E9E9E3E9E9E3E9E9E2E9E9E2E9E9E1E9E9E1E9E9CADEE2CADDE2E1E9E9 + DBE3E2D3D9D9DBE4E8D3DCE7DBE4E7E0E9E9DFE9E9DFE8E8DFE8E8DFE8E8DEE8 + E8DEE8E8DEE8E8DDE8E8DDE8E8DDE8E8DDE8E8DDE8E8DCE8E8DCE8E8DCE8E8DC + E7E8DBE7E8DBE7E8DBE7E8DBE7E8DAE7E8DAE7E8DAE7E8DAE7E8DAE7E8D9E7E8 + D9E7E8D9E7E8D9E7E8D8E7E8D8E6E8D8E7E8D8E6E8D8E6E8D7E6E8D7E6E8D7E6 + E8D7E6E8D7E6E8D6E6E8D6E6E8D6E6E7D5E6E7D5E6E7D5E6E8D5E6E8D7E7E9D7 + E7E9D6E7E9D6E6E9D6E6E9D3E5E7D3E5E7D3E5E7D3E5E7D2E5E7D2E5E7D2E4E7 + D2E4E7D1E4E7D1E4E7D1E4E7CFE3E6C7DBDFDFDEDDA8A7A6DCDBDAF4F4F29F9E + 9DBBBAB9F4F4F2B6B6B5B9B9B8DCDDDCF2F3F2A4A5A4E4E5E4DADBDAA9A9A9B3 + B4B3BBBCBBABACABC8C9C9F0F2F2C6C8C8B7B8B8BBBDBCEFF2F1B4B6B5A2A4A3 + D9DCDBBBDDE7B4C5C3DCE6E8AEC0C7C6BBB8DBDFF1A7B1F5D5DAEDECF1F1EBF1 + F1EBF0F0EBF0F1EAF0F1EAF0F1EAF0F0EAF0F0E9F0F0E9F0F0E8F0F0E8F0F0E8 + F0F0E7F0F0E7F0F0E7EFF0E6EFF0E6EFF0E6EFF0E6EFF0E5EFF0E5EFF0E4EFF0 + E4EEF0E4EFF0E4EEF0E3EEF0E3EEF0E3EEF0E2EEF0E2EEF0E2EEF0E2EEF0E1ED + F0E1EDF0E1EDF0E0EDEFE0EDEFE0EDEFE0EDEFDFEDEFDFEDEFDFECEFDEEDEFDE + ECEFDEECEFDDECEFDDECEFDCECEFDCECEFDCECEFDBECEFDBEBEFDBEBEFDAEBEF + DAEBEEDAEBEFDAEBEFDAEBEED9EBEED9EBEED8EBEED3DFE1C5C7D3CAD8DCF2F2 + F0EFEFEDF0F1EFF0F1EFF0F1EEEFF0EDF0F1EEF0F1EFEFF1EFEFF1EFEFF1EFEF + F1EFEFF0EFEEF0EEEEF0EFECEEEDEEF0EFECEFEDEDF0EEEDF0EEEDF0EEEDF0EE + EAEEECECEFEEEBEFEEEAEDECEBEFEEE4E9E8E0CDC3E9EDEDC7D7E0DBE1E1E9EF + EED6DCEFE9EFEEE9EEEEE9EEEDE8EEEEE8EEEEE8EEEEE7EEEDE7EEEDE7EEEDE6 + EEEDE6EDEDE6EDEDE6EDEDE5EDEDE5EDEDE5EDEDE4EDEDE4EDEDE4EDEDE4EDED + E3ECEDE3EDEDE3ECEDE3ECEDE2ECEDE2ECEDE2ECEDE2ECEDE1ECEDE1ECEDE1EC + ECE1EBECE1EBEDE0EBEDE0EBECE0EBECDFEBECDFEBECDFEBECDEEBECDEEBECDE + EBECDDEAECDDEAECDDEAECDDEAECDCEAECDCEAECDCEAECDCEAECDBEAECDBEAEC + DBEAECDAE9ECDAE9ECDAE9ECDAE9ECD9E9ECD9E9EBD9E9ECD8E9EBD8E9EBD8E8 + EBD1DDDED8E8EBCFDFE25884A0709CA398C0B696BCB38CB2AB94B9B292B6AF94 + BAB28EB8AE95BBB392B8B08BB2AB94B8B199BAB493B9B18AB2AA92BBB18DBDB0 + 97BBB393B8B18CB5AC95B9B292BBB18DB8AE91B7AF8FB7AF91B7AF8DBEB18EBF + B18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18E + BFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB1 + 8EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBF + B18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18E + BFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB1 + 8EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBFB18EBF + B18EBFB193BFB289B2A696BBAF87B0A386A6C56D8EB46D95A48EAB9AA4C9C09F + C4BB9CC4B99BC3B99CC4B99EC5BB9AC3B8A5C8BF9BC4B99BC3B8A0C5BB9EC5BA + 9DC5BA9AC3B89DC5BA91BEB1A2C7BE99C2B7A1C6BC9CC2B89FC7BC99BFB69CC4 + B99EC3BA9CC4B990BEB191BEB191BEB191BEB191BEB191BEB191BEB190BEB190 + BEB190BEB190BEB190BEB190BEB190BEB190BEB190BEB190BEB190BEB190BEB1 + 90BEB190BEB190BEB190BEB190BEB190BEB190BEB190BEB190BEB190BEB190BE + B190BEB190BEB190BEB190BEB190BEB190BEB190BEB190BEB190BEB190BDB190 + BDB190BDB190BDB190BDB190BDB190BDB190BDB190BDB190BDB190BDB190BDB1 + 90BDB190BDB190BDB190BDB190BDB190BDB190BDB190BDB190BDB190BDB190BD + B190BDB190BDB190BDB190BDB190BDB19EC6BA9FC4B8B0CEC5ADCCC3A8C1D980 + 9CC0} + Visible = False + end + object SpTBXTabControl1: TSpTBXTabControl + Left = 0 + Top = 0 + Width = 297 + Height = 457 + Align = alClient + ActiveTabIndex = -1 + Images = ImageList1 + HiddenItems = <> + object SpTBXRightAlignSpacerItem1: TSpTBXRightAlignSpacerItem + CustomWidth = 210 + end + object SpTBXSubmenuItem2: TSpTBXSubmenuItem + Options = [tboDropdownArrow] + LinkSubitems = subLang + end + object tabLeft: TSpTBXItem + Action = Action1 + ImageIndex = 3 + end + object tabRight: TSpTBXItem + Action = Action2 + ImageIndex = 4 + end + object tabClose: TSpTBXItem + ImageIndex = 2 + OnClick = tabCloseClick + end + end + end + object SpTBXStatusBar1: TSpTBXStatusBar + Left = 0 + Top = 529 + Width = 716 + Height = 26 + ParentShowHint = False + ShowHint = True + object TBControlItem2: TTBControlItem + Control = SpTBXProgressBar2 + end + object SpTBXSeparatorItem2: TSpTBXSeparatorItem + end + object hintLabel: TSpTBXLabelItem + Caption = 'Custom painted hint' + OnDrawHint = hintLabelDrawHint + end + object SpTBXSeparatorItem4: TSpTBXSeparatorItem + end + object SpTBXLabelItem6: TSpTBXLabelItem + Caption = 'C:\Mozilla' + ImageIndex = 0 + Images = ImageList1 + end + object SpTBXSeparatorItem3: TSpTBXSeparatorItem + end + object subLang2: TSpTBXSubmenuItem + Caption = 'Languages' + Options = [tboDropdownArrow] + LinkSubitems = subLang + end + object SpTBXSeparatorItem5: TSpTBXSeparatorItem + end + object SpTBXSpinEditItem1: TSpTBXSpinEditItem + end + object SpTBXProgressBar2: TSpTBXProgressBar + Left = 0 + Top = 1 + Width = 140 + Height = 19 + Caption = '30%' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Shell Dlg 2' + Font.Style = [fsBold] + ParentFont = False + Position = 30 + end + end + object LangListBox: TSpTBXListBox + Left = 336 + Top = 424 + Width = 177 + Height = 81 + ItemHeight = 16 + Items.Strings = ( + 'English' + 'Espa'#241'ol' + #54620#44397#50612 + #26085#26412#35486 + #20013#22269#30340 + #1506#1489#1512#1497#1514 + #1593#1585#1576#1609 + #1056#1091#1089#1089#1082#1080#1081 + #917#955#955#951#957#953#954#940) + TabOrder = 5 + Visible = False + end + object ActionList1: TActionList + OnUpdate = ActionList1Update + Left = 376 + Top = 352 + object Action1: TAction + OnExecute = Action1Execute + end + object Action2: TAction + OnExecute = Action2Execute + end + end + object ImageList1: TImageList + Left = 408 + Top = 352 + Bitmap = { + 494C01010A000E00040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000003000000001002000000000000030 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 0000B7CEC400C5DED600C3DAD100C5DBD200C4DAD100C2DAD200C7E2DA000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000B7CEC400BCD1C500C6D8CE00CBDBD300CBDBD300C6D8CE00BDD2C700B8D0 + C500000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF0084B58400107310001873 + 18001873180018731800187B1800187B1800107B1000107B1000087B0800087B + 0800007B0000007300007BB57B00FFFFFF00000000000000000000000000BFD5 + CA00C8D9CF00DDE7E100E7EEEA00EEF3F000EBF1EE00E0E9E400CCDBD300B7CD + C00000000000000000000000000000000000000000000000000000000000B8CE + C100D4E2DB00E9F1EE00F0F6F400F0F6F500EFF5F300EDF3F100E4EDE900D0DF + D700BACFC3000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF0010841000218C21002994 + 2900319431003194310029942900299C2900219C210018A5180018A5180010A5 + 100008A5080000940000006B0000FFFFFF000000000000000000BBD0C400DBE6 + E000F7F9F800FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FDFEFD00E7EE + EA00C2D4CA000000000000000000000000000000000000000000BACFC300E0EA + E500F7FAFA00F6F9F800F7FAFA00F7FAFA00F6F9F800F4F8F700F1F6F500EEF4 + F200D8E5DF00BBD0C50000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00188C180029942900399C + 3900399C3900399C3900FFFFFF00A5D6A5004AA54A004AA54A004AA54A0029A5 + 290018A51800009C0000007B0000FFFFFF0000000000BCD1C600DDE7E100FDFE + FD00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00F1F5F300C3D5CB00000000000000000000000000B8CDC100E3ECE700FBFC + FC00FBFCFC00FBFCFC00FDFEFE001C674B00FDFEFE00FBFCFC00F8FBFA00F3F8 + F700EFF5F300D8E4DE00B9CFC300000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF0021942100399C390042A5 + 420042A5420042A54200FFFFFF00FFFFFF00A5D6A5004AA54A004AA54A0039A5 + 390021A5210008A50800087B0800FFFFFF00C2DAD200D1DFD800FBFCFC00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00ECF2EF00B9CEC20000000000BED5CB00D3E1D900FDFEFD00FEFF + FE00FEFFFE00FFFFFF001C674B001C674B001C674B00FFFFFF00FDFEFE00FAFC + FC00F4F8F700EDF3F100C9DAD100BBD6CC000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF0029942900429C42004AA5 + 4A0052A552004AA54A00FFFFFF00FFFFFF00FFFFFF00A5D6A5004AA54A0039A5 + 390021A5210010A5100008840800FFFFFF00BFD5C900EBF1EE00FFFFFF00FFFF + FF001C674B001C674B00FFFFFF00FFFFFF00FFFFFF001C674B001C674B00FFFF + FF00FEFFFE00FDFEFE00D1DFD700BED8CE00BCD1C600EEF3F000FFFFFF00FFFF + FF00FFFFFF001C674B001C674B00FFFFFF001C674B001C674B00FFFFFF00FDFE + FE00F9FBFB00F3F8F700DDE8E300BAD2C9000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00319C31004AA54A0052A5 + 52004AA54A004AA54A00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A5D6A50039A5 + 390021A5210018A5180010841000FFFFFF00C7D8CE00F9FBFA00FFFFFF00FFFF + FF00FFFFFF001C674B001C674B00FFFFFF001C674B001C674B00FFFFFF00FFFF + FF00FEFFFE00FBFCFC00E4EDE900BBD3CA00C4D6CC00FBFCFC00FFFFFF00FFFF + FF001C674B001C674B00FFFFFF00FFFFFF00FFFFFF001C674B001C674B00FEFF + FE00FBFCFC00F6F9F800E7EFEC00BCD3C8000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00429C420052A552004AA5 + 4A004AA54A004AA54A00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A5D6 + A500219C2100219C210018841800FFFFFF00CDDCD300FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF001C674B001C674B001C674B00FFFFFF00FFFFFF00FFFF + FF00FDFEFE00FAFCFC00EAF1EE00BCD2C900CCDBD300FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF001C674B00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FCFDFD00F9FBFB00EBF1EF00BED5CA000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF0042A5420052A5520052A5 + 52004AA54A004AA54A00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A5D6 + A500219C2100219C2100217B2100FFFFFF00CCDBD300FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF001C674B00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FCFDFD00F9FBFB00EBF1EF00BED5CA00CDDCD300FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF001C674B001C674B001C674B00FFFFFF00FFFFFF00FFFF + FF00FDFEFE00FAFCFC00EAF1EE00BCD2C9000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF0052A552005AAD5A005AAD + 5A0052A552004AA54A00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A5D6A5003194 + 31002994290029942900217B2100FFFFFF00C4D6CC00FBFCFC00FFFFFF00FFFF + FF001C674B001C674B00FFFFFF00FFFFFF00FFFFFF001C674B001C674B00FEFF + FE00FBFCFC00F6F9F800E7EFEC00BCD3C800C7D8CE00F9FBFA00FFFFFF00FFFF + FF00FFFFFF001C674B001C674B00FFFFFF001C674B001C674B00FFFFFF00FFFF + FF00FEFFFE00FBFCFC00E4EDE900BBD3CA000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF0052A552006BB56B006BB5 + 6B005AAD5A0052AD5200FFFFFF00FFFFFF00FFFFFF00A5D6A500399C39003194 + 31002994290029942900217B2100FFFFFF00BCD1C600EEF3F000FFFFFF00FFFF + FF00FFFFFF001C674B001C674B00FFFFFF001C674B001C674B00FFFFFF00FDFE + FE00F9FBFB00F3F8F700DDE8E300BAD2C900BFD5C900EBF1EE00FFFFFF00FFFF + FF001C674B001C674B00FFFFFF00FFFFFF00FFFFFF001C674B001C674B00FFFF + FF00FEFFFE00FDFEFE00D1DFD700BED8CE000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF005AAD5A007BBD7B0073BD + 730063AD63005AAD5A00FFFFFF00FFFFFF00A5D6A500429C4200429C4200399C + 39003194310031943100217B2100FFFFFF00BED5CB00D3E1D900FDFEFD00FEFF + FE00FEFFFE00FFFFFF001C674B001C674B001C674B00FFFFFF00FDFEFE00FAFC + FC00F4F8F700EDF3F100C9DAD100BBD6CC00C2DAD200D1DFD800FBFCFC00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00ECF2EF00B9CEC200000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF006BB56B008CC68C007BBD + 7B006BB56B0063B56300FFFFFF00A5D6A5005AAD5A0052A552004AA54A0042A5 + 4200399C390031943100217B2100FFFFFF0000000000B8CDC100E3ECE700FBFC + FC00FBFCFC00FBFCFC00FDFEFE001C674B00FDFEFE00FBFCFC00F8FBFA00F3F8 + F700EFF5F300D8E4DE00B9CFC3000000000000000000BCD1C600DDE7E100FDFE + FD00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00F1F5F300C3D5CB0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF0073BD73009CCE9C008CC6 + 8C007BBD7B0073BD73006BB56B0063B5630063AD63005AAD5A0052AD52004AA5 + 4A0042A542003194310018731800FFFFFF000000000000000000BACFC300E0EA + E500F7FAFA00F6F9F800F7FAFA00F7FAFA00F6F9F800F4F8F700F1F6F500EEF4 + F200D8E5DF00BBD0C50000000000000000000000000000000000BBD0C400DBE6 + E000F7F9F800FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FDFEFD00E7EE + EA00C2D4CA000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00B5DEB50073BD730063B5 + 63005AAD5A0052A5520052A552004AA54A004AA54A0042A54200429C4200399C + 390031943100218C21008CBD8C00FFFFFF00000000000000000000000000B8CE + C100D4E2DB00E9F1EE00F0F6F400F0F6F500EFF5F300EDF3F100E4EDE900D0DF + D700BACFC300000000000000000000000000000000000000000000000000BFD5 + CA00C8D9CF00DDE7E100E7EEEA00EEF3F000EBF1EE00E0E9E400CCDBD300B7CD + C000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 0000B7CEC400BCD1C500C6D8CE00CBDBD300CBDBD300C6D8CE00BDD2C700B8D0 + C500000000000000000000000000000000000000000000000000000000000000 + 0000B7CEC400C5DED600C3DAD100C5DBD200C4DAD100C2DAD200C7E2DA000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 0000B8BDBD000000870000007600110000006565650000000000000000000000 + 000000000000000000000000000000000000FFFFFF0084B58400107310001873 + 18001873180018731800187B1800187B1800107B1000107B1000087B0800087B + 0800007B0000007300007BB57B00FFFFFF00FFFFFF0052ADFF0018529400185A + 9C00185A9C00185A9C00185AA500185AA500185A9C00185A9C00185294001852 + 940018528C00184A84004AADFF00FFFFFF00FFFFFF0084B58400107310001873 + 18001873180018731800187B1800187B1800107B1000107B1000087B0800087B + 0800007B0000007300007BB57B00FFFFFF000000000000000000B8BDBD003232 + 32000000A9000000FF000000DD00000043005454540000000000000000000000 + 000000000000000000000000000000000000FFFFFF0010841000218C21002994 + 2900319431003194310029942900299C2900219C210018A5180018A5180010A5 + 100008A5080000940000006B0000FFFFFF00FFFFFF00185AA500186BBD001873 + CE001873CE001873CE001873CE001873CE001873CE001873CE001873CE00186B + C600186BBD00185AA500104A7B00FFFFFF00FFFFFF0010841000218C21002994 + 2900319431003194310029942900299C2900219C210018A5180018A5180010A5 + 100008A5080000940000006B0000FFFFFF000000000000000000767676000000 + 43000000FF000000FF0000008700003298002121210000000000000000000000 + 000000000000000000000000000000000000FFFFFF00188C180029942900399C + 3900399C3900399C390039A53900A5D6A500FFFFFF0021AD210018AD180010B5 + 100008AD0800009C0000007B0000FFFFFF00FFFFFF001863AD001873CE00187B + DE00187BDE00187BE7001884E700188CF700188CF700188CF700188CF700187B + DE00186BC6001863AD0018528C00FFFFFF00FFFFFF00188C180029942900399C + 3900399C3900399C390039A539004AA54A00A5D6A500FFFFFF004AA54A0031A5 + 310018A51800009C0000007B0000FFFFFF000000000088898900B8BDBE000000 + 4300000087000000EE000000FF000000CC000000320076767600000000000000 + 000000000000000000000000000000000000FFFFFF0021942100399C390042A5 + 42004AA54A0042A5420042A54200FFFFFF00FFFFFF00FFFFFF0021B5210018B5 + 180010AD100008A50800087B0800FFFFFF00FFFFFF00186BC600187BDE001884 + EF00FFFFFF0084C6FF00188CF700188CF700188CF700188CF70084C6FF00FFFF + FF001873CE00186BBD0018529400FFFFFF00FFFFFF0021942100399C390042A5 + 420042A5420042A542004AA54A00A5D6A500FFFFFF00FFFFFF004AA54A0039A5 + 390021A5210008A50800087B0800FFFFFF000000000000000000001100000000 + A9000000FF000000FF000000FF000000DD001111110000002100545454007676 + 76003200980000323200A0A2A20000000000FFFFFF0029942900429C42004AA5 + 4A0052A552004AA54A0042A5420042AD4200FFFFFF00FFFFFF00FFFFFF0018B5 + 180010AD100010A5100008840800FFFFFF00FFFFFF001873CE001884E700188C + F700188CFF00FFFFFF0084C6FF00188CF700188CF70084C6FF00FFFFFF001884 + E7001873D600186BC600185A9C00FFFFFF00FFFFFF0029942900429C42004AA5 + 4A0052A552004AA54A00A5D6A500FFFFFF00FFFFFF00FFFFFF004AA54A0039A5 + 390021A5210010A5100008840800FFFFFF0000000000B9BEBF00110000000000 + 87000000FF000000CC000000EE0000008700000087000000FF000000BA000000 + 870000006500767676000021000065656500FFFFFF00319C31004AA54A0052A5 + 520052A552004AA54A004AA54A0042A5420039AD3900FFFFFF00FFFFFF00FFFF + FF0018AD180018A5180010841000FFFFFF00FFFFFF00187BDE00188CF700188C + FF00188CF700188CF700FFFFFF0084C6FF0084C6FF00FFFFFF00188CF7001884 + E7001873D6001873CE00185AA500FFFFFF00FFFFFF00319C31004AA54A0052A5 + 52004AA54A00A5D6A500FFFFFF00FFFFFF00FFFFFF00FFFFFF004AA54A0039A5 + 390021A5210018A5180010841000FFFFFF000000000021212100000021000000 + A9000000FF0000004300000087000000FF000000FF0000007600000043000000 + 430076767600323265000000A90000006500FFFFFF00429C420052A55200FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00219C210018841800FFFFFF00FFFFFF001884E700188CFF00188C + F700188CF700188CF700188CF700FFFFFF0084C6FF00188CF7001884EF00187B + DE001873CE001873CE001863AD00FFFFFF00FFFFFF00429C420052A552004AA5 + 4A00A5D6A500FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0042A5420031A5 + 3100219C2100219C210018841800FFFFFF000000000088888800000098000000 + FF000000EE00000076000000EE000000FF000000EE0000003200110000005454 + 54000000EE000000FF000000DD0032326500FFFFFF0042A542005AAD5A00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00219C2100217B2100FFFFFF00FFFFFF001884EF00188CFF00188C + FF00188CF700188CF70084C6FF00FFFFFF00FFFFFF0084C6FF001884E7001873 + D6001873CE001873CE001863AD00FFFFFF00FFFFFF0042A5420052A5520052A5 + 5200A5D6A500FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00399C3900299C + 2900219C2100219C2100217B2100FFFFFF000000000011000000000043000032 + CC000000FF00000098000000FF000000FF000000EE00000076000000A9000000 + CC000000FF000000FF000000A90021212100FFFFFF0052A5520063AD630063AD + 63005AAD5A0052A552004AA54A00429C4200399C3900FFFFFF00FFFFFF00FFFF + FF00299C290029942900217B2100FFFFFF00FFFFFF00188CFF002194FF002194 + FF00188CFF0084C6FF00FFFFFF001884F7001884EF00FFFFFF0084C6FF001873 + CE001873CE001873CE001863AD00FFFFFF00FFFFFF0052A552005AAD5A005AAD + 5A0052A55200A5D6A500FFFFFF00FFFFFF00FFFFFF00FFFFFF00399C39003194 + 31002994290029942900217B2100FFFFFF000000000088898900000000000000 + A9000000FF000000EE0000007600000054000032CC000000A9000000EE000000 + EE000000BA0000006500BABEBE0000000000FFFFFF0052A552006BB56B006BB5 + 6B005AAD5A0052A552004AA54A00429C4200FFFFFF00FFFFFF00FFFFFF002994 + 29002994290029942900217B2100FFFFFF00FFFFFF00188CFF0039A5FF0039A5 + FF0084C6FF00FFFFFF00188CFF00188CFF001884EF001884E700FFFFFF0084C6 + FF001873CE001873CE001863AD00FFFFFF00FFFFFF0052A552006BB56B006BB5 + 6B005AAD5A0052AD5200A5D6A500FFFFFF00FFFFFF00FFFFFF00399C39003194 + 31002994290029942900217B2100FFFFFF000000000000000000000000000000 + 54000000FF000000BA000032CC000000A900000076003200CC00545454002121 + 21000000A900000000000000000000000000FFFFFF005AAD5A007BBD7B0073BD + 730063AD63005AAD5A0052A55200FFFFFF00FFFFFF00FFFFFF00319C3100319C + 31003194310031943100217B2100FFFFFF00FFFFFF002194FF0052ADFF004AAD + FF00FFFFFF002194FF002194FF001894FF00188CF7001884EF001884E700FFFF + FF001873CE001873CE001863AD00FFFFFF00FFFFFF005AAD5A007BBD7B0073BD + 730063AD63005AAD5A005AAD5A00A5D6A500FFFFFF00FFFFFF00429C4200399C + 39003194310031943100217B2100FFFFFF0000000000A0A2A200000000000000 + 54000000A90000005400000076000032FF000000760000005400212121000000 + 110000000000000000000000000000000000FFFFFF006BB56B008CC68C007BBD + 7B006BB56B0063B5630063AD6300B5DEB500FFFFFF004AA54A004AA54A0042A5 + 4200399C390031943100217B2100FFFFFF00FFFFFF0039A5FF006BBDFF0052AD + FF0039A5FF00319CFF00299CFF00299CFF002194FF00188CFF001884F7001884 + EF00187BDE001873CE001863AD00FFFFFF00FFFFFF006BB56B008CC68C007BBD + 7B006BB56B0063B5630063AD630063AD6300A5D6A500FFFFFF004AA54A0042A5 + 4200399C390031943100217B2100FFFFFF000000000000000000000000003232 + 3200000043000000CC000000A9000000DD00000065000000430000004300BBBF + BF0000000000000000000000000000000000FFFFFF0073BD73009CCE9C008CC6 + 8C007BBD7B0073BD73006BB56B0063B5630063AD63005AAD5A0052AD52004AA5 + 4A0042A542003194310018731800FFFFFF00FFFFFF004AADFF0084C6FF006BBD + FF0052ADFF004AADFF0039A5FF00319CFF00299CFF002194FF001894FF00188C + F7001884EF001873CE00185A9C00FFFFFF00FFFFFF0073BD73009CCE9C008CC6 + 8C007BBD7B0073BD73006BB56B0063B5630063AD63005AAD5A0052AD52004AA5 + 4A0042A542003194310018731800FFFFFF000000000000000000000000000000 + 00008888880021212100000043003232320089898900BDC0C100000000000000 + 000000000000000000000000000000000000FFFFFF00B5DEB50073BD730063B5 + 63005AAD5A0052A5520052A552004AA54A004AA54A0042A54200429C4200399C + 390031943100218C21008CBD8C00FFFFFF00FFFFFF00ADDEFF004AADFF00319C + FF002194FF00188CFF00188CFF00188CF700188CF7001884EF001884E700187B + DE001873CE00186BBD0063B5FF00FFFFFF00FFFFFF00B5DEB50073BD730063B5 + 63005AAD5A0052A5520052A552004AA54A004AA54A0042A54200429C4200399C + 390031943100218C21008CBD8C00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0000000000424D3E000000000000003E000000 + 2800000040000000300000000100010000000000800100000000000000000000 + 000000000000000000000000FFFFFF00FFFFFFFF00000000FFFFFFFF00000000 + FFFFFFFF00000000F00FF03F00000000F7EFF7BF00000000F7EFF7BF00000000 + F7EFF78F00000000F7EFF02F00000000F7EFF02F00000000F00FFDEF00000000 + F00FFC0F00000000FFFFFC0F00000000FFFFFFFF00000000FFFFFFFF00000000 + FFFFFFFF00000000FFFFFFFF000000008001F01FF00FFFFF0000E00FE007FFFF + 0000C007C003FFFF000080038001FFFF000000010000F81F000000000000F81F + 000000000000FFFF000000000000FFFF000000000000FFFF000000000000FFFF + 000000000000FFFF000000000001FFFF000080018003FFFF0000C003C007FFFF + 0000E007E00FFFFF8001F00FF01FFFFFFFFF800180018001F07F000000000000 + C07F000000000000C07F000000000000003F0000000000008001000000000000 + 0000000000000000800000000000000000000000000000008000000000000000 + 00010000000000008007000000000000800F000000000000E00F000000000000 + F03F000000000000FFFF80018001800100000000000000000000000000000000 + 000000000000} + end + object Timer1: TTimer + Enabled = False + Interval = 50 + OnTimer = Timer1Timer + Left = 344 + Top = 384 + end + object OpenDialog1: TOpenDialog + Filter = 'Skin files|*.skn' + Left = 344 + Top = 352 + end +end diff --git a/internal/2.4.4/1/Demos/Overview/Unit1.pas b/internal/2.4.4/1/Demos/Overview/Unit1.pas new file mode 100644 index 0000000..1dcf388 --- /dev/null +++ b/internal/2.4.4/1/Demos/Overview/Unit1.pas @@ -0,0 +1,431 @@ +unit Unit1; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, + Dialogs, ExtCtrls, StdCtrls, ActnList, ImgList, ExtDlgs, ComCtrls, + // TB2K + TB2Item, TB2Toolbar, TB2Dock, TB2ExtItems, + // SpTBXLib + SpTBXSkins, SpTBXItem, SpTBXDkPanels, SpTBXTabs, SpTBXEditors, SpTBXControls, + SpTBXExtEditors; + +type + TForm1 = class(TForm) + SpTBXDock1: TSpTBXDock; + SpTBXMultiDock1: TSpTBXMultiDock; + SpTBXMultiDock3: TSpTBXMultiDock; + SpTBXDockablePanel1: TSpTBXDockablePanel; + SpTBXToolbar1: TSpTBXToolbar; + Panel1: TPanel; + SpTBXTabControl1: TSpTBXTabControl; + SpTBXRightAlignSpacerItem1: TSpTBXRightAlignSpacerItem; + tabClose: TSpTBXItem; + SpTBXSubmenuItem1: TSpTBXSubmenuItem; + SpTBXSubmenuItem2: TSpTBXSubmenuItem; + SpTBXItem2: TSpTBXItem; + tabRight: TSpTBXItem; + tabLeft: TSpTBXItem; + SpTBXToolbar3: TSpTBXToolbar; + SpTBXLabelItem3: TSpTBXLabelItem; + SpTBXItem7: TSpTBXItem; + subColor: TSpTBXSubmenuItem; + SpTBXLabelItem4: TSpTBXLabelItem; + subLang: TSpTBXSubmenuItem; + subSkins: TSpTBXSubmenuItem; + SpTBXSkinGroupItem1: TSpTBXSkinGroupItem; + SpTBXTabControl2: TSpTBXTabControl; + SpTBXTabItem1: TSpTBXTabItem; + SpTBXTabSheet1: TSpTBXTabSheet; + ActionList1: TActionList; + Action1: TAction; + Action2: TAction; + SpTBXButton1: TSpTBXButton; + SpTBXStatusBar1: TSpTBXStatusBar; + SpTBXSeparatorItem2: TSpTBXSeparatorItem; + hintLabel: TSpTBXLabelItem; + SpTBXSeparatorItem3: TSpTBXSeparatorItem; + ImageList1: TImageList; + SpTBXLabelItem6: TSpTBXLabelItem; + SpTBXSeparatorItem4: TSpTBXSeparatorItem; + subLang2: TSpTBXSubmenuItem; + Image1: TImage; + SpTBXSeparatorItem5: TSpTBXSeparatorItem; + SpTBXSeparatorItem8: TSpTBXSeparatorItem; + SpTBXTabItem3: TSpTBXTabItem; + SpTBXTabSheet3: TSpTBXTabSheet; + SpTBXGroupBox5: TSpTBXGroupBox; + SpTBXLabel2: TSpTBXLabel; + SpTBXLabel3: TSpTBXLabel; + SpTBXLabel4: TSpTBXLabel; + SpTBXLabel7: TSpTBXLabel; + SpTBXLabel5: TSpTBXLabel; + SpTBXToolbar2: TSpTBXToolbar; + SpTBXItem1: TSpTBXItem; + SpTBXSeparatorItem6: TSpTBXSeparatorItem; + SpTBXItem3: TSpTBXItem; + SpTBXItem4: TSpTBXItem; + SpTBXSeparatorItem7: TSpTBXSeparatorItem; + SpTBXLabel6: TSpTBXLabel; + DP1: TSpTBXDockablePanel; + DP2: TSpTBXDockablePanel; + DP3: TSpTBXDockablePanel; + SpTBXLabel1: TSpTBXLabel; + SpTBXLabel8: TSpTBXLabel; + SpTBXLabel9: TSpTBXLabel; + SpTBXLabel10: TSpTBXLabel; + SpTBXLabel11: TSpTBXLabel; + SpTBXLabel12: TSpTBXLabel; + SpTBXLabel13: TSpTBXLabel; + SpTBXLabel15: TSpTBXLabel; + SpTBXLabel16: TSpTBXLabel; + SpTBXLabel17: TSpTBXLabel; + Timer1: TTimer; + SpTBXGroupBox6: TSpTBXGroupBox; + progressDec: TSpTBXButton; + progressInc: TSpTBXButton; + progressAnimate: TSpTBXButton; + SpTBXProgressBar1: TSpTBXProgressBar; + progressFiles: TSpTBXCheckBox; + SpTBXProgressBar2: TSpTBXProgressBar; + TBControlItem2: TTBControlItem; + SpTBXTrackBar1: TSpTBXTrackBar; + SpTBXComboBox1: TSpTBXComboBox; + TBControlItem3: TTBControlItem; + SpTBXPanel2: TSpTBXPanel; + Memo2: TMemo; + SpTBXSplitter1: TSpTBXSplitter; + SpTBXSplitter2: TSpTBXSplitter; + SpTBXTabItem6: TSpTBXTabItem; + SpTBXTabSheet6: TSpTBXTabSheet; + SpTBXButtonEdit1: TSpTBXButtonEdit; + SpTBXComboBox2: TSpTBXComboBox; + SpTBXEdit1: TSpTBXEdit; + SpTBXSpinEdit1: TSpTBXSpinEdit; + LangListBox: TSpTBXListBox; + rgSkinType: TSpTBXRadioGroup; + SpTBXGroupBox1: TSpTBXGroupBox; + SpTBXGroupBox2: TSpTBXGroupBox; + trackTickmarks: TSpTBXRadioGroup; + skinButton: TSpTBXSpeedButton; + SpTBXDockablePanel2: TSpTBXDockablePanel; + OpenDialog1: TOpenDialog; + SpTBXSeparatorItem1: TSpTBXSeparatorItem; + SpTBXColorPalette1: TSpTBXColorPalette; + SpTBXItem5: TSpTBXItem; + SpTBXSpinEditItem1: TSpTBXSpinEditItem; + Panel2: TPanel; + SpTBXSpeedButton1: TSpTBXSpeedButton; + SpTBXSpeedButton2: TSpTBXSpeedButton; + SpTBXSpeedButton3: TSpTBXSpeedButton; + SpTBXColorEdit1: TSpTBXColorEdit; + SpTBXFontComboBox1: TSpTBXFontComboBox; + procedure FormShow(Sender: TObject); + procedure tabCloseClick(Sender: TObject); + procedure ActionList1Update(Action: TBasicAction; + var Handled: Boolean); + procedure Action1Execute(Sender: TObject); + procedure Action2Execute(Sender: TObject); + procedure SpTBXTabControl2Resize(Sender: TObject); + procedure rgSkinTypeClick(Sender: TObject); + procedure hintLabelDrawHint(Sender: TObject; + AHintBitmap: TBitmap; var AHint: WideString; + var PaintDefault: Boolean); + procedure progressDecClick(Sender: TObject); + procedure progressIncClick(Sender: TObject); + procedure progressAnimateClick(Sender: TObject); + procedure Timer1Timer(Sender: TObject); + procedure SpTBXProgressBar1ProgressChange(Sender: TObject; + NewPosition: Integer); + procedure progressFilesClick(Sender: TObject); + procedure TrackbarTickMarksRadioClick(Sender: TObject); + procedure skinButtonClick(Sender: TObject); + procedure SpTBXSpeedButton1Draw(Sender: TObject; ACanvas: TCanvas; + ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); + private + { Private declarations } + procedure LangClick(Sender: TObject); + public + AppPath: String; + end; + +var + Form1: TForm1; + +implementation + +uses + Registry; + +{$R *.dfm} + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Utility functions } + +function SpGetWindowsDir: String; +var + Z: Cardinal; +begin + Z := GetWindowsDirectory(nil, 0); + if Z > 0 then begin + SetLength(Result, Z); + GetWindowsDirectory(PChar(Result), Z); + Result := IncludeTrailingPathDelimiter(Result); + end + else + Result := ''; +end; + +function SpGetWinAmpDir: String; +var + Registry: TRegistry; +begin + Registry := TRegistry.Create; + try + Registry.RootKey := HKEY_CURRENT_USER; + // False because we do not want to create it if it doesn't exist + Registry.OpenKey('\Software\Winamp', False); + Result := Registry.ReadString(''); + if Length(Result) > 0 then + Result := IncludeTrailingPathDelimiter(Result); + finally + Registry.Free; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Form } + +procedure TForm1.FormShow(Sender: TObject); +var + A: TSpTBXItem; + D: String; + I: Integer; +begin + // Set skin type to sknTBX + SkinManager.ChangeControlSkinType(Self, sknSkin); + + // Add the Languages to the Languages menu item and TabControl + for I := 0 to LangListBox.Items.Count - 1 do begin + A := TSpTBXItem.Create(nil); + try + A.Caption := LangListBox.Items[I]; + A.GroupIndex := 100; + A.AutoCheck := True; + A.Tag := I; + A.OnClick := LangClick; + subLang.Add(A); + with SpTBXTabControl1.Add(LangListBox.Items[I]) do + Tag := I; + except + A.Free; + end; + end; + + // Select the first Language + subLang.Items[0].Click; + SpTBXTabControl1.ActiveTabIndex := 0; + SpTBXTabControl2.ActiveTabIndex := 0; + + // Load default button Skin + AppPath := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)); + + // Initialize the link labels + D := SpGetWindowsDir; + if Length(D) > 0 then begin + SpTBXLabel4.LinkText := D; + SpTBXLabel5.LinkText := 'explorer.exe'; + SpTBXLabel5.LinkTextParams := '/e, ' + D; + end; + D := SpGetWinAmpDir; + if Length(D) > 0 then + SpTBXLabel6.LinkText := D + 'winamp.exe'; + if FileExists(AppPath + 'unit1.pas') then + SpTBXLabel7.LinkTextParams := '"' + AppPath + 'unit1.pas' + '"'; +end; + +procedure TForm1.LangClick(Sender: TObject); +var + A: TSpTBXItem; +begin + A := Sender as TSpTBXItem; + subLang.Caption := A.Caption; + subLang2.Caption := A.Caption; + SpTBXTabControl1.ActiveTabIndex := subLang.IndexOf(A); +end; + +procedure TForm1.tabCloseClick(Sender: TObject); +begin + SpTBXTabControl1.Visible := False; +end; + +procedure TForm1.ActionList1Update(Action: TBasicAction; var Handled: Boolean); +var + L, R: Boolean; +begin + SpTBXTabControl1.ScrollState(L, R); + Action1.Enabled := L; + Action2.Enabled := R; +end; + +procedure TForm1.Action1Execute(Sender: TObject); +begin + SpTBXTabControl1.ScrollLeft; +end; + +procedure TForm1.Action2Execute(Sender: TObject); +begin + SpTBXTabControl1.ScrollRight; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Options Panel } + +procedure TForm1.rgSkinTypeClick(Sender: TObject); +begin + SkinManager.ChangeControlSkinType(Self, TSpTBXSkinType(rgSkinType.ItemIndex)); +end; + +procedure TForm1.skinButtonClick(Sender: TObject); +var + S: string; + I: Integer; +begin + S := AppPath + 'Skins'; + if DirectoryExists(S) then + OpenDialog1.InitialDir := S; + + if OpenDialog1.Execute then + if FileExists(OpenDialog1.FileName) then begin + // Load the skin file and add it to the SkinList + I := SkinManager.SkinsList.AddSkinFromFile(OpenDialog1.FileName); + if I > -1 then begin + // Set the new skin + SkinManager.SetSkin(SkinManager.SkinsList[I]); + // Recreate the SkinGroupItem + SpTBXSkinGroupItem1.Recreate; + end; + end; +end; + +procedure TForm1.SpTBXTabControl2Resize(Sender: TObject); +begin + SpTBXButton1.Left := (SpTBXTabControl2.Width - SpTBXButton1.Width) div 2; + SpTBXProgressBar1.Left := (SpTBXTabControl2.Width - SpTBXProgressBar1.Width) div 2; + SpTBXTrackBar1.Left := (SpTBXTabControl2.Width - SpTBXTrackBar1.Width) div 2; +end; + +procedure TForm1.SpTBXSpeedButton1Draw(Sender: TObject; ACanvas: TCanvas; + ARect: TRect; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +var + SB: TSpTBXSpeedButton; +begin + if PaintStage = pstPrePaint then begin + PaintDefault := False; + SB := TSpTBXSpeedButton(Sender); + SpDrawXPHeader(ACanvas, ARect, SB.MouseInControl, SB.Pushed, sknSkin); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ StatusBar } + +procedure TForm1.hintLabelDrawHint(Sender: TObject; + AHintBitmap: TBitmap; var AHint: WideString; var PaintDefault: Boolean); +var + R, GR, TR: TRect; + WS: WideString; +begin + PaintDefault := False; + AHintBitmap.Width := Image1.Picture.Bitmap.Width + 115; + AHintBitmap.Height := Image1.Picture.Bitmap.Height + 30; + with AHintBitmap.Canvas do begin + Brush.Color := clInfoBk; + Font.Color := clInfoText; + R := Rect(0, 0, AHintBitmap.Width, AHintBitmap.Height); + FillRect(R); + + GR := Bounds(5, 5, Image1.Picture.Bitmap.Width, Image1.Picture.Bitmap.Height); + Draw(GR.Left, GR.Top, Image1.Picture.Bitmap); + + WS := 'Language: ' + subLang.Caption + #13#10 + + 'Skin: ' + SkinManager.CurrentSkinName + #13#10 + + 'Time: ' + TimeToStr(Now); + TR := Rect(GR.Right + 5, 10, R.Right, R.Bottom); + SpDrawXPText(AHintBitmap.Canvas, WS, TR, DT_WORDBREAK); + + Font.Color := clBlue; + Font.Style := [fsUnderline]; + TR := Rect(GR.Left, GR.Bottom + 5, R.Right, R.Bottom); + WS := 'http://www.silverpointdevelopment.com'; + SpDrawXPText(AHintBitmap.Canvas, WS, TR, DT_WORDBREAK); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ ProgressBar } + +procedure TForm1.progressDecClick(Sender: TObject); +begin + SpTBXProgressBar1.StepIt(-10); + SpTBXProgressBar2.StepIt(-10); +end; + +procedure TForm1.progressIncClick(Sender: TObject); +begin + SpTBXProgressBar1.StepIt(10); + SpTBXProgressBar2.StepIt(10); +end; + +procedure TForm1.progressAnimateClick(Sender: TObject); +begin + SpTBXProgressBar1.Position := 0; + SpTBXProgressBar2.Position := 0; + Timer1.Enabled := True; +end; + +procedure TForm1.Timer1Timer(Sender: TObject); +begin + SpTBXProgressBar1.StepIt; + SpTBXProgressBar2.StepIt; + if SpTBXProgressBar1.Position >= SpTBXProgressBar1.Max then + Timer1.Enabled := False; +end; + +procedure TForm1.SpTBXProgressBar1ProgressChange(Sender: TObject; + NewPosition: Integer); +var + I: Integer; + WS: WideString; +begin + if progressFiles.Checked then begin + I := (NewPosition div 10) - 1; + if I < 0 then I := 0; + if I > LangListBox.Items.Count - 1 then I := LangListBox.Items.Count - 1; + WS := 'C:\Lang\' + LangListBox.Items[I] + '.txt'; + SpTBXProgressBar1.Caption := WS; + SpTBXProgressBar2.Caption := WS; + end; +end; + +procedure TForm1.ProgressFilesClick(Sender: TObject); +begin + if progressFiles.Checked then + SpTBXProgressBar1.CaptionType := pctDefault + else + SpTBXProgressBar1.CaptionType := pctPercentage; + SpTBXProgressBar2.CaptionType := SpTBXProgressBar1.CaptionType; + SpTBXProgressBar1ProgressChange(SpTBXProgressBar1, SpTBXProgressBar1.Position); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TrackBar } + +procedure TForm1.TrackbarTickMarksRadioClick(Sender: TObject); +begin + SpTBXTrackBar1.TickMarks := TSpTBXTickMark(trackTickmarks.ItemIndex); +end; + +end. diff --git a/internal/2.4.4/1/Demos/Overview/hint.bmp b/internal/2.4.4/1/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/internal/2.4.4/1/LICENSE.txt b/internal/2.4.4/1/LICENSE.txt new file mode 100644 index 0000000..79e0329 --- /dev/null +++ b/internal/2.4.4/1/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/internal/2.4.4/1/Lib/D11/SpTBXColorPickerForm.dcu b/internal/2.4.4/1/Lib/D11/SpTBXColorPickerForm.dcu new file mode 100644 index 0000000000000000000000000000000000000000..13e39c21da814bb09c48268161cdb83d8606525c GIT binary patch literal 19043 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 bHhS3Ljd+ZLbK)@$vw+9tuoWIxh~EDL8GL2F literal 0 HcmV?d00001 diff --git a/internal/2.4.4/1/Lib/D11/SpTBXColorPickerForm.dfm b/internal/2.4.4/1/Lib/D11/SpTBXColorPickerForm.dfm new file mode 100644 index 0000000..5ca6585 --- /dev/null +++ b/internal/2.4.4/1/Lib/D11/SpTBXColorPickerForm.dfm @@ -0,0 +1,3025 @@ +object SpTBXColorPickerForm: TSpTBXColorPickerForm + Left = 156 + Top = 89 + ClientHeight = 193 + ClientWidth = 213 + 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 = 213 + Height = 167 + Align = alClient + ActiveTabIndex = 0 + Images = ImageList1 + OnActiveTabChange = SpTBXTabControl1ActiveTabChange + HiddenItems = <> + object SpTBXTabItem1: TSpTBXTabItem + Checked = True + ImageIndex = 2 + end + object SpTBXTabItem2: TSpTBXTabItem + ImageIndex = 3 + end + object SpTBXTabItem3: TSpTBXTabItem + ImageIndex = 4 + end + object SpTBXTabSheet2: TSpTBXTabSheet + Left = 0 + Top = 26 + Width = 213 + Height = 141 + ImageIndex = 3 + DesignSize = ( + 213 + 141) + TabItem = 'SpTBXTabItem2' + object SpTBXColorListBox1: TSpTBXColorListBox + Left = 5 + Top = 5 + Width = 200 + Height = 127 + Style = [clbsSystemColors, clbsIncludeNone, clbsIncludeDefault, clbsPrettyNames, clbsNoneAsTransparent] + Anchors = [akLeft, akTop, akRight, akBottom] + ItemHeight = 16 + TabOrder = 0 + OnClick = SpTBXColorListBox1Click + Selected = clActiveBorder + end + end + object SpTBXTabSheet3: TSpTBXTabSheet + Left = 0 + Top = 26 + Width = 213 + Height = 141 + ImageIndex = 4 + DesignSize = ( + 213 + 141) + TabItem = 'SpTBXTabItem3' + object imgColorPicker: TImage + Left = 2 + Top = 0 + Width = 207 + Height = 137 + Align = alClient + Visible = False + end + object btnColorPicker: TSpTBXSpeedButton + Left = 48 + Top = 58 + Width = 113 + Height = 22 + Caption = 'Click && Drag' + Anchors = [] + DragMode = dmAutomatic + OnEndDrag = btnColorPickerEndDrag + OnStartDrag = btnColorPickerStartDrag + end + end + object SpTBXTabSheet1: TSpTBXTabSheet + Left = 0 + Top = 26 + Width = 213 + Height = 141 + ImageIndex = 2 + TabItem = 'SpTBXTabItem1' + object imgPalette: TImage + Left = 5 + Top = 4 + Width = 200 + Height = 137 + Cursor = crHandPoint + AutoSize = True + Picture.Data = { + 07544269746D61704E410100424D4E410100000000003600000028000000C800 + 000089000000010018000000000018410100130B0000130B0000000000000000 + 0000010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101080942 + 080942080942080942080C42080F42081142081342071642071843071A43071C + 43071E43072043072243062444062644062844062A44062C45052D45052F4505 + 3145053345043446043646043846043946043946043946043946033B46033C46 + 033E47023F4702414702424701444702434602424403424203414003403E043F + 3C043F3A053E38053D36053C33063C31063B2E073A2C07392908382608382308 + 372009361C0935180A34140A340F0A33080B32010B31000B30000C30000C2F00 + 0C2F000C2F000C2E000D2E000D2D000D2C000D2C000F2C00112C00132C00152C + 00162C00182C001A2B001C2B001D2B001F2B00212B00232B00252B00262B0028 + 2B002A2B002C2B002D2B002F2B00312B00332A00342A00362A00372A00392A00 + 3A2A003C2A003D2A003F29004029004229004128004027003F26003F25003E24 + 003D22003C21003B20003A1F00391E00381C00371B0036190035180034160033 + 1500321300311100300F002F0E002E0B002D09002C07002C05002B03002A0100 + 29000228000427000527000726000825000A25000A25000D2500102500132500 + 1624001824001A24001D24001F23002123002323002523002722002922002B22 + 002D22002F21003121003221003421003621003720003920003A20003C20003E + 20003F1F00411F00421F00431F00451E00461D00461D00461C00451B00451A00 + 451A004519004518004518004517004416004415004414004414004413014412 + 02431102431103431004430F04430E05430E06430D06430C07420C07420B0842 + 0A08420A08420909420809420809420101010101010C0C5C0C0C5C0C0C5C0C0C + 5C0C115C0C155C0C195C0B1C5D0B1F5D0B225D0B255E0A285E0A2A5E092D5E09 + 305F09335F083660083860073B60073E61064061064362054562044862044A63 + 034C63024E63025164025164025164025164015364005564005765005965005B + 65005D66005F66005E64005D61005C5F005B5D015A5A02595703585504575205 + 564F06554C0854490953460A52420B513F0C4F3B0D4E370D4D340E4C300F4B2B + 104A2611492111471B1246131245091344001443001442001442001442001441 + 00154000153F00163E00163D00193D001B3D001E3D00203D00223D00243D0027 + 3E00293E002B3E002E3E00303E00333E00353E00373E003A3E003C3E003E3E00 + 413E00433E00453E00483E004A3E004C3E004E3E00503E00523E00543E00563E + 00593E005A3E005C3E005B3D005A3C00593A0058390057370056360055350054 + 3300523200513000502E004F2D004E2B004C29004B28004A2600482400472200 + 462000441E00431C00421A004118003F16003E14003D12003C0F003B0D023A0A + 0539080738050937020B37020B36021136021636011A36011E36002135002435 + 002735002A35002D34003034003234003634003833003B33003D330040320042 + 32004532004732004932004B31004E3100503100523100543100563100583000 + 5A30005C30005D2F005F2E005F2D005F2C005F2B005F2A005F29005E28005E26 + 005E25005E24005E23005E22005E21015E1F025D1E035D1D045D1C055D1B055D + 1A065D18075D17085D16095D15095C140A5C130A5C120B5C100B5C0F0B5C0E0C + 5C0D0C5C0C0C5C010101010101100E74100E74100E74100E74101475101A750F + 1F750F23760F27760E2B760E2F770D33770D36780C3A780B3D790A41790A447A + 09487A084B7B074F7B06527C04557D03587D025B7E015E7E00617F00647F0067 + 80006780006780006780006A80006C81006F8100718200748200778300798300 + 788000777D00757A00747700737400727100706D026F6A046E66066C63086B5F + 0A695B0C68570D67530F654E10644A116246136140145F3B155E35165C2F175B + 281859201958171956071A55001B54001B54001B54001C52001C51001D50001D + 4F001E4D00214D00244D00274E002A4E002C4E002F4E00324E00354E00384E00 + 3B4F003E4F00414F00444F00474F004A4F004D4F005050005350005650005950 + 005B50005E50006150006350006651006951006B51006E510071510073510075 + 5100745000734E00724C00704B006F49006D47006C46006B4400694200684000 + 663E00653C00633A006138006036005E34005D32005B3000592E00582B005629 + 005427005325005122005020004E1D004D1B004C19004A160349140648110A46 + 0E0D460E0D460D15460D1B460C20460B25450A2945092D450831450735440639 + 44053C44044043034343024743004A42004D4200504200534200564100594100 + 5C41005F41006140006440006640006940006C40006E4000704000733F00753E + 00773D00773B00773A0077390077370077360077340077330077310077300076 + 2F00762D00762B01762A02762803762704762505762406762207752108751F09 + 751D0A751C0A751A0B75190B75170C75160C75140D74130D74120E74100E7401 + 0101010101130E8B130E8B130E8B130E8B13178B131E8C12248C12298D112E8D + 11338E10388E0F3C8F0E418F0E45900D49910B4E910A5292085693075A93055E + 94036295026695006996006D97007197007498007899007B99007B99007B9900 + 7B99007E9A00829B00859B00889C008B9D008E9D00919E00909A008E97008D93 + 008B9000898C00888800868400858000837C038177068073097E6E0C7C6A0E7A + 6511795F13775A14755516744F1772491970431A6E3C1B6C341D6B2B1E69211F + 6712206600216400216400216400216200226100235F00245E00245C00285C00 + 2B5C002F5C00325C00365D00395D003D5D00405D00435D00475E004A5E004E5E + 00525E00555F00595F005C5F00605F006360006660006A60006D600070600074 + 61007761007A61007D61008061008361008762008962008C62008B6000895E00 + 885C00865A008459008357008155008053007E50007C4E007A4C00784A007748 + 007545007343007140006F3E006D3C006B3900693600673400653100632F0061 + 2C005F29005E27005C24005B2100591F00581C0556190A54160E54160E541518 + 54151F54142654132C53133153123653113B52103F520E43520D47510C4B510A + 5051085450065750055B50035F4F01634F00664F00694F006D4E00704E00734E + 00764E00794E007D4D00804D00824D00854D00884D008B4B008E4A008E48008E + 46008D45008D43008D41008D40008D3E008D3C008D3A008D39008D37008D3500 + 8D33018C31028C2F038C2E048C2C058C2A068C28078C26088C24098C220A8C20 + 0B8B1E0B8B1D0C8B1B0C8B190D8B170D8B150E8B130E8B010101010101160CA1 + 160CA1160CA1160CA11618A21521A21529A3142FA41335A4123BA51140A51046 + A60F4BA70E50A80D55A80B5AA9095FAA0664AB0468AC016DAD0072AD0076AE00 + 7AAF007FB00083B10087B2008BB2008FB3008FB3008FB3008FB30093B40097B5 + 009AB6009EB600A2B700A5B800A9B900A7B500A5B000A3AC00A2A800A0A4009E + 9F009C9A009A9600989100968C01948705928109907C0D8E76118C70138A6A16 + 886518865E1A84571C824F1E7F481F7D3F217B3522792A23771A247500257300 + 257300257300267100277000286E00296C002A6A002E6A00326A00366B003A6B + 003E6B00426B00466B004A6C004E6C00526C00566D005B6D005F6D00626E0067 + 6E006B6E006F6F00736F00776F007B6F007F70008270008670008A70008E7100 + 9171009571009871009C72009F7200A37200A170009F6E009D6C009C6A009A67 + 00986500966300946100925E00905C008E59008C5700895400875100854F0083 + 4C008049007E46007C4400794100773E00753B007338007135006E32006D2F00 + 6B2C0069290067260065230463200A621C0F621C0F611C1B611B24611A2C611A + 3360193960183E6016445F15495F144E5E13525E12575E105C5D0E615D0C655D + 0A695C076E5C05725C02765C007A5B007E5B00825B00855B00895A008C5A0090 + 5A00935A00975A009A5A009E5900A15700A45600A45400A45200A45000A44E00 + A44C00A34A00A34800A34600A34400A34200A34000A33E00A33C00A33900A337 + 00A33500A33301A33102A22E04A22C05A22A05A22807A22507A22308A22109A2 + 1F0AA21D0AA21B0BA2180CA2160CA10101010101011807B71807B71807B71807 + B71718B81723B9162DB91534BA143BBB1342BB1248BC114FBD0F54BE0D5ABF0B + 60BF0866C1056BC20271C20076C3007CC50081C60086C6008BC80090C90095CA + 0099CA009ECB00A2CC00A2CC00A2CC00A2CC00A7CD00ABCE00AFCF00B4D000B8 + D100BCD200C0D300BECE00BCC900BAC500B8C000B5BB00B3B600B1B000AFAB00 + ADA500AAA000A89A00A69404A38E0AA1870F9E80139C79169A7319976C1C9564 + 1E925B209053228E49248B3E2589322786222884002982002982002982002B80 + 002C7E002D7C002E79002F77003377003878003D78004178004679004A79004F + 7900547900587A005D7A00617A00667B006B7B006F7C00747C00797C007D7D00 + 827D00867E008B7E008F7E00937F00987F009C7F00A08000A48000A88000AC81 + 00B18100B48100B88100B67F00B47D00B27A00B07800AE7500AC7300A97000A7 + 6E00A56B00A26800A065009E62009B6000995D00965A009356009154008E5000 + 8C4D00894A008646008443008140007F3D007C39007A3600783300762F00742C + 0072290370250B6E21116E21116D211F6D20296D1F326C1E396C1D406C1C466B + 1B4C6B1A526B19586A175D6A16626A146869126D691072680D76680A7C680780 + 67048567018967008E67009266009666009A66009E6600A36600A66500AA6500 + AE6500B26500B66300B96100B95F00B95D00B95A00B95800B95600B95400B952 + 00B94F00B94D00B94B00B94800B94600B94300B94100B93F00B93C00B83A00B8 + 3700B83400B83200B82F00B82D01B82A02B82802B82503B82304B82005B81E05 + B81B06B81807B70101010101011900CD1900CD1900CD1900CD1817CE1825CE17 + 31CF1639D01541D11349D11250D21057D30E5ED40B64D5086AD60472D70178D9 + 007EDA0084DB008ADC0090DD0095DE009BE000A1E100A6E200ABE300B0E400B5 + E500B5E500B5E500B5E500BBE600BFE700C4E900C9EA00CEEB00D2EC00D7ED00 + D4E700D2E200CFDD00CDD700CAD200C8CC00C5C600C3C000C0B900BEB300BBAC + 00B8A600B69F03B3970BB09011AD8815AB8119A8791CA5701FA36722A05E249D + 53269A4728983A2A95292B93072D90002D90002D90002E8E002F8B0030890032 + 86003384003884003E84004385004885004D85005286005786005C8600618700 + 6687006B88007188007689007B8900808A00868A008B8B00908B00958B009A8C + 009F8C00A38D00A88D00AD8D00B28E00B68E00BB8F00BF8F00C48F00C89000CD + 9000CA8D00C88B00C68800C38500C18300BF8000BC7D00B97A00B77700B47400 + B27100AF6E00AC6A00A96700A66400A36000A15D009E5A009B5600985200954F + 00924B008F47008C4400894000873C008439008235008031007D2E047B2A0D79 + 251379251378252378242E78233877224077214777204E761F55761E5B761C61 + 751B6775196D75177374157974137E731083730D8973098E7204937201987200 + 9E7200A27100A77100AB7100B07100B57000B97000BD7000C17000C67000CA6D + 00CE6B00CE6900CE6700CE6400CE6200CE6000CE5D00CE5B00CE5800CE5600CE + 5300CE5000CE4E00CE4B00CE4800CE4600CE4300CE4000CE3D00CE3A00CE3700 + CE3400CD3100CD2E00CD2C00CD2900CD2600CD2300CD2000CD1D00CD1900CD01 + 01010101011A00E21A00E21A00E21A00E21916E31827E41734E5163EE51547E6 + 134FE71158E80F60E90C67EA086EEB0475EC007DEE0084EF008AF00091F20098 + F3009EF400A4F600AAF700B1F800B7FA00BCFB00C2FC00C7FD00C7FD00C7FD00 + C7FD00CEFF00D3FF00D8FF00DDFF00E3FF00E8FF00EDFF00EAFF00E7FA00E4F4 + 00E2EE00DFE800DCE100D9DB00D6D400D3CD00D1C600CEBE00CBB700C8AF00C5 + A704C29F0DBE9713BC8F18B9861CB67C20B27323AF6826AC5D28A9502AA6422C + A3302EA10F309E00309E00309E00319B003398003496003593003690003D9000 + 4391004991004E91005492005992005F93006593006A94007094007594007C95 + 008196008796008C97009397009898009D9800A39900A99900AE9A00B39A00B8 + 9B00BD9B00C39B00C89C00CD9C00D29D00D79D00DC9D00E09E00DE9B00DB9800 + D99500D69200D48F00D18C00CE8900CB8600C88300C57F00C27C00BF7800BC75 + 00B97100B66E00B26A00B06600AC6200A95F00A55A00A256009F53009C4F0099 + 4A00964600934200903E008D3A008B3600883206862E10832917832917832827 + 82283382273E82264681254E81245681225D80216480206B801E717F1C777F1A + 7E7F18847E158A7E12907E0E967D0A9C7D05A17D00A77C00AD7C00B27C00B77B + 00BC7B00C17B00C67B00CB7B00D07A00D47A00D97A00DE7700E27500E27300E2 + 7000E26E00E36B00E36900E36600E36300E36100E35E00E35B00E35800E35500 + E35200E34F00E34C00E34900E34600E34300E34000E33C00E23900E23600E233 + 00E22F00E22C00E22900E22500E22200E21E00E21A00E20101010101012A3DE5 + 2A3DE52A3DE52A3DE52B45E62B4CE72B54E82C5BE92C62EA2C68EB2C70EC2D76 + ED2D7CEE2D82EF2D88F02D8FF12D94F22D9AF32D9FF42DA5F52DAAF72CAFF82C + B5F92BBAFA2ABFFB2AC4FC29C9FD28CEFE28CEFE28CEFE28CEFE27D3FF26D8FF + 24DCFF23E1FF21E6FF1FEAFF1DEEFF21ECFF24EAFB27E7F629E5F12CE2EB2EE0 + E530DDE032DBDA34D8D436D6CE37D3C839D1C13ACEBB3CCCB43DC9AD3EC6A63F + C4A040C19942BF9143BC8944B98145B67845B36F46B16647AE5C48AB5049A944 + 49A94449A94449A6354AA41E4AA1004B9F004C9C00519D00569D005C9D00619E + 00669E006B9F00719F0076A0007BA00080A00085A1008BA10090A20095A2009A + A3009FA300A4A400A9A400ADA500B3A500B7A600BCA600C0A600C5A700CAA700 + CEA800D3A800D7A800DCA900E0A900E4A900E2A700DFA400DDA100DB9E00D89C + 00D69900D39600D19300CE9000CC8C00C98900C68600C48300C17F00BE7C00BB + 7800B87500B57200B26E00AF6A00AC660CA96318A65F1FA35B25A0572A9D532E + 9A4F32974B3595473892433A8F3F3C8D3B3E8D3B3E8D3B478D3B4E8C3B568C3B + 5D8C3B638C3B698C3B708C3B768C3B7B8C3B818B3B878B3B8D8B3B928B3B978B + 3B9C8B3BA18B3AA68B3AAB8B3AB08B3AB58B3ABA8A3ABE8A3AC38A39C78A39CC + 8A39D08A39D58A39D98A38DD8A38E18838E58538E58339E68139E67E39E67C3A + E6793AE6763AE6743AE6713BE66E3BE66B3BE6693BE6663BE6633BE6603CE65D + 3CE65A3CE6573CE6543CE6503CE64D3CE64A3CE6463CE6433CE6403CE63C3CE6 + 393CE6353CE6323CE52E3DE52A3DE5010101010101405FE9405FE9405FE9405F + E94164EA426AEB4370EC4476EC457BED4680EE4786EF488BF04990F14A95F24B + 9AF34C9FF44DA4F54DA9F64EADF74FB2F850B7F950BBF951BFFA51C4FB52C9FC + 52CDFD53D1FE53D5FF53D5FF53D5FF53D5FF54D9FF54DDFF54E1FF55E4FF55E9 + FF55EDFF56F0FF56EEFF57ECFC58EAF858E8F359E6EE59E4EA5AE2E55AE0E05B + DEDB5CDCD65CD9D05CD7CB5DD5C65DD3C05ED1BB5ECEB55ECCB05FCAAA5FC8A4 + 60C69E60C39760C19060BE8A61BC8261BA7B61B77461B56C61B56C61B56C62B3 + 6362B05A62AE5062AC4562A93967AA376CAA3671AB3476AB337AAB317FAC2F83 + AC2D88AD2B8DAD2991AD2796AE249BAE219FAF1DA3AF1AA8B016ADB010B1B109 + B5B100B9B100BEB200C2B200C5B200C9B300CDB300D1B400D5B400D9B400DCB5 + 00E1B500E4B500E8B600E6B300E4B000E2AE00E0AB00DEA900DBA600D9A308D7 + A015D59E1DD29B23D09829CE952DCB9231C98F35C68C39C4893CC2863EBF8341 + BD7F44BA7C46B77949B4754BB2724DAF6E4FAC6A51A96752A66354A45F55A15C + 579E58589C545999505B99505B99516199516699526D9952729953789A547D9A + 54829A55879A558C9A56919A57959A579B9A589F9A58A49A59A89A59AD9A5AB2 + 9A5AB69B5BBA9B5BBF9B5CC39B5CC79B5DCB9B5DCE9B5ED29B5ED69B5FDA9B5F + DD9B60E29B60E59961E99761E99561E99261E99061E98D61E98B61E98861E986 + 60E98360E98160E97E60E97B60E97960E97660E97360E97160E96E60E96B60E9 + 6860E96460E96160E95E5FE95B5FE9585FE9545FE9515FE94E5FE94A5FE9475F + E9435FE9405FE90101010101015A7DED5A7DED5A7DED5A7DED5C81EE5D86EF5F + 8BF0608FF06194F16398F2649CF365A0F466A4F468A8F569ACF66AB0F76BB4F7 + 6CB8F86DBCF96EBFFA6FC3FA70C6FB71CAFC72CEFD73D2FD74D5FE75D8FF76DC + FF76DCFF76DCFF76DCFF76DFFF77E2FF78E5FF79E9FF79ECFF7AF0FF7BF3FF7B + F1FF7BEFFD7BEEF97BECF57CEAF17CE8ED7CE7E97CE5E57CE3E17CE1DD7CE0D9 + 7CDED47CDCD07CDACC7CD8C77CD7C27CD5BF7CD3BA7CD1B57CCFB07CCEAB7CCC + A67CCAA17CC89C7CC6967CC4917CC28B7CC28B7CC28B7CC0857CBE7F7CBC787C + BA727CB86B80B86A84B96A89B9698CB96890BA6894BA6798BB679CBB66A0BB65 + A4BC64A7BC64ACBC63AFBD62B3BD62B6BD61BABE60BDBE5FC1BE5EC4BF5EC8BF + 5DCCC05CCFC05BD2C05AD5C059D9C159DCC158DFC157E2C256E6C255E9C254EC + C353EAC055E9BE56E7BC58E5B959E3B75BE1B45CDFB25DDEB05EDCAD60DAAA61 + D8A862D6A564D4A365D2A066D09D67CE9B68CC9869CA956AC7936BC5906CC38D + 6DC18A6DBE876EBC846FBA8170B77D71B57A72B27772B07473AE7074AB6D75A9 + 6975A96975A96A7AA96B7FA96C84A96D89AA6E8DAA6F91AA6F96AA709AAA719E + AB72A2AB73A6AB74AAAB74AEAB75B2AB76B6AC77B9AC77BDAC78C1AC79C4AC7A + C8AD7BCCAD7BCFAD7CD2AD7DD6AD7DD9AD7EDCAE7FE0AE7FE3AE80E6AE81EAAC + 81EDAA81EDA881EDA681EDA381EDA181ED9F81ED9C81ED9A80ED9880ED9580ED + 9380ED9080ED8E80ED8B80ED8980ED877FED847FED817FED7F7FED7C7FED797F + ED767EED737EED707EED6D7EED6A7EED677EED647DED617DED5E7DED5A7DED01 + 01010101017999F27999F27999F27999F27A9DF27BA0F37DA4F47EA7F47FABF5 + 81AEF582B1F683B4F784B7F785BAF886BDF888C1F989C4F98AC6FA8BC9FB8CCC + FB8DCFFC8ED2FC8FD5FD90D8FE91DBFE92DDFF93E0FF94E3FF94E3FF94E3FF94 + E3FF95E5FF96E8FF97EAFF97EDFF98F0FF99F3FF9AF5FF9AF4FF9AF3FD9AF1FA + 9AF0F79AEFF49AEDF19AECEE9AEAEB9AE9E799E8E499E6E199E5DD99E3DA99E2 + D699E0D399DFCF99DECC98DCC898DBC598D9C198D8BD98D6B998D5B598D3B197 + D2AD97D0A997CFA597CFA597CFA597CDA197CB9D96CA9896C89496C78F99C78F + 9CC78EA0C88EA4C88EA7C88DAAC98DADC98DB0C98CB3C98CB6CA8CB9CA8BBCCA + 8BBFCB8AC2CB8AC5CB8AC8CC89CACC89CDCC89D0CC88D3CD88D6CD87D9CD87DB + CD87DECE86E0CE86E3CE85E6CF85E8CF85EBCF84EECF84F0D083EFCE84EDCC84 + ECC985EAC785E9C586E7C386E6C187E4BF87E3BD87E1BB88E0B988DEB689DCB4 + 89DBB28AD9B08AD7AD8AD6AB8BD4A98BD2A68BD1A48CCFA28CCD9F8CCB9D8DC9 + 9A8DC7988DC6958EC4938EC2908EC08D8FBE8B8FBC888FBA8590BA8590BA8693 + BA8797BB889BBB899FBB8AA2BB8BA6BC8BA9BC8CACBC8DB0BC8EB3BC8FB6BD90 + BABD91BDBD91C0BD92C3BE93C6BE94C9BE95CCBE95CFBF96D2BF97D5BF98D8BF + 99DBBF99DDC09AE0C09BE3C09CE6C09CE8C09DEBC19EEEBF9EF1BD9EF1BB9EF1 + B99EF1B79EF1B59EF1B39EF1B19DF1AF9DF1AD9DF1AB9DF1A99DF1A69DF1A49C + F1A29CF1A09CF19E9CF19B9CF1999CF1979BF2949BF2929BF2909BF28D9BF28B + 9BF2889AF2869AF2839AF2819AF27E9AF27B9AF27999F20101010101019AB5F6 + 9AB5F69AB5F69AB5F69BB7F79CBAF79DBCF79EBEF89FC0F8A0C3F8A1C6F9A2C8 + F9A3CAFAA4CCFAA5CEFBA6D1FBA7D3FBA8D5FCA9D7FCAADAFDABDCFDACDEFDAD + E0FEAEE2FEAFE4FFAFE6FFB0E8FFB1EAFFB1EAFFB1EAFFB1EAFFB2ECFFB3EEFF + B4F0FFB5F2FFB6F4FFB6F6FFB7F8FFB7F7FFB7F6FEB7F5FCB7F4F9B6F3F7B6F2 + F5B6F1F2B6F0F0B6EFEDB6EEEBB6EDE9B5ECE6B5EBE4B5EAE1B5E8DEB5E7DCB5 + E6D9B4E5D7B4E4D4B4E3D1B4E2CFB4E1CCB3E0C9B3DFC7B3DEC4B3DDC1B3DBBE + B3DBBEB3DBBEB2DABBB2D9B8B2D8B5B2D7B2B2D6AFB4D6AFB6D6AFB8D6AFBBD7 + AFBDD7AEBFD7AEC2D7AEC4D8AEC7D8AEC9D8ADCBD8ADCDD8ADCFD9ADD1D9ADD3 + D9ACD6D9ACD8DAACDADAACDCDAABDEDAABE0DAABE2DBABE4DBABE6DBABE9DBAA + EBDCAAEDDCAAEFDCAAF1DCA9F2DCA9F4DDA9F3DBA9F2D9A9F1D8A9F0D6A9EFD4 + A9EED3AAECD1AAEBCFAAEACEAAE9CCAAE8CAAAE6C8AAE5C7AAE4C5AAE3C3AAE1 + C1AAE0C0AADFBEAADEBCABDCBAABDBB8ABDAB6ABD8B5ABD7B3ABD6B1ABD4AFAB + D3ADABD2ABABD0A9ABCFA7ABCDA5ABCCA3ABCCA3ABCCA4AECCA4B1CDA5B3CDA6 + B6CDA7B8CDA8BBCEA9BECEA9C0CEAAC3CEABC5CFACC8CFACCACFADCCCFAECFCF + AED1D0AFD4D0B0D6D0B1D8D0B1DBD0B2DDD1B3DFD1B4E1D1B4E3D1B5E5D2B6E8 + D2B7EAD2B7ECD2B8EED2B9F1D3B9F3D1BAF5CFBAF5CEB9F5CCB9F5CBB9F5C9B9 + F5C7B9F5C6B9F5C4B9F5C2B8F5C1B8F5BFB8F5BDB8F5BBB8F5BAB8F5B8B8F5B6 + B7F5B4B7F6B3B7F6B1B7F6AFB7F6ADB7F6ABB6F6A9B6F6A7B6F6A6B6F6A4B6F6 + A2B6F6A0B5F69EB5F69CB5F69AB5F6010101010101BBCFFABBCFFABBCFFABBCF + FABCD0FABDD2FABDD3FBBED5FBBFD6FBC0D8FBC1DAFCC1DBFCC2DDFCC3DEFCC4 + DFFCC4E1FDC5E2FDC6E3FDC6E5FEC7E6FEC8E8FEC8E9FEC9EAFFCAECFFCAEDFF + CBEEFFCCEFFFCCF1FFCCF1FFCCF1FFCCF1FFCDF3FFCEF4FFCFF5FFCFF7FFD0F8 + FFD1F9FFD1FAFFD1FAFFD1F9FED1F8FDD1F8FBD0F7FAD0F6F8D0F6F6D0F5F5D0 + F4F3D0F4F2D0F3F0CFF2EFCFF2EDCFF1EBCFF0EACFF0E8CFEFE6CFEEE5CEEDE3 + CEEDE1CEECE0CEEBDECEEBDCCEEADACDE9D9CDE8D7CDE8D5CDE8D5CDE8D5CDE7 + D3CDE6D2CDE6D0CCE5CECCE4CCCEE4CCCFE4CCD1E5CCD2E5CCD4E5CCD5E5CCD7 + E5CBD9E5CBDAE6CBDBE6CBDDE6CBDEE6CBE0E6CBE1E6CBE2E6CBE4E7CBE5E7CA + E6E7CAE8E7CAE9E7CAEAE7CAECE7CAEDE7CAEEE8CAF0E8CAF2E8C9F3E8C9F4E8 + C9F6E8C9F7E9C9F8E9C9F7E8C9F7E6C9F6E5C9F5E4C9F4E3C9F3E2C9F3E0C9F2 + DFC8F1DEC8F0DDC8F0DCC8EFDBC8EED9C8EDD8C8ECD7C8EBD6C8EBD4C8EAD3C8 + E9D2C8E8D1C8E7CFC8E6CEC8E6CDC8E5CCC8E4CAC7E3C9C7E2C8C7E1C6C7E0C5 + C7DFC4C7DFC3C7DEC1C7DEC1C7DEC2C9DEC2CADEC3CCDEC3CEDFC4CFDFC5D1DF + C5D3DFC6D5DFC7D7DFC7D8E0C8DAE0C8DBE0C9DDE0C9DEE0CAE0E0CAE2E1CBE3 + E1CCE5E1CCE6E1CDE8E1CDE9E1CEEBE2CEECE2CFEDE2D0F0E2D0F1E2D1F3E2D1 + F4E3D2F5E3D2F7E2D3F8E0D3F8DFD2F9DED2F9DDD2F9DCD2F9DBD2F9D9D2F9D8 + D2F9D7D2F9D6D1F9D5D1F9D3D1F9D2D1F9D1D1F9D0D1F9CFD1F9CDD1F9CCD1F9 + CBD0F9C9D0F9C8D0F9C7D0F9C6D0F9C4D0F9C3D0FAC2D0FAC0CFFABFCFFABECF + FABCCFFABBCFFA010101010101DDE8FDDDE8FDDDE8FDDDE8FDDDE8FDDEE9FDDE + EAFDDEEAFDDFEBFDDFECFDE0ECFEE0EDFEE0EEFEE1EEFEE1EFFEE2F0FEE2F0FE + E2F1FEE3F2FFE3F3FFE4F4FFE4F4FFE4F5FFE5F6FFE5F6FFE6F7FFE6F8FFE6F8 + FFE6F8FFE6F8FFE6F8FFE7F9FFE7FAFFE7FAFFE8FBFFE8FBFFE9FCFFE9FDFFE9 + FCFFE9FCFFE9FCFEE9FBFDE9FBFCE8FBFCE8FAFBE8FAFAE8FAF9E8F9F8E8F9F8 + E8F9F7E8F8F6E8F8F5E8F8F4E8F7F4E7F7F3E7F7F2E7F6F1E7F6F0E7F6F0E7F5 + EFE7F5EEE7F5EDE7F4ECE7F4ECE7F4EBE7F4EBE7F4EBE6F3EAE6F3E9E6F3E8E6 + F2E7E6F2E7E7F2E7E8F2E7E8F2E7E9F2E7EAF2E6EAF2E6EBF2E6ECF2E6ECF3E6 + EDF3E6EEF3E6EEF3E6EFF3E6F0F3E6F0F3E6F2F3E6F2F3E6F3F3E6F4F3E6F4F3 + E6F5F3E6F6F4E6F6F4E6F7F4E6F8F4E5F8F4E5F9F4E5FAF4E5FAF4E5FBF4E5FC + F4E5FBF4E5FBF3E5FBF2E5FAF2E5FAF1E5F9F0E5F9F0E5F8EFE5F8EFE5F8EEE5 + F7EDE5F7EDE4F6ECE4F6EBE4F6EBE4F5EAE4F5EAE4F4E9E4F4E8E4F4E8E4F3E7 + E4F3E6E4F2E6E4F2E5E4F2E4E4F1E4E4F1E3E3F0E3E3F0E2E3EFE1E3EFE1E3EF + E0E3EFE0E3EFE0E4EFE1E5EFE1E5EFE1E6EFE1E7EFE2E8EFE2E9EFE2E9EFE3EA + F0E3EBF0E3ECF0E4EDF0E4EDF0E4EEF0E5EFF0E5F0F0E5F1F0E6F2F0E6F3F1E6 + F3F1E7F4F1E7F5F1E7F6F1E8F7F1E8F7F1E8F8F1E8F9F1E9FAF1E9FAF1E9FBF1 + EAFCF0EAFCF0E9FCEFE9FCEEE9FCEEE9FCEDE9FCECE9FCECE9FCEBE9FCEBE9FC + EAE9FCE9E9FCE9E9FCE8E9FCE7E9FCE7E9FCE6E9FCE5E8FCE5E8FCE4E8FCE4E8 + FDE3E8FDE2E8FDE2E8FDE1E8FDE0E8FDE0E8FDDFE8FDDEE8FDDEE8FDDDE8FD01 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101FF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0000000000000000 + 00000000000000000000000000000000000000000000FF0099FF0099FF0099FF + 0099FF0099FF0099FF0099FF0099FF0099010101FF3399FF3399FF3399FF3399 + FF3399FF3399FF3399FF3399FF3399010101FF6699FF6699FF6699FF6699FF66 + 99FF6699FF6699FF6699FF6699010101FF9999FF9999FF9999FF9999FF9999FF + 9999FF9999FF9999FF9999010101FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99 + FFCC99FFCC99FFCC99010101FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF + 99FFFF99FFFF99010101FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF + 00CCFF00CC010101FF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CC + FF33CC010101FF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66 + CC010101FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CC01 + 0101FFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC010101 + FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCC010101FF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF010101FF33FFFF + 33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FF010101FF66FFFF66FF + FF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FF010101FF99FFFF99FFFF99 + FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FF010101FFCCFFFFCCFFFFCCFFFF + CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF010101FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF010101010101FF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FF00000000000000000000000000000000 + 0000000000000000000000000000FF0099FF0099FF0099FF0099FF0099FF0099 + FF0099FF0099FF0099010101FF3399FF3399FF3399FF3399FF3399FF3399FF33 + 99FF3399FF3399010101FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF + 6699FF6699010101FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999 + FF9999010101FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC + 99010101FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF9901 + 0101FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CC010101 + FF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CC010101FF66 + CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CC010101FF99CCFF + 99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CC010101FFCCCCFFCCCC + FFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC010101FFFFCCFFFFCCFFFF + CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCC010101FF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FF010101FF33FFFF33FFFF33FFFF33FF + FF33FFFF33FFFF33FFFF33FFFF33FF010101FF66FFFF66FFFF66FFFF66FFFF66 + FFFF66FFFF66FFFF66FFFF66FF010101FF99FFFF99FFFF99FFFF99FFFF99FFFF + 99FFFF99FFFF99FFFF99FF010101FFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF + FFCCFFFFCCFFFFCCFF010101FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFF010101010101FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FF000000000000000000000000000000000000000000000000 + 000000000000FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF00 + 99010101FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF339901 + 0101FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699010101 + FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999010101FFCC + 99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99010101FFFF99FF + FF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99010101FF00CCFF00CC + FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CC010101FF33CCFF33CCFF33 + CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CC010101FF66CCFF66CCFF66CCFF + 66CCFF66CCFF66CCFF66CCFF66CCFF66CC010101FF99CCFF99CCFF99CCFF99CC + FF99CCFF99CCFF99CCFF99CCFF99CC010101FFCCCCFFCCCCFFCCCCFFCCCCFFCC + CCFFCCCCFFCCCCFFCCCCFFCCCC010101FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF + FFCCFFFFCCFFFFCCFFFFCC010101FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FF010101FF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33 + FFFF33FFFF33FF010101FF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF + 66FFFF66FF010101FF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FF + FF99FF010101FFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCC + FF010101FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 + 0101010101FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + 000000000000000000000000000000000000000000000000000000000000FF00 + 99FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099010101FF3399FF + 3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399010101FF6699FF6699 + FF6699FF6699FF6699FF6699FF6699FF6699FF6699010101FF9999FF9999FF99 + 99FF9999FF9999FF9999FF9999FF9999FF9999010101FFCC99FFCC99FFCC99FF + CC99FFCC99FFCC99FFCC99FFCC99FFCC99010101FFFF99FFFF99FFFF99FFFF99 + FFFF99FFFF99FFFF99FFFF99FFFF99010101FF00CCFF00CCFF00CCFF00CCFF00 + CCFF00CCFF00CCFF00CCFF00CC010101FF33CCFF33CCFF33CCFF33CCFF33CCFF + 33CCFF33CCFF33CCFF33CC010101FF66CCFF66CCFF66CCFF66CCFF66CCFF66CC + FF66CCFF66CCFF66CC010101FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99 + CCFF99CCFF99CC010101FFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFF + CCCCFFCCCC010101FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCC + FFFFCC010101FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FF010101FF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FF01 + 0101FF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FF010101 + FF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FF010101FFCC + FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF010101FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF010101010101FF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0000000000000000 + 00000000000000000000000000000000000000000000FF0099FF0099FF0099FF + 0099FF0099FF0099FF0099FF0099FF0099010101FF3399FF3399FF3399FF3399 + FF3399FF3399FF3399FF3399FF3399010101FF6699FF6699FF6699FF6699FF66 + 99FF6699FF6699FF6699FF6699010101FF9999FF9999FF9999FF9999FF9999FF + 9999FF9999FF9999FF9999010101FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99 + FFCC99FFCC99FFCC99010101FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF + 99FFFF99FFFF99010101FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF + 00CCFF00CC010101FF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CC + FF33CC010101FF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66 + CC010101FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CC01 + 0101FFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC010101 + FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCC010101FF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF010101FF33FFFF + 33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FF010101FF66FFFF66FF + FF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FF010101FF99FFFF99FFFF99 + FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FF010101FFCCFFFFCCFFFFCCFFFF + CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF010101FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF010101010101FF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FF00000000000000000000000000000000 + 0000000000000000000000000000FF0099FF0099FF0099FF0099FF0099FF0099 + FF0099FF0099FF0099010101FF3399FF3399FF3399FF3399FF3399FF3399FF33 + 99FF3399FF3399010101FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF + 6699FF6699010101FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999 + FF9999010101FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC + 99010101FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF9901 + 0101FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CC010101 + FF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CC010101FF66 + CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CC010101FF99CCFF + 99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CC010101FFCCCCFFCCCC + FFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC010101FFFFCCFFFFCCFFFF + CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCC010101FF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FF010101FF33FFFF33FFFF33FFFF33FF + FF33FFFF33FFFF33FFFF33FFFF33FF010101FF66FFFF66FFFF66FFFF66FFFF66 + FFFF66FFFF66FFFF66FFFF66FF010101FF99FFFF99FFFF99FFFF99FFFF99FFFF + 99FFFF99FFFF99FFFF99FF010101FFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF + FFCCFFFFCCFFFFCCFF010101FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFF010101010101FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FF000000000000000000000000000000000000000000000000 + 000000000000FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF00 + 99010101FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF339901 + 0101FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699010101 + FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999010101FFCC + 99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99010101FFFF99FF + FF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99010101FF00CCFF00CC + FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CC010101FF33CCFF33CCFF33 + CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CC010101FF66CCFF66CCFF66CCFF + 66CCFF66CCFF66CCFF66CCFF66CCFF66CC010101FF99CCFF99CCFF99CCFF99CC + FF99CCFF99CCFF99CCFF99CCFF99CC010101FFCCCCFFCCCCFFCCCCFFCCCCFFCC + CCFFCCCCFFCCCCFFCCCCFFCCCC010101FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF + FFCCFFFFCCFFFFCCFFFFCC010101FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FF010101FF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33 + FFFF33FFFF33FF010101FF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF + 66FFFF66FF010101FF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FF + FF99FF010101FFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCC + FF010101FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 + 0101010101FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + 000000000000000000000000000000000000000000000000000000000000FF00 + 99FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099010101FF3399FF + 3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399010101FF6699FF6699 + FF6699FF6699FF6699FF6699FF6699FF6699FF6699010101FF9999FF9999FF99 + 99FF9999FF9999FF9999FF9999FF9999FF9999010101FFCC99FFCC99FFCC99FF + CC99FFCC99FFCC99FFCC99FFCC99FFCC99010101FFFF99FFFF99FFFF99FFFF99 + FFFF99FFFF99FFFF99FFFF99FFFF99010101FF00CCFF00CCFF00CCFF00CCFF00 + CCFF00CCFF00CCFF00CCFF00CC010101FF33CCFF33CCFF33CCFF33CCFF33CCFF + 33CCFF33CCFF33CCFF33CC010101FF66CCFF66CCFF66CCFF66CCFF66CCFF66CC + FF66CCFF66CCFF66CC010101FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99 + CCFF99CCFF99CC010101FFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFF + CCCCFFCCCC010101FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCC + FFFFCC010101FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FF010101FF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FF01 + 0101FF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FF010101 + FF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FF010101FFCC + FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF010101FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF010101010101FF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0000000000000000 + 00000000000000000000000000000000000000000000FF0099FF0099FF0099FF + 0099FF0099FF0099FF0099FF0099FF0099010101FF3399FF3399FF3399FF3399 + FF3399FF3399FF3399FF3399FF3399010101FF6699FF6699FF6699FF6699FF66 + 99FF6699FF6699FF6699FF6699010101FF9999FF9999FF9999FF9999FF9999FF + 9999FF9999FF9999FF9999010101FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99 + FFCC99FFCC99FFCC99010101FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF + 99FFFF99FFFF99010101FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF + 00CCFF00CC010101FF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CC + FF33CC010101FF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66 + CC010101FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CC01 + 0101FFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC010101 + FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCC010101FF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF010101FF33FFFF + 33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FF010101FF66FFFF66FF + FF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FF010101FF99FFFF99FFFF99 + FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FF010101FFCCFFFFCCFFFFCCFFFF + CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF010101FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0101010101010101010101010101010101 + 0101010101010101010101010101010100000000000000000000000000000000 + 0000000000000000000000000000010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 01010101010101010101010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00000000000000000000000000000000000000000000000000 + 000000000000CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC00 + 99010101CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC339901 + 0101CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699010101 + CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999010101CCCC + 99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99010101CCFF99CC + FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99010101CC00CCCC00CC + CC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CC010101CC33CCCC33CCCC33 + CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CC010101CC66CCCC66CCCC66CCCC + 66CCCC66CCCC66CCCC66CCCC66CCCC66CC010101CC99CCCC99CCCC99CCCC99CC + CC99CCCC99CCCC99CCCC99CCCC99CC010101CCCCCCCCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCCCCCCCCCCCCCCC010101CCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC + FFCCCCFFCCCCFFCCCCFFCC010101CC00FFCC00FFCC00FFCC00FFCC00FFCC00FF + CC00FFCC00FFCC00FF010101CC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33 + FFCC33FFCC33FF010101CC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC + 66FFCC66FF010101CC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FF + CC99FF010101CCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC + FF010101CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFF01 + 0101010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + 000000000000000000000000000000000000000000000000000000000000CC00 + 99CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099010101CC3399CC + 3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399010101CC6699CC6699 + CC6699CC6699CC6699CC6699CC6699CC6699CC6699010101CC9999CC9999CC99 + 99CC9999CC9999CC9999CC9999CC9999CC9999010101CCCC99CCCC99CCCC99CC + CC99CCCC99CCCC99CCCC99CCCC99CCCC99010101CCFF99CCFF99CCFF99CCFF99 + CCFF99CCFF99CCFF99CCFF99CCFF99010101CC00CCCC00CCCC00CCCC00CCCC00 + CCCC00CCCC00CCCC00CCCC00CC010101CC33CCCC33CCCC33CCCC33CCCC33CCCC + 33CCCC33CCCC33CCCC33CC010101CC66CCCC66CCCC66CCCC66CCCC66CCCC66CC + CC66CCCC66CCCC66CC010101CC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99 + CCCC99CCCC99CC010101CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCC010101CCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCC + CCFFCC010101CC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00 + FF010101CC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FF01 + 0101CC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FF010101 + CC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FF010101CCCC + FFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFF010101CCFFFFCC + FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFF010101010101FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF000000000000000000 + 00000000000000000000000000000000000000000000CC0099CC0099CC0099CC + 0099CC0099CC0099CC0099CC0099CC0099010101CC3399CC3399CC3399CC3399 + CC3399CC3399CC3399CC3399CC3399010101CC6699CC6699CC6699CC6699CC66 + 99CC6699CC6699CC6699CC6699010101CC9999CC9999CC9999CC9999CC9999CC + 9999CC9999CC9999CC9999010101CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99 + CCCC99CCCC99CCCC99010101CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF + 99CCFF99CCFF99010101CC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC + 00CCCC00CC010101CC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CC + CC33CC010101CC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66 + CC010101CC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CC01 + 0101CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC010101 + CCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCC010101CC00 + FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FF010101CC33FFCC + 33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FF010101CC66FFCC66FF + CC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FF010101CC99FFCC99FFCC99 + FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FF010101CCCCFFCCCCFFCCCCFFCC + CCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFF010101CCFFFFCCFFFFCCFFFFCCFFFF + CCFFFFCCFFFFCCFFFFCCFFFFCCFFFF010101010101FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF0000000000000000000000000000000000 + 0000000000000000000000000000CC0099CC0099CC0099CC0099CC0099CC0099 + CC0099CC0099CC0099010101CC3399CC3399CC3399CC3399CC3399CC3399CC33 + 99CC3399CC3399010101CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC + 6699CC6699010101CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999 + CC9999010101CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC + 99010101CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF9901 + 0101CC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CC010101 + CC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CC010101CC66 + CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CC010101CC99CCCC + 99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CC010101CCCCCCCCCCCC + CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC010101CCFFCCCCFFCCCCFF + CCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCC010101CC00FFCC00FFCC00FFCC + 00FFCC00FFCC00FFCC00FFCC00FFCC00FF010101CC33FFCC33FFCC33FFCC33FF + CC33FFCC33FFCC33FFCC33FFCC33FF010101CC66FFCC66FFCC66FFCC66FFCC66 + FFCC66FFCC66FFCC66FFCC66FF010101CC99FFCC99FFCC99FFCC99FFCC99FFCC + 99FFCC99FFCC99FFCC99FF010101CCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFF + CCCCFFCCCCFFCCCCFF010101CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF + FFCCFFFFCCFFFF010101010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00000000000000000000000000000000000000000000000000 + 000000000000CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC00 + 99010101CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC339901 + 0101CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699010101 + CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999010101CCCC + 99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99010101CCFF99CC + FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99010101CC00CCCC00CC + CC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CC010101CC33CCCC33CCCC33 + CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CC010101CC66CCCC66CCCC66CCCC + 66CCCC66CCCC66CCCC66CCCC66CCCC66CC010101CC99CCCC99CCCC99CCCC99CC + CC99CCCC99CCCC99CCCC99CCCC99CC010101CCCCCCCCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCCCCCCCCCCCCCCC010101CCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC + FFCCCCFFCCCCFFCCCCFFCC010101CC00FFCC00FFCC00FFCC00FFCC00FFCC00FF + CC00FFCC00FFCC00FF010101CC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33 + FFCC33FFCC33FF010101CC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC + 66FFCC66FF010101CC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FF + CC99FF010101CCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC + FF010101CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFF01 + 0101010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + 000000000000000000000000000000000000000000000000000000000000CC00 + 99CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099010101CC3399CC + 3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399010101CC6699CC6699 + CC6699CC6699CC6699CC6699CC6699CC6699CC6699010101CC9999CC9999CC99 + 99CC9999CC9999CC9999CC9999CC9999CC9999010101CCCC99CCCC99CCCC99CC + CC99CCCC99CCCC99CCCC99CCCC99CCCC99010101CCFF99CCFF99CCFF99CCFF99 + CCFF99CCFF99CCFF99CCFF99CCFF99010101CC00CCCC00CCCC00CCCC00CCCC00 + CCCC00CCCC00CCCC00CCCC00CC010101CC33CCCC33CCCC33CCCC33CCCC33CCCC + 33CCCC33CCCC33CCCC33CC010101CC66CCCC66CCCC66CCCC66CCCC66CCCC66CC + CC66CCCC66CCCC66CC010101CC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99 + CCCC99CCCC99CC010101CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCC010101CCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCC + CCFFCC010101CC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00 + FF010101CC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FF01 + 0101CC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FF010101 + CC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FF010101CCCC + FFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFF010101CCFFFFCC + FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFF010101010101FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF000000000000000000 + 00000000000000000000000000000000000000000000CC0099CC0099CC0099CC + 0099CC0099CC0099CC0099CC0099CC0099010101CC3399CC3399CC3399CC3399 + CC3399CC3399CC3399CC3399CC3399010101CC6699CC6699CC6699CC6699CC66 + 99CC6699CC6699CC6699CC6699010101CC9999CC9999CC9999CC9999CC9999CC + 9999CC9999CC9999CC9999010101CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99 + CCCC99CCCC99CCCC99010101CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF + 99CCFF99CCFF99010101CC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC + 00CCCC00CC010101CC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CC + CC33CC010101CC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66 + CC010101CC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CC01 + 0101CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC010101 + CCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCC010101CC00 + FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FF010101CC33FFCC + 33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FF010101CC66FFCC66FF + CC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FF010101CC99FFCC99FFCC99 + FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FF010101CCCCFFCCCCFFCCCCFFCC + CCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFF010101CCFFFFCCFFFFCCFFFFCCFFFF + CCFFFFCCFFFFCCFFFFCCFFFFCCFFFF010101010101FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF0000000000000000000000000000000000 + 0000000000000000000000000000CC0099CC0099CC0099CC0099CC0099CC0099 + CC0099CC0099CC0099010101CC3399CC3399CC3399CC3399CC3399CC3399CC33 + 99CC3399CC3399010101CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC + 6699CC6699010101CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999 + CC9999010101CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC + 99010101CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF9901 + 0101CC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CC010101 + CC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CC010101CC66 + CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CC010101CC99CCCC + 99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CC010101CCCCCCCCCCCC + CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC010101CCFFCCCCFFCCCCFF + CCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCC010101CC00FFCC00FFCC00FFCC + 00FFCC00FFCC00FFCC00FFCC00FFCC00FF010101CC33FFCC33FFCC33FFCC33FF + CC33FFCC33FFCC33FFCC33FFCC33FF010101CC66FFCC66FFCC66FFCC66FFCC66 + FFCC66FFCC66FFCC66FFCC66FF010101CC99FFCC99FFCC99FFCC99FFCC99FFCC + 99FFCC99FFCC99FFCC99FF010101CCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFF + CCCCFFCCCCFFCCCCFF010101CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF + FFCCFFFFCCFFFF010101010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00000000000000000000000000000000000000000000000000 + 000000000000CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC00 + 99010101CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC339901 + 0101CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699010101 + CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999010101CCCC + 99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99010101CCFF99CC + FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99010101CC00CCCC00CC + CC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CC010101CC33CCCC33CCCC33 + CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CC010101CC66CCCC66CCCC66CCCC + 66CCCC66CCCC66CCCC66CCCC66CCCC66CC010101CC99CCCC99CCCC99CCCC99CC + CC99CCCC99CCCC99CCCC99CCCC99CC010101CCCCCCCCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCCCCCCCCCCCCCCC010101CCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC + FFCCCCFFCCCCFFCCCCFFCC010101CC00FFCC00FFCC00FFCC00FFCC00FFCC00FF + CC00FFCC00FFCC00FF010101CC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33 + FFCC33FFCC33FF010101CC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC + 66FFCC66FF010101CC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FF + CC99FF010101CCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC + FF010101CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFF01 + 0101010101010101010101010101010101010101010101010101010101010101 + 0000000000000000000000000000000000000000000000000000000000000101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 010101010101010101010101010101010101010101010101010101010100FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF0000000000000000 + 0000000000000000000000000000000000000000000099009999009999009999 + 0099990099990099990099990099990099010101993399993399993399993399 + 9933999933999933999933999933990101019966999966999966999966999966 + 9999669999669999669999669901010199999999999999999999999999999999 + 999999999999999999999901010199CC9999CC9999CC9999CC9999CC9999CC99 + 99CC9999CC9999CC9901010199FF9999FF9999FF9999FF9999FF9999FF9999FF + 9999FF9999FF990101019900CC9900CC9900CC9900CC9900CC9900CC9900CC99 + 00CC9900CC0101019933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC + 9933CC0101019966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966 + CC0101019999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC01 + 010199CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC010101 + 99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC0101019900 + FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF0101019933FF99 + 33FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF0101019966FF9966FF + 9966FF9966FF9966FF9966FF9966FF9966FF9966FF0101019999FF9999FF9999 + FF9999FF9999FF9999FF9999FF9999FF9999FF01010199CCFF99CCFF99CCFF99 + CCFF99CCFF99CCFF99CCFF99CCFF99CCFF01010199FFFF99FFFF99FFFF99FFFF + 99FFFF99FFFF99FFFF99FFFF99FFFF01010101010100FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00000000000000000000000000000000 + 0000000000000000000000000000990099990099990099990099990099990099 + 9900999900999900990101019933999933999933999933999933999933999933 + 9999339999339901010199669999669999669999669999669999669999669999 + 6699996699010101999999999999999999999999999999999999999999999999 + 99999901010199CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC + 9901010199FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9901 + 01019900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC010101 + 9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC0101019966 + CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC0101019999CC99 + 99CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC01010199CCCC99CCCC + 99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC01010199FFCC99FFCC99FF + CC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC0101019900FF9900FF9900FF99 + 00FF9900FF9900FF9900FF9900FF9900FF0101019933FF9933FF9933FF9933FF + 9933FF9933FF9933FF9933FF9933FF0101019966FF9966FF9966FF9966FF9966 + FF9966FF9966FF9966FF9966FF0101019999FF9999FF9999FF9999FF9999FF99 + 99FF9999FF9999FF9999FF01010199CCFF99CCFF99CCFF99CCFF99CCFF99CCFF + 99CCFF99CCFF99CCFF01010199FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FF + FF99FFFF99FFFF01010101010100FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF000000000000000000000000000000000000000000000000 + 0000000000009900999900999900999900999900999900999900999900999900 + 9901010199339999339999339999339999339999339999339999339999339901 + 0101996699996699996699996699996699996699996699996699996699010101 + 99999999999999999999999999999999999999999999999999999901010199CC + 9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9901010199FF9999 + FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF990101019900CC9900CC + 9900CC9900CC9900CC9900CC9900CC9900CC9900CC0101019933CC9933CC9933 + CC9933CC9933CC9933CC9933CC9933CC9933CC0101019966CC9966CC9966CC99 + 66CC9966CC9966CC9966CC9966CC9966CC0101019999CC9999CC9999CC9999CC + 9999CC9999CC9999CC9999CC9999CC01010199CCCC99CCCC99CCCC99CCCC99CC + CC99CCCC99CCCC99CCCC99CCCC01010199FFCC99FFCC99FFCC99FFCC99FFCC99 + FFCC99FFCC99FFCC99FFCC0101019900FF9900FF9900FF9900FF9900FF9900FF + 9900FF9900FF9900FF0101019933FF9933FF9933FF9933FF9933FF9933FF9933 + FF9933FF9933FF0101019966FF9966FF9966FF9966FF9966FF9966FF9966FF99 + 66FF9966FF0101019999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF + 9999FF01010199CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CC + FF01010199FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF01 + 010101010100FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 0000000000000000000000000000000000000000000000000000000000009900 + 9999009999009999009999009999009999009999009999009901010199339999 + 3399993399993399993399993399993399993399993399010101996699996699 + 9966999966999966999966999966999966999966990101019999999999999999 + 9999999999999999999999999999999999999901010199CC9999CC9999CC9999 + CC9999CC9999CC9999CC9999CC9999CC9901010199FF9999FF9999FF9999FF99 + 99FF9999FF9999FF9999FF9999FF990101019900CC9900CC9900CC9900CC9900 + CC9900CC9900CC9900CC9900CC0101019933CC9933CC9933CC9933CC9933CC99 + 33CC9933CC9933CC9933CC0101019966CC9966CC9966CC9966CC9966CC9966CC + 9966CC9966CC9966CC0101019999CC9999CC9999CC9999CC9999CC9999CC9999 + CC9999CC9999CC01010199CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99 + CCCC99CCCC01010199FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC + 99FFCC0101019900FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900 + FF0101019933FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF01 + 01019966FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF010101 + 9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF01010199CC + FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF01010199FFFF99 + FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF01010101010100FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF0000000000000000 + 0000000000000000000000000000000000000000000099009999009999009999 + 0099990099990099990099990099990099010101993399993399993399993399 + 9933999933999933999933999933990101019966999966999966999966999966 + 9999669999669999669999669901010199999999999999999999999999999999 + 999999999999999999999901010199CC9999CC9999CC9999CC9999CC9999CC99 + 99CC9999CC9999CC9901010199FF9999FF9999FF9999FF9999FF9999FF9999FF + 9999FF9999FF990101019900CC9900CC9900CC9900CC9900CC9900CC9900CC99 + 00CC9900CC0101019933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC + 9933CC0101019966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966 + CC0101019999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC01 + 010199CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC010101 + 99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC0101019900 + FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF0101019933FF99 + 33FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF0101019966FF9966FF + 9966FF9966FF9966FF9966FF9966FF9966FF9966FF0101019999FF9999FF9999 + FF9999FF9999FF9999FF9999FF9999FF9999FF01010199CCFF99CCFF99CCFF99 + CCFF99CCFF99CCFF99CCFF99CCFF99CCFF01010199FFFF99FFFF99FFFF99FFFF + 99FFFF99FFFF99FFFF99FFFF99FFFF01010101010100FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00000000000000000000000000000000 + 0000000000000000000000000000990099990099990099990099990099990099 + 9900999900999900990101019933999933999933999933999933999933999933 + 9999339999339901010199669999669999669999669999669999669999669999 + 6699996699010101999999999999999999999999999999999999999999999999 + 99999901010199CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC + 9901010199FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9901 + 01019900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC010101 + 9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC0101019966 + CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC0101019999CC99 + 99CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC01010199CCCC99CCCC + 99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC01010199FFCC99FFCC99FF + CC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC0101019900FF9900FF9900FF99 + 00FF9900FF9900FF9900FF9900FF9900FF0101019933FF9933FF9933FF9933FF + 9933FF9933FF9933FF9933FF9933FF0101019966FF9966FF9966FF9966FF9966 + FF9966FF9966FF9966FF9966FF0101019999FF9999FF9999FF9999FF9999FF99 + 99FF9999FF9999FF9999FF01010199CCFF99CCFF99CCFF99CCFF99CCFF99CCFF + 99CCFF99CCFF99CCFF01010199FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FF + FF99FFFF99FFFF01010101010100FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF000000000000000000000000000000000000000000000000 + 0000000000009900999900999900999900999900999900999900999900999900 + 9901010199339999339999339999339999339999339999339999339999339901 + 0101996699996699996699996699996699996699996699996699996699010101 + 99999999999999999999999999999999999999999999999999999901010199CC + 9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9901010199FF9999 + FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF990101019900CC9900CC + 9900CC9900CC9900CC9900CC9900CC9900CC9900CC0101019933CC9933CC9933 + CC9933CC9933CC9933CC9933CC9933CC9933CC0101019966CC9966CC9966CC99 + 66CC9966CC9966CC9966CC9966CC9966CC0101019999CC9999CC9999CC9999CC + 9999CC9999CC9999CC9999CC9999CC01010199CCCC99CCCC99CCCC99CCCC99CC + CC99CCCC99CCCC99CCCC99CCCC01010199FFCC99FFCC99FFCC99FFCC99FFCC99 + FFCC99FFCC99FFCC99FFCC0101019900FF9900FF9900FF9900FF9900FF9900FF + 9900FF9900FF9900FF0101019933FF9933FF9933FF9933FF9933FF9933FF9933 + FF9933FF9933FF0101019966FF9966FF9966FF9966FF9966FF9966FF9966FF99 + 66FF9966FF0101019999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF + 9999FF01010199CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CC + FF01010199FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF01 + 010101010100FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 0000000000000000000000000000000000000000000000000000000000009900 + 9999009999009999009999009999009999009999009999009901010199339999 + 3399993399993399993399993399993399993399993399010101996699996699 + 9966999966999966999966999966999966999966990101019999999999999999 + 9999999999999999999999999999999999999901010199CC9999CC9999CC9999 + CC9999CC9999CC9999CC9999CC9999CC9901010199FF9999FF9999FF9999FF99 + 99FF9999FF9999FF9999FF9999FF990101019900CC9900CC9900CC9900CC9900 + CC9900CC9900CC9900CC9900CC0101019933CC9933CC9933CC9933CC9933CC99 + 33CC9933CC9933CC9933CC0101019966CC9966CC9966CC9966CC9966CC9966CC + 9966CC9966CC9966CC0101019999CC9999CC9999CC9999CC9999CC9999CC9999 + CC9999CC9999CC01010199CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99 + CCCC99CCCC01010199FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC + 99FFCC0101019900FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900 + FF0101019933FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF01 + 01019966FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF010101 + 9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF01010199CC + FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF01010199FFFF99 + FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF01010101010100FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF0000000000000000 + 0000000000000000000000000000000000000000000099009999009999009999 + 0099990099990099990099990099990099010101993399993399993399993399 + 9933999933999933999933999933990101019966999966999966999966999966 + 9999669999669999669999669901010199999999999999999999999999999999 + 999999999999999999999901010199CC9999CC9999CC9999CC9999CC9999CC99 + 99CC9999CC9999CC9901010199FF9999FF9999FF9999FF9999FF9999FF9999FF + 9999FF9999FF990101019900CC9900CC9900CC9900CC9900CC9900CC9900CC99 + 00CC9900CC0101019933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC + 9933CC0101019966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966 + CC0101019999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC01 + 010199CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC010101 + 99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC0101019900 + FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF0101019933FF99 + 33FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF0101019966FF9966FF + 9966FF9966FF9966FF9966FF9966FF9966FF9966FF0101019999FF9999FF9999 + FF9999FF9999FF9999FF9999FF9999FF9999FF01010199CCFF99CCFF99CCFF99 + CCFF99CCFF99CCFF99CCFF99CCFF99CCFF01010199FFFF99FFFF99FFFF99FFFF + 99FFFF99FFFF99FFFF99FFFF99FFFF0101010101010101010101010101010101 + 0101010101010101010101010101010100000000000000000000000000000000 + 0000000000000000000000000000010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 01010101010101010101010101FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000000000000000000000000000000000000000000000000000 + 0000000000006600996600996600996600996600996600996600996600996600 + 9901010166339966339966339966339966339966339966339966339966339901 + 0101666699666699666699666699666699666699666699666699666699010101 + 66999966999966999966999966999966999966999966999966999901010166CC + 9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9901010166FF9966 + FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF990101016600CC6600CC + 6600CC6600CC6600CC6600CC6600CC6600CC6600CC0101016633CC6633CC6633 + CC6633CC6633CC6633CC6633CC6633CC6633CC0101016666CC6666CC6666CC66 + 66CC6666CC6666CC6666CC6666CC6666CC0101016699CC6699CC6699CC6699CC + 6699CC6699CC6699CC6699CC6699CC01010166CCCC66CCCC66CCCC66CCCC66CC + CC66CCCC66CCCC66CCCC66CCCC01010166FFCC66FFCC66FFCC66FFCC66FFCC66 + FFCC66FFCC66FFCC66FFCC0101016600FF6600FF6600FF6600FF6600FF6600FF + 6600FF6600FF6600FF0101016633FF6633FF6633FF6633FF6633FF6633FF6633 + FF6633FF6633FF0101016666FF6666FF6666FF6666FF6666FF6666FF6666FF66 + 66FF6666FF0101016699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF + 6699FF01010166CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CC + FF01010166FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF01 + 0101010101FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + 0000000000000000000000000000000000000000000000000000000000006600 + 9966009966009966009966009966009966009966009966009901010166339966 + 3399663399663399663399663399663399663399663399010101666699666699 + 6666996666996666996666996666996666996666990101016699996699996699 + 9966999966999966999966999966999966999901010166CC9966CC9966CC9966 + CC9966CC9966CC9966CC9966CC9966CC9901010166FF9966FF9966FF9966FF99 + 66FF9966FF9966FF9966FF9966FF990101016600CC6600CC6600CC6600CC6600 + CC6600CC6600CC6600CC6600CC0101016633CC6633CC6633CC6633CC6633CC66 + 33CC6633CC6633CC6633CC0101016666CC6666CC6666CC6666CC6666CC6666CC + 6666CC6666CC6666CC0101016699CC6699CC6699CC6699CC6699CC6699CC6699 + CC6699CC6699CC01010166CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66 + CCCC66CCCC01010166FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC + 66FFCC0101016600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600 + FF0101016633FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF01 + 01016666FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF010101 + 6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF01010166CC + FF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF01010166FFFF66 + FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF010101010101FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00000000000000000000 + 0000000000000000000000000000000000000000000066009966009966009966 + 0099660099660099660099660099660099010101663399663399663399663399 + 6633996633996633996633996633990101016666996666996666996666996666 + 9966669966669966669966669901010166999966999966999966999966999966 + 999966999966999966999901010166CC9966CC9966CC9966CC9966CC9966CC99 + 66CC9966CC9966CC9901010166FF9966FF9966FF9966FF9966FF9966FF9966FF + 9966FF9966FF990101016600CC6600CC6600CC6600CC6600CC6600CC6600CC66 + 00CC6600CC0101016633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC + 6633CC0101016666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666 + CC0101016699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC01 + 010166CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC010101 + 66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC0101016600 + FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF0101016633FF66 + 33FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF0101016666FF6666FF + 6666FF6666FF6666FF6666FF6666FF6666FF6666FF0101016699FF6699FF6699 + FF6699FF6699FF6699FF6699FF6699FF6699FF01010166CCFF66CCFF66CCFF66 + CCFF66CCFF66CCFF66CCFF66CCFF66CCFF01010166FFFF66FFFF66FFFF66FFFF + 66FFFF66FFFF66FFFF66FFFF66FFFF010101010101FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF000000000000000000000000000000000000 + 0000000000000000000000000000660099660099660099660099660099660099 + 6600996600996600990101016633996633996633996633996633996633996633 + 9966339966339901010166669966669966669966669966669966669966669966 + 6699666699010101669999669999669999669999669999669999669999669999 + 66999901010166CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC + 9901010166FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9901 + 01016600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC010101 + 6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC0101016666 + CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC0101016699CC66 + 99CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC01010166CCCC66CCCC + 66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC01010166FFCC66FFCC66FF + CC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC0101016600FF6600FF6600FF66 + 00FF6600FF6600FF6600FF6600FF6600FF0101016633FF6633FF6633FF6633FF + 6633FF6633FF6633FF6633FF6633FF0101016666FF6666FF6666FF6666FF6666 + FF6666FF6666FF6666FF6666FF0101016699FF6699FF6699FF6699FF6699FF66 + 99FF6699FF6699FF6699FF01010166CCFF66CCFF66CCFF66CCFF66CCFF66CCFF + 66CCFF66CCFF66CCFF01010166FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FF + FF66FFFF66FFFF010101010101FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000000000000000000000000000000000000000000000000000 + 0000000000006600996600996600996600996600996600996600996600996600 + 9901010166339966339966339966339966339966339966339966339966339901 + 0101666699666699666699666699666699666699666699666699666699010101 + 66999966999966999966999966999966999966999966999966999901010166CC + 9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9901010166FF9966 + FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF990101016600CC6600CC + 6600CC6600CC6600CC6600CC6600CC6600CC6600CC0101016633CC6633CC6633 + CC6633CC6633CC6633CC6633CC6633CC6633CC0101016666CC6666CC6666CC66 + 66CC6666CC6666CC6666CC6666CC6666CC0101016699CC6699CC6699CC6699CC + 6699CC6699CC6699CC6699CC6699CC01010166CCCC66CCCC66CCCC66CCCC66CC + CC66CCCC66CCCC66CCCC66CCCC01010166FFCC66FFCC66FFCC66FFCC66FFCC66 + FFCC66FFCC66FFCC66FFCC0101016600FF6600FF6600FF6600FF6600FF6600FF + 6600FF6600FF6600FF0101016633FF6633FF6633FF6633FF6633FF6633FF6633 + FF6633FF6633FF0101016666FF6666FF6666FF6666FF6666FF6666FF6666FF66 + 66FF6666FF0101016699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF + 6699FF01010166CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CC + FF01010166FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF01 + 0101010101FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + 0000000000000000000000000000000000000000000000000000000000006600 + 9966009966009966009966009966009966009966009966009901010166339966 + 3399663399663399663399663399663399663399663399010101666699666699 + 6666996666996666996666996666996666996666990101016699996699996699 + 9966999966999966999966999966999966999901010166CC9966CC9966CC9966 + CC9966CC9966CC9966CC9966CC9966CC9901010166FF9966FF9966FF9966FF99 + 66FF9966FF9966FF9966FF9966FF990101016600CC6600CC6600CC6600CC6600 + CC6600CC6600CC6600CC6600CC0101016633CC6633CC6633CC6633CC6633CC66 + 33CC6633CC6633CC6633CC0101016666CC6666CC6666CC6666CC6666CC6666CC + 6666CC6666CC6666CC0101016699CC6699CC6699CC6699CC6699CC6699CC6699 + CC6699CC6699CC01010166CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66 + CCCC66CCCC01010166FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC + 66FFCC0101016600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600 + FF0101016633FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF01 + 01016666FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF010101 + 6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF01010166CC + FF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF01010166FFFF66 + FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF010101010101FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00000000000000000000 + 0000000000000000000000000000000000000000000066009966009966009966 + 0099660099660099660099660099660099010101663399663399663399663399 + 6633996633996633996633996633990101016666996666996666996666996666 + 9966669966669966669966669901010166999966999966999966999966999966 + 999966999966999966999901010166CC9966CC9966CC9966CC9966CC9966CC99 + 66CC9966CC9966CC9901010166FF9966FF9966FF9966FF9966FF9966FF9966FF + 9966FF9966FF990101016600CC6600CC6600CC6600CC6600CC6600CC6600CC66 + 00CC6600CC0101016633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC + 6633CC0101016666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666 + CC0101016699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC01 + 010166CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC010101 + 66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC0101016600 + FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF0101016633FF66 + 33FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF0101016666FF6666FF + 6666FF6666FF6666FF6666FF6666FF6666FF6666FF0101016699FF6699FF6699 + FF6699FF6699FF6699FF6699FF6699FF6699FF01010166CCFF66CCFF66CCFF66 + CCFF66CCFF66CCFF66CCFF66CCFF66CCFF01010166FFFF66FFFF66FFFF66FFFF + 66FFFF66FFFF66FFFF66FFFF66FFFF010101010101FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF000000000000000000000000000000000000 + 0000000000000000000000000000660099660099660099660099660099660099 + 6600996600996600990101016633996633996633996633996633996633996633 + 9966339966339901010166669966669966669966669966669966669966669966 + 6699666699010101669999669999669999669999669999669999669999669999 + 66999901010166CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC + 9901010166FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9901 + 01016600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC010101 + 6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC0101016666 + CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC0101016699CC66 + 99CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC01010166CCCC66CCCC + 66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC01010166FFCC66FFCC66FF + CC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC0101016600FF6600FF6600FF66 + 00FF6600FF6600FF6600FF6600FF6600FF0101016633FF6633FF6633FF6633FF + 6633FF6633FF6633FF6633FF6633FF0101016666FF6666FF6666FF6666FF6666 + FF6666FF6666FF6666FF6666FF0101016699FF6699FF6699FF6699FF6699FF66 + 99FF6699FF6699FF6699FF01010166CCFF66CCFF66CCFF66CCFF66CCFF66CCFF + 66CCFF66CCFF66CCFF01010166FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FF + FF66FFFF66FFFF010101010101FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000000000000000000000000000000000000000000000000000 + 0000000000006600996600996600996600996600996600996600996600996600 + 9901010166339966339966339966339966339966339966339966339966339901 + 0101666699666699666699666699666699666699666699666699666699010101 + 66999966999966999966999966999966999966999966999966999901010166CC + 9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9901010166FF9966 + FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF990101016600CC6600CC + 6600CC6600CC6600CC6600CC6600CC6600CC6600CC0101016633CC6633CC6633 + CC6633CC6633CC6633CC6633CC6633CC6633CC0101016666CC6666CC6666CC66 + 66CC6666CC6666CC6666CC6666CC6666CC0101016699CC6699CC6699CC6699CC + 6699CC6699CC6699CC6699CC6699CC01010166CCCC66CCCC66CCCC66CCCC66CC + CC66CCCC66CCCC66CCCC66CCCC01010166FFCC66FFCC66FFCC66FFCC66FFCC66 + FFCC66FFCC66FFCC66FFCC0101016600FF6600FF6600FF6600FF6600FF6600FF + 6600FF6600FF6600FF0101016633FF6633FF6633FF6633FF6633FF6633FF6633 + FF6633FF6633FF0101016666FF6666FF6666FF6666FF6666FF6666FF6666FF66 + 66FF6666FF0101016699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF + 6699FF01010166CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CC + FF01010166FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF01 + 0101010101010101010101010101010101010101010101010101010101010101 + 0000000000000000000000000000000000000000000000000000000000000101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 010101010101010101010101010101010101010101010101010101010100FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF000000000000000000 + 0000000000000000000000000000000000000000000033009933009933009933 + 0099330099330099330099330099330099010101333399333399333399333399 + 3333993333993333993333993333990101013366993366993366993366993366 + 9933669933669933669933669901010133999933999933999933999933999933 + 999933999933999933999901010133CC9933CC9933CC9933CC9933CC9933CC99 + 33CC9933CC9933CC9901010133FF9933FF9933FF9933FF9933FF9933FF9933FF + 9933FF9933FF990101013300CC3300CC3300CC3300CC3300CC3300CC3300CC33 + 00CC3300CC0101013333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC + 3333CC0101013366CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366 + CC0101013399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC01 + 010133CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC010101 + 33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC0101013300 + FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF0101013333FF33 + 33FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF0101013366FF3366FF + 3366FF3366FF3366FF3366FF3366FF3366FF3366FF0101013399FF3399FF3399 + FF3399FF3399FF3399FF3399FF3399FF3399FF01010133CCFF33CCFF33CCFF33 + CCFF33CCFF33CCFF33CCFF33CCFF33CCFF01010133FFFF33FFFF33FFFF33FFFF + 33FFFF33FFFF33FFFF33FFFF33FFFF01010101010100FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000000000000000000000000000000000 + 0000000000000000000000000000330099330099330099330099330099330099 + 3300993300993300990101013333993333993333993333993333993333993333 + 9933339933339901010133669933669933669933669933669933669933669933 + 6699336699010101339999339999339999339999339999339999339999339999 + 33999901010133CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC + 9901010133FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF9901 + 01013300CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC010101 + 3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC0101013366 + CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC0101013399CC33 + 99CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC01010133CCCC33CCCC + 33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC01010133FFCC33FFCC33FF + CC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC0101013300FF3300FF3300FF33 + 00FF3300FF3300FF3300FF3300FF3300FF0101013333FF3333FF3333FF3333FF + 3333FF3333FF3333FF3333FF3333FF0101013366FF3366FF3366FF3366FF3366 + FF3366FF3366FF3366FF3366FF0101013399FF3399FF3399FF3399FF3399FF33 + 99FF3399FF3399FF3399FF01010133CCFF33CCFF33CCFF33CCFF33CCFF33CCFF + 33CCFF33CCFF33CCFF01010133FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FF + FF33FFFF33FFFF01010101010100FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF00000000000000000000000000000000000000000000000000 + 0000000000003300993300993300993300993300993300993300993300993300 + 9901010133339933339933339933339933339933339933339933339933339901 + 0101336699336699336699336699336699336699336699336699336699010101 + 33999933999933999933999933999933999933999933999933999901010133CC + 9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC9901010133FF9933 + FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF990101013300CC3300CC + 3300CC3300CC3300CC3300CC3300CC3300CC3300CC0101013333CC3333CC3333 + CC3333CC3333CC3333CC3333CC3333CC3333CC0101013366CC3366CC3366CC33 + 66CC3366CC3366CC3366CC3366CC3366CC0101013399CC3399CC3399CC3399CC + 3399CC3399CC3399CC3399CC3399CC01010133CCCC33CCCC33CCCC33CCCC33CC + CC33CCCC33CCCC33CCCC33CCCC01010133FFCC33FFCC33FFCC33FFCC33FFCC33 + FFCC33FFCC33FFCC33FFCC0101013300FF3300FF3300FF3300FF3300FF3300FF + 3300FF3300FF3300FF0101013333FF3333FF3333FF3333FF3333FF3333FF3333 + FF3333FF3333FF0101013366FF3366FF3366FF3366FF3366FF3366FF3366FF33 + 66FF3366FF0101013399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF + 3399FF01010133CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CC + FF01010133FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF01 + 010101010100FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 0000000000000000000000000000000000000000000000000000000000003300 + 9933009933009933009933009933009933009933009933009901010133339933 + 3399333399333399333399333399333399333399333399010101336699336699 + 3366993366993366993366993366993366993366990101013399993399993399 + 9933999933999933999933999933999933999901010133CC9933CC9933CC9933 + CC9933CC9933CC9933CC9933CC9933CC9901010133FF9933FF9933FF9933FF99 + 33FF9933FF9933FF9933FF9933FF990101013300CC3300CC3300CC3300CC3300 + CC3300CC3300CC3300CC3300CC0101013333CC3333CC3333CC3333CC3333CC33 + 33CC3333CC3333CC3333CC0101013366CC3366CC3366CC3366CC3366CC3366CC + 3366CC3366CC3366CC0101013399CC3399CC3399CC3399CC3399CC3399CC3399 + CC3399CC3399CC01010133CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33 + CCCC33CCCC01010133FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC + 33FFCC0101013300FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300 + FF0101013333FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF01 + 01013366FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF010101 + 3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF01010133CC + FF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF01010133FFFF33 + FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF01010101010100FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF000000000000000000 + 0000000000000000000000000000000000000000000033009933009933009933 + 0099330099330099330099330099330099010101333399333399333399333399 + 3333993333993333993333993333990101013366993366993366993366993366 + 9933669933669933669933669901010133999933999933999933999933999933 + 999933999933999933999901010133CC9933CC9933CC9933CC9933CC9933CC99 + 33CC9933CC9933CC9901010133FF9933FF9933FF9933FF9933FF9933FF9933FF + 9933FF9933FF990101013300CC3300CC3300CC3300CC3300CC3300CC3300CC33 + 00CC3300CC0101013333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC + 3333CC0101013366CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366 + CC0101013399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC01 + 010133CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC010101 + 33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC0101013300 + FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF0101013333FF33 + 33FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF0101013366FF3366FF + 3366FF3366FF3366FF3366FF3366FF3366FF3366FF0101013399FF3399FF3399 + FF3399FF3399FF3399FF3399FF3399FF3399FF01010133CCFF33CCFF33CCFF33 + CCFF33CCFF33CCFF33CCFF33CCFF33CCFF01010133FFFF33FFFF33FFFF33FFFF + 33FFFF33FFFF33FFFF33FFFF33FFFF01010101010100FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000000000000000000000000000000000 + 0000000000000000000000000000330099330099330099330099330099330099 + 3300993300993300990101013333993333993333993333993333993333993333 + 9933339933339901010133669933669933669933669933669933669933669933 + 6699336699010101339999339999339999339999339999339999339999339999 + 33999901010133CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC + 9901010133FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF9901 + 01013300CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC010101 + 3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC0101013366 + CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC0101013399CC33 + 99CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC01010133CCCC33CCCC + 33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC01010133FFCC33FFCC33FF + CC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC0101013300FF3300FF3300FF33 + 00FF3300FF3300FF3300FF3300FF3300FF0101013333FF3333FF3333FF3333FF + 3333FF3333FF3333FF3333FF3333FF0101013366FF3366FF3366FF3366FF3366 + FF3366FF3366FF3366FF3366FF0101013399FF3399FF3399FF3399FF3399FF33 + 99FF3399FF3399FF3399FF01010133CCFF33CCFF33CCFF33CCFF33CCFF33CCFF + 33CCFF33CCFF33CCFF01010133FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FF + FF33FFFF33FFFF01010101010100FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF00000000000000000000000000000000000000000000000000 + 0000000000003300993300993300993300993300993300993300993300993300 + 9901010133339933339933339933339933339933339933339933339933339901 + 0101336699336699336699336699336699336699336699336699336699010101 + 33999933999933999933999933999933999933999933999933999901010133CC + 9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC9901010133FF9933 + FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF990101013300CC3300CC + 3300CC3300CC3300CC3300CC3300CC3300CC3300CC0101013333CC3333CC3333 + CC3333CC3333CC3333CC3333CC3333CC3333CC0101013366CC3366CC3366CC33 + 66CC3366CC3366CC3366CC3366CC3366CC0101013399CC3399CC3399CC3399CC + 3399CC3399CC3399CC3399CC3399CC01010133CCCC33CCCC33CCCC33CCCC33CC + CC33CCCC33CCCC33CCCC33CCCC01010133FFCC33FFCC33FFCC33FFCC33FFCC33 + FFCC33FFCC33FFCC33FFCC0101013300FF3300FF3300FF3300FF3300FF3300FF + 3300FF3300FF3300FF0101013333FF3333FF3333FF3333FF3333FF3333FF3333 + FF3333FF3333FF0101013366FF3366FF3366FF3366FF3366FF3366FF3366FF33 + 66FF3366FF0101013399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF + 3399FF01010133CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CC + FF01010133FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF01 + 010101010100FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 0000000000000000000000000000000000000000000000000000000000003300 + 9933009933009933009933009933009933009933009933009901010133339933 + 3399333399333399333399333399333399333399333399010101336699336699 + 3366993366993366993366993366993366993366990101013399993399993399 + 9933999933999933999933999933999933999901010133CC9933CC9933CC9933 + CC9933CC9933CC9933CC9933CC9933CC9901010133FF9933FF9933FF9933FF99 + 33FF9933FF9933FF9933FF9933FF990101013300CC3300CC3300CC3300CC3300 + CC3300CC3300CC3300CC3300CC0101013333CC3333CC3333CC3333CC3333CC33 + 33CC3333CC3333CC3333CC0101013366CC3366CC3366CC3366CC3366CC3366CC + 3366CC3366CC3366CC0101013399CC3399CC3399CC3399CC3399CC3399CC3399 + CC3399CC3399CC01010133CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33 + CCCC33CCCC01010133FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC + 33FFCC0101013300FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300 + FF0101013333FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF01 + 01013366FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF010101 + 3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF01010133CC + FF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF01010133FFFF33 + FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF01010101010100FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF000000000000000000 + 0000000000000000000000000000000000000000000033009933009933009933 + 0099330099330099330099330099330099010101333399333399333399333399 + 3333993333993333993333993333990101013366993366993366993366993366 + 9933669933669933669933669901010133999933999933999933999933999933 + 999933999933999933999901010133CC9933CC9933CC9933CC9933CC9933CC99 + 33CC9933CC9933CC9901010133FF9933FF9933FF9933FF9933FF9933FF9933FF + 9933FF9933FF990101013300CC3300CC3300CC3300CC3300CC3300CC3300CC33 + 00CC3300CC0101013333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC + 3333CC0101013366CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366 + CC0101013399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC01 + 010133CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC010101 + 33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC0101013300 + FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF0101013333FF33 + 33FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF0101013366FF3366FF + 3366FF3366FF3366FF3366FF3366FF3366FF3366FF0101013399FF3399FF3399 + FF3399FF3399FF3399FF3399FF3399FF3399FF01010133CCFF33CCFF33CCFF33 + CCFF33CCFF33CCFF33CCFF33CCFF33CCFF01010133FFFF33FFFF33FFFF33FFFF + 33FFFF33FFFF33FFFF33FFFF33FFFF0101010101010101010101010101010101 + 0101010101010101010101010101010100000000000000000000000000000000 + 0000000000000000000000000000010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 010101010101010101010101010000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF000000000000000000000000000000000000000000000000 + 0000000000000000990000990000990000990000990000990000990000990000 + 9901010100339900339900339900339900339900339900339900339900339901 + 0101006699006699006699006699006699006699006699006699006699010101 + 00999900999900999900999900999900999900999900999900999901010100CC + 9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9901010100FF9900 + FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF990101010000CC0000CC + 0000CC0000CC0000CC0000CC0000CC0000CC0000CC0101010033CC0033CC0033 + CC0033CC0033CC0033CC0033CC0033CC0033CC0101010066CC0066CC0066CC00 + 66CC0066CC0066CC0066CC0066CC0066CC0101010099CC0099CC0099CC0099CC + 0099CC0099CC0099CC0099CC0099CC01010100CCCC00CCCC00CCCC00CCCC00CC + CC00CCCC00CCCC00CCCC00CCCC01010100FFCC00FFCC00FFCC00FFCC00FFCC00 + FFCC00FFCC00FFCC00FFCC0101010000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0101010033FF0033FF0033FF0033FF0033FF0033FF0033 + FF0033FF0033FF0101010066FF0066FF0066FF0066FF0066FF0066FF0066FF00 + 66FF0066FF0101010099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF + 0099FF01010100CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CC + FF01010100FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF01 + 01010101010000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000000000000000000000000000000000000000000000000000000000000000 + 9900009900009900009900009900009900009900009900009901010100339900 + 3399003399003399003399003399003399003399003399010101006699006699 + 0066990066990066990066990066990066990066990101010099990099990099 + 9900999900999900999900999900999900999901010100CC9900CC9900CC9900 + CC9900CC9900CC9900CC9900CC9900CC9901010100FF9900FF9900FF9900FF99 + 00FF9900FF9900FF9900FF9900FF990101010000CC0000CC0000CC0000CC0000 + CC0000CC0000CC0000CC0000CC0101010033CC0033CC0033CC0033CC0033CC00 + 33CC0033CC0033CC0033CC0101010066CC0066CC0066CC0066CC0066CC0066CC + 0066CC0066CC0066CC0101010099CC0099CC0099CC0099CC0099CC0099CC0099 + CC0099CC0099CC01010100CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00 + CCCC00CCCC01010100FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC + 00FFCC0101010000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0101010033FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF01 + 01010066FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF010101 + 0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF01010100CC + FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF01010100FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF0101010101010000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000000000000000 + 0000000000000000000000000000000000000000000000009900009900009900 + 0099000099000099000099000099000099010101003399003399003399003399 + 0033990033990033990033990033990101010066990066990066990066990066 + 9900669900669900669900669901010100999900999900999900999900999900 + 999900999900999900999901010100CC9900CC9900CC9900CC9900CC9900CC99 + 00CC9900CC9900CC9901010100FF9900FF9900FF9900FF9900FF9900FF9900FF + 9900FF9900FF990101010000CC0000CC0000CC0000CC0000CC0000CC0000CC00 + 00CC0000CC0101010033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC + 0033CC0101010066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066 + CC0101010099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC01 + 010100CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC010101 + 00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC0101010000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0101010033FF00 + 33FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0101010066FF0066FF + 0066FF0066FF0066FF0066FF0066FF0066FF0066FF0101010099FF0099FF0099 + FF0099FF0099FF0099FF0099FF0099FF0099FF01010100CCFF00CCFF00CCFF00 + CCFF00CCFF00CCFF00CCFF00CCFF00CCFF01010100FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF0101010101010000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF00000000000000000000000000000000 + 0000000000000000000000000000000099000099000099000099000099000099 + 0000990000990000990101010033990033990033990033990033990033990033 + 9900339900339901010100669900669900669900669900669900669900669900 + 6699006699010101009999009999009999009999009999009999009999009999 + 00999901010100CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC + 9901010100FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9901 + 01010000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC010101 + 0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0101010066 + CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0101010099CC00 + 99CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC01010100CCCC00CCCC + 00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC01010100FFCC00FFCC00FF + CC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC0101010000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0101010033FF0033FF0033FF0033FF + 0033FF0033FF0033FF0033FF0033FF0101010066FF0066FF0066FF0066FF0066 + FF0066FF0066FF0066FF0066FF0101010099FF0099FF0099FF0099FF0099FF00 + 99FF0099FF0099FF0099FF01010100CCFF00CCFF00CCFF00CCFF00CCFF00CCFF + 00CCFF00CCFF00CCFF01010100FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF0101010101010000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF000000000000000000000000000000000000000000000000 + 0000000000000000990000990000990000990000990000990000990000990000 + 9901010100339900339900339900339900339900339900339900339900339901 + 0101006699006699006699006699006699006699006699006699006699010101 + 00999900999900999900999900999900999900999900999900999901010100CC + 9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9901010100FF9900 + FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF990101010000CC0000CC + 0000CC0000CC0000CC0000CC0000CC0000CC0000CC0101010033CC0033CC0033 + CC0033CC0033CC0033CC0033CC0033CC0033CC0101010066CC0066CC0066CC00 + 66CC0066CC0066CC0066CC0066CC0066CC0101010099CC0099CC0099CC0099CC + 0099CC0099CC0099CC0099CC0099CC01010100CCCC00CCCC00CCCC00CCCC00CC + CC00CCCC00CCCC00CCCC00CCCC01010100FFCC00FFCC00FFCC00FFCC00FFCC00 + FFCC00FFCC00FFCC00FFCC0101010000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0101010033FF0033FF0033FF0033FF0033FF0033FF0033 + FF0033FF0033FF0101010066FF0066FF0066FF0066FF0066FF0066FF0066FF00 + 66FF0066FF0101010099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF + 0099FF01010100CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CC + FF01010100FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF01 + 01010101010000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000000000000000000000000000000000000000000000000000000000000000 + 9900009900009900009900009900009900009900009900009901010100339900 + 3399003399003399003399003399003399003399003399010101006699006699 + 0066990066990066990066990066990066990066990101010099990099990099 + 9900999900999900999900999900999900999901010100CC9900CC9900CC9900 + CC9900CC9900CC9900CC9900CC9900CC9901010100FF9900FF9900FF9900FF99 + 00FF9900FF9900FF9900FF9900FF990101010000CC0000CC0000CC0000CC0000 + CC0000CC0000CC0000CC0000CC0101010033CC0033CC0033CC0033CC0033CC00 + 33CC0033CC0033CC0033CC0101010066CC0066CC0066CC0066CC0066CC0066CC + 0066CC0066CC0066CC0101010099CC0099CC0099CC0099CC0099CC0099CC0099 + CC0099CC0099CC01010100CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00 + CCCC00CCCC01010100FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC + 00FFCC0101010000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0101010033FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF01 + 01010066FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF010101 + 0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF01010100CC + FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF01010100FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF0101010101010000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000000000000000 + 0000000000000000000000000000000000000000000000009900009900009900 + 0099000099000099000099000099000099010101003399003399003399003399 + 0033990033990033990033990033990101010066990066990066990066990066 + 9900669900669900669900669901010100999900999900999900999900999900 + 999900999900999900999901010100CC9900CC9900CC9900CC9900CC9900CC99 + 00CC9900CC9900CC9901010100FF9900FF9900FF9900FF9900FF9900FF9900FF + 9900FF9900FF990101010000CC0000CC0000CC0000CC0000CC0000CC0000CC00 + 00CC0000CC0101010033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC + 0033CC0101010066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066 + CC0101010099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC01 + 010100CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC010101 + 00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC0101010000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0101010033FF00 + 33FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0101010066FF0066FF + 0066FF0066FF0066FF0066FF0066FF0066FF0066FF0101010099FF0099FF0099 + FF0099FF0099FF0099FF0099FF0099FF0099FF01010100CCFF00CCFF00CCFF00 + CCFF00CCFF00CCFF00CCFF00CCFF00CCFF01010100FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF0101010101010000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF00000000000000000000000000000000 + 0000000000000000000000000000000099000099000099000099000099000099 + 0000990000990000990101010033990033990033990033990033990033990033 + 9900339900339901010100669900669900669900669900669900669900669900 + 6699006699010101009999009999009999009999009999009999009999009999 + 00999901010100CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC + 9901010100FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9901 + 01010000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC010101 + 0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0101010066 + CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0101010099CC00 + 99CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC01010100CCCC00CCCC + 00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC01010100FFCC00FFCC00FF + CC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC0101010000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0101010033FF0033FF0033FF0033FF + 0033FF0033FF0033FF0033FF0033FF0101010066FF0066FF0066FF0066FF0066 + FF0066FF0066FF0066FF0066FF0101010099FF0099FF0099FF0099FF0099FF00 + 99FF0099FF0099FF0099FF01010100CCFF00CCFF00CCFF00CCFF00CCFF00CCFF + 00CCFF00CCFF00CCFF01010100FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF0101010101010000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF000000000000000000000000000000000000000000000000 + 0000000000000000990000990000990000990000990000990000990000990000 + 9901010100339900339900339900339900339900339900339900339900339901 + 0101006699006699006699006699006699006699006699006699006699010101 + 00999900999900999900999900999900999900999900999900999901010100CC + 9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9901010100FF9900 + FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF990101010000CC0000CC + 0000CC0000CC0000CC0000CC0000CC0000CC0000CC0101010033CC0033CC0033 + CC0033CC0033CC0033CC0033CC0033CC0033CC0101010066CC0066CC0066CC00 + 66CC0066CC0066CC0066CC0066CC0066CC0101010099CC0099CC0099CC0099CC + 0099CC0099CC0099CC0099CC0099CC01010100CCCC00CCCC00CCCC00CCCC00CC + CC00CCCC00CCCC00CCCC00CCCC01010100FFCC00FFCC00FFCC00FFCC00FFCC00 + FFCC00FFCC00FFCC00FFCC0101010000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0101010033FF0033FF0033FF0033FF0033FF0033FF0033 + FF0033FF0033FF0101010066FF0066FF0066FF0066FF0066FF0066FF0066FF00 + 66FF0066FF0101010099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF + 0099FF01010100CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CC + FF01010100FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF01 + 0101010101010101010101010101010101010101010101010101010101010101 + 0000000000000000000000000000000000000000000000000000000000000101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 + 00000000000000000000000000000000000000000000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000010101FF3300FF3300FF3300FF3300 + FF3300FF3300FF3300FF3300FF3300010101FF6600FF6600FF6600FF6600FF66 + 00FF6600FF6600FF6600FF6600010101FF9900FF9900FF9900FF9900FF9900FF + 9900FF9900FF9900FF9900010101FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00 + FFCC00FFCC00FFCC00010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00010101FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF + 0033FF0033010101FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333 + FF3333010101FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF66 + 33010101FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF993301 + 0101FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33010101 + FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33010101FF00 + 66FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0066010101FF3366FF + 3366FF3366FF3366FF3366FF3366FF3366FF3366FF3366010101FF6666FF6666 + FF6666FF6666FF6666FF6666FF6666FF6666FF6666010101FF9966FF9966FF99 + 66FF9966FF9966FF9966FF9966FF9966FF9966010101FFCC66FFCC66FFCC66FF + CC66FFCC66FFCC66FFCC66FFCC66FFCC66010101FFFF66FFFF66FFFF66FFFF66 + FFFF66FFFF66FFFF66FFFF66FFFF66010101010101FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 + 0000000000000000000000000000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000010101FF3300FF3300FF3300FF3300FF3300FF3300FF33 + 00FF3300FF3300010101FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF + 6600FF6600010101FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900 + FF9900010101FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC + 00010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF0001 + 0101FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0033010101 + FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333010101FF66 + 33FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6633010101FF9933FF + 9933FF9933FF9933FF9933FF9933FF9933FF9933FF9933010101FFCC33FFCC33 + FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33010101FFFF33FFFF33FFFF + 33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33010101FF0066FF0066FF0066FF + 0066FF0066FF0066FF0066FF0066FF0066010101FF3366FF3366FF3366FF3366 + FF3366FF3366FF3366FF3366FF3366010101FF6666FF6666FF6666FF6666FF66 + 66FF6666FF6666FF6666FF6666010101FF9966FF9966FF9966FF9966FF9966FF + 9966FF9966FF9966FF9966010101FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66 + FFCC66FFCC66FFCC66010101FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF + 66FFFF66FFFF66010101010101FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 + 000000000000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00010101FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF330001 + 0101FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600010101 + FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900010101FFCC + 00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00010101FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00010101FF0033FF0033 + FF0033FF0033FF0033FF0033FF0033FF0033FF0033010101FF3333FF3333FF33 + 33FF3333FF3333FF3333FF3333FF3333FF3333010101FF6633FF6633FF6633FF + 6633FF6633FF6633FF6633FF6633FF6633010101FF9933FF9933FF9933FF9933 + FF9933FF9933FF9933FF9933FF9933010101FFCC33FFCC33FFCC33FFCC33FFCC + 33FFCC33FFCC33FFCC33FFCC33010101FFFF33FFFF33FFFF33FFFF33FFFF33FF + FF33FFFF33FFFF33FFFF33010101FF0066FF0066FF0066FF0066FF0066FF0066 + FF0066FF0066FF0066010101FF3366FF3366FF3366FF3366FF3366FF3366FF33 + 66FF3366FF3366010101FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF + 6666FF6666010101FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966 + FF9966010101FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC + 66010101FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF6601 + 0101010101FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + 000000000000000000000000000000000000000000000000000000000000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000010101FF3300FF + 3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300010101FF6600FF6600 + FF6600FF6600FF6600FF6600FF6600FF6600FF6600010101FF9900FF9900FF99 + 00FF9900FF9900FF9900FF9900FF9900FF9900010101FFCC00FFCC00FFCC00FF + CC00FFCC00FFCC00FFCC00FFCC00FFCC00010101FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00010101FF0033FF0033FF0033FF0033FF00 + 33FF0033FF0033FF0033FF0033010101FF3333FF3333FF3333FF3333FF3333FF + 3333FF3333FF3333FF3333010101FF6633FF6633FF6633FF6633FF6633FF6633 + FF6633FF6633FF6633010101FF9933FF9933FF9933FF9933FF9933FF9933FF99 + 33FF9933FF9933010101FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FF + CC33FFCC33010101FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33 + FFFF33010101FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF00 + 66010101FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF336601 + 0101FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6666010101 + FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966010101FFCC + 66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66010101FFFF66FF + FF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66010101010101FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 + 00000000000000000000000000000000000000000000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000010101FF3300FF3300FF3300FF3300 + FF3300FF3300FF3300FF3300FF3300010101FF6600FF6600FF6600FF6600FF66 + 00FF6600FF6600FF6600FF6600010101FF9900FF9900FF9900FF9900FF9900FF + 9900FF9900FF9900FF9900010101FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00 + FFCC00FFCC00FFCC00010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00010101FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF + 0033FF0033010101FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333 + FF3333010101FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF66 + 33010101FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF993301 + 0101FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33010101 + FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33010101FF00 + 66FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0066010101FF3366FF + 3366FF3366FF3366FF3366FF3366FF3366FF3366FF3366010101FF6666FF6666 + FF6666FF6666FF6666FF6666FF6666FF6666FF6666010101FF9966FF9966FF99 + 66FF9966FF9966FF9966FF9966FF9966FF9966010101FFCC66FFCC66FFCC66FF + CC66FFCC66FFCC66FFCC66FFCC66FFCC66010101FFFF66FFFF66FFFF66FFFF66 + FFFF66FFFF66FFFF66FFFF66FFFF66010101010101FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 + 0000000000000000000000000000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000010101FF3300FF3300FF3300FF3300FF3300FF3300FF33 + 00FF3300FF3300010101FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF + 6600FF6600010101FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900 + FF9900010101FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC + 00010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF0001 + 0101FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0033010101 + FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333010101FF66 + 33FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6633010101FF9933FF + 9933FF9933FF9933FF9933FF9933FF9933FF9933FF9933010101FFCC33FFCC33 + FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33010101FFFF33FFFF33FFFF + 33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33010101FF0066FF0066FF0066FF + 0066FF0066FF0066FF0066FF0066FF0066010101FF3366FF3366FF3366FF3366 + FF3366FF3366FF3366FF3366FF3366010101FF6666FF6666FF6666FF6666FF66 + 66FF6666FF6666FF6666FF6666010101FF9966FF9966FF9966FF9966FF9966FF + 9966FF9966FF9966FF9966010101FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66 + FFCC66FFCC66FFCC66010101FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF + 66FFFF66FFFF66010101010101FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 + 000000000000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00010101FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF330001 + 0101FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600010101 + FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900010101FFCC + 00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00010101FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00010101FF0033FF0033 + FF0033FF0033FF0033FF0033FF0033FF0033FF0033010101FF3333FF3333FF33 + 33FF3333FF3333FF3333FF3333FF3333FF3333010101FF6633FF6633FF6633FF + 6633FF6633FF6633FF6633FF6633FF6633010101FF9933FF9933FF9933FF9933 + FF9933FF9933FF9933FF9933FF9933010101FFCC33FFCC33FFCC33FFCC33FFCC + 33FFCC33FFCC33FFCC33FFCC33010101FFFF33FFFF33FFFF33FFFF33FFFF33FF + FF33FFFF33FFFF33FFFF33010101FF0066FF0066FF0066FF0066FF0066FF0066 + FF0066FF0066FF0066010101FF3366FF3366FF3366FF3366FF3366FF3366FF33 + 66FF3366FF3366010101FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF + 6666FF6666010101FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966 + FF9966010101FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC + 66010101FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF6601 + 0101010101FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + 000000000000000000000000000000000000000000000000000000000000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000010101FF3300FF + 3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300010101FF6600FF6600 + FF6600FF6600FF6600FF6600FF6600FF6600FF6600010101FF9900FF9900FF99 + 00FF9900FF9900FF9900FF9900FF9900FF9900010101FFCC00FFCC00FFCC00FF + CC00FFCC00FFCC00FFCC00FFCC00FFCC00010101FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00010101FF0033FF0033FF0033FF0033FF00 + 33FF0033FF0033FF0033FF0033010101FF3333FF3333FF3333FF3333FF3333FF + 3333FF3333FF3333FF3333010101FF6633FF6633FF6633FF6633FF6633FF6633 + FF6633FF6633FF6633010101FF9933FF9933FF9933FF9933FF9933FF9933FF99 + 33FF9933FF9933010101FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FF + CC33FFCC33010101FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33 + FFFF33010101FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF00 + 66010101FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF336601 + 0101FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6666010101 + FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966010101FFCC + 66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66010101FFFF66FF + FF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66010101010101FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 + 00000000000000000000000000000000000000000000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000010101FF3300FF3300FF3300FF3300 + FF3300FF3300FF3300FF3300FF3300010101FF6600FF6600FF6600FF6600FF66 + 00FF6600FF6600FF6600FF6600010101FF9900FF9900FF9900FF9900FF9900FF + 9900FF9900FF9900FF9900010101FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00 + FFCC00FFCC00FFCC00010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00010101FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF + 0033FF0033010101FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333 + FF3333010101FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF66 + 33010101FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF993301 + 0101FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33010101 + FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33010101FF00 + 66FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0066010101FF3366FF + 3366FF3366FF3366FF3366FF3366FF3366FF3366FF3366010101FF6666FF6666 + FF6666FF6666FF6666FF6666FF6666FF6666FF6666010101FF9966FF9966FF99 + 66FF9966FF9966FF9966FF9966FF9966FF9966010101FFCC66FFCC66FFCC66FF + CC66FFCC66FFCC66FFCC66FFCC66FFCC66010101FFFF66FFFF66FFFF66FFFF66 + FFFF66FFFF66FFFF66FFFF66FFFF660101010101010101010101010101010101 + 0101010101010101010101010101010100000000000000000000000000000000 + 0000000000000000000000000000010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 01010101010101010101010101CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCCCCC000000000000000000000000000000000000000000000000 + 000000000000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC00 + 00010101CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC330001 + 0101CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600010101 + CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900010101CCCC + 00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00010101CCFF00CC + FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00010101CC0033CC0033 + CC0033CC0033CC0033CC0033CC0033CC0033CC0033010101CC3333CC3333CC33 + 33CC3333CC3333CC3333CC3333CC3333CC3333010101CC6633CC6633CC6633CC + 6633CC6633CC6633CC6633CC6633CC6633010101CC9933CC9933CC9933CC9933 + CC9933CC9933CC9933CC9933CC9933010101CCCC33CCCC33CCCC33CCCC33CCCC + 33CCCC33CCCC33CCCC33CCCC33010101CCFF33CCFF33CCFF33CCFF33CCFF33CC + FF33CCFF33CCFF33CCFF33010101CC0066CC0066CC0066CC0066CC0066CC0066 + CC0066CC0066CC0066010101CC3366CC3366CC3366CC3366CC3366CC3366CC33 + 66CC3366CC3366010101CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC + 6666CC6666010101CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966 + CC9966010101CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC + 66010101CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF6601 + 0101010101CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + 000000000000000000000000000000000000000000000000000000000000CC00 + 00CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000010101CC3300CC + 3300CC3300CC3300CC3300CC3300CC3300CC3300CC3300010101CC6600CC6600 + CC6600CC6600CC6600CC6600CC6600CC6600CC6600010101CC9900CC9900CC99 + 00CC9900CC9900CC9900CC9900CC9900CC9900010101CCCC00CCCC00CCCC00CC + CC00CCCC00CCCC00CCCC00CCCC00CCCC00010101CCFF00CCFF00CCFF00CCFF00 + CCFF00CCFF00CCFF00CCFF00CCFF00010101CC0033CC0033CC0033CC0033CC00 + 33CC0033CC0033CC0033CC0033010101CC3333CC3333CC3333CC3333CC3333CC + 3333CC3333CC3333CC3333010101CC6633CC6633CC6633CC6633CC6633CC6633 + CC6633CC6633CC6633010101CC9933CC9933CC9933CC9933CC9933CC9933CC99 + 33CC9933CC9933010101CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CC + CC33CCCC33010101CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33 + CCFF33010101CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC00 + 66010101CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC336601 + 0101CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666010101 + CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966010101CCCC + 66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66010101CCFF66CC + FF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66010101010101CCCCCC + CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC0000000000000000 + 00000000000000000000000000000000000000000000CC0000CC0000CC0000CC + 0000CC0000CC0000CC0000CC0000CC0000010101CC3300CC3300CC3300CC3300 + CC3300CC3300CC3300CC3300CC3300010101CC6600CC6600CC6600CC6600CC66 + 00CC6600CC6600CC6600CC6600010101CC9900CC9900CC9900CC9900CC9900CC + 9900CC9900CC9900CC9900010101CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00 + CCCC00CCCC00CCCC00010101CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF + 00CCFF00CCFF00010101CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC + 0033CC0033010101CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333 + CC3333010101CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC66 + 33010101CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC993301 + 0101CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33010101 + CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33010101CC00 + 66CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066010101CC3366CC + 3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366010101CC6666CC6666 + CC6666CC6666CC6666CC6666CC6666CC6666CC6666010101CC9966CC9966CC99 + 66CC9966CC9966CC9966CC9966CC9966CC9966010101CCCC66CCCC66CCCC66CC + CC66CCCC66CCCC66CCCC66CCCC66CCCC66010101CCFF66CCFF66CCFF66CCFF66 + CCFF66CCFF66CCFF66CCFF66CCFF66010101010101CCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC00000000000000000000000000000000 + 0000000000000000000000000000CC0000CC0000CC0000CC0000CC0000CC0000 + CC0000CC0000CC0000010101CC3300CC3300CC3300CC3300CC3300CC3300CC33 + 00CC3300CC3300010101CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC + 6600CC6600010101CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900 + CC9900010101CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC + 00010101CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF0001 + 0101CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033010101 + CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333010101CC66 + 33CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633010101CC9933CC + 9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933010101CCCC33CCCC33 + CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33010101CCFF33CCFF33CCFF + 33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33010101CC0066CC0066CC0066CC + 0066CC0066CC0066CC0066CC0066CC0066010101CC3366CC3366CC3366CC3366 + CC3366CC3366CC3366CC3366CC3366010101CC6666CC6666CC6666CC6666CC66 + 66CC6666CC6666CC6666CC6666010101CC9966CC9966CC9966CC9966CC9966CC + 9966CC9966CC9966CC9966010101CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66 + CCCC66CCCC66CCCC66010101CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF + 66CCFF66CCFF66010101010101CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCCCCC000000000000000000000000000000000000000000000000 + 000000000000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC00 + 00010101CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC330001 + 0101CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600010101 + CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900010101CCCC + 00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00010101CCFF00CC + FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00010101CC0033CC0033 + CC0033CC0033CC0033CC0033CC0033CC0033CC0033010101CC3333CC3333CC33 + 33CC3333CC3333CC3333CC3333CC3333CC3333010101CC6633CC6633CC6633CC + 6633CC6633CC6633CC6633CC6633CC6633010101CC9933CC9933CC9933CC9933 + CC9933CC9933CC9933CC9933CC9933010101CCCC33CCCC33CCCC33CCCC33CCCC + 33CCCC33CCCC33CCCC33CCCC33010101CCFF33CCFF33CCFF33CCFF33CCFF33CC + FF33CCFF33CCFF33CCFF33010101CC0066CC0066CC0066CC0066CC0066CC0066 + CC0066CC0066CC0066010101CC3366CC3366CC3366CC3366CC3366CC3366CC33 + 66CC3366CC3366010101CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC + 6666CC6666010101CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966 + CC9966010101CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC + 66010101CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF6601 + 0101010101CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + 000000000000000000000000000000000000000000000000000000000000CC00 + 00CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000010101CC3300CC + 3300CC3300CC3300CC3300CC3300CC3300CC3300CC3300010101CC6600CC6600 + CC6600CC6600CC6600CC6600CC6600CC6600CC6600010101CC9900CC9900CC99 + 00CC9900CC9900CC9900CC9900CC9900CC9900010101CCCC00CCCC00CCCC00CC + CC00CCCC00CCCC00CCCC00CCCC00CCCC00010101CCFF00CCFF00CCFF00CCFF00 + CCFF00CCFF00CCFF00CCFF00CCFF00010101CC0033CC0033CC0033CC0033CC00 + 33CC0033CC0033CC0033CC0033010101CC3333CC3333CC3333CC3333CC3333CC + 3333CC3333CC3333CC3333010101CC6633CC6633CC6633CC6633CC6633CC6633 + CC6633CC6633CC6633010101CC9933CC9933CC9933CC9933CC9933CC9933CC99 + 33CC9933CC9933010101CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CC + CC33CCCC33010101CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33 + CCFF33010101CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC00 + 66010101CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC336601 + 0101CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666010101 + CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966010101CCCC + 66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66010101CCFF66CC + FF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66010101010101CCCCCC + CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC0000000000000000 + 00000000000000000000000000000000000000000000CC0000CC0000CC0000CC + 0000CC0000CC0000CC0000CC0000CC0000010101CC3300CC3300CC3300CC3300 + CC3300CC3300CC3300CC3300CC3300010101CC6600CC6600CC6600CC6600CC66 + 00CC6600CC6600CC6600CC6600010101CC9900CC9900CC9900CC9900CC9900CC + 9900CC9900CC9900CC9900010101CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00 + CCCC00CCCC00CCCC00010101CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF + 00CCFF00CCFF00010101CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC + 0033CC0033010101CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333 + CC3333010101CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC66 + 33010101CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC993301 + 0101CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33010101 + CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33010101CC00 + 66CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066010101CC3366CC + 3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366010101CC6666CC6666 + CC6666CC6666CC6666CC6666CC6666CC6666CC6666010101CC9966CC9966CC99 + 66CC9966CC9966CC9966CC9966CC9966CC9966010101CCCC66CCCC66CCCC66CC + CC66CCCC66CCCC66CCCC66CCCC66CCCC66010101CCFF66CCFF66CCFF66CCFF66 + CCFF66CCFF66CCFF66CCFF66CCFF66010101010101CCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC00000000000000000000000000000000 + 0000000000000000000000000000CC0000CC0000CC0000CC0000CC0000CC0000 + CC0000CC0000CC0000010101CC3300CC3300CC3300CC3300CC3300CC3300CC33 + 00CC3300CC3300010101CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC + 6600CC6600010101CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900 + CC9900010101CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC + 00010101CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF0001 + 0101CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033010101 + CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333010101CC66 + 33CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633010101CC9933CC + 9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933010101CCCC33CCCC33 + CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33010101CCFF33CCFF33CCFF + 33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33010101CC0066CC0066CC0066CC + 0066CC0066CC0066CC0066CC0066CC0066010101CC3366CC3366CC3366CC3366 + CC3366CC3366CC3366CC3366CC3366010101CC6666CC6666CC6666CC6666CC66 + 66CC6666CC6666CC6666CC6666010101CC9966CC9966CC9966CC9966CC9966CC + 9966CC9966CC9966CC9966010101CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66 + CCCC66CCCC66CCCC66010101CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF + 66CCFF66CCFF66010101010101CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCCCCC000000000000000000000000000000000000000000000000 + 000000000000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC00 + 00010101CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC330001 + 0101CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600010101 + CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900010101CCCC + 00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00010101CCFF00CC + FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00010101CC0033CC0033 + CC0033CC0033CC0033CC0033CC0033CC0033CC0033010101CC3333CC3333CC33 + 33CC3333CC3333CC3333CC3333CC3333CC3333010101CC6633CC6633CC6633CC + 6633CC6633CC6633CC6633CC6633CC6633010101CC9933CC9933CC9933CC9933 + CC9933CC9933CC9933CC9933CC9933010101CCCC33CCCC33CCCC33CCCC33CCCC + 33CCCC33CCCC33CCCC33CCCC33010101CCFF33CCFF33CCFF33CCFF33CCFF33CC + FF33CCFF33CCFF33CCFF33010101CC0066CC0066CC0066CC0066CC0066CC0066 + CC0066CC0066CC0066010101CC3366CC3366CC3366CC3366CC3366CC3366CC33 + 66CC3366CC3366010101CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC + 6666CC6666010101CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966 + CC9966010101CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC + 66010101CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF6601 + 0101010101010101010101010101010101010101010101010101010101010101 + 0000000000000000000000000000000000000000000000000000000000000101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101999999 + 9999999999999999999999999999999999999999999999990000000000000000 + 0000000000000000000000000000000000000000000099000099000099000099 + 0000990000990000990000990000990000010101993300993300993300993300 + 9933009933009933009933009933000101019966009966009966009966009966 + 0099660099660099660099660001010199990099990099990099990099990099 + 990099990099990099990001010199CC0099CC0099CC0099CC0099CC0099CC00 + 99CC0099CC0099CC0001010199FF0099FF0099FF0099FF0099FF0099FF0099FF + 0099FF0099FF0001010199003399003399003399003399003399003399003399 + 0033990033010101993333993333993333993333993333993333993333993333 + 9933330101019966339966339966339966339966339966339966339966339966 + 3301010199993399993399993399993399993399993399993399993399993301 + 010199CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC33010101 + 99FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF330101019900 + 6699006699006699006699006699006699006699006699006601010199336699 + 3366993366993366993366993366993366993366993366010101996666996666 + 9966669966669966669966669966669966669966660101019999669999669999 + 6699996699996699996699996699996699996601010199CC6699CC6699CC6699 + CC6699CC6699CC6699CC6699CC6699CC6601010199FF6699FF6699FF6699FF66 + 99FF6699FF6699FF6699FF6699FF660101010101019999999999999999999999 + 9999999999999999999999999999999900000000000000000000000000000000 + 0000000000000000000000000000990000990000990000990000990000990000 + 9900009900009900000101019933009933009933009933009933009933009933 + 0099330099330001010199660099660099660099660099660099660099660099 + 6600996600010101999900999900999900999900999900999900999900999900 + 99990001010199CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC + 0001010199FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0001 + 0101990033990033990033990033990033990033990033990033990033010101 + 9933339933339933339933339933339933339933339933339933330101019966 + 3399663399663399663399663399663399663399663399663301010199993399 + 993399993399993399993399993399993399993399993301010199CC3399CC33 + 99CC3399CC3399CC3399CC3399CC3399CC3399CC3301010199FF3399FF3399FF + 3399FF3399FF3399FF3399FF3399FF3399FF3301010199006699006699006699 + 0066990066990066990066990066990066010101993366993366993366993366 + 9933669933669933669933669933660101019966669966669966669966669966 + 6699666699666699666699666601010199996699996699996699996699996699 + 996699996699996699996601010199CC6699CC6699CC6699CC6699CC6699CC66 + 99CC6699CC6699CC6601010199FF6699FF6699FF6699FF6699FF6699FF6699FF + 6699FF6699FF6601010101010199999999999999999999999999999999999999 + 9999999999999999000000000000000000000000000000000000000000000000 + 0000000000009900009900009900009900009900009900009900009900009900 + 0001010199330099330099330099330099330099330099330099330099330001 + 0101996600996600996600996600996600996600996600996600996600010101 + 99990099990099990099990099990099990099990099990099990001010199CC + 0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0001010199FF0099 + FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF00010101990033990033 + 9900339900339900339900339900339900339900330101019933339933339933 + 3399333399333399333399333399333399333301010199663399663399663399 + 6633996633996633996633996633996633010101999933999933999933999933 + 99993399993399993399993399993301010199CC3399CC3399CC3399CC3399CC + 3399CC3399CC3399CC3399CC3301010199FF3399FF3399FF3399FF3399FF3399 + FF3399FF3399FF3399FF33010101990066990066990066990066990066990066 + 9900669900669900660101019933669933669933669933669933669933669933 + 6699336699336601010199666699666699666699666699666699666699666699 + 6666996666010101999966999966999966999966999966999966999966999966 + 99996601010199CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC + 6601010199FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6601 + 0101010101999999999999999999999999999999999999999999999999999999 + 0000000000000000000000000000000000000000000000000000000000009900 + 0099000099000099000099000099000099000099000099000001010199330099 + 3300993300993300993300993300993300993300993300010101996600996600 + 9966009966009966009966009966009966009966000101019999009999009999 + 0099990099990099990099990099990099990001010199CC0099CC0099CC0099 + CC0099CC0099CC0099CC0099CC0099CC0001010199FF0099FF0099FF0099FF00 + 99FF0099FF0099FF0099FF0099FF000101019900339900339900339900339900 + 3399003399003399003399003301010199333399333399333399333399333399 + 3333993333993333993333010101996633996633996633996633996633996633 + 9966339966339966330101019999339999339999339999339999339999339999 + 3399993399993301010199CC3399CC3399CC3399CC3399CC3399CC3399CC3399 + CC3399CC3301010199FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF33 + 99FF330101019900669900669900669900669900669900669900669900669900 + 6601010199336699336699336699336699336699336699336699336699336601 + 0101996666996666996666996666996666996666996666996666996666010101 + 99996699996699996699996699996699996699996699996699996601010199CC + 6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6601010199FF6699 + FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF66010101010101999999 + 9999999999999999999999999999999999999999999999990000000000000000 + 0000000000000000000000000000000000000000000099000099000099000099 + 0000990000990000990000990000990000010101993300993300993300993300 + 9933009933009933009933009933000101019966009966009966009966009966 + 0099660099660099660099660001010199990099990099990099990099990099 + 990099990099990099990001010199CC0099CC0099CC0099CC0099CC0099CC00 + 99CC0099CC0099CC0001010199FF0099FF0099FF0099FF0099FF0099FF0099FF + 0099FF0099FF0001010199003399003399003399003399003399003399003399 + 0033990033010101993333993333993333993333993333993333993333993333 + 9933330101019966339966339966339966339966339966339966339966339966 + 3301010199993399993399993399993399993399993399993399993399993301 + 010199CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC33010101 + 99FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF330101019900 + 6699006699006699006699006699006699006699006699006601010199336699 + 3366993366993366993366993366993366993366993366010101996666996666 + 9966669966669966669966669966669966669966660101019999669999669999 + 6699996699996699996699996699996699996601010199CC6699CC6699CC6699 + CC6699CC6699CC6699CC6699CC6699CC6601010199FF6699FF6699FF6699FF66 + 99FF6699FF6699FF6699FF6699FF660101010101019999999999999999999999 + 9999999999999999999999999999999900000000000000000000000000000000 + 0000000000000000000000000000990000990000990000990000990000990000 + 9900009900009900000101019933009933009933009933009933009933009933 + 0099330099330001010199660099660099660099660099660099660099660099 + 6600996600010101999900999900999900999900999900999900999900999900 + 99990001010199CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC + 0001010199FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0001 + 0101990033990033990033990033990033990033990033990033990033010101 + 9933339933339933339933339933339933339933339933339933330101019966 + 3399663399663399663399663399663399663399663399663301010199993399 + 993399993399993399993399993399993399993399993301010199CC3399CC33 + 99CC3399CC3399CC3399CC3399CC3399CC3399CC3301010199FF3399FF3399FF + 3399FF3399FF3399FF3399FF3399FF3399FF3301010199006699006699006699 + 0066990066990066990066990066990066010101993366993366993366993366 + 9933669933669933669933669933660101019966669966669966669966669966 + 6699666699666699666699666601010199996699996699996699996699996699 + 996699996699996699996601010199CC6699CC6699CC6699CC6699CC6699CC66 + 99CC6699CC6699CC6601010199FF6699FF6699FF6699FF6699FF6699FF6699FF + 6699FF6699FF6601010101010199999999999999999999999999999999999999 + 9999999999999999000000000000000000000000000000000000000000000000 + 0000000000009900009900009900009900009900009900009900009900009900 + 0001010199330099330099330099330099330099330099330099330099330001 + 0101996600996600996600996600996600996600996600996600996600010101 + 99990099990099990099990099990099990099990099990099990001010199CC + 0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0001010199FF0099 + FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF00010101990033990033 + 9900339900339900339900339900339900339900330101019933339933339933 + 3399333399333399333399333399333399333301010199663399663399663399 + 6633996633996633996633996633996633010101999933999933999933999933 + 99993399993399993399993399993301010199CC3399CC3399CC3399CC3399CC + 3399CC3399CC3399CC3399CC3301010199FF3399FF3399FF3399FF3399FF3399 + FF3399FF3399FF3399FF33010101990066990066990066990066990066990066 + 9900669900669900660101019933669933669933669933669933669933669933 + 6699336699336601010199666699666699666699666699666699666699666699 + 6666996666010101999966999966999966999966999966999966999966999966 + 99996601010199CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC + 6601010199FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6601 + 0101010101999999999999999999999999999999999999999999999999999999 + 0000000000000000000000000000000000000000000000000000000000009900 + 0099000099000099000099000099000099000099000099000001010199330099 + 3300993300993300993300993300993300993300993300010101996600996600 + 9966009966009966009966009966009966009966000101019999009999009999 + 0099990099990099990099990099990099990001010199CC0099CC0099CC0099 + CC0099CC0099CC0099CC0099CC0099CC0001010199FF0099FF0099FF0099FF00 + 99FF0099FF0099FF0099FF0099FF000101019900339900339900339900339900 + 3399003399003399003399003301010199333399333399333399333399333399 + 3333993333993333993333010101996633996633996633996633996633996633 + 9966339966339966330101019999339999339999339999339999339999339999 + 3399993399993301010199CC3399CC3399CC3399CC3399CC3399CC3399CC3399 + CC3399CC3301010199FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF33 + 99FF330101019900669900669900669900669900669900669900669900669900 + 6601010199336699336699336699336699336699336699336699336699336601 + 0101996666996666996666996666996666996666996666996666996666010101 + 99996699996699996699996699996699996699996699996699996601010199CC + 6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6601010199FF6699 + FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF66010101010101999999 + 9999999999999999999999999999999999999999999999990000000000000000 + 0000000000000000000000000000000000000000000099000099000099000099 + 0000990000990000990000990000990000010101993300993300993300993300 + 9933009933009933009933009933000101019966009966009966009966009966 + 0099660099660099660099660001010199990099990099990099990099990099 + 990099990099990099990001010199CC0099CC0099CC0099CC0099CC0099CC00 + 99CC0099CC0099CC0001010199FF0099FF0099FF0099FF0099FF0099FF0099FF + 0099FF0099FF0001010199003399003399003399003399003399003399003399 + 0033990033010101993333993333993333993333993333993333993333993333 + 9933330101019966339966339966339966339966339966339966339966339966 + 3301010199993399993399993399993399993399993399993399993399993301 + 010199CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC33010101 + 99FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF330101019900 + 6699006699006699006699006699006699006699006699006601010199336699 + 3366993366993366993366993366993366993366993366010101996666996666 + 9966669966669966669966669966669966669966660101019999669999669999 + 6699996699996699996699996699996699996601010199CC6699CC6699CC6699 + CC6699CC6699CC6699CC6699CC6699CC6601010199FF6699FF6699FF6699FF66 + 99FF6699FF6699FF6699FF6699FF660101010101010101010101010101010101 + 0101010101010101010101010101010100000000000000000000000000000000 + 0000000000000000000000000000010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010166666666666666666666666666666666666666 + 6666666666666666000000000000000000000000000000000000000000000000 + 0000000000006600006600006600006600006600006600006600006600006600 + 0001010166330066330066330066330066330066330066330066330066330001 + 0101666600666600666600666600666600666600666600666600666600010101 + 66990066990066990066990066990066990066990066990066990001010166CC + 0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0001010166FF0066 + FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF00010101660033660033 + 6600336600336600336600336600336600336600330101016633336633336633 + 3366333366333366333366333366333366333301010166663366663366663366 + 6633666633666633666633666633666633010101669933669933669933669933 + 66993366993366993366993366993301010166CC3366CC3366CC3366CC3366CC + 3366CC3366CC3366CC3366CC3301010166FF3366FF3366FF3366FF3366FF3366 + FF3366FF3366FF3366FF33010101660066660066660066660066660066660066 + 6600666600666600660101016633666633666633666633666633666633666633 + 6666336666336601010166666666666666666666666666666666666666666666 + 6666666666010101669966669966669966669966669966669966669966669966 + 66996601010166CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC + 6601010166FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6601 + 0101010101666666666666666666666666666666666666666666666666666666 + 0000000000000000000000000000000000000000000000000000000000006600 + 0066000066000066000066000066000066000066000066000001010166330066 + 3300663300663300663300663300663300663300663300010101666600666600 + 6666006666006666006666006666006666006666000101016699006699006699 + 0066990066990066990066990066990066990001010166CC0066CC0066CC0066 + CC0066CC0066CC0066CC0066CC0066CC0001010166FF0066FF0066FF0066FF00 + 66FF0066FF0066FF0066FF0066FF000101016600336600336600336600336600 + 3366003366003366003366003301010166333366333366333366333366333366 + 3333663333663333663333010101666633666633666633666633666633666633 + 6666336666336666330101016699336699336699336699336699336699336699 + 3366993366993301010166CC3366CC3366CC3366CC3366CC3366CC3366CC3366 + CC3366CC3301010166FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF33 + 66FF330101016600666600666600666600666600666600666600666600666600 + 6601010166336666336666336666336666336666336666336666336666336601 + 0101666666666666666666666666666666666666666666666666666666010101 + 66996666996666996666996666996666996666996666996666996601010166CC + 6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6601010166FF6666 + FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF66010101010101666666 + 6666666666666666666666666666666666666666666666660000000000000000 + 0000000000000000000000000000000000000000000066000066000066000066 + 0000660000660000660000660000660000010101663300663300663300663300 + 6633006633006633006633006633000101016666006666006666006666006666 + 0066660066660066660066660001010166990066990066990066990066990066 + 990066990066990066990001010166CC0066CC0066CC0066CC0066CC0066CC00 + 66CC0066CC0066CC0001010166FF0066FF0066FF0066FF0066FF0066FF0066FF + 0066FF0066FF0001010166003366003366003366003366003366003366003366 + 0033660033010101663333663333663333663333663333663333663333663333 + 6633330101016666336666336666336666336666336666336666336666336666 + 3301010166993366993366993366993366993366993366993366993366993301 + 010166CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC33010101 + 66FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF330101016600 + 6666006666006666006666006666006666006666006666006601010166336666 + 3366663366663366663366663366663366663366663366010101666666666666 + 6666666666666666666666666666666666666666660101016699666699666699 + 6666996666996666996666996666996666996601010166CC6666CC6666CC6666 + CC6666CC6666CC6666CC6666CC6666CC6601010166FF6666FF6666FF6666FF66 + 66FF6666FF6666FF6666FF6666FF660101010101016666666666666666666666 + 6666666666666666666666666666666600000000000000000000000000000000 + 0000000000000000000000000000660000660000660000660000660000660000 + 6600006600006600000101016633006633006633006633006633006633006633 + 0066330066330001010166660066660066660066660066660066660066660066 + 6600666600010101669900669900669900669900669900669900669900669900 + 66990001010166CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC + 0001010166FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0001 + 0101660033660033660033660033660033660033660033660033660033010101 + 6633336633336633336633336633336633336633336633336633330101016666 + 3366663366663366663366663366663366663366663366663301010166993366 + 993366993366993366993366993366993366993366993301010166CC3366CC33 + 66CC3366CC3366CC3366CC3366CC3366CC3366CC3301010166FF3366FF3366FF + 3366FF3366FF3366FF3366FF3366FF3366FF3301010166006666006666006666 + 0066660066660066660066660066660066010101663366663366663366663366 + 6633666633666633666633666633660101016666666666666666666666666666 + 6666666666666666666666666601010166996666996666996666996666996666 + 996666996666996666996601010166CC6666CC6666CC6666CC6666CC6666CC66 + 66CC6666CC6666CC6601010166FF6666FF6666FF6666FF6666FF6666FF6666FF + 6666FF6666FF6601010101010166666666666666666666666666666666666666 + 6666666666666666000000000000000000000000000000000000000000000000 + 0000000000006600006600006600006600006600006600006600006600006600 + 0001010166330066330066330066330066330066330066330066330066330001 + 0101666600666600666600666600666600666600666600666600666600010101 + 66990066990066990066990066990066990066990066990066990001010166CC + 0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0001010166FF0066 + FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF00010101660033660033 + 6600336600336600336600336600336600336600330101016633336633336633 + 3366333366333366333366333366333366333301010166663366663366663366 + 6633666633666633666633666633666633010101669933669933669933669933 + 66993366993366993366993366993301010166CC3366CC3366CC3366CC3366CC + 3366CC3366CC3366CC3366CC3301010166FF3366FF3366FF3366FF3366FF3366 + FF3366FF3366FF3366FF33010101660066660066660066660066660066660066 + 6600666600666600660101016633666633666633666633666633666633666633 + 6666336666336601010166666666666666666666666666666666666666666666 + 6666666666010101669966669966669966669966669966669966669966669966 + 66996601010166CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC + 6601010166FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6601 + 0101010101666666666666666666666666666666666666666666666666666666 + 0000000000000000000000000000000000000000000000000000000000006600 + 0066000066000066000066000066000066000066000066000001010166330066 + 3300663300663300663300663300663300663300663300010101666600666600 + 6666006666006666006666006666006666006666000101016699006699006699 + 0066990066990066990066990066990066990001010166CC0066CC0066CC0066 + CC0066CC0066CC0066CC0066CC0066CC0001010166FF0066FF0066FF0066FF00 + 66FF0066FF0066FF0066FF0066FF000101016600336600336600336600336600 + 3366003366003366003366003301010166333366333366333366333366333366 + 3333663333663333663333010101666633666633666633666633666633666633 + 6666336666336666330101016699336699336699336699336699336699336699 + 3366993366993301010166CC3366CC3366CC3366CC3366CC3366CC3366CC3366 + CC3366CC3301010166FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF33 + 66FF330101016600666600666600666600666600666600666600666600666600 + 6601010166336666336666336666336666336666336666336666336666336601 + 0101666666666666666666666666666666666666666666666666666666010101 + 66996666996666996666996666996666996666996666996666996601010166CC + 6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6601010166FF6666 + FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF66010101010101666666 + 6666666666666666666666666666666666666666666666660000000000000000 + 0000000000000000000000000000000000000000000066000066000066000066 + 0000660000660000660000660000660000010101663300663300663300663300 + 6633006633006633006633006633000101016666006666006666006666006666 + 0066660066660066660066660001010166990066990066990066990066990066 + 990066990066990066990001010166CC0066CC0066CC0066CC0066CC0066CC00 + 66CC0066CC0066CC0001010166FF0066FF0066FF0066FF0066FF0066FF0066FF + 0066FF0066FF0001010166003366003366003366003366003366003366003366 + 0033660033010101663333663333663333663333663333663333663333663333 + 6633330101016666336666336666336666336666336666336666336666336666 + 3301010166993366993366993366993366993366993366993366993366993301 + 010166CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC33010101 + 66FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF330101016600 + 6666006666006666006666006666006666006666006666006601010166336666 + 3366663366663366663366663366663366663366663366010101666666666666 + 6666666666666666666666666666666666666666660101016699666699666699 + 6666996666996666996666996666996666996601010166CC6666CC6666CC6666 + CC6666CC6666CC6666CC6666CC6666CC6601010166FF6666FF6666FF6666FF66 + 66FF6666FF6666FF6666FF6666FF660101010101016666666666666666666666 + 6666666666666666666666666666666600000000000000000000000000000000 + 0000000000000000000000000000660000660000660000660000660000660000 + 6600006600006600000101016633006633006633006633006633006633006633 + 0066330066330001010166660066660066660066660066660066660066660066 + 6600666600010101669900669900669900669900669900669900669900669900 + 66990001010166CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC + 0001010166FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0001 + 0101660033660033660033660033660033660033660033660033660033010101 + 6633336633336633336633336633336633336633336633336633330101016666 + 3366663366663366663366663366663366663366663366663301010166993366 + 993366993366993366993366993366993366993366993301010166CC3366CC33 + 66CC3366CC3366CC3366CC3366CC3366CC3366CC3301010166FF3366FF3366FF + 3366FF3366FF3366FF3366FF3366FF3366FF3301010166006666006666006666 + 0066660066660066660066660066660066010101663366663366663366663366 + 6633666633666633666633666633660101016666666666666666666666666666 + 6666666666666666666666666601010166996666996666996666996666996666 + 996666996666996666996601010166CC6666CC6666CC6666CC6666CC6666CC66 + 66CC6666CC6666CC6601010166FF6666FF6666FF6666FF6666FF6666FF6666FF + 6666FF6666FF6601010101010166666666666666666666666666666666666666 + 6666666666666666000000000000000000000000000000000000000000000000 + 0000000000006600006600006600006600006600006600006600006600006600 + 0001010166330066330066330066330066330066330066330066330066330001 + 0101666600666600666600666600666600666600666600666600666600010101 + 66990066990066990066990066990066990066990066990066990001010166CC + 0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0001010166FF0066 + FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF00010101660033660033 + 6600336600336600336600336600336600336600330101016633336633336633 + 3366333366333366333366333366333366333301010166663366663366663366 + 6633666633666633666633666633666633010101669933669933669933669933 + 66993366993366993366993366993301010166CC3366CC3366CC3366CC3366CC + 3366CC3366CC3366CC3366CC3301010166FF3366FF3366FF3366FF3366FF3366 + FF3366FF3366FF3366FF33010101660066660066660066660066660066660066 + 6600666600666600660101016633666633666633666633666633666633666633 + 6666336666336601010166666666666666666666666666666666666666666666 + 6666666666010101669966669966669966669966669966669966669966669966 + 66996601010166CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC + 6601010166FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6601 + 0101010101010101010101010101010101010101010101010101010101010101 + 0000000000000000000000000000000000000000000000000000000000000101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101333333 + 3333333333333333333333333333333333333333333333330000000000000000 + 0000000000000000000000000000000000000000000033000033000033000033 + 0000330000330000330000330000330000010101333300333300333300333300 + 3333003333003333003333003333000101013366003366003366003366003366 + 0033660033660033660033660001010133990033990033990033990033990033 + 990033990033990033990001010133CC0033CC0033CC0033CC0033CC0033CC00 + 33CC0033CC0033CC0001010133FF0033FF0033FF0033FF0033FF0033FF0033FF + 0033FF0033FF0001010133003333003333003333003333003333003333003333 + 0033330033010101333333333333333333333333333333333333333333333333 + 3333330101013366333366333366333366333366333366333366333366333366 + 3301010133993333993333993333993333993333993333993333993333993301 + 010133CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC33010101 + 33FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF330101013300 + 6633006633006633006633006633006633006633006633006601010133336633 + 3366333366333366333366333366333366333366333366010101336666336666 + 3366663366663366663366663366663366663366660101013399663399663399 + 6633996633996633996633996633996633996601010133CC6633CC6633CC6633 + CC6633CC6633CC6633CC6633CC6633CC6601010133FF6633FF6633FF6633FF66 + 33FF6633FF6633FF6633FF6633FF660101010101013333333333333333333333 + 3333333333333333333333333333333300000000000000000000000000000000 + 0000000000000000000000000000330000330000330000330000330000330000 + 3300003300003300000101013333003333003333003333003333003333003333 + 0033330033330001010133660033660033660033660033660033660033660033 + 6600336600010101339900339900339900339900339900339900339900339900 + 33990001010133CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC + 0001010133FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0001 + 0101330033330033330033330033330033330033330033330033330033010101 + 3333333333333333333333333333333333333333333333333333330101013366 + 3333663333663333663333663333663333663333663333663301010133993333 + 993333993333993333993333993333993333993333993301010133CC3333CC33 + 33CC3333CC3333CC3333CC3333CC3333CC3333CC3301010133FF3333FF3333FF + 3333FF3333FF3333FF3333FF3333FF3333FF3301010133006633006633006633 + 0066330066330066330066330066330066010101333366333366333366333366 + 3333663333663333663333663333660101013366663366663366663366663366 + 6633666633666633666633666601010133996633996633996633996633996633 + 996633996633996633996601010133CC6633CC6633CC6633CC6633CC6633CC66 + 33CC6633CC6633CC6601010133FF6633FF6633FF6633FF6633FF6633FF6633FF + 6633FF6633FF6601010101010133333333333333333333333333333333333333 + 3333333333333333000000000000000000000000000000000000000000000000 + 0000000000003300003300003300003300003300003300003300003300003300 + 0001010133330033330033330033330033330033330033330033330033330001 + 0101336600336600336600336600336600336600336600336600336600010101 + 33990033990033990033990033990033990033990033990033990001010133CC + 0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0001010133FF0033 + FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF00010101330033330033 + 3300333300333300333300333300333300333300330101013333333333333333 + 3333333333333333333333333333333333333301010133663333663333663333 + 6633336633336633336633336633336633010101339933339933339933339933 + 33993333993333993333993333993301010133CC3333CC3333CC3333CC3333CC + 3333CC3333CC3333CC3333CC3301010133FF3333FF3333FF3333FF3333FF3333 + FF3333FF3333FF3333FF33010101330066330066330066330066330066330066 + 3300663300663300660101013333663333663333663333663333663333663333 + 6633336633336601010133666633666633666633666633666633666633666633 + 6666336666010101339966339966339966339966339966339966339966339966 + 33996601010133CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC + 6601010133FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6601 + 0101010101333333333333333333333333333333333333333333333333333333 + 0000000000000000000000000000000000000000000000000000000000003300 + 0033000033000033000033000033000033000033000033000001010133330033 + 3300333300333300333300333300333300333300333300010101336600336600 + 3366003366003366003366003366003366003366000101013399003399003399 + 0033990033990033990033990033990033990001010133CC0033CC0033CC0033 + CC0033CC0033CC0033CC0033CC0033CC0001010133FF0033FF0033FF0033FF00 + 33FF0033FF0033FF0033FF0033FF000101013300333300333300333300333300 + 3333003333003333003333003301010133333333333333333333333333333333 + 3333333333333333333333010101336633336633336633336633336633336633 + 3366333366333366330101013399333399333399333399333399333399333399 + 3333993333993301010133CC3333CC3333CC3333CC3333CC3333CC3333CC3333 + CC3333CC3301010133FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF33 + 33FF330101013300663300663300663300663300663300663300663300663300 + 6601010133336633336633336633336633336633336633336633336633336601 + 0101336666336666336666336666336666336666336666336666336666010101 + 33996633996633996633996633996633996633996633996633996601010133CC + 6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6601010133FF6633 + FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF66010101010101333333 + 3333333333333333333333333333333333333333333333330000000000000000 + 0000000000000000000000000000000000000000000033000033000033000033 + 0000330000330000330000330000330000010101333300333300333300333300 + 3333003333003333003333003333000101013366003366003366003366003366 + 0033660033660033660033660001010133990033990033990033990033990033 + 990033990033990033990001010133CC0033CC0033CC0033CC0033CC0033CC00 + 33CC0033CC0033CC0001010133FF0033FF0033FF0033FF0033FF0033FF0033FF + 0033FF0033FF0001010133003333003333003333003333003333003333003333 + 0033330033010101333333333333333333333333333333333333333333333333 + 3333330101013366333366333366333366333366333366333366333366333366 + 3301010133993333993333993333993333993333993333993333993333993301 + 010133CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC33010101 + 33FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF330101013300 + 6633006633006633006633006633006633006633006633006601010133336633 + 3366333366333366333366333366333366333366333366010101336666336666 + 3366663366663366663366663366663366663366660101013399663399663399 + 6633996633996633996633996633996633996601010133CC6633CC6633CC6633 + CC6633CC6633CC6633CC6633CC6633CC6601010133FF6633FF6633FF6633FF66 + 33FF6633FF6633FF6633FF6633FF660101010101013333333333333333333333 + 3333333333333333333333333333333300000000000000000000000000000000 + 0000000000000000000000000000330000330000330000330000330000330000 + 3300003300003300000101013333003333003333003333003333003333003333 + 0033330033330001010133660033660033660033660033660033660033660033 + 6600336600010101339900339900339900339900339900339900339900339900 + 33990001010133CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC + 0001010133FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0001 + 0101330033330033330033330033330033330033330033330033330033010101 + 3333333333333333333333333333333333333333333333333333330101013366 + 3333663333663333663333663333663333663333663333663301010133993333 + 993333993333993333993333993333993333993333993301010133CC3333CC33 + 33CC3333CC3333CC3333CC3333CC3333CC3333CC3301010133FF3333FF3333FF + 3333FF3333FF3333FF3333FF3333FF3333FF3301010133006633006633006633 + 0066330066330066330066330066330066010101333366333366333366333366 + 3333663333663333663333663333660101013366663366663366663366663366 + 6633666633666633666633666601010133996633996633996633996633996633 + 996633996633996633996601010133CC6633CC6633CC6633CC6633CC6633CC66 + 33CC6633CC6633CC6601010133FF6633FF6633FF6633FF6633FF6633FF6633FF + 6633FF6633FF6601010101010133333333333333333333333333333333333333 + 3333333333333333000000000000000000000000000000000000000000000000 + 0000000000003300003300003300003300003300003300003300003300003300 + 0001010133330033330033330033330033330033330033330033330033330001 + 0101336600336600336600336600336600336600336600336600336600010101 + 33990033990033990033990033990033990033990033990033990001010133CC + 0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0001010133FF0033 + FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF00010101330033330033 + 3300333300333300333300333300333300333300330101013333333333333333 + 3333333333333333333333333333333333333301010133663333663333663333 + 6633336633336633336633336633336633010101339933339933339933339933 + 33993333993333993333993333993301010133CC3333CC3333CC3333CC3333CC + 3333CC3333CC3333CC3333CC3301010133FF3333FF3333FF3333FF3333FF3333 + FF3333FF3333FF3333FF33010101330066330066330066330066330066330066 + 3300663300663300660101013333663333663333663333663333663333663333 + 6633336633336601010133666633666633666633666633666633666633666633 + 6666336666010101339966339966339966339966339966339966339966339966 + 33996601010133CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC + 6601010133FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6601 + 0101010101333333333333333333333333333333333333333333333333333333 + 0000000000000000000000000000000000000000000000000000000000003300 + 0033000033000033000033000033000033000033000033000001010133330033 + 3300333300333300333300333300333300333300333300010101336600336600 + 3366003366003366003366003366003366003366000101013399003399003399 + 0033990033990033990033990033990033990001010133CC0033CC0033CC0033 + CC0033CC0033CC0033CC0033CC0033CC0001010133FF0033FF0033FF0033FF00 + 33FF0033FF0033FF0033FF0033FF000101013300333300333300333300333300 + 3333003333003333003333003301010133333333333333333333333333333333 + 3333333333333333333333010101336633336633336633336633336633336633 + 3366333366333366330101013399333399333399333399333399333399333399 + 3333993333993301010133CC3333CC3333CC3333CC3333CC3333CC3333CC3333 + CC3333CC3301010133FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF33 + 33FF330101013300663300663300663300663300663300663300663300663300 + 6601010133336633336633336633336633336633336633336633336633336601 + 0101336666336666336666336666336666336666336666336666336666010101 + 33996633996633996633996633996633996633996633996633996601010133CC + 6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6601010133FF6633 + FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF66010101010101333333 + 3333333333333333333333333333333333333333333333330000000000000000 + 0000000000000000000000000000000000000000000033000033000033000033 + 0000330000330000330000330000330000010101333300333300333300333300 + 3333003333003333003333003333000101013366003366003366003366003366 + 0033660033660033660033660001010133990033990033990033990033990033 + 990033990033990033990001010133CC0033CC0033CC0033CC0033CC0033CC00 + 33CC0033CC0033CC0001010133FF0033FF0033FF0033FF0033FF0033FF0033FF + 0033FF0033FF0001010133003333003333003333003333003333003333003333 + 0033330033010101333333333333333333333333333333333333333333333333 + 3333330101013366333366333366333366333366333366333366333366333366 + 3301010133993333993333993333993333993333993333993333993333993301 + 010133CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC33010101 + 33FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF330101013300 + 6633006633006633006633006633006633006633006633006601010133336633 + 3366333366333366333366333366333366333366333366010101336666336666 + 3366663366663366663366663366663366663366660101013399663399663399 + 6633996633996633996633996633996633996601010133CC6633CC6633CC6633 + CC6633CC6633CC6633CC6633CC6633CC6601010133FF6633FF6633FF6633FF66 + 33FF6633FF6633FF6633FF6633FF660101010000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000330000330000330000330000330000330000330000330000330001 + 0101006600006600006600006600006600006600006600006600006600010101 + 00990000990000990000990000990000990000990000990000990001010100CC + 0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0001010100FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00010101000033000033 + 0000330000330000330000330000330000330000330101010033330033330033 + 3300333300333300333300333300333300333301010100663300663300663300 + 6633006633006633006633006633006633010101009933009933009933009933 + 00993300993300993300993300993301010100CC3300CC3300CC3300CC3300CC + 3300CC3300CC3300CC3300CC3301010100FF3300FF3300FF3300FF3300FF3300 + FF3300FF3300FF3300FF33010101000066000066000066000066000066000066 + 0000660000660000660101010033660033660033660033660033660033660033 + 6600336600336601010100666600666600666600666600666600666600666600 + 6666006666010101009966009966009966009966009966009966009966009966 + 00996601010100CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC + 6601010100FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6601 + 0101000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000330000 + 3300003300003300003300003300003300003300003300010101006600006600 + 0066000066000066000066000066000066000066000101010099000099000099 + 0000990000990000990000990000990000990001010100CC0000CC0000CC0000 + CC0000CC0000CC0000CC0000CC0000CC0001010100FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF000101010000330000330000330000330000 + 3300003300003300003300003301010100333300333300333300333300333300 + 3333003333003333003333010101006633006633006633006633006633006633 + 0066330066330066330101010099330099330099330099330099330099330099 + 3300993300993301010100CC3300CC3300CC3300CC3300CC3300CC3300CC3300 + CC3300CC3301010100FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF33 + 00FF330101010000660000660000660000660000660000660000660000660000 + 6601010100336600336600336600336600336600336600336600336600336601 + 0101006666006666006666006666006666006666006666006666006666010101 + 00996600996600996600996600996600996600996600996600996601010100CC + 6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6601010100FF6600 + FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF66010101000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000003300003300003300003300 + 0033000033000033000033000033000101010066000066000066000066000066 + 0000660000660000660000660001010100990000990000990000990000990000 + 990000990000990000990001010100CC0000CC0000CC0000CC0000CC0000CC00 + 00CC0000CC0000CC0001010100FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0001010100003300003300003300003300003300003300003300 + 0033000033010101003333003333003333003333003333003333003333003333 + 0033330101010066330066330066330066330066330066330066330066330066 + 3301010100993300993300993300993300993300993300993300993300993301 + 010100CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC33010101 + 00FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF330101010000 + 6600006600006600006600006600006600006600006600006601010100336600 + 3366003366003366003366003366003366003366003366010101006666006666 + 0066660066660066660066660066660066660066660101010099660099660099 + 6600996600996600996600996600996600996601010100CC6600CC6600CC6600 + CC6600CC6600CC6600CC6600CC6600CC6601010100FF6600FF6600FF6600FF66 + 00FF6600FF6600FF6600FF6600FF660101010000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000033000033000033000033000033000033000033 + 0000330000330001010100660000660000660000660000660000660000660000 + 6600006600010101009900009900009900009900009900009900009900009900 + 00990001010100CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC + 0001010100FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0001 + 0101000033000033000033000033000033000033000033000033000033010101 + 0033330033330033330033330033330033330033330033330033330101010066 + 3300663300663300663300663300663300663300663300663301010100993300 + 993300993300993300993300993300993300993300993301010100CC3300CC33 + 00CC3300CC3300CC3300CC3300CC3300CC3300CC3301010100FF3300FF3300FF + 3300FF3300FF3300FF3300FF3300FF3300FF3301010100006600006600006600 + 0066000066000066000066000066000066010101003366003366003366003366 + 0033660033660033660033660033660101010066660066660066660066660066 + 6600666600666600666600666601010100996600996600996600996600996600 + 996600996600996600996601010100CC6600CC6600CC6600CC6600CC6600CC66 + 00CC6600CC6600CC6601010100FF6600FF6600FF6600FF6600FF6600FF6600FF + 6600FF6600FF6601010100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000330000330000330000330000330000330000330000330000330001 + 0101006600006600006600006600006600006600006600006600006600010101 + 00990000990000990000990000990000990000990000990000990001010100CC + 0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0001010100FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00010101000033000033 + 0000330000330000330000330000330000330000330101010033330033330033 + 3300333300333300333300333300333300333301010100663300663300663300 + 6633006633006633006633006633006633010101009933009933009933009933 + 00993300993300993300993300993301010100CC3300CC3300CC3300CC3300CC + 3300CC3300CC3300CC3300CC3301010100FF3300FF3300FF3300FF3300FF3300 + FF3300FF3300FF3300FF33010101000066000066000066000066000066000066 + 0000660000660000660101010033660033660033660033660033660033660033 + 6600336600336601010100666600666600666600666600666600666600666600 + 6666006666010101009966009966009966009966009966009966009966009966 + 00996601010100CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC + 6601010100FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6601 + 0101000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000330000 + 3300003300003300003300003300003300003300003300010101006600006600 + 0066000066000066000066000066000066000066000101010099000099000099 + 0000990000990000990000990000990000990001010100CC0000CC0000CC0000 + CC0000CC0000CC0000CC0000CC0000CC0001010100FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF000101010000330000330000330000330000 + 3300003300003300003300003301010100333300333300333300333300333300 + 3333003333003333003333010101006633006633006633006633006633006633 + 0066330066330066330101010099330099330099330099330099330099330099 + 3300993300993301010100CC3300CC3300CC3300CC3300CC3300CC3300CC3300 + CC3300CC3301010100FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF33 + 00FF330101010000660000660000660000660000660000660000660000660000 + 6601010100336600336600336600336600336600336600336600336600336601 + 0101006666006666006666006666006666006666006666006666006666010101 + 00996600996600996600996600996600996600996600996600996601010100CC + 6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6601010100FF6600 + FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF66010101000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000003300003300003300003300 + 0033000033000033000033000033000101010066000066000066000066000066 + 0000660000660000660000660001010100990000990000990000990000990000 + 990000990000990000990001010100CC0000CC0000CC0000CC0000CC0000CC00 + 00CC0000CC0000CC0001010100FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0001010100003300003300003300003300003300003300003300 + 0033000033010101003333003333003333003333003333003333003333003333 + 0033330101010066330066330066330066330066330066330066330066330066 + 3301010100993300993300993300993300993300993300993300993300993301 + 010100CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC33010101 + 00FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF330101010000 + 6600006600006600006600006600006600006600006600006601010100336600 + 3366003366003366003366003366003366003366003366010101006666006666 + 0066660066660066660066660066660066660066660101010099660099660099 + 6600996600996600996600996600996600996601010100CC6600CC6600CC6600 + CC6600CC6600CC6600CC6600CC6600CC6601010100FF6600FF6600FF6600FF66 + 00FF6600FF6600FF6600FF6600FF660101010000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000033000033000033000033000033000033000033 + 0000330000330001010100660000660000660000660000660000660000660000 + 6600006600010101009900009900009900009900009900009900009900009900 + 00990001010100CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC + 0001010100FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0001 + 0101000033000033000033000033000033000033000033000033000033010101 + 0033330033330033330033330033330033330033330033330033330101010066 + 3300663300663300663300663300663300663300663300663301010100993300 + 993300993300993300993300993300993300993300993301010100CC3300CC33 + 00CC3300CC3300CC3300CC3300CC3300CC3300CC3301010100FF3300FF3300FF + 3300FF3300FF3300FF3300FF3300FF3300FF3301010100006600006600006600 + 0066000066000066000066000066000066010101003366003366003366003366 + 0033660033660033660033660033660101010066660066660066660066660066 + 6600666600666600666600666601010100996600996600996600996600996600 + 996600996600996600996601010100CC6600CC6600CC6600CC6600CC6600CC66 + 00CC6600CC6600CC6601010100FF6600FF6600FF6600FF6600FF6600FF6600FF + 6600FF6600FF6601010100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000330000330000330000330000330000330000330000330000330001 + 0101006600006600006600006600006600006600006600006600006600010101 + 00990000990000990000990000990000990000990000990000990001010100CC + 0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0001010100FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00010101000033000033 + 0000330000330000330000330000330000330000330101010033330033330033 + 3300333300333300333300333300333300333301010100663300663300663300 + 6633006633006633006633006633006633010101009933009933009933009933 + 00993300993300993300993300993301010100CC3300CC3300CC3300CC3300CC + 3300CC3300CC3300CC3300CC3301010100FF3300FF3300FF3300FF3300FF3300 + FF3300FF3300FF3300FF33010101000066000066000066000066000066000066 + 0000660000660000660101010033660033660033660033660033660033660033 + 6600336600336601010100666600666600666600666600666600666600666600 + 6666006666010101009966009966009966009966009966009966009966009966 + 00996601010100CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC + 6601010100FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6601 + 0101000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000001010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101} + OnMouseDown = imgPaletteMouseDown + OnMouseMove = imgPaletteMouseMove + end + end + end + object SpTBXPanel1: TSpTBXPanel + Left = 0 + Top = 0 + Width = 213 + Height = 26 + Caption = 'SpTBXPanel1' + Align = alTop + TabOrder = 1 + OnDrawBackground = SpTBXPanel1DrawBackground + DesignSize = ( + 213 + 26) + object btnColorNone: TSpTBXSpeedButton + Left = 170 + Top = 3 + Width = 20 + Height = 20 + Anchors = [akTop, akRight] + OnClick = btnColorNoneClick + OnMouseEnter = btnColorNoneMouseEnter + OnMouseLeave = btnColorNoneMouseLeave + Images = ImageList1 + ImageIndex = 1 + OnDraw = btnColorDialogDraw + end + object btnColorDialog: TSpTBXSpeedButton + Left = 190 + Top = 3 + Width = 20 + Height = 20 + Anchors = [akTop, akRight] + OnClick = btnColorDialogClick + OnMouseEnter = btnColorDialogMouseEnter + OnMouseLeave = btnColorDialogMouseLeave + Images = ImageList1 + ImageIndex = 0 + OnDraw = btnColorDialogDraw + end + object btnColor: TSpTBXSpeedButton + Left = 2 + Top = 2 + Width = 50 + Height = 22 + OnDraw = btnColorDraw + end + object btnLabel: TSpTBXLabel + Left = 58 + Top = 3 + Width = 47 + Height = 19 + Caption = 'btnLabel' + end + end + object Timer1: TTimer + Enabled = False + Interval = 25 + OnTimer = Timer1Timer + Left = 112 + Top = 152 + end + object ImageList1: TImageList + Left = 72 + Top = 152 + Bitmap = { + 494C010105000A00040010001000FFFFFFFFFF00FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000002000000001002000000000000020 + 00000000000000000000000000000000000000000000A1A1A100000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000A5A5A500FBF6F200A5A5A500A5A5 + A500000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000AAAAAA00F6EDE400F3E6 + D900AAAAAA000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000AFAFAF00FBF6F200F5EB + E100F3E6D900AFAFAF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000B4B4B400FBF6 + F200F5EBE100F3E6D900B4B4B400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000BABA + BA00FBF6F200F5EBE100F3E6D900BABABA000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000BFBFBF00FBF6F200F5EBE100F4E7DC00AC8E8400954A2F00974B2D000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000C4C4C400FBF6F200D0AD9F009B523700C6835600C67D4A00984B + 2F00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000B5978C00A0593D00D4A07A00D3996A00C7834A00A259 + 3700000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000A25B3C00DBB29200DDB18A00D59C6C00CC884F00C77D + 4300A75D39000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000AD684600DFB39000E7C4A900E1B69200D3915B00D088 + 4C00CC834900AC64400000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000AD684700C0876B00E3BDA000E1B08A00D793 + 5A00D48E5300D08A5100B6704700000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000C48E7000E4BB9C00E1B1 + 8800D8965F00D7935900D5915900B47453000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000C9957700E8C1 + 9F00E4B58A00DD9E6800DA9A6200B97B58000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000D6AB + 8E00E8C2A200E6BA9200C98E6700000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000C2856000C1845F0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000E1818F00D1496C00C92B6300C72D7700CF519F00DF8DCB000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000E87C + 7A00D6121900E1405900EE638400F373A100F071B200E45AB600D236B400C41B + BB00DC91E1000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000040404000404 + 0400040404000404040004040400040404000404040004040400040404000404 + 0400040404000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000EB6E5100E952 + 4000F8858400FF969F00FF749100FF609A00FF60B700FF78D800FC92EF00E871 + EA00B632CC00BC6ED90000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000161616001616 + 1600222222001616160016161600222222001616160016161600161616001616 + 160016161600000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFF + FF00FFFFFF0000000000000000000000000000000000F69E6D00F0774400FCA6 + 9200FF7B6F00FF515800FF5A7900FF5E9B00FF5CBC00FF57DA00FF4CF700F17B + FF00D685F1009734CF00BA90E400000000000000000000000000B07A5800B07A + 5800B07A580000000000DD9BD900DD9BD900DD9BD90000000000B177FF00B177 + FF00B177FF000000000000000000000000000000000000000000000033000033 + 3300003333000033330033330000333300003333000033000000330033003300 + 330033003300000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFF + FF00FFFFFF0000000000000000000000000000000000F87E0F00FBB98E00FF97 + 6A00FF795B00FF716B00FF768900FF7CAD00FF7BCD00FF71ED00F763FF00D952 + FF00CF7CFF00B373EC00661AD000000000000000000000000000B07A5800B07A + 5800B07A580000000000DD9BD900DD9BD900DD9BD90000000000B177FF00B177 + FF00B177FF000000000000000000000000000000000000000000000066000033 + 6600006666000066330033660000666600006633000066000000660033006600 + 660033006600000000000000000000000000000000000000000000000000C0C0 + C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0 + C000C0C0C000000000000000000000000000FDC86100FDBE6000FFD09C00FFA5 + 5B00FFA27100FF9A8400FF979B00FF9FBF00FF9FE000FE92FB00E77CFF00C966 + FF00A84FFF00BE95FD007240DD00A086E7000000000000000000B07A5800B07A + 5800B07A580000000000DD9BD900DD9BD900DD9BD90000000000B177FF00B177 + FF00B177FF000000000000000000000000000000000000000000003399000066 + 9900009999000099660066990000999900009933000099000000990066009900 + 990033009900000000000000000000000000000000000000000000000000C0C0 + C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0 + C000C0C0C000000000000000000000000000F7CA3200FEDD8000FFD16C00FFC7 + 6B00FFC78500FFC49E00FFBDB300FFBFD000FFBFF100F4B0FF00D696FF00B679 + FF00955EFF009977FF008265EC00664BDD000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000033CC000066 + CC0000CCCC0000CC660066CC0000CCCC0000CC660000CC000000CC006600CC00 + CC006600CC00000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFF + FF00FFFFFF00000000000000000000000000F2DC1B00FFF29000FFE96200FFE8 + 7600FFE79300FFE7B000FFE6CA00FFE5E500FCDEFD00E1C6FF00C2A6FF00A184 + FF007E66FF007664FF00887BF6003D2EDB000000000000000000B2EBD000B2EB + D000B2EBD000000000006DCC50006DCC50006DCC500000000000EBB06000EBB0 + 6000EBB0600000000000000000000000000000000000000000000033FF000066 + FF0000FFFF0000FF660099FF0000FFFF0000FF660000FF000000FF009900CC00 + FF006600FF00000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFF + FF00FFFFFF00000000000000000000000000EBED1800F9FA9200FAFD6400FAFD + 7B00F9FD9800FAFDB500FAFED300FAFEEF00EFF3FF00D0D5FF00AFB3FF008D91 + FF006C6FFF006769FF008283FB002C2FDE000000000000000000B2EBD000B2EB + D000B2EBD000000000006DCC50006DCC50006DCC500000000000EBB06000EBB0 + 6000EBB0600000000000000000000000000000000000000000000033FF003399 + FF0033FFFF0033FF990099FF3300FFFF3300FF993300FF333300FF339900FF33 + FF006633FF00000000000000000000000000000000000000000000000000C0C0 + C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0 + C000C0C0C000000000000000000000000000D4ED3000E4F58200E5FF6F00E0FF + 7900E0FF9500DFFFAF00DCFFC700DCFFE000D9FEFA00C5E9FF00A7CAFF0087AA + FF00698BFF00788EFF007386FB00475AE6000000000000000000B2EBD000B2EB + D000B2EBD000000000006DCC50006DCC50006DCC500000000000EBB06000EBB0 + 6000EBB0600000000000000000000000000000000000000000003366FF006699 + FF0066FFFF0066FF9900CCFF6600FFFF6600FF996600FF666600FF66CC00FF66 + FF009966FF00000000000000000000000000000000000000000000000000C0C0 + C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0 + C000C0C0C000000000000000000000000000CBEE5700C6EB6700DDFF9B00C5FF + 6F00C3FF8C00BEFFA100B9FFB300BDFFCF00BDFFEE00B0F8FF0099DEFF007EC2 + FF0063A3FF009EBDFF005983F8007792EF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000807CFF0099CC + FF0099FFFF0099FFCC00CCFF9900FFFF9900FFCC9900FF999900FF99CC00FF99 + FF009999FF00000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFF + FF00FFFFFF0000000000000000000000000000000000A0E13800CBF69700AEFF + 6C00A4FF7A009DFF8D009BFFA300A4FFC400A2FFDF0097FFF80085EFFF006ED3 + FF0078C5FF0092C5FC001C73F4000000000000000000000000006B6FFE006B6F + FE006B6FFE000000000073AAFF0073AAFF0073AAFF000000000067D5F00067D5 + F00067D5F00000000000000000000000000000000000000000009999FF0099CC + FF0099FFFF0099FFCC00CCFF9900FFFF9900FFCCCC00FFCCCC00FF99CC00FF99 + FF00CC99FF00000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFF + FF00FFFFFF0000000000000000000000000000000000A1E5550094E25700BBF9 + 9D008AFF6E0079FF760082FF970089FFB60087FFD1007EFFEC006DFBFE0076E8 + FF009BDFFC0054BAFB0075B9FA000000000000000000000000006B6FFE006B6F + FE006B6FFE000000000073AAFF0073AAFF0073AAFF000000000067D5F00067D5 + F00067D5F0000000000000000000000000000000000000000000CCCCFF00CCCC + FF00CCFFFF00CCFFCC00CCFFCC00FFFFCC00FFCCCC00FFCCCC00FFCCCC00FFCC + FF00CCCCFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000006EDD3B0074E1 + 5800A1F699009EFFA6007BFF9E0070FFAE0070FFC7007CFFE300A5FFFA0098F4 + FB0055D8F50052CCFB00000000000000000000000000000000006B6FFE006B6F + FE006B6FFE000000000073AAFF0073AAFF0073AAFF000000000067D5F00067D5 + F00067D5F0000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000066DF + 56003AD73D006AE67C0088F3AA0096F9C40097FBD30087F7DB0068EFE0001EE7 + E6006DE6F3000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000058DF740037D96E0022D67A0025D892003BDFB20065E8D3000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000040000000200000000100010000000000000100000000000000000000 + 000000000000000000000000FFFFFF00BFFF0000000000000FFF000000000000 + 87FF00000000000083FF000000000000C1FF000000000000E0FF000000000000 + F01F000000000000F80F000000000000FC0F000000000000FC07000000000000 + FC03000000000000FE01000000000000FF80000000000000FFC0000000000000 + FFE1000000000000FFF3000000000000FFFFFFFFF81FFFFFFFFFFFFFE007FFFF + C007C003C003FFFFC007C0038001C447C007C0038001C447C007C0030000C447 + C007C0030000FFFFC007C0030000C447C007C0030000C447C007C0030000C447 + C007C0030000FFFFC007C0038001C447C007C0038001C447C007C003C003C447 + FFFFFFFFE007FFFFFFFFFFFFF81FFFFF} + end + object ColorDialog1: TColorDialog + Options = [cdFullOpen] + Left = 144 + Top = 152 + end +end diff --git a/internal/2.4.4/1/Lib/D11/SpTBXControls.dcu b/internal/2.4.4/1/Lib/D11/SpTBXControls.dcu new file mode 100644 index 0000000000000000000000000000000000000000..012c2bddaa1d7fee5cdea8962fe877f98e8fa57d GIT binary patch literal 142754 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 literal 0 HcmV?d00001 diff --git a/internal/2.4.4/1/Lib/D11/SpTBXCustomizer.dcu b/internal/2.4.4/1/Lib/D11/SpTBXCustomizer.dcu new file mode 100644 index 0000000000000000000000000000000000000000..926ad090da7923810f3e347143d05614c63c10cb GIT binary patch literal 47667 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 WA1=}7xv2#I<9ULAJ%S(u?*9S^T?x + 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 = 8 + Top = 227 + Width = 247 + Height = 22 + Anchors = [akLeft, akRight, akBottom] + TabOrder = 1 + HotTrack = True + object Panel1: TPanel + Left = 2 + Top = 2 + Width = 243 + Height = 18 + Align = alClient + BevelOuter = bvNone + TabOrder = 0 + DesignSize = ( + 243 + 18) + object HotKey1: THotKey + Left = -2 + Top = -2 + Width = 249 + Height = 23 + Anchors = [akLeft, akTop, akRight, akBottom] + HotKey = 0 + Modifiers = [] + TabOrder = 0 + end + end + end + object ChangeShortcut: TSpTBXButton + Left = 261 + Top = 226 + Width = 75 + Height = 25 + Caption = 'C&hange' + Anchors = [akRight, akBottom] + TabOrder = 2 + OnClick = ChangeShortcutClick + end + object lbShortcuts: TSpTBXListBox + Left = 8 + Top = 8 + Width = 330 + Height = 208 + 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 = 8 + Width = 330 + Height = 202 + 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 SpTBXGroupBox1: TSpTBXGroupBox + Left = 175 + Top = 2 + Width = 161 + Height = 191 + Caption = 'Options' + Anchors = [akTop, akRight, akBottom] + TabOrder = 1 + object cbText: TSpTBXComboBox + Left = 6 + Top = 66 + Width = 149 + Height = 21 + Style = csDropDownList + ItemHeight = 13 + TabOrder = 1 + OnClick = cbTextClick + Items.Strings = ( + 'Icons + Selective Text' + 'Icons' + 'Icons + Text' + 'Text') + end + object cbIcon: TSpTBXComboBox + Left = 6 + Top = 114 + Width = 149 + Height = 21 + Style = csDropDownList + ItemHeight = 13 + TabOrder = 2 + Items.Strings = ( + 'Large images' + 'Small images') + end + object cbTextLabel: TSpTBXLabel + Left = 6 + Top = 45 + Width = 68 + Height = 19 + Caption = 'T&ext Options' + FocusControl = cbText + end + object cbIconLabel: TSpTBXLabel + Left = 6 + Top = 95 + Width = 67 + Height = 19 + Caption = '&Icon Options' + FocusControl = cbIcon + end + object checkVisible: TSpTBXCheckBox + Left = 6 + Top = 21 + Width = 53 + Height = 21 + Caption = '&Visible' + TabOrder = 0 + OnClick = checkVisibleClick + end + end + object SpTBXGroupBox2: TSpTBXGroupBox + Left = 175 + Top = 200 + Width = 161 + Height = 49 + Caption = '&Skins' + Anchors = [akRight, akBottom] + TabOrder = 2 + object cbSkins: TSpTBXComboBox + Left = 6 + Top = 20 + Width = 149 + Height = 21 + Style = csDropDownList + ItemHeight = 13 + TabOrder = 0 + OnClick = cbSkinsClick + end + end + object lbToolbars: TSpTBXCheckListBox + Left = 8 + Top = 8 + Width = 158 + Height = 241 + 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 = 264 + Top = 4 + Width = 78 + Height = 25 + Caption = '&Close' + Anchors = [akRight, akBottom] + TabOrder = 0 + OnClick = CloseButtonClick + end + object ResetButton: TSpTBXButton + Left = 7 + Top = 4 + Width = 130 + Height = 25 + Caption = '&Default Options' + TabOrder = 1 + OnClick = ResetButtonClick + end + end +end diff --git a/internal/2.4.4/1/Lib/D11/SpTBXDefaultSkins.dcu b/internal/2.4.4/1/Lib/D11/SpTBXDefaultSkins.dcu new file mode 100644 index 0000000000000000000000000000000000000000..a589ce0c8deb767b45d86200640160dc69e9339f GIT binary patch literal 58646 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 Rja#l0x?-6jbk(x?{{t_N%~SvY literal 0 HcmV?d00001 diff --git a/internal/2.4.4/1/Lib/D11/SpTBXEditors.dcu b/internal/2.4.4/1/Lib/D11/SpTBXEditors.dcu new file mode 100644 index 0000000000000000000000000000000000000000..6038b9901f259773c6fbc17f82457cbf07b7c438 GIT binary patch literal 105355 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

_O)apk`J`K9B%V{otfzWL-0 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 literal 0 HcmV?d00001 diff --git a/internal/2.4.4/1/Lib/D11/SpTBXExtEditors.dcu b/internal/2.4.4/1/Lib/D11/SpTBXExtEditors.dcu new file mode 100644 index 0000000000000000000000000000000000000000..f868a82b946a22fed36cb2aa8c685e85db9fcbfe GIT binary patch literal 34385 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 literal 0 HcmV?d00001 diff --git a/internal/2.4.4/1/Lib/D11/SpTBXGlyphs.res b/internal/2.4.4/1/Lib/D11/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/internal/2.4.4/1/Lib/D11/SpTBXItem.dcu b/internal/2.4.4/1/Lib/D11/SpTBXItem.dcu new file mode 100644 index 0000000000000000000000000000000000000000..1cd202078ad847edc53c1bd3c93eb62cb8c4f4e2 GIT binary patch literal 258253 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

6c3|EFQJBr!t=ZE*z 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 EKXAwT5dZ)H literal 0 HcmV?d00001 diff --git a/internal/2.4.4/1/Lib/D11/SpTBXLibDsgn_d11.bpl b/internal/2.4.4/1/Lib/D11/SpTBXLibDsgn_d11.bpl new file mode 100644 index 0000000000000000000000000000000000000000..7eb930cd1904534c6ce82370a2790d618e9a1ff0 GIT binary patch literal 165888 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 z |dzlnxtmZ5iyQ8f2Fl*{XzYy8^0eZye6BX8VQs#J~oM#KBjzRh-gtZ!-o*J_m8fxj^O9IM)rHfv#zybtbfCnV*e}L zR(b-^=vbDP-{yrwD$NDMft>5RxzbnrqV%0;Ys=Y=;GE7Tm8Ll7;b?eo%O@`l@6gJ0 zDk<$B&As~dH5*+0hTC8i+Q?Vwxh{;*jnZd}fvjtzx%>xS7uD5x(f{n@qnSJxWX2-{6nsB3#o`H#e^ceR*_V9g zHC5B`JY{OuZ$jj6BTOAtypwy^*WZJw^5g?rW`R@IqMVONQuj-v7IJHZwKw+Xtxsuk zA@Yxh9wGU)k9bU@{4#L%)mc-6`O;mZyy?ljMr-P<8R_ruOTMD2-o-U_s>Sh|)Rf=a z+cz*=`b&(dbJM6!wV~t=uc=e|JbLNySbi&|*Fo-nhF@TczauMnG~7mMH>cc2cQ3ye ztERZG`aU=ks+8}oH6w!q{DsGKFIiI~^h4n{vSZ8TJ*%lz`i-`v%gVn8!dv2z&|!v; zV&lyn<}2w=G=J^#Y&f}r*6{0kVZM{?8M1ZGR$jVf;dkKTDNW9KwvAMAye8RlhKlvW zQ>rHV!Qmw`PudX)LUTo?c*fd(c$@v4Q;S6T))ohLBtCESr)OF%NF9^5F`NzM)Gw{-W zAueFQ-W<*6`BogmF239A;ai=(Kg+-IhQxun{CjQ8LKBY8;cqeg41YgmHf2A}y4b^d zO~1h3CU^&b(*o(`Oa7}6%~*>~_$2-ie~pWt65>i+ix1$}a0GAqUHUAo=0DgVxE0BS6+ED3>!qP_KH$@G;bL6X_>d_{BX7v|kLdQQm zszPrVe(${U#bcu{!$<0WA-(3eriagMOE>WkDYuOFPyOrRjkb0UCnX$7Y=6pMBR|LH zt1puVS3Xr3&SUKz)aag!cVfR-Rr&hyUtzcTZ+e%)n{D32w-gEmdDT_2JW-R&OW&mN zH`Gi2>ha(7A)ep)sm{Pm{szi4{)SHB;=-kcIfW|Av`UD`IM?TWT{w6(M?YFpZN zW81B5ceJf+rHTL<+f+rzSj1ww(qumzwM>A zY3&!cU)nyW{fhQ?w70Y`YG2xZWBaY`ceJl>zq@_3{lo1Kv_I1RX#1zyA8&u6{i*h+ z+rQZU<@RUWzt;Y(_V2cTzx}25X&o1LT-q_GR8%wW5=x>cXX`pxVvMt zfbUf1WXve2I9`AUf(rfnof|s`J4ZT;onxI_J5A@d&h4E$I(K&N>fGJAzw=Kz|E%+}t~p(o zcU{r-_O5qyE$!;=>ggKk8tdBHWxBR?ZSUIAwXm@HP5!cPQZuWKU*WGg62d^8s?!(vZx^DkDbn> zz2k7lk&dGs$2v}Soa%U?<8;UL&Zf>;owGaVcFNA>ohwV%JY4VcHQv){JNI_(>wJ={ zeW3GT=b=v5dARdP=kuMu^W{#_HMdK4E$AwAE$>>%m0#P{*R`>0kUQX9u6^~oPj>Yz zT)S|P>t0+qws7l0vvAwO?F)A-+_`YiLc4J9!hH)5Ep!VHFFdmFg@vaVzPwN@n!c!M z(Tqhi7cE#+ShRSNTC{pm_oALfYZt9sq!;xq+PG+N(a56WqOnDL7THCI7P&>wEjqsF z2aA5R=%Q=F|4B4&DN23LEUxF<3s)C93QGz%6mBluUU+}u&caaPp2Gcwk8*WCQTTM> zvxVO&e7^8Ug)bGpQuu1&n}u%|zE^m$@Z-XTT<^=8FK>Q(^VQ8A%}bhZ;L6|L{Ql-U zn}?e3X}-Vtqs+;V%%`&;g88EUzw<^GnBwtT$h6D{nh;yn&wZb26273LQfu>b#_ z9`7A*U7Q@xYk9xK-%jJtZ@q>%`5Iv^4h7SNc>`fSk>NrpB0-ebE3&-tr-fNd{sH0$ z(Gs^4|A=Ubo_LUW;cQ`!5f>0Ai8m5?Yi0(Cvxy%k7KjIkD~aDEYGTvR2s1{UPuxjd zP25KuAv)qt;&I~ViKmF3*mNQLKSvlzED*bhHxs*wBgBowM~Q}bfVi9ZHR67vc#AMc zh?fyPu|PacypcHbb^Liv;(X$#iHi7T;##67ju2lWZYT2I*jQo<@gQ+6@fh&|;w14& zB5zR5bHv$1@w04;xPZ8lcq3602Z>|Ej}vzic^_`}5f2d^@i_4~@de^3;;hR#{)=df zD2d&~F5(EWoA@YkBk>^75Wh*>O}y}}96#|L#3RHTiJmw_JWYI*IP+rGBhDv&i>Qb* zB*#XaM;sw4;&$RXq9tx69wb`gG2&t3Byp0+TXZw?Z5%(bi&!A8Bd#QFBWmK4#4+Mm zh&zcd5cd)1T*2`ZyNSn%W5iQLOKh6Kc8HRAlGsI@^>frEwh%WGdx(a34{IG=bYQ4t>@t|dN693ehS+)g}Aw8U9ga{R=riN}bm ziIc>;iF{CDwi9O)pCA^9M~N$mlSEBydOOEPoKM_ITut0Z93nd6F5+?G)5KH6$WlIr-f=`F%P0gE{#l zIr-x``N^F8>70Dir8(z6CqF+Y-<6YJnUi0eli!$=AIr&a&&lu3$?wa_AI!-g$;ltj z$xr6wPv_*D-js9xbMo_Z@?AOkl{xvfIr)t_`LUe*_MH6gocz9={K1_3k(~VTocv@? z{&Y^hDNNFNl;@@8@nv>Setu5AD<{7)C%-l)zcD92mXqI}li!__-hrd@Wb5yFTekk;w`c30ygFOIr#)ML>!NJ^y-Tz8XRONBZ@W2Lf8Fib`iIwL z>!0k+)}M9v1!A&#IO1iVr;oqyL)rCr+>>4Z!2Q|v_xy5p{plaguD@VByME8FT_CoH zH$w68{H|+!iOpGv0!(${((+ktgw*K_r%+}xW>1_StZ)NL0Kat)4<@>Vx zKlp!S_kY*#W!u~O`Rw{94rSM$@x|==ZC}pr-=ROt)<1D9yML?yGF$(-=d#;B^#5e* z&pVzipYd1O^>=+OTfX({+4WC+BU^s-o7v-Q`$~fZv-P)riS|iG$t z$7yjXdz$CP)bY#^Jz@Q;_0Igf8VOL^GZ+3HNSop7yIh@0xpKzTo=J_C(wH97;0 zYc@Lf<(l2%dd|fP_Al&V?LBY{`y8%H<9i@m+UOq0)(HDidzai+y7HmkDscyUaBJN; zs;?2YRC_Pg*9u#^ICEW>b0p!8&c0g9+0bg^lF-td8n$#jXC|Dza29VSuI9HZ)34cb z+x7Lr*3PwV{gIUK+wA_9v-L+(E(tAVuW`Ag@f~^tXY6Kp8{PZ0rD0pyJG-_<{WUC~ z@z-bWnAO}#OG|gsPvzvpw(`otRzB}-XzCXu9H2o zn@Tl$s8fCg*R~N_NSBAbK3koz&)Fjj{l+`F+G}`)h5K!FJWJVEOv?6Nz3dsQf1PH}Mtynx8LO`owo}_qI8Wi#70%ikUMttLoV^peOXsq- zPT1bL)T`g-t!yLA6T&!Ho!MpEYFwv&n~m#*ZDwCP)q2&QBzx~Psu8w#_F7?Ub27cl ztsLDunep{-q~VqEPF_P{K6^d)Wf+souafLBuc0i|340P|yZQCrMGH5Vu3FNkmfOo- z+pxtI{4Ag1JU6aWf1VrH3rC(E|3ba6Z{=|?dlhO+!*-^w5w?)M0<~?FkG+0B!kO>k zC!F#6t)xpE??<{u*pKWhbWQ2%_HYN6Up2L7KV1EEdDzO?>V)mo*13)AS01g)N1HvK zu%)G?Sw)y#Bt2jDtTn0;_UG)i!X9P&t)#8;o@D1tNm;m)dur~CbV=B9_IjmD!xn2x z!`8ygFzKIak3L&ke>KC%l3u^jG2K!cFOv4NS30~F!&s7(h1RDkufKxj^}}ns`re@S z7?N$I$J^R#Q(vRe6|Aq-=zNAgCV4j+`kUH)$(A-cpV=B=3$Lf2DUZCX=mo+#53}9Z zm-@7@tz>Kty+fEezM&=`=B4Fz*6>SSH&H*-T@~-^`Fv8qKb0!Efb#HAsm}~bzob*j zhX0t-|M+d3umpZsaLx($yc4Is%>TipRM4P6S~z$b6_8*-X&6{Ic>d2z1tb)Bq75t@ zeApNy6f_Jh9J~-L3M-+YVPN6l*+~Hj1q}lW2haZzs(^%ohJl5H7fP_3LL&TV7+5&? z7+5&?W62rEsW7C{c{>9qIz3Dvv zH_a~!et4wwFC!+5BY$&Dw*Ze1p zGvQbEg7P@Sg81U)3DT*D5rY45Qzn7`vdI1F&W|%vFrG*#Xc$;Hc*YU|2?Y%U3kT0w zA|RolVPN6l8A}8t6f_Jh96V!*fP{jEfrW!-ED?}U&@ixY@Qft_5(*jy77kvpc}OT| zgdYnB&sZWLp`c-4;ouod1SAwR3@jWxV~K!-f`);GgD>4@hK(2+GE_Fkz{0^ZmIz2F zXc$;Hc*YU|2?Y%U3kT0wA|RolVPN6l1*=0sLBqfz{CLI^0SN^S0}BVwSRx>ypkZL) z;2BENjJbj^n zgo1{Fg@dOr6p&ERFtBj&^o0Tv3K|9$4xYYHKte&oz{0`P7YaxyXc$;Hc=|#C2?Y%U z3kOeMC?KJrVPN6l1*=0sLBqfz{CN680SN^S0}BUFUnn47lW@jri^*974nE-(b*8 z4);IQf6sqz7dlYSTtGlVLBqhp!3!k>B*Kq|frW!-E+8PGpkZL);F${uNGNC+SU7m* z0s;~W8U_{)p1FX4go1{Fg@b1X1;-Ft7+ep1FX4go1{Fg@b1j=+ zY3HiC$4k?$`q7WB>S*-1iaZ}P);>D2`S{N6%$aO{P8|K`)aK*oeRcWL2YTYg`g}49 z{Y&T1ypkZL);2BEypkZL) z;2BE4T7jj89!Tc$ac@;NV-ep1gv7oIMEWzUnY zm~kY%KXkl|Lzzci|9bv&yKn<}`a%H-1q}lW2QQQmkO)5-1{MyUzED6yLBqhp!P6HC zNGNC+SU7n4LIDW{4Fd}YPhTh?p`c-4;o#{D1tb(S3@jWxeW8Gaf`);GgQqVPkWkPt zuyF8#%|jv_xkmW0aPahn0ul-u1{MyUzED6yLBqhp!P6HCNGNC+SU7n4LIDW{4Fd}Y zPhTh?p`c-4;o#{D1tb(S3@jWxeW8Gaf`);GgBPq02?Y%Ui}2&=3k4(;Gz=^pJbj^n zgo1{Fg@dOr6p&ERFtBj&^o0Tv3K|9$4xYYHKte&oz{0`PCkjX?Xc)Y@ezLX`sqHsw z%d`DxZE4;-y<9JUzFw)(@LTwD>5tC+bGzy)uWBjN)25#!t<`kRscCUC?JW--)#-Cw zq8AU3+Vb@5yFq#8-9@AF^t+5k<>_}D4a-ySI{p=wXWpGO*uUy&uAJZ0CCMztwNjJaYj72?Y%U3kT0!KtMu4!@$D9GZzq$P|z^2aPZ6p1SAwR3@jWxa{&Pf z1q}lW2hUtUKte&oz{0^Z7Z8w8&@ixY@PgGLp`c-45q>;#0RagG4Fd}Y&s;!2LP5j8 z!of2a5Rg#NFtBj&%moA_6f_Jh96WOY0SN^S0}BVwoIpTALBrrDnhrYPm6x8Uy72Hk zv=C~9F1OTvDUo#9<>%$Dy7HVl>H0iPo>vZlh5F9-{O5Mz2J-ZU0ul-u1{MxpC?Oyb zel!d$96WuYfP{jEfrW#oFBFha&@ixY@brZO5(*jy77m`iP(VUK!@$D9(-#UzC}lj~jHzr4GN* zdx>(Zr4Bz<$Xh=SK$$sydi^;5Unn4)INZ!1>T(9x`yj)tD zrb|}++&GzfcYqnoo&hBRRzqY*g`0LBF$6r_e&%FJ*^UDTb z(fO~rey{ZSYqlSr);+4%=il&B-sg7b|LzbSv#0a*bgA!o{;+c7*pc5C&K$^YWdzx%PVu_qpTYTvEZ0h9V) z7=G(xhwdAA><3S0^FO%v&d0v@)ZLH$c~8_OqN%Z8B*nZXmW=2}$~&=fCGaw+k;o&sZWLp`c-4;oyZ50utdz!@$D9 zGnNQQC}ypkZL);2BEypkZL);2BE&6dwCQxqjXA8*X^)hd+GGCtWf1 zYoC{U>rz);-d^Z6*?x6*!ct{#lDB+h;@gz)yp$_w+lCrr!N$c zP|z^2aPUG20g3RVVPN6l=?euU6f_Jh96WuYfP{jEfrW#oFBFha&@ixY@brZO5(*jy z77m`iP(VUK!@$D9(-#UzC}3kOeMC?KJrVPN6l z=?euU6f_Jh96WuYfP{jEfrW#oFBFha&@ixY@brZO5(*jy77m`iP(VUK!@$D9(-#Uz zC}nCeFk-T|%xnAS>dAYRQua=+J#&SPfo3B2fy8ZOO zm#OJZOZ{TC9hTCaZ_<+{lh|^lb0|;0cepk4v0BppW7YQ%6AjC&?8jc%`WajNFOwZ-iFsp%p-3|`6ScE*H0 z$FWxa-?cwldR&o&qmLgw8vZr+6^~zW^z`=a+n;#i@lxDQ{xtcq5P#_#-x&LqbBLjS zs7E{7iKW}`ALDka;r!>5Tp#C|^KhBGgo1{Fg@YGL2uOq<4Fd}Y&zwge3a~=T+1q}lW2hW^GKte&oz{0^Z=Mj)l&@ixY@XUDxBos6Z zEF3&@9svmj4Fd}Y&zwgBp{)nVepg9hw|n@ zjprwoc~2as%Aqpf$&5CkG`4fqnZNq0ze?WrF+9iJASmn~KNxnwGTzY@wU&>+zlehV3X$IbGo)AOg6{<%Ic+tc$> zhcl;ZPctX+{{K7)?TI2F!jOihA*0Zi2owPkhJ=hl zTOv>dL>Lk>3T=r%5fEWW$SAZW0!2WCAt9sCmIxF95r%|}LR%tG1Vk7TGK#P`6af*2 z1b-CT5`iKh!jOH zihu~ileIJ6zRats>2rZzv9TkppYKhZURSzaPwHU*|2HU!5)ffX$S4v-pzue8At9qs7YY;s5r%|} zLR~0O1Vk7TG75E}KoJmONXRJEg#txDgdriLP!|dm0TG6Tj6z)~Py|F65;6*Pp+FH3 zVMxd*!s?;$J&*85LPnu36et2B3<(*9x=^49h%h8%6zW2OA|S$$kWr`$1&V+OLqbNO zE)*yNA`A%`g}P9n2#7EwWEAQ`fg&KnkdRS?#i0m@FeLb+P!|dm0TG6Tj6z)~Py|F6 z5;6*Pp+FH3VMxd*)P({?K!hP7qfi$L6af*2gp5L+C{P4M7@n-2T-PDH`sF>{_WpUF zJNDCi#A-bD*H`gVaLoUBb>}gQ&lL_eYp-DI{4u9lW$iVpSHNTM))P&Y|F}Fg^tkvi zzgEV>^6UKl%3?P7>=Tz?uYb0zPafMokDRaH)6BPT*7$hRW6O_M8pHNK>*al=v*FnK zecnmiKWqFv>9O(~uS|B7|Ap_4S2S(;)$v;|@9UVCpD#2U*6Xj~_0zQcmw0Mdhzq;KJ%*Z=wdeEpMS3u)<{~x%}=b<2qA|S$$kWnOvK;e%FLqbNO&m&L-L>Lk>3Vj}dA|S$$kWuLK2owPk zhJ=hlpGTkwh%h8%6#6^@ML>ihA*0ae5hwy83<(*9K94{V5MfBjD8lNY@I8<4M?yxS z&m&L-L>Lk>3Vj}dA|S$$kWuLK2owPkhJ=hlpGTkwh%h8%6#6^@ML>ihA*0ae5hwy8 z3<(*9K94{V5MfBjD8k}U1Vk7T{88xh2owPkhJ=hlpGTkwh%h8%6#6^@ML>ihA*0ae z5hwy83<(*9K94{V5MfBjDD-^o^ihA*0Zi2owPkhJ=hlTOv>dL>Lk>3T=r%5fEWW$SAZW z0!2WCAt9p(i$f6*VMy>tp)C<80wN3v8HKh)pa_UCBxDrY5`iKh!jOOz4cAi|K4QK$1xV2Ai|K4QQE1TlyN|W zAt9r*(>yEVfC$5r)syS~*{*(hPuKg;J-i(EdUY8)g?c?Z#jK}J&i`3|esb*P`b4Y3 zrwtmb-(F2mz5beLs_a`f`{if1|0tnHlwWW3=HsdG*GmtnrUa|py|u)A{`}xFuQj1# zg5%5kD#qDt{+3}j`%65zyl;1w+E7H#obGzcyw1v*C3k;*@^Bnp>QlF0JiKw}AERWr zaF2VH_2%RGYZo4Hzp_q?ZO&i2aqYp;rK<-QWOMF-=?9mtU%RlmckSAxaazug)6AHr z&rj3y^yjB#i5}As-KT}gKJC$c+9%i3n@iVQoxpnQ{Pr}T9_tJy`p&P%%j?>99E=kE z7r)goIU7ubKN`q3;+e^M4E$I;`Z)AsaO1FUEoFanaPW>$?ne)<+P!->t{xp-y|?M( z&AB0b(8lN5_})PqpKD{XAiTNiyL;6GKJ`|JCugEMlLDTWuG=lSMq?)%%f;zpln zWA=X$K{@mjv+V`x`vJA{6xl3%;og5p1oQnQJveu8;fT-kde~3YYxNA~l<8s4VwRtU z{Y+kl<@_StPW5qlE=pGESIaYdzPx8Y5Buy{xSr{=aGgC1d+K@mQ-sGC#%5FZw=Ft6 zvp=hFKT+CvaX6kN@Ojj09RFdsacSH=&aH9RIIpf=?t63N;K4L~b(+5Wg`3`d(6{;S zgJ~ZR4#s`tgX`lyZZ;2kY9D{r_1Y)(w7T)ZT|W|({axQM%KZ~wf`^C1Uz(4PhVTjF zx;L8-TE5p>z6S>%)O@uF543w%h8^%WvrqeZ)u%VJ zG>hq@Y1z$ZG2M@Yud7X;KR->|wP|`Df6e2^UdsW~$T~mynENrzv%?rY>o(? z81_o~2wWG81J|U}U|jnU;##MUcxJL*|Lot_6YfhZ0wN3v8HIb&0!2WCAt9r1Pg;h40wN3v8Ks_Q#!8HgjKpS!gp9&HX@Mdj!jOnR7!ooH_oM}i zfCxiEM&X{cKoJmONXRJMlNKlfA`A%`h1aM+5fEW`y8G3;?o)5Sf4u9y^zQr7EuZ7J z0PFjL+yBcn@6Ua+HZ991{`2uFzTK=ZUl&^LSB;uI)%{xh%jY4$P1ob)Ow2R8!@BIZwRT3%obLWp<|N*? zGeUc!2#7EwWE9#Gfg&KnkdRSmO9YC52tz_fp)C<80wN3v8HKh)pa_UCBxDrY5`iKh z!jOi<5;6*Hi9it$VMxd*v?T&XK!hP7qtKQJ6af*2gp5L4 zB2WZG7!ooHZHYh;5MfBjD6}O4ML>ihA*0Zi2owPkhJ=hFEDl9LgdxEng|GFDry9ho-^pT6+TuaDI}6=M%i6>gp1s^(hJZVk^W=$>D%uv@s*-(G?D`Bb^J zBKGiN*nfV6^F%mLgb^n!0wN3v8AXIYDT;syLqbN8AOeLyA`A%`g}P9n2#7EwWEAQ` zfg&KnkdRTR3k8aR2tz_fp)M3C0wN3v8HKt~pa_UCBxDroLV+S6!jOihA)`Lk>3U#4C z5fEWW$SBl>0!2WCAt9qs7YY;s5r%|}A}kI?K!hQ|AEljIs*D373<(*fopwPP2SgYW zGD?75)A$1NXsweg3(H z_VvUY_u3a78Q-f%a`(9XM9aP5YmN76K0LLIk3aiihA*0ae5hwy83<(*9K94{V5MfBjDD-&*ihu}1LPnv_BTxiH7!ooHeI9`# zAi|K4QH0e)5fI^zgp5L;N1zCZFeGFY`aA+fK!hP7qtNFOC;}o32^obxk3bO+VMxd* z^mzn|fCxiEMxoCmPy|F65;6*X9)Tht!jOksYf2W{{FO#Pm* z9jOyje`o!1#h#DH-{hw+d6t`e0(Bn0A%ggC^E9+t!-q1Dj)?j;KZv=CKlkc?d-K)W z%r4V!Zl1sYYF)`H{^;nOoFki6KE6pc`SEz)$SvtNE%~wZHSsL{vUmu!mUdn`Ly|gU z6+eDLboS$#i%*8G(tB3J3Wi+A(X(vfm+k5P{-l&3QX&iq8AXB!6#j@XBxDrY5`iKh z!jOpKoJmO zNXRI(B?3i2gdriL(3S`k0TG6Tj6z!?Py|F65;BUgI1~X9h6H~U+7f{xAi|K4QD{p9 zihu}1LPnu25hwy83<(*9wnU%^h%h8%6xtGjA|S$$kWpw;1d4zN!;`f$t$i7*qn+Px zyGd1l{?*=&e0_8O=>F#1tLOdqwy44g|BpA1{?X0*V|a7!=-jK`Jk+X~`tbhI&3|-% z7Tz4S*?s=zew*##X>)vP`UroI-+#YNIFUs-PlWSCI8TK0L^w}`^F%mLg!4ogal#@X z!jOOz4cAi|K4QK$k@PH#3BX44`sj`5od)AYT~G<{*3=5FU0 z&n?Y9?KeUDwBPCM(@gehpM2`+{&8XQ-!bg3YxBOpMt>y~fg&KnkdQ%thL_8}zotTI zAi|K~kJ2s$R2c_E7!oo{yG#hmI3U81kWtztL{!EB5r%|}(k?Gd83#ld5;97=^hnA$ zAi|K4QQBomR>lDlhNrl$y*Uk^zHsy5!*u;)Ep%mmEe?wvq^MzPnpbj;>;cLgs@c5=&o4>iYod2lh`Lg&t zKbpivm}YSv_TxAYd#gDQ6MSyr-ip36Z13|Neb)V=<#(_-U;56{FS^rrlz!1TeR$*Y z_UXe}{1W+ zjpyI@_3OL(yi z)9hCte4qQ^`#lb`$(p`457ZV#nK!d4!``1Vwo#QT2g;EP>uczl;e|vd&UFOHd>#^IHDK^fRJA~iy^XA;}`guo$NoHPdub(?FzC%)mbHnTB zojRKY_2tDu+zP_TNLJ+*A<|VMxd*yhkZe z1Vk7TG79fe3KRhmhJ=j5dz1o2K!hP7qwpT3KoJmONXRI>M=4MQL>Lk>3irGOihu}1 zLPil*4@E$PKN2zu?@3>V<1`h5Prohh^>0!2WCAt9sCmIxF95r%|} zLR%tG1Vk7TG74>pKoJmONXRI(B?3i2gdriL(3S`k0TG6Tj6z!?Py|F65;CZVMW6_X z@JB*Mp)C<80wN3v8HKh)pa_UCBxDrY5`iKh!jOGw=eU0iq8j5zdt|zKhIvrwRU7)`7hIt|Ic$?SOz4cAi|K4QK$2n0)_8+gg+883U#4C5fEWW$SBl>0!2WCAt9qs7YY;s5r%|}LR~0O1Vk7TG75E} zKoJmONXRJEg#txDgdriL?CVJ{;K!^d*LBFQetA!~y?@^4j{Wo=u^Ny4^;P^79P?jR zbv<;d|L55&Qy;h9|Iq98)%nH1Vwhb84D(mZ`!-A)x@GzG{MGWT?ZoAe&Ho#={IT*~ z?f*bfn&sTSBn2!IKc*^?;)AxYS5~AO5=5*InUT0_O+mq^< z@kZfOzVC8(I#3U1Z)L8gU%Y+Dy8zsCCf=uAoqmyF%e23D(Bpl&FFS7aGXLo<)rVt> zr<_<`*S6zel;~&mzDwQw@%^qF!_Ow)=syU3_k$NH(L=f5V~UEf4~&J9tKngOD~G%N z$2!-=vh0_({gfA;=lSMa@X~5CR_~k4-}Cd7V>$H2R_UL~`!4e{+1E2ao41Gk3~gs- zoA2Rv)(+u%Nc>FS9-hwfHh((PTiBoL@X()+ZO?N!>+9N{%hRsc)AM`Z!$JJ+w*^N8>R;_sZhe*Lvab4e*StzJB#<+9%uMG+A04j^oIX! z!2blO*ynMY{iZp3(A?mE3G_W7Js*i^!-K24rl+4v-^`Z1`dpS>uB-1?{htSIzxw_S z<7vO9C4GN(y{?{DJM~HXd>8+x;L_10%Kk3J?f*|_=l?%=;9Kec-@wQGe}hXtp8Y?B zaemFX<$L7+|A2hIEdT%DlE3(Q^4A?F7Oe`PZTyo>t}QgFeGFY?!^fd0TG6TjKaM*fg&KnkdRTh z7bj2zL>Lk>3isj!ihu}1LPp_UoInu}VMxd*`}=fWz^A-VH{74|8fY=J`(}&pWf181 z<8E%wErxy{Zj6^cd&p-<&*lv?di-Lg1a5BpM#y@-gj@V-z30yD<6D9Da(L|We1iK; z%YIvHXXMQ3uDkc`Orb3iC;}o32^od9M4$+WFeGFY+7f{xAi|K4QD{p9ihu}1LPnu2 z5hwy83<(*9wnU%^h%h8%6xtGjA|S$$kU>2x0!2WCKN2zuZHYh;5MfBjD6}O4ML>ih zA*0Zi2owPkhJ=hlTOv>dL>Lk>3T=r%5fEWW$SAZW0!2WCAt9se+Ziw5$82Z3eVNzh zeBY3|yw+JX1+6`4VX{2e+L7_=i&SQxzOb1uesi{bZ(@3W&oR8HRTtaifpt~t^`s8= z@0(K+B_P6(kWnOvK;e%FLqbNOE)*yNA`A%`g}P9n2#7EwWEAQ`fg&KnkdRTR3k8aR z2tz_fp)M3C0wN3v8HKt~pa_UCBxDroLV+S6!jOihA*1Z;NiX2X ztS8rX$QR~)^M?-?m0t_Ye~0H-bvX3Z`yP$g1igM9`s~N%_e+Bv^C`+9ht}7fmS1n+ zYX0#Jtk)9L^5cf>$bUb7Spuu_-EmF!_~m=*HFq2o^T)6^n4G!9+g?T9$(*{xb{H{ zeu=)XI6G)h`hD~9EIGW)8=i;#45cVqcqkJ}axs4${?eph@9(gG>+RnWo?ave2bZTs zpKxkdz2>hgAAY-yhG%OpHu_3Tfrm%&l<7yF)PL%mckK7Ye8%m=+x7Rw>hz24_r>Zo zzc1F`d%o?z@-@5<&2;~=FH6>+|MKKMeXmZm=~~nI+w?L-x8Esi72utF#1Eu{g+-mpS~vY8GoT=72j7|e;;j3@5k?*zLn#6S+AYH3f=*2tz_f;aXFm2#7EwWE8G71&V+OLqbO3T2r71 zh%h8%6s|P|ihu}1LPp_QQ=kZlFeGFYt~CXUfCxiEMiEvIh3|QUKN2zu*O~%FK!hP7 zqj0S$Py|F65;6+cngT^YgdriL46k=(91vkh$S7QE3KRhmhJ=j5wWdH35MfBjDEsSB z%JZapbl#0#Uw4k5pRS4e`#*h&@qHh^#`1Lx--oPs@VN5z-xu?=H>q2FE~C2WFyAAV z;T9az55e{WXXI8B*ZgW;zp;rTByFuyl6!}3$>SR>}k^Gg71X+jzk^nPBW$(qXAoTWi_UUJi5Q;O^B?O9q2tz_f z;aWnV2#7EwWE8F?1d4zNLqbO3T0)=*h%h8%&<_`{XBEEZ5&lTXC|pYj6af*2gp9(q zgg_AxVMxd*TuTTP0TG6TjKZ~qKoJmONXRH$O9&JJ5r%|}!nK4z5fEWW$SC{k3@_kQ zzTdUJ-snB^<#k7oU0;9n_`k4}X61SIZe6p1Xg)&G>M>z+e7~=s$n!&zbda=Ii*YzrKI}FW!3VZ~ysb z^P7J)Tj0a<_wT>^?z?Zj#s3zXXXNS6{}=CiM(5_~YyRio{R`Ieujlzc{E!9eaBiN> z!-v24@7j!WtL=aIiw}SG*XRHGSL^*{+qRd_Y@C;}o33H~V5g#txDgdriLP!|dm0TG6Tj6z)~ zPy|F65;6*Pp+FH3VMxd*)P({?K!hP7qfjRb6af*2C#xrCRb-vq)i3Yq#(K0zEXHHK zx`>?uy`G(7)>9|vzwW=Um;OA$CsfF6&W>w|zM)ftv%IG0^QQ)A*_R*YuN$PkSRbz& zs2<

jtaG_wl*`>+yYjtU>ED`gq;I_4qzM*5LISeSEwD>~s3~e_j6HiSM+(zqfhVe*ec0-yPo1 zy5ckXm_Q9b&X{~Qr1N|Z>O!8;I4tjnouxJxvHIMep6%!CUK-Xryg#?)eax0%nD2r1 zE*INghhh2Ck3P5k^v(AD^xtdn_iKIZzmHM(i*ett8bAE5!?oe}9Q^;&JZk=`D3Hp{b?>MM%eXa%>{~p2tz_f;o4lF2#7EwWE8H=1&V+OLqbO3+FYOrh%h8%6k+vH1Vs2FA)|0@ zE>HwS7!ooH*X9C6K!hP7qi}65Py|F65;96X&y1BA85xPq3<(*9Yjc4jAi|K4QMfi2 zC;}o32^ocJbAcit!jOLk>3a?RtA|S%>bl2^>uGh!w=r_JP8>Z{?*I)mqvtha} z|LRX$<<*~iK40~BltkJaOZV>|EaU%OpKn_-E0JX!m@mvsg6c+aJ;U=cr?v5F^sTVfec$<^Wh{W1Qhy(sJW zr#=4R>$Ai4)vvxjU9~;^)UrKo?Tnn+zmF!xL`p(NkstzvKOzhX8HKh)pa_UCBxDrY z5`iKh!jOp zKoJmONXRI(B?3i2gdriL(3S`k0TG6Tj3O)!ML>ih!5@XTM4$+WFeGFY+7f{xAi|K4 zQD{p9ihu}1LPnu25hwy83<(*9wnU%^h%h8%6xtMlA|S%>WbI6AU#3Q+*85}QF|;RC z_N{gv+7S;^VSCN?=?m0s-WUuu`xx#KUL)4!dlf&WZ*}_+_VhL4j~_n#<655%Rraua zuXu<2rYf5Ge@ta7!|+pm;Wwi?#!NgeFpN24T4K!hP7qeu{e!XFWagp5L6C{P4M z7!ooHb)i5J5MfBjDAa`lML>ihA)`Lk>3U#4C5fEWW$SBl> z0!2WCAt9p(tB1n(Ji;Fd8HKt~pa_UCBxDroLV+S6!jOOz4cAi|K4QK$F(T_{ilL>Lk>3U#4C z5fEWW$SBl>0!2WCAt9qs7YY;s5r%|}LR~0O1Vk7TG75E~KoJmOc(QtO-89t1BK((Pw(mGo47!e9HR?)B9-cdMdoIzn(Mj&c4pts?Aw|B^(eo#z@0GasPR`4ys}xhFUxjiXivtfs-Q;4#>@F^-aP%W`K#r<#`W}zfp%yy9II3J_wBMsF5H`=p(u)g2tz_fp%*4l z_#?uQkWsidCr|`L7!ooH_vQqOfCxiEM&aI^KoJmONXRJMn-eGkA`A%`g?n=XML>ih zA)|0_PM`>gFeGFY`rHCVK!hP7W8WXA_+)?I?pXCvBi8liI@PisUC-UsPw(k=_t(c1 z^>=f6==k{L^&e0Fq%n({b{=RMuBzr)J>9y!Q&Zqo`D~yU?ZXqzAFeKTEzefgtBf7< z>rT+B`0OWJzwgHGFl3Ztb?GT0FnrPs{76v($!uf97=8 zQ)b-5puIWid++UIelHE5_8UGQ$>$1LNQBQ7^7~4gd)IClzoR7gj&8g|_`;a`S7&*IN=!d{oHncvM_<5r%|}A{GUTfCxiEMycnSu@WOA zBe9twA)^SBPy|F65;BUA42pmVLqbLovVbBW!jOLk>isU3v1Vk7TG77Izfg&Kn@O1BE?&=3E`yci9 z^=K^C{T}~maQ{)hb$_SF&)A&swo%zun-8+D59uM3RZ-xeRA$Na~b zHgW2BTB23Ct#UjmxT`(=41QPb+O_t5griICch!zA`S&eeJUn{9m>+e1aEXw}i$@P` z`$2p0!6nATGoMs1`g}r!NjD$Q|1)Kq!}I?BLYDpgg+iMtPy|F65;BSyXWG6!RiQKx zVMy>tq0JO10wN3v8HF}epa_UCBxDrYOo1XG!jOOl|wBlkkW> zM9*bcUt%`@#I}7}e_vube(uL_=qoPQI)xs&{-^4@OzU}eQ@gIa_y3pKL`p(Nkstzv zKOzhX8AXB$6af*2gp9(qwLlRNVMxd*LKGAM5r%|}A|!_*Ai|K4QG~3Z2#7EwWE5dF zPy|F65;6*X0f8bQ!jO=$?6Z2AdhV`%dQZ2zzdojTHlGWc zs`m9%Tank#TL*f@KCI`>d;L!`f6Q-3{>&e*2Dat@81vgIcIV%+c&hniapLk{ocZgf zbP9Xv?z&>}2Di=swSHb+Po1SU6fvCUzMYxzUO{Fl|4_D%{J-J(m=pX~2XwmNCuzIb~u)rze>nVNytj!a?yy|Md8CxvM{7W1DhT&v}2vs#1X ztF4Ch`^9oKRKGhbU9Tr~Fn+)L?7p7d-=EyqlSVtS?~m{9kM~MtU2pdIKHlCx?{jzc z)BF70{q-@$df_2%V=J8w_0_0rkC%-e*U6Vrod-kKC1)RkB?ukwC1sG+;GH> zZ(pA=BeYGt|ZNP?WUn5 zIrQ&P+`5$x{fmn)5>F zO8+My!jO=$f4_EH&AzK2w7vhctKYM`zq37`_4gUKZP}K%RTDY{cl2@|=RW5mL(iu* z#$VF=hg(YQnMN(!)AO`C3};T)p6>5Y7Vbe(Ppcvz!jOq;tehWX_`;GJcd7NplCv~vDKS@dOIuTwc`}>nd zy_t|v#6+M7i10^3MiEniA|S$$kWs{fKoJmONXRH+QJ@HjFeGFYF%u{PA`A%`MVN#l zAi|K4QG{er1Vk7TG75E}KoJmONXXdNlPA?B>w0sYc3F?E=dSD3_59ua^`7$N{GYJ@ z-ZOu8<5^3wnr!R%65apYvHkn|gU{}4`GV!Nzi&qaLOUV+?LSwj^a%nY=n>FP?)wS* zeuBR-u&vtK)j!zYZtv<3?Cu9_&u3`&>rbQ{dwTegU#2)d@H<(@BZ;Z;$1G89e%{h^CJ$^{^+xowYUvl>p={<{47>B)Z= zY};{u7IDk_c4xf^#qb&Y-dOuT@BU5}zc=Rp6`cPIeyx3p;>M)|-w=^Y2M^32KEB7} z(gDBL$>Y-SWs6Hg3G)+VClCAU?!0eL=}&|rPy|F65;96X_xIP`DwGBy3<>@y!X-Tv z0TG6Tj3PM*6af*2gp49N3KRhmhJ=hF*#wG!2tz_fk(>mIfCxiEMv0UwW4(we|F#v2=f(al=Cr^tf8D7V!^3=E$9{Oi5?Ee$pY@YO z^vvnr$270Aydv^%E7mV8?)u)M_gVUP7k&E1;n1(C-(mExAl8BY(Kt;X>A}&Zt3yBO z+Jgs|uD3*&j!&D&`D;VGZ8oQzo-Zrc#(aqG({;tG^=>X*Zzm-2ZNuvGe0n@#nee^d zHhfyHfAq);m~uaQaFwVVSC5Xa64k~c2Q_@*-fBF=%efX$4p)yhSABPV;X3qv z@B6&$m$vgwUU;78o3D9(&Uu*c#m+m(cKRceJ2M3ot zJf5h2`aEu!*HAt6dU`$%cW=J@(}&mjx6^xCAFH2jufL$?;Z_2VwLjwvW3#F0+oHoW z>sy8UiPFZ?v3SC%U9YF-^LfXY4)0#O%HNH{yPKoCn|?lV9^E-O;P1xeVg3hge0Lgq z`lGuK`);=McZT${bTxm%tMp%z`g^D&Z#>{-;T4Pzb(#~Jfl1;o+>;A(VVIuB&!_M4 z|1KVxM#$;peEfyR$^GELrnfBz59X)je7dfFcGS`J@5MpwIrAIH(PpxH&Cw9 zX4dg_{y~U`IRfhSf2CW&)g?op2eSH`SzmVRpINOUKj^8T+g)r^qJJ()91LSe(A7@ z_5Ydn>3Rpx2+vMC`SLK)Mt4>T9v)6-yQf%&?>_V}hmgVN-ns1I)*5+uo&I>31s~Rg zU%;n+o&~C_Gom~*{B|2X$@6O$U#s=ptt(gR*z3IRCie+nd-*l-G;RDlv*~$!pFfQs zwJpAmzV1HuxV{~?KDt%sZ`iI|S6-7_Y{OjLo{xViuX(zUxM|?iA8%Tiw7Z7Bj@O2K zJ)gcUw=Q0h7T?Okx69Y<<*?WW;_CW+-B)gj+-2Q&`!+C5p4$drkGu8JRMxd@S&zrJ z^|fu-eC+#wrLKEJ`uV=!y7)UaZQJ)>vhVD-@4s)uM~umDJ$U}k*X?CImNV0R8|s*F zP3QTMPc8qtjF`CwYeaqLoW&c~gZGCf^>EX71^1cGr>%YV7alZezuH33& zFK@ZRaqu)3ecgQN ze_i)Stov)eos2Is{+ch>_Ft~d_ubbIpLfNNdCTYC|MuUvZTPrtLw(I&As@&^Uq9#A z&o|>bJ?z_B*Z&b|JncosFE?I3b^pn)?(avw4NQN`x*f}VS=Rl%%kld7m(sVvx5?Mp z*6sNY>nEL`_r6X)58AYs@vxm=WBfA9U2NOn`{?Va$G@-l<6#>(KYd;;(+&4h@BXq) z^ZM|3FT=VGzHaxmcKqu)*>>M1pZ0C7Wx%@XxyZJ)v4?j}Q}!(9>+#p{xNh=m$8^~L zz6~!=`|sr?zI<>RmEwjI;<_wA}<_Q%)J&mCWHt6RK$dA<4i=g6;}!^3`G9Jb|a zY%_V)V?OMEKSuR9c{!8T*W>$Dk3HMxb#8r~vR;q(b$cFlddvEK`C8sDvwiSwX*mDt zzIu4t|9WotdWiG#_T}sODhQ@}5^+=S4rZjj;bMZ}PjyYxm_L z-q%eUKPG+u{oHTIhcv!^_&PhE@6-PJTa^899NKxuHjr<99oFq3?cHD2va5M}TwU+5 ze!?}+kK4NHKCqr%H~PH(dhqEQ-m(66PW%21$IjQo{`d8_@)@?z=e^wK-?}oKzvNr% zXu^JO^mX~z`v^YnJkNC*)MN0`P`_RA?P&S;W83OZe~tROhjm@-$DVc8xS{OoHZcA2 z?Dfeu^tRpeT(7@|sq1Rn(bwVoKh%G9orJwioNu4kU!Irmm+yPsHedI}>Dc#rq4lAr za@e|l&V^R5`TnzytjF{3W#H@abHn>U{yMMmguR{`&rP<=)3mhg^Tk#tdD!{jV_$aL zHXPf3KR@qsyoPe{>0Z~=GG`m>xygF_x$F7Y`i6b*>3$B@l@IIp_-*U=xb|9Z$GDgG z)^R=NZQuKA*I#G8ZqL7N!f^t5h2UcO9S z=SMz0ZG*3CJ$Rhk_FCxM;>XC-)Ox0_tFN<-Te~-`hx4KLBm20Y?=_G01`zgm*Vngm ze7ChFes1_adbxQW>tWxWgY#{v z{oy)pW%8(X_wDN2aMJm(Z5#a9we9%%@S5~(INiF}+u++$^L&i5sOdf)wt@ZjW7GGg z=X=_5U*5-F9w%!id;d7(peSvj+jdi`eVYQq58=D`<&v^Vqek4DXcjfow8}*^`bsj3;mv`g` z@`v&dDd=-hS)#pS|(pKYINq7hn1DdvCq@cF*pE#mpZ28*IaG{O!J`SBAVr{?{7y>W|+P z`Dfq%)Azpp_FM1EmSpmc^W3(f{Lc7u9}(pb2_EM+b6k+~uYT)0-};Zg|E)jxPyfMN zZ~x#=-}&)-e~*bbes=KQA29yjyFYt_# z%UhfSZ<5f1flz<-GbK>Hn0i z`5~dUC%%^7scCwi?QDC!uInAv`4-E*?aAu!4e^82)BX{;yj#!Bp5}Mu@38i+uiv-x z{hIb|*8P*!7W}Qc{_imV%{te&_8qp<_x4Ts$1K@~ww+VDACTgQ@&?QOl<~W~Cf*xT z_I>*9kcXF=ueWcvho%x}W%NDL{*2uI39qjAS6e8QrSJDL&3fQ`bTxU`&LayQ{+FWXF}V9kyU1QhtXAM*546#S%z`lMP*>`eO0fj(y5N< znOV*uFYn&_?(e;K-+i}UTIaS;&0rXYh5swy{~GwuFh26L5Pk;Y!P@p_siQt2#ukUF zs=OWX2(y%rFd;sYP(ubDag5qAtt+Gxk`93eW9ovK#LFRJAs<;>FC-)}#tZ;5!yF8= zXzldtN_rm~J9V^=*)Yw=T;=mIg{_(=SDB28+WATrG93FgRE6MRg+KC;+m94;J=Y^Ul-2`)=pa}C|)VXpX{Ad!^Vre-bDd9sqn%gO6ZMq ziI+C-y_N~N13d{5*_ot1QJ-L3#8{@k8SHU=#ix z=6E4=Q^!vQUiJFJ0H~8=2~|n*swBr6ZkhM29bv5ymK6cqNeLT~uyioTdBU!n1TQ~A#45L#qFg)o<`#u=zLOesF^`K1JJ3E?D^B+M zPA!Qa7Crt1ZXzLsN`+m)Sqqx#lb0R5)0~M}f@(P8mpBuyT1DWxh!I&nK!xkTYGulO zFDwFiO$lPb`q7)VK+muB8a@dAMjX}@<2B2JJ#m=Zu#7!ElmV-}DTclhGiTE&zj@|2 za{+a;6bs4A5=65$SklRhhsFVzh!7B*9R&5jA+3tcKQy`eGqE^WCr9IQOo*vourp-z zKIW!g5DQ=OiNw zY_=3rV=w?DfnOG=5|QM=rGh$tvajS}(F0Bo$^bgsIC8IuxS$LmSV;c^!)7U5yi?-Q zI~l<`F1D0QJXJ9B8rY0l2iy{gpferQ=e~_L5E5@t=vHq^s)YzFumWcblGv$^L^#-H z65lL^)XvcWh6!nkip}6x5D8L}3000ZMLAJG*xD<%-w1Ic1?q)qtCN#4_2}IFC&f{N z(De$p>^}en6HGWY#X>?i?s5=TFL4oB1pD|hB^TC(gAAOMxlZ5fRQH zq_9zjcwH|^a>j^>?eZWprLP4LKw2BD6bz5n%k0G#J%_0J#b8=qJcSD+bl&TH3Lb; z8uPDv0r(@c2G}$`Sv8ewPTalnJ9vfANEKMB-NZomokeG%fW73ddT%L{um)Q`IIl1|2 zM3?9;(&EUEH%;n=)nld7&H4;^<`2X` zTJxU>E*=O5Q|maA&Ao=$F@vyXXg&%AVNa7LJaNJMV~!8ygKIF?M}4%J1SgFECJ0Dq zkZpT!{k@n=wbp@adatV@p0^Ns8@dG^0y<>R9mn2GEF<2u;$a0L?hVADrZzZo;QSg0 z!nryDDgn_v>izVJv*O5?DD97lstbwQwQX=G+3i7G6_4K!x!+OOp?kYkgPw_ ztC#t%W4Cz6RL{c6Q}M;Sy~~8|E$~^9sb_W<*Aw*!9F| zag09Fj^No9Yj31}Y34eF2+{kSSGOB}F`&EN+WfzUdR+o`W`eYA2BK~;q#8*;ufd}V>}>im2Tga+a(!b7Kj zdQZa+aingr6|rIE_;b`#B>X00Ayhu0C#8S?;b(6cp0Xpj^Z6rV>3R=x9T=%|H2Khj z@X`L;l6S=6x?~OXquu8w8;hCi&?Vh^_o`RS#cY86Kk3LbmK|{H6a;nO*U!FdE;}8# z@t=Nvm0>zbKs9NVhu>Rdnr=a4KfM3RaFOmS3fGm{_)=GvIGXw^1=;gp(;{QfavkWd zc<+j0bI)q9K=3C&g^Z2NMSWK*7ZWg%r}Iv-P7DcCTu(TRc{iYW@7x!ls|u+wcO)z} zH}B(&RW$%}S6Saa>Zw3HBEd3Ia=87w4NpqK#%rit)e^waX|=a z;F7-nIR;M){Li7~{gfOM4^a^k7)-w$_T&PC+yejI$+iDLO$#a*T1#bFpUDM z^Pjjt-9)DK#g{+l3^x%-|GJ~bbds0?ZhCOujRy^06sTNLT0plGaR)(k{f5ghwv!2- zx8p{SV)1JbCUZhA;h2#8C;Rr+quyoq`-x} zji1q-iTNSW%_z8gzOgfP*yv9~+l)|wi%o~;J8Rp_P+>v*_sPp2rwX8!xaD8|(WqWS z0Sf#@?iVL0XR19CuQ?i7Z*aCEr2aXd@S$AI#ogr6A}f|KL1Hy>KU#UF+Xxc|bkF%W z-=Ojup)5fiQF%oA*pO#MWIr-%CLKVy=%yFFylbp6z>4_l!MkIS$Poow;X)taq4WW@ zI#>w$Ib($;&ukYBHdaLYYj?d!?bI?^xF#SIeJz@>3hxIejKyMtGuW5M^Py~_M@xNE zOWOi-F!c2b;@eOCt85H5!TVP2J4ClJj6|DpR(zF5wi(;l0v~^V+m|#F0uwFS!U3;* zx@Vga2?t=d?7#O*UT|S_gxP~?Ef3Yp*!zn-=OG8zI+*Swp5&lYM>{t_UDO<77v z#+W3e1}H60AsB5E(A?G>eXEJoLWr6E;~JF}AG)>$DxgV4Ak`rp+g)|FR>t<3CE0k@ zOj@P#=_MsaA{s9KE;6*r)OQymU6K&IUXly%cM;HCRfW~fgfEB{Hd5gf=X|R;yt`o0 zDS@JTV(~O?tI%d~#-;EhbA$8YSCOga-RYMy(yX1~KuzR?K?7kw=(jZ=PQFPx(O1zO zub5tCEJpjaLT0;s5L>Jol3Jg>qI5E3Ic;VtOH&6zHg*s{(RIx*%VC&N7hMA#qi(s5uO3ji z{5fBpTH4zQB-R4RyPzqpaC`tbYl-6zz}u)oe9l+f-McfvRO_|0%IIrp`*YAwO;%3< z%r;MS4Wq=SC-MQ7k}E_3H27?L8lZLu%5j6*4Eqf84nPNn{ZEGR6X`t>qq4pV{VoSP z<=rz^Y|fpbPRyV0oUC6lEhO`SWRAPw#MTz)OvdkIUSHvGems%p`KiGS8D7&fsr2#O zgTS!KIa$9fq|zbR1>5KTdPjrvYSugbxRcpA%i(fX)6>9#3(E-V`A)tPe2S|ZPXj2t z5CuV-S?e9nTincUrraG6pxUhzF*7{n*?L(3OM3-Omb*Ng&_gvgEOmD z0RQEOm+(2o{o{5}_B)s|cbkxaGJFv;jscdXgyoLh$_eRNTA~~9yaRX^FS)y?b_>oSAYboW^_wQ0@~RvPC7VDMig zuiS%}3$qvx!)!g@*zP&(WIWTD)fyj$g-KPP5qATMEcfTo{;Z2z&3Vx zP5^xc(|z1I5$M^8%!RlY6FhTs9AxuKUH$!zUApStOd~Bg$d0RV-P7-Qf}%zM%CZM~ z*@{W7`}-YFQ+)oQX=T{|iXw~WC`q1$gt!qXRwKoWlw$aRg$n2vL?6)6d_B5iXD)cB zH}~Sjiz_$#&{NXTX(-D|LnWbGTuv!n4*ICeE&Y{K(A6%F^w-WnqpmFJ|1SY;apg#V z!ThtvHA4Dc>E|R@p7edP&r(-`bZN z4>`w1x-Y`hB8K^XKckbGoJ^O~;dgp+N};_T+DXvXKwATCHMA|zRzVwub_%qsp`8Tn zqtH%(7WS2+99q`tD0O;&J2Y+URlY% zHlx_p*j&c8U{lI+_|mCng!QFU{-F0z8{N!xO5vazYe)%0ytwFA>>fXbcqMPw-fNvU z+X9bcbjX5O zgu>uC3*4kzyTnyx>U>@>P6fD12mfzv7CC0m8lIL&@bwwr*4U2LPE(~P4cff@*p7xT-!VK?>_=zL79vplP{Zkj zx5D!-C~K!dyBi~%8mP7Bow1-h*eOH>d#sz_(($cd7WK#B0&QnfCb1Z&(jM<==vM1g zg*@W1n@QtNXvZ9Gol?9*fu~t^SbD**#o?E{H1=4ouXaN-AieE|R|57zvzzK0TA&OL zJ0}fAzW&Kr2;ujMAQZyvIb~?2;51w^z;E>teB@)NqqBueHzDY7TxMxTg7MKI=EJGo zhV5i#5p&2_EqkR3S_OC(6jQ-9LtE|!9iXmf&m{wuZ{gBx&rE_%Keu`9tpT+sA|Tli zW_oJzl_E@!y$&9DzS1?snnpCR#zUZ^iSB45B&Qke9txS!-qMT#B8_0YD<}M| zP4?*25{vC5TWc=11W;&!X9fuX{w8YDW% z8qR}%%s~ErLF?xX_~Qm0M$=>qom>CI2#sPG{;7oa>)-?!|C9p%iTY(JB6ZNeo=E#O z$cA)a4r~_n$7`i^D_2U23A9Ogr41p}D)iJEKWxDX8xf2Fe03f*9QUSXJk*_yJbpk~ z-ealYL)nohW!zcqtn<*Q%0i!w9KEmu^)VJ}K31J|R8A2=rDXp)vX~&D9yIuFqZfuM zvL3tOL&wuws?|j{pW)bXc7#+f?dn0CbCxZWF2(Do*(;>);`CE&h2+s|U&2{-qLhVK z9PQ!eX|__bb>k^^a%5_{+iSFd$vFiV%M+|8=QOm(p*;)jF=(MV%xd>dmThO&GYt2C Da${g? literal 0 HcmV?d00001 diff --git a/internal/2.4.4/1/Lib/D11/SpTBXLibDsgn_d11.dcu b/internal/2.4.4/1/Lib/D11/SpTBXLibDsgn_d11.dcu new file mode 100644 index 0000000000000000000000000000000000000000..5db1f6d9b971881004f0628c6a275356f3945b78 GIT binary patch literal 5201 zcmeHKYiJx*6rOKPch7FOH7RLWOO^U$6%DqU5=)glHfbWeb=%#fQKIc+_GUBP-I;ZE zk|sqZN)_L$X@r{Ux6)UZ@A|ld?h=_=YRL|XPw5@Z;U;fL$$=R9j zJnlW`+WQ+Z z6=J=XZIrC-hG#kU@hz42O%Z0W-?lu7c4Q2*XcR=sG4gwltlv{uJojb5F3o+T4k?}~ z7Iv)gHkg9uR;g)hY?Ec@oo!WrSH!LcJgcOF2MzZ>V9T&Qg?2bMRq3}!9e>y1?vhch z3WYAE$4j1-c5HuT;tls&C8ai}$f|noltO!*YgEQ8Q{}tU^z0Pt`)fz~M2Yw1jjGf$ zu4Q||RluR%lHp~${B4H^CUaw=Ed0?>4O7`oZYy_IEPu^NZO1Z|{y6nadflF@s)KOS zGD=QC;h8gORYu&rzv%_Nj$2k}E=UV|T!B%yV|%WnTvEn$CM{I~EbLGAq(!yLCr4qv zsoSW?BPa4n$1LVtp@@07Yuxi3TVW;4aZ8p|foVt^s)WdZ%Q92g<;|A^^3jkpMiiRS z+IEbQtWcEil8oS+%=S1m!8;G}8m=4J>YvrHTzuM49M4D%Rp+*GD3kT3NkIjTD(I@p~G7RYt28ssa83*6sJgatUiWfdM~ywkQ+yO*eG`kR)j{p#k%XrJR0 z6}p|1LG{pCsq{=J`whuctd4sm=TuT+La1((g`2Fr$a;KvtIjiJJ#ISOG8K#GOGoww zf3%6iUE%x2_GS|-Tz|Pn4v?Ho`1+d=F82|Cv8KA1jPz_N_{%NK*K+qjF{PR<&aA0(ZwNfyvr^sTRnI9~+Z7cuwupB7lS7EeSXZb=2Jdy zo-M^XM&8J(q8y0p?=ktFuMf#{-)alw;rS%FP~I$6J#PQ}m}6&5%sFdooD-g#v^7mP z+y0(?8_c$UMqM)7PMTXA&DGM{+e;J89qWWwAA;pD$(^qxrZqV!Yq3UMGZUxG$aSQp zhMYDlpN!4uiGTkiFfDy*T6E?_hvXL3XLE5>*Q}_Vv3U&QfFI^p-*p|-wNg*ZKGr2^ zVE&npzprS*4fe~+F1^SJy_enZz{2Xw*#J&p!KD2^qB=619Y;)G>{ z<%DwxE8;kha6udw5fX$;2$vFC36~RA5w475HKDx^YY1xz*AP15=prNuy@b9vt|g=h z>j@dcMnY~9gM=Z%4TRx#+(g(y7$M~27$uCwv6WCF*n~+MK0-@tYTm|xHQM&<^SV6vFXOgA%)Gfgqw z%5*!^olN)WeRzQRF1GV1^T*l$Q_T11?XiQp&Sepe9iHWSG#Wcv{~3$MbX{Lei}an^ ME?pne9@aGDFMNjiVgLXD literal 0 HcmV?d00001 diff --git a/internal/2.4.4/1/Lib/D11/SpTBXLib_d11.bpl b/internal/2.4.4/1/Lib/D11/SpTBXLib_d11.bpl new file mode 100644 index 0000000000000000000000000000000000000000..2970cf343bf170c47473459508d578a3b4c4845f GIT binary patch literal 780288 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⪻yb`|H+~O#(HHSu&UY2hjks!D4gQr^WgF}9 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�U? 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

^)c7Cbh{8Hop>x^o82r&hX4vHHW~26CFh$Eryu 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 Z$G1?4Qz`J3;=Y*jSPOuYxxYXH{|*eqb!Y$p literal 0 HcmV?d00001 diff --git a/internal/2.4.4/1/Lib/D11/SpTBXLib_d11.dcp b/internal/2.4.4/1/Lib/D11/SpTBXLib_d11.dcp new file mode 100644 index 0000000000000000000000000000000000000000..b02cc2fc40e26f5d4f79eef20f1657741e4090ca GIT binary patch literal 853501 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�WREFn7AUfK2QeMwVQg}=- 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 literal 0 HcmV?d00001 diff --git a/internal/2.4.4/1/Lib/D11/SpTBXLib_d11.dcu b/internal/2.4.4/1/Lib/D11/SpTBXLib_d11.dcu new file mode 100644 index 0000000000000000000000000000000000000000..14f7f3e624538c44979ecaa618d4b8e92c73fe9b GIT binary patch literal 3855 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 hfsOEZT{IBM32_8HPC|P;-V<{^Y*(!ohA zVT_e}+N-_TmUB)|kM|sUs=azpZaq?3_nO(0A@tmP z|GX!<_TFoKzxAzeed}A_`qtWexS6rs9uH%8$L24a5c$DGCg(JEILcPlJ3a13SHR!i z?hbs98JBh3R8n$xqdy#Qx$jN^lyo?Qzv+E&DQh)0b_PT4O^mgfs(c~0#~ny}qV452 zQ<>l2?sodVyy;1Io5@jk-v+lU^uQl~`iV#H2!!4DANl?z&v>=Cq_i#M4wUB*B;VJ~l7XRj`G%zoz2b3GY6+gRRES6$sy|1Vu1&-G+!iYn?_YX5a)VYSWfc!mnI zHOPjlJ1QN|Dy0GE7JIBB$8twJKl%K{Kk$5wI~asX_J9BUW1g&fe=xK%>{FArw^>6@PfKk@d39-HW9fGX$4u~8pv1}sTSY@@%i+%Ve#i68O8ynfr$cCENGi&C zFEZi<)aBtf4)=JnY+LzgmbZI5sPG?ua_o{PO>MrSymsxB1#L!0z2EB#P5k(V6CNum zA{+?%1L*PVD_^|bW3CTX`Kao&SF<*GtWccNCg?x9SlsH#ZfvPvXKyI2v6WYr*4|;O zuy$kEGO4t-uC&}y)m-YZogxKUm9o3)8Y*lJ`>4dCl+@HU+xTFs`NpcdY>Gux1(n8{ zy+QAN?e2m9Q8uDj)Y#Tl+e+0Ytqty0*pkxB+G$Tc4DD33C>@%8^)vK@vQ@RsrPWmx=m}@d zA-0CnMjLg*)oNA;m!^i*(Na_64+q^f{`=iO{P@KeJ=T_*bv1QOjW+7%>`R}`ZOZ@# zU2wL$8ok@x_ssdpDNhDKiC#Us^J4{N3&2duHhO%m1Ao8uw;aXWExYrM+KMx1oVQn7 zUg-@vFz@sJe)}7|J(N^A9JWTsKH`+k+p8`MheCc|g@23h(y3*7Pd0C|x~$3JsH>$} zm=y!o>`*)N?rjV6+cJ60cz<}kOkOYEBP(ioEWE6~w5ryzpIS7b9`)_D{r?*9m_Vel z+Rw)vnLBN(slC}3pkK3+Z>pa|IpVF6Xb!Z+s#@AqKc7mdZbPCs zw~D$oY8kIvNu|`LqpHT%(1teQ*tm;z)96_o<^D|_exKVHik9Bkh9x4NFKOy%#pG^q zd%SS4ov%CRTumZ3JKMbqzz4td8zPU@)NToQL+-{9IJ`Bo=E|@;&`FC|pv~!WzfI(c znwlwY{q#sgqq7aZq`e)J-Q7X!*QbQYb=129K?sY^l#~X8UXO36(7qWKQ|k|T+d6Ic zgOGFP=NCN&K0WRY7#6kZO6D&-y!_-UPr56JB?EQ5K2Oab-x~6yxq=ODXDhN5$inFF z2sk^|dtIb9BgAd@2daMW`bVq{cKGDW`#-%5D=2sR?so=%mb+-NCr8bcz{M!*+?jcI z9`j^CN?!^2W8(0G^x*=u)Ls_yIow-AmtxLEo-9XMARJsD$263_uu82)-ioR{N!7AM z1NHv)PLJQ0HXrQGC2HwoAC1}R$rKP}J^c#_5SI%wC~|#D#n}RC_qMl_|C5NF(bZlH z>-hJW^9g7`U3^Fb=?=IMHGjvAPu+oeq~?x1_s&b0@k)#JPApo%!xv8<^;k@fh&nlys<=7@Gbxoh=g{J7 zolK;gld6YB)Q<1bNr4==x(RSx%0_9(W2l`V?w8A8s-?g#9-O-LYSAjH=Pm*SC-WNpi*kWF?D;JZWToB}lPtrKuSFIzf_j0S*=J`@Jq6&A{vz6C!C~ z`Hc0toTSSNqTZlwqTY%1TU7)Rlgx!CE%!SsQb@3P7$jtBCQ{NE#z|#P*G5mkANIAj zq_o?(-oHh)^3_C~sTE3bmnvD&owHqOj#h>>RAG#^0tN}@;JSwh6SM@FiZk4>W zb8W)74m2crU*C zcKyBNr4tSF;FTO`BC6Bs4 zdc0{;TbhFg<4)|h&esiore;Z*9S;nCmedz@XcWO}sg;q2TpntlU$GZWB>OD%hzLr> zzbA6i$kGb#CUyzCstQt}QlU=ik7h)aLFZa(Ct}k4MQ2qywfQq@Euq^uk=Soi>ZULz zM^gzk`;%p&y8e!EM~&MT?jTZP9)Tn(`G`V+oH9YGf`XuQrV(W5*x|gdF3{=@RJeZk zljO0&{1(I?knAG|QV^d}I;L5vAq0qMrsL;COPW>cmL^ETY0XnDS7dXLY&@<}R(u|^ z)fPTjn^dLFhXo2Afm?I~RpHZ0F->=?rs_EV_&3^exhk;CaNTj1Z`eQl31WRR$qKB< zyo~+y$%$%N-Tm$WFS}*m2Q^d%^NiyH^A4?0%i=g)u0DjA$L4D#D6d+)Nx`lp7;(!!A&dq5M7RMIe6in$KM~uoa2Qp>)q~lUV7LW`G>ZAO=(jH zZEiU2sY62_fDIPD0H0~R@QLre^KbD&A(-Q}?fr;}o3Jr*ZRD`C<8J@RV|KPH%YO9M z+CL{x9`1fra|-6BtSsoF60_`9tVI|e$`y_+-qz6ivgCn}6D!?b&-zfQLesB?or-t_f4YY$KR$)sK4~%r+{_x+#ZR z)$X=X7cn+D+Z(9o5y~hgigO(b`W20|Da~x83Sp{ja&F`m{)RG1b5ik&TvOjlS;Cb# zd<&JM@1-u2ri?tr1(r5-QP&OlOh{6 zRNY1d%x2XQRr{T-?$%?}uf#H_Sct=qlTf$YHxA37hNu)e{0e9u5tG_Ms7KNH-%>lt z3jse@E$jSmL`gCn#ZpV#+x-YG-K`H3AgO09HHkBbgJf0-AFDa&h${9fx<@X z;wsueBM`iu%1tE-;iBa?Kf+#70V#u2Msy9kIv=Ng1I4aZgWVt4#04=q%I1+r;3uDW zuHuKxu2u^_i*DTL^#SI|!bw77edC=~IB=oUuV>QOJWo1NYn(pBeSzQZUA-3jfp{gg zn1V(^IXXMs9{>Ue8i!Dsb;cHh#}wS?qupljZ$giIEXXJ!esBlniAWq`l*w%DfTP{A zs$MzbIr`qz5>GlJ3X1Is^k(aw+uOz^nus521gWuqSh@3l&fld}zx%6irM2ZH(0up6 zk>U1#e$`_|%fU*22<?CAp z@+QL8?R(_cvTI@d)r{V?F!3Ux1R2$k8Jpu;s5v}+7^L`F+>0P3j+ov-PIzg?E+Loj z8X4fP@f$hFig`SnnvT!pxoS?ak%h=5&E{KCpf#fHde;lVqVn+S@>I3fkce23XTSE^JPhM7w*l;HcD`oNwxnypHeesQx zs~(s!UYV_0#)``b?qE-S`q`T9DJEhXYU5n}-zAl$6u(O>ECK-1u{bWiSXYmAC zUVO6eMJ_&7UxJmTD=$7P-0jXz3wxNcr}a}Zl`^rcSs09Awlr-F<|G`CIv14K2wE=E z%dF6(mgchstiXu4AEzeyOlGcWxkmnU571?CnlZ5CU2Xq*b_? z3#8RNCpT_uWAZuIwCSS_YDsD928^^42vLI(c5aIES+-Z+@kmdh9)7qjpY<4v^hC>t zFs|LwQGLuwpz{|VjHyvf zgndShEZeP5h^-krJ%iwbg6}P(@-4$#37^6kCr1(XXJUHP5Es3T^;{}6sc(s(W4SzohhTc`t*-?Yj=W$2aDPmt}eq5{T0;vj&tp)lruQQ0@V+CfsBIgy5 zGZ&=ufV{>TfTSqME|AMxa36Cr*Vvi_(x&h{$F`lT|{Bn?~<6^cTXw z8m6M@xw;&kc4P~sk~a3})k0%w-4>rakk6*-!PP0as?lDmUoFw@iX!YU)UAT#ZW$5E z;e|*(TVw>w&4OjYsDi3nsR%QYr1#A=XaqGw(0ukNaq1GBM)x3ML!Gc{6S2(H8a2(n zKEdkd(S`D3TcS>lOVrB+NxdvI;N4)@P38iAyHtJ~ZZVYOHCM2VeTQwFb{*!3{c6h< z1OI}UA5V*O=hNEEqeFj1`F%`(u~1i9QJ%{z=0ZJYMn@5|Vxm=)w=v5Z#qADYzLER= zQGr}W_eg4J0$2p|?6Z$e;JkWSG+qJVm^M`%P1-mfw8>J~hqTQli)*+|_U z7o0|)AIb(*acz8~7GYnK777hoX2t@!KGeo?nbOJZg7mufR`K!){jd~RQBdIxU^zgL zj}me*Cq?t4JHDzQA6MmUEyCWVrt_}ntj`Ocqfa(v;~!yP5wodD-GES61cTA%6&5vk zK4BD>iA|DfX$BZfs{1S))ol5}AYU%75DQr=30Z!IU@`h6(u|8bIKLxSxp506=T&HI zbo+3$n$L`6K4S&j(H*JG8yBhXQ% zDR~-j_X_T#+ib$o{()G}()Qn+>}Wd$x9g}BNAsGf=>uYULOTs;CiVVxKFWSy-3mq6 zRpR4JI4E+{1qf=%?G)so%j!|9S|Oix8w)bj!@F9y8>fP8aOG&aUo<`X3>2T8By|2E zwVu2J6&Vqw06~)kZ1)JZqnoex*e}A)5X)|@u8l<|^*f<_Hi3NUUcqy8%g~$`M%YKh zvSKur`NZ;h!SZ@yCcdMJu#bu73tFB`Bjz~x2gC<|ORQfJtgk0+{IjYE8zjzNotCv$ z0~5_7)*m$Srf6dHRdU2JX@vcenmIUHE0am`LBV$PSxs#DNmI4kc|SbG&~;T^KwK{f zuA|SDI9K|xEy6w_riDowF>91vWGTpnp(~S1yYA9Fm(1$gR5a?^M6L0iXN3KUTAHU- zingHwGUyz^aP&o2IdP7#v&8LeoEuHexY%v1_#C)R65Ot*;>Hd-p)6moY=}N3uGMj_ zeD9f|;uv5pzwa`q6s}*pSIBd8g zUD1_yO7g7+HrKF?$;bs{n}OYCcz`l1D&;BzV-J+?k>s@oR%1ZGd_{K$Rxj3bo6)}2 z>^3m-JXUCN8t#AT>V&CmR+c@!T=7>(IJqiK+b!LyNs0OaE!J4cf70ULc5hpxX5vRja?YHc1E zF}C46h+aX=w(~Uu)zn1*wI$1LX_EkC*^?Iu#<~rlZ&v9g8A)4m#?BgykMEYkadJ}N z3i5g5?%h(SAZIH*=c1|dogHi1fsK`Ua44x2( zbj=bZ>6m1Gp2$xMGQKHIEGM96$gdE6kA|Lj83y{ay+r=8AcK2+$pAG+ev`;g2{PUl zCA}2`q*op!$X)@#C#+i64Md;i0wJCj2z)23BFGH`uw9nS06Z%IX$0V&6U4D{4iTRh zM5E#bL9t9C!Y>2?4Qm}50Q+yhJe?pf2}t(HBewy4B~F;ImI_1$KjBf2$ASa;6(@;& zM38g%u}ae6m%e?_0JA(QAeqVMSWJKR0-IbPb>!XwVR3hzMxtv68n6;Zx_)%OwbbBbbZGjq74dKPU;?3 zA2>gx4Zv#`8GZZq4kC^H$WbDFX`&$T25j0sq&xfE*%!3=Sj#>4Ang`3U1lDOsV zmeK^ws5*NAsWMj)Cx(5dfTU}EhJKsEs>ZyQSOJ$Ka0bOa2u`cbou>0f#&|!lzf@sg zGb*DwAm=-cIlA4_c$F~6q@E%T$XC0Ja}8MWRZ2C%gHsU^@R`UgYy#H_sgD%6kXPQ3HP@tm1P8>#1j2~rULZ6UVqudL7!3Sv z0;9DL3oA$hmBv9D>#(q*1PHca6CeZsatzWGC+IDVokLI{AnEbh8wvtAH38&Lh!6zQ zEWWG*Y+3?_{;w1e3y#b@$`^M4%}9XGAZidGI#=Ug;Q=x$0Rf-YNf7!n50H{1$XWr( zR6ZOj3%9ko@xdX0a}q%Qgor|bP3l_#pynk|(79V64E(!2&=(}=Di^Q7=;>2BKo+Gy zHVKHBj25;y0Yc9<3qaCTw6G;fsIWj~s&C@ek3G@mvIG!fcM4#-`T-z)tPj-fNvN)o zDEdqgsO3qh?E+;{c&VK%O9J%@kSdw@)DPS$l7M{zm=^y!02q4$!=Dh92%PG3EUYpG zvrAyin&wudz`h%Yi7y7xVs!#`6@iL?nAGnEfv8O&FhEbn5o&k{M12AQo$nEdbbJ>m zekuS|LjuL05V#1WN&SKlC`StFDS;XT)X0|=sL`BKW3Q-@$!mnfr-lHpN&!DDz?M2+ z#eMY69lp7-u)9)#&uW3{hl&8+odSG*1dzT;1n`~|;4id5%ys&t5x{#>fG>>zsvPf2 z0lp%DX>~sO_>sOJvar?^+>sGDG!9%_3ht=DVT5dS6bjV(6x4BnG6F@v?6j~ADWEq6 zD5K6tA0K&@k1&C4Pr;rPSeOt$NT8SZK>AXU?~X)LR0?EA3i5q{glag?Cen2v1^1!A zSydeW-V@MJ3Up9Fv$arF*85Z7e-dz*C6|D6=3;D30iPFObDjEY8;Gzi1$IHepsDz` zra(TBg8U){sSJ8|3i66TqG{!;R4|mJ6r5zCIBiFktAe)mJ2^dTczF1mKdNAQIwSaM zSa)8xoRVt-!v*!3|0n9 z9Z1FmRWz#|N-Cq_-0@#SDby3cU*jt%J`C3=7b-5j#sDnf4A(F=Ob>i^Vhc*o8BE=~ z;Mu9tsT_Y1n!uSXzIQ>+At!SnPFYN|cR{`h7)qiQx@R-(-US7#MlgcOvK*#!a4u8#E}-LINf_Cm$QYKiaRKU-l!C(CNNidF=>{W8Lgdfk)yFdJrUjsH z13*cDP{i;dQhd{b>{^gp8M~^5+@L`CrUj7Y=r|<}Br=YT+_V5#4?gRW@JN3VsxY3# zH!R4VR69mw{6#2DfO>c|j|^&a_27~IB9v}q%4P-6cS8zF8cEnhCN?Sn+zTRZN#-(% zC2dp)g;p?7@jer~$!z3C1%-F1;)wR>eiKXDsG#KC5u-(@f;dWaZS^&H6*BEc1=Sw8 z2B=6#7T-Al7#RViqMMm!qk@8VRT+4szX+vbrfyP@=~sE+k^Ul-rm(~Yg$mU_p#T`! z@Kk1wZ%#lyF{1ZW;}#a*oFIo?deWd0vuVsEHYdpa3m2i;Q zhyZj307_cW*93@f82~zg9#GPP=5UbMfKYP)P|||t3XtG*2>?o3&^)Hucz}@^;!x6J z<_iqPpZGfmIwdV;0cl>@Z~$=$R7zUJLMApF#Dk16dFnXgy$* zw9sW_R!JKQ0M9@)N?PD;EU}pYh5i{N002 z@ZK;sOA2I#)?7WD)$;=s4MKDl=`ypB>EGFM#)jni!&%SShJmt%vaTKuWh3PbK+=)&iYU+vUI-(s<@Pjp?MA0I~MZ5DfbX45CJ zLo;n>c#VGj^41WC z*V@--I~}wAuRhxc{Y}T7C#|cB8uUe`}sZ*Yx)s^*4!Y za(|OLmE7MXRgBu-p>4`o){4PQboQ^coiq&pH*K%GXHD$GwJ+;gV>8XZ$o_k2Ai{MQ zqucQyh0_E&syt1OX zC3dwxRBR?svhJSPuVQbji0Hv=bQx~wZWhjs>_be9@Yx#K_gns;n?G>iXOiNRPB-@1 zE=Rwd9L|c_F8?ypfgVwyGL#X|QkD4wP3y^ATZiYg_7#A{6`}YRc9hOO+01`gHhIk*rmGO;jD*m1q~rvVJ%~6MpT>W`^6!#^#>aLuU9FuJ#>G!?6=2IM2n(>(dQ~A!%QE{h=uK_Dnhy zB@2~)$-N|XCiWlCNPBQs=4I?$-_L1&#}3VZU11TW>dEc{U_1Xgv5BbK}J23?vbroMGr>RtZC#Li)_Lj;q z^83r`X!iWJ+oV21Ny8DEhzDY?_U#~V-g~6WJpc8+N9mc@Jb=$@bv$|-z~qgc-_i6H z9400`ESj9gF4i(~$TaZr zLR!w6F2}y37Dk>YAz0Wf+1{AmbZW>b*^W(bLI86LZBzSiARR;cToGS8)P1&d^IvaT zKcDwvUTa?w9mG+F`@`~Hy3??MCW>pkTg95;heaPx~7AD zO|K1QX$l7Vnh>5`j=n%jXIZ;nZit@#X4Z378*;3_X&|K?Idt82YF?YUlhn~yb5Log z=CCNBB}}yQ!+1OJUfOozYrqmPp~Xz7K)I`4|D!m}16ZW%D=f#PRxzH6epT@4c$7kY zitghpM0eis4th|tVo~A2!I{_zhhhtGjmZK3aHv>MslTE)TWO?sAS_mf!S}#F79~xh zbONMLOiU~$QChtR_Y;P%HnDTj{aowaY0>>eV-Mu2C0#jcNw-;46j<{x=QCs+j!_-e z<37fpm3hCEa}O8uE+h$|1_%eRb@<+Cv^O+2vVSWz93H2L{g<=71Ko(sNGy8(X7MgME(bt`v2yIl$Lx z3Ry&?_F4b3VlwK;K4p3>idAEYJc)HmKl7cXkCRL3O4A)b{v|dTuQT1Fv;@W~tB-$y z{Bbt(IM>6_eAF_dR$lRSDpe*|Qp3H*=IFuG6yL_)h#leqVt;k z)1bhiqBxJ1U4r&wMY|3dR;Hq@V5$sa^k4zhxa3jNVrbkBe#g>cQaWQ&*MkE~AEn6_ zO7G)$PDCZrQz(50zbj>pEBg=*oVZv%Q4U#S`rWAy3Zu4%}OZxihAio6r<FiV;0RW;*i_TwvdW>+#q-(1qCgGOdY}dz;5o8`F9h-CP%Y7D# z8EBt{X|w%rIuPC86rN1R#^+D$wOF%W9kgHCt!R)9rBT?%8^N@L?TalX1xh%rQE71y z5Y4fGSvZBMViin_?chdQt5-_oP>Hf?Pq$l#ZWbuBipmtAGyx)qTV{oALi#g&(yP(r zxoEdl%Iet%Y0wY5nTv{b;6JfKWc56VS|SKtEW*<9nDtg=el3Nk=)MW6m`tk32f?fo z^u^sKwOs6alNjX9d2YD7;zVRo{zkJa^ychANhFWM~-% z`ypC74?VOMSBY3HNt02R!b4(rP3s(bdM;L`uZIgnj4mi3@X+>BU(+Qe zs#U!Q?e{AnQu2O3KJ)mJDqIay!XhlFd+r zRBy%4Hl!-Uay*-@_~nMQ*3gW!&FaLn(@-F}4dZY(BV|jHY?fX#OPOZrRkM_BmfXna znx#B5e*bKi49FEC{mP8rlp>VIV-3oqV;Ac0K{|<)VOoG+iJ9?pF0_mECek3%1tiIg zc913^O*b#G;ukMa-ZHMdFBe$7$adS1nFEEum<$V~r{!$v zS$U51Jnp}M{$G-3N#<<)Saq>vULhH?rIn^7(y46e70`~z)1;%o9ha98=1qB#bW&a+ zy(`$#mT;X|}FfIyO$4 zi^qk!yQN!o4brg{(rvmGQYn%RsS2q^SIN_{3h7vxv{F|uHKE>Wq$W_->S`sYt{DlH z?UEbCUZhPryS3j?WPJkZ$A$%Rsoo;n^#3CN-YS<>()AU6rhHs))jh8-kv~`>uhvhH z*XpOrALJ@Gi&~>qeo{Y2{$rke<^lQjMe6^b+^ua6mLR(ZTWAWza4$+c7E`iEpkuH2jrQl?xz z1E_4d*Q921tkaFJS{E9NtX0NLtJ649E|@4E)#btmRZ4}>*A$2|US9yQ ztoWIDzC2w&4(!K)9cd?14nt=}i>#ZCR{33Bp0&$pl#6pYr4z{aA=uPRYae*;GR{EP zE!HQEX6qhf2^_}lyxaE{;IWuL-Zw+GkHb^G{A2xFa%-k^)*_$F2f0Z8tVlkSFMs}m z^rR6~gSbxsF;D(1Tb==ZOpY^ZLvE_|xN#m7Zn2&OWCQWF%J&t^?NF6zG5YkD>@`i0 zS53g zKk1gK_jz)mDbH#%O+~Z0awj^w(lnWOdM)nfbr!4Fv`ohDpX3X=0wiiC)7oj8W$iVE zAV#MA1^P~MZd+jOH`$Rbzz>ceK-weA22&9p=70}+S76;^T43D^OqaeG9}(tRpNF)) zrd(OlXIft|yGOE{E(WJlmnT1^UnXBLjFSzhb%Apzuwr&z z1J@1it^@>#ut0dTb9}Uw@viZ@fa+xAxNY#G7<|XOOO^F3|ONk{Q?2IduK~B)Wbuovt4p zrIX%2o}}w1gLK8un{Yihoh12eAzeSOqU*)YbiK5Tu3zq<>*bSly?TYN5=I9%gPcLP lG>j{58M2dTv*j+j&6WG;wopD!w_9NhQ`i`QB-vr3ZJF#7RcgSBYn49RD9x@|`r zhmYgD>1Ok6izn!_NwX=V*(>^ASik*x#;&(C_ybZM!^nDzbAdF?!N5NUUtBBt2CaDE zVMk)6$LS78zDLextd<8^%dzbcZIXRj&7G1hU@mk3q1fa02Yf+W!0B<9&YAjbcZ@}n z!{d`mB#p5Q8T)sYI8~Zo4&p?&O`3=-{j91gi|CMwMVG6z-X?ib)egh{CfP*c5~trQ z25hx|MQXZ6l^kNw6__Nt?Jmjp9Aaq{EAvSbRrNd~$rK@GdKz{C(UFLAmL*@0b&h=w zJ(%xw%g}^lnC?`!&TwUgL!%{VTG1q%Q77G1-r|g#OXp}=|omgF7671J@Z)7DV zN&(Fgf5DZ|75OA_9+`w;0zi&pn6+>C1JBO}edT^KgNORA-2lBprC0i~^({G}+-*~4 zZf)?w+B!Vgv)L0N%FEs8E4jxcy5zTv`FS!xw>aH)&wM|ztO`Op*!j``AQKf5l6zXg zJa9;*&tqFXbo6OC!&>aA^LpHpJ79)++O^(EG5?aB3LDW0dkS`i%H*H_MAjlXS)-%- zCI9nZTwNe1QQ}ljxy|D~`t!04HoE}(Dd6+CKskh@+A&+CfYsym9X&e>Rx*lM=mOu) z0kT7HCGDRdteh+BL>F++A2;(>MWlK=V^-Bw3xS3t}v{7LTR6{kP~a#~>D z+5(>)xN(Kt(<{ypT|r{{2S_k_#VYA;5GvNVq_ap#EAv3UE|KaWZ&i3iyCon7q@@;E zWRo?HdTCt7r*aRw3-TWhU+`I+l@^1gc4xrj`}7sZ>vB2;=}Z)C@A6Qm&E89y ztwO>8ybAP@6snNSSkZwaT4rR(eIdNmKv!9cVebZ{XQzjIqu1j>kGEkDLRnp)N}uEv zeNs7`M|*(-rV38S)Jyfby#toZDdu?c^pXq5Vfo{jarudxA6i+E+YJo+iNLEAc$&|S zDT}Hy7s5evS5S26w_pDR98>Wy2*=r0IP08&L}ba*)?f7k$VXwNuxT0$&s_?2KQcz!HjsY5YFPeVG)LQj|KxC+@Zq|O^Y9k_7Cq?B^Zpy z#s~!a#}5Ngb)Hl5k3^QMF2jO(xd0jZb;Cf`#N`+|wK(Y+m6x2#aSeQiQ8)W@TkxdVhEVOfw#Yd610cUjaB|BT$B$ z0yOo~c#%*m)gFcfY%RhLdtkB|B8bXDl9mB?G%pfiFUDiYvlF2tG+0faK$|?S>?%lT z(Ij#lCT}~uRThvJN1j|eq!FSgnoFJ5X_T1~i@>$!Yb0mHl3}XFBDu}ABYIUAG?JPR z0fR#*SCsoNnQs+s_7reUi662v*rTi@I4KE)Ai=LtHf_KCA96CaS|u)R96y41K8n#? zS})lkp~LOD=I{~!eB#Y$93lv@R}e!>yTQnT^LJoyB&!T)1Z49%^XCJ!S&T~_O?zYEb#Ft$)kw;%=$Ye;8xw9EdDSx?{|)9xsCY63{Y9d0-+-l`<1}Ka zo4>VHrp5w4~iY{lsC4tcP^EZBsYZpV@@@iH->^VY1 z4}A8WZ>Bb9BpiIXa+@PXwIo0nx}k+~Sfx`RL0+y(V3w{_Vx9 zXHs8bd{l}qDG-njt}>q2d=*81y!OkRAvF+R5g97~Gf$Lmk$bBXjs{lUH>iVpilpD5 z+m6Qj)l2Dre|q{A%~Rbm-22?YEE?}tu?91>QPB@QNFOub%Y0w%rD|44H*D(|ss*!H zqiVYS{-zfr!K{%BZ>uqBVFwaxB`L7;r)NKigq=!U^V%PWX;UW`P(@qbfsbZKrXB_K zT(|ovN4n}ON>`0p^TIrX+?V<*4s3X^e73e{#Ts;%w{cNMWX~!zi}kiU;l@VRqGVpB z=$7yzPuHE?Ix!^-*FDK<>#k8v?>}InQH5N1cO)X#SL_tEsER?BWVh_3p0apdP6!j9 zQQW;v^AshX9kmvY%T!_*raoXsuk_7u+DdxwqGVoxDG(qd?$GA&+7vMc1wme!j!nNjqM_64n!9WEZSPx50j z{UPD0YK=XLe(Y%Y&va^5p9oVEeO14EeY-X_N*tZ?@$UD&yd&^XfIYR!+ zSkHQ!-AI^~!x~ptP3=gq^t!l3OYKM)bK-*zDqis{Qdwc`CQW>VeDcHK57b*0uhWgJ zd&mA)tu{kSTyG5Sri_q-YCPZy|MuE78Y3mnXe>KTcP8Esfp1jm{nNFbsnYs>Zr`M( z3Jf-tp28PZMN&l+@cq%NAEO4KmAK{i+|Z{{Gk_BRl>FVBR5G<5nU@}NJ)}vF2Ar)o zpR(DL6&Kf&j~0(FDov1FjnWV0ovqi>ghqYh!jV^~zA|{0ppM8p=sc@dw`Y*e-jmodrKEgHRdr-A^wk%{H=cgiqYaLbcQ);O ziEd*UiF3wPnUHsIleUec=z}h7`hjLb5TabRaKMY7Ke0*6gfYm5-Ju_Bk`A*YtRB49 z+TiuleSEfX0q)>R2e12xlRIdBUw#$5yu>2E0isPxgvT-EZA|V3LzL%L{OZ}Z=7Aly z(b{uzBXh^|e|Vj2` zt4C;k<=*jE=*OS7UjVJ!gHD$~nIoP^0a{$Ls{>Nk&G`&ayW0`3YTS{yWtjJY8XLE# z5^RI%MHjFk8QUC8}lb|U_S z038Q2?2~NP;$RFN*=)Ik(I3lZi=leMmPhT6_=Y@eH8P&T*E*SR__fOnL-{yCU@5K{(L89-V(qu1M7*;n~QhB0kS&dXI!ym*J;mW(_UHZlti%(XEYtpm1D z>06j=eU;>g7s7OA00R~Kfr!7LsnG14l>j};|GQ}0w_B6 zx!g1S@>VuT@sutr%5eWXLI)xmD2pkIh4>IS%8_Fc<>(a?q5!8LyjX>8CFqK+$>5yE z-76wzLd$WJ%khFHl{Vx+IrZ zk#1T?jvVO+g9bqv4uyr%14@e8{^#=RUVP>F9<*kcv*VNNfj$-r{zEgWNUQrl zYk@qzd+7g_N{<2jA&I0+<(MPRybRW@N2|kMFW!IpQfH@S#w`UOhUQ!dP3Z`K5I$GX zR$UtcN7*~`?V;@O+u?(!aX!s$$<5<|9DZ#Fy8#J=8Y=xhJfk99`aS7|--A|I=$!7_ z!D_Un+Y?~a%2pUcX;J9g>WGYRX@@HDba?3=7@|n*nAY5xyu2L-Pkg!bYt$RA{yLiB zSo4R;P3wTZVl_@CTx=u*mEMZd3yK(3cx9LprkuW&AkA&TJHk`GkDb#wG^%kF+FgB4 z5nve`E~QP7qBcvQW%0Pkf%zT)ZDf(YeJ~K z;Kvo!7gXQF%7;shoz+6wprNv4L2^Ov;oH|XyblvYTu$l*1Ue?bmUtN{s}5TC2mkhy6?pbaB!m}n!7HZo`@ZOo+&J8jg`hKn}5v=N|UFJSPWux4vSQfwy7N3^ zY~~rZnV$f~#HMfpn<}tIflU(FG=WVQSd+kJ2yCXnZWrJkN?`i{OFt<6p*$t9PYdj} zVMh2~XG6RhWC(08ZlG}mZ{W&xCT;|j6kQsZo5l@J#uI5pN!0s4m+zidl`~dFuf$T{G_jwjqo5$Um$DK~&yt!O{7I&_Q z`!=5&nZ=DUabr{Qe;|wPFmONRaTn6LOX(cTnYrsLK!%AMZ{%*wG``Abfu}}tlaioH z;z|Z^*KkP*IzCf3gfnnAr$W=jVzUC9Nn8(p0Mw~mFWwm8AYFxPAc!##QJeWps7>4? z(DQra30@BqPBot4)45|wFgF9&haYLY$fv`MM{y72ad(e`7BwqHSH#_$&(#m$mJj0^ zGmRsl|NE)Na;Ta{8AY9mwI*?o8rX51iT#F4WecH{Lpcv+FO&mNrbC$prB^~Kdj^UK z?S4?_Kp6sM1e9@53ZaxkVWCWiG7E|bB?x5^lx8TqpsaxM5|q_Y9)WTg%DV{}?1_ZI ztf(_^b79_G2Kz3Q<6J&hV_==!P|mJYHA%<=6azP$Gq86l2v#a`mx?qf2v#c6pdyPE z1S=I;tRf)=!AeC!D$=4LSgA;himX!*tW;#3ikwmqtW@Nbifm3G^TA3*HYX_ac~U{J zQjsTBWP>6ND;3$mDPta25Uf<>aTWPNk%pCu{E(oGxu_smsmMiw7-2UXAPNlJV@mUx zNb`K8c>H5oY`dd6PdN~T56 wRWV#6XYIo?4<#kN$}=4E?FszLau>1Eac8jV0jUJ4K9E(Q>IX>$s{Wk#FRK1pmjD0& literal 0 HcmV?d00001 diff --git a/internal/2.4.4/1/Lib/D11/SpTBXSkins.dcu b/internal/2.4.4/1/Lib/D11/SpTBXSkins.dcu new file mode 100644 index 0000000000000000000000000000000000000000..250c50bc8ddc8357f72c778c0378d01a7870b677 GIT binary patch literal 77962 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 literal 0 HcmV?d00001 diff --git a/internal/2.4.4/1/Lib/D11/SpTBXTabs.dcu b/internal/2.4.4/1/Lib/D11/SpTBXTabs.dcu new file mode 100644 index 0000000000000000000000000000000000000000..9ef42a6b69b8e47426edfdae69400f4e04616ff2 GIT binary patch literal 91275 zcmeFa4S1Br)i*v_Hk-}nJ0#&l&;)_u0-~ZW$z}Mc13K$mRAWkMYin~b&~oyuJA{LjXbhGGnw$OC)d$-mO|2~t`kq-8%2wp^rf^#z zQoraSN-fZ-!Nx#Gb7Xp;rJ*_4{xH${D%#B8wUsU5NT8)Y_(vk-DMCeiFsLYx5G6}d z%7fuZd+YK?k=W>-*V^7NbIqqYmWU;dkzjjSE10%-)RTyRAfRtvQ$w&O(%#e(+IQET zCmX$Gf%b-`mOyjmi|cM6`UJv52M(dUj1ZKqX$x;NDlCpgu_jtmS6+JPbj&xJs7x# z|LL7t87^xMgu_4WciYC0+kahCgr}#g8dF=`O{Hf}6^&Ryk~c3ucy-&>Q2JD!w+!qe z!S@HueL9poHLeYQRIu`rP{!05khh|}b;&&Ze*WPX=Y_mHsjRvEieLZcB0QA{LHuvk z{uOZQ>GI_*0qO@{R-ek2dM;X@@}T%bGFZ~a>A6$mTJ14+&2NYm)lc@^=UeyQ6v|YU z6M}D~>UpPsKE6-sS*YsE5IyOQ?yz;fjI{LWtt z2&D;r4GnXGjo&=>n`xoGvi(Y0mTL{>f~QR_Z*2*RG})?i0!?8vB~>(4ATogf^$jT) zM3pVnRrq^eQ%ghZwPB2?Z@kXx@^{*a{nC8#wSv0DlZc(%J*Pqbh-|VK>(2O1D2pmzGGm6~``a7eA79_#l@Rn)C}m#NRdqG~In)r1-dag{ zbIQbm#*Er|RsQxsI9Pg3sHLI%Kd*Z|lmRqv+R{s=%`88FiZ}KJN;h8FqCiV1*f6Of z=nwS;R@A(DR!!OTl9|)|R@AaV^qWrUfHqtsO0qA0iX4 zqNbE#`ftCBl0C(|y!mg=IvvX3e->A^Gz71k)%g37KlIy0C=WIVBf*W7Esd9qMn}O_ zD7ev8JieJk@`S@Pf{l^G2O*5N6&7tt>$2c;H-%pd6&Z~wl4B z0sBSci&ie433Y(NcLbl?+c*%-%Kxri-WI$qy{#max-3BR2jrXh@RFB9-em#tbT&QZ z%AS%VjZk~R1b&U=O}{L+;vJ&(lO0;j`_&?rF5NdU)ZeHaX7C0*V)v2AsiI*^8XE4Q zM$Iux;Zna#1*9(vl(niZx{$=QiDS|J5-*NL{3eN$S|27gMzu;vEAU7a!ecpq6yiWV zeoo>@>8d*-chO_Ipo-4^FQmYkG&PfH^--skv^30YY9_~`F;&mDcb|N|DC8^F z&#PbfbvTr*AEgHG82Ij^AulXVZ7VwDql&)21%Ddc?XAQg)>=O7c=)v~p|fhs+XErt z$oj7h=CBk5n5a(B2N|0O| zggbfj<9MP-G7Xm#!6wUeIHp>dD~OzD@>4$Wg1C$@Z`bOKSAyJ_U0YTK9}6RHdQ+qp zZt^eQf8vQyc3IU`<^Gz=X)~u+*4FxKYFB)podbhe)!Kmxt|Jm@ZTWQn=4Mz#s|kku zbmg}&S}1{A$ndmdKMf76E$awJT9?SSFRl(?E*BHvkaNz@h1_^hL}kabCO`2uW(kwh zuo!IM%D@zpGm}jS3>+(OS)iq)BhpIVQyvlX9mF}P<9CAjL>g=(ajzdz1>x}#q#r^0 z+aT@aCJQfmU_5V5Mfaacq_b@qdDZzGf-b?dAk^$E0-n_a5I#v0+2uk44KP8{6Bcp| ziQ^&3qHP7}YyuS|-~nle60OKaYpuU#POz;R({wrh6pj52f}LT)$oTVqnAP4CYHFEC z0Gpf|Kpk}+k!=l5WHBoJ*U{`9{uV)Oy$wita9LA*kbp48=M%!#p=5Qql3h$BTU%m2 ztq!zO)vkDWK_rAF{uaTF4jT$#6tVhM^oQqa9bfH9NhfIz169ZH1_ zvQnjPNY7|rTtUib+7C)&rrmm-%sKlzFnLzbPdnqjX`vk0%DI&_m8CQM(r=$h#xkQ; zcvdJduq3?w_}-oH)_A=?`%(4PA#b2r45O8kX8tRbRctTm&He0oYW8^BSwvRTHr_Z- zS;KHHb^e)#h;nu`&B9>9*oG5YOSH?}M5Iz0L*d(ql%<)ZAHWFYHeRg$<}~H zz=u*rmMYLNcauE=SFG8{R)nv4endZ`J5UFMcqg&5TS3@aIaYs1J&*#0YY(@!zjs^R zU@RYK%v}PX^P^b@kIF|Hf^F9yJZh_|9DzcxnN*5x99E##K}xl(KxLQ`MTS{IEY&t# zDad^D$~F_xY64B9>`RE2U~H3ZpN`gOCAww0kXKP!h+=k!A_$3Uh-|YlbDP3Vu!dnG zn4K)sMYdW{8!Y&+Kxp1A(j*Z!yzRWY^CujqnjSl2>z z;jqK~FM7{Dp*z>cMKsn@>)Yl0cvWf519pQ1p@j>x0eWfoKSX*-b8{;ecfp2r#LBWj z$SBMz)=`l~rPN`T+Lh9JthN;)z?Miq7$-YphadbgmF!uvkXD`TKYIK$U$TnvTN;Gp zL+xBZOu*k}riIxb3Oh{;>hZrT!Rj@qK3q~y;ctv#&LjMdLs&myolRpjz{BF_QAz^G zQ%oRdP(3jcY(+_*Zy3!9mR?G&m{)B4VXK?d_!`ELEM$dCmPA`L%~d*1obv*yxBO9kB8 zf5rmmfmYfSSrTXq^cj7A$Wz}u6QQyvV}bPukdRgR{PBN&9`Y7TQ2DFg8xeLEIpkFO zhqI@?h`P%(QaE1L&6J!~TiV_cUPLwL(#$D&>{1e-qN9FMxGC`DO;=7Ps?7%rFUJF&$+P0j8`kYeJ6&T8X?H81if+7~doS?-fTjUuS`W~tU z945iNt_9=sngNuC#uSM^eXlPyrbLKg@(D53GLgdY9iM+98F9|aB_Rr0p?4u4*L=SG zrnK1Td%g`b#-Dj$DHS_VWYq02@>qGSYWpRRy;|RpT+!OTgrW^8n4vKso5x(Z{mfAI zCBfxkgbj3XZ{mdSxlw$1Q=qvu1UNJeiqdQPR-8Ox}x zEtTaXVNr0=4rp6#>D;E^wev$GhhZM5EhQ)=V84mBH*LSe7bk@99XBN)BA*~WMa2I0oFGE{`fGv>&k%L6 zoeJMc5XDseNMZ)Ek+vmdVDoYwB}kF83?rN@%6W`nXV_s7)Kc2*1SqrvD#I3Cu=x|A z94)2Tgm)0}EISJ#wk!%FDnE-)E#c3F$0CzE*P8+1b*n)bxjw>O zknHh~{s(U{Yq%AcxB9OO)^|jL(cfK@%8NCLFmUuJ=i(Ivp_&^I3=o)%IoRP|NmLq| zaa103T}5OXe|EBDU5kLmYC=$lIuP9Z{s9rGT@7MoxEehw0&f_ekr-iUSQ!`?vGUey zThLJ-%n8A8Nt9Zkh+M}*Upm1Q-4YXhr!24rjr%Tf#tMj+e%|Z zO+QBZ9S?u}=TLUb!iFW><{N)u8qgN&{ThkCsYvXh6votClR-F@OHU5i8R5#Ji z;3kG8MU(zcE$vYI%J7_4+Bj@jOO+UCuO0f7%S99Z4~gC{vaqS%ikd-QvDO;=A7g1( zO_pi_-lh^s8f#kC9>IeNDnSLp3jD!V2_%Zij5`wd5z8D^l&0NF$z&6Fyc-1T`HCo6u8Xqbc)93Gzup6j3*4KO&_I<)J`)upv#S z@C_*puS`nGv@6&^qzM;~R=4mQt*TN2DYfvw<=Q~3)qeK=toM3Gn$5SKkd`0e;E6FT ze6c$ScD8N}2aL?h%rY`8;X4U9t|uTAh_VJ7%9>l%HV*mv|3$fm^^&Wqsii7#9hLBF zg7(-5JRG$MhZ@kF4-&Gss)?}THiD5UA<2q)$W1MgGrs%hZ*%S7BrzR`2F@f3xig$1 zJknen+HB;$L?K<`Xx*rJluU-4Cv!uZk0fr}YZk#4UqhDjrjL?Ng}jl4;U%p7I$w2GJ3qqh%oxrlIBP8+=%P)Z*CP!azIJlZLr`;-g&! z)HmF|WeRtBOd`}ldi-Sbeohc_MIDf;@=D=%gbDQvLXjrMqr?G0ioO!?E&`GPa{y_L zeK*m_xR^A{XsdP&|0i&W{MvAQ)iiljXuIKhN;Y=w`SqT$eT*@qFjBd2U@ja9mmp#s z{w)D%;t_4GfaR@pE)3^$?kBo6yDB^itl<+kzlr#2H={Vlpa zB@w2wemVQbWxT9Q-96Jlu|$`a(xMpMA5z=+5k%^CA9qg5318(CmC*F`|{$-uzyKg zWcghOufJB5UyYzru;CNpm_`j!6==aRg!b3(pT7XsShtHz<}Qvf6a?lQVT9zO!~5eq zdmjvW=vAm7{^`8^k$c8uU=70wImG zUx<;4GZyzeyYJ3Wzv9HiHFrGqPgM)5f`$m!FJNB z8~(H5HkvEo;m$)8vJF$-fqC=2p^V72a6A0XIChEiX$?v9?g-`B>P>8F`*%MBi{TKl z*cm5(s^Jq~B3LU`poE`^Aba{W!On>1#$mJ-@(cl_u30UD6*2J<)_p5M&g_AQT)J)} z%%C1Hygi>K#P9?N9+;wS7BrJwPHiWwR9-_U^fw0!TfoizpA(lWJzs2}gm)4mzJjI~ z@B%@kjWCLn>%DzMwJ8>L6OOEz8=CJYE(Oyv_gj`=Vtz0&A3k%3F~RfI?jH$M7}rV~ zB!cFT5GuY`fs*Uo$9fb8(~jWrI6>ljjCeG`+G303Pe3R`PPzmV?e2%qc%i*6v5Y3_ z(H{A$G4Ukv?XVTrAn2zhRzv>T8F4cj)Rd%XAwY-3j+Wx#H5f%?slEmoQW{aGF$9vzUj;?-n)ojQn!Z^f;)nq$ZmW@2y(V zXjHc>P`?Np-Rcly>rd`@gw~Q~mKU!d{gP5xSw@1h4-Wp`2FtJi^Gr6-I35 zQ>%r~C$cmoicI}Dv#bPx?+X$YAndF@k2Hla()ue7=qkQu;Fd%T@TmloGmwH|^Mr)p z;m>JAcgR`Zs>#!dZ0{YKOx5|FQrv+YJwI8x;D6;FhQ~+e-R5*QtfQf>9w_ z3yEohz_P*#IRnh=wUdBDdJzFekesH!5Y9H6$reeVSTBG6qij8!C8#zvJs;)aXNaqs z_Yxsdx&^TSx<_k)es~5pHh$A$u z%TH0dG~{Z;S)-Ec&LkRD($Xr3(kn8dd~fzb0?95`ph_~;xPoP`;bcO}j!{Uo4nXjD z$zj0wEGLX~7ZgT}bJM@6B$RAqg%Y*Bgedu<`4vUFJu^6|rVTZqQ}0wmipl#MLcyA& zqi2UQ!cEH%bX*c_pkrMpXDl2YI>VNP^+g+&aB|P)3j)~OFsg`H0mw1)B6;u*qh-YK zs!1TJgi2N&#hXpU?3y-;YLciz!9D*t=NMK=5LB$vJ|Q8DxkI3I@ckP!3&u~@rY}5* zAZcykNOgOV&%WO{a_gh2m#l)NGa+Z#!HH*A!IzKcGYOGn#8brX_RU2{-=bQPVq99S z7Sq4^!-pqB=_CU#DRCi2kr4S#9Oqo|)P|qgNi{e^Tn6y|*kzZ2@u=_I`vXnJemVK(|Qhe9B*p{yDtyp(#$ zVG7D|d4rCe!EE@6ET3dYUq6LT}KPDs&fBl~3*Z8R(u7Gqo9wvZ_7$ouV_klod>@?`MrZ5W zw%mh}nFl;v_!JHlk-ercs;`zuE$A`-7lo7SgPz(&!6kG@6MGEwS52^;t~7){Xqh~j zjw?_a!bJGLC30_g`^BN;ND$G-nS-~zNdaIp3pFE8IEuXW!IZk|_!C&?)s~c2UxoiF zYyDL-{1vtS@@e9RZN5pFQ#oxqCp|=$Z_`Z@zv1hvt*pTX-Z@nzGx&2lJ(pM3l;BKz zIls`$Q)>J;;toEXOA2A8&#LA3dHd4j#f7qbukTOZgTr^ctm=}P{%7gxYA~5XXVhNS zo#&97jM$F(OEN;fS&fZhbTOVkyzY@dhCIT^5e*q=t-^0cd(hTcu?~8_-|kQ{|MTkh z&9GE6%3_eqZuR~SN-#o$203ETCYEdva24s=`XJO ziTWi6?)r(=UF`-u$jCGVub*gK2)+#@?qE}$?gh!Z&^879jQeMG^k^MdTuvqE<8Ax# zq>iQ?BZ@wGmXwTaetq^V8IRV1vkdt}E-Ygmp8AQl-Jn+}fvYTy0th%DMb(-{C}XSf z>>Lmurq&P3E4zwkgF0G!{x`Dfs(+1t3%QmL8;AhEHBQjQr6pyTOq(;SZe}@P^EoW7 zZ_=<7Y_w8<|3)_OjP=QT@frZ0L>px{vcV$BHOvbXpQ3JLg(A&8N`(Ug3&|H3hM(%MV+nMB(C6i2An zu*Mhv_=ERGsVNLO<<=-)K(Ar_+P<~>A!z<`5GwIAV5DF+++`j zv%T5Fl8SwdOlqMUhawPTVIoJO|$fkJNuwxil$X7Tjn z!eqXPDPX_!-2PD7rnLGIgN%Aft+M9vD0^naoRw@-N-q`NUF0d@k&glv^%ePqMMfiq zQJ?u`}9hshcX*kNx`QgH#B?eY|5 zmWX#2NwEu9sT=K2oj;td%dX#$^if(0W7&tZMpzb{sG9vfcm3o6_B^pas@Na3*n3K5 zUE30DFJMF5;FX+CypCp#up2@V28*&^5v$j3GdZCnY8%-pR+v;-z}#N&$X7h9d4bDA zW`K_6MA?54n+1Iwd{U%d7qFvV!SqC7I?sVUXSzGz2=y&YgBmJMNcb294pRlHn6+r> zVk?XoWgDo-&)0dZCh!$`DZ*HWBQOQb>$S###{-^I6we{r0`f|TXonI&>?}svoy2|F z8naz&BgR#vHPT(=v$kM|um{Es@s;op2OR+%&en_=k|v({5_LFp7Y-4lZ8*#AKO~*! zmA8tZder|_N>pd{Ta}nm_Hz>O0$YPKWL>JVsvx{-Ih7T&b(H;rGEcSF4npCA(zON5 z;~HY?B&3icEmxdXSWj|>qfhN9>=t({qwFr?pT6$LR^KpaI6(^7O)jfreoP{-Rg4|A zrG=QVi&1tjF??&?QH!C+ZUvcX1smCeMj=Y~yoJJkk}|AUWvaEjRT*kxx~vjq>#5Kg z8=^*`mgrHb(Nu$ndgi7KVU*oY+~#h$J0Z8bG1~Z`1GlX`aKqGZal3=K&9wC(j5t5b zoy+c4Lm1p%QQYJ%8mh_V!AJP9ey`9xmk@vIScOQ_0h#c{oQa!1G` zh_cg#D7kxGu35157TDR^*~q1tqDry08wttU3|L25GF53Rwx=Ji1bFAAPa{jqI1sp83j?A!_GMI2mqMa*nXg+cr6&ti}>I z%Dg0Sn@wP!DKJc>_9q>U^_2zgarS;k39NS0>h5X>G*v*czR1$V=icMOF&gk*B ztpJ!7<_ zHJkITO?u?xM=C=aiJR)NiEGmaV==MaF>DKM-VWqDRj49Ljcm=4LNCHg+)HX??gIqo z$NQ9*PE+kfC9mC_D{Y{V9?dvD5;EWQm4w_|huL`CNJS`q0~MH!=t^xtsQu)fwbbd%k8ANVpj8D&XS=wI!n6EmD98d53GQl zN=LDqRj~;tNHi&mRqNd->qCW2-|((gL+v?X%uyHZQv4Fmio_50TRNSYT=aEOi<@bz ztiF%>!1ztYIAPz%ZHY!%7IB~N92d#_8gU~VbE+umQgRZClIDvRscvL%$SLxLLNDH8 ztIQ@<>qAv~!e*)r&!T0W_ONoO=u0;sULjY+$Bkz45WkEpX^TcD>TS$&HY=|^R~Iq< zj>*`z^b_4m{0Auh32leGu@+_7#4id@&6Jc60AeyyF|qnmR*`Iwxw{-?H+?c;8oL#o zPO3VeB+ndLM#?>rb2^!2gcD3odJ{Uzenfm8NW_O6&=SSR3ad&!I$$tm*|(C}q&^fe zIHg26;DXt_UU^FYZY|*ZJ3sc0a6v)i3DNLqzrayO`QZ?~WP2kKP;QE6FUMdcH zEWxmgeP9U#5&WoE!uZD9FZpm&a@2k!6z=#PCa46d4&AWI2zDO5bpoRg~sj!0sZc z2P;=!Ey1-?<;$npz6ql;NH9=Wql$8>rDq7E4T84nW z{6I6|RqyURYWY9ZEv58Ytj{}{} zNv>>Gl;-v@x!Iw81hV^Z7Uyzn4~6qmB$;mzs0G83!bH6dgGn8=w~%YZ?)qy+#7~o= z=qMXXwOyNR)t1IWQ3_rV!rur)!D>}YZi;0s@%L^qVmxt5wAZLNP1gHW!&^RxYIq?9 zMJ=MNjCY`==x`aR)sl0hZHVtSk(&z|W#x&pXM9<9?%hS1pRyOZt#&~1o*`L?Hi=Sd zTS-d9#5}$s*+wcaeJ7HcZYLgdv9v+jJ4ffCJDvKGuSAWv<%omo8G`qHlnp0=@1!-U zsiqhF)N6TaWU1YO5merl35&~R`)Gj8R{X4$i|%K>elX${ zd|@qXGLkqK+c+b1F5|jx;=Dj{wqm4q&f2t(B3=|Dj&GD)MESw1N%6AQ4+(k6_+gZd zCYBf2SUSY(P%N!*jh&^nODFxJC>ujuNA$pz3%WvaO`!OqIYr2REOENb#t9yxY`!Q} zxl3{CsrhtWi-}iHoy@ypz2aqs(Cl@!7Kz^^W@p+2vl{MQ66_wuEMXO`$p1Hp({vjr ztBQ9Mr%j4e{FLf=VO*4rBW{On+|q}n$S(;fVC5Jhv<6hpANFhcTCsqQA#1i-m1M<6 zRRh2*(8-T7bs{{~Sz#IaIhLWrnY%xhq4PuP8a<+s-(hi9--1!ryGQ^$hV@CsYd9baEs=RqW#DSdK;bILamy zuRAGhC+ou}3y;{^EnwK^BH-Y~2mx%}M2KT?=( zxe0O#_0lVS$q9m|i;xLDLA5Zg9VkqpjN)N$VTP3xNo4s@o8(+MX;@myPoLoB6!te% zN7;da&$Y8|R4Lh|`Y74u8NyGyQGmA4Bd+;?b9$i{C%^gIYw$#!Fol>x3`&dIPSnSXCV0Xv8IEz$g}J#itNULzmjjY(_dgtY~e<(i4JhW6$0KZp}qH9I38 z&M(NX&A?t1j)mwiQz&5P((qiZ`CGX2WH$$-=dj0>j>{f*Kscw%h6ue zwBRFSzEg8@))Ab{I{v+PW_-fh(;G9hj_>r&jL*sYH8ZF7&cUnB$y(7l>L`1IcnzkQ zquF9G{RE?PD#g^7A8BsRdh+j>u-Lsx>|TrKCca{%fQ=(t^o8bTEq#S%P@&SzJw%*t z?o}|c&5PxEEw+0HyGYQ~zGP0x%sH!Vewj{`?I-Ruv)XEH42D6NTWJ+c$~RauwPsQw zZ~SXbqwGCmO-^D@tj{FP8LN3p9Tamhx*3|ILxZ>N|L9}3#YILrLmT}JS5HQH5@(u$ z+RFnbHm2J4ttYOxlI=^#6w*~{Mz+gUn$% zMMIEZM-4~WrNpv2j-_2M1Da9;y&4T-RviHEUqJv%(+eWYWj@o-`$G#e1}H zf`-_v@3Zcx$;U(cbz+mek@-$2qu$7l;v^wIz*guLkq7dnp5W7lE-F#$iqN(^z)F}H;Du{wLX0`0$npZR{xlpsQf~&0; z#C%4F(fuwl{p~tilcT9nDqm>k!euK;Lsg6fy=y`-O343?E>uR3ZH3}pLn>~p%DkS+ zyg05RW}#%4j%mKOd&*LG%*xCO@(bTl)=8YNwAY5&YU6U&#%*Z=uT4@OnQby$iJH); zjV|;CD)gc+txmpXES)S{GufhPzaWlu?9S|IBbZ=xK)VAJ0zK}N_e;k;!V-4r9)|}AxwwXt0=pc zcu(G7AMmPUX@3X&sx-euYHIS6A(qRC>C_EwTPIjdxidJwSEjH?T1d(Ca$-us0vlHu zdXNjTV6RNc4%;?3qpVR#y3fYbl5`(ce`&8wA*qvTh%eNgV+&|z~ zyKIu0Zs?+~(7J1TWgjQA$-XI(^j7?XFL-a!>}3GNsbOf661D$vrI6QdD6KZ;wqs+j z428U!;Z=zwwAz=SMZRA%R5u45)2Ah&4o6)r1npIAAMKT|O;F7@kVsxfi*D6?M~SWZ z1TC5%uD4K#+-uwJ>Xo$+IRWeXL{d9i`AyAQ#v*%_T5bzA5aSUWqUM-0yq_qIxr4nj zcFHUn2Z`}e$GEc=dptOKOf&AmmO(El0;T7u#l&>7-LukLCUVCpDPPTeiI@s$ZA`Br zrp}4a(Y6_yY0qO!t5~y;vRBm|&?`eBrDnK<7{*Ve%7$?(FsxUG!rDs5H_Db0!!a99 znZ0hbBj0=(uNfwqSHaMV(O$vj+i-Ue?CvHdn$jyfRM=v-fY@E?P#vp7?k1C6soC}5 zkwbN?aCD0h@ZBB+k#js7oTqk-sNCfMM7!>(& ztu4dZt%ZpX67eOZJ_AFm$6Z>gL}q{tG~Ve?@1u*d6(mr9M+0DGCnEVrT}A112?|+w zs0RYMjYdc=NGd>a$G)sMv0e>geH^9Y_S0s)8iJz!syvK9u^<-rV8{ri7O1%)k&4N0 zywUO9b}Ha%gMR_q*K35d2GaU&u;wZEK5f%(8QyR}uP(rQ`>@|1wsaxN!o+@zgFQ3Z zlc5`_*(X{**kf=J;yA!*l9aPL7vl!m+rsOVlj7oL_ z)x@vMOSB|S6!=?41ub&4kXaob_?xf!I@gf0)phW1`|HuWSq?uJI9Lb&5a#URWMGgp z9*i}#Q}q>N9RS=xocRGkCu4pG61DHp%$(ktW)>e}c!t7YCLApXS zcbY539MM4fwk9?B5Dxqk@ovF_+T^W{2=G8KpBTC{YiF-1)^G)E;jgX4_*WY|CSSw3 z5aBP)wWp>9*J`}uHOijj?A9gQ<>}oSH1l2>gfo|C`<|o{@;125essDG2Q^ctC!!>V##ttN8?hWu2Ukp{UeTF| zVd5knoF?6mWHpX`l@hEu=vgY^3$jg#OJMd%2s5$QnuLV*h?DWy2)=zlzx;j>A+;aP z8e|8?IovH($zH7d782-J4tY!)HZWZm3)h8@xna7%p2nR0#W{G>1eG$pw^C@Tnxy%r z;{|On2;bpfzK$*6tJ}7+D~f(x1x@+6YlQjU6-GbVMP5!iRSp5^{RN+$?(+soWv^eMZ+^@@+}^u5bmco>=F+V5j~eEWzreQ;9tK_4ruaxE_M)CBPj8SNg1 zEBQK9>Y;j1eY6Jl<8&=>62k zyuW58NymJ7r%>x}dc;nCw=4Ifw46TJ$KdUEIIEuLIl8t_#grUxQX2FAmc8Tt!dL!U z>2NkCwL-0A7`r>*M#zfiI+`^mzhV|05}_cpaU6=V->m?uL!r`uQV6^{U?XVD6)nS} z!Q*1=A6r1}l+@xhvC88Ma8&7`^bMF9Orj;&;jKhmt%)#N2Jw~jHE_oj(Pv#l?{<%w zlD-b7iWDs`;dOHNMODP%W`**VtLxaosC(+t^xLq{u4w6+Mn0swbUEc*uc*1G5>0mE z!V}-I>2?oUOETQ4Fd3rSa&gPthX-VUyit>FH&eUa7mUq7`S(cj_!K#Yp-QK+(CJZp z7~_9o5>Y79RMD>PsDM3`Zs6{hI7?#+lG90JHYq8R`R+%zYeYWP{vnmj`O-TDnCtK` zqCBc7KGaIy2M29E)p)a_W!i5ugT9}-bBm(q*y)fRkWUG+RY9_ycZ`8Z%>ZJDM2wef z1?FSExOUm8K1~P~KTB;>(->8xjZmLcvn` zF?D*c8E``_9IQ!Ff12!$W{tKqFtnH4FdPacs2 zS9^0XO1jymJ{f7_-f|CT#c9TieY;&_CQ{Ar80=AyG`sV@iHL71BIQR;!``8Y z*#vnmio8~L9KMI>UnqK(<8nY!ANKd?7n=!_G=O{{=zCg) zIP3-)!p!~5QuJrCqGee_Mf8i?y#n-9MbEC_w~V>?JowA7A$T(o84^*PqFT{?cw{!l zXpSO~;UwE?-QVnX=ipK%3}3#&klN_mktvm`0Y93@BrVw;7iiVx=2f3{;!bJs$JW@e0V__~A zua1Vqk9-5O)kH}c$8Q7RTLHRVrxs+5Pez18 zapSXwy3L8TO>#CQnWCtDt=P6T^jwE`lBFzBpmYl~vkWZWB&uIgu{h8d2SL1t#&o43 z`mB>nRCW$BRw-JVaU==E3?j~U5QWR*I-E}}RHumMVsSl{H(yf5r&_h}9W6=Xj@N$r zUoB)8C}gHa3Z?bA{Q{mkU{a2S4`{r@c=+~J3jCw}XA>Uoc~D{d+p&ff@wux+u7~vPh=|ify3T`RJcAoD-L^)Nv@!A&e+kVNWNJor}E^PIOxt; z<_eH*(WLYWx@jn1lF8W2n?YT#sKx1Y9GO^(yoW!c0e+_@XV^}?V~YBM=o>Yiq9JM} z#17w=3rly8CdvSiT0*nKTZn$2rsIX7M&_Nw`F>55vxt>>KhZZ?bh5=u5OY_P??c4= zA&U;?Hu@gQ|EQ*CJMWEPp1C~w#hrxOtWoLaMjj9&2KNPhi>BwsZ;t^r7>C{g+p1yd zB48=50(HA*2B?%Bnw;&t0@dxFK7}AVEr|0ddbiuPgdn>#B;CBN)9v=ICh{wqoT{%J zbh~}2B;OuQ%aYB^kI-V32vdLiEx9m&Zz{-myp|FBRQ70`58jFfq?u~wo+;et^#h>$ z%Gm8!SYzUtol6tPK}9iVj^(*Db9|^s4!8g20XGwGZc^cyXcUcqHF~huAjIez&}D#+ zX>dw)prL`Uip?02?HQIbW5l6Z&cW15zOw~YJT+S_GNe|`jF|ZjH7Hy^m zn$II5N?UUG6BbdI9EB5xE5lXgskp*B5_W4F+u|FRmY=lc)F8e_Av;1}1;IC}VDmP@ z)a3KrIPg5i$88kR8(_aSfi^(XxY1K0FwYhc2Ww*A3c8AbZW42(9PsX402OIaW`+9d z5lQ#F1NtycPpwejID$3Bevn3LQjU!OTeBTw+moQ&V>Kif5IsYSgXWCAR|L#>jme9{ zkY=$1B|uHosJ#8s2~AIFk1oK6oo6!a$F{Xfez5fF42f==hYBEmJr0R zA>`HSx+!ZqKM&Tl(!#)+#$kea;8UeBw9R2`R!qqUhuIbt91Ln@KJwOSs+=m6=fDnc zr1IxmbmX=?2GrqxDtm#Z=b>zit~?5M_)%gLuwXVe7HlhV3u;(D!OhYKy&65dix@Up zNWm}>@=fBoL?iQ^Jk{dqAaPu3;hY>5?ilgw&^YQfGIiGXk)u_X60hYJM)0y@I*CuG z#+(ty$2M!OC5|gBbR0(;`WE87TBD_mruW1SCy`#PwJ?IC9g{)Y(WNm`JFNa1Ks;`? z=z@nuA4d6a(e(I8U>z}7Zvg}YZLBejh{K&45a*37CHh8-E?QAVtgvrM1>B?Qnf5bG z@DZ+welfTJJnqw&0X^W4G8+9*ROYOK-L#U_BLo4pH8ihr;HhUVB zl$1|;zDJ|7xdUw;0(2+ifF3Y!Y7DJ6^nnX^DvrE?{Em&RPfK7Ce~fbP*W~O3?q3~M z=%9vVkqR0&=(^o)H&fevs1Y76}E-A9TrK3Q&|nmesxS#?Zf(%`&eUn&6- zOU+L;%(;$ryM+ffKQEYPxhY?0yt!U2`W1M-Iv4m<~IoNejrmVxfN z{D5Rwq=CdxIc2Kg!2_2P4u0VH7Y0Gg>t_q;Nu659|*W~ zi^u9LY?E}h zY_WA`DH?Nc7s8DlIM&E9MddJ7K9l;=%BMt8%#}}NUt0P26{)xn?wukebst%|N}cKv z<^+T-M5xk)OiZT6nQQ5#;k)&kH2?@L3xrA_5cRrp?s zgp0)08Yk_!?WlpU=W8`44U1%ab1U79rXr2Q2C`~h8tSDln5k)sP_f2w14w_f#_+e- zly$U+u`^>kZEygNm`3qf@+D0z4Zs-Z4Zvx=9V07gKW}iS#;EUx0UP7I0c_Gn4RON6VOI7fg&@7G9t0|!l#vS{NF0Z^MXO7f#GK$pi2 zj3WdM z>?nT<#EuR8kz|x`VrgAJU{|;MI3sUM$=&rs49JTC6LqOkgqtA zw5$>eWX!1;R0Wh20VSy0l=5Wfsbi0I+Jhlm$zQq0_bIN z&`;x_6aoVDia6*O8j2R;T4<53Q<;3Tz z)4AduWFO0q&oEzQ5N_09SH7pB!8=KKQSbOB8Zl=6HKbUV@VjaZcM`TB#;}0r$4!9Z zZ0CgLFueRBbP-=L;@LFe}^K-yCP$GJ(9D64f91N4KGb%{ks z9LdId2d(m#YWkOjc!u=@yhFn??bitqw|V@c&nFRPxx$R`R0vt!=kG#8bgJ~?_!vmH z`}!3m&I*ljL|eKMZK3+C)&MhT(T$+RG0MNzMpi)!I(d*vqID^4YHf7p!-v@z*QLc%RX-c;(b7J`y$;>?p9@_B%B=S+t6)PU7|uN-Z!q zY8V_g+}aWQ6)qX7IA}ueQBa|o!(3aFD_$w|mOwQJyVyIvDO@$z^z7i@#~BRk&B4E4 zLwa}cH)&kY4*o+L^Q8{{qZ-D9r1MZ><#!QZ2iy*c=AYSfoG`0r@smpJ(QHL!OF|DeY8=-_{-ArALD-m(8kL*w1= zc)$LbM%&%*c(?vjCsMk~@h<%rHl*c#$Gh}NgUJ)5;U!Lb^OH*O#^PQ2WR0}B-|-%O zsuL*uz<7r~Ljw)>JKmko(J;&Xj`!vBH7d^ij`!#XXt2Zmj(6(^$3dn09q-f^X{gQp zj(6#YX`tzT$NTdmHO}FF$9wc+utcL0y5ELZPwuy0qZ7N|hHEd~?@FDcC->X%@F7o?#>czghI0?(Y>n*A z{WhF?xXX1qPrUnWckbtFq}~0tyYmY)%He+7effZf+1+o$mxucu)F{*aHXM0)-%T2m z(EB$0dFgyF(HVMhzD@UD=2@!qBzC?N`1l<mId4k(k^<_;oJn+1Lnj2vWb01WAq5FBC4UhyH4AwsZ0tocNoJ z`M23Kmsj4*O{ty5zrLPP^qU{kNTH*|Aq0KY57ozOy$D*J<`RtDUxAVNDn`XUNqix1 zN-5&t!9a^DOaJDDTCdusR>0PYD6@~VOb4?h+c*3sEMkT(DDfW=Bv&UU{copQU(G=q zyL2=`G(A-{r6-~#sMW8GS*b!AVqyNgjED1;u9<}Y!GBwWj+%!ziakkHx`q@YqsdHNX~olI#!eeZ0^kO@zRrrLiyR1ImBRFb0Z%X)r|E+~=_gA6d714xD^j2| z3PFGctE@;_oB)-<^i@_M zZU=%slpjA)`Y)4NS6T6RuSF(mlw`_cdS!s8>wusSk?|9yPd18a;kThFX$`3KF)NxjXVa4+s2{8Sbb%hm>7vmw({>*-b6|lcMU?i8DS=U$bn4QE<(?^Mnr04(! zZXi3nCBSO)aV=aS!o-3R|en!$2r6@&9FFxY?iw?mqp->9^D*q3f5eHCc8o@7B0f)umS$U7D_$ z&>yB1sK&&hPWljSZy&p@M^bb)b1vkO`g}Z)&0)@UE`Zw|K$?nbSkKE`WO>1ng@mYO ziPzkqZHb4oI%Wn60D8s&!VJmgvIKDgq`&CEVqtcA9{2y{p)^l~@)iP9&VS-YWlZgVi9xiE*xjZn~$J*dC-s;$sZGPZlbkOBH%Y*Nq5E0x29Uyx{}=LFK4=)&Gtdd@8LJUP+Y z#|b3fQ=IE9Cy1Ueid%2Bk;3Cg)rWq6+w@q8sD2cP{F|xPT8qeQz=u8xf~05(OR$v* z!jFNYkBKeircy1w)us_~z70tFnCLQ=X#W!6y8xt*2`*|6pL1(rT0-p}IpES1|q z^3ac4{Nn##jl3=RJo0a^&uEpe_os^`Z+`WMDv$F^@8p{lsL@k;ps5b}`p){lyG=Fw z*Z*yW+srPCOI4jyZaD4d@zVb7v`48O{_V84ME-wq+8=6en`5>0^S1E617cq2MQx zbNvm4>BYGo@ukl7$S-rQM}0--dbD<%`5hk!O^!8v%!-ZCsNS6Gv0uTtF8*@o`kR*9 zEZdPBYxpR!Nad&Ji(14&H)rrD!H_r+Rx(!4RlfRO4E&OzKp*;aBaw9MLa_9QnU&Fbc`n8y6nrHYoks0pSR)van8j51J8YHYfI^Dk@$LnlKT2!ILv*}L$&n z;n!+#I>GS3zfUjN8vOsO2X&}Myt~2ZyF>)leK>=_zZ4E9mcoqH#Xea1%!!)0^VU>- z7CX7t|9NbIcf#?StcUUVYRv!n0g^R#V)g0BIk9PjV*ITTJZ)8X#2x$O(4g4Ur?y85 z@NpeV2O|2&y_BQFz500M(b%@DuDpEy`~^?BMLFA1PV8t`=Yf0hv!?2F>_}`udhBUY z#_m|BctmM#QY~>-qW+E z#_B#EUH5@}I+uQDpPo}#-R0k1Eg#0jwomx$gl9Fdz}7@cAjP(DUZ`6bf`a7Dw6Uz$D~C&`?E;$CTlg|Gw#K{m;kzZ{XLRwb5hA1Zu^KQA(P@fVA~ zAkkH;@!zT|kgYma^+613wT%-dbYC`qe#6@AMSp>0is{n_sb+_cK(Ax_7d+LUo`i0{ zA$9u$k}vitskT?Ewq2P&CuM#G?X8qqsPE@enNN(aJA#o%Pf+I1Ro}jWD)I+YnWaMB z2q{P*AH?s2pW(l4{&dJJNAJ|U*sHS6BBiVD4gRdvPbVi(KTV7MMKS4Bq(e85g1k|^ zm@Q6KBJhkosmM%)f{H%|XIPC$T`8~}lFlN1LF7_GJ@!89 zKR`Y<38nJHws*l|I64~Jrn=D_9qmP%@*mjCnz^g~8u6}t=7?yH*U;5|Z}o(~N_LIU zR!n6K|CfT>wpFi3#F%LK5k@v+E1yY^ZM*VvGKukgG>-@SNM?@(&Ll3pB$y%b$73`; z<=@+WK<=HZ$AX@&nL9hSJNn(ptmDe)cQ0a*OQVn9OM*mZ#a@>B2~&Py%sn&~Jr`p= z_L8X95lZ>-UP>X-KKkQ@*tpZTevHh>kqU97&9;&3`g!oBuP`RrOg{-O1R~#CjFdqn#&#puZ*@C$S@EZgN>g9a(+6BV&^b z4JFG)+Y2qAG4&jBi7{mXo`xFyB+40o26HC!VRlN1Z6gh-*5iB^K#H5{em;FswHBkh zFn7iHMAWLwiTy41tZ1*@(eI&ki=$79)*aRb1^f?$exx>|1w`jj)5V_UCI2Bwm%R)? z7UZP z1Qp9;ly4Nzmkk8yV>o>T(Vr&bIh@#cHga=1xyPq}io?sGZ$x){!|N!21mcC5_wCNPG! z%_j}w>iR?$q%hSpm2~g{92A7wa}-tBP~U9OvmTCi1F&W#4T!9V`LD|aLmHwl>-O)+ zTJv+l&}btgJC1WiEn~a4xrZ`)1;-_>-~cOmQ__UL@_xH;ch=8H4ENCaRIWqB{0Td> zQm*dKx~2QvB%q)G387l!olq#@$;Ky+su>h5IRsDsmW9p) zqYKA%X5iP_afdt?eyh{9_FG(oxviTAg9+bn@=!iMeiYk1H+HHkGSp3vSE_=pgP9sD zAI2oLyCb=W&Wvq)l)Mhv$cHlVdfBGIh}w2|yZr0OAxW>E+f}vSs&}+Aon@{57s`rW1Pk;J{IShLe$(5NT@ml( zXdpVL(byE^uFZ6;Z$PzmJj@^CsS*DLjN77Nt<;C=mc4Vv*FO^u6P zo04KLK?is#F__}4RnH(jRxv1wj>}s8M|u!;xwj(V?BXR(76X9oaHTHb*37<^5D87p(rEmHt((Lk0HsiMptL*0{cc@Q(I5 z|MY)Q`xqi*ttO)nU)4~8D@m%zY&emzsl2Ts{@7}gXl1u+t$)?Z1HQHVQ2=<`El&E< zPC0Zj>Qf1VI^H0qzv{~9XMH+G^5(bv>)nrSM>d|=kr8`#<&M)U zpA&YhCWhq!))RT8gxO+nl3D5^e_TzRdanEIQQvnt0RYt=(E2E-$;9{+ER z|6ei<6BIlq=+@u6I$xsvFr3`_cn=k<^uO&olpXE-7whn>T=FW{=vQ5MPU>h}?21(k z#c=u?=SNeD|0GYtfHu-THH*d=bfdJSXy<219oZ|FyaZmKvdF-d{?}cH^2kezV9dx= zH>KJaIUkdryo~w?J&D!5KDzFunEzwB$a#Bo-K#5~a?1p)b3W$oIu`9uqY3$gxy})u ze+{h^{htwl*Ch60SJl&)#Nj%wL7&rN$Q?QJ(Bzo^?a}^M1+S{tM_0Y17ypL}1q}nw zAV0<@m~PHf3LyAnl>nKQgDKa8uTv*U3GDjkn1;O0X=oqy8MJ1%)TmY6S*uD-vzN7M z0v@}nKJKbJAu+;KcGc}u8r$^{S&ptw&g{x<{+r-R{|IjLIu^-;!|dwtY$H|hZu74L zhFn?^wl7EHL^r&;8DZl})ST*hofi((Cbq5njr@5;`P z+4Td}BKSi8$2VkjRjnhTgtAf@7QW*QtnuFlZ#Y-YSX84n3V3M9;-nr$!DORFDdwV# z-~|sc3(m&_DFBRvA%Gm4GR|~Fj#Ixh+o-i%H%LIQrtcavKUDr`m-9{!{mR$^VuDfE+{q0qPZ)#xx20(noiPP z2}d$}vHlG6K>56z3g)gJxSt`p1qtbCEJEprnwy=%tM{+Jhq z=y0I=$37!IE1wyG;-9V|H}SouU1y7peFN9-%Lk{`fQ_o%7hyNZ28MtdZcU~PL9MEITz@BGQ$mVK| z#?%Hc@m}&0qnmMU32T-KlDO6rTaEik49+N)O4;y8uTP74L}@AC%aF3I^^m)|fY(O1 zBdk%b_CDe1_qHYE)2Kc`?zMUsXGnHI=%B^FHkf~Rxj(}vdLsM$GAGK zmPyg;E`mAURyH~5P*qpeCwivrs(W7|y6QgZ^1siEq`VKf4!I_DUr;tVGI&kdu6RP$VJ=i3lt) zNCH;;v@9@UB0vFvCTGM3kPjji@rStN@zV(2`#2TYV1?OA1`WSI@#A!}meF(z`5 zv9OthjFngk#MX?NSQBKytk_r>HpbfTR=w9h0_<#Z_MDkB!#Sl}zqfAPx^?T;t$K|c z>M;2<5H{a-0&?-JLc+0Go4V~SU3AdfXNfn$o(D&1s<4-2!H=7%S0Sseojr$hzLcz~ z_;d&jQG{`&#ZO_N6%un(Vqv3;dD6~Cj*BtSNy3yuW_zCYs7ZU7ybN$PXOS8DK!(1J z$`R}Q5@JDPmV2^+aMcY6Kc{`cq&+7PUTM!4zM~9%ToNHHYDJ4s1wj*rh#AJYDA~Cq zCOUp>(=x&1RL6AWZL}xSQ@P&mOUa0eZYEU-wurqJA-@U<=&1<4zQaKyLPuBjTI5xL z*OBpBgcb_bcr8N5UOEuJ7NJ9zY(?@9tCRe-H~N<_U2q%Rxmk=$tc^WHrcC~{`yUL8 zYWG`RaDt?cUiZqoV3J8&MwmddQul8x;XC5u6Ry>xJtx{Lb+>n}T>*)_-6z6{PH{D$o1D+7(hvY3{36YeDR zV_)L~IN9p%e3%`EJ3;3G-H6xiz&{xO-v z+*pNYe=euskrBa;l$_I&NlI+-lda0)p| zeaN~eZ(Ud0LyKAKrt4k9n0&Qyc5bp&2@#`l3lq9Qx6NqJksld*(c_WhLeF*m$GE2G+NwpURJ5xRYOt$GJ3!Tv3bd&! zb-8MIS&9;+4J-2UJ_sFr!Z$WaY)QmZE?tf2o5&Bpmnn92u^WCqM6OM^H7`Ih zlOMAu&KK?M9X)UDT)PIN5t+sX$`sDjsT)^rHyKtQI)=-u&vyF^a7~)%@9lSle?XqX z=DURnAuJr)W+JcBbrIdR20w&%4WoxXD0`lPX~yI~NSloOH%Rj9Gqa+6I|;c6n6wh8q725J}+&>Q!4 z)ZH-Kx)yj(u5Kwzuf~PxN^P#{?0E|76X>sW)7oXuo-Ub=yhvk)q&+0lsgm{77Ma`q z;?HHRdLz9aSm54UX0#$Kk;m)PoKF>|W^F*0M`nqkkQ6fmi;!|?8(qRDCTLcJAHwt` zD(&WHsbc8Ey^k3YhMdhuGMla^yb3Vrf5*eUbikKQ0)tY@1zIcjs{^Vyj>i8 zSJ0%FE)2el9STh*=g{hy-4bnJYU<<0;<@car1PQ@_6uSJicR&{acV;EcEZ0*O#31z zj}JP2!Jv^j<b zyB49mSZ4?!*Fw4pwI)~BH#5PD8zUdhID6K?vem+P)R8>%^$SlqpF9q7YsGE9Ui2?v zP<1m6Kazu@$#y=4Z$J~XBKWRNVc=;y|0F)*_^_x&S98iW4tBr##1ytK*Vgcw;MuN< zGwBrORsuuMrS|oxSC`ZbQ_^!~ zXGNWH^3;X}rFYl7vD2n6w@Kp)Iq9)e`o{1Xxx)k1oc z7g*0*&fQV)gBF_esV5L4HyZrMsHw9)bpH#;);*}AKwmY+q7<8PEO-$sb4s?l);uC@gs5ev;eGgU zN9tXi90E!eY_cY+y-NT{C1* z2)?$b*G(!yc|Apzol%+S5>(YpIb(Zg6~x#0Erfz5RGL_~oKbd2;a(CQ!t{R% zzv-9OeO#Uvdj1xP2e2Shbs#Qf+i`3XP3j|8({?V5o=R1lSZE2XwO!^@R%OycLLB~i zk|Km&%$lV?wW&#{)Em27r+0_*dqTHrSO0L!!mB&WZvTYtRWVRy(p2|{;h)_N;UhlK zmJm5khj|FepFy-hT^H1J;@~*d`3E$rcm|oh;ewQ`lv7$bLwkIi;9MknVGIfk~*xp+WGIPT`C2QDOo8Lv{&4!3_e-o z>6o_XRg4+Dx9ZX%sixuA-)eB$6l_b~_iZ%y80t%8NclEyJdKmH7%{xx_;kxS$3vzI zNAfIu2{$2r-8p3eF!G_*8=nD1=Cu{b-PIVno0janf z{gSVt`Tz-Zdq8_-Z-innbR33Wmg<>Wze;tyQ33S>bGum#>}2&m^3}Cx>=jVv0dLI# z@|(8jMFs3WegY{5_jvq0Se!Od`Aw>vA3Z?uOcU(ECw%0`lNkgXL68}xDPQKzmEXf@~53uthPvAjr z0Cq>JWT})xFWDd>(q7Ts4Z;|C9}8-4!$-oCeJXf84I514o9OJynp~H&hhBn_6WQ4_ z4>8=$VGG699pr+KlsZ6^B?-EG_wh55npB^+bN3K3BVF`>TO2{?SqRw(WXIuft9t>Q zyYaiOY1&8KPvELDFYdK$_klP?Pm0c^f02;jQP2`mN`w4TUcEliknR;k23=}Y5W47d#0ULxkzQ#Mmz;5gA0=Jx>d_=c!BidHSHI)8;4z+g%1#0IKAA$K~CC>fZZ>OK|6OJ#B`E@*$+7DAmQA-cXp<> zrCy7WYc0OJigTWL5LzP&oIQ6^qo8^!4JInxBh!5{od_?0R_RlwILO;4B!+B(xOR;1 zp<<{|a6Vyqrc{}d$~pLcO>jzDtdY(s7{+fASt;14!c#QS@Ql`M$#w325phzIwwf?X zguGD$q2gc{hu)`mO!RZ^bm1-zzX^^dxf$rf;O7{nVQ+tk&kUmS39Qk-CeVpd2%1C} zxJia0rSJLT7S`VhW`PFcg;6~P>PFWubcy2hzBD8bLxvbcj*|lem$qcCrHLo|T7AhGGG$S5mzq>29NKu1R@}uW)0Hlhyi85G*`jNq#J*G4m|?yPokZ&zzh~BW zlSJvQ9x4SH6ReanF8I+bgP_#!!a@ z0l!raR2SJ0QbcHZeHrNV`yu=Uk-Vb=R?7}rF_7ZX%GCx&&U-61h+o8|5cJlcUc5#*?oDlXnB{T|e; z&gi2Maql{79cx{sc<`OLpMZt)W$lCLb0oqMF+*wLw#aenEv@~FvRhndi}8pruQtqX zUXzlcU5Ne<8U^G-ZvWbz=S5OrsKr~m}z$jTtJ3YHCu!*Zt6Z>D~M6G zI#W%Z8eT=W{Nx;1E0s*QbR@Uuh#rKtu}$*Gg9Rqjq&b4uD<*BTN&8WfM#2*S(gX3U zr6UTgR>QnYy>q`&GyN4Pgl0OmhfcR>IDoX2j_4k`?0acG#$d>ZT=z8X6I6t~gXom|z;(YREb!&Y`|7QnjJUKVeNFReHCTNp2Z?1lR2hEs)?(5sO zZr%0}DaS_*C+9kU9BfkAJk@MZ`*9=1z(AVT*SfIIqH z{dzmGNMD7iK)AGEmB=qUz76`YG0IVk1F`eTKcl>ak#aTigf}hxXbj!RHAP;GFi+H& z{5(CWl4aO|A%g;)bV;YRS7FyrT}_`&&57Rb)o%A1mrnKsVmf|1dv;)h(T9SSh_7)3 zcJU{^x));Tux=7}@47yj#1bbz<^YD2hDSB>`h`B96pzadg+SaJMGc*Msdk?Hmhn4@ zVkj5mW?#;apoQ#g>@bo#hu!ol28VBTM(P8{?UrBR*R*y20L| zcW6|&pIi$D_4-)hk-175O@4ub;|qUJ#_={q3%rG{G_`z6`FEy%BXnaU3ghJ@rTa}2D1g6m_ zH=fJmEFlq-T>xEelpEdZn8mBRL}^^;y5E7y`2v{`2HjvhYqv$8Bkci{v+?P@rFLcz zqd!SA9{JI(5P4bdk@y5eO1^XjrnXOzLmr0|a{gcYCwIi}(f_NzZ~x@ipr?C+ogX`X zZ69$)8gUPwd=VP%)3DD(UXsOzDaF;JZfF>j3O>`3adscZ8^FDPL8Us2U!O5rXBrEs zn;a&_d>f?(?vx4Egi)8IxzQ>iMM=|sLSU3{JCmn9kUH(;_M&qai9)IfB;g`gjWLCv z2ePY?A4nP68TkR(Olj?p8avHY^*4lL=a1s{0!7H`c@X+QN}POQ?w-Vzg!ZS@UdZ8O zCTK|{wLcfum~0Vu&LQ%eK`yPY>V0I*z-c7lP0Z^gyL_(Bl_^w5kLOm|fD;0B+rVBgaZS#Avf7QBqzQh z3nMR5A;Y@}9KJ*eK2Jdu%oo07*@EgIH{Q4vjU$~ZMD+6#jhwiU?nONdn-4F{bd$8^ z>=Qx6Pjx>|WXv*h^*S?RAB!`eOu=}QG@a@HM7L)tC%R9i=HTWTltVkIXpW^X6GR%K zMEmSvkPUz$`FZ z5`i70mKYhjKP8pN$!7$QQ8R%wbp~MD-;Fv_sFd&m#HI9squ_M%^x=3P{R&CqBn>Gs zJ1KSEm@SN$Dwp_~lN@q!+~1lnCQyt-J~kBFLSo|M5=H9*{m3~@k|;QDNi5-ur?(>d z{NF$<#!I_X)(2V*@X>g|p2p zIx>`na7YWe#XDp=MUc~(v@*dT3F>7JqE$W4d2|7@sd3`jq%vc+=|K!UzP-ss(jtYQ zUmu`2Z_0B}ZP!EbY-tKY$$i1d5*^YKzXWvpcvFyISH~Vv1kEZnV4MfJw~)c4dthe!TJ96tn;!qb z?KcGsnD9H|{+I6KWHqGW+FQ~rd@uBov`pgVg+h-{4Fe46Vz^_ZH%3-5JU+r9BQ(BL z_mLNcVWeNr=!_D>5qI%h4YnF{g=cWddUP+SN@a4=!i*pO<17|F0Rutu8W25V$aC)R z0Y>r2Sf@oUD&b+n6?ufVFT;hD!YmGMle0>&U)F;ODEGG6-*zNi;3>9@^q2iOIZrzq z{l>HC5~zPhV)LN3hmz4}$#F(1gKWO|wJQ}#-iby7Coq-|-uTR##^{>HWN+0=Lntt$ z=hV%==D@Fo;0R88W|H4Yy7XihpWs}=k_rdFlSqQ7M07F};-5&yz4&BM!%8$H9TV~y zgG})<+DGqU4R^U90}pclNt_$;agGq-wc2y!hJ+WRGSa2OTb?jTq$G-F(SZ_|kB?%rCpzURcwRd_gg z6(4>5G+AP<%F{|s@Wb$@CSF04WA_L%WdKn*7(wounTD(3Vfp!pvWA>;k`1^7iv{0* zX(!rf;!z~GhBD#1FAU~CoY)8|1y=g>cL00 zwQlXm3qIcVX#1n0oIdn2ek4s)qO`ok$4{Y{qOh9rVF6Pl95}2;CytM$dU$^c#ToyYT7&1FylCnd@+ol`_iYL^pk=iN}q&{}IPb z$=Jyp*<2tt$|g;>H-w+m9|I8i+ItZDQGG7NA}u#W_Or$ei5HMLb%Iujn|$>G@9i7I z@4Xfj8<@OBh%X|&u~4(LwNEsC>C%2asrt#DEH088? z8Nx@PAU-TC#ic49Rq?8dUsZZhx*wqxMcWXzBkVv3BXl5iB3#Z` z#;*b6HG4HMs!G&az^@~H-JYi?8F_#%z*F%*1XRgMC@tSXDms&Wp| z@2W}_qR*G%ph_u^5!EHA`~N(Aw-csf+m%S`w%~m_zJ*dfP)A_2*U`c z5zZi#Wva?3U<2yxK*aqBWgbtx0pAieV5|3GPGzV-!cl{eZm) zeF*&s0|*BZik+%*2=Fk%5rm@%#}F2y%^=_q!d%2#fNwv-Ai{j43lWMD4nfYw5Xum* z1iXY$h4>1D^QhbGDCag1ZOd2!qA{~-0nbD_6Y}In$izT`sC!eH8b#-jslO2-^&^M} z(%)5;AEye`8xS?Dh;_g+26!5k&I67koI$(+`4fm=La4-OS2>q(Hz;stRG@dHL6Hw> zAE?R6$OZ(JpsINmRhO|sD}^fT{;P;5 zSw|2*if{~J5Mc;m7~wR+C_*p7d4zF<354qiZs6`g`)df-5!!%9L0%MbGhhtR2Dl%v z6J^^FnxJE*F~%6ecBFS8jJly#06P%coVm&%(sNPo8lc%z!gIjvoQzVz=q9xQ3l?-Z zYiWU0xmQCKx|AkBBwO5@X`$_MZzRy>uBObeyI$$U8jZP^QnC-ZqbNP-Uar_TVckGS zxtH>}=wvQtb1sn2*Wp~uY6BRSENh8b?ZD*HtZoOytZqZa9z<Ea3COpZOU@f!n zVCXLBr!u6=z~sdUWneHd`rjD*TQNAFF9!1#XB2>OU^HM5q8?2zS7LzsA$+~*rOGd| zmA>>vLa+2AYaqQyIf&vz=};;z<#75^K($U& z`24y0BlX3~2Tt=8ixQ1{&ymoz98KjPEg^;Ba7(J}8vC|~Gs#5;imwWEmkdZC0NzTkGIPvqtxTIeISi`9d8 zt50xg2eQa)S%Iu|zNN5bx4?qE2k>sdFDgCiW?qT8sDuz#L0eQ}J}N&}n8R2OzooX= zhN}PKwFSmN+F}=AvbLB;+BS!@g;yyAteUfwSAmgL8OsC{A=G>Y(ksB&RR}AwXL+ zq)c<5`C)nuz=}VJK&IF1Q_DG2J&o|Yo>~q8?J%iF-9A(&3vk=_pG>_FHK1~sGJ%^7qJCB&dsz)v{VO{2>1v)lZ0Kh~Yc z_{I??5R7BpCB(xB9SE1za=rtM-GQ~U9gM~?j)yZ=v+L?S^L4wOm4AuHGOF2P>msGs zWM_RQzY@#X&4P9p>o*11fQg`s9YXxD>0x%n z1EHQcp(BFOdNlUlf*>!GgcRL`kX+;?4=`UDi4$}W%CgxodLPkyFXfjr0&H16v)LB0 z>QZjzUbZa2j;S6tZO&$j#ly^MHoI&sVATt_kFR7onMKTO+024w2OCsfypUHTuZ#8Z zd;~Ac#JR1I&to0tMXUk`2<~ET8^)QP4}!7`nG7IoCIOiMj) z$XttffQ>jx**be3f}giwxbtmWk+&ITb~eoIn7~@Z7h%>ttkvpb+W-^s)hNqGcm(5E zuE)2cp8}-w5eksE0Kv}2`BuIBZos+ee1GN!_`M2P0~oO#hgR!$^{m(y zKvHsXB_GUOii%rUnJvK2XVwEl5jQ(3(9=ADT~g`=l78SSVn+H9h?PiocB7uM?>X@!0$naA9&US2Sx_oW;&~x z+p-jC!k^Da&?eKloR2wZzShbaT@ALE@=K0tw$4T@EoaSkFY85>7W)P^9}Dy00MB%m z$l3)w$LRr*I@HYP#fV=rFF@@QS<}NSoeN~m0cH3GG-v+5Gw;{FYeIZIIb z5`>3D8`4l4wt64BL(=vK`BMuhbU%aLtpuso@@oP^)bMxhl+eci>{FuP}*92De( z0xUrb=VM53#|R2dMS^XQaXya8n`@beu!POGDb``OAD_Dok3!PKI{&6iDSD^7C*|@;G z3v*Cj&3bIBS+VI`sipJSgw-!=EJHLO*m7B=1p^E4Cf6Qx^jGL`87p>`z}2`&@6@4O zu(OSR>X2=*k0io7gG~lsEeBg|yp5d;##z z1061eY?kSU3U@Ez!>;ups9xyjVb=oC{A1BuIAbN)@?FH2LLJm0z7*}iPjeBwco$GD z1&O6-`gIhoR)$@ECiHneA9t05g3V}Ef}ZO^!D_$~$@V44t_GrfU|0eS(30r1DjqN4 zX19fnyX-tuhd%dG_U;CulBz5vXp)Ogm+0f7u@Qd*I?t%AoL9MPK|wx*XaNb5?D;Qm z%%U2)nEA1B<+HK$@*A`KtPH|_(6tmZzE+5Bmy0*KH(?EO-r`=w+uV>VmqVn(ZcH7h z-{qc%w4KM?8%2JfUjLwb9zWt)AnDt(o%6^F(oN z9yaL*fxChow&j9}C1TT_Yxx>Gf;6ogvu6WaXITwM^5tSjA$GKGm(JrWJOS3vma`Q; z+SnGckZ%cZ@(9adg~_8dd9atId%#6Mt1joQ9zSa^mGkX@IVP@L_JG$O2mIK}Iegk| z{nM<;1SRLca*b6Zw`jWNHuk{03?=4QE4ma?U8g2iSFu=nzqk9qjq ztf#?{dN$zm^0F+>S}?Y0>|9k@f!PRBNyj_uh3rd9BD zS=azpvL>Wfv1~R1wU1pOl;vlmHm{*bCS;uY;Y#F0j~#HB<^+Sir_?dF)~~0M;ujFo&=L%L595+9m8_J{#~7N;`x& z02BeXMd-Z!SxkXN#QU=>{7_Z_yBjXZENOX}xgYU-%z%TPhf3`QOGs6X!@4tLv5rFl zH$wrABd-Mt=pJY;FS|E@Mv~2Wd?>4kFb*YQ9MUn$)=8~~;;lxrT>O02G9Y$f(SC_f zXRYUo_g?PvuH^H*1sH_`tJcBGyz|6}%x=yr^>`-YE4)~2J`eM`UA#fhA9s3rvxw(& z_$vjDDz}60(DOQVyiLf9>Uq6-UJLRD^t{7*UK{d`>3PF?UKn{Jdfu3xw+nd_-XcEj z#R^NebH$gBzG0B~XdD5aBVaZ!6wtx?P=B${PjkX*F%%ySF`uu~i;uV$@Q|L@>ccU@ zw*afMfE{#~vSG}@Fcjtp=433ri0^=GjG@a;w2%7s@&Vs&w#`0IIfvbR4CkW(UmiOT zYb|L13U>O<*yZUM;RmF1QVHNP$bA4xf$Tv)8-d#IH`SwVKH7TGR$2u4e8~5(u!Tl^ z8)45Z6W%Vmbht5`71Ck`rOn<_ltVN5769h4rTX5FRSKvfc5fPqUF^y> zKMfzN*Brq8j7#K;t=7-y`e9F*@{r|XF?Rtk_LuTX{~pZ8Jl2VxJ2CGAnAf16WB{iK zSfSJ%y2X_ap)C?r2K}JY3$skxw~x7avp)b0wvlf`E!eG9P&#DW%)`B$oi%y32qj+z z@z~}E3Y;F>AQsh2c-U_kuXXKAu1F81?-&P&UTox zdB1;yPNLL5V*1% z3gqYfSRPP|6DXSYW25vxhBQHkvX0qV1Hu=}SrhXk%g+9YRAa6_((FX`7N~m%3uB-@ zhNHGWfZ9?)KFMu!ma=KzR-oO)Dj7@?R>~>@tYQf-oD*P}7k#i`fUSsE&EaeUxMF_J zgL528a89-o%m@HN+qyWzugPWbOtvp=KVyAM(+=!nyRfsTv9#@`qa2{mG)$o1G)iE= zw1U7PQv-p+rX2*1nK}pznxX`TOgWhV!=^FYUG$TCRau%(z#4_T%O z^{{0wrA}L7lsaQ+BQRoVqRdgtC^ZOvrXvuM-Gc4-x3F4iV_Io*}TyI!>U+dXzxa zdX7NM+D~A=b#4|wueFRopS6`T2dpay9JFpHaLC$2;IP$3RgPGDDRtD^L}1w3LEyBt zmC9DB+X)2KW-q`xbsK>Ob%hV0NnJ-Eqz+JKvwE07i+YSet2#_zn>s?EO&ue!U7aAX zL!BlNR(BBSP&)~9s!;;F)LsHTxR(Zqs+k00Y7T+@Y9WDMHAJ9KZ6(mJ?jSIrE+%kL zo$CiUq!tr6tX2{@q6P^ZRhtPMQyZv + + + + + + + + + + + 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/internal/2.4.4/1/Packages/SpTBXLibDsgn_d10.dpk b/internal/2.4.4/1/Packages/SpTBXLibDsgn_d10.dpk new file mode 100644 index 0000000..7d622d0 --- /dev/null +++ b/internal/2.4.4/1/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/internal/2.4.4/1/Packages/SpTBXLibDsgn_d10.res b/internal/2.4.4/1/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/internal/2.4.4/1/Packages/SpTBXLibDsgn_d11.bdsproj b/internal/2.4.4/1/Packages/SpTBXLibDsgn_d11.bdsproj new file mode 100644 index 0000000..a1e48d5 --- /dev/null +++ b/internal/2.4.4/1/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/internal/2.4.4/1/Packages/SpTBXLibDsgn_d11.dpk b/internal/2.4.4/1/Packages/SpTBXLibDsgn_d11.dpk new file mode 100644 index 0000000..21311c8 --- /dev/null +++ b/internal/2.4.4/1/Packages/SpTBXLibDsgn_d11.dpk @@ -0,0 +1,43 @@ +package SpTBXLibDsgn_d11; + +{$R *.res} +{$R '..\Source\SpTBXReg.dcr'} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Toolbar2000 -- SpTBXLib Design Package'} +{$DESIGNONLY} +{$IMPLICITBUILD ON} +{$DEFINE RELEASE} + +requires + TntUnicodeVcl, + TntUnicodeVcl_Design, + tb2k_d11, + tb2kdsgn_d11, + SpTBXLib_d11, + dclstd, + vcl; + +contains + SpTBXReg in '..\Source\SpTBXReg.pas'; + +end. diff --git a/internal/2.4.4/1/Packages/SpTBXLibDsgn_d11.dproj b/internal/2.4.4/1/Packages/SpTBXLibDsgn_d11.dproj new file mode 100644 index 0000000..a609743 --- /dev/null +++ b/internal/2.4.4/1/Packages/SpTBXLibDsgn_d11.dproj @@ -0,0 +1,587 @@ + + + {0cd140c3-3adc-4bf2-8a9c-6b5faa587036} + SpTBXLibDsgn_d11.dpk + Release + AnyCPU + DCC32 + ..\Lib\D11\SpTBXLibDsgn_d11.bpl + + + 7.0 + False + False + 0 + RELEASE + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + + + 7.0 + 4F800000 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + + + Delphi.Personality + Package + + + False + True + False + + + Toolbar2000 -- SpTBXLib Design Package + True + True + False + + + True + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + SpTBXLibDsgn_d11.dpk + + + + + + + MainSource + + + + + + + + + + + + + + + + diff --git a/internal/2.4.4/1/Packages/SpTBXLibDsgn_d11.res b/internal/2.4.4/1/Packages/SpTBXLibDsgn_d11.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/internal/2.4.4/1/Packages/SpTBXLibDsgn_d12.dpk b/internal/2.4.4/1/Packages/SpTBXLibDsgn_d12.dpk new file mode 100644 index 0000000..1669b52 --- /dev/null +++ b/internal/2.4.4/1/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/internal/2.4.4/1/Packages/SpTBXLibDsgn_d12.dproj b/internal/2.4.4/1/Packages/SpTBXLibDsgn_d12.dproj new file mode 100644 index 0000000..17bc401 --- /dev/null +++ b/internal/2.4.4/1/Packages/SpTBXLibDsgn_d12.dproj @@ -0,0 +1,116 @@ + + + {0CD140C3-3ADC-4BF2-8A9C-6B5FAA587036} + SpTBXLibDsgn_d12.dpk + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + true + All + 4F800000 + 1 + 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/internal/2.4.4/1/Packages/SpTBXLibDsgn_d12.res b/internal/2.4.4/1/Packages/SpTBXLibDsgn_d12.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/internal/2.4.4/1/Packages/SpTBXLibDsgn_d14.dpk b/internal/2.4.4/1/Packages/SpTBXLibDsgn_d14.dpk new file mode 100644 index 0000000..be51e42 --- /dev/null +++ b/internal/2.4.4/1/Packages/SpTBXLibDsgn_d14.dpk @@ -0,0 +1,40 @@ +package SpTBXLibDsgn_d14; + +{$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_d14, + dclstd, + vcl; + +contains + SpTBXReg in '..\Source\SpTBXReg.pas'; + +end. diff --git a/internal/2.4.4/1/Packages/SpTBXLibDsgn_d14.dproj b/internal/2.4.4/1/Packages/SpTBXLibDsgn_d14.dproj new file mode 100644 index 0000000..b050de3 --- /dev/null +++ b/internal/2.4.4/1/Packages/SpTBXLibDsgn_d14.dproj @@ -0,0 +1,116 @@ + + + {0CD140C3-3ADC-4BF2-8A9C-6B5FAA587036} + SpTBXLibDsgn_d14.dpk + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + true + All + 4F800000 + 1 + 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_d14.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/internal/2.4.4/1/Packages/SpTBXLibDsgn_d14.res b/internal/2.4.4/1/Packages/SpTBXLibDsgn_d14.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/internal/2.4.4/1/Packages/SpTBXLibDsgn_d7.dpk b/internal/2.4.4/1/Packages/SpTBXLibDsgn_d7.dpk new file mode 100644 index 0000000..e3a57af --- /dev/null +++ b/internal/2.4.4/1/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/internal/2.4.4/1/Packages/SpTBXLibDsgn_d7.res b/internal/2.4.4/1/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/internal/2.4.4/1/Packages/SpTBXLibDsgn_d9.dpk b/internal/2.4.4/1/Packages/SpTBXLibDsgn_d9.dpk new file mode 100644 index 0000000..282eb87 --- /dev/null +++ b/internal/2.4.4/1/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/internal/2.4.4/1/Packages/SpTBXLibDsgn_d9.res b/internal/2.4.4/1/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/internal/2.4.4/1/Packages/SpTBXLib_d10.bdsproj b/internal/2.4.4/1/Packages/SpTBXLib_d10.bdsproj new file mode 100644 index 0000000..1f6ec4f --- /dev/null +++ b/internal/2.4.4/1/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/internal/2.4.4/1/Packages/SpTBXLib_d10.dpk b/internal/2.4.4/1/Packages/SpTBXLib_d10.dpk new file mode 100644 index 0000000..cbf16f6 --- /dev/null +++ b/internal/2.4.4/1/Packages/SpTBXLib_d10.dpk @@ -0,0 +1,51 @@ +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', + SpTBXPageScroller in '..\Source\SpTBXPageScroller.pas', + SpTBXSkins in '..\Source\SpTBXSkins.pas', + SpTBXDefaultSkins in '..\Source\SpTBXDefaultSkins.pas'; + +end. diff --git a/internal/2.4.4/1/Packages/SpTBXLib_d10.res b/internal/2.4.4/1/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/internal/2.4.4/1/Packages/SpTBXLib_d11.bdsproj b/internal/2.4.4/1/Packages/SpTBXLib_d11.bdsproj new file mode 100644 index 0000000..a04ffdd --- /dev/null +++ b/internal/2.4.4/1/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/internal/2.4.4/1/Packages/SpTBXLib_d11.dcu b/internal/2.4.4/1/Packages/SpTBXLib_d11.dcu new file mode 100644 index 0000000000000000000000000000000000000000..cb0f1feb9885a6f0c65237b4ce4f9796f23b5194 GIT binary patch literal 3855 zcmeHJ>uVfU6rbNT-96cC+E_ywN|EBDEF!^1x1^Fv9-B0gq;8u{T2!=?yEnX1Y3%Th=_<35fNXAh=_=Y6cG_=MT&ocdhhIRUd~-V`7QHdckcO} z$GzvAJHK;_W$oC$-Lf8h`mWwxOUt`0yS;0oQW!WsCZ-=L?%Q`hVfBU`Yb9O9aOQ9I zv}_QEyqZ@|?8*l1O6iCaTRbswx+;0uvS!o6!goD!#+4%QubrrT#&}YJqrQ+D?aRBY zbh!xpHD49&C+r zsk}dk)dZq49TwwVZ`F6iVA*y|6#0Zy=Q8w!E%#& z)pji^1E!*Ag{CznrO>2s8gA0cx-iXeNvbf=J*9eC5m9_?Ta|)3WZ8r#72fX)1Fa=A z%2>Q>ZE9vLjgACCDc+U_=Qt~k89p3yTTU`{!_>p(NKSW`G?UlY?J6gezFh!m_J8O)R^XbURpfBgb|&G-@Qfv!SudvJR_v{ENmW?IWTN{4YGV5NJjVIFESvHPI?_k+=RNB>0ThE-`Y`@O+h4xHm z-ytsR(~KrBl?ab7S$gEL(jB(NGV6w&I`P6JB!gGU1gBmI<#CE)p&gUL(9tc!Th!gSQB8kKi4`yM*@$mkI9^J|KKZ_$Y&q z37 + + {1eb74e79-e290-4976-b63e-8e6b50611d5f} + SpTBXLib_d11.dpk + Release + AnyCPU + DCC32 + ..\Lib\D11\SpTBXLib_d11.bpl + + + 7.0 + False + False + 0 + RELEASE + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + + + 7.0 + 4FC00000 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + + + Delphi.Personality + Package + + + False + True + False + + + Toolbar2000 -- SpTBXLib + True + False + True + + + True + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + SpTBXLib_d11.dpk + + + + + + + MainSource + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/internal/2.4.4/1/Packages/SpTBXLib_d11.res b/internal/2.4.4/1/Packages/SpTBXLib_d11.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/internal/2.4.4/1/Packages/SpTBXLib_d11Group.groupproj b/internal/2.4.4/1/Packages/SpTBXLib_d11Group.groupproj new file mode 100644 index 0000000..c0ba271 --- /dev/null +++ b/internal/2.4.4/1/Packages/SpTBXLib_d11Group.groupproj @@ -0,0 +1,44 @@ + + + {1708f789-2cf1-44ce-85c4-adea7490fa43} + + + + + + + + Default.Personality + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/internal/2.4.4/1/Packages/SpTBXLib_d12.dpk b/internal/2.4.4/1/Packages/SpTBXLib_d12.dpk new file mode 100644 index 0000000..7087098 --- /dev/null +++ b/internal/2.4.4/1/Packages/SpTBXLib_d12.dpk @@ -0,0 +1,51 @@ +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', + SpTBXPageScroller in '..\Source\SpTBXPageScroller.pas', + SpTBXSkins in '..\Source\SpTBXSkins.pas', + SpTBXDefaultSkins in '..\Source\SpTBXDefaultSkins.pas'; + +end. \ No newline at end of file diff --git a/internal/2.4.4/1/Packages/SpTBXLib_d12.dproj b/internal/2.4.4/1/Packages/SpTBXLib_d12.dproj new file mode 100644 index 0000000..58b7242 --- /dev/null +++ b/internal/2.4.4/1/Packages/SpTBXLib_d12.dproj @@ -0,0 +1,128 @@ + + + {1EB74E79-E290-4976-B63E-8E6B50611D5F} + SpTBXLib_d12.dpk + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + true + All + $(BDSCOMMONDIR)\DCP + SpTBXLib_d12.bpl + 4FC00000 + 1 + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;$(DCC_UnitAlias) + x86 + Toolbar2000 -- SpTBXLib + true + false + true + false + true + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + + + + + + + + + + + + + + + + + + + + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + + + + + Delphi.Personality.12 + Package + + + + SpTBXLib_d12.dpk + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + + diff --git a/internal/2.4.4/1/Packages/SpTBXLib_d12.res b/internal/2.4.4/1/Packages/SpTBXLib_d12.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/internal/2.4.4/1/Packages/SpTBXLib_d14.dpk b/internal/2.4.4/1/Packages/SpTBXLib_d14.dpk new file mode 100644 index 0000000..a7e7a73 --- /dev/null +++ b/internal/2.4.4/1/Packages/SpTBXLib_d14.dpk @@ -0,0 +1,51 @@ +package SpTBXLib_d14; + +{$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', + SpTBXPageScroller in '..\Source\SpTBXPageScroller.pas', + SpTBXSkins in '..\Source\SpTBXSkins.pas', + SpTBXDefaultSkins in '..\Source\SpTBXDefaultSkins.pas'; + +end. \ No newline at end of file diff --git a/internal/2.4.4/1/Packages/SpTBXLib_d14.dproj b/internal/2.4.4/1/Packages/SpTBXLib_d14.dproj new file mode 100644 index 0000000..72e5116 --- /dev/null +++ b/internal/2.4.4/1/Packages/SpTBXLib_d14.dproj @@ -0,0 +1,128 @@ + + + {1EB74E79-E290-4976-B63E-8E6B50611D5F} + SpTBXLib_d14.dpk + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + true + All + $(BDSCOMMONDIR)\DCP + SpTBXLib_d14.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_d14.dpk + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + 12 + + diff --git a/internal/2.4.4/1/Packages/SpTBXLib_d14.res b/internal/2.4.4/1/Packages/SpTBXLib_d14.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/internal/2.4.4/1/Packages/SpTBXLib_d7.dpk b/internal/2.4.4/1/Packages/SpTBXLib_d7.dpk new file mode 100644 index 0000000..6f2d702 --- /dev/null +++ b/internal/2.4.4/1/Packages/SpTBXLib_d7.dpk @@ -0,0 +1,51 @@ +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', + SpTBXPageScroller in '..\Source\SpTBXPageScroller.pas', + SpTBXSkins in '..\Source\SpTBXSkins.pas', + SpTBXDefaultSkins in '..\Source\SpTBXDefaultSkins.pas'; + +end. \ No newline at end of file diff --git a/internal/2.4.4/1/Packages/SpTBXLib_d7.res b/internal/2.4.4/1/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/internal/2.4.4/1/Packages/SpTBXLib_d9.dpk b/internal/2.4.4/1/Packages/SpTBXLib_d9.dpk new file mode 100644 index 0000000..ae8209f --- /dev/null +++ b/internal/2.4.4/1/Packages/SpTBXLib_d9.dpk @@ -0,0 +1,51 @@ +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', + SpTBXPageScroller in '..\Source\SpTBXPageScroller.pas', + SpTBXSkins in '..\Source\SpTBXSkins.pas', + SpTBXDefaultSkins in '..\Source\SpTBXDefaultSkins.pas'; + +end. \ No newline at end of file diff --git a/internal/2.4.4/1/Packages/SpTBXLib_d9.res b/internal/2.4.4/1/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/internal/2.4.4/1/Readme.txt b/internal/2.4.4/1/Readme.txt new file mode 100644 index 0000000..1a8fe1d --- /dev/null +++ b/internal/2.4.4/1/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/internal/2.4.4/1/Registration.txt b/internal/2.4.4/1/Registration.txt new file mode 100644 index 0000000..0627a0e --- /dev/null +++ b/internal/2.4.4/1/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/internal/2.4.4/1/Source/SpTBXColorPickerForm.dfm b/internal/2.4.4/1/Source/SpTBXColorPickerForm.dfm new file mode 100644 index 0000000..5ca6585 --- /dev/null +++ b/internal/2.4.4/1/Source/SpTBXColorPickerForm.dfm @@ -0,0 +1,3025 @@ +object SpTBXColorPickerForm: TSpTBXColorPickerForm + Left = 156 + Top = 89 + ClientHeight = 193 + ClientWidth = 213 + 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 = 213 + Height = 167 + Align = alClient + ActiveTabIndex = 0 + Images = ImageList1 + OnActiveTabChange = SpTBXTabControl1ActiveTabChange + HiddenItems = <> + object SpTBXTabItem1: TSpTBXTabItem + Checked = True + ImageIndex = 2 + end + object SpTBXTabItem2: TSpTBXTabItem + ImageIndex = 3 + end + object SpTBXTabItem3: TSpTBXTabItem + ImageIndex = 4 + end + object SpTBXTabSheet2: TSpTBXTabSheet + Left = 0 + Top = 26 + Width = 213 + Height = 141 + ImageIndex = 3 + DesignSize = ( + 213 + 141) + TabItem = 'SpTBXTabItem2' + object SpTBXColorListBox1: TSpTBXColorListBox + Left = 5 + Top = 5 + Width = 200 + Height = 127 + Style = [clbsSystemColors, clbsIncludeNone, clbsIncludeDefault, clbsPrettyNames, clbsNoneAsTransparent] + Anchors = [akLeft, akTop, akRight, akBottom] + ItemHeight = 16 + TabOrder = 0 + OnClick = SpTBXColorListBox1Click + Selected = clActiveBorder + end + end + object SpTBXTabSheet3: TSpTBXTabSheet + Left = 0 + Top = 26 + Width = 213 + Height = 141 + ImageIndex = 4 + DesignSize = ( + 213 + 141) + TabItem = 'SpTBXTabItem3' + object imgColorPicker: TImage + Left = 2 + Top = 0 + Width = 207 + Height = 137 + Align = alClient + Visible = False + end + object btnColorPicker: TSpTBXSpeedButton + Left = 48 + Top = 58 + Width = 113 + Height = 22 + Caption = 'Click && Drag' + Anchors = [] + DragMode = dmAutomatic + OnEndDrag = btnColorPickerEndDrag + OnStartDrag = btnColorPickerStartDrag + end + end + object SpTBXTabSheet1: TSpTBXTabSheet + Left = 0 + Top = 26 + Width = 213 + Height = 141 + ImageIndex = 2 + TabItem = 'SpTBXTabItem1' + object imgPalette: TImage + Left = 5 + Top = 4 + Width = 200 + Height = 137 + Cursor = crHandPoint + AutoSize = True + Picture.Data = { + 07544269746D61704E410100424D4E410100000000003600000028000000C800 + 000089000000010018000000000018410100130B0000130B0000000000000000 + 0000010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101080942 + 080942080942080942080C42080F42081142081342071642071843071A43071C + 43071E43072043072243062444062644062844062A44062C45052D45052F4505 + 3145053345043446043646043846043946043946043946043946033B46033C46 + 033E47023F4702414702424701444702434602424403424203414003403E043F + 3C043F3A053E38053D36053C33063C31063B2E073A2C07392908382608382308 + 372009361C0935180A34140A340F0A33080B32010B31000B30000C30000C2F00 + 0C2F000C2F000C2E000D2E000D2D000D2C000D2C000F2C00112C00132C00152C + 00162C00182C001A2B001C2B001D2B001F2B00212B00232B00252B00262B0028 + 2B002A2B002C2B002D2B002F2B00312B00332A00342A00362A00372A00392A00 + 3A2A003C2A003D2A003F29004029004229004128004027003F26003F25003E24 + 003D22003C21003B20003A1F00391E00381C00371B0036190035180034160033 + 1500321300311100300F002F0E002E0B002D09002C07002C05002B03002A0100 + 29000228000427000527000726000825000A25000A25000D2500102500132500 + 1624001824001A24001D24001F23002123002323002523002722002922002B22 + 002D22002F21003121003221003421003621003720003920003A20003C20003E + 20003F1F00411F00421F00431F00451E00461D00461D00461C00451B00451A00 + 451A004519004518004518004517004416004415004414004414004413014412 + 02431102431103431004430F04430E05430E06430D06430C07420C07420B0842 + 0A08420A08420909420809420809420101010101010C0C5C0C0C5C0C0C5C0C0C + 5C0C115C0C155C0C195C0B1C5D0B1F5D0B225D0B255E0A285E0A2A5E092D5E09 + 305F09335F083660083860073B60073E61064061064362054562044862044A63 + 034C63024E63025164025164025164025164015364005564005765005965005B + 65005D66005F66005E64005D61005C5F005B5D015A5A02595703585504575205 + 564F06554C0854490953460A52420B513F0C4F3B0D4E370D4D340E4C300F4B2B + 104A2611492111471B1246131245091344001443001442001442001442001441 + 00154000153F00163E00163D00193D001B3D001E3D00203D00223D00243D0027 + 3E00293E002B3E002E3E00303E00333E00353E00373E003A3E003C3E003E3E00 + 413E00433E00453E00483E004A3E004C3E004E3E00503E00523E00543E00563E + 00593E005A3E005C3E005B3D005A3C00593A0058390057370056360055350054 + 3300523200513000502E004F2D004E2B004C29004B28004A2600482400472200 + 462000441E00431C00421A004118003F16003E14003D12003C0F003B0D023A0A + 0539080738050937020B37020B36021136021636011A36011E36002135002435 + 002735002A35002D34003034003234003634003833003B33003D330040320042 + 32004532004732004932004B31004E3100503100523100543100563100583000 + 5A30005C30005D2F005F2E005F2D005F2C005F2B005F2A005F29005E28005E26 + 005E25005E24005E23005E22005E21015E1F025D1E035D1D045D1C055D1B055D + 1A065D18075D17085D16095D15095C140A5C130A5C120B5C100B5C0F0B5C0E0C + 5C0D0C5C0C0C5C010101010101100E74100E74100E74100E74101475101A750F + 1F750F23760F27760E2B760E2F770D33770D36780C3A780B3D790A41790A447A + 09487A084B7B074F7B06527C04557D03587D025B7E015E7E00617F00647F0067 + 80006780006780006780006A80006C81006F8100718200748200778300798300 + 788000777D00757A00747700737400727100706D026F6A046E66066C63086B5F + 0A695B0C68570D67530F654E10644A116246136140145F3B155E35165C2F175B + 281859201958171956071A55001B54001B54001B54001C52001C51001D50001D + 4F001E4D00214D00244D00274E002A4E002C4E002F4E00324E00354E00384E00 + 3B4F003E4F00414F00444F00474F004A4F004D4F005050005350005650005950 + 005B50005E50006150006350006651006951006B51006E510071510073510075 + 5100745000734E00724C00704B006F49006D47006C46006B4400694200684000 + 663E00653C00633A006138006036005E34005D32005B3000592E00582B005629 + 005427005325005122005020004E1D004D1B004C19004A160349140648110A46 + 0E0D460E0D460D15460D1B460C20460B25450A2945092D450831450735440639 + 44053C44044043034343024743004A42004D4200504200534200564100594100 + 5C41005F41006140006440006640006940006C40006E4000704000733F00753E + 00773D00773B00773A0077390077370077360077340077330077310077300076 + 2F00762D00762B01762A02762803762704762505762406762207752108751F09 + 751D0A751C0A751A0B75190B75170C75160C75140D74130D74120E74100E7401 + 0101010101130E8B130E8B130E8B130E8B13178B131E8C12248C12298D112E8D + 11338E10388E0F3C8F0E418F0E45900D49910B4E910A5292085693075A93055E + 94036295026695006996006D97007197007498007899007B99007B99007B9900 + 7B99007E9A00829B00859B00889C008B9D008E9D00919E00909A008E97008D93 + 008B9000898C00888800868400858000837C038177068073097E6E0C7C6A0E7A + 6511795F13775A14755516744F1772491970431A6E3C1B6C341D6B2B1E69211F + 6712206600216400216400216400216200226100235F00245E00245C00285C00 + 2B5C002F5C00325C00365D00395D003D5D00405D00435D00475E004A5E004E5E + 00525E00555F00595F005C5F00605F006360006660006A60006D600070600074 + 61007761007A61007D61008061008361008762008962008C62008B6000895E00 + 885C00865A008459008357008155008053007E50007C4E007A4C00784A007748 + 007545007343007140006F3E006D3C006B3900693600673400653100632F0061 + 2C005F29005E27005C24005B2100591F00581C0556190A54160E54160E541518 + 54151F54142654132C53133153123653113B52103F520E43520D47510C4B510A + 5051085450065750055B50035F4F01634F00664F00694F006D4E00704E00734E + 00764E00794E007D4D00804D00824D00854D00884D008B4B008E4A008E48008E + 46008D45008D43008D41008D40008D3E008D3C008D3A008D39008D37008D3500 + 8D33018C31028C2F038C2E048C2C058C2A068C28078C26088C24098C220A8C20 + 0B8B1E0B8B1D0C8B1B0C8B190D8B170D8B150E8B130E8B010101010101160CA1 + 160CA1160CA1160CA11618A21521A21529A3142FA41335A4123BA51140A51046 + A60F4BA70E50A80D55A80B5AA9095FAA0664AB0468AC016DAD0072AD0076AE00 + 7AAF007FB00083B10087B2008BB2008FB3008FB3008FB3008FB30093B40097B5 + 009AB6009EB600A2B700A5B800A9B900A7B500A5B000A3AC00A2A800A0A4009E + 9F009C9A009A9600989100968C01948705928109907C0D8E76118C70138A6A16 + 886518865E1A84571C824F1E7F481F7D3F217B3522792A23771A247500257300 + 257300257300267100277000286E00296C002A6A002E6A00326A00366B003A6B + 003E6B00426B00466B004A6C004E6C00526C00566D005B6D005F6D00626E0067 + 6E006B6E006F6F00736F00776F007B6F007F70008270008670008A70008E7100 + 9171009571009871009C72009F7200A37200A170009F6E009D6C009C6A009A67 + 00986500966300946100925E00905C008E59008C5700895400875100854F0083 + 4C008049007E46007C4400794100773E00753B007338007135006E32006D2F00 + 6B2C0069290067260065230463200A621C0F621C0F611C1B611B24611A2C611A + 3360193960183E6016445F15495F144E5E13525E12575E105C5D0E615D0C655D + 0A695C076E5C05725C02765C007A5B007E5B00825B00855B00895A008C5A0090 + 5A00935A00975A009A5A009E5900A15700A45600A45400A45200A45000A44E00 + A44C00A34A00A34800A34600A34400A34200A34000A33E00A33C00A33900A337 + 00A33500A33301A33102A22E04A22C05A22A05A22807A22507A22308A22109A2 + 1F0AA21D0AA21B0BA2180CA2160CA10101010101011807B71807B71807B71807 + B71718B81723B9162DB91534BA143BBB1342BB1248BC114FBD0F54BE0D5ABF0B + 60BF0866C1056BC20271C20076C3007CC50081C60086C6008BC80090C90095CA + 0099CA009ECB00A2CC00A2CC00A2CC00A2CC00A7CD00ABCE00AFCF00B4D000B8 + D100BCD200C0D300BECE00BCC900BAC500B8C000B5BB00B3B600B1B000AFAB00 + ADA500AAA000A89A00A69404A38E0AA1870F9E80139C79169A7319976C1C9564 + 1E925B209053228E49248B3E2589322786222884002982002982002982002B80 + 002C7E002D7C002E79002F77003377003878003D78004178004679004A79004F + 7900547900587A005D7A00617A00667B006B7B006F7C00747C00797C007D7D00 + 827D00867E008B7E008F7E00937F00987F009C7F00A08000A48000A88000AC81 + 00B18100B48100B88100B67F00B47D00B27A00B07800AE7500AC7300A97000A7 + 6E00A56B00A26800A065009E62009B6000995D00965A009356009154008E5000 + 8C4D00894A008646008443008140007F3D007C39007A3600783300762F00742C + 0072290370250B6E21116E21116D211F6D20296D1F326C1E396C1D406C1C466B + 1B4C6B1A526B19586A175D6A16626A146869126D691072680D76680A7C680780 + 67048567018967008E67009266009666009A66009E6600A36600A66500AA6500 + AE6500B26500B66300B96100B95F00B95D00B95A00B95800B95600B95400B952 + 00B94F00B94D00B94B00B94800B94600B94300B94100B93F00B93C00B83A00B8 + 3700B83400B83200B82F00B82D01B82A02B82802B82503B82304B82005B81E05 + B81B06B81807B70101010101011900CD1900CD1900CD1900CD1817CE1825CE17 + 31CF1639D01541D11349D11250D21057D30E5ED40B64D5086AD60472D70178D9 + 007EDA0084DB008ADC0090DD0095DE009BE000A1E100A6E200ABE300B0E400B5 + E500B5E500B5E500B5E500BBE600BFE700C4E900C9EA00CEEB00D2EC00D7ED00 + D4E700D2E200CFDD00CDD700CAD200C8CC00C5C600C3C000C0B900BEB300BBAC + 00B8A600B69F03B3970BB09011AD8815AB8119A8791CA5701FA36722A05E249D + 53269A4728983A2A95292B93072D90002D90002D90002E8E002F8B0030890032 + 86003384003884003E84004385004885004D85005286005786005C8600618700 + 6687006B88007188007689007B8900808A00868A008B8B00908B00958B009A8C + 009F8C00A38D00A88D00AD8D00B28E00B68E00BB8F00BF8F00C48F00C89000CD + 9000CA8D00C88B00C68800C38500C18300BF8000BC7D00B97A00B77700B47400 + B27100AF6E00AC6A00A96700A66400A36000A15D009E5A009B5600985200954F + 00924B008F47008C4400894000873C008439008235008031007D2E047B2A0D79 + 251379251378252378242E78233877224077214777204E761F55761E5B761C61 + 751B6775196D75177374157974137E731083730D8973098E7204937201987200 + 9E7200A27100A77100AB7100B07100B57000B97000BD7000C17000C67000CA6D + 00CE6B00CE6900CE6700CE6400CE6200CE6000CE5D00CE5B00CE5800CE5600CE + 5300CE5000CE4E00CE4B00CE4800CE4600CE4300CE4000CE3D00CE3A00CE3700 + CE3400CD3100CD2E00CD2C00CD2900CD2600CD2300CD2000CD1D00CD1900CD01 + 01010101011A00E21A00E21A00E21A00E21916E31827E41734E5163EE51547E6 + 134FE71158E80F60E90C67EA086EEB0475EC007DEE0084EF008AF00091F20098 + F3009EF400A4F600AAF700B1F800B7FA00BCFB00C2FC00C7FD00C7FD00C7FD00 + C7FD00CEFF00D3FF00D8FF00DDFF00E3FF00E8FF00EDFF00EAFF00E7FA00E4F4 + 00E2EE00DFE800DCE100D9DB00D6D400D3CD00D1C600CEBE00CBB700C8AF00C5 + A704C29F0DBE9713BC8F18B9861CB67C20B27323AF6826AC5D28A9502AA6422C + A3302EA10F309E00309E00309E00319B003398003496003593003690003D9000 + 4391004991004E91005492005992005F93006593006A94007094007594007C95 + 008196008796008C97009397009898009D9800A39900A99900AE9A00B39A00B8 + 9B00BD9B00C39B00C89C00CD9C00D29D00D79D00DC9D00E09E00DE9B00DB9800 + D99500D69200D48F00D18C00CE8900CB8600C88300C57F00C27C00BF7800BC75 + 00B97100B66E00B26A00B06600AC6200A95F00A55A00A256009F53009C4F0099 + 4A00964600934200903E008D3A008B3600883206862E10832917832917832827 + 82283382273E82264681254E81245681225D80216480206B801E717F1C777F1A + 7E7F18847E158A7E12907E0E967D0A9C7D05A17D00A77C00AD7C00B27C00B77B + 00BC7B00C17B00C67B00CB7B00D07A00D47A00D97A00DE7700E27500E27300E2 + 7000E26E00E36B00E36900E36600E36300E36100E35E00E35B00E35800E35500 + E35200E34F00E34C00E34900E34600E34300E34000E33C00E23900E23600E233 + 00E22F00E22C00E22900E22500E22200E21E00E21A00E20101010101012A3DE5 + 2A3DE52A3DE52A3DE52B45E62B4CE72B54E82C5BE92C62EA2C68EB2C70EC2D76 + ED2D7CEE2D82EF2D88F02D8FF12D94F22D9AF32D9FF42DA5F52DAAF72CAFF82C + B5F92BBAFA2ABFFB2AC4FC29C9FD28CEFE28CEFE28CEFE28CEFE27D3FF26D8FF + 24DCFF23E1FF21E6FF1FEAFF1DEEFF21ECFF24EAFB27E7F629E5F12CE2EB2EE0 + E530DDE032DBDA34D8D436D6CE37D3C839D1C13ACEBB3CCCB43DC9AD3EC6A63F + C4A040C19942BF9143BC8944B98145B67845B36F46B16647AE5C48AB5049A944 + 49A94449A94449A6354AA41E4AA1004B9F004C9C00519D00569D005C9D00619E + 00669E006B9F00719F0076A0007BA00080A00085A1008BA10090A20095A2009A + A3009FA300A4A400A9A400ADA500B3A500B7A600BCA600C0A600C5A700CAA700 + CEA800D3A800D7A800DCA900E0A900E4A900E2A700DFA400DDA100DB9E00D89C + 00D69900D39600D19300CE9000CC8C00C98900C68600C48300C17F00BE7C00BB + 7800B87500B57200B26E00AF6A00AC660CA96318A65F1FA35B25A0572A9D532E + 9A4F32974B3595473892433A8F3F3C8D3B3E8D3B3E8D3B478D3B4E8C3B568C3B + 5D8C3B638C3B698C3B708C3B768C3B7B8C3B818B3B878B3B8D8B3B928B3B978B + 3B9C8B3BA18B3AA68B3AAB8B3AB08B3AB58B3ABA8A3ABE8A3AC38A39C78A39CC + 8A39D08A39D58A39D98A38DD8A38E18838E58538E58339E68139E67E39E67C3A + E6793AE6763AE6743AE6713BE66E3BE66B3BE6693BE6663BE6633BE6603CE65D + 3CE65A3CE6573CE6543CE6503CE64D3CE64A3CE6463CE6433CE6403CE63C3CE6 + 393CE6353CE6323CE52E3DE52A3DE5010101010101405FE9405FE9405FE9405F + E94164EA426AEB4370EC4476EC457BED4680EE4786EF488BF04990F14A95F24B + 9AF34C9FF44DA4F54DA9F64EADF74FB2F850B7F950BBF951BFFA51C4FB52C9FC + 52CDFD53D1FE53D5FF53D5FF53D5FF53D5FF54D9FF54DDFF54E1FF55E4FF55E9 + FF55EDFF56F0FF56EEFF57ECFC58EAF858E8F359E6EE59E4EA5AE2E55AE0E05B + DEDB5CDCD65CD9D05CD7CB5DD5C65DD3C05ED1BB5ECEB55ECCB05FCAAA5FC8A4 + 60C69E60C39760C19060BE8A61BC8261BA7B61B77461B56C61B56C61B56C62B3 + 6362B05A62AE5062AC4562A93967AA376CAA3671AB3476AB337AAB317FAC2F83 + AC2D88AD2B8DAD2991AD2796AE249BAE219FAF1DA3AF1AA8B016ADB010B1B109 + B5B100B9B100BEB200C2B200C5B200C9B300CDB300D1B400D5B400D9B400DCB5 + 00E1B500E4B500E8B600E6B300E4B000E2AE00E0AB00DEA900DBA600D9A308D7 + A015D59E1DD29B23D09829CE952DCB9231C98F35C68C39C4893CC2863EBF8341 + BD7F44BA7C46B77949B4754BB2724DAF6E4FAC6A51A96752A66354A45F55A15C + 579E58589C545999505B99505B99516199516699526D9952729953789A547D9A + 54829A55879A558C9A56919A57959A579B9A589F9A58A49A59A89A59AD9A5AB2 + 9A5AB69B5BBA9B5BBF9B5CC39B5CC79B5DCB9B5DCE9B5ED29B5ED69B5FDA9B5F + DD9B60E29B60E59961E99761E99561E99261E99061E98D61E98B61E98861E986 + 60E98360E98160E97E60E97B60E97960E97660E97360E97160E96E60E96B60E9 + 6860E96460E96160E95E5FE95B5FE9585FE9545FE9515FE94E5FE94A5FE9475F + E9435FE9405FE90101010101015A7DED5A7DED5A7DED5A7DED5C81EE5D86EF5F + 8BF0608FF06194F16398F2649CF365A0F466A4F468A8F569ACF66AB0F76BB4F7 + 6CB8F86DBCF96EBFFA6FC3FA70C6FB71CAFC72CEFD73D2FD74D5FE75D8FF76DC + FF76DCFF76DCFF76DCFF76DFFF77E2FF78E5FF79E9FF79ECFF7AF0FF7BF3FF7B + F1FF7BEFFD7BEEF97BECF57CEAF17CE8ED7CE7E97CE5E57CE3E17CE1DD7CE0D9 + 7CDED47CDCD07CDACC7CD8C77CD7C27CD5BF7CD3BA7CD1B57CCFB07CCEAB7CCC + A67CCAA17CC89C7CC6967CC4917CC28B7CC28B7CC28B7CC0857CBE7F7CBC787C + BA727CB86B80B86A84B96A89B9698CB96890BA6894BA6798BB679CBB66A0BB65 + A4BC64A7BC64ACBC63AFBD62B3BD62B6BD61BABE60BDBE5FC1BE5EC4BF5EC8BF + 5DCCC05CCFC05BD2C05AD5C059D9C159DCC158DFC157E2C256E6C255E9C254EC + C353EAC055E9BE56E7BC58E5B959E3B75BE1B45CDFB25DDEB05EDCAD60DAAA61 + D8A862D6A564D4A365D2A066D09D67CE9B68CC9869CA956AC7936BC5906CC38D + 6DC18A6DBE876EBC846FBA8170B77D71B57A72B27772B07473AE7074AB6D75A9 + 6975A96975A96A7AA96B7FA96C84A96D89AA6E8DAA6F91AA6F96AA709AAA719E + AB72A2AB73A6AB74AAAB74AEAB75B2AB76B6AC77B9AC77BDAC78C1AC79C4AC7A + C8AD7BCCAD7BCFAD7CD2AD7DD6AD7DD9AD7EDCAE7FE0AE7FE3AE80E6AE81EAAC + 81EDAA81EDA881EDA681EDA381EDA181ED9F81ED9C81ED9A80ED9880ED9580ED + 9380ED9080ED8E80ED8B80ED8980ED877FED847FED817FED7F7FED7C7FED797F + ED767EED737EED707EED6D7EED6A7EED677EED647DED617DED5E7DED5A7DED01 + 01010101017999F27999F27999F27999F27A9DF27BA0F37DA4F47EA7F47FABF5 + 81AEF582B1F683B4F784B7F785BAF886BDF888C1F989C4F98AC6FA8BC9FB8CCC + FB8DCFFC8ED2FC8FD5FD90D8FE91DBFE92DDFF93E0FF94E3FF94E3FF94E3FF94 + E3FF95E5FF96E8FF97EAFF97EDFF98F0FF99F3FF9AF5FF9AF4FF9AF3FD9AF1FA + 9AF0F79AEFF49AEDF19AECEE9AEAEB9AE9E799E8E499E6E199E5DD99E3DA99E2 + D699E0D399DFCF99DECC98DCC898DBC598D9C198D8BD98D6B998D5B598D3B197 + D2AD97D0A997CFA597CFA597CFA597CDA197CB9D96CA9896C89496C78F99C78F + 9CC78EA0C88EA4C88EA7C88DAAC98DADC98DB0C98CB3C98CB6CA8CB9CA8BBCCA + 8BBFCB8AC2CB8AC5CB8AC8CC89CACC89CDCC89D0CC88D3CD88D6CD87D9CD87DB + CD87DECE86E0CE86E3CE85E6CF85E8CF85EBCF84EECF84F0D083EFCE84EDCC84 + ECC985EAC785E9C586E7C386E6C187E4BF87E3BD87E1BB88E0B988DEB689DCB4 + 89DBB28AD9B08AD7AD8AD6AB8BD4A98BD2A68BD1A48CCFA28CCD9F8CCB9D8DC9 + 9A8DC7988DC6958EC4938EC2908EC08D8FBE8B8FBC888FBA8590BA8590BA8693 + BA8797BB889BBB899FBB8AA2BB8BA6BC8BA9BC8CACBC8DB0BC8EB3BC8FB6BD90 + BABD91BDBD91C0BD92C3BE93C6BE94C9BE95CCBE95CFBF96D2BF97D5BF98D8BF + 99DBBF99DDC09AE0C09BE3C09CE6C09CE8C09DEBC19EEEBF9EF1BD9EF1BB9EF1 + B99EF1B79EF1B59EF1B39EF1B19DF1AF9DF1AD9DF1AB9DF1A99DF1A69DF1A49C + F1A29CF1A09CF19E9CF19B9CF1999CF1979BF2949BF2929BF2909BF28D9BF28B + 9BF2889AF2869AF2839AF2819AF27E9AF27B9AF27999F20101010101019AB5F6 + 9AB5F69AB5F69AB5F69BB7F79CBAF79DBCF79EBEF89FC0F8A0C3F8A1C6F9A2C8 + F9A3CAFAA4CCFAA5CEFBA6D1FBA7D3FBA8D5FCA9D7FCAADAFDABDCFDACDEFDAD + E0FEAEE2FEAFE4FFAFE6FFB0E8FFB1EAFFB1EAFFB1EAFFB1EAFFB2ECFFB3EEFF + B4F0FFB5F2FFB6F4FFB6F6FFB7F8FFB7F7FFB7F6FEB7F5FCB7F4F9B6F3F7B6F2 + F5B6F1F2B6F0F0B6EFEDB6EEEBB6EDE9B5ECE6B5EBE4B5EAE1B5E8DEB5E7DCB5 + E6D9B4E5D7B4E4D4B4E3D1B4E2CFB4E1CCB3E0C9B3DFC7B3DEC4B3DDC1B3DBBE + B3DBBEB3DBBEB2DABBB2D9B8B2D8B5B2D7B2B2D6AFB4D6AFB6D6AFB8D6AFBBD7 + AFBDD7AEBFD7AEC2D7AEC4D8AEC7D8AEC9D8ADCBD8ADCDD8ADCFD9ADD1D9ADD3 + D9ACD6D9ACD8DAACDADAACDCDAABDEDAABE0DAABE2DBABE4DBABE6DBABE9DBAA + EBDCAAEDDCAAEFDCAAF1DCA9F2DCA9F4DDA9F3DBA9F2D9A9F1D8A9F0D6A9EFD4 + A9EED3AAECD1AAEBCFAAEACEAAE9CCAAE8CAAAE6C8AAE5C7AAE4C5AAE3C3AAE1 + C1AAE0C0AADFBEAADEBCABDCBAABDBB8ABDAB6ABD8B5ABD7B3ABD6B1ABD4AFAB + D3ADABD2ABABD0A9ABCFA7ABCDA5ABCCA3ABCCA3ABCCA4AECCA4B1CDA5B3CDA6 + B6CDA7B8CDA8BBCEA9BECEA9C0CEAAC3CEABC5CFACC8CFACCACFADCCCFAECFCF + AED1D0AFD4D0B0D6D0B1D8D0B1DBD0B2DDD1B3DFD1B4E1D1B4E3D1B5E5D2B6E8 + D2B7EAD2B7ECD2B8EED2B9F1D3B9F3D1BAF5CFBAF5CEB9F5CCB9F5CBB9F5C9B9 + F5C7B9F5C6B9F5C4B9F5C2B8F5C1B8F5BFB8F5BDB8F5BBB8F5BAB8F5B8B8F5B6 + B7F5B4B7F6B3B7F6B1B7F6AFB7F6ADB7F6ABB6F6A9B6F6A7B6F6A6B6F6A4B6F6 + A2B6F6A0B5F69EB5F69CB5F69AB5F6010101010101BBCFFABBCFFABBCFFABBCF + FABCD0FABDD2FABDD3FBBED5FBBFD6FBC0D8FBC1DAFCC1DBFCC2DDFCC3DEFCC4 + DFFCC4E1FDC5E2FDC6E3FDC6E5FEC7E6FEC8E8FEC8E9FEC9EAFFCAECFFCAEDFF + CBEEFFCCEFFFCCF1FFCCF1FFCCF1FFCCF1FFCDF3FFCEF4FFCFF5FFCFF7FFD0F8 + FFD1F9FFD1FAFFD1FAFFD1F9FED1F8FDD1F8FBD0F7FAD0F6F8D0F6F6D0F5F5D0 + F4F3D0F4F2D0F3F0CFF2EFCFF2EDCFF1EBCFF0EACFF0E8CFEFE6CFEEE5CEEDE3 + CEEDE1CEECE0CEEBDECEEBDCCEEADACDE9D9CDE8D7CDE8D5CDE8D5CDE8D5CDE7 + D3CDE6D2CDE6D0CCE5CECCE4CCCEE4CCCFE4CCD1E5CCD2E5CCD4E5CCD5E5CCD7 + E5CBD9E5CBDAE6CBDBE6CBDDE6CBDEE6CBE0E6CBE1E6CBE2E6CBE4E7CBE5E7CA + E6E7CAE8E7CAE9E7CAEAE7CAECE7CAEDE7CAEEE8CAF0E8CAF2E8C9F3E8C9F4E8 + C9F6E8C9F7E9C9F8E9C9F7E8C9F7E6C9F6E5C9F5E4C9F4E3C9F3E2C9F3E0C9F2 + DFC8F1DEC8F0DDC8F0DCC8EFDBC8EED9C8EDD8C8ECD7C8EBD6C8EBD4C8EAD3C8 + E9D2C8E8D1C8E7CFC8E6CEC8E6CDC8E5CCC8E4CAC7E3C9C7E2C8C7E1C6C7E0C5 + C7DFC4C7DFC3C7DEC1C7DEC1C7DEC2C9DEC2CADEC3CCDEC3CEDFC4CFDFC5D1DF + C5D3DFC6D5DFC7D7DFC7D8E0C8DAE0C8DBE0C9DDE0C9DEE0CAE0E0CAE2E1CBE3 + E1CCE5E1CCE6E1CDE8E1CDE9E1CEEBE2CEECE2CFEDE2D0F0E2D0F1E2D1F3E2D1 + F4E3D2F5E3D2F7E2D3F8E0D3F8DFD2F9DED2F9DDD2F9DCD2F9DBD2F9D9D2F9D8 + D2F9D7D2F9D6D1F9D5D1F9D3D1F9D2D1F9D1D1F9D0D1F9CFD1F9CDD1F9CCD1F9 + CBD0F9C9D0F9C8D0F9C7D0F9C6D0F9C4D0F9C3D0FAC2D0FAC0CFFABFCFFABECF + FABCCFFABBCFFA010101010101DDE8FDDDE8FDDDE8FDDDE8FDDDE8FDDEE9FDDE + EAFDDEEAFDDFEBFDDFECFDE0ECFEE0EDFEE0EEFEE1EEFEE1EFFEE2F0FEE2F0FE + E2F1FEE3F2FFE3F3FFE4F4FFE4F4FFE4F5FFE5F6FFE5F6FFE6F7FFE6F8FFE6F8 + FFE6F8FFE6F8FFE6F8FFE7F9FFE7FAFFE7FAFFE8FBFFE8FBFFE9FCFFE9FDFFE9 + FCFFE9FCFFE9FCFEE9FBFDE9FBFCE8FBFCE8FAFBE8FAFAE8FAF9E8F9F8E8F9F8 + E8F9F7E8F8F6E8F8F5E8F8F4E8F7F4E7F7F3E7F7F2E7F6F1E7F6F0E7F6F0E7F5 + EFE7F5EEE7F5EDE7F4ECE7F4ECE7F4EBE7F4EBE7F4EBE6F3EAE6F3E9E6F3E8E6 + F2E7E6F2E7E7F2E7E8F2E7E8F2E7E9F2E7EAF2E6EAF2E6EBF2E6ECF2E6ECF3E6 + EDF3E6EEF3E6EEF3E6EFF3E6F0F3E6F0F3E6F2F3E6F2F3E6F3F3E6F4F3E6F4F3 + E6F5F3E6F6F4E6F6F4E6F7F4E6F8F4E5F8F4E5F9F4E5FAF4E5FAF4E5FBF4E5FC + F4E5FBF4E5FBF3E5FBF2E5FAF2E5FAF1E5F9F0E5F9F0E5F8EFE5F8EFE5F8EEE5 + F7EDE5F7EDE4F6ECE4F6EBE4F6EBE4F5EAE4F5EAE4F4E9E4F4E8E4F4E8E4F3E7 + E4F3E6E4F2E6E4F2E5E4F2E4E4F1E4E4F1E3E3F0E3E3F0E2E3EFE1E3EFE1E3EF + E0E3EFE0E3EFE0E4EFE1E5EFE1E5EFE1E6EFE1E7EFE2E8EFE2E9EFE2E9EFE3EA + F0E3EBF0E3ECF0E4EDF0E4EDF0E4EEF0E5EFF0E5F0F0E5F1F0E6F2F0E6F3F1E6 + F3F1E7F4F1E7F5F1E7F6F1E8F7F1E8F7F1E8F8F1E8F9F1E9FAF1E9FAF1E9FBF1 + EAFCF0EAFCF0E9FCEFE9FCEEE9FCEEE9FCEDE9FCECE9FCECE9FCEBE9FCEBE9FC + EAE9FCE9E9FCE9E9FCE8E9FCE7E9FCE7E9FCE6E9FCE5E8FCE5E8FCE4E8FCE4E8 + FDE3E8FDE2E8FDE2E8FDE1E8FDE0E8FDE0E8FDDFE8FDDEE8FDDEE8FDDDE8FD01 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101FF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0000000000000000 + 00000000000000000000000000000000000000000000FF0099FF0099FF0099FF + 0099FF0099FF0099FF0099FF0099FF0099010101FF3399FF3399FF3399FF3399 + FF3399FF3399FF3399FF3399FF3399010101FF6699FF6699FF6699FF6699FF66 + 99FF6699FF6699FF6699FF6699010101FF9999FF9999FF9999FF9999FF9999FF + 9999FF9999FF9999FF9999010101FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99 + FFCC99FFCC99FFCC99010101FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF + 99FFFF99FFFF99010101FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF + 00CCFF00CC010101FF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CC + FF33CC010101FF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66 + CC010101FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CC01 + 0101FFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC010101 + FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCC010101FF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF010101FF33FFFF + 33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FF010101FF66FFFF66FF + FF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FF010101FF99FFFF99FFFF99 + FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FF010101FFCCFFFFCCFFFFCCFFFF + CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF010101FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF010101010101FF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FF00000000000000000000000000000000 + 0000000000000000000000000000FF0099FF0099FF0099FF0099FF0099FF0099 + FF0099FF0099FF0099010101FF3399FF3399FF3399FF3399FF3399FF3399FF33 + 99FF3399FF3399010101FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF + 6699FF6699010101FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999 + FF9999010101FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC + 99010101FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF9901 + 0101FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CC010101 + FF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CC010101FF66 + CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CC010101FF99CCFF + 99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CC010101FFCCCCFFCCCC + FFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC010101FFFFCCFFFFCCFFFF + CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCC010101FF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FF010101FF33FFFF33FFFF33FFFF33FF + FF33FFFF33FFFF33FFFF33FFFF33FF010101FF66FFFF66FFFF66FFFF66FFFF66 + FFFF66FFFF66FFFF66FFFF66FF010101FF99FFFF99FFFF99FFFF99FFFF99FFFF + 99FFFF99FFFF99FFFF99FF010101FFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF + FFCCFFFFCCFFFFCCFF010101FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFF010101010101FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FF000000000000000000000000000000000000000000000000 + 000000000000FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF00 + 99010101FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF339901 + 0101FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699010101 + FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999010101FFCC + 99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99010101FFFF99FF + FF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99010101FF00CCFF00CC + FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CC010101FF33CCFF33CCFF33 + CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CC010101FF66CCFF66CCFF66CCFF + 66CCFF66CCFF66CCFF66CCFF66CCFF66CC010101FF99CCFF99CCFF99CCFF99CC + FF99CCFF99CCFF99CCFF99CCFF99CC010101FFCCCCFFCCCCFFCCCCFFCCCCFFCC + CCFFCCCCFFCCCCFFCCCCFFCCCC010101FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF + FFCCFFFFCCFFFFCCFFFFCC010101FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FF010101FF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33 + FFFF33FFFF33FF010101FF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF + 66FFFF66FF010101FF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FF + FF99FF010101FFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCC + FF010101FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 + 0101010101FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + 000000000000000000000000000000000000000000000000000000000000FF00 + 99FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099010101FF3399FF + 3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399010101FF6699FF6699 + FF6699FF6699FF6699FF6699FF6699FF6699FF6699010101FF9999FF9999FF99 + 99FF9999FF9999FF9999FF9999FF9999FF9999010101FFCC99FFCC99FFCC99FF + CC99FFCC99FFCC99FFCC99FFCC99FFCC99010101FFFF99FFFF99FFFF99FFFF99 + FFFF99FFFF99FFFF99FFFF99FFFF99010101FF00CCFF00CCFF00CCFF00CCFF00 + CCFF00CCFF00CCFF00CCFF00CC010101FF33CCFF33CCFF33CCFF33CCFF33CCFF + 33CCFF33CCFF33CCFF33CC010101FF66CCFF66CCFF66CCFF66CCFF66CCFF66CC + FF66CCFF66CCFF66CC010101FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99 + CCFF99CCFF99CC010101FFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFF + CCCCFFCCCC010101FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCC + FFFFCC010101FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FF010101FF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FF01 + 0101FF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FF010101 + FF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FF010101FFCC + FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF010101FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF010101010101FF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0000000000000000 + 00000000000000000000000000000000000000000000FF0099FF0099FF0099FF + 0099FF0099FF0099FF0099FF0099FF0099010101FF3399FF3399FF3399FF3399 + FF3399FF3399FF3399FF3399FF3399010101FF6699FF6699FF6699FF6699FF66 + 99FF6699FF6699FF6699FF6699010101FF9999FF9999FF9999FF9999FF9999FF + 9999FF9999FF9999FF9999010101FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99 + FFCC99FFCC99FFCC99010101FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF + 99FFFF99FFFF99010101FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF + 00CCFF00CC010101FF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CC + FF33CC010101FF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66 + CC010101FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CC01 + 0101FFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC010101 + FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCC010101FF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF010101FF33FFFF + 33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FF010101FF66FFFF66FF + FF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FF010101FF99FFFF99FFFF99 + FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FF010101FFCCFFFFCCFFFFCCFFFF + CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF010101FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF010101010101FF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FF00000000000000000000000000000000 + 0000000000000000000000000000FF0099FF0099FF0099FF0099FF0099FF0099 + FF0099FF0099FF0099010101FF3399FF3399FF3399FF3399FF3399FF3399FF33 + 99FF3399FF3399010101FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF + 6699FF6699010101FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999 + FF9999010101FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC + 99010101FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF9901 + 0101FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CC010101 + FF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CC010101FF66 + CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CC010101FF99CCFF + 99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CC010101FFCCCCFFCCCC + FFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC010101FFFFCCFFFFCCFFFF + CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCC010101FF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FF010101FF33FFFF33FFFF33FFFF33FF + FF33FFFF33FFFF33FFFF33FFFF33FF010101FF66FFFF66FFFF66FFFF66FFFF66 + FFFF66FFFF66FFFF66FFFF66FF010101FF99FFFF99FFFF99FFFF99FFFF99FFFF + 99FFFF99FFFF99FFFF99FF010101FFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF + FFCCFFFFCCFFFFCCFF010101FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFF010101010101FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FF000000000000000000000000000000000000000000000000 + 000000000000FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF00 + 99010101FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF339901 + 0101FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699010101 + FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999010101FFCC + 99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99010101FFFF99FF + FF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99010101FF00CCFF00CC + FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CC010101FF33CCFF33CCFF33 + CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CC010101FF66CCFF66CCFF66CCFF + 66CCFF66CCFF66CCFF66CCFF66CCFF66CC010101FF99CCFF99CCFF99CCFF99CC + FF99CCFF99CCFF99CCFF99CCFF99CC010101FFCCCCFFCCCCFFCCCCFFCCCCFFCC + CCFFCCCCFFCCCCFFCCCCFFCCCC010101FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF + FFCCFFFFCCFFFFCCFFFFCC010101FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FF010101FF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33 + FFFF33FFFF33FF010101FF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF + 66FFFF66FF010101FF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FF + FF99FF010101FFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCC + FF010101FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 + 0101010101FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + 000000000000000000000000000000000000000000000000000000000000FF00 + 99FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099010101FF3399FF + 3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399010101FF6699FF6699 + FF6699FF6699FF6699FF6699FF6699FF6699FF6699010101FF9999FF9999FF99 + 99FF9999FF9999FF9999FF9999FF9999FF9999010101FFCC99FFCC99FFCC99FF + CC99FFCC99FFCC99FFCC99FFCC99FFCC99010101FFFF99FFFF99FFFF99FFFF99 + FFFF99FFFF99FFFF99FFFF99FFFF99010101FF00CCFF00CCFF00CCFF00CCFF00 + CCFF00CCFF00CCFF00CCFF00CC010101FF33CCFF33CCFF33CCFF33CCFF33CCFF + 33CCFF33CCFF33CCFF33CC010101FF66CCFF66CCFF66CCFF66CCFF66CCFF66CC + FF66CCFF66CCFF66CC010101FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99 + CCFF99CCFF99CC010101FFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFF + CCCCFFCCCC010101FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCC + FFFFCC010101FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FF010101FF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FF01 + 0101FF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FF010101 + FF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FF010101FFCC + FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF010101FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF010101010101FF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0000000000000000 + 00000000000000000000000000000000000000000000FF0099FF0099FF0099FF + 0099FF0099FF0099FF0099FF0099FF0099010101FF3399FF3399FF3399FF3399 + FF3399FF3399FF3399FF3399FF3399010101FF6699FF6699FF6699FF6699FF66 + 99FF6699FF6699FF6699FF6699010101FF9999FF9999FF9999FF9999FF9999FF + 9999FF9999FF9999FF9999010101FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99 + FFCC99FFCC99FFCC99010101FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF + 99FFFF99FFFF99010101FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF + 00CCFF00CC010101FF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CC + FF33CC010101FF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66 + CC010101FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CC01 + 0101FFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC010101 + FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCC010101FF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF010101FF33FFFF + 33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FF010101FF66FFFF66FF + FF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FF010101FF99FFFF99FFFF99 + FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FF010101FFCCFFFFCCFFFFCCFFFF + CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF010101FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0101010101010101010101010101010101 + 0101010101010101010101010101010100000000000000000000000000000000 + 0000000000000000000000000000010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 01010101010101010101010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00000000000000000000000000000000000000000000000000 + 000000000000CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC00 + 99010101CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC339901 + 0101CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699010101 + CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999010101CCCC + 99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99010101CCFF99CC + FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99010101CC00CCCC00CC + CC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CC010101CC33CCCC33CCCC33 + CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CC010101CC66CCCC66CCCC66CCCC + 66CCCC66CCCC66CCCC66CCCC66CCCC66CC010101CC99CCCC99CCCC99CCCC99CC + CC99CCCC99CCCC99CCCC99CCCC99CC010101CCCCCCCCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCCCCCCCCCCCCCCC010101CCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC + FFCCCCFFCCCCFFCCCCFFCC010101CC00FFCC00FFCC00FFCC00FFCC00FFCC00FF + CC00FFCC00FFCC00FF010101CC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33 + FFCC33FFCC33FF010101CC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC + 66FFCC66FF010101CC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FF + CC99FF010101CCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC + FF010101CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFF01 + 0101010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + 000000000000000000000000000000000000000000000000000000000000CC00 + 99CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099010101CC3399CC + 3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399010101CC6699CC6699 + CC6699CC6699CC6699CC6699CC6699CC6699CC6699010101CC9999CC9999CC99 + 99CC9999CC9999CC9999CC9999CC9999CC9999010101CCCC99CCCC99CCCC99CC + CC99CCCC99CCCC99CCCC99CCCC99CCCC99010101CCFF99CCFF99CCFF99CCFF99 + CCFF99CCFF99CCFF99CCFF99CCFF99010101CC00CCCC00CCCC00CCCC00CCCC00 + CCCC00CCCC00CCCC00CCCC00CC010101CC33CCCC33CCCC33CCCC33CCCC33CCCC + 33CCCC33CCCC33CCCC33CC010101CC66CCCC66CCCC66CCCC66CCCC66CCCC66CC + CC66CCCC66CCCC66CC010101CC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99 + CCCC99CCCC99CC010101CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCC010101CCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCC + CCFFCC010101CC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00 + FF010101CC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FF01 + 0101CC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FF010101 + CC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FF010101CCCC + FFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFF010101CCFFFFCC + FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFF010101010101FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF000000000000000000 + 00000000000000000000000000000000000000000000CC0099CC0099CC0099CC + 0099CC0099CC0099CC0099CC0099CC0099010101CC3399CC3399CC3399CC3399 + CC3399CC3399CC3399CC3399CC3399010101CC6699CC6699CC6699CC6699CC66 + 99CC6699CC6699CC6699CC6699010101CC9999CC9999CC9999CC9999CC9999CC + 9999CC9999CC9999CC9999010101CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99 + CCCC99CCCC99CCCC99010101CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF + 99CCFF99CCFF99010101CC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC + 00CCCC00CC010101CC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CC + CC33CC010101CC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66 + CC010101CC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CC01 + 0101CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC010101 + CCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCC010101CC00 + FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FF010101CC33FFCC + 33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FF010101CC66FFCC66FF + CC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FF010101CC99FFCC99FFCC99 + FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FF010101CCCCFFCCCCFFCCCCFFCC + CCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFF010101CCFFFFCCFFFFCCFFFFCCFFFF + CCFFFFCCFFFFCCFFFFCCFFFFCCFFFF010101010101FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF0000000000000000000000000000000000 + 0000000000000000000000000000CC0099CC0099CC0099CC0099CC0099CC0099 + CC0099CC0099CC0099010101CC3399CC3399CC3399CC3399CC3399CC3399CC33 + 99CC3399CC3399010101CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC + 6699CC6699010101CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999 + CC9999010101CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC + 99010101CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF9901 + 0101CC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CC010101 + CC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CC010101CC66 + CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CC010101CC99CCCC + 99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CC010101CCCCCCCCCCCC + CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC010101CCFFCCCCFFCCCCFF + CCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCC010101CC00FFCC00FFCC00FFCC + 00FFCC00FFCC00FFCC00FFCC00FFCC00FF010101CC33FFCC33FFCC33FFCC33FF + CC33FFCC33FFCC33FFCC33FFCC33FF010101CC66FFCC66FFCC66FFCC66FFCC66 + FFCC66FFCC66FFCC66FFCC66FF010101CC99FFCC99FFCC99FFCC99FFCC99FFCC + 99FFCC99FFCC99FFCC99FF010101CCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFF + CCCCFFCCCCFFCCCCFF010101CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF + FFCCFFFFCCFFFF010101010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00000000000000000000000000000000000000000000000000 + 000000000000CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC00 + 99010101CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC339901 + 0101CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699010101 + CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999010101CCCC + 99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99010101CCFF99CC + FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99010101CC00CCCC00CC + CC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CC010101CC33CCCC33CCCC33 + CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CC010101CC66CCCC66CCCC66CCCC + 66CCCC66CCCC66CCCC66CCCC66CCCC66CC010101CC99CCCC99CCCC99CCCC99CC + CC99CCCC99CCCC99CCCC99CCCC99CC010101CCCCCCCCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCCCCCCCCCCCCCCC010101CCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC + FFCCCCFFCCCCFFCCCCFFCC010101CC00FFCC00FFCC00FFCC00FFCC00FFCC00FF + CC00FFCC00FFCC00FF010101CC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33 + FFCC33FFCC33FF010101CC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC + 66FFCC66FF010101CC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FF + CC99FF010101CCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC + FF010101CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFF01 + 0101010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + 000000000000000000000000000000000000000000000000000000000000CC00 + 99CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099010101CC3399CC + 3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399010101CC6699CC6699 + CC6699CC6699CC6699CC6699CC6699CC6699CC6699010101CC9999CC9999CC99 + 99CC9999CC9999CC9999CC9999CC9999CC9999010101CCCC99CCCC99CCCC99CC + CC99CCCC99CCCC99CCCC99CCCC99CCCC99010101CCFF99CCFF99CCFF99CCFF99 + CCFF99CCFF99CCFF99CCFF99CCFF99010101CC00CCCC00CCCC00CCCC00CCCC00 + CCCC00CCCC00CCCC00CCCC00CC010101CC33CCCC33CCCC33CCCC33CCCC33CCCC + 33CCCC33CCCC33CCCC33CC010101CC66CCCC66CCCC66CCCC66CCCC66CCCC66CC + CC66CCCC66CCCC66CC010101CC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99 + CCCC99CCCC99CC010101CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCC010101CCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCC + CCFFCC010101CC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00 + FF010101CC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FF01 + 0101CC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FF010101 + CC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FF010101CCCC + FFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFF010101CCFFFFCC + FFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFF010101010101FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF000000000000000000 + 00000000000000000000000000000000000000000000CC0099CC0099CC0099CC + 0099CC0099CC0099CC0099CC0099CC0099010101CC3399CC3399CC3399CC3399 + CC3399CC3399CC3399CC3399CC3399010101CC6699CC6699CC6699CC6699CC66 + 99CC6699CC6699CC6699CC6699010101CC9999CC9999CC9999CC9999CC9999CC + 9999CC9999CC9999CC9999010101CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99 + CCCC99CCCC99CCCC99010101CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF + 99CCFF99CCFF99010101CC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC + 00CCCC00CC010101CC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CC + CC33CC010101CC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66 + CC010101CC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CC01 + 0101CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC010101 + CCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCC010101CC00 + FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FF010101CC33FFCC + 33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FF010101CC66FFCC66FF + CC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FF010101CC99FFCC99FFCC99 + FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FF010101CCCCFFCCCCFFCCCCFFCC + CCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFF010101CCFFFFCCFFFFCCFFFFCCFFFF + CCFFFFCCFFFFCCFFFFCCFFFFCCFFFF010101010101FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF0000000000000000000000000000000000 + 0000000000000000000000000000CC0099CC0099CC0099CC0099CC0099CC0099 + CC0099CC0099CC0099010101CC3399CC3399CC3399CC3399CC3399CC3399CC33 + 99CC3399CC3399010101CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC + 6699CC6699010101CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999 + CC9999010101CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC + 99010101CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF9901 + 0101CC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CC010101 + CC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CC010101CC66 + CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CC010101CC99CCCC + 99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CC010101CCCCCCCCCCCC + CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC010101CCFFCCCCFFCCCCFF + CCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCC010101CC00FFCC00FFCC00FFCC + 00FFCC00FFCC00FFCC00FFCC00FFCC00FF010101CC33FFCC33FFCC33FFCC33FF + CC33FFCC33FFCC33FFCC33FFCC33FF010101CC66FFCC66FFCC66FFCC66FFCC66 + FFCC66FFCC66FFCC66FFCC66FF010101CC99FFCC99FFCC99FFCC99FFCC99FFCC + 99FFCC99FFCC99FFCC99FF010101CCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFF + CCCCFFCCCCFFCCCCFF010101CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFF + FFCCFFFFCCFFFF010101010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00000000000000000000000000000000000000000000000000 + 000000000000CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC00 + 99010101CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC339901 + 0101CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699010101 + CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999010101CCCC + 99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99010101CCFF99CC + FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99010101CC00CCCC00CC + CC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CC010101CC33CCCC33CCCC33 + CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CC010101CC66CCCC66CCCC66CCCC + 66CCCC66CCCC66CCCC66CCCC66CCCC66CC010101CC99CCCC99CCCC99CCCC99CC + CC99CCCC99CCCC99CCCC99CCCC99CC010101CCCCCCCCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCCCCCCCCCCCCCCC010101CCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC + FFCCCCFFCCCCFFCCCCFFCC010101CC00FFCC00FFCC00FFCC00FFCC00FFCC00FF + CC00FFCC00FFCC00FF010101CC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33 + FFCC33FFCC33FF010101CC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC + 66FFCC66FF010101CC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FF + CC99FF010101CCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCCFFCCCC + FF010101CCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFFCCFFFF01 + 0101010101010101010101010101010101010101010101010101010101010101 + 0000000000000000000000000000000000000000000000000000000000000101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 010101010101010101010101010101010101010101010101010101010100FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF0000000000000000 + 0000000000000000000000000000000000000000000099009999009999009999 + 0099990099990099990099990099990099010101993399993399993399993399 + 9933999933999933999933999933990101019966999966999966999966999966 + 9999669999669999669999669901010199999999999999999999999999999999 + 999999999999999999999901010199CC9999CC9999CC9999CC9999CC9999CC99 + 99CC9999CC9999CC9901010199FF9999FF9999FF9999FF9999FF9999FF9999FF + 9999FF9999FF990101019900CC9900CC9900CC9900CC9900CC9900CC9900CC99 + 00CC9900CC0101019933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC + 9933CC0101019966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966 + CC0101019999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC01 + 010199CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC010101 + 99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC0101019900 + FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF0101019933FF99 + 33FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF0101019966FF9966FF + 9966FF9966FF9966FF9966FF9966FF9966FF9966FF0101019999FF9999FF9999 + FF9999FF9999FF9999FF9999FF9999FF9999FF01010199CCFF99CCFF99CCFF99 + CCFF99CCFF99CCFF99CCFF99CCFF99CCFF01010199FFFF99FFFF99FFFF99FFFF + 99FFFF99FFFF99FFFF99FFFF99FFFF01010101010100FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00000000000000000000000000000000 + 0000000000000000000000000000990099990099990099990099990099990099 + 9900999900999900990101019933999933999933999933999933999933999933 + 9999339999339901010199669999669999669999669999669999669999669999 + 6699996699010101999999999999999999999999999999999999999999999999 + 99999901010199CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC + 9901010199FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9901 + 01019900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC010101 + 9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC0101019966 + CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC0101019999CC99 + 99CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC01010199CCCC99CCCC + 99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC01010199FFCC99FFCC99FF + CC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC0101019900FF9900FF9900FF99 + 00FF9900FF9900FF9900FF9900FF9900FF0101019933FF9933FF9933FF9933FF + 9933FF9933FF9933FF9933FF9933FF0101019966FF9966FF9966FF9966FF9966 + FF9966FF9966FF9966FF9966FF0101019999FF9999FF9999FF9999FF9999FF99 + 99FF9999FF9999FF9999FF01010199CCFF99CCFF99CCFF99CCFF99CCFF99CCFF + 99CCFF99CCFF99CCFF01010199FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FF + FF99FFFF99FFFF01010101010100FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF000000000000000000000000000000000000000000000000 + 0000000000009900999900999900999900999900999900999900999900999900 + 9901010199339999339999339999339999339999339999339999339999339901 + 0101996699996699996699996699996699996699996699996699996699010101 + 99999999999999999999999999999999999999999999999999999901010199CC + 9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9901010199FF9999 + FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF990101019900CC9900CC + 9900CC9900CC9900CC9900CC9900CC9900CC9900CC0101019933CC9933CC9933 + CC9933CC9933CC9933CC9933CC9933CC9933CC0101019966CC9966CC9966CC99 + 66CC9966CC9966CC9966CC9966CC9966CC0101019999CC9999CC9999CC9999CC + 9999CC9999CC9999CC9999CC9999CC01010199CCCC99CCCC99CCCC99CCCC99CC + CC99CCCC99CCCC99CCCC99CCCC01010199FFCC99FFCC99FFCC99FFCC99FFCC99 + FFCC99FFCC99FFCC99FFCC0101019900FF9900FF9900FF9900FF9900FF9900FF + 9900FF9900FF9900FF0101019933FF9933FF9933FF9933FF9933FF9933FF9933 + FF9933FF9933FF0101019966FF9966FF9966FF9966FF9966FF9966FF9966FF99 + 66FF9966FF0101019999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF + 9999FF01010199CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CC + FF01010199FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF01 + 010101010100FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 0000000000000000000000000000000000000000000000000000000000009900 + 9999009999009999009999009999009999009999009999009901010199339999 + 3399993399993399993399993399993399993399993399010101996699996699 + 9966999966999966999966999966999966999966990101019999999999999999 + 9999999999999999999999999999999999999901010199CC9999CC9999CC9999 + CC9999CC9999CC9999CC9999CC9999CC9901010199FF9999FF9999FF9999FF99 + 99FF9999FF9999FF9999FF9999FF990101019900CC9900CC9900CC9900CC9900 + CC9900CC9900CC9900CC9900CC0101019933CC9933CC9933CC9933CC9933CC99 + 33CC9933CC9933CC9933CC0101019966CC9966CC9966CC9966CC9966CC9966CC + 9966CC9966CC9966CC0101019999CC9999CC9999CC9999CC9999CC9999CC9999 + CC9999CC9999CC01010199CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99 + CCCC99CCCC01010199FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC + 99FFCC0101019900FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900 + FF0101019933FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF01 + 01019966FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF010101 + 9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF01010199CC + FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF01010199FFFF99 + FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF01010101010100FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF0000000000000000 + 0000000000000000000000000000000000000000000099009999009999009999 + 0099990099990099990099990099990099010101993399993399993399993399 + 9933999933999933999933999933990101019966999966999966999966999966 + 9999669999669999669999669901010199999999999999999999999999999999 + 999999999999999999999901010199CC9999CC9999CC9999CC9999CC9999CC99 + 99CC9999CC9999CC9901010199FF9999FF9999FF9999FF9999FF9999FF9999FF + 9999FF9999FF990101019900CC9900CC9900CC9900CC9900CC9900CC9900CC99 + 00CC9900CC0101019933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC + 9933CC0101019966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966 + CC0101019999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC01 + 010199CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC010101 + 99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC0101019900 + FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF0101019933FF99 + 33FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF0101019966FF9966FF + 9966FF9966FF9966FF9966FF9966FF9966FF9966FF0101019999FF9999FF9999 + FF9999FF9999FF9999FF9999FF9999FF9999FF01010199CCFF99CCFF99CCFF99 + CCFF99CCFF99CCFF99CCFF99CCFF99CCFF01010199FFFF99FFFF99FFFF99FFFF + 99FFFF99FFFF99FFFF99FFFF99FFFF01010101010100FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00000000000000000000000000000000 + 0000000000000000000000000000990099990099990099990099990099990099 + 9900999900999900990101019933999933999933999933999933999933999933 + 9999339999339901010199669999669999669999669999669999669999669999 + 6699996699010101999999999999999999999999999999999999999999999999 + 99999901010199CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC + 9901010199FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9901 + 01019900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC010101 + 9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC0101019966 + CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC0101019999CC99 + 99CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC01010199CCCC99CCCC + 99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC01010199FFCC99FFCC99FF + CC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC0101019900FF9900FF9900FF99 + 00FF9900FF9900FF9900FF9900FF9900FF0101019933FF9933FF9933FF9933FF + 9933FF9933FF9933FF9933FF9933FF0101019966FF9966FF9966FF9966FF9966 + FF9966FF9966FF9966FF9966FF0101019999FF9999FF9999FF9999FF9999FF99 + 99FF9999FF9999FF9999FF01010199CCFF99CCFF99CCFF99CCFF99CCFF99CCFF + 99CCFF99CCFF99CCFF01010199FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FF + FF99FFFF99FFFF01010101010100FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF000000000000000000000000000000000000000000000000 + 0000000000009900999900999900999900999900999900999900999900999900 + 9901010199339999339999339999339999339999339999339999339999339901 + 0101996699996699996699996699996699996699996699996699996699010101 + 99999999999999999999999999999999999999999999999999999901010199CC + 9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9901010199FF9999 + FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF990101019900CC9900CC + 9900CC9900CC9900CC9900CC9900CC9900CC9900CC0101019933CC9933CC9933 + CC9933CC9933CC9933CC9933CC9933CC9933CC0101019966CC9966CC9966CC99 + 66CC9966CC9966CC9966CC9966CC9966CC0101019999CC9999CC9999CC9999CC + 9999CC9999CC9999CC9999CC9999CC01010199CCCC99CCCC99CCCC99CCCC99CC + CC99CCCC99CCCC99CCCC99CCCC01010199FFCC99FFCC99FFCC99FFCC99FFCC99 + FFCC99FFCC99FFCC99FFCC0101019900FF9900FF9900FF9900FF9900FF9900FF + 9900FF9900FF9900FF0101019933FF9933FF9933FF9933FF9933FF9933FF9933 + FF9933FF9933FF0101019966FF9966FF9966FF9966FF9966FF9966FF9966FF99 + 66FF9966FF0101019999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF + 9999FF01010199CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CC + FF01010199FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF01 + 010101010100FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 0000000000000000000000000000000000000000000000000000000000009900 + 9999009999009999009999009999009999009999009999009901010199339999 + 3399993399993399993399993399993399993399993399010101996699996699 + 9966999966999966999966999966999966999966990101019999999999999999 + 9999999999999999999999999999999999999901010199CC9999CC9999CC9999 + CC9999CC9999CC9999CC9999CC9999CC9901010199FF9999FF9999FF9999FF99 + 99FF9999FF9999FF9999FF9999FF990101019900CC9900CC9900CC9900CC9900 + CC9900CC9900CC9900CC9900CC0101019933CC9933CC9933CC9933CC9933CC99 + 33CC9933CC9933CC9933CC0101019966CC9966CC9966CC9966CC9966CC9966CC + 9966CC9966CC9966CC0101019999CC9999CC9999CC9999CC9999CC9999CC9999 + CC9999CC9999CC01010199CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99 + CCCC99CCCC01010199FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC + 99FFCC0101019900FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900 + FF0101019933FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF01 + 01019966FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF010101 + 9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF9999FF01010199CC + FF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF99CCFF01010199FFFF99 + FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF99FFFF01010101010100FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF0000000000000000 + 0000000000000000000000000000000000000000000099009999009999009999 + 0099990099990099990099990099990099010101993399993399993399993399 + 9933999933999933999933999933990101019966999966999966999966999966 + 9999669999669999669999669901010199999999999999999999999999999999 + 999999999999999999999901010199CC9999CC9999CC9999CC9999CC9999CC99 + 99CC9999CC9999CC9901010199FF9999FF9999FF9999FF9999FF9999FF9999FF + 9999FF9999FF990101019900CC9900CC9900CC9900CC9900CC9900CC9900CC99 + 00CC9900CC0101019933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC + 9933CC0101019966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966 + CC0101019999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC9999CC01 + 010199CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC99CCCC010101 + 99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC99FFCC0101019900 + FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF0101019933FF99 + 33FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF0101019966FF9966FF + 9966FF9966FF9966FF9966FF9966FF9966FF9966FF0101019999FF9999FF9999 + FF9999FF9999FF9999FF9999FF9999FF9999FF01010199CCFF99CCFF99CCFF99 + CCFF99CCFF99CCFF99CCFF99CCFF99CCFF01010199FFFF99FFFF99FFFF99FFFF + 99FFFF99FFFF99FFFF99FFFF99FFFF0101010101010101010101010101010101 + 0101010101010101010101010101010100000000000000000000000000000000 + 0000000000000000000000000000010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 01010101010101010101010101FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000000000000000000000000000000000000000000000000000 + 0000000000006600996600996600996600996600996600996600996600996600 + 9901010166339966339966339966339966339966339966339966339966339901 + 0101666699666699666699666699666699666699666699666699666699010101 + 66999966999966999966999966999966999966999966999966999901010166CC + 9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9901010166FF9966 + FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF990101016600CC6600CC + 6600CC6600CC6600CC6600CC6600CC6600CC6600CC0101016633CC6633CC6633 + CC6633CC6633CC6633CC6633CC6633CC6633CC0101016666CC6666CC6666CC66 + 66CC6666CC6666CC6666CC6666CC6666CC0101016699CC6699CC6699CC6699CC + 6699CC6699CC6699CC6699CC6699CC01010166CCCC66CCCC66CCCC66CCCC66CC + CC66CCCC66CCCC66CCCC66CCCC01010166FFCC66FFCC66FFCC66FFCC66FFCC66 + FFCC66FFCC66FFCC66FFCC0101016600FF6600FF6600FF6600FF6600FF6600FF + 6600FF6600FF6600FF0101016633FF6633FF6633FF6633FF6633FF6633FF6633 + FF6633FF6633FF0101016666FF6666FF6666FF6666FF6666FF6666FF6666FF66 + 66FF6666FF0101016699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF + 6699FF01010166CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CC + FF01010166FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF01 + 0101010101FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + 0000000000000000000000000000000000000000000000000000000000006600 + 9966009966009966009966009966009966009966009966009901010166339966 + 3399663399663399663399663399663399663399663399010101666699666699 + 6666996666996666996666996666996666996666990101016699996699996699 + 9966999966999966999966999966999966999901010166CC9966CC9966CC9966 + CC9966CC9966CC9966CC9966CC9966CC9901010166FF9966FF9966FF9966FF99 + 66FF9966FF9966FF9966FF9966FF990101016600CC6600CC6600CC6600CC6600 + CC6600CC6600CC6600CC6600CC0101016633CC6633CC6633CC6633CC6633CC66 + 33CC6633CC6633CC6633CC0101016666CC6666CC6666CC6666CC6666CC6666CC + 6666CC6666CC6666CC0101016699CC6699CC6699CC6699CC6699CC6699CC6699 + CC6699CC6699CC01010166CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66 + CCCC66CCCC01010166FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC + 66FFCC0101016600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600 + FF0101016633FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF01 + 01016666FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF010101 + 6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF01010166CC + FF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF01010166FFFF66 + FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF010101010101FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00000000000000000000 + 0000000000000000000000000000000000000000000066009966009966009966 + 0099660099660099660099660099660099010101663399663399663399663399 + 6633996633996633996633996633990101016666996666996666996666996666 + 9966669966669966669966669901010166999966999966999966999966999966 + 999966999966999966999901010166CC9966CC9966CC9966CC9966CC9966CC99 + 66CC9966CC9966CC9901010166FF9966FF9966FF9966FF9966FF9966FF9966FF + 9966FF9966FF990101016600CC6600CC6600CC6600CC6600CC6600CC6600CC66 + 00CC6600CC0101016633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC + 6633CC0101016666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666 + CC0101016699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC01 + 010166CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC010101 + 66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC0101016600 + FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF0101016633FF66 + 33FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF0101016666FF6666FF + 6666FF6666FF6666FF6666FF6666FF6666FF6666FF0101016699FF6699FF6699 + FF6699FF6699FF6699FF6699FF6699FF6699FF01010166CCFF66CCFF66CCFF66 + CCFF66CCFF66CCFF66CCFF66CCFF66CCFF01010166FFFF66FFFF66FFFF66FFFF + 66FFFF66FFFF66FFFF66FFFF66FFFF010101010101FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF000000000000000000000000000000000000 + 0000000000000000000000000000660099660099660099660099660099660099 + 6600996600996600990101016633996633996633996633996633996633996633 + 9966339966339901010166669966669966669966669966669966669966669966 + 6699666699010101669999669999669999669999669999669999669999669999 + 66999901010166CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC + 9901010166FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9901 + 01016600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC010101 + 6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC0101016666 + CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC0101016699CC66 + 99CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC01010166CCCC66CCCC + 66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC01010166FFCC66FFCC66FF + CC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC0101016600FF6600FF6600FF66 + 00FF6600FF6600FF6600FF6600FF6600FF0101016633FF6633FF6633FF6633FF + 6633FF6633FF6633FF6633FF6633FF0101016666FF6666FF6666FF6666FF6666 + FF6666FF6666FF6666FF6666FF0101016699FF6699FF6699FF6699FF6699FF66 + 99FF6699FF6699FF6699FF01010166CCFF66CCFF66CCFF66CCFF66CCFF66CCFF + 66CCFF66CCFF66CCFF01010166FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FF + FF66FFFF66FFFF010101010101FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000000000000000000000000000000000000000000000000000 + 0000000000006600996600996600996600996600996600996600996600996600 + 9901010166339966339966339966339966339966339966339966339966339901 + 0101666699666699666699666699666699666699666699666699666699010101 + 66999966999966999966999966999966999966999966999966999901010166CC + 9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9901010166FF9966 + FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF990101016600CC6600CC + 6600CC6600CC6600CC6600CC6600CC6600CC6600CC0101016633CC6633CC6633 + CC6633CC6633CC6633CC6633CC6633CC6633CC0101016666CC6666CC6666CC66 + 66CC6666CC6666CC6666CC6666CC6666CC0101016699CC6699CC6699CC6699CC + 6699CC6699CC6699CC6699CC6699CC01010166CCCC66CCCC66CCCC66CCCC66CC + CC66CCCC66CCCC66CCCC66CCCC01010166FFCC66FFCC66FFCC66FFCC66FFCC66 + FFCC66FFCC66FFCC66FFCC0101016600FF6600FF6600FF6600FF6600FF6600FF + 6600FF6600FF6600FF0101016633FF6633FF6633FF6633FF6633FF6633FF6633 + FF6633FF6633FF0101016666FF6666FF6666FF6666FF6666FF6666FF6666FF66 + 66FF6666FF0101016699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF + 6699FF01010166CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CC + FF01010166FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF01 + 0101010101FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + 0000000000000000000000000000000000000000000000000000000000006600 + 9966009966009966009966009966009966009966009966009901010166339966 + 3399663399663399663399663399663399663399663399010101666699666699 + 6666996666996666996666996666996666996666990101016699996699996699 + 9966999966999966999966999966999966999901010166CC9966CC9966CC9966 + CC9966CC9966CC9966CC9966CC9966CC9901010166FF9966FF9966FF9966FF99 + 66FF9966FF9966FF9966FF9966FF990101016600CC6600CC6600CC6600CC6600 + CC6600CC6600CC6600CC6600CC0101016633CC6633CC6633CC6633CC6633CC66 + 33CC6633CC6633CC6633CC0101016666CC6666CC6666CC6666CC6666CC6666CC + 6666CC6666CC6666CC0101016699CC6699CC6699CC6699CC6699CC6699CC6699 + CC6699CC6699CC01010166CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66 + CCCC66CCCC01010166FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC + 66FFCC0101016600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600 + FF0101016633FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF01 + 01016666FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF010101 + 6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF01010166CC + FF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF01010166FFFF66 + FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF010101010101FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00000000000000000000 + 0000000000000000000000000000000000000000000066009966009966009966 + 0099660099660099660099660099660099010101663399663399663399663399 + 6633996633996633996633996633990101016666996666996666996666996666 + 9966669966669966669966669901010166999966999966999966999966999966 + 999966999966999966999901010166CC9966CC9966CC9966CC9966CC9966CC99 + 66CC9966CC9966CC9901010166FF9966FF9966FF9966FF9966FF9966FF9966FF + 9966FF9966FF990101016600CC6600CC6600CC6600CC6600CC6600CC6600CC66 + 00CC6600CC0101016633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC + 6633CC0101016666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666 + CC0101016699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC01 + 010166CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC010101 + 66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC0101016600 + FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF0101016633FF66 + 33FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF0101016666FF6666FF + 6666FF6666FF6666FF6666FF6666FF6666FF6666FF0101016699FF6699FF6699 + FF6699FF6699FF6699FF6699FF6699FF6699FF01010166CCFF66CCFF66CCFF66 + CCFF66CCFF66CCFF66CCFF66CCFF66CCFF01010166FFFF66FFFF66FFFF66FFFF + 66FFFF66FFFF66FFFF66FFFF66FFFF010101010101FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF000000000000000000000000000000000000 + 0000000000000000000000000000660099660099660099660099660099660099 + 6600996600996600990101016633996633996633996633996633996633996633 + 9966339966339901010166669966669966669966669966669966669966669966 + 6699666699010101669999669999669999669999669999669999669999669999 + 66999901010166CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC + 9901010166FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9901 + 01016600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC010101 + 6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC0101016666 + CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC0101016699CC66 + 99CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC01010166CCCC66CCCC + 66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC01010166FFCC66FFCC66FF + CC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC0101016600FF6600FF6600FF66 + 00FF6600FF6600FF6600FF6600FF6600FF0101016633FF6633FF6633FF6633FF + 6633FF6633FF6633FF6633FF6633FF0101016666FF6666FF6666FF6666FF6666 + FF6666FF6666FF6666FF6666FF0101016699FF6699FF6699FF6699FF6699FF66 + 99FF6699FF6699FF6699FF01010166CCFF66CCFF66CCFF66CCFF66CCFF66CCFF + 66CCFF66CCFF66CCFF01010166FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FF + FF66FFFF66FFFF010101010101FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000000000000000000000000000000000000000000000000000 + 0000000000006600996600996600996600996600996600996600996600996600 + 9901010166339966339966339966339966339966339966339966339966339901 + 0101666699666699666699666699666699666699666699666699666699010101 + 66999966999966999966999966999966999966999966999966999901010166CC + 9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9901010166FF9966 + FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF990101016600CC6600CC + 6600CC6600CC6600CC6600CC6600CC6600CC6600CC0101016633CC6633CC6633 + CC6633CC6633CC6633CC6633CC6633CC6633CC0101016666CC6666CC6666CC66 + 66CC6666CC6666CC6666CC6666CC6666CC0101016699CC6699CC6699CC6699CC + 6699CC6699CC6699CC6699CC6699CC01010166CCCC66CCCC66CCCC66CCCC66CC + CC66CCCC66CCCC66CCCC66CCCC01010166FFCC66FFCC66FFCC66FFCC66FFCC66 + FFCC66FFCC66FFCC66FFCC0101016600FF6600FF6600FF6600FF6600FF6600FF + 6600FF6600FF6600FF0101016633FF6633FF6633FF6633FF6633FF6633FF6633 + FF6633FF6633FF0101016666FF6666FF6666FF6666FF6666FF6666FF6666FF66 + 66FF6666FF0101016699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF + 6699FF01010166CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CC + FF01010166FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF01 + 0101010101010101010101010101010101010101010101010101010101010101 + 0000000000000000000000000000000000000000000000000000000000000101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 010101010101010101010101010101010101010101010101010101010100FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF000000000000000000 + 0000000000000000000000000000000000000000000033009933009933009933 + 0099330099330099330099330099330099010101333399333399333399333399 + 3333993333993333993333993333990101013366993366993366993366993366 + 9933669933669933669933669901010133999933999933999933999933999933 + 999933999933999933999901010133CC9933CC9933CC9933CC9933CC9933CC99 + 33CC9933CC9933CC9901010133FF9933FF9933FF9933FF9933FF9933FF9933FF + 9933FF9933FF990101013300CC3300CC3300CC3300CC3300CC3300CC3300CC33 + 00CC3300CC0101013333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC + 3333CC0101013366CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366 + CC0101013399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC01 + 010133CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC010101 + 33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC0101013300 + FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF0101013333FF33 + 33FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF0101013366FF3366FF + 3366FF3366FF3366FF3366FF3366FF3366FF3366FF0101013399FF3399FF3399 + FF3399FF3399FF3399FF3399FF3399FF3399FF01010133CCFF33CCFF33CCFF33 + CCFF33CCFF33CCFF33CCFF33CCFF33CCFF01010133FFFF33FFFF33FFFF33FFFF + 33FFFF33FFFF33FFFF33FFFF33FFFF01010101010100FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000000000000000000000000000000000 + 0000000000000000000000000000330099330099330099330099330099330099 + 3300993300993300990101013333993333993333993333993333993333993333 + 9933339933339901010133669933669933669933669933669933669933669933 + 6699336699010101339999339999339999339999339999339999339999339999 + 33999901010133CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC + 9901010133FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF9901 + 01013300CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC010101 + 3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC0101013366 + CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC0101013399CC33 + 99CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC01010133CCCC33CCCC + 33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC01010133FFCC33FFCC33FF + CC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC0101013300FF3300FF3300FF33 + 00FF3300FF3300FF3300FF3300FF3300FF0101013333FF3333FF3333FF3333FF + 3333FF3333FF3333FF3333FF3333FF0101013366FF3366FF3366FF3366FF3366 + FF3366FF3366FF3366FF3366FF0101013399FF3399FF3399FF3399FF3399FF33 + 99FF3399FF3399FF3399FF01010133CCFF33CCFF33CCFF33CCFF33CCFF33CCFF + 33CCFF33CCFF33CCFF01010133FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FF + FF33FFFF33FFFF01010101010100FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF00000000000000000000000000000000000000000000000000 + 0000000000003300993300993300993300993300993300993300993300993300 + 9901010133339933339933339933339933339933339933339933339933339901 + 0101336699336699336699336699336699336699336699336699336699010101 + 33999933999933999933999933999933999933999933999933999901010133CC + 9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC9901010133FF9933 + FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF990101013300CC3300CC + 3300CC3300CC3300CC3300CC3300CC3300CC3300CC0101013333CC3333CC3333 + CC3333CC3333CC3333CC3333CC3333CC3333CC0101013366CC3366CC3366CC33 + 66CC3366CC3366CC3366CC3366CC3366CC0101013399CC3399CC3399CC3399CC + 3399CC3399CC3399CC3399CC3399CC01010133CCCC33CCCC33CCCC33CCCC33CC + CC33CCCC33CCCC33CCCC33CCCC01010133FFCC33FFCC33FFCC33FFCC33FFCC33 + FFCC33FFCC33FFCC33FFCC0101013300FF3300FF3300FF3300FF3300FF3300FF + 3300FF3300FF3300FF0101013333FF3333FF3333FF3333FF3333FF3333FF3333 + FF3333FF3333FF0101013366FF3366FF3366FF3366FF3366FF3366FF3366FF33 + 66FF3366FF0101013399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF + 3399FF01010133CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CC + FF01010133FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF01 + 010101010100FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 0000000000000000000000000000000000000000000000000000000000003300 + 9933009933009933009933009933009933009933009933009901010133339933 + 3399333399333399333399333399333399333399333399010101336699336699 + 3366993366993366993366993366993366993366990101013399993399993399 + 9933999933999933999933999933999933999901010133CC9933CC9933CC9933 + CC9933CC9933CC9933CC9933CC9933CC9901010133FF9933FF9933FF9933FF99 + 33FF9933FF9933FF9933FF9933FF990101013300CC3300CC3300CC3300CC3300 + CC3300CC3300CC3300CC3300CC0101013333CC3333CC3333CC3333CC3333CC33 + 33CC3333CC3333CC3333CC0101013366CC3366CC3366CC3366CC3366CC3366CC + 3366CC3366CC3366CC0101013399CC3399CC3399CC3399CC3399CC3399CC3399 + CC3399CC3399CC01010133CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33 + CCCC33CCCC01010133FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC + 33FFCC0101013300FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300 + FF0101013333FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF01 + 01013366FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF010101 + 3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF01010133CC + FF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF01010133FFFF33 + FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF01010101010100FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF000000000000000000 + 0000000000000000000000000000000000000000000033009933009933009933 + 0099330099330099330099330099330099010101333399333399333399333399 + 3333993333993333993333993333990101013366993366993366993366993366 + 9933669933669933669933669901010133999933999933999933999933999933 + 999933999933999933999901010133CC9933CC9933CC9933CC9933CC9933CC99 + 33CC9933CC9933CC9901010133FF9933FF9933FF9933FF9933FF9933FF9933FF + 9933FF9933FF990101013300CC3300CC3300CC3300CC3300CC3300CC3300CC33 + 00CC3300CC0101013333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC + 3333CC0101013366CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366 + CC0101013399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC01 + 010133CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC010101 + 33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC0101013300 + FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF0101013333FF33 + 33FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF0101013366FF3366FF + 3366FF3366FF3366FF3366FF3366FF3366FF3366FF0101013399FF3399FF3399 + FF3399FF3399FF3399FF3399FF3399FF3399FF01010133CCFF33CCFF33CCFF33 + CCFF33CCFF33CCFF33CCFF33CCFF33CCFF01010133FFFF33FFFF33FFFF33FFFF + 33FFFF33FFFF33FFFF33FFFF33FFFF01010101010100FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000000000000000000000000000000000 + 0000000000000000000000000000330099330099330099330099330099330099 + 3300993300993300990101013333993333993333993333993333993333993333 + 9933339933339901010133669933669933669933669933669933669933669933 + 6699336699010101339999339999339999339999339999339999339999339999 + 33999901010133CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC + 9901010133FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF9901 + 01013300CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC010101 + 3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC0101013366 + CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC0101013399CC33 + 99CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC01010133CCCC33CCCC + 33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC01010133FFCC33FFCC33FF + CC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC0101013300FF3300FF3300FF33 + 00FF3300FF3300FF3300FF3300FF3300FF0101013333FF3333FF3333FF3333FF + 3333FF3333FF3333FF3333FF3333FF0101013366FF3366FF3366FF3366FF3366 + FF3366FF3366FF3366FF3366FF0101013399FF3399FF3399FF3399FF3399FF33 + 99FF3399FF3399FF3399FF01010133CCFF33CCFF33CCFF33CCFF33CCFF33CCFF + 33CCFF33CCFF33CCFF01010133FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FF + FF33FFFF33FFFF01010101010100FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF00000000000000000000000000000000000000000000000000 + 0000000000003300993300993300993300993300993300993300993300993300 + 9901010133339933339933339933339933339933339933339933339933339901 + 0101336699336699336699336699336699336699336699336699336699010101 + 33999933999933999933999933999933999933999933999933999901010133CC + 9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC9901010133FF9933 + FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF990101013300CC3300CC + 3300CC3300CC3300CC3300CC3300CC3300CC3300CC0101013333CC3333CC3333 + CC3333CC3333CC3333CC3333CC3333CC3333CC0101013366CC3366CC3366CC33 + 66CC3366CC3366CC3366CC3366CC3366CC0101013399CC3399CC3399CC3399CC + 3399CC3399CC3399CC3399CC3399CC01010133CCCC33CCCC33CCCC33CCCC33CC + CC33CCCC33CCCC33CCCC33CCCC01010133FFCC33FFCC33FFCC33FFCC33FFCC33 + FFCC33FFCC33FFCC33FFCC0101013300FF3300FF3300FF3300FF3300FF3300FF + 3300FF3300FF3300FF0101013333FF3333FF3333FF3333FF3333FF3333FF3333 + FF3333FF3333FF0101013366FF3366FF3366FF3366FF3366FF3366FF3366FF33 + 66FF3366FF0101013399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF + 3399FF01010133CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CC + FF01010133FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF01 + 010101010100FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 0000000000000000000000000000000000000000000000000000000000003300 + 9933009933009933009933009933009933009933009933009901010133339933 + 3399333399333399333399333399333399333399333399010101336699336699 + 3366993366993366993366993366993366993366990101013399993399993399 + 9933999933999933999933999933999933999901010133CC9933CC9933CC9933 + CC9933CC9933CC9933CC9933CC9933CC9901010133FF9933FF9933FF9933FF99 + 33FF9933FF9933FF9933FF9933FF990101013300CC3300CC3300CC3300CC3300 + CC3300CC3300CC3300CC3300CC0101013333CC3333CC3333CC3333CC3333CC33 + 33CC3333CC3333CC3333CC0101013366CC3366CC3366CC3366CC3366CC3366CC + 3366CC3366CC3366CC0101013399CC3399CC3399CC3399CC3399CC3399CC3399 + CC3399CC3399CC01010133CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33 + CCCC33CCCC01010133FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC + 33FFCC0101013300FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300 + FF0101013333FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF01 + 01013366FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF010101 + 3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF01010133CC + FF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF01010133FFFF33 + FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF01010101010100FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF000000000000000000 + 0000000000000000000000000000000000000000000033009933009933009933 + 0099330099330099330099330099330099010101333399333399333399333399 + 3333993333993333993333993333990101013366993366993366993366993366 + 9933669933669933669933669901010133999933999933999933999933999933 + 999933999933999933999901010133CC9933CC9933CC9933CC9933CC9933CC99 + 33CC9933CC9933CC9901010133FF9933FF9933FF9933FF9933FF9933FF9933FF + 9933FF9933FF990101013300CC3300CC3300CC3300CC3300CC3300CC3300CC33 + 00CC3300CC0101013333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC + 3333CC0101013366CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366 + CC0101013399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC01 + 010133CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC010101 + 33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC0101013300 + FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF0101013333FF33 + 33FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF0101013366FF3366FF + 3366FF3366FF3366FF3366FF3366FF3366FF3366FF0101013399FF3399FF3399 + FF3399FF3399FF3399FF3399FF3399FF3399FF01010133CCFF33CCFF33CCFF33 + CCFF33CCFF33CCFF33CCFF33CCFF33CCFF01010133FFFF33FFFF33FFFF33FFFF + 33FFFF33FFFF33FFFF33FFFF33FFFF0101010101010101010101010101010101 + 0101010101010101010101010101010100000000000000000000000000000000 + 0000000000000000000000000000010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 010101010101010101010101010000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF000000000000000000000000000000000000000000000000 + 0000000000000000990000990000990000990000990000990000990000990000 + 9901010100339900339900339900339900339900339900339900339900339901 + 0101006699006699006699006699006699006699006699006699006699010101 + 00999900999900999900999900999900999900999900999900999901010100CC + 9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9901010100FF9900 + FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF990101010000CC0000CC + 0000CC0000CC0000CC0000CC0000CC0000CC0000CC0101010033CC0033CC0033 + CC0033CC0033CC0033CC0033CC0033CC0033CC0101010066CC0066CC0066CC00 + 66CC0066CC0066CC0066CC0066CC0066CC0101010099CC0099CC0099CC0099CC + 0099CC0099CC0099CC0099CC0099CC01010100CCCC00CCCC00CCCC00CCCC00CC + CC00CCCC00CCCC00CCCC00CCCC01010100FFCC00FFCC00FFCC00FFCC00FFCC00 + FFCC00FFCC00FFCC00FFCC0101010000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0101010033FF0033FF0033FF0033FF0033FF0033FF0033 + FF0033FF0033FF0101010066FF0066FF0066FF0066FF0066FF0066FF0066FF00 + 66FF0066FF0101010099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF + 0099FF01010100CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CC + FF01010100FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF01 + 01010101010000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000000000000000000000000000000000000000000000000000000000000000 + 9900009900009900009900009900009900009900009900009901010100339900 + 3399003399003399003399003399003399003399003399010101006699006699 + 0066990066990066990066990066990066990066990101010099990099990099 + 9900999900999900999900999900999900999901010100CC9900CC9900CC9900 + CC9900CC9900CC9900CC9900CC9900CC9901010100FF9900FF9900FF9900FF99 + 00FF9900FF9900FF9900FF9900FF990101010000CC0000CC0000CC0000CC0000 + CC0000CC0000CC0000CC0000CC0101010033CC0033CC0033CC0033CC0033CC00 + 33CC0033CC0033CC0033CC0101010066CC0066CC0066CC0066CC0066CC0066CC + 0066CC0066CC0066CC0101010099CC0099CC0099CC0099CC0099CC0099CC0099 + CC0099CC0099CC01010100CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00 + CCCC00CCCC01010100FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC + 00FFCC0101010000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0101010033FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF01 + 01010066FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF010101 + 0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF01010100CC + FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF01010100FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF0101010101010000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000000000000000 + 0000000000000000000000000000000000000000000000009900009900009900 + 0099000099000099000099000099000099010101003399003399003399003399 + 0033990033990033990033990033990101010066990066990066990066990066 + 9900669900669900669900669901010100999900999900999900999900999900 + 999900999900999900999901010100CC9900CC9900CC9900CC9900CC9900CC99 + 00CC9900CC9900CC9901010100FF9900FF9900FF9900FF9900FF9900FF9900FF + 9900FF9900FF990101010000CC0000CC0000CC0000CC0000CC0000CC0000CC00 + 00CC0000CC0101010033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC + 0033CC0101010066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066 + CC0101010099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC01 + 010100CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC010101 + 00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC0101010000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0101010033FF00 + 33FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0101010066FF0066FF + 0066FF0066FF0066FF0066FF0066FF0066FF0066FF0101010099FF0099FF0099 + FF0099FF0099FF0099FF0099FF0099FF0099FF01010100CCFF00CCFF00CCFF00 + CCFF00CCFF00CCFF00CCFF00CCFF00CCFF01010100FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF0101010101010000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF00000000000000000000000000000000 + 0000000000000000000000000000000099000099000099000099000099000099 + 0000990000990000990101010033990033990033990033990033990033990033 + 9900339900339901010100669900669900669900669900669900669900669900 + 6699006699010101009999009999009999009999009999009999009999009999 + 00999901010100CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC + 9901010100FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9901 + 01010000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC010101 + 0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0101010066 + CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0101010099CC00 + 99CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC01010100CCCC00CCCC + 00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC01010100FFCC00FFCC00FF + CC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC0101010000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0101010033FF0033FF0033FF0033FF + 0033FF0033FF0033FF0033FF0033FF0101010066FF0066FF0066FF0066FF0066 + FF0066FF0066FF0066FF0066FF0101010099FF0099FF0099FF0099FF0099FF00 + 99FF0099FF0099FF0099FF01010100CCFF00CCFF00CCFF00CCFF00CCFF00CCFF + 00CCFF00CCFF00CCFF01010100FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF0101010101010000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF000000000000000000000000000000000000000000000000 + 0000000000000000990000990000990000990000990000990000990000990000 + 9901010100339900339900339900339900339900339900339900339900339901 + 0101006699006699006699006699006699006699006699006699006699010101 + 00999900999900999900999900999900999900999900999900999901010100CC + 9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9901010100FF9900 + FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF990101010000CC0000CC + 0000CC0000CC0000CC0000CC0000CC0000CC0000CC0101010033CC0033CC0033 + CC0033CC0033CC0033CC0033CC0033CC0033CC0101010066CC0066CC0066CC00 + 66CC0066CC0066CC0066CC0066CC0066CC0101010099CC0099CC0099CC0099CC + 0099CC0099CC0099CC0099CC0099CC01010100CCCC00CCCC00CCCC00CCCC00CC + CC00CCCC00CCCC00CCCC00CCCC01010100FFCC00FFCC00FFCC00FFCC00FFCC00 + FFCC00FFCC00FFCC00FFCC0101010000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0101010033FF0033FF0033FF0033FF0033FF0033FF0033 + FF0033FF0033FF0101010066FF0066FF0066FF0066FF0066FF0066FF0066FF00 + 66FF0066FF0101010099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF + 0099FF01010100CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CC + FF01010100FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF01 + 01010101010000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000000000000000000000000000000000000000000000000000000000000000 + 9900009900009900009900009900009900009900009900009901010100339900 + 3399003399003399003399003399003399003399003399010101006699006699 + 0066990066990066990066990066990066990066990101010099990099990099 + 9900999900999900999900999900999900999901010100CC9900CC9900CC9900 + CC9900CC9900CC9900CC9900CC9900CC9901010100FF9900FF9900FF9900FF99 + 00FF9900FF9900FF9900FF9900FF990101010000CC0000CC0000CC0000CC0000 + CC0000CC0000CC0000CC0000CC0101010033CC0033CC0033CC0033CC0033CC00 + 33CC0033CC0033CC0033CC0101010066CC0066CC0066CC0066CC0066CC0066CC + 0066CC0066CC0066CC0101010099CC0099CC0099CC0099CC0099CC0099CC0099 + CC0099CC0099CC01010100CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00 + CCCC00CCCC01010100FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC + 00FFCC0101010000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0101010033FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF01 + 01010066FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF010101 + 0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF01010100CC + FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF01010100FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF0101010101010000FF + 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000000000000000 + 0000000000000000000000000000000000000000000000009900009900009900 + 0099000099000099000099000099000099010101003399003399003399003399 + 0033990033990033990033990033990101010066990066990066990066990066 + 9900669900669900669900669901010100999900999900999900999900999900 + 999900999900999900999901010100CC9900CC9900CC9900CC9900CC9900CC99 + 00CC9900CC9900CC9901010100FF9900FF9900FF9900FF9900FF9900FF9900FF + 9900FF9900FF990101010000CC0000CC0000CC0000CC0000CC0000CC0000CC00 + 00CC0000CC0101010033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC + 0033CC0101010066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066 + CC0101010099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC01 + 010100CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC010101 + 00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC0101010000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0101010033FF00 + 33FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0101010066FF0066FF + 0066FF0066FF0066FF0066FF0066FF0066FF0066FF0101010099FF0099FF0099 + FF0099FF0099FF0099FF0099FF0099FF0099FF01010100CCFF00CCFF00CCFF00 + CCFF00CCFF00CCFF00CCFF00CCFF00CCFF01010100FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00FFFF00FFFF00FFFF0101010101010000FF0000FF0000FF0000 + FF0000FF0000FF0000FF0000FF0000FF00000000000000000000000000000000 + 0000000000000000000000000000000099000099000099000099000099000099 + 0000990000990000990101010033990033990033990033990033990033990033 + 9900339900339901010100669900669900669900669900669900669900669900 + 6699006699010101009999009999009999009999009999009999009999009999 + 00999901010100CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC + 9901010100FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9901 + 01010000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC010101 + 0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0101010066 + CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0101010099CC00 + 99CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC01010100CCCC00CCCC + 00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC01010100FFCC00FFCC00FF + CC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC0101010000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0101010033FF0033FF0033FF0033FF + 0033FF0033FF0033FF0033FF0033FF0101010066FF0066FF0066FF0066FF0066 + FF0066FF0066FF0066FF0066FF0101010099FF0099FF0099FF0099FF0099FF00 + 99FF0099FF0099FF0099FF01010100CCFF00CCFF00CCFF00CCFF00CCFF00CCFF + 00CCFF00CCFF00CCFF01010100FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF + FF00FFFF00FFFF0101010101010000FF0000FF0000FF0000FF0000FF0000FF00 + 00FF0000FF0000FF000000000000000000000000000000000000000000000000 + 0000000000000000990000990000990000990000990000990000990000990000 + 9901010100339900339900339900339900339900339900339900339900339901 + 0101006699006699006699006699006699006699006699006699006699010101 + 00999900999900999900999900999900999900999900999900999901010100CC + 9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9901010100FF9900 + FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF990101010000CC0000CC + 0000CC0000CC0000CC0000CC0000CC0000CC0000CC0101010033CC0033CC0033 + CC0033CC0033CC0033CC0033CC0033CC0033CC0101010066CC0066CC0066CC00 + 66CC0066CC0066CC0066CC0066CC0066CC0101010099CC0099CC0099CC0099CC + 0099CC0099CC0099CC0099CC0099CC01010100CCCC00CCCC00CCCC00CCCC00CC + CC00CCCC00CCCC00CCCC00CCCC01010100FFCC00FFCC00FFCC00FFCC00FFCC00 + FFCC00FFCC00FFCC00FFCC0101010000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0101010033FF0033FF0033FF0033FF0033FF0033FF0033 + FF0033FF0033FF0101010066FF0066FF0066FF0066FF0066FF0066FF0066FF00 + 66FF0066FF0101010099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF + 0099FF01010100CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CC + FF01010100FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF01 + 0101010101010101010101010101010101010101010101010101010101010101 + 0000000000000000000000000000000000000000000000000000000000000101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 + 00000000000000000000000000000000000000000000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000010101FF3300FF3300FF3300FF3300 + FF3300FF3300FF3300FF3300FF3300010101FF6600FF6600FF6600FF6600FF66 + 00FF6600FF6600FF6600FF6600010101FF9900FF9900FF9900FF9900FF9900FF + 9900FF9900FF9900FF9900010101FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00 + FFCC00FFCC00FFCC00010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00010101FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF + 0033FF0033010101FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333 + FF3333010101FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF66 + 33010101FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF993301 + 0101FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33010101 + FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33010101FF00 + 66FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0066010101FF3366FF + 3366FF3366FF3366FF3366FF3366FF3366FF3366FF3366010101FF6666FF6666 + FF6666FF6666FF6666FF6666FF6666FF6666FF6666010101FF9966FF9966FF99 + 66FF9966FF9966FF9966FF9966FF9966FF9966010101FFCC66FFCC66FFCC66FF + CC66FFCC66FFCC66FFCC66FFCC66FFCC66010101FFFF66FFFF66FFFF66FFFF66 + FFFF66FFFF66FFFF66FFFF66FFFF66010101010101FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 + 0000000000000000000000000000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000010101FF3300FF3300FF3300FF3300FF3300FF3300FF33 + 00FF3300FF3300010101FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF + 6600FF6600010101FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900 + FF9900010101FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC + 00010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF0001 + 0101FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0033010101 + FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333010101FF66 + 33FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6633010101FF9933FF + 9933FF9933FF9933FF9933FF9933FF9933FF9933FF9933010101FFCC33FFCC33 + FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33010101FFFF33FFFF33FFFF + 33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33010101FF0066FF0066FF0066FF + 0066FF0066FF0066FF0066FF0066FF0066010101FF3366FF3366FF3366FF3366 + FF3366FF3366FF3366FF3366FF3366010101FF6666FF6666FF6666FF6666FF66 + 66FF6666FF6666FF6666FF6666010101FF9966FF9966FF9966FF9966FF9966FF + 9966FF9966FF9966FF9966010101FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66 + FFCC66FFCC66FFCC66010101FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF + 66FFFF66FFFF66010101010101FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 + 000000000000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00010101FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF330001 + 0101FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600010101 + FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900010101FFCC + 00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00010101FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00010101FF0033FF0033 + FF0033FF0033FF0033FF0033FF0033FF0033FF0033010101FF3333FF3333FF33 + 33FF3333FF3333FF3333FF3333FF3333FF3333010101FF6633FF6633FF6633FF + 6633FF6633FF6633FF6633FF6633FF6633010101FF9933FF9933FF9933FF9933 + FF9933FF9933FF9933FF9933FF9933010101FFCC33FFCC33FFCC33FFCC33FFCC + 33FFCC33FFCC33FFCC33FFCC33010101FFFF33FFFF33FFFF33FFFF33FFFF33FF + FF33FFFF33FFFF33FFFF33010101FF0066FF0066FF0066FF0066FF0066FF0066 + FF0066FF0066FF0066010101FF3366FF3366FF3366FF3366FF3366FF3366FF33 + 66FF3366FF3366010101FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF + 6666FF6666010101FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966 + FF9966010101FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC + 66010101FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF6601 + 0101010101FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + 000000000000000000000000000000000000000000000000000000000000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000010101FF3300FF + 3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300010101FF6600FF6600 + FF6600FF6600FF6600FF6600FF6600FF6600FF6600010101FF9900FF9900FF99 + 00FF9900FF9900FF9900FF9900FF9900FF9900010101FFCC00FFCC00FFCC00FF + CC00FFCC00FFCC00FFCC00FFCC00FFCC00010101FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00010101FF0033FF0033FF0033FF0033FF00 + 33FF0033FF0033FF0033FF0033010101FF3333FF3333FF3333FF3333FF3333FF + 3333FF3333FF3333FF3333010101FF6633FF6633FF6633FF6633FF6633FF6633 + FF6633FF6633FF6633010101FF9933FF9933FF9933FF9933FF9933FF9933FF99 + 33FF9933FF9933010101FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FF + CC33FFCC33010101FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33 + FFFF33010101FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF00 + 66010101FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF336601 + 0101FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6666010101 + FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966010101FFCC + 66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66010101FFFF66FF + FF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66010101010101FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 + 00000000000000000000000000000000000000000000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000010101FF3300FF3300FF3300FF3300 + FF3300FF3300FF3300FF3300FF3300010101FF6600FF6600FF6600FF6600FF66 + 00FF6600FF6600FF6600FF6600010101FF9900FF9900FF9900FF9900FF9900FF + 9900FF9900FF9900FF9900010101FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00 + FFCC00FFCC00FFCC00010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00010101FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF + 0033FF0033010101FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333 + FF3333010101FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF66 + 33010101FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF993301 + 0101FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33010101 + FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33010101FF00 + 66FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0066010101FF3366FF + 3366FF3366FF3366FF3366FF3366FF3366FF3366FF3366010101FF6666FF6666 + FF6666FF6666FF6666FF6666FF6666FF6666FF6666010101FF9966FF9966FF99 + 66FF9966FF9966FF9966FF9966FF9966FF9966010101FFCC66FFCC66FFCC66FF + CC66FFCC66FFCC66FFCC66FFCC66FFCC66010101FFFF66FFFF66FFFF66FFFF66 + FFFF66FFFF66FFFF66FFFF66FFFF66010101010101FFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 + 0000000000000000000000000000FF0000FF0000FF0000FF0000FF0000FF0000 + FF0000FF0000FF0000010101FF3300FF3300FF3300FF3300FF3300FF3300FF33 + 00FF3300FF3300010101FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF + 6600FF6600010101FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900 + FF9900010101FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC + 00010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF0001 + 0101FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0033010101 + FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333010101FF66 + 33FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6633010101FF9933FF + 9933FF9933FF9933FF9933FF9933FF9933FF9933FF9933010101FFCC33FFCC33 + FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33010101FFFF33FFFF33FFFF + 33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33010101FF0066FF0066FF0066FF + 0066FF0066FF0066FF0066FF0066FF0066010101FF3366FF3366FF3366FF3366 + FF3366FF3366FF3366FF3366FF3366010101FF6666FF6666FF6666FF6666FF66 + 66FF6666FF6666FF6666FF6666010101FF9966FF9966FF9966FF9966FF9966FF + 9966FF9966FF9966FF9966010101FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66 + FFCC66FFCC66FFCC66010101FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF + 66FFFF66FFFF66010101010101FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 + 000000000000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 + 00010101FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF330001 + 0101FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600010101 + FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900FF9900010101FFCC + 00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00010101FFFF00FF + FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00010101FF0033FF0033 + FF0033FF0033FF0033FF0033FF0033FF0033FF0033010101FF3333FF3333FF33 + 33FF3333FF3333FF3333FF3333FF3333FF3333010101FF6633FF6633FF6633FF + 6633FF6633FF6633FF6633FF6633FF6633010101FF9933FF9933FF9933FF9933 + FF9933FF9933FF9933FF9933FF9933010101FFCC33FFCC33FFCC33FFCC33FFCC + 33FFCC33FFCC33FFCC33FFCC33010101FFFF33FFFF33FFFF33FFFF33FFFF33FF + FF33FFFF33FFFF33FFFF33010101FF0066FF0066FF0066FF0066FF0066FF0066 + FF0066FF0066FF0066010101FF3366FF3366FF3366FF3366FF3366FF3366FF33 + 66FF3366FF3366010101FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF + 6666FF6666010101FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966 + FF9966010101FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC + 66010101FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF6601 + 0101010101FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + 000000000000000000000000000000000000000000000000000000000000FF00 + 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000010101FF3300FF + 3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300010101FF6600FF6600 + FF6600FF6600FF6600FF6600FF6600FF6600FF6600010101FF9900FF9900FF99 + 00FF9900FF9900FF9900FF9900FF9900FF9900010101FFCC00FFCC00FFCC00FF + CC00FFCC00FFCC00FFCC00FFCC00FFCC00010101FFFF00FFFF00FFFF00FFFF00 + FFFF00FFFF00FFFF00FFFF00FFFF00010101FF0033FF0033FF0033FF0033FF00 + 33FF0033FF0033FF0033FF0033010101FF3333FF3333FF3333FF3333FF3333FF + 3333FF3333FF3333FF3333010101FF6633FF6633FF6633FF6633FF6633FF6633 + FF6633FF6633FF6633010101FF9933FF9933FF9933FF9933FF9933FF9933FF99 + 33FF9933FF9933010101FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FF + CC33FFCC33010101FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33 + FFFF33010101FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF00 + 66010101FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF336601 + 0101FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6666010101 + FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966FF9966010101FFCC + 66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66FFCC66010101FFFF66FF + FF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66FFFF66010101010101FFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 + 00000000000000000000000000000000000000000000FF0000FF0000FF0000FF + 0000FF0000FF0000FF0000FF0000FF0000010101FF3300FF3300FF3300FF3300 + FF3300FF3300FF3300FF3300FF3300010101FF6600FF6600FF6600FF6600FF66 + 00FF6600FF6600FF6600FF6600010101FF9900FF9900FF9900FF9900FF9900FF + 9900FF9900FF9900FF9900010101FFCC00FFCC00FFCC00FFCC00FFCC00FFCC00 + FFCC00FFCC00FFCC00010101FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF + 00FFFF00FFFF00010101FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF + 0033FF0033010101FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333 + FF3333010101FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF66 + 33010101FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF9933FF993301 + 0101FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33FFCC33010101 + FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33FFFF33010101FF00 + 66FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0066010101FF3366FF + 3366FF3366FF3366FF3366FF3366FF3366FF3366FF3366010101FF6666FF6666 + FF6666FF6666FF6666FF6666FF6666FF6666FF6666010101FF9966FF9966FF99 + 66FF9966FF9966FF9966FF9966FF9966FF9966010101FFCC66FFCC66FFCC66FF + CC66FFCC66FFCC66FFCC66FFCC66FFCC66010101FFFF66FFFF66FFFF66FFFF66 + FFFF66FFFF66FFFF66FFFF66FFFF660101010101010101010101010101010101 + 0101010101010101010101010101010100000000000000000000000000000000 + 0000000000000000000000000000010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 01010101010101010101010101CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCCCCC000000000000000000000000000000000000000000000000 + 000000000000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC00 + 00010101CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC330001 + 0101CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600010101 + CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900010101CCCC + 00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00010101CCFF00CC + FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00010101CC0033CC0033 + CC0033CC0033CC0033CC0033CC0033CC0033CC0033010101CC3333CC3333CC33 + 33CC3333CC3333CC3333CC3333CC3333CC3333010101CC6633CC6633CC6633CC + 6633CC6633CC6633CC6633CC6633CC6633010101CC9933CC9933CC9933CC9933 + CC9933CC9933CC9933CC9933CC9933010101CCCC33CCCC33CCCC33CCCC33CCCC + 33CCCC33CCCC33CCCC33CCCC33010101CCFF33CCFF33CCFF33CCFF33CCFF33CC + FF33CCFF33CCFF33CCFF33010101CC0066CC0066CC0066CC0066CC0066CC0066 + CC0066CC0066CC0066010101CC3366CC3366CC3366CC3366CC3366CC3366CC33 + 66CC3366CC3366010101CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC + 6666CC6666010101CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966 + CC9966010101CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC + 66010101CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF6601 + 0101010101CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + 000000000000000000000000000000000000000000000000000000000000CC00 + 00CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000010101CC3300CC + 3300CC3300CC3300CC3300CC3300CC3300CC3300CC3300010101CC6600CC6600 + CC6600CC6600CC6600CC6600CC6600CC6600CC6600010101CC9900CC9900CC99 + 00CC9900CC9900CC9900CC9900CC9900CC9900010101CCCC00CCCC00CCCC00CC + CC00CCCC00CCCC00CCCC00CCCC00CCCC00010101CCFF00CCFF00CCFF00CCFF00 + CCFF00CCFF00CCFF00CCFF00CCFF00010101CC0033CC0033CC0033CC0033CC00 + 33CC0033CC0033CC0033CC0033010101CC3333CC3333CC3333CC3333CC3333CC + 3333CC3333CC3333CC3333010101CC6633CC6633CC6633CC6633CC6633CC6633 + CC6633CC6633CC6633010101CC9933CC9933CC9933CC9933CC9933CC9933CC99 + 33CC9933CC9933010101CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CC + CC33CCCC33010101CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33 + CCFF33010101CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC00 + 66010101CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC336601 + 0101CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666010101 + CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966010101CCCC + 66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66010101CCFF66CC + FF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66010101010101CCCCCC + CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC0000000000000000 + 00000000000000000000000000000000000000000000CC0000CC0000CC0000CC + 0000CC0000CC0000CC0000CC0000CC0000010101CC3300CC3300CC3300CC3300 + CC3300CC3300CC3300CC3300CC3300010101CC6600CC6600CC6600CC6600CC66 + 00CC6600CC6600CC6600CC6600010101CC9900CC9900CC9900CC9900CC9900CC + 9900CC9900CC9900CC9900010101CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00 + CCCC00CCCC00CCCC00010101CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF + 00CCFF00CCFF00010101CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC + 0033CC0033010101CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333 + CC3333010101CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC66 + 33010101CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC993301 + 0101CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33010101 + CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33010101CC00 + 66CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066010101CC3366CC + 3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366010101CC6666CC6666 + CC6666CC6666CC6666CC6666CC6666CC6666CC6666010101CC9966CC9966CC99 + 66CC9966CC9966CC9966CC9966CC9966CC9966010101CCCC66CCCC66CCCC66CC + CC66CCCC66CCCC66CCCC66CCCC66CCCC66010101CCFF66CCFF66CCFF66CCFF66 + CCFF66CCFF66CCFF66CCFF66CCFF66010101010101CCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC00000000000000000000000000000000 + 0000000000000000000000000000CC0000CC0000CC0000CC0000CC0000CC0000 + CC0000CC0000CC0000010101CC3300CC3300CC3300CC3300CC3300CC3300CC33 + 00CC3300CC3300010101CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC + 6600CC6600010101CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900 + CC9900010101CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC + 00010101CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF0001 + 0101CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033010101 + CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333010101CC66 + 33CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633010101CC9933CC + 9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933010101CCCC33CCCC33 + CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33010101CCFF33CCFF33CCFF + 33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33010101CC0066CC0066CC0066CC + 0066CC0066CC0066CC0066CC0066CC0066010101CC3366CC3366CC3366CC3366 + CC3366CC3366CC3366CC3366CC3366010101CC6666CC6666CC6666CC6666CC66 + 66CC6666CC6666CC6666CC6666010101CC9966CC9966CC9966CC9966CC9966CC + 9966CC9966CC9966CC9966010101CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66 + CCCC66CCCC66CCCC66010101CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF + 66CCFF66CCFF66010101010101CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCCCCC000000000000000000000000000000000000000000000000 + 000000000000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC00 + 00010101CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC330001 + 0101CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600010101 + CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900010101CCCC + 00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00010101CCFF00CC + FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00010101CC0033CC0033 + CC0033CC0033CC0033CC0033CC0033CC0033CC0033010101CC3333CC3333CC33 + 33CC3333CC3333CC3333CC3333CC3333CC3333010101CC6633CC6633CC6633CC + 6633CC6633CC6633CC6633CC6633CC6633010101CC9933CC9933CC9933CC9933 + CC9933CC9933CC9933CC9933CC9933010101CCCC33CCCC33CCCC33CCCC33CCCC + 33CCCC33CCCC33CCCC33CCCC33010101CCFF33CCFF33CCFF33CCFF33CCFF33CC + FF33CCFF33CCFF33CCFF33010101CC0066CC0066CC0066CC0066CC0066CC0066 + CC0066CC0066CC0066010101CC3366CC3366CC3366CC3366CC3366CC3366CC33 + 66CC3366CC3366010101CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC + 6666CC6666010101CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966 + CC9966010101CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC + 66010101CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF6601 + 0101010101CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + 000000000000000000000000000000000000000000000000000000000000CC00 + 00CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000010101CC3300CC + 3300CC3300CC3300CC3300CC3300CC3300CC3300CC3300010101CC6600CC6600 + CC6600CC6600CC6600CC6600CC6600CC6600CC6600010101CC9900CC9900CC99 + 00CC9900CC9900CC9900CC9900CC9900CC9900010101CCCC00CCCC00CCCC00CC + CC00CCCC00CCCC00CCCC00CCCC00CCCC00010101CCFF00CCFF00CCFF00CCFF00 + CCFF00CCFF00CCFF00CCFF00CCFF00010101CC0033CC0033CC0033CC0033CC00 + 33CC0033CC0033CC0033CC0033010101CC3333CC3333CC3333CC3333CC3333CC + 3333CC3333CC3333CC3333010101CC6633CC6633CC6633CC6633CC6633CC6633 + CC6633CC6633CC6633010101CC9933CC9933CC9933CC9933CC9933CC9933CC99 + 33CC9933CC9933010101CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CC + CC33CCCC33010101CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33 + CCFF33010101CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC00 + 66010101CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC336601 + 0101CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666010101 + CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966010101CCCC + 66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66010101CCFF66CC + FF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66010101010101CCCCCC + CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC0000000000000000 + 00000000000000000000000000000000000000000000CC0000CC0000CC0000CC + 0000CC0000CC0000CC0000CC0000CC0000010101CC3300CC3300CC3300CC3300 + CC3300CC3300CC3300CC3300CC3300010101CC6600CC6600CC6600CC6600CC66 + 00CC6600CC6600CC6600CC6600010101CC9900CC9900CC9900CC9900CC9900CC + 9900CC9900CC9900CC9900010101CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00 + CCCC00CCCC00CCCC00010101CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF + 00CCFF00CCFF00010101CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC + 0033CC0033010101CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333 + CC3333010101CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC66 + 33010101CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933CC993301 + 0101CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33010101 + CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33010101CC00 + 66CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066010101CC3366CC + 3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366010101CC6666CC6666 + CC6666CC6666CC6666CC6666CC6666CC6666CC6666010101CC9966CC9966CC99 + 66CC9966CC9966CC9966CC9966CC9966CC9966010101CCCC66CCCC66CCCC66CC + CC66CCCC66CCCC66CCCC66CCCC66CCCC66010101CCFF66CCFF66CCFF66CCFF66 + CCFF66CCFF66CCFF66CCFF66CCFF66010101010101CCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC00000000000000000000000000000000 + 0000000000000000000000000000CC0000CC0000CC0000CC0000CC0000CC0000 + CC0000CC0000CC0000010101CC3300CC3300CC3300CC3300CC3300CC3300CC33 + 00CC3300CC3300010101CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC + 6600CC6600010101CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900 + CC9900010101CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC + 00010101CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF0001 + 0101CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033010101 + CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333010101CC66 + 33CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633010101CC9933CC + 9933CC9933CC9933CC9933CC9933CC9933CC9933CC9933010101CCCC33CCCC33 + CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33CCCC33010101CCFF33CCFF33CCFF + 33CCFF33CCFF33CCFF33CCFF33CCFF33CCFF33010101CC0066CC0066CC0066CC + 0066CC0066CC0066CC0066CC0066CC0066010101CC3366CC3366CC3366CC3366 + CC3366CC3366CC3366CC3366CC3366010101CC6666CC6666CC6666CC6666CC66 + 66CC6666CC6666CC6666CC6666010101CC9966CC9966CC9966CC9966CC9966CC + 9966CC9966CC9966CC9966010101CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66 + CCCC66CCCC66CCCC66010101CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF + 66CCFF66CCFF66010101010101CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + CCCCCCCCCCCCCCCC000000000000000000000000000000000000000000000000 + 000000000000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC00 + 00010101CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC330001 + 0101CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600010101 + CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900CC9900010101CCCC + 00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00CCCC00010101CCFF00CC + FF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00CCFF00010101CC0033CC0033 + CC0033CC0033CC0033CC0033CC0033CC0033CC0033010101CC3333CC3333CC33 + 33CC3333CC3333CC3333CC3333CC3333CC3333010101CC6633CC6633CC6633CC + 6633CC6633CC6633CC6633CC6633CC6633010101CC9933CC9933CC9933CC9933 + CC9933CC9933CC9933CC9933CC9933010101CCCC33CCCC33CCCC33CCCC33CCCC + 33CCCC33CCCC33CCCC33CCCC33010101CCFF33CCFF33CCFF33CCFF33CCFF33CC + FF33CCFF33CCFF33CCFF33010101CC0066CC0066CC0066CC0066CC0066CC0066 + CC0066CC0066CC0066010101CC3366CC3366CC3366CC3366CC3366CC3366CC33 + 66CC3366CC3366010101CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC + 6666CC6666010101CC9966CC9966CC9966CC9966CC9966CC9966CC9966CC9966 + CC9966010101CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC66CCCC + 66010101CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF66CCFF6601 + 0101010101010101010101010101010101010101010101010101010101010101 + 0000000000000000000000000000000000000000000000000000000000000101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101999999 + 9999999999999999999999999999999999999999999999990000000000000000 + 0000000000000000000000000000000000000000000099000099000099000099 + 0000990000990000990000990000990000010101993300993300993300993300 + 9933009933009933009933009933000101019966009966009966009966009966 + 0099660099660099660099660001010199990099990099990099990099990099 + 990099990099990099990001010199CC0099CC0099CC0099CC0099CC0099CC00 + 99CC0099CC0099CC0001010199FF0099FF0099FF0099FF0099FF0099FF0099FF + 0099FF0099FF0001010199003399003399003399003399003399003399003399 + 0033990033010101993333993333993333993333993333993333993333993333 + 9933330101019966339966339966339966339966339966339966339966339966 + 3301010199993399993399993399993399993399993399993399993399993301 + 010199CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC33010101 + 99FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF330101019900 + 6699006699006699006699006699006699006699006699006601010199336699 + 3366993366993366993366993366993366993366993366010101996666996666 + 9966669966669966669966669966669966669966660101019999669999669999 + 6699996699996699996699996699996699996601010199CC6699CC6699CC6699 + CC6699CC6699CC6699CC6699CC6699CC6601010199FF6699FF6699FF6699FF66 + 99FF6699FF6699FF6699FF6699FF660101010101019999999999999999999999 + 9999999999999999999999999999999900000000000000000000000000000000 + 0000000000000000000000000000990000990000990000990000990000990000 + 9900009900009900000101019933009933009933009933009933009933009933 + 0099330099330001010199660099660099660099660099660099660099660099 + 6600996600010101999900999900999900999900999900999900999900999900 + 99990001010199CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC + 0001010199FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0001 + 0101990033990033990033990033990033990033990033990033990033010101 + 9933339933339933339933339933339933339933339933339933330101019966 + 3399663399663399663399663399663399663399663399663301010199993399 + 993399993399993399993399993399993399993399993301010199CC3399CC33 + 99CC3399CC3399CC3399CC3399CC3399CC3399CC3301010199FF3399FF3399FF + 3399FF3399FF3399FF3399FF3399FF3399FF3301010199006699006699006699 + 0066990066990066990066990066990066010101993366993366993366993366 + 9933669933669933669933669933660101019966669966669966669966669966 + 6699666699666699666699666601010199996699996699996699996699996699 + 996699996699996699996601010199CC6699CC6699CC6699CC6699CC6699CC66 + 99CC6699CC6699CC6601010199FF6699FF6699FF6699FF6699FF6699FF6699FF + 6699FF6699FF6601010101010199999999999999999999999999999999999999 + 9999999999999999000000000000000000000000000000000000000000000000 + 0000000000009900009900009900009900009900009900009900009900009900 + 0001010199330099330099330099330099330099330099330099330099330001 + 0101996600996600996600996600996600996600996600996600996600010101 + 99990099990099990099990099990099990099990099990099990001010199CC + 0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0001010199FF0099 + FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF00010101990033990033 + 9900339900339900339900339900339900339900330101019933339933339933 + 3399333399333399333399333399333399333301010199663399663399663399 + 6633996633996633996633996633996633010101999933999933999933999933 + 99993399993399993399993399993301010199CC3399CC3399CC3399CC3399CC + 3399CC3399CC3399CC3399CC3301010199FF3399FF3399FF3399FF3399FF3399 + FF3399FF3399FF3399FF33010101990066990066990066990066990066990066 + 9900669900669900660101019933669933669933669933669933669933669933 + 6699336699336601010199666699666699666699666699666699666699666699 + 6666996666010101999966999966999966999966999966999966999966999966 + 99996601010199CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC + 6601010199FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6601 + 0101010101999999999999999999999999999999999999999999999999999999 + 0000000000000000000000000000000000000000000000000000000000009900 + 0099000099000099000099000099000099000099000099000001010199330099 + 3300993300993300993300993300993300993300993300010101996600996600 + 9966009966009966009966009966009966009966000101019999009999009999 + 0099990099990099990099990099990099990001010199CC0099CC0099CC0099 + CC0099CC0099CC0099CC0099CC0099CC0001010199FF0099FF0099FF0099FF00 + 99FF0099FF0099FF0099FF0099FF000101019900339900339900339900339900 + 3399003399003399003399003301010199333399333399333399333399333399 + 3333993333993333993333010101996633996633996633996633996633996633 + 9966339966339966330101019999339999339999339999339999339999339999 + 3399993399993301010199CC3399CC3399CC3399CC3399CC3399CC3399CC3399 + CC3399CC3301010199FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF33 + 99FF330101019900669900669900669900669900669900669900669900669900 + 6601010199336699336699336699336699336699336699336699336699336601 + 0101996666996666996666996666996666996666996666996666996666010101 + 99996699996699996699996699996699996699996699996699996601010199CC + 6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6601010199FF6699 + FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF66010101010101999999 + 9999999999999999999999999999999999999999999999990000000000000000 + 0000000000000000000000000000000000000000000099000099000099000099 + 0000990000990000990000990000990000010101993300993300993300993300 + 9933009933009933009933009933000101019966009966009966009966009966 + 0099660099660099660099660001010199990099990099990099990099990099 + 990099990099990099990001010199CC0099CC0099CC0099CC0099CC0099CC00 + 99CC0099CC0099CC0001010199FF0099FF0099FF0099FF0099FF0099FF0099FF + 0099FF0099FF0001010199003399003399003399003399003399003399003399 + 0033990033010101993333993333993333993333993333993333993333993333 + 9933330101019966339966339966339966339966339966339966339966339966 + 3301010199993399993399993399993399993399993399993399993399993301 + 010199CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC33010101 + 99FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF330101019900 + 6699006699006699006699006699006699006699006699006601010199336699 + 3366993366993366993366993366993366993366993366010101996666996666 + 9966669966669966669966669966669966669966660101019999669999669999 + 6699996699996699996699996699996699996601010199CC6699CC6699CC6699 + CC6699CC6699CC6699CC6699CC6699CC6601010199FF6699FF6699FF6699FF66 + 99FF6699FF6699FF6699FF6699FF660101010101019999999999999999999999 + 9999999999999999999999999999999900000000000000000000000000000000 + 0000000000000000000000000000990000990000990000990000990000990000 + 9900009900009900000101019933009933009933009933009933009933009933 + 0099330099330001010199660099660099660099660099660099660099660099 + 6600996600010101999900999900999900999900999900999900999900999900 + 99990001010199CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC + 0001010199FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF0001 + 0101990033990033990033990033990033990033990033990033990033010101 + 9933339933339933339933339933339933339933339933339933330101019966 + 3399663399663399663399663399663399663399663399663301010199993399 + 993399993399993399993399993399993399993399993301010199CC3399CC33 + 99CC3399CC3399CC3399CC3399CC3399CC3399CC3301010199FF3399FF3399FF + 3399FF3399FF3399FF3399FF3399FF3399FF3301010199006699006699006699 + 0066990066990066990066990066990066010101993366993366993366993366 + 9933669933669933669933669933660101019966669966669966669966669966 + 6699666699666699666699666601010199996699996699996699996699996699 + 996699996699996699996601010199CC6699CC6699CC6699CC6699CC6699CC66 + 99CC6699CC6699CC6601010199FF6699FF6699FF6699FF6699FF6699FF6699FF + 6699FF6699FF6601010101010199999999999999999999999999999999999999 + 9999999999999999000000000000000000000000000000000000000000000000 + 0000000000009900009900009900009900009900009900009900009900009900 + 0001010199330099330099330099330099330099330099330099330099330001 + 0101996600996600996600996600996600996600996600996600996600010101 + 99990099990099990099990099990099990099990099990099990001010199CC + 0099CC0099CC0099CC0099CC0099CC0099CC0099CC0099CC0001010199FF0099 + FF0099FF0099FF0099FF0099FF0099FF0099FF0099FF00010101990033990033 + 9900339900339900339900339900339900339900330101019933339933339933 + 3399333399333399333399333399333399333301010199663399663399663399 + 6633996633996633996633996633996633010101999933999933999933999933 + 99993399993399993399993399993301010199CC3399CC3399CC3399CC3399CC + 3399CC3399CC3399CC3399CC3301010199FF3399FF3399FF3399FF3399FF3399 + FF3399FF3399FF3399FF33010101990066990066990066990066990066990066 + 9900669900669900660101019933669933669933669933669933669933669933 + 6699336699336601010199666699666699666699666699666699666699666699 + 6666996666010101999966999966999966999966999966999966999966999966 + 99996601010199CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC + 6601010199FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF6601 + 0101010101999999999999999999999999999999999999999999999999999999 + 0000000000000000000000000000000000000000000000000000000000009900 + 0099000099000099000099000099000099000099000099000001010199330099 + 3300993300993300993300993300993300993300993300010101996600996600 + 9966009966009966009966009966009966009966000101019999009999009999 + 0099990099990099990099990099990099990001010199CC0099CC0099CC0099 + CC0099CC0099CC0099CC0099CC0099CC0001010199FF0099FF0099FF0099FF00 + 99FF0099FF0099FF0099FF0099FF000101019900339900339900339900339900 + 3399003399003399003399003301010199333399333399333399333399333399 + 3333993333993333993333010101996633996633996633996633996633996633 + 9966339966339966330101019999339999339999339999339999339999339999 + 3399993399993301010199CC3399CC3399CC3399CC3399CC3399CC3399CC3399 + CC3399CC3301010199FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF33 + 99FF330101019900669900669900669900669900669900669900669900669900 + 6601010199336699336699336699336699336699336699336699336699336601 + 0101996666996666996666996666996666996666996666996666996666010101 + 99996699996699996699996699996699996699996699996699996601010199CC + 6699CC6699CC6699CC6699CC6699CC6699CC6699CC6699CC6601010199FF6699 + FF6699FF6699FF6699FF6699FF6699FF6699FF6699FF66010101010101999999 + 9999999999999999999999999999999999999999999999990000000000000000 + 0000000000000000000000000000000000000000000099000099000099000099 + 0000990000990000990000990000990000010101993300993300993300993300 + 9933009933009933009933009933000101019966009966009966009966009966 + 0099660099660099660099660001010199990099990099990099990099990099 + 990099990099990099990001010199CC0099CC0099CC0099CC0099CC0099CC00 + 99CC0099CC0099CC0001010199FF0099FF0099FF0099FF0099FF0099FF0099FF + 0099FF0099FF0001010199003399003399003399003399003399003399003399 + 0033990033010101993333993333993333993333993333993333993333993333 + 9933330101019966339966339966339966339966339966339966339966339966 + 3301010199993399993399993399993399993399993399993399993399993301 + 010199CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC3399CC33010101 + 99FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF3399FF330101019900 + 6699006699006699006699006699006699006699006699006601010199336699 + 3366993366993366993366993366993366993366993366010101996666996666 + 9966669966669966669966669966669966669966660101019999669999669999 + 6699996699996699996699996699996699996601010199CC6699CC6699CC6699 + CC6699CC6699CC6699CC6699CC6699CC6601010199FF6699FF6699FF6699FF66 + 99FF6699FF6699FF6699FF6699FF660101010101010101010101010101010101 + 0101010101010101010101010101010100000000000000000000000000000000 + 0000000000000000000000000000010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010166666666666666666666666666666666666666 + 6666666666666666000000000000000000000000000000000000000000000000 + 0000000000006600006600006600006600006600006600006600006600006600 + 0001010166330066330066330066330066330066330066330066330066330001 + 0101666600666600666600666600666600666600666600666600666600010101 + 66990066990066990066990066990066990066990066990066990001010166CC + 0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0001010166FF0066 + FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF00010101660033660033 + 6600336600336600336600336600336600336600330101016633336633336633 + 3366333366333366333366333366333366333301010166663366663366663366 + 6633666633666633666633666633666633010101669933669933669933669933 + 66993366993366993366993366993301010166CC3366CC3366CC3366CC3366CC + 3366CC3366CC3366CC3366CC3301010166FF3366FF3366FF3366FF3366FF3366 + FF3366FF3366FF3366FF33010101660066660066660066660066660066660066 + 6600666600666600660101016633666633666633666633666633666633666633 + 6666336666336601010166666666666666666666666666666666666666666666 + 6666666666010101669966669966669966669966669966669966669966669966 + 66996601010166CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC + 6601010166FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6601 + 0101010101666666666666666666666666666666666666666666666666666666 + 0000000000000000000000000000000000000000000000000000000000006600 + 0066000066000066000066000066000066000066000066000001010166330066 + 3300663300663300663300663300663300663300663300010101666600666600 + 6666006666006666006666006666006666006666000101016699006699006699 + 0066990066990066990066990066990066990001010166CC0066CC0066CC0066 + CC0066CC0066CC0066CC0066CC0066CC0001010166FF0066FF0066FF0066FF00 + 66FF0066FF0066FF0066FF0066FF000101016600336600336600336600336600 + 3366003366003366003366003301010166333366333366333366333366333366 + 3333663333663333663333010101666633666633666633666633666633666633 + 6666336666336666330101016699336699336699336699336699336699336699 + 3366993366993301010166CC3366CC3366CC3366CC3366CC3366CC3366CC3366 + CC3366CC3301010166FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF33 + 66FF330101016600666600666600666600666600666600666600666600666600 + 6601010166336666336666336666336666336666336666336666336666336601 + 0101666666666666666666666666666666666666666666666666666666010101 + 66996666996666996666996666996666996666996666996666996601010166CC + 6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6601010166FF6666 + FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF66010101010101666666 + 6666666666666666666666666666666666666666666666660000000000000000 + 0000000000000000000000000000000000000000000066000066000066000066 + 0000660000660000660000660000660000010101663300663300663300663300 + 6633006633006633006633006633000101016666006666006666006666006666 + 0066660066660066660066660001010166990066990066990066990066990066 + 990066990066990066990001010166CC0066CC0066CC0066CC0066CC0066CC00 + 66CC0066CC0066CC0001010166FF0066FF0066FF0066FF0066FF0066FF0066FF + 0066FF0066FF0001010166003366003366003366003366003366003366003366 + 0033660033010101663333663333663333663333663333663333663333663333 + 6633330101016666336666336666336666336666336666336666336666336666 + 3301010166993366993366993366993366993366993366993366993366993301 + 010166CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC33010101 + 66FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF330101016600 + 6666006666006666006666006666006666006666006666006601010166336666 + 3366663366663366663366663366663366663366663366010101666666666666 + 6666666666666666666666666666666666666666660101016699666699666699 + 6666996666996666996666996666996666996601010166CC6666CC6666CC6666 + CC6666CC6666CC6666CC6666CC6666CC6601010166FF6666FF6666FF6666FF66 + 66FF6666FF6666FF6666FF6666FF660101010101016666666666666666666666 + 6666666666666666666666666666666600000000000000000000000000000000 + 0000000000000000000000000000660000660000660000660000660000660000 + 6600006600006600000101016633006633006633006633006633006633006633 + 0066330066330001010166660066660066660066660066660066660066660066 + 6600666600010101669900669900669900669900669900669900669900669900 + 66990001010166CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC + 0001010166FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0001 + 0101660033660033660033660033660033660033660033660033660033010101 + 6633336633336633336633336633336633336633336633336633330101016666 + 3366663366663366663366663366663366663366663366663301010166993366 + 993366993366993366993366993366993366993366993301010166CC3366CC33 + 66CC3366CC3366CC3366CC3366CC3366CC3366CC3301010166FF3366FF3366FF + 3366FF3366FF3366FF3366FF3366FF3366FF3301010166006666006666006666 + 0066660066660066660066660066660066010101663366663366663366663366 + 6633666633666633666633666633660101016666666666666666666666666666 + 6666666666666666666666666601010166996666996666996666996666996666 + 996666996666996666996601010166CC6666CC6666CC6666CC6666CC6666CC66 + 66CC6666CC6666CC6601010166FF6666FF6666FF6666FF6666FF6666FF6666FF + 6666FF6666FF6601010101010166666666666666666666666666666666666666 + 6666666666666666000000000000000000000000000000000000000000000000 + 0000000000006600006600006600006600006600006600006600006600006600 + 0001010166330066330066330066330066330066330066330066330066330001 + 0101666600666600666600666600666600666600666600666600666600010101 + 66990066990066990066990066990066990066990066990066990001010166CC + 0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0001010166FF0066 + FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF00010101660033660033 + 6600336600336600336600336600336600336600330101016633336633336633 + 3366333366333366333366333366333366333301010166663366663366663366 + 6633666633666633666633666633666633010101669933669933669933669933 + 66993366993366993366993366993301010166CC3366CC3366CC3366CC3366CC + 3366CC3366CC3366CC3366CC3301010166FF3366FF3366FF3366FF3366FF3366 + FF3366FF3366FF3366FF33010101660066660066660066660066660066660066 + 6600666600666600660101016633666633666633666633666633666633666633 + 6666336666336601010166666666666666666666666666666666666666666666 + 6666666666010101669966669966669966669966669966669966669966669966 + 66996601010166CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC + 6601010166FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6601 + 0101010101666666666666666666666666666666666666666666666666666666 + 0000000000000000000000000000000000000000000000000000000000006600 + 0066000066000066000066000066000066000066000066000001010166330066 + 3300663300663300663300663300663300663300663300010101666600666600 + 6666006666006666006666006666006666006666000101016699006699006699 + 0066990066990066990066990066990066990001010166CC0066CC0066CC0066 + CC0066CC0066CC0066CC0066CC0066CC0001010166FF0066FF0066FF0066FF00 + 66FF0066FF0066FF0066FF0066FF000101016600336600336600336600336600 + 3366003366003366003366003301010166333366333366333366333366333366 + 3333663333663333663333010101666633666633666633666633666633666633 + 6666336666336666330101016699336699336699336699336699336699336699 + 3366993366993301010166CC3366CC3366CC3366CC3366CC3366CC3366CC3366 + CC3366CC3301010166FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF33 + 66FF330101016600666600666600666600666600666600666600666600666600 + 6601010166336666336666336666336666336666336666336666336666336601 + 0101666666666666666666666666666666666666666666666666666666010101 + 66996666996666996666996666996666996666996666996666996601010166CC + 6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6601010166FF6666 + FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF66010101010101666666 + 6666666666666666666666666666666666666666666666660000000000000000 + 0000000000000000000000000000000000000000000066000066000066000066 + 0000660000660000660000660000660000010101663300663300663300663300 + 6633006633006633006633006633000101016666006666006666006666006666 + 0066660066660066660066660001010166990066990066990066990066990066 + 990066990066990066990001010166CC0066CC0066CC0066CC0066CC0066CC00 + 66CC0066CC0066CC0001010166FF0066FF0066FF0066FF0066FF0066FF0066FF + 0066FF0066FF0001010166003366003366003366003366003366003366003366 + 0033660033010101663333663333663333663333663333663333663333663333 + 6633330101016666336666336666336666336666336666336666336666336666 + 3301010166993366993366993366993366993366993366993366993366993301 + 010166CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC3366CC33010101 + 66FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF3366FF330101016600 + 6666006666006666006666006666006666006666006666006601010166336666 + 3366663366663366663366663366663366663366663366010101666666666666 + 6666666666666666666666666666666666666666660101016699666699666699 + 6666996666996666996666996666996666996601010166CC6666CC6666CC6666 + CC6666CC6666CC6666CC6666CC6666CC6601010166FF6666FF6666FF6666FF66 + 66FF6666FF6666FF6666FF6666FF660101010101016666666666666666666666 + 6666666666666666666666666666666600000000000000000000000000000000 + 0000000000000000000000000000660000660000660000660000660000660000 + 6600006600006600000101016633006633006633006633006633006633006633 + 0066330066330001010166660066660066660066660066660066660066660066 + 6600666600010101669900669900669900669900669900669900669900669900 + 66990001010166CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC + 0001010166FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF0001 + 0101660033660033660033660033660033660033660033660033660033010101 + 6633336633336633336633336633336633336633336633336633330101016666 + 3366663366663366663366663366663366663366663366663301010166993366 + 993366993366993366993366993366993366993366993301010166CC3366CC33 + 66CC3366CC3366CC3366CC3366CC3366CC3366CC3301010166FF3366FF3366FF + 3366FF3366FF3366FF3366FF3366FF3366FF3301010166006666006666006666 + 0066660066660066660066660066660066010101663366663366663366663366 + 6633666633666633666633666633660101016666666666666666666666666666 + 6666666666666666666666666601010166996666996666996666996666996666 + 996666996666996666996601010166CC6666CC6666CC6666CC6666CC6666CC66 + 66CC6666CC6666CC6601010166FF6666FF6666FF6666FF6666FF6666FF6666FF + 6666FF6666FF6601010101010166666666666666666666666666666666666666 + 6666666666666666000000000000000000000000000000000000000000000000 + 0000000000006600006600006600006600006600006600006600006600006600 + 0001010166330066330066330066330066330066330066330066330066330001 + 0101666600666600666600666600666600666600666600666600666600010101 + 66990066990066990066990066990066990066990066990066990001010166CC + 0066CC0066CC0066CC0066CC0066CC0066CC0066CC0066CC0001010166FF0066 + FF0066FF0066FF0066FF0066FF0066FF0066FF0066FF00010101660033660033 + 6600336600336600336600336600336600336600330101016633336633336633 + 3366333366333366333366333366333366333301010166663366663366663366 + 6633666633666633666633666633666633010101669933669933669933669933 + 66993366993366993366993366993301010166CC3366CC3366CC3366CC3366CC + 3366CC3366CC3366CC3366CC3301010166FF3366FF3366FF3366FF3366FF3366 + FF3366FF3366FF3366FF33010101660066660066660066660066660066660066 + 6600666600666600660101016633666633666633666633666633666633666633 + 6666336666336601010166666666666666666666666666666666666666666666 + 6666666666010101669966669966669966669966669966669966669966669966 + 66996601010166CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC6666CC + 6601010166FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6666FF6601 + 0101010101010101010101010101010101010101010101010101010101010101 + 0000000000000000000000000000000000000000000000000000000000000101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101333333 + 3333333333333333333333333333333333333333333333330000000000000000 + 0000000000000000000000000000000000000000000033000033000033000033 + 0000330000330000330000330000330000010101333300333300333300333300 + 3333003333003333003333003333000101013366003366003366003366003366 + 0033660033660033660033660001010133990033990033990033990033990033 + 990033990033990033990001010133CC0033CC0033CC0033CC0033CC0033CC00 + 33CC0033CC0033CC0001010133FF0033FF0033FF0033FF0033FF0033FF0033FF + 0033FF0033FF0001010133003333003333003333003333003333003333003333 + 0033330033010101333333333333333333333333333333333333333333333333 + 3333330101013366333366333366333366333366333366333366333366333366 + 3301010133993333993333993333993333993333993333993333993333993301 + 010133CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC33010101 + 33FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF330101013300 + 6633006633006633006633006633006633006633006633006601010133336633 + 3366333366333366333366333366333366333366333366010101336666336666 + 3366663366663366663366663366663366663366660101013399663399663399 + 6633996633996633996633996633996633996601010133CC6633CC6633CC6633 + CC6633CC6633CC6633CC6633CC6633CC6601010133FF6633FF6633FF6633FF66 + 33FF6633FF6633FF6633FF6633FF660101010101013333333333333333333333 + 3333333333333333333333333333333300000000000000000000000000000000 + 0000000000000000000000000000330000330000330000330000330000330000 + 3300003300003300000101013333003333003333003333003333003333003333 + 0033330033330001010133660033660033660033660033660033660033660033 + 6600336600010101339900339900339900339900339900339900339900339900 + 33990001010133CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC + 0001010133FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0001 + 0101330033330033330033330033330033330033330033330033330033010101 + 3333333333333333333333333333333333333333333333333333330101013366 + 3333663333663333663333663333663333663333663333663301010133993333 + 993333993333993333993333993333993333993333993301010133CC3333CC33 + 33CC3333CC3333CC3333CC3333CC3333CC3333CC3301010133FF3333FF3333FF + 3333FF3333FF3333FF3333FF3333FF3333FF3301010133006633006633006633 + 0066330066330066330066330066330066010101333366333366333366333366 + 3333663333663333663333663333660101013366663366663366663366663366 + 6633666633666633666633666601010133996633996633996633996633996633 + 996633996633996633996601010133CC6633CC6633CC6633CC6633CC6633CC66 + 33CC6633CC6633CC6601010133FF6633FF6633FF6633FF6633FF6633FF6633FF + 6633FF6633FF6601010101010133333333333333333333333333333333333333 + 3333333333333333000000000000000000000000000000000000000000000000 + 0000000000003300003300003300003300003300003300003300003300003300 + 0001010133330033330033330033330033330033330033330033330033330001 + 0101336600336600336600336600336600336600336600336600336600010101 + 33990033990033990033990033990033990033990033990033990001010133CC + 0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0001010133FF0033 + FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF00010101330033330033 + 3300333300333300333300333300333300333300330101013333333333333333 + 3333333333333333333333333333333333333301010133663333663333663333 + 6633336633336633336633336633336633010101339933339933339933339933 + 33993333993333993333993333993301010133CC3333CC3333CC3333CC3333CC + 3333CC3333CC3333CC3333CC3301010133FF3333FF3333FF3333FF3333FF3333 + FF3333FF3333FF3333FF33010101330066330066330066330066330066330066 + 3300663300663300660101013333663333663333663333663333663333663333 + 6633336633336601010133666633666633666633666633666633666633666633 + 6666336666010101339966339966339966339966339966339966339966339966 + 33996601010133CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC + 6601010133FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6601 + 0101010101333333333333333333333333333333333333333333333333333333 + 0000000000000000000000000000000000000000000000000000000000003300 + 0033000033000033000033000033000033000033000033000001010133330033 + 3300333300333300333300333300333300333300333300010101336600336600 + 3366003366003366003366003366003366003366000101013399003399003399 + 0033990033990033990033990033990033990001010133CC0033CC0033CC0033 + CC0033CC0033CC0033CC0033CC0033CC0001010133FF0033FF0033FF0033FF00 + 33FF0033FF0033FF0033FF0033FF000101013300333300333300333300333300 + 3333003333003333003333003301010133333333333333333333333333333333 + 3333333333333333333333010101336633336633336633336633336633336633 + 3366333366333366330101013399333399333399333399333399333399333399 + 3333993333993301010133CC3333CC3333CC3333CC3333CC3333CC3333CC3333 + CC3333CC3301010133FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF33 + 33FF330101013300663300663300663300663300663300663300663300663300 + 6601010133336633336633336633336633336633336633336633336633336601 + 0101336666336666336666336666336666336666336666336666336666010101 + 33996633996633996633996633996633996633996633996633996601010133CC + 6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6601010133FF6633 + FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF66010101010101333333 + 3333333333333333333333333333333333333333333333330000000000000000 + 0000000000000000000000000000000000000000000033000033000033000033 + 0000330000330000330000330000330000010101333300333300333300333300 + 3333003333003333003333003333000101013366003366003366003366003366 + 0033660033660033660033660001010133990033990033990033990033990033 + 990033990033990033990001010133CC0033CC0033CC0033CC0033CC0033CC00 + 33CC0033CC0033CC0001010133FF0033FF0033FF0033FF0033FF0033FF0033FF + 0033FF0033FF0001010133003333003333003333003333003333003333003333 + 0033330033010101333333333333333333333333333333333333333333333333 + 3333330101013366333366333366333366333366333366333366333366333366 + 3301010133993333993333993333993333993333993333993333993333993301 + 010133CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC33010101 + 33FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF330101013300 + 6633006633006633006633006633006633006633006633006601010133336633 + 3366333366333366333366333366333366333366333366010101336666336666 + 3366663366663366663366663366663366663366660101013399663399663399 + 6633996633996633996633996633996633996601010133CC6633CC6633CC6633 + CC6633CC6633CC6633CC6633CC6633CC6601010133FF6633FF6633FF6633FF66 + 33FF6633FF6633FF6633FF6633FF660101010101013333333333333333333333 + 3333333333333333333333333333333300000000000000000000000000000000 + 0000000000000000000000000000330000330000330000330000330000330000 + 3300003300003300000101013333003333003333003333003333003333003333 + 0033330033330001010133660033660033660033660033660033660033660033 + 6600336600010101339900339900339900339900339900339900339900339900 + 33990001010133CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC + 0001010133FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF0001 + 0101330033330033330033330033330033330033330033330033330033010101 + 3333333333333333333333333333333333333333333333333333330101013366 + 3333663333663333663333663333663333663333663333663301010133993333 + 993333993333993333993333993333993333993333993301010133CC3333CC33 + 33CC3333CC3333CC3333CC3333CC3333CC3333CC3301010133FF3333FF3333FF + 3333FF3333FF3333FF3333FF3333FF3333FF3301010133006633006633006633 + 0066330066330066330066330066330066010101333366333366333366333366 + 3333663333663333663333663333660101013366663366663366663366663366 + 6633666633666633666633666601010133996633996633996633996633996633 + 996633996633996633996601010133CC6633CC6633CC6633CC6633CC6633CC66 + 33CC6633CC6633CC6601010133FF6633FF6633FF6633FF6633FF6633FF6633FF + 6633FF6633FF6601010101010133333333333333333333333333333333333333 + 3333333333333333000000000000000000000000000000000000000000000000 + 0000000000003300003300003300003300003300003300003300003300003300 + 0001010133330033330033330033330033330033330033330033330033330001 + 0101336600336600336600336600336600336600336600336600336600010101 + 33990033990033990033990033990033990033990033990033990001010133CC + 0033CC0033CC0033CC0033CC0033CC0033CC0033CC0033CC0001010133FF0033 + FF0033FF0033FF0033FF0033FF0033FF0033FF0033FF00010101330033330033 + 3300333300333300333300333300333300333300330101013333333333333333 + 3333333333333333333333333333333333333301010133663333663333663333 + 6633336633336633336633336633336633010101339933339933339933339933 + 33993333993333993333993333993301010133CC3333CC3333CC3333CC3333CC + 3333CC3333CC3333CC3333CC3301010133FF3333FF3333FF3333FF3333FF3333 + FF3333FF3333FF3333FF33010101330066330066330066330066330066330066 + 3300663300663300660101013333663333663333663333663333663333663333 + 6633336633336601010133666633666633666633666633666633666633666633 + 6666336666010101339966339966339966339966339966339966339966339966 + 33996601010133CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC + 6601010133FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF6601 + 0101010101333333333333333333333333333333333333333333333333333333 + 0000000000000000000000000000000000000000000000000000000000003300 + 0033000033000033000033000033000033000033000033000001010133330033 + 3300333300333300333300333300333300333300333300010101336600336600 + 3366003366003366003366003366003366003366000101013399003399003399 + 0033990033990033990033990033990033990001010133CC0033CC0033CC0033 + CC0033CC0033CC0033CC0033CC0033CC0001010133FF0033FF0033FF0033FF00 + 33FF0033FF0033FF0033FF0033FF000101013300333300333300333300333300 + 3333003333003333003333003301010133333333333333333333333333333333 + 3333333333333333333333010101336633336633336633336633336633336633 + 3366333366333366330101013399333399333399333399333399333399333399 + 3333993333993301010133CC3333CC3333CC3333CC3333CC3333CC3333CC3333 + CC3333CC3301010133FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF33 + 33FF330101013300663300663300663300663300663300663300663300663300 + 6601010133336633336633336633336633336633336633336633336633336601 + 0101336666336666336666336666336666336666336666336666336666010101 + 33996633996633996633996633996633996633996633996633996601010133CC + 6633CC6633CC6633CC6633CC6633CC6633CC6633CC6633CC6601010133FF6633 + FF6633FF6633FF6633FF6633FF6633FF6633FF6633FF66010101010101333333 + 3333333333333333333333333333333333333333333333330000000000000000 + 0000000000000000000000000000000000000000000033000033000033000033 + 0000330000330000330000330000330000010101333300333300333300333300 + 3333003333003333003333003333000101013366003366003366003366003366 + 0033660033660033660033660001010133990033990033990033990033990033 + 990033990033990033990001010133CC0033CC0033CC0033CC0033CC0033CC00 + 33CC0033CC0033CC0001010133FF0033FF0033FF0033FF0033FF0033FF0033FF + 0033FF0033FF0001010133003333003333003333003333003333003333003333 + 0033330033010101333333333333333333333333333333333333333333333333 + 3333330101013366333366333366333366333366333366333366333366333366 + 3301010133993333993333993333993333993333993333993333993333993301 + 010133CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC3333CC33010101 + 33FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF3333FF330101013300 + 6633006633006633006633006633006633006633006633006601010133336633 + 3366333366333366333366333366333366333366333366010101336666336666 + 3366663366663366663366663366663366663366660101013399663399663399 + 6633996633996633996633996633996633996601010133CC6633CC6633CC6633 + CC6633CC6633CC6633CC6633CC6633CC6601010133FF6633FF6633FF6633FF66 + 33FF6633FF6633FF6633FF6633FF660101010000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000330000330000330000330000330000330000330000330000330001 + 0101006600006600006600006600006600006600006600006600006600010101 + 00990000990000990000990000990000990000990000990000990001010100CC + 0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0001010100FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00010101000033000033 + 0000330000330000330000330000330000330000330101010033330033330033 + 3300333300333300333300333300333300333301010100663300663300663300 + 6633006633006633006633006633006633010101009933009933009933009933 + 00993300993300993300993300993301010100CC3300CC3300CC3300CC3300CC + 3300CC3300CC3300CC3300CC3301010100FF3300FF3300FF3300FF3300FF3300 + FF3300FF3300FF3300FF33010101000066000066000066000066000066000066 + 0000660000660000660101010033660033660033660033660033660033660033 + 6600336600336601010100666600666600666600666600666600666600666600 + 6666006666010101009966009966009966009966009966009966009966009966 + 00996601010100CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC + 6601010100FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6601 + 0101000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000330000 + 3300003300003300003300003300003300003300003300010101006600006600 + 0066000066000066000066000066000066000066000101010099000099000099 + 0000990000990000990000990000990000990001010100CC0000CC0000CC0000 + CC0000CC0000CC0000CC0000CC0000CC0001010100FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF000101010000330000330000330000330000 + 3300003300003300003300003301010100333300333300333300333300333300 + 3333003333003333003333010101006633006633006633006633006633006633 + 0066330066330066330101010099330099330099330099330099330099330099 + 3300993300993301010100CC3300CC3300CC3300CC3300CC3300CC3300CC3300 + CC3300CC3301010100FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF33 + 00FF330101010000660000660000660000660000660000660000660000660000 + 6601010100336600336600336600336600336600336600336600336600336601 + 0101006666006666006666006666006666006666006666006666006666010101 + 00996600996600996600996600996600996600996600996600996601010100CC + 6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6601010100FF6600 + FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF66010101000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000003300003300003300003300 + 0033000033000033000033000033000101010066000066000066000066000066 + 0000660000660000660000660001010100990000990000990000990000990000 + 990000990000990000990001010100CC0000CC0000CC0000CC0000CC0000CC00 + 00CC0000CC0000CC0001010100FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0001010100003300003300003300003300003300003300003300 + 0033000033010101003333003333003333003333003333003333003333003333 + 0033330101010066330066330066330066330066330066330066330066330066 + 3301010100993300993300993300993300993300993300993300993300993301 + 010100CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC33010101 + 00FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF330101010000 + 6600006600006600006600006600006600006600006600006601010100336600 + 3366003366003366003366003366003366003366003366010101006666006666 + 0066660066660066660066660066660066660066660101010099660099660099 + 6600996600996600996600996600996600996601010100CC6600CC6600CC6600 + CC6600CC6600CC6600CC6600CC6600CC6601010100FF6600FF6600FF6600FF66 + 00FF6600FF6600FF6600FF6600FF660101010000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000033000033000033000033000033000033000033 + 0000330000330001010100660000660000660000660000660000660000660000 + 6600006600010101009900009900009900009900009900009900009900009900 + 00990001010100CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC + 0001010100FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0001 + 0101000033000033000033000033000033000033000033000033000033010101 + 0033330033330033330033330033330033330033330033330033330101010066 + 3300663300663300663300663300663300663300663300663301010100993300 + 993300993300993300993300993300993300993300993301010100CC3300CC33 + 00CC3300CC3300CC3300CC3300CC3300CC3300CC3301010100FF3300FF3300FF + 3300FF3300FF3300FF3300FF3300FF3300FF3301010100006600006600006600 + 0066000066000066000066000066000066010101003366003366003366003366 + 0033660033660033660033660033660101010066660066660066660066660066 + 6600666600666600666600666601010100996600996600996600996600996600 + 996600996600996600996601010100CC6600CC6600CC6600CC6600CC6600CC66 + 00CC6600CC6600CC6601010100FF6600FF6600FF6600FF6600FF6600FF6600FF + 6600FF6600FF6601010100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000330000330000330000330000330000330000330000330000330001 + 0101006600006600006600006600006600006600006600006600006600010101 + 00990000990000990000990000990000990000990000990000990001010100CC + 0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0001010100FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00010101000033000033 + 0000330000330000330000330000330000330000330101010033330033330033 + 3300333300333300333300333300333300333301010100663300663300663300 + 6633006633006633006633006633006633010101009933009933009933009933 + 00993300993300993300993300993301010100CC3300CC3300CC3300CC3300CC + 3300CC3300CC3300CC3300CC3301010100FF3300FF3300FF3300FF3300FF3300 + FF3300FF3300FF3300FF33010101000066000066000066000066000066000066 + 0000660000660000660101010033660033660033660033660033660033660033 + 6600336600336601010100666600666600666600666600666600666600666600 + 6666006666010101009966009966009966009966009966009966009966009966 + 00996601010100CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC + 6601010100FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6601 + 0101000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000330000 + 3300003300003300003300003300003300003300003300010101006600006600 + 0066000066000066000066000066000066000066000101010099000099000099 + 0000990000990000990000990000990000990001010100CC0000CC0000CC0000 + CC0000CC0000CC0000CC0000CC0000CC0001010100FF0000FF0000FF0000FF00 + 00FF0000FF0000FF0000FF0000FF000101010000330000330000330000330000 + 3300003300003300003300003301010100333300333300333300333300333300 + 3333003333003333003333010101006633006633006633006633006633006633 + 0066330066330066330101010099330099330099330099330099330099330099 + 3300993300993301010100CC3300CC3300CC3300CC3300CC3300CC3300CC3300 + CC3300CC3301010100FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF33 + 00FF330101010000660000660000660000660000660000660000660000660000 + 6601010100336600336600336600336600336600336600336600336600336601 + 0101006666006666006666006666006666006666006666006666006666010101 + 00996600996600996600996600996600996600996600996600996601010100CC + 6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6601010100FF6600 + FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF66010101000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000003300003300003300003300 + 0033000033000033000033000033000101010066000066000066000066000066 + 0000660000660000660000660001010100990000990000990000990000990000 + 990000990000990000990001010100CC0000CC0000CC0000CC0000CC0000CC00 + 00CC0000CC0000CC0001010100FF0000FF0000FF0000FF0000FF0000FF0000FF + 0000FF0000FF0001010100003300003300003300003300003300003300003300 + 0033000033010101003333003333003333003333003333003333003333003333 + 0033330101010066330066330066330066330066330066330066330066330066 + 3301010100993300993300993300993300993300993300993300993300993301 + 010100CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC3300CC33010101 + 00FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF3300FF330101010000 + 6600006600006600006600006600006600006600006600006601010100336600 + 3366003366003366003366003366003366003366003366010101006666006666 + 0066660066660066660066660066660066660066660101010099660099660099 + 6600996600996600996600996600996600996601010100CC6600CC6600CC6600 + CC6600CC6600CC6600CC6600CC6600CC6601010100FF6600FF6600FF6600FF66 + 00FF6600FF6600FF6600FF6600FF660101010000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000033000033000033000033000033000033000033 + 0000330000330001010100660000660000660000660000660000660000660000 + 6600006600010101009900009900009900009900009900009900009900009900 + 00990001010100CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC + 0001010100FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0001 + 0101000033000033000033000033000033000033000033000033000033010101 + 0033330033330033330033330033330033330033330033330033330101010066 + 3300663300663300663300663300663300663300663300663301010100993300 + 993300993300993300993300993300993300993300993301010100CC3300CC33 + 00CC3300CC3300CC3300CC3300CC3300CC3300CC3301010100FF3300FF3300FF + 3300FF3300FF3300FF3300FF3300FF3300FF3301010100006600006600006600 + 0066000066000066000066000066000066010101003366003366003366003366 + 0033660033660033660033660033660101010066660066660066660066660066 + 6600666600666600666600666601010100996600996600996600996600996600 + 996600996600996600996601010100CC6600CC6600CC6600CC6600CC6600CC66 + 00CC6600CC6600CC6601010100FF6600FF6600FF6600FF6600FF6600FF6600FF + 6600FF6600FF6601010100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000330000330000330000330000330000330000330000330000330001 + 0101006600006600006600006600006600006600006600006600006600010101 + 00990000990000990000990000990000990000990000990000990001010100CC + 0000CC0000CC0000CC0000CC0000CC0000CC0000CC0000CC0001010100FF0000 + FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00010101000033000033 + 0000330000330000330000330000330000330000330101010033330033330033 + 3300333300333300333300333300333300333301010100663300663300663300 + 6633006633006633006633006633006633010101009933009933009933009933 + 00993300993300993300993300993301010100CC3300CC3300CC3300CC3300CC + 3300CC3300CC3300CC3300CC3301010100FF3300FF3300FF3300FF3300FF3300 + FF3300FF3300FF3300FF33010101000066000066000066000066000066000066 + 0000660000660000660101010033660033660033660033660033660033660033 + 6600336600336601010100666600666600666600666600666600666600666600 + 6666006666010101009966009966009966009966009966009966009966009966 + 00996601010100CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC6600CC + 6601010100FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6600FF6601 + 0101000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000001010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101010101010101 + 0101010101010101010101010101010101010101010101010101} + OnMouseDown = imgPaletteMouseDown + OnMouseMove = imgPaletteMouseMove + end + end + end + object SpTBXPanel1: TSpTBXPanel + Left = 0 + Top = 0 + Width = 213 + Height = 26 + Caption = 'SpTBXPanel1' + Align = alTop + TabOrder = 1 + OnDrawBackground = SpTBXPanel1DrawBackground + DesignSize = ( + 213 + 26) + object btnColorNone: TSpTBXSpeedButton + Left = 170 + Top = 3 + Width = 20 + Height = 20 + Anchors = [akTop, akRight] + OnClick = btnColorNoneClick + OnMouseEnter = btnColorNoneMouseEnter + OnMouseLeave = btnColorNoneMouseLeave + Images = ImageList1 + ImageIndex = 1 + OnDraw = btnColorDialogDraw + end + object btnColorDialog: TSpTBXSpeedButton + Left = 190 + Top = 3 + Width = 20 + Height = 20 + Anchors = [akTop, akRight] + OnClick = btnColorDialogClick + OnMouseEnter = btnColorDialogMouseEnter + OnMouseLeave = btnColorDialogMouseLeave + Images = ImageList1 + ImageIndex = 0 + OnDraw = btnColorDialogDraw + end + object btnColor: TSpTBXSpeedButton + Left = 2 + Top = 2 + Width = 50 + Height = 22 + OnDraw = btnColorDraw + end + object btnLabel: TSpTBXLabel + Left = 58 + Top = 3 + Width = 47 + Height = 19 + Caption = 'btnLabel' + end + end + object Timer1: TTimer + Enabled = False + Interval = 25 + OnTimer = Timer1Timer + Left = 112 + Top = 152 + end + object ImageList1: TImageList + Left = 72 + Top = 152 + Bitmap = { + 494C010105000A00040010001000FFFFFFFFFF00FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000002000000001002000000000000020 + 00000000000000000000000000000000000000000000A1A1A100000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000A5A5A500FBF6F200A5A5A500A5A5 + A500000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000AAAAAA00F6EDE400F3E6 + D900AAAAAA000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000AFAFAF00FBF6F200F5EB + E100F3E6D900AFAFAF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000B4B4B400FBF6 + F200F5EBE100F3E6D900B4B4B400000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000BABA + BA00FBF6F200F5EBE100F3E6D900BABABA000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000BFBFBF00FBF6F200F5EBE100F4E7DC00AC8E8400954A2F00974B2D000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000C4C4C400FBF6F200D0AD9F009B523700C6835600C67D4A00984B + 2F00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000B5978C00A0593D00D4A07A00D3996A00C7834A00A259 + 3700000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000A25B3C00DBB29200DDB18A00D59C6C00CC884F00C77D + 4300A75D39000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000AD684600DFB39000E7C4A900E1B69200D3915B00D088 + 4C00CC834900AC64400000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000AD684700C0876B00E3BDA000E1B08A00D793 + 5A00D48E5300D08A5100B6704700000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000C48E7000E4BB9C00E1B1 + 8800D8965F00D7935900D5915900B47453000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000C9957700E8C1 + 9F00E4B58A00DD9E6800DA9A6200B97B58000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000D6AB + 8E00E8C2A200E6BA9200C98E6700000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000C2856000C1845F0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000E1818F00D1496C00C92B6300C72D7700CF519F00DF8DCB000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000E87C + 7A00D6121900E1405900EE638400F373A100F071B200E45AB600D236B400C41B + BB00DC91E1000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000040404000404 + 0400040404000404040004040400040404000404040004040400040404000404 + 0400040404000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000EB6E5100E952 + 4000F8858400FF969F00FF749100FF609A00FF60B700FF78D800FC92EF00E871 + EA00B632CC00BC6ED90000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000161616001616 + 1600222222001616160016161600222222001616160016161600161616001616 + 160016161600000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFF + FF00FFFFFF0000000000000000000000000000000000F69E6D00F0774400FCA6 + 9200FF7B6F00FF515800FF5A7900FF5E9B00FF5CBC00FF57DA00FF4CF700F17B + FF00D685F1009734CF00BA90E400000000000000000000000000B07A5800B07A + 5800B07A580000000000DD9BD900DD9BD900DD9BD90000000000B177FF00B177 + FF00B177FF000000000000000000000000000000000000000000000033000033 + 3300003333000033330033330000333300003333000033000000330033003300 + 330033003300000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFF + FF00FFFFFF0000000000000000000000000000000000F87E0F00FBB98E00FF97 + 6A00FF795B00FF716B00FF768900FF7CAD00FF7BCD00FF71ED00F763FF00D952 + FF00CF7CFF00B373EC00661AD000000000000000000000000000B07A5800B07A + 5800B07A580000000000DD9BD900DD9BD900DD9BD90000000000B177FF00B177 + FF00B177FF000000000000000000000000000000000000000000000066000033 + 6600006666000066330033660000666600006633000066000000660033006600 + 660033006600000000000000000000000000000000000000000000000000C0C0 + C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0 + C000C0C0C000000000000000000000000000FDC86100FDBE6000FFD09C00FFA5 + 5B00FFA27100FF9A8400FF979B00FF9FBF00FF9FE000FE92FB00E77CFF00C966 + FF00A84FFF00BE95FD007240DD00A086E7000000000000000000B07A5800B07A + 5800B07A580000000000DD9BD900DD9BD900DD9BD90000000000B177FF00B177 + FF00B177FF000000000000000000000000000000000000000000003399000066 + 9900009999000099660066990000999900009933000099000000990066009900 + 990033009900000000000000000000000000000000000000000000000000C0C0 + C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0 + C000C0C0C000000000000000000000000000F7CA3200FEDD8000FFD16C00FFC7 + 6B00FFC78500FFC49E00FFBDB300FFBFD000FFBFF100F4B0FF00D696FF00B679 + FF00955EFF009977FF008265EC00664BDD000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000033CC000066 + CC0000CCCC0000CC660066CC0000CCCC0000CC660000CC000000CC006600CC00 + CC006600CC00000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFF + FF00FFFFFF00000000000000000000000000F2DC1B00FFF29000FFE96200FFE8 + 7600FFE79300FFE7B000FFE6CA00FFE5E500FCDEFD00E1C6FF00C2A6FF00A184 + FF007E66FF007664FF00887BF6003D2EDB000000000000000000B2EBD000B2EB + D000B2EBD000000000006DCC50006DCC50006DCC500000000000EBB06000EBB0 + 6000EBB0600000000000000000000000000000000000000000000033FF000066 + FF0000FFFF0000FF660099FF0000FFFF0000FF660000FF000000FF009900CC00 + FF006600FF00000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFF + FF00FFFFFF00000000000000000000000000EBED1800F9FA9200FAFD6400FAFD + 7B00F9FD9800FAFDB500FAFED300FAFEEF00EFF3FF00D0D5FF00AFB3FF008D91 + FF006C6FFF006769FF008283FB002C2FDE000000000000000000B2EBD000B2EB + D000B2EBD000000000006DCC50006DCC50006DCC500000000000EBB06000EBB0 + 6000EBB0600000000000000000000000000000000000000000000033FF003399 + FF0033FFFF0033FF990099FF3300FFFF3300FF993300FF333300FF339900FF33 + FF006633FF00000000000000000000000000000000000000000000000000C0C0 + C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0 + C000C0C0C000000000000000000000000000D4ED3000E4F58200E5FF6F00E0FF + 7900E0FF9500DFFFAF00DCFFC700DCFFE000D9FEFA00C5E9FF00A7CAFF0087AA + FF00698BFF00788EFF007386FB00475AE6000000000000000000B2EBD000B2EB + D000B2EBD000000000006DCC50006DCC50006DCC500000000000EBB06000EBB0 + 6000EBB0600000000000000000000000000000000000000000003366FF006699 + FF0066FFFF0066FF9900CCFF6600FFFF6600FF996600FF666600FF66CC00FF66 + FF009966FF00000000000000000000000000000000000000000000000000C0C0 + C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0 + C000C0C0C000000000000000000000000000CBEE5700C6EB6700DDFF9B00C5FF + 6F00C3FF8C00BEFFA100B9FFB300BDFFCF00BDFFEE00B0F8FF0099DEFF007EC2 + FF0063A3FF009EBDFF005983F8007792EF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000807CFF0099CC + FF0099FFFF0099FFCC00CCFF9900FFFF9900FFCC9900FF999900FF99CC00FF99 + FF009999FF00000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFF + FF00FFFFFF0000000000000000000000000000000000A0E13800CBF69700AEFF + 6C00A4FF7A009DFF8D009BFFA300A4FFC400A2FFDF0097FFF80085EFFF006ED3 + FF0078C5FF0092C5FC001C73F4000000000000000000000000006B6FFE006B6F + FE006B6FFE000000000073AAFF0073AAFF0073AAFF000000000067D5F00067D5 + F00067D5F00000000000000000000000000000000000000000009999FF0099CC + FF0099FFFF0099FFCC00CCFF9900FFFF9900FFCCCC00FFCCCC00FF99CC00FF99 + FF00CC99FF00000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00C0C0C000C0C0C000FFFFFF00FFFFFF00C0C0C000C0C0C000FFFF + FF00FFFFFF0000000000000000000000000000000000A1E5550094E25700BBF9 + 9D008AFF6E0079FF760082FF970089FFB60087FFD1007EFFEC006DFBFE0076E8 + FF009BDFFC0054BAFB0075B9FA000000000000000000000000006B6FFE006B6F + FE006B6FFE000000000073AAFF0073AAFF0073AAFF000000000067D5F00067D5 + F00067D5F0000000000000000000000000000000000000000000CCCCFF00CCCC + FF00CCFFFF00CCFFCC00CCFFCC00FFFFCC00FFCCCC00FFCCCC00FFCCCC00FFCC + FF00CCCCFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000006EDD3B0074E1 + 5800A1F699009EFFA6007BFF9E0070FFAE0070FFC7007CFFE300A5FFFA0098F4 + FB0055D8F50052CCFB00000000000000000000000000000000006B6FFE006B6F + FE006B6FFE000000000073AAFF0073AAFF0073AAFF000000000067D5F00067D5 + F00067D5F0000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000066DF + 56003AD73D006AE67C0088F3AA0096F9C40097FBD30087F7DB0068EFE0001EE7 + E6006DE6F3000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000058DF740037D96E0022D67A0025D892003BDFB20065E8D3000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000040000000200000000100010000000000000100000000000000000000 + 000000000000000000000000FFFFFF00BFFF0000000000000FFF000000000000 + 87FF00000000000083FF000000000000C1FF000000000000E0FF000000000000 + F01F000000000000F80F000000000000FC0F000000000000FC07000000000000 + FC03000000000000FE01000000000000FF80000000000000FFC0000000000000 + FFE1000000000000FFF3000000000000FFFFFFFFF81FFFFFFFFFFFFFE007FFFF + C007C003C003FFFFC007C0038001C447C007C0038001C447C007C0030000C447 + C007C0030000FFFFC007C0030000C447C007C0030000C447C007C0030000C447 + C007C0030000FFFFC007C0038001C447C007C0038001C447C007C003C003C447 + FFFFFFFFE007FFFFFFFFFFFFF81FFFFF} + end + object ColorDialog1: TColorDialog + Options = [cdFullOpen] + Left = 144 + Top = 152 + end +end diff --git a/internal/2.4.4/1/Source/SpTBXColorPickerForm.pas b/internal/2.4.4/1/Source/SpTBXColorPickerForm.pas new file mode 100644 index 0000000..f09bed5 --- /dev/null +++ b/internal/2.4.4/1/Source/SpTBXColorPickerForm.pas @@ -0,0 +1,534 @@ +unit SpTBXColorPickerForm; + +{============================================================================== +Version 2.4.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]'. + +History: + - + +==============================================================================} + +interface + +{$BOOLEVAL OFF} // Unit depends on short-circuit boolean evaluation + +uses + Windows, Messages, Classes, SysUtils, Controls, Graphics, ImgList, Forms, + Menus, StdCtrls, ExtCtrls, ActnList, Dialogs, + TB2Dock, TB2Toolbar, TB2Item, TB2ExtItems, + SpTBXSkins, SpTBXItem, SpTBXControls, SpTBXEditors, SpTBXFormPopupMenu, + SpTBXExtEditors, SpTBXTabs; + +type + { TSpTBXColorPickerDragObject } + + TSpTBXColorPickerDragObject = class(TDragControlObject) + protected + function GetDragCursor(Accepted: Boolean; X, Y: Integer): TCursor; override; + end; + + { TSpTBXColorEditPopupMenu } + + TSpTBXColorEditPopupMenu = class(TSpTBXFormPopupMenu) + protected + procedure DoGetPopupFormClass(var AFormClass: TCustomFormClass); override; + function InternalPopup(X, Y: Integer; ForceFocus: Boolean; PopupControl: TControl = nil): Boolean; override; + public + constructor Create(AOwner: TComponent); override; + end; + + { TSpTBXColorPickerForm } + + TSpTBXColorPickerForm = class(TForm) + Timer1: TTimer; + imgColorPicker: TImage; + SpTBXTabControl1: TSpTBXTabControl; + SpTBXTabItem1: TSpTBXTabItem; + SpTBXTabSheet1: TSpTBXTabSheet; + SpTBXTabItem2: TSpTBXTabItem; + SpTBXTabSheet2: TSpTBXTabSheet; + imgPalette: TImage; + btnColorPicker: TSpTBXSpeedButton; + SpTBXTabItem3: TSpTBXTabItem; + SpTBXTabSheet3: TSpTBXTabSheet; + ImageList1: TImageList; + SpTBXColorListBox1: TSpTBXColorListBox; + ColorDialog1: TColorDialog; + SpTBXPanel1: TSpTBXPanel; + btnColorNone: TSpTBXSpeedButton; + btnColorDialog: TSpTBXSpeedButton; + btnColor: TSpTBXSpeedButton; + btnLabel: TSpTBXLabel; + procedure Timer1Timer(Sender: TObject); + procedure imgPaletteMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure btnColorPickerStartDrag(Sender: TObject; + var DragObject: TDragObject); + procedure FormCreate(Sender: TObject); + procedure btnColorPickerEndDrag(Sender, Target: TObject; X, Y: Integer); + procedure FormResize(Sender: TObject); + procedure SpTBXTabControl1ActiveTabChange(Sender: TObject; + TabIndex: Integer); + procedure SpTBXColorListBox1Click(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure btnColorDraw(Sender: TObject; ACanvas: TCanvas; + ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); + procedure btnColorNoneClick(Sender: TObject); + procedure btnColorNoneMouseEnter(Sender: TObject); + procedure btnColorDialogClick(Sender: TObject); + procedure btnColorDialogMouseEnter(Sender: TObject); + procedure btnColorDialogDraw(Sender: TObject; ACanvas: TCanvas; + ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); + procedure SpTBXPanel1DrawBackground(Sender: TObject; ACanvas: TCanvas; + ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); + procedure btnColorDialogMouseLeave(Sender: TObject); + procedure btnColorNoneMouseLeave(Sender: TObject); + procedure imgPaletteMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + protected + FSelectedColor: TColor; + FPrevLabelColor: TColor; + FColorPickerDragObject: TSpTBXColorPickerDragObject; + procedure CenterImages; + public + function GetSelectedColor: TColor; + procedure SetSelectedColor(AColor: TColor); + procedure UpdateColorLabel(AColor: TColor; AButtonType: Integer = -1); + property SelectedColor: TColor read FSelectedColor write FSelectedColor; + end; + +{ Helpers } +procedure SpScreenShot(SourceR: TRect; DestCanvas: TCanvas; DestR: TRect); +procedure SpScreenShotMagnify(DestCanvas: TCanvas; DestR: TRect; DrawCrosshair: Boolean; out CenterColor: TColor; ZoomFactor: Double = 200); + +const + crSpTBXEyeDropper = 103; // Cursor ID used for Eye Dropper cursor + +resourcestring + SSpTBXTransparentColor = 'Transparent Color'; + SSpTBXColorPicker = 'Color Picker'; + SSpTBXClickAndDrag = 'Drag && Drop'; + +implementation + +{$R *.dfm} + +uses + Themes, UxTheme; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Helpers } + +procedure SpScreenShot(SourceR: TRect; DestCanvas: TCanvas; DestR: TRect); +var + DesktopDC: HDC; +begin + DesktopDC := GetDC(0); + try + Windows.StretchBlt( + DestCanvas.Handle, DestR.Left, DestR.Top, DestR.Right - DestR.Left, DestR.Bottom - DestR.Top, + DesktopDC, SourceR.Left, SourceR.Top, SourceR.Right - SourceR.Left, SourceR.Bottom - SourceR.Top, + SRCCOPY); + finally + ReleaseDC(0, DesktopDC); + end; +end; + +procedure SpScreenShotMagnify(DestCanvas: TCanvas; DestR: TRect; DrawCrosshair: Boolean; out CenterColor: TColor; ZoomFactor: Double = 200); +var + W, H, zoomW, zoomH: integer; + CursorP, CenterP: TPoint; + SourceR: TRect; + Multiplier: Double; +begin + GetCursorPos(CursorP); + + W := DestR.Right - DestR.Left; + H := DestR.Bottom - DestR.Top; + + // Get the zoom width and height + if ZoomFactor < 0 then ZoomFactor := 100; + Multiplier := ZoomFactor / 100; + zoomW := Round(W * Multiplier); + zoomH := Round(H * Multiplier); + + // Get the zoomed Rect + SourceR.Left := CursorP.X - (zoomW div 2); + SourceR.Top := CursorP.Y - (zoomH div 2); + SourceR.Right := SourceR.Left + zoomW; + SourceR.Bottom := SourceR.Top + zoomH; + + DestCanvas.Lock; + try + // Draw the screenshot + DestCanvas.FillRect(DestR); + SpScreenShot(SourceR, DestCanvas, DestR); + CenterP := Point(W div 2, H div 2); + CenterColor := DestCanvas.Pixels[CenterP.X, CenterP.Y]; + + // Draw the crosshair + if DrawCrosshair then begin + DestCanvas.MoveTo(CenterP.X - (CenterP.X div 2), CenterP.Y); + DestCanvas.LineTo(CenterP.X + (CenterP.X div 2), CenterP.Y); + DestCanvas.MoveTo(CenterP.X, CenterP.Y - (CenterP.Y div 2)); + DestCanvas.LineTo(CenterP.X, CenterP.Y + (CenterP.Y div 2)); + end; + finally + DestCanvas.Unlock; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXColorPickerDragObject } + +function TSpTBXColorPickerDragObject.GetDragCursor(Accepted: Boolean; X, + Y: Integer): TCursor; +begin + // Make sure we always use crSpTBXEyeDropper + Result := crSpTBXEyeDropper; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXColorEditPopupMenu } + +constructor TSpTBXColorEditPopupMenu.Create(AOwner: TComponent); +begin + inherited; + BorderStyle := pbsSizeableRightBottom; +end; + +procedure TSpTBXColorEditPopupMenu.DoGetPopupFormClass(var AFormClass: TCustomFormClass); +begin + AFormClass := TSpTBXColorPickerForm; + inherited DoGetPopupFormClass(AFormClass); +end; + +function TSpTBXColorEditPopupMenu.InternalPopup(X, Y: Integer; + ForceFocus: Boolean; PopupControl: TControl): Boolean; +begin + if Assigned(PopupControl) and (PopupControl is TSpTBXColorEdit) then + SkinType := TSpTBXColorEdit(PopupControl).SkinType; + Result := inherited InternalPopup(X, Y, ForceFocus, PopupControl); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXColorPickerForm } + +procedure TSpTBXColorPickerForm.FormCreate(Sender: TObject); +begin + btnColorPicker.Caption := SSpTBXClickAndDrag; + SpTBXTabControl1.DoubleBuffered := True; + imgPalette.Cursor := crSpTBXEyeDropper; +end; + +procedure TSpTBXColorPickerForm.FormDestroy(Sender: TObject); +begin + FreeAndNil(FColorPickerDragObject); +end; + +procedure TSpTBXColorPickerForm.FormResize(Sender: TObject); +begin + CenterImages; +end; + +procedure TSpTBXColorPickerForm.FormShow(Sender: TObject); +var + T: TSpTBXSkinType; +begin + if Assigned(ActiveFormPopupMenu) then begin + T := ActiveFormPopupMenu.SkinType; + SkinManager.ChangeControlSkinType(Self, T); + if T <> sknSkin then + SpTBXTabControl1.TabBackgroundColor := clBtnFace; + end; + + UpdateColorLabel(GetSelectedColor); + CenterImages; +end; + +procedure TSpTBXColorPickerForm.CenterImages; +begin + // Center the images + case SpTBXTabControl1.ActiveTabIndex of + 0: begin + imgPalette.Left := (imgPalette.Parent.Width - imgPalette.Width) div 2; + imgPalette.Top := (imgPalette.Parent.Height - imgPalette.Height) div 2; + end; + 2: begin + imgColorPicker.Picture := nil; + end; + end; +end; + +procedure TSpTBXColorPickerForm.btnColorDraw(Sender: TObject; + ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +begin + if PaintStage = pstPrePaint then begin + PaintDefault := False; + InflateRect(ARect, -3, -3); + if btnColor.CaptionGlowColor = clNone then + SpDrawCheckeredBackground(ACanvas, ARect) + else begin + ACanvas.Brush.Color := btnColor.CaptionGlowColor; + ACanvas.FillRect(ARect); + end; + SpDrawRectangle(ACanvas, ARect, 0, clBtnShadow, clBtnHighlight); + end; +end; + +procedure TSpTBXColorPickerForm.btnColorDialogClick(Sender: TObject); +var + EditButton: TSpTBXColorEditButton; + P: TSpTBXFormPopupMenu; +begin + P := ActiveFormPopupMenu; + if Assigned(P) and Assigned(P.PopupComponent) and (P.PopupComponent is TSpTBXColorEditButton) then begin + EditButton := TSpTBXColorEditButton(P.PopupComponent); + Parent.Visible := False; + ColorDialog1.Color := btnColor.CaptionGlowColor; + if ColorDialog1.Execute then + EditButton.SelectedColor := ColorDialog1.Color; + P.ClosePopup(False); + end; +end; + +procedure TSpTBXColorPickerForm.btnColorDialogDraw(Sender: TObject; + ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +// Used by btnColorDialog and btnColorNone +var + B: TSpTBXSpeedButton; + Flags: Integer; + State: TSpTBXSkinStatesType; +begin + if (PaintStage = pstPrePaint) and (Sender is TSpTBXSpeedButton) then begin + PaintDefault := False; + B := Sender as TSpTBXSpeedButton; + if B.MouseInControl then begin + case SpTBXSkinType(SpTBXPanel1.SkinType) of + sknNone: + PaintDefault := True; + sknWindows: + begin + if B.Pushed then Flags := TS_PRESSED + else Flags := TS_HOT; + DrawThemeBackground(ThemeServices.Theme[teToolBar], ACanvas.Handle, TP_BUTTON, Flags, ARect, nil); + end; + sknSkin: + begin + if B.Pushed then State := sknsPushed + else State := sknsHotTrack; + CurrentSkin.PaintBackground(ACanvas, ARect, skncToolbarItem, State, True, True); + end; + end; + end; + end; +end; + +procedure TSpTBXColorPickerForm.btnColorDialogMouseEnter(Sender: TObject); +begin + FPrevLabelColor := btnColor.CaptionGlowColor; + btnLabel.Caption := SSpTBXColorPicker; +end; + +procedure TSpTBXColorPickerForm.btnColorDialogMouseLeave(Sender: TObject); +begin + UpdateColorLabel(FPrevLabelColor); +end; + +procedure TSpTBXColorPickerForm.btnColorNoneClick(Sender: TObject); +begin + SetSelectedColor(clNone); +end; + +procedure TSpTBXColorPickerForm.btnColorNoneMouseEnter(Sender: TObject); +begin + FPrevLabelColor := btnColor.CaptionGlowColor; + UpdateColorLabel(clNone); +end; + +procedure TSpTBXColorPickerForm.btnColorNoneMouseLeave(Sender: TObject); +begin + UpdateColorLabel(FPrevLabelColor); +end; + +procedure TSpTBXColorPickerForm.btnColorPickerStartDrag(Sender: TObject; + var DragObject: TDragObject); +begin + FPrevLabelColor := btnColor.CaptionGlowColor; + Timer1.Enabled := True; + FColorPickerDragObject := TSpTBXColorPickerDragObject.Create(btnColorPicker); + DragObject := FColorPickerDragObject; +end; + +procedure TSpTBXColorPickerForm.btnColorPickerEndDrag(Sender, Target: TObject; X, + Y: Integer); +var + CursorP: TPoint; +begin + Timer1.Enabled := False; + if imgColorPicker.Visible then begin + imgColorPicker.Visible := False; + btnColorPicker.Visible := True; + SpTBXTabControl1.InvalidateBackground; + end; + + if Assigned(FColorPickerDragObject) then begin + GetCursorPos(CursorP); + CursorP := ScreenToClient(CursorP); + if FColorPickerDragObject.Dropped and not PtInRect(ClientRect, CursorP) then + SetSelectedColor(btnColor.CaptionGlowColor) + else + UpdateColorLabel(FPrevLabelColor); + FreeAndNil(FColorPickerDragObject); + end; +end; + +procedure TSpTBXColorPickerForm.imgPaletteMouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + SetSelectedColor(btnColor.CaptionGlowColor); +end; + +procedure TSpTBXColorPickerForm.imgPaletteMouseMove(Sender: TObject; Shift: TShiftState; + X, Y: Integer); +var + C: TColor; +begin + C := imgPalette.Picture.Bitmap.Canvas.Pixels[X, Y]; + if C <> $00010101 then + UpdateColorLabel(C); +end; + +procedure TSpTBXColorPickerForm.SpTBXTabControl1ActiveTabChange(Sender: TObject; + TabIndex: Integer); +begin + CenterImages; +end; + +procedure TSpTBXColorPickerForm.SpTBXColorListBox1Click(Sender: TObject); +begin + SetSelectedColor(SpTBXColorListBox1.Selected); +end; + +procedure TSpTBXColorPickerForm.SpTBXPanel1DrawBackground(Sender: TObject; + ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +begin + if PaintStage = pstPrePaint then begin + PaintDefault := False; + SpDrawXPDock(ACanvas, ARect, SpTBXPanel1.SkinType); + SpDrawXPToolbar(ACanvas, ARect, SpTBXPanel1.SkinType, True, False, False, True, False); + end; +end; + +procedure TSpTBXColorPickerForm.Timer1Timer(Sender: TObject); +var + CursorP: TPoint; + Zoom: Double; + C: TColor; +begin + if not IsIconic(Application.Handle) then begin + GetCursorPos(CursorP); + CursorP := ScreenToClient(CursorP); + if btnColorPicker.Dragging and not PtInRect(ClientRect, CursorP) then begin + if not imgColorPicker.Visible then begin + imgColorPicker.Visible := True; + btnColorPicker.Visible := False; + SpTBXTabControl1.InvalidateBackground; + end; + Zoom := 100 / 5; // x5 factor + SpScreenShotMagnify(imgColorPicker.Canvas, Rect(0, 0, imgColorPicker.Width, imgColorPicker.Height), True, C, Zoom); + UpdateColorLabel(C); + end + else + if imgColorPicker.Visible then begin + imgColorPicker.Visible := False; + btnColorPicker.Visible := True; + SpTBXTabControl1.InvalidateBackground; + end; + end; +end; + +function TSpTBXColorPickerForm.GetSelectedColor: TColor; +var + B: TSpTBXColorEditButton; +begin + Result := clNone; + if Assigned(ActiveFormPopupMenu) then + if Assigned(ActiveFormPopupMenu.PopupComponent) and (ActiveFormPopupMenu.PopupComponent is TSpTBXColorEditButton) then begin + B := TSpTBXColorEditButton(ActiveFormPopupMenu.PopupComponent); + Result := B.SelectedColor; + end; +end; + +procedure TSpTBXColorPickerForm.SetSelectedColor(AColor: TColor); +var + B: TSpTBXColorEditButton; +begin + // Inform the ActiveFormPopupMenu that a selection was made. + UpdateColorLabel(AColor); + FSelectedColor := AColor; + if Assigned(ActiveFormPopupMenu) then begin + if Assigned(ActiveFormPopupMenu.PopupComponent) and (ActiveFormPopupMenu.PopupComponent is TSpTBXColorEditButton) then begin + B := TSpTBXColorEditButton(ActiveFormPopupMenu.PopupComponent); + B.SelectedColor := AColor; + end; + ActiveFormPopupMenu.ClosePopup(True); + end; +end; + +procedure TSpTBXColorPickerForm.UpdateColorLabel(AColor: TColor; AButtonType: Integer = -1); +begin + btnColor.CaptionGlowColor := AColor; + if AColor = clNone then + btnLabel.Caption := SSpTBXTransparentColor + else + btnLabel.Caption := SpColorToHTML(AColor); +end; + +end. diff --git a/internal/2.4.4/1/Source/SpTBXControls.pas b/internal/2.4.4/1/Source/SpTBXControls.pas new file mode 100644 index 0000000..7b318a5 --- /dev/null +++ b/internal/2.4.4/1/Source/SpTBXControls.pas @@ -0,0 +1,4306 @@ +unit SpTBXControls; + +{============================================================================== +Version 2.4.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: +2 December 2009 - version 2.4.4 + - Fixed TSpTBXLabel accel key handling, thanks to Costas + Stergiou for reporting this. + - Fixed incorrect hint handling on TSpTBXTextObject. + - Added Padding property to various controls, thanks to + Boris Yankov for reporting this. + +13 September 2009 - version 2.4.3 + - Fixed incorrect TSpTBXSpeedButton painting, when Flat is + set to true the button should be painted as a toolbar item, + thanks to Yann Papouin for reporting this. + +8 May 2009 - version 2.4.2 + - Added AllowAllUp property to TSpTBXSpeedButton. + +15 March 2009 - version 2.4.1 + - Added GlyphLayout property to TSpTBXButton/TSpTBXSpeedButton. + - Added Flat property to TSpTBXButton/TSpTBXSpeedButton. + - Fixed TSpTBXTrackBar bug, the Frequency property didn't work, + thanks to Alfred Vink for reporting this. + +17 January 2009 - version 2.4 + - No changes. + +28 September 2008 - version 2.3.1 + - Fixed incorrect TSpTBXGroupBox painting, the control was not + repainted when the font was changed, thanks to Yury Plashenkov + for reporting this. + +26 September 2008 - version 2.3 + - Removed LinkFont property from TSpTBXTextObject, having 2 font + properties to control the text state was a bad idea. + +29 July 2008 - version 2.2 + - Fixed incorrect ProgressBar painting on Windows Vista, + thanks to Arvid for reporting this. + +22 June 2008 - version 2.1 + - No changes. + +3 May 2008 - version 2.0 + - No changes. + +2 April 2008 - version 1.9.5 + - Improved the background painting of TSpTBXPanel. + +3 February 2008 - version 1.9.4 + - No changes. + +19 January 2008 - version 1.9.3 + - Fixed incorrect Autosizing of TSpTBXTextControl, thanks + to Alexey Naumov for reporting this. + +26 December 2007 - version 1.9.2 + - Added State parameter to TSpTBXTextControl.OnDrawCaption + - Fixed incorrect Default property handling of TSpTBXButton, + thanks to Karpushin Matvey and Beta Xiong for reporting this. + +1 December 2007 - version 1.9.1 + - Added various painting enhancements made by Jim. + - Fixed incorrect caption color on the controls when + the Font is changed, thanks to Arvid and Zunyite for + reporting this. + - Fixed incorrect nested panel painting (canvas was not locked), + thanks to Jim for reporting this. + +20 November 2007 - version 1.9 + - Removed TBX dependency. + +8 February 2007 - version 1.8.3 + - Added GripHotTrack property to TSpTBXSplitter. + +17 December 2006 - version 1.8.2 + - Added AutoSize property to TSpTBXPanel. + - Fixed incorrect resizing behavior on TSpTBXSplitter when a + DockablePanel was adjacent. + +24 November 2006 - version 1.8.1 + - Improved TSpTBXPanel painting, thanks to Jim Kueneman for + his code donation. + - Fixed incorrect focus behavior on TSpTBXRadioButton when used + on a groupbox, thanks to Andrew for reporting this. + +27 August 2006 - version 1.8 + - Added DropDownArrow property to TSpTBXButton and TSpTBXSpeedButton. + - Fixed incorrect TSpTBXGroupBox painting when changing the + Enabled property, thanks to Tomaz Kunaver for reporting this. + +15 June 2006 - version 1.7 + - Fixed incorrect TSpTBXButton painting when using a bitmap + skin and the DropDownMenu is shown, thanks to Boris Yankov + for reporting this. + +4 May 2006 - version 1.6 + - New component added, TSpTBXRadioGroup. + +12 April 2006 - version 1.5 + - No changes. + +27 February 2006 - version 1.4 + - Added GroupIndex property to TSpTBXButton and TSpTBXSpeedButton. + +10 February 2006 - version 1.3 + - New component added, TSpTBXSpeedButton. + - New component added, TSpTBXSplitter. + - Fixed incorrect TSpTBXButton behavior when trying to close the + DropDownMenu clicking the button, thanks to Alexey Naumov for + reporting this. + +==============================================================================} + +interface + +{$BOOLEVAL OFF} // Unit depends on short-circuit boolean evaluation + +uses + Windows, Messages, Classes, SysUtils, Forms, Controls, Graphics, ImgList, + Menus, StdCtrls, ExtCtrls, ComCtrls, ActnList, + {$IFNDEF UNICODE} + TntClasses, TntControls, + {$ENDIF} + TB2Dock, TB2Toolbar, TB2Item, SpTBXItem, SpTBXSkins; + +{$IFDEF UNICODE} +type + TTntStrings = TStrings; +{$ENDIF} + +const + ConstStatesCount = 4; // Buttons have 4 states (normal, hottrack, pushed, disabled) + ConstInitRepeatPause = 400; // Delay of the first repeated click (ms) + ConstRepeatPause = 100; // Interval of the repeated clicks (ms) + CM_SPGROUPINDEXUPDATE = CM_BASE + 2222; // Message sent to the controls to update its state based on the GroupIndex + CM_SPTBXCONTROLSINVALIDATE = CM_BASE + 3333; // Message sent to SpTBX controls to invalidate the background + +type + TSpTBXTextObject = class; + + TSpTBXPanelBorder = ( + pbrRaised, + pbrDoubleRaised, + pbrSunken, + pbrDoubleSunken, + pbrBumped, + pbrEtched, + pbrFramed + ); + + TSpTBXProgressCaption = ( + pctNone, + pctDefault, + pctPercentage, + pctProgress + ); + + TSpTBXTickMark = ( + tmxBottomRight, + tmxTopLeft, + tmxBoth, + tmxCenter + ); + + TSpTBXCanResizeEvent = procedure(Sender: TObject; var NewSize: Integer; var Accept: Boolean) of object; + + { TSpTBXPanel } + + TSpTBXCustomPanel = class(TSpTBXCustomControl) + private + FBorders: Boolean; + FBorderType: TSpTBXPanelBorder; + FTBXStyleBackground: Boolean; + FSkinType: TSpTBXSkinType; + FOnDrawBackground: TSpTBXDrawEvent; + procedure SetBorders(const Value: Boolean); + procedure SetBorderType(const Value: TSpTBXPanelBorder); + procedure SetTBXStyleBackground(const Value: Boolean); + procedure SetSkinType(const Value: TSpTBXSkinType); + procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED; + procedure CMSpTBXControlsInvalidate(var Message: TMessage); message CM_SPTBXCONTROLSINVALIDATE; + procedure WMEraseBkgnd(var Message: TMessage); message WM_ERASEBKGND; + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + procedure WMWindowPosChanged(var Message: TWMWindowPosChanged); message WM_WINDOWPOSCHANGED; + protected + FBackground: TBitmap; + procedure AdjustClientRect(var Rect: TRect); override; + procedure CreateParams(var Params: TCreateParams); override; + procedure DrawBackground(ACanvas: TCanvas; ARect: TRect); virtual; + procedure DoDrawBackground(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + property Borders: Boolean read FBorders write SetBorders default True; + property BorderType: TSpTBXPanelBorder read FBorderType write SetBorderType default pbrEtched; + property ParentColor default False; + property TBXStyleBackground: Boolean read FTBXStyleBackground write SetTBXStyleBackground default False; + property OnDrawBackground: TSpTBXDrawEvent read FOnDrawBackground write FOnDrawBackground; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure InvalidateBackground(InvalidateChildren: Boolean = True); virtual; + published + property Caption; + property Hint; + property Color default clNone; + property SkinType: TSpTBXSkinType read FSkinType write SetSkinType default sknSkin; + end; + + TSpTBXPanel = class(TSpTBXCustomPanel) + private + FHotTracking: Boolean; + FHotTrack: Boolean; + FChildFocused: Boolean; + procedure SetHotTrack(const Value: Boolean); + procedure SetHotTracking(const Value: Boolean); + procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; + procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; + procedure CMFocusChanged(var Message: TCMFocusChanged); message CM_FOCUSCHANGED; + protected + procedure DrawBackground(ACanvas: TCanvas; ARect: TRect); override; + public + property HotTracking: Boolean read FHotTracking; + published + property Align; + property Anchors; + property AutoSize; + property BiDiMode; + property Constraints; + property UseDockManager; + property DockSite; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + {$IF CompilerVersion > 15} // For Delphi 2005 and up + property Padding; + {$IFEND} + property ParentBiDiMode; + property ParentColor; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowHint; + property TabOrder; + property TabStop; + property Visible; + {$IF CompilerVersion > 15} // For Delphi 2005 and up + property OnAlignInsertBefore; + property OnAlignPosition; + {$IFEND} + 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; + {$IF CompilerVersion > 15} // For Delphi 2005 and up + property Padding; + {$IFEND} + property ParentBiDiMode; + property ParentColor; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowHint; + property TabOrder; + property TabStop; + property Visible; + {$IF CompilerVersion > 15} // For Delphi 2005 and up + property OnAlignInsertBefore; + property OnAlignPosition; + {$IFEND} + property OnCanResize; + property OnClick; + property OnConstrainedResize; + property OnContextPopup; + property OnDockDrop; + property OnDockOver; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnGetSiteInfo; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnResize; + property OnStartDock; + property OnStartDrag; + property OnUnDock; + // TSpTBXCustomPanel properties + property Borders; + property BorderType; + property TBXStyleBackground; + property OnDrawBackground; + end; + + { TSpTBXTextObjectActionLink } + + {$IFNDEF UNICODE} + TSpTBXTextObjectActionLink = class(TControlActionLink) + protected + FUnicodeClient: TSpTBXTextObject; + procedure AssignClient(AClient: TObject); override; + function IsCaptionLinked: Boolean; override; + function IsCheckedLinked: Boolean; override; + function IsHintLinked: Boolean; override; + procedure SetCaption(const Value: String); override; + procedure SetChecked(Value: Boolean); override; + procedure SetHint(const Value: String); override; + procedure SetImageIndex(Value: Integer); override; + end; + {$ELSE} + TSpTBXTextObjectActionLink = class(TControlActionLink); + {$ENDIF} + + { TSpTBXTextObject } + + TSpTBXTextObject = class(TSpTBXCustomControl) + private + FAlignment: TAlignment; + FCaptionGlow: TSpGlowDirection; + FCaptionGlowColor: TColor; + FCaptionRoatationAngle: TSpTextRotationAngle; + FChecked: Boolean; + FDisabledIconCorrection: Boolean; + FDrawPushedCaption: Boolean; + FGlyphLayout: TSpGlyphLayout; + FImages: TCustomImageList; + FImageChangeLink: TChangeLink; + FImageIndex: TImageIndex; + FLinkText: WideString; + FLinkTextParams: WideString; + FMouseInControl: Boolean; + FPushed: Boolean; + FSkinType: TSpTBXSkinType; + FSpaceAsClick: Boolean; + FShowAccelChar: Boolean; + FUpdating: Boolean; + FWrapping: TTextWrapping; + FOnDraw: TSpTBXDrawEvent; + FOnDrawCaption: TSpTBXDrawTextEvent; + FOnDrawHint: TSpTBXDrawHintEvent; + FOnGetImageIndex: TSpTBXGetImageIndexEvent; + FOnMouseEnter: TNotifyEvent; + FOnMouseLeave: TNotifyEvent; + procedure ReadLinkFont(Reader: TReader); // [Backward-Compatibility] + procedure ImageListChange(Sender: TObject); + procedure UpdateTracking(ForceMouseLeave: Boolean = False); + procedure SetAlignment(const Value: TAlignment); + procedure SetCaptionGlow(const Value: TSpGlowDirection); + procedure SetCaptionGlowColor(const Value: TColor); + procedure SetCaptionRoatationAngle(const Value: TSpTextRotationAngle); + procedure SetGlyphLayout(const Value: TSpGlyphLayout); + procedure SetImageIndex(const Value: TImageIndex); + procedure SetImages(const Value: TCustomImageList); + procedure SetSkinType(const Value: TSpTBXSkinType); + procedure SetShowAccelChar(Value: Boolean); + procedure SetWrapping(Value: TTextWrapping); + procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED; + procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED; + procedure CMHintShow(var Message: TCMHintShow); message CM_HINTSHOW; + procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; + procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; + procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED; + procedure WMEraseBkgnd(var Message: TMessage); message WM_ERASEBKGND; + procedure WMKillFocus(var Message: TMessage); message WM_KILLFOCUS; + procedure WMSetFocus(var Message: TMessage); message WM_SETFOCUS; + procedure WMSetCursor(var Message: TWMSetCursor); message WM_SETCURSOR; + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + protected + // Painting + procedure AdjustFont(AFont: TFont); virtual; + procedure AdjustBounds; + procedure DoDrawHint(AHintBitmap: TBitmap; var AHint: Widestring; var PaintDefault: Boolean); virtual; + function DoDrawItem(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage): Boolean; virtual; + function DoDrawText(ACanvas: TCanvas; var ARect: TRect; Flags: Longint): Integer; virtual; + procedure DoGetImageIndex(var AImageList: TCustomImageList; var AImageIndex: Integer); virtual; + procedure DoInternalGlyphDraw(ACanvas: TCanvas; AGlyphRect: TRect); virtual; + function GetFocusRect(R, TextR, GlyphR: TRect): TRect; virtual; + function GetTextMargins: TRect; virtual; + function IsImageIndexValid: Boolean; + procedure Paint; override; + + // Sizing + function CanAutoSize(var NewWidth, NewHeight: Integer): Boolean; override; + procedure DoAdjustBounds(var NewWidth, NewHeight: Integer); virtual; + + // Mouse + function GetFocused: Boolean; virtual; + function GetPushed: Boolean; virtual; + procedure DoMouseEnter; virtual; + procedure DoMouseLeave; virtual; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; + procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; + procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; + procedure KeyDown(var Key: Word; Shift: TShiftState); override; + procedure KeyUp(var Key: Word; Shift: TShiftState); override; + + // Component + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + procedure CreateParams(var Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + procedure ExecuteLink; virtual; + function GetActionLinkClass: TControlActionLinkClass; override; + function GetChecked: Boolean; virtual; + procedure SetChecked(Value: Boolean); virtual; + procedure Loaded; override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + + property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify; + property AutoSize default True; + property Checked: Boolean read GetChecked write SetChecked default False; + property CaptionGlow: TSpGlowDirection read FCaptionGlow write SetCaptionGlow default gldNone; + property CaptionGlowColor: TColor read FCaptionGlowColor write SetCaptionGlowColor default clYellow; + property CaptionRoatationAngle: TSpTextRotationAngle read FCaptionRoatationAngle write SetCaptionRoatationAngle default tra0; + property DrawPushedCaption: Boolean read FDrawPushedCaption write FDrawPushedCaption default False; + property DisabledIconCorrection: Boolean read FDisabledIconCorrection write FDisabledIconCorrection default True; + property GlyphLayout: TSpGlyphLayout read FGlyphLayout write SetGlyphLayout default ghlGlyphLeft; + property Images: TCustomImageList read FImages write SetImages; + property ImageIndex: TImageIndex read FImageIndex write SetImageIndex default -1; + property LinkText: WideString read FLinkText write FLinkText; + property LinkTextParams: WideString read FLinkTextParams write FLinkTextParams; + property SkinType: TSpTBXSkinType read FSkinType write SetSkinType default sknSkin; + property ShowAccelChar: Boolean read FShowAccelChar write SetShowAccelChar default True; + property SpaceAsClick: Boolean read FSpaceAsClick write FSpaceAsClick default False; + property Wrapping: TTextWrapping read FWrapping write SetWrapping default twNone; + property OnDraw: TSpTBXDrawEvent read FOnDraw write FOnDraw; + property OnDrawCaption: TSpTBXDrawTextEvent read FOnDrawCaption write FOnDrawCaption; + property OnDrawHint: TSpTBXDrawHintEvent read FOnDrawHint write FOnDrawHint; + property OnGetImageIndex: TSpTBXGetImageIndexEvent read FOnGetImageIndex write FOnGetImageIndex; + property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter; + property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave; + property TabStop default True; + property ParentColor default False; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + function CanFocus: Boolean; override; + procedure Click; override; + function GetControlsAlignment: TAlignment; override; + procedure GetSize(out TotalR, TextR, GlyphR: TRect); virtual; + function GetTextFlags: Cardinal; + function GetGlyphSize: TSize; virtual; + property Canvas; + property MouseInControl: Boolean read FMouseInControl; + property Pushed: Boolean read GetPushed; + published + property Caption; + property Hint; + property Color default clNone; + end; + + { TSpTBXLabel } + + TSpTBXCustomLabel = class(TSpTBXTextObject) + private + FFocusControl: TWinControl; + FUnderline: Boolean; + FUnderlineColor: TColor; + procedure SetFocusControl(const Value: TWinControl); + procedure SetUnderline(const Value: Boolean); + procedure SetUnderlineColor(const Value: TColor); + procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; + protected + procedure AdjustFont(AFont: TFont); override; + function DoDrawItem(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage): Boolean; override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + property FocusControl: TWinControl read FFocusControl write SetFocusControl; + property Underline: Boolean read FUnderline write SetUnderline default False; + property UnderlineColor: TColor read FUnderlineColor write SetUnderlineColor default clBtnShadow; + public + constructor Create(AOwner: TComponent); override; + procedure GetSize(out TotalR: TRect; out TextR: TRect; out GlyphR: TRect); override; + end; + + TSpTBXLabel = class(TSpTBXCustomLabel) + published + property Action; + property Align; + property Anchors; + property AutoSize; + property BiDiMode; + property Color; + property Constraints; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property ParentBiDiMode; + property ParentColor; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowAccelChar; + property ShowHint; + property Visible; + property Wrapping; + property OnClick; + property OnContextPopup; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnMouseDown; + property OnMouseEnter; + property OnMouseLeave; + property OnMouseMove; + property OnMouseUp; + property OnStartDock; + property OnStartDrag; + // TSpTBXCustomLabel properties + property Alignment; + property CaptionGlow; + property CaptionGlowColor; + property FocusControl; + property GlyphLayout; + property Images; + property ImageIndex; + property LinkText; + property LinkTextParams; + property SkinType; + property Underline; + property UnderlineColor; + property OnDraw; + property OnDrawCaption; + property OnDrawHint; + property OnGetImageIndex; + end; + + { TSpTBXButtonControl } + + TSpTBXButtonControl = class(TSpTBXTextObject) + private + FAllowAllUp: Boolean; + FGroupIndex: Integer; + FStateChanged: Boolean; + procedure SetAllowAllUp(const Value: Boolean); + procedure SetGroupIndex(const Value: Integer); + procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; + procedure CMSPGroupIndexUpdate(var Message: TMessage); message CM_SPGROUPINDEXUPDATE; + protected + function CanUpdateExclusive: Boolean; virtual; + procedure SetChecked(Value: Boolean); override; + procedure UpdateExclusive; + property AllowAllUp: Boolean read FAllowAllUp write SetAllowAllUp default False; + property GroupIndex: Integer read FGroupIndex write SetGroupIndex default 0; + property StateChanged: Boolean read FStateChanged write FStateChanged; + public + constructor Create(AOwner: TComponent); override; + function CanFocus: Boolean; override; + end; + + { TSpTBXCheckBox } + + TSpTBXCustomCheckButton = class(TSpTBXButtonControl) + protected + procedure Toggle; virtual; + public + function GetGlyphSize: TSize; override; + procedure GetSize(out TotalR, TextR, GlyphR: TRect); override; + end; + + TSpTBXCustomCheckBox = class(TSpTBXCustomCheckButton) + private + FAllowGrayed: Boolean; + FState: TCheckBoxState; + procedure SetState(const Value: TCheckBoxState); + protected + procedure AdjustFont(AFont: TFont); override; + procedure DoInternalGlyphDraw(ACanvas: TCanvas; AGlyphRect: TRect); override; + function GetChecked: Boolean; override; + procedure SetChecked(Value: Boolean); override; + procedure Toggle; override; + property AllowGrayed: Boolean read FAllowGrayed write FAllowGrayed default False; + property State: TCheckBoxState read FState write SetState default cbUnchecked; + public + constructor Create(AOwner: TComponent); override; + procedure Click; override; + end; + + TSpTBXCheckBox = class(TSpTBXCustomCheckBox) + published + property Action; + property Align; + property Anchors; + property AutoSize; + property BiDiMode; + property Color; + property Constraints; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property ParentBiDiMode; + property ParentColor; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowAccelChar; + property ShowHint; + property TabOrder; + property TabStop; + property Visible; + property Wrapping; + property OnClick; + property OnContextPopup; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnMouseDown; + property OnMouseEnter; + property OnMouseLeave; + property OnMouseMove; + property OnMouseUp; + property OnStartDock; + property OnStartDrag; + // TSpTBXCustomCheckBox properties + property Alignment; + property AllowGrayed; + property CaptionGlow; + property CaptionGlowColor; + property Checked; + property State; + property SkinType; + property OnDraw; + property OnDrawCaption; + property OnDrawHint; + property OnGetImageIndex; + end; + + { TSpTBXRadioButton } + + TSpTBXCustomRadioButton = class(TSpTBXCustomCheckButton) + private + procedure CMFocusChanged(var Message: TCMFocusChanged); message CM_FOCUSCHANGED; + protected + procedure AdjustFont(AFont: TFont); override; + function CanUpdateExclusive: Boolean; override; + procedure DoInternalGlyphDraw(ACanvas: TCanvas; AGlyphRect: TRect); override; + procedure SetChecked(Value: Boolean); override; + procedure Toggle; override; + property TabStop default False; + public + constructor Create(AOwner: TComponent); override; + procedure Click; override; + end; + + TSpTBXRadioButton = class(TSpTBXCustomRadioButton) + published + property Action; + property Align; + property Anchors; + property AutoSize; + property BiDiMode; + property Color; + property Constraints; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property ParentBiDiMode; + property ParentColor; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowAccelChar; + property ShowHint; + property TabOrder; + property TabStop; + property Visible; + property Wrapping; + property OnClick; + property OnContextPopup; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnMouseDown; + property OnMouseEnter; + property OnMouseLeave; + property OnMouseMove; + property OnMouseUp; + property OnStartDock; + property OnStartDrag; + // TSpTBXCustomRadioButton properties + property Alignment; + property CaptionGlow; + property CaptionGlowColor; + property Checked; + property GroupIndex; + property SkinType; + property OnDraw; + property OnDrawCaption; + property OnDrawHint; + property OnGetImageIndex; + end; + + { TSpTBXRadioGroup } + + TSpTBXCustomRadioGroup = class(TSpTBXCustomGroupBox) + private + FButtons: TList; + FItems: TTntStrings; + FItemIndex: Integer; + FColumns: Integer; + FReading: Boolean; + FUpdating: Boolean; + function GetButtons(Index: Integer): TSpTBXRadioButton; + procedure ArrangeButtons; + procedure ButtonClick(Sender: TObject); + procedure ItemsChange(Sender: TObject); + procedure SetButtonCount(Value: Integer); + procedure SetColumns(Value: Integer); + procedure SetItemIndex(Value: Integer); + procedure SetItems(Value: TTntStrings); + procedure UpdateButtons; + procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED; + procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED; + procedure WMSize(var Message: TWMSize); message WM_SIZE; + protected + procedure Loaded; override; + procedure ReadState(Reader: TReader); override; + property Columns: Integer read FColumns write SetColumns default 1; + property ItemIndex: Integer read FItemIndex write SetItemIndex default -1; + property Items: TTntStrings read FItems write SetItems; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override; + procedure FlipChildren(AllLevels: Boolean); override; + procedure InvalidateBackground(InvalidateChildren: Boolean = True); override; + procedure SetFocus; override; + property Buttons[Index: Integer]: TSpTBXRadioButton read GetButtons; + end; + + TSpTBXRadioGroup = class(TSpTBXCustomRadioGroup) + published + property Align; + property Anchors; + property BiDiMode; + property Color; + property Constraints; + property UseDockManager; + property DockSite; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property ParentBiDiMode; + property ParentColor; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowHint; + property TabOrder; + property TabStop; + property Visible; + property OnCanResize; + property OnClick; + property OnConstrainedResize; + property OnContextPopup; + property OnDockDrop; + property OnDockOver; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnGetSiteInfo; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnResize; + property OnStartDock; + property OnStartDrag; + property OnUnDock; + // TSpTBXCustomPanel properties + property Borders; + property BorderType; + property TBXStyleBackground; + property OnDrawBackground; + // TSpTBXCustomRadioGroup properties + property Columns; + property ItemIndex; + property Items; + end; + + { TSpTBXButton } + + TSpTBXCustomButton = class(TSpTBXButtonControl) + private + FBitmap: TBitmap; + FBitmapTransparent: Boolean; + FActive: Boolean; + FCancel: Boolean; + FDefault: Boolean; + FDropDownArrow: Boolean; + FDropDownMenu: TPopupMenu; + FDropDownMenuVisible: Boolean; + FFlat: Boolean; + FModalResult: TModalResult; + FRepeating: Boolean; + FRepeatTimer: TTimer; + FToolbarStyle: Boolean; + procedure BitmapChanged(Sender: TObject); + procedure RepeatTimerHandler(Sender: TObject); + procedure SetBitmap(const Value: TBitmap); + procedure SetDefault(const Value: Boolean); + procedure SetDropDownArrow(const Value: Boolean); + procedure SetDropdownMenu(Value: TPopupMenu); + procedure SetFlat(const Value: Boolean); + procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY; + procedure CMFocusChanged(var Message: TCMFocusChanged); message CM_FOCUSCHANGED; + procedure CMSPPopupClose(var Message: TMessage); message CM_SPPOPUPCLOSE; + procedure WMCancelMode(var Message: TWMCancelMode); message WM_CANCELMODE; + protected + FPopupControl: TControl; + procedure CreateWnd; override; + procedure AdjustFont(AFont: TFont); override; + function BitmapValid: boolean; + function DoDrawDropDownArrow(ACanvas: TCanvas; ARect: TRect): Boolean; virtual; + function DoDrawItem(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage): Boolean; override; + function GetFocused: Boolean; override; + function GetFocusRect(R, TextR, GlyphR: TRect): TRect; override; + function GetInternalDropDownMenu: TPopupMenu; virtual; + function GetPushed: Boolean; override; + function GetTextMargins: TRect; override; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; + procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + property Alignment default taCenter; + property Bitmap: TBitmap read FBitmap write SetBitmap; + property BitmapTransparent: Boolean read FBitmapTransparent write FBitmapTransparent default True; + property DrawPushedCaption default True; + property Cancel: Boolean read FCancel write FCancel default False; + property Default: Boolean read FDefault write SetDefault default False; + property DropDownArrow: Boolean read FDropDownArrow write SetDropDownArrow default True; + property DropDownMenu: TPopupMenu read FDropDownMenu write SetDropDownMenu; + property Flat: Boolean read FFlat write SetFlat default False; + property ModalResult: TModalResult read FModalResult write FModalResult default 0; + property Repeating: Boolean read FRepeating write FRepeating default False; + property ToolbarStyle: Boolean read FToolbarStyle write FToolbarStyle default False; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Click; override; + function GetSkinStateRect: TRect; + function IsDroppedDown: Boolean; + procedure StopRepeat; virtual; + end; + + TSpTBXButton = class(TSpTBXCustomButton) + published + property Action; + property Align; + property Anchors; + property BiDiMode; + property Color; + property Constraints; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property ParentBiDiMode; + property ParentColor; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowAccelChar; + property ShowHint; + property TabOrder; + property TabStop; + property Visible; + property Wrapping; + property OnClick; + property OnContextPopup; + // property OnDblClick; Buttons don't have OnDblClick events + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnMouseDown; + property OnMouseEnter; + property OnMouseLeave; + property OnMouseMove; + property OnMouseUp; + property OnStartDock; + property OnStartDrag; + // TSpTBXCustomButton properties + property Alignment; + property Bitmap; + property BitmapTransparent; + property Cancel; + property CaptionGlow; + property CaptionGlowColor; + property Checked; + property Default; + property DrawPushedCaption; + property DropDownArrow; + property DropDownMenu; + property Flat; + property GlyphLayout; + property GroupIndex; + property Images; + property ImageIndex; + property LinkText; + property LinkTextParams; + property ModalResult; + property SkinType; + property Repeating; + property OnDraw; + property OnDrawCaption; + property OnDrawHint; + property OnGetImageIndex; + end; + + { TSpTBXSpeedButton } + + TSpTBXCustomSpeedButton = class(TSpTBXCustomButton) + public + constructor Create(AOwner: TComponent); override; + function CanFocus: Boolean; override; + procedure Click; override; + end; + + TSpTBXSpeedButton = class(TSpTBXCustomSpeedButton) + published + property Action; + property Align; + property Anchors; + property BiDiMode; + property Color; + property Constraints; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property ParentBiDiMode; + property ParentColor; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowAccelChar; + property ShowHint; + // property TabOrder; SpeedButtons don't have TabStops + // property TabStop; SpeedButtons don't have TabStops + property Visible; + property Wrapping; + property OnClick; + property OnContextPopup; + // property OnDblClick; SpeedButtons don't have OnDblClick events + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnMouseDown; + property OnMouseEnter; + property OnMouseLeave; + property OnMouseMove; + property OnMouseUp; + property OnStartDock; + property OnStartDrag; + // TSpTBXCustomButton properties + property Alignment; + property AllowAllUp; + property Bitmap; + property BitmapTransparent; + property Cancel; + property CaptionGlow; + property CaptionGlowColor; + property Checked; + property Default; + property DrawPushedCaption; + property DropDownArrow; + property DropDownMenu; + property Flat; + property GlyphLayout; + property GroupIndex; + property Images; + property ImageIndex; + property LinkText; + property LinkTextParams; + property SkinType; + property Repeating; + property OnDraw; + property OnDrawCaption; + property OnDrawHint; + property OnGetImageIndex; + end; + + { TSpTBXProgressBar } + + TSpTBXProgressBarChangeEvent = procedure(Sender: TObject; NewPosition: Integer) of object; + + TSpTBXCustomProgressBar = class(TSpTBXTextObject) + private + FMin: Integer; + FMax: Integer; + FPosition: Integer; + FProgressVisible: Boolean; + FSmooth: Boolean; + FVertical: Boolean; + FCaptionType: TSpTBXProgressCaption; + FOnProgressChange: TSpTBXProgressBarChangeEvent; + procedure SetMax(const Value: integer); + procedure SetMin(const Value: integer); + procedure SetPosition(Value: integer); + procedure SetSmooth(const Value: Boolean); + procedure SetVertical(const Value: Boolean); + procedure SetCaptionType(const Value: TSpTBXProgressCaption); + procedure SetProgressVisible(const Value: Boolean); + protected + procedure AdjustFont(AFont: TFont); override; + function DoDrawItem(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage): Boolean; override; + procedure DoProgressChange; virtual; + function GetTextMargins: TRect; override; + property Alignment default taCenter; + property CaptionGlow default gldAll; + property CaptionType: TSpTBXProgressCaption read FCaptionType write SetCaptionType default pctPercentage; + property Max: Integer read FMax write SetMax default 100; + property Min: Integer read FMin write SetMin default 0; + property Position: Integer read FPosition write SetPosition default 0; + property ProgressVisible: Boolean read FProgressVisible write SetProgressVisible default True; + property Smooth: Boolean read FSmooth write SetSmooth default False; + property Vertical: Boolean read FVertical write SetVertical default False; + property OnProgressChange: TSpTBXProgressBarChangeEvent read FOnProgressChange write FOnProgressChange; + public + constructor Create(AOwner: TComponent); override; + procedure StepIt(Delta: Integer = 1); + end; + + TSpTBXProgressBar = class(TSpTBXCustomProgressBar) + published + property Align; + property Anchors; + property Color; + property Constraints; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property ParentColor; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowHint; + property Visible; + property OnClick; + property OnContextPopup; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnMouseDown; + property OnMouseEnter; + property OnMouseLeave; + property OnMouseMove; + property OnMouseUp; + property OnStartDock; + property OnStartDrag; + // TSpTBXCustomProgressBar properties + property Alignment; + property CaptionGlow; + property CaptionGlowColor; + property CaptionType; + property Max; + property Min; + property Position; + property Smooth; + property Vertical; + property SkinType; + property OnDraw; + property OnDrawCaption; + property OnDrawHint; + property OnProgressChange; + end; + + { TSpTBXTrackBar } + + TSpTBXTrackBar = class(TTrackBar) + private + FSkinType: TSpTBXSkinType; + FTickMarks: TSpTBXTickMark; + FOnDrawChannel: TSpTBXDrawEvent; + FOnDrawChannelTicks: TSpTBXDrawPosEvent; + FOnDrawThumb: TSpTBXDrawEvent; + FCanDrawChannelSelection: Boolean; + procedure SetSkinType(const Value: TSpTBXSkinType); + procedure SetTickMarks(const Value: TSpTBXTickMark); + procedure CMSpTBXControlsInvalidate(var Message: TMessage); message CM_SPTBXCONTROLSINVALIDATE; + procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY; + procedure WMEraseBkGnd(var Message: TMessage); message WM_ERASEBKGND; + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + protected + procedure CreateParams(var Params: TCreateParams); override; + function DoDrawChannel(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage): Boolean; virtual; + function DoDrawChannelTicks(ACanvas: TCanvas; X, Y: Integer): Boolean; virtual; + function DoDrawThumb(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage): Boolean; virtual; + procedure DrawTicks(ACanvas: TCanvas); virtual; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + function ChannelRect: TRect; + function MouseInThumb: Boolean; + procedure InvalidateBackground; + published + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property SkinType: TSpTBXSkinType read FSkinType write SetSkinType default sknSkin; + property TickMarks: TSpTBXTickMark read FTickMarks write SetTickMarks default tmxBottomRight; + property OnDrawChannel: TSpTBXDrawEvent read FOnDrawChannel write FOnDrawChannel; + property OnDrawChannelTicks: TSpTBXDrawPosEvent read FOnDrawChannelTicks write FOnDrawChannelTicks; + property OnDrawThumb: TSpTBXDrawEvent read FOnDrawThumb write FOnDrawThumb; + end; + +{ Painting helpers } +procedure SpDrawXPPanel(ACanvas: TCanvas; ARect: TRect; Enabled, TBXStyleBackground: Boolean; SkinType: TSpTBXSkinType; Border: TSpTBXPanelBorder); +procedure SpDrawXPPanelBorder(ACanvas: TCanvas; ARect: TRect; Border: TSpTBXPanelBorder); +procedure SpDrawXPGroupBox(ACanvas: TCanvas; ARect: TRect; ACaption: WideString; TextFlags: Cardinal; Enabled, TBXStyleBackground: Boolean; SkinType: TSpTBXSkinType); +procedure SpDrawXPProgressBar(ACanvas: TCanvas; ARect: TRect; Min, Max, Position: Integer; Back, Fore: TBitmap); overload; +function SpDrawXPProgressBar(ACanvas: TCanvas; ARect: TRect; Vertical, Smooth, DrawProgress: Boolean; Min, Max, Position: Integer; SkinType: TSpTBXSkinType): Integer; overload; +procedure SpDrawXPTrackBar(ACanvas: TCanvas; ARect: TRect; Part: Cardinal; Vertical, Pushed, ChannelSelection: Boolean; TickMark: TSpTBXTickMark; Min, Max, SelStart, SelEnd: Integer; SkinType: TSpTBXSkinType); +procedure SpInvalidateSpTBXControl(AControl: TWinControl; InvalidateChildren, OnlySpTBXControls: Boolean); + +implementation + +uses + Themes, UxTheme, + {$IFNDEF UNICODE} TntActnList, {$ENDIF} + CommCtrl, ShellAPI; +type + TWinControlAccess = class(TWinControl); + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Helpers } + +procedure SpDrawXPPanel(ACanvas: TCanvas; ARect: TRect; Enabled, TBXStyleBackground: Boolean; + SkinType: TSpTBXSkinType; Border: TSpTBXPanelBorder); +var + Flags: Integer; +begin + case SpTBXSkinType(SkinType) of + sknWindows: + begin + if Enabled then Flags := GBS_NORMAL + else Flags := GBS_DISABLED; + DrawThemeBackground(ThemeServices.Theme[teButton], ACanvas.Handle, BP_GROUPBOX, Flags, ARect, nil); + end; + sknNone: + SpDrawXPPanelBorder(ACanvas, ARect, Border); + sknSkin: + CurrentSkin.PaintBackground(ACanvas, ARect, skncPanel, sknsNormal, TBXStyleBackground, True); + end; +end; + +procedure SpDrawXPPanelBorder(ACanvas: TCanvas; ARect: TRect; Border: TSpTBXPanelBorder); +const + Edge: array [TSpTBXPanelBorder] of Cardinal = (BDR_RAISEDINNER, EDGE_RAISED, + BDR_SUNKENOUTER, EDGE_SUNKEN, EDGE_BUMP, EDGE_ETCHED, 0); +begin + if Border = pbrFramed then begin + ACanvas.Brush.Color := clBtnFace; + ACanvas.FrameRect(ARect); + end + else + DrawEdge(ACanvas.Handle, ARect, Edge[Border], BF_RECT); +end; + +procedure SpDrawXPGroupBox(ACanvas: TCanvas; ARect: TRect; ACaption: WideString; + TextFlags: Cardinal; Enabled, TBXStyleBackground: Boolean; SkinType: TSpTBXSkinType); +var + Width, Flags, SaveIndex: Integer; + R: TRect; + CaptionRect: TRect; +begin + Flags := 0; + SkinType := SpTBXSkinType(SkinType); + Width := ARect.Right - ARect.Left; + + if ACaption <> '' then begin + CaptionRect := Rect(0, 0, 1, 1); + + if Enabled then Flags := GBS_NORMAL + else Flags := GBS_DISABLED; + if SkinType = sknWindows then + GetThemeTextExtent(ThemeServices.Theme[teButton], ACanvas.Handle, BP_GROUPBOX, Flags, + PWideChar(ACaption), Length(ACaption), DT_LEFT, nil, CaptionRect) + else + SpDrawXPText(ACanvas, ACaption, CaptionRect, TextFlags or DT_CALCRECT); + + if (TextFlags and DT_RTLREADING) = 0 then + OffsetRect(CaptionRect, 8, 0) + else + OffsetRect(CaptionRect, Width - 8 - CaptionRect.Right, 0); + end + else + CaptionRect := Rect(0, 0, 0, 0); + + R := ARect; + R.Top := (CaptionRect.Bottom - CaptionRect.Top) div 2; + SaveIndex := SaveDC(ACanvas.Handle); + with CaptionRect do + ExcludeClipRect(ACanvas.Handle, Left, Top, Right, Bottom); + try + SpDrawXPPanel(ACanvas, R, Enabled, TBXStyleBackground, SkinType, pbrEtched); + finally + RestoreDC(ACanvas.Handle, SaveIndex); + end; + + if ACaption <> '' then begin + case SkinType of + sknNone: + SpDrawXPText(ACanvas, ACaption, CaptionRect, TextFlags); + sknWindows: + DrawThemeText(ThemeServices.Theme[teButton], ACanvas.Handle, BP_GROUPBOX, Flags, PWideChar(ACaption), -1, TextFlags, 0, CaptionRect); + sknSkin: + begin + if CurrentSkin.Options(skncPanel, sknsNormal).TextColor <> clNone then + ACanvas.Font.Color := CurrentSkin.Options(skncPanel, sknsNormal).TextColor; + SpDrawXPText(ACanvas, ACaption, CaptionRect, TextFlags); + end; + end; + end; +end; + +procedure SpDrawXPProgressBar(ACanvas: TCanvas; ARect: TRect; + Min, Max, Position: Integer; Back, Fore: TBitmap); +var + Percent, Delta: Integer; + DeltaR, R: TRect; +begin + if Position < Min then Position := Min + else if Position > Max then Position := Max; + + // Get the delta + if (Max > Min) and (Position > Min) then begin + Percent := (Position * 100) div (Max - Min); + DeltaR := ARect; + R := Rect(0, 0, Back.Width, Back.Height); + if Back.Height > Back.Width then begin + Delta := (Back.Height * Percent) div 100; + DeltaR.Bottom := DeltaR.Top + Delta; + R.Bottom := R.Top + Delta; + end + else begin + Delta := (Back.Width * Percent) div 100; + DeltaR.Right := DeltaR.Left + Delta; + R.Right := R.Left + Delta; + end; + end + else + Delta := 0; + + ACanvas.Draw(ARect.Left, ARect.Top, Back); + if Delta > 0 then + ACanvas.CopyRect(DeltaR, Fore.Canvas, R); +end; + +function SpDrawXPProgressBar(ACanvas: TCanvas; ARect: TRect; + Vertical, Smooth, DrawProgress: Boolean; Min, Max, Position: Integer; + SkinType: TSpTBXSkinType): Integer; +const + PartID: array [Boolean] of Integer = (PP_BAR, PP_BARVERT); + VistaPartID: array [Boolean] of Integer = (5, 6); // PP_FILL, PP_FILLVERT + ChunkID: array [Boolean] of Integer = (PP_CHUNK, PP_CHUNKVERT); +var + ChunkPaint: Boolean; + I: Integer; + DeltaR, R: TRect; + B: TBitmap; + Percentage: Double; +begin + Result := 0; + ChunkPaint := False; + if Position < Min then Position := Min + else if Position > Max then Position := Max; + SkinType := SpTBXSkinType(SkinType); + + // Get the delta + if (Max > Min) and (Position > Min) then begin + DeltaR := ARect; + case SkinType of + sknWindows: + if not SpIsWinVistaOrUp then + if Vertical then InflateRect(DeltaR, -3, -4) + else InflateRect(DeltaR, -4, -3); + sknNone: InflateRect(DeltaR, -2, -2); + end; + // Cast Position to a Double real type, otherwise Percentage * 100 + // returns a negative value, e.g. 30000000 * 100 + Percentage := Position; + Percentage := (Percentage * 100) / (Max - Min); + Result := Round(Percentage); + if Vertical then + DeltaR.Top := DeltaR.Bottom - (((DeltaR.Bottom - DeltaR.Top) * Result) div 100) + else + DeltaR.Right := DeltaR.Left + (((DeltaR.Right - DeltaR.Left) * Result) div 100); + end + else + DeltaR := Rect(0, 0, 0, 0); + + B := TBitmap.Create; + try + case SkinType of + sknWindows: + begin + DrawThemeBackground(ThemeServices.Theme[teProgress], ACanvas.Handle, PartID[Vertical], 0, ARect, nil); + if DrawProgress and not IsRectEmpty(DeltaR) then begin + if SpIsWinVistaOrUp then + DrawThemeBackground(ThemeServices.Theme[teProgress], ACanvas.Handle, VistaPartID[Vertical], 1, DeltaR, nil) + else begin + // [Theme-Change] + // Another Windows API bug, Windows XP progress bar chunks are 8 x 11, + // but DrawThemeBackground draws 10 x 11 chunks. We must draw the chunks manually. + if Vertical then begin + B.Width := DeltaR.Right - DeltaR.Left; + B.Height := 8; + R := Rect(0, 2, B.Width, B.Height); + end + else begin + B.Width := 8; + B.Height := DeltaR.Bottom - DeltaR.Top; + R := Rect(0, 0, B.Width - 2, B.Height); + end; + DrawThemeBackground(ThemeServices.Theme[teProgress], B.Canvas.Handle, ChunkID[Vertical], 0, R, nil); + ChunkPaint := True; + end; + end; + end; + sknNone: + begin + DrawEdge(ACanvas.Handle, ARect, BDR_SUNKENOUTER, BF_RECT); + if DrawProgress and not IsRectEmpty(DeltaR) then + if Smooth then begin + ACanvas.Brush.Color := clHighlight; + ACanvas.FillRect(DeltaR); + end + else begin + // Chunks are 10 x 13 + if Vertical then begin + B.Width := DeltaR.Right - DeltaR.Left; + B.Height := 10; + R := Rect(0, 2, B.Width, B.Height); + end + else begin + B.Width := 10; + B.Height := DeltaR.Bottom - DeltaR.Top; + R := Rect(0, 0, B.Width - 2, B.Height); + end; + B.Canvas.Brush.Color := clBtnFace; + B.Canvas.FillRect(Rect(0, 0, B.Width, B.Height)); + B.Canvas.Brush.Color := clHighlight; + B.Canvas.FillRect(R); + ChunkPaint := True; + end; + end; + sknSkin: + begin + CurrentSkin.PaintBackground(ACanvas, ARect, skncProgressBar, sknsNormal, True, True); + if DrawProgress and not IsRectEmpty(DeltaR) then begin + B.Width := ARect.Right - ARect.Left; + B.Height := ARect.Bottom - ARect.Top; + R := Rect(0, 0, B.Width, B.Height); + B.Canvas.CopyRect(R, ACanvas, ARect); // B is transparent + + CurrentSkin.PaintBackground(B.Canvas, R, skncProgressBar, sknsHotTrack, True, True); + + if Vertical then + R.Top := R.Bottom - (DeltaR.Bottom - DeltaR.Top) + else + R.Right := DeltaR.Right - DeltaR.Left; + ACanvas.CopyRect(DeltaR, B.Canvas, R); + end; + end; + end; + + if ChunkPaint then begin + if Vertical then begin + ExcludeClipRect(ACanvas.Handle, ARect.Left, ARect.Top, ARect.Right, ARect.Top + 2); + I := DeltaR.Bottom - B.Height; + while I > DeltaR.Top - B.Height do begin + ACanvas.Draw(DeltaR.Left, I, B); + Dec(I, B.Height); + end; + end + else begin + ExcludeClipRect(ACanvas.Handle, ARect.Right - 2, ARect.Top, ARect.Right, ARect.Bottom); + I := DeltaR.Left; + while I < DeltaR.Right do begin + ACanvas.Draw(I, DeltaR.Top, B); + Inc(I, B.Width); + end; + end; + SelectClipRgn(ACanvas.Handle, 0); + end; + finally + B.Free; + end; +end; + +procedure SpDrawXPTrackBar(ACanvas: TCanvas; ARect: TRect; Part: Cardinal; + Vertical, Pushed, ChannelSelection: Boolean; TickMark: TSpTBXTickMark; + Min, Max, SelStart, SelEnd: Integer; SkinType: TSpTBXSkinType); +var + Flags: Integer; + + procedure DrawChannelSelection(ChannelR: TRect); + var + I: Integer; + Step : Single; + begin + if not ChannelSelection then Exit; + I := Max - Min; + if (I > 0) and (SelEnd > SelStart) then begin + if SkinType = sknSkin then + InflateRect(ChannelR, -2, -2) + else + InflateRect(ChannelR, -1, -1); + Step := (ChannelR.Right - ChannelR.Left) / I; + ChannelR.Right := ChannelR.Left + Round(SelEnd * Step); + ChannelR.Left := ChannelR.Left + Round(SelStart * Step); + + if SkinType = sknSkin then + CurrentSkin.PaintBackground(ACanvas, ChannelR, skncTrackBar, sknsHotTrack, True, True) + else begin + ACanvas.Brush.Color := clHighlight; + ACanvas.FillRect(ChannelR); + end; + end; + end; + +begin + SkinType := SpTBXSkinType(SkinType); + case SkinType of + sknWindows: + if Part = TBCD_THUMB then begin + if Pushed then Flags := TUS_HOT + else Flags := TUS_NORMAL; + Case TickMark of + tmxBottomRight: + if Vertical then Part := TKP_THUMBRIGHT + else Part := TKP_THUMBBOTTOM; + tmxTopLeft: + if Vertical then Part := TKP_THUMBLEFT + else Part := TKP_THUMBTOP; + tmxBoth, tmxCenter: + if Vertical then Part := TKP_THUMBVERT + else Part := TKP_THUMB; + end; + DrawThemeBackground(ThemeServices.Theme[teTrackBar], ACanvas.Handle, Part, Flags, ARect, nil); + end + else if Part = TBCD_CHANNEL then begin + if Vertical then Part := TKP_TRACKVERT + else Part := TKP_TRACK; + DrawThemeBackground(ThemeServices.Theme[teTrackBar], ACanvas.Handle, Part, TKS_NORMAL, ARect, nil); + DrawChannelSelection(ARect); + end; + sknNone: + if Part = TBCD_THUMB then begin + ACanvas.Brush.Color := clBtnFace; + ACanvas.FillRect(ARect); + DrawFrameControl(ACanvas.Handle, ARect, DFC_BUTTON, DFCS_BUTTONPUSH); + end + else if Part = TBCD_CHANNEL then begin + ACanvas.Brush.Color := clWindow; + ACanvas.FillRect(ARect); + ExtCtrls.Frame3D(ACanvas, ARect, clBtnShadow, clBtnHighlight, 1); + ExtCtrls.Frame3D(ACanvas, ARect, cl3DDkShadow, clBtnFace, 1); + DrawChannelSelection(ARect); + end; + sknSkin: + if Part = TBCD_THUMB then begin + if Pushed then + CurrentSkin.PaintBackground(ACanvas, ARect, skncTrackBarButton, sknsPushed, True, True) + else + CurrentSkin.PaintBackground(ACanvas, ARect, skncTrackBarButton, sknsNormal, True, True); + end + else if Part = TBCD_CHANNEL then begin + CurrentSkin.PaintBackground(ACanvas, ARect, skncTrackBar, sknsNormal, True, True); + DrawChannelSelection(ARect); + end; + end; +end; + +procedure SpInvalidateSpTBXControl(AControl: TWinControl; InvalidateChildren, OnlySpTBXControls: Boolean); +var + I: Integer; + ChildW: TWinControl; +begin + // Invalidate will not fire WM_ERASEBKGND, because csOpaque is setted + if Assigned(AControl) and not (csDestroying in AControl.ComponentState) and AControl.HandleAllocated then + begin + if InvalidateChildren then begin + if OnlySpTBXControls then begin + RedrawWindow(AControl.Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE); + // Only invalidate SpTBXControls + for I := 0 to AControl.ControlCount - 1 do + if Assigned(AControl.Controls[I]) and (AControl.Controls[I] is TWinControl) then begin + ChildW := AControl.Controls[I] as TWinControl; + if ChildW is TSpTBXTextObject then + RedrawWindow(ChildW.Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE) + else + PostMessage(ChildW.Handle, CM_SPTBXCONTROLSINVALIDATE, ChildW.Width, ChildW.Height); + end; + end + else + RedrawWindow(AControl.Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN); + end + else + RedrawWindow(AControl.Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE); + end; +end; + +procedure ApplyMargins(var R: TRect; const Margins: TRect); overload; +begin + with Margins do begin + Inc(R.Left, Left); Inc(R.Top, Top); + Dec(R.Right, Right); Dec(R.Bottom, Bottom); + end; +end; + +function GetRealAlignment(Control: TControl): TAlignment; +const + ReverseAlignment: array [TAlignment] of TAlignment = (taRightJustify, taLeftJustify, taCenter); +begin + Result := Control.GetControlsAlignment; + if Control.UseRightToLeftAlignment then Result := ReverseAlignment[Result]; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomPanel } + +constructor TSpTBXCustomPanel.Create(AOwner: TComponent); +begin + inherited; + ControlStyle := ControlStyle + [csAcceptsControls]; + + FBackground := TBitmap.Create; + + FBorders := True; + FBorderType := pbrEtched; + FSkinType := sknSkin; + Color := clNone; + ParentColor := False; + SkinManager.AddSkinNotification(Self); +end; + +destructor TSpTBXCustomPanel.Destroy; +begin + FreeAndNil(FBackground); + SkinManager.RemoveSkinNotification(Self); + inherited; +end; + +procedure TSpTBXCustomPanel.CreateParams(var Params: TCreateParams); +begin + inherited CreateParams(Params); + if not (csDesigning in ComponentState) then begin + with Params do + Style := Style or WS_CLIPCHILDREN; + with Params.WindowClass do + Style := Style and not (CS_HREDRAW or CS_VREDRAW); + end; +end; + +procedure TSpTBXCustomPanel.AdjustClientRect(var Rect: TRect); +begin + inherited AdjustClientRect(Rect); + if Borders then + 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; + Realign; + InvalidateBackground; + end; +end; + +procedure TSpTBXCustomPanel.SetBorderType(const Value: TSpTBXPanelBorder); +begin + if FBorderType <> Value then begin + FBorderType := Value; + InvalidateBackground; + end; +end; + +procedure TSpTBXCustomPanel.SetSkinType(const Value: TSpTBXSkinType); +begin + if Value <> FSkinType then begin + FSkinType := Value; + InvalidateBackground(False); + end; +end; + +procedure TSpTBXCustomPanel.SetTBXStyleBackground(const Value: Boolean); +begin + if FTBXStyleBackground <> Value then begin + FTBXStyleBackground := Value; + InvalidateBackground; + end; +end; + +procedure TSpTBXCustomPanel.DoDrawBackground(ACanvas: TCanvas; + ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +begin + if Assigned(FOnDrawBackground) then FOnDrawBackground(Self, ACanvas, ARect, + PaintStage, PaintDefault); +end; + +procedure TSpTBXCustomPanel.DrawBackground(ACanvas: TCanvas; ARect: TRect); +begin + SpDrawXPPanel(ACanvas, ARect, True, FTBXStyleBackground, FSkinType, FBorderType); +end; + +procedure TSpTBXCustomPanel.CMFontChanged(var Message: TMessage); +begin + inherited; + InvalidateBackground(False); +end; + +procedure TSpTBXCustomPanel.CMSpTBXControlsInvalidate(var Message: TMessage); +begin + InvalidateBackground; + Message.Result := 1; +end; + +procedure TSpTBXCustomPanel.WMEraseBkgnd(var Message: TMessage); +var + R, R2: TRect; + PaintDefault: Boolean; + ACanvas: TCanvas; +begin + Message.Result := 1; + + if (not DoubleBuffered or (Message.wParam = Message.lParam)) and + not (csDestroying in ComponentState) and Assigned(FBackground) then + begin + ACanvas := TCanvas.Create; + try + ACanvas.Handle := TWMEraseBkgnd(Message).DC; + R := ClientRect; + + if (FBackground.Width = R.Right) and (FBackground.Height = R.Bottom) and not Assigned(FOnDrawBackground) then + ACanvas.Draw(R.Left, R.Top, FBackground) + else begin + FBackground.Width := R.Right; + FBackground.Height := R.Bottom; + + if (Color = clNone) and Assigned(Parent) then begin + // The Panel is a special component, it has the ability + // to paint the parent background on its children controls. + // For that it receives WM_ERASEBKGND messages from its children + // via SpDrawParentBackground. + SpDrawParentBackground(Self, FBackground.Canvas.Handle, R); + // PerformEraseBackground(Self, FBackground.Canvas.Handle); + end + else + Windows.FillRect(FBackground.Canvas.Handle, ClientRect, Brush.Handle); + + // Set the Font after SpDrawParentBackground, DrawThemeParentBackground, + // or PerformEraseBackground. + // The API messes the font, it seems it destroys it. + // For more info see: + // - TCustomActionControl.DrawBackground for more info. + // - Theme Explorer Main.pas TMainForm.ControlMessage + // (http://www.soft-gems.net:8080/browse/Demos) + FBackground.Canvas.Font.Handle := 0; // Reset the font, it gets destroyed + FBackground.Canvas.Font.Color := $010101; // Force a change + FBackground.Canvas.Font.Assign(Self.Font); + + PaintDefault := True; + DoDrawBackground(FBackground.Canvas, R, pstPrePaint, PaintDefault); + if PaintDefault then begin + if not FBorders then begin + R2 := R; + InflateRect(R2, 3, 3); + DrawBackground(FBackground.Canvas, R2); + end + else + DrawBackground(FBackground.Canvas, R); + end; + PaintDefault := True; + DoDrawBackground(FBackground.Canvas, R, pstPostPaint, PaintDefault); + + ACanvas.Draw(R.Left, R.Top, FBackground); + end; + finally + ACanvas.Handle := 0; + ACanvas.Free; + end; + end; +end; + +procedure TSpTBXCustomPanel.WMWindowPosChanged(var Message: TWMWindowPosChanged); +begin + inherited; + InvalidateBackground; +end; + +procedure TSpTBXCustomPanel.WMSpSkinChange(var Message: TMessage); +begin + InvalidateBackground; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXPanel } + +procedure TSpTBXPanel.DrawBackground(ACanvas: TCanvas; ARect: TRect); +begin + if not TBXStyleBackground and FHotTrack then begin + if SpTBXSkinType(SkinType) = sknNone then + SpDrawXPPanelBorder(ACanvas, ARect, pbrDoubleSunken) + else + SpDrawXPEditFrame(ACanvas, ARect, Enabled, FHotTracking, SkinType, True, True); + end + else + inherited; +end; + +procedure TSpTBXPanel.CMFocusChanged(var Message: TCMFocusChanged); +begin + inherited; + if FHotTrack and Assigned(Message.Sender) then begin + FChildFocused := SpFindControl(Self, Message.Sender) > -1; + if FChildFocused <> FHotTracking then + SetHotTracking(FChildFocused); + end; +end; + +procedure TSpTBXPanel.CMMouseEnter(var Message: TMessage); +begin + inherited; + if FHotTrack and not FHotTracking then + SetHotTracking(True); +end; + +procedure TSpTBXPanel.CMMouseLeave(var Message: TMessage); +begin + inherited; + if FHotTrack and FHotTracking and not FChildFocused then + SetHotTracking(False); +end; + +procedure TSpTBXPanel.SetHotTrack(const Value: Boolean); +begin + if FHotTrack <> Value then begin + FHotTrack := Value; + InvalidateBackground(False); + end; +end; + +procedure TSpTBXPanel.SetHotTracking(const Value: Boolean); +begin + if SpTBXSkinType(SkinType) = sknSkin then begin + FHotTracking := Value; + InvalidateBackground(False); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomGroupBox } + +constructor TSpTBXCustomGroupBox.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + ControlStyle := ControlStyle + [csSetCaption]; + Width := 185; + Height := 105; +end; + +procedure TSpTBXCustomGroupBox.AdjustClientRect(var Rect: TRect); +var + R: TRect; + H: Integer; +begin + inherited AdjustClientRect(Rect); + Canvas.Font := Font; + R := Rect; + H := SpDrawXPText(Canvas, '0', R, DT_SINGLELINE or DT_CALCRECT); + Inc(Rect.Top, H); +end; + +procedure TSpTBXCustomGroupBox.CMDialogChar(var Message: TCMDialogChar); +begin + with Message do + if IsAccel(CharCode, Caption) and SpCanFocus(Self) then begin + SelectFirst; + Result := 1; + end + else + inherited; +end; + +procedure TSpTBXCustomGroupBox.CMTextChanged(var Message: TMessage); +begin + inherited; + InvalidateBackground(False); + Realign; +end; + +procedure TSpTBXCustomGroupBox.DrawBackground(ACanvas: TCanvas; ARect: TRect); +var + Flags: Cardinal; +begin + Flags := DT_SINGLELINE; + if UseRightToLeftAlignment then + Flags := Flags or DT_RTLREADING; + SpDrawXPGroupBox(ACanvas, ARect, Caption, Flags, True, TBXStyleBackground, SkinType); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXTextObjectActionLink } + +{$IFNDEF UNICODE} +procedure TSpTBXTextObjectActionLink.AssignClient(AClient: TObject); +begin + inherited AssignClient(AClient); + FUnicodeClient := AClient as TSpTBXTextObject; +end; + +function TSpTBXTextObjectActionLink.IsCheckedLinked: Boolean; +begin + Result := inherited IsCheckedLinked and + (FUnicodeClient.Checked = (Action as TCustomAction).Checked); +end; + +function TSpTBXTextObjectActionLink.IsCaptionLinked: Boolean; +begin + if (Action is TCustomAction) and Supports(Action, ITntAction) then + Result := FUnicodeClient.Caption = TntActnList.TntAction_GetCaption(Action as TCustomAction) + else + Result := inherited IsCaptionLinked; +end; + +function TSpTBXTextObjectActionLink.IsHintLinked: Boolean; +begin + if (Action is TCustomAction) and Supports(Action, ITntAction) then + Result := FUnicodeClient.Hint = TntActnList.TntAction_GetHint(Action as TCustomAction) + else + Result := inherited IsHintLinked; +end; + +procedure TSpTBXTextObjectActionLink.SetCaption(const Value: String); +begin + if IsCaptionLinked then + if (Action is TCustomAction) and Supports(Action, ITntAction) then + FUnicodeClient.Caption := TntActnList.TntAction_GetNewCaption(Action as TCustomAction, Value) + else + FUnicodeClient.Caption := Value; +end; + +procedure TSpTBXTextObjectActionLink.SetChecked(Value: Boolean); +begin + if IsCheckedLinked then FUnicodeClient.Checked := Value; +end; + +procedure TSpTBXTextObjectActionLink.SetHint(const Value: String); +begin + if IsHintLinked then + if (Action is TCustomAction) and Supports(Action, ITntAction) then + FUnicodeClient.Hint := TntActnList.TntAction_GetNewHint(Action as TCustomAction, Value) + else + FUnicodeClient.Hint := Value; +end; + +procedure TSpTBXTextObjectActionLink.SetImageIndex(Value: Integer); +begin + if IsImageIndexLinked then FUnicodeClient.ImageIndex := Value; +end; +{$ENDIF} + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXTextObject } + +constructor TSpTBXTextObject.Create(AOwner: TComponent); +begin + inherited; + ControlStyle := ControlStyle + [csClickEvents, csDoubleClicks, csSetCaption] - [csAcceptsControls, csOpaque]; + + FImageIndex := -1; + FImageChangeLink := TChangeLink.Create; + FImageChangeLink.OnChange := ImageListChange; + + FAlignment := taLeftJustify; + FCaptionGlowColor := clYellow; + FDisabledIconCorrection := True; + FDrawPushedCaption := False; + FShowAccelChar := True; + FSkinType := sknSkin; + + Autosize := True; + Color := clNone; + DoubleBuffered := True; + ParentColor := False; + TabStop := True; + Width := 100; + SkinManager.AddSkinNotification(Self); +end; + +destructor TSpTBXTextObject.Destroy; +begin + FImageChangeLink.Free; + SkinManager.RemoveSkinNotification(Self); + + inherited; +end; + +procedure TSpTBXTextObject.CreateParams(var Params: TCreateParams); +begin + inherited CreateParams(Params); + { + if not (csDesigning in ComponentState) then + with Params.WindowClass do + Style := Style and not (CS_HREDRAW or CS_VREDRAW); + } +end; + +procedure TSpTBXTextObject.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited; + if Operation = opRemove then + if AComponent = Images then SetImages(nil); +end; + +procedure TSpTBXTextObject.DefineProperties(Filer: TFiler); +begin + inherited; + + // [Backward-Compatibility]: Don't read/save LinkFont, it's not used anymore + Filer.DefineProperty('LinkFont.Charset', ReadLinkFont, nil, False); + Filer.DefineProperty('LinkFont.Color', ReadLinkFont, nil, False); + Filer.DefineProperty('LinkFont.Height', ReadLinkFont, nil, False); + Filer.DefineProperty('LinkFont.Name', ReadLinkFont, nil, False); + Filer.DefineProperty('LinkFont.Orientation', ReadLinkFont, nil, False); + Filer.DefineProperty('LinkFont.Pitch', ReadLinkFont, nil, False); + Filer.DefineProperty('LinkFont.Style', ReadLinkFont, nil, False); + + Filer.DefineProperty('EditButton.LinkFont.Charset', ReadLinkFont, nil, False); + Filer.DefineProperty('EditButton.LinkFont.Color', ReadLinkFont, nil, False); + Filer.DefineProperty('EditButton.LinkFont.Height', ReadLinkFont, nil, False); + Filer.DefineProperty('EditButton.LinkFont.Name', ReadLinkFont, nil, False); + Filer.DefineProperty('EditButton.LinkFont.Orientation', ReadLinkFont, nil, False); + Filer.DefineProperty('EditButton.LinkFont.Pitch', ReadLinkFont, nil, False); + Filer.DefineProperty('EditButton.LinkFont.Style', ReadLinkFont, nil, False); + + Filer.DefineProperty('SpinButton.LinkFont.Charset', ReadLinkFont, nil, False); + Filer.DefineProperty('SpinButton.LinkFont.Color', ReadLinkFont, nil, False); + Filer.DefineProperty('SpinButton.LinkFont.Height', ReadLinkFont, nil, False); + Filer.DefineProperty('SpinButton.LinkFont.Name', ReadLinkFont, nil, False); + Filer.DefineProperty('SpinButton.LinkFont.Orientation', ReadLinkFont, nil, False); + Filer.DefineProperty('SpinButton.LinkFont.Pitch', ReadLinkFont, nil, False); + Filer.DefineProperty('SpinButton.LinkFont.Style', ReadLinkFont, nil, False); +end; + +function TSpTBXTextObject.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TSpTBXTextObjectActionLink; +end; + +procedure TSpTBXTextObject.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + inherited; + + if Sender is TCustomAction then + with TCustomAction(Sender) do begin + if not CheckDefaults or (Self.Checked = False) then + Self.Checked := Checked; + if not CheckDefaults or (Self.ImageIndex = -1) then + Self.ImageIndex := ImageIndex; + end; +end; + +procedure TSpTBXTextObject.AdjustFont(AFont: TFont); +begin + if (FLinkText <> '') and MouseInControl then begin + AFont.Color := clBlue; + AFont.Style := AFont.Style + [fsUnderline]; + end; +end; + +procedure TSpTBXTextObject.AdjustBounds; +var + NewWidth, NewHeight: Integer; +begin + if HandleAllocated and not FUpdating and ([csReading, csLoading] * ComponentState = []) and AutoSize then + begin + FUpdating := True; + try + NewWidth := Width; + NewHeight := 0; + DoAdjustBounds(NewWidth, NewHeight); + SetBounds(Left, Top, NewWidth, NewHeight); + finally + FUpdating := False; + end; + end; +end; + +function TSpTBXTextObject.CanFocus: Boolean; +begin + Result := False; +end; + +procedure TSpTBXTextObject.Click; +begin + if not (csLoading in ComponentState) then begin + Invalidate; + inherited; + ExecuteLink; + end; +end; + +function TSpTBXTextObject.CanAutoSize(var NewWidth, NewHeight: Integer): Boolean; +begin + if not FUpdating and ([csReading, csLoading] * ComponentState = []) and AutoSize then begin + FUpdating := True; + try + NewHeight := 0; + DoAdjustBounds(NewWidth, NewHeight); + Result := True; + finally + FUpdating := False; + end; + end + else + Result := False; +end; + +procedure TSpTBXTextObject.DoAdjustBounds(var NewWidth, NewHeight: Integer); +var + R, R1, R2: TRect; +begin + GetSize(R, R1, R2); + NewHeight := R.Bottom - R.Top; + if Wrapping = twNone then + NewWidth := R.Right - R.Left; +end; + +procedure TSpTBXTextObject.DoDrawHint(AHintBitmap: TBitmap; + var AHint: Widestring; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawHint) then FOnDrawHint(Self, AHintBitmap, AHint, PaintDefault); +end; + +function TSpTBXTextObject.DoDrawItem(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage): Boolean; +begin + Result := True; + if Assigned(FOnDraw) then FOnDraw(Self, ACanvas, ARect, PaintStage, Result); +end; + +function TSpTBXTextObject.DoDrawText(ACanvas: TCanvas; var ARect: TRect; + Flags: Longint): Integer; +var + PaintDefault: Boolean; + GlyphSize, DummyRightGlyphSize: TSize; + DummyRightGlyphRect: TRect; + R, R1, R2: TRect; + WS: WideString; + TextFlags: Cardinal; + State: TSpTBXSkinStatesType; +begin + Result := 0; + WS := Caption; + TextFlags := Flags; + if TextFlags and DT_CALCRECT = 0 then begin + ACanvas.Brush.Style := bsClear; + State := CurrentSkin.GetState(Enabled, Pushed, MouseInControl, Checked); + + PaintDefault := True; + if Assigned(FOnDrawCaption) then + FOnDrawCaption(Self, ACanvas, ClientRect, State, WS, ARect, TextFlags, False, pstPrePaint, PaintDefault); + + if PaintDefault then begin + // Calc the rects + GlyphSize := GetGlyphSize; + DummyRightGlyphSize.cx := 0; + DummyRightGlyphSize.cy := 0; + DummyRightGlyphRect := Rect(0, 0, 0, 0); + SpCalcXPText(ACanvas, ARect, WS, GetRealAlignment(Self), TextFlags, GlyphSize, DummyRightGlyphSize, FGlyphLayout, DrawPushedCaption and Pushed, R1, R2, DummyRightGlyphRect, FCaptionRoatationAngle); + + // Paint the text + if not Enabled then + if SpTBXSkinType(FSkinType) = sknNone then begin + OffsetRect(R1, 1, 1); + ACanvas.Font.Color := clBtnHighlight; + SpDrawXPText(ACanvas, WS, R1, TextFlags, FCaptionGlow, FCaptionGlowColor, FCaptionRoatationAngle); + OffsetRect(R1, -1, -1); + ACanvas.Font.Color := clGrayText; + end; + SpDrawXPText(ACanvas, WS, R1, TextFlags, FCaptionGlow, FCaptionGlowColor, FCaptionRoatationAngle); + + // Paint the glyph + DoInternalGlyphDraw(ACanvas, R2); + end; + + PaintDefault := True; + if Assigned(FOnDrawCaption) then + FOnDrawCaption(Self, ACanvas, ClientRect, State, WS, ARect, TextFlags, False, pstPostPaint, PaintDefault); + if PaintDefault then + if GetFocused then begin + R := ClientRect; + SpDrawFocusRect(ACanvas, GetFocusRect(R, R1, R2)); + end; + end + else + Result := SpDrawXPText(ACanvas, WS, ARect, TextFlags); +end; + +procedure TSpTBXTextObject.DoGetImageIndex(var AImageList: TCustomImageList; var AImageIndex: Integer); +begin + if Assigned(FOnGetImageIndex) then FOnGetImageIndex(Self, AImageList, AImageIndex); +end; + +procedure TSpTBXTextObject.DoInternalGlyphDraw(ACanvas: TCanvas; + AGlyphRect: TRect); +var + I: Integer; + IL: TCustomImageList; +begin + IL := FImages; + I := FImageIndex; + DoGetImageIndex(IL, I); + if Assigned(IL) and (I > -1) and (I < IL.Count) then + SpDrawImageList(ACanvas, AGlyphRect, IL, I, Enabled, FDisabledIconCorrection) +end; + +procedure TSpTBXTextObject.DoMouseEnter; +begin + Invalidate; + if Assigned(FOnMouseEnter) then FOnMouseEnter(Self); +end; + +procedure TSpTBXTextObject.DoMouseLeave; +begin + Invalidate; + if Assigned(FOnMouseLeave) then FOnMouseLeave(Self); +end; + +procedure TSpTBXTextObject.ExecuteLink; +begin + if FLinkText <> '' then + if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then + ShellExecuteA(Application.Handle, 'open', PAnsiChar(AnsiString(FLinkText)), PAnsiChar(AnsiString(FLinkTextParams)), '', SW_SHOWNORMAL) + else + ShellExecuteW(Application.Handle, 'open', PWideChar(FLinkText), PWideChar(FLinkTextParams), '', SW_SHOWNORMAL); +end; + +function TSpTBXTextObject.GetControlsAlignment: TAlignment; +begin + Result := FAlignment; +end; + +function TSpTBXTextObject.GetTextFlags: Cardinal; +const + Alignments: array [TAlignment] of Integer = (DT_LEFT, DT_RIGHT, DT_CENTER); + WordWraps: array [TTextWrapping] of Integer = (DT_SINGLELINE, + DT_SINGLELINE or DT_END_ELLIPSIS, + DT_SINGLELINE or DT_PATH_ELLIPSIS, DT_WORDBREAK); + ShowAccelChars: array [Boolean] of Integer = (DT_NOPREFIX, 0); + SystemAccelChars: array [Boolean] of Integer = (DT_HIDEPREFIX, 0); +begin + // Note on SystemAccelChars: custom controls need to update the accel painting + // in response to WM_UPDATEUISTATE, call WM_QUERYUISTATE to get the accel + // painting state: + // http://blogs.msdn.com/oldnewthing/archive/2005/05/03/414317.aspx + // + // Another way of doing it is updating a flag in WM_UPDATEUISTATE, without + // calling WM_QUERYUISTATE everytime the control needs to be painted: + // begin + // if LoWord(Message.WParam) and UISF_HIDEACCEL = UISF_HIDEACCEL then begin + // if HiWord(Message.WParam) and UIS_CLEAR = UIS_CLEAR then + // FSystemShowAccelChar := True; + // if HiWord(Message.WParam) and UIS_SET = UIS_SET then + // FSystemShowAccelChar := False; + // end; + // inherited; + // end; + // + // To test this use the mouse to run the app on the IDE, don't use F9 + // otherwise the accel will always be visible + + Result := DT_EXPANDTABS or WordWraps[Wrapping] or + Alignments[GetRealAlignment(Self)] or + ShowAccelChars[ShowAccelChar] or SystemAccelChars[SendMessage(Handle, WM_QUERYUISTATE, 0, 0) and UISF_HIDEACCEL = 0]; + Result := DrawTextBiDiModeFlags(Result); +end; + +function TSpTBXTextObject.GetFocusRect(R, TextR, GlyphR: TRect): TRect; +begin + if Caption = '' then + Result := Rect(0, 0, 0, 0) + else begin + InflateRect(TextR, 1, 1); + Result := TextR; + end; +end; + +function TSpTBXTextObject.GetGlyphSize: TSize; +var + I: Integer; + IL: TCustomImageList; +begin + IL := FImages; + I := FImageIndex; + DoGetImageIndex(IL, I); + if Assigned(IL) and (I > -1) and (I < IL.Count) then begin + Result.cx := IL.Width; + Result.cy := IL.Height; + end + else begin + Result.cx := 0; + Result.cy := 0; + end; +end; + +function TSpTBXTextObject.GetFocused: Boolean; +begin + Result := Focused; +end; + +function TSpTBXTextObject.GetPushed: Boolean; +begin + Result := FPushed and MouseInControl; +end; + +procedure TSpTBXTextObject.GetSize(out TotalR, TextR, GlyphR: TRect); +// Size of Text + Glyph + TextMargin + Margins +var + GlyphSize, DummyRightGlyphSize: TSize; + DummyRightGlyphRect: TRect; + R: TRect; +begin + GlyphSize := GetGlyphSize; + DummyRightGlyphSize.cx := 0; + DummyRightGlyphSize.cy := 0; + DummyRightGlyphRect := Rect(0, 0, 0, 0); + R := ClientRect; + ApplyMargins(R, GetTextMargins); + + Canvas.Font.Assign(Font); + AdjustFont(Canvas.Font); + SpCalcXPText(Canvas, R, Caption, GetRealAlignment(Self), GetTextFlags, GlyphSize, DummyRightGlyphSize, + FGlyphLayout, DrawPushedCaption and Pushed, TextR, GlyphR, DummyRightGlyphRect); + + UnionRect(TotalR, TextR, GlyphR); + + {$IF CompilerVersion > 17} + if Autosize then + with Margins do begin + Inc(TotalR.Right, Left + Right); + Inc(TotalR.Bottom, Top + Bottom); + end; + {$IFEND} +end; + +function TSpTBXTextObject.GetTextMargins: TRect; +begin + Result := Rect(0, 0, 0, 0); +end; + +procedure TSpTBXTextObject.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + if (Button = mbLeft) and Enabled and not FPushed then begin + FPushed := True; + if not Focused and CanFocus then + SetFocus // Invalidates the canvas + else + Invalidate; + end; + inherited; +end; + +procedure TSpTBXTextObject.MouseMove(Shift: TShiftState; X, Y: Integer); +begin + if FPushed then + UpdateTracking; + inherited; +end; + +procedure TSpTBXTextObject.MouseUp(Button: TMouseButton; Shift: TShiftState; X, + Y: Integer); +begin + FPushed := False; + Invalidate; + inherited; +end; + +procedure TSpTBXTextObject.KeyDown(var Key: Word; Shift: TShiftState); +begin + inherited; + if (Key = VK_SPACE) and FSpaceAsClick then begin + FPushed := True; + FMouseInControl := True; + Invalidate; + end; +end; + +procedure TSpTBXTextObject.KeyUp(var Key: Word; Shift: TShiftState); +begin + if (Key = VK_SPACE) and FSpaceAsClick and FPushed then begin + FPushed := False; + FMouseInControl := False; + Click; + Invalidate; + end; + inherited; +end; + +procedure TSpTBXTextObject.Paint; +var + R, TextR: TRect; +begin + R := ClientRect; + Canvas.Font.Assign(Font); + AdjustFont(Canvas.Font); + // Draw the background + DoDrawItem(Canvas, R, pstPrePaint); + // Draw the text + TextR := R; + ApplyMargins(TextR, GetTextMargins); + DoDrawText(Canvas, TextR, GetTextFlags); + // Draw the Focus, Icon and Text + DoDrawItem(Canvas, R, pstPostPaint); +end; + +procedure TSpTBXTextObject.ReadLinkFont(Reader: TReader); +begin + // [Backward-Compatibility] + Reader.SkipValue; +end; + +procedure TSpTBXTextObject.SetAlignment(const Value: TAlignment); +begin + if FAlignment <> Value then begin + FAlignment := Value; + Invalidate; + end; +end; + +procedure TSpTBXTextObject.Loaded; +begin + inherited; + AdjustBounds; +end; + +procedure TSpTBXTextObject.SetCaptionGlow(const Value: TSpGlowDirection); +begin + if FCaptionGlow <> Value then begin + FCaptionGlow := Value; + Invalidate; + end; +end; + +procedure TSpTBXTextObject.SetCaptionGlowColor(const Value: TColor); +begin + if FCaptionGlowColor <> Value then begin + FCaptionGlowColor := Value; + Invalidate; + end; +end; + +procedure TSpTBXTextObject.SetCaptionRoatationAngle(const Value: TSpTextRotationAngle); +begin + if FCaptionRoatationAngle <> Value then begin + FCaptionRoatationAngle := Value; + Invalidate; + end; +end; + +function TSpTBXTextObject.GetChecked: Boolean; +begin + Result := FChecked; +end; + +procedure TSpTBXTextObject.SetChecked(Value: Boolean); +begin + if Value <> FChecked then begin + FChecked := Value; + Invalidate; + end; +end; + +procedure TSpTBXTextObject.SetGlyphLayout(const Value: TSpGlyphLayout); +begin + if FGlyphLayout <> Value then begin + FGlyphLayout := Value; + Invalidate; + end; +end; + +function TSpTBXTextObject.IsImageIndexValid: Boolean; +var + I: Integer; + IL: TCustomImageList; +begin + IL := FImages; + I := FImageIndex; + DoGetImageIndex(IL, I); + Result := Assigned(IL) and (I > -1) and (I < IL.Count); +end; + +procedure TSpTBXTextObject.ImageListChange(Sender: TObject); +begin + if Sender = Images then begin + Invalidate; + AdjustBounds; + end; +end; + +procedure TSpTBXTextObject.SetImageIndex(const Value: TImageIndex); +begin + if FImageIndex <> Value then begin + FImageIndex := Value; + if Assigned(Images) then Invalidate; + AdjustBounds; + end; +end; + +procedure TSpTBXTextObject.SetImages(const Value: TCustomImageList); +begin + if FImages <> nil then FImages.UnRegisterChanges(FImageChangeLink); + FImages := Value; + if FImages <> nil then begin + FImages.RegisterChanges(FImageChangeLink); + FImages.FreeNotification(Self); + end; + Invalidate; + AdjustBounds; +end; + +procedure TSpTBXTextObject.SetShowAccelChar(Value: Boolean); +begin + if FShowAccelChar <> Value then begin + FShowAccelChar := Value; + AdjustBounds; + Invalidate; + end; +end; + +procedure TSpTBXTextObject.SetSkinType(const Value: TSpTBXSkinType); +begin + if FSkinType <> Value then begin + FSkinType := Value; + Invalidate; + end; +end; + +procedure TSpTBXTextObject.SetWrapping(Value: TTextWrapping); +begin + if FWrapping <> Value then begin + FWrapping := Value; + AdjustBounds; + Invalidate; + end; +end; + +procedure TSpTBXTextObject.UpdateTracking(ForceMouseLeave: Boolean = False); +var + P: TPoint; + IsInControl: Boolean; +begin + if ForceMouseLeave then begin + FMouseInControl := True; + Perform(CM_MOUSELEAVE, 0, 0) + end + else + if Enabled then begin + GetCursorPos(P); + IsInControl := FindDragTarget(P, True) = Self; + + if FMouseInControl <> IsInControl then begin + FMouseInControl := not IsInControl; + if FMouseInControl then + Perform(CM_MOUSELEAVE, 0, 0) + else + Perform(CM_MOUSEENTER, 0, 0); + end; + end; +end; + +procedure TSpTBXTextObject.CMEnabledChanged(var Message: TMessage); +begin + inherited; + if not Enabled and FMouseInControl then begin + FMouseInControl := False; + DoMouseLeave; + Perform(WM_CANCELMODE, 0, 0); + end + else + Invalidate; +end; + +procedure TSpTBXTextObject.CMFontChanged(var Message: TMessage); +begin + inherited; + Invalidate; + AdjustBounds; +end; + +procedure TSpTBXTextObject.CMHintShow(var Message: TCMHintShow); +// Handle the CM_HINTSHOW message to show unicode hints using +// a custom THintWindow. +var + HintInfo: PHintInfo; + WideHint, PrevWideHint: Widestring; + R, TextR: TRect; + PaintDefault: Boolean; + I: Integer; +begin + // Get the short hint + I := Pos('|', Hint); + if I = 0 then + WideHint := Hint + else + WideHint := Copy(Hint, 1, I - 1); + + // Prepare the HintBitmap + SpStockHintBitmap.Canvas.Font.Assign(Screen.HintFont); + SpStockHintBitmap.Canvas.Font.Color := clInfoText; + SpStockHintBitmap.Canvas.Pen.Color := clBlack; + SpStockHintBitmap.Canvas.Brush.Color := clInfoBk; + TextR := Rect(0, 0, 1, 1); + SpDrawXPText(SpStockHintBitmap.Canvas, WideHint, TextR, DT_NOPREFIX or DT_CALCRECT); + SpStockHintBitmap.Width := TextR.Right + 8; + SpStockHintBitmap.Height := TextR.Bottom + 4; + R := Rect(0, 0, SpStockHintBitmap.Width, SpStockHintBitmap.Height); + SpDrawXPTooltipBackground(SpStockHintBitmap.Canvas, R); + + // Draw the hint in the HintBitmap + PrevWideHint := WideHint; + PaintDefault := True; + DoDrawHint(SpStockHintBitmap, WideHint, PaintDefault); + if PaintDefault then begin + // Prepare the HintInfo + HintInfo := Message.HintInfo; + HintInfo.HintStr := WideHint; + HintInfo.CursorRect := ClientRect; + HintInfo.HintWindowClass := SpTBXHintWindowClass; // Custom HintWindow class + HintInfo.HintData := SpStockHintBitmap; // TApplication.ActivateHint will pass the data to the HintWindow + HintInfo.HideTimeout := 60000; // 1 minute + + // Adjust the bounds and repaint the background if it's needed + if WideHint <> PrevWideHint then begin + TextR := Rect(0, 0, 1, 1); + SpDrawXPText(SpStockHintBitmap.Canvas, WideHint, TextR, DT_NOPREFIX or DT_CALCRECT); + SpStockHintBitmap.Width := TextR.Right + 8; + SpStockHintBitmap.Height := TextR.Bottom + 4; + R := Rect(0, 0, SpStockHintBitmap.Width, SpStockHintBitmap.Height); + SpDrawXPTooltipBackground(SpStockHintBitmap.Canvas, R); + end + else + R := Rect(0, 0, SpStockHintBitmap.Width, SpStockHintBitmap.Height); + + // Draw the hint + OffsetRect(TextR, ((R.Right - TextR.Right) div 2) - 2, (R.Bottom - TextR.Bottom) div 2); + SpDrawXPText(SpStockHintBitmap.Canvas, WideHint, TextR, DT_NOPREFIX); + end; +end; + +procedure TSpTBXTextObject.CMMouseEnter(var Message: TMessage); +begin + inherited; + if not FMouseInControl then begin + FMouseInControl := True; + DoMouseEnter; + end; +end; + +procedure TSpTBXTextObject.CMMouseLeave(var Message: TMessage); +begin + inherited; + if FMouseInControl then begin + FMouseInControl := False; + DoMouseLeave; + end; +end; + +procedure TSpTBXTextObject.CMTextChanged(var Message: TMessage); +begin + inherited; + Invalidate; + AdjustBounds; +end; + +procedure TSpTBXTextObject.WMEraseBkgnd(var Message: TMessage); +begin + if not DoubleBuffered or (Message.wParam = Message.lParam) then + begin + if (Color = clNone) and Assigned(Parent) then + SpDrawParentBackground(Self, TWMEraseBkgnd(Message).DC, ClientRect) + else + Windows.FillRect(TWMEraseBkgnd(Message).DC, ClientRect, Brush.Handle); + end; + Message.Result := 1; +end; + +procedure TSpTBXTextObject.WMKillFocus(var Message: TMessage); +begin + inherited; + FPushed := False; + Invalidate; +end; + +procedure TSpTBXTextObject.WMSetFocus(var Message: TMessage); +begin + inherited; + Invalidate; +end; + +procedure TSpTBXTextObject.WMSetCursor(var Message: TWMSetCursor); +begin + if not (csDesigning in ComponentState) and (Message.CursorWnd = Handle) and + (FLinkText <> '') and MouseInControl and (Screen.Cursor = crDefault) then + begin + // Replace the Delphi hand cursor for the one used by Windows only if + // there is no other cursor assigned. + Windows.SetCursor(Screen.Cursors[crSpTBXNewHandPoint]); + Message.Result := 1; + end + else + inherited; +end; + +procedure TSpTBXTextObject.WMSpSkinChange(var Message: TMessage); +var + R: TRect; +begin + if HandleAllocated then begin + R := ClientRect; + InvalidateRect(Handle, @R, True); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomLabel } + +constructor TSpTBXCustomLabel.Create(AOwner: TComponent); +begin + inherited; + FUnderlineColor := clBtnShadow; + TabStop := False; +end; + +procedure TSpTBXCustomLabel.AdjustFont(AFont: TFont); +var + State: TSpTBXSkinStatesType; +begin + if (LinkText <> '') and MouseInControl then + inherited + else + if (SkinType = sknSkin) and ((AFont.Color = clWindowText) or (AFont.Color = clNone)) then begin + State := CurrentSkin.GetState(Enabled, Pushed, MouseInControl, Checked); + AFont.Color := CurrentSkin.GetTextColor(skncLabel, State); + end; +end; + +function TSpTBXCustomLabel.DoDrawItem(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage): Boolean; +var + C: TColor; +begin + Result := inherited DoDrawItem(ACanvas, ARect, PaintStage); + if Result and (PaintStage = pstPrePaint) and FUnderline then begin + C := ACanvas.Pen.Color; + try + ACanvas.Pen.Color := UnderlineColor; + ACanvas.MoveTo(ARect.Left, ARect.Bottom - 1); + ACanvas.LineTo(ARect.Right, ARect.Bottom - 1); + finally + ACanvas.Pen.Color := C; + end; + end; +end; + +procedure TSpTBXCustomLabel.GetSize(out TotalR, TextR, GlyphR: TRect); +begin + inherited GetSize(TotalR, TextR, GlyphR); + if FUnderline then + Inc(TotalR.Bottom); +end; + +procedure TSpTBXCustomLabel.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if Operation = opRemove then + if AComponent = FocusControl then SetFocusControl(nil); +end; + +procedure TSpTBXCustomLabel.SetFocusControl(const Value: TWinControl); +begin + if FFocusControl <> Value then + begin + FFocusControl := Value; + if FFocusControl <> nil then FFocusControl.FreeNotification(Self); + end; +end; + +procedure TSpTBXCustomLabel.SetUnderline(const Value: Boolean); +begin + if Value <> FUnderline then begin + FUnderline := Value; + Invalidate; + AdjustBounds; + end; +end; + +procedure TSpTBXCustomLabel.SetUnderlineColor(const Value: TColor); +begin + FUnderlineColor := Value; + Invalidate; +end; + +procedure TSpTBXCustomLabel.CMDialogChar(var Message: TCMDialogChar); +begin + if Enabled and IsAccel(Message.CharCode, Caption) then begin + if SpCanFocus(FFocusControl) then + FFocusControl.SetFocus + else + Click; + Message.Result := 1; + end + else + inherited; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXButtonControl } + +constructor TSpTBXButtonControl.Create(AOwner: TComponent); +begin + inherited; + ControlStyle := ControlStyle - [csDoubleClicks]; + FGroupIndex := 0; +end; + +function TSpTBXButtonControl.CanFocus: Boolean; +var + Control: TWinControl; + Form: TCustomForm; +begin + Result := False; + Form := GetParentForm(Self); + if (Form <> nil) and Form.Visible and Form.Enabled then begin + Control := Self; + while Control <> Form do + begin + if not (Control.Visible and Control.Enabled) then Exit; + Control := Control.Parent; + end; + Result := True; + end; +end; + +function TSpTBXButtonControl.CanUpdateExclusive: Boolean; +begin + Result := FGroupIndex <> 0; +end; + +procedure TSpTBXButtonControl.UpdateExclusive; +var + Msg: TMessage; +begin + if Assigned(Parent) and CanUpdateExclusive then begin + Msg.Msg := CM_SPGROUPINDEXUPDATE; + Msg.WParam := FGroupIndex; + Msg.LParam := Longint(Self); + Msg.Result := 0; + Parent.Broadcast(Msg); + end; +end; + +procedure TSpTBXButtonControl.SetGroupIndex(const Value: Integer); +begin + if FGroupIndex <> Value then begin + FGroupIndex := Value; + UpdateExclusive; + end; +end; + +procedure TSpTBXButtonControl.SetAllowAllUp(const Value: Boolean); +begin + if FAllowAllUp <> Value then begin + FAllowAllUp := Value; + UpdateExclusive; + end; +end; + +procedure TSpTBXButtonControl.SetChecked(Value: Boolean); +begin + inherited; + if Value then UpdateExclusive; +end; + +procedure TSpTBXButtonControl.CMDialogChar(var Message: TCMDialogChar); +begin + if Enabled and ShowAccelChar and IsAccel(Message.CharCode, Caption) and + CanFocus and Visible then + begin + SetFocus; + Click; + Message.Result := 1; + end + else + inherited; +end; + +procedure TSpTBXButtonControl.CMSPGroupIndexUpdate(var Message: TMessage); +var + Sender: TComponent; + SenderButton: TSpTBXButtonControl; +begin + if Message.WParam = FGroupIndex then begin + Sender := TComponent(Message.LParam); + if (Sender <> Self) and (Sender is TSpTBXButtonControl) and (Sender.ClassType = Self.ClassType) then begin + SenderButton := Sender as TSpTBXButtonControl; + FAllowAllUp := SenderButton.AllowAllUp; + if SenderButton.Checked and Checked then + Checked := False; + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomCheckButton } + +function TSpTBXCustomCheckButton.GetGlyphSize: TSize; +begin + Result := inherited GetGlyphSize; + if (Result.cx = 0) or (Result.cy = 0) then begin + Result.cx := 13; + Result.cy := 13; + end; +end; + +procedure TSpTBXCustomCheckButton.GetSize(out TotalR, TextR, GlyphR: TRect); +begin + inherited GetSize(TotalR, TextR, GlyphR); + // Inc TotalR for the FocusRect + if Autosize then begin + Inc(TotalR.Right); + Inc(TotalR.Bottom, 2); + end; +end; + +procedure TSpTBXCustomCheckButton.Toggle; +begin + // Toggle the check state +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomCheckBox } + +constructor TSpTBXCustomCheckBox.Create(AOwner: TComponent); +begin + inherited; + FAllowGrayed := False; + FState := cbUnchecked; + SpaceAsClick := True; +end; + +procedure TSpTBXCustomCheckBox.DoInternalGlyphDraw(ACanvas: TCanvas; + AGlyphRect: TRect); +begin + if IsImageIndexValid then + inherited + else + SpDrawXPCheckBoxGlyph(ACanvas, AGlyphRect, Enabled, State, MouseInControl, Pushed, SkinType); +end; + +procedure TSpTBXCustomCheckBox.AdjustFont(AFont: TFont); +var + State: TSpTBXSkinStatesType; +begin + if (LinkText <> '') and MouseInControl then + inherited + else + if (SkinType = sknSkin) and ((AFont.Color = clWindowText) or (AFont.Color = clNone)) then begin + State := CurrentSkin.GetState(Enabled, Pushed, MouseInControl, Checked); + AFont.Color := CurrentSkin.GetTextColor(skncCheckBox, State); + end; +end; + +procedure TSpTBXCustomCheckBox.Click; +begin + if StateChanged then + inherited + else + Toggle; // Toggle calls OnClick +end; + +function TSpTBXCustomCheckBox.GetChecked: Boolean; +begin + Result := FState = cbChecked; +end; + +procedure TSpTBXCustomCheckBox.SetChecked(Value: Boolean); +begin + if Checked <> Value then begin + inherited; + if Value then SetState(cbChecked) + else SetState(cbUnchecked); + end; +end; + +procedure TSpTBXCustomCheckBox.SetState(const Value: TCheckBoxState); +begin + if (FState <> Value) then begin + FState := Value; + + // When State is changed OnClick must be fired + StateChanged := True; + try + Click; + finally + StateChanged := False; + end; + end; +end; + +procedure TSpTBXCustomCheckBox.Toggle; +begin + case State of + cbUnchecked: if AllowGrayed then SetState(cbGrayed) else SetState(cbChecked); + cbChecked: SetState(cbUnchecked); + cbGrayed: SetState(cbChecked); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomRadioButton } + +constructor TSpTBXCustomRadioButton.Create(AOwner: TComponent); +begin + inherited; + TabStop := False; +end; + +procedure TSpTBXCustomRadioButton.DoInternalGlyphDraw(ACanvas: TCanvas; + AGlyphRect: TRect); +begin + if IsImageIndexValid then + inherited + else + SpDrawXPRadioButtonGlyph(ACanvas, AGlyphRect, Enabled, Checked, MouseInControl, Pushed, SkinType); +end; + +procedure TSpTBXCustomRadioButton.AdjustFont(AFont: TFont); +var + State: TSpTBXSkinStatesType; +begin + if (LinkText <> '') and MouseInControl then + inherited + else + if (SkinType = sknSkin) and ((AFont.Color = clWindowText) or (AFont.Color = clNone)) then begin + State := CurrentSkin.GetState(Enabled, Pushed, MouseInControl, Checked); + AFont.Color := CurrentSkin.GetTextColor(skncRadioButton, State); + end; +end; + +function TSpTBXCustomRadioButton.CanUpdateExclusive: Boolean; +begin + // Special case on RadioButtons, UpdateExclusive on all + // the radiobuttons regardless of the GroupIndex + Result := True; +end; + +procedure TSpTBXCustomRadioButton.Click; +begin + if StateChanged then + inherited + else + if not Checked then Toggle; // Toggle calls OnClick +end; + +procedure TSpTBXCustomRadioButton.CMFocusChanged(var Message: TCMFocusChanged); +begin + inherited; + if Focused then + Toggle; +end; + +procedure TSpTBXCustomRadioButton.SetChecked(Value: Boolean); +var + WasChecked: Boolean; +begin + WasChecked := Checked; + inherited; + TabStop := Value; + // When Checked is true OnClick must be fired + if not WasChecked and Value then begin + StateChanged := True; + try + Click; + finally + StateChanged := False; + end; + end; +end; + +procedure TSpTBXCustomRadioButton.Toggle; +begin + if not Checked then Checked := True; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXRadioGroupButton } + +type + TSpTBXRadioGroupButton = class(TSpTBXRadioButton) + public + constructor InternalCreate(RadioGroup: TSpTBXCustomRadioGroup); + destructor Destroy; override; + end; + +constructor TSpTBXRadioGroupButton.InternalCreate(RadioGroup: TSpTBXCustomRadioGroup); +begin + inherited Create(RadioGroup); + RadioGroup.FButtons.Add(Self); + Parent := RadioGroup; + AutoSize := False; + Visible := False; + Enabled := RadioGroup.Enabled; + ParentShowHint := False; + TabStop := False; + OnClick := RadioGroup.ButtonClick; +end; + +destructor TSpTBXRadioGroupButton.Destroy; +begin + TSpTBXCustomRadioGroup(Owner).FButtons.Remove(Self); + inherited Destroy; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomRadioGroup } + +constructor TSpTBXCustomRadioGroup.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + ControlStyle := ControlStyle - [csAcceptsControls]; + FButtons := TList.Create; + FItems := TTntStringList.Create; + TTntStringList(FItems).OnChange := ItemsChange; + FItemIndex := -1; + FColumns := 1; +end; + +destructor TSpTBXCustomRadioGroup.Destroy; +begin + SetButtonCount(0); + TTntStringList(FItems).OnChange := nil; + FItems.Free; + FButtons.Free; + inherited Destroy; +end; + +procedure TSpTBXCustomRadioGroup.FlipChildren(AllLevels: Boolean); +begin + { The radio buttons are flipped using BiDiMode } +end; + +procedure TSpTBXCustomRadioGroup.ArrangeButtons; +var + ButtonsPerCol, ButtonWidth, ButtonHeight, TopMargin, I: Integer; + DC: HDC; + SaveFont: HFont; + Metrics: TTextMetric; + DeferHandle: THandle; + ALeft: Integer; +begin + if (FButtons.Count <> 0) and not FReading then + begin + DC := GetDC(0); + SaveFont := SelectObject(DC, Font.Handle); + GetTextMetrics(DC, Metrics); + SelectObject(DC, SaveFont); + ReleaseDC(0, DC); + ButtonsPerCol := (FButtons.Count + FColumns - 1) div FColumns; + ButtonWidth := (Width - 10) div FColumns; + I := Height - Metrics.tmHeight - 5; + ButtonHeight := I div ButtonsPerCol; + TopMargin := Metrics.tmHeight + 1 + (I mod ButtonsPerCol) div 2; + DeferHandle := BeginDeferWindowPos(FButtons.Count); + try + for I := 0 to FButtons.Count - 1 do + with TSpTBXRadioGroupButton(FButtons[I]) do + begin + BiDiMode := Self.BiDiMode; + ALeft := (I div ButtonsPerCol) * ButtonWidth + 8; + if UseRightToLeftAlignment then + ALeft := Self.ClientWidth - ALeft - ButtonWidth; + DeferHandle := DeferWindowPos(DeferHandle, Handle, 0, + ALeft, + (I mod ButtonsPerCol) * ButtonHeight + TopMargin, + ButtonWidth, ButtonHeight, + SWP_NOZORDER or SWP_NOACTIVATE); + Visible := True; + end; + finally + EndDeferWindowPos(DeferHandle); + end; + end; +end; + +procedure TSpTBXCustomRadioGroup.ButtonClick(Sender: TObject); +begin + if not FUpdating then begin + FItemIndex := FButtons.IndexOf(Sender); + Changed; + Click; + end; +end; + +procedure TSpTBXCustomRadioGroup.InvalidateBackground(InvalidateChildren: Boolean); +var + I: Integer; + T: TSpTBXSkinType; +begin + inherited; + + if not InvalidateChildren and not (csDestroying in ComponentState) then + if HandleAllocated then begin + T := SkinType; + for I := 0 to FButtons.Count - 1 do + Buttons[I].SkinType := T; + end; +end; + +procedure TSpTBXCustomRadioGroup.ItemsChange(Sender: TObject); +begin + if not FReading then begin + if FItemIndex >= FItems.Count then FItemIndex := FItems.Count - 1; + UpdateButtons; + end; +end; + +procedure TSpTBXCustomRadioGroup.Loaded; +begin + inherited Loaded; + ArrangeButtons; +end; + +procedure TSpTBXCustomRadioGroup.ReadState(Reader: TReader); +begin + FReading := True; + try + inherited ReadState(Reader); + finally + FReading := False; + end; + UpdateButtons; +end; + +procedure TSpTBXCustomRadioGroup.SetButtonCount(Value: Integer); +begin + while FButtons.Count < Value do + TSpTBXRadioGroupButton.InternalCreate(Self); + while FButtons.Count > Value do + TSpTBXRadioGroupButton(FButtons.Last).Free; +end; + +procedure TSpTBXCustomRadioGroup.SetColumns(Value: Integer); +begin + if Value < 1 then Value := 1; + if Value > 16 then Value := 16; + if FColumns <> Value then begin + FColumns := Value; + ArrangeButtons; + Invalidate; + end; +end; + +procedure TSpTBXCustomRadioGroup.SetFocus; +begin + inherited; + if Enabled and (FItemIndex > -1) then + GetButtons(FItemIndex).SetFocus; +end; + +procedure TSpTBXCustomRadioGroup.SetItemIndex(Value: Integer); +begin + if FReading then + FItemIndex := Value + else begin + if Value < -1 then Value := -1; + if Value >= FButtons.Count then Value := FButtons.Count - 1; + if FItemIndex <> Value then + begin + if FItemIndex >= 0 then + GetButtons(FItemIndex).Checked := False; + FItemIndex := Value; + if FItemIndex >= 0 then + GetButtons(FItemIndex).Checked := True; + end; + end; +end; + +procedure TSpTBXCustomRadioGroup.SetItems(Value: TTntStrings); +begin + FItems.Assign(Value); +end; + +procedure TSpTBXCustomRadioGroup.UpdateButtons; +var + I: Integer; +begin + SetButtonCount(FItems.Count); + for I := 0 to FButtons.Count - 1 do + Buttons[I].Caption := FItems[I]; + if FItemIndex >= 0 then begin + FUpdating := True; + try + GetButtons(FItemIndex).Checked := True; + finally + FUpdating := False; + end; + end; + ArrangeButtons; + Invalidate; +end; + +procedure TSpTBXCustomRadioGroup.CMEnabledChanged(var Message: TMessage); +var + I: Integer; +begin + inherited; + for I := 0 to FButtons.Count - 1 do + GetButtons(I).Enabled := Enabled; +end; + +procedure TSpTBXCustomRadioGroup.CMFontChanged(var Message: TMessage); +begin + inherited; + ArrangeButtons; +end; + +procedure TSpTBXCustomRadioGroup.WMSize(var Message: TWMSize); +begin + inherited; + ArrangeButtons; +end; + +procedure TSpTBXCustomRadioGroup.GetChildren(Proc: TGetChildProc; Root: TComponent); +begin + // Do nothing +end; + +function TSpTBXCustomRadioGroup.GetButtons(Index: Integer): TSpTBXRadioButton; +begin + Result := TSpTBXRadioButton(FButtons[Index]); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomButton } + +constructor TSpTBXCustomButton.Create(AOwner: TComponent); +begin + inherited; + + FBitmapTransparent := True; + FBitmap := TBitmap.Create; + FBitmap.OnChange := BitmapChanged; + + FPopupControl := Self; + FDropDownArrow := True; + Alignment := taCenter; + Autosize := False; + DrawPushedCaption := True; + SpaceAsClick := True; + Width := 75; + Height := 25; +end; + +destructor TSpTBXCustomButton.Destroy; +begin + StopRepeat; + FBitmap.Free; + inherited; +end; + +procedure TSpTBXCustomButton.CreateWnd; +begin + inherited; + FActive := FDefault; +end; + +procedure TSpTBXCustomButton.AdjustFont(AFont: TFont); +var + State: TSpTBXSkinStatesType; +begin + if (LinkText <> '') and MouseInControl then + inherited + else + if (SkinType = sknSkin) and ((AFont.Color = clWindowText) or (AFont.Color = clNone)) then begin + State := CurrentSkin.GetState(Enabled, Pushed, MouseInControl, Checked); + AFont.Color := CurrentSkin.GetTextColor(skncButton, State); + end; +end; + +procedure TSpTBXCustomButton.BitmapChanged(Sender: TObject); +begin + Invalidate; +end; + +function TSpTBXCustomButton.BitmapValid: boolean; +begin + Result := (Bitmap <> nil) and (not Bitmap.Empty) and (Bitmap.Height mod ConstStatesCount = 0); +end; + +procedure TSpTBXCustomButton.Click; +var + P: TPoint; + Form: TCustomForm; + M: TPopupMenu; + SpTBXPopup: ISpTBXPopupMenu; + + procedure RemoveClicks; + var + RepostList: TList; + Repost: Boolean; + I: Integer; + Msg: TMsg; + P: TPoint; + begin + RepostList := TList.Create; + try + while PeekMessage(Msg, 0, WM_LBUTTONDOWN, WM_MBUTTONDBLCLK, PM_REMOVE) do + with Msg do + begin + Repost := True; + case Message of + WM_QUIT: begin + { Throw back any WM_QUIT messages } + PostQuitMessage(wParam); + Break; + end; + WM_LBUTTONDOWN, WM_LBUTTONDBLCLK, + WM_RBUTTONDOWN, WM_RBUTTONDBLCLK, + WM_MBUTTONDOWN, WM_MBUTTONDBLCLK: begin + P := SmallPointToPoint(TSmallPoint(lParam)); + Windows.ClientToScreen(hwnd, P); + if FindDragTarget(P, True) = Self then Repost := False; + end; + end; + if Repost then + begin + RepostList.Add(AllocMem(SizeOf(TMsg))); + PMsg(RepostList.Last)^ := Msg; + end; + end; + + for I := 0 to RepostList.Count-1 do + begin + with PMsg(RepostList[I])^ do PostMessage(hwnd, message, wParam, lParam); + FreeMem(RepostList[I]); + end; + finally + RepostList.Free; + end; + end; + +begin + if not FRepeating then begin + M := GetInternalDropDownMenu; + if Assigned(M) then begin + FDropDownMenuVisible := True; + try + UpdateTracking(True); + MouseCapture := False; + M.PopupComponent := Self; + + if M.GetInterface(ISpTBXPopupMenu, SpTBXPopup) then begin + if not SpTBXPopup.InternalPopup(0, 0, False, FPopupControl) then + FDropDownMenuVisible := False; + end + else begin + P := ClientToScreen(Point(0, Height)); + M.Popup(P.X, P.Y); + FDropDownMenuVisible := False; + end; + finally + Invalidate; + RemoveClicks; + end; + Exit; // don't call the Click handler if the DropDownMenu is shown + end; + + Form := GetParentForm(Self); + if Assigned(Form) then Form.ModalResult := FModalResult; + end; + + inherited; +end; + +function TSpTBXCustomButton.DoDrawDropDownArrow(ACanvas: TCanvas; + ARect: TRect): Boolean; +var + R: TRect; + P: TPoint; +begin + Result := True; + if FDropDownArrow and Assigned(FDropDownMenu) then begin + R := ARect; + R.Left := R.Right - GetTextMargins.Right; + + P.X := (R.Left + R.Right) div 2 - 1; + P.Y := (R.Top + R.Bottom) div 2 - 1; + SpDrawArrow(ACanvas, P.X, P.Y, ACanvas.Font.Color, True, False, 2); + end; +end; + +function TSpTBXCustomButton.DoDrawItem(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage): Boolean; +var + B: TBitmap; + T: TSpTBXSkinType; + State: TSpTBXSkinStatesType; + Defaulted: Boolean; +begin + Result := inherited DoDrawItem(ACanvas, ARect, PaintStage); + + if Result and (PaintStage = pstPrePaint) then + // When Flat is true draw the button only when it's needed + if not Flat or (MouseInControl or Focused or FPushed or Checked) then begin + if BitmapValid then begin + B := TBitmap.Create; + try + B.Width := ARect.Right - ARect.Left; + B.Height := ARect.Bottom - ARect.Top; + SetStretchBltMode(B.Canvas.Handle, COLORONCOLOR); + B.Canvas.CopyRect(ARect, Bitmap.Canvas, GetSkinStateRect); + if FBitmapTransparent then + B.Transparent := True; + ACanvas.Draw(0, 0, B); + finally + B.Free; + end; + end + else begin + T := SpTBXSkinType(SkinType); + if Flat and FToolbarStyle then begin + State := CurrentSkin.GetState(Enabled, Pushed, MouseInControl, Checked); + SpDrawXPToolbarButton(ACanvas, ARect, State, T); + end + else begin + if T = sknSkin then + Defaulted := False + else + Defaulted := FActive; + SpDrawXPButton(ACanvas, ARect, Enabled, Pushed, MouseInControl, Checked, False, Defaulted, T); + end; + end; + end; + + // Draw the button arrow + if Result and (PaintStage = pstPostPaint) then + DoDrawDropDownArrow(ACanvas, ARect); +end; + +function TSpTBXCustomButton.GetFocused: Boolean; +begin + Result := Focused and (IsDroppedDown or (inherited GetFocused)); +end; + +function TSpTBXCustomButton.GetFocusRect(R, TextR, GlyphR: TRect): TRect; +begin + Result := R; + if SpTBXSkinType(SkinType) = sknNone then + InflateRect(Result, -4, -4) + else + InflateRect(Result, -3, -3); +end; + +function TSpTBXCustomButton.GetInternalDropDownMenu: TPopupMenu; +begin + Result := FDropDownMenu; +end; + +function TSpTBXCustomButton.GetPushed: Boolean; +begin + Result := IsDroppedDown or (inherited GetPushed); +end; + +function TSpTBXCustomButton.GetTextMargins: TRect; +const + ArrowWidth = 5; +begin + Result := Rect(8, 2, 8, 2); + if FDropDownArrow and Assigned(FDropdownMenu) then + Inc(Result.Right, ArrowWidth + 4); +end; + +function TSpTBXCustomButton.IsDroppedDown: Boolean; +begin + Result := FDropDownMenuVisible; +end; + +function TSpTBXCustomButton.GetSkinStateRect: TRect; +var + W, H: integer; +begin + // Finds the skin rect based on the button state + Result := Rect(0, 0, 0, 0); + + if BitmapValid then begin + W := Bitmap.Width; + H := (Bitmap.Height div ConstStatesCount); // 4 states + if not Enabled then + Result := Bounds(0, H * 3, W, H) // 4th state (disabled) + else begin + if Checked or Pushed then + Result := Bounds(0, H * 2, W, H) // 3rd state (down) + else + if MouseInControl then + Result := Bounds(0, H * 1, W, H) // 2nd state (hottrack) + else + Result := Bounds(0, H * 0, W, H); // 1st state (up) + end; + end; +end; + +procedure TSpTBXCustomButton.MouseDown(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + inherited; + if Enabled and (Button = mbLeft) then begin + if Repeating then begin + Click; + ControlState := ControlState - [csClicked]; + if not Assigned(FRepeatTimer) then FRepeatTimer := TTimer.Create(Self); + FRepeatTimer.Interval := ConstInitRepeatPause; + FRepeatTimer.OnTimer := RepeatTimerHandler; + FRepeatTimer.Enabled := True; + end; + end; +end; + +procedure TSpTBXCustomButton.MouseUp(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + inherited; + if Button = mbLeft then StopRepeat; +end; + +procedure TSpTBXCustomButton.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if Operation = opRemove then + if AComponent = DropdownMenu then DropdownMenu := nil; +end; + +procedure TSpTBXCustomButton.RepeatTimerHandler(Sender: TObject); +begin + FRepeatTimer.Interval := ConstRepeatPause; + if Repeating then begin + if Pushed then + Click; + end + else + StopRepeat; +end; + +procedure TSpTBXCustomButton.StopRepeat; +begin + if Assigned(FRepeatTimer) then begin + FRepeatTimer.Free; + FRepeatTimer := nil; + end; +end; + +procedure TSpTBXCustomButton.SetBitmap(const Value: TBitmap); +begin + FBitmap.Assign(Value); + Invalidate; +end; + +procedure TSpTBXCustomButton.SetDefault(const Value: Boolean); +var + Form: TCustomForm; +begin + FDefault := Value; + if HandleAllocated then begin + Form := GetParentForm(Self); + if Assigned(Form) then + Form.Perform(CM_FOCUSCHANGED, 0, Longint(Form.ActiveControl)); + end; +end; + +procedure TSpTBXCustomButton.SetDropDownArrow(const Value: Boolean); +begin + if FDropDownArrow <> Value then begin + FDropDownArrow := Value; + Invalidate; + end; +end; + +procedure TSpTBXCustomButton.SetDropDownMenu(Value: TPopupMenu); +begin + if FDropDownMenu <> Value then begin + if Assigned(FDropDownMenu) then RemoveFreeNotification(FDropDownMenu); + FDropDownMenu := Value; + if Assigned(FDropDownMenu) then FreeNotification(FDropDownMenu); + Invalidate; + end; +end; + +procedure TSpTBXCustomButton.SetFlat(const Value: Boolean); +begin + if FFlat <> Value then begin + FFlat := Value; + Invalidate; + end; +end; + +procedure TSpTBXCustomButton.CMDialogKey(var Message: TCMDialogKey); +begin + with Message do + if (((CharCode = VK_RETURN) and FActive) or + ((CharCode = VK_ESCAPE) and FCancel)) and + (KeyDataToShiftState(Message.KeyData) = []) and CanFocus then + begin + Click; + Result := 1; + end + else + inherited; +end; + +procedure TSpTBXCustomButton.CMFocusChanged(var Message: TCMFocusChanged); +begin + with Message do + if Sender is TSpTBXCustomButton then + FActive := Sender = Self + else + FActive := FDefault; + inherited; +end; + +procedure TSpTBXCustomButton.CMSPPopupClose(var Message: TMessage); +begin + FDropDownMenuVisible := False; + Invalidate; + inherited; +end; + +procedure TSpTBXCustomButton.WMCancelMode(var Message: TWMCancelMode); +begin + inherited; + StopRepeat; + UpdateTracking(True); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomSpeedButton } + +constructor TSpTBXCustomSpeedButton.Create(AOwner: TComponent); +begin + inherited; + ControlStyle := ControlStyle - [csSetCaption]; + SetBounds(0, 0, 23, 22); + ToolbarStyle := True; +end; + +function TSpTBXCustomSpeedButton.CanFocus: Boolean; +begin + Result := False; +end; + +procedure TSpTBXCustomSpeedButton.Click; +begin + if FGroupIndex <> 0 then + if AllowAllUp then + Checked := not Checked + else + Checked := True; + inherited +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomProgressBar } + +constructor TSpTBXCustomProgressBar.Create(AOwner: TComponent); +begin + inherited; + FMax := 100; + FMin := 0; + FPosition := 0; + FProgressVisible := True; + FCaptionGlow := gldAll; + FCaptionType := pctPercentage; + + Alignment := taCenter; + Autosize := False; + Width := 150; + Height := 17; + Font.Style := Font.Style + [fsBold]; + TabStop := False; +end; + +procedure TSpTBXCustomProgressBar.AdjustFont(AFont: TFont); +var + State: TSpTBXSkinStatesType; +begin + if (LinkText <> '') and MouseInControl then + inherited + else + if (SkinType = sknSkin) and ((AFont.Color = clWindowText) or (AFont.Color = clNone)) then begin + State := CurrentSkin.GetState(Enabled, Pushed, MouseInControl, Checked); + AFont.Color := CurrentSkin.GetTextColor(skncProgressBar, State); + end; +end; + +function TSpTBXCustomProgressBar.DoDrawItem(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage): Boolean; +var + I: Integer; + T: TSpTBXSkinType; +begin + Result := inherited DoDrawItem(ACanvas, ARect, PaintStage); + if Result and (PaintStage = pstPrePaint) then begin + T := SpTBXSkinType(SkinType); + I := SpDrawXPProgressBar(ACanvas, ARect, FVertical, FSmooth, FProgressVisible, FMin, FMax, FPosition, T); + case FCaptionType of + pctNone: Caption := ''; + pctPercentage: Caption := IntToStr(I) + '%'; + pctProgress: Caption := IntToStr(FPosition); + end; + end; +end; + +procedure TSpTBXCustomProgressBar.DoProgressChange; +begin + if Assigned(FOnProgressChange) then FOnProgressChange(Self, Position); +end; + +function TSpTBXCustomProgressBar.GetTextMargins: TRect; +begin + Result := Rect(8, 2, 8, 2); +end; + +procedure TSpTBXCustomProgressBar.SetCaptionType(const Value: TSpTBXProgressCaption); +begin + if FCaptionType <> Value then begin + FCaptionType := Value; + if Value <> pctDefault then Caption := ''; + Invalidate; + end; +end; + +procedure TSpTBXCustomProgressBar.SetMax(const Value: integer); +begin + if FMax <> Value then begin + FMax := Value; + Invalidate; + end; +end; + +procedure TSpTBXCustomProgressBar.SetMin(const Value: integer); +begin + if FMin <> Value then begin + FMin := Value; + Invalidate; + end; +end; + +procedure TSpTBXCustomProgressBar.SetPosition(Value: integer); +begin + if Value > FMax then Value := FMax + else if Value < FMin then Value := FMin; + if FPosition <> Value then begin + FPosition := Value; + Invalidate; + DoProgressChange; + end; +end; + +procedure TSpTBXCustomProgressBar.SetProgressVisible(const Value: Boolean); +begin + if FProgressVisible <> Value then begin + FProgressVisible := Value; + Invalidate; + end; +end; + +procedure TSpTBXCustomProgressBar.SetSmooth(const Value: Boolean); +begin + if FSmooth <> Value then begin + FSmooth := Value; + Invalidate; + end; +end; + +procedure TSpTBXCustomProgressBar.SetVertical(const Value: Boolean); +begin + if FVertical <> Value then begin + FVertical := Value; + if FVertical then + FCaptionRoatationAngle := tra90 + else + FCaptionRoatationAngle := tra0; + if Width > Height then + SetBounds(Left, Top, Height, Width); + Invalidate; + end; +end; + +procedure TSpTBXCustomProgressBar.StepIt(Delta: Integer = 1); +begin + SetPosition(FPosition + Delta); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXTrackBar } + +constructor TSpTBXTrackBar.Create(AOwner: TComponent); +begin + inherited; + FSkinType := sknSkin; + FTickMarks := tmxBottomRight; + SkinManager.AddSkinNotification(Self); +end; + +procedure TSpTBXTrackBar.CreateParams(var Params: TCreateParams); +begin + inherited CreateParams(Params); + FCanDrawChannelSelection := (Params.Style and TBS_ENABLESELRANGE) <> 0; +end; + +destructor TSpTBXTrackBar.Destroy; +begin + SkinManager.RemoveSkinNotification(Self); + inherited; +end; + +function TSpTBXTrackBar.ChannelRect: TRect; +var + R: TRect; +begin + // TBM_GETCHANNELRECT allways returns the horizontal channel rect, even + // when the Orientation is vertical. + SendMessage(Handle, TBM_GETCHANNELRECT, 0, Integer(@Result)); + if Orientation = trVertical then begin + R := Result; + Result := Rect(R.Top, R.Left, R.Bottom, R.Right); + end; +end; + +function TSpTBXTrackBar.DoDrawChannel(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage): Boolean; +begin + Result := True; + if Assigned(FOnDrawChannel) then FOnDrawChannel(Self, ACanvas, ARect, PaintStage, Result); +end; + +function TSpTBXTrackBar.DoDrawChannelTicks(ACanvas: TCanvas; X, Y: Integer): Boolean; +begin + Result := True; + if Assigned(FOnDrawChannelTicks) then FOnDrawChannelTicks(Self, ACanvas, X, Y, Result); +end; + +function TSpTBXTrackBar.DoDrawThumb(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage): Boolean; +begin + Result := True; + if Assigned(FOnDrawThumb) then FOnDrawThumb(Self, ACanvas, ARect, PaintStage, Result); +end; + +procedure TSpTBXTrackBar.DrawTicks(ACanvas: TCanvas); +var + PosArray: array of Integer; + I, Count, Y, iStart, iEnd: Integer; + ChannelR, ThumbR: TRect; + FirstTickSize, TickSize, TickDelta: Integer; + LastPenColor: TColor; +begin + if TickStyle = tsNone then Exit; + + // Returns the position of the ticks on the client area + // Check if Max - Min > 2 to see if the ticks array is valid. + Count := Max - Min; + if Count < 2 then + Count := 2 + else + Count := Count + 1; + SetLength(PosArray, Count); + + // Fill the array, the first and last ticks are not included in the ticks array: + // http://msdn.microsoft.com/library/en-us/shellcc/platform/commctls/trackbar/messages/tbm_getticpos.asp?frame=true + // First we need to get the middle ticks + // 0 1 2 3 4 5 6 7 8 9 // Tick positions seen on the trackbar. + // 1 2 3 4 5 6 7 8 // Tick positions whose position can be identified. + // 0 1 2 3 4 5 6 7 // Index numbers for the identifiable positions. + if Count >= 2 then begin + iStart := 1; + iEnd := Count - 1 - 1; + for I := iStart to iEnd do + PosArray[I] := SendMessage(Self.Handle, TBM_GETTICPOS, I - 1, 0); + end; + + LastPenColor := ACanvas.Pen.Color; + + case SpTBXSkinType(FSkinType) of + sknNone: + ACanvas.Pen.Color := clBlack; + sknWindows: + ACanvas.Pen.Color := clBtnShadow; + sknSkin: + if CurrentSkin.Options(skncTrackBar, sknsNormal).TextColor <> clNone then + ACanvas.Pen.Color := CurrentSkin.Options(skncTrackBar, sknsNormal).TextColor + else + ACanvas.Pen.Color := clBtnShadow; + end; + + SendMessage(Self.Handle, TBM_GETTHUMBRECT, 0, Integer(@ThumbR)); + ChannelR := ChannelRect; + FirstTickSize := 4; + TickSize := 3; + Y := 0; + + if Orientation = trHorizontal then begin + I := (ThumbR.Right - ThumbR.Left) div 2; + PosArray[0] := ChannelR.Left + I; + PosArray[Count - 1] := ChannelR.Right - I - 1; + case TickMarks of + tmxBottomRight: + begin + Y := ThumbR.Bottom + 1; + FirstTickSize := 4; + TickSize := 3; + end; + tmxTopLeft: + begin + Y := ThumbR.Top - 2; + FirstTickSize := -4; + TickSize := -3; + end; + tmxBoth: + begin + Y := ThumbR.Top - 2; + FirstTickSize := -4; + TickSize := -3; + end; + tmxCenter: + begin + Y := ChannelR.Top + (ChannelR.Bottom - ChannelR.Top) div 2; + FirstTickSize := 1; + TickSize := 1; + end; + end; + for I := 0 to Count - 1 do + if DoDrawChannelTicks(ACanvas, PosArray[I], Y) then begin + TickDelta := 0; + if (I = 0) or (I = Count - 1) then + TickDelta := FirstTickSize + else + if TickStyle = tsManual then TickDelta := TickSize + else if I mod Frequency = 0 then TickDelta := TickSize; + if TickDelta <> 0 then begin + ACanvas.MoveTo(PosArray[I], Y); + ACanvas.LineTo(PosArray[I], Y + TickDelta); + if TickMarks = tmxBoth then begin + ACanvas.MoveTo(PosArray[I], ThumbR.Bottom + 1); + ACanvas.LineTo(PosArray[I], ThumbR.Bottom + 1 - TickDelta); + end; + end; + end; + end + else begin + I := (ThumbR.Bottom - ThumbR.Top) div 2; + PosArray[0] := ChannelR.Top + I; + PosArray[Count - 1] := ChannelR.Bottom - I - 1; + case TickMarks of + tmxBottomRight: + begin + Y := ThumbR.Right + 1; + FirstTickSize := 4; + TickSize := 3; + end; + tmxTopLeft: + begin + Y := ThumbR.Left - 2; + FirstTickSize := -4; + TickSize := -3; + end; + tmxBoth: + begin + Y := ThumbR.Left - 2; + FirstTickSize := -4; + TickSize := -3; + end; + tmxCenter: + begin + Y := ChannelR.Left + (ChannelR.Right - ChannelR.Left) div 2; + FirstTickSize := 1; + TickSize := 1; + end; + end; + for I := 0 to Count - 1 do + if DoDrawChannelTicks(ACanvas, Y, PosArray[I]) then begin + TickDelta := 0; + if (I = 0) or (I = Count - 1) then + TickDelta := FirstTickSize + else + if TickStyle = tsManual then TickDelta := TickSize + else if I mod Frequency = 0 then TickDelta := TickSize; + if TickDelta <> 0 then begin + ACanvas.MoveTo(Y, PosArray[I]); + ACanvas.LineTo(Y + TickDelta, PosArray[I]); + if TickMarks = tmxBoth then begin + ACanvas.MoveTo(ThumbR.Right + 1, PosArray[I]); + ACanvas.LineTo(ThumbR.Right + 1 - TickDelta, PosArray[I]); + end; + end; + end; + end; + + ACanvas.Pen.Color := LastPenColor; +end; + +function TSpTBXTrackBar.MouseInThumb: Boolean; +var + P: TPoint; + R: TRect; +begin + if csDesigning in ComponentState then + Result := False + else begin + SendMessage(Handle, TBM_GETTHUMBRECT, 0, Integer(@R)); + GetCursorPos(P); + P := ScreenToClient(P); + Result := PtInRect(R, P) + end; + + if SpTBXSkinType(SkinType) = sknWindows then begin + if Focused then Result := not (GetCaptureControl = Self); + end + else + Result := GetCaptureControl = Self; +end; + +procedure TSpTBXTrackBar.InvalidateBackground; +begin + // Invalidate, Repaint, Update, SetWindowPos and RedrawWindow doesn't work + // on Trackbars (CN_NOTIFY messages are not sent), we have to send a + // WM_SIZE message in order to invalidate the control. + if HandleAllocated then + SendMessage(Handle, WM_SIZE, SIZE_RESTORED, MakeLParam(Width, Height)); +end; + +procedure TSpTBXTrackBar.SetSkinType(const Value: TSpTBXSkinType); +begin + if Value <> FSkinType then begin + FSkinType := Value; + InvalidateBackground; + end; +end; + +procedure TSpTBXTrackBar.SetTickMarks(const Value: TSpTBXTickMark); +const + A: array [TSpTBXTickMark] of TTickMark = (tmBottomRight, tmTopLeft, tmBoth, tmBoth); +begin + if Value <> FTickMarks then begin + if A[FTickMarks] = A[Value] then begin + FTickMarks := Value; + inherited TickMarks := A[Value]; + RecreateWnd; + end + else begin + FTickMarks := Value; + inherited TickMarks := A[Value]; + end; + end; +end; + +procedure TSpTBXTrackBar.CMSpTBXControlsInvalidate(var Message: TMessage); +begin + InvalidateBackground; + Message.Result := 1; +end; + +procedure TSpTBXTrackBar.CNNotify(var Message: TWMNotify); +var + Info: PNMCustomDraw; + ACanvas: TCanvas; + R: TRect; + Rgn: HRGN; + Offset: Integer; +begin + if Message.NMHdr.code = NM_CUSTOMDRAW then begin + Message.Result := CDRF_DODEFAULT; + Info := Pointer(Message.NMHdr); + case Info.dwDrawStage of + CDDS_PREPAINT: + Message.Result := CDRF_NOTIFYITEMDRAW; + CDDS_ITEMPREPAINT: + begin + ACanvas := TCanvas.Create; + ACanvas.Lock; + try + ACanvas.Handle := Info.hdc; + case Info.dwItemSpec of + TBCD_TICS: + begin + R := ClientRect; + SpDrawParentBackground(Self, ACanvas.Handle, R); + if Focused then + SpDrawFocusRect(ACanvas, R); + if FTickMarks <> tmxCenter then + DrawTicks(ACanvas); + Message.Result := CDRF_SKIPDEFAULT; + end; + TBCD_THUMB: + begin + if SliderVisible then begin + SendMessage(Handle, TBM_GETTHUMBRECT, 0, Integer(@R)); + if DoDrawThumb(ACanvas, R, pstPrePaint) then + SpDrawXPTrackBar(ACanvas, R, TBCD_THUMB, Orientation = trVertical, MouseInThumb, False, FTickMarks, Min, Max, SelStart, SelEnd, FSkinType); + DoDrawThumb(ACanvas, R, pstPostPaint); + Message.Result := CDRF_SKIPDEFAULT; + end; + end; + TBCD_CHANNEL: + begin + SendMessage(Handle, TBM_GETTHUMBRECT, 0, Integer(@R)); + Offset := 0; + if Focused then + Inc(Offset); + if Orientation = trHorizontal then begin + R.Left := ClientRect.Left + Offset; + R.Right := ClientRect.Right - Offset; + end + else begin + R.Top := ClientRect.Top + Offset; + R.Bottom := ClientRect.Bottom - Offset; + end; + with R do + Rgn := CreateRectRgn(Left, Top, Right, Bottom); + SelectClipRgn(ACanvas.Handle, Rgn); + try + SpDrawParentBackground(Self, ACanvas.Handle, ClientRect); + R := ChannelRect; + + if DoDrawChannel(ACanvas, R, pstPrePaint) then + SpDrawXPTrackBar(ACanvas, R, TBCD_CHANNEL, Orientation = trVertical, False, FCanDrawChannelSelection, FTickMarks, Min, Max, SelStart, SelEnd, FSkinType); + DoDrawChannel(ACanvas, R, pstPostPaint); + + // Draw channel tics + if FTickMarks = tmxCenter then + DrawTicks(ACanvas); + finally + DeleteObject(Rgn); + SelectClipRgn(ACanvas.Handle, 0); + end; + Message.Result := CDRF_SKIPDEFAULT; + end; + end; + finally + ACanvas.Unlock; + ACanvas.Handle := 0; + ACanvas.Free; + end; + end; + end; + end; +end; + +procedure TSpTBXTrackBar.WMEraseBkGnd(var Message: TMessage); +begin + if SpTBXSkinType(SkinType) <> sknNone then + Message.Result := 1 + else + inherited; +end; + +procedure TSpTBXTrackBar.WMSpSkinChange(var Message: TMessage); +begin + InvalidateBackground; +end; + +end. diff --git a/internal/2.4.4/1/Source/SpTBXCustomizer.pas b/internal/2.4.4/1/Source/SpTBXCustomizer.pas new file mode 100644 index 0000000..aac26c0 --- /dev/null +++ b/internal/2.4.4/1/Source/SpTBXCustomizer.pas @@ -0,0 +1,1636 @@ +unit SpTBXCustomizer; + +{============================================================================== +Version 2.4.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: +2 December 2009 - version 2.4.4 + - No changes. + +13 September 2009 - version 2.4.3 + - Fixed incorrect Customizer shortcut processing when the + shortcut text contains a space, thanks to Jim Kueneman + for reporting this. + +8 May 2009 - version 2.4.2 + - No changes. + +15 March 2009 - version 2.4.1 + - Fixed incorrect Customizer loading and saving when Frames + were used, thanks to Eduardo Mauro for reporting this. + +17 January 2009 - version 2.4 + - No changes. + +26 September 2008 - version 2.3 + - No changes. + +29 July 2008 - version 2.2 + - No changes. + +26 June 2008 - version 2.1 + - No changes. + +3 May 2008 - version 2.0 + - No changes. + +2 April 2008 - version 1.9.5 + - No changes. + +3 February 2008 - version 1.9.4 + - No changes. + +19 January 2008 - version 1.9.3 + - Added BlankSeparators property to TSpTBXCustomizer. + - Fixed AV on TSpTBXCustomizer when ShorcutsList was nil + when calling ApplyItemOptions, thanks to PyScripter for + reporting this. + +26 December 2007 - version 1.9.2 + - No changes. + +1 December 2007 - version 1.9.1 + - No changes. + +20 November 2007 - version 1.9 + - Removed TBX dependency. + - Added Reset method to TSpTBXCustomizer, used to reinitialize + the toolbars. + +8 February 2007 - version 1.8.3 + - Added DeleteLayout method to TSpTBXCustomizer. + - The customizer now closes when ESC is pressed, thanks to + Jim Kueneman for reporting this. + - The customizer now saves the Toolbar's DisplayMode, thanks to + Jim Kueneman for reporting this. + +17 December 2006 - version 1.8.2 + - No changes. + +24 November 2006 - version 1.8.1 + - No changes. + +27 August 2006 - version 1.8 + - Fixed TSpTBXCustomizer items saving when the MenuBar items are + nested in more than 3 subitems levels, thanks to Jim Kueneman + for reporting this. + +15 June 2006 - version 1.7 + - Added SaveFormState property to TSpTBXCustomizer, when SaveFormState + is true the main form position and WindowState are saved. + - Added Load and Save methods to TSpTBXCustomizer that loads/saves + the customizer options to a StringList, thanks to Philipp Hechter + for reporting this. + +4 May 2006 - version 1.6 + - No changes. + +12 April 2006 - version 1.5 + - No changes. + +27 February 2006 - version 1.4 + - No changes. + +10 February 2006 - version 1.3 + - No changes. + +28 December 2005 - version 1.2 + - Fixed incorrect ShortCut processing. + +18 October 2005 - version 1.1 + - Fixed TSpTBXCustomizer ShortCut processing method when + loading from file or registry. + - Fixed TSpTBXCustomizer support for separators items. + - Fixed TSpTBXCustomizer support for anchored items. + - Added OnGetShortcutsList event to the TSpTBXCustomizer to + allow the shortcuts list filtering. + - Added separator cloning support to the TSpTBXCustomizer. + +10 August 2005 - version 1.0 + - Initial release. + +==============================================================================} + +interface + +{$BOOLEVAL OFF} // Unit depends on short-circuit boolean evaluation + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, ExtCtrls, ImgList, IniFiles, + {$IFNDEF UNICODE} + TntClasses, + {$ENDIF} + TB2Dock, TB2Toolbar, TB2Item, + SpTBXSkins, SpTBXItem, SpTBXEditors; + + +type + +{$IFDEF UNICODE} + TTntStringList = TStringList; +{$ENDIF} + + TSpTBXCustomizer = class; + + TShortCutsProcessor = class + private + FActive: Boolean; + public + constructor Create; virtual; + destructor Destroy; override; + function MainWindowHook(var Message: TMessage): Boolean; + property Active: Boolean read FActive write FActive; + end; + + TSpTBXMenuBarShortcuts = class(TTntStringList) + private + FMenuBarName: string; + public + property MenuBarName: string read FMenuBarName write FMenuBarName; + end; + + TSpTBXCustomCustomizeForm = class(TForm) + private + FEmbedded: Boolean; + protected + FCustomizer: TSpTBXCustomizer; + FToolbarList: TTntStringList; + FItemList: TTntStringList; + FShortcutList: TTntStringList; + FSeparatorList: TTntStringList; + FBlankSeparatorList: TTntStringList; + procedure DoFillCommands(ToolbarList, ItemList, ShortcutsList: TTntStringList); virtual; abstract; + procedure DoShow; override; + procedure DoClose(var Action: TCloseAction); override; + procedure DoIconOptionsChange(UseSmallImages: Boolean); virtual; + procedure DoSkinChange; virtual; + procedure FillCommands; + procedure KeyDown(var Key: Word; Shift: TShiftState); override; + public + constructor Create(AOwner: TSpTBXCustomizer; EmbeddedParent: TWinControl); reintroduce; + destructor Destroy; override; + property Customizer: TSpTBXCustomizer read FCustomizer; + property Embedded: Boolean read FEmbedded; + end; + + TSpTBXCustomizeFormClass = class of TSpTBXCustomCustomizeForm; + + TSpTBXGetCustomizeFormClassEvent = procedure(Sender: TObject; var CustomizeFormClass: TSpTBXCustomizeFormClass) of object; + TSpTBXExtraOptionsEvent = procedure(Sender: TObject; ExtraOptions: TStringList) of object; + TSpTBXLayoutExtraOptionsEvent = procedure(Sender: TObject; LayoutName: string; ExtraOptions: TStringList) of object; + + TSpTBXIconOptionsChangeEvent = procedure(Sender: TObject; Toolbar: TTBCustomToolbar; UseSmallImages: Boolean) of object; + TSpTBXAcceptItemEvent = procedure(Sender: TObject; AItem: TTBCustomItem; var Accept: Boolean) of object; + + TSpTBXCustomizer = class(TComponent, ITBItems) + private + FLayouts: TStringList; + FResetState: TStringList; + FBlankSeparators: Boolean; + FItems: TTBRootItem; + FCustomizeForm: TSpTBXCustomCustomizeForm; + FMenuBar: TTBCustomToolbar; + FShowing: Boolean; + FSaveFormState: Boolean; + FOnShow: TNotifyEvent; + FOnClose: TNotifyEvent; + FOnCreateCustomizeForm: TNotifyEvent; + FOnGetCustomizeForm: TSpTBXGetCustomizeFormClassEvent; + FOnLoad: TSpTBXExtraOptionsEvent; + FOnSave: TSpTBXExtraOptionsEvent; + FOnLayoutLoad: TSpTBXLayoutExtraOptionsEvent; + FOnLayoutSave: TSpTBXLayoutExtraOptionsEvent; + FOnGetShortcutsList: TSpTBXAcceptItemEvent; + FOnIconOptionsChange: TSpTBXIconOptionsChangeEvent; + FOnSkinChange: TNotifyEvent; + function GetItems: TTBCustomItem; // For ITBItems interface + function GetImages: TCustomImageList; + procedure SetImages(Value: TCustomImageList); + procedure SetMenuBar(const Value: TTBCustomToolbar); + procedure SaveResetState(ShortcutsList: TSpTBXMenuBarShortcuts); + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + protected + function DoGetShortcutsList(AItem: TTBCustomItem): Boolean; virtual; + procedure DoIconOptionsChange(Toolbar: TTBCustomToolbar; UseSmallImages: Boolean); virtual; + procedure DoLoad(ExtraOptions: TStringList); virtual; + procedure DoSave(ExtraOptions: TStringList); virtual; + procedure DoLayoutLoad(LayoutName: string; ExtraOptions: TStringList); virtual; + procedure DoLayoutSave(LayoutName: string; ExtraOptions: TStringList); virtual; + procedure DoSkinChange; virtual; + procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override; // For ITBItems interface + function GetCustomizeFormClass: TSpTBXCustomizeFormClass; virtual; + procedure GetShortcutList(ShortcutsList: TTntStringList); + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure SetupForm; virtual; + procedure ValidateContainer(AComponent: TComponent); override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Show; + procedure ShowEmbedded(AParent: TWinControl = nil); + procedure Close; + procedure Load(IniFile: TCustomIniFile; LoadLastLayout: Boolean = True); overload; + procedure Load(OptionsList: TStrings; LoadLastLayout: Boolean = True); overload; + procedure Load(const Filename: string; LoadLastLayout: Boolean = True); overload; + procedure Load(const RootKey: DWORD; BaseRegistryKey: string; LoadLastLayout: Boolean = True); overload; + procedure Save(IniFile: TCustomIniFile; SaveLastLayout: Boolean = True); overload; + procedure Save(OptionsList: TStrings; SaveLastLayout: Boolean = True); overload; + procedure Save(const Filename: string; SaveLastLayout: Boolean = True); overload; + procedure Save(const RootKey: DWORD; BaseRegistryKey: string; SaveLastLayout: Boolean = True); overload; + procedure Reset; + procedure LoadLayout(IniFile: TCustomIniFile; LayoutName: string); overload; + procedure LoadLayout(OptionsList: TStrings; LayoutName: string); overload; + procedure LoadLayout(const Filename, LayoutName: string); overload; + procedure LoadLayout(const RootKey: DWORD; BaseRegistryKey, LayoutName: string); overload; + procedure SaveLayout(IniFile: TCustomIniFile; LayoutName: string); overload; + procedure SaveLayout(OptionsList: TStrings; LayoutName: string); overload; + procedure SaveLayout(const Filename, LayoutName: string); overload; + procedure SaveLayout(const RootKey: DWORD; BaseRegistryKey, LayoutName: string); overload; + function DeleteLayout(IniFile: TCustomIniFile; LayoutName: string): Boolean; overload; + function DeleteLayout(OptionsList: TStrings; LayoutName: string): Boolean; overload; + function DeleteLayout(const Filename, LayoutName: string): Boolean; overload; + function DeleteLayout(const RootKey: DWORD; BaseRegistryKey, LayoutName: string): Boolean; overload; + property CustomizeForm: TSpTBXCustomCustomizeForm read FCustomizeForm; + property Layouts: TStringList read FLayouts; + property Showing: Boolean read FShowing; + published + property BlankSeparators: Boolean read FBlankSeparators write FBlankSeparators default False; + property Images: TCustomImageList read GetImages write SetImages; + property Items: TTBRootItem read FItems; + property MenuBar: TTBCustomToolbar read FMenuBar write SetMenuBar; + property SaveFormState: Boolean read FSaveFormState write FSaveFormState default True; + property OnShow: TNotifyEvent read FOnShow write FOnShow; + property OnClose: TNotifyEvent read FOnClose write FOnClose; + property OnCreateCustomizeForm: TNotifyEvent read FOnCreateCustomizeForm write FOnCreateCustomizeForm; + property OnGetCustomizeForm: TSpTBXGetCustomizeFormClassEvent read FOnGetCustomizeForm write FOnGetCustomizeForm; + property OnGetShortcutsList: TSpTBXAcceptItemEvent read FOnGetShortcutsList write FOnGetShortcutsList; + property OnLoad: TSpTBXExtraOptionsEvent read FOnLoad write FOnLoad; + property OnSave: TSpTBXExtraOptionsEvent read FOnSave write FOnSave; + property OnLayoutLoad: TSpTBXLayoutExtraOptionsEvent read FOnLayoutLoad write FOnLayoutLoad; + property OnLayoutSave: TSpTBXLayoutExtraOptionsEvent read FOnLayoutSave write FOnLayoutSave; + property OnIconOptionsChange: TSpTBXIconOptionsChangeEvent read FOnIconOptionsChange write FOnIconOptionsChange; + property OnSkinChange: TNotifyEvent read FOnSkinChange write FOnSkinChange; + end; + +{ Ini/Reg } +procedure SpIniEraseSection(IniFile: TCustomIniFile; Section: string; EraseKeysOnly: Boolean); +procedure SpIniSaveStringList(IniFile: TCustomIniFile; Section: string; L: TStringList); +procedure SpIniLoadStringList(IniFile: TCustomIniFile; Section: string; L: TStringList); +procedure SpRegSaveStringList(L: TStringList; const RootKey: DWORD; const BaseRegistryKey: string); +procedure SpRegLoadStringList(L: TStringList; const RootKey: DWORD; const BaseRegistryKey: string); + +{ Layouts } +procedure SpLoadFormState(Form: TCustomForm; OptionsList: TStrings); +procedure SpSaveFormState(Form: TCustomForm; OptionsList: TStrings); +procedure SpLoadLayoutList(IniFile: TCustomIniFile; L: TStringList); overload; +procedure SpLoadLayout(const OwnerComponent: TComponent; IniFile: TCustomIniFile; LayoutName: string; ExtraOptions: TStringList = nil); +procedure SpSaveLayout(const OwnerComponent: TComponent; IniFile: TCustomIniFile; LayoutName: string; ExtraOptions: TStringList = nil); + +{ Items } +procedure SpLoadItems(const OwnerComponent: TComponent; IniFile: TCustomIniFile; ShortcutsList: TSpTBXMenuBarShortcuts = nil; ExtraOptions: TStringList = nil); +procedure SpSaveItems(const OwnerComponent: TComponent; IniFile: TCustomIniFile; ShortcutsList: TSpTBXMenuBarShortcuts = nil; ExtraOptions: TStringList = nil); + +{ Misc } +function SpCustomizerGetWideCaption(Item: TTBCustomItem): WideString; +function SpCreateUniqueSeparator(Blank: Boolean): TSpTBXSeparatorItem; + +implementation + +uses + TypInfo, Registry, Menus, ActnList, TB2ExtItems, + SpTBXTabs, SpTBXDkPanels, SpTBXCustomizerForm; + +type + TTBRootItemAccess = class(TTBRootItem); + TTBCustomItemAccess = class(TTBCustomItem); + TTBDockAccess = class(TTBDock); + TSpTBXTabToolbarAccess = class(TSpTBXTabToolbar); + +{ Constants for SpTBXCustomizer-specific registry values. Do not localize! } +const + SSpTBXCustomizerRepeatedInstance = 'There''s already another instance of TSpTBXCustomizer'; + SSpTBXCustomizerInvalidParent = 'TSpTBXCustomizer must be dropped only on a Form or on a Frame'; + rvLastLayout = 'LastLayout'; + rvExtraOptions = 'ExtraOptions'; + rvLayoutRegList = 'LayoutsList'; + rvLayoutList = 'Layouts'; + rvItemsList = 'Items'; + rvCount = 'Count'; + rvSkin = 'Skin'; + rvMainFormWindowState = 'MainForm.WindowState'; + rvMainFormBounds = 'MainForm.Bounds'; + rvMainFormRestoreBounds = 'MainForm.RestoreBounds'; + rvSeparator = '--[Separator]--'; + rvBlankSeparator = '--[Blank Separator]--'; + rvUniqueSeparatorPrefix = 'CustomizerUniqueSeparator'; + rvUniqueBlankSeparatorPrefix = 'CustomizerUniqueBlankSeparator'; + +var + FShortcutsProcessor: TShortCutsProcessor; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Helpers } + +function IncludeTrailingRegKeyDelimiter(const S: string): string; +var + C: integer; +begin + Result := S; + C := Length(Result); + if (C > 0) and (Result[C] <> '\') then + Result := Result + '\'; +end; + +function ParseItemEntry(RootItemsList, ItemsList: TStringList; const ItemEntry: string; + out ParentItem: TTBCustomItem; out ItemName: string; out ShortCut: TShortCut): TTBCustomItem; +var + L: TStringList; + I: Integer; + TBName: string; +begin + Result := nil; + ParentItem := nil; + ShortCut := 0; + + L := TStringList.Create; + try + L.CommaText := ItemEntry; + if L.Count <= 1 then + Exit; + TBName := L[0]; + ItemName := L[1]; + if (L.Count > 2) and (L[2] <> '0') then + ShortCut := TextToShortCut(L[2]); + I := RootItemsList.IndexOf(TBName); + if I > -1 then begin + ParentItem := RootItemsList.Objects[I] as TTBCustomItem; + if Pos(rvUniqueSeparatorPrefix, ItemName) > 0 then begin // If it's a cloned separator create it + Result := TSpTBXSeparatorItem.Create(nil); + Result.Name := ItemName; + end + else + if Pos(rvUniqueBlankSeparatorPrefix, ItemName) > 0 then begin // If it's a cloned blank separator create it + Result := TSpTBXSeparatorItem.Create(nil); + Result.Name := ItemName; + TSpTBXSeparatorItem(Result).Blank := True; + end + else begin + I := ItemsList.IndexOf(ItemName); + if I > -1 then + Result := ItemsList.Objects[I] as TTBCustomItem; + end; + end; + finally + L.Free; + end; +end; + +procedure GetRootItemsList(OwnerComponent: TComponent; RootItemsList: TStringList); +// Creates a list with all the toolbar's root items +// It excludes Frames toolbars (name collision problems) +var + I: Integer; + C: TComponent; +begin + for I := 0 to OwnerComponent.ComponentCount - 1 do begin + C := OwnerComponent.Components[I]; + if C is TFrame then + Continue + else + if C is TSpTBXToolbar then begin + if TSpTBXToolbar(C).Customizable then + RootItemsList.AddObject(C.Name, TSpTBXToolbar(C).Items); + end + else + if C is TSpTBXCustomizer then + RootItemsList.AddObject(C.Name, TSpTBXCustomizer(C).Items) + else + if (C is TWinControl) and not (C is TFrame) and not (C is TForm) then + GetRootItemsList(C, RootItemsList); + end; +end; + +procedure SaveItemOptions(OwnerComponent: TComponent; + ShortcutsList: TSpTBXMenuBarShortcuts; OptionsList: TStringList); + + procedure SaveOption(ComponentName: string; AItem: TTBCustomItem); + var + ShortCut: string; + begin + ShortCut := ShortCutToText(AItem.ShortCut); + if ShortCut = '' then ShortCut := '0' + else if Pos(' ', ShortCut) > 0 then ShortCut := '"' + ShortCut + '"'; + OptionsList.Add(ComponentName + ', ' + AItem.Name + ', ' + ShortCut); + end; + +var + I, J: Integer; + ParentItem: TTBCustomItem; + RootItemsList: TStringList; +begin + OptionsList.Clear; + + RootItemsList := TStringList.Create; + try + GetRootItemsList(OwnerComponent, RootItemsList); + for I := 0 to RootItemsList.Count - 1 do begin + ParentItem := TTBCustomItem(RootItemsList.Objects[I]); + for J := 0 to ParentItem.Count - 1 do + SaveOption(RootItemsList.Strings[I], ParentItem[J]); + end; + finally + RootItemsList.Free; + end; + + // Save the MenuBar shortcuts + if Assigned(ShortcutsList) then begin + for J := 0 to ShortcutsList.Count - 1 do + SaveOption(ShortcutsList.MenuBarName, ShortcutsList.Objects[J] as TTBCustomItem); + end; +end; + +procedure ApplyItemOptions(OwnerComponent: TComponent; + ShortcutsList: TSpTBXMenuBarShortcuts; OptionsList: TStringList); +var + RootItemsList, ItemsList: TStringList; + I, J, OrigPos, InsertPoint: Integer; + Item, ParentItem, AuxParentItem: TTBCustomItem; + ParentToolbar: TSpTBXTabToolbarAccess; + ItemName: string; + ShortCut: TShortCut; +begin + RootItemsList := TStringList.Create; + ItemsList := TStringList.Create; + try + GetRootItemsList(OwnerComponent, RootItemsList); + for I := 0 to RootItemsList.Count - 1 do begin + ParentItem := TTBCustomItem(RootItemsList.Objects[I]); + for J := 0 to ParentItem.Count - 1 do + ItemsList.AddObject(ParentItem[J].Name, ParentItem[J]); + end; + + InsertPoint := 0; + AuxParentItem := nil; + for I := 0 to OptionsList.Count - 1 do begin + Item := ParseItemEntry(RootItemsList, ItemsList, OptionsList[I], ParentItem, ItemName, ShortCut); + if Assigned(Item) then begin + if AuxParentItem <> ParentItem then begin + AuxParentItem := ParentItem; + InsertPoint := 0; + end; + // Move the item if the parent or index are different + if not Assigned(Item.Parent) then + ParentItem.Insert(InsertPoint, Item) + else + if Item.Parent <> ParentItem then begin + Item.Parent.Remove(Item); + ParentItem.Insert(InsertPoint, Item); + end + else begin + OrigPos := Item.Parent.IndexOf(Item); + if OrigPos <> InsertPoint then begin + if Item.Parent.ParentComponent is TSpTBXTabToolbar then begin + ParentToolbar := TSpTBXTabToolbarAccess(Item.Parent.ParentComponent); + ParentToolbar.BeginItemMove; + ParentToolbar.View.BeginUpdate; + try + // The item is the active tab, we need to update the ActiveTabIndex + // Just set the internal value because the page didn't change + if ParentToolbar.FActiveTabIndex = OrigPos then + ParentToolbar.FActiveTabIndex := InsertPoint; + Item.Parent.Move(OrigPos, InsertPoint); + finally + ParentToolbar.View.EndUpdate; + ParentToolbar.EndItemMove; + end; + end + else + Item.Parent.Move(OrigPos, InsertPoint); + end; + end; + + if Assigned(Item.Action) and (Item.Action is TAction) then + TAction(Item.Action).ShortCut := ShortCut + else + Item.ShortCut := ShortCut; + Inc(InsertPoint); + end + else begin + // Item not found try to change the Shortcut + if Assigned(ShortcutsList) then + for J := 0 to ShortcutsList.Count - 1 do begin + Item := ShortcutsList.Objects[J] as TTBCustomItem; + if Item.Name = ItemName then begin + if Assigned(Item.Action) and (Item.Action is TAction) then + TAction(Item.Action).ShortCut := ShortCut + else + Item.ShortCut := ShortCut; + Break; + end; + end; + end; + end; + + finally + RootItemsList.Free; + ItemsList.Free; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Ini/Reg } + +procedure SpIniEraseSection(IniFile: TCustomIniFile; Section: string; EraseKeysOnly: Boolean); +var + I: Integer; + Keys: TStringList; +begin + if EraseKeysOnly then begin + Keys := TStringList.Create; + try + IniFile.ReadSection(Section, Keys); + for I := 0 to Keys.Count - 1 do + IniFile.DeleteKey(Section, Keys[I]); + finally + Keys.Free; + end; + end + else + IniFile.EraseSection(Section); +end; + +procedure SpIniSaveStringList(IniFile: TCustomIniFile; Section: string; L: TStringList); +var + I: Integer; +begin + if not Assigned(L) then Exit; + SpIniEraseSection(IniFile, Section, True); + if L.Count > 0 then begin + IniFile.WriteInteger(Section, rvCount, L.Count); + for I := 0 to L.Count - 1 do + IniFile.WriteString(Section, IntToStr(I), L[I]); + end; +end; + +procedure SpIniLoadStringList(IniFile: TCustomIniFile; Section: string; L: TStringList); +var + I, C: integer; +begin + if not Assigned(L) then Exit; + L.Clear; + C := IniFile.ReadInteger(Section, rvCount, -1); + for I := 0 to C - 1 do + L.Add(IniFile.ReadString(Section, IntToStr(I), '')); +end; + +procedure SpRegSaveStringList(L: TStringList; const RootKey: DWORD; const BaseRegistryKey: string); +var + Reg: TRegistry; + I: integer; +begin + if not Assigned(L) then Exit; + Reg := TRegistry.Create; + try + Reg.RootKey := RootKey; + Reg.DeleteKey(BaseRegistryKey); + if Reg.OpenKey(BaseRegistryKey, True) and (L.Count > 0) then begin + Reg.WriteInteger(rvCount, L.Count); + for I := 0 to L.Count - 1 do + Reg.WriteString(IntToStr(I), L[I]); + Reg.CloseKey; + end; + finally + Reg.Free; + end; +end; + +procedure SpRegLoadStringList(L: TStringList; const RootKey: DWORD; const BaseRegistryKey: string); +var + Reg: TRegistry; + I, C: integer; +begin + if not Assigned(L) then Exit; + Reg := TRegistry.Create; + try + L.Clear; + Reg.RootKey := RootKey; + if Reg.OpenKey(BaseRegistryKey, True) then begin + if Reg.ValueExists(rvCount) then begin + C := Reg.ReadInteger(rvCount); + for I := 0 to C - 1 do + if Reg.ValueExists(inttostr(I)) then + L.Add(Reg.ReadString(inttostr(I))); + end; + Reg.CloseKey; + end; + finally + Reg.Free; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Layouts } + +procedure SpLoadFormState(Form: TCustomForm; OptionsList: TStrings); +var + WState: TWindowState; + R: TRect; +begin + if Assigned(Form) then begin + WState := TWindowState(GetEnumValue(TypeInfo(TWindowState), OptionsList.Values[rvMainFormWindowState])); + if (WState < Low(WState)) or (WState > High(WState)) then + WState := Form.WindowState; // Failed reading from string, leave the default value + + if SpStringToRect(OptionsList.Values[rvMainFormBounds], R) then + Form.SetBounds(R.Left, R.Top, R.Right, R.Bottom); + + if not SpStringToRect(OptionsList.Values[rvMainFormRestoreBounds], R) then + R := Rect(Form.Left, Form.Top, Form.Width, Form.Height); // Failed reading from string, leave the default value + + SpSetFormWindowState(Form, WState, R); + end; +end; + +procedure SpSaveFormState(Form: TCustomForm; OptionsList: TStrings); +var + WState: TWindowState; + RestoreBounds: TRect; +begin + if Assigned(Form) then begin + WState := SpGetFormWindowState(Form, RestoreBounds); + OptionsList.Values[rvMainFormWindowState] := GetEnumName(TypeInfo(TWindowState), Ord(WState)); + OptionsList.Values[rvMainFormBounds] := SpRectToString(Rect(Form.Left, Form.Top, Form.Width, Form.Height)); + OptionsList.Values[rvMainFormRestoreBounds] := SpRectToString(RestoreBounds); + end; +end; + +procedure SpLoadLayoutList(IniFile: TCustomIniFile; L: TStringList); overload; +begin + SpIniLoadStringList(IniFile, rvLayoutList, L); +end; + +procedure SpSaveLayout(const OwnerComponent: TComponent; IniFile: TCustomIniFile; + LayoutName: string; ExtraOptions: TStringList = nil); +var + L: TStringList; + Prefix, RegPrevPath: string; +begin + // Add the Layout to the LayoutList + L := TStringList.Create; + try + SpIniLoadStringList(IniFile, rvLayoutList, L); + if L.IndexOf(LayoutName) = -1 then + L.Add(LayoutName); + SpIniSaveStringList(IniFile, rvLayoutList, L); + finally + L.Free; + end; + + Prefix := LayoutName + ' @ '; + // Open the new key and save the previous key if it's a TRegistryIniFile + if IniFile is TRegistryIniFile then begin + RegPrevPath := TRegistryIniFile(IniFile).RegIniFile.CurrentPath; + Prefix := ''; + if not TRegistryIniFile(IniFile).RegIniFile.OpenKey(RegPrevPath + '\' + rvLayoutRegList + '\' + LayoutName, True) then + Exit; + end; + // Save the Layout and ExtraOptions + SpTBIniSavePositions(OwnerComponent, IniFile, Prefix); + if Assigned(ExtraOptions) then + SpIniSaveStringList(IniFile, Prefix + rvExtraOptions, ExtraOptions); + // Open the previous key if it's a TRegistryIniFile + if IniFile is TRegistryIniFile then + TRegistryIniFile(IniFile).RegIniFile.OpenKey(RegPrevPath, False); +end; + +procedure SpLoadLayout(const OwnerComponent: TComponent; IniFile: TCustomIniFile; + LayoutName: string; ExtraOptions: TStringList = nil); +var + L: TStringList; + Prefix, RegPrevPath: string; +begin + // Check if the layout exists on the layout list + L := TStringList.Create; + try + SpIniLoadStringList(IniFile, rvLayoutList, L); + if L.IndexOf(LayoutName) < 0 then + Exit; + finally + L.Free; + end; + + Prefix := LayoutName + ' @ '; + // Open the new key and save the previous key if it's a TRegistryIniFile + if IniFile is TRegistryIniFile then begin + RegPrevPath := TRegistryIniFile(IniFile).RegIniFile.CurrentPath; + Prefix := ''; + if not TRegistryIniFile(IniFile).RegIniFile.OpenKey(RegPrevPath + '\' + rvLayoutRegList + '\' + LayoutName, False) then + Exit; + end; + // Load the Layout and ExtraOptions + SpTBIniLoadPositions(OwnerComponent, IniFile, Prefix); + if Assigned(ExtraOptions) then + SpIniLoadStringList(IniFile, Prefix + rvExtraOptions, ExtraOptions); + // Open the previous key if it's a TRegistryIniFile + if IniFile is TRegistryIniFile then + TRegistryIniFile(IniFile).RegIniFile.OpenKey(RegPrevPath, False); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Items } + +procedure SpSaveItems(const OwnerComponent: TComponent; IniFile: TCustomIniFile; + ShortcutsList: TSpTBXMenuBarShortcuts = nil; ExtraOptions: TStringList = nil); overload; +var + L: TStringList; +begin + L := TStringList.Create; + try + SaveItemOptions(OwnerComponent, ShortcutsList, L); + SpIniSaveStringList(IniFile, rvItemsList, L); + SpIniSaveStringList(IniFile, rvExtraOptions, ExtraOptions); + finally + L.Free; + end; +end; + +procedure SpLoadItems(const OwnerComponent: TComponent; IniFile: TCustomIniFile; + ShortcutsList: TSpTBXMenuBarShortcuts = nil; ExtraOptions: TStringList = nil); overload; +var + L: TStringList; +begin + L := TStringList.Create; + try + SpIniLoadStringList(IniFile, rvItemsList, L); + ApplyItemOptions(OwnerComponent, ShortcutsList, L); + SpIniLoadStringList(IniFile, rvExtraOptions, ExtraOptions); + finally + L.Free; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Misc } + +function SpCustomizerGetWideCaption(Item: TTBCustomItem): WideString; +begin + if Item is TSpTBXCustomItem then Result := TSpTBXCustomItem(Item).Caption + else if Item is TSpTBXEditItem then Result := TSpTBXEditItem(Item).Caption + else if Item is TTBSeparatorItem then Result := Item.Name + else if Item is TTBGroupItem then Result := Item.Name + else Result := Item.Caption; + Result := SpStripShortcut(Result); + Result := SpStripAccelChars(Result); +end; + +function SpCreateUniqueSeparator(Blank: Boolean): TSpTBXSeparatorItem; +var + S: string; +begin + S := IntToStr(DateTimeToFileDate(Now)); + Result := TSpTBXSeparatorItem.Create(nil); + if Blank then begin + Result.Name := rvUniqueBlankSeparatorPrefix + S; + TSpTBXSeparatorItem(Result).Blank := True; + end + else + Result.Name := rvUniqueSeparatorPrefix + S; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TShortCutsProcessor } + +constructor TShortCutsProcessor.Create; +begin + inherited; + if Assigned(Application) then + Application.HookMainWindow(MainWindowHook); +end; + +destructor TShortCutsProcessor.Destroy; +begin + if Assigned(Application) then + Application.UnhookMainWindow(MainWindowHook); + inherited; +end; + +function TShortCutsProcessor.MainWindowHook(var Message: TMessage): Boolean; +begin + // Hook to the Application's message loop to disable ShortCut messages processing. + // If the Form is non-modal and a key is pressed it tries to find a shortcut + // handler in the main form, we need to disable this. + // We have to hook in the initialization section so the hook is prior the + // TTBCustomToolbar hook in the Application's hooklist. + + // Shortcut messages: + // Whenever a keystroke is pressed and is not handled by the active control + // or a suitable popup menu item, it is passed to the underlying form's + // IsShortCut method. The form tries to handle the keystroke through its + // OnShortCut event or, failing that, through its main menu. If nothing wants + // it, all action lists owned by the form are checked for a matching shortcut. + // The action list checks each of its actions and if a match is found, + // the action's Execute method is called. + // If no suitable action is found on the current form a CM_APPKEYDOWN message + // is sent to the Application object which calls its own IsShortCut method. + // This tries to handle the keystroke in its own OnShortCut event and if + // that fails it calls the main form's IsShortCut method. + + // Key press -> Active Control -> Popup Menu -> TCustomForm.IsShortCut -> + // TCustomForm.MainMenu -> TActionList -> TApplication CM_APPKEYDOWN and CM_APPSYSCOMMAND -> + // TApplication.IsShortCut + + Result := False; + if FActive then + if (Message.Msg = CM_APPKEYDOWN) or (Message.Msg = CM_APPSYSCOMMAND) then begin + Message.Result := 0; + Result := true; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomizer } + +constructor TSpTBXCustomizer.Create(AOwner: TComponent); +begin + inherited; + FItems := TTBRootItem.Create(Self); + FItems.ParentComponent := Self; + FLayouts := TStringList.Create; + FResetState := TStringList.Create; + FSaveFormState := True; + SkinManager.AddSkinNotification(Self); +end; + +destructor TSpTBXCustomizer.Destroy; +begin + SkinManager.RemoveSkinNotification(Self); + FItems.Free; + FLayouts.Free; + FResetState.Free; + inherited; +end; + +procedure TSpTBXCustomizer.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited Notification(AComponent, Operation); + if (Operation = opRemove) then begin + if AComponent = FCustomizeForm then FCustomizeForm := nil; + if AComponent = FMenuBar then FMenuBar := nil; + end; +end; + +procedure TSpTBXCustomizer.GetChildren(Proc: TGetChildProc; + Root: TComponent); +begin + TTBRootItemAccess(FItems).GetChildren(Proc, Root); +end; + +function TSpTBXCustomizer.GetCustomizeFormClass: TSpTBXCustomizeFormClass; +begin + Result := TSpTBXCustomizeForm; + if Assigned(FOnGetCustomizeForm) then FOnGetCustomizeForm(Self, Result); + if not Assigned(Result) then + Result := TSpTBXCustomizeForm; +end; + +procedure TSpTBXCustomizer.GetShortcutList(ShortcutsList: TTntStringList); +var + I: Integer; + Item: TTBCustomItem; + ItemStyle: TTBItemStyle; + L: TTntStringList; +begin + ShortcutsList.Clear; + + if Assigned(MenuBar) then begin + if ShortcutsList is TSpTBXMenuBarShortcuts then + TSpTBXMenuBarShortcuts(ShortcutsList).MenuBarName := MenuBar.Name; + + L := TTntStringList.Create; + try + SpGetAllItems(MenuBar.Items, L); + for I := 0 to L.Count - 1 do begin + Item := L.Objects[I] as TTBCustomItem; + ItemStyle := TTBCustomItemAccess(Item).ItemStyle; + // Exclude the submenus, separators, labels, groups and edit items + if (ItemStyle * [tbisSubMenu, tbisSeparator, tbisEmbeddedGroup, tbisClicksTransparent] = []) and + not (Item is TTBEditItem) then + begin + if DoGetShortcutsList(Item) then + ShortcutsList.AddObject(SpCustomizerGetWideCaption(Item), Item); + end; + end; + finally + L.Free; + end; + end; +end; + +function TSpTBXCustomizer.GetImages: TCustomImageList; +begin + Result := FItems.SubMenuImages; +end; + +function TSpTBXCustomizer.GetItems: TTBCustomItem; +begin + Result := FItems; +end; + +procedure TSpTBXCustomizer.SetImages(Value: TCustomImageList); +begin + FItems.SubMenuImages := Value; +end; + +procedure TSpTBXCustomizer.SetMenuBar(const Value: TTBCustomToolbar); +begin + if FMenuBar <> Value then begin + FMenuBar := Value; + if Assigned(Value) then + Value.FreeNotification(Self); + end; +end; + +procedure TSpTBXCustomizer.SetupForm; +begin + FCustomizeForm.FormStyle := fsStayOnTop; + FCustomizeForm.BorderIcons := [biSystemMenu]; + FCustomizeForm.Position := poMainFormCenter; + SpCustomizeAllToolbars(Owner as TWinControl, False); + SpCustomizeAllToolbars(FCustomizeForm, False); +end; + +procedure TSpTBXCustomizer.Close; +begin + if FShowing and Assigned(FCustomizeForm) then begin + FCustomizeForm.Close; + SpCustomizeAllToolbars(Owner as TWinControl, True); + SpCustomizeAllToolbars(FCustomizeForm, True); + FShowing := False; + if Assigned(FOnClose) then FOnClose(Self); + end; +end; + +procedure TSpTBXCustomizer.Show; +begin + ShowEmbedded; +end; + +procedure TSpTBXCustomizer.ShowEmbedded(AParent: TWinControl = nil); +begin + if FShowing then Exit; + + if not Assigned(FCustomizeForm) then + FCustomizeForm := GetCustomizeFormClass.Create(Self, AParent); + + if Assigned(FCustomizeForm) then begin + if Assigned(FOnCreateCustomizeForm) then FOnCreateCustomizeForm(FCustomizeForm); + FShowing := True; + SetupForm; + FCustomizeForm.Show; + FCustomizeForm.DoSkinChange; + if Assigned(FOnShow) then FOnShow(Self); + end; +end; + +procedure TSpTBXCustomizer.ValidateContainer(AComponent: TComponent); +var + I: Integer; +begin + if Assigned(AComponent) then begin + if not (AComponent is TCustomForm) and not (AComponent is TCustomFrame) then + raise EInvalidOperation.Create(SSpTBXCustomizerInvalidParent); + for I := 0 to AComponent.ComponentCount - 1 do + if AComponent.Components[I] is TSpTBXCustomizer then + raise EInvalidOperation.Create(SSpTBXCustomizerRepeatedInstance); + end + else + raise EInvalidOperation.Create(SSpTBXCustomizerInvalidParent); + + inherited; +end; + +procedure TSpTBXCustomizer.Load(IniFile: TCustomIniFile; LoadLastLayout: Boolean = True); +var + ExtraL: TStringList; + ShortcutsL: TSpTBXMenuBarShortcuts; +begin + ExtraL := TStringList.Create; + ShortcutsL := TSpTBXMenuBarShortcuts.Create; + try + // Load Shortcuts + if Assigned(MenuBar) then + GetShortcutList(ShortcutsL); + + // Save the ResetState, save only the Items and Toolbar state + SaveResetState(ShortcutsL); + + // Load Items + SpLoadItems(Owner, IniFile, ShortcutsL, ExtraL); + + // Fill Extra Options + DoLoad(ExtraL); + if FSaveFormState then + SpLoadFormState(Application.MainForm, ExtraL); + SkinManager.SetSkin(ExtraL.Values[rvSkin]); + + // Load Layouts + SpLoadLayoutList(IniFile, FLayouts); + if LoadLastLayout then + LoadLayout(IniFile, rvLastLayout); + finally + ExtraL.Free; + ShortcutsL.Free; + end; +end; + +procedure TSpTBXCustomizer.Load(OptionsList: TStrings; LoadLastLayout: Boolean = True); +var + MemIni: TMemIniFile; +begin + MemIni := TMemIniFile.Create(''); + try + MemIni.SetStrings(OptionsList); // Transfer OptionsList contents to MemIni + Load(MemIni, LoadLastLayout); + finally + MemIni.Free; + end; +end; + +procedure TSpTBXCustomizer.Load(const Filename: string; LoadLastLayout: Boolean = True); +var + MemIni: TMemIniFile; +begin + MemIni := TMemIniFile.Create(Filename); + try + Load(MemIni, LoadLastLayout); + finally + MemIni.Free; + end; +end; + +procedure TSpTBXCustomizer.Load(const RootKey: DWORD; BaseRegistryKey: string; LoadLastLayout: Boolean = True); +var + Reg: TRegistryIniFile; +begin + // Use TRegistryIniFile to call Load + Reg := TRegistryIniFile.Create('', KEY_QUERY_VALUE); + try + Reg.RegIniFile.RootKey := RootKey; + if Reg.RegIniFile.OpenKey(BaseRegistryKey, False) then + Load(Reg, LoadLastLayout); + finally + Reg.Free; + end; +end; + +procedure TSpTBXCustomizer.Save(IniFile: TCustomIniFile; SaveLastLayout: Boolean = True); +var + ExtraL: TStringList; + ShortcutsL: TSpTBXMenuBarShortcuts; +begin + ExtraL := TStringList.Create; + ShortcutsL := TSpTBXMenuBarShortcuts.Create; + try + // Fill Extra Options, SpSaveItems will save it + ExtraL.Values[rvSkin] := SkinManager.CurrentSkinName; + if FSaveFormState then + SpSaveFormState(Application.MainForm, ExtraL); + DoSave(ExtraL); + + // Save Items + if Assigned(MenuBar) then + GetShortcutList(ShortcutsL); + SpSaveItems(Owner, IniFile, ShortcutsL, ExtraL); + + // Save LastLayout + if SaveLastLayout then + SaveLayout(IniFile, rvLastLayout) + else + DeleteLayout(IniFile, rvLastLayout); + finally + ExtraL.Free; + ShortcutsL.Free; + end; +end; + +procedure TSpTBXCustomizer.Save(OptionsList: TStrings; SaveLastLayout: Boolean = True); +var + MemIni: TMemIniFile; +begin + MemIni := TMemIniFile.Create(''); + try + MemIni.SetStrings(OptionsList); // Transfer OptionsList contents to MemIni + Save(MemIni, SaveLastLayout); + OptionsList.Clear; + MemIni.GetStrings(OptionsList); // Transfer MemIni contents to OptionsList + finally + MemIni.Free; + end; +end; + +procedure TSpTBXCustomizer.Save(const Filename: string; SaveLastLayout: Boolean = True); +var + MemIni: TMemIniFile; +begin + MemIni := TMemIniFile.Create(Filename); + try + Save(MemIni, SaveLastLayout); + MemIni.UpdateFile; + finally + MemIni.Free; + end; +end; + +procedure TSpTBXCustomizer.Save(const RootKey: DWORD; BaseRegistryKey: string; SaveLastLayout: Boolean = True); +var + Reg: TRegistryIniFile; +begin + // Use TRegistryIniFile to call Save + Reg := TRegistryIniFile.Create(''); + try + Reg.RegIniFile.RootKey := RootKey; + Reg.RegIniFile.CreateKey(BaseRegistryKey); + if Reg.RegIniFile.OpenKey(BaseRegistryKey, True) then + Save(Reg, SaveLastLayout); + finally + Reg.Free; + end; +end; + +procedure TSpTBXCustomizer.Reset; +var + MemIni: TMemIniFile; + ShortcutsL: TSpTBXMenuBarShortcuts; +begin + // Load ResetState + if FResetState.Count > 0 then begin + MemIni := TMemIniFile.Create(''); + ShortcutsL := TSpTBXMenuBarShortcuts.Create; + try + MemIni.SetStrings(FResetState); // Transfer FResetState contents to MemIni + // Load Shortcuts + if Assigned(MenuBar) then + GetShortcutList(ShortcutsL); + // Load Items + SpLoadItems(Owner, MemIni, ShortcutsL, nil); + // Load last layout + SpLoadLayout(Owner, MemIni, rvLastLayout, nil); + finally + MemIni.Free; + ShortcutsL.Free; + end; + end; +end; + +procedure TSpTBXCustomizer.LoadLayout(IniFile: TCustomIniFile; LayoutName: string); +var + ExtraL: TStringList; +begin + ExtraL := TStringList.Create; + try + SpLoadLayout(Owner, IniFile, LayoutName, ExtraL); + DoLayoutLoad(LayoutName, ExtraL); + finally + ExtraL.Free; + end; +end; + +procedure TSpTBXCustomizer.LoadLayout(OptionsList: TStrings; LayoutName: string); +var + MemIni: TMemIniFile; +begin + MemIni := TMemIniFile.Create(''); + try + MemIni.SetStrings(OptionsList); // Transfer OptionsList contents to MemIni + LoadLayout(MemIni, LayoutName); + finally + MemIni.Free; + end; +end; + +procedure TSpTBXCustomizer.LoadLayout(const Filename, LayoutName: string); +var + MemIni: TMemIniFile; +begin + MemIni := TMemIniFile.Create(Filename); + try + LoadLayout(MemIni, LayoutName); + finally + MemIni.Free; + end; +end; + +procedure TSpTBXCustomizer.LoadLayout(const RootKey: DWORD; + BaseRegistryKey, LayoutName: string); +var + Reg: TRegistryIniFile; +begin + // Use TRegistryIniFile to call LoadLayout + Reg := TRegistryIniFile.Create('', KEY_QUERY_VALUE); + try + Reg.RegIniFile.RootKey := RootKey; + if Reg.RegIniFile.OpenKey(BaseRegistryKey, False) then + LoadLayout(Reg, LayoutName); + finally + Reg.Free; + end; +end; + +procedure TSpTBXCustomizer.SaveLayout(IniFile: TCustomIniFile; LayoutName: string); +var + ExtraL: TStringList; +begin + if LayoutName = '' then Exit; + ExtraL := TStringList.Create; + try + DoLayoutSave(LayoutName, ExtraL); + SpSaveLayout(Owner, IniFile, LayoutName, ExtraL); + SpLoadLayoutList(IniFile, FLayouts); + finally + ExtraL.Free; + end; +end; + +procedure TSpTBXCustomizer.SaveLayout(OptionsList: TStrings; LayoutName: string); +var + MemIni: TMemIniFile; +begin + if LayoutName = '' then Exit; + MemIni := TMemIniFile.Create(''); + try + MemIni.SetStrings(OptionsList); // Transfer OptionsList contents to MemIni + SaveLayout(MemIni, LayoutName); + + // Reload OptionsList + OptionsList.Clear; + MemIni.GetStrings(OptionsList); // Transfer MemIni contents to OptionsList + finally + MemIni.Free; + end; +end; + +procedure TSpTBXCustomizer.SaveLayout(const Filename, LayoutName: string); +var + MemIni: TMemIniFile; +begin + if LayoutName = '' then Exit; + MemIni := TMemIniFile.Create(Filename); + try + SaveLayout(MemIni, LayoutName); + MemIni.UpdateFile; + finally + MemIni.Free; + end; +end; + +procedure TSpTBXCustomizer.SaveLayout(const RootKey: DWORD; + BaseRegistryKey, LayoutName: string); +var + Reg: TRegistryIniFile; +begin + if LayoutName = '' then Exit; + // Use TRegistryIniFile to call SaveLayout + Reg := TRegistryIniFile.Create(''); + try + Reg.RegIniFile.RootKey := RootKey; + Reg.RegIniFile.CreateKey(BaseRegistryKey); + if Reg.RegIniFile.OpenKey(BaseRegistryKey, True) then + SaveLayout(Reg, LayoutName); + finally + Reg.Free; + end; +end; + +procedure TSpTBXCustomizer.SaveResetState(ShortcutsList: TSpTBXMenuBarShortcuts); +var + TempIni: TMemIniFile; +begin + // Save the ResetState, save only the Items and Toolbar state + if FResetState.Count = 0 then begin + TempIni := TMemIniFile.Create(''); + try + SaveItemOptions(Owner, ShortcutsList, FResetState); + SpIniSaveStringList(TempIni, rvItemsList, FResetState); + SpSaveLayout(Owner, TempIni, rvLastLayout, nil); + FResetState.Clear; + TempIni.GetStrings(FResetState); // Transfer MemIni contents to OptionsList + finally + TempIni.Free; + end; + end; +end; + +function TSpTBXCustomizer.DeleteLayout(IniFile: TCustomIniFile; LayoutName: string): Boolean; +var + L: TStringList; + I, P: Integer; + S: string; +begin + Result := False; + L := TStringList.Create; + try + SpIniLoadStringList(IniFile, rvLayoutList, L); + I := L.IndexOf(LayoutName); + if I > -1 then begin + Result := True; + L.Delete(I); + SpIniSaveStringList(IniFile, rvLayoutList, L); + + if IniFile is TRegistryIniFile then + TRegistryIniFile(IniFile).EraseSection(rvLayoutRegList + '\' + LayoutName) + else begin + // Delete all the Layout sections + IniFile.ReadSections(L); + for I := 0 to L.Count - 1 do begin + P := Pos(' @ ', L[I]); + if P > 0 then begin + S := Copy(L[I], 1, P - 1); + if SameText(LayoutName, S) then + IniFile.EraseSection(L[I]); + end; + end; + end; + + SpLoadLayoutList(IniFile, FLayouts); + end; + finally + L.Free; + end; +end; + +function TSpTBXCustomizer.DeleteLayout(OptionsList: TStrings; LayoutName: string): Boolean; +var + MemIni: TMemIniFile; +begin + Result := False; + MemIni := TMemIniFile.Create(''); + try + MemIni.SetStrings(OptionsList); // Transfer OptionsList contents to MemIni + if DeleteLayout(MemIni, LayoutName) then begin + Result := True; + // Reload OptionsList + OptionsList.Clear; + MemIni.GetStrings(OptionsList); // Transfer MemIni contents to OptionsList + end; + finally + MemIni.Free; + end; +end; + +function TSpTBXCustomizer.DeleteLayout(const Filename, LayoutName: string): Boolean; +var + MemIni: TMemIniFile; +begin + Result := False; + MemIni := TMemIniFile.Create(Filename); + try + if DeleteLayout(MemIni, LayoutName) then begin + Result := True; + MemIni.UpdateFile; + end; + finally + MemIni.Free; + end; +end; + +function TSpTBXCustomizer.DeleteLayout(const RootKey: DWORD; BaseRegistryKey, + LayoutName: string): Boolean; +var + Reg: TRegistryIniFile; +begin + // Use TRegistryIniFile to call DeleteLayout + Result := False; + Reg := TRegistryIniFile.Create(''); + try + Reg.RegIniFile.RootKey := RootKey; + Reg.RegIniFile.CreateKey(BaseRegistryKey); + if Reg.RegIniFile.OpenKey(BaseRegistryKey, True) then + Result := DeleteLayout(Reg, LayoutName); + finally + Reg.Free; + end; +end; + +function TSpTBXCustomizer.DoGetShortcutsList(AItem: TTBCustomItem): Boolean; +begin + if AItem.Parent is TSpTBXSkinGroupItem then + Result := False + else + Result := True; + if Assigned(FOnGetShortcutsList) then FOnGetShortcutsList(Self, AItem, Result); +end; + +procedure TSpTBXCustomizer.DoIconOptionsChange(Toolbar: TTBCustomToolbar; + UseSmallImages: Boolean); +begin + if Assigned(FOnIconOptionsChange) then FOnIconOptionsChange(Self, Toolbar, UseSmallImages); +end; + +procedure TSpTBXCustomizer.DoLoad(ExtraOptions: TStringList); +begin + if Assigned(FOnLoad) then FOnLoad(Self, ExtraOptions); +end; + +procedure TSpTBXCustomizer.DoSave(ExtraOptions: TStringList); +begin + if Assigned(FOnSave) then FOnSave(Self, ExtraOptions); +end; + +procedure TSpTBXCustomizer.DoLayoutLoad(LayoutName: string; + ExtraOptions: TStringList); +begin + if Assigned(FOnLayoutLoad) then FOnLayoutLoad(Self, LayoutName, ExtraOptions); +end; + +procedure TSpTBXCustomizer.DoLayoutSave(LayoutName: string; + ExtraOptions: TStringList); +begin + if Assigned(FOnLayoutSave) then FOnLayoutSave(Self, LayoutName, ExtraOptions); +end; + +procedure TSpTBXCustomizer.DoSkinChange; +begin + if FShowing and Assigned(FCustomizeForm) then + FCustomizeForm.DoSkinChange; + if Assigned(FOnSkinChange) then FOnSkinChange(Self); +end; + +procedure TSpTBXCustomizer.WMSpSkinChange(var Message: TMessage); +begin + DoSkinChange; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomCustomizeForm } + +constructor TSpTBXCustomCustomizeForm.Create(AOwner: TSpTBXCustomizer; EmbeddedParent: TWinControl); +begin + FCustomizer := AOwner; + FEmbedded := Assigned(EmbeddedParent); + + inherited Create(AOwner); + + FToolbarList := TTntStringList.Create; + FItemList := TTntStringList.Create; + FShortcutList := TTntStringList.Create; + FSeparatorList := TTntStringList.Create; + FBlankSeparatorList := TTntStringList.Create; + + // Hook to the Application's message loop to disable ShortCut messages processing. + // Otherwise the TApplication.MainForm Actions are executed. + if Assigned(FShortcutsProcessor) then + FShortcutsProcessor.Active := True; + + if Assigned(EmbeddedParent) then begin + Parent := EmbeddedParent; + BorderStyle := bsNone; + Align := alClient; + end; +end; + +destructor TSpTBXCustomCustomizeForm.Destroy; +begin + Customizer.Close; + if Assigned(FShortcutsProcessor) then + FShortcutsProcessor.Active := False; + FreeAndNil(FToolbarList); + FreeAndNil(FItemList); + FreeAndNil(FShortcutList); + FreeAndNil(FSeparatorList); + FreeAndNil(FBlankSeparatorList); + inherited; +end; + +procedure TSpTBXCustomCustomizeForm.FillCommands; +var + I: Integer; + W: TWinControl; + TB: TSpTBXToolbar; + Item: TTBCustomItem; + WS: WideString; + UseBlankSeparators: Boolean; +begin + // Get the main form + W := Customizer.Owner as TWinControl; + + FToolbarList.Clear; + FSeparatorList.Clear; + FBlankSeparatorList.Clear; + FItemList.Clear; + + // Fill the Toolbars + for I := 0 to W.ComponentCount - 1 do + if W.Components[I] is TSpTBXToolbar then begin + TB := W.Components[I] as TSpTBXToolbar; + if TB.Customizable then + FToolbarList.AddObject(TB.Caption, TB); + end; + + // Add the Separator item + FItemList.Add(rvSeparator); + UseBlankSeparators := Customizer.BlankSeparators; + if UseBlankSeparators then + FItemList.Add(rvBlankSeparator); + + // Add the Customizer items + for I := 0 to Customizer.Items.Count - 1 do begin + Item := Customizer.Items[I]; + WS := SpCustomizerGetWideCaption(Item); + if Item is TTBSeparatorItem then begin + if UseBlankSeparators and TTBSeparatorItem(Item).Blank then + FBlankSeparatorList.AddObject(WS, Item) + else + FSeparatorList.AddObject(WS, Item); + end + else + FItemList.AddObject(WS, Item); + end; + + // Add the Shortcuts items + Customizer.GetShortcutList(FShortcutList); + + DoFillCommands(FToolbarList, FItemList, FShortcutList); +end; + +procedure TSpTBXCustomCustomizeForm.KeyDown(var Key: Word; Shift: TShiftState); +begin + inherited KeyUp(Key, Shift); + if Key = VK_ESCAPE then Close; +end; + +procedure TSpTBXCustomCustomizeForm.DoClose(var Action: TCloseAction); +begin + Action := caFree; + inherited DoClose(Action); +end; + +procedure TSpTBXCustomCustomizeForm.DoShow; +begin + if Assigned(Customizer) then + FillCommands; + inherited; +end; + +procedure TSpTBXCustomCustomizeForm.DoIconOptionsChange(UseSmallImages: Boolean); +var + I: integer; + TB: TTBCustomToolbar; +begin + if Assigned(Customizer) then + for I := 0 to FToolbarList.Count - 1 do + if FToolbarList.Objects[I] is TTBCustomToolbar then begin + TB := FToolbarList.Objects[I] as TTBCustomToolbar; + Customizer.DoIconOptionsChange(TB, UseSmallImages); + end; +end; + +procedure TSpTBXCustomCustomizeForm.DoSkinChange; +begin + // The skin has changed +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM + +initialization + FShortcutsProcessor := TShortCutsProcessor.Create; +finalization + FreeAndNil(FShortcutsProcessor); + +end. diff --git a/internal/2.4.4/1/Source/SpTBXCustomizerForm.dfm b/internal/2.4.4/1/Source/SpTBXCustomizerForm.dfm new file mode 100644 index 0000000..a3afc67 --- /dev/null +++ b/internal/2.4.4/1/Source/SpTBXCustomizerForm.dfm @@ -0,0 +1,282 @@ +object SpTBXCustomizeForm: TSpTBXCustomizeForm + Left = 219 + Top = 115 + Caption = 'Customize...' + 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 = 8 + Top = 227 + Width = 247 + Height = 22 + Anchors = [akLeft, akRight, akBottom] + TabOrder = 1 + HotTrack = True + object Panel1: TPanel + Left = 2 + Top = 2 + Width = 243 + Height = 18 + Align = alClient + BevelOuter = bvNone + TabOrder = 0 + DesignSize = ( + 243 + 18) + object HotKey1: THotKey + Left = -2 + Top = -2 + Width = 249 + Height = 23 + Anchors = [akLeft, akTop, akRight, akBottom] + HotKey = 0 + Modifiers = [] + TabOrder = 0 + end + end + end + object ChangeShortcut: TSpTBXButton + Left = 261 + Top = 226 + Width = 75 + Height = 25 + Caption = 'C&hange' + Anchors = [akRight, akBottom] + TabOrder = 2 + OnClick = ChangeShortcutClick + end + object lbShortcuts: TSpTBXListBox + Left = 8 + Top = 8 + Width = 330 + Height = 208 + 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 = 8 + Width = 330 + Height = 202 + 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 SpTBXGroupBox1: TSpTBXGroupBox + Left = 175 + Top = 2 + Width = 161 + Height = 191 + Caption = 'Options' + Anchors = [akTop, akRight, akBottom] + TabOrder = 1 + object cbText: TSpTBXComboBox + Left = 6 + Top = 66 + Width = 149 + Height = 21 + Style = csDropDownList + ItemHeight = 13 + TabOrder = 1 + OnClick = cbTextClick + Items.Strings = ( + 'Icons + Selective Text' + 'Icons' + 'Icons + Text' + 'Text') + end + object cbIcon: TSpTBXComboBox + Left = 6 + Top = 114 + Width = 149 + Height = 21 + Style = csDropDownList + ItemHeight = 13 + TabOrder = 2 + Items.Strings = ( + 'Large images' + 'Small images') + end + object cbTextLabel: TSpTBXLabel + Left = 6 + Top = 45 + Width = 68 + Height = 19 + Caption = 'T&ext Options' + FocusControl = cbText + end + object cbIconLabel: TSpTBXLabel + Left = 6 + Top = 95 + Width = 67 + Height = 19 + Caption = '&Icon Options' + FocusControl = cbIcon + end + object checkVisible: TSpTBXCheckBox + Left = 6 + Top = 21 + Width = 53 + Height = 21 + Caption = '&Visible' + TabOrder = 0 + OnClick = checkVisibleClick + end + end + object SpTBXGroupBox2: TSpTBXGroupBox + Left = 175 + Top = 200 + Width = 161 + Height = 49 + Caption = '&Skins' + Anchors = [akRight, akBottom] + TabOrder = 2 + object cbSkins: TSpTBXComboBox + Left = 6 + Top = 20 + Width = 149 + Height = 21 + Style = csDropDownList + ItemHeight = 13 + TabOrder = 0 + OnClick = cbSkinsClick + end + end + object lbToolbars: TSpTBXCheckListBox + Left = 8 + Top = 8 + Width = 158 + Height = 241 + 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 = 264 + Top = 4 + Width = 78 + Height = 25 + Caption = '&Close' + Anchors = [akRight, akBottom] + TabOrder = 0 + OnClick = CloseButtonClick + end + object ResetButton: TSpTBXButton + Left = 7 + Top = 4 + Width = 130 + Height = 25 + Caption = '&Default Options' + TabOrder = 1 + OnClick = ResetButtonClick + end + end +end diff --git a/internal/2.4.4/1/Source/SpTBXCustomizerForm.pas b/internal/2.4.4/1/Source/SpTBXCustomizerForm.pas new file mode 100644 index 0000000..902544a --- /dev/null +++ b/internal/2.4.4/1/Source/SpTBXCustomizerForm.pas @@ -0,0 +1,529 @@ +unit SpTBXCustomizerForm; + +{============================================================================== +Version 2.4.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: + - + +==============================================================================} + +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; + SpTBXLabel3: TSpTBXLabel; + HotKey1: THotKey; + ChangeShortcut: TSpTBXButton; + SpTBXPanel5: TSpTBXPanel; + Panel1: TPanel; + cbSkins: TSpTBXComboBox; + cbIconLabel: TSpTBXLabel; + cbText: TSpTBXComboBox; + cbIcon: TSpTBXComboBox; + cbTextLabel: TSpTBXLabel; + SpTBXGroupBox1: TSpTBXGroupBox; + ResetButton: TSpTBXButton; + checkVisible: TSpTBXCheckBox; + SpTBXGroupBox2: TSpTBXGroupBox; + lbToolbars: TSpTBXCheckListBox; + lbCommands: TSpTBXListBox; + lbShortcuts: TSpTBXListBox; + ClosePanel: TSpTBXPanel; + procedure lbCommandsStartDrag(Sender: TObject; + var DragObject: TDragObject); + procedure lbCommandsDragOver(Sender, Source: TObject; X, + Y: Integer; State: TDragState; var Accept: Boolean); + procedure lbCommandsDragDrop(Sender, Source: TObject; X, + Y: Integer); + procedure lbToolbarsClickCheck(Sender: TObject); + procedure CloseButtonClick(Sender: TObject); + procedure FormKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); + procedure lbCommandsEndDrag(Sender, Target: TObject; X, Y: Integer); + procedure lbShortcutsClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure cbSkinsClick(Sender: TObject); + procedure checkVisibleClick(Sender: TObject); + procedure cbTextClick(Sender: TObject); + procedure lbToolbarsClick(Sender: TObject); + procedure ChangeShortcutClick(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure ResetButtonClick(Sender: TObject); + procedure lbCommandsDrawItem(Sender: TObject; ACanvas: TCanvas; + var ARect: TRect; Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); + procedure lbShortcutsDrawItem(Sender: TObject; ACanvas: TCanvas; + var ARect: TRect; Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); + protected + procedure DoFillCommands(ToolbarList, ItemList, ShortcutsList: TTntStringList); override; + procedure DoSkinChange; override; + end; + +implementation + +uses + ActnList; + +{$R *.dfm} + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Helpers } + +procedure SpDrawListboxItem(L: TSpTBXListBox; Index: Integer; ARect: TRect; + State: TOwnerDrawState; DrawShortcut: Boolean; DefaultImageList: TCustomImageList); +var + Item: TTBCustomItem; + IL: TCustomImageList; + WS: WideString; + TextR, ILRect: TRect; + Y: Integer; + ACanvas: TCanvas; +begin + if (Index < 0) or (Index > L.Count - 1) or not (L.Items.Objects[Index] is TTBCustomItem) then Exit; + Item := L.Items.Objects[Index] as TTBCustomItem; + ACanvas := L.Canvas; + + // Draw the icon image + Inc(ARect.Left, 2); // Apply margins + if Item.ImageIndex > -1 then begin + IL := Item.Images; + if not Assigned(IL) then + IL := DefaultImageList; + if Assigned(IL) then begin + ILRect := Bounds(ARect.Left, ARect.Top + ((L.ItemHeight - IL.Height) div 2), IL.Width, IL.Height); + // Draw icon shadow + if odSelected in State then begin + OffsetRect(ILRect, 1, 1); + SpDrawIconShadow(ACanvas, ILRect, IL, Item.ImageIndex); + OffsetRect(ILRect, -2, -2); + end; + SpDrawImageList(ACanvas, ILRect, IL, Item.ImageIndex, True, True); + end; + end; + + // Draw the caption + Inc(ARect.Left, L.ItemHeight); // Apply margins + WS := L.Items[Index]; + TextR := ARect; + Y := SpDrawXPText(ACanvas, WS, TextR, DT_CALCRECT); + ARect.Top := ARect.Top + ((L.ItemHeight - Y) div 2); + SpDrawXPText(ACanvas, WS, ARect, 0); + + // Draw the shortcut + if DrawShortcut then begin + WS := Item.GetShortCutText; + if (WS <> '0') and (WS <> '') then begin + ARect.Left := L.Width - 120; + SpDrawXPText(ACanvas, WS, ARect, 0) + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomizeForm } + +procedure TSpTBXCustomizeForm.FormCreate(Sender: TObject); +var + L: TStringList; +begin + ClosePanel.Visible := not Embedded; + + // Setup the listboxes + if Assigned(Customizer.Images) then begin + lbCommands.ItemHeight := Customizer.Images.Height + 4; + lbShortcuts.ItemHeight := Customizer.Images.Height + 4; + end; + // Hide the Icon Options combobox if necessary + if not Assigned(Customizer.OnIconOptionsChange) then begin + cbIconLabel.Visible := False; + cbIcon.Visible := False; + end; + // Fill the Skins combobox + L := TStringList.Create; + try + SkinManager.SkinsList.GetSkinNames(L); + L.Sort; + cbSkins.Items.Assign(L); + cbSkins.ItemIndex := L.IndexOf(SkinManager.CurrentSkinName); + finally + L.Free; + end; +end; + +procedure TSpTBXCustomizeForm.FormShow(Sender: TObject); +begin + SpTBXTabControl1.ActiveTabIndex := 0; +end; + +procedure TSpTBXCustomizeForm.FormKeyDown(Sender: TObject; + var Key: Word; Shift: TShiftState); +var + I: Integer; +begin + // Allow to change the tab index using Ctrl+Tab and Shift+Ctrl+Tab + if Key = VK_TAB then + if Shift = [ssCtrl] then begin + I := SpTBXTabControl1.ActiveTabIndex; + if I + 1 < SpTBXTabControl1.PagesCount then + SpTBXTabControl1.ActiveTabIndex := I + 1 + else + SpTBXTabControl1.ActiveTabIndex := I - 1 + end + else + if Shift = [ssCtrl, ssShift] then begin + I := SpTBXTabControl1.ActiveTabIndex; + if I - 1 > -1 then + SpTBXTabControl1.ActiveTabIndex := I - 1 + else + SpTBXTabControl1.ActiveTabIndex := I + 1; + end; +end; + +procedure TSpTBXCustomizeForm.CloseButtonClick(Sender: TObject); +begin + Close; +end; + +procedure TSpTBXCustomizeForm.DoFillCommands(ToolbarList, ItemList, ShortcutsList: TTntStringList); +var + I: Integer; + TB: TSpTBXToolbar; +begin + lbToolbars.Items.Assign(ToolbarList); + lbCommands.Items.Assign(ItemList); + lbShortcuts.Items.Assign(ShortcutsList); + // Setup the Toolbars check list + for I := 0 to lbToolbars.Count - 1 do begin + TB := lbToolbars.Items.Objects[I] as TSpTBXToolbar; + if TB.Visible then + lbToolbars.State[I] := cbChecked; + end; + if lbToolbars.Count > 0 then begin + lbToolbars.ItemIndex := 0; + lbToolbarsClick(nil); + end; +end; + +procedure TSpTBXCustomizeForm.DoSkinChange; +begin + inherited; + ClosePanel.Color := SkinManager.CurrentSkin.ColorBtnFace; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Toolbars tab } + +procedure TSpTBXCustomizeForm.lbToolbarsClick(Sender: TObject); +var + I: Integer; + TB: TTBCustomToolbar; +begin + I := lbToolbars.ItemIndex; + if I > -1 then begin + TB := lbToolbars.Items.Objects[I] as TTBCustomToolbar; + checkVisible.Checked := TB.Visible; + if TB is TSpTBXToolbar then + cbText.ItemIndex := Ord(TSpTBXToolbar(TB).DisplayMode) + else + cbText.ItemIndex := -1; + end; +end; + +procedure TSpTBXCustomizeForm.lbToolbarsClickCheck(Sender: TObject); +var + I: Integer; + TB: TTBCustomToolbar; +begin + I := lbToolbars.ItemIndex; + if I > -1 then begin + TB := lbToolbars.Items.Objects[I] as TTBCustomToolbar; + TB.Visible := lbToolbars.Checked[I]; + end; +end; + +procedure TSpTBXCustomizeForm.ResetButtonClick(Sender: TObject); +begin + Customizer.Reset; + FillCommands; +end; + +procedure TSpTBXCustomizeForm.checkVisibleClick(Sender: TObject); +var + I: Integer; +begin + I := lbToolbars.ItemIndex; + if I > -1 then begin + lbToolbars.Checked[I] := checkVisible.Checked; + lbToolbarsClickCheck(nil); + end; +end; + +procedure TSpTBXCustomizeForm.cbTextClick(Sender: TObject); +var + I: Integer; + TB: TSpTBXToolbar; +begin + I := lbToolbars.ItemIndex; + if (I > -1) and (cbText.ItemIndex > -1) then + if lbToolbars.Items.Objects[I] is TSpTBXToolbar then begin + TB := lbToolbars.Items.Objects[I] as TSpTBXToolbar; + TB.DisplayMode := TSpTBXToolbarDisplayMode(cbText.ItemIndex); + end; +end; + +procedure TSpTBXCustomizeForm.cbSkinsClick(Sender: TObject); +begin + if cbSkins.ItemIndex > -1 then + SkinManager.SetSkin(cbSkins.Text); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Commands tab } + +procedure TSpTBXCustomizeForm.lbCommandsStartDrag(Sender: TObject; + var DragObject: TDragObject); +var + L: TSpTBXListBox; + I: Integer; + Item: TTBCustomItem; + Sep: TTBSeparatorItem; +begin + L := Sender as TSpTBXListBox; + I := L.ItemIndex; + if I > -1 then begin + if I = 0 then begin + // When dragging the separator item use the first one available, or create one + if FSeparatorList.Count = 0 then begin + Sep := SpCreateUniqueSeparator(False); + Customizer.Items.Add(Sep); + FSeparatorList.AddObject(Sep.Name, Sep); + end; + Item := FSeparatorList.Objects[0] as TTBCustomItem; + // SpOutputDebugString('Start ' + FSeparatorList[0]); + end + else + if (I = 1) and Customizer.BlankSeparators then begin + // When dragging the blank separator item use the first one available, or create one + if FBlankSeparatorList.Count = 0 then begin + Sep := SpCreateUniqueSeparator(True); + Customizer.Items.Add(Sep); + FBlankSeparatorList.AddObject(Sep.Name, Sep); + end; + Item := FBlankSeparatorList.Objects[0] as TTBCustomItem; + end + else + Item := L.Items.Objects[I] as TTBCustomItem; + DragObject := TSpTBXItemDragObject.Create(L, Item); + end; +end; + +procedure TSpTBXCustomizeForm.lbCommandsEndDrag(Sender, + Target: TObject; X, Y: Integer); +var + Accepted: Boolean; + I: Integer; +begin + // When dropping an item on a toolbar we must remove the item from the list + Accepted := Assigned(Target) and (Target <> Sender); + if Accepted then begin + I := lbCommands.ItemIndex; + if I > -1 then + if I = 0 then begin + // SpOutputDebugString('End ' + FSeparatorList[0]); + FSeparatorList.Delete(0); + end + else + if (I = 1) and Customizer.BlankSeparators then + FBlankSeparatorList.Delete(0) + else + lbCommands.Items.Delete(I); + end; +end; + +procedure TSpTBXCustomizeForm.lbCommandsDragOver(Sender, + Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); +begin + Accept := Assigned(Source) and (Source is TSpTBXItemDragObject); +end; + +procedure TSpTBXCustomizeForm.lbCommandsDragDrop(Sender, + Source: TObject; X, Y: Integer); +var + OrigItem: TTBCustomItem; + WS: WideString; +begin + if Assigned(Source) and (Source is TSpTBXItemDragObject) and + (TSpTBXItemDragObject(Source).SourceControl <> Sender) then + begin + OrigItem := TSpTBXItemDragObject(Source).SouceItem; + // Remove the item from its parent + OrigItem.Parent.Remove(OrigItem); + // Add the item to the Customizer.Items property + Customizer.Items.Add(OrigItem); + WS := SpCustomizerGetWideCaption(OrigItem); + // Add the item entry in the commands list + if OrigItem is TTBSeparatorItem then begin + if Customizer.BlankSeparators and TTBSeparatorItem(OrigItem).Blank then + FBlankSeparatorList.InsertObject(0, WS, OrigItem) // Insert the blank separator in the first position + else + FSeparatorList.InsertObject(0, WS, OrigItem) // Insert the separator in the first position + end + else + lbCommands.AddItem(WS, OrigItem); + // SpOutputDebugString('Dropped ' + WS); + end; +end; + +procedure TSpTBXCustomizeForm.lbCommandsDrawItem(Sender: TObject; + ACanvas: TCanvas; var ARect: TRect; Index: Integer; + const State: TOwnerDrawState; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +begin + if PaintStage = pstPrePaint then begin + PaintDefault := False; + if Index = 0 then begin + // Draw the separator + SpDrawXPText(ACanvas, SSpTBXCustomizerFormSeparator, ARect, DT_SINGLELINE or DT_CENTER or DT_VCENTER); + end + else + if (Index = 1) and Customizer.BlankSeparators then begin + // Draw the blank separator + SpDrawXPText(ACanvas, SSpTBXCustomizerFormBlankSeparator, ARect, DT_SINGLELINE or DT_CENTER or DT_VCENTER); + end + else + SpDrawListboxItem(Sender as TSpTBXListBox, Index, ARect, State, False, Customizer.Images); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Shortcuts tab } + +procedure TSpTBXCustomizeForm.lbShortcutsClick(Sender: TObject); +var + Item: TTBCustomItem; +begin + if lbShortcuts.ItemIndex > -1 then begin + Item := lbShortcuts.Items.Objects[lbShortcuts.ItemIndex] as TTBCustomItem; + HotKey1.HotKey := Item.ShortCut; + end; +end; + +procedure TSpTBXCustomizeForm.lbShortcutsDrawItem(Sender: TObject; + ACanvas: TCanvas; var ARect: TRect; Index: Integer; + const State: TOwnerDrawState; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +begin + if PaintStage = pstPrePaint then begin + PaintDefault := False; + SpDrawListboxItem(Sender as TSpTBXListBox, Index, ARect, State, True, Customizer.Images); + end; +end; + +procedure TSpTBXCustomizeForm.ChangeShortcutClick(Sender: TObject); +var + Item, F: TTBCustomItem; + WS, WS2: WideString; + T: TShortCut; + I: Integer; + ChangeShortCut: Boolean; +begin + if lbShortcuts.ItemIndex < 0 then Exit; + T := HotKey1.HotKey; + Item := lbShortcuts.Items.Objects[lbShortcuts.ItemIndex] as TTBCustomItem; + + ChangeShortCut := True; + + if T <> 0 then begin + // Find if the shortcut is already being used + for I := 0 to lbShortcuts.Count - 1 do begin + F := lbShortcuts.Items.Objects[I] as TTBCustomItem; + if F.ShortCut = T then begin + WS := WideFormat(SSpTBXCustomizerFormChangeShortcut, [SpCustomizerGetWideCaption(F), SpCustomizerGetWideCaption(Item)]); + WS2 := SSpTBXCustomizerFormChangeShortcutTitle; + ChangeShortCut := MessageBoxW(Handle, PWideChar(WS), PWideChar(WS2), MB_APPLMODAL+MB_ICONWARNING+MB_OKCANCEL+MB_DEFBUTTON1) = IDOK; + if ChangeShortCut then + if Assigned(F.Action) and (F.Action is TAction) then + TAction(F.Action).ShortCut := 0 + else + F.ShortCut := 0; + + Break; + end; + end; + end; + + if ChangeShortCut then begin + if Assigned(Item.Action) and (Item.Action is TAction) then + TAction(Item.Action).ShortCut := T + else + Item.ShortCut := T; + lbShortcuts.Invalidate; + end; +end; + +end. diff --git a/internal/2.4.4/1/Source/SpTBXDefaultSkins.pas b/internal/2.4.4/1/Source/SpTBXDefaultSkins.pas new file mode 100644 index 0000000..49963e2 --- /dev/null +++ b/internal/2.4.4/1/Source/SpTBXDefaultSkins.pas @@ -0,0 +1,2171 @@ +unit SpTBXDefaultSkins; + +{============================================================================== +Version 2.4.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: +2 December 2009 - version 2.4.4 + - No changes. + +13 September 2009 - version 2.4.3 + - No changes. + +8 May 2009 - version 2.4.2 + - No changes. + +15 March 2009 - version 2.4.1 + - No changes. + +17 January 2009 - version 2.4 + - No changes. + +26 September 2008 - version 2.3 + - No changes. + +29 July 2008 - version 2.2 + - Fixed incorrect TRGBQuadArray declaration, thanks to Arvid + for reporting this. + - Fixed incorrect gradients in Office 2003 skins, thanks to + David for reporting this. + - Fixed Vista painting bug, the menu checkboxes are stretched + by the themes API, this doesn't happen on XP, thanks to + Arvid for reporting this. + +26 June 2008 - version 2.1 + - New skin added: Aluminum, thanks to Pete for his contribution. + +3 May 2008 - version 2.0 + - No changes. + +2 April 2008 - version 1.9.5 + - No changes. + +3 February 2008 - version 1.9.4 + - No changes. + +19 January 2008 - version 1.9.3 + - New skin added: Human. + +26 December 2007 - version 1.9.2 + - No changes. + +1 December 2007 - version 1.9.1 + - No changes. + +20 November 2007 - version 1.9 + - Initial release. + +==============================================================================} + +interface + +{$BOOLEVAL OFF} // Unit depends on short-circuit boolean evaluation + +uses + Windows, Messages, Classes, SysUtils, Graphics, Controls, SpTBXSkins; + +type + { Skins } + + TSpTBXAluminumColors = array[0..3] of TColor; + + TSpTBXAluminumSkin = class(TSpTBXSkinOptions) + private + procedure SetDefaultColorScheme(const Value: TSpTBXLunaScheme); + protected + FColors: TSpTBXAluminumColors; + FDefaultColorScheme: TSpTBXLunaScheme; + FLightMetalColor: TColor; + FDarkMetalColor: TColor; + FRoughness: Integer; + procedure FillColors; virtual; + function GetBrushMetalColor(Component: TSpTBXSkinComponentsType; State: TSpTBXSkinStatesType): TColor; virtual; + public + constructor Create; override; + destructor Destroy; override; + procedure FillOptions; override; + procedure PaintBackground(ACanvas: TCanvas; ARect: TRect; Component: TSpTBXSkinComponentsType; State: TSpTBXSkinStatesType; Background, Borders: Boolean; Vertical: Boolean = False; ForceRectBorders: TAnchors = []); override; + property LightMetalColor: TColor read FLightMetalColor write FLightMetalColor; + property DarkMetalColor: TColor read FDarkMetalColor write FDarkMetalColor; + property DefaultColorScheme: TSpTBXLunaScheme read FDefaultColorScheme write SetDefaultColorScheme default lusUnknown; + end; + + TSpTBXAthenSkin = class(TSpTBXSkinOptions) + public + procedure FillOptions; override; + end; + + TSpTBXDreamSkin = class(TSpTBXSkinOptions) + public + procedure FillOptions; override; + end; + + TSpTBXEosSkin = class(TSpTBXSkinOptions) + public + procedure FillOptions; override; + end; + + TSpTBXHumanSkin = class(TSpTBXSkinOptions) + public + procedure FillOptions; override; + procedure PaintBackground(ACanvas: TCanvas; ARect: TRect; Component: TSpTBXSkinComponentsType; State: TSpTBXSkinStatesType; Background, Borders: Boolean; Vertical: Boolean = False; ForceRectBorders: TAnchors = []); override; + end; + + TSpTBXLeopardSkin = class(TSpTBXSkinOptions) + public + procedure FillOptions; override; + procedure PaintBackground(ACanvas: TCanvas; ARect: TRect; Component: TSpTBXSkinComponentsType; State: TSpTBXSkinStatesType; Background, Borders: Boolean; Vertical: Boolean = False; ForceRectBorders: TAnchors = []); override; + end; + + TSpTBXXitoSkin = class(TSpTBXSkinOptions) + public + procedure FillOptions; override; + end; + + { Office Skins } + + TSpTBXOfficeXPSkin = class(TSpTBXSkinOptions) + public + procedure FillOptions; override; + end; + + TSpTBXOffice2003Colors = array[0..22] of TColor; + + TSpTBXOffice2003Skin = class(TSpTBXSkinOptions) + private + procedure SetDefaultColorScheme(const Value: TSpTBXLunaScheme); + protected + FColors: TSpTBXOffice2003Colors; + FDefaultColorScheme: TSpTBXLunaScheme; + procedure FillColors; virtual; + public + constructor Create; override; + procedure FillOptions; override; + property DefaultColorScheme: TSpTBXLunaScheme read FDefaultColorScheme write SetDefaultColorScheme default lusUnknown; + end; + + TSpTBXOffice2007Colors = array[0..17] of TColor; + + TSpTBXOffice2007Skin = class(TSpTBXSkinOptions) + protected + FColors: TSpTBXOffice2007Colors; + procedure FillColors; virtual; abstract; + public + procedure FillOptions; override; + end; + + TSpTBXOffice2007BlueSkin = class(TSpTBXOffice2007Skin) + protected + procedure FillColors; override; + end; + + TSpTBXOffice2007BlackSkin = class(TSpTBXOffice2007Skin) + protected + procedure FillColors; override; + end; + + TSpTBXOffice2007SilverSkin = class(TSpTBXOffice2007Skin) + protected + procedure FillColors; override; + end; + +implementation + +uses + Math; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Brushed Fill } + +const + THREAD_CACHE_SIZE = 16; + NUM_TEMPLATES = 8; + MIN_TEMPLATE_SIZE = 100; + MAX_TEMPLATE_SIZE = 200; + NUM_RANDTHREADS = 1024; + +type + PRGBQuad = ^TRGBQuad; + TRGBQuad = Integer; + PRGBQuadArray = ^TRGBQuadArray; + TRGBQuadArray = array [Byte] of TRGBQuad; + TThreadCacheItem = record + BaseColor: TColorRef; + Roughness: Integer; + Bitmaps: array [0..NUM_TEMPLATES - 1] of HBITMAP; + end; + +var + ThreadTemplates: array of array of Integer; + RandThreadIndex: array of Integer; + RandThreadPositions: array of Integer; + ThreadCache: array of TThreadCacheItem; + NextCacheEntry: Integer = 0; + +function GetBGR(C: TColorRef): Cardinal; +asm + MOV ECX,EAX // this function swaps R and B bytes in ABGR + SHR EAX,16 + XCHG AL,CL + MOV AH,$FF // and writes $FF into A component } + SHL EAX,16 + MOV AX,CX +end; + +procedure InitializeBrushedFill; +const + Pi = 3.14159265358987; +var + TemplateIndex, Size, I, V, V1, V2: Integer; + T, R12, R13, R14, R21, R22, R23, R24: Single; +begin + + SetLength(ThreadTemplates, NUM_TEMPLATES); + SetLength(RandThreadIndex, NUM_RANDTHREADS); + SetLength(RandThreadPositions, NUM_RANDTHREADS); + + { Make thread templates } + for TemplateIndex := 0 to NUM_TEMPLATES - 1 do begin + Size := (MIN_TEMPLATE_SIZE + Random(MAX_TEMPLATE_SIZE - MIN_TEMPLATE_SIZE + 1)) div 2; + SetLength(ThreadTemplates[TemplateIndex], Size * 2); + R12 := Random * 2 * Pi; + R13 := Random * 2 * Pi; + R14 := Random * 2 * Pi; + R21 := Random * 2 * Pi; + R22 := Random * 2 * Pi; + R23 := Random * 2 * Pi; + R24 := Random * 2 * Pi; + for I := 0 to Size - 1 do begin + T := 2 * Pi * I / Size; + V1 := Round(150 * Sin(T) + 100 * Sin(2 * T + R12) + 50 * Sin(3 * T + R13) + 20 * Sin(4 * T + R14)); + if V1 > 255 then V1 := 255; + if V1 < -255 then V1 := -255; + + V2 := Round(150 * Sin(T + R21) + 100 * Sin(2 * T + R22) + 50 * Sin(3 * T + R23) + 20 * Sin(4 * T + R24)); + if V2 > 255 then V2 := 255; + if V2 < -255 then V2 := -255; + + if Abs(V2 - V1) > 300 then begin + V := (V1 + V2) div 2; + V1 := V - 150; + V2 := V + 150; + end; + + ThreadTemplates[TemplateIndex][I * 2] := Min(V1, V2); + ThreadTemplates[TemplateIndex][I * 2 + 1] := Max(V1, V2); + end; + end; + + { Initialize Rand arrays } + for I := 0 to NUM_RANDTHREADS- 1 do begin + RandThreadIndex[I] := Random(NUM_TEMPLATES); + V1 := Random(Length(ThreadTemplates[RandThreadIndex[I]])) and not $1; + if Odd(I) then Inc(V1); + RandThreadPositions[I] := V1; + end; +end; + +procedure ClearCacheItem(var CacheItem: TThreadCacheItem); +var + I: Integer; +begin + with CacheItem do begin + BaseColor := $FFFFFFFF; + Roughness := -1; + for I := NUM_TEMPLATES- 1 downto 0 do + if Bitmaps[I] <> 0 then begin + DeleteObject(Bitmaps[I]); + Bitmaps[I] := 0; + end; + end; +end; + +procedure ResetBrushedFillCache; +var + I: Integer; +begin + { Should be called each time the screen parameters change } + for I := High(ThreadCache) downto 0 do ClearCacheItem(ThreadCache[I]); +end; + +procedure FinalizeBrushedFill; +begin + ResetBrushedFillCache; + SetLength(ThreadCache, 0); + ThreadCache := nil; + SetLength(RandThreadPositions, 0); + RandThreadPositions := nil; + SetLength(RandThreadIndex, 0); + RandThreadIndex := nil; + SetLength(ThreadTemplates, 0, 0); + ThreadTemplates := nil; +end; + +procedure MakeCacheItem(var CacheItem: TThreadCacheItem; Color: TColorRef; Roughness: Integer); +var + TemplateIndex, Size, I, V: Integer; + CR, CG, CB: Integer; + R, G, B: Integer; + ScreenDC: HDC; + BMI: TBitmapInfo; + Bits: PRGBQuadArray; + DIBSection: HBITMAP; + DIBDC, CacheDC: HDC; +begin + ScreenDC := GetDC(0); + FillChar(BMI, SizeOf(TBitmapInfo), 0); + with BMI.bmiHeader do begin + biSize := SizeOf(TBitmapInfoHeader); + biPlanes := 1; + biCompression := BI_RGB; + biWidth := MAX_TEMPLATE_SIZE; + biHeight := -1; + biBitCount := 32; + end; + DIBSection := CreateDIBSection(0, BMI, DIB_RGB_COLORS, Pointer(Bits), 0, 0); + DIBDC := CreateCompatibleDC(0); + SelectObject(DIBDC, DIBSection); + CacheDC := CreateCompatibleDC(0); + + CR := Color shl 8 and $FF00; + CG := Color and $FF00; + CB := Color shr 8 and $FF00; + try + for TemplateIndex := 0 to NUM_TEMPLATES - 1 do begin + CacheItem.BaseColor := Color; + CacheItem.Roughness := Roughness; + Size := Length(ThreadTemplates[TemplateIndex]); + + if CacheItem.Bitmaps[TemplateIndex] = 0 then + CacheItem.Bitmaps[TemplateIndex] := CreateCompatibleBitmap(ScreenDC, Size, 1); + SelectObject(CacheDC, CacheItem.Bitmaps[TemplateIndex]); + + for I := 0 to Size - 1 do begin + V := ThreadTemplates[TemplateIndex][I]; + R := CR + V * Roughness; + G := CG + V * Roughness; + B := CB + V * Roughness; + if R < 0 then R := 0; + if G < 0 then G := 0; + if B < 0 then B := 0; + if R > $EF00 then R := $EF00; + if G > $EF00 then G := $EF00; + if B > $EF00 then B := $EF00; + Bits^[I] := (R and $FF00 + (G and $FF00) shl 8 + (B and $FF00) shl 16) shr 8; + end; + + BitBlt(CacheDC, 0, 0, Size, 1, DIBDC, 0, 0, SRCCOPY); + end; + finally + DeleteDC(CacheDC); + DeleteDC(DIBDC); + DeleteObject(DIBSection); + ReleaseDC(0, ScreenDC); + end; +end; + +function FindCacheItem(Color: TColorRef; Roughness: Integer): Integer; +begin + Result := High(ThreadCache); + while Result >= 0 do + if (ThreadCache[Result].BaseColor = Color) and (ThreadCache[Result].Roughness = Roughness) then + Exit + else + Dec(Result); +end; + +function GetCacheItem(Color: TColorRef; Roughness: Integer): Integer; +begin + Result := FindCacheItem(Color, Roughness); + if Result >= 0 then + Exit + else begin + Result := NextCacheEntry; + if Result > High(ThreadCache) then begin + SetLength(ThreadCache, Result+ 1); + ClearCacheItem(ThreadCache[Result]); + end; + MakeCacheItem(ThreadCache[Result], Color, Roughness); + NextCacheEntry := (NextCacheEntry + 1) mod THREAD_CACHE_SIZE; + end; +end; + +procedure BrushedFill(DC: HDC; Origin: PPoint; ARect: TRect; Color: TColor; Roughness: Integer); +const + ZeroOrigin: TPoint = (X: 0; Y: 0); +var + CR: TColorRef; + X, Y: Integer; + CacheIndex: Integer; + TemplateIndex: Integer; + CacheDC: HDC; + Size: Integer; + BoxR: TRect; +begin + if (Color = clNone) or not RectVisible(DC, ARect) then Exit; + CR := GetBGR(ColorToRGB(Color)); + if Origin = nil then Origin := @ZeroOrigin; + if ThreadTemplates = nil then InitializeBrushedFill; + CacheIndex := GetCacheItem(CR, Roughness); + GetClipBox(DC, BoxR); + IntersectRect(ARect, ARect, BoxR); + SaveDC(DC); + IntersectClipRect(DC, ARect.Left, ARect.Top, ARect.Right, ARect.Bottom); + + CacheDC := CreateCompatibleDC(0); + for Y := ARect.Top to ARect.Bottom - 1 do begin + TemplateIndex := RandThreadIndex[(65536 + Y - Origin.Y) mod NUM_RANDTHREADS]; + Size := Length(ThreadTemplates[TemplateIndex]); + X := -RandThreadPositions[(65536 + Y - Origin.Y) mod NUM_RANDTHREADS] + Origin.X; + SelectObject(CacheDC, ThreadCache[CacheIndex].Bitmaps[TemplateIndex]); + while X < ARect.Right do begin + if X + Size >= ARect.Left then BitBlt(DC, X, Y, Size, 1, CacheDC, 0, 0, SRCCOPY); + Inc(X, Size); + end; + end; + DeleteDC(CacheDC); + RestoreDC(DC, -1); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXAluminumSkin } + +constructor TSpTBXAluminumSkin.Create; +begin + FRoughness := 12; + FDefaultColorScheme := lusUnknown; + inherited; +end; + +destructor TSpTBXAluminumSkin.Destroy; +begin + FinalizeBrushedFill; + inherited; +end; + +procedure TSpTBXAluminumSkin.FillColors; +const + AluminumColors: array[lusBlue..lusGreen] of TSpTBXAluminumColors = ( + ($C56A31, // 0: Item borders + $E0D7D1, // 1: Item Checked + $E2B598, // 2: Item Pushed + $EED2C1), // 3: Item HotTrack + + ($BFB4B2, // 0: Item borders + $DDDCDC, // 1: Item Checked + $DFDAD9, // 2: Item Pushed + $ECE9E8), // 3: Item HotTrack + + ($70A093, // 0: Item borders + $D8DCDB, // 1: Item Checked + $B8D0C9, // 2: Item Pushed + $D4E3DF) // 3: Item HotTrack + ); +var + Luna: TSpTBXLunaScheme; +begin + if FDefaultColorScheme <> lusUnknown then + Luna := FDefaultColorScheme + else begin + Luna := SpGetLunaScheme; + if Luna = lusUnknown then Luna := lusMetallic; + end; + + FColors := AluminumColors[Luna]; + FRoughness := 12; + FLightMetalColor := $C7C7C7; + FDarkMetalColor := $DFDFDF; +end; + +procedure TSpTBXAluminumSkin.FillOptions; +begin + SkinName := 'Aluminum'; + + //---- Colors ----// + + FillColors; + + //---- Single State ----// + Options(skncDock, sknsNormal).Body.Fill(0, clWhite, clNone, clNone, clNone); // Dummy, uses BrushedFill + + Options(skncDockablePanel, sknsNormal).Body.Fill(0, $F9F9F9, clNone, clNone, clNone); + Options(skncDockablePanel, sknsNormal).Borders.Fill(0, $C7C7C7, $C7C7C7, clWhite, clWhite); + + Options(skncDockablePanelTitleBar, sknsNormal).Body.Fill(1, clWhite, $D8D8D8, clNone, clNone); + Options(skncDockablePanelTitleBar, sknsNormal).Borders.Fill(0, clWhite, $9F9F9F, clNone, clNone); + + Options(skncPanel, sknsNormal).Body.Fill(0, clWhite, clNone, clNone, clNone); // Dummy, uses BrushedFill + Options(skncPanel, sknsNormal).Borders.Fill(2, FColors[0], FColors[0], clWhite, clWhite); + + Options(skncPopup, sknsNormal).Body.Fill(0, $F9F9F9, clNone, clNone, clNone); + Options(skncPopup, sknsNormal).Borders.Fill(0, $7F7F7F, $7F7F7F, clNone, clNone); + + Options(skncStatusBar, sknsNormal).Body.Fill(0, clWhite, clNone, clNone, clNone); // Dummy, uses BrushedFill + + Options(skncSplitter, sknsNormal).Body.Fill(0, clWhite, clNone, clNone, clNone); // Dummy, uses BrushedFill + + Options(skncToolbar, sknsNormal).Body.Fill(0, clWhite, clNone, clNone, clNone); // Dummy, uses BrushedFill + Options(skncToolbar, sknsNormal).Borders.Fill(2, clWhite, $7F7F7F, clNone, clNone); + + CopyOptions(skncToolbar, skncMenuBar); // Dummy, uses BrushedFill + + Options(skncWindow, sknsNormal).Borders.Fill(0, $808080, $808080, $C0C0C0, $DDD9D2); + + Options(skncWindowTitleBar, sknsNormal).Body.Fill(1, clWhite, $D8D8D8, clNone, clNone); + + //---- Elements ----// + Options(skncToolbarGrip, sknsNormal).Body.Fill(0, $B0B0B0, clWhite, clNone, clNone); + + Options(skncStatusBarGrip, sknsNormal).Body.Fill(0, $B0B0B0, clWhite, clNone, clNone); + + Options(skncSeparator, sknsNormal).Body.Fill(0, $9F9F9F, clWhite, clNone, clNone); + + //---- Buttons ----// + Options(skncToolbarItem, sknsHotTrack).Body.Fill(0, FColors[3], clNone, clNone, clNone); + Options(skncToolbarItem, sknsHotTrack).Borders.Fill(1, FColors[0], FColors[0], clNone, clNone); + Options(skncToolbarItem, sknsPushed).Body.Fill(0, FColors[2], clNone, clNone, clNone); + Options(skncToolbarItem, sknsPushed).Borders.Fill(1, FColors[0], FColors[0], clNone, clNone); + Options(skncToolbarItem, sknsChecked).Body.Fill(0, FColors[1], clNone, clNone, clNone); + Options(skncToolbarItem, sknsChecked).Borders.Fill(1, FColors[0], FColors[0], clNone, clNone); + Options(skncToolbarItem, sknsCheckedAndHotTrack).Body.Fill(0, FColors[2], clNone, clNone, clNone); + Options(skncToolbarItem, sknsCheckedAndHotTrack).Borders.Fill(1, FColors[0], FColors[0], clNone, clNone); + + Options(skncOpenToolbarItem, sknsNormal).Body.Fill(0, $ECECEC, clNone, clNone, clNone); + Options(skncOpenToolbarItem, sknsNormal).Borders.Fill(0, $7F7F7F, $7F7F7F, clNone, clNone); + + CopyOptions(skncToolbarItem, skncMenuBarItem); + + CopyOptions(skncToolbarItem, skncMenuItem); + + Options(skncButton, sknsNormal).Body.Fill(1, $EFEFEF, $D1D1D1, clNone, clNone); + Options(skncButton, sknsNormal).Borders.Fill(1, $9F9F9F, $9F9F9F, $F7F7F7, $C7C7C7); + Options(skncButton, sknsDisabled).Body.Fill(1, $EFEFEF, $D1D1D1, clNone, clNone); + Options(skncButton, sknsDisabled).Borders.Fill(1, $9F9F9F, $9F9F9F, $F7F7F7, $C7C7C7); + Options(skncButton, sknsHotTrack).Body.Fill(1, $F2F2F2, $DDDDDD, clNone, clNone); + Options(skncButton, sknsHotTrack).Borders.Fill(1, $BABABA, $BABABA, $F8F8F8, $D6D6D6); + Options(skncButton, sknsPushed).Body.Fill(1, $D1D1D1, $EFEFEF, clNone, clNone); + Options(skncButton, sknsPushed).Borders.Fill(1, $9F9F9F, $9F9F9F, $C7C7C7, $F7F7F7); + Options(skncButton, sknsChecked).Body.Fill(1, $D1D1D1, $EFEFEF, clNone, clNone); + Options(skncButton, sknsChecked).Borders.Fill(1, $9F9F9F, $9F9F9F, $C7C7C7, $F7F7F7); + Options(skncButton, sknsCheckedAndHotTrack).Body.Fill(1, $D1D1D1, $EFEFEF, clNone, clNone); + Options(skncButton, sknsCheckedAndHotTrack).Borders.Fill(1, $9F9F9F, $9F9F9F, $C7C7C7, $F7F7F7); + + Options(skncListItem, sknsChecked).Assign(Options(skncToolbarItem, sknsHotTrack)); + Options(skncListItem, sknsHotTrack).Assign(Options(skncToolbarItem, sknsHotTrack)); + Options(skncListItem, sknsCheckedAndHotTrack).Assign(Options(skncToolbarItem, sknsHotTrack)); + Options(skncListItem, sknsHotTrack).Body.Lighten(20); + Options(skncListItem, sknsHotTrack).Borders.Lighten(20); + Options(skncListItem, sknsCheckedAndHotTrack).Body.Lighten(-20); + Options(skncListItem, sknsCheckedAndHotTrack).Borders.Lighten(-20); + + 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); + + Options(skncListItem, sknsChecked).Assign(Options(skncToolbarItem, sknsHotTrack)); + Options(skncListItem, sknsHotTrack).Assign(Options(skncToolbarItem, sknsHotTrack)); + Options(skncListItem, sknsCheckedAndHotTrack).Assign(Options(skncToolbarItem, sknsHotTrack)); + Options(skncListItem, sknsHotTrack).Body.Lighten(30); + Options(skncListItem, sknsHotTrack).Borders.Lighten(30); + Options(skncListItem, sknsCheckedAndHotTrack).Body.Lighten(-30); + Options(skncListItem, sknsCheckedAndHotTrack).Borders.Lighten(-30); + + 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); + + Options(skncListItem, sknsChecked).Assign(Options(skncToolbarItem, sknsHotTrack)); + Options(skncListItem, sknsHotTrack).Assign(Options(skncToolbarItem, sknsHotTrack)); + Options(skncListItem, sknsCheckedAndHotTrack).Assign(Options(skncToolbarItem, sknsHotTrack)); + Options(skncListItem, sknsHotTrack).Body.Lighten(20); + Options(skncListItem, sknsHotTrack).Borders.Lighten(20); + Options(skncListItem, sknsCheckedAndHotTrack).Body.Lighten(-20); + Options(skncListItem, sknsCheckedAndHotTrack).Borders.Lighten(-20); + + 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; + + Options(skncListItem, sknsChecked).Assign(Options(skncToolbarItem, sknsHotTrack)); + Options(skncListItem, sknsHotTrack).Assign(Options(skncToolbarItem, sknsHotTrack)); + Options(skncListItem, sknsCheckedAndHotTrack).Assign(Options(skncToolbarItem, sknsHotTrack)); + Options(skncListItem, sknsHotTrack).Body.Lighten(30); + Options(skncListItem, sknsHotTrack).Borders.Lighten(30); + Options(skncListItem, sknsCheckedAndHotTrack).Body.Lighten(-30); + Options(skncListItem, sknsCheckedAndHotTrack).Borders.Lighten(-30); + + 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); + + Options(skncListItem, sknsChecked).Assign(Options(skncMenuBarItem, sknsHotTrack)); + Options(skncListItem, sknsHotTrack).Assign(Options(skncMenuBarItem, sknsHotTrack)); + Options(skncListItem, sknsCheckedAndHotTrack).Assign(Options(skncMenuBarItem, sknsHotTrack)); + Options(skncListItem, sknsHotTrack).Body.Lighten(20); + Options(skncListItem, sknsHotTrack).Borders.Lighten(20); + Options(skncListItem, sknsCheckedAndHotTrack).Body.Lighten(-20); + Options(skncListItem, sknsCheckedAndHotTrack).Borders.Lighten(-20); + + 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); + + Options(skncListItem, sknsChecked).Assign(Options(skncButton, sknsHotTrack)); + Options(skncListItem, sknsHotTrack).Assign(Options(skncButton, sknsHotTrack)); + Options(skncListItem, sknsCheckedAndHotTrack).Assign(Options(skncButton, sknsHotTrack)); + Options(skncListItem, sknsHotTrack).Body.Lighten(30); + Options(skncListItem, sknsHotTrack).Borders.Lighten(30); + Options(skncListItem, sknsCheckedAndHotTrack).Body.Lighten(-20); + Options(skncListItem, sknsCheckedAndHotTrack).Borders.Lighten(-20); + + 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); + + Options(skncListItem, sknsChecked).Assign(Options(skncButton, sknsHotTrack)); + Options(skncListItem, sknsHotTrack).Assign(Options(skncButton, sknsHotTrack)); + Options(skncListItem, sknsCheckedAndHotTrack).Assign(Options(skncButton, sknsHotTrack)); + Options(skncListItem, sknsHotTrack).Body.Lighten(20); + Options(skncListItem, sknsHotTrack).Borders.Lighten(20); + Options(skncListItem, sknsCheckedAndHotTrack).Body.Lighten(-20); + Options(skncListItem, sknsCheckedAndHotTrack).Borders.Lighten(-20); + + 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; + OfficeMenu := 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); + + Options(skncListItem, sknsChecked).Assign(Options(skncToolbarItem, sknsHotTrack)); + Options(skncListItem, sknsHotTrack).Assign(Options(skncToolbarItem, sknsHotTrack)); + Options(skncListItem, sknsCheckedAndHotTrack).Assign(Options(skncToolbarItem, sknsHotTrack)); + Options(skncListItem, sknsHotTrack).Body.Lighten(20); + Options(skncListItem, sknsHotTrack).Borders.Lighten(20); + Options(skncListItem, sknsCheckedAndHotTrack).Body.Lighten(-20); + Options(skncListItem, sknsCheckedAndHotTrack).Borders.Lighten(-20); + + 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'; + OfficeMenu := 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]); + + Options(skncListItem, sknsChecked).Assign(Options(skncToolbarItem, sknsHotTrack)); + Options(skncListItem, sknsHotTrack).Assign(Options(skncToolbarItem, sknsHotTrack)); + Options(skncListItem, sknsCheckedAndHotTrack).Assign(Options(skncToolbarItem, sknsHotTrack)); + Options(skncListItem, sknsHotTrack).Body.Lighten(20); + Options(skncListItem, sknsHotTrack).Borders.Lighten(20); + Options(skncListItem, sknsCheckedAndHotTrack).Body.Lighten(-20); + Options(skncListItem, sknsCheckedAndHotTrack).Borders.Lighten(-20); + + 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'; + OfficeMenu := True; + + //---- Colors ----// + + FillColors; + + //---- Single State ----// + Options(skncDock, sknsNormal).Body.Fill(7, FColors[0], FColors[1], FColors[2], FColors[3]); + + Options(skncDockablePanel, sknsNormal).Body.Fill(1, FColors[13], FColors[14], clNone, clNone); + Options(skncDockablePanel, sknsNormal).Borders.Fill(0, FColors[11], FColors[11], FColors[12], FColors[12]); + + Options(skncPanel, sknsNormal).Body.Fill(1, FColors[13], FColors[14], clNone, clNone); + Options(skncPanel, sknsNormal).Borders.Fill(1, FColors[11], FColors[11], FColors[12], FColors[12]); + + Options(skncPopup, sknsNormal).Body.Fill(0, clWhite, clNone, clNone, clNone); + Options(skncPopup, sknsNormal).Borders.Fill(0, $C0C0C0, $C0C0C0, clNone, clNone); + + Options(skncStatusBar, sknsNormal).Body.Fill(7, FColors[7], FColors[8], FColors[9], FColors[10]); + Options(skncStatusBar, sknsNormal).TextColor := FColors[6]; // This overrides the Items text color + + CopyOptions(skncStatusBar, skncDockablePanelTitleBar); + + CopyOptions(skncDock, skncSplitter); + + Options(skncWindow, sknsNormal).Body.Fill(1, FColors[13], FColors[14], clNone, clNone); + Options(skncWindow, sknsNormal).Borders.Fill(0, FColors[15], FColors[16], FColors[17], FColors[16]); + + CopyOptions(skncStatusBar, skncWindowTitleBar); + + //---- Elements ----// + Options(skncGutter, sknsNormal).Body.Fill(0, $EEEEE9, clNone, clNone, clNone); + Options(skncGutter, sknsNormal).Borders.Fill(0, $C5C5C5, clNone, clNone, clNone); + + Options(skncToolbarGrip, sknsNormal).Body.Fill(0, FColors[4], FColors[5], clNone, clNone); + + Options(skncStatusBarGrip, sknsNormal).Body.Fill(0, FColors[4], FColors[5], clNone, clNone); + + Options(skncSeparator, sknsNormal).Body.Fill(0, FColors[4], FColors[5], clNone, clNone); + + //---- Buttons ----// + Options(skncToolbarItem, sknsHotTrack).Body.Fill(7, $DBFDFF, $95E7FF, $4CD7FF, $96E7FF); + Options(skncToolbarItem, sknsHotTrack).Borders.Fill(1, $9BCFDD, $9BCFDD, $D2FBFF, $B3FAFF); + Options(skncToolbarItem, sknsPushed).Body.Fill(7, $70BAFC, $59A5F3, $388FEF, $64CDFD); + Options(skncToolbarItem, sknsPushed).Borders.Fill(1, $65818E, $AEBDC3, $66C1FA, $66C1FA); + Options(skncToolbarItem, sknsChecked).Body.Fill(7, $A8D6FE, $61AFFC, $329BFB, $ACF0FF); + Options(skncToolbarItem, sknsChecked).Borders.Fill(1, $65818E, $AEBDC3, $66C1FA, $66C1FA); + Options(skncToolbarItem, sknsCheckedAndHotTrack).Body.Fill(7, $70BAFC, $59A5F3, $388FEF, $64CDFD); + Options(skncToolbarItem, sknsCheckedAndHotTrack).Borders.Fill(1, $65818E, $AEBDC3, $66C1FA, $66C1FA); + + CopyOptions(skncToolbarItem, skncMenuBarItem); + + CopyOptions(skncToolbarItem, skncMenuItem); + + CopyOptions(skncToolbarItem, skncButton); + Options(skncButton, sknsNormal).Body.Fill(1, FColors[13], FColors[14], clNone, clNone); + Options(skncButton, sknsNormal).Borders.Fill(1, FColors[11], FColors[11], FColors[12], FColors[12]); + Options(skncButton, sknsDisabled).Body.Fill(1, FColors[13], FColors[14], clNone, clNone); + Options(skncButton, sknsDisabled).Borders.Fill(1, FColors[11], FColors[11], FColors[12], FColors[12]); + + Options(skncListItem, sknsChecked).Assign(Options(skncToolbarItem, sknsHotTrack)); + Options(skncListItem, sknsHotTrack).Assign(Options(skncToolbarItem, sknsHotTrack)); + Options(skncListItem, sknsCheckedAndHotTrack).Assign(Options(skncToolbarItem, sknsHotTrack)); + Options(skncListItem, sknsHotTrack).Body.Lighten(10); + Options(skncListItem, sknsHotTrack).Borders.Lighten(10); + Options(skncListItem, sknsCheckedAndHotTrack).Body.Lighten(-10); + Options(skncListItem, sknsCheckedAndHotTrack).Borders.Lighten(-10); + + 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/internal/2.4.4/1/Source/SpTBXDkPanels.pas b/internal/2.4.4/1/Source/SpTBXDkPanels.pas new file mode 100644 index 0000000..24ad5b5 --- /dev/null +++ b/internal/2.4.4/1/Source/SpTBXDkPanels.pas @@ -0,0 +1,3669 @@ +unit SpTBXDkPanels; + +{============================================================================== +Version 2.4.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 TSpTBXSplitter on the Form. + +History: +2 December 2009 - version 2.4.4 + - No changes. + +13 September 2009 - version 2.4.3 + - Added OnCanResize event to TSpTBXDockablePanel. + - Changed TSpTBXDockablePanel docking behavior, when the + panel is docked and it's DockPos isn't specified it + will be appended to the bottom of the MultiDock. + - Fixed incorrect TSpTBXDockablePanel split resizing when + FixedDockedSize was true, thanks to Gilles Arcas for + reporting this. + +8 May 2009 - version 2.4.2 + - Fixed incorrect TSpTBXDockablePanel floating border + painting on Vista with Aero enabled, thanks to Mattias + Andersson for reporting this. + +15 March 2009 - version 2.4.1 + - Fixed TSpTBXSplitter bug, it wasn't correctly minimized + when MinSize was 1, 2 or 3, thanks to Sertac Akyuz for + fixing this. + - Fixed TSpTBXSplitter bug, it wasn't correctly restored + when SpTBIniLoadPositions was called. + - Fixed incorrect TSpTBXDockablePanel behavior, when DockMode + is dmCannotFloat the DP should be able to be re-docked, + thanks to Ivan Petrovic for reporting this. + - Fixed incorrect TSpTBXDockablePanel behavior, it wasn't + correctly resized when using the embedded splitter, thanks + to Gilles Arcas for reporting this. + - Fixed incorrect TSpTBXDockablePanel painting, + OnDrawCaptionPanel wasn't called when painting the NC + area borders, thanks to Mikael Stalvik for reporting this. + +17 January 2009 - version 2.4 + - Added FloatingClientWidth and FloatingClientHeight public + properties to TSpTBXDockablePanel. + - Added TaskPaneStyleResize property to TSpTBXDockablePanel, + when this property is set to True the Minimize/Restore + behavior will be the same as the Windows Task Pane (the + DockablePanel is minimized from bottom to top). + - Changed TSpTBXDockablePanel undocking behavior the panel + will remember the previous floating size when it is + undocked. + - Changed TSpTBXDockablePanel docking behavior, when the + panel is docked on an empty MultiDock it will use the + DefaultDockedSize property to set its size. + If DefaultDockedSize is 0 it will use the floating size. + +26 September 2008 - version 2.3 + - Added DefaultDockedSize property to TSpTBXDockablePanel, + this property is used to set the DockablePanel size when + it's docked on an empty MultiDock. + - Added ShowVerticalCaption property to TSpTBXDockablePanel, + this property is used to rotate the caption panel vertically. + When the DockablePanel is floating or docked on a vertical + MultiDock the caption will be horizontal regardless of the + value of ShowVerticalCaption. + - Fixed TSpTBXDockablePanel bug, anchored children were not + correctly resized when the Form was loaded, thanks to + Alex Neznanov for reporting this. + - Fixed TSpTBXDockablePanel bug, hiding/restoring a DP + misaligned the adjacent splitter, thanks to Alexander for + reporting this (related to Delphi's zero size align bug). + - Fixed TSpTBXDockablePanel bug, dragging a floating DP + with CTRL key pressed should not dock the DP. + +29 July 2008 - version 2.2 + - Fixed TSpTBXDockablePanel bug, an AV was raised when the + DockablePanel was undocked when it was minimized by an + adjacent splitter, thanks to Minoru Yoshida for reporting this. + +26 June 2008 - version 2.1 + - Added AutoSplitterVisibility property to TSpTBXMultiDock, + use this property to automatically hide the adjacent + splitter when the MultiDock is empty. + - Added OnWindowStateChanged event to TSpTBXDockablePanel, + this event is fired when the DockablePanel gets minimized, + maximized or restored. + - Fixed TSpTBXDockablePanel bug, the floating panel was able to be + dragged offscreen leaving no way to move it back, thanks to + Minoru Yoshida for reporting this. + - Fixed TSpTBXSplitter bug, incorrect alignment when the split + control was minimized and the Form was resized, thanks to + Den and Minoru Yoshida for reporting this. + +3 May 2008 - version 2.0 + - Decoupled from TBX. + +==============================================================================} + +interface + +{$BOOLEVAL OFF} // Unit depends on short-circuit boolean evaluation + +uses + Windows, Messages, Classes, SysUtils, Controls, Graphics, ImgList, Forms, + Menus, StdCtrls, ExtCtrls, ActnList, IniFiles, + TB2Item, TB2Dock, TB2Toolbar, + SpTBXSkins, SpTBXItem, SpTBXControls; + +type + TSpTBXCustomDockablePanel = class; + TSpTBXCustomSplitter = class; + + TSpTBXDockStateRec = record + DockedState: TWindowState; + RestoreSize: Integer; + end; + + TSpTBXDockPosition = ( + dpxLeft, // dpLeft + dpxTop, // dpTop + dpxRight, // dpRight + dpxBottom, // dpBottom + dpxClient // dpRight + ); + + TSpTBXDPResizeType = ( + dprtManualResize, + dprtMinimizeOrRestore, + dprtMinimizeOrRestoreTaskPaneStyle, + dprtSplitResize, + dprtAppendResize + ); + + TSpTBXWindowStateChangedEvent = procedure(Sender: TObject; AWindowState: TWindowState) of object; + + { TSpTBXMultiDock } + + TSpTBXCustomMultiDock = class(TTBDock) + private + FAutoSplitterVisibility: Boolean; + FLimitToOneRow: Boolean; + FLastSplitter: TSpTBXCustomSplitter; + FPosition: TSpTBXDockPosition; + FReadingPositionData: Boolean; + 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; + property ReadingPositionData: Boolean read FReadingPositionData; + 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; + procedure UpdateDockablePanelsDockPos; + property UpdatingLateralSize: Boolean read FUpdatingLateralSize; + published + // Republish LimitToOneRow, the inherited LimitToOneRow should always be True + property LimitToOneRow: Boolean read FLimitToOneRow write SetLimitToOneRow default True; + property Position: TSpTBXDockPosition read FPosition write SetPosition default dpxLeft; + property AutoSplitterVisibility: Boolean read FAutoSplitterVisibility write FAutoSplitterVisibility default True; + // Republish OnInsertRemoveBar, use the inherited OnRequestDock to show/hide the Splitter + property OnInsertRemoveBar: TTBInsertRemoveEvent read FOnInsertRemoveBar write FOnInsertRemoveBar; + // Republish OnRequestDock, use the inherited OnRequestDock to deny non DPs + property OnRequestDock: TTBRequestDockEvent read FOnRequestDock write FOnRequestDock; + end; + + TSpTBXMultiDock = class(TSpTBXCustomMultiDock); + + { TSpTBXDockablePanelButtonOptions } + + TSpTBXDockablePanelButtonOptions = class(TSpTBXButtonOptions) + private + FTaskPaneStyleResize: Boolean; + protected + FDockablePanel: TSpTBXCustomDockablePanel; + procedure ButtonsClick(Sender: TObject); override; + procedure CreateButtons; override; + function Restoring(B: TSpTBXCustomItem): Boolean; override; + procedure SetupButton(B: TSpTBXCustomItem); override; + public + constructor Create(AParent: TWinControl); override; + published + property Maximize default False; + property Minimize default False; + property TaskPaneStyleResize: Boolean read FTaskPaneStyleResize write FTaskPaneStyleResize default False; + property TitleBarMaxSize default 19; + end; + + { TSpTBXDockablePanelToolbar } + + TSpTBXDockablePanelToolbar = class(TSpTBXToolbar) + protected + function CanItemClick(Item: TTBCustomItem; Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer): Boolean; override; + function GetItemsTextColor(State: TSpTBXSkinStatesType): TColor; override; + function GetRightAlignMargin: Integer; override; + public + constructor Create(AOwner: TComponent); override; + function GetParentDockablePanel: TSpTBXCustomDockablePanel; + end; + + { TSpTBXDockablePanel } + + TSpTBXCustomDockablePanel = class(TSpTBXCustomToolWindow, ITBItems) + private + FDefaultDockedSize: Integer; + FFixedDockedSize: Boolean; + FFloatingClientHeight: Integer; + FFloatingClientWidth: Integer; + FIsDockedMoving: Boolean; + FIsManualSizing: Boolean; + FLoadedBarSize: TSize; + FLoadedDockPos: Integer; + FLoadedState: TWindowState; + FOptions: TSpTBXDockablePanelButtonOptions; + FShowCaption: Boolean; + FShowCaptionWhenDocked: Boolean; + FShowVerticalCaption: Boolean; + FOnDrawCaptionPanel: TSpTBXDrawEvent; + FOnWindowStateChanged: TSpTBXWindowStateChangedEvent; + function CanSplitResize(EdgePosition: TTBDockPosition): Boolean; + procedure DockRequestDock(Sender: TObject; Bar: TTBCustomDockableWindow; var Accept: Boolean); + procedure DockResize(Sender: TObject); + function InternalMaximize(Restore: Boolean): Boolean; + procedure UpdateTitleBarRotation; + function GetCaptionPanelSize: TPoint; + function GetEffectiveHeight: Integer; + function GetEffectiveWidth: Integer; + function GetFloatingClientHeight: Integer; + function GetFloatingClientWidth: Integer; + function GetImages: TCustomImageList; + function GetItems: TTBCustomItem; // For ITBItems interface + function GetRootItems: TTBRootItem; + function GetToolbar: TSpTBXToolbar; + function GetView: TTBToolbarView; + procedure SetDefaultDockedSize(Value: Integer); + procedure SetEffectiveHeight(const Value: Integer); + procedure SetEffectiveWidth(const Value: Integer); + procedure SetFloatingClientHeight(const Value: Integer); + procedure SetFloatingClientWidth(const Value: Integer); + procedure SetImages(const Value: TCustomImageList); + procedure SetShowCaption(const Value: Boolean); + procedure SetShowCaptionWhenDocked(const Value: Boolean); + procedure SetShowVerticalCaption(const Value: Boolean); + procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED; + procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE; + procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST; + procedure WMNCLButtonDown(var Message: TWMNCLButtonDown); message WM_NCLBUTTONDOWN; + procedure WMSetCursor(var Message: TWMSetCursor); message WM_SETCURSOR; + protected + FPanel: TPanel; + FToolbarDock: TSpTBXDock; + FToolbar: TSpTBXDockablePanelToolbar; + FState: TSpTBXDockStateRec; + FDockForms: TList; + + // Component + procedure CreateParams(var Params: TCreateParams); override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure Loaded; override; + procedure SetParent(AParent: TWinControl); override; + procedure ValidateContainer(AComponent: TComponent); override; + + // Sizing + procedure BeginDockedMoving; + procedure BeginSplitResizing(HitTest: Integer); + procedure ConstrainedResize(var MinWidth, MinHeight, MaxWidth, MaxHeight: Integer); override; + procedure DoWindowStateChanged(AWindowState: TWindowState); virtual; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; + procedure Resize; override; + + // Painting + procedure DoDrawCaptionPanel(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + procedure DockDrawBackground(Sender: TObject; ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + procedure ToolbarDrawBackground(Sender: TObject; ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + procedure InternalDrawBackground(ACanvas: TCanvas; ARect: TRect; PaintOnNCArea: Boolean; PaintBorders: Boolean = True); override; + + property DefaultDockedSize: Integer read FDefaultDockedSize write SetDefaultDockedSize default 0; + property FixedDockedSize: Boolean read FFixedDockedSize write FFixedDockedSize default False; + property Images: TCustomImageList read GetImages write SetImages; + property Items: TTBRootItem read GetRootItems; + property Options: TSpTBXDockablePanelButtonOptions read FOptions write FOptions; + property ShowCaption: Boolean read FShowCaption write SetShowCaption default True; + property ShowCaptionWhenDocked: Boolean read FShowCaptionWhenDocked write SetShowCaptionWhenDocked default True; + property ShowVerticalCaption: Boolean read FShowVerticalCaption write SetShowVerticalCaption default False; + property OnDrawCaptionPanel: TSpTBXDrawEvent read FOnDrawCaptionPanel write FOnDrawCaptionPanel; + property OnWindowStateChanged: TSpTBXWindowStateChangedEvent read FOnWindowStateChanged write FOnWindowStateChanged; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + + procedure AddDockForm(const Form: TTBCustomForm); + procedure RemoveDockForm(const Form: TTBCustomForm); + procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override; // For ITBItems interface + procedure DoneReadingPositionData(const Data: TTBReadPositionData); override; + procedure ReadPositionData(const Data: TTBReadPositionData); override; + procedure WritePositionData(const Data: TTBWritePositionData); override; + procedure InvalidateBackground(InvalidateChildren: Boolean = True); override; + function IsResizable: Boolean; + 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 OnCanResize; + property OnClose; + property OnCloseQuery; + property OnContextPopup; + property OnDragDrop; + property OnDragOver; + property OnDockChanged; + property OnDockChanging; + property OnDockChangingHidden; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnMove; + property OnRecreated; + property OnRecreating; + property OnResize; + property OnVisibleChanged; + // TSpTBXCustomDockablePanel properties + property DefaultDockedSize; + property FixedDockedSize; + property Images; + property Items; + property Options; + property ShowCaption; + property ShowCaptionWhenDocked; + property ShowVerticalCaption; + property OnDrawCaptionPanel; + property OnWindowStateChanged; + end; + + { TSpTBXSplitter } + + TSpTBXCustomSplitter = class(TCustomControl) + private + FAutoCalcMaxSize: Boolean; + FGripSize: Integer; + FGripHotTrack: Boolean; + FMouseSplitControl: TControl; + FMouseActiveControl: TWinControl; + FMouseBrush: TBrush; + FMouseDownPos: TPoint; + FMousePrevSplitControlSize: Integer; + FMouseDownOnGrip: Boolean; + FMouseOverGrip: Boolean; + FMouseLineDC: HDC; + FMouseLineVisible: Boolean; + FMousePrevBrush: HBrush; + FMoving: Boolean; + FMinSize: Integer; + FMaxSize: Integer; + FNewSize: Integer; + FOldSize: Integer; + FOldKeyDown: TKeyEvent; + FResizeStyle: TResizeStyle; + FSkinType: TSpTBXSkinType; + FSplitLinePaintingPos: Integer; + FOnDrawBackground: TSpTBXDrawEvent; + FOnMoving: TSpTBXCanResizeEvent; + FOnMoved: TNotifyEvent; + function GetGripRect: TRect; + function GetMinimized: Boolean; + procedure SetGripSize(const Value: Integer); + procedure SetMinSize(const Value: integer); + procedure SetSkinType(const Value: TSpTBXSkinType); + procedure UpdateControlSize(SplitControl: TControl); + procedure MouseCalcSplitSize(X, Y: Integer; var NewSize, Split: Integer); + procedure MouseAllocateLineDC; + procedure MouseReleaseLineDC; + procedure MouseDrawLine; + procedure MouseFocusKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); + function ValidateSplitControl: TControl; + procedure CMMouseleave(var Message: TMessage); message CM_MOUSELEAVE; + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBKGND; + protected + FRestorePos: Integer; + procedure DoDrawBackground(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + procedure DoMoved; virtual; + function DoMoving(var NewSize: Integer): Boolean; virtual; + function IsVertical: Boolean; + procedure MouseStopSizing; dynamic; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; + procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; + procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; + procedure Paint; override; + procedure RequestAlign; override; + property AutoCalcMaxSize: Boolean read FAutoCalcMaxSize write FAutoCalcMaxSize default True; + property GripSize: Integer read FGripSize write SetGripSize default 50; + property GripHotTrack: Boolean read FGripHotTrack write FGripHotTrack default True; + property MinSize: Integer read FMinSize write SetMinSize default 0; + property ResizeStyle: TResizeStyle read FResizeStyle write FResizeStyle default rsUpdate; + property SkinType: TSpTBXSkinType read FSkinType write SetSkinType default sknSkin; + property OnDrawBackground: TSpTBXDrawEvent read FOnDrawBackground write FOnDrawBackground; + property OnMoving: TSpTBXCanResizeEvent read FOnMoving write FOnMoving; + property OnMoved: TNotifyEvent read FOnMoved write FOnMoved; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure ChangeSplitControlSize(NewControlSize: Integer); + procedure InvalidateGrip; + procedure Minimize; + procedure Restore; + procedure Toggle; + property GripRect: TRect read GetGripRect; + property Minimized: Boolean read GetMinimized; + property MouseOverGrip: Boolean read FMouseOverGrip; + property Moving: Boolean read FMoving; + published + property Align default alLeft; + property Width default 5; + end; + + TSpTBXSplitter = class(TSpTBXCustomSplitter) + published + property Align; + property Color; + property Constraints; + property ParentColor; + property PopupMenu; + property ShowHint; + property Visible; + property OnClick; + property OnContextPopup; + property OnDblClick; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + // TSpTBXCustomSplitter properties + property AutoCalcMaxSize; + property GripSize; + property MinSize; + property ResizeStyle; + property SkinType; + property OnDrawBackground; + property OnMoving; + property OnMoved; + end; + +{ Painting helpers } +procedure SpDrawXPDockablePanelTitleBar(ACanvas: TCanvas; ARect: TRect; IsActive, Vertical: Boolean); +procedure SpDrawXPDockablePanelBody(ACanvas: TCanvas; ARect: TRect; IsActive, IsFloating: Boolean); + +{ Toolbar Load/Save Position helpers } +procedure SpTBRegLoadPositions(const OwnerComponent: TComponent; const RootKey: DWORD; const BaseRegistryKey: string); +procedure SpTBRegSavePositions(const OwnerComponent: TComponent; const RootKey: DWORD; const BaseRegistryKey: string); +procedure SpTBIniLoadPositions(const OwnerComponent: TComponent; const Filename, SectionNamePrefix: string); overload; +procedure SpTBIniLoadPositions(const OwnerComponent: TComponent; const IniFile: TCustomIniFile; const SectionNamePrefix: string); overload; +procedure SpTBIniSavePositions(const OwnerComponent: TComponent; const Filename, SectionNamePrefix: string); overload; +procedure SpTBIniSavePositions(const OwnerComponent: TComponent; const IniFile: TCustomIniFile; const SectionNamePrefix: string); overload; + +implementation + +uses + Types, ComCtrls, Registry, TB2Consts, TB2Common; + +const + DockedBorderSize = 2; + HT_TB2k_Border = 2000; + HT_DP_SPLITRESIZELEFT = 86; + HT_DP_SPLITRESIZERIGHT = 87; + HT_DP_SPLITRESIZETOP = 88; + HT_DP_SPLITRESIZEBOTTOM = 89; + // Constants for ini/registry values. Do not localize! + rvMultiDockWidth = 'MultiDockWidth'; + rvMultiDockHeight = 'MultiDockHeight'; + rvFloatingClientWidth = 'FloatingClientWidth'; + rvFloatingClientHeight = 'FloatingClientHeight'; + rvRestoreSize = 'RestoreSize'; + rvState = 'State'; + rvSplitterRestorePos = 'SplitterRestorePos'; + +type + TTBCustomItemAccess = class(TTBCustomItem); + TSpTBXCustomItemAccess = class(TSpTBXCustomItem); + TTBDockAccess = class(TTBDock); + TControlAccess = class(TControl); + TWinControlAccess = class(TWinControl); + + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Helpers } + +procedure SpFixDelphiAlignBug(W: TControl; NewSize: Integer; Splitter: TControl); +// [Bugfix] +{ Try to fix a Delphi align bug when a control is right or bottom aligned and + its size is changed. + To reproduce this: + - On a new form drop 3 TPanels, align them to the bottom, don't change the size. + - Drop a button, on its OnClick event change the middle panel size to 200. + - Run the app, when you click the button the middle panel will be moved to the bottom of the form. + + Another Delphi bug: the controls aligning is based on the Controls array when they + have the same position. + For example: + Form1.DisableAlign; + try + Control1.Left:= 10; Control1.Top:= 10; + Control1.Align:= alLeft; + Control2.Left:= 10; Control2.Top:= 10; + Control2.Align:= alLeft; + // Control1 has the aligning priority because it has lower index in the Controls array + finally + Form1.EnableAlign; + end; + + This will affect the splitter when the splitter is Minimized or Maximazed to 0. + Thats why the standard Borland TSplitter must minimize to a value higher than 0. + + Solution: we must move the splitter before or after the other control + based on the Align property, for that we use SendToBack and BringToFront methods. + SendToBack and BringToFront besides of changing the "z-order" changes the + order of the control in the Controls array, SendToBack moves the control + to the first position while BringToFront moves it the last position. + + When Align is alLeft or alTop we should make the splitter to have the + aligning priority using BringToFront. + And when Align is alRight or alBottom we will use SendToBack. } +var + I, Delta: Integer; + PrevBounds: TRect; + C: TControl; +begin + case W.Align of + alLeft: + begin + if Assigned(Splitter) then Splitter.BringToFront; + W.SendToBack; + W.Width := NewSize; + end; + alTop: + begin + if Assigned(Splitter) then Splitter.BringToFront; + W.SendToBack; + W.Height := NewSize; + end; + alRight: + begin + W.Parent.DisableAlign; + if W is TSpTBXCustomMultiDock then + TSpTBXCustomMultiDock(W).BeginUpdate; + try + if Assigned(Splitter) then Splitter.SendToBack; + W.BringToFront; + PrevBounds := W.BoundsRect; + W.Width := NewSize; + Delta := (PrevBounds.Right - PrevBounds.Left) - W.Width; + + // Move all children + for I := 0 to W.Parent.ControlCount - 1 do begin + C := W.Parent.Controls[I]; + if C.Align = W.Align then + if (C = Splitter) and (PrevBounds.Right - PrevBounds.Left = 0) then + C.Left := C.Left + Delta - 1 + else + if (C.Left < PrevBounds.Right) or ((C = W) and (C.Left = PrevBounds.Right)) then + C.Left := C.Left + Delta; + end; + finally + if W is TSpTBXCustomMultiDock then + TSpTBXCustomMultiDock(W).EndUpdate; + W.Parent.EnableAlign; + end; + end; + alBottom: + begin + W.Parent.DisableAlign; + if W is TSpTBXCustomMultiDock then + TSpTBXCustomMultiDock(W).BeginUpdate; + try + if Assigned(Splitter) then Splitter.SendToBack; + W.BringToFront; + PrevBounds := W.BoundsRect; + W.Height := NewSize; + Delta := (PrevBounds.Bottom - PrevBounds.Top) - W.Height; + + // Move all children + for I := 0 to W.Parent.ControlCount - 1 do begin + C := W.Parent.Controls[I]; + if C.Align = W.Align then + if (C = Splitter) and (PrevBounds.Bottom - PrevBounds.Top = 0) then + C.Top := C.Top + Delta - 1 + else + if (C.Top < PrevBounds.Bottom) or ((C = W) and (C.Top = PrevBounds.Bottom)) then + C.Top := C.Top + Delta; + end; + finally + if W is TSpTBXCustomMultiDock then + TSpTBXCustomMultiDock(W).EndUpdate; + W.Parent.EnableAlign; + end; + end; + end; +end; + +function SpAdjacentSplitter(Dock: TTBDock; Space: Integer = 1): TSpTBXCustomSplitter; +var + I: Integer; + P: TPoint; + R: TRect; + C: TControl; +begin + Result := nil; + + P := Point(Dock.Left, Dock.Top); + case Dock.Position of + dpLeft: Inc(P.X, Dock.Width + Space); + dpRight: Dec(P.X, Space); + dpTop: Inc(P.Y, Dock.Height + Space); + dpBottom: Dec(P.Y, Space); + end; + + for I := 0 to Dock.Parent.ControlCount - 1 do begin + C := Dock.Parent.Controls[I]; + R := C.BoundsRect; + if (C.Align = Dock.Align) and (C is TSpTBXCustomSplitter) then begin + // The splitter should be adjacent to the Dock + // Or the splitter is not visible and a DP is being docked on an + // empty Dock. + if PtInRect(R, P) or + (not C.Visible and (Space = -1)) then + begin + Result := TSpTBXCustomSplitter(C); + Break; + end; + end; + end; +end; + +procedure SpDPGetDockableMultiDockList(DP: TSpTBXCustomDockablePanel; var L: TList); +// Returns a valid list of MultiDocks where the DP can dock to. + + procedure Recurse(const ParentCtl: TWinControl); + var + M: TTBDock; + I: Integer; + begin + if DP.ContainsControl(ParentCtl) or not ParentCtl.Showing then Exit; + + for I := 0 to ParentCtl.ControlCount-1 do + if ParentCtl.Controls[I] is TSpTBXCustomMultiDock then begin + M := TSpTBXCustomMultiDock(ParentCtl.Controls[I]); + if (L.IndexOf(M) = -1) and M.Visible and M.AllowDrag and (M.Position in DP.DockableTo) then + if DP.CurrentDock = M then + L.Insert(0, M) // Add CurrentDock to the DockList first so that it gets priority + else + L.Add(M); + end + else + if (ParentCtl.Controls[I] is TWinControl) and not (ParentCtl.Controls[I] is TTBDock) then + Recurse(TWinControl(ParentCtl.Controls[I])); + end; + +var + ParentForm: TTBCustomForm; + DockFormsList: TList; + I, J: Integer; +begin + L.Clear; + ParentForm := TBGetToolWindowParentForm(DP); + DockFormsList := TList.Create; + try + if Assigned(DP.FDockForms) then begin + for I := 0 to Screen.CustomFormCount - 1 do begin + J := DP.FDockForms.IndexOf(Screen.CustomForms[I]); + if (J > -1) and (DP.FDockForms[J] <> ParentForm) then + DockFormsList.Add(DP.FDockForms[J]); + end; + end; + + if Assigned(ParentForm) then + DockFormsList.Insert(0, ParentForm); + + for I := 0 to DockFormsList.Count - 1 do + Recurse(DockFormsList[I]); + finally + DockFormsList.Free; + end; +end; + +function SpDPInmediateResizableSibling(DP: TSpTBXCustomDockablePanel; + ResizeType: TSpTBXDPResizeType; out IsAdjacent: Boolean): TSpTBXCustomDockablePanel; +// Returns the inmediate resizable DP sibling + + function FindPrevSibling(L: TList; StartIndex: Integer): TSpTBXCustomDockablePanel; + var + J: Integer; + LItem: TSpTBXCustomDockablePanel; + begin + Result := nil; + if StartIndex > 0 then + for J := StartIndex - 1 downto 0 do begin + LItem := TSpTBXCustomDockablePanel(L[J]); + if (LItem <> DP) and LItem.IsResizable then begin + Result := LItem; + IsAdjacent := J = StartIndex - 1; + Break; + end; + end; + end; + + function FindNextSibling(L: TList; StartIndex: Integer): TSpTBXCustomDockablePanel; + var + J: Integer; + LItem: TSpTBXCustomDockablePanel; + begin + Result := nil; + if StartIndex + 1 < L.Count then + for J := StartIndex + 1 to L.Count - 1 do begin + LItem := TSpTBXCustomDockablePanel(L[J]); + if (LItem <> DP) and LItem.IsResizable then begin + Result := LItem; + IsAdjacent := J = StartIndex + 1; + Break; + end; + end; + end; + +var + I: 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; + if not Assigned(DkPanel) then Exit; + + // Find the inmediate resizable sibling + case ResizeType of + dprtMinimizeOrRestore: + begin + // Search the prev sibling, if not found search the next sibling + Result := FindPrevSibling(L, I); + if not Assigned(Result) then + Result := FindNextSibling(L, I); + end; + dprtAppendResize: + begin + // Search from the first item to the last + I := -1; + Result := FindNextSibling(L, I); + end; + else + // Search the next sibling, if not found search the prev sibling + Result := FindNextSibling(L, I); + if not Assigned(Result) then + Result := FindPrevSibling(L, I); + 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 SpDPSwapPos(MultiDock: TSpTBXCustomMultiDock; DP1, DP2: TSpTBXCustomDockablePanel); +// Swaps the positions of two DPs +var + L: TList; + I, DP1Index, DP2Index: Integer; + Temp: TSpTBXCustomDockablePanel; +begin + L := TList.Create; + MultiDock.BeginUpdate; + try + MultiDock.GetDockablePanelList(L); + + // Find the DPs indexes + DP1Index := -1; + DP2Index := -1; + for I := 0 to L.Count - 1 do begin + Temp := L[I]; + if Temp = DP1 then DP1Index := I; + if Temp = DP2 then DP2Index := I; + if (DP1Index > -1) and (DP2Index > -1) then Break; + end; + + if (DP1Index > -1) and (DP2Index > -1) then begin + // Swap the DPs + Temp := L[DP1Index]; + L[DP1Index] := L[DP2Index]; + L[DP2Index] := Temp; + // Adjust the Dock Pos + SpDPUpdateDockPos(L, MultiDock.IsVertical); + end; + finally + Multidock.EndUpdate; + L.Free; + end; +end; + +function SpDPResize(DP: TSpTBXCustomDockablePanel; NewSize: Integer; ResizeType: TSpTBXDPResizeType = dprtManualResize): Boolean; +var + PrevSize, Delta, MinSize: Integer; + MultiDock: TSpTBXCustomMultiDock; + DPSibling: TSpTBXCustomDockablePanel; + IsDPSiblingAdjacent: Boolean; +begin + Result := False; + + if DP.Docked then begin + if not (DP.CurrentDock is TSpTBXCustomMultiDock) then Exit; + + MultiDock := TSpTBXCustomMultiDock(DP.CurrentDock); + if MultiDock.ToolbarCount < 2 then Exit; + + MultiDock.BeginUpdate; + try + // Resize only the inmediate dockable panel sibling + DPSibling := SpDPInmediateResizableSibling(DP, ResizeType, IsDPSiblingAdjacent); + if Assigned(DPSibling) then begin + case ResizeType of + dprtAppendResize: + begin + // Resize the 1st DP + if MultiDock.IsVertical then + DPSibling.Height := DPSibling.Height - NewSize + else + DPSibling.Width := DPSibling.Width - NewSize; + MultiDock.UpdateDockablePanelsDockPos; + end; + 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; + MultiDock.UpdateDockablePanelsDockPos; + end; + dprtSplitResize: + begin + if DPSibling.DockPos < DP.DockPos then + Exit; + + // If DP can't be resized find another sibling + if not (csDesigning in MultiDock.ComponentState) and DP.FixedDockedSize then begin + if MultiDock.IsVertical then + Delta := NewSize - DP.Height + else + Delta := NewSize - DP.Width; + DP := DPSibling; + // Use dprtMinimizeOrRestore as the ResizeType, we need to find the previous DP in the list + DPSibling := SpDPInmediateResizableSibling(DP, dprtMinimizeOrRestore, IsDPSiblingAdjacent); + // Make sure DPSibling index < DP index + if not Assigned(DPSibling) or (DPSibling.DockPos > DP.DockPos) 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; + 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; + 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; + DPSibling.Height := DPSibling.Height - Delta; + 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; + DPSibling.Width := DPSibling.Width - Delta; + end; + end; + end; + + Result := True; + end; + finally + // Update DockPos of all the DPs, including the non-visible DPs, even when DPSibling = nil + if ResizeType = dprtSplitResize then + MultiDock.UpdateDockablePanelsDockPos; + + MultiDock.EndUpdate; + + // Resize the DP after the it was appended + if ResizeType = dprtAppendResize then + SpDPResize(DP, NewSize, dprtManualResize); + end; + end + else begin + // Not docked nor floating + DP.Width := NewSize + end; +end; + +function SpPtInMultiDock(P: TPoint; MultiDockList: TList): TSpTBXCustomMultiDock; +// Returns the Dock that is under the point, on screen coordinates +var + I: Integer; + MultiDock: TSpTBXCustomMultiDock; + R: TRect; +const + SnapBuffer = 24; + MinDockSize = 4; +begin + Result := nil; + for I := 0 to MultiDockList.Count - 1 do + if TControl(MultiDockList[I]) is TSpTBXCustomMultiDock then begin + MultiDock := TSpTBXCustomMultiDock(MultiDockList[I]); + GetWindowRect(MultiDock.Handle, R); + + // Ensure there is a minimum size for mouse sensibility + case MultiDock.Position of + dpxTop: + if (R.Bottom - R.Top) < MinDockSize then + Inc(R.Bottom, SnapBuffer); + dpxBottom: + if (R.Bottom - R.Top) < MinDockSize then + Dec(R.Top, SnapBuffer); + dpxLeft: + if (R.Right - R.Left) < MinDockSize then + Inc(R.Right, SnapBuffer); + dpxRight, dpxClient: + if (R.Right - R.Left) < MinDockSize then + Dec(R.Left, SnapBuffer); + end; + + if PtInRect(R, P) then begin + Result := MultiDock; + Break; + end; + end; +end; + +function SpPtInDP(P: TPoint; MultiDock: TSpTBXCustomMultiDock; OnlyOnTitleBar: Boolean): TSpTBXCustomDockablePanel; +// Returns a DP that is under the point, on screen coordinates +// If OnlyOnTitleBar is true it returns a DP if the point is under the DP's TitleBar. +var + I: Integer; + DP: TSpTBXCustomDockablePanel; + R: TRect; +begin + Result := nil; + for I := 0 to MultiDock.ToolbarCount - 1 do + if MultiDock.Toolbars[I] is TSpTBXCustomDockablePanel then begin + DP := TSpTBXCustomDockablePanel(MultiDock.Toolbars[I]); + if OnlyOnTitleBar then begin + if MultiDock.IsVertical then + GetWindowRect(DP.FToolbar.Handle, R) + else begin + // When the DP is horizontal track 20 pixels from the left + R.TopLeft := DP.ClientToScreen(Point(0, 0)); + R.BottomRight := DP.ClientToScreen(Point(20, DP.ClientHeight)); + end; + end + else + GetWindowRect(DP.Handle, R); + + if PtInRect(R, P) then begin + Result := DP; + Break; + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Painting helpers } + +procedure SpDrawXPDockablePanelTitleBar(ACanvas: TCanvas; ARect: TRect; IsActive, Vertical: Boolean); +begin + case SkinManager.GetSkinType of + sknNone, sknWindows: + begin + // [Theme-Change] + // When the XP theme is used just paint a gradient + SpGradientFill(ACanvas, ARect, SpLighten(clBtnFace, 12), SpLighten(clBtnFace, -12), not Vertical); + Windows.DrawEdge(ACanvas.Handle, ARect, BDR_RAISEDINNER, BF_RECT); + end; + sknSkin: + CurrentSkin.PaintBackground(ACanvas, ARect, skncDockablePanelTitleBar, sknsNormal, True, True, Vertical); + end; +end; + +procedure SpDrawXPDockablePanelBody(ACanvas: TCanvas; ARect: TRect; IsActive, IsFloating: Boolean); +var + C: TColor; +begin + case SkinManager.GetSkinType of + sknNone, sknWindows: + begin + C := ACanvas.Brush.Color; + ACanvas.Brush.Color := SpMixColors(clBtnFace, clWindow, 80); + ACanvas.FillRect(ARect); + if not IsFloating then begin + ACanvas.Brush.Color := clBtnFace; + ACanvas.FrameRect(ARect); + InflateRect(ARect, -1, -1); + ACanvas.Brush.Color := clWhite; + ACanvas.FrameRect(ARect); + end; + ACanvas.Brush.Color := C; + end; + sknSkin: + CurrentSkin.PaintBackground(ACanvas, ARect, skncDockablePanel, sknsNormal, True, not IsFloating); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Toolbar Load/Save Position helpers } + +procedure SpTBUpdateMultiDocksAfterLoad(const M: TSpTBXMultiDock); +// TBCustomLoadPositions doesn't correctly position the DPs after they are loaded. +// To reproduce: +// 1) Drop a top aligned MultiDock with 3 DPs (DP1, DP2, DP3), and drop a left +// aligned Multidock with a single DP (DP4) +// 2) Use TBIniLoadPositions in Form.OnShow and TBIniSavePositions in Form.OnClose +// 3) Run the app, position the top DPs in this order: DP4, DP3, DP1, and +// dock DP2 on the left aligned Multidock +// 4) Close and run the app, the top DPs are not correctly positioned/sized +// This happens because TBCustomLoadPositions updates the DockPos and Size +// after the toolbar Parent is set, toolbar by toolbar. +// DockPos and Size should be changed after all the toolbars parent is changed. +// http://news.jrsoftware.org/read/article.php?id=15131&group=jrsoftware.toolbar2000.thirdparty#15131 +var + J: Integer; + DP: TSpTBXCustomDockablePanel; + L: TList; + Sz: TSize; + R: TRect; +begin + L := TList.Create; + M.BeginUpdate; + try + M.GetDockablePanelList(L); + for J := 0 to L.Count - 1 do begin + DP := TSpTBXCustomDockablePanel(L[J]); + if DP.FLoadedDockPos > -1 then + DP.DockPos := DP.FLoadedDockPos; + Windows.GetClientRect(DP.Handle, R); + Sz := DP.FLoadedBarSize; + if M.IsVertical then begin + if Sz.cy > 0 then + DP.Height := DP.Height - R.Bottom + Sz.cy; + end + else begin + if Sz.cx > 0 then + DP.Width := DP.Width - R.Right + Sz.cx; + end; + end; + finally + M.EndUpdate; + L.Free; + end; +end; + +procedure SpTBUpdateBeforeLoadIni(const OwnerComponent: TComponent; + const IniFile: TCustomIniFile; const SectionNamePrefix: string); +var + I: Integer; + MultiDock: TSpTBXMultiDock; +begin + for I := 0 to OwnerComponent.ComponentCount - 1 do begin + if OwnerComponent.Components[I] is TSpTBXMultiDock then begin + MultiDock := TSpTBXMultiDock(OwnerComponent.Components[I]); + MultiDock.FReadingPositionData := True; // Set the flag to allow resizing of FixedDockedSize DPs + end; + end; +end; + +procedure SpTBUpdateAfterLoadIni(const OwnerComponent: TComponent; + const IniFile: TCustomIniFile; const SectionNamePrefix: string); +var + I, W, H: Integer; + MultiDock: TSpTBXMultiDock; + Splitter: TSpTBXCustomSplitter; +begin + for I := 0 to OwnerComponent.ComponentCount - 1 do begin + // Load the MultiDock size + if OwnerComponent.Components[I] is TSpTBXMultiDock then begin + MultiDock := TSpTBXMultiDock(OwnerComponent.Components[I]); + MultiDock.FReadingPositionData := False; // Reset the flag + if MultiDock.ToolbarCount > 0 then begin + W := IniFile.ReadInteger(SectionNamePrefix + MultiDock.Name, rvMultiDockWidth, -1); + H := IniFile.ReadInteger(SectionNamePrefix + MultiDock.Name, rvMultiDockHeight, -1); + Splitter := MultiDock.GetAdjacentSplitter; + if Assigned(Splitter) then begin + case MultiDock.Align of + alLeft: if W > -1 then SpFixDelphiAlignBug(MultiDock, W, Splitter); + alTop: if H > -1 then SpFixDelphiAlignBug(MultiDock, H, Splitter); + alRight: if W > -1 then SpFixDelphiAlignBug(MultiDock, W, Splitter); + alBottom: if H > -1 then SpFixDelphiAlignBug(MultiDock, H, Splitter); + end; + end; + // Update the size and position of the DPs + SpTBUpdateMultiDocksAfterLoad(MultiDock); + end; + end; + + // Load Splitter.RestorePos + if OwnerComponent.Components[I] is TSpTBXCustomSplitter then begin + Splitter := TSpTBXCustomSplitter(OwnerComponent.Components[I]); + Splitter.FRestorePos := IniFile.ReadInteger(SectionNamePrefix + Splitter.Name, rvSplitterRestorePos, 60); + end; + end; +end; + +procedure SpTBUpdateAfterSaveIni(const OwnerComponent: TComponent; + const IniFile: TCustomIniFile; const SectionNamePrefix: string); +var + I: Integer; + MultiDock: TSpTBXMultiDock; + Splitter: TSpTBXCustomSplitter; +begin + for I := 0 to OwnerComponent.ComponentCount - 1 do begin + // Save the MultiDock size + if OwnerComponent.Components[I] is TSpTBXMultiDock then begin + MultiDock := TSpTBXMultiDock(OwnerComponent.Components[I]); + if MultiDock.ToolbarCount > 0 then begin + IniFile.WriteInteger(SectionNamePrefix + MultiDock.Name, rvMultiDockWidth, MultiDock.Width); + IniFile.WriteInteger(SectionNamePrefix + MultiDock.Name, rvMultiDockHeight, MultiDock.Height); + end; + end; + + // Save the Splitter.RestorePos + if OwnerComponent.Components[I] is TSpTBXCustomSplitter then begin + Splitter := TSpTBXCustomSplitter(OwnerComponent.Components[I]); + IniFile.WriteInteger(SectionNamePrefix + Splitter.Name, rvSplitterRestorePos, Splitter.FRestorePos); + end; + end; +end; + +procedure SpTBRegLoadPositions(const OwnerComponent: TComponent; + const RootKey: DWORD; const BaseRegistryKey: string); +var + Reg: TRegistryIniFile; +begin + // Use TRegistryIniFile to call SpTBUpdateAfterLoadIni + Reg := TRegistryIniFile.Create('', KEY_QUERY_VALUE); + try + Reg.RegIniFile.RootKey := RootKey; + if Reg.RegIniFile.OpenKey(BaseRegistryKey, False) then begin + SpTBUpdateBeforeLoadIni(OwnerComponent, Reg, ''); + TBRegLoadPositions(OwnerComponent, RootKey, BaseRegistryKey); + SpTBUpdateAfterLoadIni(OwnerComponent, Reg, ''); + end; + finally + Reg.Free; + end; +end; + +procedure SpTBRegSavePositions(const OwnerComponent: TComponent; + const RootKey: DWORD; const BaseRegistryKey: string); +var + Reg: TRegistryIniFile; +begin + TBRegSavePositions(OwnerComponent, RootKey, BaseRegistryKey); + // Use TRegistryIniFile to call SpTBUpdateAfterSaveIni + Reg := TRegistryIniFile.Create(''); + try + Reg.RegIniFile.RootKey := RootKey; + Reg.RegIniFile.CreateKey(BaseRegistryKey); + if Reg.RegIniFile.OpenKey(BaseRegistryKey, True) then + SpTBUpdateAfterSaveIni(OwnerComponent, Reg, ''); + finally + Reg.Free; + end; +end; + +procedure SpTBIniLoadPositions(const OwnerComponent: TComponent; + const IniFile: TCustomIniFile; const SectionNamePrefix: string); +begin + SpTBUpdateBeforeLoadIni(OwnerComponent, IniFile, SectionNamePrefix); + TBIniLoadPositions(OwnerComponent, IniFile, SectionNamePrefix); + SpTBUpdateAfterLoadIni(OwnerComponent, IniFile, SectionNamePrefix); +end; + +procedure SpTBIniSavePositions(const OwnerComponent: TComponent; + const IniFile: TCustomIniFile; const SectionNamePrefix: string); +begin + TBIniSavePositions(OwnerComponent, IniFile, SectionNamePrefix); + SpTBUpdateAfterSaveIni(OwnerComponent, IniFile, SectionNamePrefix); +end; + +procedure SpTBIniLoadPositions(const OwnerComponent: TComponent; + const Filename, SectionNamePrefix: string); +// Use TMemIniFile instead of TIniFile for better readability and to solve +// the #7363 bug report from QC: http://qc.borland.com/wc/qcmain.aspx?d=7363 +var + MemIniFile: TMemIniFile; +begin + MemIniFile := TMemIniFile.Create(Filename); + try + SpTBIniLoadPositions(OwnerComponent, MemIniFile, SectionNamePrefix); + finally + MemIniFile.Free; + end; +end; + +procedure SpTBIniSavePositions(const OwnerComponent: TComponent; + const Filename, SectionNamePrefix: string); +// Use TMemIniFile instead of TIniFile for better readability and to solve +// the #7363 bug report from QC: http://qc.borland.com/wc/qcmain.aspx?d=7363 +var + MemIniFile: TMemIniFile; +begin + MemIniFile := TMemIniFile.Create(Filename); + try + SpTBIniSavePositions(OwnerComponent, MemIniFile, SectionNamePrefix); + MemIniFile.UpdateFile; + finally + MemIniFile.Free; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomMultiDock } + +constructor TSpTBXCustomMultiDock.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + inherited LimitToOneRow := True; + FAutoSplitterVisibility := True; + FLimitToOneRow := True; + FPosition := dpxTop; + SetPosition(dpxLeft); + inherited OnInsertRemoveBar := DoInsertRemoveBar; + inherited OnRequestDock := DoRequestDock; +end; + +procedure TSpTBXCustomMultiDock.DoInsertRemoveBar(Sender: TObject; + Inserting: Boolean; Bar: TTBCustomDockableWindow); +var + SpacingDelta: Integer; + Splitter: TSpTBXCustomSplitter; +begin + // Automatically Show or Hide the adjacent splitter when + // the MultiDock is empty + if FAutoSplitterVisibility then begin + if Inserting and (ToolbarCount = 1) then + SpacingDelta := -1 // Inserting on an empty Dock + else + SpacingDelta := 1; + + Splitter := GetAdjacentSplitter(SpacingDelta); + + if Assigned(Splitter) then begin + if Inserting and (ToolbarCount = 1) then begin + // Inserting on an empty Dock, re-align adjacent splitter + // When Width/Height = 0 the realign must be done by SetParent + Splitter.Visible := True; + if (IsVertical and (Width > 0)) or (not IsVertical and (Height > 0)) then + InsertingOnEmptyDock; + end + else begin + if ToolbarCount = 0 then + Splitter.Visible := False; + end; + end; + end; + + if Assigned(FOnInsertRemoveBar) then FOnInsertRemoveBar(Sender, Inserting, Bar); +end; + +procedure TSpTBXCustomMultiDock.DoRequestDock(Sender: TObject; + Bar: TTBCustomDockableWindow; var Accept: Boolean); +begin + Accept := Assigned(Bar) and (Bar is TSpTBXCustomDockablePanel); + if Accept then + if Assigned(FOnRequestDock) then FOnRequestDock(Sender, Bar, Accept); +end; + +procedure TSpTBXCustomMultiDock.AlignControls(AControl: TControl; + var Rect: TRect); +begin + inherited; + if FPosition = dpxClient then + UpdateDPLateralSize(Width, Height); +end; + +function CompareEffectiveDockPos(Item1, Item2: Pointer): Integer; +begin + Result := TSpTBXCustomDockablePanel(Item1).EffectiveDockPos - TSpTBXCustomDockablePanel(Item2).EffectiveDockPos; +end; + +procedure TSpTBXCustomMultiDock.GetDockablePanelList(DPList: TList); +var + I: Integer; + T: TTBCustomDockableWindow; +begin + DPList.Clear; + for I := 0 to ToolbarCount - 1 do begin + T := Toolbars[I]; + if T is TSpTBXCustomDockablePanel then + DPList.Add(T); + end; + // Sort the list based on the dock pos + DPList.Sort(CompareEffectiveDockPos); +end; + +function TSpTBXCustomMultiDock.GetAdjacentSplitter(SpacingDelta: Integer = 1): TSpTBXCustomSplitter; +begin + if Assigned(FLastSplitter) then + Result := FLastSplitter + else begin + Result := SpAdjacentSplitter(Self, SpacingDelta); + if Result <> FLastSplitter then begin + if Assigned(FLastSplitter) then FLastSplitter.RemoveFreeNotification(Self); + FLastSplitter := Result; + if Assigned(FLastSplitter) then + FLastSplitter.FreeNotification(Self); + end; + end; +end; + +procedure TSpTBXCustomMultiDock.GetDockablePanelDockIndex(DPList: TList; + DP: TSpTBXCustomDockablePanel; out DPDockIndex: Integer); +var + I: Integer; +begin + DPDockIndex := -1; + GetDockablePanelList(DPList); + for I := 0 to DPList.Count - 1 do + if DPList[I] = DP then begin + DPDockIndex := I; + Break; + end; +end; + +procedure TSpTBXCustomMultiDock.InsertingOnEmptyDock; +var + Splitter: TSpTBXCustomSplitter; +begin + // When a DP is docked on an empty right/bottom aligned MultiDock and there's + // an adjacent Splitter, the Splitter is moved to the right/bottom side + // of the MultiDock: + // http://news.jrsoftware.org/read/article.php?id=14410&group=jrsoftware.toolbar2000.thirdparty#14410 + // To fix this, re align the Splitter after the MultiDock is resized. + Splitter := GetAdjacentSplitter; + if Assigned(Splitter) then begin + Parent.DisableAlign; + try + case Splitter.Align of + alTop: Splitter.Top := Top + Height + 1; + alBottom: Splitter.Top := Top - 1; + alLeft: Splitter.Left := Left + Width + 1; + alRight: Splitter.Left := Left - 1; + end; + finally + Parent.EnableAlign; + end; + end; +end; + +function TSpTBXCustomMultiDock.IsVertical: Boolean; +begin + Result := not (Position in [dpxTop, dpxBottom]); +end; + +procedure TSpTBXCustomMultiDock.Loaded; +var + Splitter: TSpTBXCustomSplitter; +begin + inherited; + + // Automatically Hide the adjacent splitter when + // the MultiDock is empty + if FAutoSplitterVisibility and (ToolbarCount = 0) then begin + Splitter := GetAdjacentSplitter; + if Assigned(Splitter) then + Splitter.Visible := False; + end; +end; + +procedure TSpTBXCustomMultiDock.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if (Operation = opRemove) and (AComponent = FLastSplitter) then + FLastSplitter := nil; +end; + +procedure TSpTBXCustomMultiDock.SetBounds(ALeft, ATop, AWidth, AHeight: Integer); +begin + inherited; + UpdateDPLateralSize(AWidth, AHeight); +end; + +procedure TSpTBXCustomMultiDock.SetLimitToOneRow(const Value: Boolean); +begin + FLimitToOneRow := True; +end; + +procedure TSpTBXCustomMultiDock.SetPosition(const Value: TSpTBXDockPosition); +begin + if FPosition <> Value then begin + if (ControlCount <> 0) then + raise EInvalidOperation.Create(STBDockCannotChangePosition); + FPosition := Value; + case Value of + dpxLeft: inherited Position := dpLeft; + dpxTop: inherited Position := dpTop; + dpxRight: inherited Position := dpRight; + dpxBottom: inherited Position := dpBottom; + dpxClient: + begin + inherited Position := dpRight; + Align := alClient; + end; + end; + ArrangeToolbars; + end; +end; + +procedure TSpTBXCustomMultiDock.UpdateDockablePanelsDockPos; +// Updates the DP.DockPos on all the DPs on the MultiDock +var + L: TList; +begin + L := TList.Create; + BeginUpdate; + try + GetDockablePanelList(L); + SpDPUpdateDockPos(L, IsVertical); + finally + EndUpdate; + L.Free; + 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, Size: Integer; + DP: TSpTBXCustomDockablePanel; + IsDPSiblingAdjacent: Boolean; +begin + L := TList.Create; + try + GetDockablePanelList(L); + if L.Count = 0 then Exit; + FUpdatingLateralSize := True; + BeginUpdate; + try + Size := 0; + if IsVertical then begin + for I := 0 to L.Count - 1 do begin + DP := TSpTBXCustomDockablePanel(L[I]); + DP.Width := AWidth; // Update the lateral size + Inc(Size, DP.Height); // Calculate the total size of all the DPs + end; + // If the last DP is not resizable make sure we fill the empty space + if (Size < Height) or (Size > Height) then begin + DP := L[L.Count - 1]; + if not DP.IsResizable then begin + // Use dprtMinimizeOrRestore as the ResizeType, we need to find the previous DP in the list + DP := SpDPInmediateResizableSibling(DP, dprtMinimizeOrRestore, IsDPSiblingAdjacent); + if Assigned(DP) then + DP.Height := DP.Height + (Height - Size); + end; + SpDPUpdateDockPos(L, IsVertical); + end; + end + else begin + for I := 0 to L.Count - 1 do begin + DP := TSpTBXCustomDockablePanel(L[I]); + DP.Height := AHeight; // Update the lateral size + Inc(Size, DP.Width); // Calculate the total size of all the DPs + end; + // If the last DP is not resizable make sure we fill the empty space + if (Size < Width) or (Size > Width) then begin + DP := L[L.Count - 1]; + if not DP.IsResizable then begin + // Use dprtMinimizeOrRestore as the ResizeType, we need to find the previous DP in the list + DP := SpDPInmediateResizableSibling(DP, dprtMinimizeOrRestore, IsDPSiblingAdjacent); + if Assigned(DP) then + DP.Width := DP.Width + (Width - Size); + end; + SpDPUpdateDockPos(L, IsVertical); + end; + end; + finally + EndUpdate; + FUpdatingLateralSize := False; + end; + finally + L.Free; + end; +end; + +procedure TSpTBXCustomMultiDock.ValidateInsert(AComponent: TComponent); +begin + inherited; + if not (AComponent is TSpTBXCustomDockablePanel) then + raise EInvalidOperation.CreateFmt('Cannot insert %s into MultiDock', [AComponent.ClassName]); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXDockablePanelButtonOptions } + +constructor TSpTBXDockablePanelButtonOptions.Create(AParent: TWinControl); +begin + FDockablePanel := AParent as TSpTBXCustomDockablePanel; + inherited; + Maximize := False; + Minimize := False; + TitleBarMaxSize := 19; +end; + +procedure TSpTBXDockablePanelButtonOptions.CreateButtons; +begin + FToolbar := FDockablePanel.FToolbar; + inherited; +end; + +procedure TSpTBXDockablePanelButtonOptions.ButtonsClick(Sender: TObject); +begin + if Sender = MinimizeButton then FDockablePanel.SizeToggle(False) + else if Sender = MaximizeButton then FDockablePanel.SizeToggle(True) + else if Sender = CloseButton then FDockablePanel.Close; +end; + +function TSpTBXDockablePanelButtonOptions.Restoring(B: TSpTBXCustomItem): Boolean; +begin + Result := False; + if Assigned(FDockablePanel) then + if B = MinimizeButton then + Result := FDockablePanel.Minimized + else + if B = MaximizeButton then + Result := FDockablePanel.Maximized; +end; + +procedure TSpTBXDockablePanelButtonOptions.SetupButton(B: TSpTBXCustomItem); +begin + inherited; + TSpTBXCustomItemAccess(B).CustomWidth := 15; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXDockablePanelToolbar } + +constructor TSpTBXDockablePanelToolbar.Create(AOwner: TComponent); +begin + inherited; + CompoundToolbar := True; +end; + +function TSpTBXDockablePanelToolbar.GetItemsTextColor(State: TSpTBXSkinStatesType): TColor; +begin + Result := CurrentSkin.GetTextColor(skncDockablePanelTitleBar, State); +end; + +function TSpTBXDockablePanelToolbar.GetParentDockablePanel: TSpTBXCustomDockablePanel; +var + P: TWinControl; +begin + Result := nil; + P := Parent; + while Assigned(P) do + if P is TSpTBXCustomDockablePanel then begin + Result := P as TSpTBXCustomDockablePanel; + Break; + end + else + P := P.Parent; +end; + +function TSpTBXDockablePanelToolbar.GetRightAlignMargin: Integer; +begin + Result := 4; +end; + +function TSpTBXDockablePanelToolbar.CanItemClick(Item: TTBCustomItem; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer): Boolean; +var + TransparentClick: Boolean; + DP: TSpTBXCustomDockablePanel; +begin + Result := True; + + // Move the DockablePanel if the toolbar client area or an item with + // tbisClicksTransparent itemstyle is clicked (like a LabelItem) + if Button = mbLeft then begin + DP := GetParentDockablePanel; + if Assigned(DP) and DP.IsMovable then begin + if Assigned(Item) then + TransparentClick := tbisClicksTransparent in TTBCustomItemAccess(Item).ItemStyle + else + TransparentClick := True; + if TransparentClick then + if ssDouble in Shift then + DP.DoubleClick + else begin + Result := False; + SendMessage(DP.Handle, WM_NCLBUTTONDOWN, HT_TB2k_Border, 0); + end; + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomDockablePanel } + +constructor TSpTBXCustomDockablePanel.Create(AOwner: TComponent); +begin + inherited; + + FLoadedDockPos := -1; + FLoadedBarSize.cx := -1; + FLoadedBarSize.cy := -1; + + Stretch := True; + DragHandleStyle := dhNone; + + SetBounds(Left, Top, 160, 128); + + FPanel := TPanel.Create(Self); + FPanel.Parent := Self; + FPanel.Align := alTop; + FPanel.BevelOuter := bvNone; + + FToolbarDock := TSpTBXDock.Create(Self); + FToolbarDock.Parent := FPanel; + FToolbarDock.OnRequestDock := DockRequestDock; + FToolbarDock.OnDrawBackground := DockDrawBackground; + FToolbarDock.OnResize := DockResize; + + FToolbar := TSpTBXDockablePanelToolbar.Create(Self); + FToolbar.Parent := FToolbarDock; + FToolbar.CurrentDock := FToolbarDock; + FToolbar.Name := Name + 'Toolbar'; + FToolbar.Customizable := False; + FToolbar.BorderStyle := bsNone; + FToolbar.DockMode := dmCannotFloatOrChangeDocks; + FToolbar.DragHandleStyle := dhNone; + FToolbar.Options := FToolbar.Options + [tboNoAutoHint]; + FToolbar.Stretch := True; + FToolbar.ShrinkMode := tbsmNone; + FToolbar.ShowCaption := False; + FToolbar.OnDrawBackground := ToolbarDrawBackground; + + FOptions := TSpTBXDockablePanelButtonOptions.Create(Self); + FOptions.CaptionLabel := Caption; + + inherited ShowCaption := False; // Re-publish it, should always be False + FShowCaption := True; + FShowCaptionWhenDocked := True; + + DockResize(FToolbarDock); // Adjust ToolbarDock resizing +end; + +procedure TSpTBXCustomDockablePanel.CreateParams(var Params: TCreateParams); +begin + inherited CreateParams(Params); + + if not (csDesigning in ComponentState) then + with Params do + Params.Style := Params.Style or WS_CLIPCHILDREN; +end; + +destructor TSpTBXCustomDockablePanel.Destroy; +begin + FOptions.Free; + FToolbar.Free; + FToolbarDock.Free; + FPanel.Free; + + inherited; + + FreeAndNil(FDockForms); // After inherited, Notification accesses FDockForms +end; + +procedure TSpTBXCustomDockablePanel.Loaded; +var + I: Integer; + C: TControl; + DesignerRootItem: TTBCustomItem; +begin + inherited; + + // The parent of TTBControlItem.Control should be the toolbar, not Self + // (as setted in GetChildren for dfm streaming). + DesignerRootItem := GetItems; + for I := 0 to DesignerRootItem.Count - 1 do + if DesignerRootItem[I] is TTBControlItem then begin + C := TTBControlItem(DesignerRootItem[I]).Control; + if Assigned(C) and (C.Parent <> FToolbar) then + C.Parent := FToolbar; + end; +end; + +procedure TSpTBXCustomDockablePanel.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if Operation = opRemove then + RemoveFromList(FDockForms, AComponent); +end; + +function TSpTBXCustomDockablePanel.Maximize: Boolean; +var + PrevState: TWindowState; +begin + Result := False; + if not Maximized then begin + // [DockablePanel-Rule] + // Do not maximize if it's the only DP on the dock + if Docked and (CurrentDock.ToolbarCount > 1) then begin + PrevState := FState.DockedState; + FIsManualSizing := True; + try + if InternalMaximize(False) then begin + Result := True; + FState.DockedState := wsMaximized; + FOptions.SetupButtonIcon(FOptions.MinimizeButton); + FOptions.SetupButtonIcon(FOptions.MaximizeButton); + end + else + FState.DockedState := PrevState; + finally + FIsManualSizing := False; + end; + end; + end; + + if Result then + DoWindowStateChanged(wsMaximized); +end; + +function TSpTBXCustomDockablePanel.Maximized: Boolean; +begin + if Floating then + Result := False + else + Result := FState.DockedState = wsMaximized; +end; + +function TSpTBXCustomDockablePanel.Minimize: Boolean; +var + CanMinimize: Boolean; + I, MinimizedCount: Integer; + L: TList; + MultiDock: TSpTBXCustomMultiDock; + RS: TSpTBXDPResizeType; +begin + Result := False; + if Floating then begin + if FState.DockedState <> wsMinimized then begin + FState.DockedState := wsMinimized; + FState.RestoreSize := Parent.Height; + Parent.ClientHeight := MinClientHeight; + FOptions.SetupButtonIcon(FOptions.MinimizeButton); + FOptions.SetupButtonIcon(FOptions.MaximizeButton); + Result := True; + end; + end + else + if Docked and (FState.DockedState <> wsMinimized) and (CurrentDock is TSpTBXCustomMultiDock) then begin + MultiDock := TSpTBXCustomMultiDock(CurrentDock); + L := TList.Create; + try + MultiDock.GetDockablePanelList(L); + // [DockablePanel-Rule] + // Only minimize if it's horizontal and is the only DP on the dock + // Or if it's vertical and it's not the only DP on the dock and the rest of the siblings are not minimized + MinimizedCount := 0; + if not MultiDock.IsVertical then + CanMinimize := L.Count = 1 + else begin + for I := 0 to L.Count - 1 do + if TSpTBXCustomDockablePanel(L[I]).FState.DockedState = wsMinimized then + Inc(MinimizedCount); + CanMinimize := (L.Count > 1) and (L.Count - 1 > MinimizedCount); + end; + + if CanMinimize then begin + FIsManualSizing := True; + try + if Height > MinClientHeight then + FState.RestoreSize := Height; + if Options.TaskPaneStyleResize then + RS := dprtMinimizeOrRestoreTaskPaneStyle + else + RS := dprtMinimizeOrRestore; + if SpDPResize(Self, MinClientHeight, RS) then begin + FState.DockedState := wsMinimized; + FOptions.SetupButtonIcon(FOptions.MinimizeButton); + FOptions.SetupButtonIcon(FOptions.MaximizeButton); + Result := True; + end; + finally + FIsManualSizing := False; + end; + end; + + finally + L.Free; + end; + end; + + if Result then + DoWindowStateChanged(wsMinimized); +end; + +function TSpTBXCustomDockablePanel.Minimized: Boolean; +begin + Result := FState.DockedState = wsMinimized; +end; + +procedure TSpTBXCustomDockablePanel.MouseDown(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + // Don't let the DP be dragged by the client area + // Override TTBCustomDockableWindow.MouseDown + if (Button <> mbLeft) or not IsMovable then + inherited + else + if Assigned(OnMouseDown) then OnMouseDown(Self, Button, Shift, X, Y); +end; + +procedure TSpTBXCustomDockablePanel.Resize; +var + TotalBorderSize: Integer; +begin + inherited; + + if Floating and Assigned(Parent) then begin + // When Floating the caption panel is always horizontal + // Make sure to calculate the floating form constraints taking into + // account the borders and the close button. + TotalBorderSize := GetFloatingBorderSize.Y * 2; + Parent.Constraints.MinWidth := 20 + TotalBorderSize; + Parent.Constraints.MinHeight := MinClientHeight + TotalBorderSize; + if (FState.DockedState = wsMinimized) and (Parent.ClientHeight > MinClientHeight) then begin + FState.DockedState := wsNormal; + FOptions.SetupButtonIcon(FOptions.MinimizeButton); + end; + end + else begin + if (FState.DockedState = wsMinimized) and (ClientHeight > MinClientHeight) then begin + FState.DockedState := wsNormal; + FOptions.SetupButtonIcon(FOptions.MinimizeButton); + end; + end; +end; + +function TSpTBXCustomDockablePanel.Restore: Boolean; +var + I: Integer; + DkPanel: TSpTBXCustomDockablePanel; + RS: TSpTBXDPResizeType; +begin + Result := False; + FIsManualSizing := True; + try + if Floating then begin + if FState.DockedState = wsMinimized then begin + FState.DockedState := wsNormal; + Parent.Height := FState.RestoreSize; + Result := True; + end; + end + else + if Docked then begin + case FState.DockedState of + wsNormal: ; + wsMinimized: + begin + if Options.TaskPaneStyleResize then + RS := dprtMinimizeOrRestoreTaskPaneStyle + else + RS := dprtMinimizeOrRestore; + Result := SpDPResize(Self, FState.RestoreSize, RS); + if Result then begin + FState.DockedState := wsNormal; + + // If a sibling was Maximized restore it + if Assigned(CurrentDock) then begin + for I := 0 to CurrentDock.ToolbarCount - 1 do + if (CurrentDock.Toolbars[I] <> Self) and (CurrentDock.Toolbars[I] is TSpTBXCustomDockablePanel) then begin + DkPanel := TSpTBXCustomDockablePanel(CurrentDock.Toolbars[I]); + if DkPanel.Maximized then begin + DkPanel.FState.DockedState := wsNormal; + DkPanel.Options.SetupButtonIcon(DkPanel.Options.MaximizeButton); + Break; + end; + end; + end; + end; + end; + wsMaximized: + begin + Result := InternalMaximize(True); + if Result then + FState.DockedState := wsNormal; + end; + end; + end; + + FOptions.SetupButtonIcon(FOptions.MinimizeButton); + FOptions.SetupButtonIcon(FOptions.MaximizeButton); + finally + FIsManualSizing := False; + end; + + if Result then + DoWindowStateChanged(wsNormal); +end; + +procedure TSpTBXCustomDockablePanel.AddDockForm(const Form: TTBCustomForm); +begin + if Assigned(Form) and AddToList(FDockForms, Form) then + Form.FreeNotification(Self); +end; + +procedure TSpTBXCustomDockablePanel.RemoveDockForm(const Form: TTBCustomForm); +begin + RemoveFromList(FDockForms, Form); +end; + +procedure TSpTBXCustomDockablePanel.BeginDockedMoving; + + function DockDPOnMultiDock(DockList: TList; CursorPos: TPoint): Boolean; + var + MultiDock: TSpTBXCustomMultiDock; + DP: TSpTBXCustomDockablePanel; + begin + Result := False; + MultiDock := SpPtInMultiDock(CursorPos, DockList); + if Assigned(MultiDock) then begin + Result := True; + MultiDock.DoRequestDock(MultiDock, Self, Result); + end; + + if Result then begin + // Dock the DP if the cursor is over a valid dock + DP := SpPtInDP(CursorPos, MultiDock, False); + if Assigned(DP) then begin + if MultiDock.IsVertical then + DockPos := DP.EffectiveDockPos + (DP.Height) div 2 + else + DockPos := DP.EffectiveDockPos + (DP.Width) div 2; + end; + CurrentDock := MultiDock; + end + end; + + procedure MouseMoved(DockList: TList; ClientClickPos: TPoint; + OldCursor: HCURSOR; PreventDocking: Boolean; var OldCursorPos: TPoint); + var + CursorPos, Delta: TPoint; + R, TitleBarR, FloatR1, FloatR2: TRect; + MultiDock: TSpTBXCustomMultiDock; + DP: TSpTBXCustomDockablePanel; + FloatingW: Integer; + begin + GetCursorPos(CursorPos); + if (CursorPos.X = OldCursorPos.X) and (CursorPos.Y = OldCursorPos.Y) then Exit; + + SetCursor(OldCursor); + + if Docked and (CurrentDock is TSpTBXCustomMultiDock) then begin + GetWindowRect(CurrentDock.Handle, R); + if PtInRect(R, CursorPos) then begin + MultiDock := TSpTBXCustomMultiDock(CurrentDock); + DP := SpPtInDP(CursorPos, MultiDock, True); + if Assigned(DP) then begin + // The cursor is over another dockable window, swap the pos + SpDPSwapPos(MultiDock, Self, DP); + end; + end + else begin + // Change the cursor if it can't float + if DockMode = dmCanFloat then begin + // The cursor is outside the Dock, make the DP float + // Position the DP at the center of the clicked point + if FFloatingClientWidth > 0 then + FloatingW := FFloatingClientWidth + else + FloatingW := ClientAreaWidth; + FloatingPosition := Point(CursorPos.X - (FloatingW div 2), CursorPos.Y - 10); + Floating := True; + MoveOnScreen(True); + end + else begin + SetCursor(LoadCursor(0, IDC_NO)); + if DockMode = dmCannotFloat then + // The DP can't float but can be re-docked on a different MultiDock + DockDPOnMultiDock(DockList, CursorPos); + end; + end; + OldCursorPos := CursorPos; + end + else + if Floating then + if DockMode <> dmCanFloat then + SetCursor(LoadCursor(0, IDC_NO)) + else begin + // Clip the point so it doesn't get dragged under the taskbar + R := GetRectOfMonitorContainingPoint(CursorPos, True); + if CursorPos.X < R.Left then CursorPos.X := R.Left; + if CursorPos.X > R.Right then CursorPos.X := R.Right; + if CursorPos.Y < R.Top then CursorPos.Y := R.Top; + if CursorPos.Y > R.Bottom then CursorPos.Y := R.Bottom; + + // Try to dock it on a MultiDock + if not PreventDocking and DockDPOnMultiDock(DockList, CursorPos) then + OldCursorPos := CursorPos + else begin + Delta := Point(CursorPos.X - OldCursorPos.X, CursorPos.Y - OldCursorPos.Y); + + // Make sure the TitleBar is still accessible if it's dragged almost + // completely off the screen so it can be dragged back. + GetWindowRect(FToolbar.Handle, TitleBarR); + OffsetRect(TitleBarR, Delta.X, Delta.Y); + with GetFloatingBorderSize do + InflateRect(TitleBarR, -X, -Y); + if TitleBarR.Right < R.Left then Delta.X := 0; + if TitleBarR.Left > R.Right then Delta.X := 0; + if TitleBarR.Bottom < R.Top then Delta.Y := 0; + if TitleBarR.Top > R.Bottom then Delta.Y := 0; + + // Move the floating DP + GetWindowRect(Parent.Handle, FloatR1); + FloatingPosition := Point(Parent.Left + Delta.X, Parent.Top + Delta.Y); + GetWindowRect(Parent.Handle, FloatR2); + + // Don't change OldCursorPos if the floating DP wasn't moved + if not EqualRect(FloatR1, FloatR2) then begin + if FloatR1.Left <> FloatR2.Left then + OldCursorPos.X := CursorPos.X; + if FloatR1.Top <> FloatR2.Top then + OldCursorPos.Y := CursorPos.Y; + end; + end; + end; + end; + +var + L: TList; + ClientClickPos, OldCursorPos: TPoint; + OldCursor: HCURSOR; + PreventDocking: Boolean; + Msg: TMsg; +begin + L := TList.Create; + FIsDockedMoving := True; + try + OldCursor := GetCursor; // Save the original mouse cursor + + SpDPGetDockableMultiDockList(Self, L); + + SetCapture(Handle); + GetCursorPos(OldCursorPos); + ClientClickPos := ScreenToClient(OldCursorPos); + PreventDocking := GetKeyState(VK_CONTROL) < 0; + + while GetCapture = Handle do begin + case Integer(GetMessage(Msg, 0, 0, 0)) of + -1: Break; // if GetMessage failed + 0: begin + // Repost WM_QUIT messages + PostQuitMessage(Msg.WParam); + Break; + end; + end; + case Msg.Message of + WM_KEYDOWN, WM_KEYUP: + if (Msg.wParam = VK_CONTROL) and (PreventDocking <> (Msg.Message = WM_KEYDOWN)) then begin + PreventDocking := Msg.Message = WM_KEYDOWN; + MouseMoved(L, ClientClickPos, OldCursor, PreventDocking, OldCursorPos); + end + else + if Msg.wParam = VK_ESCAPE then Break; + WM_MOUSEMOVE: + MouseMoved(L, ClientClickPos, OldCursor, PreventDocking, OldCursorPos); + WM_LBUTTONDOWN, WM_LBUTTONDBLCLK: + Break; + WM_LBUTTONUP: + Break; + WM_RBUTTONDOWN..WM_MBUTTONDBLCLK: ; + else + TranslateMessage(Msg); + DispatchMessage(Msg); + end; + end; + + finally + if GetCapture = Handle then + ReleaseCapture; + FIsDockedMoving := False; + L.Free; + end; +end; + +procedure TSpTBXCustomDockablePanel.BeginSplitResizing(HitTest: Integer); + + procedure MouseMoved(DP: TSpTBXCustomDockablePanel; VerticalSplitting: Boolean; var OldCursorPos: TPoint); + var + CursorPos: TPoint; + Delta: Integer; + begin + GetCursorPos(CursorPos); + if (CursorPos.X = OldCursorPos.X) and (CursorPos.Y = OldCursorPos.Y) then Exit; + + if VerticalSplitting then begin + Delta := CursorPos.Y - OldCursorPos.Y; + if Delta = 0 then Exit; + if not SpDPResize(DP, DP.Height + Delta, dprtSplitResize) then + Exit; // Exit if it couldn't be resized + end + else begin + Delta := CursorPos.X - OldCursorPos.X; + if Delta = 0 then Exit; + if not SpDPResize(DP, DP.Width + Delta, dprtSplitResize) then + Exit; // Exit if it couldn't be resized + end; + + OldCursorPos := CursorPos; + end; + +var + M: TSpTBXCustomMultiDock; + L: TList; + VerticalSplitting: Boolean; + DockIndex: Integer; + OldCursorPos: TPoint; + Msg: TMsg; + EffectivePanel: TSpTBXCustomDockablePanel; + Form: TCustomForm; +begin + if not (CurrentDock is TSpTBXCustomMultiDock) then Exit; + M := TSpTBXCustomMultiDock(CurrentDock); + + // Get the EffectivePanel + EffectivePanel := Self; + VerticalSplitting := False; + case HitTest of + HT_DP_SPLITRESIZELEFT, HT_DP_SPLITRESIZETOP: + begin + // If we are grabbing the left or top side of the DP the + // EffectivePanel should be the previous sibling + L := TList.Create; + try + M.GetDockablePanelDockIndex(L, Self, DockIndex); + if DockIndex > 0 then + EffectivePanel := TSpTBXCustomDockablePanel(L[DockIndex - 1]); + if HitTest = HT_DP_SPLITRESIZETOP then + VerticalSplitting := True; + finally + L.Free; + end; + end; + HT_DP_SPLITRESIZEBOTTOM: VerticalSplitting := True; + HT_DP_SPLITRESIZERIGHT: VerticalSplitting := False; + end; + + try + SetCapture(Handle); + GetCursorPos(OldCursorPos); + + while GetCapture = Handle do begin + case Integer(GetMessage(Msg, 0, 0, 0)) of + -1: Break; { if GetMessage failed } + 0: begin + { Repost WM_QUIT messages } + PostQuitMessage(Msg.WParam); + Break; + end; + end; + case Msg.Message of + WM_KEYDOWN, WM_KEYUP: + if Msg.WParam = VK_ESCAPE then Break; + WM_MOUSEMOVE: + MouseMoved(EffectivePanel, VerticalSplitting, OldCursorPos); + WM_LBUTTONDOWN, WM_LBUTTONDBLCLK: + Break; + WM_LBUTTONUP: + Break; + WM_RBUTTONDOWN..WM_MBUTTONDBLCLK: ; + else + TranslateMessage(Msg); + DispatchMessage(Msg); + end; + end; + + finally + if GetCapture = Handle then + ReleaseCapture; + if csDesigning in ComponentState then begin + Form := GetParentForm(Self); + if (Form <> nil) and (Form.Designer <> nil) then + Form.Designer.Modified; + end; + end; +end; + +function TSpTBXCustomDockablePanel.CanSplitResize(EdgePosition: TTBDockPosition): Boolean; +var + M: TSpTBXCustomMultiDock; + L: TList; +begin + Result := Docked and (CurrentDock is TSpTBXCustomMultiDock) and HandleAllocated; + + if not Result then Exit; + + M := TSpTBXCustomMultiDock(CurrentDock); + + L := TList.Create; + try + M.GetDockablePanelList(L); + + if M.IsVertical then begin + case EdgePosition of + dpTop: Result := EffectiveDockPos > 0; + dpBottom: Result := L.Last <> Self; + else + Result := False; + end; + end + else begin + case EdgePosition of + dpLeft: Result := EffectiveDockPos > 0; + dpRight: Result := L.Last <> Self; + else + Result := False; + end; + end; + finally + L.Free; + end; +end; + +procedure TSpTBXCustomDockablePanel.ConstrainedResize(var MinWidth, MinHeight, + MaxWidth, MaxHeight: Integer); +var + Sz: TPoint; + M: TSpTBXCustomMultiDock; +begin + Sz := CalcNCSizes; + + if MinClientWidth > 0 then MinWidth := MinClientWidth + Sz.X; + if MinClientHeight > 0 then MinHeight := MinClientHeight + Sz.Y; + if MaxClientWidth > 0 then MaxWidth := MaxClientWidth + Sz.X; + if MaxClientHeight > 0 then MaxHeight := MaxClientHeight + Sz.Y; + + // Disallow lateral Width change when the DP is docked + if Docked and (CurrentDock is TSpTBXCustomMultiDock) then begin + M := TSpTBXCustomMultiDock(CurrentDock); + if M.IsVertical then begin + if not M.UpdatingLateralSize then + MinWidth := Width; + if FFixedDockedSize and not FIsManualSizing and not (csDesigning in ComponentState) and not M.ReadingPositionData then begin + MinHeight := Height; + MaxHeight := Height; + end; + end + else begin + if not M.UpdatingLateralSize then + MinHeight := Height; + if FFixedDockedSize and not FIsManualSizing and not (csDesigning in ComponentState) and not M.ReadingPositionData then begin + MinWidth := Width; + MaxWidth := Width; + end; + end; + end; +end; + +procedure TSpTBXCustomDockablePanel.DockDrawBackground(Sender: TObject; + ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +var + DefaultPainting: Boolean; +begin + if PaintStage = pstPrePaint then begin + PaintDefault := False; + + if Docked and not Floating then begin + // When the DP is not floating draws the CaptionBar borders on the NC area + // of the DockablePanel, see InternalDrawBackground + // Just draw 1 pixel from the left and right, and 2 pixels from the top + // ARect.Bottom should remain the same + if IsVerticalTitleBar then begin + InflateRect(ARect, 0, 1); + ARect.Left := ARect.Left - DockedBorderSize; + end + else begin + InflateRect(ARect, 1, 0); + ARect.Top := ARect.Top - DockedBorderSize; + end; + end; + + DefaultPainting := True; + DoDrawCaptionPanel(ACanvas, ARect, pstPrePaint, DefaultPainting); + if DefaultPainting then + SpDrawXPDockablePanelTitleBar(ACanvas, ARect, True, IsVerticalTitleBar); + DefaultPainting := True; + DoDrawCaptionPanel(ACanvas, ARect, pstPostPaint, DefaultPainting); + end; +end; + +procedure TSpTBXCustomDockablePanel.ToolbarDrawBackground(Sender: TObject; + ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +begin + // Let the background be painted by the Dock + if PaintStage = pstPrePaint then + PaintDefault := False; +end; + +procedure TSpTBXCustomDockablePanel.DockRequestDock(Sender: TObject; + Bar: TTBCustomDockableWindow; var Accept: Boolean); +begin + Accept := False; + if Assigned(FToolbar) then + Accept := Bar = FToolbar; +end; + +procedure TSpTBXCustomDockablePanel.DockResize(Sender: TObject); +begin + if IsVerticalTitleBar then begin + // If the Panel is left/right aligned + if FPanel.Width <> FToolbarDock.Width then begin + FPanel.Width := FToolbarDock.Width; + if Floating and Assigned(Parent) then begin + Parent.Constraints.MinWidth := FPanel.Width + GetFloatingBorderSize.X * 2; + Parent.Constraints.MinHeight := 0; + end; + end; + MinClientHeight := 0; + if not Floating and not ShowCaptionWhenDocked then + MinClientWidth := 1 + else + MinClientWidth := FPanel.Width; + end + else begin + if FPanel.Height <> FToolbarDock.Height then begin + FPanel.Height := FToolbarDock.Height; + if Floating and Assigned(Parent) then begin + Parent.Constraints.MinWidth := 0; + Parent.Constraints.MinHeight := FPanel.Height + GetFloatingBorderSize.Y * 2; + end; + end; + MinClientWidth := 0; + if not Floating and not ShowCaptionWhenDocked then + MinClientHeight := 1 + else + MinClientHeight := FPanel.Height; + end; +end; + +procedure TSpTBXCustomDockablePanel.DoDrawCaptionPanel(ACanvas: TCanvas; + ARect: TRect; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawCaptionPanel) then FOnDrawCaptionPanel(Self, ACanvas, ARect, PaintStage, PaintDefault); +end; + +procedure TSpTBXCustomDockablePanel.DoWindowStateChanged(AWindowState: TWindowState); +begin + if Assigned(FOnWindowStateChanged) then FOnWindowStateChanged(Self, AWindowState); +end; + +function TSpTBXCustomDockablePanel.GetCaptionPanelSize: TPoint; +begin + Result := Point(FPanel.Width, FPanel.Height); +end; + +procedure TSpTBXCustomDockablePanel.GetChildren(Proc: TGetChildProc; + Root: TComponent); +var + I: Integer; + C: TControl; + DesignerRootItem: TTBCustomItem; +begin + // Needed to fake the DFM streaming system because the owner of the items + // is the Form and not the Toolbar nor Self. + // But the parent must be the Toolbar. + // GetChildren is used to pass the children components of Self to the DFM + // streaming system. + // We also need to do the same with the controls of TTBControlItems. + // More info on the Delphi help or Classes.TWriter.WriteData + // Same as TSpTBXCompoundItemsControl and TSpTBXCustomDockablePanel + + DesignerRootItem := GetItems; + TTBCustomItemAccess(DesignerRootItem).GetChildren(Proc, Root); + for I := 0 to DesignerRootItem.Count - 1 do + if (DesignerRootItem[I] is TTBControlItem) then begin + C := TTBControlItem(DesignerRootItem[I]).Control; + if Assigned(C) then + if SpFindControl(Self, C) = -1 then Proc(C); + end; + inherited; +end; + +function TSpTBXCustomDockablePanel.GetImages: TCustomImageList; +begin + if Assigned(FToolbar) then + Result := FToolbar.Images + else + Result := nil; +end; + +function TSpTBXCustomDockablePanel.GetItems: TTBCustomItem; +begin + // The ToolbarEditor designer will open the editable items and + // not the Toolbar.Items + Result := Options.EditableItems; +end; + +function TSpTBXCustomDockablePanel.GetRootItems: TTBRootItem; +begin + Result := FToolbar.Items; +end; + +function TSpTBXCustomDockablePanel.GetToolbar: TSpTBXToolbar; +begin + Result := FToolbar; +end; + +function TSpTBXCustomDockablePanel.GetView: TTBToolbarView; +begin + Result := FToolbar.View; +end; + +function TSpTBXCustomDockablePanel.GetEffectiveHeight: Integer; +begin + Result := Height; +end; + +function TSpTBXCustomDockablePanel.GetEffectiveWidth: Integer; +begin + Result := Width; +end; + +function TSpTBXCustomDockablePanel.GetFloatingClientHeight: Integer; +begin + if Docked then + Result := FFloatingClientHeight + else + Result := ClientAreaHeight; +end; + +function TSpTBXCustomDockablePanel.GetFloatingClientWidth: Integer; +begin + if Docked then + Result := FFloatingClientWidth + else + Result := ClientAreaWidth; +end; + +procedure TSpTBXCustomDockablePanel.InternalDrawBackground(ACanvas: TCanvas; + ARect: TRect; PaintOnNCArea, PaintBorders: Boolean); +var + DefaultPainting: Boolean; +begin + if Color = clNone then + SpDrawXPDockablePanelBody(ACanvas, ARect, True, Floating) + else begin + ACanvas.Brush.Color := Color; + ACanvas.FillRect(ARect); + end; + + if PaintOnNCArea and FPanel.Visible then begin + // Draw the CaptionBar borders on the NC Area of the embedded Dock + // See DockDrawBackground. + // Just draw 1 pixel from the left and right, and 2 pixels from the top + // ARect.Top should remain the same + if IsVerticalTitleBar then begin + ARect.Right := ARect.Left + CaptionPanelSize.X + 2; + InflateRect(ARect, 0, -(DockedBorderSize - 1)); + end + else begin + ARect.Bottom := ARect.Top + CaptionPanelSize.Y + 2; + InflateRect(ARect, -(DockedBorderSize - 1), 0); + end; + + DefaultPainting := True; + DoDrawCaptionPanel(ACanvas, ARect, pstPrePaint, DefaultPainting); + if DefaultPainting then + SpDrawXPDockablePanelTitleBar(ACanvas, ARect, True, IsVerticalTitleBar); + DefaultPainting := True; + DoDrawCaptionPanel(ACanvas, ARect, pstPostPaint, DefaultPainting); + end; +end; + +function TSpTBXCustomDockablePanel.InternalMaximize(Restore: Boolean): Boolean; +// Resize the dockable panel to the maximum size, and minimize the rest of +// the panels +// Horizontal resizing is not supported. +var + I: Integer; + L, PrevRestoreSize: TList; + DP: TSpTBXCustomDockablePanel; + MultiDock: TSpTBXCustomMultiDock; +begin + Result := False; + if not Docked or not (CurrentDock is TSpTBXCustomMultiDock) or (CurrentDock.Position in [dpTop, dpBottom]) then Exit; + MultiDock := TSpTBXCustomMultiDock(CurrentDock); + + L := TList.Create; + PrevRestoreSize := TList.Create; + try + MultiDock.GetDockablePanelList(L); + if L.Count < 2 then Exit; + + if Restore then begin + // Restore the minimized DPs, from down-to-top + for I := L.Count - 1 downto 0 do + if L[I] <> Self then begin + DP := TSpTBXCustomDockablePanel(L[I]); + if DP.Minimized then begin + DP.FIsManualSizing := True; + if SpDPResize(DP, DP.FState.RestoreSize, dprtMinimizeOrRestore) then + PrevRestoreSize.Add(DP); + DP.FIsManualSizing := False; + end; + end; + // Now set the DockedState + for I := 0 to PrevRestoreSize.Count - 1 do begin + DP := TSpTBXCustomDockablePanel(PrevRestoreSize[I]); + DP.FState.DockedState := wsNormal; + DP.Options.SetupButtonIcon(DP.Options.MinimizeButton); + DP.Options.SetupButtonIcon(DP.Options.MaximizeButton); + end; + end + else begin + // Remember the previous Height of the DPs + for I := 0 to L.Count - 1 do begin + DP := TSpTBXCustomDockablePanel(L[I]); + PrevRestoreSize.Add(Pointer(DP.Height)); + end; + // Minimize the DPs + for I := 0 to L.Count - 1 do + if L[I] <> Self then begin + DP := TSpTBXCustomDockablePanel(L[I]); + if not DP.Minimized then begin + if not DP.Maximized then begin + DP.FState.RestoreSize := Integer(PrevRestoreSize[I]); + end; + DP.FIsManualSizing := True; + SpDPResize(DP, DP.CaptionPanelSize.Y, dprtMinimizeOrRestore); + DP.FIsManualSizing := False; + DP.FState.DockedState := wsMinimized; + DP.Options.SetupButtonIcon(DP.Options.MinimizeButton); + DP.Options.SetupButtonIcon(DP.Options.MaximizeButton); + end; + end; + end; + + Result := True; + finally + L.Free; + PrevRestoreSize.Free; + end; +end; + +procedure TSpTBXCustomDockablePanel.InvalidateBackground(InvalidateChildren: Boolean); +begin + SpInvalidateSpTBXControl(Self, True, True); +end; + +function TSpTBXCustomDockablePanel.IsResizable: Boolean; +var + R: TRect; +begin + Result := False; + if FState.DockedState <> wsMinimized then begin + R := Rect(1, 1, 0, 0); + ConstrainedResize(R.Left, R.Top, R.Right, R.Bottom); + Result := (R.Top <> R.Bottom) and (R.Left <> R.Right); + end; +end; + +function TSpTBXCustomDockablePanel.IsVerticalTitleBar: Boolean; +begin + Result := FPanel.Align in [alLeft, alRight]; +end; + +procedure TSpTBXCustomDockablePanel.DoneReadingPositionData(const Data: TTBReadPositionData); +begin + inherited; + + // Special case when it's floating and minimized force the state + if Floating and (FLoadedState = wsMinimized) then begin + FState.DockedState := FLoadedState; + Parent.ClientHeight := FPanel.Height; + end; + + // Update buttons state + FOptions.SetupButtonIcon(FOptions.MinimizeButton); + FOptions.SetupButtonIcon(FOptions.MaximizeButton); +end; + +procedure TSpTBXCustomDockablePanel.ReadPositionData(const Data: TTBReadPositionData); +begin + inherited; + + // Load FLoadedBarSize and FLoadedDockPos + FLoadedBarSize.cx := ClientAreaWidth; + FLoadedBarSize.cy := ClientAreaHeight; + FLoadedDockPos := DockPos; + + // Load FloatingClientWidth/FloatingClientHeight, RestoreSize, State + with Data do begin + FFloatingClientWidth := ReadIntProc(Name, rvFloatingClientWidth, 0, ExtraData); + FFloatingClientHeight := ReadIntProc(Name, rvFloatingClientHeight, 0, ExtraData); + FState.RestoreSize := ReadIntProc(Name, rvRestoreSize, 0, ExtraData); + FState.DockedState := TWindowState(ReadIntProc(Name, rvState, 0, ExtraData)); + FLoadedState := FState.DockedState; + end; +end; + +procedure TSpTBXCustomDockablePanel.WritePositionData(const Data: TTBWritePositionData); +begin + inherited; + + // Save FloatingClientWidth/FloatingClientHeight, RestoreSize, State + with Data do begin + WriteIntProc(Name, rvFloatingClientWidth, FFloatingClientWidth, ExtraData); + WriteIntProc(Name, rvFloatingClientHeight, FFloatingClientHeight, ExtraData); + WriteIntProc(Name, rvRestoreSize, FState.RestoreSize, ExtraData); + WriteIntProc(Name, rvState, Integer(FState.DockedState), ExtraData); + end; +end; + +procedure TSpTBXCustomDockablePanel.SetDefaultDockedSize(Value: Integer); +begin + if FDefaultDockedSize <> Value then + FDefaultDockedSize := Value; +end; + +procedure TSpTBXCustomDockablePanel.SetEffectiveHeight(const Value: Integer); +begin + if Docked and IsVertical and (CurrentDock is TSpTBXCustomMultiDock) then + SpDPResize(Self, Value) + else + Height := Value; +end; + +procedure TSpTBXCustomDockablePanel.SetEffectiveWidth(const Value: Integer); +begin + if Docked and not IsVertical and (CurrentDock is TSpTBXCustomMultiDock) then + SpDPResize(Self, Value) + else + Width := Value; +end; + +procedure TSpTBXCustomDockablePanel.SetFloatingClientHeight(const Value: Integer); +begin + if Docked then + FFloatingClientHeight := Value + else + ClientAreaHeight := Value; +end; + +procedure TSpTBXCustomDockablePanel.SetFloatingClientWidth(const Value: Integer); +begin + if Docked then + FFloatingClientWidth := Value + else + ClientAreaWidth := Value; +end; + +procedure TSpTBXCustomDockablePanel.SetImages(const Value: TCustomImageList); +begin + if Assigned(FToolbar) then + FToolbar.Images := Value; +end; + +procedure TSpTBXCustomDockablePanel.SetParent(AParent: TWinControl); +var + ToDock, ToFloating, ToEmptyMultiDock, WasMinimized, DockingByCode: 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; + DockingByCode := DockPos < 0; + + 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 width 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 begin + if not Docked then // If it's not docked compute the borders + EffectiveWidth := D.ClientWidth - (DockedBorderSize * 2) + else + EffectiveWidth := D.ClientWidth; + // Append the DP to the bottom if it's being docked by code + if DockingByCode then begin + DockPos := D.ClientHeight; + TSpTBXCustomMultiDock(D).UpdateDockablePanelsDockPos; + end; + end; + end + else begin + if ToEmptyMultiDock then begin + if FDefaultDockedSize > 0 then EffectiveHeight := FDefaultDockedSize; + end + else begin + if not Docked then // If it's not docked compute the borders + EffectiveHeight := D.ClientHeight - (DockedBorderSize * 2) + else + EffectiveHeight := D.ClientHeight; + // Append the DP to the bottom if it's being docked by code + if DockingByCode then begin + DockPos := D.ClientWidth; + TSpTBXCustomMultiDock(D).UpdateDockablePanelsDockPos; + end; + end; + end; + end; + end; + + inherited; + + if ToEmptyMultiDock then + TSpTBXMultiDock(AParent).InsertingOnEmptyDock // Re-align adjacent splitter + else + if ToDock and DockingByCode then begin + D := TTBDock(AParent); + if D is TSpTBXCustomMultiDock then + if D.Position in [dpLeft, dpRight] then + SpDPResize(Self, PrevSize.cy, dprtAppendResize) + else + SpDPResize(Self, PrevSize.cx, dprtAppendResize); + end + else + if ToFloating then begin + // [DockablePanel-Rule] + // Remember the previous floating size + if FFloatingClientWidth > 0 then + ClientAreaWidth := FFloatingClientWidth + else + ClientAreaWidth := PrevSize.cx; + if FFloatingClientHeight > 0 then + ClientAreaHeight := FFloatingClientHeight + else + // [DockablePanel-Rule] + // If the previous floating size is not valid and the DP was minimized + // when it was undocked then use the Restore size. + if WasMinimized then + ClientAreaHeight := FState.RestoreSize + else + ClientAreaHeight := PrevSize.cy; + + if Assigned(Parent) and (Parent is TSpTBXFloatingWindowParent) then begin + Parent.Constraints.MinHeight := FPanel.Height + GetFloatingBorderSize.Y * 2; + TSpTBXFloatingWindowParent(Parent).CloseOnAltF4 := True; + end; + end; + + UpdateTitleBarRotation; // Update the rotation of the titlebar + end + else + inherited; +end; + +procedure TSpTBXCustomDockablePanel.SetShowCaption(const Value: Boolean); +begin + if FShowCaption <> Value then begin + FShowCaption := Value; + if not Docked then begin + FPanel.Visible := Value; + RedrawWindow(Parent.Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN or RDW_FRAME); + end; + end; +end; + +procedure TSpTBXCustomDockablePanel.SetShowCaptionWhenDocked(const Value: Boolean); +begin + if FShowCaptionWhenDocked <> Value then begin + FShowCaptionWhenDocked := Value; + if not Floating then begin + FPanel.Visible := Value; + DockResize(nil); // Resize and update MinClientWidth/Height + // 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/internal/2.4.4/1/Source/SpTBXEditors.pas b/internal/2.4.4/1/Source/SpTBXEditors.pas new file mode 100644 index 0000000..e4acbb3 --- /dev/null +++ b/internal/2.4.4/1/Source/SpTBXEditors.pas @@ -0,0 +1,3769 @@ +unit SpTBXEditors; + +{============================================================================== +Version 2.4.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: +2 December 2009 - version 2.4.4 + - Fixed flicker on TSpTBXComboBox when changing the font, + thanks to Simon H. for reporting this. + +13 September 2009 - version 2.4.3 + - Fixed incorrect TSpTBXComboBox painting, when the Style + is set to csDropDownList and the control is disabled the + text is not painted with csGrayText. This is a VCL bug + the same happens with TComboBox when you set it to + csDropDownFixed (TSpTBXComboBox uses csDropDownFixed + instead of csDropDownList). + Thanks to Arvid for reporting this. + - Fixed incorrect TSpTBXSpinEdit behavior, when the focus + was changed the text wasn't validated, thanks to Stephan + for reporting this. + - Fixed incorrect caret positioning on TSpTBXSpinEdit when + using a Postfix, thanks to Eric Rappsilber for reporting + this. + +8 May 2009 - version 2.4.2 + - Added AutoDropDownWidth property to TSpTBXComboBox, use + this to automatically calculate the DropDown window + size. + - Changed params of OnDrawItem and OnDrawItemBackground events + from TSpTBXComboBox. + +15 March 2009 - version 2.4.1 + - Added HasEditButton public method to TSpTBXEdit. + - Added GetDropDownButtonRect public method to TSpTBXComboBox. + - Fixed TSpTBXEdit frame flicker, thanks to Marc Hoffmann for + reporting this. + - Fixed incorrect TSpTBXEdit frame painting when the edit was + placed on a Toolbar, thanks to Alfred Vink for reporting this. + - Fixed incorrect TSpTBXListBox painting when OnDrawItem event + was used, thanks to Evgeny Efimov for reporting this. + +17 January 2009 - version 2.4 + - Added AutoItemHeight property to TSpTBXComboBox, use this + to automatically calculate the ItemHeight property when the + Style is csDropDown, csDropDownList or csSimple. + +26 September 2008 - version 2.3 + - Added skinning support to TSpTBXComboBox items. + - Fixed incorrect TSpTBXEditItem OnChange event handling, + the event was only fired if the text property was changed, + thanks to Anta for reporting this. + - Added hack to automatically adjust the ItemHeight based on + the ComboBox font size. Delphi doesn't do this when the + ComboBox is owner drawed. + +29 July 2008 - version 2.2 + - Fixed incorrect TSpTBXEditItem size when the item is on + a menu, thanks to David for reporting it. + +26 June 2008 - version 2.1 + - Added EditImageIndex property to TSpTBXEditItem and + TSpTBXSpinEditItem, use this to show an icon image + on the left of the EditCaption when the item is on a menu. + +3 May 2008 - version 2.0 + - No changes. + +2 April 2008 - version 1.9.5 + - Added ExtendedAccept property to TSpTBXSpinEditor. + - Fixed incorrect TSpTBXSpinEditor.ValueInc/ValueDec behavior + when ValueSnap was true and Increment was a fraction, thanks + to John for reporting this. + +3 Febrary 2008 - version 1.9.4 + - Fixed incorrect TSpTBXSpinEditor.ValueInc/ValueDec behavior + when ValueSnap was true and Increment was higher than + 10000, thanks to Yucel for reporting this. + +19 January 2008 - version 1.9.3 + - Fixed incorrect TSpTBXComboBox painting on Windows Vista, + thanks to Santiago Vila for reporting this. + +26 December 2007 - version 1.9.2 + - Fixed incorrect TSpTBXSpinEdit font behavior, when the font + was changed at runtime the edit rect was not updated, thanks + to Beta Xiong for reporting this. + +1 December 2007 - version 1.9.1 + - Fixed incorrect TSpTBXEditButton painting, when the caption + was empty and DropDownMenu was assigned 2 arrows were painted + instead of 1, thanks to Costas Stergiou for reporting this. + +20 November 2007 - version 1.9 + - Removed TBX dependency. + +20 April 2007 - version 1.8.4 + - Added CustomWidth and CustomHeight properties to the toolbar + editor items. + - Fixed incorrect TSpTBXEditItem.StartEditing behavior, + thanks to Daniel Rikowski for reporting this. + +8 February 2007 - version 1.8.3 + - Fixed incorrect OnChange event handling in TSpTBXEditItem, + thanks to Daniel Rikowski for reporting this. + +17 December 2006 - version 1.8.2 + - Fixed a BDS 2006 bug related to Comboboxes, CM_MOUSEENTER and + CM_MOUSELEAVE are fired everytime the mouse is moved over the + internal edit control. In D7 these messages were only fired when + the mouse entered or leaved the combobox. + +24 November 2006 - version 1.8.1 + - Fixed incorrect TSpTBXSpinEdit behavior, the Value was not updated + when the control was unfocused, thanks to Steve and Sebastian for + reporting this. + +27 August 2006 - version 1.8 + - Improved editor's button painting. + +15 June 2006 - version 1.7 + - Fixed edit items incorrect painting, the items were not painted + using the color of FontSettings and EditorFontSettings properties, + the same happens with the TBX items. + +4 May 2006 - version 1.6 + - No changes. + +12 April 2006 - version 1.5 + - Added ValueType, ValueAsInteger, Decimals, Prefix and Postfix + properties to TSpTBXSpinEdit, thanks to Maxim Rylov for his + code donation. + - Fixed TSpTBXSpinEdit painting. + +27 February 2006 - version 1.4 + - New component added, TSpTBXSpinEdit: a SpinEdit control + that has TBX themes support. + - Fixed TSpTBXComboBoxItem bug, when AutoComplete is set to + false the ComboBox still autocompletes the text, thanks to + Erwin Denissen for reporting this. + - Fixed Delphi 2005/2006 bug, CM_MOUSEENTER and CM_MOUSELEAVE + are fired everytime the mouse enters the combobox internal + edit control. In prior versions of Delphi these messages + were only fired when the mouse entered or leaved the combobox, + including the internal edit control. + +10 February 2006 - version 1.3 + - New component added, TSpTBXButtonEdit: an Edit control that + has a multipurpose button attached. + - Added new public method, AddEditButton, to TSpTBXEdit. + +28 December 2005 - version 1.2 + - No changes. + +18 October 2005 - version 1.1 + - New component added, TSpTBXListBox: a ListBox + with Unicode and TBX themes support that paints + a hottrack border and TBX theme style selection. + - New component added, TSpTBXCheckListBox: a CheckListBox + with Unicode and TBX themes support that paints + a hottrack border and TBX theme style selection. + - Fixed TSpTBXComboBoxItem dynamic creation problem. + +18 August 2005 - version 1.0 + - No changes. + +10 June 2005 - version 0.9 + - SpTBXLib may now alternatively, at your option, be used and/or + distributed under the terms of the SpTBXLib License. + Please see the updated LICENSE.TXT file for more information. + +20 May 2005 - version 0.8 + - Fixed TSpTBXDropDownItem and TSpTBXComboBoxItem bugs, the popup list + should be closed when F4 is pressed, thanks to Rune Moberg for + reporting this. + - Fixed TSpTBXComboBoxItem bug, the ComboBox didn't check the ItemIndex + bounds when pressing Up or Down keys, thanks to Rune Moberg for + reporting this. + - Fixed AV when trying to dock a toolbar with a TSpTBXComboBoxItem + on a vertical dock, thanks to Pavel for reporting this. + +16 February 2005 - version 0.7 + - Fixed unicode support in W9x, thanks to Daniel Rikowski for + reporting this. + - Fixed editors bug, the editors autocomplete was case sensitive, + this is a TBX bug but it was fixed without patching the source, + thanks to Daniel Rikowski for reporting this. + - Fixed TSpTBXComboBox painting bug, the edit frame was not + correctly highlighted when using the Default theme. + - Added HotTrack property to TSpTBXEdit and TSpTBXComboBox, when + setted to true a TBX style frame will be painted when the mouse + is over the control. + - Added OnDrawBackground event to TSpTBXEdit and TSpTBXComboBox. + +23 December 2004 - version 0.6 + - Initial release. + +==============================================================================} + +interface + +{$BOOLEVAL OFF} // Unit depends on short-circuit boolean evaluation + +uses + Windows, Messages, Classes, SysUtils, Controls, Graphics, ImgList, Forms, + Menus, StdCtrls, ExtCtrls, ActnList, CheckLst, + {$IFNDEF UNICODE} + TntClasses, TntControls, TntStdCtrls, TntCheckLst, TntSysUtils, + {$ENDIF} + TB2Toolbar, TB2Item, TB2ExtItems, + SpTBXSkins, SpTBXItem, SpTBXControls; + +{$IFDEF UNICODE} +type + TTntComboBox = TComboBox; + TTntListBox = TListBox; + TTntCheckListBox = TCheckListBox; +{$ENDIF} + +const + CM_SPFONTCHANGED = CM_BASE + 2221; // Message sent to the control when the font is changed + + { Change reasons for EditItem.Text property } + tcrSetProperty = 0; // direct assignment to Text property + tcrActionLink = 1; // change comes from an action link + tcrEditControl = 2; // change is caused by typing in edit area + +type + TSpTBXSpinType = ( + spnInteger, + spnFloat, + spnHex + ); + + TSpTBXEditItemViewer = class; + TSpTBXSpinEditViewer = class; + + TSpTBXEditChangeEvent = procedure(Sender: TObject; const AText: WideString) of object; + TSpTBXEditAcceptTextEvent = procedure(Sender: TObject; var NewText: WideString; var Accept: Boolean) of object; + TSpTBXEditGetTextEvent = procedure(Sender: TObject; var AText: WideString) of object; + TSpTBXBeginEditEvent = procedure(Sender: TObject; Viewer: TSpTBXEditItemViewer; EditControl: TCustomEdit) of object; + TSpTBXEditMessageEvent = procedure(Sender: TObject; Viewer: TSpTBXEditItemViewer; var Message: TMessage; var Handled: Boolean) of object; + TSpTBXDrawListItemEvent = procedure(Sender: TObject; ACanvas: TCanvas; var ARect: TRect; Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean) of object; + + { TSpTBXEditButton } + + TSpTBXEditButton = class(TSpTBXSpeedButton) + protected + procedure AdjustFont(AFont: TFont); override; + function DoDrawDropDownArrow(ACanvas: TCanvas; ARect: TRect): Boolean; override; + function DoDrawItem(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage): Boolean; override; + function GetFrameHotTrack: Boolean; + public + constructor Create(AOwner: TComponent); override; + procedure Click; override; + end; + + { TSpTBXSpinButton } + + TSpTBXSpinButton = class(TSpTBXEditButton) + private + FUpPushed: Boolean; + FDownPushed: Boolean; + FOnUpClick: TNotifyEvent; + FOnDownClick: TNotifyEvent; + protected + function DoDrawItem(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage): Boolean; override; + procedure DoMouseLeave; override; + procedure MouseMove(Shift: TShiftState; X: Integer; Y: Integer); override; + procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); override; + property OnUpClick: TNotifyEvent read FOnUpClick write FOnUpClick; + property OnDownClick: TNotifyEvent read FOnDownClick write FOnDownClick; + public + constructor Create(AOwner: TComponent); override; + procedure Click; override; + procedure IsHotTracking(out UpButton, DownButton, EditFrame: Boolean); + published + property Repeating default True; + end; + + { TSpTBXUnicodeAdaptEdit } + + // Do not inherit from TTNTEdit, TBEditItemViewer.GetEditControlClass needs a TEditClass + {$IFNDEF UNICODE} + TSpTBXUnicodeAdaptEdit = class(TEdit) + private + FPasswordChar: WideChar; + procedure SetSelText(const Value: WideString); + function GetText: WideString; + procedure SetText(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsHintStored: Boolean; + function GetPasswordChar: WideChar; + procedure SetPasswordChar(const Value: WideChar); + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure CreateWnd; override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + function GetSelStart: Integer; reintroduce; virtual; + procedure SetSelStart(const Value: Integer); reintroduce; virtual; + function GetSelLength: Integer; reintroduce; virtual; + procedure SetSelLength(const Value: Integer); reintroduce; virtual; + function GetSelText: WideString; reintroduce; virtual; + public + property SelText: WideString read GetSelText write SetSelText; + property SelStart: Integer read GetSelStart write SetSelStart; + property SelLength: Integer read GetSelLength write SetSelLength; + published + // Don't let the streaming system store the WideStrings, use DefineProperties instead + property Text: WideString read GetText write SetText; + property Hint: WideString read GetHint write SetHint stored IsHintStored; + property PasswordChar: WideChar read GetPasswordChar write SetPasswordChar default #0; + end; + {$ELSE} + TSpTBXUnicodeAdaptEdit = class(TEdit); + {$ENDIF} + + { TSpTBXUnicodeEdit } + + TSpTBXUnicodeEdit = class(TSpTBXUnicodeAdaptEdit) + private + FAlignment: TAlignment; + procedure SetAlignment(Value: TAlignment); + procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED; + procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED; + protected + procedure CreateWnd; override; + procedure CreateParams(var Params: TCreateParams); override; + procedure UpdateEditRect; virtual; + public + function AddEditButton(RightAligned: Boolean = True; AWidth: Integer = -1): TSpTBXEditButton; + function HasEditButton: Boolean; + published + property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify; + end; + + { TSpTBXEdit } + + TSpTBXEdit = class(TSpTBXUnicodeEdit) + private + FBorderStyle: TBorderStyle; + FHotTrack: Boolean; + FSkinType: TSpTBXSkinType; + FMouseInControl: Boolean; + procedure SetBorderStyle(const Value: TBorderStyle); + procedure SetSkinType(const Value: TSpTBXSkinType); + procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED; + procedure CMEnter(var Message: TCMEnter); message CM_ENTER; + procedure CMExit(var Message: TCMExit); message CM_EXIT; + procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; + procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; + procedure WMNCPaint(var Message: TWMNCPaint); message WM_NCPAINT; + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure InvalidateFrame; + property MouseInControl: Boolean read FMouseInControl; + published + property BorderStyle: TBorderStyle read FBorderStyle write SetBorderStyle default bsSingle; // Hides the inherited BorderStyle + property HotTrack: Boolean read FHotTrack write FHotTrack default True; + property SkinType: TSpTBXSkinType read FSkinType write SetSkinType default sknSkin; + end; + + { TSpTBXButtonEdit } + + TSpTBXCustomButtonEdit = class(TSpTBXEdit) + private + FEditButton: TSpTBXEditButton; + protected + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure SetName(const Value: TComponentName); override; + property EditButton: TSpTBXEditButton read FEditButton; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + end; + + TSpTBXButtonEdit = class(TSpTBXCustomButtonEdit) + published + property EditButton; + end; + + { TSpTBXSpinEdit } + + TSpTBXSpinEditOptions = class(TPersistent) + private + FDecimal: Integer; + FIncrement: Extended; + FMinValue: Extended; + FMaxValue: Extended; + FValue: Extended; + FValueSnap: Boolean; + FValueType: TSpTBXSpinType; + FPrefix: WideString; + FPostfix: WideString; + FOnGetText: TSpTBXEditAcceptTextEvent; + FOnSetText: TSpTBXEditChangeEvent; + FOnValueChanged: TNotifyEvent; + function IsIncrementStored: Boolean; + function IsMaxValueStored: Boolean; + function IsMinValueStored: Boolean; + function IsValueStored: Boolean; + procedure SetDecimal(NewDecimal: Integer); + procedure SetMaxValue(const NewValue: Extended); + procedure SetMinValue(const NewValue: Extended); + procedure SetValue(const NewValue: Extended); + procedure SetValueType(NewType: TSpTBXSpinType); + procedure SetPostfix(const ValueString: WideString); + procedure SetPrefix(const ValueString: WideString); + function GetValueAsInteger: Int64; + procedure SetValueAsInteger(const NewValue: Int64); + protected + procedure DoValueChanged; virtual; + procedure UpdateTextFromValue; + procedure UpdateValueFromText(RevertWhenInvalid: Boolean = True); + property OnGetText: TSpTBXEditAcceptTextEvent read FOnGetText write FOnGetText; + property OnSetText: TSpTBXEditChangeEvent read FOnSetText write FOnSetText; + property OnValueChanged: TNotifyEvent read FOnValueChanged write FOnValueChanged; + public + constructor Create; virtual; + procedure ValueInc; + procedure ValueDec; + property ValueAsInteger: Int64 read GetValueAsInteger write SetValueAsInteger; + published + property Decimal: Integer read FDecimal write SetDecimal default 2; + property Increment: Extended read FIncrement write FIncrement stored IsIncrementStored; + property MaxValue: Extended read FMaxValue write SetMaxValue stored IsMaxValueStored; + property MinValue: Extended read FMinValue write SetMinValue stored IsMinValueStored; + property Postfix: WideString read FPostfix write SetPostfix; + property Prefix: WideString read FPrefix write SetPrefix; + property Value: Extended read FValue write SetValue stored IsValueStored; + property ValueSnap: Boolean read FValueSnap write FValueSnap default True; + property ValueType: TSpTBXSpinType read FValueType write SetValueType default spnInteger; + end; + + TSpTBXSpinEdit = class(TSpTBXEdit) + private + FExtendedAccept: Boolean; + FSpinButton: TSpTBXSpinButton; + FSpinOptions: TSpTBXSpinEditOptions; + procedure SpinOptionsGetText(Sender: TObject; var NewText: WideString; var Accept: Boolean); + procedure SpinOptionsSetText(Sender: TObject; const AText: WideString); + function GetValue: Extended; + function GetValueChanged: TNotifyEvent; + procedure SetValue(const Value: Extended); + procedure SetValueChanged(const ValueChangedEvent: TNotifyEvent); + procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS; + protected + procedure Change; override; + procedure KeyDown(var Key: Word; Shift: TShiftState); override; + procedure KeyPress(var Key: Char); override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure UpClick(Sender: TObject); virtual; + procedure DownClick(Sender: TObject); virtual; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + published + property Alignment default taRightJustify; + property ExtendedAccept: Boolean read FExtendedAccept write FExtendedAccept default False; + property Text stored False; + property SpinButton: TSpTBXSpinButton read FSpinButton; + property SpinOptions: TSpTBXSpinEditOptions read FSpinOptions write FSpinOptions; + property Value: Extended read GetValue write SetValue stored False; + property OnValueChanged: TNotifyEvent read GetValueChanged write SetValueChanged; + end; + + { TSpTBXComboBox } + + TSpTBXComboBox = class(TTntComboBox) + private + FAutoDropDownWidth: Boolean; + FAutoItemHeight: Boolean; + FFontChanging: Boolean; + FHotTrack: Boolean; + FInternalItemHeight: Integer; + FMouseInControl: Boolean; + FMouseInDropDownButton: Boolean; + FMouseTimer: TTimer; + FSkinType: TSpTBXSkinType; + FOnDrawBackground: TSpTBXDrawEvent; + FOnDrawItem: TSpTBXDrawListItemEvent; + FOnDrawItemBackground: TSpTBXDrawListItemEvent; + procedure MouseTimerHandler(Sender: TObject); + procedure SetSkinType(const Value: TSpTBXSkinType); + procedure UpdateDropDownButton; + procedure CMEnter(var Message: TCMEnter); message CM_ENTER; + procedure CMExit(var Message: TCMExit); message CM_EXIT; + procedure CNMeasureItem(var Message: TWMMeasureItem); message CN_MEASUREITEM; + procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; + procedure CMSPFontChanged(var Message: TMessage); message CM_SPFONTCHANGED; + procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM; + procedure WMMouseMove(var Message: TWMMouseMove); message WM_MOUSEMOVE; + procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE; + procedure WMPaint(var Message: TWMPaint); message WM_PAINT; + procedure WMSetFont(var Message: TWMSetFont); message WM_SETFONT; + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + protected + FAutoDropDownWidthRightMargin: Integer; + procedure CreateParams(var Params: TCreateParams); override; + procedure CreateWnd; override; + procedure CloseUp; override; + procedure DoCalcMaxDropDownWidth; virtual; + procedure DoDrawBackground(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + procedure DoDrawItem(ACanvas: TCanvas; var ARect: TRect; Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + procedure DoDrawItemBackground(ACanvas: TCanvas; var ARect: TRect; Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); override; + procedure DrawItemBackground(Index: Integer; Rect: TRect; State: TOwnerDrawState); virtual; + {$IF CompilerVersion > 17} + procedure EditWndProc(var Message: TMessage); override; + {$IFEND} + function GetItemHt: Integer; override; + procedure SetItemHeight(Value: Integer); override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + function GetDropDownButtonRect: TRect; + function GetMouseInDropDownButton: Boolean; + procedure InvalidateFrame; + property MouseInControl: Boolean read FMouseInControl; + published + property AutoDropDownWidth: Boolean read FAutoDropDownWidth write FAutoDropDownWidth default False; + property AutoItemHeight: Boolean read FAutoItemHeight write FAutoItemHeight default True; + property HotTrack: Boolean read FHotTrack write FHotTrack default True; + property SkinType: TSpTBXSkinType read FSkinType write SetSkinType default sknSkin; + property OnDrawBackground: TSpTBXDrawEvent read FOnDrawBackground write FOnDrawBackground; + property OnDrawItem: TSpTBXDrawListItemEvent read FOnDrawItem write FOnDrawItem; // Hides the inherited OnDrawItem + property OnDrawItemBackground: TSpTBXDrawListItemEvent read FOnDrawItemBackground write FOnDrawItemBackground; + property OnMouseMove; + end; + + { TSpTBXListBox } + + TSpTBXListBox = class(TTntListBox) + private + FHotTracking: Boolean; + FHotTrack: Boolean; + FSkinType: TSpTBXSkinType; + FChildFocused: Boolean; + FOnDrawItem: TSpTBXDrawListItemEvent; + FOnDrawItemBackground: TSpTBXDrawListItemEvent; + procedure SetHotTrack(const Value: Boolean); + procedure SetSkinType(const Value: TSpTBXSkinType); + procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; + procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; + procedure CMFocusChanged(var Message: TCMFocusChanged); message CM_FOCUSCHANGED; + procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM; + procedure WMNCPaint(var Message: TWMNCPaint); message WM_NCPAINT; + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + protected + procedure CreateParams(var Params: TCreateParams); override; + procedure DoDrawItem(ACanvas: TCanvas; var ARect: TRect; Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + procedure DoDrawItemBackground(ACanvas: TCanvas; var ARect: TRect; Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); override; + procedure DrawItemBackground(Index: Integer; Rect: TRect; State: TOwnerDrawState); virtual; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure InvalidateBorders; + property HotTracking: Boolean read FHotTracking; + published + property Style default lbOwnerDrawFixed; + property HotTrack: Boolean read FHotTrack write SetHotTrack default True; + property SkinType: TSpTBXSkinType read FSkinType write SetSkinType default sknSkin; + property OnDrawItem: TSpTBXDrawListItemEvent read FOnDrawItem write FOnDrawItem; // Hides the inherited OnDrawItem + property OnDrawItemBackground: TSpTBXDrawListItemEvent read FOnDrawItemBackground write FOnDrawItemBackground; + end; + + { TSpTBXCheckListBox } + + TSpTBXCheckListBox = class(TTntCheckListBox) + private + FHotTracking: Boolean; + FHotTrack: Boolean; + FSkinType: TSpTBXSkinType; + FChildFocused: Boolean; + FOnDrawItem: TSpTBXDrawListItemEvent; + FOnDrawItemBackground: TSpTBXDrawListItemEvent; + procedure SetHotTrack(const Value: Boolean); + procedure SetSkinType(const Value: TSpTBXSkinType); + procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; + procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; + procedure CMFocusChanged(var Message: TCMFocusChanged); message CM_FOCUSCHANGED; + procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM; + procedure WMNCPaint(var Message: TWMNCPaint); message WM_NCPAINT; + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + protected + procedure DoDrawItem(ACanvas: TCanvas; var ARect: TRect; Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + procedure DoDrawItemBackground(ACanvas: TCanvas; var ARect: TRect; Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); override; + procedure DrawItemBackground(Index: Integer; Rect: TRect; State: TOwnerDrawState); virtual; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure InvalidateBorders; + property HotTracking: Boolean read FHotTracking; + published + property Style default lbOwnerDrawFixed; + property HotTrack: Boolean read FHotTrack write SetHotTrack default True; + property SkinType: TSpTBXSkinType read FSkinType write SetSkinType default sknSkin; + property OnDrawItem: TSpTBXDrawListItemEvent read FOnDrawItem write FOnDrawItem; + property OnDrawItemBackground: TSpTBXDrawListItemEvent read FOnDrawItemBackground write FOnDrawItemBackground; + end; + + { TSpTBXEditItem } + + TSpTBXEditItem = class(TSpTBXCustomItem) + private + FEditCaption: WideString; + FEditImageIndex: TImageIndex; + FText: WideString; + FAllowVerticalEditor: Boolean; + FCharCase: TEditCharCase; + FEditorFontSettings: TSpTBXFontSettings; + FExtendedAccept: Boolean; + FFontSettings: TSpTBXFontSettings; + FMaxLength: Integer; + FPasswordChar: WideChar; + FReadOnly: Boolean; + FShowImage: Boolean; + FOnAcceptText: TSpTBXEditAcceptTextEvent; + FOnBeginEdit: TSpTBXBeginEditEvent; + FOnChange: TSpTBXEditChangeEvent; + FOnEditMessage: TSpTBXEditMessageEvent; + procedure FontSettingsChanged(Sender: TObject); + procedure SetAllowVerticalEditor(const Value: Boolean); + procedure SetCharCase(Value: TEditCharCase); + procedure SetEditCaption(const Value: WideString); + procedure SetEditorFontSettings(const Value: TSpTBXFontSettings); + procedure SetMaxLength(Value: Integer); + procedure SetPasswordChar(Value: WideChar); + procedure SetShowImage(const Value: Boolean); + procedure SetText(Value: WideString); + protected + function DoAcceptText(var NewText: WideString): Boolean; virtual; + function DoAutoComplete(var AText: WideString): Boolean; virtual; + procedure DoBeginEdit(Viewer: TSpTBXEditItemViewer); virtual; + procedure DoChange(const AText: WideString); virtual; + procedure DoTextChanging(const OldText: WideString; var NewText: WideString; Reason: Integer); virtual; + function GetItemViewerClass(AView: TTBView): TTBItemViewerClass; override; + function NeedToRecreateViewer(AViewer: TTBItemViewer): Boolean; override; + procedure SetTextEx(Value: WideString; Reason: Integer); virtual; + public + function StartEditing(AView: TTBView): Boolean; + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + published + // TSpTBXCustomItem properties + property Action; + property Alignment default taLeftJustify; + property Caption; + property CustomWidth default 64; + property CustomHeight; + property DisplayMode; + property Enabled; + property FontSettings; + property GroupIndex; + property HelpContext; + property Hint; + property ImageIndex; + property Images; + property ShortCut; + property Visible; + property OnClick; + property OnDrawCaption; + property OnDrawHint; + property OnDrawImage; + property OnDrawItem; + property OnSelect; + + // Don't let the streaming system store the WideStrings, use DefineProperties instead + property EditCaption: WideString read FEditCaption write SetEditCaption; // Hides the inherited EditCaption + property EditImageIndex: TImageIndex read FEditImageIndex write FEditImageIndex default -1; + property Text: WideString read FText write SetText; // Hides the inherited Text + property AllowVerticalEditor: Boolean read FAllowVerticalEditor write SetAllowVerticalEditor default False; + property CharCase: TEditCharCase read FCharCase write SetCharCase default ecNormal; + property EditorFontSettings: TSpTBXFontSettings read FEditorFontSettings write SetEditorFontSettings; + property ExtendedAccept: Boolean read FExtendedAccept write FExtendedAccept default False; + property MaxLength: Integer read FMaxLength write SetMaxLength default 0; + property PasswordChar: WideChar read FPasswordChar write SetPasswordChar default #0; + property ReadOnly: Boolean read FReadOnly write FReadOnly default False; + property ShowImage: Boolean read FShowImage write SetShowImage default False; + property OnAcceptText: TSpTBXEditAcceptTextEvent read FOnAcceptText write FOnAcceptText; // Hides the inherited OnAcceptText + property OnBeginEdit: TSpTBXBeginEditEvent read FOnBeginEdit write FOnBeginEdit; + property OnChange: TSpTBXEditChangeEvent read FOnChange write FOnChange; + property OnEditMessage: TSpTBXEditMessageEvent read FOnEditMessage write FOnEditMessage; + end; + + TEditClass = class of TCustomEdit; + + TSpTBXEditItemViewer = class(TSpTBXItemViewer) + private + function EditLoop(const CapHandle: HWND): Boolean; + procedure EditWndProc(var Message: TMessage); + function GetEditControlText: WideString; + procedure GetEditHeight(const DC: HDC; out EditHeight, ExternalLeading: Integer); + function GetItem: TSpTBXEditItem; + procedure MouseBeginEdit; + function MeasureEditCaption: TSize; + function MeasureTextHeight: Integer; + protected + FEditControl: TCustomEdit; + FEditControlStatus: set of (ecsContinueLoop, ecsAccept, ecsClose); + procedure CalcSize(const Canvas: TCanvas; var AWidth, AHeight: Integer); override; + function CaptionShown: Boolean; override; + procedure DoBeginEdit; virtual; + function DoExecute: Boolean; override; + function HandleEditMessage(var Message: TMessage): Boolean; virtual; + function GetAccRole: Integer; override; + function GetAccValue(var Value: WideString): Boolean; override; + procedure GetCursor(const Pt: TPoint; var ACursor: HCURSOR); override; + function GetEditControlClass: TEditClass; virtual; + procedure GetEditRect(var R: TRect); virtual; + function GetImageShown: Boolean; override; + function GetIndentBefore: Integer; virtual; + function GetIndentAfter: Integer; virtual; + procedure InternalDrawFrame(ACanvas: TCanvas; ARect: TRect; ItemInfo: TSpTBXMenuItemInfo); virtual; + procedure InternalEditControlChange(Sender: TObject); virtual; + procedure InternalEditControlExit; virtual; + procedure MouseDown(Shift: TShiftState; X, Y: Integer; var MouseDownOnMenu: Boolean); override; + procedure MouseUp(X, Y: Integer; MouseWasDownOnMenu: Boolean); override; + procedure Paint(const Canvas: TCanvas; const ClientAreaRect: TRect; IsSelected, IsPushed, UseDisabledShadow: Boolean); override; + + function ShowImage: Boolean; virtual; + function UsesSameWidth: Boolean; override; + public + function GetCaptionText: WideString; override; + property EditControl: TCustomEdit read FEditControl; + property Item: TSpTBXEditItem read GetItem; // Hides the inherited TB2K Item property + end; + + { TSpTBXSpinEditItem } + + TSpTBXSpinEditItem = class(TSpTBXEditItem) + private + FSpinOptions: TSpTBXSpinEditOptions; + procedure SpinOptionsGetText(Sender: TObject; var NewText: WideString; var Accept: Boolean); + procedure SpinOptionsSetText(Sender: TObject; const AText: WideString); + function GetValue: Extended; + function GetValueChanged: TNotifyEvent; + procedure SetValue(const Value: Extended); + procedure SetValueChanged(const ValueChangedEvent: TNotifyEvent); + protected + function GetItemViewerClass(AView: TTBView): TTBItemViewerClass; override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + published + property Alignment default taRightJustify; + property Text stored False; + property SpinOptions: TSpTBXSpinEditOptions read FSpinOptions write FSpinOptions; + property Value: Extended read GetValue write SetValue stored False; + property OnValueChanged: TNotifyEvent read GetValueChanged write SetValueChanged; + end; + + TSpTBXSpinEditViewer = class(TSpTBXEditItemViewer) + private + FUpPushed: Boolean; + FDownPushed: Boolean; + FTimer: TTimer; + procedure TimerHandler(Sender: TObject); + function GetItem: TSpTBXSpinEditItem; + protected + function GetAccRole: Integer; override; + function GetIndentAfter: Integer; override; + function HandleEditMessage(var Message: TMessage): Boolean; override; + procedure InvalidateButtons; + function IsPtInButtonPart(X, Y: Integer): Boolean; override; + procedure LosingCapture; override; + procedure MouseDown(Shift: TShiftState; X, Y: Integer; var MouseDownOnMenu: Boolean); override; + procedure MouseUp(X, Y: Integer; MouseWasDownOnMenu: Boolean); override; + procedure InternalDrawFrame(ACanvas: TCanvas; ARect: TRect; ItemInfo: TSpTBXMenuItemInfo); override; + procedure InternalEditControlChange(Sender: TObject); override; + procedure InternalEditControlExit; override; + public + destructor Destroy; override; + property Item: TSpTBXSpinEditItem read GetItem; // Hides the inherited TB2K Item property + end; + +{ Helpers } +procedure SpCalcMaxDropDownWidth(Combo: TSpTBXComboBox; RightMargin: Integer = 8); +function SpFocusEditItem(Item: TTBCustomItem; View: TTBView): Boolean; +function SpStartsTextW(const ASubText, AText: WideString): Boolean; + +{ Painting helpers } +function SpCanEditFrameBeHotTracked(BorderStyle: TBorderStyle; SkinType: TSpTBXSkinType): Boolean; +procedure SpDrawXPEditButton(ACanvas: TCanvas; ARect: TRect; Enabled, FrameHotTrack, HotTrack, Pushed, RightAligned: Boolean); +procedure SpDrawXPComboButton(ACanvas: TCanvas; ARect: TRect; Enabled, FrameHotTrack, HotTrack, DroppedDown, RightAligned: Boolean; SkinType: TSpTBXSkinType); +procedure SpDrawXPSpinButton(ACanvas: TCanvas; ARect: TRect; Enabled, FrameHotTrack, UpHotTrack, DownHotTrack, UpPushed, DownPushed, RightAligned: Boolean; SkinType: TSpTBXSkinType); + +implementation + +uses + Themes, UxTheme, + {$IFNDEF UNICODE} TntActnList, TntWindows, {$ENDIF} + Math, TB2Common; + +const + DefaultSpinButtonSize = 14; + +type + TTBViewAccess = class(TTBView); + TSpTBXFontSettingsAccess = class(TSpTBXFontSettings); + TCustomEditAccess = class(TCustomEdit); + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Helpers } + +procedure SpCalcMaxDropDownWidth(Combo: TSpTBXComboBox; RightMargin: Integer = 8); +var + I, MaxWidth: Integer; + Sz: TSize; + C: TControlCanvas; +begin + MaxWidth := 0; + + C := TControlCanvas.Create; + try + C.Control := Combo; + C.Font.Assign(Combo.Font); + for I := 0 to Combo.Items.Count - 1 do begin + Sz := SpGetTextSize(C.Handle, Combo.Items[I], False); + if Sz.cx > MaxWidth then MaxWidth := Sz.cx; + end; + + MaxWidth := MaxWidth + GetSystemMetrics(SM_CXVSCROLL) + RightMargin; + if Combo.Width < MaxWidth then + SendMessage(Combo.Handle, CB_SETDROPPEDWIDTH, MaxWidth, 0); + finally + C.Free; + end; +end; + +function SpFocusEditItem(Item: TTBCustomItem; View: TTBView): Boolean; +var + IV: TTBItemViewer; +begin + Result := False; + IV := View.Find(Item); + if Assigned(IV) then begin + View.Select(IV, False); + View.ExecuteSelected(False); + Result := True; + end; +end; + +function SpStartsTextW(const ASubText, AText: WideString): Boolean; +var + L, L2: Integer; +begin + L := Length(ASubText); + L2 := Length(AText); + if L > L2 then Result := False + else Result := CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE, + PWideChar(AText), L, PWideChar(ASubText), L) = 2; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Painting helpers } + +function SpCanEditFrameBeHotTracked(BorderStyle: TBorderStyle; SkinType: TSpTBXSkinType): Boolean; +var + NormalB, HotTrackB: TSpTBXSkinOptionEntry; +begin + Result := False; + if (BorderStyle <> bsNone) and (SpTBXSkinType(SkinType) <> sknNone) then begin + // If the HotTrack borders are different than the Normal borders then + // return true. + NormalB := CurrentSkin.Options(skncEditFrame, sknsNormal).Borders; + HotTrackB := CurrentSkin.Options(skncEditFrame, sknsHotTrack).Borders; + if not NormalB.IsEqual(HotTrackB) then + Result := True; + end; +end; + +procedure SpDrawXPEditButton(ACanvas: TCanvas; ARect: TRect; Enabled, FrameHotTrack, + HotTrack, Pushed, RightAligned: Boolean); +var + State: TSpTBXSkinStatesType; +begin + State := CurrentSkin.GetState(Enabled, Pushed, HotTrack or FrameHotTrack, False); + if FrameHotTrack then begin + InflateRect(ARect, 1, 1); + if RightAligned then + ARect.Left := ARect.Left + 1 + else + ARect.Right := ARect.Right - 1; + end; + CurrentSkin.PaintBackground(ACanvas, ARect, skncEditButton, State, True, True); +end; + +procedure SpDrawXPComboButton(ACanvas: TCanvas; ARect: TRect; Enabled, FrameHotTrack, + HotTrack, DroppedDown, RightAligned: Boolean; SkinType: TSpTBXSkinType); +var + Flags: Integer; + State: TSpTBXSkinStatesType; + C: TColor; + X, Y, Part: Integer; +begin + case SpTBXSkinType(SkinType) of + sknNone: + begin + Inc(ARect.Left, 4); + SpFillRect(ACanvas, ARect, clBtnFace, clWindow); + if DroppedDown then + Windows.DrawEdge(ACanvas.Handle, ARect, BDR_SUNKENOUTER, BF_RECT) + else if FrameHotTrack or HotTrack then + Windows.DrawEdge(ACanvas.Handle, ARect, BDR_RAISEDINNER, BF_RECT); + State := CurrentSkin.GetState(Enabled, DroppedDown, HotTrack, False); + C := CurrentSkin.GetTextColor(skncEditButton, State); + X := (ARect.Left + ARect.Right) div 2; + Y := (ARect.Top + ARect.Bottom) div 2 - 1; + SpDrawArrow(ACanvas, X, Y, C, True, False, 2); + end; + sknWindows: + begin + if SpIsWinVistaOrUp then + Part := 6 // (CP_DROPDOWNBUTTONRIGHT) Use the new API on Windows Vista + else + Part := CP_DROPDOWNBUTTON; + if not Enabled then Flags := CBXS_DISABLED + else if DroppedDown then Flags := CBXS_PRESSED + else if HotTrack then Flags := CBXS_HOT + else Flags := CBXS_NORMAL; + DrawThemeBackground(ThemeServices.Theme[teComboBox], ACanvas.Handle, Part, Flags, ARect, nil); + end; + sknSkin: + begin + State := CurrentSkin.GetState(Enabled, DroppedDown, FrameHotTrack, False); + ACanvas.FillRect(ARect); + SpDrawXPEditButton(ACanvas, ARect, Enabled, FrameHotTrack, HotTrack, DroppedDown, RightAligned); + C := CurrentSkin.GetTextColor(skncEditButton, State); + X := (ARect.Left + ARect.Right) div 2; + Y := (ARect.Top + ARect.Bottom) div 2 - 1; + SpDrawArrow(ACanvas, X, Y, C, True, False, 2); + end; + end; +end; + +procedure SpDrawXPSpinButton(ACanvas: TCanvas; ARect: TRect; Enabled, FrameHotTrack, + UpHotTrack, DownHotTrack, UpPushed, DownPushed, RightAligned: Boolean; SkinType: TSpTBXSkinType); +var + ButtonR, BR: TRect; + StateFlags: Integer; + Flags: Cardinal; + X, Y: Integer; + State: TSpTBXSkinStatesType; + C: TColor; +begin + ButtonR := ARect; + + case SpTBXSkinType(SkinType) of + sknNone: + begin + // Up button + Flags := DFCS_SCROLLUP; + if UpPushed then + Flags := Flags or DFCS_PUSHED; + BR := Rect(ButtonR.Left, ButtonR.Top, ButtonR.Right, (ButtonR.Bottom + ButtonR.Top) div 2); + DrawFrameControl(ACanvas.Handle, BR, DFC_SCROLL, Flags); + // Down button + Flags := DFCS_SCROLLDOWN; + if DownPushed then + Flags := Flags or DFCS_PUSHED; + BR := Rect(ButtonR.Left, BR.Bottom - 1, ButtonR.Right, ButtonR.Bottom); + DrawFrameControl(ACanvas.Handle, BR, DFC_SCROLL, Flags); + end; + sknWindows: + begin + InflateRect(ButtonR, 1, 1); + // Up button + BR := ButtonR; + BR.Bottom := (ButtonR.Top + ButtonR.Bottom) div 2; + if not Enabled then StateFlags := UPS_DISABLED + else if UpPushed then StateFlags := UPS_PRESSED + else if UpHotTrack then StateFlags := UPS_HOT + else StateFlags := UPS_NORMAL; + DrawThemeBackground(ThemeServices.Theme[teSpin], ACanvas.Handle, SPNP_UP, StateFlags, BR, nil); + // Down button + BR := ButtonR; + BR.Top := (ButtonR.Top + ButtonR.Bottom) div 2; + if not Enabled then StateFlags := DNS_DISABLED + else if DownPushed then StateFlags := DNS_PRESSED + else if DownHotTrack then StateFlags := DNS_HOT + else StateFlags := DNS_NORMAL; + DrawThemeBackground(ThemeServices.Theme[teSpin], ACanvas.Handle, SPNP_DOWN, StateFlags, BR, nil); + end; + sknSkin: + begin + // Up button + BR := Rect(ButtonR.Left, ButtonR.Top, ButtonR.Right, (ButtonR.Top + ButtonR.Bottom) div 2 + 1); + X := (BR.Left + BR.Right) div 2; + Y := (BR.Top + BR.Bottom) div 2 - 1; + State := CurrentSkin.GetState(Enabled, UpPushed, UpHotTrack or FrameHotTrack, False); + if FrameHotTrack then + BR.Bottom := BR.Bottom - 1; + SpDrawXPEditButton(ACanvas, BR, Enabled, FrameHotTrack, UpHotTrack, UpPushed, RightAligned); + C := CurrentSkin.GetTextColor(skncEditButton, State); + SpDrawArrow(ACanvas, X, Y, C, True, True, 2); + if FrameHotTrack then + BR.Bottom := BR.Bottom + 1; + // Down button + BR := Rect(ButtonR.Left, BR.Bottom - 1, ButtonR.Right, ButtonR.Bottom); + X := (BR.Left + BR.Right) div 2; + Y := (BR.Top + BR.Bottom) div 2 - 1; + State := CurrentSkin.GetState(Enabled, DownPushed, DownHotTrack or FrameHotTrack, False); + if FrameHotTrack then + BR.Top := BR.Top + 1; + SpDrawXPEditButton(ACanvas, BR, Enabled, FrameHotTrack, DownHotTrack, DownPushed, RightAligned); + C := CurrentSkin.GetTextColor(skncEditButton, State); + SpDrawArrow(ACanvas, X, Y, C, True, False, 2); + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXEditButton } + +constructor TSpTBXEditButton.Create(AOwner: TComponent); +var + Index: Integer; +const + DefaultName = 'SubEditButton'; +begin + inherited; + + // Find unique name + if Assigned(AOwner) then begin + Index := 0; + while AOwner.FindComponent(DefaultName + IntToStr(Index)) <> nil do + Inc(Index); + Name := DefaultName + IntToStr(Index); + end; + + // Change the FPopupControl, we need to align + // the DropdownMenu to the Edit control not the button. + // FPopupControl is used in TSpTBXCustomButton.Click + if Assigned(AOwner) and (AOwner is TControl) then + FPopupControl := AOwner as TControl; + + SetSubComponent(True); + SkinType := sknSkin; +end; + +procedure TSpTBXEditButton.AdjustFont(AFont: TFont); +var + State: TSpTBXSkinStatesType; +begin + if (LinkText <> '') and MouseInControl then + inherited + else begin + State := CurrentSkin.GetState(Enabled, Pushed, MouseInControl or GetFrameHotTrack, Checked); + AFont.Color := CurrentSkin.GetTextColor(skncEditButton, State); + end; +end; + +procedure TSpTBXEditButton.Click; +begin + if Assigned(Parent) and SpCanFocus(Parent) then + Parent.SetFocus; + inherited; +end; + +function TSpTBXEditButton.DoDrawDropDownArrow(ACanvas: TCanvas; + ARect: TRect): Boolean; +begin + if (Caption = '') and not IsImageIndexValid then + Result := False // Paint the default Windows combo button + else + Result := inherited DoDrawDropDownArrow(ACanvas, ARect); +end; + +function TSpTBXEditButton.DoDrawItem(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage): Boolean; +var + T: TSpTBXSkinType; + FrameHotTrack, RightAligned: Boolean; +begin + if (PaintStage = pstPrePaint) and not BitmapValid then begin + Result := True; + if Assigned(OnDraw) then OnDraw(Self, ACanvas, ARect, PaintStage, Result); + if Result then begin + FrameHotTrack := GetFrameHotTrack; + RightAligned := Align <> alLeft; + + // Draw the ComboButton if the caption is not set + T := SpTBXSkinType(SkinType); + if (Length(Caption) = 0) and not IsImageIndexValid then + SpDrawXPComboButton(ACanvas, ARect, Enabled, FrameHotTrack, MouseInControl, Pushed, RightAligned, T) + else begin + case T of + sknNone: + SpDrawXPButton(ACanvas, ARect, Enabled, Pushed, MouseInControl, Checked, Focused, Default, T); + sknWindows: + begin + InflateRect(ARect, 1, 1); + SpDrawXPButton(ACanvas, ARect, Enabled, Pushed, MouseInControl, Checked, Focused, Default, T); + end; + sknSkin: + SpDrawXPEditButton(ACanvas, ARect, Enabled, FrameHotTrack, FrameHotTrack or MouseInControl, Pushed, RightAligned); + end; + end; + end; + end + else + Result := inherited DoDrawItem(ACanvas, ARect, PaintStage); +end; + +function TSpTBXEditButton.GetFrameHotTrack: Boolean; +begin + if Parent is TSpTBXEdit then + Result := TSpTBXEdit(Parent).MouseInControl or Parent.Focused + else + Result := False; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSpinButton } + +constructor TSpTBXSpinButton.Create(AOwner: TComponent); +begin + inherited; + Repeating := True; +end; + +procedure TSpTBXSpinButton.Click; +var + P: TPoint; +begin + FUpPushed := False; + FDownPushed := False; + if Enabled then begin + GetCursorPos(P); + P := ScreenToClient(P); + if P.Y < Height div 2 then begin + FUpPushed := True; + if Assigned(FOnUpClick) then FOnUpClick(Self); + end + else begin + FDownPushed := True; + if Assigned(FOnDownClick) then FOnDownClick(Self); + end; + end; + + inherited; +end; + +function TSpTBXSpinButton.DoDrawItem(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage): Boolean; +var + UpHotTrack, DownHotTrack, EditFrameHotTrack, RightAligned: Boolean; +begin + // Draw rectangle buttons + if (PaintStage = pstPrePaint) and not BitmapValid then begin + Result := True; + if Assigned(OnDraw) then OnDraw(Self, ACanvas, ARect, PaintStage, Result); + if Result then begin + IsHotTracking(UpHotTrack, DownHotTrack, EditFrameHotTrack); + RightAligned := Align <> alLeft; + SpDrawXPSpinButton(ACanvas, ARect, Enabled, EditFrameHotTrack, UpHotTrack, DownHotTrack, FUpPushed, FDownPushed, RightAligned, SkinType); + end; + end + else + Result := inherited DoDrawItem(ACanvas, ARect, PaintStage); +end; + +procedure TSpTBXSpinButton.IsHotTracking(out UpButton, DownButton, EditFrame: Boolean); +var + Edit: TSpTBXEdit; + P: TPoint; + R: TRect; +begin + UpButton := False; + DownButton := False; + EditFrame := False; + + if GetCursorPos(P) then begin + P := ScreenToClient(P); + R := Rect(0, 0, Width, Height div 2); + UpButton := PtInRect(R, P); + if not UpButton then begin + R := Rect(0, Height div 2, Width, Height); + DownButton := PtInRect(R, P); + end; + end; + + if Assigned(Owner) and (Owner is TSpTBXEdit) then begin + Edit := Owner as TSpTBXEdit; + if Edit.HotTrack then + EditFrame := Edit.MouseInControl or Edit.Focused; + end; +end; + +procedure TSpTBXSpinButton.DoMouseLeave; +begin + FUpPushed := False; + FDownPushed := False; + inherited; +end; + +procedure TSpTBXSpinButton.MouseUp(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + FUpPushed := False; + FDownPushed := False; + inherited; +end; + +procedure TSpTBXSpinButton.MouseMove(Shift: TShiftState; X, Y: Integer); +begin + inherited; + if Enabled then + Repaint; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXUnicodeAdaptEdit } + +{$IFNDEF UNICODE} +procedure TSpTBXUnicodeAdaptEdit.CreateWindowHandle(const Params: TCreateParams); +begin + TntCustomEdit_CreateWindowHandle(Self, Params); +end; + +procedure TSpTBXUnicodeAdaptEdit.CreateWnd; +begin + inherited; + TntCustomEdit_AfterInherited_CreateWnd(Self, FPasswordChar); +end; + +procedure TSpTBXUnicodeAdaptEdit.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TSpTBXUnicodeAdaptEdit.GetSelStart: Integer; +begin + Result := TntCustomEdit_GetSelStart(Self); +end; + +procedure TSpTBXUnicodeAdaptEdit.SetSelStart(const Value: Integer); +begin + TntCustomEdit_SetSelStart(Self, Value); +end; + +function TSpTBXUnicodeAdaptEdit.GetSelLength: Integer; +begin + Result := TntCustomEdit_GetSelLength(Self); +end; + +procedure TSpTBXUnicodeAdaptEdit.SetSelLength(const Value: Integer); +begin + TntCustomEdit_SetSelLength(Self, Value); +end; + +function TSpTBXUnicodeAdaptEdit.GetSelText: WideString; +begin + Result := TntCustomEdit_GetSelText(Self); +end; + +procedure TSpTBXUnicodeAdaptEdit.SetSelText(const Value: WideString); +begin + TntCustomEdit_SetSelText(Self, Value); +end; + +function TSpTBXUnicodeAdaptEdit.GetPasswordChar: WideChar; +begin + Result := TntCustomEdit_GetPasswordChar(Self, FPasswordChar); +end; + +procedure TSpTBXUnicodeAdaptEdit.SetPasswordChar(const Value: WideChar); +begin + TntCustomEdit_SetPasswordChar(Self, FPasswordChar, Value); +end; + +function TSpTBXUnicodeAdaptEdit.GetText: WideString; +begin + Result := TntControl_GetText(Self); +end; + +procedure TSpTBXUnicodeAdaptEdit.SetText(const Value: WideString); +begin + TntControl_SetText(Self, Value); +end; + +function TSpTBXUnicodeAdaptEdit.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TSpTBXUnicodeAdaptEdit.GetHint: WideString; +begin + Result := TntControl_GetHint(Self); +end; + +procedure TSpTBXUnicodeAdaptEdit.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TSpTBXUnicodeAdaptEdit.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TSpTBXUnicodeAdaptEdit.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; +{$ENDIF} + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXUnicodeEdit } + +procedure TSpTBXUnicodeEdit.CreateWnd; +begin + inherited; + if HandleAllocated then UpdateEditRect; +end; + +procedure TSpTBXUnicodeEdit.CreateParams(var Params: TCreateParams); +const + Alignments: array[TAlignment] of Cardinal = (ES_LEFT, ES_RIGHT, ES_CENTER); +begin + inherited CreateParams(Params); + // WS_CLIPCHILDREN needed for edit buttons + Params.Style := Params.Style or Alignments[FAlignment] or WS_CLIPCHILDREN; +end; + +procedure TSpTBXUnicodeEdit.SetAlignment(Value: TAlignment); +begin + if Value <> FAlignment then begin + FAlignment := Value; + RecreateWnd; + end; +end; + +function TSpTBXUnicodeEdit.AddEditButton(RightAligned: Boolean; + AWidth: Integer): TSpTBXEditButton; +begin + Result := TSpTBXEditButton.Create(Self); + Result.Parent := Self; + Result.FreeNotification(Self); + if RightAligned then + Result.Align := alRight + else + Result.Align := alLeft; + if AWidth = -1 then + Result.Width := GetSystemMetrics(SM_CXVSCROLL) + else + Result.Width := AWidth; + UpdateEditRect; +end; + +function TSpTBXUnicodeEdit.HasEditButton: Boolean; +var + I: Integer; +begin + Result := False; + if not HandleAllocated then Exit; + for I := 0 to ControlCount - 1 do begin + if Controls[I] is TSpTBXEditButton then begin + Result := True; + Break; + end; + end; +end; + +procedure TSpTBXUnicodeEdit.UpdateEditRect; +var + I, X1, X2: Integer; + B: TSpTBXEditButton; +begin + if not HandleAllocated then Exit; + + X1 := 0; + X2 := 0; + + for I := 0 to ControlCount - 1 do begin + if Controls[I] is TSpTBXEditButton then begin + B := Controls[I] as TSpTBXEditButton; + if B.Visible then + case B.Align of + alLeft: X1 := X1 + B.Width; + alRight: X2 := X2 + B.Width; + end; + end; + end; + + if X1 > 0 then Inc(X1, 2); + if X2 > 0 then Inc(X2, 2); + + SendMessage(Handle, EM_SETMARGINS, EC_LEFTMARGIN or EC_RIGHTMARGIN, MakeLong(X1, X2)); +end; + +procedure TSpTBXUnicodeEdit.CMEnabledChanged(var Message: TMessage); +var + I: Integer; +begin + inherited; + for I := 0 to ControlCount - 1 do + if Controls[I] is TSpTBXEditButton then + TSpTBXEditButton(Controls[I]).Enabled := Enabled; +end; + +procedure TSpTBXUnicodeEdit.CMFontChanged(var Message: TMessage); +begin + inherited; + UpdateEditRect; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXEdit } + +constructor TSpTBXEdit.Create(AOwner: TComponent); +begin + inherited; + FSkinType := sknSkin; + FHotTrack := True; + FBorderStyle := bsSingle; + SkinManager.AddSkinNotification(Self); + + if not (csDesigning in ComponentState) then + DoubleBuffered := True; +end; + +destructor TSpTBXEdit.Destroy; +begin + SkinManager.RemoveSkinNotification(Self); + inherited; +end; + +procedure TSpTBXEdit.CMEnabledChanged(var Message: TMessage); +begin + inherited; + FMouseInControl := False; + if FHotTrack then InvalidateFrame; +end; + +procedure TSpTBXEdit.CMEnter(var Message: TCMEnter); +begin + inherited; + FMouseInControl := True; + if FHotTrack then InvalidateFrame; +end; + +procedure TSpTBXEdit.CMExit(var Message: TCMExit); +begin + inherited; + FMouseInControl := False; + if FHotTrack then InvalidateFrame; +end; + +procedure TSpTBXEdit.CMMouseEnter(var Message: TMessage); +begin + inherited; + if not FMouseInControl then begin + FMouseInControl := True; + if FHotTrack and not Focused and (HasEditButton or SpCanEditFrameBeHotTracked(BorderStyle, SkinType)) then + InvalidateFrame; + end; +end; + +procedure TSpTBXEdit.CMMouseLeave(var Message: TMessage); +begin + inherited; + if FMouseInControl then begin + FMouseInControl := False; + if FHotTrack and not Focused and (HasEditButton or SpCanEditFrameBeHotTracked(BorderStyle, SkinType)) then + InvalidateFrame; + end; +end; + +procedure TSpTBXEdit.InvalidateFrame; +begin + if HandleAllocated then + RedrawWindow(Handle, nil, 0, RDW_FRAME or RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN); +end; + +procedure TSpTBXEdit.SetBorderStyle(const Value: TBorderStyle); +begin + if FBorderStyle <> Value then begin + FBorderStyle := Value; + InvalidateFrame; + end; +end; + +procedure TSpTBXEdit.SetSkinType(const Value: TSpTBXSkinType); +var + I: Integer; +begin + if Value <> FSkinType then begin + FSkinType := Value; + for I := 0 to ControlCount - 1 do + if Controls[I] is TSpTBXEditButton then + TSpTBXEditButton(Controls[I]).SkinType := Value; + InvalidateFrame; + end; +end; + +procedure TSpTBXEdit.WMNCPaint(var Message: TWMNCPaint); +var + HotTrackFrame: Boolean; +begin + if FHotTrack then + HotTrackFrame := FMouseInControl or Focused + else + HotTrackFrame := False; + + if (SpTBXSkinType(FSkinType) = sknNone) and (FBorderStyle <> bsNone) then + inherited + else + if Ctl3D then + SpDrawXPEditFrame(Self, HotTrackFrame, FSkinType, False, FBorderStyle = bsNone); +end; + +procedure TSpTBXEdit.WMSpSkinChange(var Message: TMessage); +begin + inherited; + InvalidateFrame; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomButtonEdit } + +constructor TSpTBXCustomButtonEdit.Create(AOwner: TComponent); +begin + inherited; + ControlStyle := ControlStyle - [csSetCaption]; + FEditButton := AddEditButton(True, 19); +end; + +destructor TSpTBXCustomButtonEdit.Destroy; +begin + FreeAndNil(FEditButton); + inherited; +end; + +procedure TSpTBXCustomButtonEdit.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if (AComponent = FEditButton) and (Operation = opRemove) then + FEditButton := nil; +end; + +procedure TSpTBXCustomButtonEdit.SetName(const Value: TComponentName); +begin + inherited SetName(Value); + if not (csLoading in ComponentState) then begin + FEditButton.Caption := '...'; + Text := ''; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSpinEditOptions } + +constructor TSpTBXSpinEditOptions.Create; +begin + inherited Create; + FDecimal := 2; + FIncrement := 1; + FValueSnap := True; + FValueType := spnInteger; +end; + +procedure TSpTBXSpinEditOptions.DoValueChanged; +begin + if Assigned(FOnValueChanged) then FOnValueChanged(Self); +end; + +function TSpTBXSpinEditOptions.GetValueAsInteger: Int64; +begin + Result := Round(Value); +end; + +function TSpTBXSpinEditOptions.IsIncrementStored: Boolean; +begin + Result := FIncrement <> 1; +end; + +function TSpTBXSpinEditOptions.IsMaxValueStored: Boolean; +begin + Result := FMaxValue <> 0; +end; + +function TSpTBXSpinEditOptions.IsMinValueStored: Boolean; +begin + Result := FMinValue <> 0; +end; + +function TSpTBXSpinEditOptions.IsValueStored: Boolean; +begin + Result := FValue <> 0; +end; + +procedure TSpTBXSpinEditOptions.SetDecimal(NewDecimal: Integer); +begin + if NewDecimal > 10 then NewDecimal := 10; + if NewDecimal < 0 then NewDecimal := 0; + if NewDecimal <> FDecimal then begin + FDecimal := NewDecimal; + UpdateTextFromValue; + end; +end; + +procedure TSpTBXSpinEditOptions.SetMaxValue(const NewValue: Extended); +begin + if NewValue <> FMaxValue then begin + FMaxValue := NewValue; + if FValue > NewValue then SetValue(NewValue); + end; +end; + +procedure TSpTBXSpinEditOptions.SetMinValue(const NewValue: Extended); +begin + if NewValue <> FMinValue then begin + FMinValue := NewValue; + if FValue < NewValue then SetValue(NewValue); + end; +end; + +procedure TSpTBXSpinEditOptions.SetPostfix(const ValueString: WideString); +begin + if FPostfix <> ValueString then begin + FPostfix := ValueString; + UpdateTextFromValue; + end; +end; + +procedure TSpTBXSpinEditOptions.SetPrefix(const ValueString: WideString); +begin + if FPrefix <> ValueString then begin + FPrefix := ValueString; + UpdateTextFromValue; + end; +end; + +procedure TSpTBXSpinEditOptions.SetValue(const NewValue: Extended); +begin + if NewValue <> FValue then + if (FMaxValue = FMinValue) or + (FMaxValue <> FMinValue) and (NewValue >= FMinValue) and (NewValue <= FMaxValue) then + begin + FValue := NewValue; + DoValueChanged; + UpdateTextFromValue; + end; +end; + +procedure TSpTBXSpinEditOptions.SetValueAsInteger(const NewValue: Int64); +begin + Value := NewValue; +end; + +procedure TSpTBXSpinEditOptions.SetValueType(NewType: TSpTBXSpinType); +begin + if NewType <> FValueType then begin + FValueType := NewType; + if NewType in [spnInteger, spnHex] then FIncrement := Max(Round(FIncrement), 1); + UpdateTextFromValue; + end; +end; + +procedure TSpTBXSpinEditOptions.UpdateTextFromValue; +var + WS: WideString; +begin + WS := ''; + case FValueType of + spnInteger: WS := IntToStr(Round(FValue)); + spnFloat: WS := FloatToStrF(FValue, ffFixed, 15, FDecimal); + spnHex: WS := IntToHex(Round(FValue), 1); + end; + if Assigned(FOnSetText) then FOnSetText(Self, FPrefix + WS + FPostfix); +end; + +procedure TSpTBXSpinEditOptions.UpdateValueFromText(RevertWhenInvalid: Boolean = True); +var + WS: WideString; + PrevValue, NewValue: Extended; + I: Integer; + Dummy: Boolean; +begin + PrevValue := FValue; + NewValue := FValue; + Dummy := True; + WS := ''; + if Assigned(FOnGetText) then FOnGetText(Self, WS, Dummy); + + // Remove the Prefix and Postfix from the text + I := Pos(Prefix, WS); + if I > 0 then + Delete(WS, I, Length(Prefix)); + I := Pos(Postfix, WS); + if I > 0 then + Delete(WS, I, Length(Postfix)); + + // Try to parse the text to get the value + WS := Trim(WS); + if Length(WS) > 0 then begin + case FValueType of + spnInteger: NewValue := StrToInt64Def(WS, Round(PrevValue)); + spnFloat: NewValue := StrToFloatDef(WS, PrevValue); + spnHex: NewValue := StrToInt64Def('$' + WS, Round(PrevValue)); + end; + end; + + if RevertWhenInvalid or (NewValue <> PrevValue) then begin + SetValue(NewValue); + UpdateTextFromValue; + end; +end; + +procedure TSpTBXSpinEditOptions.ValueInc; +var + NewValue: Extended; +begin + if FValueSnap then + NewValue := Math.Floor(FValue / FIncrement + 1 + FIncrement * 0.0000000001) * FIncrement + else + NewValue := FValue + FIncrement; + SetValue(NewValue); +end; + +procedure TSpTBXSpinEditOptions.ValueDec; +var + NewValue: Extended; +begin + if FValueSnap then + NewValue := Math.Ceil(FValue / FIncrement - 1 - FIncrement * 0.0000000001) * FIncrement + else + NewValue := FValue - FIncrement; + SetValue(NewValue); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSpinEdit } + +constructor TSpTBXSpinEdit.Create(AOwner: TComponent); +begin + inherited; + Alignment := taRightJustify; + + FSpinOptions := TSpTBXSpinEditOptions.Create; + FSpinOptions.OnGetText := SpinOptionsGetText; + FSpinOptions.OnSetText := SpinOptionsSetText; + + FSpinButton := TSpTBXSpinButton.Create(Self); + FSpinButton.Parent := Self; + FSpinButton.FreeNotification(Self); + FSpinButton.OnUpClick := UpClick; + FSpinButton.OnDownClick := DownClick; + FSpinButton.Align := alRight; + FSpinButton.Width := DefaultSpinButtonSize; + UpdateEditRect; + + Text := '0'; +end; + +destructor TSpTBXSpinEdit.Destroy; +begin + FreeAndNil(FSpinOptions); + FreeAndNil(FSpinButton); + inherited; +end; + +procedure TSpTBXSpinEdit.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if (AComponent = FSpinButton) and (Operation = opRemove) then + FSpinButton := nil; +end; + +procedure TSpTBXSpinEdit.KeyDown(var Key: Word; Shift: TShiftState); +begin + inherited; + case Key of + VK_UP: SpinOptions.ValueInc; + VK_DOWN: SpinOptions.ValueDec; + end; +end; + +procedure TSpTBXSpinEdit.KeyPress(var Key: Char); +begin + inherited; + if Key = #13 then begin + Key := #0; + SpinOptions.UpdateValueFromText; + end; +end; + +procedure TSpTBXSpinEdit.UpClick(Sender: TObject); +begin + SpinOptions.ValueInc; +end; + +procedure TSpTBXSpinEdit.DownClick(Sender: TObject); +begin + SpinOptions.ValueDec; +end; + +procedure TSpTBXSpinEdit.Change; +begin + if FExtendedAccept then + SpinOptions.UpdateValueFromText(False); // Don't revert when an invalid text is entered + inherited; +end; + +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); +var + L, L2: Integer; +begin + // Event used by SpinOptions to set the edit control text + if Text = AText then Exit; + + // Change the EditControl text and reposition the edit caret + L := Length(Text); + Text := AText; + L2 := Length(Text); + if L2 > L then + SelStart := L + Length(SpinOptions.Prefix); +end; + +procedure TSpTBXSpinEdit.WMKillFocus(var Message: TWMKillFocus); +begin + SpinOptions.UpdateValueFromText; + inherited; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXComboBox } + +constructor TSpTBXComboBox.Create(AOwner: TComponent); +begin + inherited; + FAutoDropDownWidthRightMargin := 8; + FAutoItemHeight := True; + FMouseTimer := nil; + FHotTrack := True; + FSkinType := sknSkin; + SkinManager.AddSkinNotification(Self); + + if not (csDesigning in ComponentState) then + DoubleBuffered := True; +end; + +procedure TSpTBXComboBox.CreateParams(var Params: TCreateParams); +begin + inherited CreateParams(Params); + + // Force the ComboBox to be owner draw + with Params do + if Style and (CBS_OWNERDRAWFIXED or CBS_OWNERDRAWVARIABLE) = 0 then + Style := Style or LBS_OWNERDRAWFIXED; +end; + +procedure TSpTBXComboBox.CreateWnd; +begin + inherited; + DoCalcMaxDropDownWidth; +end; + +destructor TSpTBXComboBox.Destroy; +begin + SkinManager.RemoveSkinNotification(Self); + if Assigned(FMouseTimer) then begin + FMouseTimer.Enabled := False; + FreeAndNil(FMouseTimer); + end; + inherited; +end; + +procedure TSpTBXComboBox.CloseUp; +begin + inherited; + InvalidateFrame; +end; + +procedure TSpTBXComboBox.CMEnter(var Message: TCMEnter); +begin + inherited; + FMouseInControl := True; + InvalidateFrame; +end; + +procedure TSpTBXComboBox.CMExit(var Message: TCMExit); +begin + inherited; + FMouseInControl := False; + InvalidateFrame; +end; + +procedure TSpTBXComboBox.CMMouseEnter(var Message: TMessage); +begin + inherited; + if Message.LParam = 0 then begin + if not FMouseInControl then begin + FMouseInControl := True; + if FHotTrack then + InvalidateFrame; + if not Assigned(FMouseTimer) then begin + FMouseTimer := TTimer.Create(nil); + FMouseTimer.Enabled := False; + FMouseTimer.Interval := 125; + FMouseTimer.OnTimer := MouseTimerHandler; + FMouseTimer.Enabled := True; + end; + end; + end; +end; + +procedure TSpTBXComboBox.CNDrawItem(var Message: TWMDrawItem); +var + State: TOwnerDrawState; + SknState: TSpTBXSkinStatesType; +begin + with Message.DrawItemStruct^ do + begin + State := TOwnerDrawState(LongRec(itemState).Lo); + if itemState and ODS_COMBOBOXEDIT <> 0 then + Include(State, odComboBoxEdit); + if itemState and ODS_DEFAULT <> 0 then + Include(State, odDefault); + + Canvas.Handle := hDC; + Canvas.Lock; + try + Canvas.Font := Font; + Canvas.Brush := Brush; + if (Integer(itemID) >= 0) and (Integer(itemID) < Items.Count) then begin + DrawItemBackground(itemID, rcItem, State); + + TControlCanvas(Canvas).UpdateTextFlags; + SknState := CurrentSkin.GetState(not (odDisabled in State), False, False, odSelected in State); + Canvas.Brush.Style := bsClear; + if SknState = sknsChecked then + 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.DoCalcMaxDropDownWidth; +begin + if FAutoDropDownWidth then + SpCalcMaxDropDownWidth(Self, FAutoDropDownWidthRightMargin); +end; + +procedure TSpTBXComboBox.DoDrawBackground(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawBackground) then FOnDrawBackground(Self, ACanvas, ARect, + PaintStage, PaintDefault); +end; + +procedure TSpTBXComboBox.DoDrawItem(ACanvas: TCanvas; var ARect: TRect; + Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawItem) then FOnDrawItem(Self, ACanvas, ARect, Index, State, PaintStage, PaintDefault); +end; + +procedure TSpTBXComboBox.DoDrawItemBackground(ACanvas: TCanvas; + var ARect: TRect; Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawItemBackground) then FOnDrawItemBackground(Self, ACanvas, ARect, Index, State, PaintStage, PaintDefault); +end; + +procedure TSpTBXComboBox.DrawItem(Index: Integer; Rect: TRect; + State: TOwnerDrawState); +var + Flags: Integer; + PaintDefault: Boolean; +begin + // Draw the item text + PaintDefault := True; + DoDrawItem(Canvas, Rect, Index, State, pstPrePaint, PaintDefault); + if PaintDefault then begin + Flags := DrawTextBiDiModeFlags(DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX); + Inc(Rect.Left, 2); + + // [Bugfix] Delphi 7-2009 bug: + // When the Style is set to csDropDownList and the control is disabled the + // text is not painted with csGrayText. This is a VCL bug the same happens + // with TComboBox when you set it to csDropDownFixed (TSpTBXComboBox uses + // csDropDownFixed instead of csDropDownList). + if odDisabled in State then + Canvas.Font.Color := clGrayText; + SpDrawXPText(Canvas, Items[Index], Rect, Flags); + end; + + PaintDefault := True; + DoDrawItem(Canvas, Rect, Index, State, pstPostPaint, PaintDefault); +end; + +procedure TSpTBXComboBox.DrawItemBackground(Index: Integer; Rect: TRect; + State: TOwnerDrawState); +var + PaintDefault: Boolean; +begin + // Draw the list items background + PaintDefault := True; + DoDrawItemBackground(Canvas, Rect, Index, State, pstPrePaint, PaintDefault); + if PaintDefault then + SpDrawXPListItemBackground(Canvas, Rect, odSelected in State, False, odFocused in State, SkinType); + + PaintDefault := True; + DoDrawItemBackground(Canvas, Rect, Index, State, pstPostPaint, PaintDefault); +end; + +{$IF CompilerVersion > 17} +procedure TSpTBXComboBox.EditWndProc(var Message: TMessage); +begin + // [Bugfix] Delphi 2006/2007 bug: + // CM_MOUSEENTER and CM_MOUSELEAVE are fired everytime the mouse + // enters the combobox internal edit control. + // In D7 these messages were only fired when the mouse entered or leaved + // the combobox, including the internal edit control. + // We need to block the mouse messages from the internal edit control + // in EditWndProc + if Message.Msg = WM_MOUSEMOVE then + ComboWndProc(Message, FEditHandle, FDefEditProc) + else + inherited; +end; +{$IFEND} + +function TSpTBXComboBox.GetDropDownButtonRect: TRect; +var + ButtonWidth: Integer; + T: TSpTBXSkinType; +begin + if Style = csSimple then + ButtonWidth := 0 + else + ButtonWidth := GetSystemMetrics(SM_CXHSCROLL); + Result.Left := Width - ButtonWidth; + Result.Top := 0; + Result.Right := Result.Left + ButtonWidth; + Result.Bottom := Height; + + T := SpTBXSkinType(FSkinType); + case T of + sknNone: + begin + InflateRect(Result, 0, -1); + OffsetRect(Result, -1, 0); + end; + sknWindows: + begin + InflateRect(Result, 0, -1); + OffsetRect(Result, -1, 0); + end; + sknSkin: + begin + InflateRect(Result, 0, -2); + OffsetRect(Result, -2, 0); + end; + end; +end; + +function TSpTBXComboBox.GetMouseInDropDownButton: Boolean; +var + P: TPoint; + ButtonR: TRect; + ButtonWidth: Integer; +begin + Result := False; + + if not (csDesigning in ComponentState) and GetCursorPos(P) then begin + P := ScreenToClient(P); + if Style = csSimple then + ButtonWidth := 0 + else + ButtonWidth := GetSystemMetrics(SM_CXHSCROLL); + ButtonR.Left := Width - ButtonWidth; + ButtonR.Top := 0; + ButtonR.Right := ButtonR.Left + ButtonWidth; + ButtonR.Bottom := Height; + + Result := PtInRect(ButtonR, P); + end; +end; + +procedure TSpTBXComboBox.InvalidateFrame; +begin + if HandleAllocated then + Invalidate; +end; + +procedure TSpTBXComboBox.UpdateDropDownButton; +var + ButtonState: Boolean; +begin + if not DroppedDown then begin + ButtonState := GetMouseInDropDownButton; + if ButtonState <> FMouseInDropDownButton then + InvalidateFrame; + FMouseInDropDownButton := ButtonState; + end; +end; + +function TSpTBXComboBox.GetItemHt: Integer; +// Automatically update the Height/ItemHeight when Style is csDropDown, +// csDropDownList or csSimple +begin + // CB_GETITEMHEIGHT doesn't work when Style is csOwnerDrawFixed or + // csOwnerDrawVariable. + // Since TSpTBXComboBox is always owner-drawed we must calculate the + // ItemHeight based on the font when Style <> csOwnerDrawFixed/csOwnerDrawVariable. + // Look at TCustomComboBox.GetItemHt + if Style in [csOwnerDrawFixed, csOwnerDrawVariable] then + Result := inherited GetItemHt + else + if not FAutoItemHeight then // When AutoItemHeight is turned off return the ItemHeight + Result := FInternalItemHeight + else + Result := SpGetControlTextHeight(Self, Font); +end; + +procedure TSpTBXComboBox.SetItemHeight(Value: Integer); +begin + if Value > 0 then + FInternalItemHeight := Value; + inherited; +end; + +procedure TSpTBXComboBox.SetSkinType(const Value: TSpTBXSkinType); +begin + if Value <> FSkinType then begin + FSkinType := Value; + InvalidateFrame; + end; +end; + +procedure TSpTBXComboBox.WMMouseMove(var Message: TWMMouseMove); +begin + inherited; + UpdateDropDownButton; +end; + +procedure TSpTBXComboBox.WMNCCalcSize(var Message: TWMNCCalcSize); +begin + // [Bugfix] Delphi 2006 bug: + // Do nothing, fix Delphi 2005/2006 bug: http://qc.borland.com/wc/qcmain.aspx?d=13852 +end; + +procedure TSpTBXComboBox.WMPaint(var Message: TWMPaint); +var + ACanvas: TControlCanvas; + R, ButtonR: TRect; + ButtonWidth: Integer; + T: TSpTBXSkinType; + PaintDefault, HotTrackFrame, VistaNewComCtrls: Boolean; +begin + inherited; + + ACanvas := TControlCanvas.Create; + try + ACanvas.Control := Self; + ACanvas.Lock; // lock the canvas to prevent flicker on mouse click + GetWindowRect(Handle, R); + OffsetRect(R, -R.Left, -R.Top); + + if Style = csSimple then + ButtonWidth := 0 + else + ButtonWidth := GetSystemMetrics(SM_CXHSCROLL); + + T := SpTBXSkinType(FSkinType); + ExcludeClipRect(ACanvas.Handle, 2, 2, R.Right - 2 - ButtonWidth, R.Bottom - 2); + try + PaintDefault := True; + DoDrawBackground(ACanvas, R, pstPrePaint, PaintDefault); + + // Don't custom paint if we are on Vista with ComCtrls 6, let the + // OS draw the frame + VistaNewComCtrls := not (csDesigning in ComponentState) and (T = sknWindows) and SpIsWinVistaOrUp and ThemeServices.ThemesEnabled; + + if PaintDefault and (T <> sknNone) and not VistaNewComCtrls then begin + if csDesigning in ComponentState then + HotTrackFrame := False + else + if FHotTrack then + HotTrackFrame := FMouseInControl or Focused + else + HotTrackFrame := DroppedDown; + + ButtonR := GetDropDownButtonRect; + if T = sknSkin then + SpDrawParentBackground(Self, ACanvas.Handle, R); + SpDrawXPEditFrame(ACanvas, R, Enabled, HotTrackFrame, T); + if Style <> csSimple then + SpDrawXPComboButton(ACanvas, ButtonR, Enabled, HotTrackFrame, GetMouseInDropDownButton, DroppedDown, True, T); + end; + + PaintDefault := True; + DoDrawBackground(ACanvas, R, pstPostPaint, PaintDefault); + finally + SelectClipRgn(ACanvas.Handle, 0); + end; + finally + ACanvas.Unlock; + ACanvas.Free; + end; +end; + +procedure TSpTBXComboBox.CNMeasureItem(var Message: TWMMeasureItem); +// Automatically update the Height/ItemHeight when Style is csDropDown, +// csDropDownList or csSimple +// Recalc ItemHeight based on the font +var + I: Integer; +begin + inherited; + if not (Style in [csOwnerDrawFixed, csOwnerDrawVariable]) then begin + // When itemID = $FFFFFFFFFF the itemHeight is refering to the + // editbox height + if Message.MeasureItemStruct.itemID = High(LongWord) then begin + I := SpGetControlTextHeight(Self, Font); + Inc(I, 2); + end + else + I := GetItemHt; + Message.MeasureItemStruct^.itemHeight := I; + end; +end; + +procedure TSpTBXComboBox.CMSPFontChanged(var Message: TMessage); +// Automatically update the Height/ItemHeight when Style is csDropDown, +// csDropDownList or csSimple +// Recreate when the font is changed +begin + if not FFontChanging and not (Style in [csOwnerDrawFixed, csOwnerDrawVariable]) then begin + FFontChanging := True; + if not DroppedDown then RecreateWnd; + FFontChanging := False; + end; +end; + +procedure TSpTBXComboBox.WMSetFont(var Message: TWMSetFont); +// Automatically update the Height/ItemHeight when Style is csDropDown, +// csDropDownList or csSimple +// Recreate when the font is changed +begin + inherited; + if not FFontChanging and not (Style in [csOwnerDrawFixed, csOwnerDrawVariable]) then + PostMessage(Handle, CM_SPFONTCHANGED, 0, 0); +end; + +procedure TSpTBXComboBox.WMSpSkinChange(var Message: TMessage); +begin + inherited; + InvalidateFrame; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXListBox } + +constructor TSpTBXListBox.Create(AOwner: TComponent); +begin + inherited; + FHotTrack := True; + FSkinType := sknSkin; + SkinManager.AddSkinNotification(Self); + Style := lbOwnerDrawFixed; +end; + +procedure TSpTBXListBox.CreateParams(var Params: TCreateParams); +begin + inherited; + // Force the ListBox to be owner draw + with Params do + if Style and (LBS_OWNERDRAWFIXED or LBS_OWNERDRAWVARIABLE) = 0 then + Style := Style or LBS_OWNERDRAWFIXED; +end; + +destructor TSpTBXListBox.Destroy; +begin + SkinManager.RemoveSkinNotification(Self); + inherited; +end; + +procedure TSpTBXListBox.InvalidateBorders; +begin + if HandleAllocated then + RedrawWindow(Handle, nil, 0, RDW_FRAME or RDW_INVALIDATE); +end; + +procedure TSpTBXListBox.SetHotTrack(const Value: Boolean); +begin + if FHotTrack <> Value then begin + FHotTrack := Value; + InvalidateBorders; + end; +end; + +procedure TSpTBXListBox.SetSkinType(const Value: TSpTBXSkinType); +begin + if Value <> FSkinType then begin + FSkinType := Value; + InvalidateBorders; + end; +end; + +procedure TSpTBXListBox.CMFocusChanged(var Message: TCMFocusChanged); +begin + inherited; + if FHotTrack and Assigned(Message.Sender) then begin + FChildFocused := Self = Message.Sender; + if FChildFocused <> FHotTracking then begin + FHotTracking := FChildFocused; + InvalidateBorders; + end; + end; +end; + +procedure TSpTBXListBox.CMMouseEnter(var Message: TMessage); +begin + inherited; + if FHotTrack and not FHotTracking then begin + FHotTracking := True; + if SpCanEditFrameBeHotTracked(BorderStyle, SkinType) then + InvalidateBorders; + end; +end; + +procedure TSpTBXListBox.CMMouseLeave(var Message: TMessage); +begin + inherited; + if FHotTrack and FHotTracking and not FChildFocused then begin + FHotTracking := False; + if SpCanEditFrameBeHotTracked(BorderStyle, SkinType) then + InvalidateBorders; + end; +end; + +procedure TSpTBXListBox.WMSpSkinChange(var Message: TMessage); +begin + inherited; + InvalidateBorders; +end; + +procedure TSpTBXListBox.DoDrawItem(ACanvas: TCanvas; var ARect: TRect; + Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawItem) then FOnDrawItem(Self, ACanvas, ARect, Index, State, PaintStage, PaintDefault); +end; + +procedure TSpTBXListBox.DoDrawItemBackground(ACanvas: TCanvas; var ARect: TRect; + Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawItemBackground) then FOnDrawItemBackground(Self, ACanvas, ARect, Index, State, PaintStage, PaintDefault); +end; + +procedure TSpTBXListBox.DrawItem(Index: Integer; Rect: TRect; + State: TOwnerDrawState); +var + R: TRect; + Flags: Integer; + PaintDefault: Boolean; +begin + // Draw the item text + PaintDefault := True; + DoDrawItem(Canvas, Rect, Index, State, pstPrePaint, PaintDefault); + if PaintDefault then begin + Flags := DrawTextBiDiModeFlags(DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX); + + // It seems TabWidth doesn't work on owner-drawed listboxes, we have to do + // it manually using DT_EXPANDTABS. + // It seems that DrawText uses a different unit metric than LB_SETTABSTOPS, + // don't know how to calculate it correctly for more info: + // http://news.jrsoftware.org/read/article.php?id=15427&group=jrsoftware.toolbar2000.thirdparty#15427 + // Using DrawTextEx doesn't solve the problem, GetDialogBaseUnits doesn't help either + if TabWidth > 0 then + Flags := ((Flags or DT_EXPANDTABS or DT_TABSTOP) and not $800) or (Round(TabWidth * 0.3) shl 8); + + // Add a margin to the rect + R := Rect; + if not UseRightToLeftAlignment then + Inc(R.Left, 3) + else + Dec(R.Right, 3); + SpDrawXPText(Canvas, Items[Index], R, Flags); + end; + + PaintDefault := True; + DoDrawItem(Canvas, Rect, Index, State, pstPostPaint, PaintDefault); +end; + +procedure TSpTBXListBox.DrawItemBackground(Index: Integer; Rect: TRect; + State: TOwnerDrawState); +var + PaintDefault: Boolean; +begin + // Draw the item background + PaintDefault := True; + DoDrawItemBackground(Canvas, Rect, Index, State, pstPrePaint, PaintDefault); + if PaintDefault then + SpDrawXPListItemBackground(Canvas, Rect, odSelected in State, False, odFocused in State, SkinType); + + PaintDefault := True; + DoDrawItemBackground(Canvas, Rect, Index, State, pstPostPaint, PaintDefault); +end; + +procedure TSpTBXListBox.CNDrawItem(var Message: TWMDrawItem); +var + State: TOwnerDrawState; + SknState: TSpTBXSkinStatesType; +begin + with Message.DrawItemStruct^ do + begin + State := TOwnerDrawState(LongRec(itemState).Lo); + Canvas.Handle := hDC; + Canvas.Lock; + try + Canvas.Font := Font; + Canvas.Brush := Brush; + if (Integer(itemID) >= 0) and (Integer(itemID) < Items.Count) then begin + DrawItemBackground(itemID, rcItem, State); + + SknState := CurrentSkin.GetState(not (odDisabled in State), False, False, odSelected in State); + Canvas.Brush.Style := bsClear; + if SknState = sknsChecked then + 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) and (SpTBXSkinType(FSkinType) <> sknNone) then + if Ctl3D then + SpDrawXPEditFrame(Self, FHotTracking, FSkinType, True); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCheckListBox } + +constructor TSpTBXCheckListBox.Create(AOwner: TComponent); +begin + inherited; + FHotTrack := True; + FSkinType := sknSkin; + SkinManager.AddSkinNotification(Self); + Style := lbOwnerDrawFixed; +end; + +destructor TSpTBXCheckListBox.Destroy; +begin + SkinManager.RemoveSkinNotification(Self); + inherited; +end; + +procedure TSpTBXCheckListBox.InvalidateBorders; +begin + if HandleAllocated then + RedrawWindow(Handle, nil, 0, RDW_FRAME or RDW_INVALIDATE); +end; + +procedure TSpTBXCheckListBox.SetHotTrack(const Value: Boolean); +begin + if FHotTrack <> Value then begin + FHotTrack := Value; + InvalidateBorders; + end; +end; + +procedure TSpTBXCheckListBox.SetSkinType(const Value: TSpTBXSkinType); +begin + if Value <> FSkinType then begin + FSkinType := Value; + InvalidateBorders; + end; +end; + +procedure TSpTBXCheckListBox.CMFocusChanged(var Message: TCMFocusChanged); +begin + inherited; + if FHotTrack and Assigned(Message.Sender) then begin + FChildFocused := Self = Message.Sender; + if FChildFocused <> FHotTracking then begin + FHotTracking := FChildFocused; + InvalidateBorders; + end; + end; +end; + +procedure TSpTBXCheckListBox.CMMouseEnter(var Message: TMessage); +begin + inherited; + if FHotTrack and not FHotTracking then begin + FHotTracking := True; + if SpCanEditFrameBeHotTracked(BorderStyle, SkinType) then + InvalidateBorders; + end; +end; + +procedure TSpTBXCheckListBox.CMMouseLeave(var Message: TMessage); +begin + inherited; + if FHotTrack and FHotTracking and not FChildFocused then begin + FHotTracking := False; + if SpCanEditFrameBeHotTracked(BorderStyle, SkinType) then + InvalidateBorders; + end; +end; + +procedure TSpTBXCheckListBox.WMSpSkinChange(var Message: TMessage); +begin + inherited; + InvalidateBorders; +end; + +procedure TSpTBXCheckListBox.DoDrawItem(ACanvas: TCanvas; var ARect: TRect; + Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawItem) then FOnDrawItem(Self, ACanvas, ARect, Index, State, PaintStage, PaintDefault); +end; + +procedure TSpTBXCheckListBox.DoDrawItemBackground(ACanvas: TCanvas; + var ARect: TRect; Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawItemBackground) then FOnDrawItemBackground(Self, ACanvas, ARect, Index, State, PaintStage, PaintDefault); +end; + +procedure TSpTBXCheckListBox.DrawItem(Index: Integer; Rect: TRect; + State: TOwnerDrawState); +var + R: TRect; + Flags: Integer; + PaintDefault: Boolean; +begin + // Draw the item text + PaintDefault := True; + DoDrawItem(Canvas, Rect, Index, State, pstPrePaint, PaintDefault); + if PaintDefault then begin + Flags := DrawTextBiDiModeFlags(DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX); + + // Add a margin to the rect + R := Rect; + if not UseRightToLeftAlignment then + Inc(R.Left, 3) + else + Dec(R.Right, 3); + SpDrawXPText(Canvas, Items[Index], R, Flags); + end; + + PaintDefault := True; + DoDrawItem(Canvas, Rect, Index, State, pstPostPaint, PaintDefault); +end; + +procedure TSpTBXCheckListBox.DrawItemBackground(Index: Integer; Rect: TRect; + State: TOwnerDrawState); +var + ACheckWidth: Integer; + R: TRect; + PaintDefault: Boolean; +begin + // Draw the checkbox, background and focus + PaintDefault := True; + DoDrawItemBackground(Canvas, Rect, Index, State, pstPrePaint, PaintDefault); + if PaintDefault then begin + if not Header[Index] then begin + // Draw the checkbox + ACheckWidth := GetCheckWidth; + if not UseRightToLeftAlignment then begin + R.Right := Rect.Left; + R.Left := R.Right - ACheckWidth; + end + else begin + R.Left := Rect.Right; + R.Right := R.Left + ACheckWidth; + end; + R.Top := Rect.Top + (Rect.Bottom - Rect.Top - ACheckWidth) div 2; + R.Bottom := R.Top + ACheckWidth; + InflateRect(R, -1, -1); + + Canvas.FillRect(R); + SpDrawXPCheckBoxGlyph(Canvas, R, ItemEnabled[Index], Self.State[Index], False, False, SkinType); + + // Draw the background and focus + SpDrawXPListItemBackground(Canvas, Rect, odSelected in State, False, odFocused in State, SkinType); + end + else begin + Canvas.Font.Color := HeaderColor; + Canvas.Brush.Color := HeaderBackgroundColor; + Canvas.FillRect(Rect); + if odFocused in State then + SpDrawFocusRect(Canvas, Rect); + end; + end; + + PaintDefault := True; + DoDrawItemBackground(Canvas, Rect, Index, State, pstPostPaint, PaintDefault); +end; + +procedure TSpTBXCheckListBox.CNDrawItem(var Message: TWMDrawItem); +var + State: TOwnerDrawState; + SknState: TSpTBXSkinStatesType; +begin + if Items.Count = 0 then Exit; + + with Message.DrawItemStruct^ do + begin + State := TOwnerDrawState(LongRec(itemState).Lo); + Canvas.Handle := hDC; + Canvas.Lock; + try + Canvas.Font := Font; + Canvas.Brush := Brush; + if (Integer(itemID) >= 0) and (Integer(itemID) < Items.Count) then begin + // Exclude the checkbox area + if not Header[itemID] then + if not UseRightToLeftAlignment then + rcItem.Left := rcItem.Left + GetCheckWidth + else + rcItem.Right := rcItem.Right - GetCheckWidth; + + DrawItemBackground(itemID, rcItem, State); + + SknState := CurrentSkin.GetState(not (odDisabled in State), False, False, odSelected in State); + Canvas.Brush.Style := bsClear; + if SknState = sknsChecked then + 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) and (SpTBXSkinType(FSkinType) <> sknNone) then + if Ctl3D 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); +var + L, L2: Integer; +begin + if Item.ExtendedAccept then begin + Item.Text := EditControl.Text; + Item.SpinOptions.UpdateValueFromText(False); // Don't revert when an invalid text is entered + // Change the EditControl text and reposition the edit caret + L := Length(EditControl.Text); + EditControl.Text := Item.Text; + L2 := Length(EditControl.Text); + if L2 > L then + EditControl.SelStart := L + Length(Item.SpinOptions.Prefix); + end + else + inherited; +end; + +procedure TSpTBXSpinEditViewer.InternalEditControlExit; +begin + Item.Text := EditControl.Text; + Item.SpinOptions.UpdateValueFromText; + EditControl.Text := Item.Text; +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/internal/2.4.4/1/Source/SpTBXExtEditors.pas b/internal/2.4.4/1/Source/SpTBXExtEditors.pas new file mode 100644 index 0000000..8234abe --- /dev/null +++ b/internal/2.4.4/1/Source/SpTBXExtEditors.pas @@ -0,0 +1,1076 @@ +unit SpTBXExtEditors; + +{============================================================================== +Version 2.4.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: +2 December 2009 - version 2.4.4 + - No changes. + +13 September 2009 - version 2.4.3 + - Fixed incorrect TSpTBXColorEdit behavior, when the focus + was changed the text wasn't validated, thanks to Stephan + for reporting this. + +8 May 2009 - version 2.4.2 + - No changes. + +15 March 2009 - version 2.4.1 + - No changes. + +17 January 2009 - version 2.4 + - Initial release. + +==============================================================================} + +interface + +{$BOOLEVAL OFF} // Unit depends on short-circuit boolean evaluation + +uses + Windows, Messages, Classes, SysUtils, Controls, Graphics, ImgList, Forms, + Menus, StdCtrls, ExtCtrls, + SpTBXSkins, SpTBXItem, SpTBXEditors; + +type + TSpTBXColorListBoxStyle = ( + clbsStandardColors, // First 16 RGBI colors + 4 additional extended colors + clbsSystemColors, // System colors + clbsIncludeNone, // Include clNone color + clbsIncludeDefault, // Include clDefault color + clbsCustomColor, // First color is customizable + clbsPrettyNames, // Draw text with pretty names + clbsNoneAsTransparent // Draw clNone as transparent color + ); + TSpTBXColorListBoxStyles = set of TSpTBXColorListBoxStyle; + + { TSpTBXColorEditButton } + + TSpTBXColorEditButton = class(TSpTBXEditButton) + private + FSelectedColor: TColor; + procedure SetSelectedColor(const Value: TColor); + protected + function DoDrawItem(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage): Boolean; override; + function GetInternalDropDownMenu: TPopupMenu; override; + public + property SelectedColor: TColor read FSelectedColor write SetSelectedColor; + end; + + { TSpTBXColorEdit } + + TSpTBXColorEdit = class(TSpTBXEdit) + private + FColorButton: TSpTBXColorEditButton; + FSelectedFormat: TSpTBXColorTextType; + FOnSelectedColorChanged: TNotifyEvent; + function GetSelectedColor: TColor; + procedure SetSelectedColor(const Value: TColor); + procedure SetSelectedFormat(const Value: TSpTBXColorTextType); + procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS; + protected + procedure KeyPress(var Key: Char); override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure DoSelectedColorChanged; virtual; + procedure UpdateTextFromValue; + procedure UpdateValueFromText(RevertWhenInvalid: Boolean = True); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + property ColorButton: TSpTBXColorEditButton read FColorButton; + published + property Text stored False; + property SelectedColor: TColor read GetSelectedColor write SetSelectedColor; + property SelectedFormat: TSpTBXColorTextType read FSelectedFormat write SetSelectedFormat default cttIdentAndHTML; + property OnSelectedColorChanged: TNotifyEvent read FOnSelectedColorChanged write FOnSelectedColorChanged; + end; + + { TSpTBXFontComboBox } + + TSpTBXFontComboBoxPreview = class(TCustomControl) + private + FPreviewPanel: TPanel; + protected + procedure CreateParams(var Params: TCreateParams); override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + property PreviewPanel: TPanel read FPreviewPanel; + end; + + TSpTBXFontComboBox = class(TSpTBXComboBox) + private + FFontPreview: Boolean; + FFontNamePreview: Boolean; + FMaxMRUItems: Integer; + FMRUCount: Integer; + FPreviewWindow: TSpTBXFontComboBoxPreview; + FSelectedFont: TFontName; + FOnFontPreview: TSpTBXEditGetTextEvent; + procedure UpdateSelectedFont(AddMRU: Boolean); + procedure SetFontNamePreview(const Value: Boolean); + procedure SetSelectedFont(const Value: TFontName); + procedure SetMaxMRUItems(Value: Integer); + procedure SetFontPreview(const Value: Boolean); + protected + procedure Click; override; + procedure CloseUp; override; + procedure DoCalcMaxDropDownWidth; override; + procedure DoDrawItem(ACanvas: TCanvas; var ARect: TRect; Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); override; + procedure DropDown; override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure MRUAdd(AFontName: TFontName); + function MRUDelete(AFontName: TFontName): Boolean; + property MRUCount: Integer read FMRUCount; + published + property Items stored False; + property AutoDropDownWidth default True; + property AutoItemHeight default False; + property FontPreview: Boolean read FFontPreview write SetFontPreview default True; + property FontNamePreview: Boolean read FFontNamePreview write SetFontNamePreview default True; + property MaxMRUItems: Integer read FMaxMRUItems write SetMaxMRUItems default 5; + property SelectedFont: TFontName read FSelectedFont write SetSelectedFont; + property OnFontPreview: TSpTBXEditGetTextEvent read FOnFontPreview write FOnFontPreview; + end; + + { TSpTBXColorListBox } + + TSpTBXColorListBox = class(TSpTBXListBox) + private + FItems: Boolean; + FNeedToPopulate: Boolean; + FSelectedColor: TColor; + FStyle: TSpTBXColorListBoxStyles; + procedure ColorCallBack(const AName: string); + function GetColorName(Index: Integer): string; + function GetColor(Index: Integer): TColor; + function GetSelected: TColor; + procedure SetSelected(const Value: TColor); + procedure SetStyle(const Value: TSpTBXColorListBoxStyles); + protected + procedure CreateWnd; override; + procedure Loaded; override; + procedure DblClick; override; + procedure KeyPress(var Key: Char); override; + procedure DoDrawItem(ACanvas: TCanvas; var ARect: TRect; Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); override; + function PickCustomColor: Boolean; + procedure PopulateList; + public + constructor Create(AOwner: TComponent); override; + procedure AddColor(AColor: TColor; AColorName: string); + function ColorCount: Integer; + property Colors[Index: Integer]: TColor read GetColor; + property ColorNames[Index: Integer]: string read GetColorName; + published + property Items: Boolean read FItems; // Hides inherited Items property + property Selected: TColor read GetSelected write SetSelected default clBlack; + property Style: TSpTBXColorListBoxStyles read FStyle write SetStyle default [clbsStandardColors, clbsSystemColors, clbsNoneAsTransparent]; // Hides inherited Style property + end; + +{ Helpers } +procedure SpFillFontNames(ADest: TStrings); + +{ Painting helpers } +procedure SpDrawCheckeredBackground(ACanvas: TCanvas; ARect: TRect); +procedure SpDrawColorDropDownButton(ACanvas: TCanvas; ARect: TRect; Pushed: Boolean; AColor: TColor; CheckeredBkgndWhenTransparent: Boolean = True); + +var + FontGlyphImgList: TImageList = nil; + +implementation + +uses + Dialogs, TB2Common, SpTBXFormPopupMenu, SpTBXColorPickerForm; + +var + DefaultColorPickerDropDownMenu: TSpTBXColorEditPopupMenu = nil; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Helpers } + +procedure SpFillFontNames(ADest: TStrings); +// This will only work on Windows 2000 and above, more info on: +// http://www.delphipraxis.net/post712587.html&sid=945c12fa9fb826d76e51c80b42109a21#712587 + + function EnumFontsProcWin9x(EnumLogFontEx: PEnumLogFontEx; NewTextMetric: PNewTextMetric; + FontType: DWORD; LParam: LPARAM): Integer; stdcall; + var + S: string; + GlyphIndex: Integer; + L: TStrings; + const + NTM_PS_OPENTYPE = $00020000; + NTM_TT_OPENTYPE = $00040000; + begin + L := TStrings(LParam); + if FontType = TRUETYPE_FONTTYPE then + GlyphIndex := 1 + else + GlyphIndex := 0; + + S := EnumLogFontEx.elfLogFont.lfFaceName; + + if (S[1] <> '@') then + if (L.Count = 0) or not SameText(S, L[L.Count - 1]) then + L.AddObject(S, Pointer(GlyphIndex)); + + Result := 1; + end; + + function EnumFontsProc(EnumLogFontExDV: PEnumLogFontExDV; EnumTextMetric: PEnumTextMetric; + FontType: DWORD; LParam: LPARAM): Integer; stdcall; + var + S: string; + GlyphIndex: Integer; + L: TStrings; + const + NTM_PS_OPENTYPE = $00020000; + NTM_TT_OPENTYPE = $00040000; + begin + L := TStrings(LParam); + GlyphIndex := 0; + if ((EnumTextMetric.etmNewTextMetricEx.ntmTm.ntmFlags and NTM_TT_OPENTYPE) = NTM_TT_OPENTYPE) or + ((EnumTextMetric.etmNewTextMetricEx.ntmTm.ntmFlags and NTM_PS_OPENTYPE) = NTM_PS_OPENTYPE) then + GlyphIndex := 2 + else + if FontType = TRUETYPE_FONTTYPE then + GlyphIndex := 1; + + S := EnumLogFontExDV.elfEnumLogfontEx.elfLogFont.lfFaceName; + + if (S[1] <> '@') then + if (L.Count = 0) or not SameText(S, L[L.Count - 1]) then + L.AddObject(S, Pointer(GlyphIndex)); + + Result := 1; + end; + +var + DC: HDC; + LFont: TLogFont; + L: TStringList; +begin + L := TStringList.Create; + DC := GetDC(0); + try + FillChar(LFont, SizeOf(LFont), 0); + LFont.lfCharset := DEFAULT_CHARSET; + if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then + EnumFontFamiliesEx(DC, LFont, @EnumFontsProcWin9x, LongInt(L), 0) + else + EnumFontFamiliesEx(DC, LFont, @EnumFontsProc, LongInt(L), 0); + L.Sort; + ADest.Assign(L); + finally + ReleaseDC(0, DC); + L.Free; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Painting helpers } + +procedure SpDrawCheckeredBackground(ACanvas: TCanvas; ARect: TRect); +// Draws a 2x2 white and silver checkered background +var + R: TRect; + I, J, HCount, WCount: Integer; +const + Size = 2; +begin + WCount := (ARect.Right - ARect.Left) div Size; + HCount := (ARect.Bottom - ARect.Top) div Size; + for J := 0 to HCount do + for I := 0 to WCount do begin + R := Bounds(ARect.Left + (I * Size), ARect.Top + (J * Size), Size, Size); + if R.Right > ARect.Right then + R.Right := ARect.Right; + if R.Bottom > ARect.Bottom then + R.Bottom := ARect.Bottom; + if (I + J) mod 2 = 0 then + ACanvas.Brush.Color := clWhite + else + ACanvas.Brush.Color := clSilver; + ACanvas.FillRect(R); + end; +end; + +procedure SpDrawColorDropDownButton(ACanvas: TCanvas; ARect: TRect; + Pushed: Boolean; AColor: TColor; CheckeredBkgndWhenTransparent: Boolean); +// Draws a button used for color editboxes +var + R: TRect; +begin + R := ARect; + + ACanvas.Brush.Color := clBtnFace; + ACanvas.FillRect(R); + if not Pushed then + SpDrawRectangle(ACanvas, R, 0, clBtnHighlight, clBtnShadow); + + InflateRect(R, -2, -2); + if (AColor = clNone) and CheckeredBkgndWhenTransparent then begin + // Draw a checkered background when clNone is used + SpDrawCheckeredBackground(ACanvas, R); + end + else begin + ACanvas.Brush.Color := AColor; + ACanvas.FillRect(R); + end; + SpDrawRectangle(ACanvas, R, 0, clBtnShadow, clBtnHighlight); + + R := ARect; + R.Left := R.Right - 9; + R.Top := R.Bottom - 7; + ACanvas.Brush.Color := clBtnFace; + ACanvas.FillRect(R); + if Pushed then + SpDrawRectangle(ACanvas, R, 0, clBtnHighlight, clBtnFace) + else + SpDrawRectangle(ACanvas, R, 0, clBtnHighlight, clBtnShadow); + SpDrawArrow(ACanvas, R.Left + (R.Right - R.Left) div 2, R.Top + (R.Bottom - R.Top) div 2 - 1, clBlack, True, False, 2); + + R := ARect; + InflateRect(R, -1, -1); + SpDrawRectangle(ACanvas, R, 0, clBtnFace, clBtnFace); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXColorEditButton } + +function TSpTBXColorEditButton.DoDrawItem(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage): Boolean; +begin + if (PaintStage = pstPrePaint) and not BitmapValid then begin + Result := True; + if Assigned(OnDraw) then OnDraw(Self, ACanvas, ARect, PaintStage, Result); + if Result then + SpDrawColorDropDownButton(ACanvas, ARect, Pushed, FSelectedColor); + end + else + Result := inherited DoDrawItem(ACanvas, ARect, PaintStage); +end; + +function TSpTBXColorEditButton.GetInternalDropDownMenu: TPopupMenu; +begin + if Assigned(DropDownMenu) then + Result := DropDownMenu + else + Result := DefaultColorPickerDropDownMenu; +end; + +procedure TSpTBXColorEditButton.SetSelectedColor(const Value: TColor); +begin + if FSelectedColor <> Value then begin + FSelectedColor := Value; + Invalidate; + if Owner is TSpTBXColorEdit then begin + TSpTBXColorEdit(Owner).UpdateTextFromValue; + TSpTBXColorEdit(Owner).DoSelectedColorChanged; + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXColorEdit } + +constructor TSpTBXColorEdit.Create(AOwner: TComponent); +begin + inherited; + + FSelectedFormat := cttIdentAndHTML; + + FColorButton := TSpTBXColorEditButton.Create(Self); + FColorButton.Parent := Self; + FColorButton.FreeNotification(Self); + FColorButton.Align := alRight; + FColorButton.Width := 19; + UpdateEditRect; + + Text := 'clBlack'; +end; + +destructor TSpTBXColorEdit.Destroy; +begin + FreeAndNil(FColorButton); + inherited; +end; + +procedure TSpTBXColorEdit.DoSelectedColorChanged; +begin + if Assigned(FOnSelectedColorChanged) then FOnSelectedColorChanged(Self); +end; + +procedure TSpTBXColorEdit.KeyPress(var Key: Char); +begin + inherited; + if Key = #13 then begin + Key := #0; + UpdateValueFromText; + if FColorButton.IsDroppedDown and Assigned(ActiveFormPopupMenu) then + ActiveFormPopupMenu.ClosePopup(False); + end; +end; + +procedure TSpTBXColorEdit.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if (AComponent = FColorButton) and (Operation = opRemove) then + FColorButton := nil; +end; + +function TSpTBXColorEdit.GetSelectedColor: TColor; +begin + Result := FColorButton.SelectedColor; +end; + +procedure TSpTBXColorEdit.SetSelectedColor(const Value: TColor); +begin + FColorButton.SelectedColor := Value; +end; + +procedure TSpTBXColorEdit.SetSelectedFormat(const Value: TSpTBXColorTextType); +begin + if FSelectedFormat <> Value then begin + FSelectedFormat := Value; + UpdateTextFromValue; + end; +end; + +procedure TSpTBXColorEdit.UpdateTextFromValue; +begin + if (SelectedColor = clNone) or (SelectedColor = clDefault) then + Text := ColorToString(SelectedColor) + else + Text := SpColorToString(SelectedColor, FSelectedFormat); + SelStart := Length(Text); +end; + +procedure TSpTBXColorEdit.UpdateValueFromText(RevertWhenInvalid: Boolean = True); +var + WS: WideString; + PrevValue, NewValue, C: TColor; +begin + PrevValue := SelectedColor; + NewValue := SelectedColor; + WS := Text; + + // Try to parse the text to get the value + WS := Trim(WS); + if SpStringToColor(WS, C) then + NewValue := C; + + if RevertWhenInvalid or (NewValue <> PrevValue) then begin + SetSelectedColor(NewValue); + UpdateTextFromValue; + end; +end; + +procedure TSpTBXColorEdit.WMKillFocus(var Message: TWMKillFocus); +begin + inherited; + UpdateValueFromText; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXFontComboBoxPreview } + +constructor TSpTBXFontComboBoxPreview.Create(AOwner: TComponent); +begin + inherited; + + Visible := False; + SetBounds(0, 0, 0, 0); + Color := clWindow; + FPreviewPanel := TPanel.Create(Self); + FPreviewPanel.Parent := Self; + FPreviewPanel.Color := clWindow; + FPreviewPanel.BevelOuter := bvNone; + FPreviewPanel.Align := alClient; +end; + +procedure TSpTBXFontComboBoxPreview.CreateParams(var Params: TCreateParams); +const + CS_DROPSHADOW = $00020000; +begin + inherited; + with Params do begin + Style := (Style and not (WS_CHILD or WS_GROUP or WS_TABSTOP)) or WS_POPUP; + ExStyle := ExStyle or WS_EX_TOPMOST or WS_EX_TOOLWINDOW; + WindowClass.Style := WindowClass.Style or CS_SAVEBITS; + if IsWindowsXP then + WindowClass.Style := WindowClass.Style or CS_DROPSHADOW; + end; +end; + +destructor TSpTBXFontComboBoxPreview.Destroy; +begin + FreeAndNil(FPreviewPanel); + + inherited; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXFontComboBox } + +constructor TSpTBXFontComboBox.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FAutoDropDownWidthRightMargin := 60; + FFontNamePreview := True; + FFontPreview := True; + FMaxMRUItems := 5; + FMRUCount := 0; + AutoItemHeight := False; + AutoDropDownWidth := True; + ItemHeight := 23; +end; + +destructor TSpTBXFontComboBox.Destroy; +begin + FreeAndNil(FPreviewWindow); + inherited; +end; + +procedure TSpTBXFontComboBox.Click; +begin + UpdateSelectedFont(False); + inherited; +end; + +procedure TSpTBXFontComboBox.CloseUp; +begin + UpdateSelectedFont(True); + inherited; + FreeAndNil(FPreviewWindow); +end; + +procedure TSpTBXFontComboBox.DropDown; +var + W: Integer; + P: TPoint; + Sz: TSize; + WS: WideString; +begin + inherited; + + if FFontPreview then begin + WS := 'AaBbYyZz'; + FPreviewWindow := TSpTBXFontComboBoxPreview.Create(Self); + FPreviewWindow.ParentWindow := Application.Handle; + FPreviewWindow.PreviewPanel.Font.Size := 14; + + if Assigned(FOnFontPreview) then FOnFontPreview(Self, WS); + + FPreviewWindow.PreviewPanel.Caption := WS; + Sz := SpGetControlTextSize(FPreviewWindow.PreviewPanel, FPreviewWindow.PreviewPanel.Font, WS); + Inc(Sz.cx, 100); + Inc(Sz.cy, 20); + + W := SendMessage(Handle, CB_GETDROPPEDWIDTH, 0, 0); + P := Parent.ClientToScreen(Point(Left, Top)); + + if P.X + W + Sz.cx > Screen.Width then + Dec(P.X, Sz.cx) + else + Inc(P.X, W); + if P.Y + Height + Sz.cy > Screen.Height then + Dec(P.Y, Sz.cy) + else + Inc(P.Y, Height); + FPreviewWindow.SetBounds(P.X, P.Y, Sz.cx, Sz.cy); + FPreviewWindow.Visible := True; + ShowWindow(FPreviewWindow.Handle, SW_SHOWNA); + end; +end; + +procedure TSpTBXFontComboBox.DoCalcMaxDropDownWidth; +begin + if Items.Count <= 0 then begin + {$IFNDEF UNICODE} + SpFillFontNames(Items.AnsiStrings); + {$ELSE} + SpFillFontNames(Items); + {$ENDIF} + end; + + inherited; +end; + +procedure TSpTBXFontComboBox.DoDrawItem(ACanvas: TCanvas; var ARect: TRect; + Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +var + Flags, ImageIndex: Integer; + R: TRect; +const + Spacing = 4; +begin + inherited DoDrawItem(ACanvas, ARect, Index, State, PaintStage, PaintDefault); + if (PaintStage = pstPrePaint) and PaintDefault then begin + PaintDefault := False; // Override the default painting + // Draw the item glyph if the font is TrueType/OpenType + R := ARect; + R.Left := Spacing; + R.Top := R.Top + ((R.Bottom - R.Top) - FontGlyphImgList.Height) div 2; + ImageIndex := Integer(Items.Objects[Index]) - 1; + if ImageIndex > -1 then + FontGlyphImgList.Draw(ACanvas, R.Left, R.Top, ImageIndex); + + // Draw the item text + R := ARect; + R.Left := Spacing + FontGlyphImgList.Width + Spacing; + if FFontNamePreview then + ACanvas.Font.Name := Items[Index]; + Flags := DrawTextBiDiModeFlags(DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX); + SpDrawXPText(ACanvas, Items[Index], R, Flags); + + // Draw the MRU separator line + if FMaxMRUItems > 0 then begin + if Index = MRUCount - 1 then + SpDrawLine(ACanvas, ARect.Left, ARect.Bottom - 1, ARect.Right, ARect.Bottom - 1, $C0C0C0); + if Index = MRUCount then + SpDrawLine(ACanvas, ARect.Left, ARect.Top, ARect.Right, ARect.Top, $C0C0C0); + end; + + // Update the Font of the PreviewWindow + if Assigned(FPreviewWindow) and (odSelected in State) then + FPreviewWindow.PreviewPanel.Font.Name := Items[Index]; + end; +end; + +procedure TSpTBXFontComboBox.MRUAdd(AFontName: TFontName); +var + I, AFontNameIndex: Integer; +begin + AFontNameIndex := Items.IndexOf(AFontName); + if (AFontNameIndex > -1) and (FMRUCount < Items.Count) and (FMaxMRUItems > 0) then begin + // Exit if it's already on the list + for I := 0 to FMRUCount - 1 do + if SameText(AFontName, Items[I]) then Exit; + + // Add the font to the top and delete the last MRU item if necessary + Items.InsertObject(0, Items[AFontNameIndex], Items.Objects[AFontNameIndex]); + if FMRUCount >= FMaxMRUItems then + Items.Delete(FMRUCount) + else + Inc(FMRUCount); + end; +end; + +function TSpTBXFontComboBox.MRUDelete(AFontName: TFontName): Boolean; +var + I: Integer; +begin + Result := False; + for I := 0 to FMRUCount - 1 do + if SameText(AFontName, Items[I]) then begin + Items.Delete(I); + Result := True; + Break; + end; +end; + +procedure TSpTBXFontComboBox.SetMaxMRUItems(Value: Integer); +begin + if Value < 0 then Value := 0; + if FMaxMRUItems <> Value then begin + FMaxMRUItems := Value; + while FMRUCount > FMaxMRUItems do begin + Items.Delete(FMRUCount); + Dec(FMRUCount); + end; + end; +end; + +procedure TSpTBXFontComboBox.SetFontNamePreview(const Value: Boolean); +begin + if FFontNamePreview <> Value then begin + FFontNamePreview := Value; + Invalidate; + end; +end; + +procedure TSpTBXFontComboBox.SetFontPreview(const Value: Boolean); +begin + FFontPreview := Value; +end; + +procedure TSpTBXFontComboBox.SetSelectedFont(const Value: TFontName); +var + I: Integer; +begin + I := Items.IndexOf(Value); + if ItemIndex <> I then + ItemIndex := I; + UpdateSelectedFont(True); + + // If the Value is not valid clear the text and call the click events + if I = -1 then begin + Click; + Select; + end; +end; + +procedure TSpTBXFontComboBox.UpdateSelectedFont(AddMRU: Boolean); +var + I: Integer; +begin + I := ItemIndex; + if I > -1 then begin + FSelectedFont := Items[I]; + if AddMRU then + MRUAdd(FSelectedFont); + end + else + FSelectedFont := ''; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXColorListBox } + +constructor TSpTBXColorListBox.Create(AOwner: TComponent); +begin + inherited; + FStyle := [clbsStandardColors, clbsSystemColors, clbsNoneAsTransparent]; + FSelectedColor := clBlack; + PopulateList; +end; + +procedure TSpTBXColorListBox.CreateWnd; +begin + inherited CreateWnd; + if FNeedToPopulate then + PopulateList; +end; + +procedure TSpTBXColorListBox.DblClick; +begin + inherited; + if ItemIndex = 0 then + PickCustomColor; +end; + +procedure TSpTBXColorListBox.Loaded; +begin + inherited; + Selected := FSelectedColor; + if FNeedToPopulate then + PopulateList; +end; + +procedure TSpTBXColorListBox.AddColor(AColor: TColor; AColorName: string); +begin + (inherited Items).AddObject(AColorName, TObject(AColor)); +end; + +procedure TSpTBXColorListBox.ColorCallBack(const AName: string); +var + I, LStart: Integer; + LColor: TColor; + LName: string; +begin + LColor := StringToColor(AName); + if clbsPrettyNames in Style then begin + if AName = 'clBtnFace' then LName := 'Button Face' + else if AName = 'clBtnHighlight' then LName := 'Button Highlight' + else if AName = 'clBtnShadow' then LName := 'Button Shadow' + else if AName = 'clBtnText' then LName := 'Button Text' + else if AName = 'clMedGray' then LName := 'Medium Gray' + else if AName = 'clInfoBk' then LName := 'Info Background' + else if AName = 'cl3DDkShadow' then LName := '3D Dark Shadow' + else if AName = 'cl3DLight' then LName := '3D Light' + else begin + // Remove the 'cl' prefix and separate the words with a space + if Copy(AName, 1, 2) = 'cl' then + LStart := 3 + else + LStart := 1; + LName := ''; + for I := LStart to Length(AName) do begin + case AName[I] of + 'A'..'Z': + if LName <> '' then + LName := LName + ' '; + end; + LName := LName + AName[I]; + end; + end; + end + else + LName := AName; + + AddColor(LColor, LName); +end; + +function TSpTBXColorListBox.ColorCount: Integer; +begin + Result := (inherited Items).Count; +end; + +procedure TSpTBXColorListBox.DoDrawItem(ACanvas: TCanvas; var ARect: TRect; + Index: Integer; const State: TOwnerDrawState; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +var + R: TRect; + SavedBrushColor: TColor; +begin + if PaintStage = pstPrePaint then begin + // Paint the color glyphs + R := ARect; + R.Right := R.Left + 16 + 5; + ARect.Left := R.Right + 1; + inherited DoDrawItem(ACanvas, ARect, Index, State, PaintStage, PaintDefault); + if PaintDefault then begin + SavedBrushColor := ACanvas.Brush.Color; + try + InflateRect(R, -1, -1); + + ACanvas.Brush.Color := Colors[Index]; + if (ACanvas.Brush.Color = clNone) and (clbsNoneAsTransparent in Style) then + SpDrawCheckeredBackground(ACanvas, R) + else + ACanvas.FillRect(R); + + if odSelected in State then + ACanvas.Brush.Color := clWhite + else + ACanvas.Brush.Color := clBlack; + ACanvas.FrameRect(R); + finally + ACanvas.Brush.Color := SavedBrushColor; + end; + end; + end + else + inherited DoDrawItem(ACanvas, ARect, Index, State, PaintStage, PaintDefault); +end; + +function TSpTBXColorListBox.GetColor(Index: Integer): TColor; +begin + Result := TColor((inherited Items).Objects[Index]); +end; + +function TSpTBXColorListBox.GetColorName(Index: Integer): string; +begin + Result := (inherited Items)[Index]; +end; + +function TSpTBXColorListBox.GetSelected: TColor; +begin + if HandleAllocated then + if ItemIndex <> -1 then + Result := Colors[ItemIndex] + else + Result := clNone + else + Result := FSelectedColor; +end; + +procedure TSpTBXColorListBox.KeyPress(var Key: Char); +begin + inherited KeyPress(Key); + if (clbsCustomColor in Style) and (Key = #13) and (ItemIndex = 0) then begin + Key := #0; + PickCustomColor; + end; +end; + +function TSpTBXColorListBox.PickCustomColor: Boolean; +var + LColor: TColor; + CD: TColorDialog; +begin + Result := False; + if not (clbsCustomColor in Style) then Exit; + + CD := TColorDialog.Create(nil); + try + LColor := ColorToRGB(Colors[0]); + CD.Color := LColor; + CD.CustomColors.Text := Format('ColorA=%.8x', [LColor]); + CD.Options := CD.Options + [cdFullOpen]; + Result := CD.Execute; + if Result then begin + (inherited Items).Objects[0] := TObject(CD.Color); + Invalidate; + end; + finally + CD.Free; + end; +end; + +procedure TSpTBXColorListBox.PopulateList; + + procedure DeleteRange(const AMin, AMax: Integer); + var + I: Integer; + begin + for I := AMax downto AMin do + (inherited Items).Delete(I); + end; + + procedure DeleteColor(const AColor: TColor); + var + I: Integer; + begin + I := (inherited Items).IndexOfObject(TObject(AColor)); + if I <> -1 then + (inherited Items).Delete(I); + end; + +var + LSelectedColor, LCustomColor: TColor; +begin + if HandleAllocated and not (csLoading in ComponentState) then begin + (inherited Items).BeginUpdate; + try + // Get the custom color + LCustomColor := clBlack; + if (clbsCustomColor in Style) and ((inherited Items).Count > 0) then + LCustomColor := TColor((inherited Items).Objects[0]); + + LSelectedColor := FSelectedColor; + (inherited Items).Clear; + + GetColorValues(ColorCallBack); + if not (clbsIncludeNone in Style) then + DeleteColor(clNone); + if not (clbsIncludeDefault in Style) then + DeleteColor(clDefault); + if not (clbsSystemColors in Style) then + DeleteRange(StandardColorsCount + ExtendedColorsCount, (inherited Items).Count - 1); + if not (clbsStandardColors in Style) then + DeleteRange(0, StandardColorsCount + ExtendedColorsCount - 1); + + if clbsCustomColor in Style then + (inherited Items).InsertObject(0, '...', TObject(LCustomColor)); + + Selected := LSelectedColor; + finally + (inherited Items).EndUpdate; + FNeedToPopulate := False; + end; + end + else + FNeedToPopulate := True; +end; + +procedure TSpTBXColorListBox.SetSelected(const Value: TColor); +var + I, J: Integer; +begin + if HandleAllocated then begin + I := (inherited Items).IndexOfObject(TObject(Value)); + if (I = -1) and (clbsCustomColor in Style) then begin + // If the color is not on the list add it and select it + (inherited Items).Objects[0] := TObject(Value); + I := 0; + end + else + if (clbsCustomColor in Style) and (I = 0) then begin + // Try to find the color on the list before selecting the 1st custom color + for J := 1 to (inherited Items).Count - 1 do + if (inherited Items).Objects[J] = TObject(Value) then begin + I := J; + Break; + end; + end; + + if (ItemIndex = 0) and (I = 0) then + Invalidate + else + ItemIndex := I; + end; + + FSelectedColor := Value; +end; + +procedure TSpTBXColorListBox.SetStyle(const Value: TSpTBXColorListBoxStyles); +begin + if Style <> Value then begin + FStyle := Value; + Enabled := ([clbsStandardColors, clbsSystemColors, clbsCustomColor] * FStyle) <> []; + PopulateList; + if (ColorCount > 0) and (ItemIndex = -1) then + ItemIndex := 0; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Stock Objects } + +procedure InitializeStock; +begin + Screen.Cursors[crSpTBXEyeDropper] := LoadCursor(HInstance, 'CZEYEDROPPER'); + + FontGlyphImgList := TImageList.CreateSize(12, 12); + FontGlyphImgList.ResInstLoad(HInstance, rtBitmap, 'SPTBXTRUETYPE', clFuchsia); + FontGlyphImgList.ResInstLoad(HInstance, rtBitmap, 'SPTBXOPENTYPE', clFuchsia); + + DefaultColorPickerDropDownMenu := TSpTBXColorEditPopupMenu.Create(nil); +end; + +procedure FinalizeStock; +begin + FreeAndNil(FontGlyphImgList); + FreeAndNil(DefaultColorPickerDropDownMenu); +end; + +initialization + InitializeStock; + +finalization + FinalizeStock; + +end. diff --git a/internal/2.4.4/1/Source/SpTBXFormPopupMenu.pas b/internal/2.4.4/1/Source/SpTBXFormPopupMenu.pas new file mode 100644 index 0000000..8922f78 --- /dev/null +++ b/internal/2.4.4/1/Source/SpTBXFormPopupMenu.pas @@ -0,0 +1,1192 @@ +unit SpTBXFormPopupMenu; + +{============================================================================== +Version 2.4.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: +2 December 2009 - version 2.4.4 + - Added AutoSize property to TSpTBXFormPopupMenu. + +13 September 2009 - version 2.4.3 + - No changes. + +8 May 2009 - version 2.4.2 + - No changes. + +15 March 2009 - version 2.4.1 + - No changes. + +17 January 2009 - version 2.4 + - Fixed incorrect focus handling on TSpTBXFormPopupMenu, + when a dialog is showed on top of a TSpTBXFormPopupMenu and + the app is deactivated the Popup is closed but the dialog + stays, thanks to Sertac Akyuz for reporting this. + +26 September 2008 - version 2.3 + - No changes. + +29 July 2008 - version 2.2 + - No changes. + +26 June 2008 - version 2.1 + - No changes. + +3 May 2008 - version 2.0 + - No changes. + +2 April 2008 - version 1.9.5 + - No changes. + +3 February 2008 - version 1.9.4 + - No changes. + +19 January 2008 - version 1.9.3 + - No changes. + +26 December 2007 - version 1.9.2 + - Fixed incorrect focus handling on TSpTBXFormPopupMenu, + thanks to Costas Stergiou for reporting this. + +1 December 2007 - version 1.9.1 + - Removed TBX dependency. + +20 November 2007 - version 1.9 + - Removed TBX dependency. + +8 February 2007 - version 1.8.3 + - No changes. + +17 December 2006 - version 1.8.2 + - No changes. + +24 November 2006 - version 1.8.1 + - Fixed TSpTBXFormPopupMenu resizing flicker. + +27 August 2006 - version 1.8 + - Initial release. + +==============================================================================} + +interface + +{$BOOLEVAL OFF} // Unit depends on short-circuit boolean evaluation +{$I TB2Ver.inc} + +uses + Windows, Messages, Classes, SysUtils, Controls, Graphics, ImgList, Forms, + Menus, StdCtrls, TB2Item, TB2Anim, SpTBXSkins, SpTBXItem; + +const + WM_SPTBX_POPUPINVALIDATE = WM_USER + 887; + WM_SPTBX_POPUPROLLUP = WM_USER + 888; + +type + TSpTBXFormPopupMenu = class; + TSpTBXCustomWrapperPopupForm = class; + + TSpTBXPopupAnimationType = ( + patNone, + patSlide, + patFade + ); + + TSpTBXPopupBorderStyleType = ( + pbsFrame, + pbsSizeable, + pbsSizeableBottom, + pbsSizeableRightBottom + ); + + TSpTBXPopupFormState = record + PopupForm: TCustomForm; + BorderStyle: TFormBorderStyle; + BoundsRect: TRect; + end; + + TSpTBXRollDownEvent = procedure(Sender: TObject; var FormWidth, FormHeight: Integer) of object; + TSpTBXRollUpEvent = procedure(Sender: TObject; Selected: Boolean) of object; + TSpTBXGetFormClassEvent = procedure(Sender: TObject; var AFormClass: TCustomFormClass) of object; + + { TSpTBXPopupSizeGrip } + + TSpTBXPopupSizeGrip = class(TWinControl) + private + FSkinType: TSpTBXSkinType; + FOnDrawBackground: TSpTBXDrawEvent; + procedure WMSetCursor(var Message: TWMSetCursor); message WM_SETCURSOR; + procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND; + protected + FPopupForm: TSpTBXCustomWrapperPopupForm; + procedure DoDrawBackground(ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); override; + public + constructor Create(AOwner: TComponent); override; + function GetGripRect: TRect; + function GetGripSizerRect: TRect; + function IsScreenPointInGrip(P: TPoint): Boolean; + published + property SkinType: TSpTBXSkinType read FSkinType write FSkinType default sknSkin; + property OnDrawBackground: TSpTBXDrawEvent read FOnDrawBackground write FOnDrawBackground; + end; + + { TSpTBXWrapperPopupForm } + + TSpTBXCustomWrapperPopupForm = class(TCustomForm) + private + FHooksInstalled: Boolean; + FOldAppOnMessage: TMessageEvent; + FOldPopupControlWndProc: TWndMethod; + FShowShadows: Boolean; + FAnimation: TSpTBXPopupAnimationType; + FAnimationDirection: TTBAnimationDirection; + FBorderStyle: TSpTBXPopupBorderStyleType; + FOnRollDown: TNotifyEvent; + FOnRollUp: TSpTBXRollUpEvent; + procedure SetBorderStyle(const Value: TSpTBXPopupBorderStyleType); + procedure InstallHooks; + procedure UninstallHooks; + procedure CMChildKey(var Message: TCMChildKey); message CM_CHILDKEY; + procedure CMCancelMode(var Message: TCMCancelMode); message CM_CANCELMODE; + procedure WMActivate(var Message: TWMActivate); message WM_ACTIVATE; + procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND; + procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE; + procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST; + procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT; + procedure WMPrint(var Message: TMessage); message WM_PRINT; + procedure WMSpTBXPopupInvalidate(var Message: TMessage); message WM_SPTBX_POPUPINVALIDATE; + procedure WMSpTBXPopupRollUp(var Message: TMessage); message WM_SPTBX_POPUPROLLUP; + protected + FPopupControl: TControl; + FFormPopupMenu: TSpTBXFormPopupMenu; + FPaintingClientArea: Boolean; + FSizeGrip: TSpTBXPopupSizeGrip; + procedure CreateParams(var Params: TCreateParams); override; + procedure PaintBackground(ACanvas: TCanvas; ARect: TRect); virtual; abstract; + function GetSysAnimation: TSpTBXPopupAnimationType; + procedure AppOnMessageHook(var Msg: TMsg; var Handled: Boolean); virtual; + procedure PopupControlWindowProc(var Message: TMessage); virtual; + procedure DoRollDown; virtual; + procedure DoRollUp(Selected: Boolean); virtual; + property Animation: TSpTBXPopupAnimationType read FAnimation write FAnimation; + property AnimationDirection: TTBAnimationDirection read FAnimationDirection write FAnimationDirection default []; + property BorderStyle: TSpTBXPopupBorderStyleType read FBorderStyle write SetBorderStyle default pbsFrame; + property ShowShadows: Boolean read FShowShadows write FShowShadows default True; + property OnRollDown: TNotifyEvent read FOnRollDown write FOnRollDown; + property OnRollUp: TSpTBXRollUpEvent read FOnRollUp write FOnRollUp; + public + constructor Create(AFormPopupMenu: TSpTBXFormPopupMenu); reintroduce; virtual; + destructor Destroy; override; + procedure RollDown(X, Y, AWidth, AHeight: Integer; FocusPopup: Boolean = True); overload; virtual; + procedure RollDown(APopupControl: TControl; AWidth, AHeight: Integer; IsVertical: Boolean = False; FocusPopup: Boolean = True); overload; virtual; + procedure RollUp(Selected: Boolean; FocusParentControl: Boolean = True); virtual; + property FormPopupMenu: TSpTBXFormPopupMenu read FFormPopupMenu; + end; + + TSpTBXWrapperPopupForm = class(TSpTBXCustomWrapperPopupForm) + private + FSkinType: TSpTBXSkinType; + procedure CMShowingChanged(var Message: TMessage); message CM_SHOWINGCHANGED; + procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND; + procedure SetSkinType(const Value: TSpTBXSkinType); + protected + procedure DestroyWindowHandle; override; + procedure PaintBackground(ACanvas: TCanvas; ARect: TRect); override; + public + constructor Create(AFormPopupMenu: TSpTBXFormPopupMenu); override; + destructor Destroy; override; + published + property Height; + property Width; + property BorderStyle; + property ShowShadows; + property OnRollDown; + property OnRollUp; + property SkinType: TSpTBXSkinType read FSkinType write SetSkinType default sknSkin; + end; + + { TSpTBXFormPopupMenu } + + TSpTBXFormPopupMenu = class(TPopupMenu, ISpTBXPopupMenu) + private + FAutoSize: Boolean; + FItems: Boolean; + FNotifies: TList; + FPopupFocus: Boolean; + FPopupFormState: TSpTBXPopupFormState; + FPopupFormPrevSize: TSize; + FSkinType: TSpTBXSkinType; + FOnClosePopup: TSpTBXRollUpEvent; + FOnBeforeClosePopup: TSpTBXRollUpEvent; + FOnBeforePopup: TSpTBXRollDownEvent; + FOnGetPopupFormClass: TSpTBXGetFormClassEvent; + function GetBorderStyle: TSpTBXPopupBorderStyleType; + function GetShowShadows: Boolean; + procedure SetBorderStyle(const Value: TSpTBXPopupBorderStyleType); + procedure SetShowShadows(const Value: Boolean); + procedure SetPopupForm(const Value: TCustomForm); + procedure SetSkinType(const Value: TSpTBXSkinType); + protected + FPopupForm: TCustomForm; + FWrapperForm: TSpTBXWrapperPopupForm; // Container of FPopupForm + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure BroadcastCloseMessage(Selected: Boolean); + procedure DoGetPopupFormClass(var AFormClass: TCustomFormClass); virtual; + function InternalPopup(X, Y: Integer; ForceFocus: Boolean; PopupControl: TControl = nil): Boolean; virtual; + procedure InternalClosePopup(Sender: TObject; Selected: Boolean); virtual; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Popup(X: Integer; Y: Integer); override; + procedure PopupEx(X, Y: Integer; ForceFocus: Boolean); overload; + procedure PopupEx(PopupControl: TControl; ForceFocus: Boolean); overload; + procedure AddCloseNotification(AObject: TObject); + procedure RemoveCloseNotification(AObject: TObject); + procedure ClosePopup(Selected: Boolean); + property PopupForm: TCustomForm read FPopupForm write SetPopupForm; + published + property Items: Boolean read FItems; // Hide the Items property + property AutoSize: Boolean read FAutoSize write FAutoSize default False; + property BorderStyle: TSpTBXPopupBorderStyleType read GetBorderStyle write SetBorderStyle default pbsFrame; + property PopupFocus: Boolean read FPopupFocus write FPopupFocus default False; + property ShowShadows: Boolean read GetShowShadows write SetShowShadows default True; + property SkinType: TSpTBXSkinType read FSkinType write SetSkinType default sknSkin; + property OnClosePopup: TSpTBXRollUpEvent read FOnClosePopup write FOnClosePopup; + property OnBeforeClosePopup: TSpTBXRollUpEvent read FOnBeforeClosePopup write FOnBeforeClosePopup; + property OnBeforePopup: TSpTBXRollDownEvent read FOnBeforePopup write FOnBeforePopup; + property OnGetPopupFormClass: TSpTBXGetFormClassEvent read FOnGetPopupFormClass write FOnGetPopupFormClass; + end; + +var + ActiveFormPopupMenu: TSpTBXFormPopupMenu = nil; + +implementation + +uses + Themes, UxTheme, Types, TB2Common, TB2Acc; + +const + DefaultBorderSize = 2; + +type + TCustomFormAccess = class(TCustomForm); + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXPopupSizeGrip } + +constructor TSpTBXPopupSizeGrip.Create(AOwner: TComponent); +begin + inherited; + if Assigned(AOwner) and (AOwner is TSpTBXCustomWrapperPopupForm) then + FPopupForm := AOwner as TSpTBXCustomWrapperPopupForm; + FSkinType := sknSkin; + Align := alBottom; + Height := 10; +end; + +procedure TSpTBXPopupSizeGrip.DoDrawBackground(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawBackground) then FOnDrawBackground(Self, ACanvas, ARect, PaintStage, PaintDefault); +end; + +function TSpTBXPopupSizeGrip.GetGripRect: TRect; +begin + // Return the rect of the area that is sizeable. + // If BorderStyle = pbsSizeableRightBottom the sizeable area is the + // bottom right corner, when BorderStyle = pbsSizeableRightBottom the + // sizeable area is the client rect of the SizeGrip + Result := Rect(0, 0, 0, 0); + if not (csDestroying in ComponentState) and Assigned(FPopupForm) and + (FPopupForm.FBorderStyle in [pbsSizeableBottom, pbsSizeableRightBottom]) then + begin + Result := ClientRect; + if FPopupForm.BorderStyle = pbsSizeableRightBottom then + Result := GetGripSizerRect + else + Result := ClientRect; + end; +end; + +function TSpTBXPopupSizeGrip.GetGripSizerRect: TRect; +begin + // Return the rect of the grip sizer, the area that has the + // dots on the sizer. + Result := Rect(0, 0, 0, 0); + if not (csDestroying in ComponentState) and Assigned(FPopupForm) then begin + case FPopupForm.BorderStyle of + pbsSizeableBottom: + begin + Result := ClientRect; + Result.Left := (Result.Right + Result.Left - 20) div 2; + Result.Right := Result.Left + 20; + end; + pbsSizeableRightBottom: + begin + Result := ClientRect; + Result.Left := Result.Right - 14; + end; + end; + end; +end; + +function TSpTBXPopupSizeGrip.IsScreenPointInGrip(P: TPoint): Boolean; +var + GR: TRect; +begin + Result := False; + P := ScreenToClient(P); + GR := GetGripRect; + if not IsRectEmpty(GR) and PtInRect(GR, P) then + Result := True; +end; + +procedure TSpTBXPopupSizeGrip.MouseDown(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +var + P: TPoint; +const + SC_SizeDown = $F006; + SC_SizeDownRight = $F008; +begin + // Resize the StatusBar if the parent is TSpTBXTitleBar + if not (csDesigning in ComponentState) and (Button = mbLeft) and Assigned(FPopupForm) then begin + P := ClientToScreen(Point(X, Y)); + if IsScreenPointInGrip(P) then begin + ReleaseCapture; + case FPopupForm.BorderStyle of + pbsSizeableBottom: + SendMessage(FPopupForm.Handle, WM_SYSCOMMAND, SC_SizeDown, 0); + pbsSizeableRightBottom: + SendMessage(FPopupForm.Handle, WM_SYSCOMMAND, SC_SizeDownRight, 0); + end; + Exit; + end; + end; + + inherited; +end; + +procedure TSpTBXPopupSizeGrip.WMEraseBkgnd(var Message: TWMEraseBkgnd); +var + ACanvas: TCanvas; + PaintDefault: Boolean; + R, GR, CellR: TRect; + C1, C2: TColor; + T: TSpTBXSkinType; +begin + Message.Result := 1; + if (csDestroying in ComponentState) then Exit; + + ACanvas := TCanvas.Create; + ACanvas.Handle := Message.DC; + try + R := ClientRect; + T := SpTBXSkinType(FSkinType); + + // Draw the background + PaintDefault := True; + DoDrawBackground(ACanvas, R, pstPrePaint, PaintDefault); + if PaintDefault then begin + GR := Rect(0, 0, 0, 0); + SpDrawXPStatusBar(ACanvas, R, GR, T); + end; + + // Draw the grip + PaintDefault := True; + DoDrawBackground(ACanvas, R, pstPostPaint, PaintDefault); + if PaintDefault then begin + C1 := SkinManager.CurrentSkin.Options(skncStatusBarGrip).Body.Color1; + if (C1 = clNone) or (T <> sknSkin) then C1 := clBtnShadow; + C2 := SkinManager.CurrentSkin.Options(skncStatusBarGrip).Body.Color2; + if (C2 = clNone) or (T <> sknSkin) then C2 := clBtnHighlight; + // Grip cells are 4x4 pixels + case FPopupForm.BorderStyle of + pbsSizeableBottom: + begin + GR := GetGripSizerRect; + CellR := GR; + CellR.Top := (CellR.Top + CellR.Bottom - 4) div 2 + 1; + CellR.Bottom := CellR.Top + 3; + SpDrawXPGrip(ACanvas, CellR, C1, C2); + end; + pbsSizeableRightBottom: + begin + GR := GetGripSizerRect; + CellR := GR; + // Draw 2 cells at the bottom + CellR.Left := GR.Right - 8; + CellR.Top := CellR.Bottom - 4; + SpDrawXPGrip(ACanvas, CellR, C1, C2); + // Draw 1 cell at the top + CellR.Bottom := CellR.Top; + CellR.Top := CellR.Bottom - 4; + CellR.Left := CellR.Left + 4; + SpDrawXPGrip(ACanvas, CellR, C1, C2); + end; + end; + end; + finally + ACanvas.Handle := 0; + ACanvas.Free; + end; +end; + +procedure TSpTBXPopupSizeGrip.WMSetCursor(var Message: TWMSetCursor); +var + P: TPoint; +begin + if not (csDesigning in ComponentState) and (Message.CursorWnd = Handle) and + (Screen.Cursor = crDefault) and Assigned(FPopupForm) then + begin + GetCursorPos(P); + if IsScreenPointInGrip(P) then begin + case FPopupForm.BorderStyle of + pbsSizeableBottom: + Windows.SetCursor(Screen.Cursors[-7]); + pbsSizeableRightBottom: + Windows.SetCursor(Screen.Cursors[-8]); + end; + Message.Result := 1; + Exit; + end; + end; + + inherited; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomWrapperPopupForm } + +constructor TSpTBXCustomWrapperPopupForm.Create(AFormPopupMenu: TSpTBXFormPopupMenu); +begin + // Form doesn't have DFM info + inherited CreateNew(nil); + + Visible := False; + SetBounds(0, 0, 0, 0); + FFormPopupMenu := AFormPopupMenu; + FAnimation := GetSysAnimation; + FAnimationDirection := []; + FShowShadows := True; + FSizeGrip := TSpTBXPopupSizeGrip.Create(Self); + FSizeGrip.Parent := Self; +end; + +procedure TSpTBXCustomWrapperPopupForm.CreateParams(var Params: TCreateParams); +begin + inherited; + if not (csDesigning in ComponentState) then + with Params do begin + Style := WS_POPUP or WS_CLIPCHILDREN; + + // Add the thickframe on all the BorderStyles + // We should handle the NC HitTest + Style := Style or WS_THICKFRAME; + + ExStyle := WS_EX_TOPMOST or WS_EX_TOOLWINDOW; + WindowClass.Style := WindowClass.Style or CS_SAVEBITS; + if IsWindowsXP then + WindowClass.Style := WindowClass.Style or CS_DROPSHADOW; + end; +end; + +destructor TSpTBXCustomWrapperPopupForm.Destroy; +begin + FreeAndNil(FSizeGrip); + inherited; +end; + +procedure TSpTBXCustomWrapperPopupForm.DoRollDown; +begin + if Assigned(FOnRollDown) then FOnRollDown(Self); +end; + +procedure TSpTBXCustomWrapperPopupForm.DoRollUp(Selected: Boolean); +begin + if Assigned(FOnRollUp) then FOnRollUp(Self, Selected); +end; + +function TSpTBXCustomWrapperPopupForm.GetSysAnimation: TSpTBXPopupAnimationType; +const + SPI_GETMENUFADE = $1012; +var + Animate: BOOL; +begin + Result := patNone; + if SystemParametersInfo(SPI_GETMENUANIMATION, 0, @Animate, 0) and Animate then + if SystemParametersInfo(SPI_GETMENUFADE, 0, @Animate, 0) and Animate then + Result := patFade + else + Result := patSlide; +end; + +procedure TSpTBXCustomWrapperPopupForm.RollDown(X, Y, AWidth, + AHeight: Integer; FocusPopup: Boolean = True); +begin + if not Visible then begin + ActiveFormPopupMenu := FFormPopupMenu; // Set global variable used by RollUp + // If FPopupControl is nil we should use the ActiveForm to set focus on RollUp + if not Assigned(FPopupControl) then + FPopupControl := Screen.ActiveForm; + // Increase the size of the form if the size grip is visible + if FBorderStyle in [pbsSizeableBottom, pbsSizeableRightBottom] then begin + FSizeGrip.Visible := True; + AHeight := AHeight + FSizeGrip.Height; + end + else + FSizeGrip.Visible := False; + + InstallHooks; + HandleNeeded; // We need the handle to set the Bounds and deactivate Vista form thick borders + SetBounds(X, Y, AWidth, AHeight); + SpActivateDwmNC(Self, False); + // Make sure it will be showed on top of all the forms/dialogs + SetWindowPos(WindowHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE or SWP_NOACTIVATE); + Visible := True; + if FocusPopup then + SetFocus; + DoRollDown; + end; +end; + +procedure TSpTBXCustomWrapperPopupForm.RollDown(APopupControl: TControl; + AWidth, AHeight: Integer; IsVertical: Boolean = False; + FocusPopup: Boolean = True); +var + P, Size: TPoint; +begin + if Assigned(APopupControl) and Assigned(APopupControl.Parent) then begin + FPopupControl := APopupControl; + // Increase the size of the form if the size grip is visible + Size.X := AWidth; + Size.Y := AHeight; + if FBorderStyle in [pbsSizeableBottom, pbsSizeableRightBottom] then + Size.Y := Size.Y + FSizeGrip.Height; + + P := SpCalcPopupPosition(0, 0, Size.X, Size.Y, APopupControl, IsVertical); + RollDown(P.X, P.Y, AWidth, AHeight, FocusPopup); + end; +end; + +procedure TSpTBXCustomWrapperPopupForm.RollUp(Selected: Boolean; FocusParentControl: Boolean = True); +var + W: TWinControl; + Msg: TMessage; +begin + // Instead of checking for Self.Visible check if the actual wrapped form + // is visible. + if FFormPopupMenu.PopupForm.Visible then begin + UninstallHooks; + + if Assigned(FPopupControl) and (FPopupControl is TWinControl) then begin + W := FPopupControl as TWinControl; + if FocusParentControl and W.CanFocus then + W.SetFocus; + // Send a message to the PopupControl and it's children controls + // to inform that the Popup was closed. + Msg.Msg := CM_SPPOPUPCLOSE; + Msg.WParam := Integer(Self); + if Selected then + Msg.LParam := 1 + else + Msg.LParam := 0; + Msg.Result := 0; + PostMessage(W.Handle, Msg.Msg, Msg.WParam, Msg.LParam); + W.Broadcast(Msg); + end; + + Visible := False; + + // Broadcast the close message to all the notifies + if Assigned(ActiveFormPopupMenu) then + ActiveFormPopupMenu.BroadcastCloseMessage(Selected); + ActiveFormPopupMenu := nil; // Reset global variable + FPopupControl := nil; + DoRollUp(Selected); + end; +end; + +procedure TSpTBXCustomWrapperPopupForm.SetBorderStyle(const Value: TSpTBXPopupBorderStyleType); +begin + if FBorderStyle <> Value then + FBorderStyle := Value; +end; + +procedure TSpTBXCustomWrapperPopupForm.InstallHooks; +begin + if not FHooksInstalled then begin + FHooksInstalled := True; + + // Needed to handle main form mouse clicks when the popup is visible + FOldAppOnMessage := Application.OnMessage; + Application.OnMessage := AppOnMessageHook; + + if Assigned(FPopupControl) then begin + // Needed to handle focus changes when the popup is visible but the + // ParentControl has the focus, like the Comboboxes + FOldPopupControlWndProc := FPopupControl.WindowProc; + FPopupControl.WindowProc := PopupControlWindowProc; + end; + end; +end; + +procedure TSpTBXCustomWrapperPopupForm.UninstallHooks; +begin + if FHooksInstalled then begin + FHooksInstalled := False; + + Application.OnMessage := FOldAppOnMessage; + FOldAppOnMessage := nil; + + if Assigned(FPopupControl) then begin + FPopupControl.WindowProc := FOldPopupControlWndProc; + FOldPopupControlWndProc := nil; + end; + end; +end; + +procedure TSpTBXCustomWrapperPopupForm.AppOnMessageHook(var Msg: TMsg; var Handled: Boolean); +begin + if Assigned(FOldAppOnMessage) then FOldAppOnMessage(Msg, Handled); + + if not IsWindowEnabled(Handle) then begin + Handled := False; + Exit; + end; + + case Msg.message of + CM_DEACTIVATE: + begin + // Rollup when the popup is deactivated + // Instead of calling Rollup post a message so the + // Application.OnMessage is processed before + // the popup is closed, this is needed to handle + // the mouse clicks on the main form + PostMessage(Handle, WM_SPTBX_POPUPROLLUP, 0, 0); // Set FocusParentControl param to False + end; + WM_LBUTTONDOWN, WM_RBUTTONDOWN, WM_MBUTTONDOWN: + // If the click was not on the popup, rollup and Handle the message + if (GetCapture = 0) and (Msg.hwnd <> Handle) and not Windows.IsChild(Handle, Msg.hwnd) then + if Assigned(FPopupControl) and not (FPopupControl is TCustomForm) and (FPopupControl is TWinControl) then begin + if Msg.hwnd <> TWinControl(FPopupControl).Handle 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); +// ^ Not needed + 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); + // Post the invalidate message on Vista to repaint the form borders + if SpIsWinVistaOrUp then + PostMessage(Handle, WM_SPTBX_POPUPINVALIDATE, 0, 0); + end; +end; + +procedure TSpTBXCustomWrapperPopupForm.WMNCCalcSize(var Message: TWMNCCalcSize); +begin + Message.Result := 0; + InflateRect(Message.CalcSize_Params^.rgrc[0], -DefaultBorderSize, -DefaultBorderSize); +end; + +procedure TSpTBXCustomWrapperPopupForm.WMNCHitTest(var Message: TWMNCHitTest); +var + P: TPoint; + GR: TRect; + HitOnBorder: Boolean; +begin + inherited; + + HitOnBorder := Message.Result in [HTLEFT, HTTOP, HTTOPLEFT, HTTOPRIGHT, HTRIGHT, HTBOTTOM, HTBOTTOMLEFT, HTBOTTOMRIGHT]; + + if HitOnBorder then + case FBorderStyle of + pbsFrame: + Message.Result := HTNOWHERE; + pbsSizeableBottom: + begin + // Make the NC area resizeable + Message.Result := HTNOWHERE; + P := FSizeGrip.ScreenToClient(SmallPointToPoint(Message.Pos)); + GR := FSizeGrip.GetGripRect; + if P.Y >= GR.Top then + Message.Result := HTBOTTOM; + end; + pbsSizeableRightBottom: + begin + // Make the NC area resizeable + Message.Result := HTNOWHERE; + P := FSizeGrip.ScreenToClient(SmallPointToPoint(Message.Pos)); + GR := FSizeGrip.GetGripRect; + if P.Y >= GR.Top then + if P.X >= GR.Left then + Message.Result := HTBOTTOMRIGHT; + end; + end; +end; + +procedure PopupWindowNCPaintProc(Wnd: HWND; DC: HDC; AppData: TObject); +// Paints the NC area and the client background, used by WMEraseBkgnd, WMNCPaint, WMPrint +var + ACanvas: TCanvas; + R: TRect; + PopupWindow: TSpTBXCustomWrapperPopupForm; +begin + ACanvas := TCanvas.Create; + try + ACanvas.Handle := DC; + GetWindowRect(Wnd, R); + OffsetRect(R, -R.Left, -R.Top); + + // If it's used by WM_ERASEBKGND offset the rect + PopupWindow := TSpTBXCustomWrapperPopupForm(AppData); + if PopupWindow.FPaintingClientArea then begin + PopupWindow.FPaintingClientArea := False; + OffsetRect(R, -DefaultBorderSize, -DefaultBorderSize); + end; + + PopupWindow.PaintBackground(ACanvas, R); + finally + ACanvas.Handle := 0; + ACanvas.Free; + end; +end; + +procedure TSpTBXCustomWrapperPopupForm.WMEraseBkgnd(var Message: TWMEraseBkgnd); +begin + // There's no need to call PopupWindowNCPaintProc here, because the + // ClientArea is filled with the child Form + Message.Result := 1; +end; + +procedure TSpTBXCustomWrapperPopupForm.WMNCPaint(var Message: TMessage); +var + DC: HDC; +begin + DC := GetWindowDC(Handle); + try + FPaintingClientArea := False; + SelectNCUpdateRgn(Handle, DC, HRGN(Message.WParam)); + PopupWindowNCPaintProc(Handle, DC, Self); + finally + ReleaseDC(Handle, DC); + end; +end; + +procedure TSpTBXCustomWrapperPopupForm.WMPrint(var Message: TMessage); +begin + FPaintingClientArea := False; + HandleWMPrint(Handle, Message, PopupWindowNCPaintProc, Self); +end; + +procedure TSpTBXCustomWrapperPopupForm.WMSpTBXPopupInvalidate(var Message: TMessage); +begin + if HandleAllocated then + RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN or RDW_FRAME); +end; + +procedure TSpTBXCustomWrapperPopupForm.WMSpTBXPopupRollUp(var Message: TMessage); +var + Selected, FocusParentControl: Boolean; +begin + Selected := Message.WParam <> 0; + FocusParentControl := Message.LParam <> 0; + RollUp(Selected, FocusParentControl); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXWrapperPopupForm } + +constructor TSpTBXWrapperPopupForm.Create(AFormPopupMenu: TSpTBXFormPopupMenu); +begin + inherited; + FSkinType := sknSkin; +end; + +destructor TSpTBXWrapperPopupForm.Destroy; +begin + Destroying; + if HandleAllocated then + DestroyWindowHandle; + inherited; +end; + +procedure TSpTBXWrapperPopupForm.DestroyWindowHandle; +begin + { Cleanly destroy any timers before the window handle is destroyed } + CallNotifyWinEvent(EVENT_SYSTEM_MENUPOPUPEND, WindowHandle, OBJID_CLIENT, CHILDID_SELF); + inherited; +end; + +procedure TSpTBXWrapperPopupForm.CMShowingChanged(var Message: TMessage); +const + ShowFlags: array[Boolean] of UINT = ( + SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_HIDEWINDOW, + SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_SHOWWINDOW); +var + Blend: Boolean; +begin + { Must override TCustomForm/TForm's CM_SHOWINGCHANGED handler so that the + form doesn't get activated when Visible is set to True. } + + { Handle animation } + if Showing and not IsWindowVisible(WindowHandle) and (Animation <> patNone) then + begin + Blend := Animation = patFade; + if Assigned(AnimateWindowProc) and (Blend or (FAnimationDirection <> [])) then begin + AnimateWindowProc(Handle, 150, AW_BLEND); + RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN); + Exit; + end; + end; + + { No animation... } + SetWindowPos(WindowHandle, 0, 0, 0, 0, 0, ShowFlags[Showing]); + RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN); +end; + +procedure TSpTBXWrapperPopupForm.PaintBackground(ACanvas: TCanvas; ARect: TRect); +begin + SpDrawXPMenuPopupWindow(ACanvas, ARect, Rect(0, 0, 0, 0), False, 0, FSkinType); +end; + +procedure TSpTBXWrapperPopupForm.SetSkinType(const Value: TSpTBXSkinType); +begin + if FSkinType <> Value then begin + FSkinType := Value; + FSizeGrip.SkinType := Value; + end; +end; + +procedure TSpTBXWrapperPopupForm.WMEraseBkgnd(var Message: TWMEraseBkgnd); +begin + Message.Result := 1; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXFormPopupMenu } + +constructor TSpTBXFormPopupMenu.Create(AOwner: TComponent); +begin + inherited; + FSkinType := sknSkin; + FNotifies := TList.Create; + FWrapperForm := TSpTBXWrapperPopupForm.Create(Self); + FWrapperForm.OnRollUp := InternalClosePopup; +end; + +destructor TSpTBXFormPopupMenu.Destroy; +var + FC: TCustomFormClass; +begin + if Assigned(FPopupForm) then + FPopupForm.Parent := nil; + // Free the PopupForm if the OnGetPopupFormClass event returns + // a valid form class. + FC := nil; + DoGetPopupFormClass(FC); + if Assigned(FC) then + FreeAndNil(FPopupForm); + + FreeAndNil(FNotifies); + FreeAndNil(FWrapperForm); + inherited; +end; + +procedure TSpTBXFormPopupMenu.DoGetPopupFormClass(var AFormClass: TCustomFormClass); +begin + if Assigned(FOnGetPopupFormClass) then FOnGetPopupFormClass(Self, AFormClass); +end; + +procedure TSpTBXFormPopupMenu.AddCloseNotification(AObject: TObject); +begin + if Assigned(AObject) then + if FNotifies.IndexOf(AObject) < 0 then FNotifies.Add(AObject); +end; + +procedure TSpTBXFormPopupMenu.RemoveCloseNotification(AObject: TObject); +begin + FNotifies.Remove(AObject); +end; + +procedure TSpTBXFormPopupMenu.BroadcastCloseMessage(Selected: Boolean); +var + Msg: TMessage; + I: Integer; +begin + if FNotifies.Count > 0 then begin + Msg.Msg := CM_SPPOPUPCLOSE; + Msg.WParam := Integer(FWrapperForm); + if Selected then + Msg.LParam := 1 + else + Msg.LParam := 0; + Msg.Result := 0; + for I := 0 to FNotifies.Count - 1 do + TObject(FNotifies[I]).Dispatch(Msg); + end; +end; + +procedure TSpTBXFormPopupMenu.ClosePopup(Selected: Boolean); +begin + // Instead of calling Rollup post a message so the Application.OnMessage is + // processed before the popup is closed, this is needed to handle the mouse + // clicks on the main form. + PostMessage(FWrapperForm.Handle, WM_SPTBX_POPUPROLLUP, Integer(Selected), 1); +end; + +procedure TSpTBXFormPopupMenu.InternalClosePopup(Sender: TObject; Selected: Boolean); +var + FC: TCustomFormClass; +begin + if Assigned(FOnBeforeClosePopup) then FOnBeforeClosePopup(Self, Selected); + + if Assigned(FPopupForm) then begin + if FAutoSize then begin + FPopupFormPrevSize.cx := FPopupForm.ClientRect.Right; + FPopupFormPrevSize.cy := FPopupForm.ClientRect.Bottom; + end; + 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(FOnClosePopup) then FOnClosePopup(Self, Selected); + + // Free the PopupForm if the OnGetPopupFormClass event returns + // a valid form class. + FC := nil; + DoGetPopupFormClass(FC); + if Assigned(FC) then + FreeAndNil(FPopupForm); +end; + +function TSpTBXFormPopupMenu.InternalPopup(X, Y: Integer; ForceFocus: Boolean; + PopupControl: TControl = nil): Boolean; +var + ClientR: TRect; + FC: TCustomFormClass; +begin + Result := False; + + {$IFDEF JR_D9} + SetPopupPoint(Point(X, Y)); + {$ELSE} + PPoint(@PopupPoint)^ := Point(X, Y); + {$ENDIF} + + // Create the PopupForm if the OnGetPopupFormClass event returns + // a valid form class. + // Otherwise try to use the assigned PopupForm property. + FC := nil; + DoGetPopupFormClass(FC); + if Assigned(FC) then + FPopupForm := FC.Create(nil); + + // Use the WrapperForm to show the PopupForm + if Assigned(FPopupForm) then begin + FPopupFormState.PopupForm := FPopupForm; + FPopupFormState.BorderStyle := FPopupForm.BorderStyle; + FPopupFormState.BoundsRect := FPopupForm.BoundsRect; + + ClientR := FPopupForm.ClientRect; + if FAutoSize and (FPopupFormPrevSize.cx > 0) and (FPopupFormPrevSize.cy > 0) then begin + ClientR.Right := FPopupFormPrevSize.cx; + ClientR.Bottom := FPopupFormPrevSize.cy; + end; + + FPopupForm.Parent := FWrapperForm; + FPopupForm.Align := alClient; + FPopupForm.BorderStyle := bsNone; + FPopupForm.Visible := True; + + if Assigned(FOnBeforePopup) then FOnBeforePopup(Self, ClientR.Right, ClientR.Bottom); + + if Assigned(PopupControl) then + FWrapperForm.RollDown(PopupControl, ClientR.Right + DefaultBorderSize * 2, ClientR.Bottom + DefaultBorderSize * 2, False, ForceFocus) + else + FWrapperForm.RollDown(X, Y, ClientR.Right + DefaultBorderSize * 2, ClientR.Bottom + DefaultBorderSize * 2, ForceFocus); + + if Assigned(OnPopup) then OnPopup(Self); + Result := True; + end; +end; + +procedure TSpTBXFormPopupMenu.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if Operation = opRemove then + if AComponent = PopupForm then begin + // Weird Delphi IDE bug at design time. + // When a Form is closed at design time it will fire the + // FreeNotification, setting PopupForm to nil and not + // saving it to the dfm + + SetPopupForm(nil); + + { TODO : Delphi IDE bug } + // This line doesn't seem to fix it, it raises AVs in the IDE + // PopupForm shouldn't be published. + // if not (csDesigning in ComponentState) then + // SetPopupForm(nil); + end; +end; + +procedure TSpTBXFormPopupMenu.Popup(X, Y: Integer); +begin + InternalPopup(X, Y, FPopupFocus); +end; + +procedure TSpTBXFormPopupMenu.PopupEx(X, Y: Integer; ForceFocus: Boolean); +begin + InternalPopup(X, Y, ForceFocus); +end; + +procedure TSpTBXFormPopupMenu.PopupEx(PopupControl: TControl; ForceFocus: Boolean); +begin + InternalPopup(0, 0, ForceFocus, PopupControl); +end; + +function TSpTBXFormPopupMenu.GetBorderStyle: TSpTBXPopupBorderStyleType; +begin + Result := FWrapperForm.BorderStyle; +end; + +function TSpTBXFormPopupMenu.GetShowShadows: Boolean; +begin + Result := FWrapperForm.ShowShadows; +end; + +procedure TSpTBXFormPopupMenu.SetBorderStyle(const Value: TSpTBXPopupBorderStyleType); +begin + FWrapperForm.BorderStyle := Value; +end; + +procedure TSpTBXFormPopupMenu.SetPopupForm(const Value: TCustomForm); +begin + if FPopupForm <> Value then begin + if FWrapperForm.Visible then + ClosePopup(False); + + if Assigned(FPopupForm) then + FPopupForm.RemoveFreeNotification(Self); + + FPopupForm := Value; + if Assigned(FPopupForm) then + FPopupForm.FreeNotification(Self); + end; +end; + +procedure TSpTBXFormPopupMenu.SetShowShadows(const Value: Boolean); +begin + FWrapperForm.ShowShadows := Value; +end; + +procedure TSpTBXFormPopupMenu.SetSkinType(const Value: TSpTBXSkinType); +begin + if FSkinType <> Value then begin + FSkinType := Value; + FWrapperForm.SkinType := Value; + end; +end; + +end. diff --git a/internal/2.4.4/1/Source/SpTBXGlyphs.res b/internal/2.4.4/1/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/internal/2.4.4/1/Source/SpTBXItem.pas b/internal/2.4.4/1/Source/SpTBXItem.pas new file mode 100644 index 0000000..26b5827 --- /dev/null +++ b/internal/2.4.4/1/Source/SpTBXItem.pas @@ -0,0 +1,10073 @@ +unit SpTBXItem; + +{============================================================================== +Version 2.4.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: + - + +History: +2 December 2009 - version 2.4.4 + - Fixed bug in SpSetFormWindowState utility function, the Form + was not restored correctly, thanks to Alex Yagolnik for + reporting this. + - Fixed incorrect TSpTBXPopupWindow items margins, thanks to + Pedro Vugluskra for reporting this. + +13 September 2009 - version 2.4.3 + - Fixed incorrect menu items painting on Vista, thanks to + Maël Hörz and Sertac Akyuz for reporting this. + - Fixed TSpTBXToolbar flicker when adding/deleting items. + - Fixed incorrect TSpTBXStatusBar painting when XP theming was + disabled, thanks to Warren Postma for reporting this. + - Fixed incorrect TSpTBXDock painting when the Background + property was used. + - Made the NC area of the TSpTBXTitleBar clickeable when the + form is maximized. + +8 May 2009 - version 2.4.2 + - Added Dutch translation for the Customizer demo, thanks to + Alfred Vink. + - Added Tooltips Vista theming. + +15 March 2009 - version 2.4.1 + - Fixed incorrect TntAction checking, thanks to Costas Stergiou + for reporting this. + +17 January 2009 - version 2.4 + - Replaced the default Windows taskbar PopupMenu with a skninned + PopupMenu when TSpTBXTitleBar is used on the Main form. + - Fixed incorrect menu separator painting when it was used on + a ToolBoxPopup submenu, thanks to Yury Plashenkov for + reporting this. + - Fixed incorrect menu item margins, thanks to Eduardo Mauro + for reporting this. + +26 September 2008 - version 2.3 + - New Toolbar item added, TSpTBXColorItem. + - Fixed incorrect Alt-Space handling on TSpTBXTitleBar, the + System PopupMenu was still showed even when SystemMenu was + setted to False, thanks to Ilya Zaytsev for reporting this. + - Fixed incorrect items text sizing when SystemFont was setted + to False, thanks to Minoru Yoshida for reporting this. + - Fixed a Delphi 7 bug, D7 hints didn't support multi-monitors, + thanks to Costas Stergiou for reporting this. + +29 July 2008 - version 2.2 + - Fixed AV raised when Screen.MonitorFromWindow failed, thanks + to Andrew Denton for reporting this. + - Added OnClosePopup event to TSpTBXPopupMenu. + +26 June 2008 - version 2.1 + - Added Turkish translation for the Customizer demo, thanks to + Zylar. + - Fixed incorrect keyboard handling on TSpTBXTitleBar, Alt+Space + didn't popup the system menu, thanks to Costas Stergiou for + reporting this. + +3 May 2008 - version 2.0 + - SpTBXLib is now decoupled from TBX and uses the latest version + of TB2K, with NO PATCHES REQUIRED. + - Added HideEmptyPopup property to TSpTBXSubmenuItem, when + the submenu has no items and this property is set the + popup window will not be showed. + - Added Swedish translation for the Customizer demo, thanks to + Mattias Andersson. + +2 April 2008 - version 1.9.5 + - Fixed incorrect item stretching when the toolbar was + vertical and tboImageAboveCaption was set, thanks to + John for reporting this. + - Fixed incorrect item painting when no themes were + used, thanks to Denis for reporting this. + - Fixed incorrect TSpTBXToolPalette.Images handling, thanks + to Minoru Yoshida for reporting this. + - Fixed incorrect menu gutter painting when hints were showed, + thanks to Michele and Beta Xiong for reporting this. + - Fixed incorrect floating border painting when the default + size was changed thanks to Costas Stergiou and Serge + for reporting this. + - Fixed incorrect floating border painting on Vista, + the borders should not be transparent, thanks to + Costas Stergiou for reporting this. + +3 February 2008 - version 1.9.4 + - No changes. + +19 January 2008 - version 1.9.3 + - Completed the Brazilian Portuguese translation of the Customizer + demo, thanks to Mauricio Magnani. + - Added TSpTBXToolWindow component. + - Fixed incorrect gutter painting on the popup menus. + - Fixed item stretching problems + +26 December 2007 - version 1.9.2 + - New component added: TSpTBXToolWindow, a fully customizable + ToolWindow with unicode support. + - Added State parameter to the toolbar items OnDrawCaption event. + - Fixed AV on Delphi 2005, Margins and Paddings were introduced + on Delphi 2006, thanks to Stefan for reporting this. + - Minor bug fixes. + +1 December 2007 - version 1.9.1 + - Added Invalidate method to TSpTBXItem. + - Added OnClosePopup event to TSpTBXSubmenuItem. + - Fixed tboNoRotation use on vertical toolbar items, when + tboImageAboveCaption is not set the glyph should appear + aligned with the caption. + +20 November 2007 - version 1.9 + - New theme engine. + - Added SpTBXHintWindowClass global variable, it specifies which + THintWindow class is used to show the hints. + - Added TSpTBXToolPalette and TSpTBXColorPalette items. + - Added TSpTBXToolWindow component. + - Removed TSpTBXComboBoxItem, TSpTBXDropDownItem, TSpTBXStringList + and TSpTBXUndoList. + +8 February 2007 - version 1.8.3 + - No changes. + +17 December 2006 - version 1.8.2 + - Added Toolbar public property to TSpTBXStatusBar. + +24 November 2006 - version 1.8.1 + - Added properties to TSpTBXRightAlignSpacer: ImageIndex, Images, + OnAdjustFont, OnClick, OnDrawHint, OnDrawImage, OnDrawItem. + - Added unicode shortcut-text support for menu items, thanks + Steve for reporting this. + - Fixed incorrect TSpTBXTitleBar positioning when the + taskbar is moved around the screen, thanks to + Costas Stergiou for reporting this. + - Fixed incorrect TSpTBXStatusBar size grip painting when + Windows XP themes are disabled, thanks to Alexey Naumov + for reporting this. + +27 August 2006 - version 1.8 + - Fixed incorrect DropdownCombo item painting, thanks to + François Rivierre for reporting this. + - Fixed incorrect TSpTBXTitleBar SystemMenu painting, + GetMenuStringW doesn't work correctly on Win2K/WinXP, + when a DBCS code page is active (e.g. Japanese), thanks + to Jordan Russell for reporting this. + http://news.jrsoftware.org/read/article.php?id=12268&group=jrsoftware.toolbar2000.thirdparty + - Fixed bug in TSpTBXLabelItem, clicking a TSpTBXLabelItem + on a popup menu causes the menu to close, thanks to + Piotr Janus for reporting this. + +15 June 2006 - version 1.7 + - Added vertical caption painting to toolbar items. + - Added CaptionGlow and CaptionGlowColor properties to + toolbar Items. + - Added Margins property to toolbar items. + - Fixed incorrect TSpTBXTitleBar resizing when the form is + maximized and the titlebar is activated and deactivated + multiple times, thanks to Costas Stergiou for reporting this. + +4 May 2006 - version 1.6 + - Fixed incorrect TSpTBXStatusBar behavior, the size grip + disappeared when the parent was a TSpTBXTitleBar, thanks to + Costas Stergiou for reporting this. + - Fixed incorrect TSpTBXStatusBar's size grip painting when the + Default theme was used. + - Fixed incorrect TSpTBXLabelItem painting when the label was used + in a submenu, thanks to Costas Stergiou for reporting this. + - Added OnSystemMenuPopup event to TSpTBXTitleBar. + +12 April 2006 - version 1.5 + - Fixed incorrect TSpTBXStatusBar behavior, it didn't resized + the form if the mouse click was on the non-client area of the + status bar, thanks to Frank de Groot for reporting this. + - Fixed incorrect mouse handling in TSpTBXTitlebar, thanks to + Marten Pape for reporting this. + - Fixed incorrect TSpTBXLabelItem alignment on menus, thanks to + Costas Stergiou for reporting this. + - Added ClickedItem parameter to TSpTBXSubmenuItem.OnClosePopup + event. + +27 February 2006 - version 1.4 + - Added SizeGrip property to TSpTBXStatusBar. + - Added FullScreenMaximize property to TSpTBXTitleBar. + +10 February 2006 - version 1.3 + - Fixed AV in TSpTBXTitleBar at designtime, thanks to + Alexey Naumov for reporting this. + - Fixed incorrect system popupmenu visibility in TSpTBXTitleBar. + - Added Active property to TSpTBXTitleBar. + - Added OnDrawBackground event to TSpTBXTitleBar. + - Added OnClosePopup event to TSpTBXSubmenuItem. + +28 December 2005 - version 1.2 + - Fixed incorrect items anchoring. + - Fixed range check errrors. + +18 October 2005 - version 1.1 + - Fixed incorrect TSpTBXStatusBar margins when the form is + maximazed. + - Fixed incorrect accel char handling in TSpTBXToolbar. + - Fixed incorrect TntAction support, the previous version of + TntActions didn't supported unicode enabled ActionLinks. + - Fixed incorrect tab stop chars handling in TSpTBXItem. + - Added MaxSize property to TSpTBXToolbar, determines + the maximum height the toolbar can have. + - Added TBX themes support to TSpTBXTitleBar's system menu. + - Added radio item painting support. + +18 August 2005 - version 1.0 + - Added DisplayOptions property to TSpTBXToolbar, determines + whether the item's image is to be displayed. + - Added Customizable property to TSpTBXToolbar, determines + whether the toolbar is customizable or not. + - Added TitleBarSize property to the Options of the + TSpTBXTitlebar. + +10 June 2005 - version 0.9 + - SpTBXLib may now alternatively, at your option, be used and/or + distributed under the terms of the SpTBXLib License. + Please see the updated LICENSE.TXT file for more information. + +20 May 2005 - version 0.8 + - Fixed incorrect caption centering in TSpTBXItem. + - Fixed incorrect TSpTBXItem hint when accessing TntApplication, + thanks to Erik Maly for reporting this. + - Changed the Options property of TSpTBXTitleBar to use a base class + for default buttons. + - Added ChevronVertical property to TSpTBXToolbar, it changes the + layout of the chevron popup to be vertical. + - Added Wrapping property to TSpTBXItem, it determines the wrapping + type of the item's caption. + - Added FixedSize property to TSpTBXTitleBar, it determines if + the TitleBar can be resized. + +16 February 2005 - version 0.7 + - Fixed TSpTBXThemeGroupItem theme sync bug, it now correctly selects + the current TBX theme. + - Fixed unicode support in W9x. + - Fixed TSpTBXTitleBar painting flicker. + - Fixed TSpTBXStatusBar right align margin. + - Added TBXStyleBackground property to TSpTBXTitleBar, when setted to + true it paints a TBX style background. + - Added AutoCheck property to TSpTBXItem. + +23 December 2004 - version 0.6 + - Fixed hint bug, ampersands were not removed in auto-generated hints. + - Fixed incorrect caption painting when the font is italic, this bug + is present in TBX items, TLabel, TBitBtn, TSpeedButton, TGroupBox, + TRadioGroup, and any other control that uses DrawText to draw the + caption. To reproduce this, drop a TBitBtn, change the caption to + 'WWW' and the font to italic, the last W is cropped. + - Fixed incorrect caption painting when the Default theme is used, + the caption was not painted in a down state when the toolbarstyle + item was pushed, thanks Daniel Rikowski for reporting this. + - Changed the default value of DisplayMode to nbdmDefault. + - New component added, TSpTBXTitleBar: a fully customizable + TitleBar with Unicode text and TBX themes support. + - New component added, TSpTBXPopupMenu: a TTBXPopupMenu descendant + with an OnPopupMenuInit event to setup the items before the popup + is showed, it could be used for example to set the focus to an + EditItem. + - Added SpChangeThemeType utility function, this makes it easier to + switch the theme type of any given control and its children. + +30 August 2004 - version 0.5 + - Reworked the hint show event of the items. + +21 July 2004 - version 0.4 + - Fixed TTBControlItem.Control streaming bug on TSpTBXStatusBar. + - Fixed bad sync of the items unicode caption and hint properties + when an Action was assigned. + +12 July 2004 - version 0.3.1 + - Unchanged. + +9 July 2004 - version 0.3 + - Fixed incorrect TSpTBXItem caption painting when DisplayMode + was nbdmDefault, thanks to Cyril for reporting this. + - Added anchors support for TTBControlItem items, if the associated + Control is client aligned or has akRight in its Anchors property. + - The theme items in TSpTBXThemeGroupItem are now sorted. + - Added OnUpdate event to TSpTBXThemeGroupItem, this event is fired + every time the theme items list is recreated, use this event + to sort or change the items properties. + +27 June 2004 - version 0.2 + - Fixed Toolbar custom painting event. + - Fixed incorrect Shortcut painting in submenus. + - Fixed incorrect Shortcut hint painting. + - Removed thtBitmapSkin from TSpTBXThemeType. + - Published more properties for TSpTBXLabelItem. + - New Toolbar item added, TSpTBXSeparator. + - New component added, TSpTBXStatusBar: a fully customizable + StatusBar with Unicode text and TBX themes support. + +22 June 2004 - version 0.1 + - Initial release. + +==============================================================================} + +interface + +{$BOOLEVAL OFF} // Unit depends on short-circuit boolean evaluation +{$I TB2Ver.inc} + +uses + Windows, Messages, Classes, SysUtils, Forms, Controls, Graphics, ImgList, + Menus, StdCtrls, ActnList, + {$IFNDEF UNICODE} + TntClasses, TntControls, + {$ENDIF} + TB2Item, TB2Dock, TB2Toolbar, TB2ToolWindow, + SpTBXSkins; + +{$IFDEF UNICODE} +type + TTntStringList = TStringList; +{$ENDIF} + +const + C_SpTBXRadioGroupIndex = 8888; // Default GroupItem of TSpTBXRadioGroupItem + CM_SPPOPUPCLOSE = CM_BASE + 1111; // Message sent to the PopupControl to update its state after the Popup is closed + rvSpTBXDisplayMode = 'DisplayMode'; // Constant used to save the Toolbar DisplayMode with the Customizer. Do not localize! + CPDefaultCols = 8; // ColorPalette constant + CPDefaultRows = 5; // ColorPalette constant + +type + TSpTBXCustomItem = class; + TSpTBXToolbar = class; + TSpTBXStatusToolbar = class; + TSpTBXPopupMenu = class; + + TSpTBXPaintStage = ( + pstPrePaint, // Pre paint stage + pstPostPaint // Post paint stage + ); + + TSpTBXToolbarDisplayMode = ( + tbdmSelectiveCaption, // The caption is displayed if the Item.DisplayMode = nbdmImageAndText + tbdmImageOnly, // Only the images are displayed + tbdmImageAboveCaption, // The images are displayed above the caption + tbdmTextOnly // Show the caption only + ); + + TSpTBXToolbarState = ( + tstResizing, // The toolbar is being resized + tstRightAligning, // The toolbar items are being right aligned + tstAnchoring // The toolbar items are being anchored + ); + + TSpTBXToolbarStates = set of TSpTBXToolbarState; + + TSpBorderIcon = ( + briSystemMenu, // SystemMenu item on the title bar + briMinimize, // Minimize item on the title bar + briMaximize, // Maximize item on the title bar + briClose // Close item on the title bar + ); + + TSpBorderIcons = set of TSpBorderIcon; + + TTextWrapping = ( + twNone, // No wrapping + twEndEllipsis, // End ellipsis '...' + twPathEllipsis, // Path ellipsis '\..\..' + twWrap // Word wrap + ); + + TSpTBXSearchItemViewerType = ( + sivtNormal, // Normal search + sivtInmediate, // Search for the inmediate ItemViewer + sivtInmediateSkipNonVisible// Search for the next inmediate ItemViewer, skipping non visible ones + ); + + TSpTBXGetImageIndexEvent = procedure(Sender: TObject; + var AImageList: TCustomImageList; var AItemIndex: Integer) of object; + + TSpTBXDrawEvent = procedure(Sender: TObject; ACanvas: TCanvas; + ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean) of object; + + TSpTBXDrawImageEvent = procedure(Sender: TObject; ACanvas: TCanvas; + State: TSpTBXSkinStatesType; const PaintStage: TSpTBXPaintStage; + var AImageList: TCustomImageList; var AImageIndex: Integer; + var ARect: TRect; var PaintDefault: Boolean) of object; + + TSpTBXDrawItemEvent = procedure(Sender: TObject; ACanvas: TCanvas; + ARect: TRect; ItemInfo: TSpTBXMenuItemInfo; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean) of object; + + TSpTBXDrawPosEvent = procedure(Sender: TObject; ACanvas: TCanvas; + X, Y: Integer; var PaintDefault: Boolean) of object; + + TSpTBXDrawTextEvent = procedure(Sender: TObject; ACanvas: TCanvas; + ClientAreaRect: TRect; State: TSpTBXSkinStatesType; var ACaption: WideString; + var CaptionRect: TRect; var CaptionFormat: Cardinal; IsTextRotated: Boolean; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean) of object; + + TSpTBXDrawHintEvent = procedure(Sender: TObject; AHintBitmap: TBitmap; + var AHint: WideString; var PaintDefault: Boolean) of object; + + TSpTBXItemNotificationEvent = procedure(Sender: TObject; + Ancestor: TTBCustomItem; Relayed: Boolean; Action: TTBItemChangedAction; + Index: Integer; Item: TTBCustomItem) of object; + + TSpTBXRadioGroupFillStringsEvent = procedure(Sender: TObject; + Strings: TTntStringList) of object; + + TSpTBXPopupEvent = procedure(Sender: TObject; PopupView: TTBView) of object; + + { TSpTBXFontSettings } + + TSpTBXFontSize = 25..1000; + + TSpTBXFontSettings = class(TPersistent) + private + FColor: TColor; + FName: TFontName; + FSize: TSpTBXFontSize; + FStyle: TFontStyles; + FOnChange: TNotifyEvent; + procedure SetColor(Value: TColor); + procedure SetName(const Value: TFontName); + procedure SetSize(Value: TSpTBXFontSize); + procedure SetStyle(const Value: TFontStyles); + protected + procedure Modified; + property OnChange: TNotifyEvent read FOnChange write FOnChange; + public + constructor Create; + procedure Apply(AFont: TFont); + procedure Assign(Src: TPersistent); override; + published + property Color: TColor read FColor write SetColor default clNone; + property Name: TFontName read FName write SetName; // default '' + property Size: TSpTBXFontSize read FSize write SetSize default 100; // Size Percent + property Style: TFontStyles read FStyle write SetStyle default []; + end; + + { TSpTBXCustomDragObject } + + TSpTBXCustomDragObject = class(TDragObjectEx) + private + FDragCursorAccept: TCursor; + FDragCursorCancel: TCursor; + FSourceControl: TControl; + FSourceItem: TTBCustomItem; + protected + function GetDragCursor(Accepted: Boolean; X: Integer; Y: Integer): TCursor; override; + procedure Finished(Target: TObject; X, Y: Integer; Accepted: Boolean); override; + public + constructor Create(ASourceControl: TControl; AItem: TTBCustomItem); virtual; + property DragCursorAccept: TCursor read FDragCursorAccept write FDragCursorAccept; + property DragCursorCancel: TCursor read FDragCursorCancel write FDragCursorCancel; + property SouceItem: TTBCustomItem read FSourceItem; + property SourceControl: TControl read FSourceControl; + end; + + { TSpTBXItemDragObject } + + TSpTBXItemDragObject = class(TSpTBXCustomDragObject); + + { TSpTBXCustomItemActionLink } + + {$IFNDEF UNICODE} + TSpTBXCustomItemActionLink = class(TTBCustomItemActionLink) + protected + FUnicodeClient: TSpTBXCustomItem; + procedure AssignClient(AClient: TObject); override; + function IsCaptionLinked: Boolean; override; + function IsHintLinked: Boolean; override; + procedure SetCaption(const Value: string); override; + procedure SetHint(const Value: string); override; + end; + {$ELSE} + TSpTBXCustomItemActionLink = class(TTBCustomItemActionLink); + {$ENDIF} + + { TSpTBXCustomControl } + + {$IFNDEF UNICODE} + TSpTBXCustomControl = class(TCustomControl) + private + function IsCaptionStored: Boolean; + function IsHintStored: Boolean; + function GetCaption: TWideCaption; + function GetHint: WideString; + procedure SetCaption(const Value: TWideCaption); + procedure SetHint(const Value: WideString); + protected + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + // Don't let the streaming system store the WideStrings, use DefineProperties instead + property Caption: TWideCaption read GetCaption write SetCaption stored IsCaptionStored; // Hides the inherited Caption + property Hint: WideString read GetHint write SetHint stored IsHintStored; // Hides the inherited Hint + end; + {$ELSE} + TSpTBXCustomControl = class(TCustomControl); + {$ENDIF} + + { TSpTBXItem } + + TSpTBXCustomItem = class(TTBCustomItem) + private + {$IFNDEF UNICODE} + FCaption: WideString; + FHint: WideString; + {$ENDIF} + FCaptionGlow: TSpGlowDirection; + FCaptionGlowColor: TColor; + FAlignment: TAlignment; + FAnchored: Boolean; + FControl: TControl; + FCustomWidth: Integer; + FCustomHeight: Integer; + FFontSettings: TSpTBXFontSettings; + FMargins: Integer; + FMinHeight: Integer; + FMinWidth: Integer; + FStretch: Boolean; + FToolbarStylePopup: Boolean; + FToolBoxPopup: Boolean; + FWrapping: TTextWrapping; + FOnClosePopup: TNotifyEvent; + FOnInitPopup: TSpTBXPopupEvent; + FOnDrawCaption: TSpTBXDrawTextEvent; + FOnDrawHint: TSpTBXDrawHintEvent; + FOnDrawItem: TSpTBXDrawItemEvent; + FOnDrawImage: TSpTBXDrawImageEvent; + {$IFNDEF UNICODE} + function IsCaptionStored: Boolean; + function IsHintStored: Boolean; + procedure SetCaption(const Value: WideString); + procedure SetHint(const Value: WideString); + {$ENDIF} + procedure FontSettingsChanged(Sender: TObject); + procedure SetAlignment(const Value: TAlignment); + procedure SetAnchored(const Value: Boolean); + procedure SetCaptionGlow(const Value: TSpGlowDirection); + procedure SetCaptionGlowColor(const Value: TColor); + procedure SetControl(const Value: TControl); + procedure SetCustomWidth(Value: Integer); + procedure SetCustomHeight(Value: Integer); + procedure SetFontSettings(const Value: TSpTBXFontSettings); + procedure SetMargins(Value: Integer); + procedure SetMinHeight(const Value: Integer); + procedure SetMinWidth(const Value: Integer); + procedure SetStretch(const Value: Boolean); + procedure SetToolBoxPopup(const Value: Boolean); + procedure SetWrapping(const Value: TTextWrapping); + protected + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + function DialogChar(CharCode: Word): Boolean; virtual; + procedure DefineProperties(Filer: TFiler); override; + procedure DoDrawAdjustFont(AFont: TFont; State: TSpTBXSkinStatesType); virtual; + procedure DoDrawHint(AHintBitmap: TBitmap; var AHint: Widestring; var PaintDefault: Boolean); virtual; + procedure DoDrawButton(ACanvas: TCanvas; ARect: TRect; ItemInfo: TSpTBXMenuItemInfo; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + procedure DoDrawCaption(ACanvas: TCanvas; ClientAreaRect: TRect; State: TSpTBXSkinStatesType; + var ACaption: WideString; var CaptionRect: TRect; var CaptionFormat: Cardinal; + IsTextRotated: Boolean; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + procedure DoDrawImage(ACanvas: TCanvas; State: TSpTBXSkinStatesType; + const PaintStage: TSpTBXPaintStage; var AImageList: TCustomImageList; + var AImageIndex: Integer; var ARect: TRect; var PaintDefault: Boolean); virtual; + procedure DoPopupShowingChanged(APopupWindow: TTBPopupWindow; IsVisible: Boolean); virtual; + function GetActionLinkClass: TTBCustomItemActionLinkClass; override; + function GetItemViewerClass(AView: TTBView): TTBItemViewerClass; override; + function GetPopupWindowClass: TTBPopupWindowClass; override; + procedure ToggleControl; virtual; + procedure UpdateProps; virtual; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + + property Alignment: TAlignment read FAlignment write SetAlignment default taCenter; + property Anchored: Boolean read FAnchored write SetAnchored default False; + property CaptionGlow: TSpGlowDirection read FCaptionGlow write SetCaptionGlow default gldNone; + property CaptionGlowColor: TColor read FCaptionGlowColor write SetCaptionGlowColor default clYellow; + property Control: TControl read FControl write SetControl; + property CustomWidth: Integer read FCustomWidth write SetCustomWidth default -1; + property CustomHeight: Integer read FCustomHeight write SetCustomHeight default -1; + property FontSettings: TSpTBXFontSettings read FFontSettings write SetFontSettings; + property Margins: Integer read FMargins write SetMargins default 0; + property MinHeight: Integer read FMinHeight write SetMinHeight default 0; + property MinWidth: Integer read FMinWidth write SetMinWidth default 0; + property ToolbarStylePopup: Boolean read FToolbarStylePopup write FToolbarStylePopup default False; // Used on submenus + property ToolBoxPopup: Boolean read FToolBoxPopup write SetToolBoxPopup default False; // Used on submenus + property Stretch: Boolean read FStretch write SetStretch default True; // Hidden, all items are stretched by default + property OnClosePopup: TNotifyEvent read FOnClosePopup write FOnClosePopup; + property OnInitPopup: TSpTBXPopupEvent read FOnInitPopup write FOnInitPopup; + property OnDrawCaption: TSpTBXDrawTextEvent read FOnDrawCaption write FOnDrawCaption; + property OnDrawHint: TSpTBXDrawHintEvent read FOnDrawHint write FOnDrawHint; + property OnDrawImage: TSpTBXDrawImageEvent read FOnDrawImage write FOnDrawImage; + property OnDrawItem: TSpTBXDrawItemEvent read FOnDrawItem write FOnDrawItem; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Click; override; + function GetShortCutText: WideString; // Reintroduce to support unicode shortcut text + procedure InitiateAction; override; + procedure Invalidate; + published + {$IFNDEF UNICODE} + // Don't let the streaming system store the WideStrings, use DefineProperties instead + property Caption: WideString read FCaption write SetCaption stored IsCaptionStored; // Hides the inherited Caption + property Hint: WideString read FHint write SetHint stored IsHintStored; // Hides the inherited Hint + {$ELSE} + property Caption; + property Hint; + {$ENDIF} + property Wrapping: TTextWrapping read FWrapping write SetWrapping default twWrap; + end; + + TSpTBXItemViewer = class(TTBItemViewer) + private + function GetItem: TSpTBXCustomItem; + procedure CMHintShow(var Message: TMessage); message CM_HINTSHOW; + procedure InternalCalcSize(const Canvas: TCanvas; CalcStretch: Boolean; var AWidth, AHeight: Integer); + protected + FAnchorSize: TPoint; + FAnchorDelta: Integer; + + function IsOnToolBoxPopup: Boolean; + + // 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 + function IsToolbarStyle: Boolean; // Hides the inherited TB2K IsToolbarStyle 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 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; + FUpdating: Integer; + procedure DoUpdatePositions(var ASize: TPoint); override; + public + constructor Create(AOwner: TComponent; AParentView: TTBView; + AParentItem: TTBCustomItem; AWindow: TWinControl; + AIsToolbar, ACustomizing, AUsePriorityList: Boolean); override; + procedure BeginUpdate; virtual; // Hides inherited BeginUpdate + procedure EndUpdate; virtual; // Hides inherited EndUpdate + function IsUpdating: Boolean; + 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; + FMenuBar: Boolean; + 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); + procedure SetMenuBar(const Value: Boolean); + 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; + procedure SetCustomizable(const Value: Boolean); + protected + FBeginDragIV: TTBItemViewer; + FAnchoredControlItems: TSpTBXItemCacheCollection; + FState: TSpTBXToolbarStates; + FDefaultToolbarBorderSize: Integer; + + // 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 BeginUpdate; // Hides inherited BeginUpdate + procedure EndUpdate; // Hides inherited EndUpdate + function IsUpdating: Boolean; + procedure BeginCustomize; + procedure EndCustomize; + procedure BeginItemMove; + procedure EndItemMove; + function GetFloatingBorderSize: TPoint; override; + function IsCustomizing: Boolean; + function IsItemMoving: Boolean; + function IsVertical: Boolean; + property DefaultToolbarBorderSize: Integer read FDefaultToolbarBorderSize; + 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 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 SetCustomizable default True; + property DisplayMode: TSpTBXToolbarDisplayMode read FDisplayMode write SetDisplayMode default tbdmSelectiveCaption; + property MenuBar: Boolean read FMenuBar write SetMenuBar default False; // Hides the inherited MenuBar + 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; + FDefaultToolbarBorderSize: Integer; + 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; + property DefaultToolbarBorderSize: Integer read FDefaultToolbarBorderSize; + published + {$IFNDEF UNICODE} + // Don't let the streaming system store the WideStrings, use DefineProperties instead + property Caption: TWideCaption read GetCaption write SetCaption stored IsCaptionStored; // Hides the inherited Caption + {$ELSE} + property Caption; + {$ENDIF} + property Color default clNone; + end; + + TSpTBXToolWindow = class(TSpTBXCustomToolWindow) + published + property ActivateParent; + property Align; + property Anchors; + property BorderStyle; + property Caption; + property Color; + property CloseButton; + property CloseButtonWhenDocked; + property CurrentDock; + property DefaultDock; + property DockableTo; + property DockMode; + property DockPos; + property DockRow; + property DragHandleStyle; + property FloatingMode; + property Font; + property FullSize; + property HideWhenInactive; + property LastDock; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property Resizable; + property ShowCaption; + property ShowHint; + property Stretch; + property SmoothDrag; + property TabOrder; + property UseLastDock; + property Visible; + property OnClose; + property OnCloseQuery; + property OnContextPopup; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnDockChanged; + property OnDockChanging; + property OnDockChangingHidden; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnMove; + property OnRecreated; + property OnRecreating; + property OnResize; + property OnVisibleChanged; + // TSpTBXCustomToolWindow properties + property ClientAreaHeight; + property ClientAreaWidth; + property MaxClientHeight; + property MaxClientWidth; + property MinClientHeight; + property MinClientWidth; + property OnDrawBackground; + end; + + { TSpTBXFloatingWindowParent } + + TSpTBXFloatingWindowParent = class(TTBFloatingWindowParent) + private + FCloseButtonHover: Boolean; + FCloseOnAltF4: Boolean; + procedure UpdateDwmNCSize; + procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; + procedure WMActivateApp(var Message: TWMActivateApp); message WM_ACTIVATEAPP; + procedure WMClose(var Message: TWMClose); message WM_CLOSE; + procedure WMEraseBkgnd(var Message: TMessage); message WM_ERASEBKGND; + procedure WMNCMouseLeave(var Message: TMessage); message WM_NCMOUSELEAVE; + procedure WMNCMouseMove(var Message: TWMNCMouseMove); message WM_NCMOUSEMOVE; + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + protected + procedure CancelNCHover; + procedure CreateWnd; override; + procedure DrawNCArea(const DrawToDC: Boolean; const ADC: HDC; const Clip: HRGN; RedrawWhat: TTBToolWindowNCRedrawWhat); override; + procedure RedrawCloseButton; + procedure VisibleChanging; override; + property CloseButtonHover: Boolean read FCloseButtonHover; + public + constructor CreateNew(AOwner: TComponent; Dummy: Integer = 0); override; + destructor Destroy; override; + property CloseOnAltF4: Boolean read FCloseOnAltF4 write FCloseOnAltF4; + end; + + { TSpTBXPopupWindow } + + TSpTBXPopupWindow = class(TTBPopupWindow) + private + FPaintingClientArea: Boolean; + FMaximumImageSize: TSize; + function CanDrawGutter: Boolean; + procedure CMHintShow(var Message: TCMHintShow); message CM_HINTSHOW; + procedure CMShowingchanged(var Message: TMessage); message CM_SHOWINGCHANGED; + procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND; + procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT; + procedure WMPrint(var Message: TMessage); message WM_PRINT; + protected + function GetViewClass: TTBViewClass; override; + procedure DoPopupShowingChanged(IsVisible: Boolean); virtual; + procedure PaintBackground(ACanvas: TCanvas; ARect: TRect); virtual; + public + constructor CreatePopupWindow(AOwner: TComponent; const AParentView: TTBView; + const AItem: TTBCustomItem; const ACustomizing: Boolean); override; + destructor Destroy; override; + property MaximumImageSize: TSize read FMaximumImageSize; + end; + + TSpTBXPopupWindowView = class(TTBPopupView) + protected + procedure AutoSize(AWidth, AHeight: Integer); override; + public + procedure SetIsToolbar(const Value: Boolean); + published + property IsToolbar; + end; + + { TSpTBXChevronItem } + + TSpTBXChevronItem = class(TTBChevronItem) + protected + function GetPopupWindowClass: TTBPopupWindowClass; override; + public + function GetItemViewerClass(AView: TTBView): TTBItemViewerClass; override; + end; + + TSpTBXChevronItemViewer = class(TTBItemViewer) + protected + procedure Paint(const Canvas: TCanvas; const ClientAreaRect: TRect; + IsSelected, IsPushed, UseDisabledShadow: Boolean); override; + public + function GetTextColor(State: TSpTBXSkinStatesType): TColor; virtual; + end; + + TSpTBXChevronPopupWindow = class(TSpTBXPopupWindow) + private + procedure CMColorChanged(var Message: TMessage); message CM_COLORCHANGED; + end; + + { TSpTBXPopupMenu } + + ISpTBXPopupMenu = interface + ['{C576A225-6E42-49F6-96E5-712510C5D85C}'] + function InternalPopup(X, Y: Integer; ForceFocus: Boolean; PopupControl: TControl = nil): Boolean; + end; + + TSpTBXPopupMenu = class(TTBPopupMenu, ISpTBXPopupMenu) + private + FClickedItem: TTBCustomItem; + FReturnClickedItemOnly: Boolean; + FToolBoxPopup: Boolean; + function GetOnInitPopup: TSpTBXPopupEvent; + procedure SetOnInitPopup(const Value: TSpTBXPopupEvent); + function GetOnClosePopup: TNotifyEvent; + procedure SetOnClosePopup(const Value: TNotifyEvent); + protected + function InternalPopup(X, Y: Integer; ForceFocus: Boolean; PopupControl: TControl = nil): Boolean; virtual; + function GetRootItemClass: TTBRootItemClass; override; + public + procedure Popup(X: Integer; Y: Integer); override; + function PopupEx(X, Y: Integer; PopupControl: TControl = nil; ReturnClickedItemOnly: Boolean = False): TTBCustomItem; virtual; + published + property ToolBoxPopup: Boolean read FToolBoxPopup write FToolBoxPopup default False; + property OnInitPopup: TSpTBXPopupEvent read GetOnInitPopup write SetOnInitPopup; + property OnClosePopup: TNotifyEvent read GetOnClosePopup write SetOnClosePopup; + end; + + { TSpTBXCompoundItemsControl } + + TSpTBXCompoundItemsControl = class(TSpTBXCustomControl, ITBItems) + private + FSkinType: TSpTBXSkinType; + procedure DockRequestDock(Sender: TObject; Bar: TTBCustomDockableWindow; var Accept: Boolean); + function GetRootItems: TTBRootItem; + function GetView: TSpTBXToolbarView; + function GetImages: TCustomImageList; + procedure SetImages(const Value: TCustomImageList); + procedure SetSkinType(const Value: TSpTBXSkinType); + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + protected + FDock: TSpTBXDock; + FToolbar: TSpTBXToolbar; + procedure CreateParams(var Params: TCreateParams); override; + function GetDockClass: TSpTBXDockClass; virtual; + function GetToolbarClass: TSpTBXToolbarClass; virtual; + function GetItems: TTBCustomItem; virtual; // For ITBItems interface + procedure Loaded; override; + procedure SetName(const Value: TComponentName); override; + property Images: TCustomImageList read GetImages write SetImages; + property SkinType: TSpTBXSkinType read FSkinType write SetSkinType default sknSkin; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override; // For ITBItems interface + procedure InvalidateBackground(InvalidateChildren: Boolean = True); virtual; + property View: TSpTBXToolbarView read GetView; + published + property Items: TTBRootItem read GetRootItems; + end; + + { TSpTBXCompoundBar } + + TSpTBXCompoundBar = class(TSpTBXCompoundItemsControl) + private + FOnDrawDockBackground: TSpTBXDrawEvent; + procedure DrawDockBackground(Sender: TObject; ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); + procedure DrawToolbarBackground(Sender: TObject; ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); + procedure DockResize(Sender: TObject); + protected + procedure DoDrawDockBackground(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + property OnDrawDockBackground: TSpTBXDrawEvent read FOnDrawDockBackground write FOnDrawDockBackground; + public + constructor Create(AOwner: TComponent); override; + end; + + { TSpTBXButtonOptions } + + TSpTBXButtonOptions = class(TPersistent) + private + FEditableItems: TTBGroupItem; + FCloseButton: TSpTBXItem; + FMinimizeButton: TSpTBXItem; + FMaximizeButton: TSpTBXItem; + FRightAlignSpacer: TSpTBXRightAlignSpacerItem; + FCaptionImageIndex: Integer; + FCloseImageIndex: Integer; + FMinimizeImageIndex: Integer; + FMaximizeImageIndex: Integer; + FRestoreImageIndex: Integer; + FCaptionLabel: WideString; + FCaption: Boolean; + FClose: Boolean; + FMinimize: Boolean; + FMaximize: Boolean; + FButtonBorders: Boolean; + FTitleBarMaxSize: Integer; + procedure SetCaptionImageIndex(Value: Integer); + procedure SetCloseImageIndex(Value: Integer); + procedure SetCaptionLabel(const Value: WideString); + procedure SetMaximizeImageIndex(Value: Integer); + procedure SetRestoreImageIndex(Value: Integer); + procedure SetMinimizeImageIndex(Value: Integer); + procedure SetCaption(const Value: Boolean); + procedure SetClose(const Value: Boolean); + procedure SetMaximize(const Value: Boolean); + procedure SetMinimize(const Value: Boolean); + procedure SetTitleBarMaxSize(const Value: Integer); + protected + FParentControl: TWinControl; + FToolbar: TSpTBXToolbar; + procedure ButtonsDrawImage(Sender: TObject; ACanvas: TCanvas; + State: TSpTBXSkinStatesType; const PaintStage: TSpTBXPaintStage; + var AImageList: TCustomImageList; var AImageIndex: Integer; var ARect: + TRect; var PaintDefault: Boolean); virtual; + procedure ButtonsDrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; + ItemInfo: TSpTBXMenuItemInfo; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); virtual; + procedure ButtonsClick(Sender: TObject); virtual; abstract; + procedure CreateButtons; virtual; + procedure UpdateButtonsVisibility; virtual; + procedure SetupButton(B: TSpTBXCustomItem); virtual; + function Restoring(B: TSpTBXCustomItem): Boolean; virtual; abstract; + public + constructor Create(AParent: TWinControl); virtual; + procedure SetupButtonIcon(B: TSpTBXCustomItem); virtual; + procedure MoveItemToTheLeft(B: TTBCustomItem); + property EditableItems: TTBGroupItem read FEditableItems; + property RightAlignSpacer: TSpTBXRightAlignSpacerItem read FRightAlignSpacer; + property MinimizeButton: TSpTBXItem read FMinimizeButton; + property MaximizeButton: TSpTBXItem read FMaximizeButton; + property CloseButton: TSpTBXItem read FCloseButton; + property CaptionLabel: WideString read FCaptionLabel write SetCaptionLabel; + published + property ButtonBorders: Boolean read FButtonBorders write FButtonBorders default True; + property Caption: Boolean read FCaption write SetCaption default True; + property Close: Boolean read FClose write SetClose default True; + property Minimize: Boolean read FMinimize write SetMinimize default True; + property Maximize: Boolean read FMaximize write SetMaximize default True; + property CaptionImageIndex: Integer read FCaptionImageIndex write SetCaptionImageIndex default -1; + property CloseImageIndex: Integer read FCloseImageIndex write SetCloseImageIndex default -1; + property MinimizeImageIndex: Integer read FMinimizeImageIndex write SetMinimizeImageIndex default -1; + property MaximizeImageIndex: Integer read FMaximizeImageIndex write SetMaximizeImageIndex default -1; + property RestoreImageIndex: Integer read FRestoreImageIndex write SetRestoreImageIndex default -1; + property TitleBarMaxSize: Integer read FTitleBarMaxSize write SetTitleBarMaxSize default 21; + end; + + { TSpTBXStatusBar } + + TSpTBXStatusToolbar = class(TSpTBXToolbar) + private + FSizeGrip: Boolean; + FSkinType: TSpTBXSkinType; + procedure SetSizeGrip(const Value: Boolean); + procedure WMNCLButtonDown(var Message: TWMNCLButtonDown); message WM_NCLBUTTONDOWN; + procedure WMSetCursor(var Message: TWMSetCursor); message WM_SETCURSOR; + protected + FParentForm: TCustomForm; + procedure DoItemNotification(Ancestor: TTBCustomItem; Relayed: Boolean; Action: TTBItemChangedAction; Index: Integer; Item: TTBCustomItem); override; + function GetItemsTextColor(State: TSpTBXSkinStatesType): TColor; override; + function GetRightAlignMargin: Integer; override; + function GetParentFormWindowState: TWindowState; + function IsPointInGrip(P: TPoint): Boolean; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); override; + 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: 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) + private + procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE; + protected + function GetItemsTextColor(State: TSpTBXSkinStatesType): TColor; override; + function GetTitleBar: TSpTBXCustomTitleBar; + function GetRightAlignMargin: Integer; override; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); override; + end; + + TSpTBXTitleBarButtonOptions = class(TSpTBXButtonOptions) + private + FSystemMenu: Boolean; + FSystemButton: TSpTBXSystemMenuItem; + procedure SetSystemMenu(const Value: Boolean); + protected + FTitleBar: TSpTBXCustomTitleBar; + procedure ButtonsDrawItem(Sender: TObject; ACanvas: TCanvas; + ARect: TRect; ItemInfo: TSpTBXMenuItemInfo; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); override; + procedure ButtonsClick(Sender: TObject); override; + procedure CreateButtons; override; + function Restoring(B: TSpTBXCustomItem): Boolean; override; + public + constructor Create(AParent: TWinControl); override; + property SystemButton: TSpTBXSystemMenuItem read FSystemButton; + published + property SystemMenu: Boolean read FSystemMenu write SetSystemMenu default True; + end; + + TSpTBXCustomTitleBar = class(TSpTBXCompoundBar) + private + FActive: Boolean; + FFixedSize: Boolean; + FFullScreenMaximize: Boolean; + FMouseActive: Boolean; + FOptions: TSpTBXTitleBarButtonOptions; + FOldAppWndProc: Pointer; + FNewAppWndProc: Pointer; + FOnDrawBackground: TSpTBXDrawEvent; + FOnSystemMenuPopup: TSpTBXPopupEvent; + FOldParentFormWndProc: TWndMethod; + procedure AppWndProc(var Msg: TMessage); + procedure NewParentFormWndProc(var Message: TMessage); + procedure SetActive(const Value: Boolean); + procedure SetMouseActive(const Value: Boolean); + procedure SetFullScreenMaximize(const Value: Boolean); + function GetWindowState: TWindowState; + procedure SetWindowState(const Value: TWindowState); + procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED; + procedure WMEraseBkgnd(var Message: TMessage); message WM_ERASEBKGND; + procedure WMSetCursor(var Message: TWMSetCursor); message WM_SETCURSOR; + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + procedure WMWindowPosChanged(var Message: TWMWindowPosChanged); message WM_WINDOWPOSCHANGED; + protected + FParentForm: TCustomForm; + // Component + procedure Loaded; override; + function GetFloatingBorderSize: TPoint; + function GetItems: TTBCustomItem; override; // For ITBItems interface + function GetToolbarClass: TSpTBXToolbarClass; override; + procedure ChangeTitleBarState(Activate: Boolean); + procedure UpdateSkinMetrics; + + // Painting + procedure DoDrawDockBackground(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); override; + procedure DoDrawBackground(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); virtual; + + // Sizing + procedure AdjustClientRect(var Rect: TRect); override; + procedure GetSizeCursor(MousePos: TPoint; var SizeCursor, SizeCode: Integer); + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); override; + + property Active: Boolean read FActive write SetActive default True; + property Align default alClient; + property FixedSize: Boolean read FFixedSize write FFixedSize default False; + property FullScreenMaximize: Boolean read FFullScreenMaximize write SetFullScreenMaximize default False; + property Options: TSpTBXTitleBarButtonOptions read FOptions write FOptions; + property WindowState: TWindowState read GetWindowState write SetWindowState; + property OnDrawBackground: TSpTBXDrawEvent read FOnDrawBackground write FOnDrawBackground; + property OnSystemMenuPopup: TSpTBXPopupEvent read FOnSystemMenuPopup write FOnSystemMenuPopup; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + function GetClientAreaRect: TRect; + function IsActive: Boolean; + property MouseActive: Boolean read FMouseActive write SetMouseActive default True; + property Toolbar: TSpTBXToolbar read FToolbar; + published + property Caption; + end; + + TSpTBXTitleBar = class(TSpTBXCustomTitleBar) + published + property Align; + property Anchors; + property Color; + property BiDiMode; + property Constraints; + property DockSite; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property ParentColor; + property ParentBiDiMode; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowHint; + property Visible; + property OnCanResize; + property OnContextPopup; + property OnDockDrop; + property OnDockOver; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnGetSiteInfo; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnResize; + property OnStartDock; + property OnStartDrag; + property OnUnDock; + // TSpTBXCustomTitleBar properties + property Active; + property FixedSize; + property FullScreenMaximize; + property Images; + property Options; + property OnDrawBackground; + property OnDrawDockBackground; + property OnSystemMenuPopup; + end; + + { TBitmapHint } + + TBitmapHint = class(THintWindow) + private + FHintBitmap: TBitmap; + FActivating: Boolean; + procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED; + protected + procedure Paint; override; + public + property Activating: Boolean read FActivating; + procedure ActivateHint(Rect: TRect; const AHint: string); override; + procedure ActivateHintData(Rect: TRect; const AHint: string; AData: Pointer); override; + end; + +{ Item helpers } +procedure SpFillItemInfo(ACanvas: TCanvas; IV: TTBItemViewer; out ItemInfo: TSpTBXMenuItemInfo); +function SpGetBoundsRect(IV: TTBItemViewer; Root: TTBRootItem): TRect; +procedure SpGetAllItems(AParentItem: TTBCustomItem; ItemsList: TTntStringList; ClearFirst: Boolean = True); +function SpGetMenuMaximumImageSize(View: TTBView): TSize; +function SpGetItemViewerFromPoint(Root: TTBRootItem; View: TTBView; P: TPoint; ProcessGroupItems: Boolean = True): TTBItemViewer; +function SpGetNextItemSameEdge(View: TTBView; IV: TTBItemViewer; GoForward: Boolean; SearchType: TSpTBXSearchItemViewerType): TTBItemViewer; +function SpGetFirstRightAlignSpacer(View: TTBView): TSpTBXItemViewer; +function SpGetRightAlignedItems(View: TTBView; RightAlignedList: TList; IsRotated: Boolean; out VisibleTotalWidth, RightAlignedTotalWidth: Integer): TSpTBXItemViewer; +procedure SpInvalidateItem(View: TTBView; Item: TTBCustomItem); +function SpFindItemViewer(View: TTBView; Item: TTBCustomItem): TTBItemViewer; +function SpFindControlItem(Item: TTBCustomItem; Ctl: TControl; Recurse: Boolean = True): TTBControlItem; +procedure SpGetDropPosItemViewer(Root: TTBRootItem; View: TTBView; P: TPoint; out DestIV: TTBItemViewer; out DestItemPos: Integer; out DropMark: TRect); overload; +procedure SpGetDropPosItemViewer(Root: TTBRootItem; View: TTBView; P: TPoint; SourceItemPos: Integer; out DestIV: TTBItemViewer; out DestItemPos: Integer); overload; +function SpGetDragHandleSize(Toolbar: TTBCustomDockableWindow): Integer; +function SpIsVerticalToolbar(Toolbar: TTBCustomDockableWindow): Boolean; +function SpIsDockUsingBitmap(Dock: TTBDock): Boolean; + +{ Painting helpers } +procedure SpDrawXPToolbarButton(ACanvas: TCanvas; ARect: TRect; State: TSpTBXSkinStatesType; SkinType: TSpTBXSkinType; ComboPart: TSpTBXComboPart = cpNone); +procedure SpDrawXPMenuItem(ACanvas: TCanvas; ARect: TRect; ItemInfo: TSpTBXMenuItemInfo); +procedure SpDrawXPMenuSeparator(ACanvas: TCanvas; ARect: TRect; MenuItemStyle, Vertical: Boolean); +procedure SpDrawXPMenuItemImage(ACanvas: TCanvas; ARect: TRect; const ItemInfo: TSpTBXMenuItemInfo; ImageList: TCustomImageList; ImageIndex: Integer); +procedure SpDrawXPMenuGutter(ACanvas: TCanvas; ARect: TRect; SkinType: TSpTBXSkinType); +procedure SpDrawXPMenuPopupWindow(ACanvas: TCanvas; ARect, OpenIVRect: TRect; DrawGutter: Boolean; ImageSize: Integer; SkinType: TSpTBXSkinType); +procedure SpDrawXPStatusBar(ACanvas: TCanvas; ARect, AGripRect: TRect; SkinType: TSpTBXSkinType); +procedure SpDrawXPTitleBar(ACanvas: TCanvas; ARect: TRect; IsActive: Boolean; DrawBorders: Boolean = True); +procedure SpDrawXPTitleBarBody(ACanvas: TCanvas; ARect: TRect; IsActive: Boolean; BorderSize: TPoint; DrawBody: Boolean = True); +procedure SpDrawXPDock(ACanvas: TCanvas; ARect: TRect; SkinType: TSpTBXSkinType; Vertical: Boolean = False); +procedure SpDrawXPToolbar(ACanvas: TCanvas; ARect: TRect; SkinType: TSpTBXSkinType; Docked, Floating, Vertical, PaintSkinBackground, PaintBorders: Boolean; SkinComponent: TSpTBXSkinComponentsType = skncToolbar); overload; +procedure SpDrawXPToolbar(W: TTBCustomDockableWindow; ACanvas: TCanvas; ARect: TRect; PaintOnNCArea: Boolean; PaintBorders: Boolean = True; SkinComponent: TSpTBXSkinComponentsType = skncToolbar); overload; +procedure SpDrawXPToolbarGrip(W: TTBCustomDockableWindow; ACanvas: TCanvas; ARect: TRect); +procedure SpDrawXPTooltipBackground(ACanvas: TCanvas; ARect: TRect); + +{ Menu helpers } +function SpCalcPopupPosition(const X, Y, Width, Height: Integer; PopupControl: TControl = nil; IsVertical: Boolean = False): TPoint; +function SpHMenuGetCaption(Menu: HMenu; Index: Integer): WideString; +function SpHMenuToTBMenuItem(Menu: HMenu; ParentItem: TTBCustomItem): Boolean; +function SpShowSystemPopupMenu(ParentForm: TCustomForm; ScreenPos: TPoint; DoDefault: Boolean = True): Integer; +function SpFillSystemSpTBXPopup(ParentForm: TCustomForm; ParentItem: TTBCustomItem; ShowSize, ShowMinimize, ShowMaximize, ShowClose: Boolean; ClickEvent: TNotifyEvent = nil): Boolean; +function SpShowSystemSpTBXPopupMenu(ParentForm: TCustomForm; ScreenPos: TPoint; ShowSize, ShowMinimize, ShowMaximize, ShowClose: Boolean; PopupEvent: TSpTBXPopupEvent; DoDefault: Boolean = True): Integer; + +{ Misc helpers } +procedure SpActivateDwmNC(WinControl: TWinControl; Activate: Boolean); +function SpIsDwmCompositionEnabled: Boolean; +function SpCanFocus(WinControl: TWinControl): Boolean; +function SpIsFocused(WinControl: TWinControl; out FocusedChild: TWinControl): Boolean; +function SpFocusFirstChild(WinControl: TWinControl): TWinControl; +function SpFindControl(Parent: TWinControl; Child: TControl): Integer; +function SpFindParent(Control: TControl; ParentClass: TClass): TWinControl; +function SpHasBorders(WinControl: TWinControl): Boolean; +function SpGetFormWindowState(F: TCustomForm; out RestoreBoundsRect: TRect): TWindowState; +procedure SpSetFormWindowState(F: TCustomForm; WindowState: TWindowState; RestoreBoundsRect: TRect); +function SpGetTaskBar(out State, Edge: Cardinal; out Bounds: TRect): Boolean; +procedure SpRecalcNCArea(WinControl: TWinControl); + +{ Customizer helpers } +procedure SpCustomizeAllToolbars(AParentComponent: TComponent; Reset: Boolean); +procedure SpBeginUpdateAllToolbars(AParentComponent: TComponent); +procedure SpEndUpdateAllToolbars(AParentComponent: TComponent); + +{ Unicode helpers } +procedure SpPersistent_AfterInherited_DefineProperties(Filer: TFiler; Instance: TPersistent); + +var + SmCaptionFont: TFont; + SpStockHintBitmap: TBitmap; + MDIButtonsImgList: TImageList = nil; + SpTBXHintWindowClass: THintWindowClass = TBitmapHint; + +const + CDefaultToolbarBorderSize = 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, IsComboPushed: Boolean; + IsToolbarStyle, ImageIsShown: Boolean; + ImgSize, RightImageSize: TSize; +begin + Item := TTBCustomItemAccess(IV.Item); + View := TTBViewAccess(IV.View); + + if IV is TSpTBXItemViewer then + IsToolbarStyle := TSpTBXItemViewer(IV).IsToolbarStyle + else + IsToolbarStyle := IV.IsToolbarStyle; + IsOpen := IV = View.OpenViewer; + IsHoverItem := IV = View.Selected; + IsPushed := IsHoverItem and (IsOpen or (View.MouseOverSelected and View.Capture and 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 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 IV is TSpTBXItemViewer then + ItemInfo.IsOnToolbox := TSpTBXItemViewer(IV).IsOnToolBoxPopup; + 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 := 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; + + if tbisClicksTransparent in Item.ItemStyle then + ItemInfo.State := CurrentSkin.GetState(ItemInfo.Enabled, False, False, False) + else + 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 SpDrawXPToolbarButton(ACanvas: TCanvas; ARect: TRect; State: TSpTBXSkinStatesType; + SkinType: TSpTBXSkinType; ComboPart: TSpTBXComboPart = cpNone); +// Paints a toolbar button depending on the State and SkinType +var + Flags: Integer; + ForceRectBorders: TAnchors; +const + XPPart: array [TSpTBXComboPart] of Integer = (TP_BUTTON, TP_DROPDOWNBUTTON, + TP_SPLITBUTTON, TP_SPLITBUTTONDROPDOWN); +begin + case SkinType of + sknNone: + begin + case State of + sknsNormal, sknsDisabled: ; // Do nothing + sknsHotTrack: + Windows.DrawEdge(ACanvas.Handle, ARect, BDR_RAISEDINNER, BF_RECT); + sknsPushed, sknsCheckedAndHotTrack: + Windows.DrawEdge(ACanvas.Handle, ARect, BDR_SUNKENOUTER, BF_RECT); + sknsChecked: + 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; + Windows.DrawEdge(ACanvas.Handle, ARect, BDR_SUNKENOUTER, BF_RECT); + end; + end; + end; + sknWindows: + begin + Flags := TS_NORMAL; + case State of + 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[ComboPart], Flags, ARect, nil); + end; + sknSkin: + begin + ForceRectBorders := []; + if ComboPart = cpSplitLeft then ForceRectBorders := [akRight] + else + if ComboPart = cpSplitRight then ForceRectBorders := [akLeft]; + CurrentSkin.PaintBackground(ACanvas, ARect, skncToolbarItem, State, True, True, False, ForceRectBorders); + end; + end; +end; + +procedure SpDrawXPMenuItem(ACanvas: TCanvas; ARect: TRect; ItemInfo: TSpTBXMenuItemInfo); +// Paints a menu or toolbar item depending on the ItemInfo + + procedure ToolbarItemDraw(ARect: TRect); + var + ForceRectBorders: TAnchors; + Flags: Integer; + begin + ForceRectBorders := []; + if ItemInfo.IsSplit then + if ItemInfo.ComboPart = cpSplitLeft then ForceRectBorders := [akRight] + else + if ItemInfo.ComboPart = cpSplitRight then ForceRectBorders := [akLeft]; + + case ItemInfo.SkinType of + sknNone: + begin + if ItemInfo.Checked then + if not ItemInfo.HotTrack or (not ItemInfo.Enabled and ItemInfo.ToolbarStyle) then + ItemInfo.State := sknsChecked; // Paint Disabled&Checked as Checked + + if ItemInfo.State = sknsNormal then begin + if ItemInfo.IsDesigning then + Windows.DrawEdge(ACanvas.Handle, ARect, BDR_RAISEDINNER, BF_RECT); + end + else + SpDrawXPToolbarButton(ACanvas, ARect, ItemInfo.State, ItemInfo.SkinType, ItemInfo.ComboPart); + end; + sknWindows: + if ItemInfo.IsDesigning then + SpDrawRectangle(ACanvas, ARect, 2, clBtnShadow, clBtnShadow, clNone, clNone, ForceRectBorders) + else + if ItemInfo.IsOnMenuBar then begin + if SpIsWinVistaOrUp then begin + // Use the new API on Windows Vista + Flags := MBI_NORMAL; + case ItemInfo.State of + sknsDisabled: Flags := MBI_DISABLED; + sknsHotTrack: Flags := MBI_HOT; + sknsPushed: Flags := MBI_PUSHED; + end; + + DrawThemeBackground(ThemeServices.Theme[teMenu], ACanvas.Handle, MENU_BARITEM, Flags, ARect, nil); + end + else + if ItemInfo.State in [sknsHotTrack, sknsPushed, sknsChecked, sknsCheckedAndHotTrack] then + SpFillRect(ACanvas, ARect, clHighlight); + end + else + SpDrawXPToolbarButton(ACanvas, ARect, ItemInfo.State, ItemInfo.SkinType, ItemInfo.ComboPart); + 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 + SpDrawXPToolbarButton(ACanvas, ARect, ItemInfo.State, ItemInfo.SkinType, ItemInfo.ComboPart); + end; + end; + + procedure MenuItemDraw(ARect: TRect); + var + Flags: Integer; + begin + case ItemInfo.SkinType of + sknNone: + SpFillRect(ACanvas, ARect, clHighlight); + sknWindows: + if SpIsWinVistaOrUp then begin + // Use the new API on Windows Vista + if ItemInfo.Enabled then Flags := MPI_HOT + else Flags := MPI_DISABLEDHOT; + DrawThemeBackground(ThemeServices.Theme[teMenu], ACanvas.Handle, MENU_POPUPITEM, Flags, ARect, nil); + end + else + SpFillRect(ACanvas, ARect, clHighlight); + sknSkin: + CurrentSkin.PaintBackground(ACanvas, ARect, skncMenuItem, sknsHotTrack, True, True); + end; + end; + +var + R: TRect; + DrawCheckBoxFrame: Boolean; + C: TColor; + SelectionDelta: Integer; + Flags: Integer; +begin + if ItemInfo.ToolbarStyle then begin // Toolbar Item + if ItemInfo.IsSplit then begin + if ItemInfo.IsOpen and CurrentSkin.OfficePopup then begin + // If it's Split, Open and OfficePopup paint the skncOpenToolbarItem skin + ARect.Right := ItemInfo.ComboRect.Right; + ToolbarItemDraw(ARect); + end + else begin + // Draw the left side button + if (ItemInfo.SkinType = sknSkin) or ItemInfo.IsDesigning then + Inc(ARect.Right, 2); + ItemInfo.ComboPart := cpSplitLeft; + ToolbarItemDraw(ARect); + + // Draw the right side button + ItemInfo.ComboPart := cpSplitRight; + ItemInfo.State := ItemInfo.ComboState; + ToolbarItemDraw(ItemInfo.ComboRect); + end; + end + else + ToolbarItemDraw(ARect); + end + else begin // Menu item + // DrawCheckBoxFrame is true when the item is checked + if (ItemInfo.SkinType = sknSkin) or (SpIsWinVistaOrUp and (ItemInfo.SkinType = sknWindows)) then + DrawCheckBoxFrame := ItemInfo.Enabled and ItemInfo.Checked + else begin + if ItemInfo.SkinType = sknNone then + DrawCheckBoxFrame := ItemInfo.Checked or ItemInfo.ImageOrCheckShown + else + DrawCheckBoxFrame := ItemInfo.Enabled and (ItemInfo.Checked or ItemInfo.ImageOrCheckShown); + end; + + R := ARect; + + // Draw the item selection rectangle hottrack + // Office doesn't draw the hottrack when the item is disabled, check + // if OfficeMenu is set. + if ItemInfo.Enabled or not CurrentSkin.OfficeMenu then + if ItemInfo.HotTrack then begin + if DrawCheckBoxFrame then begin + SelectionDelta := 0; + case ItemInfo.SkinType of + sknNone: + SelectionDelta := ItemInfo.MenuMargins.GutterSize + 1; // Don't draw the hottrack selection behind the checkbox + sknWindows: + if not SpIsWinVistaOrUp then + SelectionDelta := ItemInfo.MenuMargins.GutterSize + 1; // Don't draw the hottrack selection behind the checkbox + sknSkin: + SelectionDelta := 3; // Don't draw the hottrack selection behind the checkbox left borders + end; + Inc(R.Left, SelectionDelta); + end; + MenuItemDraw(R); + end; + + // Draw the checkbox frame (the checkbox glyph is painted in the ItemViewer.Paint method) + if DrawCheckBoxFrame then begin + R := ARect; + R.Right := R.Left + ItemInfo.MenuMargins.GutterSize; + if SpIsWinVistaOrUp and (ItemInfo.SkinType = sknWindows) then begin + // Use the new API on Windows Vista + // The checkbox frame is not painted + if ItemInfo.State = sknsDisabled then Flags := MCB_DISABLED + else if ItemInfo.ImageShown then Flags := MCB_BITMAP + else Flags := MCB_NORMAL; + DrawThemeBackground(ThemeServices.Theme[teMenu], ACanvas.Handle, MENU_POPUPCHECKBACKGROUND, Flags, R, nil); + end + else + if ItemInfo.SkinType = sknSkin then + CurrentSkin.PaintBackground(ACanvas, R, skncMenuItem, ItemInfo.State, True, True) + else + ToolbarItemDraw(R); + end; + + // Draw the combo item separator + if ItemInfo.IsSplit then begin + if ItemInfo.SkinType = sknSkin then begin + C := SkinManager.CurrentSkin.Options(skncMenuItem, ItemInfo.State).Borders.Color1; + if C = clNone then + C := clBtnShadow; + end + else + C := clBtnShadow; + R := ARect; + R.Left := ARect.Right - 10 - 4; + SpDrawLine(ACanvas, R.Left, R.Top + 1, R.Left, R.Bottom - 1, C); + end; + end; +end; + +procedure SpDrawXPMenuSeparator(ACanvas: TCanvas; ARect: TRect; MenuItemStyle, Vertical: Boolean); +const + ToolbarXPFlags: array [Boolean] of Integer = (TP_SEPARATORVERT, TP_SEPARATOR); +var + R: TRect; + C: TColor; + D: Integer; + VistaSeparatorSize: tagSize; +begin + R := ARect; + case SkinManager.GetSkinType of + sknNone: + if not Vertical then begin + R.Top := (R.Top + R.Bottom) div 2 - 1; + DrawEdge(ACanvas.Handle, R, EDGE_ETCHED, BF_TOP); + end + else begin + R.Left := (R.Left + R.Right) div 2 - 1; + DrawEdge(ACanvas.Handle, R, EDGE_ETCHED, BF_LEFT); + end; + sknWindows: + if MenuItemStyle and SpIsWinVistaOrUp then begin + // Use the new API in Windows Vista + GetThemePartSize(ThemeServices.Theme[teMenu], 0, MENU_POPUPSEPARATOR, 0, nil, TS_TRUE, VistaSeparatorSize); + R := SpCenterRectVert(R, VistaSeparatorSize.cy); + DrawThemeBackground(ThemeServices.Theme[teMenu], ACanvas.Handle, MENU_POPUPSEPARATOR, 0, R, nil); + end + else begin + if MenuItemStyle then begin + D := 0; + if Vertical then begin + R.Left := (R.Left + R.Right) div 2 - 1; + Inc(R.Top, D); Dec(R.Bottom, D); + Windows.DrawEdge(ACanvas.Handle, R, EDGE_ETCHED, BF_LEFT); + end + else begin + R.Top := (R.Top + R.Bottom) div 2 - 1; + Inc(R.Left, D); Dec(R.Right, D); + Windows.DrawEdge(ACanvas.Handle, R, EDGE_ETCHED, BF_TOP); + end; + end + else + DrawThemeBackground(ThemeServices.Theme[teToolbar], ACanvas.Handle, ToolbarXPFlags[Vertical], TS_NORMAL, R, nil); + end; + sknSkin: + if not Vertical then begin + // ??? what happens when 2 items have different imagelist sizes? how is the gutter measured? + R.Top := (R.Bottom + R.Top) div 2 - 1; + R.Bottom := R.Top; + C := SkinManager.CurrentSkin.Options(skncSeparator, sknsNormal).Body.Color1; + SpDrawLine(ACanvas, R.Left, R.Top, R.Right, R.Bottom, C); + OffsetRect(R, 0, 1); + C := SkinManager.CurrentSkin.Options(skncSeparator, sknsNormal).Body.Color2; + SpDrawLine(ACanvas, R.Left, R.Top, R.Right, R.Bottom, C); + end + else begin + R.Left := (R.Right + R.Left) div 2 - 1; + R.Right := R.Left; + InflateRect(R, 0, -3); + C := SkinManager.CurrentSkin.Options(skncSeparator, sknsNormal).Body.Color1; + SpDrawLine(ACanvas, R.Left, R.Top, R.Right, R.Bottom, C); + OffsetRect(R, 1, 0); + C := SkinManager.CurrentSkin.Options(skncSeparator, sknsNormal).Body.Color2; + SpDrawLine(ACanvas, R.Left, R.Top, R.Right, R.Bottom, C); + end; + end; +end; + +procedure SpDrawXPMenuItemImage(ACanvas: TCanvas; ARect: TRect; + const ItemInfo: TSpTBXMenuItemInfo; ImageList: TCustomImageList; ImageIndex: Integer); +begin + if ImageList is TTBCustomImageList then begin + if ItemInfo.IsSunkenCaption then + OffsetRect(ARect, 1, 1); + TTBCustomImageList(ImageList).DrawState(ACanvas, ARect.Left, ARect.Top, + ImageIndex, ItemInfo.Enabled, ItemInfo.HotTrack, ItemInfo.Checked); + Exit; + end; + + if ItemInfo.Enabled and SkinManager.CurrentSkin.OfficeIcons then begin + // Draw icon shadow + if ItemInfo.HotTrack and not ItemInfo.Pushed then begin + OffsetRect(ARect, 1, 1); + SpDrawIconShadow(ACanvas, ARect, ImageList, ImageIndex); + OffsetRect(ARect, -2, -2); + end; + SpDrawImageList(ACanvas, ARect, ImageList, ImageIndex, ItemInfo.Enabled, True); + end + else begin + if ItemInfo.IsSunkenCaption then + OffsetRect(ARect, 1, 1); + SpDrawImageList(ACanvas, ARect, ImageList, ImageIndex, ItemInfo.Enabled, True); + end; +end; + +procedure SpDrawXPMenuGutter(ACanvas: TCanvas; ARect: TRect; SkinType: TSpTBXSkinType); +var + Op: TSpTBXSkinOptionCategory; + C: TColor; +begin + SkinType := SpTBXSkinType(SkinType); + // If it's Windows theme and we're not on Vista do default painting + if (SkinType = sknWindows) and not SpIsWinVistaOrUp then + SkinType := sknNone; + + case SkinType of + sknNone:; // No gutter on Windows 9x, 2000 + sknWindows: + begin + // Only Windows Vista painting, XP just fills the background + if SpIsWinVistaOrUp then + DrawThemeBackground(ThemeServices.Theme[teMenu], ACanvas.Handle, MENU_POPUPGUTTER, 0, ARect, nil); + end; + sknSkin: + begin + Op := CurrentSkin.Options(skncGutter, sknsNormal); + if not Op.Body.IsEmpty then + SpPaintSkinBackground(ACanvas, ARect, Op, False); + + // Paint only the right side border, like a Separator line + ARect.Left := ARect.Right; + C := Op.Borders.Color2; + if C <> clNone then begin + SpDrawLine(ACanvas, ARect.Left, ARect.Top, ARect.Right, ARect.Bottom, C); + OffsetRect(ARect, -1, 0); + end; + C := Op.Borders.Color1; + if C <> clNone then + SpDrawLine(ACanvas, ARect.Left, ARect.Top, ARect.Right, ARect.Bottom, C); + end; + end; +end; + +procedure SpDrawXPMenuPopupWindow(ACanvas: TCanvas; ARect, OpenIVRect: TRect; + DrawGutter: Boolean; ImageSize: Integer; SkinType: TSpTBXSkinType); +var + GutterR: TRect; + MarginsInfo: TSpTBXMenuItemMarginsInfo; + SaveIndex: Integer; +begin + SkinType := SpTBXSkinType(SkinType); + // If it's Windows theme and we're not on Vista do default painting + if (SkinType = sknWindows) and not SpIsWinVistaOrUp then + SkinType := sknNone; + + case SkinType of + sknNone: // Windows 9x, 2000 and XP + if not AreFlatMenusEnabled then begin + DrawEdge(ACanvas.Handle, ARect, EDGE_RAISED, BF_RECT or BF_ADJUST); + SpFillRect(ACanvas, ARect, clBtnFace); + end + else + SpFillRect(ACanvas, ARect, clMenu, clBtnShadow); + sknWindows: // Only Windows Vista painting, XP just fills the background + begin + // Use the new API in Windows Vista + DrawThemeBackground(ThemeServices.Theme[teMenu], ACanvas.Handle, MENU_POPUPBACKGROUND, 0, ARect, nil); + + // Now paint the borders, clip the background + SaveIndex := SaveDC(ACanvas.Handle); + try + ExcludeClipRect(ACanvas.Handle, ARect.Left + 2, ARect.Top + 2, ARect.Right - 2, ARect.Bottom - 2); + DrawThemeBackground(ThemeServices.Theme[teMenu], ACanvas.Handle, MENU_POPUPBORDERS, 0, ARect, nil); + finally + RestoreDC(ACanvas.Handle, SaveIndex); + end; + + // Paint the gutter + if DrawGutter then begin + CurrentSkin.GetMenuItemMargins(ACanvas, ImageSize, MarginsInfo); + GutterR := ARect; + InflateRect(GutterR, -1, -4); + GutterR.Right := GutterR.Left + MarginsInfo.GutterSize + MarginsInfo.LeftCaptionMargin + 1 + 4; // +1 because the popup has 2 pixel border, and +4 gutter separator has 4 pixel spacing + SpDrawXPMenuGutter(ACanvas, GutterR, SkinType); + end; + end; + sknSkin: + begin + // Paint the background, if OfficePopup is true just clip the top + // border corresponding to the Open ItemViewer Rect + if OpenIVRect.Top < 0 then begin + OpenIVRect.Top := ARect.Top; + OpenIVRect.Bottom := ARect.Top + 1; + InflateRect(OpenIVRect, -1, 0); + + // First paint the background + CurrentSkin.PaintBackground(ACanvas, ARect, skncPopup, sknsNormal, True, False); + // Now paint the borders, clip the top border + SaveIndex := SaveDC(ACanvas.Handle); + try + ExcludeClipRect(ACanvas.Handle, OpenIVRect.Left, OpenIVRect.Top, OpenIVRect.Right, OpenIVRect.Bottom); + CurrentSkin.PaintBackground(ACanvas, ARect, skncPopup, sknsNormal, False, True); + finally + RestoreDC(ACanvas.Handle, SaveIndex); + end; + end + else + CurrentSkin.PaintBackground(ACanvas, ARect, skncPopup, sknsNormal, True, True); + + // Paint the gutter + if DrawGutter and not CurrentSkin.Options(skncGutter, sknsNormal).IsEmpty then begin + if ImageSize <= 0 then ImageSize := 16; + CurrentSkin.GetMenuItemMargins(ACanvas, ImageSize, MarginsInfo); + GutterR := ARect; + InflateRect(GutterR, -1, -1); + GutterR.Right := GutterR.Left + MarginsInfo.GutterSize + MarginsInfo.LeftCaptionMargin + 1; // +1 because the popup has 2 pixel border + SpDrawXPMenuGutter(ACanvas, GutterR, SkinType); + end; + end; + end; +end; + +procedure SpDrawXPStatusBar(ACanvas: TCanvas; ARect, AGripRect: TRect; SkinType: TSpTBXSkinType); +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; + end; + end; +end; + +procedure SpDrawXPTitleBar(ACanvas: TCanvas; ARect: TRect; IsActive: Boolean; DrawBorders: Boolean = True); +const + XpFlags: array [Boolean] of Integer = (FS_INACTIVE, FS_ACTIVE); + W9xFlags: array [Boolean] of Integer = (0, DC_ACTIVE); + W9xGradientFlag: array [Boolean] of Integer = (0, DC_GRADIENT); +var + Gradient: Boolean; + B: BOOL; +begin + case SkinManager.GetSkinType of + sknNone: + begin + Gradient := SystemParametersInfo(SPI_GETGRADIENTCAPTIONS, 0, @B, 0) and B; + Windows.DrawCaption(GetDesktopWindow, ACanvas.Handle, ARect, DC_TEXT or W9xFlags[IsActive] or W9xGradientFlag[Gradient]); + end; + sknWindows: + // If WP_CAPTION is used instead of WP_SMALLCAPTION the top borders are rounded + DrawThemeBackground(ThemeServices.Theme[teWindow], ACanvas.Handle, WP_SMALLCAPTION, XpFlags[IsActive], ARect, nil); + sknSkin: + CurrentSkin.PaintBackground(ACanvas, ARect, skncWindowTitleBar, sknsNormal, True, DrawBorders); + end; +end; + +procedure SpDrawXPTitleBarBody(ACanvas: TCanvas; ARect: TRect; IsActive: Boolean; + BorderSize: TPoint; DrawBody: Boolean = True); +var + R, MirrorR: TRect; + SaveIndex, Flags: Integer; + B: TBitmap; +begin + case SkinManager.GetSkinType of + sknNone: + begin + if DrawBody then + ACanvas.FillRect(ARect); + SaveIndex := SaveDC(ACanvas.Handle); + try + R := ARect; + InflateRect(R, -BorderSize.X, -BorderSize.Y); + ExcludeClipRect(ACanvas.Handle, R.Left, R.Top, R.Right, R.Bottom); + if not DrawBody then + ACanvas.FillRect(ARect); + Windows.DrawEdge(ACanvas.Handle, ARect, EDGE_RAISED, BF_RECT); + finally + RestoreDC(ACanvas.Handle, SaveIndex); + end; + end; + sknWindows: + begin + if IsActive then + Flags := FS_ACTIVE + else + Flags := FS_INACTIVE; + R := ARect; + R.Top := R.Bottom - BorderSize.Y; + DrawThemeBackground(ThemeServices.Theme[teWindow], ACanvas.Handle, WP_SMALLFRAMEBOTTOM, Flags, R, nil); + R.Top := ARect.Top + BorderSize.Y; + R.Bottom := ARect.Bottom - BorderSize.Y; + R.Right := R.Left + BorderSize.X; + DrawThemeBackground(ThemeServices.Theme[teWindow], ACanvas.Handle, WP_SMALLFRAMELEFT, Flags, R, nil); + R.Right := ARect.Right; + R.Left := R.Right - BorderSize.X; + DrawThemeBackground(ThemeServices.Theme[teWindow], ACanvas.Handle, WP_SMALLFRAMERIGHT, Flags, R, nil); + + // Don't know how to paint a captionless window frame + // We have to mirror the bottom frame and paint it on the top + B := TBitmap.Create; + try + R := ARect; + R.Bottom := R.Top + BorderSize.Y; + B.Width := R.Right - R.Left; + B.Height := R.Bottom - R.Top; + DrawThemeBackground(ThemeServices.Theme[teWindow], B.Canvas.Handle, WP_SMALLFRAMEBOTTOM, Flags, R, nil); + + // Mirror + MirrorR := Rect(0, B.Height - 1, B.Width, -1); + ACanvas.CopyRect(R, B.Canvas, MirrorR); + finally + B.Free; + end; + end; + sknSkin: + begin + CurrentSkin.PaintWindowFrame(ACanvas, ARect, IsActive, DrawBody, BorderSize.X); + end; + end; +end; + +procedure SpDrawXPDock(ACanvas: TCanvas; ARect: TRect; SkinType: TSpTBXSkinType; Vertical: Boolean = False); +begin + SkinType := SpTBXSkinType(SkinType); + case SkinType of + sknNone: + begin + ACanvas.Brush.Color := clBtnFace; + ACanvas.FillRect(ARect); + end; + sknWindows: + begin + if Vertical then Inc(ARect.Bottom, 1); // Fix WindowsXP bug + DrawThemeBackground(ThemeServices.Theme[teRebar], ACanvas.Handle, 0, 0, ARect, nil); + end; + sknSkin: + CurrentSkin.PaintBackground(ACanvas, ARect, skncDock, sknsNormal, True, True, Vertical); + end; +end; + +procedure SpDrawXPToolbar(ACanvas: TCanvas; ARect: TRect; SkinType: TSpTBXSkinType; + Docked, Floating, Vertical, PaintSkinBackground, PaintBorders: Boolean; + SkinComponent: TSpTBXSkinComponentsType = skncToolbar); +begin + SkinType := SpTBXSkinType(SkinType); + case SkinType of + sknNone: + if PaintBorders and Docked then + Windows.DrawEdge(ACanvas.Handle, ARect, BDR_RAISEDINNER, BF_RECT or BF_ADJUST); + sknWindows: + if PaintBorders and Docked then + SpDrawRectangle(ACanvas, ARect, 0, SpLighten(clBtnFace, 24), SpLighten(clBtnFace, -32)); + sknSkin: + if Docked or Floating then begin + if Floating and CurrentSkin.Options(SkinComponent, sknsNormal).Body.IsEmpty then // Floating and doesn't have a Body + CurrentSkin.PaintBackground(ACanvas, ARect, skncDock, sknsNormal, True, False) + else begin + if Floating then PaintBorders := False; + CurrentSkin.PaintBackground(ACanvas, ARect, SkinComponent, sknsNormal, PaintSkinBackground, PaintBorders, Vertical); + end; + end; + end; +end; + +procedure SpDrawXPToolbar(W: TTBCustomDockableWindow; ACanvas: TCanvas; + ARect: TRect; PaintOnNCArea: Boolean; PaintBorders: Boolean = True; + SkinComponent: TSpTBXSkinComponentsType = skncToolbar); +var + R: TRect; + PaintDefault, DrawSkinBody: Boolean; + Toolbar: TTBCustomDockableWindowAccess; + IsVertical: Boolean; +begin + if CurrentSkin.Options(SkinComponent, sknsNormal).Body.IsEmpty then + SkinComponent := skncToolbar; + + Toolbar := TTBCustomDockableWindowAccess(W); + IsVertical := SpIsVerticalToolbar(Toolbar); + DrawSkinBody := True; + + if Toolbar.Docked then begin + // Prepare R + R := Toolbar.CurrentDock.ClientRect; + OffsetRect(R, -Toolbar.Left, -Toolbar.Top); + if not PaintOnNCArea then begin + if W is TSpTBXToolbar then + OffsetRect(R, -TSpTBXToolbar(W).DefaultToolbarBorderSize, -TSpTBXToolbar(W).DefaultToolbarBorderSize) + else + OffsetRect(R, -CDefaultToolbarBorderSize, -CDefaultToolbarBorderSize); + if IsVertical then + Dec(R.Top, SpGetDragHandleSize(Toolbar)) + else + Dec(R.Left, SpGetDragHandleSize(Toolbar)); + end; + // Draw the Dock background + if Toolbar.CurrentDock is TSpTBXDock then + TSpTBXDock(Toolbar.CurrentDock).DrawBackground(ACanvas.Handle, R); + + DrawSkinBody := not (Toolbar.CurrentDock.BackgroundOnToolbars and SpIsDockUsingBitmap(Toolbar.CurrentDock)); + end + else begin + if Toolbar.Floating then begin + if SkinManager.GetSkinType <> sknSkin then begin + if Toolbar.Color = clNone then ACanvas.Brush.Color := clBtnFace + else ACanvas.Brush.Color := Toolbar.Color; + ACanvas.FillRect(ARect); + end; + end + else begin + // Draw the parent background if the toolbar is not docked nor floating + // SpDrawParentBackground doesn't seem to work correctly here + // (when a toolbar is inside a toolwindow), use PerformEraseBackground instead + Controls.PerformEraseBackground(Toolbar, ACanvas.Handle); + end; + end; + + // Default painting + PaintDefault := True; + if W is TSpTBXToolbar then begin + if TSpTBXToolbar(W).MenuBar then + SkinComponent := skncMenuBar; + TSpTBXToolbar(W).DoDrawBackground(ACanvas, ARect, pstPrePaint, PaintDefault); + end + else + if W is TSpTBXCustomToolWindow then + TSpTBXCustomToolWindow(W).DoDrawBackground(ACanvas, ARect, pstPrePaint, PaintDefault); + + if PaintDefault then begin + R := ARect; + if Toolbar.Color <> clNone then begin + ACanvas.Brush.Color := Toolbar.Color; + ACanvas.FillRect(R); + end + else + SpDrawXPToolbar(ACanvas, R, SkinManager.GetSkinType, Toolbar.Docked, Toolbar.Floating, IsVertical, DrawSkinBody, PaintBorders, SkinComponent); + end; + + PaintDefault := True; + if W is TSpTBXToolbar then + TSpTBXToolbar(W).DoDrawBackground(ACanvas, ARect, pstPostPaint, PaintDefault) + else + if W is TSpTBXCustomToolWindow then + TSpTBXCustomToolWindow(W).DoDrawBackground(ACanvas, ARect, pstPostPaint, PaintDefault); +end; + +procedure SpDrawXPToolbarGrip(W: TTBCustomDockableWindow; ACanvas: TCanvas; ARect: TRect); +const + GripperPart: array [Boolean] of Cardinal = (RP_GRIPPER, RP_GRIPPERVERT); + Pattern: array [0..15] of Byte = (0, 0, $CC, 0, $78, 0, $30, 0, $78, 0, $CC, 0, 0, 0, 0, 0); +var + GripR, CloseR: TRect; + GripSize, Z: Integer; + Vertical: Boolean; + C1, C2, PatternColor: TColor; + Flags: Integer; + Toolbar: TTBCustomDockableWindowAccess; + State: TSpTBXSkinStatesType; +begin + Toolbar := TTBCustomDockableWindowAccess(W); + + GripSize := SpGetDragHandleSize(Toolbar); + if GripSize <= 0 then Exit; + + Vertical := SpIsVerticalToolbar(Toolbar); + + GripR := ARect; + if Vertical then begin + GripR.Bottom := GripR.Top + GripSize; + InflateRect(GripR, -2, 0); + end + else begin + GripR.Right := GripR.Left + GripSize; + InflateRect(GripR, 0, -2); + end; + + if Toolbar.DragHandleStyle <> dhNone then begin + if Toolbar.CloseButtonWhenDocked then begin + if Vertical then begin + CloseR.Left := ARect.Right - GripSize; + CloseR.Right := CloseR.Left + GripSize - 2; + CloseR.Top := ARect.Top + 2; + CloseR.Bottom := CloseR.Top + GripSize - 2; + Dec(GripR.Right, GripSize - 1); + end + else begin + CloseR.Left := ARect.Left + 2; + CloseR.Right := CloseR.Left + GripSize - 2; + CloseR.Top := ARect.Top + 2; + CloseR.Bottom := CloseR.Top + GripSize - 2; + Inc(GripR.Top, GripSize - 1); + end; + end; + + case SkinManager.GetSkinType of + sknNone: + begin + OffsetRect(CloseR, -1, -1); + if Vertical then begin + if Toolbar.CloseButtonWhenDocked then + if Toolbar.DragHandleStyle = dhDouble then Inc(GripR.Top, 1) + else Inc(GripR.Top, 3); + Inc(GripR.Top, 3); + GripR.Bottom := GripR.Top + 3; + end + else begin + if Toolbar.CloseButtonWhenDocked then + if Toolbar.DragHandleStyle = dhDouble then Inc(GripR.Left, 1) + else Inc(GripR.Left, 3); + Inc(GripR.Left, 3); + GripR.Right := GripR.Left + 3; + end; + Windows.DrawEdge(ACanvas.Handle, GripR, BDR_RAISEDINNER, BF_RECT); + ACanvas.Pixels[GripR.Left, GripR.Bottom - 1] := clBtnHighlight; + if Toolbar.DragHandleStyle = dhDouble then begin + if Vertical then OffsetRect(GripR, 0, 3) + else OffsetRect(GripR, 3, 0); + Windows.DrawEdge(ACanvas.Handle, GripR, BDR_RAISEDINNER, BF_RECT); + ACanvas.Pixels[GripR.Left, GripR.Bottom - 1] := clBtnHighlight; + end; + + // Close button + if Toolbar.CloseButtonWhenDocked then begin + if Toolbar.CloseButtonDown then + Windows.DrawEdge(ACanvas.Handle, CloseR, BDR_SUNKENOUTER, BF_RECT) + else + if Toolbar. CloseButtonHover then + Windows.DrawEdge(ACanvas.Handle, CloseR, BDR_RAISEDINNER, BF_RECT); + if Toolbar.CloseButtonDown then OffsetRect(CloseR, 1, 1); + SpDrawGlyphPattern(ACanvas.Handle, CloseR, 7, 7, Pattern[0], clBtnText); + end; + end; + sknWindows: + begin + // Since GetThemePartSize does not seem to work properly, assume we use default + // WindowsXP themes where the gripper pattern repeats itself every 4 pixels + if Vertical then begin + OffsetRect(GripR, -1, 0); + GripR := SpCenterRectVert(GripR, 6); + Z := GripR.Right - GripR.Left; + GripR.Left := GripR.Left - 1 + (Z and $3) shr 1; + GripR.Right := GripR.Left + Z and not $3 + 2; + end + else begin + OffsetRect(GripR, 0, -1); + GripR := SpCenterRectHoriz(GripR, 6); + Z := GripR.Bottom - GripR.Top; + GripR.Top := GripR.Top - 1 + (Z and $3) shr 1; + GripR.Bottom := GripR.Top + Z and not $3 + 1; + end; + DrawThemeBackground(ThemeServices.Theme[teRebar], ACanvas.Handle, GripperPart[Vertical], 0, GripR, nil); + + // Close button + if Toolbar.CloseButtonWhenDocked then begin + Flags := TS_NORMAL; + if Toolbar.CloseButtonDown then Flags := TS_PRESSED + else if Toolbar.CloseButtonHover then Flags := TS_HOT; + DrawThemeBackground(ThemeServices.Theme[teToolbar], ACanvas.Handle, TP_BUTTON, Flags, CloseR, nil); + if Toolbar.CloseButtonDown then OffsetRect(CloseR, 1, 1); + SpDrawGlyphPattern(ACanvas.Handle, CloseR, 7, 7, Pattern[0], clBtnText); + end; + end; + sknSkin: + begin + if Vertical then begin + InflateRect(GripR, -3, 0); + OffsetRect(GripR, 0, 2); + GripR := SpCenterRectVert(GripR, 4); + end + else begin + InflateRect(GripR, 0, -3); + OffsetRect(GripR, 2, 0); + GripR := SpCenterRectHoriz(GripR, 4); + end; + C1 := SkinManager.CurrentSkin.Options(skncToolbarGrip).Body.Color1; + C2 := SkinManager.CurrentSkin.Options(skncToolbarGrip).Body.Color2; + SpDrawXPGrip(ACanvas, GripR, C1, C2); + + // Close button + if Toolbar.CloseButtonWhenDocked then begin + State := sknsNormal; + if Toolbar.CloseButtonDown then State := sknsPushed + else if Toolbar.CloseButtonHover then State := sknsHotTrack; + CurrentSkin.PaintBackground(ACanvas, CloseR, skncToolbarItem, State, True, True); + if Toolbar.CloseButtonDown then OffsetRect(CloseR, 1, 1); + PatternColor := CurrentSkin.GetTextColor(skncToolbarItem, State); + SpDrawGlyphPattern(ACanvas.Handle, CloseR, 7, 7, Pattern[0], PatternColor); + end; + end; + end; + end; +end; + +procedure SpDrawXPTooltipBackground(ACanvas: TCanvas; ARect: TRect); +var + ClipRect: TRect; +begin + if SpIsWinVistaOrUp and ThemeServices.ThemesEnabled then begin + // Paint Vista gradient background if themes enabled + ClipRect := ARect; + InflateRect(ARect, 4, 4); + DrawThemeBackground(ThemeServices.Theme[teToolTip], ACanvas.Handle, TTP_STANDARD, TTSS_NORMAL, ARect, @ClipRect); + end + else + ACanvas.FillRect(ARect); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Menu helpers } + +function SpCalcPopupPosition(const X, Y, Width, Height: Integer; + PopupControl: TControl = nil; IsVertical: Boolean = False): TPoint; +var + R, MonitorR: TRect; +begin + if Assigned(PopupControl) then begin + Result := Point(0, 0); + if PopupControl.Parent = nil then Exit; + + R := PopupControl.BoundsRect; + R.TopLeft := PopupControl.Parent.ClientToScreen(R.TopLeft); + R.BottomRight := PopupControl.Parent.ClientToScreen(R.BottomRight); + + if IsVertical then + Result := Point(R.Right, R.Top) + else + Result := Point(R.Left, R.Bottom); + + MonitorR := GetRectOfMonitorContainingPoint(Result, True); + + if IsVertical then begin + if Result.X + Width > MonitorR.Right then + Result.X := R.Left - Width; + if Result.Y + Height > MonitorR.Bottom then + if R.Bottom > MonitorR.Bottom then + Result.Y := MonitorR.Bottom - Height + else + Result.Y := R.Bottom - Height; + end + else begin + if Result.X + Width > MonitorR.Right then + if R.Right > MonitorR.Right then + Result.X := MonitorR.Right - Width + else + Result.X := R.Right - Width; + if Result.Y + Height > MonitorR.Bottom then + Result.Y := R.Top - Height; + end; + end + else begin + Result := Point(X, Y); + MonitorR := GetRectOfMonitorContainingPoint(Result, True); + if X + Width > MonitorR.Right then + Result.X := X - Width; + if Y + Height > MonitorR.Bottom then + Result.Y := Y - Height; + end; +end; + +function SpHMenuGetCaption(Menu: HMenu; Index: Integer): WideString; +var + AnsiBuf: array[0..MAX_PATH] of AnsiChar; + WideBuf: array[0..MAX_PATH] of WideChar; + Size: Integer; +begin + Result := ''; + if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then begin + FillChar(AnsiBuf, MAX_PATH, #0); + GetMenuStringA(Menu, Index, @AnsiBuf, MAX_PATH, MF_BYPOSITION); + Size := lstrlenA(@AnsiBuf); + Result := WideString(AnsiBuf); + SetLength(Result, Size); + end + else begin + // [Bugfix] Windows bug: + // GetMenuStringW when a DBCS code page is active (e.g. Japanese) + // the result of the function is incorrect (it returns Size * 2) + // http://news.jrsoftware.org/read/article.php?id=12268&group=jrsoftware.toolbar2000.thirdparty + FillChar(WideBuf, MAX_PATH, #0); + GetMenuStringW(Menu, Index, @WideBuf, MAX_PATH, MF_BYPOSITION); + Size := lstrlenW(@WideBuf); + Result := WideBuf; + SetLength(Result, Size); + end; +end; + +function SpHMenuToTBMenuItem(Menu: HMenu; ParentItem: TTBCustomItem): Boolean; +var + MenuInfo: TMenuItemInfo; + I, C: Integer; + Item: TSpTBXItem; + HasSubMenu: Boolean; +begin + Result := False; + if not Assigned(ParentItem) or not IsMenu(Menu) then Exit; + + C := GetMenuItemCount(Menu); + + for I := 0 to C - 1 do begin + FillChar(MenuInfo, SizeOf(MenuInfo), #0); + MenuInfo.cbSize := SizeOf(MenuInfo); + MenuInfo.fMask := MIIM_TYPE or MIIM_STATE or MIIM_ID or MIIM_SUBMENU; + GetMenuItemInfo(Menu, I, True, MenuInfo); + + if MenuInfo.fType and MFT_SEPARATOR <> 0 then + ParentItem.Add(TSpTBXSeparatorItem.Create(nil)) + else begin + HasSubmenu := IsMenu(MenuInfo.hSubMenu); + if HasSubmenu then + Item := TSpTBXSubmenuItem.Create(nil) + else + Item := TSpTBXItem.Create(nil); + + Item.Caption := SpHMenuGetCaption(Menu, I); + Item.Tag := MenuInfo.wID; + if MenuInfo.fState and MFS_DISABLED <> 0 then + Item.Enabled := False; + if MenuInfo.fState and MFS_CHECKED <> 0 then + Item.Checked := True; + if MenuInfo.fState and MFS_DEFAULT <> 0 then + Item.Options := Item.Options + [tboDefault]; + ParentItem.Add(Item); + end; + end; + + Result := True; +end; + +function SpShowSystemPopupMenu(ParentForm: TCustomForm; ScreenPos: TPoint; DoDefault: Boolean = True): Integer; +var + SysMenu: HMENU; +begin + ReleaseCapture; + SysMenu := GetSystemMenu(ParentForm.Handle, False); + case ParentForm.WindowState of + wsMaximized: + begin + EnableMenuItem(SysMenu, SC_RESTORE, MF_ENABLED); + EnableMenuItem(SysMenu, SC_MAXIMIZE, MF_GRAYED); + EnableMenuItem(SysMenu, SC_MOVE, MF_GRAYED); + EnableMenuItem(SysMenu, SC_SIZE, MF_GRAYED); + end; + wsNormal: + begin + EnableMenuItem(SysMenu, SC_RESTORE, MF_GRAYED); + EnableMenuItem(SysMenu, SC_MAXIMIZE, MF_ENABLED); + EnableMenuItem(SysMenu, SC_MOVE, MF_ENABLED); + EnableMenuItem(SysMenu, SC_SIZE, MF_ENABLED); + end; + end; + Result := Integer(TrackPopupMenuEx(SysMenu, TPM_LEFTALIGN or TPM_RETURNCMD or + TPM_RIGHTBUTTON or TPM_HORIZONTAL or TPM_VERTICAL, ScreenPos.X, ScreenPos.Y, ParentForm.Handle, nil)); + if DoDefault then + case Result of + SC_MAXIMIZE: ParentForm.WindowState := wsMaximized; + SC_RESTORE: ParentForm.WindowState := wsNormal; + else + // WindowState := wsMinimized will not minimize the app correctly + SendMessage(ParentForm.Handle, WM_SYSCOMMAND, Result, 0); + end; +end; + +function SpFillSystemSpTBXPopup(ParentForm: TCustomForm; ParentItem: TTBCustomItem; + ShowSize, ShowMinimize, ShowMaximize, ShowClose: Boolean; ClickEvent: TNotifyEvent = nil): Boolean; +var + Menu: HMENU; + I: Integer; + Item: TTBCustomItem; +begin + Result := False; + Menu := GetSystemMenu(ParentForm.Handle, False); + + if SpHMenuToTBMenuItem(Menu, ParentItem) then begin + for I := 0 to ParentItem.Count - 1 do begin + Item := ParentItem.Items[I]; + Item.OnClick := ClickEvent; + case Item.Tag of + SC_MINIMIZE: + begin + Item.Visible := ShowMinimize; + Item.Enabled := ParentForm.WindowState <> wsMinimized; + Item.Images := MDIButtonsImgList; + Item.ImageIndex := 2; + end; + SC_RESTORE: + begin + Item.Visible := ShowMaximize; + Item.Enabled := ParentForm.WindowState <> wsNormal; + Item.Images := MDIButtonsImgList; + Item.ImageIndex := 3; + end; + SC_MAXIMIZE: + begin + Item.Visible := ShowMaximize; + Item.Enabled := ParentForm.WindowState <> wsMaximized; + Item.Images := MDIButtonsImgList; + Item.ImageIndex := 1; + end; + SC_CLOSE: + begin + Item.Visible := ShowClose; + Item.Options := Item.Options + [tboDefault]; + Item.Images := MDIButtonsImgList; + Item.ImageIndex := 0; + end; + SC_MOVE: + begin + Item.Enabled := ParentForm.WindowState <> wsMaximized; + end; + SC_SIZE: + begin + Item.Visible := ShowSize; + Item.Enabled := ParentForm.WindowState <> wsMaximized; + end; + end; + end; + + Result := True; + end; +end; + +function SpShowSystemSpTBXPopupMenu(ParentForm: TCustomForm; ScreenPos: TPoint; + ShowSize, ShowMinimize, ShowMaximize, ShowClose: Boolean; + PopupEvent: TSpTBXPopupEvent; DoDefault: Boolean = True): Integer; +var + Popup: TSpTBXPopupMenu; + ClickedItem: TTBCustomItem; +begin + Result := 0; + ReleaseCapture; + + Popup := TSpTBXPopupMenu.Create(ParentForm); + try + if SpFillSystemSpTBXPopup(ParentForm, Popup.Items, ShowSize, ShowMinimize, ShowMaximize, ShowClose) then begin + if Assigned(PopupEvent) then + Popup.OnInitPopup := PopupEvent; + Popup.PopupComponent := ParentForm; + ClickedItem := Popup.PopupEx(ScreenPos.X, ScreenPos.Y, nil, True); + if Assigned(ClickedItem) then begin + Result := ClickedItem.Tag; + // If it's not a SystemMenu item fire the OnClick event of the item + // We can't use PostClick because the Item will be destroyed by the + // time the message is handled. + if (Result < SC_SIZE) or (Result > SC_CONTEXTHELP) then + ClickedItem.Click; + end; + end; + finally + Popup.Free; + end; + + if DoDefault and (Result > 0) then + case Result of + SC_MAXIMIZE: + ParentForm.WindowState := wsMaximized; + SC_RESTORE: + ParentForm.WindowState := wsNormal; + SC_SIZE, SC_MOVE, SC_MINIMIZE, SC_CLOSE: + begin + // WindowState := wsMinimized will not minimize the app correctly + SendMessage(ParentForm.Handle, WM_SYSCOMMAND, Result, 0); + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Misc helpers } + +procedure SpActivateDwmNC(WinControl: TWinControl; Activate: Boolean); +{$IFDEF JR_D11} +var + ncrp: Cardinal; +{$ENDIF} +begin + {$IFDEF JR_D11} + // Use the new API on Windows Vista + if DwmCompositionEnabled and WinControl.HandleAllocated then begin + if Activate then + ncrp := DWMNCRP_USEWINDOWSTYLE + else + ncrp := DWMNCRP_DISABLED; + DwmSetWindowAttribute(WinControl.Handle, DWMWA_NCRENDERING_POLICY, @ncrp, SizeOf(ncrp)); + end; + {$ENDIF} +end; + +function SpIsDwmCompositionEnabled: Boolean; +begin + {$IFDEF JR_D11} + // Use the new API on Windows Vista + Result := DwmCompositionEnabled; + {$ELSE} + Result := False; + {$ENDIF} +end; + +function SpCanFocus(WinControl: TWinControl): Boolean; +var + Form: TCustomForm; +begin + Result := False; + if Assigned(WinControl) and not WinControl.Focused then begin + Form := GetParentForm(WinControl); + if Assigned(Form) and Form.Enabled and Form.Visible then + Result := WinControl.CanFocus; + end; +end; + +function SpIsFocused(WinControl: TWinControl; out FocusedChild: TWinControl): Boolean; +var + Form: TCustomForm; +begin + Result := False; + FocusedChild := nil; + if WinControl.Focused then + Result := True + else begin + Form := GetParentForm(WinControl); + if Assigned(Form) and Form.Enabled and Form.Visible then + if Assigned(Form.ActiveControl) and Form.ActiveControl.Focused then + if IsChild(WinControl.Handle, Form.ActiveControl.Handle) then begin + Result := True; + FocusedChild := Form.ActiveControl; + end; + end; +end; + +function SpFocusFirstChild(WinControl: TWinControl): TWinControl; +var + Form: TCustomForm; +begin + Result := nil; + Form := GetParentForm(WinControl); + if Assigned(Form) and Form.Enabled and Form.Visible then begin + TWinControlAccess(WinControl).SelectFirst; + Result := Form.ActiveControl; + end; +end; + +function SpFindControl(Parent: TWinControl; Child: TControl): Integer; +var + I: Integer; +begin + Result := -1; + for I := 0 to Parent.ControlCount - 1 do + if Parent.Controls[I] = Child then begin + Result := I; + Break; + end; +end; + +function SpFindParent(Control: TControl; ParentClass: TClass): TWinControl; +var + P: TWinControl; +begin + Result := nil; + if Assigned(Control) then begin + P := Control.Parent; + while Assigned(P) do + if P is ParentClass then begin + Result := P; + Break; + end + else + P := P.Parent; + end; +end; + +function SpHasBorders(WinControl: TWinControl): Boolean; +var + Style, ExStyle: Integer; +begin + Result := False; + Style := GetWindowLong(WinControl.Handle, GWL_STYLE); + ExStyle := GetWindowLong(WinControl.Handle, GWL_EXSTYLE); + + if (Style and WS_BORDER <> 0) or (ExStyle and WS_EX_CLIENTEDGE <> 0) then + Result := True; +end; + +function SpGetFormWindowState(F: TCustomForm; out RestoreBoundsRect: TRect): TWindowState; +// This method is more accurate than Form.WindowState +var + P: TWindowPlacement; +begin + Result := wsNormal; + RestoreBoundsRect := Rect(0, 0, 0, 0); + if Assigned(F) and (F.HandleAllocated) then begin + P.Length := SizeOf(TWindowPlacement); + if GetWindowPlacement(F.Handle, @P) then begin + case P.showCmd of + SW_SHOWMINIMIZED: Result := wsMinimized; + SW_SHOWMAXIMIZED: Result := wsMaximized; + end; + // rcNormalPosition contains the window's coordinates when the window is in the restored position + with P.rcNormalPosition do + RestoreBoundsRect := Rect(Left, Top, Right - Left, Bottom - Top); + end; + end; +end; + +procedure SpSetFormWindowState(F: TCustomForm; WindowState: TWindowState; RestoreBoundsRect: TRect); +// This method is more accurate than Form.WindowState +var + P: TWindowPlacement; + R: TRect; +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; + with RestoreBoundsRect do + R := Bounds(Left, Top, Right, Bottom); + // rcNormalPosition contains the window's coordinates when the window is in the restored position + if not IsRectEmpty(R) then + P.rcNormalPosition := R; + + SetWindowPlacement(F.Handle, @P); + end; +end; + +function SpGetTaskBar(out State, Edge: Cardinal; out Bounds: TRect): Boolean; +// Returns the TaskBar state and bounds +// State can be: 0, ABS_ALWAYSONTOP, ABS_AUTOHIDE +// Edge can be: ABE_LEFT, ABE_RIGHT, ABE_TOP, ABE_BOTTOM +// ABM_GETSTATE + +var + AppData: TAppBarData; +begin + Result := False; + State := 0; + Edge := 0; + Bounds := Rect(0, 0, 0, 0); + + // 'Shell_TrayWnd' is the name of the task bar's window + AppData.Hwnd := FindWindow('Shell_TrayWnd', nil); + if AppData.Hwnd <> 0 then begin + AppData.cbSize := SizeOf(TAppBarData); + if SHAppBarMessage(ABM_GETTASKBARPOS, AppData) <> 0 then begin + Edge := AppData.uEdge; + Bounds := AppData.rc; + + AppData.cbSize := SizeOf(TAppBarData); + State := SHAppBarMessage(ABM_GETSTATE, AppData); + + Result := True; + end; + end; +end; + +procedure SpRecalcNCArea(WinControl: TWinControl); +begin + if WinControl.HandleAllocated then + SetWindowPos(WinControl.Handle, 0, 0, 0, 0, 0, SWP_FRAMECHANGED or + SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Customizer helpers } + +procedure SpCustomizeAllToolbars(AParentComponent: TComponent; Reset: Boolean); +var + I: Integer; + TB: TSpTBXToolbar; +begin + if Assigned(AParentComponent) then begin + for I := 0 to AParentComponent.ComponentCount - 1 do + if AParentComponent.Components[I] is TSpTBXToolbar then begin + TB := AParentComponent.Components[I] as TSpTBXToolbar; + if Reset then + TB.EndCustomize + else + TB.BeginCustomize; + end; + end; +end; + +procedure SpBeginUpdateAllToolbars(AParentComponent: TComponent); +var + I: Integer; + TB: TTBCustomToolbar; +begin + if Assigned(AParentComponent) then begin + for I := 0 to AParentComponent.ComponentCount - 1 do + if AParentComponent.Components[I] is TTBCustomToolbar then begin + TB := AParentComponent.Components[I] as TTBCustomToolbar; + TB.BeginUpdate; + end; + end; +end; + +procedure SpEndUpdateAllToolbars(AParentComponent: TComponent); +var + I: Integer; + TB: TTBCustomToolbar; +begin + if Assigned(AParentComponent) then begin + for I := 0 to AParentComponent.ComponentCount - 1 do + if AParentComponent.Components[I] is TTBCustomToolbar then begin + TB := AParentComponent.Components[I] as TTBCustomToolbar; + TB.View.UpdatePositions; + TB.EndUpdate; + TB.Invalidate; + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Unicode helpers } + +procedure SpPersistent_AfterInherited_DefineProperties(Filer: TFiler; Instance: TPersistent); +begin + {$IFNDEF UNICODE} + // Don't let the streaming system store the WideStrings, + // we need to store them manually + TntPersistent_AfterInherited_DefineProperties(Filer, Instance); + {$ENDIF} +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXFontSettings } + +constructor TSpTBXFontSettings.Create; +begin + FSize := 100; + FColor := clNone; +end; + +procedure TSpTBXFontSettings.Apply(AFont: TFont); +begin + AFont.Charset := DEFAULT_CHARSET; + AFont.Color := FColor; + if FSize <> 100 then + AFont.Size := (AFont.Size * FSize + 50) div 100; + if FName <> '' then + AFont.Name := Name; + if FStyle <> [] then + AFont.Style := FStyle; +end; + +procedure TSpTBXFontSettings.Assign(Src: TPersistent); +var + F: TSpTBXFontSettings; +begin + if Src is TPersistent then begin + F := TSpTBXFontSettings(Src); + FColor := F.Color; + FName := F.Name; + FSize := F.Size; + FStyle := F.Style; + Modified; + end + else + inherited; +end; + +procedure TSpTBXFontSettings.Modified; +begin + if Assigned(FOnChange) then FOnChange(Self); +end; + +procedure TSpTBXFontSettings.SetColor(Value: TColor); +begin + if FColor <> Value then begin + FColor := Value; + Modified; + end; +end; + +procedure TSpTBXFontSettings.SetName(const Value: TFontName); +begin + if FName <> Value then begin + FName := Value; + Modified; + end; +end; + +procedure TSpTBXFontSettings.SetSize(Value: TSpTBXFontSize); +begin + if FSize <> Value then begin + FSize := Value; + Modified; + end; +end; + +procedure TSpTBXFontSettings.SetStyle(const Value: TFontStyles); +begin + if FStyle <> Value then begin + FStyle := Value; + Modified; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomDragObject } + +constructor TSpTBXCustomDragObject.Create(ASourceControl: TControl; AItem: TTBCustomItem); +begin + FSourceControl := ASourceControl; + FSourceItem := AItem; + FDragCursorAccept := crSpTBXCustomization; + FDragCursorCancel := crNo; +end; + +procedure TSpTBXCustomDragObject.Finished(Target: TObject; X, Y: Integer; + Accepted: Boolean); +begin + inherited; + if not Accepted then begin + if Assigned(FSourceControl) then + TControlAccess(FSourceControl).DragCanceled; + Target := nil; + end; + + if Assigned(FSourceControl) then + TControlAccess(FSourceControl).DoEndDrag(Target, X, Y); +end; + +function TSpTBXCustomDragObject.GetDragCursor(Accepted: Boolean; X, + Y: Integer): TCursor; +begin + if Accepted then Result := FDragCursorAccept + else Result := FDragCursorCancel; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomItemActionLink } + +{$IFNDEF UNICODE} +procedure TSpTBXCustomItemActionLink.AssignClient(AClient: TObject); +begin + inherited AssignClient(AClient); + FUnicodeClient := AClient as TSpTBXCustomItem; +end; + +function TSpTBXCustomItemActionLink.IsCaptionLinked: Boolean; +begin + if (Action is TCustomAction) and Supports(Action, ITntAction) then + Result := FUnicodeClient.Caption = TntActnList.TntAction_GetCaption(Action as TCustomAction) + else + Result := inherited IsCaptionLinked; +end; + +function TSpTBXCustomItemActionLink.IsHintLinked: Boolean; +begin + if (Action is TCustomAction) and Supports(Action, ITntAction) then + Result := FUnicodeClient.Hint = TntActnList.TntAction_GetHint(Action as TCustomAction) + else + Result := inherited IsCaptionLinked; +end; + +procedure TSpTBXCustomItemActionLink.SetCaption(const Value: String); +begin + if IsCaptionLinked then + if (Action is TCustomAction) and Supports(Action, ITntAction) then + FUnicodeClient.Caption := TntActnList.TntAction_GetNewCaption(Action as TCustomAction, Value) + else + FUnicodeClient.Caption := Value; +end; + +procedure TSpTBXCustomItemActionLink.SetHint(const Value: String); +begin + if IsHintLinked then + if (Action is TCustomAction) and Supports(Action, ITntAction) then + FUnicodeClient.Hint := TntActnList.TntAction_GetNewHint(Action as TCustomAction, Value) + else + FUnicodeClient.Hint := Value; +end; +{$ENDIF} + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomControl } + +{$IFNDEF UNICODE} +procedure TSpTBXCustomControl.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle(Self, Params, ''); +end; + +procedure TSpTBXCustomControl.DefineProperties(Filer: TFiler); +begin + inherited; + // Don't let the streaming system store the WideStrings, + // we need to store them manually + SpPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +procedure TSpTBXCustomControl.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + if (Action is TCustomAction) and Supports(Action, ITntAction) then begin + if not CheckDefaults or (Self.Caption = '') then + Self.Caption := TntActnList.TntAction_GetCaption(Action as TCustomAction); + if not CheckDefaults or (Self.Hint = '') then + Self.Hint := TntActnList.TntAction_GetHint(Action as TCustomAction); + end; + // Call inherited after we changed the unicode Caption and Hint + inherited; +end; + +function TSpTBXCustomControl.IsCaptionStored: Boolean; +begin + Result := TntControl_IsCaptionStored(Self); +end; + +function TSpTBXCustomControl.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TSpTBXCustomControl.GetCaption: TWideCaption; +begin + Result := TntControl_GetText(Self); +end; + +function TSpTBXCustomControl.GetHint: WideString; +begin + Result := TntControl_GetHint(Self); +end; + +procedure TSpTBXCustomControl.SetCaption(const Value: TWideCaption); +begin + TntControl_SetText(Self, Value); +end; + +procedure TSpTBXCustomControl.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; +{$ENDIF} + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomItem } + +constructor TSpTBXCustomItem.Create(AOwner: TComponent); +begin + inherited; + FFontSettings := TSpTBXFontSettings.Create; + FFontSettings.OnChange := FontSettingsChanged; + + {$IFNDEF UNICODE} + FCaption := ''; + {$ENDIF} + FAlignment := taCenter; + FCaptionGlowColor := clYellow; + FCustomWidth := -1; + FCustomHeight := -1; + FMargins := 0; + SetStretch(True); + FWrapping := twWrap; +end; + +destructor TSpTBXCustomItem.Destroy; +begin + FreeAndNil(FFontSettings); + inherited; +end; + +procedure TSpTBXCustomItem.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if (Operation = opRemove) and (AComponent = Control) then Control := nil; +end; + +procedure TSpTBXCustomItem.DefineProperties(Filer: TFiler); +begin + inherited; + // Don't let the streaming system store the WideStrings, + // we need to store them manually + SpPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +procedure TSpTBXCustomItem.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + {$IFNDEF UNICODE} + if (Action is TCustomAction) and Supports(Action, ITntAction) then begin + if not CheckDefaults or (Self.Caption = '') then + Self.Caption := TntActnList.TntAction_GetCaption(Action as TCustomAction); + if not CheckDefaults or (Self.Hint = '') then + Self.Hint := TntActnList.TntAction_GetHint(Action as TCustomAction); + inherited; + Exit; + end; + {$ENDIF} + + if Action is TCustomAction then + with TCustomAction(Sender) do begin + if not CheckDefaults or (Self.Caption = '') then + Self.Caption := Caption; + if not CheckDefaults or (Self.Hint = '') then + Self.Hint := Hint; + end; + inherited; +end; + +function TSpTBXCustomItem.DialogChar(CharCode: Word): Boolean; +begin + Result := False; +end; + +procedure TSpTBXCustomItem.DoDrawAdjustFont(AFont: TFont; State: TSpTBXSkinStatesType); +begin + // Do nothing +end; + +procedure TSpTBXCustomItem.DoDrawHint(AHintBitmap: TBitmap; var AHint: Widestring; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawHint) then FOnDrawHint(Self, AHintBitmap, AHint, PaintDefault); +end; + +procedure TSpTBXCustomItem.DoDrawButton(ACanvas: TCanvas; ARect: TRect; + ItemInfo: TSpTBXMenuItemInfo; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawItem) then FOnDrawItem(Self, ACanvas, ARect, ItemInfo, PaintStage, PaintDefault); +end; + +procedure TSpTBXCustomItem.DoDrawCaption(ACanvas: TCanvas; ClientAreaRect: TRect; + State: TSpTBXSkinStatesType; var ACaption: WideString; var CaptionRect: TRect; var CaptionFormat: Cardinal; + IsTextRotated: Boolean; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawCaption) then FOnDrawCaption(Self, ACanvas, ClientAreaRect, + State, ACaption, CaptionRect, CaptionFormat, IsTextRotated, PaintStage, PaintDefault); +end; + +procedure TSpTBXCustomItem.DoDrawImage(ACanvas: TCanvas; + State: TSpTBXSkinStatesType; const PaintStage: TSpTBXPaintStage; + var AImageList: TCustomImageList; var AImageIndex: Integer; + var ARect: TRect; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawImage) then FOnDrawImage(Self, ACanvas, State, PaintStage, + AImageList, AImageIndex, ARect, PaintDefault); +end; + +procedure TSpTBXCustomItem.DoPopupShowingChanged(APopupWindow: TTBPopupWindow; IsVisible: Boolean); +// This method is called by TSpTBXPopupWindow when the popup is Opened and Closed +begin + if Assigned(APopupWindow) then begin + if IsVisible then begin + if Assigned(FOnInitPopup) then FOnInitPopup(Self, APopupWindow.View); + end + else begin + if Assigned(FOnClosePopup) then FOnClosePopup(Self); + end; + end; +end; + +procedure TSpTBXCustomItem.FontSettingsChanged(Sender: TObject); +begin + Change(True); +end; + +function TSpTBXCustomItem.GetActionLinkClass: TTBCustomItemActionLinkClass; +begin + Result := TSpTBXCustomItemActionLink; +end; + +function TSpTBXCustomItem.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + Result := TSpTBXItemViewer; +end; + +function TSpTBXCustomItem.GetPopupWindowClass: TTBPopupWindowClass; +begin + Result := TSpTBXPopupWindow; +end; + +function TSpTBXCustomItem.GetShortCutText: WideString; +var + P: Integer; +begin + P := Pos(#9, Caption); + if (P = 0) or (P = Length(Caption)) then begin + if ShortCut <> 0 then + Result := ShortCutToText(ShortCut) + else + Result := ''; + end + else + Result := Copy(Caption, P+1, Maxint); +end; + +procedure TSpTBXCustomItem.Click; +begin + if Assigned(FControl) then ToggleControl; + inherited; +end; + +procedure TSpTBXCustomItem.InitiateAction; +begin + inherited; + UpdateProps; +end; + +procedure TSpTBXCustomItem.Invalidate; +begin + Change(False); +end; + +{$IFNDEF UNICODE} +function TSpTBXCustomItem.IsCaptionStored: Boolean; +begin + Result := (ActionLink = nil) or not TActionLinkAccess(ActionLink).IsCaptionLinked; +end; + +function TSpTBXCustomItem.IsHintStored: Boolean; +begin + Result := (ActionLink = nil) or not TActionLinkAccess(ActionLink).IsHintLinked; +end; + +procedure TSpTBXCustomItem.SetCaption(const Value: WideString); +var + S, PrevS: string; +begin + if FCaption <> Value then begin + FCaption := Value; + // We need to compare the Ansi inherited Caption + // to force the change. + // Sometimes '???' = '???' and the change is not executed. + S := inherited Caption; + PrevS := Value; + if S <> PrevS then + inherited Caption := Value + else + Change(True); + end; +end; + +procedure TSpTBXCustomItem.SetHint(const Value: WideString); +begin + if FHint <> Value then begin + FHint := Value; + inherited Hint := Value; + end; +end; +{$ENDIF} + +procedure TSpTBXCustomItem.SetAlignment(const Value: TAlignment); +begin + if FAlignment <> Value then begin + FAlignment := Value; + Change(False); + end; +end; + +procedure TSpTBXCustomItem.SetAnchored(const Value: Boolean); +begin + if FAnchored <> Value then begin + FAnchored := Value; + end; +end; + +procedure TSpTBXCustomItem.SetCaptionGlow(const Value: TSpGlowDirection); +begin + if FCaptionGlow <> Value then begin + FCaptionGlow := Value; + Change(False); + end; +end; + +procedure TSpTBXCustomItem.SetCaptionGlowColor(const Value: TColor); +begin + if FCaptionGlowColor <> Value then begin + FCaptionGlowColor := Value; + Change(False); + end; +end; + +procedure TSpTBXCustomItem.SetControl(const Value: TControl); +begin + if FControl <> Value then + begin + FControl := Value; + if Assigned(Value) then + Value.FreeNotification(Self); + UpdateProps; + end; +end; + +procedure TSpTBXCustomItem.SetCustomWidth(Value: Integer); +begin + if Value < -1 then Value := -1; + if FCustomWidth <> Value then begin + FCustomWidth := Value; + Change(True); + end; +end; + +procedure TSpTBXCustomItem.SetCustomHeight(Value: Integer); +begin + if Value < -1 then Value := -1; + if FCustomHeight <> Value then begin + FCustomHeight := Value; + Change(True); + end; +end; + +procedure TSpTBXCustomItem.SetFontSettings(const Value: TSpTBXFontSettings); +begin + FFontSettings.Assign(Value); +end; + +procedure TSpTBXCustomItem.SetMargins(Value: Integer); +begin + if FMargins <> Value then begin + FMargins := Value; + Change(True); + end; +end; + +procedure TSpTBXCustomItem.SetMinHeight(const Value: Integer); +begin + if Value <> FMinHeight then begin + FMinHeight := Value; + Change(True); + end; +end; + +procedure TSpTBXCustomItem.SetMinWidth(const Value: Integer); +begin + if Value <> FMinWidth then begin + FMinWidth := Value; + Change(True); + end; +end; + +procedure TSpTBXCustomItem.SetStretch(const Value: Boolean); +begin + if FStretch <> Value then begin + FStretch := Value; + Change(True); + end; +end; + +procedure TSpTBXCustomItem.SetToolBoxPopup(const Value: Boolean); +begin + FToolBoxPopup := Value; + if FToolBoxPopup then + Options := Options + [tboToolbarStyle] + else + Options := Options - [tboToolbarStyle]; +end; + +procedure TSpTBXCustomItem.SetWrapping(const Value: TTextWrapping); +begin + if FWrapping <> Value then begin + FWrapping := Value; + Change(False); + end; +end; + +procedure TSpTBXCustomItem.ToggleControl; +begin + FControl.Visible := not FControl.Visible; +end; + +procedure TSpTBXCustomItem.UpdateProps; +begin + if Assigned(Control) then + if (ComponentState * [csDesigning, csLoading, csDestroying] = []) then + Checked := Control.Visible; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXItemViewer } + +function TSpTBXItemViewer.CaptionShown: Boolean; +var + T: TSpTBXToolbar; +begin + Result := inherited CaptionShown; + + if Assigned(View) and Assigned(View.Owner) and (View.Owner is TSpTBXToolbar) then begin + T := View.Owner as TSpTBXToolbar; + case T.DisplayMode of + tbdmImageOnly: + if GetImageShown then Result := False; + tbdmTextOnly: + Result := True; + end; + end; +end; + +function TSpTBXItemViewer.GetImageShown: Boolean; +begin + Result := (Item.ImageIndex >= 0) and + ((Item.DisplayMode in [nbdmDefault, nbdmImageAndText]) or + (IsToolbarStyle and (Item.DisplayMode = nbdmTextOnlyInMenus))); + + if Assigned(View) and Assigned(View.Owner) and (View.Owner is TSpTBXToolbar) then + if TSpTBXToolbar(View.Owner).DisplayMode = tbdmTextOnly then + Result := False; +end; + +function TSpTBXItemViewer.GetImageSize: TSize; +var + IL: TCustomImageList; +begin + IL := GetImageList; + if Assigned(IL) then begin + Result.cx := IL.Width; + Result.cy := IL.Height; + end + else begin + Result.cx := 0; + Result.cy := 0; + end; +end; + +function TSpTBXItemViewer.GetRightImageSize: TSize; +begin + Result.cx := 0; + Result.cy := 0; +end; + +procedure TSpTBXItemViewer.DoDrawButton(ACanvas: TCanvas; ARect: TRect; + ItemInfo: TSpTBXMenuItemInfo; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + Item.DoDrawButton(ACanvas, ARect, ItemInfo, PaintStage, PaintDefault); +end; + +procedure TSpTBXItemViewer.DoDrawCaption(ACanvas: TCanvas; ClientAreaRect: TRect; + State: TSpTBXSkinStatesType; var ACaption: WideString; var CaptionRect: TRect; var CaptionFormat: Cardinal; + IsTextRotated: Boolean; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + Item.DoDrawCaption(ACanvas, ClientAreaRect, State, ACaption, CaptionRect, + CaptionFormat, IsTextRotated, PaintStage, PaintDefault); +end; + +procedure TSpTBXItemViewer.DoDrawHint(AHintBitmap: TBitmap; CursorPos: TPoint; + var CursorRect: TRect; var AHint: Widestring; var PaintDefault: Boolean); +begin + Item.DoDrawHint(AHintBitmap, AHint, PaintDefault); +end; + +procedure TSpTBXItemViewer.DoDrawImage(ACanvas: TCanvas; + State: TSpTBXSkinStatesType; const PaintStage: TSpTBXPaintStage; + var AImageList: TCustomImageList; var AImageIndex: Integer; + var ARect: TRect; var PaintDefault: Boolean); +begin + Item.DoDrawImage(ACanvas, State, PaintStage, AImageList, AImageIndex, ARect, PaintDefault); +end; + +procedure TSpTBXItemViewer.DoDrawAdjustFont(AFont: TFont; State: TSpTBXSkinStatesType); +begin + Item.FontSettings.Apply(AFont); + + if tboDefault in Item.EffectiveOptions then + AFont.Style := AFont.Style + [fsBold]; + + if AFont.Color = clNone then + AFont.Color := GetTextColor(State); + + Item.DoDrawAdjustFont(AFont, State); +end; + +procedure TSpTBXItemViewer.DrawItemImage(ACanvas: TCanvas; ARect: TRect; + ItemInfo: TSpTBXMenuItemInfo; ImgIndex: Integer); +var + PaintDefault: Boolean; + ImgList: TCustomImageList; + PatternColor: TColor; +begin + ImgList := GetImageList; + + PaintDefault := True; + DoDrawImage(ACanvas, ItemInfo.State, pstPrePaint, ImgList, ImgIndex, ARect, PaintDefault); + if PaintDefault and Assigned(ImgList) then + if ImgList = MDIButtonsImgList then begin + if (Item.Enabled) and not IsToolbarStyle and (SkinManager.GetSkinType <> sknSkin) then + PatternColor := clMenuText + else + PatternColor := GetTextColor(ItemInfo.State); + SpDrawGlyphPattern(ACanvas, ARect, ImgIndex, PatternColor); + end + else + if (ImgIndex >= 0) and (ImgIndex < ImgList.Count) then + SpDrawXPMenuItemImage(ACanvas, ARect, ItemInfo, ImgList, ImgIndex); + PaintDefault := True; + DoDrawImage(ACanvas, ItemInfo.State, pstPostPaint, ImgList, ImgIndex, ARect, PaintDefault); +end; + +procedure TSpTBXItemViewer.DrawItemRightImage(ACanvas: TCanvas; ARect: TRect; + ItemInfo: TSpTBXMenuItemInfo); +begin + // Do nothing +end; + +procedure TSpTBXItemViewer.InternalCalcSize(const Canvas: TCanvas; + CalcStretch: Boolean; var AWidth, AHeight: Integer); +var + I, W, H: Integer; + DropDownArrowSize, DropDownArrowMargin, SplitBtnArrowSize: Integer; + ImgSize, RightImgSize: TSize; + GlyphTop, ToolbarStyle: Boolean; + WS: WideString; + TextMetric: TTextMetric; + MenuMargins: TSpTBXMenuItemMarginsInfo; + State: TSpTBXSkinStatesType; + IsHoverItem, IsOpen, IsPushed: Boolean; + TextInfo: TSpTBXTextInfo; + TB: TSpTBXToolbar; +begin + CurrentSkin.GetDropDownArrowSize(DropDownArrowSize, DropDownArrowMargin, SplitBtnArrowSize); + + ToolbarStyle := IsToolbarStyle; + + ImgSize := GetImageSize; + if (ImgSize.CX <= 0) or (ImgSize.CY <= 0) then begin + ImgSize.CX := 0; + ImgSize.CY := 0; + end; + RightImgSize := GetRightImageSize; + if (RightImgSize.CX <= 0) or (RightImgSize.CY <= 0) then begin + RightImgSize.CX := 0; + RightImgSize.CY := 0; + end; + + GlyphTop := False; + if tboImageAboveCaption in Item.EffectiveOptions then + GlyphTop := True; + + // Setup font and get the text info + IsOpen := Self = View.OpenViewer; + IsHoverItem := Self = View.Selected; + IsPushed := IsHoverItem and (IsOpen or (View.MouseOverSelected and View.Capture)); + State := CurrentSkin.GetState(Item.Enabled, IsPushed, IsHoverItem, Item.Checked); + GetTextInfo(Canvas, State, TextInfo); + + // Measure size + if ToolbarStyle then begin + AWidth := 6; + AHeight := 6; + + if CaptionShown then begin + Inc(AWidth, TextInfo.TextSize.CX); + Inc(AHeight, TextInfo.TextSize.CY); + if not TextInfo.IsTextRotated then Inc(AWidth, 4) + else Inc(AHeight, 4); + end; + + if GetImageShown and (ImgSize.CX > 0) and (ImgSize.CY > 0) then begin + if not GlyphTop then begin + if not TextInfo.IsTextRotated then begin + Inc(AWidth, ImgSize.CX); + Inc(AWidth); + if AHeight < ImgSize.CY + 6 then AHeight := ImgSize.CY + 6; + end + else begin + Inc(AHeight, ImgSize.CY); + Inc(AHeight); + if AWidth < ImgSize.CX + 6 then AWidth := ImgSize.CX + 6; + end; + end + else begin + Inc(AHeight, ImgSize.CY); + if AWidth < ImgSize.CX + 7 then AWidth := ImgSize.CX + 7; + end; + end; + + if (RightImgSize.cx > 0) and (RightImgSize.cy > 0) then begin + if View.Orientation = tbvoVertical then + Inc(AHeight, 4 + RightImgSize.cy) + else + Inc(AWidth, 4 + RightImgSize.cx); + end; + + if (tbisSubmenu in Item.ItemStyle) and (tbisCombo in Item.ItemStyle) then + Inc(AWidth, SplitBtnArrowSize) + else begin + if tboDropdownArrow in Item.Options then + if not GlyphTop or (ImgSize.CX = 0) or TextInfo.IsTextRotated then begin + if View.Orientation = tbvoVertical then Inc(AHeight, DropDownArrowSize) + else Inc(AWidth, DropDownArrowSize); + end + else + if GlyphTop and (TextInfo.IsTextRotated xor (View.Orientation <> tbvoVertical)) then begin + W := ImgSize.CX + DropDownArrowSize + 2; + if W > AWidth - 7 then AWidth := W + 7; + end + else begin + H := ImgSize.CY + DropDownArrowSize + 2; + if H > AHeight - 7 then AHeight := H + 7; + end; + end; + + // Widen MenuBar SubMenuItems + if (tbisSubmenu in Item.ItemStyle) and (vsMenuBar in View.Style) then + Inc(AWidth, 6); + + // Toolbar.Stretch property doesn't work correctly, I don't know how to fix + // it without changing the TB2K source. + // http://news.jrsoftware.org/read/article.php?id=8176&group=jrsoftware.toolbar2000#8176 + if CalcStretch and Item.Stretch and (View is TSpTBXToolbarView) and (View.ViewerCount > 2) then begin + if View.Orientation = tbvoVertical then begin + if AWidth < TSpTBXToolbarView(View).FTallestItemSize then AWidth := TSpTBXToolbarView(View).FTallestItemSize; + end + else + if AHeight < TSpTBXToolbarView(View).FTallestItemSize then AHeight := TSpTBXToolbarView(View).FTallestItemSize; + end; + end + else begin // Menu Item + GetTextMetrics(Canvas.Handle, TextMetric); + Inc(TextInfo.TextSize.cy, TextMetric.tmExternalLeading); + + AWidth := TextInfo.TextSize.cx; + AHeight := TextInfo.TextSize.cy; + + if ImgSize.cy = 0 then ImgSize.cy := 16; + if AHeight < ImgSize.cy then AHeight := ImgSize.cy; + + if View.Window is TSpTBXPopupWindow then + CurrentSkin.GetMenuItemMargins(Canvas, TSpTBXPopupWindow(View.Window).MaximumImageSize.cx, MenuMargins) + else + CurrentSkin.GetMenuItemMargins(Canvas, ImgSize.cx, MenuMargins); + + Inc(AWidth, MenuMargins.Margins.Left + MenuMargins.Margins.Right); + Inc(AHeight, MenuMargins.Margins.Top + MenuMargins.Margins.Bottom); + + Inc(AWidth, MenuMargins.GutterSize + MenuMargins.ImageTextSpace + MenuMargins.LeftCaptionMargin + MenuMargins.RightCaptionMargin); + WS := Item.GetShortCutText; + if Length(WS) > 0 then + Inc(AWidth, (AHeight - 6) + SpGetTextSize(Canvas.Handle, WS, True).cx); + Inc(AWidth, AHeight); { Note: maybe this should be controlled by the theme } + end; + + if AWidth < Item.MinWidth then AWidth := Item.MinWidth; + if AHeight < Item.MinHeight then AHeight := Item.MinHeight; + + // Handle Custom size and anchors + if IsRotated then begin + // Reverse + H := AWidth + Item.Margins; + W := AHeight; + end + else begin + W := AWidth + Item.Margins; + H := AHeight; + end; + + if Item.CustomWidth > -1 then + W := Item.CustomWidth; + if Item.CustomHeight > -1 then + H := Item.CustomHeight; + + if IsToolbarStyle and Item.Anchored then + W := W + FAnchorDelta; + if W < Item.MinWidth then W := Item.MinWidth; + if H < Item.MinHeight then H := Item.MinHeight; + // Apply View.MaxSize to the height of the item + if View.Window is TSpTBXToolbar then begin + TB := View.Window as TSpTBXToolbar; + I := TB.MaxSize - TB.NonClientHeight; + if (I > -1) and (H > I) then + H := I; + end; + + if IsRotated then begin + // Reverse + AWidth := H; + AHeight := W; + end + else begin + AWidth := W; + AHeight := H; + end; +end; + +procedure TSpTBXItemViewer.InternalMouseMove(Shift: TShiftState; X, Y: Integer); +begin + // Do nothing +end; + +function TSpTBXItemViewer.IsOnToolBoxPopup: Boolean; +// Returns True if the item is on a submenu with ToolBoxPopup set to True. +begin + Result := False; + if Assigned(View) and Assigned(View.ParentItem) then + if View.ParentItem is TSpTBXCustomItem then + Result := TSpTBXCustomItem(View.ParentItem).ToolBoxPopup + else + if View.ParentItem is TSpTBXRootItem then + Result := TSpTBXRootItem(View.ParentItem).ToolBoxPopup; +end; + +function TSpTBXItemViewer.IsToolbarStyle: Boolean; +// Returns True if the item is on a toolbar or has tboToolbarStyle. +// We should return False if the item is a ToolBoxPopup and the parent doesn't have tboToolbarStyle, +// the main ToolBoxPopup should be painted as a menu item on submenus/popups. +begin + Result := inherited IsToolbarStyle; + // if ToolBoxPopup and tboToolbarStyle is set see if the item is the parent + // ToolBox submenu. + if Result and Item.ToolBoxPopup and not View.IsToolbar and Assigned(View) and Assigned(View.ParentItem) then + if not (tboToolbarStyle in View.ParentItem.EffectiveOptions) then begin + // The parent item doesn't have tboToolbarStyle, so the current item + // is the main ToolBoxPopup submenu. + Result := False; + end; +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 + 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 (SpTBXLabelItem) + TextInfo.TextFlags := TextInfo.TextFlags or DT_CENTER; + CaptionRect := R; + end + else begin + TextInfo.TextFlags := TextInfo.TextFlags or DT_LEFT or DT_VCENTER; + GetTextMetrics(Canvas.Handle, TextMetrics); + CaptionRect := R; + Inc(CaptionRect.Left, ItemInfo.MenuMargins.GutterSize + ItemInfo.MenuMargins.ImageTextSpace + ItemInfo.MenuMargins.LeftCaptionMargin); + if (CaptionRect.Bottom - CaptionRect.Top) - (TextMetrics.tmHeight + TextMetrics.tmExternalLeading) = ItemInfo.MenuMargins.Margins.Bottom then + Dec(CaptionRect.Bottom); + Inc(CaptionRect.Top, TextMetrics.tmExternalLeading); + CaptionRect.Right := CaptionRect.Left + TextInfo.TextSize.CX; + end; + end; + + Canvas.Font.Color := TextC; + PaintDefault := True; + DoDrawCaption(Canvas, ClientAreaRect, ItemInfo.State, WS, CaptionRect, TextInfo.TextFlags, TextInfo.IsTextRotated, pstPrePaint, PaintDefault); + if PaintDefault then begin + if (not IsSelected or ItemInfo.ToolbarStyle) and + (ItemInfo.State = sknsDisabled) and (ItemInfo.SkinType = sknNone) then + begin + OffsetRect(CaptionRect, 1, 1); + Canvas.Font.Color := clBtnHighlight; + SpDrawXPText(Canvas, WS, CaptionRect, TextInfo.TextFlags, Item.CaptionGlow, Item.CaptionGlowColor, TextInfo.TextAngle); + OffsetRect(CaptionRect, -1, -1); + Canvas.Font.Color := clGrayText; + end; + SpDrawXPText(Canvas, WS, CaptionRect, TextInfo.TextFlags, Item.CaptionGlow, Item.CaptionGlowColor, TextInfo.TextAngle); + end; + PaintDefault := True; + DoDrawCaption(Canvas, ClientAreaRect, ItemInfo.State, WS, CaptionRect, TextInfo.TextFlags, TextInfo.IsTextRotated, pstPostPaint, PaintDefault); + end; + + { Shortcut } + if not ItemInfo.ToolbarStyle then + begin + WS := Item.GetShortCutText; + if Length(WS) > 0 then + begin + CaptionRect := R; + CaptionRect.Left := CaptionRect.Right - (CaptionRect.Bottom - CaptionRect.Top) - SpGetTextSize(Canvas.Handle, WS, True).cx; + if (CaptionRect.Bottom - CaptionRect.Top) - (TextMetrics.tmHeight + TextMetrics.tmExternalLeading) = ItemInfo.MenuMargins.Margins.Bottom then + Dec(CaptionRect.Bottom); + Inc(CaptionRect.Top, TextMetrics.tmExternalLeading); + Canvas.Font.Color := TextC; + PaintDefault := True; + DoDrawCaption(Canvas, ClientAreaRect, ItemInfo.State, WS, CaptionRect, TextInfo.TextFlags, TextInfo.IsTextRotated, pstPrePaint, PaintDefault); + if PaintDefault then + SpDrawXPText(Canvas, WS, CaptionRect, TextInfo.TextFlags, Item.CaptionGlow, Item.CaptionGlowColor, TextInfo.TextAngle); + PaintDefault := True; + DoDrawCaption(Canvas, ClientAreaRect, ItemInfo.State, WS, CaptionRect, TextInfo.TextFlags, TextInfo.IsTextRotated, pstPostPaint, PaintDefault); + end; + end; + + { Image, or check box } + if ItemInfo.ImageOrCheckShown then begin + if ItemInfo.ToolBarStyle then begin + if IsRectEmpty(ImageRect) then + ImageRect := R; + if IsSpecialDropDown then OffsetRect(ImageRect, (-DropDownArrowSize + 1) div 2, 0); + end + else begin + ImageRect := R; + ImageRect.Right := ImageRect.Left + ItemInfo.MenuMargins.GutterSize; + end; + + if ItemInfo.ImageShown then begin + ImageRect := SpCenterRect(ImageRect, ItemInfo.ImageSize.cx, ItemInfo.ImageSize.cy); + DrawItemImage(Canvas, ImageRect, ItemInfo, Item.ImageIndex); + end + else begin + if not ItemInfo.ToolbarStyle and Item.Checked then begin + if Item.RadioItem then + CurrentSkin.PaintMenuRadioMark(Canvas, ImageRect, True, True, ItemInfo.State) + else + CurrentSkin.PaintMenuCheckMark(Canvas, ImageRect, True, False, True, ItemInfo.State); + end; + end; + end; + + { Right Image } + if ItemInfo.ToolbarStyle and (ItemInfo.RightImageSize.cx > 0) and (ItemInfo.RightImageSize.cy > 0) then begin + if IsRectEmpty(RightImageRect) then begin + RightImageRect.Left := R.Right - ItemInfo.RightImageSize.cx; + RightImageRect.Right := RightImageRect.Left + ItemInfo.RightImageSize.cx; + RightImageRect.Top := R.Top + (R.Bottom - R.Top - ItemInfo.RightImageSize.cy) div 2; + RightImageRect.Bottom := RightImageRect.Top + ItemInfo.RightImageSize.cy; + end; + DrawItemRightImage(Canvas, RightImageRect, ItemInfo); + end; +end; + +function TSpTBXItemViewer.GetItem: TSpTBXCustomItem; +var + TBItem: TTBCustomItem; +begin + TBItem := inherited Item; + if Assigned(TBItem) then + Result := TBItem as TSpTBXCustomItem + else + Result := nil; +end; + +function TSpTBXItemViewer.GetHintText: Widestring; +var + I: Integer; + S: string; +begin + // Get the short hint + I := Pos('|', Item.Hint); + if I = 0 then + Result := Item.Hint + else + Result := Copy(Item.Hint, 1, I - 1); + // Use the caption if there is no hint + if (Result = '') and not(tboNoAutoHint in Item.EffectiveOptions) and + (not(tbisSubmenu in Item.ItemStyle) or (tbisCombo in Item.ItemStyle) or + not CaptionShown) then + begin + Result := SpStripAccelChars(SpStripTrailingPunctuation(Item.Caption)); + end; + + // Call associated action's OnHint event handler to post-process the hint + if Assigned(Item.ActionLink) and (Item.ActionLink.Action is TCustomAction) and + Assigned(TCustomAction(Item.ActionLink.Action).OnHint) then + begin + S := Result; + if TCustomAction(Item.ActionLink.Action).DoHint(S) then + Result := S + else + Result := ''; + // Note: TControlActionLink.DoShowHint actually misinterprets the result of DoHint, but we get it right... + end; + + // Add shortcut text + if (Result <> '') and Application.HintShortCuts and (Item.ShortCut <> scNone) then + Result := Result + ' (' + ShortCutToText(Item.ShortCut) + ')'; +end; + +procedure TSpTBXItemViewer.Entering; +begin + // When a Popupmenu is opened the TB2K modal handler will reset + // the TApplication.Hint in UpdateAppHint subprocedure of + // TTBModalHandler.Create, this in turn sets TTntApplication.Hint + // to AnsiString: + // ... + // if Assigned(View.FSelected) then + // Application.Hint := GetLongHint(View.FSelected.Item.Hint) + // else + // Application.Hint := ''; + // ... + // We need to set TTntApplication.Hint before TB2K. + // TTntStatusBar uses TTntApplication.Hint when AutoHint is true. + + inherited; + {$IFNDEF UNICODE} + if View.IsPopup then + TntApplication.Hint := Item.Hint; + {$ENDIF} +end; + +procedure TSpTBXItemViewer.CMHintShow(var Message: TMessage); +// Handle the CM_HINTSHOW message to show unicode hints using +// a custom THintWindow. +var + HintInfo: PHintInfo; + WideHint, PrevWideHint: Widestring; + R, TextR, CursorR: TRect; + PaintDefault: Boolean; +begin + HintInfo := TCMHintShow(Message).HintInfo; + WideHint := GetHintText; + CursorR := BoundsRect; + + // Prepare the HintInfo + HintInfo.HintStr := WideHint; + HintInfo.CursorRect := CursorR; + HintInfo.HintWindowClass := SpTBXHintWindowClass; // Custom HintWindow class + HintInfo.HintData := SpStockHintBitmap; // TApplication.ActivateHint will pass the data to the HintWindow + HintInfo.HideTimeout := 60000; // 1 minute + + // Prepare the HintBitmap + SpStockHintBitmap.Canvas.Font.Assign(Screen.HintFont); + SpStockHintBitmap.Canvas.Font.Color := clInfoText; + SpStockHintBitmap.Canvas.Pen.Color := clBlack; + SpStockHintBitmap.Canvas.Brush.Color := clInfoBk; + TextR := Rect(0, 0, 1, 1); + SpDrawXPText(SpStockHintBitmap.Canvas, WideHint, TextR, DT_NOPREFIX or DT_CALCRECT); + SpStockHintBitmap.Width := TextR.Right + 8; + SpStockHintBitmap.Height := TextR.Bottom + 4; + R := Rect(0, 0, SpStockHintBitmap.Width, SpStockHintBitmap.Height); + SpDrawXPTooltipBackground(SpStockHintBitmap.Canvas, R); + + // Draw the hint in the HintBitmap + PrevWideHint := WideHint; + PaintDefault := True; + DoDrawHint(SpStockHintBitmap, HintInfo.CursorPos, CursorR, WideHint, PaintDefault); + if PaintDefault then begin + HintInfo.HintStr := WideHint; + HintInfo.CursorRect := CursorR; + + // Adjust the bounds and repaint the background if it's needed + if WideHint <> PrevWideHint then begin + TextR := Rect(0, 0, 1, 1); + SpDrawXPText(SpStockHintBitmap.Canvas, WideHint, TextR, DT_NOPREFIX or DT_CALCRECT); + SpStockHintBitmap.Width := TextR.Right + 8; + SpStockHintBitmap.Height := TextR.Bottom + 4; + R := Rect(0, 0, SpStockHintBitmap.Width, SpStockHintBitmap.Height); + SpDrawXPTooltipBackground(SpStockHintBitmap.Canvas, R); + end + else + R := Rect(0, 0, SpStockHintBitmap.Width, SpStockHintBitmap.Height); + + // Draw the hint + OffsetRect(TextR, ((R.Right - TextR.Right) div 2) - 2, (R.Bottom - TextR.Bottom) div 2); + SpDrawXPText(SpStockHintBitmap.Canvas, WideHint, TextR, DT_NOPREFIX); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXRootItem } + +procedure TSpTBXRootItem.DoPopupShowingChanged(APopupWindow: TTBPopupWindow; IsVisible: Boolean); +// This method is called by TSpTBXPopupWindow when the popup is Opened +begin + if Assigned(APopupWindow) then begin + if IsVisible then begin + if Assigned(FOnInitPopup) then FOnInitPopup(Self, APopupWindow.View); + end + else begin + if Assigned(FOnClosePopup) then FOnClosePopup(Self); + end; + end; +end; + +function TSpTBXRootItem.GetPopupWindowClass: TTBPopupWindowClass; +begin + Result := TSpTBXPopupWindow; +end; + +procedure TSpTBXRootItem.SetToolBoxPopup(const Value: Boolean); +begin + FToolBoxPopup := Value; + if FToolBoxPopup then + Options := Options + [tboToolbarStyle] + else + Options := Options - [tboToolbarStyle]; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSubmenuItem } + +constructor TSpTBXSubmenuItem.Create(AOwner: TComponent); +begin + inherited; + ItemStyle := ItemStyle + [tbisSubMenu, tbisSubitemsEditable]; +end; + +function TSpTBXSubmenuItem.GetDropdownCombo: Boolean; +begin + Result := tbisCombo in ItemStyle; +end; + +procedure TSpTBXSubmenuItem.SetDropdownCombo(Value: Boolean); +begin + if (tbisCombo in ItemStyle) <> Value then begin + if Value then ItemStyle := ItemStyle + [tbisCombo] + else ItemStyle := ItemStyle - [tbisCombo]; + Change(True); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXColorItem } + +constructor TSpTBXColorItem.Create(AOwner: TComponent); +begin + inherited; + FColor := clWhite; +end; + +function TSpTBXColorItem.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + Result := TSpTBXColorItemViewer; +end; + +procedure TSpTBXColorItem.SetColor(Value: TColor); +begin + if FColor <> Value then begin + FColor := Value; + Change(False); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXColorItemViewer } + +procedure TSpTBXColorItemViewer.DoDrawImage(ACanvas: TCanvas; + State: TSpTBXSkinStatesType; const PaintStage: TSpTBXPaintStage; + var AImageList: TCustomImageList; var AImageIndex: Integer; var ARect: TRect; + var PaintDefault: Boolean); +var + C: TColor; +begin + if PaintStage = pstPrePaint then begin + if State = sknsDisabled then begin + Inc(ARect.Right); + Inc(ARect.Bottom); + DrawEdge(ACanvas.Handle, ARect, BDR_SUNKENOUTER or BDR_RAISEDINNER, BF_RECT); + end + else begin + if not IsToolbarStyle then + InflateRect(ARect, -2, -2); + C := TSpTBXColorItem(Item).Color; + if C <> clNone then begin + ACanvas.Brush.Color := clBtnShadow; + ACanvas.FrameRect(ARect); + InflateRect(ARect, -1, -1); + ACanvas.Brush.Color := C; + ACanvas.FillRect(ARect); + end; + end; + end; + inherited; +end; + +function TSpTBXColorItemViewer.GetImageShown: Boolean; +begin + Result := ((Item.DisplayMode in [nbdmDefault, nbdmImageAndText]) or + (IsToolbarStyle and (Item.DisplayMode = nbdmTextOnlyInMenus))); +end; + +function TSpTBXColorItemViewer.GetImageSize: TSize; +begin + if IsToolbarStyle then begin + Result.cx := 12; + Result.cy := 12; + end + else begin + Result.cx := 16; + Result.cy := 16; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomLabelItem } + +constructor TSpTBXCustomLabelItem.Create(AOwner: TComponent); +begin + inherited; + ItemStyle := ItemStyle - [tbisSelectable, tbisRedrawOnSelChange, + tbisRedrawOnMouseOverChange] + [tbisClicksTransparent]; + Alignment := taLeftJustify; + Stretch := False; + DisplayMode := nbdmImageAndText; +end; + +function TSpTBXCustomLabelItem.DialogChar(CharCode: Word): Boolean; +begin + Result := inherited DialogChar(CharCode); + if Enabled and Visible and Assigned(Control) and (Control is TWinControl) and + IsAccel(CharCode, Caption) and SpCanFocus(TWinControl(Control)) then + begin + TWinControl(Control).SetFocus; + Result := True; + end; +end; + +procedure TSpTBXCustomLabelItem.DoDrawButton(ACanvas: TCanvas; ARect: TRect; + ItemInfo: TSpTBXMenuItemInfo; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + PaintDefault := True; + inherited DoDrawButton(ACanvas, ARect, ItemInfo, PaintStage, PaintDefault); + PaintDefault := False; +end; + +function TSpTBXCustomLabelItem.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + Result := TSpTBXLabelItemViewer; +end; + +procedure TSpTBXCustomLabelItem.ToggleControl; +begin + // Do nothing, the Control property is not valid +end; + +procedure TSpTBXCustomLabelItem.UpdateProps; +begin + // Do nothing, the Control property is not valid +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXLabelItemViewer } + +procedure TSpTBXLabelItemViewer.CalcSize(const Canvas: TCanvas; var AWidth, + AHeight: Integer); +var + TextMetrics: TTextMetric; +begin + inherited CalcSize(Canvas, AWidth, AHeight); + if not IsToolbarStyle and (Length(GetCaptionText) > 0) and (Item.CustomHeight <= -1) then begin + GetTextMetrics(Canvas.Handle, TextMetrics); + AHeight := TextMetrics.tmHeight; + end; +end; + +function TSpTBXLabelItemViewer.DoExecute: Boolean; +begin + // Clicking a TSpTBXLabelItem on a popup menu causes the menu to close. + // This is caused by TTBXItemViewer.MouseUp, which calls + // TTBItemViewer.DoExecute + // The TBXLabelItem doesn't fire the click because the ItemViewer descends + // from TTBItemViewer instead of TTBXItemViewer. + // TTBXItemViewer.MouseUp is the culprit of firing the DoExecute + Result := False; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSeparatorItem } + +function TSpTBXSeparatorItem.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + Result := TSpTBXSeparatorItemViewer; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSeparatorItemViewer } + +procedure TSpTBXSeparatorItemViewer.CalcSize(const Canvas: TCanvas; var AWidth, + AHeight: Integer); +begin + if not IsToolbarStyle then begin + if CurrentSkin.OfficeMenu then + AHeight := 4 // For Office XP, 2003, 2007 + else + AHeight := 10; + end + else begin + AWidth := 6; + AHeight := 6; + end; +end; + +function TSpTBXSeparatorItemViewer.IsStatusBarSeparator: Boolean; +var + C: TComponent; +begin + Result := False; + C := Item.GetParentComponent; + if Assigned(C) and (C is TSpTBXStatusToolbar) then + Result := TSpTBXStatusToolbar(C).NeedsSeparatorRepaint; +end; + +procedure TSpTBXSeparatorItemViewer.Paint(const Canvas: TCanvas; const ClientAreaRect: TRect; + IsSelected, IsPushed, UseDisabledShadow: Boolean); +var + Vertical, MenuItemStyle: Boolean; + MarginsInfo: TSpTBXMenuItemMarginsInfo; + R: TRect; +begin + if TTBSeparatorItem(Item).Blank or IsStatusBarSeparator then + Exit; + + R := ClientAreaRect; + MenuItemStyle := View.IsPopup; + if MenuItemStyle then begin + Vertical := False; + case SkinManager.GetSkinType of + sknNone: + begin + // Add separator spacing when it's not on a ToolBoxPopup + if not (tboToolbarStyle in Item.EffectiveOptions) then + InflateRect(R, -tbMenuSeparatorOffset, 0); + end; + sknWindows, sknSkin: + begin + // Draw the separator from the gutter end if the separator is not on + // a ToolBoxPopup and we are using the default Vista theme or the + // skin has a gutter specified. + if not (tboToolbarStyle in Item.EffectiveOptions) then + if SpIsWinVistaOrUp or not CurrentSkin.Options(skncGutter, sknsNormal).IsEmpty then begin + if View.Window is TSpTBXPopupWindow then + CurrentSkin.GetMenuItemMargins(Canvas, TSpTBXPopupWindow(View.Window).MaximumImageSize.cx, MarginsInfo) + else + CurrentSkin.GetMenuItemMargins(Canvas, 0, MarginsInfo); + if SpIsWinVistaOrUp then + R.Left := MarginsInfo.GutterSize + MarginsInfo.ImageTextSpace + else + R.Left := MarginsInfo.GutterSize + MarginsInfo.ImageTextSpace + MarginsInfo.LeftCaptionMargin; + end; + end; + end; + end + else + Vertical := View.Orientation <> tbvoVertical; + + SpDrawXPMenuSeparator(Canvas, R, MenuItemStyle, Vertical); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXRadioGroupItem } + +constructor TSpTBXRadioGroupItem.Create(AOwner: TComponent); +begin + inherited; + FDefaultIndex := 0; + FLastClickedIndex := 0; + FStrings := TTntStringList.Create; +end; + +destructor TSpTBXRadioGroupItem.Destroy; +begin + FStrings.Free; + inherited; +end; + +procedure TSpTBXRadioGroupItem.DoClick(AItem: TSpTBXItem); +begin + if Assigned(FOnClick) then FOnClick(AItem); +end; + +procedure TSpTBXRadioGroupItem.DoFillStrings; +begin + if Assigned(FOnFillStrings) then FOnFillStrings(Self, FStrings); +end; + +procedure TSpTBXRadioGroupItem.ItemClickEvent(Sender: TObject); +var + Item: TSpTBXItem; +begin + Item := Sender as TSpTBXItem; + if not Item.Checked and (Item.Tag > -1) and (Item.Tag < FStrings.Count) then + begin + Item.Checked := True; + FLastClickedIndex := IndexOf(Item); + DoClick(Item); + end; +end; + +procedure TSpTBXRadioGroupItem.Loaded; +begin + inherited; + if not (csDesigning in ComponentState) then + Recreate; +end; + +procedure TSpTBXRadioGroupItem.Recreate; +var + I: Integer; + A: TSpTBXItem; +begin + // Delete FStrings items + FStrings.Clear; + for I := Count - 1 downto 0 do + if Items[I].GroupIndex = C_SpTBXRadioGroupIndex then + Delete(I); + + DoFillStrings; + + // Create group items + for I := 0 to FStrings.Count - 1 do begin + A := TSpTBXItem.Create(Self); + A.Caption := FStrings[I]; + A.AutoCheck := False; + A.GroupIndex := C_SpTBXRadioGroupIndex; + A.Tag := I; + A.OnClick := ItemClickEvent; + Insert(I, A); + if I = FDefaultIndex then A.Click; + end; + + if Assigned(FOnUpdate) then FOnUpdate(Self); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSkinGroupItem } + +constructor TSpTBXSkinGroupItem.Create(AOwner: TComponent); +begin + inherited; + SkinManager.AddSkinNotification(Self); +end; + +destructor TSpTBXSkinGroupItem.Destroy; +begin + SkinManager.RemoveSkinNotification(Self); + inherited; +end; + +procedure TSpTBXSkinGroupItem.DoClick(AItem: TSpTBXItem); +begin + SkinManager.SetSkin(FStrings[AItem.Tag]); + inherited; +end; + +procedure TSpTBXSkinGroupItem.DoSkinChange; +var + I: Integer; +begin + I := FStrings.IndexOf(SkinManager.CurrentSkinName); + if I > -1 then + Items[I].Click; + + if Assigned(FOnSkinChange) then FOnSkinChange(Self); +end; + +procedure TSpTBXSkinGroupItem.DoFillStrings; +var + I: Integer; +begin + {$IFNDEF UNICODE} + SkinManager.SkinsList.GetSkinNames(FStrings.AnsiStrings); + {$ELSE} + SkinManager.SkinsList.GetSkinNames(FStrings); + {$ENDIF} + + // Sort the list and move the Default skin to the top + FStrings.Sort; + I := FStrings.IndexOf('Default'); + if I > -1 then FStrings.Move(I, 0); + inherited; + FDefaultIndex := FStrings.IndexOf(SkinManager.CurrentSkinName); +end; + +procedure TSpTBXSkinGroupItem.WMSpSkinChange(var Message: TMessage); +begin + DoSkinChange; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSystemMenuItem } + +constructor TSpTBXSystemMenuItem.Create(AOwner: TComponent); +begin + inherited; + ItemStyle := ItemStyle + [tbisSubMenu, tbisDontSelectFirst] - [tbisRedrawOnSelChange, tbisRedrawOnMouseOverChange]; + Caption := '&-'; + FShowSize := True; +end; + +function TSpTBXSystemMenuItem.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + Result := TSpTBXSystemMenuItemViewer; +end; + +function TSpTBXSystemMenuItem.GetSystemMenuParentForm: TCustomForm; +var + C: TComponent; +begin + Result := nil; + C := GetParentComponent; + if Assigned(C) and (C is TControl) then + Result := GetParentForm(TControl(C)); + + if not Assigned(Result) and Assigned(Application.MainForm) then begin + if FMDISystemMenu then + Result := Application.MainForm.ActiveMDIChild + else + Result := Application.MainForm; + end; +end; + +procedure TSpTBXSystemMenuItem.Click; +var + Form: TCustomForm; +begin + inherited; + Clear; + + Form := GetSystemMenuParentForm; + if Assigned(Form) then + SpFillSystemSpTBXPopup(Form, Self, True, True, True, True, CommandClick); +end; + +procedure TSpTBXSystemMenuItem.CommandClick(Sender: TObject); +var + Form: TCustomForm; + I: Integer; +begin + Form := GetSystemMenuParentForm; + if Assigned(Form) and Assigned(Sender) then begin + I := TComponent(Sender).Tag; + if I = SC_MAXIMIZE then + Form.WindowState := wsMaximized + else + SendMessage(Form.Handle, WM_SYSCOMMAND, I, GetMessagePos); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSystemMenuItemViewer } + +procedure TSpTBXSystemMenuItemViewer.CalcSize(const Canvas: TCanvas; + var AWidth, AHeight: Integer); +begin + AWidth := GetSystemMetrics(SM_CXSMICON) + 2; + AHeight := GetSystemMetrics(SM_CYSMICON) + 2; +end; + +procedure TSpTBXSystemMenuItemViewer.Paint(const Canvas: TCanvas; + const ClientAreaRect: TRect; IsSelected, IsPushed, UseDisabledShadow: Boolean); + + function GetIconHandle: HICON; + var + Form: TForm; + begin + Result := 0; + if Assigned(Application.MainForm) then begin + if TSpTBXSystemMenuItem(Item).MDISystemMenu then + Form := Application.MainForm.ActiveMDIChild + else + Form := Application.MainForm; + if Assigned(Form) then + Result := Form.Icon.Handle; + end; + if Result = 0 then + Result := Application.Icon.Handle; + if Result = 0 then + Result := LoadIcon(0, IDI_APPLICATION); + end; + +var + R: TRect; + TempIcon: HICON; +begin + R := ClientAreaRect; + InflateRect(R, -1, -1); + TempIcon := CopyImage(GetIconHandle, IMAGE_ICON, R.Right - R.Left, R.Bottom - R.Top, LR_COPYFROMRESOURCE); + try + DrawIconEx(Canvas.Handle, R.Left, R.Top, TempIcon, 0, 0, 0, 0, DI_NORMAL); + finally + DestroyIcon(TempIcon); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomToolPalette } + +constructor TSpTBXCustomToolPalette.Create(AOwner: TComponent); +begin + inherited; + FColCount := 1; + FRowCount := 1; + FSelectedCell.X := -1; +end; + +function TSpTBXCustomToolPalette.DoCellClick(ACol, ARow: Integer): Boolean; +begin + Result := True; + if Assigned(FOnCellClick) then FOnCellClick(Self, ACol, ARow, Result); +end; + +procedure TSpTBXCustomToolPalette.DoChange; +begin + if Assigned(FOnChange) then FOnChange(Self); +end; + +procedure TSpTBXCustomToolPalette.DoDrawCellImage(ACanvas: TCanvas; + const ARect: TRect; ACol, ARow: Integer; ItemInfo: TSpTBXMenuItemInfo); +begin + if Assigned(FOnDrawCellImage) then + FOnDrawCellImage(Self, ACanvas, ARect, ACol, ARow, ItemInfo.Checked, + ItemInfo.HotTrack, ItemInfo.Enabled); +end; + +procedure TSpTBXCustomToolPalette.DoGetCellHint(ACol, ARow: Integer; var AHint: WideString); +begin + if Assigned(FOnGetCellHint) then FOnGetCellHint(Self, ACol, ARow, AHint); +end; + +function TSpTBXCustomToolPalette.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + Result := TSpTBXToolViewer; +end; + +procedure TSpTBXCustomToolPalette.HandleClickCell(ACol, ARow: Integer); +begin + if DoCellClick(ACol, ARow) then SetSelectedCell(Point(ACol, ARow)); +end; + +procedure TSpTBXCustomToolPalette.SetColCount(Value: TSpTBXRowColCount); +begin + if FColCount <> Value then begin + FColCount := Value; + Change(True); + end; +end; + +procedure TSpTBXCustomToolPalette.SetRowCount(Value: TSpTBXRowColCount); +begin + if FRowCount <> Value then begin + FRowCount := Value; + Change(True); + end; +end; + +procedure TSpTBXCustomToolPalette.SetSelectedCell(Value: TPoint); +begin + FSelectedCell := Value; + Change(True); + DoChange; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXToolViewer } + +constructor TSpTBXToolViewer.Create(AView: TTBView; AItem: TTBCustomItem; + AGroupLevel: Integer); +begin + inherited; + FColCount := TSpTBXCustomToolPalette(AItem).ColCount; + FRowCount := TSpTBXCustomToolPalette(AItem).RowCount; +end; + +procedure TSpTBXToolViewer.CalcCellSize(ACanvas: TCanvas; var AWidth, AHeight: Integer); +var + ImageSize: TSize; +begin + ImageSize := GetImageSize; + AWidth := ImageSize.cx + 6; + AHeight := ImageSize.cy + 6; +end; + +procedure TSpTBXToolViewer.CalcSize(const Canvas: TCanvas; var AWidth, AHeight: Integer); +var + W, H: Integer; + MarginsInfo: TSpTBXMenuItemMarginsInfo; +begin + if IsToolbarStyle then + FIndent := 0 + else begin + if View.Window is TSpTBXPopupWindow then + CurrentSkin.GetMenuItemMargins(Canvas, TSpTBXPopupWindow(View.Window).MaximumImageSize.cx, MarginsInfo) + else + CurrentSkin.GetMenuItemMargins(Canvas, 0, MarginsInfo); + FIndent := MarginsInfo.GutterSize + MarginsInfo.ImageTextSpace + MarginsInfo.LeftCaptionMargin - 3; + end; + + FColCount := Item.ColCount; + FRowCount := Item.RowCount; + CalcCellSize(Canvas, W, H); + AWidth := FIndent + W * FColCount; + if not IsToolbarStyle then + Inc(AWidth, MarginsInfo.RightCaptionMargin); + AHeight := H * FRowCount; + if AWidth < 8 then AWidth := 8; + if AHeight < 8 then AHeight := 8; +end; + +procedure TSpTBXToolViewer.DoDrawHint(AHintBitmap: TBitmap; CursorPos: TPoint; + var CursorRect: TRect; var AHint: Widestring; var PaintDefault: Boolean); +var + Col, Row: Integer; +begin + if GetCellAt(CursorPos.X - BoundsRect.Left, CursorPos.Y - BoundsRect.Top, Col, Row) then begin + AHint := GetCellHint(Col, Row); + CursorRect := GetCellRect(CursorRect, Col, Row); + inherited DoDrawHint(AHintBitmap, CursorPos, CursorRect, AHint, PaintDefault); + end + else + PaintDefault := False; +end; + +procedure TSpTBXToolViewer.DrawCellImage(ACanvas: TCanvas; const ARect: TRect; + Col, Row: Integer; ItemInfo: TSpTBXMenuItemInfo); +var + I: Integer; + IL: TCustomImageList; +begin + if not Item.CustomImages then begin + I := GetImageIndex(Col, Row); + IL := Item.Images; + SpDrawImageList(ACanvas, ARect, IL, I, ItemInfo.Enabled, True); + end; + Item.DoDrawCellImage(ACanvas, ARect, Col, Row, ItemInfo); +end; + +procedure TSpTBXToolViewer.Entering; +begin + FHotCell := Point(-1, 0); + if (View is TSpTBXPopupWindowView) and Assigned(View.Selected) then begin + if View.Selected.Index > Index then begin + FHotCell := Point(FColCount - 1, FRowCount - 1); + while (FHotCell.X > 0) and not IsCellVisible(FHotCell) do + Dec(FHotCell.X); + end + else + if View.Selected.Index < Index then + FHotCell := Point(0, 0); + end; + inherited; +end; + +function TSpTBXToolViewer.GetCellAt(X, Y: Integer; out Col, Row: Integer): Boolean; +begin + if (FCellWidth = 0) or (FCellHeight = 0) then begin + Col := 0; + Row := 0; + end + else begin + Col := (X - FIndent) div FCellWidth; + Row := Y div FCellHeight; + end; + Result := (Col >= 0) and (Row >= 0) and (Col < FColCount) and (Row < FRowCount); +end; + +function TSpTBXToolViewer.GetCellHint(Col, Row: Integer): WideString; +begin + Result := ''; + Item.DoGetCellHint(Col, Row, Result); +end; + +function TSpTBXToolViewer.GetCellRect(ClientAreaRect: TRect; Col, Row: Integer): TRect; +begin + Result := Bounds(ClientAreaRect.Left + FIndent + Col * FCellWidth, ClientAreaRect.Top + Row * FCellHeight, FCellWidth, FCellHeight); +end; + +function TSpTBXToolViewer.GetImageIndex(Col, Row: Integer): Integer; +begin + Result := Col + Row * FColCount; +end; + +function TSpTBXToolViewer.GetImageShown: Boolean; +begin + Result := True; +end; + +function TSpTBXToolViewer.GetImageSize: TSize; +var + IL: TCustomImageList; +begin + if Item.CustomImages then + IL := nil + else + IL := Item.Images; + + if Assigned(IL) then begin + Result.cx := IL.Width; + Result.cy := IL.Height; + end + else begin + Result.cx := 12; + Result.cy := 12; + end; +end; + +function TSpTBXToolViewer.GetItem: TSpTBXCustomToolPalette; +var + TBItem: TTBCustomItem; +begin + TBItem := inherited Item; + if Assigned(TBItem) then + Result := TBItem as TSpTBXCustomToolPalette + else + Result := nil; +end; + +procedure TSpTBXToolViewer.InvalidateCell(ACol, ARow: Integer); +var + R: TRect; +begin + R := GetCellRect(BoundsRect, ACol, ARow); + InvalidateRect(View.Window.Handle, @R, False); +end; + +function TSpTBXToolViewer.IsCellVisible(Cell: TPoint): Boolean; +var + IL: TCustomImageList; +begin + Result := (Cell.X >= 0) and (Cell.Y >= 0) and (Cell.X < FColCount) and (Cell.Y < FRowCount); + if Result and not Item.CustomImages then begin + IL := Item.Images; + if Assigned(IL) then + Result := (Cell.X + Cell.Y * FColCount) < IL.Count; + end; +end; + +procedure TSpTBXToolViewer.KeyDown(var Key: Word; Shift: TShiftState); +var + OldPos, Pos: TPoint; +begin + if IsCellVisible(FHotCell) then + OldPos := FHotCell + else + if IsCellVisible(Item.SelectedCell) then + OldPos := Item.SelectedCell + else + OldPos.X := -1; + + if OldPos.X >= 0 then begin + Pos := OldPos; + case Key of + VK_LEFT: + begin + Dec(Pos.X); + if Pos.X < 0 then begin + Pos.X := FColCount - 1; + Dec(Pos.Y); + end; + end; + VK_UP: Dec(Pos.Y); + VK_RIGHT: + begin + Inc(Pos.X); + if Pos.X >= FColCount then + begin + Pos.X := 0; + Inc(Pos.Y); + end; + end; + VK_DOWN: Inc(Pos.Y); + VK_PRIOR: Pos.Y := 0; + VK_NEXT: Pos.Y := FRowCount - 1; + VK_HOME: Pos.X := 0; + VK_END: Pos.Y := FColCount - 1; + VK_RETURN: + if IsCellVisible(FHotCell) then begin + Item.HandleClickCell(FHotCell.X, FHotCell.Y); + Exit; + end; + else + inherited; + Exit; + end; + end + else begin + OldPos := Point(-1, 0); + Pos := Point(0, 0); + end; + + if ((OldPos.X <> Pos.X) or (OldPos.Y <> Pos.Y)) and IsCellVisible(Pos) then begin + Key := 0; + FHotCell := Pos; + Item.Change(False); + end; +end; + +procedure TSpTBXToolViewer.MouseDown(Shift: TShiftState; X, Y: Integer; + var MouseDownOnMenu: Boolean); +begin + FMouseIsDown := True; + MouseMove(X, Y); + inherited; + View.SetCapture; +end; + +procedure TSpTBXToolViewer.MouseMove(X, Y: Integer); +var + OldHotCell: TPoint; +begin + OldHotCell := FHotCell; + if not GetCellAt(X, Y, FHotCell.X, FHotCell.Y) then + FHotCell := Point(-1, 0); + + if (FHotCell.X <> OldHotCell.X) or (FHotCell.Y <> OldHotCell.Y) then + if Show and not IsRectEmpty(BoundsRect) {and not (Item is TTBControlItem)} then begin + Include(State, tbisInvalidated); + InvalidateCell(OldHotCell.X, OldHotCell.Y); + InvalidateCell(FHotCell.X, FHotCell.Y); + end; +end; + +procedure TSpTBXToolViewer.MouseUp(X, Y: Integer; MouseWasDownOnMenu: Boolean); +var + Col, Row: Integer; +begin + FMouseIsDown := False; + if GetCellAt(X, Y, Col, Row) then + Item.HandleClickCell(Col, Row); + View.EndModalWithClick(Self); + inherited; +end; + +procedure TSpTBXToolViewer.Paint(const Canvas: TCanvas; + const ClientAreaRect: TRect; IsSelected, IsPushed, + UseDisabledShadow: Boolean); +var + I, J: Integer; + ItemInfo: TSpTBXMenuItemInfo; + CellRect: TRect; + ItemHotTrack: Boolean; + ImageSize: TSize; +begin + CalcCellSize(Canvas, FCellWidth, FCellHeight); + + SpFillItemInfo(Canvas, Self, ItemInfo); + ItemInfo.ToolbarStyle := True; + ItemHotTrack := False; + if IsSelected then + if not ItemInfo.Enabled and not View.MouseOverSelected then ItemHotTrack := True + else if ItemInfo.Enabled then ItemHotTrack := True; + + for J := 0 to FRowCount - 1 do + for I := 0 to FColCount - 1 do + if IsCellVisible(Point(I, J)) then begin + ItemInfo.HotTrack := False; + ItemInfo.Pushed := False; + if ItemHotTrack and (FHotCell.X = I) and (FHotCell.Y = J) then begin + ItemInfo.HotTrack := True; + if IsPushed then ItemInfo.Pushed := True + end; + if (Item.SelectedCell.X = I) and (Item.SelectedCell.Y = J) then + ItemInfo.Checked := True + else + ItemInfo.Checked := False; + ItemInfo.State := CurrentSkin.GetState(ItemInfo.Enabled, ItemInfo.Pushed, ItemInfo.HotTrack, ItemInfo.Checked); + CellRect := GetCellRect(ClientAreaRect, I, J); + + // Paint the cell + SpDrawXPMenuItem(Canvas, CellRect, ItemInfo); + ImageSize := GetImageSize; + CellRect := SpCenterRect(CellRect, ImageSize.cx, ImageSize.cy); + DrawCellImage(Canvas, CellRect, I, J, ItemInfo); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXColorPalette } + +constructor TSpTBXColorPalette.Create(AOwner: TComponent); +begin + inherited; + CustomImages := True; + FCustomColors := False; + ColCount := CPDefaultCols; + RowCount := CPDefaultRows; // 40 Default Colors + Options := Options + [tboShowHint]; + FColor := clNone; +end; + +procedure TSpTBXColorPalette.DoChange; +begin + if SelectedCell.X >= 0 then + FColor := GetCellColor(SelectedCell.X, SelectedCell.Y); + inherited; +end; + +procedure TSpTBXColorPalette.DoDrawCellImage(ACanvas: TCanvas; + const ARect: TRect; ACol, ARow: Integer; ItemInfo: TSpTBXMenuItemInfo); +var + R: TRect; +begin + R := ARect; + ACanvas.Brush.Color := clBtnShadow; + ACanvas.FrameRect(R); + InflateRect(R, -1, -1); + if ItemInfo.Enabled then begin + ACanvas.Brush.Color := GetCellColor(ACol, ARow); + ACanvas.FillRect(R); + end; +end; + +procedure TSpTBXColorPalette.DoGetCellHint(ACol, ARow: Integer; var AHint: WideString); +var + C: TColor; +begin + GetCellInfo(ACol, ARow, C, AHint); +end; + +function TSpTBXColorPalette.FindCell(AColor: TColor): TPoint; +var + I, J: Integer; + C: TColor; +begin + if AColor <> clNone then + AColor := ColorToRGB(AColor); + for J := 0 to RowCount - 1 do + for I := 0 to ColCount - 1 do begin + C := GetCellColor(I, J); + if C <> clNone then + C := ColorToRGB(C); + if C = AColor then begin + Result.X := I; + Result.Y := J; + Exit; + end; + end; + Result.X := -1; + Result.Y := 0; +end; + +function TSpTBXColorPalette.GetCellColor(ACol, ARow: Integer): TColor; +var + W: WideString; +begin + GetCellInfo(ACol, ARow, Result, W); +end; + +procedure TSpTBXColorPalette.GetCellInfo(ACol, ARow: Integer; + out AColor: TColor; out AName: WideString); +var + I: Integer; +begin + AColor := clNone; + AName := ''; + if not FCustomColors then begin + I := ACol + ARow * ColCount; + if (I > -1) and (I < CPDefaultCols * CPDefaultRows) then begin + AColor := CPDefaultColors[I].Value; + AName := CPDefaultColors[I].Name; + end; + end; + + if Assigned(FOnGetColor) then FOnGetColor(Self, ACol, ARow, AColor, AName); +end; + +procedure TSpTBXColorPalette.SetColor(Value: TColor); +begin + FColor := Value; + SelectedCell := FindCell(Value); +end; + +procedure TSpTBXColorPalette.SetCustomColors(const Value: Boolean); +begin + if FCustomColors <> Value then begin + FCustomColors := Value; + if not Value then begin + RowCount := CPDefaultCols; + ColCount := CPDefaultRows; + end; + Change(True); + end; +end; + +procedure TSpTBXColorPalette.SetColCount(Value: TSpTBXRowColCount); +begin + if FCustomColors then + inherited SetColCount(Value) + else + inherited SetColCount(CPDefaultCols); +end; + +procedure TSpTBXColorPalette.SetRowCount(Value: TSpTBXRowColCount); +begin + if FCustomColors then + inherited SetRowCount(Value) + else + inherited SetRowCount(CPDefaultRows); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXItemCache } + +procedure TSpTBXItemCache.Assign(Source: TPersistent); +var + C: TSpTBXItemCache; +begin + if Source is TSpTBXItemCache then + begin + C := Source as TSpTBXItemCache; + Dock := C.Dock; + Item := C.Item; + Width := C.Width; + Height := C.Height; + ParentWidth := C.ParentWidth; + ParentHeight := C.ParentHeight; + end + else inherited Assign(Source); +end; + +function TSpTBXItemCache.GetName: TComponentName; +begin + if Assigned(FItem) then + Result := FItem.Name + else + Result := FName; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXItemCacheCollection } + +function TSpTBXItemCacheCollection.Add(AItem: TTBCustomItem): Integer; +var + F: TSpTBXItemCache; +begin + F := TSpTBXItemCache(inherited Add); + F.Item := AItem; + Result := F.Index; +end; + +function TSpTBXItemCacheCollection.GetItem(Index: Integer): TSpTBXItemCache; +begin + Result := TSpTBXItemCache(inherited Items[Index]); +end; + +function TSpTBXItemCacheCollection.IndexOf(AItem: TTBCustomItem): Integer; +var + I: Integer; +begin + Result := -1; + if Assigned(AItem) then + for I := 0 to Count - 1 do + if Items[I].Item = AItem then begin + Result := I; + Break; + end; +end; + +procedure TSpTBXItemCacheCollection.SetItem(Index: Integer; + const Value: TSpTBXItemCache); +begin + inherited Items[Index] := Value; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXDock } + +constructor TSpTBXDock.Create(AOwner: TComponent); +begin + inherited; + Color := clNone; + SkinManager.AddSkinNotification(Self); +end; + +destructor TSpTBXDock.Destroy; +begin + SkinManager.RemoveSkinNotification(Self); + inherited; +end; + +function TSpTBXDock.CanResize(var NewWidth, NewHeight: Integer): Boolean; +begin + FPrevWidth := Width; + FPrevHeight := Height; + Result := inherited CanResize(NewWidth, NewHeight); +end; + +procedure TSpTBXDock.DoDrawBackground(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawBackground) then FOnDrawBackground(Self, ACanvas, ARect, PaintStage, PaintDefault); +end; + +procedure TSpTBXDock.DrawBackground(DC: HDC; const DrawRect: TRect); +var + ACanvas: TCanvas; + PaintDefault: Boolean; +begin + // OnDrawBackground should be used to paint all the toolbars + dock, it is + // used by TSpTBXStatusBar and TSpTBXDockablePanel to paint the whole client + // area with custom painting. + // OnDrawBackground is triggered by the Dock and by the docked Toolbar. + if (csDestroying in ComponentState) then Exit; + + ACanvas := TCanvas.Create; + try + ACanvas.Handle := DC; + ACanvas.Lock; + + PaintDefault := True; + DoDrawBackground(ACanvas, DrawRect, pstPrePaint, PaintDefault); + if PaintDefault then begin + // Paint the Bitmap if it's assigned, or use the skin or the Color + if UsingBitmap then + inherited + else + if Color = clNone then + SpDrawXPDock(ACanvas, DrawRect, SkinManager.GetSkinType, Position in [dpLeft, dpRight]) + else begin + ACanvas.Brush.Color := Color; + ACanvas.FillRect(DrawRect); + end; + end; + + PaintDefault := True; + DoDrawBackground(ACanvas, DrawRect, pstPostPaint, PaintDefault); + finally + ACanvas.Unlock; + ACanvas.Handle := 0; + ACanvas.Free; + 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 SpIsDockUsingBitmap 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) and not IsUpdating 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.BeginUpdate; +begin + Inc(FUpdating); + inherited BeginUpdate; +end; + +procedure TSpTBXToolbarView.EndUpdate; +begin + Dec(FUpdating); + inherited EndUpdate; + if FUpdating = 0 then + if Assigned(Owner) and (Owner is TSpTBXToolbar) then begin + TSpTBXToolbar(Owner).RightAlignItems; + TSpTBXToolbar(Owner).AnchorItems; + end; +end; + +function TSpTBXToolbarView.IsUpdating: Boolean; +begin + Result := FUpdating > 0; +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; + FDefaultToolbarBorderSize := CDefaultToolbarBorderSize; + 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) or IsUpdating then + Exit; + + FState := FState + [tstAnchoring]; + View.BeginUpdate; + try + View.ValidatePositions; + IsRotated := IsVertical; + // Adjust the delta, only used when inserting/deleting an item on the toolbar + UpdatedDelta := 0; + if (FLastSelectableWidth > 0) and UpdateControlItems then begin + IV := View.NextSelectable(nil, False); + if Assigned(IV) then + if IsRotated then + UpdatedDelta := FLastSelectableWidth - IV.BoundsRect.Bottom + else + UpdatedDelta := FLastSelectableWidth - IV.BoundsRect.Right; + end; + + // Calculate the Toolbar size + Size := Point(CurrentDock.Width, CurrentDock.Height); + + // Resize the anchored items + for I := 0 to View.ViewerCount - 1 do + if View.Viewers[I] is TSpTBXItemViewer then begin + SpIV := View.Viewers[I] as TSpTBXItemViewer; + if SpIV.Item.Anchored then begin + // Revalidate FAnchorSize and set FAnchorDelta + if (SpIV.FAnchorSize.X = 0) and (SpIV.FAnchorSize.Y = 0) then + SpIV.FAnchorSize := Size; + + // Adjust the delta, only used when inserting/deleting an item on + // the toolbar and resize + if IsRotated then begin + SpIV.FAnchorSize.Y := SpIV.FAnchorSize.Y - UpdatedDelta; + SpIV.FAnchorDelta := Size.Y - SpIV.FAnchorSize.Y; + end + else begin + SpIV.FAnchorSize.X := SpIV.FAnchorSize.X - UpdatedDelta; + SpIV.FAnchorDelta := Size.X - SpIV.FAnchorSize.X; + end; + end; + end + else begin + // Client align TTBControlItem items if the associated Control is client + // aligned or has akRight in its Anchors property. + CI := IsAnchoredControlItem(View.Viewers[I].Item); + J := FAnchoredControlItems.IndexOf(View.Viewers[I].Item); + if Assigned(CI) then begin + // Add the TTBControlItem item to the list if its not there + if J = -1 then begin + J := FAnchoredControlItems.Add(CI); + FAnchoredControlItems[J].Width := CI.Control.Width; + FAnchoredControlItems[J].Height := CI.Control.Height; + FAnchoredControlItems[J].ParentWidth := Size.X; + FAnchoredControlItems[J].ParentHeight := Size.Y; + FAnchoredControlItems[J].Dock := CurrentDock; + end; + // Resize + if FAnchoredControlItems[J].Dock = CurrentDock then begin + FAnchoredControlItems[J].Width := FAnchoredControlItems[J].Width + UpdatedDelta; + CI.Control.Width := FAnchoredControlItems[J].Width + (Size.X - FAnchoredControlItems[J].ParentWidth); + end; + end + else + // If ControlItem is not valid delete it from the list + if J > -1 then + FAnchoredControlItems.Delete(J); + end; + View.UpdatePositions; + finally + View.EndUpdate; + FState := FState - [tstAnchoring]; + end; + + // We can't calculate the delta based on the IV.BoundsRect because + // the IV is nil on tbicDeleting notification. + // We have to keep track of the sum of the selectable items width + IV := View.NextSelectable(nil, False); + if Assigned(IV) then begin + if IsRotated then + FLastSelectableWidth := IV.BoundsRect.Bottom + else + FLastSelectableWidth := IV.BoundsRect.Right; + end + else + FLastSelectableWidth := 0; +end; + +function TSpTBXToolbar.IsAnchoredControlItem(Item: TTBCustomItem): TTBControlItem; +var + CI: TTBControlItem; +begin + Result := nil; + if Assigned(CurrentDock) and (Item is TTBControlItem) then begin + CI := Item as TTBControlItem; + if Assigned(CI.Control) and + ((CI.Control.Align = alClient) or (akRight in CI.Control.Anchors)) then + begin + Result := CI; + end + else + Result := nil; + end; +end; + +procedure TSpTBXToolbar.RightAlignItems; +var + I, VisibleWidth, RightAlignedWidth: Integer; + Spacer: TSpTBXItemViewer; + IsRotated: Boolean; +begin + if (csDestroying in ComponentState) or (tstRightAligning in FState) or + not Assigned(CurrentDock) or (Items.Count <= 0) or + not Stretch or (ShrinkMode <> tbsmNone) or + ((CurrentDock.Width <= 0) and (CurrentDock.Height <= 0)) or IsUpdating then + Exit; + + FState := FState + [tstRightAligning]; + View.ValidatePositions; + View.BeginUpdate; + try + // Find the spacer and the right aligned items + IsRotated := IsVertical; + Spacer := SpGetRightAlignedItems(View, nil, IsRotated, VisibleWidth, RightAlignedWidth); + if Assigned(Spacer) then begin + // Resize the spacer + if IsRotated then + I := CurrentDock.Height - GetRightAlignMargin - (VisibleWidth - (Spacer.BoundsRect.Bottom - Spacer.BoundsRect.Top)) + else + I := CurrentDock.Width - GetRightAlignMargin - (VisibleWidth - (Spacer.BoundsRect.Right - Spacer.BoundsRect.Left)); + + if I < 0 then I := 0; + Spacer.Item.CustomWidth := I; + end; + View.UpdatePositions; + finally + View.EndUpdate; + FState := FState - [tstRightAligning]; + end; +end; + +function TSpTBXToolbar.GetChevronItemClass: TTBChevronItemClass; +begin + Result := TSpTBXChevronItem; +end; + +function TSpTBXToolbar.GetFloatingBorderSize: TPoint; +begin + if SkinManager.GetSkinType = sknSkin then + Result := Point(CurrentSkin.FloatingWindowBorderSize, CurrentSkin.FloatingWindowBorderSize) + else + Result := inherited GetFloatingBorderSize; +end; + +function TSpTBXToolbar.GetFloatingWindowParentClass: TTBFloatingWindowParentClass; +begin + Result := TSpTBXFloatingWindowParent; +end; + +function TSpTBXToolbar.GetRightAlignMargin: Integer; +begin + if IsVertical then + Result := NonClientHeight + else + Result := NonClientWidth; +end; + +function TSpTBXToolbar.GetViewClass: TTBToolbarViewClass; +begin + Result := TSpTBXToolbarView; +end; + +function TSpTBXToolbar.GetItemsTextColor(State: TSpTBXSkinStatesType): TColor; +begin + if vsMenuBar in View.Style then + Result := CurrentSkin.GetTextColor(skncMenuBarItem, State) + else + Result := CurrentSkin.GetTextColor(skncToolbarItem, State); +end; + +function TSpTBXToolbar.IsVertical: Boolean; +begin + Result := SpIsVerticalToolbar(Self); +end; + +procedure TSpTBXToolbar.InternalDrawBackground(ACanvas: TCanvas; ARect: TRect; + PaintOnNCArea: Boolean; PaintBorders: Boolean = True); +begin + SpDrawXPToolbar(Self, ACanvas, ARect, PaintOnNCArea, PaintBorders and (BorderStyle <> bsNone)); +end; + +procedure TSpTBXToolbar.DrawNCArea(const DrawToDC: Boolean; const ADC: HDC; + const Clip: HRGN); +var + DC: HDC; + R, ExcludeR: TRect; + GripSize: Integer; + ACanvas: TCanvas; +begin + if (csDestroying in ComponentState) or not Docked or not HandleAllocated then Exit; + + if not DrawToDC then DC := GetWindowDC(Handle) + else DC := ADC; + try + GetWindowRect(Handle, R); + OffsetRect(R, -R.Left, -R.Top); + GripSize := SpGetDragHandleSize(Self); + + if not DrawToDC then begin + SelectNCUpdateRgn(Handle, DC, Clip); + ExcludeR := R; + InflateRect(ExcludeR, -DefaultToolbarBorderSize, -DefaultToolbarBorderSize); + if IsVertical then + Inc(ExcludeR.Top, GripSize) + else + Inc(ExcludeR.Left, GripSize); + ExcludeClipRect(DC, ExcludeR.Left, ExcludeR.Top, ExcludeR.Right, ExcludeR.Bottom); + end; + + ACanvas := TCanvas.Create; + try + ACanvas.Handle := DC; + + // Paint the background and borders + InternalDrawBackground(ACanvas, R, True); + + // Paint the grip and close button + SpDrawXPToolbarGrip(Self, ACanvas, R); + finally + ACanvas.Handle := 0; + ACanvas.Free; + end; + finally + if not DrawToDC then ReleaseDC(Handle, DC); + end; +end; + +procedure TSpTBXToolbar.CMHintShow(var Message: TCMHintShow); +// Dispatch the message to the Item Viewer. +// TSpTBXItemViewer will handle CM_HINTSHOW message to show unicode hints using +// a custom THintWindow. +begin + with Message.HintInfo^ do begin + HintStr := ''; + if Assigned(View.Selected) then begin + CursorRect := View.Selected.BoundsRect; + HintStr := View.Selected.GetHintText; + View.Selected.Dispatch(Message); + end; + end; +end; + +procedure TSpTBXToolbar.CMControlChange(var Message: TCMControlChange); +begin + // When a control is dropped on the toolbar a TTBControlItem is created by + // TTBCustomToolbar.CreateWrapper, unfortunately it is created with the + // Self.Owner instead of the Form (Owner.Owner for CompoundToolbars like + // the TabToolbar or StatusToolbar). + + if CompoundToolbar and Message.Inserting and not(csLoading in ComponentState) and + not (csUpdating in ComponentState) then + begin + CreateWrapper(Items.Count, Message.Control); + end + else + inherited; +end; + +function TSpTBXToolbar.CreateWrapper(Index: Integer; Ctl: TControl): TTBControlItem; +// CreateWrapper is used only when CompoundToolbar is true, otherwise the +// wrapper is created by TB2K +var + I: Integer; + S: String; + C: TComponent; + ItemsInterface: ITBItems; +begin + Result := nil; + if SpFindControlItem(Items, Ctl) <> nil then Exit; + + C := Owner.Owner; // The Form + Result := TTBControlItem.Create(C); + Result.Control := Ctl; + if (csDesigning in ComponentState) and Assigned(C) then begin + { Needs a name for compatibility with form inheritance } + I := 1; + while True do begin + S := Format('TBControlItem%d', [I]); + if C.FindComponent(S) = nil then + Break; + Inc(I); + end; + Result.Name := S; + end; + + if CompoundToolbar then begin + if Assigned(Owner) and Owner.GetInterface(ITBItems, ItemsInterface) then begin + if Index > ItemsInterface.GetItems.Count then + Index := 0; + ItemsInterface.GetItems.Insert(Index, Result) + end; + end + else + Items.Insert(Index, Result); +end; + +procedure TSpTBXToolbar.CMDialogChar(var Message: TCMDialogChar); +var + I: Integer; +begin + if Enabled and Visible then + for I := 0 to Items.Count - 1 do + if Items[I] is TSpTBXCustomItem then + if TSpTBXCustomItem(Items[I]).DialogChar(Message.CharCode) then begin + Message.Result := 1; + Exit; + end; + inherited; +end; + +procedure TSpTBXToolbar.CMMouseleave(var Message: TMessage); +begin + inherited; + if IsCustomizing and FCustomizable then begin + // Clear the last DropMark + InvalidateRect(Handle, @FLastDropMark, True); + end; +end; + +procedure TSpTBXToolbar.CMTextChanged(var Message: TMessage); +begin + inherited; + if HandleAllocated then begin + if Floating then RedrawWindow(TSpTBXFloatingWindowParent(Parent).Handle, nil, 0, RDW_FRAME or RDW_INVALIDATE) + else RedrawWindow(Handle, nil, 0, RDW_FRAME or RDW_INVALIDATE) + end; +end; + +procedure TSpTBXToolbar.WMSpSkinChange(var Message: TMessage); +begin + if HandleAllocated and not Floating then + RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN or RDW_FRAME); +end; + +procedure TSpTBXToolbar.WMEraseBkgnd(var Message: TWMEraseBkgnd); +// Same as TSpTBXToolWindow.WMEraseBkgnd +var + ACanvas: TCanvas; + R: TRect; +begin + if (csDestroying in ComponentState) then Exit; + + Message.Result := 1; + ACanvas := TCanvas.Create; + ACanvas.Handle := Message.DC; + try + R := ClientRect; + if Docked then begin + InflateRect(R, DefaultToolbarBorderSize, DefaultToolbarBorderSize); + if IsVertical then + Dec(R.Top, SpGetDragHandleSize(Self)) + else + Dec(R.Left, SpGetDragHandleSize(Self)); + end; + + InternalDrawBackground(ACanvas, R, False); + finally + ACanvas.Handle := 0; + ACanvas.Free; + end; +end; + +procedure TSpTBXToolbar.WMSize(var Message: TWMSize); +var + I: Integer; + V: TTBItemViewer; + R: TRect; +begin + inherited; + + if Docked and ((CurrentDock is TSpTBXDock) and not TSpTBXDock(CurrentDock).FResizing) then begin + for I := 0 to View.ViewerCount - 1 do begin + V := View.Viewers[I]; + if V.Show and not IsRectEmpty(V.BoundsRect) and not (V.Item is TTBControlItem) then + View.Invalidate(V); + end; + Self.Update; + InvalidateRect(Handle, nil, True); + for I := 0 to View.ViewerCount - 1 do begin + V := View.Viewers[I]; + if V.Show and not IsRectEmpty(V.BoundsRect) and not (V.Item is TTBControlItem) then begin + R := V.BoundsRect; + ValidateRect(Handle, @R); + end; + end; + end; +end; + +{$IFNDEF UNICODE} +function TSpTBXToolbar.IsCaptionStored: Boolean; +begin + Result := TntControl_IsCaptionStored(Self); +end; + +function TSpTBXToolbar.GetCaption: TWideCaption; +begin + Result := TntControl_GetText(Self); +end; + +procedure TSpTBXToolbar.SetCaption(const Value: TWideCaption); +begin + TntControl_SetText(Self, Value); +end; + +function TSpTBXToolbar.GetHint: WideString; +begin + Result := TntControl_GetHint(Self); +end; + +procedure TSpTBXToolbar.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; +{$ENDIF} + +procedure TSpTBXToolbar.SetCustomizable(const Value: Boolean); +begin + if FCustomizable <> Value then begin + if FMenuBar then + FCustomizable := False + else + FCustomizable := Value; + end; +end; + +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.SetMenuBar(const Value: Boolean); +begin + inherited MenuBar := Value; + FMenuBar := inherited MenuBar; + FCustomizable := not FMenuBar; +end; + +procedure TSpTBXToolbar.BeginUpdate; +begin + TSpTBXToolbarView(View).BeginUpdate; +end; + +procedure TSpTBXToolbar.EndUpdate; +begin + TSpTBXToolbarView(View).EndUpdate; +end; + +function TSpTBXToolbar.IsUpdating: Boolean; +begin + Result := TSpTBXToolbarView(View).IsUpdating; +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; + FDefaultToolbarBorderSize := CDefaultToolbarBorderSize; + FMinClientWidth := 32; + FMinClientHeight := 32; + SetBounds(Left, Top, FMinClientWidth, FMinClientHeight); + + Color := clNone; + SkinManager.AddSkinNotification(Self); +end; + +destructor TSpTBXCustomToolWindow.Destroy; +begin + SkinManager.RemoveSkinNotification(Self); + inherited; +end; + +procedure TSpTBXCustomToolWindow.CreateWindowHandle(const Params: TCreateParams); +begin + {$IFNDEF UNICODE} + CreateUnicodeHandle(Self, Params, ''); + {$ELSE} + inherited; + {$ENDIF} +end; + +procedure TSpTBXCustomToolWindow.DefineProperties(Filer: TFiler); +begin + inherited; + // Don't let the streaming system store the WideStrings, + // we need to store them manually + SpPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TSpTBXCustomToolWindow.CalcSize(ADock: TTBDock): TPoint; +begin + Result.X := FBarSize.cx; + Result.Y := FBarSize.cy; + if Assigned(ADock) and (FullSize or Stretch) then begin + // If docked and stretching, return the minimum size so that the + // toolbar can shrink below FBarSize + if SpIsVerticalToolbar(Self) then + Result.Y := FMinClientHeight + else + Result.X := FMinClientWidth; + end; +end; + +function TSpTBXCustomToolWindow.DoArrange(CanMoveControls: Boolean; + PreviousDockType: TTBDockType; NewFloating: Boolean; NewDock: TTBDock): TPoint; +begin + Result := CalcSize(NewDock); +end; + +procedure TSpTBXCustomToolWindow.GetBaseSize(var ASize: TPoint); +begin + ASize := CalcSize(CurrentDock); +end; + +procedure TSpTBXCustomToolWindow.GetMinMaxSize(var AMinClientWidth, AMinClientHeight, + AMaxClientWidth, AMaxClientHeight: Integer); +begin + // GetMinMaxSize is used only when the window is floating + AMinClientWidth := FMinClientWidth; + AMinClientHeight := FMinClientHeight; + AMaxClientWidth := FMaxClientWidth; + AMaxClientHeight := FMaxClientHeight; +end; + +function TSpTBXCustomToolWindow.IsVertical: Boolean; +begin + Result := SpIsVerticalToolbar(Self); +end; + +procedure TSpTBXCustomToolWindow.SizeChanging(const AWidth, AHeight: Integer); +begin + FBarSize.cx := AWidth; + FBarSize.cy := AHeight; + if Assigned(Parent) then begin + Dec(FBarSize.cx, Width - ClientWidth); + Dec(FBarSize.cy, Height - ClientHeight); + end; +end; + +procedure TSpTBXCustomToolWindow.SetClientAreaSize(AWidth, AHeight: Integer); +var + R: TRect; +begin + if Assigned(Parent) then begin + Windows.GetClientRect(Handle, R); + SetBounds(Left, Top, Width - R.Right + AWidth, Height - R.Bottom + AHeight); + end + else + SetBounds(Left, Top, AWidth, AHeight); +end; + +procedure TSpTBXCustomToolWindow.Paint; +var + R: TRect; +begin + // Dotted border in design mode + if csDesigning in ComponentState then begin + R := ClientRect; + Canvas.Pen.Style := psDot; + Canvas.Pen.Color := clBtnShadow; + Canvas.Brush.Style := bsClear; + Canvas.Rectangle(R.Left, R.Top, R.Right, R.Bottom); + Canvas.Pen.Style := psSolid; + end; +end; + +procedure TSpTBXCustomToolWindow.InternalDrawBackground(ACanvas: TCanvas; + ARect: TRect; PaintOnNCArea, PaintBorders: Boolean); +begin + SpDrawXPToolbar(Self, ACanvas, ARect, PaintOnNCArea, PaintBorders and (BorderStyle <> bsNone)); +end; + +procedure TSpTBXCustomToolWindow.InvalidateBackground(InvalidateChildren: Boolean); +begin + // Force background repaint + if not (csDestroying in ComponentState) and HandleAllocated then + if InvalidateChildren then + RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN) + else + RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE); +end; + +procedure TSpTBXCustomToolWindow.DrawNCArea(const DrawToDC: Boolean; + const ADC: HDC; const Clip: HRGN); +var + DC: HDC; + R, ExcludeR: TRect; + GripSize: Integer; + ACanvas: TCanvas; +begin + if (csDestroying in ComponentState) or not Docked or not HandleAllocated then Exit; + + if not DrawToDC then DC := GetWindowDC(Handle) + else DC := ADC; + try + GetWindowRect(Handle, R); + OffsetRect(R, -R.Left, -R.Top); + GripSize := SpGetDragHandleSize(Self); + + if not DrawToDC then begin + SelectNCUpdateRgn(Handle, DC, Clip); + ExcludeR := R; + InflateRect(ExcludeR, -DefaultToolbarBorderSize, -DefaultToolbarBorderSize); + if IsVertical then + Inc(ExcludeR.Top, GripSize) + else + Inc(ExcludeR.Left, GripSize); + ExcludeClipRect(DC, ExcludeR.Left, ExcludeR.Top, ExcludeR.Right, ExcludeR.Bottom); + end; + + ACanvas := TCanvas.Create; + try + ACanvas.Handle := DC; + + // Paint the background and borders + InternalDrawBackground(ACanvas, R, True); + + // Paint the grip and close button + SpDrawXPToolbarGrip(Self, ACanvas, R); + finally + ACanvas.Handle := 0; + ACanvas.Free; + end; + finally + if not DrawToDC then ReleaseDC(Handle, DC); + end; +end; + +procedure TSpTBXCustomToolWindow.DoDrawBackground(ACanvas: TCanvas; + ARect: TRect; const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawBackground) then FOnDrawBackground(Self, ACanvas, ARect, PaintStage, PaintDefault); +end; + +procedure TSpTBXCustomToolWindow.ReadPositionData(const Data: TTBReadPositionData); +var + W, H: Integer; +begin + inherited; + // Load ClientAreaWidth/ClientAreaHeight + if Resizable then + with Data do begin + W := ReadIntProc(Name, rvClientWidth, FBarSize.cx, ExtraData); + H := ReadIntProc(Name, rvClientHeight, FBarSize.cy, ExtraData); + SetClientAreaSize(W, H); + end; +end; + +procedure TSpTBXCustomToolWindow.WritePositionData(const Data: TTBWritePositionData); +begin + inherited; + // Save ClientAreaWidth/ClientAreaHeight + with Data do begin + WriteIntProc(Name, rvClientWidth, ClientAreaWidth, ExtraData); + WriteIntProc(Name, rvClientHeight, ClientAreaHeight, ExtraData); + end; +end; + +function TSpTBXCustomToolWindow.GetFloatingBorderSize: TPoint; +begin + if SkinManager.GetSkinType = sknSkin then + Result := Point(CurrentSkin.FloatingWindowBorderSize, CurrentSkin.FloatingWindowBorderSize) + else + Result := inherited GetFloatingBorderSize; +end; + +function TSpTBXCustomToolWindow.GetFloatingWindowParentClass: TTBFloatingWindowParentClass; +begin + Result := TSpTBXFloatingWindowParent; +end; + +{$IFNDEF UNICODE} +function TSpTBXCustomToolWindow.IsCaptionStored: Boolean; +begin + Result := TntControl_IsCaptionStored(Self); +end; + +function TSpTBXCustomToolWindow.GetCaption: TWideCaption; +begin + Result := TntControl_GetText(Self); +end; + +procedure TSpTBXCustomToolWindow.SetCaption(const Value: TWideCaption); +begin + TntControl_SetText(Self, Value); +end; +{$ENDIF} + +function TSpTBXCustomToolWindow.GetClientAreaWidth: Integer; +begin + if Assigned(Parent) then Result := ClientWidth + else Result := Width; +end; + +procedure TSpTBXCustomToolWindow.SetClientAreaWidth(Value: Integer); +begin + SetClientAreaSize(Value, ClientAreaHeight); +end; + +function TSpTBXCustomToolWindow.GetClientAreaHeight: Integer; +begin + if Assigned(Parent) then Result := ClientHeight + else Result := Height; +end; + +procedure TSpTBXCustomToolWindow.SetClientAreaHeight(Value: Integer); +begin + SetClientAreaSize(ClientAreaWidth, Value); +end; + +procedure TSpTBXCustomToolWindow.CMTextChanged(var Message: TMessage); +begin + inherited; + if HandleAllocated then begin + if Floating then RedrawWindow(TSpTBXFloatingWindowParent(Parent).Handle, nil, 0, RDW_FRAME or RDW_INVALIDATE) + else RedrawWindow(Handle, nil, 0, RDW_FRAME or RDW_INVALIDATE) + end; +end; + +procedure TSpTBXCustomToolWindow.WMEraseBkgnd(var Message: TWMEraseBkgnd); +// Same as TSpTBXToolbar.WMEraseBkgnd +var + ACanvas: TCanvas; + R: TRect; +begin + if (csDestroying in ComponentState) then Exit; + + Message.Result := 1; + ACanvas := TCanvas.Create; + ACanvas.Handle := Message.DC; + try + R := ClientRect; + if Docked then begin + InflateRect(R, DefaultToolbarBorderSize, DefaultToolbarBorderSize); + if IsVertical then + Dec(R.Top, SpGetDragHandleSize(Self)) + else + Dec(R.Left, SpGetDragHandleSize(Self)); + end; + + InternalDrawBackground(ACanvas, R, False); + finally + ACanvas.Handle := 0; + ACanvas.Free; + end; +end; + +procedure TSpTBXCustomToolWindow.WMSpSkinChange(var Message: TMessage); +begin + if HandleAllocated and not Floating then + RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN or RDW_FRAME); +end; + +procedure TSpTBXCustomToolWindow.WMWindowPosChanged(var Message: TWMWindowPosChanged); +begin + inherited; + InvalidateBackground; + if (Message.WindowPos.flags and SWP_NOSIZE) = 0 then begin + Realign; + Update; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXFloatingWindowParent } + +constructor TSpTBXFloatingWindowParent.CreateNew(AOwner: TComponent; + Dummy: Integer); +begin + inherited; + ScreenSnap := True; + SkinManager.AddSkinNotification(Self); +end; + +procedure TSpTBXFloatingWindowParent.CreateWnd; +begin + inherited; + UpdateDwmNCSize; +end; + +destructor TSpTBXFloatingWindowParent.Destroy; +begin + SkinManager.RemoveSkinNotification(Self); + inherited; +end; + +procedure TSpTBXFloatingWindowParent.DrawNCArea(const DrawToDC: Boolean; + const ADC: HDC; const Clip: HRGN; RedrawWhat: TTBToolWindowNCRedrawWhat); +const + Pattern: array [0..15] of Byte = ($C6, 0, $EE, 0, $7C, 0, $38, 0, $7C, 0, $EE, 0, $C6, 0, 0, 0); +var + DC: HDC; + R, CaptionR, CloseR: TRect; + ACanvas: TCanvas; + DockWindow: TTBCustomDockableWindowAccess; + FloatingBorderSize: TPoint; + WideCaption: WideString; + IsActive: Boolean; + Flags: Integer; + CloseButtonWidth: Integer; + SkinState: TSpTBXSkinStatesType; + PatternColor: TColor; +begin + if not HandleAllocated then Exit; + if not DrawToDC then DC := GetWindowDC(Handle) + else DC := ADC; + try + if not DrawToDC then SelectNCUpdateRgn(Handle, DC, Clip); + GetWindowRect(Handle, R); + OffsetRect(R, -R.Left, -R.Top); + with R do IntersectClipRect(DC, Left, Top, Right, Bottom); + ACanvas := TCanvas.Create; + try + ACanvas.Handle := DC; + ACanvas.Brush.Color := Color; // SpDrawXPTitleBarBody needs it to paint the background + GetWindowRect(Handle, R); + OffsetRect(R, -R.Left, -R.Top); + DockWindow := TTBCustomDockableWindowAccess(DockableWindow); + FloatingBorderSize := DockWindow.GetFloatingBorderSize; + IsActive := not DockWindow.InactiveCaption; + + // Borders + if twrdBorder in RedrawWhat then + SpDrawXPTitleBarBody(ACanvas, R, IsActive, FloatingBorderSize, False); + + // Caption + if DockWindow.ShowCaption then begin + R.Bottom := R.Top + FloatingBorderSize.Y + GetSystemMetrics(SM_CYSMCAPTION); + if SkinManager.GetSkinType = sknWindows then begin + if twrdBorder in RedrawWhat then + SpDrawXPTitleBar(ACanvas, R, IsActive, False); + InflateRect(R, -FloatingBorderSize.X, 0); + R.Top := R.Top + FloatingBorderSize.Y; + end + else begin + InflateRect(R, -FloatingBorderSize.X, 0); + R.Top := R.Top + FloatingBorderSize.Y; + if twrdBorder in RedrawWhat then + SpDrawXPTitleBar(ACanvas, R, IsActive, False); + end; + + // Text + if twrdCaption in RedrawWhat then begin + CaptionR := R; + OffsetRect(CaptionR, 2, 0); + if DockWindow.CloseButton then + Dec(CaptionR.Right, GetSystemMetrics(SM_CYSMCAPTION) + 2); + ACanvas.Brush.Style := bsClear; + try + ACanvas.Font.Assign(SmCaptionFont); + if IsActive then + ACanvas.Font.Color := CurrentSkin.GetTextColor(skncWindowTitleBar, sknsNormal) + else + ACanvas.Font.Color := CurrentSkin.GetTextColor(skncWindowTitleBar, sknsDisabled); + + if DockableWindow is TSpTBXToolbar then + WideCaption := TSpTBXToolbar(DockWindow).Caption + else + if DockableWindow is TSpTBXCustomToolWindow then + WideCaption := TSpTBXCustomToolWindow(DockWindow).Caption + else + WideCaption := ''; + SpDrawXPText(ACanvas, WideCaption, CaptionR, DT_SINGLELINE or DT_VCENTER or DT_END_ELLIPSIS or DT_HIDEPREFIX); + finally + ACanvas.Brush.Style := bsSolid; + end; + end; + + // Close button + if (twrdCloseButton in RedrawWhat) and DockWindow.CloseButton then begin + CloseR := R; + Dec(CloseR.Bottom); + CloseButtonWidth := (CloseR.Bottom - CloseR.Top) - 2 - 2; + CloseR.Left := CloseR.Right - CloseButtonWidth - 2; // TB2Dock.GetCloseButtonRect + CloseR.Right := CloseR.Left + CloseButtonWidth; + CloseR.Top := CloseR.Top + 2; + CloseR.Bottom := CloseR.Top + CloseButtonWidth; + + case SkinManager.GetSkinType of + sknNone: + begin + if CloseButtonDown then + DrawFrameControl(ACanvas.Handle, CloseR, DFC_CAPTION, DFCS_CAPTIONCLOSE or DFCS_PUSHED) + else + DrawFrameControl(ACanvas.Handle, CloseR, DFC_CAPTION, DFCS_CAPTIONCLOSE); + end; + sknWindows: + begin + if CloseButtonDown then Flags := CBS_PUSHED + else if FCloseButtonHover then Flags := CBS_HOT + else Flags := CBS_NORMAL; + DrawThemeBackground(ThemeServices.Theme[teWindow], ACanvas.Handle, WP_SMALLCLOSEBUTTON, Flags, CloseR, nil); + end; + sknSkin: + begin + SkinState := CurrentSkin.GetState(True, CloseButtonDown, FCloseButtonHover, False); + PatternColor := CurrentSkin.GetTextColor(skncWindowTitleBar, SkinState); + if PatternColor = clNone then + PatternColor := CurrentSkin.GetTextColor(skncToolbarItem, SkinState); + CurrentSkin.PaintBackground(ACanvas, CloseR, skncToolbarItem, SkinState, True, True); + SpDrawGlyphPattern(ACanvas, CloseR, 0, PatternColor); + end; + end; + end; + end; + finally + ACanvas.Handle := 0; + ACanvas.Free; + end; + finally + if not DrawToDC then ReleaseDC(Handle, DC); + end; +end; + +procedure TSpTBXFloatingWindowParent.RedrawCloseButton; +begin + if HandleAllocated and IsWindowVisible(Handle) then + if SkinManager.GetSkinType <> sknNone then + DrawNCArea(False, 0, 0, [twrdBorder, twrdCaption, twrdCloseButton]); +end; + +procedure TSpTBXFloatingWindowParent.UpdateDwmNCSize; +var + Style: Integer; +begin + if HandleAllocated then begin + // Make sure WS_THICKFRAME is setted only when Windows themes are used with + // DwmComposition, otherwise borders are incorrectly painted on Vista + Style := GetWindowLong(Handle, GWL_STYLE); + if SpIsDwmCompositionEnabled and (SkinManager.GetSkinType = sknWindows) then + Style := Style or WS_THICKFRAME + else + Style := Style and not WS_THICKFRAME; + SetWindowLong(Handle, GWL_STYLE, Style); + + // Update the NC area size, CurrentSkin.FloatingWindowBorderSize could have changed + // Make sure to resize the toolbar + SpRecalcNCArea(Self); + if Assigned(DockableWindow) then + TTBCustomDockableWindowAccess(DockableWindow).Arrange; + RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN or RDW_FRAME); + SpActivateDwmNC(Self, SkinManager.GetSkinType <> sknSkin); + end; +end; + +procedure TSpTBXFloatingWindowParent.CancelNCHover; +begin + if FCloseButtonHover then begin + FCloseButtonHover := False; + RedrawCloseButton; + end; +end; + +procedure TSpTBXFloatingWindowParent.VisibleChanging; +begin + inherited; + Caption := ''; +end; + +procedure TSpTBXFloatingWindowParent.CMMouseLeave(var Message: TMessage); +begin + inherited; + CancelNCHover; +end; + +procedure TSpTBXFloatingWindowParent.WMActivateApp(var Message: TWMActivateApp); +var + DockWindow: TTBCustomDockableWindowAccess; +begin + inherited; + + // The floating window is not repainted correctly if HideWhenInactive is + // false and the application is deactivated/activated. + if HandleAllocated then begin + DockWindow := TTBCustomDockableWindowAccess(DockableWindow); + if not DockWindow.HideWhenInactive then + RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN); + end; +end; + +procedure TSpTBXFloatingWindowParent.WMClose(var Message: TWMClose); +begin + if FCloseOnAltF4 then begin + if Assigned(DockableWindow) then + TTBCustomDockableWindowAccess(DockableWindow).Close; + end + else + inherited; +end; + +procedure TSpTBXFloatingWindowParent.WMEraseBkgnd(var Message: TMessage); +begin + Message.Result := 1; +end; + +procedure TSpTBXFloatingWindowParent.WMNCMouseLeave(var Message: TMessage); +begin + if not MouseCapture then CancelNCHover; + inherited; +end; + +procedure TSpTBXFloatingWindowParent.WMNCMouseMove(var Message: TWMNCMouseMove); +var + InArea: Boolean; +begin + inherited; + { Note: TME_NONCLIENT was introduced in Windows 98 and 2000 } + if (Win32MajorVersion >= 5) or + (Win32MajorVersion = 4) and (Win32MinorVersion >= 10) then + CallTrackMouseEvent(Handle, TME_LEAVE or $10 {TME_NONCLIENT}); + InArea := Message.HitTest = 2001; {HT_TB2k_Close} + if FCloseButtonHover <> InArea then begin + FCloseButtonHover := InArea; + RedrawCloseButton; + end; +end; + +procedure TSpTBXFloatingWindowParent.WMSpSkinChange(var Message: TMessage); +begin + UpdateDwmNCSize; + inherited; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXPopupWindow } + +constructor TSpTBXPopupWindow.CreatePopupWindow(AOwner: TComponent; + const AParentView: TTBView; const AItem: TTBCustomItem; + const ACustomizing: Boolean); +begin + inherited; + if AItem is TSpTBXCustomItem then + if Assigned(View) and (View is TSpTBXPopupWindowView) then begin + if TSpTBXCustomItem(AItem).ToolbarStylePopup then + TSpTBXPopupWindowView(View).SetIsToolbar(True); + end; + + FMaximumImageSize := SpGetMenuMaximumImageSize(View); +end; + +destructor TSpTBXPopupWindow.Destroy; +begin + DoPopupShowingChanged(False); + + inherited; +end; + +procedure TSpTBXPopupWindow.DoPopupShowingChanged(IsVisible: Boolean); +begin + if View.ParentItem is TSpTBXCustomItem then + TSpTBXCustomItem(View.ParentItem).DoPopupShowingChanged(Self, IsVisible) + else + if View.ParentItem is TSpTBXRootItem then + TSpTBXRootItem(View.ParentItem).DoPopupShowingChanged(Self, IsVisible); +end; + +function TSpTBXPopupWindow.GetViewClass: TTBViewClass; +begin + Result := TSpTBXPopupWindowView; +end; + +function TSpTBXPopupWindow.CanDrawGutter: Boolean; +begin + if View.IsToolbar then + Result := False + else begin + Result := True; + // Is it a toolbox? + if Assigned(View) and Assigned(View.ParentItem) then begin + if View.ParentItem is TSpTBXCustomItem then + Result := not TSpTBXCustomItem(View.ParentItem).ToolBoxPopup + else + if View.ParentItem is TSpTBXRootItem then + Result := not TSpTBXRootItem(View.ParentItem).ToolBoxPopup; + end; + end; +end; + +procedure PopupWindowNCPaintProc(Wnd: HWND; DC: HDC; AppData: TObject); +// Paints the NC area and the client background, used by WMEraseBkgnd, WMNCPaint, WMPrint +var + ACanvas: TCanvas; + R: TRect; + PopupWindow: TSpTBXPopupWindow; +begin + ACanvas := TCanvas.Create; + try + ACanvas.Handle := DC; + GetWindowRect(Wnd, R); + OffsetRect(R, -R.Left, -R.Top); + + PopupWindow := TSpTBXPopupWindow(AppData); + // If it's used by WM_ERASEBKGND offset the rect + if PopupWindow.FPaintingClientArea then begin + PopupWindow.FPaintingClientArea := False; + OffsetRect(R, -3, -3); + end; + + PopupWindow.PaintBackground(ACanvas, R); + finally + ACanvas.Handle := 0; + ACanvas.Free; + end; +end; + +procedure TSpTBXPopupWindow.PaintBackground(ACanvas: TCanvas; ARect: TRect); +// Paints the NC area and the client background, used by WMEraseBkgnd, WMNCPaint, WMPrint +var + DrawGutter: Boolean; + OpenIVRect: TRect; + OpenIV: TTBItemViewer; + OpenIVSize: Integer; +begin + OpenIVRect := Rect(0, 0, 0, 0); + DrawGutter := False; + + if Assigned(View) then begin + ACanvas.Font.Assign(ToolbarFont); + DrawGutter := CanDrawGutter; + + if Assigned(View.ParentView) and CurrentSkin.OfficePopup then begin + OpenIV := TTBViewAccess(View.ParentView).OpenViewer; + if Assigned(OpenIV) and OpenIV.IsToolbarStyle and + ((OpenIV is TSpTBXItemViewer) or (OpenIV is TSpTBXChevronItemViewer)) then + begin + // Get the OpenIVRect in window coordinates + OpenIVRect := OpenIV.BoundsRect; + OpenIVRect.TopLeft := View.ParentView.Window.ClientToScreen(OpenIVRect.TopLeft); + OpenIVRect.BottomRight := View.ParentView.Window.ClientToScreen(OpenIVRect.BottomRight); + OpenIVRect.TopLeft := ScreenToClient(OpenIVRect.TopLeft); + OpenIVRect.BottomRight := ScreenToClient(OpenIVRect.BottomRight); + OffsetRect(OpenIVRect, 3, 3); // Offset to get it on window coordinates + OpenIVSize := OpenIVRect.Right - OpenIVRect.Left; + + // Get the Clip rect based on OpenIVRect + OpenIVRect.Left := OpenIVRect.Left + ARect.Left; // ARect.Left is -3 when called by WMEraseBkgnd and is 0 when called by WMNCPaint and WMPrint + OpenIVRect.Right := OpenIVRect.Left + OpenIVSize; + end; + end; + end; + + SpDrawXPMenuPopupWindow(ACanvas, ARect, OpenIVRect, DrawGutter, MaximumImageSize.cx, sknSkin); +end; + +procedure TSpTBXPopupWindow.CMHintShow(var Message: TCMHintShow); +// Dispatch the message to the Item Viewer. +// TSpTBXItemViewer will handle CM_HINTSHOW message to show unicode hints using +// a custom THintWindow. +begin + with Message.HintInfo^ do begin + HintStr := ''; + if Assigned(View.Selected) then begin + CursorRect := View.Selected.BoundsRect; + HintStr := View.Selected.GetHintText; + View.Selected.Dispatch(Message); + end; + end; +end; + +procedure TSpTBXPopupWindow.CMShowingchanged(var Message: TMessage); +const + ShowFlags: array[Boolean] of UINT = ( + SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_HIDEWINDOW, + SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_SHOWWINDOW); +var + HideEmptyPopup: Boolean; +begin + if View.ParentItem is TSpTBXSubmenuItem then + HideEmptyPopup := TSpTBXSubmenuItem(View.ParentItem).HideEmptyPopup + else + HideEmptyPopup := False; + + // When the View is empty the size is set to 0 on TSpTBXPopupWindowView.AutoSize + // We should disable the animation because it can't animate an empty window + if HideEmptyPopup and Showing and (View.ViewerCount = 0) then begin + SetWindowPos(WindowHandle, 0, 0, 0, 0, 0, ShowFlags[Showing]); + end + else + inherited; + + if Visible then + DoPopupShowingChanged(True); +end; + +procedure TSpTBXPopupWindow.WMEraseBkgnd(var Message: TWMEraseBkgnd); +begin + case SkinManager.GetSkinType of + sknNone: + inherited; + sknWindows: + // If it's Windows theme and we're not on Vista do default painting + if not SpIsWinVistaOrUp then + inherited + else begin + Message.Result := 1; + FPaintingClientArea := True; + TBEndAnimation(WindowHandle); + PopupWindowNCPaintProc(Handle, Message.DC, Self); + end; + sknSkin: + begin + Message.Result := 1; + FPaintingClientArea := True; + TBEndAnimation(WindowHandle); + PopupWindowNCPaintProc(Handle, Message.DC, Self); + end; + end; +end; + +procedure TSpTBXPopupWindow.WMNCPaint(var Message: TMessage); +var + DC: HDC; +begin + DC := GetWindowDC(Handle); + try + FPaintingClientArea := False; + SelectNCUpdateRgn(Handle, DC, HRGN(Message.WParam)); + PopupWindowNCPaintProc(Handle, DC, Self); + finally + ReleaseDC(Handle, DC); + end; +end; + +procedure TSpTBXPopupWindow.WMPrint(var Message: TMessage); +begin + FPaintingClientArea := False; + HandleWMPrint(Handle, Message, PopupWindowNCPaintProc, Self); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXPopupWindowView } + +procedure TSpTBXPopupWindowView.AutoSize(AWidth, AHeight: Integer); +begin + // When the View is empty the size should be 0 + if (ViewerCount = 0) and (ParentItem is TSpTBXSubmenuItem) then + if TSpTBXSubmenuItem(ParentItem).HideEmptyPopup then begin + AWidth := -(PopupMenuWindowNCSize * 2); + AHeight := -(PopupMenuWindowNCSize * 2); + end; + + inherited AutoSize(AWidth, AHeight); +end; + +procedure TSpTBXPopupWindowView.SetIsToolbar(const Value: Boolean); +begin + // Change the readonly IsToolbar property using RTTI, the property must + // be published. + // Tip from: http://hallvards.blogspot.com/2004/05/hack-1-write-access-to-read-only.html + PBoolean(Integer(Self) + (Integer(GetPropInfo(TSpTBXPopupWindowView, 'IsToolbar').GetProc) and $00FFFFFF))^ := Value; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXChevronItem } + +function TSpTBXChevronItem.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + Result := TSpTBXChevronItemViewer; +end; + +function TSpTBXChevronItem.GetPopupWindowClass: TTBPopupWindowClass; +begin + Result := TSpTBXChevronPopupWindow; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXChevronItemViewer } + +function TSpTBXChevronItemViewer.GetTextColor(State: TSpTBXSkinStatesType): TColor; +begin + Result := clNone; + if IsToolbarStyle then begin + if View.Window is TSpTBXToolbar then + Result := TSpTBXToolbar(View.Window).GetItemsTextColor(State); + if Result = clNone then + Result := CurrentSkin.GetTextColor(skncToolbarItem, State); + end + else + Result := CurrentSkin.GetTextColor(skncMenuItem, State); +end; + +procedure TSpTBXChevronItemViewer.Paint(const Canvas: TCanvas; + const ClientAreaRect: TRect; IsSelected, IsPushed, + UseDisabledShadow: Boolean); +const + Pattern: array[Boolean, 0..15] of Byte = ( + ($CC, 0, $66, 0, $33, 0, $66, 0, $CC, 0, 0, 0, 0, 0, 0, 0), + ($88, 0, $D8, 0, $70, 0, $20, 0, $88, 0, $D8, 0, $70, 0, $20, 0)); +var + ItemInfo: TSpTBXMenuItemInfo; + R2: TRect; + P: PByte; + W, H: Integer; + DC: HDC; + PatternColor: TColor; +begin + DC := Canvas.Handle; + SpFillItemInfo(Canvas, Self, ItemInfo); + SpDrawXPMenuItem(Canvas, ClientAreaRect, ItemInfo); + + // Chevron glyph + R2 := ClientAreaRect; + if not ItemInfo.IsVertical then begin + Inc(R2.Top, 4); + R2.Bottom := R2.Top + 5; + W := 8; + H := 5; + end + else begin + R2.Left := R2.Right - 9; + R2.Right := R2.Left + 5; + W := 5; + H := 8; + end; + if ItemInfo.Pushed then OffsetRect(R2, 1, 1); + + if SkinManager.GetSkinType = sknSkin then + PatternColor := GetTextColor(ItemInfo.State) + else + PatternColor := clBtnText; + P := @Pattern[ItemInfo.IsVertical][0]; + if ItemInfo.Enabled then + SpDrawGlyphPattern(DC, R2, W, H, P^, PatternColor) + else begin + OffsetRect(R2, 1, 1); + SpDrawGlyphPattern(DC, R2, W, H, P^, clBtnHighlight); + OffsetRect(R2, -1, -1); + SpDrawGlyphPattern(DC, R2, W, H, P^, clBtnShadow); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXChevronPopupWindow } + +procedure TSpTBXChevronPopupWindow.CMColorChanged(var Message: TMessage); +var + V: TSpTBXPopupWindowView; + PV: TTBView; +begin + // The private FIsToolbar field of the ChevronItem is setted to True + // in TTBCustomItem.CreatePopup, we need to reset it to False before + // the Popup is showed. + // TTBCustomItem.CreatePopup changes the PopupWindow color to clBtnFace + // after it changes the FIsToolbar value (and before it is visible), + // that's why we are trapping CM_COLORCHANGED to reset the field. + + inherited; + if Assigned(View) and (View is TSpTBXPopupWindowView) then begin + V := TSpTBXPopupWindowView(View); + PV := V.ParentView; + // Do we really need to change it? + if (Color = clBtnFace) and V.IsToolbar and Assigned(PV) and + Assigned(PV.Owner) and (PV.Owner is TSpTBXToolbar) and + (TSpTBXToolbar(PV.Owner).ChevronVertical) then + begin + V.SetIsToolbar(False); + Color := clMenu; + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXPopupMenu } + +function TSpTBXPopupMenu.GetOnClosePopup: TNotifyEvent; +begin + Result := TSpTBXRootItem(Items).OnClosePopup; +end; + +function TSpTBXPopupMenu.GetOnInitPopup: TSpTBXPopupEvent; +begin + Result := TSpTBXRootItem(Items).OnInitPopup; +end; + +function TSpTBXPopupMenu.GetRootItemClass: TTBRootItemClass; +begin + Result := TSpTBXRootItem; +end; + +function TSpTBXPopupMenu.InternalPopup(X, Y: Integer; ForceFocus: Boolean; + PopupControl: TControl = nil): Boolean; +var + P: TPoint; + PopupControlRect: TRect; + WinPopupControl: TWinControl; + Msg: TMessage; +begin + Result := True; + FClickedItem := nil; + P := Point(X, Y); + + {$IFDEF JR_D9} + SetPopupPoint(P); + {$ELSE} + PPoint(@PopupPoint)^ := P; + {$ENDIF} + + WinPopupControl := nil; + if Assigned(PopupControl) and Assigned(PopupControl.Parent) then begin + PopupControlRect := PopupControl.BoundsRect; + PopupControlRect.TopLeft := PopupControl.Parent.ClientToScreen(PopupControlRect.TopLeft); + PopupControlRect.BottomRight := PopupControl.Parent.ClientToScreen(PopupControlRect.BottomRight); + if PopupControl is TWinControl then + WinPopupControl := PopupControl as TWinControl; + end + else + PopupControlRect := Rect(X, Y, X, Y); + + P.X := PopupControlRect.Left; + P.Y := PopupControlRect.Bottom; + TSpTBXRootItem(Items).ToolBoxPopup := ToolBoxPopup; + FClickedItem := Items.Popup(P.X, P.Y, TrackButton = tbRightButton, + TTBPopupAlignment(Alignment), FReturnClickedItemOnly); + + if Assigned(WinPopupControl) then begin + // Send a message to the PopupControl and it's children controls + // to inform that the Popup is closed. + Msg.Msg := CM_SPPOPUPCLOSE; + Msg.WParam := Integer(Self); + Msg.LParam := 0; + Msg.Result := 0; + PostMessage(WinPopupControl.Handle, Msg.Msg, Msg.WParam, Msg.LParam); + WinPopupControl.Broadcast(Msg); + end; +end; + +procedure TSpTBXPopupMenu.Popup(X, Y: Integer); +begin + PopupEx(X, Y); +end; + +function TSpTBXPopupMenu.PopupEx(X, Y: Integer; PopupControl: TControl = nil; + ReturnClickedItemOnly: Boolean = False): TTBCustomItem; +begin + FReturnClickedItemOnly := ReturnClickedItemOnly; + try + InternalPopup(X, Y, False, PopupControl); + Result := FClickedItem; + finally + FReturnClickedItemOnly := False; + end; +end; + +procedure TSpTBXPopupMenu.SetOnClosePopup(const Value: TNotifyEvent); +begin + TSpTBXRootItem(Items).OnClosePopup := Value; +end; + +procedure TSpTBXPopupMenu.SetOnInitPopup(const Value: TSpTBXPopupEvent); +begin + TSpTBXRootItem(Items).OnInitPopup := Value; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCompoundItemsControl } + +constructor TSpTBXCompoundItemsControl.Create(AOwner: TComponent); +begin + inherited; + + FDock := GetDockClass.Create(Self); + FDock.Parent := Self; + FDock.OnRequestDock := DockRequestDock; + + FToolbar := GetToolbarClass.Create(Self); + FToolbar.CompoundToolbar := True; + FToolbar.Parent := FDock; + FToolbar.CurrentDock := FDock; + FToolbar.Name := Name + 'Toolbar'; + FToolbar.Customizable := False; + FToolbar.BorderStyle := bsNone; + FToolbar.DockMode := dmCannotFloatOrChangeDocks; + FToolbar.DragHandleStyle := dhNone; + FToolbar.Stretch := True; + FToolbar.ShrinkMode := tbsmNone; + FToolbar.ShowCaption := False; + + FSkinType := sknSkin; + SkinManager.AddSkinNotification(Self); +end; + +procedure TSpTBXCompoundItemsControl.CreateParams(var Params: TCreateParams); +begin + // Disable complete redraws when size changes. CS_HREDRAW and CS_VREDRAW + // cause flicker and are not necessary for this control at run time + // Invalidate in WMWindowPosChanged message instead. + inherited CreateParams(Params); + if not (csDesigning in ComponentState) then begin + with Params do + Style := Style or WS_CLIPCHILDREN; + with Params do + WindowClass.Style := WindowClass.Style and not (CS_HREDRAW or CS_VREDRAW); + end; +end; + +destructor TSpTBXCompoundItemsControl.Destroy; +begin + SkinManager.RemoveSkinNotification(Self); + FToolbar.Free; + FDock.Free; + inherited; +end; + +procedure TSpTBXCompoundItemsControl.Loaded; +var + I: Integer; + C: TControl; + DesignerRootItem: TTBCustomItem; +begin + inherited; + + // The parent of TTBControlItem.Control should be the toolbar, not Self + // (as setted in GetChildren for dfm streaming). + DesignerRootItem := GetItems; + for I := 0 to DesignerRootItem.Count - 1 do + if DesignerRootItem[I] is TTBControlItem then begin + C := TTBControlItem(DesignerRootItem[I]).Control; + if Assigned(C) and (C.Parent <> FToolbar) then + C.Parent := FToolbar; + end; +end; + +procedure TSpTBXCompoundItemsControl.DockRequestDock(Sender: TObject; + Bar: TTBCustomDockableWindow; var Accept: Boolean); +begin + if Assigned(FToolbar) then Accept := Bar = FToolbar; +end; + +procedure TSpTBXCompoundItemsControl.GetChildren(Proc: TGetChildProc; + Root: TComponent); +var + I: Integer; + C: TControl; + DesignerRootItem: TTBCustomItem; +begin + // Needed to fake the DFM streaming system because the owner of the items + // is the Form and not the Toolbar nor Self. + // But the parent must be the Toolbar. + // GetChildren is used to pass the children components of Self to the DFM + // streaming system. + // We also need to do the same with the controls of TTBControlItems. + // More info on the Delphi help or Classes.TWriter.WriteData + // Same as TSpTBXCompoundItemsControl and TSpTBXCustomDockablePanel + + DesignerRootItem := GetItems; + TTBCustomItemAccess(DesignerRootItem).GetChildren(Proc, Root); + for I := 0 to DesignerRootItem.Count - 1 do + if (DesignerRootItem[I] is TTBControlItem) then begin + C := TTBControlItem(DesignerRootItem[I]).Control; + if Assigned(C) then + if SpFindControl(Self, C) = -1 then Proc(C); + end; + inherited; +end; + +function TSpTBXCompoundItemsControl.GetItems: TTBCustomItem; +begin + Result := FToolbar.Items; +end; + +function TSpTBXCompoundItemsControl.GetRootItems: TTBRootItem; +begin + Result := FToolbar.Items; +end; + +function TSpTBXCompoundItemsControl.GetDockClass: TSpTBXDockClass; +begin + Result := TSpTBXDock; +end; + +function TSpTBXCompoundItemsControl.GetToolbarClass: TSpTBXToolbarClass; +begin + Result := TSpTBXToolbar; +end; + +function TSpTBXCompoundItemsControl.GetView: TSpTBXToolbarView; +begin + Result := FToolbar.View as TSpTBXToolbarView; +end; + +function TSpTBXCompoundItemsControl.GetImages: TCustomImageList; +begin + if Assigned(FToolbar) then + Result := FToolbar.Images + else + Result := nil; +end; + +procedure TSpTBXCompoundItemsControl.InvalidateBackground(InvalidateChildren: Boolean); +begin + // Invalidate will not fire WM_ERASEBKGND, because csOpaque is setted + if not (csDestroying in ComponentState) and HandleAllocated then + if InvalidateChildren then + RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN) + else + RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE); +end; + +procedure TSpTBXCompoundItemsControl.SetImages(const Value: TCustomImageList); +begin + if Assigned(FToolbar) then FToolbar.Images := Value; +end; + +procedure TSpTBXCompoundItemsControl.SetName(const Value: TComponentName); +begin + inherited; + if Name = Value then + if Assigned(FToolbar) then + FToolbar.Name := Name + 'Toolbar'; +end; + +procedure TSpTBXCompoundItemsControl.SetSkinType(const Value: TSpTBXSkinType); +begin + if FSkinType <> Value then begin + FSkinType := Value; + InvalidateBackground; + end; +end; + +procedure TSpTBXCompoundItemsControl.WMSpSkinChange(var Message: TMessage); +begin + InvalidateBackground; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCompoundBar } + +constructor TSpTBXCompoundBar.Create(AOwner: TComponent); +begin + inherited; + Height := FDock.Height; + FDock.OnDrawBackground := DrawDockBackground; + FDock.OnResize := DockResize; + FToolbar.OnDrawBackground := DrawToolbarBackground; +end; + +procedure TSpTBXCompoundBar.DockResize(Sender: TObject); +begin + if Assigned(FDock) then + if Height <> FDock.Height then + Height := FDock.Height; +end; + +procedure TSpTBXCompoundBar.DoDrawDockBackground(ACanvas: TCanvas; + ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +begin + if Assigned(FOnDrawDockBackground) then FOnDrawDockBackground(Self, ACanvas, ARect, PaintStage, PaintDefault); +end; + +procedure TSpTBXCompoundBar.DrawDockBackground(Sender: TObject; + ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +var + InternalPaintDefault: Boolean; +begin + if PaintStage = pstPrePaint then begin + // OnDrawBackground is triggered by the Dock and by the docked Toolbar. + // The Toolbar triggers it only if Dock.ThemedBackground is true, which depends + // on CurrentTheme.PaintDockBackground, this is done in + // TTBXToolbar.WMEraseBkgnd. + ACanvas.Brush.Color := clBtnFace; + InternalPaintDefault := True; + DoDrawDockBackground(ACanvas, ARect, pstPrePaint, InternalPaintDefault); + PaintDefault := InternalPaintDefault; + InternalPaintDefault := True; + DoDrawDockBackground(ACanvas, ARect, pstPostPaint, InternalPaintDefault); + end; +end; + +procedure TSpTBXCompoundBar.DrawToolbarBackground(Sender: TObject; + ACanvas: TCanvas; ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +begin + // Let the background be painted by the Dock + if PaintStage = pstPrePaint then + PaintDefault := False; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXButtonOptions } + +constructor TSpTBXButtonOptions.Create(AParent: TWinControl); +begin + inherited Create; + + FToolbar := nil; + if AParent is TSpTBXCompoundItemsControl then + FToolbar := TSpTBXCompoundItemsControl(AParent).FToolbar; + FParentControl := AParent; + + FCaption := True; + FClose := True; + FMinimize := True; + FMaximize := True; + FCaptionImageIndex := -1; + FCloseImageIndex := -1; + FMinimizeImageIndex := -1; + FMaximizeImageIndex := -1; + FRestoreImageIndex := -1; + FTitleBarMaxSize := 21; + FButtonBorders := True; + CreateButtons; +end; + +procedure TSpTBXButtonOptions.CreateButtons; +begin + FRightAlignSpacer := TSpTBXRightAlignSpacerItem.Create(nil); + FRightAlignSpacer.FontSettings.Style := FRightAlignSpacer.FontSettings.Style + [fsBold]; + FRightAlignSpacer.Wrapping := twEndEllipsis; + FToolbar.Items.Add(FRightAlignSpacer); + + FEditableItems := TTBGroupItem.Create(nil); + FToolbar.Items.Add(FEditableItems); + + FMinimizeButton := TSpTBXItem.Create(nil); + SetupButton(FMinimizeButton); + FMinimizeButton.Visible := FMinimize; + + FMaximizeButton := TSpTBXItem.Create(nil); + SetupButton(FMaximizeButton); + FMaximizeButton.Visible := FMaximize; + + FCloseButton := TSpTBXItem.Create(nil); + SetupButton(FCloseButton); + FCloseButton.Visible := FClose; + + SetTitleBarMaxSize(FTitleBarMaxSize); +end; + +procedure TSpTBXButtonOptions.MoveItemToTheLeft(B: TTBCustomItem); +var + I: Integer; +begin + I := EditableItems.IndexOf(B); + if I > -1 then begin + EditableItems.Delete(I); + I := FToolbar.Items.IndexOf(RightAlignSpacer); + FToolbar.Items.Insert(I, B); + end; +end; + +procedure TSpTBXButtonOptions.SetupButton(B: TSpTBXCustomItem); +begin + B.CustomWidth := 17; + B.CustomHeight := FTitleBarMaxSize; + B.DisplayMode := nbdmImageAndText; + B.OnDrawImage := ButtonsDrawImage; + B.OnDrawItem := ButtonsDrawItem; + B.OnClick := ButtonsClick; + FToolbar.Items.Add(B); + B.Visible := False; + SetupButtonIcon(B); +end; + +procedure TSpTBXButtonOptions.SetupButtonIcon(B: TSpTBXCustomItem); +var + Index, GlyphIndex: Integer; +begin + if Assigned(B) then begin + Index := -1; + GlyphIndex := -1; + + if B = FRightAlignSpacer then begin + Index := FCaptionImageIndex; + end else + if B = FCloseButton then begin + Index := FCloseImageIndex; + GlyphIndex := 0; + end else + if B = FMaximizeButton then begin + if Restoring(B) then begin + Index := FRestoreImageIndex; + GlyphIndex := 3; + end + else begin + Index := FMaximizeImageIndex; + GlyphIndex := 1; + end; + end else + if B = FMinimizeButton then begin + if Restoring(B) then begin + Index := FRestoreImageIndex; + GlyphIndex := 3; + end + else begin + Index := FMinimizeImageIndex; + GlyphIndex := 2; + end; + end; + + if Index = -1 then begin + B.Images := MDIButtonsImgList; + B.ImageIndex := GlyphIndex; + end + else begin + B.Images := nil; + B.ImageIndex := Index; + end; + end; +end; + +procedure TSpTBXButtonOptions.UpdateButtonsVisibility; +begin + FRightAlignSpacer.Visible := FCaption or FClose or FMaximize or FMinimize; +end; + +procedure TSpTBXButtonOptions.ButtonsDrawImage(Sender: TObject; + ACanvas: TCanvas; State: TSpTBXSkinStatesType; + const PaintStage: TSpTBXPaintStage; var AImageList: TCustomImageList; + var AImageIndex: Integer; var ARect: TRect; var PaintDefault: Boolean); +begin + // Empty, useful for descendants +end; + +procedure TSpTBXButtonOptions.ButtonsDrawItem(Sender: TObject; ACanvas: TCanvas; + ARect: TRect; ItemInfo: TSpTBXMenuItemInfo; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +begin + // [Theme-Change] + // Don't draw the items background if ButtonBorders is False + if (PaintStage = pstPrePaint) and not ButtonBorders then + PaintDefault := False; +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; + +procedure TSpTBXStatusToolbar.DoItemNotification(Ancestor: TTBCustomItem; + Relayed: Boolean; Action: TTBItemChangedAction; Index: Integer; + Item: TTBCustomItem); +begin + inherited; + + if not (csDestroying in ComponentState) and not (csReading in ComponentState) and + not (tstResizing in FState) and not IsItemMoving then + begin + if (Action = tbicInvalidateAndResize) and Assigned(Owner) and (Owner is TSpTBXCustomStatusBar) then + if NeedsSeparatorRepaint then + TSpTBXCustomStatusBar(Owner).InvalidateBackground; + end; +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 Assigned(Owner) and (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); + if OfficeSeparators then + DrawSeparators(ACanvas, ARect); + end; +end; + +procedure TSpTBXCustomStatusBar.DrawSeparators(ACanvas: TCanvas; ARect: TRect); +// Draws Office separators when the skin has OfficeStatusBar set to true +var + I: Integer; + IV: TTBItemViewer; + R: TRect; + SaveIndex: Integer; +begin + SaveIndex := SaveDC(ACanvas.Handle); + 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; + if IsRectEmpty(R) then + Continue; + + OffsetRect(R, ARect.Left + 2, ARect.Top + 2); + R.Top := ARect.Top; + R.Bottom := ARect.Bottom; + R.Left := ((R.Right + R.Left) div 2) - 2; + R.Right := R.Left + 3; + + if SpTBXSkinType(FSkinType) = sknNone then begin + ACanvas.Brush.Color := clBtnFace; + ACanvas.FillRect(R); + 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); + ExcludeClipRect(ACanvas.Handle, R.Left, R.Top, R.Right, R.Bottom); + end; + end; + end; + + if SpTBXSkinType(FSkinType) = sknSkin then begin + Inc(ARect.Top); + ACanvas.Brush.Color := clWindow; + ACanvas.FrameRect(ARect); + end; + finally + RestoreDC(ACanvas.Handle, SaveIndex); + end; +end; + +function TSpTBXCustomStatusBar.GetStatusToolbar: TSpTBXStatusToolbar; +begin + Result := FToolbar as TSpTBXStatusToolbar; +end; + +function TSpTBXCustomStatusBar.GetToolbarClass: TSpTBXToolbarClass; +begin + Result := TSpTBXStatusToolbar; +end; + +function TSpTBXCustomStatusBar.GetSizeGrip: Boolean; +begin + Result := Toolbar.SizeGrip; +end; + +procedure TSpTBXCustomStatusBar.SetSizeGrip(const Value: Boolean); +begin + Toolbar.SizeGrip := Value; +end; + +procedure TSpTBXCustomStatusBar.WMEraseBkgnd(var Message: TWMEraseBkgnd); +begin + Message.Result := 1; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXTitleToolbar } + +function TSpTBXTitleToolbar.GetItemsTextColor(State: TSpTBXSkinStatesType): TColor; +begin + Result := CurrentSkin.GetTextColor(skncWindowTitleBar, State); +end; + +function TSpTBXTitleToolbar.GetRightAlignMargin: Integer; +var + TitleBar: TSpTBXCustomTitleBar; +begin + Result := inherited GetRightAlignMargin; + + TitleBar := GetTitleBar; + if Assigned(TitleBar) and (TitleBar.WindowState = wsMaximized) then + Result := 0; +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; + +procedure TSpTBXTitleToolbar.WMNCCalcSize(var Message: TWMNCCalcSize); +var + TitleBar: TSpTBXCustomTitleBar; +begin + inherited; + + FDefaultToolbarBorderSize := CDefaultToolbarBorderSize; + if Docked then begin + TitleBar := GetTitleBar; + if Assigned(TitleBar) and (TitleBar.WindowState = wsMaximized) then begin + InflateRect(Message.CalcSize_Params.rgrc[0], 2, 2); + FDefaultToolbarBorderSize := 0; + end; + end; +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; + + // [Theme-Change] + // Don't draw the items background if ButtonBorders is False or Default theme is used + if (PaintStage = pstPrePaint) and (not ButtonBorders or SkinManager.IsDefaultSkin) then + PaintDefault := False; +end; + +procedure TSpTBXTitleBarButtonOptions.ButtonsClick(Sender: TObject); +begin + if not Assigned(FTitleBar.FParentForm) or not FTitleBar.IsActive then Exit; + + if Sender = FSystemButton then + FSystemButton.ShowSize := not FTitleBar.FixedSize + else + if Sender = FMinimizeButton then + FTitleBar.WindowState := wsMinimized + else + if Sender = FCloseButton then + FTitleBar.FParentForm.Close + else + if Sender = FMaximizeButton then begin + if FTitleBar.WindowState = wsNormal then + FTitleBar.WindowState := wsMaximized + else + FTitleBar.WindowState := wsNormal; + end; +end; + +function TSpTBXTitleBarButtonOptions.Restoring(B: TSpTBXCustomItem): Boolean; +begin + Result := False; + if (B = MaximizeButton) and (FTitleBar.WindowState = wsMaximized) then Result := True; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomTitleBar } + +constructor TSpTBXCustomTitleBar.Create(AOwner: TComponent); +begin + inherited; + + FActive := True; + FMouseActive := True; + ControlStyle := ControlStyle + [csAcceptsControls]; + + Align := alClient; + FDock.OnResize := nil; + + FParentForm := GetParentForm(Self); + FOptions := TSpTBXTitleBarButtonOptions.Create(Self); + FOptions.CaptionLabel := Caption; +end; + +destructor TSpTBXCustomTitleBar.Destroy; +begin + ChangeTitleBarState(False); + FOptions.Free; + + if Assigned(FParentForm) and Assigned(FOldParentFormWndProc) then begin + FParentForm.WindowProc := FOldParentFormWndProc; + FOldParentFormWndProc := nil; + end; + + if Assigned(Application) and Assigned(FNewAppWndProc) then begin + SetWindowLong(Application.Handle, GWL_WNDPROC, Longint(FOldAppWndProc)); + Classes.FreeObjectInstance(FNewAppWndProc); + FNewAppWndProc := nil; + end; + + inherited; +end; + +procedure TSpTBXCustomTitleBar.Loaded; +begin + inherited; + + // Subclass the ParentForm and Application for the System menu handling + if not (csDesigning in ComponentState) then begin + FParentForm := GetParentForm(Self); + // Hook the ParentForm + if Assigned(FParentForm) then begin + FOldParentFormWndProc := FParentForm.WindowProc; + FParentForm.WindowProc := NewParentFormWndProc; + end; + + // Hook the Application to trap the $0313 message, more info on AppWndProc + if not (csDesigning in ComponentState) and (Application.Handle <> 0) and + (Application.MainForm = nil) and (FOldAppWndProc = nil) then + begin + // When Application.MainForm asume FParentForm as the MainForm + FOldAppWndProc := Pointer(GetWindowLong(Application.Handle, GWL_WNDPROC)); + FNewAppWndProc := Classes.MakeObjectInstance(AppWndProc); + SetWindowLong(Application.Handle, GWL_WNDPROC, Longint(FNewAppWndProc)); + end; + + ChangeTitleBarState(Active); + end; +end; + +procedure TSpTBXCustomTitleBar.UpdateSkinMetrics; +begin + if HandleAllocated then begin + // Update the NC area size, CurrentSkin.FloatingWindowBorderSize could have changed + // Make sure to realign the toolbars + SpRecalcNCArea(Self); + Realign; + end; +end; + +procedure TSpTBXCustomTitleBar.AppWndProc(var Msg: TMessage); +var + SystemButtonP: TPoint; +begin + // Handle undocumented $0313 message, this is sent when the + // taskbar button of the application is right clicked. + // When Application.MainFormOnTaskbar = True (Delphi 2007 and above) + // the message is sent to the Main Form, otherwise it is sent + // to the Application. + // More info: + // http://delphi.about.com/od/vclwriteenhance/a/ttaskbarmenu.htm + if (Msg.Msg = $0313) and Assigned(FParentForm) and Assigned(Options) then begin + GetCursorPos(SystemButtonP); + FOptions.SystemButton.Popup(SystemButtonP.X, SystemButtonP.Y, True); + end + else + if Assigned(FOldAppWndProc) then + Msg.Result := CallWindowProc(FOldAppWndProc, Application.Handle, Msg.Msg, Msg.wParam, Msg.lParam); +end; + +procedure TSpTBXCustomTitleBar.NewParentFormWndProc(var Message: TMessage); +var + M: TWMSysCommand; + I: Integer; + HandleSpaceKey: Boolean; + + MMI: ^TMinMaxInfo; + MonitorBounds, WorkArea, TaskBarBounds: TRect; + TaskBarState, TaskBarEdge: Cardinal; + SystemButtonIV: TTBItemViewer; + SystemButtonP: TPoint; +begin + if not Assigned(FParentForm) then Exit; + + case Message.Msg of + $0313: + begin + // Handle undocumented $0313 message, this is sent when the + // taskbar button of the application is right clicked. + // When Application.MainFormOnTaskbar = True (Delphi 2007 and above) + // the message is sent to the Main Form, otherwise it is sent + // to the Application. + // More info: + // http://delphi.about.com/od/vclwriteenhance/a/ttaskbarmenu.htm + GetCursorPos(SystemButtonP); + FOptions.SystemButton.Popup(SystemButtonP.X, SystemButtonP.Y, True); + Exit; + end; + WM_GETMINMAXINFO: + if IsActive and not FFullScreenMaximize then begin + MMI := Pointer(Message.lParam); + WorkArea := GetRectOfMonitorContainingWindow(Handle, True); + MonitorBounds := GetRectOfMonitorContainingWindow(Handle, False); + + // Calculate the Max position and size + // http://news.jrsoftware.org/news/toolbar2000.thirdparty/msg13127.html + MMI^.ptMaxPosition.X := WorkArea.Left - MonitorBounds.Left; + MMI^.ptMaxPosition.Y := WorkArea.Top - MonitorBounds.Top; + MMI^.ptMaxSize.X := WorkArea.Right - WorkArea.Left; + MMI^.ptMaxSize.Y := WorkArea.Bottom - WorkArea.Top; + + // Reduce the Max Size if the TaskBar is AutoHidden + if SpGetTaskBar(TaskBarState, TaskBarEdge, TaskBarBounds) then begin + if (TaskBarState and ABS_AUTOHIDE) = ABS_AUTOHIDE then + case TaskBarEdge of + ABE_LEFT, ABE_RIGHT: MMI^.ptMaxSize.X := MMI^.ptMaxSize.X - 2; + ABE_TOP, ABE_BOTTOM: MMI^.ptMaxSize.Y := MMI^.ptMaxSize.Y - 2; + end; + end; + + // Max size during window resize, change the ParentForm constraints + // to make it work + if WindowState = wsMaximized then begin + MMI^.ptMaxTrackSize.X := MMI^.ptMaxSize.X; + MMI^.ptMaxTrackSize.Y := MMI^.ptMaxSize.Y; + FParentForm.Constraints.MaxWidth := MMI^.ptMaxSize.X; + FParentForm.Constraints.MaxHeight := MMI^.ptMaxSize.Y; + end + else begin + FParentForm.Constraints.MaxWidth := 0; + FParentForm.Constraints.MaxHeight := 0; + end; + + Message.Result := 0; + end; + WM_SYSCOMMAND: + if IsActive and Options.SystemMenu then begin + 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 + HandleSpaceKey := True; + if Assigned(FParentForm.Menu) then + HandleSpaceKey := False + else + if Toolbar.MenuBar then + HandleSpaceKey := False + else + for I := 0 to FParentForm.ComponentCount - 1 do + if FParentForm.Components[I] is TTBCustomToolbar then + if TTBCustomToolbar(FParentForm.Components[I]).MenuBar then begin + HandleSpaceKey := False; + Break; + end; + if HandleSpaceKey then begin + Message.Result := 1; + Exit; + end; + end; + end; + end; + end; + + // Default processing + if Assigned(FOldParentFormWndProc) then + FOldParentFormWndProc(Message); +end; + +procedure TSpTBXCustomTitleBar.ChangeTitleBarState(Activate: Boolean); +var + FloatingBorderSize: TPoint; + Style: Integer; + RestoreR: TRect; + WState: TWindowState; + OnParentFormShow: TNotifyEvent; +begin + FParentForm := GetParentForm(Self); + if Assigned(FParentForm) and (FParentForm.HandleAllocated) and ([csDesigning, csDestroying] * FParentForm.ComponentState = []) then begin + + if FMouseActive then begin + FloatingBorderSize := GetFloatingBorderSize; + + // Changing the BorderStyle of the form will recreate it, + // causing it to call Form.OnShow everytime Active is changed + // We need to disable the OnShow calling. + OnParentFormShow := TCustomFormAccess(FParentForm).OnShow; + TCustomFormAccess(FParentForm).OnShow := nil; + try + WState := SpGetFormWindowState(FParentForm, RestoreR); + + if Activate then begin + // Remove the border and titlebar from the form, and add the sysmenu + FParentForm.BorderStyle := bsNone; + Style := GetWindowLong(FParentForm.Handle, GWL_STYLE); + Style := Style or WS_SYSMENU; + SetWindowLong(FParentForm.Handle, GWL_STYLE, Style); + + // Resize the form to retain the same size before it was activated. + // This is needed to keep the designtime size + if (WState <> wsMaximized) and (TCustomFormAccess(FParentForm).FormStyle <> fsMDIChild) then begin + FParentForm.Height := FParentForm.Height - GetSystemMetrics(SM_CYCAPTION) - (FloatingBorderSize.Y * 2); + FParentForm.Width := FParentForm.Width - (FloatingBorderSize.X * 2); + end; + end + else begin + FParentForm.BorderStyle := bsSizeable; + + // Resize the form to retain the same size before it was deactivated. + // This is needed to keep the designtime size + if (WState <> wsMaximized) and (TCustomFormAccess(FParentForm).FormStyle <> fsMDIChild) then begin + FParentForm.Height := FParentForm.Height + GetSystemMetrics(SM_CYCAPTION) + (FloatingBorderSize.Y * 2); + FParentForm.Width := FParentForm.Width + (FloatingBorderSize.X * 2); + end; + end; + + // When Active is changed the Form is recreated, we have to + // reset the Restore size if the form is currently Maximized. + if WState = wsMaximized then + SpSetFormWindowState(FParentForm, WState, RestoreR); + + InvalidateBackground; + finally + TCustomFormAccess(FParentForm).OnShow := OnParentFormShow; + end; + end; + + FDock.Visible := FActive; + end; +end; + +procedure TSpTBXCustomTitleBar.AdjustClientRect(var Rect: TRect); +begin + inherited AdjustClientRect(Rect); + Rect := GetClientAreaRect; +end; + +procedure TSpTBXCustomTitleBar.DoDrawDockBackground(ACanvas: TCanvas; + ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +var + FloatingBorderSize: TPoint; +begin + inherited DoDrawDockBackground(ACanvas, ARect, PaintStage, PaintDefault); + if (PaintStage = pstPrePaint) and PaintDefault then begin + PaintDefault := False; + + // [Theme-Change] + // On WindowsXP make sure we paint the titlebar on the NC area + // TSpTBXCustomTitleBar.WMEraseBkgnd and TSpTBXCustomTitleBar.DoDrawDockBackground handles this issue + if SkinManager.GetSkinType = sknWindows then begin + FloatingBorderSize := GetFloatingBorderSize; + InflateRect(ARect, FloatingBorderSize.X, FloatingBorderSize.Y); + end; + + SpDrawXPTitleBar(ACanvas, ARect, True); + end; +end; + +procedure TSpTBXCustomTitleBar.DoDrawBackground(ACanvas: TCanvas; ARect: TRect; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + if Assigned(FOnDrawBackground) then FOnDrawBackground(Self, ACanvas, ARect, PaintStage, PaintDefault); +end; + +function TSpTBXCustomTitleBar.GetClientAreaRect: TRect; +var + FloatingBorderSize: TPoint; +begin + Result := ClientRect; + if Active then begin + FloatingBorderSize := GetFloatingBorderSize; + if Assigned(FParentForm) then begin + if not FMouseActive or (FParentForm.WindowState <> wsMaximized) then + InflateRect(Result, -FloatingBorderSize.X, -FloatingBorderSize.Y); + end + else + InflateRect(Result, -FloatingBorderSize.X, -FloatingBorderSize.Y); + end; +end; + +function TSpTBXCustomTitleBar.GetFloatingBorderSize: TPoint; +begin + if SkinManager.GetSkinType = sknSkin then + Result := Point(CurrentSkin.FloatingWindowBorderSize, CurrentSkin.FloatingWindowBorderSize) + else begin + Result.X := GetSystemMetrics(SM_CXFRAME); + Result.Y := GetSystemMetrics(SM_CYFRAME); + end +end; + +function TSpTBXCustomTitleBar.GetItems: TTBCustomItem; +begin + // The ToolbarEditor designer will open the editable items and + // not the Toolbar.Items + Result := Options.EditableItems; +end; + +procedure TSpTBXCustomTitleBar.GetSizeCursor(MousePos: TPoint; var SizeCursor, + SizeCode: Integer); +var + R: TRect; + Pt, FloatingBorderSize: TPoint; +const + SC_SizeLeft = $F001; + SC_SizeRight = $F002; + SC_SizeUp = $F003; + SC_SizeUpLeft = $F004; + SC_SizeUpRight = $F005; + SC_SizeDown = $F006; + SC_SizeDownLeft = $F007; + SC_SizeDownRight = $F008; +begin + SizeCursor := 0; + SizeCode := 0; + + if not IsActive or (Assigned(FParentForm) and (FParentForm.WindowState = wsMaximized)) then Exit; + + R := ClientRect; + FloatingBorderSize := GetFloatingBorderSize; + InflateRect(R, -FloatingBorderSize.X, -FloatingBorderSize.Y); + Pt := MousePos; + if not PtInRect(R, Pt) then begin + if (Pt.X < 10) and (Pt.Y < 10) then SizeCode := SC_SizeUpLeft + else if (Pt.X > Width - 10) and (Pt.Y < 10) then SizeCode := SC_SizeUpRight + else if (Pt.X < 10) and (Pt.Y > Height - 10) then SizeCode := SC_SizeDownLeft + else if (Pt.X > Width - 10) and (Pt.Y > Height - 10) then SizeCode := SC_SizeDownRight + else if (Pt.X > 10) and (Pt.X < Width - 10) and (Pt.Y < 10) then SizeCode := SC_SizeUp + else if (Pt.X > 10) and (Pt.X < Width - 10) and (Pt.Y > Height - 10) then SizeCode := SC_SizeDown + else if (Pt.Y > 10) and (Pt.Y < Height - 10) and (Pt.X < 10) then SizeCode := SC_SizeLeft + else if (Pt.Y > 10) and (Pt.Y < Height - 10) and (Pt.X > Width - 10) then SizeCode := SC_SizeRight; + + case SizeCode of + SC_SizeLeft, SC_SizeRight: SizeCursor := -9; + SC_SizeUp, SC_SizeDown: SizeCursor := -7; + SC_SizeUpLeft, SC_SizeDownRight: SizeCursor := -8; + SC_SizeDownLeft, SC_SizeUpRight: SizeCursor := -6; + end; + end +end; + +function TSpTBXCustomTitleBar.GetToolbarClass: TSpTBXToolbarClass; +begin + Result := TSpTBXTitleToolbar; +end; + +function TSpTBXCustomTitleBar.GetWindowState: TWindowState; +begin + if Assigned(FParentForm) then + Result := FParentForm.WindowState + else + Result := wsNormal; +end; + +function TSpTBXCustomTitleBar.IsActive: Boolean; +begin + Result := FActive and FMouseActive; +end; + +procedure TSpTBXCustomTitleBar.MouseDown(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +var + Pt: TPoint; + SizeCursor, SizeCode: Integer; +begin + inherited; + if not FixedSize and (Button = mbLeft) then begin + Pt := Point(X, Y); + GetSizeCursor(Pt, SizeCursor, SizeCode); + if (SizeCode > 0) and Assigned(FParentForm) then begin + ReleaseCapture; + FParentForm.Perform(WM_SYSCOMMAND, SizeCode, 0); + end; + end; +end; + +procedure TSpTBXCustomTitleBar.SetActive(const Value: Boolean); +begin + if FActive <> Value then begin + FActive := Value; + ChangeTitleBarState(Value); + end; +end; + +procedure TSpTBXCustomTitleBar.SetFullScreenMaximize(const Value: Boolean); +begin + if FFullScreenMaximize <> Value then begin + FFullScreenMaximize := Value; + if IsActive and Assigned(FParentForm) and FParentForm.HandleAllocated then begin + FParentForm.Constraints.MaxWidth := 0; + FParentForm.Constraints.MaxHeight := 0; + if (WindowState = wsMaximized) and not (csDesigning in ComponentState) then + TCustomFormAccess(FParentForm).RecreateWnd; + end; + end; +end; + +procedure TSpTBXCustomTitleBar.SetMouseActive(const Value: Boolean); +begin + if FMouseActive <> Value then begin + FMouseActive := Value; + ChangeTitleBarState(Value); + end; +end; + +procedure TSpTBXCustomTitleBar.SetWindowState(const Value: TWindowState); +begin + if Assigned(FParentForm) then begin + case Value of + wsMinimized: + begin + // WindowState := wsMinimized will not minimize the app correctly + SendMessage(FParentForm.Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0); + end; + wsMaximized, wsNormal: + FParentForm.WindowState := Value; + end; + end; +end; + +procedure TSpTBXCustomTitleBar.WMSpSkinChange(var Message: TMessage); +begin + UpdateSkinMetrics; + inherited; +end; + +procedure TSpTBXCustomTitleBar.CMTextChanged(var Message: TMessage); +begin + inherited; + if Assigned(FOptions) then + FOptions.CaptionLabel := Caption; +end; + +procedure TSpTBXCustomTitleBar.WMEraseBkgnd(var Message: TMessage); +var + ARect, DockAreaR: TRect; + FloatingBorderSize: TPoint; + Maximized, PaintDefault: Boolean; + B: TBitmap; +begin + Message.Result := 1; + if not DoubleBuffered or (Message.wParam = Message.lParam) then begin + B := TBitmap.Create; + try + ARect := GetClientRect; + B.Width := ARect.Right; + B.Height := ARect.Bottom; + B.Canvas.Brush.Color := Color; // SpDrawXPTitleBarBody needs it to paint the background + B.Canvas.FillRect(ARect); + + PaintDefault := True; + DoDrawBackground(B.Canvas, ARect, pstPrePaint, PaintDefault); + if PaintDefault then begin + Maximized := (WindowState = wsMaximized) and FMouseActive; + if Maximized then + InflateRect(ARect, 4, 4); + if Active then begin + FloatingBorderSize := GetFloatingBorderSize; + SpDrawXPTitleBarBody(B.Canvas, ARect, True, FloatingBorderSize); + + // [Theme-Change] + // On WindowsXP make sure we paint the titlebar on the NC area + // TSpTBXCustomTitleBar.WMEraseBkgnd and TSpTBXCustomTitleBar.DoDrawDockBackground handles this issue + if Assigned(FDock) and not Maximized and (SkinManager.GetSkinType = sknWindows) then begin + DockAreaR := ARect; + DockAreaR.Bottom := FDock.Height + FloatingBorderSize.Y; // don't multiply by 2 + SpDrawXPTitleBar(B.Canvas, DockAreaR, True); + end; + end; + end; + + PaintDefault := True; + DoDrawBackground(B.Canvas, ARect, pstPostPaint, PaintDefault); + + BitBlt(TWMEraseBkgnd(Message).DC, 0, 0, B.Width, B.Height, B.Canvas.Handle, 0, 0, SRCCOPY); + finally + B.Free; + end; + end; +end; + +procedure TSpTBXCustomTitleBar.WMSetCursor(var Message: TWMSetCursor); +var + P: TPoint; + SizeCursor, SizeCode: Integer; +begin + if not FixedSize and not (csDesigning in ComponentState) and + (Message.CursorWnd = Handle) and (Screen.Cursor = crDefault) then + begin + GetCursorPos(P); + P := ScreenToClient(P); + GetSizeCursor(P, SizeCursor, SizeCode); + if SizeCursor <> 0 then begin + Windows.SetCursor(Screen.Cursors[SizeCursor]); + Message.Result := 1; + end + else + inherited; + end + else + inherited; +end; + +procedure TSpTBXCustomTitleBar.WMWindowPosChanged(var Message: TWMWindowPosChanged); +begin + inherited; + InvalidateBackground(False); + if [csDesigning, csDestroying] * ComponentState = [] then begin + if FOptions.Maximize then + FOptions.SetupButtonIcon(FOptions.MaximizeButton); + // Hide the Toolbar if the Form is a MDI child and it's maximized + if Assigned(FParentForm) and (FParentForm.HandleAllocated) then begin + if (TCustomFormAccess(FParentForm).FormStyle = fsMDIChild) then + FDock.Visible := FParentForm.WindowState <> wsMaximized; + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TBitmapHint } + +procedure TBitmapHint.ActivateHint(Rect: TRect; const AHint: string); +var + SaveActivating: Boolean; + // Detect Delphi 7 + {$IF CompilerVersion < 17} + MonitorR: TRect; + Delta: TPoint; + {$IFEND} +begin + // [Bugfix] Delphi 7 bug, D7 hints doesn't support multi-monitors + {$IF CompilerVersion < 17} + MonitorR := GetRectOfMonitorContainingPoint(Point(Rect.Left, Rect.Top), True); + Delta := Point(0, 0); + if (Rect.Left < MonitorR.Right) and (Rect.Right > MonitorR.Right) then + Delta.X := - (Rect.Right - MonitorR.Right); + if (Rect.Top < MonitorR.Bottom) and (Rect.Bottom > MonitorR.Bottom) then + Delta.Y := - (Rect.Bottom - MonitorR.Bottom); + OffsetRect(Rect, Delta.X, Delta.Y); + {$IFEND} + + SaveActivating := FActivating; + try + FActivating := True; + inherited ActivateHint(Rect, AHint); + finally + FActivating := SaveActivating; + end; +end; + +procedure TBitmapHint.ActivateHintData(Rect: TRect; const AHint: string; AData: Pointer); +begin + //The AData parameter is a bitmap + FHintBitmap := TBitmap(AData); + Rect.Right := Rect.Left + FHintBitmap.Width - 2; + Rect.Bottom := Rect.Top + FHintBitmap.Height - 2; + inherited ActivateHintData(Rect, AHint, AData); +end; + +procedure TBitmapHint.CMTextChanged(var Message: TMessage); +begin + Message.Result := 1; +end; + +procedure TBitmapHint.Paint; +begin + if Assigned(FHintBitmap) then + Canvas.Draw(0, 0, FHintBitmap); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Stock Objects } + +procedure InitializeStock; +var + NonClientMetrics: TNonClientMetrics; +begin + // Small caption font + SmCaptionFont := TFont.Create; + NonClientMetrics.cbSize := SizeOf(NonClientMetrics); + if SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @NonClientMetrics, 0) then + SmCaptionFont.Handle := CreateFontIndirect(NonClientMetrics.lfSmCaptionFont); + + SpStockHintBitmap := TBitmap.Create; + + Screen.Cursors[crSpTBXNewHandPoint] := LoadCursor(0, IDC_HAND); + Screen.Cursors[crSpTBXCustomization] := LoadCursor(HInstance, 'CZMOVE'); + Screen.Cursors[crSpTBXCustomizationCancel] := LoadCursor(HInstance, 'CZCANCEL'); + + // Dummy ImageList, used by TSpTBXItemViewer and TSpTBXButtonOptions + MDIButtonsImgList := TImageList.Create(nil); +end; + +procedure FinalizeStock; +begin + FreeAndNil(SmCaptionFont); + FreeAndNil(SpStockHintBitmap); + FreeAndNil(MDIButtonsImgList); +end; + +initialization + InitializeStock; + +finalization + FinalizeStock; + +end. diff --git a/internal/2.4.4/1/Source/SpTBXMDIMRU.pas b/internal/2.4.4/1/Source/SpTBXMDIMRU.pas new file mode 100644 index 0000000..6fa3154 --- /dev/null +++ b/internal/2.4.4/1/Source/SpTBXMDIMRU.pas @@ -0,0 +1,794 @@ +unit SpTBXMDIMRU; + +{============================================================================== +Version 2.4.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: +2 December 2009 - version 2.4.4 + - No changes. + +13 September 2009 - version 2.4.3 + - Fixed TSpTBXMRUListItem.LoadFromIni/SaveToIni bug, in Delphi + 2009, some strings are not stored correctly (Surrogate Pair), + thanks to Totonica for reporting this. + - Fixed incorrect TSpTBXMDIHandler MDI buttons painting when + using the default Windows theme, thanks to Cybrus for + reporting this. + +8 May 2009 - version 2.4.2 + - Fixed incorrect MRU saving on TSpTBXMRUListItem, the + items were not correctly encoded when saving to an Ini + file, thanks to Dirk for reporting this. + +15 March 2009 - version 2.4.1 + - No changes. + +17 January 2009 - version 2.4 + - Added GetMRUFilenames and MRUClick methods to + TSpTBXMRUListItem. + - Added Hints to the items of TSpTBXMRUListItem. + +26 September 2008 - version 2.3 + - No changes. + +29 July 2008 - version 2.2 + - No changes. + +26 June 2008 - version 2.1 + - No changes. + +3 May 2008 - version 2.0 + - No changes. + +2 April 2008 - version 1.9.5 + - Fixed incorrect MRU loading on TSpTBXMRUListItem, thanks + to Pete for reporting this. + - Fixed incorrect TSpTBXMRUListItem behavior, MaxItems + had no effect when new files were added, thanks to + Senfore for reporting this. + +3 February 2008 - version 1.9.4 + - Added HidePathExtension property to TSpTBXMRUListItem. + +19 January 2008 - version 1.9.3 + - Initial release. + +==============================================================================} + +interface + +{$BOOLEVAL OFF} // Unit depends on short-circuit boolean evaluation + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + Menus, ImgList, 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 DrawItem(Sender: TObject; ACanvas: TCanvas; + ARect: TRect; ItemInfo: TSpTBXMenuItemInfo; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); + procedure DrawItemImage(Sender: TObject; ACanvas: TCanvas; + State: TSpTBXSkinStatesType; const PaintStage: TSpTBXPaintStage; + var AImageList: TCustomImageList; var AImageIndex: Integer; + var ARect: TRect; var PaintDefault: Boolean); + 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 + Themes, UxTheme, + {$IFNDEF UNICODE} TntSysUtils, {$ENDIF} + TB2Common, TB2Consts; + +type + TTBCustomToolbarAccess = class(TTBCustomToolbar); + TTBCustomItemAccess = class(TTBCustomItem); + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXMDIHandler } + +constructor TSpTBXMDIHandler.Create(AOwner: TComponent); +begin + inherited; + FSystemMenuItem := TSpTBXSystemMenuItem.Create(Self); + FSystemMenuItem.MDISystemMenu := True; + FButtonsItem := TSpTBXMDIButtonsItem.Create(Self); +end; + +destructor TSpTBXMDIHandler.Destroy; +begin + SetToolbar(nil); + inherited; +end; + +procedure TSpTBXMDIHandler.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited; + if (AComponent = FToolbar) and (Operation = opRemove) then + Toolbar := nil; +end; + +procedure TSpTBXMDIHandler.SetToolbar(Value: TTBCustomToolbar); +var + Rebuild: Boolean; +begin + if FToolbar <> Value then begin + if Assigned(FToolbar) then begin + Rebuild := False; + if TTBCustomToolbarAccess(FToolbar).FMDIButtonsItem = FButtonsItem then begin + TTBCustomToolbarAccess(FToolbar).FMDIButtonsItem := nil; + Rebuild := True; + end; + if TTBCustomToolbarAccess(FToolbar).FMDISystemMenuItem = FSystemMenuItem then begin + TTBCustomToolbarAccess(FToolbar).FMDISystemMenuItem := nil; + Rebuild := True; + end; + if Rebuild and Assigned(FToolbar.View) then + FToolbar.View.RecreateAllViewers; + end; + FToolbar := Value; + if Assigned(Value) then begin + Value.FreeNotification(Self); + TTBCustomToolbarAccess(Value).FMDIButtonsItem := FButtonsItem; + TTBCustomToolbarAccess(Value).FMDISystemMenuItem := FSystemMenuItem; + Value.View.RecreateAllViewers; + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXMDIButtonsItem } + +var + CBTHookHandle: HHOOK; + MDIButtonsItems: TList; + +function WindowIsMDIChild(W: HWND): Boolean; +var + I: Integer; + MainForm, ChildForm: TForm; +begin + MainForm := Application.MainForm; + if Assigned(MainForm) then + for I := 0 to MainForm.MDIChildCount-1 do begin + ChildForm := MainForm.MDIChildren[I]; + if ChildForm.HandleAllocated and (ChildForm.Handle = W) then begin + Result := True; + Exit; + end; + end; + Result := False; +end; + +function CBTHook(Code: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; +stdcall; +var + Maximizing: Boolean; + WindowPlacement: TWindowPlacement; + I: Integer; +begin + case Code of + HCBT_SETFOCUS: begin + if WindowIsMDIChild(HWND(WParam)) and Assigned(MDIButtonsItems) then begin + for I := 0 to MDIButtonsItems.Count-1 do + TSpTBXMDIButtonsItem(MDIButtonsItems[I]).InvalidateSystemMenuItem; + end; + end; + HCBT_MINMAX: begin + if WindowIsMDIChild(HWND(WParam)) and Assigned(MDIButtonsItems) and + (LParam in [SW_SHOWNORMAL, SW_SHOWMAXIMIZED, SW_MINIMIZE, SW_RESTORE]) then begin + Maximizing := (LParam = SW_MAXIMIZE); + if (LParam = SW_RESTORE) and not IsZoomed(HWND(WParam)) then begin + WindowPlacement.length := SizeOf(WindowPlacement); + GetWindowPlacement(HWND(WParam), @WindowPlacement); + Maximizing := (WindowPlacement.flags and WPF_RESTORETOMAXIMIZED <> 0); + end; + for I := 0 to MDIButtonsItems.Count-1 do + TSpTBXMDIButtonsItem(MDIButtonsItems[I]).UpdateState(HWND(WParam), Maximizing); + end; + end; + HCBT_DESTROYWND: begin + if WindowIsMDIChild(HWND(WParam)) and Assigned(MDIButtonsItems) then begin + for I := 0 to MDIButtonsItems.Count-1 do + TSpTBXMDIButtonsItem(MDIButtonsItems[I]).UpdateState(HWND(WParam), False); + end; + end; + end; + Result := CallNextHookEx(CBTHookHandle, Code, WParam, LParam); +end; + +constructor TSpTBXMDIButtonsItem.Create(AOwner: TComponent); + + function CreateItem(ImageIndex: Integer): TSpTBXItem; + var + A: TTBCustomItemAccess; + begin + Result := TSpTBXItem.Create(Self); + A := TTBCustomItemAccess(Result); + A.ItemStyle := A.ItemStyle + [tbisRightAlign]; + Result.Images := MDIButtonsImgList; + Result.ImageIndex := ImageIndex; + Result.CustomWidth := 17; + Result.OnClick := ItemClick; + Result.OnDrawItem := DrawItem; + Result.OnDrawImage := DrawItemImage; + 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.DrawItem(Sender: TObject; ACanvas: TCanvas; + ARect: TRect; ItemInfo: TSpTBXMenuItemInfo; + const PaintStage: TSpTBXPaintStage; var PaintDefault: Boolean); +begin + // [Theme-Change] + // Don't draw the items background if the Default theme is used + if (PaintStage = pstPrePaint) and SkinManager.IsDefaultSkin then + PaintDefault := False; +end; + +procedure TSpTBXMDIButtonsItem.DrawItemImage(Sender: TObject; ACanvas: TCanvas; + State: TSpTBXSkinStatesType; const PaintStage: TSpTBXPaintStage; + var AImageList: TCustomImageList; var AImageIndex: Integer; var ARect: TRect; + var PaintDefault: Boolean); +const + ButtonIndexFlags: array[0..3] of Integer = (DFCS_CAPTIONCLOSE, DFCS_CAPTIONMAX, DFCS_CAPTIONMIN, DFCS_CAPTIONRESTORE); + NoneFlags: array[TSpTBXSkinStatesType] of Integer = (0, DFCS_INACTIVE, 0, DFCS_PUSHED, DFCS_PUSHED, DFCS_PUSHED); + XPPart: array [0..3] of Integer = (WP_MDICLOSEBUTTON, WP_MAXBUTTON, WP_MDIMINBUTTON, WP_MDIRESTOREBUTTON); + XPFlags: array[TSpTBXSkinStatesType] of Integer = (CBS_NORMAL, CBS_DISABLED, CBS_HOT, CBS_PUSHED, CBS_PUSHED, CBS_PUSHED); +begin + if (PaintStage = pstPrePaint) and (AImageList = MDIButtonsImgList) and + (AImageIndex >= 0) and (AImageIndex <= 3) then + begin + case SkinManager.GetSkinType of + sknNone: + begin + PaintDefault := False; + DrawFrameControl(ACanvas.Handle, ARect, DFC_CAPTION, ButtonIndexFlags[AImageIndex] or NoneFlags[State]); + end; + sknWindows: + begin + PaintDefault := False; + DrawThemeBackground(ThemeServices.Theme[teWindow], ACanvas.Handle, XPPart[AImageIndex], XPFlags[State], ARect, nil); + end; + end; + end; +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; + SendTo: HWND; +begin + MainForm := Application.MainForm; + if Assigned(MainForm) then begin + ChildForm := MainForm.ActiveMDIChild; + if Assigned(ChildForm) then begin + // Make sure we send the message to a maximized window + SendTo := ChildForm.Handle; + while not IsZoomed(SendTo) do begin + SendTo := GetWindow(SendTo, GW_HWNDNEXT); + if SendTo = 0 then Exit; + end; + + if Sender = FRestoreItem then + Cmd := SC_RESTORE + else if Sender = FCloseItem then + Cmd := SC_CLOSE + else + Cmd := SC_MINIMIZE; + SendMessage(SendTo, WM_SYSCOMMAND, Cmd, GetMessagePos); + end; + end; +end; + +procedure TSpTBXMDIButtonsItem.InvalidateSystemMenuItem; +var + View: TTBView; +begin + if Assigned((Owner as TSpTBXMDIHandler).FToolbar) then begin + View := TSpTBXMDIHandler(Owner).FToolbar.View; + View.Invalidate(View.Find(TSpTBXMDIHandler(Owner).FSystemMenuItem)); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXMDIWindowItem } + +constructor TSpTBXMDIWindowItem.Create(AOwner: TComponent); +var + Form: TForm; +begin + inherited; + ItemStyle := ItemStyle + [tbisEmbeddedGroup]; + Caption := STBMDIWindowItemDefCaption; + FWindowMenu := TMenuItem.Create(Self); + + if not (csDesigning in ComponentState) then begin + { Need to set WindowMenu before MDI children are created. Otherwise the + list incorrectly shows the first 9 child windows, even if window 10+ is + active. } + Form := Application.MainForm; + if (Form = nil) and (Screen.FormCount > 0) then + Form := Screen.Forms[0]; + SetForm(Form); + end; +end; + +procedure TSpTBXMDIWindowItem.GetChildren(Proc: TGetChildProc; Root: TComponent); +begin + // Do nothing +end; + +procedure TSpTBXMDIWindowItem.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited; + if (Operation = opRemove) and (AComponent = FForm) then + SetForm(nil); +end; + +procedure TSpTBXMDIWindowItem.SetForm(AForm: TForm); +begin + if FForm <> AForm then begin + if Assigned(FForm) and (FForm.WindowMenu = FWindowMenu) then + FForm.WindowMenu := nil; + FForm := AForm; + if Assigned(FForm) then + FForm.FreeNotification(Self); + end; + if Assigned(FForm) then + FForm.WindowMenu := FWindowMenu; +end; + +procedure TSpTBXMDIWindowItem.EnabledChanged; +var + I: Integer; +begin + inherited; + for I := 0 to Count-1 do + Items[I].Enabled := Enabled; +end; + +procedure TSpTBXMDIWindowItem.InitiateAction; +var + MainForm: TForm; + I: Integer; + M: HMENU; + Item: TSpTBXItem; + ItemCount: Integer; + Buf: array[0..1023] of Char; +begin + inherited; + if csDesigning in ComponentState then + Exit; + MainForm := Application.MainForm; + if Assigned(MainForm) then + SetForm(MainForm); + if FForm = nil then + Exit; + if FForm.ClientHandle <> 0 then + { This is needed, otherwise windows selected on the More Windows dialog + don't move back into the list } + SendMessage(FForm.ClientHandle, WM_MDIREFRESHMENU, 0, 0); + M := FWindowMenu.Handle; + ItemCount := GetMenuItemCount(M) - 1; + if ItemCount < 0 then + ItemCount := 0; + while Count < ItemCount do begin + Item := TSpTBXItem.Create(Self); + Item.Enabled := Enabled; + Item.OnClick := ItemClick; + Add(Item); + end; + while Count > ItemCount do + Items[Count - 1].Free; + for I := 0 to ItemCount - 1 do begin + Item := TSpTBXItem(Items[I]); + Item.Tag := GetMenuItemID(M, I+1); + if GetMenuString(M, I+1, Buf, SizeOf(Buf), MF_BYPOSITION) = 0 then + Buf[0] := #0; + Item.Caption := Buf; + Item.Checked := GetMenuState(M, I+1, MF_BYPOSITION) and MF_CHECKED <> 0; + end; + if Assigned(FOnUpdate) then + FOnUpdate(Self); +end; + +procedure TSpTBXMDIWindowItem.ItemClick(Sender: TObject); +var + Form: TForm; +begin + Form := Application.MainForm; + if Assigned(Form) then + PostMessage(Form.Handle, WM_COMMAND, TTBCustomItem(Sender).Tag, 0); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXMRUListItem } + +procedure TSpTBXMRUListItem.ClickHandler(Sender: TObject); +var + I: Integer; + A: TSpTBXMRUItem; +begin + if Sender is TSpTBXMRUItem then begin + A := TSpTBXMRUItem(Sender); + I := IndexOf(A); + if I > 0 then + Move(I, 0); + MRUUpdateCaptions; + if Assigned(FOnClick) then FOnClick(Self, A.MRUString); + end; +end; + +constructor TSpTBXMRUListItem.Create(AOwner: TComponent); +begin + inherited; + ItemStyle := ItemStyle + [tbisEmbeddedGroup]; + Caption := STBMRUListItemDefCaption; + Options := Options + [tboShowHint]; + FMaxItems := 4; + FHidePathExtension := True; +end; + +procedure TSpTBXMRUListItem.GetMRUFilenames(MRUFilenames: TStrings); +var + I: Integer; +begin + MRUFilenames.Clear; + for I := 0 to Count - 1 do + if Items[I] is TSpTBXMRUItem then + MRUFilenames.Add(TSpTBXMRUItem(Items[I]).MRUString); +end; + +function TSpTBXMRUListItem.IndexOfMRU(Filename: WideString): Integer; +var + I: Integer; +begin + Result := -1; + for I := 0 to Count - 1 do + if Items[I] is TSpTBXMRUItem then + if SpSameText(TSpTBXMRUItem(Items[I]).MRUString, Filename) then begin + Result := I; + Break; + end; +end; + +function TSpTBXMRUListItem.MRUAdd(Filename: WideString): Integer; +var + A: TSpTBXMRUItem; + I: Integer; +begin + Result := -1; + I := IndexOfMRU(Filename); + if I > -1 then begin + // If Filename is already in the MRU list, move it to the top + Move(I, 0); + MRUUpdateCaptions; + end + else begin + // Add the new Filename, if it exceeds the MaxItems limit delete the bottom items + A := TSpTBXMRUItem.Create(Self); + A.MRUString := Filename; + A.Hint := Filename; + A.OnClick := ClickHandler; + Insert(0, A); + while Count > FMaxItems do + Items[Count - 1].Free; + MRUUpdateCaptions; + Result := 0; + end; +end; + +function TSpTBXMRUListItem.MRUClick(Filename: WideString): Boolean; +var + I: Integer; +begin + Result := False; + I := IndexOfMRU(Filename); + if I > -1 then begin + Items[I].Click; + Result := True; + end; +end; + +procedure TSpTBXMRUListItem.MRURemove(Filename: WideString); +var + I: Integer; +begin + I := IndexOfMRU(Filename); + if I > -1 then begin + Items[I].Free; + MRUUpdateCaptions; + end; +end; + +procedure TSpTBXMRUListItem.MRUUpdateCaptions; +var + I: Integer; + A: TSpTBXMRUItem; + S: WideString; +begin + for I := 0 to Count - 1 do + if Items[I] is TSpTBXMRUItem then begin + A := TSpTBXMRUItem(Items[I]); + S := A.MRUString; + if FHidePathExtension then begin + {$IFDEF UNICODE} + S := ExtractFileName(S); + {$ELSE} + S := TntSysUtils.WideExtractFileName(S); + {$ENDIF} + end; + A.Caption := '&' + IntToStr(I + 1) + ' ' + S; + end; +end; + +procedure TSpTBXMRUListItem.LoadFromIni(Ini: TCustomIniFile; const Section: string); +var + I: Integer; + S: WideString; +begin + Clear; + for I := FMaxItems downto 1 do begin + S := Ini.ReadString(Section, IntToStr(I), ''); + {$IFNDEF UNICODE} + S := UTF8Decode(S); + {$ENDIF} + if S <> '' then + MRUAdd(S); + end; +end; + +procedure TSpTBXMRUListItem.SaveToIni(Ini: TCustomIniFile; const Section: string); +var + I: Integer; + A: TSpTBXMRUItem; + S: string; + L: TStringList; +begin + {$IFDEF UNICODE} + // If the IniFile doesn't exist create it with Unicode encoding + // otherwise we can't write Unicode strings. + if (Ini is TIniFile) and not FileExists(Ini.FileName) then begin + L := TStringList.Create; + try + L.SaveToFile(Ini.FileName, TEncoding.Unicode); + finally + L.Free; + end; + end; + {$ENDIF} + for I := 1 to FMaxItems do begin + if I <= Count then begin + A := TSpTBXMRUItem(Items[I - 1]); + {$IFDEF UNICODE} + S := A.MRUString; + {$ELSE} + S := UTF8Encode(A.MRUString); + {$ENDIF} + Ini.WriteString(Section, IntToStr(I), S); + end + else + Ini.DeleteKey(Section, IntToStr(I)); + end; +end; + +procedure TSpTBXMRUListItem.SetHidePathExtension(const Value: Boolean); +begin + if FHidePathExtension <> Value then begin + FHidePathExtension := Value; + MRUUpdateCaptions; + end; +end; + +procedure TSpTBXMRUListItem.SetMaxItems(const Value: Integer); +begin + if FMaxItems <> Value then begin + FMaxItems := Value; + if Count > FMaxItems then begin + while Count > FMaxItems do + Items[Count - 1].Free; + MRUUpdateCaptions; + end; + end; +end; + +end. diff --git a/internal/2.4.4/1/Source/SpTBXPageScroller.pas b/internal/2.4.4/1/Source/SpTBXPageScroller.pas new file mode 100644 index 0000000..2de84e0 --- /dev/null +++ b/internal/2.4.4/1/Source/SpTBXPageScroller.pas @@ -0,0 +1,943 @@ +unit SpTBXPageScroller; + +{============================================================================== +Version 2.4.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]'. + +History: +2 December 2009 - version 2.4.4 + - No changes. + +13 September 2009 - version 2.4.3 + - Initial release, initial author: Kiriakos. + +==============================================================================} + +interface + +{$BOOLEVAL OFF} // Unit depends on short-circuit boolean evaluation + +uses + Windows, Messages, Classes, Graphics, Controls, StdCtrls, ExtCtrls, Forms, + TB2Dock, TB2Item, SpTBXSkins, SpTBXItem; + + +const + { New hit test constants for page scrollers } + HTSCROLLPREV = 30; + HTSCROLLNEXT = 31; + + { Page scroll button types } + PSBT_UP = 1; + PSBT_DOWN = 2; + PSBT_LEFT = 3; + PSBT_RIGHT = 4; + +type + TSpTBXPageScrollerOrientation = (tpsoVertical, tpsoHorizontal); + TSpTBXPageScrollerButtons = set of (tpsbPrev, tpsbNext); + TSpTBXPageScrollerButtonType = (tpsbtUp, tpsbtDown, tpsbtLeft, tpsbtRight); + + TSpTBXCustomPageScroller = class(TWinControl) + private + FAutoRangeCount: Integer; + FAutoRange: Boolean; + FAutoScroll: Boolean; + FButtonSize: Integer; + FMargin: Integer; + FOrientation: TSpTBXPageScrollerOrientation; + FPosition: Integer; + FPosRange: Integer; + FRange: Integer; + FScrollDirection: Integer; + FScrollCounter: Integer; + FScrollPending: Boolean; + FScrollTimer: TTimer; + FUpdatingButtons: Boolean; + FVisibleButtons: TSpTBXPageScrollerButtons; + procedure CalcAutoRange; + function IsRangeStored: Boolean; + procedure ScrollTimerTimer(Sender: TObject); + procedure SetButtonSize(Value: Integer); + procedure SetAutoRange(Value: Boolean); + procedure SetOrientation(Value: TSpTBXPageScrollerOrientation); + procedure SetPosition(Value: Integer); + procedure SetRange(Value: Integer); + procedure StopScrolling; + procedure ValidatePosition(var NewPos: Integer); + procedure WMMouseMove(var Message: TWMMouseMove); message WM_MOUSEMOVE; + procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE; + procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBKGND; + procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST; + procedure WMNCLButtonDown(var Message: TWMNCLButtonDown); message WM_NCLBUTTONDOWN; + procedure WMNCMouseLeave(var Message: TMessage); message $2A2 {WM_NCMOUSELEAVE}; + procedure WMNCMouseMove(var Message: TWMNCMouseMove); message WM_NCMOUSEMOVE; + procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT; + procedure WMSize(var Message: TWMSize); message WM_SIZE; + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + protected + procedure AdjustClientRect(var Rect: TRect); override; + procedure AlignControls(AControl: TControl; var ARect: TRect); override; + function AutoScrollEnabled: Boolean; virtual; + procedure BeginScrolling(HitTest: Integer); + function CalcClientArea: TRect; + function CanAutoSize(var NewWidth, NewHeight: Integer): Boolean; override; + procedure ConstrainedResize(var MinWidth, MinHeight, MaxWidth, MaxHeight: Integer); override; + procedure CreateParams(var Params: TCreateParams); override; + procedure DoSetRange(Value: Integer); virtual; + procedure DrawNCArea(const DrawToDC: Boolean; const ADC: HDC; const Clip: HRGN); virtual; + procedure HandleScrollTimer; virtual; + procedure Loaded; override; + procedure RecalcNCArea; + procedure Resizing; virtual; + procedure UpdateButtons; + property AutoRange: Boolean read FAutoRange write SetAutoRange default True; + property AutoScroll: Boolean read FAutoScroll write FAutoScroll default True; + property ButtonSize: Integer read FButtonSize write SetButtonSize default 10; + property Margin: Integer read FMargin write FMargin default 0; + property Orientation: TSpTBXPageScrollerOrientation read FOrientation write SetOrientation default tpsoVertical; + property Range: Integer read FRange write SetRange stored IsRangeStored; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure DisableAutoRange; + procedure EnableAutoRange; + procedure ScrollToCenter(ARect: TRect); overload; + procedure ScrollToCenter(AControl: TControl); overload; + property Position: Integer read FPosition write SetPosition default 0; + end; + + TSpTBXPageScroller = class(TSpTBXCustomPageScroller) + published + property Align; + property Anchors; + property AutoRange; + property AutoScroll; + property ButtonSize; + property Color; + property Constraints; + property DockSite; + property DragCursor; + property DragKind; + property DragMode; + property DoubleBuffered; + property Enabled; + property Ctl3D; + property Font; + property Margin; + property Orientation; + property ParentBiDiMode; + property ParentColor; + property ParentCtl3D; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property Range; + property ShowHint; + property TabOrder; + property TabStop; + property Visible; + property OnCanResize; + property OnClick; + property OnConstrainedResize; + property OnContextPopup; + property OnDblClick; + 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 OnMouseWheel; + property OnMouseWheelDown; + property OnMouseWheelUp; + property OnResize; + property OnStartDock; + property OnStartDrag; + property OnUnDock; + end; + +{ Painting helpers } +procedure SpTBXPaintPageScrollButton(ACanvas: TCanvas; const ARect: TRect; ButtonType: TSpTBXPageScrollerButtonType; Hot: Boolean); + +implementation + +uses + SysUtils, TB2Common, UxTheme, Themes; + +const + ScrollDelay = 300; + ScrollInterval = 75;{ TSpTBXCustomPageScroller } + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Helpers } + +function GetMinControlHeight(Control: TControl): Integer; +begin + if Control.Align = alClient then + Result := Control.Constraints.MinHeight + else + Result := Control.Height; +end; + +function GetMinControlWidth(Control: TControl): Integer; +begin + if Control.Align = alClient then + Result := Control.Constraints.MinWidth + else + Result := Control.Width; +end; + +procedure SpTBXPaintPageScrollButton(ACanvas: TCanvas; const ARect: TRect; + ButtonType: TSpTBXPageScrollerButtonType; Hot: Boolean); +var + R: TRect; + Flags: Integer; + X, Y, Sz: Integer; +begin + R := ARect; + case SkinManager.GetSkinType of + sknNone: + begin + if Hot then Flags := DFCS_FLAT + else Flags := 0; + case ButtonType of + tpsbtUp: Flags := Flags or DFCS_SCROLLUP; + tpsbtDown: Flags := Flags or DFCS_SCROLLDOWN; + tpsbtLeft: Flags := Flags or DFCS_SCROLLLEFT; + tpsbtRight: Flags := Flags or DFCS_SCROLLRIGHT; + end; + Windows.DrawFrameControl(ACanvas.Handle, R, DFC_SCROLL, Flags); + end; + sknWindows: + begin + if Hot then Flags := TS_PRESSED + else Flags := TS_HOT; + DrawThemeBackground(ThemeServices.Theme[teToolBar], ACanvas.Handle, TP_BUTTON, Flags, ARect, nil); + if Hot then ACanvas.Pen.Color := clBtnText; + end; + sknSkin : + begin + SpDrawXPButton(ACanvas, R, True, False, Hot, False, False, False, sknSkin); + if Hot then + ACanvas.Pen.Color := CurrentSkin.GetTextColor(skncButton, sknsHotTrack, sknSkin) + else + ACanvas.Pen.Color := CurrentSkin.GetTextColor(skncButton, sknsNormal, sknSkin); + end; + end; + + if SkinManager.GetSkinType in [sknWindows, sknSkin] then begin + X := (R.Left + R.Right) div 2; + Y := (R.Top + R.Bottom) div 2; + Sz := Min(X - R.Left, Y - R.Top) * 3 div 4; + ACanvas.Brush.Color := ACanvas.Pen.Color; + case ButtonType of + tpsbtUp: + begin + Inc(Y, Sz div 2); + ACanvas.Polygon([Point(X + Sz, Y), Point(X, Y - Sz), Point(X - Sz, Y)]); + end; + tpsbtDown: + begin + Y := (R.Top + R.Bottom - 1) div 2; + Dec(Y, Sz div 2); + ACanvas.Polygon([Point(X + Sz, Y), Point(X, Y + Sz), Point(X - Sz, Y)]); + end; + tpsbtLeft: + begin + Inc(X, Sz div 2); + ACanvas.Polygon([Point(X, Y + Sz), Point(X - Sz, Y), Point(X, Y - Sz)]); + end; + tpsbtRight: + begin + X := (R.Left + R.Right - 1) div 2; + Dec(X, Sz div 2); + ACanvas.Polygon([Point(X, Y + Sz), Point(X + Sz, Y), Point(X, Y - Sz)]); + end; + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomPageScroller } + +procedure TSpTBXCustomPageScroller.AdjustClientRect(var Rect: TRect); +begin + if Orientation = tpsoVertical then + begin + if tpsbPrev in FVisibleButtons then Dec(Rect.Top, ButtonSize); + if tpsbNext in FVisibleButtons then Inc(Rect.Bottom, ButtonSize); + OffsetRect(Rect, 0, -Position); + if Range > Rect.Bottom - Rect.Top then Rect.Bottom := Rect.Top + Range; + end + else + begin + if tpsbPrev in FVisibleButtons then Dec(Rect.Left, ButtonSize); + if tpsbNext in FVisibleButtons then Inc(Rect.Right, ButtonSize); + OffsetRect(Rect, -Position, 0); + if Range > Rect.Right - Rect.Left then Rect.Right := Rect.Left + Range; + end; +end; + +procedure TSpTBXCustomPageScroller.AlignControls(AControl: TControl; var ARect: TRect); +begin + CalcAutoRange; + UpdateButtons; + ARect := ClientRect; + inherited AlignControls(AControl, ARect); +end; + +function TSpTBXCustomPageScroller.AutoScrollEnabled: Boolean; +begin + Result := not AutoSize and not (DockSite and UseDockManager); +end; + +procedure TSpTBXCustomPageScroller.BeginScrolling(HitTest: Integer); +var + Msg: TMsg; +begin + if HitTest = HTSCROLLPREV then FScrollDirection := -1 else FScrollDirection := 1; + try + SetCapture(Handle); + FScrollCounter := FScrollDirection * 8; + FScrollPending := True; + FScrollTimer.Enabled := True; + DrawNCArea(False, 0, 0); + HandleScrollTimer; + FScrollPending := True; + FScrollTimer.Interval := ScrollDelay; + + while GetCapture = Handle do begin + case Integer(GetMessage(Msg, 0, 0, 0)) of + -1: Break; + 0: begin + PostQuitMessage(Msg.WParam); + Break; + end; + end; + case Msg.Message of + WM_KEYDOWN, WM_KEYUP: + if Msg.WParam = VK_ESCAPE then + Break; + WM_LBUTTONDOWN, WM_LBUTTONDBLCLK, WM_LBUTTONUP: + begin + Break; + end; + WM_RBUTTONDOWN..WM_MBUTTONDBLCLK:; + WM_TIMER: + begin + HandleScrollTimer; + end; + else + TranslateMessage(Msg); + DispatchMessage(Msg); + end; + end; + finally + StopScrolling; + if GetCapture = Handle then ReleaseCapture; + end; +end; + +procedure TSpTBXCustomPageScroller.CalcAutoRange; +var + I: Integer; + Bias: Integer; + NewRange, AlignMargin: Integer; + CW, CH: Integer; + Control: TControl; +begin + if (FAutoRangeCount <= 0) and AutoRange then + begin + if AutoScrollEnabled then + begin + NewRange := 0; + AlignMargin := 0; + if Position > 0 then Bias := ButtonSize + else Bias := 0; + CW := ClientWidth; + CH := ClientHeight; + DisableAlign; + for I := 0 to ControlCount - 1 do + begin + Control := Controls[I]; + if Control.Visible or (csDesigning in Control.ComponentState) and + not (csNoDesignVisible in Control.ControlStyle) then + begin + if Orientation = tpsoVertical then + begin + if Control.Align in [alTop, alBottom, alClient] then + Control.Width := CW; + case Control.Align of + alTop, alNone: + if (Control.Align = alTop) or (Control.Anchors * [akTop, akBottom] = [akTop]) then + NewRange := Max(NewRange, Position + Control.Top + Control.Height + Bias); + alBottom: Inc(AlignMargin, Control.Height); + alClient: Inc(AlignMargin, GetMinControlHeight(Control)); + end + end + else + begin + if Control.Align in [alLeft, alRight, alClient] then + Control.Height := CH; + case Control.Align of + alLeft, alNone: + if (Control.Align = alLeft) or (Control.Anchors * [akLeft, akRight] = [akLeft]) then + NewRange := Max(NewRange, Position + Control.Left + Control.Width + Bias); + alRight: Inc(AlignMargin, Control.Width); + alClient: Inc(AlignMargin, GetMinControlWidth(Control)); + end; + end; + end; + end; + EnableAlign; + DoSetRange(NewRange + AlignMargin + Margin); + end + else DoSetRange(0); + end; +end; + +function TSpTBXCustomPageScroller.CalcClientArea: TRect; +begin + Result := ClientRect; + if Orientation = tpsoVertical then + begin + if tpsbPrev in FVisibleButtons then Dec(Result.Top, ButtonSize); + if tpsbNext in FVisibleButtons then Inc(Result.Bottom, ButtonSize); + end + else + begin + if tpsbPrev in FVisibleButtons then Dec(Result.Left, ButtonSize); + if tpsbNext in FVisibleButtons then Inc(Result.Right, ButtonSize); + end; +end; + +function TSpTBXCustomPageScroller.CanAutoSize(var NewWidth, NewHeight: Integer): Boolean; +begin + Result := NewHeight > FButtonSize * 3; +end; + +procedure TSpTBXCustomPageScroller.ConstrainedResize(var MinWidth, MinHeight, MaxWidth, MaxHeight: Integer); +begin + // do not call inherited here +end; + +constructor TSpTBXCustomPageScroller.Create(AOwner: TComponent); +begin + inherited; + ControlStyle := ControlStyle + [csAcceptsControls, csClickEvents, csDoubleClicks]; + FAutoScroll := True; + FAutoRange := True; + FButtonSize := 10; + FScrollTimer := TTimer.Create(Self); + FScrollTimer.Enabled := False; + FScrollTimer.Interval := 60; + FScrollTimer.OnTimer := ScrollTimerTimer; + Width := 64; + Height := 64; + SkinManager.AddSkinNotification(Self); +end; + +procedure TSpTBXCustomPageScroller.CreateParams(var Params: TCreateParams); +begin + inherited CreateParams(Params); + with Params.WindowClass do style := style and not (CS_HREDRAW or CS_VREDRAW); +end; + +destructor TSpTBXCustomPageScroller.Destroy; +begin + SkinManager.RemoveSkinNotification(Self); + inherited; +end; + +procedure TSpTBXCustomPageScroller.DisableAutoRange; +begin + Inc(FAutoRangeCount); +end; + +procedure TSpTBXCustomPageScroller.DoSetRange(Value: Integer); +begin + FRange := Value; + if FRange < 0 then FRange := 0; + UpdateButtons; +end; + +procedure TSpTBXCustomPageScroller.DrawNCArea(const DrawToDC: Boolean; + const ADC: HDC; const Clip: HRGN); +const + CBtns: array [TSpTBXPageScrollerOrientation, Boolean] of TSpTBXPageScrollerButtonType = + ((tpsbtUp, tpsbtDown), (tpsbtLeft, tpsbtRight)); +var + DC: HDC; + R, CR, BR: TRect; + ACanvas: TCanvas; + PrevBtnSize, NextBtnSize: Integer; +begin + if FVisibleButtons = [] then Exit; + if not DrawToDC then DC := GetWindowDC(Handle) + else DC := ADC; + try + GetWindowRect(Handle, R); + OffsetRect(R, -R.Left, -R.Top); + if not DrawToDC then + begin + SelectNCUpdateRgn(Handle, DC, Clip); + CR := R; + PrevBtnSize := 0; + NextBtnSize := 0; + if tpsbPrev in FVisibleButtons then PrevBtnSize := ButtonSize; + if tpsbNext in FVisibleButtons then NextBtnSize := ButtonSize; + if Orientation = tpsoVertical then + begin + Inc(CR.Top, PrevBtnSize); + Dec(CR.Bottom, NextBtnSize); + end + else + begin + Inc(CR.Left, PrevBtnSize); + Dec(CR.Right, NextBtnSize); + end; + with CR do ExcludeClipRect(DC, Left, Top, Right, Bottom); + end; + + ACanvas := TCanvas.Create; + try + ACanvas.Handle := DC; + ACanvas.Brush.Color := Color; + ACanvas.FillRect(R); + + if tpsbPrev in FVisibleButtons then + begin + BR := R; + if Orientation = tpsoVertical then BR.Bottom := BR.Top + ButtonSize + else BR.Right := BR.Left + ButtonSize; + SpTBXPaintPageScrollButton(ACanvas, BR, CBtns[Orientation, False], + FScrollDirection < 0); + end; + if tpsbNext in FVisibleButtons then + begin + BR := R; + if Orientation = tpsoVertical then BR.Top := BR.Bottom - ButtonSize + else BR.Left := BR.Right - ButtonSize; + SpTBXPaintPageScrollButton(ACanvas, BR, CBtns[Orientation, True], + FScrollDirection > 0); + end; + finally + ACanvas.Handle := 0; + ACanvas.Free; + end; + finally + if not DrawToDC then ReleaseDC(Handle, DC); + end; +end; + +procedure TSpTBXCustomPageScroller.EnableAutoRange; +begin + if FAutoRangeCount > 0 then + begin + Dec(FAutoRangeCount); + if FAutoRangeCount = 0 then CalcAutoRange; + end; +end; + +procedure TSpTBXCustomPageScroller.HandleScrollTimer; +var + Pt: TPoint; + R: TRect; + OldPosition: Integer; + OldDirection: Integer; +begin + GetCursorPos(Pt); + GetWindowRect(Handle, R); + if not PtInRect(R, Pt) then + begin + StopScrolling; + end + else if FScrollDirection = 0 then + begin + FScrollTimer.Enabled := False; + FScrollCounter := 0; + end + else + begin + OldPosition := Position; + OldDirection := FScrollDirection; + if ((FScrollDirection > 0) and (FScrollCounter < 0)) or + ((FScrollDirection < 0) and (FScrollCounter > 0)) then FScrollCounter := 0; + if FScrollDirection > 0 then Inc(FScrollCounter) + else Dec(FScrollCounter); + Position := Position + FScrollCounter; + if Position = OldPosition then + begin + ReleaseCapture; + FScrollTimer.Enabled := False; + DrawNCArea(False, 0, 0); + end + else + begin + if FScrollPending or (FScrollDirection * OldDirection <= 0) or + (FScrollDirection * OldDirection <= 0) then + DrawNCArea(False, 0, 0); + end; + end; + if FScrollPending then FScrollTimer.Interval := ScrollInterval; + FScrollPending := False; +end; + +function TSpTBXCustomPageScroller.IsRangeStored: Boolean; +begin + Result := not AutoRange; +end; + +procedure TSpTBXCustomPageScroller.Loaded; +begin + inherited; + UpdateButtons; +end; + +procedure TSpTBXCustomPageScroller.RecalcNCArea; +begin + SetWindowPos(Handle, 0, 0, 0, 0, 0, + SWP_FRAMECHANGED or SWP_NOACTIVATE or SWP_NOZORDER or SWP_NOMOVE or SWP_NOSIZE); +end; + +procedure TSpTBXCustomPageScroller.Resizing; +begin + // do nothing by default +end; + +procedure TSpTBXCustomPageScroller.ScrollTimerTimer(Sender: TObject); +begin + HandleScrollTimer; +end; + +procedure TSpTBXCustomPageScroller.ScrollToCenter(ARect: TRect); +var + X, Y: Integer; +begin + if Orientation = tpsoVertical then + begin + if ARect.Bottom - ARect.Top < Range then Y := (ARect.Top + ARect.Bottom) div 2 + else Y := ARect.Top; + Position := Position + Y - Height div 2; + end + else + begin + if ARect.Right - ARect.Left < Range then X := (ARect.Left + ARect.Right) div 2 + else X := ARect.Left; + Position := Position + X - Width div 2; + end; +end; + +procedure TSpTBXCustomPageScroller.ScrollToCenter(AControl: TControl); +var + R: TRect; +begin + R := AControl.ClientRect; + R.TopLeft := ScreenToClient(AControl.ClientToScreen(R.TopLeft)); + R.BottomRight := ScreenToClient(AControl.ClientToScreen(R.BottomRight)); + ScrollToCenter(R); +end; + +procedure TSpTBXCustomPageScroller.SetAutoRange(Value: Boolean); +begin + if FAutoRange <> Value then + begin + FAutoRange := Value; + if Value then CalcAutoRange else Range := 0; + end; +end; + +procedure TSpTBXCustomPageScroller.SetButtonSize(Value: Integer); +begin + if FButtonSize <> Value then + begin + FButtonSize := Value; + UpdateButtons; + end; +end; + +procedure TSpTBXCustomPageScroller.SetOrientation(Value: TSpTBXPageScrollerOrientation); +begin + if Orientation <> Value then + begin + FOrientation := Value; + Realign; + end; +end; + +procedure TSpTBXCustomPageScroller.SetPosition(Value: Integer); +var + OldPos: Integer; +begin + if csReading in ComponentState then FPosition := Value + else + begin + ValidatePosition(Value); + if FPosition <> Value then + begin + OldPos := FPosition; + FPosition := Value; + + if OldPos > 0 then Inc(OldPos, ButtonSize); + if Value > 0 then Inc(Value, ButtonSize); + + if Orientation = tpsoHorizontal then ScrollBy(OldPos - Value, 0) + else ScrollBy(0, OldPos - Value); + UpdateButtons; + end; + end; +end; + +procedure TSpTBXCustomPageScroller.SetRange(Value: Integer); +begin + FAutoRange := False; + DoSetRange(Value); +end; + +procedure TSpTBXCustomPageScroller.StopScrolling; +begin + if (FScrollDirection <> 0) or (FScrollCounter <> 0) or (FScrollTimer.Enabled) then + begin + FScrollDirection := 0; + FScrollCounter := 0; + FScrollTimer.Enabled := False; + if HandleAllocated and IsWindowVisible(Handle) then DrawNCArea(False, 0, 0); + end; +end; + +procedure TSpTBXCustomPageScroller.UpdateButtons; +var + Sz: Integer; + OldVisibleButtons: TSpTBXPageScrollerButtons; + RealignNeeded: Boolean; +begin + RealignNeeded := False; + if not FUpdatingButtons and HandleAllocated then + try + FUpdatingButtons := True; + if Orientation = tpsoHorizontal then Sz := Width + else Sz := Height; + OldVisibleButtons := FVisibleButtons; + FVisibleButtons := []; + + FPosRange := Range - Sz; + if FPosRange < 0 then FPosRange := 0; + if FPosition > FPosRange - 1 then + begin + FPosition := FPosRange; + RealignNeeded := True; + end; + + if Sz > ButtonSize * 3 then + begin + if Position > 0 then Include(FVisibleButtons, tpsbPrev); + if Range - Position > Sz then Include(FVisibleButtons, tpsbNext); + end; + if FVisibleButtons <> OldVisibleButtons then + begin + RecalcNCArea; + RealignNeeded := True; + end; + finally + FUpdatingButtons := False; + if RealignNeeded then Realign; + end; +end; + +procedure TSpTBXCustomPageScroller.ValidatePosition(var NewPos: Integer); +begin + if NewPos < 0 then NewPos := 0; + if NewPos > FPosRange then NewPos := FPosRange; +end; + +procedure TSpTBXCustomPageScroller.WMEraseBkgnd(var Message: TWmEraseBkgnd); +begin + if Color = clNone then + begin + SpDrawParentBackground(Self, Message.DC, ClientRect); + Message.Result := 1; + end + else inherited; +end; + +procedure TSpTBXCustomPageScroller.WMMouseMove(var Message: TWMMouseMove); +begin + if AutoScroll then StopScrolling; + inherited; +end; + +procedure TSpTBXCustomPageScroller.WMNCCalcSize(var Message: TWMNCCalcSize); +begin + with Message.CalcSize_Params^ do + begin + if Orientation = tpsoVertical then + begin + if tpsbPrev in FVisibleButtons then Inc(rgrc[0].Top, ButtonSize); + if tpsbNext in FVisibleButtons then Dec(rgrc[0].Bottom, ButtonSize); + end + else + begin + if tpsbPrev in FVisibleButtons then Inc(rgrc[0].Left, ButtonSize); + if tpsbNext in FVisibleButtons then Dec(rgrc[0].Right, ButtonSize); + end; + Message.Result := 0; + end; +end; + +procedure TSpTBXCustomPageScroller.WMNCHitTest(var Message: TWMNCHitTest); +var + Pt: TPoint; + R: TRect; +begin + DefaultHandler(Message); + with Message do if Result <> HTCLIENT then + begin + Pt := SmallPointToPoint(Pos); + GetWindowRect(Handle, R); + if PtInRect(R, Pt) then + begin + if (tpsbPrev in FVisibleButtons) then + begin + if Orientation = tpsoVertical then + begin + if Pt.Y < R.Top + ButtonSize then Result := HTSCROLLPREV + end + else + begin + if Pt.X < R.Left + ButtonSize then Result := HTSCROLLPREV + end; + end; + if (tpsbNext in FVisibleButtons) then + begin + if Orientation = tpsoVertical then + begin + if Pt.Y >= R.Bottom - ButtonSize then Result := HTSCROLLNEXT; + end + else + begin + if Pt.X >= R.Right - ButtonSize then Result := HTSCROLLNEXT; + end; + end; + end; + end; +end; + +procedure TSpTBXCustomPageScroller.WMNCLButtonDown(var Message: TWMNCLButtonDown); +begin + if (Win32MajorVersion >= 5) or + (Win32MajorVersion = 4) and (Win32MinorVersion >= 10) then + CallTrackMouseEvent(Handle, TME_LEAVE or $10 {TME_NONCLIENT}); + + if not AutoScroll and (Message.HitTest in [HTSCROLLPREV, HTSCROLLNEXT]) then + BeginScrolling(Message.HitTest) + else + inherited; +end; + +procedure TSpTBXCustomPageScroller.WMNCMouseLeave(var Message: TMessage); +begin + if AutoScroll then StopScrolling; + inherited; +end; + +procedure TSpTBXCustomPageScroller.WMNCMouseMove(var Message: TWMNCMouseMove); +var + OldScrollDirection: Integer; +begin + if (Win32MajorVersion >= 5) or + (Win32MajorVersion = 4) and (Win32MinorVersion >= 10) then + CallTrackMouseEvent(Handle, TME_LEAVE or $10 {TME_NONCLIENT}); + + if AutoScroll then + begin + OldScrollDirection := FScrollDirection; + case Message.HitTest of + HTSCROLLPREV: FScrollDirection := -1; + HTSCROLLNEXT: FScrollDirection := 1; + else + StopScrolling; + inherited; + Exit; + end; + if OldScrollDirection <> FScrollDirection then + begin + FScrollCounter := 0; + FScrollPending := True; + FScrollTimer.Interval := ScrollDelay; + FScrollTimer.Enabled := True; + DrawNCArea(False, 0, 0); + end; + end; +end; + +procedure TSpTBXCustomPageScroller.WMNCPaint(var Message: TMessage); +begin + DrawNCArea(False, 0, HRGN(Message.WParam)); +end; + +procedure TSpTBXCustomPageScroller.WMSize(var Message: TWMSize); +begin + FUpdatingButtons := True; + try + CalcAutoRange; + finally + FUpdatingButtons := False; + end; + Inc(FAutoRangeCount); + inherited; + Resizing; + Dec(FAutoRangeCount); +end; + +procedure TSpTBXCustomPageScroller.WMSpSkinChange(var Message: TMessage); +begin + if HandleAllocated then + RedrawWindow(Handle, nil, 0, RDW_FRAME or RDW_INVALIDATE or RDW_ERASE); +end; + +end. diff --git a/internal/2.4.4/1/Source/SpTBXReg.dcr b/internal/2.4.4/1/Source/SpTBXReg.dcr new file mode 100644 index 0000000000000000000000000000000000000000..c4691487598ccde218d49cd7a1ecdbe7a3ab8827 GIT binary patch literal 125196 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 z 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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 +{ TSpTBXImageIndexEditor } + +function TSpTBXImageIndexEditor.GetAttributes: TPropertyAttributes; +begin + Result := [paMultiSelect, paValueList, paRevertable]; +end; + +function TSpTBXImageIndexEditor.GetImageListAt(Index: Integer): TCustomImageList; +begin + Result := TCustomImageList(TypInfo.GetObjectProp(GetComponent(Index), 'Images')); +end; + +procedure TSpTBXImageIndexEditor.GetValues(Proc: TGetStrProc); +var + ImgList: TCustomImageList; + I: Integer; +begin + ImgList := GetImageListAt(0); + if Assigned(ImgList) then + for I := 0 to ImgList.Count-1 do + Proc(IntToStr(I)); +end; + +procedure TSpTBXImageIndexEditor.ListDrawValue(const Value: string; + ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean); +var + ImgList: TCustomImageList; + X: Integer; +begin + ImgList := GetImageListAt(0); + ACanvas.FillRect(ARect); + X := ARect.Left + 2; + if Assigned(ImgList) then begin + ImgList.Draw(ACanvas, X, ARect.Top + 2, StrToInt(Value)); + Inc(X, ImgList.Width); + end; + ACanvas.TextOut(X + 3, ARect.Top + 1, Value); +end; + +procedure TSpTBXImageIndexEditor.ListMeasureHeight(const Value: string; + ACanvas: TCanvas; var AHeight: Integer); +var + ImgList: TCustomImageList; +begin + ImgList := GetImageListAt(0); + AHeight := ACanvas.TextHeight(Value) + 2; + if Assigned(ImgList) and (ImgList.Height + 4 > AHeight) then + AHeight := ImgList.Height + 4; +end; + +procedure TSpTBXImageIndexEditor.ListMeasureWidth(const Value: string; + ACanvas: TCanvas; var AWidth: Integer); +var + ImgList: TCustomImageList; +begin + ImgList := GetImageListAt(0); + AWidth := ACanvas.TextWidth(Value) + 4; + if Assigned(ImgList) then + Inc(AWidth, ImgList.Width); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM + +procedure Register; +begin + {$IFDEF JR_D9} + ForceDemandLoadState(dlDisable); + {$ENDIF} + + RegisterComponents('SpTBXLib', [TSpTBXDock, TSpTBXMultiDock, TSpTBXToolbar, + TSpTBXToolWindow, TSpTBXDockablePanel, TSpTBXTabSet, TSpTBXTabControl, TSpTBXStatusBar, + TSpTBXPopupMenu, TSpTBXFormPopupMenu, TSpTBXMDIHandler, TSpTBXTitleBar, + TSpTBXLabel, TSpTBXCheckBox, TSpTBXRadioButton, TSpTBXButton, TSpTBXSpeedButton, + TSpTBXProgressBar, TSpTBXTrackBar, TSpTBXSplitter, TSpTBXPanel, TSpTBXGroupBox, + TSpTBXRadioGroup, TSpTBXEdit, TSpTBXButtonEdit, TSpTBXSpinEdit, TSpTBXColorEdit, + TSpTBXComboBox, TSpTBXFontComboBox, TSpTBXListBox, TSpTBXCheckListBox, TSpTBXColorListBox, + TSpTBXPageScroller, TSpTBXCustomizer]); + + RegisterClasses([TSpTBXTabSheet, TSpTBXCustomTabSet, TSpTBXCustomTabControl]); + + // TSpTBXItem + RegisterNoIcon([TSpTBXItem]); + RegisterClasses([TSpTBXItem]); + TBRegisterItemClass(TSpTBXItem, 'New SpTBX Item', HInstance); + // TSpTBXSubmenuItem + RegisterNoIcon([TSpTBXSubmenuItem]); + RegisterClasses([TSpTBXSubmenuItem]); + TBRegisterItemClass(TSpTBXSubmenuItem, 'New SpTBX Submenu Item', HInstance); + // TSpTBXSeparatorItem + RegisterNoIcon([TSpTBXSeparatorItem]); + RegisterClasses([TSpTBXSeparatorItem]); + TBRegisterItemClass(TSpTBXSeparatorItem, 'New SpTBX Separator Item', HInstance); + // TSpTBXSpacerItem + RegisterNoIcon([TSpTBXRightAlignSpacerItem]); + RegisterClasses([TSpTBXRightAlignSpacerItem]); + TBRegisterItemClass(TSpTBXRightAlignSpacerItem, 'New SpTBX RightAlignSpacer Item', HInstance); + // TSpTBXLabelItem + RegisterNoIcon([TSpTBXLabelItem]); + RegisterClasses([TSpTBXLabelItem]); + TBRegisterItemClass(TSpTBXLabelItem, 'New SpTBX Label Item', HInstance); + // TSpTBXSkinGroupItem + RegisterNoIcon([TSpTBXSkinGroupItem]); + RegisterClasses([TSpTBXSkinGroupItem]); + TBRegisterItemClass(TSpTBXSkinGroupItem, 'New SpTBX SkinGroup Item', HInstance); + // TSpTBXColorItem + RegisterNoIcon([TSpTBXColorItem]); + RegisterClasses([TSpTBXColorItem]); + TBRegisterItemClass(TSpTBXColorItem, 'New SpTBX Color Item', HInstance); + // TSpTBXTabItem + RegisterNoIcon([TSpTBXTabItem]); + RegisterClasses([TSpTBXTabItem]); + TBRegisterItemClass(TSpTBXTabItem, 'New SpTBX Tab Item', HInstance); + // TSpTBXEditItem + RegisterNoIcon([TSpTBXEditItem]); + RegisterClasses([TSpTBXEditItem]); + TBRegisterItemClass(TSpTBXEditItem, 'New SpTBX Edit Item', HInstance); + // TSpTBXSpinEditItem + RegisterNoIcon([TSpTBXSpinEditItem]); + RegisterClasses([TSpTBXSpinEditItem]); + TBRegisterItemClass(TSpTBXSpinEditItem, 'New SpTBX Spin Edit Item', HInstance); + // TSpTBXToolPalette + RegisterNoIcon([TSpTBXToolPalette]); + RegisterClasses([TSpTBXToolPalette]); + TBRegisterItemClass(TSpTBXToolPalette, 'New SpTBX Tool Palette Item', HInstance); + // TSpTBXColorPalette + RegisterNoIcon([TSpTBXColorPalette]); + RegisterClasses([TSpTBXColorPalette]); + TBRegisterItemClass(TSpTBXColorPalette, 'New SpTBX Color Palette Item', HInstance); + // TSpTBXMRUListItem + RegisterNoIcon([TSpTBXMRUListItem]); + RegisterClasses([TSpTBXMRUListItem]); + TBRegisterItemClass(TSpTBXMRUListItem, 'New SpTBX MRU List Item', HInstance); + // TSpTBXMDIWindowItem + RegisterNoIcon([TSpTBXMDIWindowItem]); + RegisterClasses([TSpTBXMDIWindowItem]); + TBRegisterItemClass(TSpTBXMDIWindowItem, 'New SpTBX MDI Window Item', HInstance); + + // Register the components editor, the components must implement IItems interface + RegisterComponentEditor(TSpTBXToolbar, TSpTBXItemsEditor); + RegisterComponentEditor(TSpTBXCompoundItemsControl, TSpTBXItemsEditor); + RegisterComponentEditor(TSpTBXDockablePanel, TSpTBXItemsEditor); + RegisterComponentEditor(TSpTBXCustomizer, TSpTBXItemsEditor); + RegisterComponentEditor(TSpTBXPopupMenu, TSpTBXItemsEditor); + + // Register the ImageIndex property editor for TSpTBXTextObject descendants, this is + // needed to show the preview of images in the property editor combobox. + RegisterPropertyEditor(TypeInfo(TImageIndex), TSpTBXTextObject, '', TSpTBXImageIndexEditor); +end; + +end. diff --git a/internal/2.4.4/1/Source/SpTBXSkins.pas b/internal/2.4.4/1/Source/SpTBXSkins.pas new file mode 100644 index 0000000..3332423 --- /dev/null +++ b/internal/2.4.4/1/Source/SpTBXSkins.pas @@ -0,0 +1,3678 @@ +unit SpTBXSkins; + +{============================================================================== +Version 2.4.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: +2 December 2009 - version 2.4.4 + - Renamed the OfficeMenuSeparator skin option to OfficeMenu. + +13 September 2009 - version 2.4.3 + - Improved the gradient painting performance, it's 2x faster on + Vista/Win7, thanks to Kyan and Jim Kueneman for the code donation. + - Fixed CurrentSkin.GetTextColor bug, it didn't return the + correct skncDockablePanelTitleBar text color when using + the EOS skin, thanks to Aaron Taylor for reporting this. + - Fixed CurrentSkin.GetTextColor bug, it didn't return the + correct skncButton disabled text color on Windows Vista, + thanks to Arvid for reporting this. + +8 May 2009 - version 2.4.2 + - No changes. + +15 March 2009 - version 2.4.1 + - Added OnSkinChange event to TSpTBXSkinManager. + +17 January 2009 - version 2.4 + - Minor Fixes. + +26 September 2008 - version 2.3 + - Fixed incorrect skin loading when the Aluminum skin was used, + thanks to Costas Stergiou for reporting this. + +29 July 2008 - version 2.2 + - Fixed incorrect menu items painting on Vista when the Windows + themes was disabled, thanks to Arvid for reporting this. + +26 June 2008 - version 2.1 + - Added Windows Vista specific constants to support Vista + themes on Delphi versions prior to 2007, thanks to Wolf B. + for his contribution. + +3 May 2008 - version 2.0 + - Renamed TSpTBXSkinOptions.TitleBarBorderSize to + FloatingWindowBorderSize. + +2 April 2008 - version 1.9.5 + - No changes. + +3 February 2008 - version 1.9.4 + - Added TitleBarBorderSize to the skins options. + +19 January 2008 - version 1.9.3 + - No changes. + +26 December 2007 - version 1.9.2 + - New gradient skin style added to mimic Vista toolbar gradients, use + 9 or 10 gradient style to paint vertically or horizontally. + +1 December 2007 - version 1.9.1 + - Added Header and Tabs Toolbar skinning. skncHeader and skncTabToolbar + skin elements were added to the skin components type. + - Added SpDrawXPHeader utility function to paint the header controls. + +20 November 2007 - version 1.9 + - Initial release. + +==============================================================================} + +interface + +{$BOOLEVAL OFF} // Unit depends on short-circuit boolean evaluation + +// Use GradientFill API instead of FillRect to paint the gradients +// GradientFill vs FillRect: http://www.mustangpeak.net/phpBB2/viewtopic.php?f=12&t=2109 +{$DEFINE SYSTEM_GRADIENT} + +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_BARITEM = 8; + MENU_POPUPBACKGROUND = 9; + MENU_POPUPBORDERS = 10; + MENU_POPUPCHECK = 11; + MENU_POPUPCHECKBACKGROUND = 12; + MENU_POPUPGUTTER = 13; + MENU_POPUPITEM = 14; + MENU_POPUPSEPARATOR = 15; + MBI_NORMAL = 1; + MBI_HOT = 2; + MBI_PUSHED = 3; + MBI_DISABLED = 4; + MBI_DISABLEDHOT = 5; + MBI_DISABLEDPUSHED = 6; + 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: CSpTBXSkinAllStates), + (Name: 'ProgressBar'; States: [sknsNormal, sknsHotTrack]), + (Name: 'RadioButton'; States: CSpTBXSkinAllStates), + (Name: 'Tab'; States: CSpTBXSkinAllStates), + (Name: 'TrackBar'; States: [sknsNormal, sknsHotTrack]), + (Name: 'TrackBarButton'; States: [sknsNormal, sknsPushed]) + ); + + SSpTBXSkinStatesString: array [TSpTBXSkinStatesType] of string = ('Normal', 'Disabled', 'HotTrack', 'Pushed', 'Checked', 'CheckedAndHotTrack'); + SSpTBXSkinDisplayStatesString: array [TSpTBXSkinStatesType] of string = ('Normal', 'Disabled', 'Hot', 'Pushed', 'Checked', 'Checked && Hot'); + +type + { Text } + + TSpTextRotationAngle = ( + tra0, // No rotation + tra90, // 90 degree rotation + tra270 // 270 degree rotation + ); + + TSpTBXTextInfo = record + Text: WideString; + TextAngle: TSpTextRotationAngle; + TextFlags: Cardinal; + TextSize: TSize; + IsCaptionShown: Boolean; + IsTextRotated: Boolean; + end; + + TSpGlyphLayout = ( + ghlGlyphLeft, // Glyph icon on the left of the caption + ghlGlyphTop // Glyph icon on the top of the caption + ); + + TSpGlowDirection = ( + gldNone, // No glow + gldAll, // Glow on Left, Top, Right and Bottom of the text + gldTopLeft, // Glow on Top-Left of the text + gldBottomRight // Glow on Bottom-Right of the text + ); + + { MenuItem } + + TSpTBXComboPart = (cpNone, cpCombo, cpSplitLeft, cpSplitRight); + TSpTBXMenuItemMarginsInfo = record + Margins: TRect; // MenuItem margins + GutterSize: Integer; // Size of the gutter + LeftCaptionMargin: Integer; // Left margin of the caption + RightCaptionMargin: Integer; // Right margin of the caption + ImageTextSpace: Integer; // Space between the Icon and the caption + end; + + TSpTBXMenuItemInfo = record + Enabled: Boolean; + HotTrack: Boolean; + Pushed: Boolean; + Checked: Boolean; + HasArrow: Boolean; + ImageShown: Boolean; + ImageOrCheckShown: Boolean; + ImageSize: TSize; + RightImageSize: TSize; + IsDesigning: Boolean; + IsOnMenuBar: Boolean; + IsOnToolbox: Boolean; + IsOpen: Boolean; + IsSplit: Boolean; + IsSunkenCaption: Boolean; + IsVertical: Boolean; + MenuMargins: TSpTBXMenuItemMarginsInfo; // Used only on menu items + ComboPart: TSpTBXComboPart; + ComboRect: TRect; + ComboState: TSpTBXSkinStatesType; + ToolbarStyle: Boolean; + State: TSpTBXSkinStatesType; + SkinType: TSpTBXSkinType; + end; + + { Colors } + + TSpTBXColorTextType = ( + cttDefault, // Default format (clWhite, $FFFFFF) + cttHTML, // HTML format (#FFFFFF) + cttIdentAndHTML // Use color idents (clWhite), if not possible use HTML format + ); + + { TSpTBXSkinOptions } + + TSpTBXSkinOptionEntry = class(TPersistent) + private + FSkinType: Integer; + FColor1, FColor2, FColor3, FColor4: TColor; + protected + procedure AssignTo(Dest: TPersistent); override; + public + constructor Create; virtual; + procedure Fill(ASkinType: Integer; AColor1, AColor2, AColor3, AColor4: TColor); + procedure ReadFromString(S: string); + function WriteToString: string; + function IsEmpty: Boolean; + function IsEqual(AOptionEntry: TSpTBXSkinOptionEntry): Boolean; + procedure Lighten(Amount: Integer); + procedure Reset; + published + property SkinType: Integer read FSkinType write FSkinType; + property Color1: TColor read FColor1 write FColor1; + property Color2: TColor read FColor2 write FColor2; + property Color3: TColor read FColor3 write FColor3; + property Color4: TColor read FColor4 write FColor4; + end; + + TSpTBXSkinOptionCategory = class(TPersistent) + private + FBody: TSpTBXSkinOptionEntry; + FBorders: TSpTBXSkinOptionEntry; + FTextColor: TColor; + protected + procedure AssignTo(Dest: TPersistent); override; + public + constructor Create; virtual; + destructor Destroy; override; + function IsEmpty: Boolean; + procedure Reset; + procedure LoadFromIni(MemIni: TMemIniFile; Section, Ident: string); + procedure SaveToIni(MemIni: TMemIniFile; Section, Ident: string); + published + property Body: TSpTBXSkinOptionEntry read FBody write FBody; + property Borders: TSpTBXSkinOptionEntry read FBorders write FBorders; + property TextColor: TColor read FTextColor write FTextColor; + end; + + TSpTBXSkinOptions = class(TPersistent) + private + FColorBtnFace: TColor; + FFloatingWindowBorderSize: Integer; + FOptions: array [TSpTBXSkinComponentsType, TSpTBXSkinStatesType] of TSpTBXSkinOptionCategory; + FOfficeIcons: Boolean; + FOfficeMenu: Boolean; + FOfficeStatusBar: Boolean; + FSkinAuthor: string; + FSkinName: string; + function GetOfficeIcons: Boolean; + function GetOfficeMenu: Boolean; + function GetOfficePopup: Boolean; + function GetOfficeStatusBar: Boolean; + function GetFloatingWindowBorderSize: Integer; + procedure SetFloatingWindowBorderSize(const Value: Integer); + protected + procedure AssignTo(Dest: TPersistent); override; + procedure BroadcastChanges; + public + constructor Create; virtual; + destructor Destroy; override; + procedure CopyOptions(AComponent, ToComponent: TSpTBXSkinComponentsType); + procedure FillOptions; virtual; + function Options(Component: TSpTBXSkinComponentsType; State: TSpTBXSkinStatesType): TSpTBXSkinOptionCategory; overload; + function Options(Component: TSpTBXSkinComponentsType): TSpTBXSkinOptionCategory; overload; + procedure LoadFromFile(Filename: WideString); + procedure LoadFromStrings(L: TStrings); virtual; + procedure SaveToFile(Filename: WideString); + procedure SaveToStrings(L: TStrings); virtual; + procedure SaveToMemIni(MemIni: TMemIniFile); virtual; + procedure Reset(ForceResetSkinProperties: Boolean = False); + + // Metrics + procedure GetDropDownArrowSize(out DropDownArrowSize, DropDownArrowMargin, SplitBtnArrowSize: Integer); virtual; + procedure GetMenuItemMargins(ACanvas: TCanvas; ImgSize: Integer; out MarginsInfo: TSpTBXMenuItemMarginsInfo); virtual; + function GetState(Enabled, Pushed, HotTrack, Checked: Boolean): TSpTBXSkinStatesType; + function GetTextColor(Component: TSpTBXSkinComponentsType; State: TSpTBXSkinStatesType; SkinType: TSpTBXSkinType = sknSkin): TColor; virtual; + + // Skin Paint + procedure PaintBackground(ACanvas: TCanvas; ARect: TRect; Component: TSpTBXSkinComponentsType; State: TSpTBXSkinStatesType; Background, Borders: Boolean; Vertical: Boolean = False; ForceRectBorders: TAnchors = []); virtual; + + // Element Paint + procedure PaintMenuCheckMark(ACanvas: TCanvas; ARect: TRect; Checked, Grayed, MenuItemStyle: Boolean; State: TSpTBXSkinStatesType); virtual; + procedure PaintMenuRadioMark(ACanvas: TCanvas; ARect: TRect; Checked, MenuItemStyle: Boolean; State: TSpTBXSkinStatesType); virtual; + procedure PaintWindowFrame(ACanvas: TCanvas; ARect: TRect; IsActive, DrawBody: Boolean; BorderSize: Integer = 4); virtual; + + // Properties + property ColorBtnFace: TColor read FColorBtnFace write FColorBtnFace; + property FloatingWindowBorderSize: Integer read GetFloatingWindowBorderSize write SetFloatingWindowBorderSize; + property OfficeIcons: Boolean read GetOfficeIcons write FOfficeIcons; + property OfficeMenu: Boolean read GetOfficeMenu write FOfficeMenu; + property OfficePopup: Boolean read GetOfficePopup; + property OfficeStatusBar: Boolean read GetOfficeStatusBar write FOfficeStatusBar; + property SkinAuthor: string read FSkinAuthor write FSkinAuthor; + property SkinName: string read FSkinName write FSkinName; + end; + + TSpTBXSkinOptionsClass = class of TSpTBXSkinOptions; + + { TSpTBXSkinsList } + + TSpTBXSkinsListEntry = class + public + SkinClass: TSpTBXSkinOptionsClass; + SkinStrings: TStringList; + destructor Destroy; override; + end; + + TSpTBXSkinsList = class(TStringList) + private + function GetSkinOption(Index: Integer): TSpTBXSkinsListEntry; + public + procedure Delete(Index: Integer); override; + destructor Destroy; override; + function AddSkin(SkinName: string; SkinClass: TSpTBXSkinOptionsClass): Integer; overload; + function AddSkin(SkinOptions: TStrings): Integer; overload; + function AddSkinFromFile(Filename: WideString): Integer; + procedure AddSkinsFromFolder(Folder: WideString); + procedure GetSkinNames(SkinNames: TStrings); + property SkinOptions[Index: Integer]: TSpTBXSkinsListEntry read GetSkinOption; + end; + + { TSpTBXSkinManager } + + TSpTBXSkinManager = class + private + FCurrentSkin: TSpTBXSkinOptions; + FNotifies: TList; + FSkinsList: TSpTBXSkinsList; + FOnSkinChange: TNotifyEvent; + procedure Broadcast; + function GetCurrentSkinName: string; + public + constructor Create; virtual; + destructor Destroy; override; + + function GetSkinType: TSpTBXSkinType; + function IsDefaultSkin: Boolean; + function IsXPThemesEnabled: Boolean; + + procedure AddSkinNotification(AObject: TObject); + procedure RemoveSkinNotification(AObject: TObject); + procedure BroadcastSkinNotification; + + procedure LoadFromFile(Filename: WideString); + procedure SaveToFile(Filename: WideString); + + procedure SetToDefaultSkin; + procedure SetSkin(SkinName: string); + procedure ChangeControlSkinType(Control: TWinControl; SkinType: TSpTBXSkinType; Recursive: Boolean = True); + + property CurrentSkin: TSpTBXSkinOptions read FCurrentSkin; + property CurrentSkinName: string read GetCurrentSkinName; + property SkinsList: TSpTBXSkinsList read FSkinsList; + property OnSkinChange: TNotifyEvent read FOnSkinChange write FOnSkinChange; + end; + + { TSpTBXSkinSwitcher } + + TSpTBXSkinSwitcher = class(TComponent) + private + FOnSkinChange: TNotifyEvent; + function GetSkin: string; + procedure SetSkin(const Value: string); + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + published + property Skin: string read GetSkin write SetSkin; + property OnSkinChange: TNotifyEvent read FOnSkinChange write FOnSkinChange; + end; + + { TSpPrintWindow } + // Use SpPrintWindow instead of PaintTo as many controls will not render + // properly (no text on editors, no scrollbars, incorrect borders, etc) + // http://msdn2.microsoft.com/en-us/library/ms535695.aspx + TSpPrintWindow = function(Hnd: HWND; HdcBlt: HDC; nFlags: UINT): BOOL; stdcall; + +{ Themes } +function SkinManager: TSpTBXSkinManager; +function CurrentSkin: TSpTBXSkinOptions; +function SpTBXSkinType(T: TSpTBXSkinType): TSpTBXSkinType; +function SpGetLunaScheme: TSpTBXLunaScheme; +procedure SpDrawParentBackground(Control: TControl; DC: HDC; R: TRect); + +{ WideString helpers } +function SpCreateRotatedFont(DC: HDC; Orientation: Integer = 2700): HFONT; +function SpDrawRotatedText(const DC: HDC; AText: WideString; var ARect: TRect; const AFormat: Cardinal; RotationAngle: TSpTextRotationAngle = tra270): Integer; +function SpCalcXPText(ACanvas: TCanvas; ARect: TRect; Caption: WideString; CaptionAlignment: TAlignment; Flags: Cardinal; GlyphSize, RightGlyphSize: TSize; Layout: TSpGlyphLayout; PushedCaption: Boolean; out ACaptionRect, AGlyphRect, ARightGlyphRect: TRect; RotationAngle: TSpTextRotationAngle = tra0): Integer; +function SpDrawXPText(ACanvas: TCanvas; Caption: WideString; var ARect: TRect; Flags: Cardinal; CaptionGlow: TSpGlowDirection = gldNone; CaptionGlowColor: TColor = clYellow; RotationAngle: TSpTextRotationAngle = tra0): Integer; overload; +function SpDrawXPText(ACanvas: TCanvas; ARect: TRect; Caption: WideString; CaptionGlow: TSpGlowDirection; CaptionGlowColor: TColor; CaptionAlignment: TAlignment; Flags: Cardinal; GlyphSize: TSize; Layout: TSpGlyphLayout; PushedCaption: Boolean; out ACaptionRect, AGlyphRect: TRect; RotationAngle: TSpTextRotationAngle = tra0): Integer; overload; +function SpDrawXPText(ACanvas: TCanvas; ARect: TRect; Caption: WideString; CaptionGlow: TSpGlowDirection; CaptionGlowColor: TColor; CaptionAlignment: TAlignment; Flags: Cardinal; IL: TCustomImageList; ImageIndex: Integer; Layout: TSpGlyphLayout; Enabled, PushedCaption, DisabledIconCorrection: Boolean; out ACaptionRect, AGlyphRect: TRect; RotationAngle: TSpTextRotationAngle = tra0): Integer; overload; +function SpGetTextSize(DC: HDC; WS: WideString; NoPrefix: Boolean): TSize; +function SpGetControlTextHeight(AControl: TControl; AFont: TFont): Integer; +function SpGetControlTextSize(AControl: TControl; AFont: TFont; WS: WideString): TSize; +function SpSameText(W1, W2: WideString): Boolean; +function SpStripAccelChars(S: WideString): WideString; +function SpStripShortcut(S: WideString): WideString; +function SpStripTrailingPunctuation(S: WideString): WideString; +function SpRectToString(R: TRect): string; +function SpStringToRect(S: string; out R: TRect): Boolean; + +{ Color helpers } +function SpColorToHTML(const Color: TColor): string; +function SpColorToString(const Color: TColor; TextType: TSpTBXColorTextType = cttDefault): string; +function SpStringToColor(S: string; out Color: TColor): Boolean; +procedure SpGetRGB(Color: TColor; out R, G, B: Integer); +function SpRGBToColor(R, G, B: Integer): TColor; +function SpLighten(Color: TColor; Amount: Integer): TColor; +function SpBlendColors(TargetColor, BaseColor: TColor; Percent: Integer): TColor; +function SpMixColors(TargetColor, BaseColor: TColor; Amount: Byte): TColor; + +{ Painting helpers } +function SpCenterRect(Parent: TRect; ChildWidth, ChildHeight: Integer): TRect; overload; +function SpCenterRect(Parent, Child: TRect): TRect; overload; +function SpCenterRectHoriz(Parent: TRect; ChildWidth: Integer): TRect; +function SpCenterRectVert(Parent: TRect; ChildHeight: Integer): TRect; +procedure SpFillRect(ACanvas: TCanvas; const ARect: TRect; BrushColor: TColor; PenColor: TColor = clNone); +procedure SpDrawLine(ACanvas: TCanvas; X1, Y1, X2, Y2: Integer; Color: TColor); +procedure SpDrawRectangle(ACanvas: TCanvas; ARect: TRect; CornerSize: Integer; ColorTL, ColorBR: TColor; ColorTLInternal: TColor = clNone; ColorBRInternal: TColor = clNone; ForceRectBorders: TAnchors = []); overload; +procedure SpDrawRectangle(ACanvas: TCanvas; ARect: TRect; CornerSize: Integer; ColorL, ColorT, ColorR, ColorB, InternalColorL, InternalColorT, InternalColorR, InternalColorB: TColor; ForceRectBorders: TAnchors = []); overload; +procedure SpAlphaBlend(SrcDC, DstDC: HDC; SrcR, DstR: TRect; Alpha: Byte; SrcHasAlphaChannel: Boolean = False); +procedure SpPaintTo(WinControl: TWinControl; ACanvas: TCanvas; X, Y: Integer); + +{ ImageList painting } +procedure SpDrawIconShadow(ACanvas: TCanvas; const ARect: TRect; ImageList: TCustomImageList; ImageIndex: Integer); +procedure SpDrawImageList(ACanvas: TCanvas; const ARect: TRect; ImageList: TCustomImageList; ImageIndex: Integer; Enabled, DisabledIconCorrection: Boolean); + +{ Gradients } +procedure SpGradient(ACanvas: TCanvas; const ARect: TRect; StartPos, EndPos, ChunkSize: Integer; C1, C2: TColor; const Vertical: Boolean); +procedure SpGradientFill(ACanvas: TCanvas; const ARect: TRect; const C1, C2: TColor; const Vertical: Boolean); +procedure SpGradientFillMirror(ACanvas: TCanvas; const ARect: TRect; const C1, C2, C3, C4: TColor; const Vertical: Boolean); +procedure SpGradientFillMirrorTop(ACanvas: TCanvas; const ARect: TRect; const C1, C2, C3, C4: TColor; const Vertical: Boolean); +procedure SpGradientFillGlass(ACanvas: TCanvas; const ARect: TRect; const C1, C2, C3, C4: TColor; const Vertical: Boolean); + +{ Element painting } +procedure SpDrawArrow(ACanvas: TCanvas; X, Y: Integer; AColor: TColor; Vertical, Reverse: Boolean; Size: Integer); +procedure SpDrawDropMark(ACanvas: TCanvas; DropMark: TRect); +procedure SpDrawFocusRect(ACanvas: TCanvas; const ARect: TRect); +procedure SpDrawGlyphPattern(DC: HDC; const R: TRect; Width, Height: Integer; const PatternBits; PatternColor: TColor); overload; +procedure SpDrawGlyphPattern(ACanvas: TCanvas; ARect: TRect; PatternIndex: Integer; PatternColor: TColor); overload; +procedure SpDrawXPButton(ACanvas: TCanvas; ARect: TRect; Enabled, Pushed, HotTrack, Checked, Focused, Defaulted: Boolean; SkinType: TSpTBXSkinType); +procedure SpDrawXPCheckBoxGlyph(ACanvas: TCanvas; ARect: TRect; Enabled: Boolean; State: TCheckBoxState; HotTrack, Pushed: Boolean; SkinType: TSpTBXSkinType); +procedure SpDrawXPRadioButtonGlyph(ACanvas: TCanvas; ARect: TRect; Enabled, Checked, HotTrack, Pushed: Boolean; SkinType: TSpTBXSkinType); +procedure SpDrawXPEditFrame(ACanvas: TCanvas; ARect: TRect; Enabled, HotTrack: Boolean; SkinType: TSpTBXSkinType; ClipContent: Boolean = False; AutoAdjust: Boolean = False); overload; +procedure SpDrawXPEditFrame(AWinControl: TWinControl; HotTracking: Boolean; SkinType: TSpTBXSkinType; AutoAdjust: Boolean = False; HideFrame: Boolean = False); overload; +procedure SpDrawXPGrip(ACanvas: TCanvas; ARect: TRect; LoC, HiC: TColor); +procedure SpDrawXPHeader(ACanvas: TCanvas; ARect: TRect; HotTrack, Pushed: Boolean; SkinType: TSpTBXSkinType); +procedure SpDrawXPListItemBackground(ACanvas: TCanvas; ARect: TRect; Selected, HotTrack, Focused: Boolean; SkinType: TSpTBXSkinType; ForceRectBorders: Boolean = False; Borders: Boolean = True); + +{ Skins painting } +procedure SpPaintSkinBackground(ACanvas: TCanvas; ARect: TRect; SkinOption: TSpTBXSkinOptionCategory; Vertical: Boolean); +procedure SpPaintSkinBorders(ACanvas: TCanvas; ARect: TRect; SkinOption: TSpTBXSkinOptionCategory; ForceRectBorders: TAnchors = []); + +{ Misc } +function SpIsWinVistaOrUp: Boolean; +function SpGetDirectories(Path: WideString; L: TStringList): Boolean; + +{ Stock Objects } +var + StockBitmap: TBitmap; + SpPrintWindow: TSpPrintWindow = nil; + +implementation + +uses + UxTheme, Themes, Forms, Math, TypInfo, SpTBXDefaultSkins; + +var + FInternalSkinManager: TSpTBXSkinManager = nil; + + {$IFDEF SYSTEM_GRADIENT} + FMsimg32Library: HMODULE; + {$ENDIF} + +const + ROP_DSPDxax = $00E20746; + +type + TTriVertex = packed record + X: Integer; + Y: Integer; + Red: WORD; + Green: WORD; + Blue: WORD; + Alpha: WORD; + end; + + TControlAccess = class(TControl); + +{$IFDEF SYSTEM_GRADIENT} +var + GradientFillSystem: function (ADC: THandle; const AVertex: TTriVertex; ANumVertex: Integer; + const AMesh: TGradientRect; ANumMesh: Integer; AMode: DWORD): Boolean; stdcall; +{$ENDIF} + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Skin Notification } + +function SkinManager: TSpTBXSkinManager; +begin + if not Assigned(FInternalSkinManager) then + FInternalSkinManager := TSpTBXSkinManager.Create; + Result := FInternalSkinManager; +end; + +function CurrentSkin: TSpTBXSkinOptions; +begin + Result := SkinManager.CurrentSkin; +end; + +function SpTBXSkinType(T: TSpTBXSkinType): TSpTBXSkinType; +begin + Result := T; + if (Result = sknSkin) and SkinManager.IsDefaultSkin then + Result := sknWindows; + if (Result = sknWindows) and not SkinManager.IsXPThemesEnabled then + Result := sknNone; +end; + +function SpGetLunaScheme: TSpTBXLunaScheme; +const + MaxChars = 1024; +var + pszThemeFileName, pszColorBuff, pszSizeBuf: PWideChar; + S: string; +begin + Result := lusUnknown; + + if SkinManager.IsXPThemesEnabled then begin + GetMem(pszThemeFileName, 2 * MaxChars); + GetMem(pszColorBuff, 2 * MaxChars); + GetMem(pszSizeBuf, 2 * MaxChars); + try + if not Failed(GetCurrentThemeName(pszThemeFileName, MaxChars, pszColorBuff, MaxChars, pszSizeBuf, MaxChars)) then + if UpperCase(ExtractFileName(pszThemeFileName)) = 'LUNA.MSSTYLES' then begin + S := UpperCase(pszColorBuff); + if S = 'NORMALCOLOR' then + Result := lusBlue + else if S = 'METALLIC' then + Result := lusMetallic + else if S = 'HOMESTEAD' then + Result := lusGreen; + end; + finally + FreeMem(pszSizeBuf); + FreeMem(pszColorBuff); + FreeMem(pszThemeFileName); + end; + end; +end; + +procedure SpDrawParentBackground(Control: TControl; DC: HDC; R: TRect); +// Delphi 2007 and Vista compatible +var + Parent: TWinControl; + P: TPoint; + Brush: HBRUSH; +begin + Parent := Control.Parent; + if Parent = nil then begin + Brush := CreateSolidBrush(ColorToRGB(clBtnFace)); + Windows.FillRect(DC, R, Brush); + end + else if Parent.HandleAllocated then begin + if not Parent.DoubleBuffered and (Control is TWinControl) and SkinManager.IsXPThemesEnabled then + UxTheme.DrawThemeParentBackground(TWinControl(Control).Handle, DC, @R) + else begin + // Same as Controls.PerformEraseBackground + GetWindowOrgEx(DC, P); + SetWindowOrgEx(DC, P.X + Control.Left, P.Y + Control.Top, nil); + Parent.Perform(WM_ERASEBKGND, Integer(DC), Integer(DC)); + SetWindowOrgEx(DC, P.X, P.Y, nil); + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ WideString helpers} + +function EnumFontsProc(const lplf: TLogFont; const lptm: TTextMetric; + dwType: DWORD; lpData: LPARAM): Integer; stdcall; +begin + Boolean(Pointer(lpData)^) := True; + Result := 0; +end; + +function SpCreateRotatedFont(DC: HDC; Orientation: Integer = 2700): HFONT; +var + LogFont: TLogFont; + TM: TTextMetric; + VerticalFontName: array[0..LF_FACESIZE-1] of Char; + VerticalFontExists: Boolean; +begin + if GetObject(GetCurrentObject(DC, OBJ_FONT), SizeOf(LogFont), + @LogFont) = 0 then begin + { just in case... } + Result := 0; + Exit; + end; + LogFont.lfEscapement := Orientation; + LogFont.lfOrientation := Orientation; + LogFont.lfOutPrecision := OUT_TT_ONLY_PRECIS; { needed for Win9x } + + { Don't let a random TrueType font be substituted when MS Sans Serif or + Microsoft Sans Serif are used. On Windows 2000 and later, hard-code Tahoma + because Arial can't display Japanese or Thai Unicode characters (on Windows + 2000 at least). On earlier versions, hard-code Arial since NT 4.0 doesn't + ship with Tahoma, and 9x doesn't do Unicode. } + if (StrIComp(LogFont.lfFaceName, 'MS Sans Serif') = 0) or + (StrIComp(LogFont.lfFaceName, 'Microsoft Sans Serif') = 0) then begin + if Win32MajorVersion >= 5 then + StrPCopy(LogFont.lfFaceName, 'Tahoma') + else + StrPCopy(LogFont.lfFaceName, 'Arial'); + { Set lfHeight to the actual height of the current font. This is needed + to work around a Windows 98 issue: on a clean install of the OS, + SPI_GETNONCLIENTMETRICS returns -5 for lfSmCaptionFont.lfHeight. This is + wrong; it should return -11 for an 8 pt font. With normal, unrotated text + this actually displays correctly, since MS Sans Serif doesn't support + sizes below 8 pt. However, when we change to a TrueType font like Arial, + this becomes a problem because it'll actually create a font that small. } + if GetTextMetrics(DC, TM) then begin + { If the original height was negative, keep it negative } + if LogFont.lfHeight <= 0 then + LogFont.lfHeight := -(TM.tmHeight - TM.tmInternalLeading) + else + LogFont.lfHeight := TM.tmHeight; + end; + end; + + { Use a vertical font if available so that Asian characters aren't drawn + sideways } + if StrLen(LogFont.lfFaceName) < SizeOf(VerticalFontName)-1 then begin + VerticalFontName[0] := '@'; + StrCopy(@VerticalFontName[1], LogFont.lfFaceName); + VerticalFontExists := False; + EnumFonts(DC, VerticalFontName, @EnumFontsProc, @VerticalFontExists); + if VerticalFontExists then + StrCopy(LogFont.lfFaceName, VerticalFontName); + end; + + Result := CreateFontIndirect(LogFont); +end; + +function SpDrawRotatedText(const DC: HDC; AText: WideString; var ARect: TRect; const AFormat: Cardinal; RotationAngle: TSpTextRotationAngle = tra270): Integer; +{ The format flag this function respects are + DT_CALCRECT, DT_NOPREFIX, DT_HIDEPREFIX, DT_CENTER, DT_END_ELLIPSIS, DT_NOCLIP } +var + RotatedFont, SaveFont: HFONT; + TextMetrics: TTextMetric; + X, Y, P, I, SU, FU, W: Integer; + SaveAlign: UINT; + Clip: Boolean; + Pen, SavePen: HPEN; + Sz: TSize; + Orientation: Integer; +begin + Result := 0; + if Length(AText) = 0 then Exit; + + Orientation := 0; + case RotationAngle of + tra90: Orientation := 900; // 90 degrees + tra270: Orientation := 2700; // 270 degrees + end; + RotatedFont := SpCreateRotatedFont(DC, Orientation); + SaveFont := SelectObject(DC, RotatedFont); + + GetTextMetrics(DC, TextMetrics); + X := ARect.Left + (ARect.Right - ARect.Left - TextMetrics.tmHeight) div 2; + + Clip := AFormat and DT_NOCLIP = 0; + + { Find the index of the character that should be underlined. Delete '&' + characters from the string. Like DrawText, only the last prefixed character + will be underlined. } + P := 0; + I := 1; + if AFormat and DT_NOPREFIX = 0 then + while I <= Length(AText) do + begin + if AText[I] = '&' then + begin + Delete(AText, I, 1); + if PWideChar(AText)[I - 1] <> '&' then P := I; + end; + Inc(I); + end; + + if AFormat and DT_END_ELLIPSIS <> 0 then + begin + if (Length(AText) > 1) and (SpGetTextSize(DC, AText, False).cx > ARect.Bottom - ARect.Top) then + begin + W := ARect.Bottom - ARect.Top; + if W > 2 then + begin + Delete(AText, Length(AText), 1); + while (Length(AText) > 1) and (SpGetTextSize(DC, AText + '...', False).cx > W) do + Delete(AText, Length(AText), 1); + end + else AText := AText[1]; + if P > Length(AText) then P := 0; + AText := AText + '...'; + end; + end; + + Sz := SpGetTextSize(DC, AText, False); + Result := Sz.cy; + + if AFormat and DT_CALCRECT <> 0 then begin + ARect.Right := ARect.Left + Sz.cy; + ARect.Bottom := ARect.Top + Sz.cx; + end + else begin + if AFormat and DT_CENTER <> 0 then + Y := ARect.Top + (ARect.Bottom - ARect.Top - Sz.cx) div 2 + else + Y := ARect.Top; + + if Clip then + begin + SaveDC(DC); + with ARect do IntersectClipRect(DC, Left, Top, Right, Bottom); + end; + + case RotationAngle of + tra90: SaveAlign := SetTextAlign(DC, TA_RIGHT); + tra270: SaveAlign := SetTextAlign(DC, TA_BOTTOM); + else + SaveAlign := SetTextAlign(DC, TA_LEFT); + end; + + if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then + Windows.TextOutA(DC, X, Y, PAnsiChar(AnsiString(AText)), Length(AnsiString(AText))) + else + Windows.TextOutW(DC, X, Y, PWideChar(AText), Length(AText)); + + SetTextAlign(DC, SaveAlign); + + { Underline } + if (P > 0) and (AFormat and DT_HIDEPREFIX = 0) then + begin + SU := SpGetTextSize(DC, Copy(AText, 1, P - 1), False).cx; + FU := SU + SpGetTextSize(DC, PWideChar(AText)[P - 1], False).cx; + Inc(X, TextMetrics.tmDescent - 2); + Pen := CreatePen(PS_SOLID, 1, GetTextColor(DC)); + SavePen := SelectObject(DC, Pen); + MoveToEx(DC, X, Y + SU, nil); + LineTo(DC, X, Y + FU); + SelectObject(DC, SavePen); + DeleteObject(Pen); + end; + + if Clip then RestoreDC(DC, -1); + end; + + SelectObject(DC, SaveFont); + DeleteObject(RotatedFont); +end; + +function SpCalcXPText(ACanvas: TCanvas; ARect: TRect; Caption: WideString; + CaptionAlignment: TAlignment; Flags: Cardinal; GlyphSize, RightGlyphSize: TSize; + Layout: TSpGlyphLayout; PushedCaption: Boolean; out ACaptionRect, AGlyphRect, ARightGlyphRect: TRect; + RotationAngle: TSpTextRotationAngle = tra0): Integer; +var + R: TRect; + TextOffset, Spacing, RightSpacing: TPoint; + CaptionSz: TSize; +begin + Result := 0; + ACaptionRect := Rect(0, 0, 0, 0); + AGlyphRect := Rect(0, 0, 0, 0); + ARightGlyphRect := Rect(0, 0, 0, 0); + TextOffset := Point(0, 0); + Spacing := Point(0, 0); + RightSpacing := Point(0, 0); + if (Caption <> '') and (GlyphSize.cx > 0) and (GlyphSize.cy > 0) then + Spacing := Point(4, 1); + if (Caption <> '') and (RightGlyphSize.cx > 0) and (RightGlyphSize.cy > 0) then + RightSpacing := Point(4, 1); + + Flags := Flags and not DT_CENTER; + Flags := Flags and not DT_VCENTER; + if CaptionAlignment = taRightJustify then + Flags := Flags or DT_RIGHT; + + // DT_END_ELLIPSIS and DT_PATH_ELLIPSIS doesn't work with rotated text + // http://support.microsoft.com/kb/249678 + // Revert the ARect if the text is rotated, from now on work on horizontal text !!! + if RotationAngle <> tra0 then + ARect := Rect(ARect.Top, ARect.Left, ARect.Bottom, ARect.Right); + + // Get the caption size + if ((Flags and DT_WORDBREAK) <> 0) or ((Flags and DT_END_ELLIPSIS) <> 0) or ((Flags and DT_PATH_ELLIPSIS) <> 0) then begin + if Layout = ghlGlyphLeft then // Glyph on left or right side + R := Rect(0, 0, ARect.Right - ARect.Left - GlyphSize.cx - Spacing.X - RightGlyphSize.cx - RightSpacing.X + 2, 1) + else // Glyph on top + R := Rect(0, 0, ARect.Right - ARect.Left + 2, 1); + end + else + R := Rect(0, 0, 1, 1); + + if (fsBold in ACanvas.Font.Style) and (RotationAngle = tra0) and (((Flags and DT_END_ELLIPSIS) <> 0) or ((Flags and DT_PATH_ELLIPSIS) <> 0)) then begin + // [Bugfix] Windows bug: + // When the Font is Bold and DT_END_ELLIPSIS or DT_PATH_ELLIPSIS is used + // DrawTextW returns an incorrect size if the string is unicode. + // The R.Right is reduced by 3 which cuts down the string and + // adds the ellipsis. + // We have to obtain the real size and check if it fits in the Rect. + CaptionSz := SpGetTextSize(ACanvas.Handle, Caption, True); + if CaptionSz.cx <= R.Right then begin + R := Rect(0, 0, CaptionSz.cx, CaptionSz.cy); + Result := CaptionSz.cy; + end; + end; + + if Result <= 0 then begin + Result := SpDrawXPText(ACanvas, Caption, R, Flags or DT_CALCRECT, gldNone, clYellow); + CaptionSz.cx := R.Right; + CaptionSz.cy := R.Bottom; + end; + + // ACaptionRect + if Result > 0 then begin + R.Top := ARect.Top + (ARect.Bottom - ARect.Top - CaptionSz.cy) div 2; // Vertically centered + R.Bottom := R.Top + CaptionSz.cy; + case CaptionAlignment of + taCenter: + R.Left := ARect.Left + (ARect.Right - ARect.Left - CaptionSz.cx) div 2; // Horizontally centered + taLeftJustify: + R.Left := ARect.Left; + taRightJustify: + R.Left := ARect.Right - CaptionSz.cx; + end; + R.Right := R.Left + CaptionSz.cx; + + // Since DT_END_ELLIPSIS and DT_PATH_ELLIPSIS doesn't work with rotated text + // try to fix it by padding the text 8 pixels to the right + if (RotationAngle <> tra0) and (R.Right + 8 < ARect.Right) then + if ((Flags and DT_END_ELLIPSIS) <> 0) or ((Flags and DT_PATH_ELLIPSIS) <> 0) then + R.Right := R.Right + 8; + + if PushedCaption then + OffsetRect(R, 1, 1); + + ACaptionRect := R; + end; + + // AGlyphRect + if (GlyphSize.cx > 0) and (GlyphSize.cy > 0) then begin + R := ARect; + + // If ghlGlyphTop is used the glyph should be centered + if Layout = ghlGlyphTop then + CaptionAlignment := taCenter; + + case CaptionAlignment of + taCenter: + begin + // Total width = Icon + Space + Text + if Layout = ghlGlyphLeft then begin + AGlyphRect.Left := R.Left + (R.Right - R.Left - (GlyphSize.cx + Spacing.X + CaptionSz.cx)) div 2; + TextOffset.X := (GlyphSize.cx + Spacing.X) div 2; + end + else + AGlyphRect.Left := R.Left + (R.Right - R.Left - GlyphSize.cx) div 2; + end; + taLeftJustify: + begin + AGlyphRect.Left := R.Left; + TextOffset.X := GlyphSize.cx + Spacing.X; + end; + taRightJustify: + begin + AGlyphRect.Left := R.Right - GlyphSize.cx; + TextOffset.X := - Spacing.X - GlyphSize.cx; + end; + end; + + if Layout = ghlGlyphLeft then + AGlyphRect.Top := R.Top + (R.Bottom - R.Top - GlyphSize.cy) div 2 + else begin + AGlyphRect.Top := R.Top + (R.Bottom - R.Top - (GlyphSize.cy + Spacing.Y + CaptionSz.cy)) div 2; + Inc(TextOffset.Y, (GlyphSize.cy + Spacing.Y) div 2); + end; + + AGlyphRect.Right := AGlyphRect.Left + GlyphSize.cx; + AGlyphRect.Bottom := AGlyphRect.Top + GlyphSize.cy; + + if PushedCaption then + OffsetRect(AGlyphRect, 1, 1); + end; + + // Move the text according to the icon position + if Result > 0 then + OffsetRect(ACaptionRect, TextOffset.X, TextOffset.Y); + + // ARightGlyphRect, it's valid only when using taLeftJustify + if (RightGlyphSize.cx > 0) and (RightGlyphSize.cy > 0) then + if CaptionAlignment = taLeftJustify then begin + R := ARect; + ARightGlyphRect.Left := R.Right - RightGlyphSize.cx; + ARightGlyphRect.Right := ARightGlyphRect.Left + RightGlyphSize.cx; + ARightGlyphRect.Top := R.Top + (R.Bottom - R.Top - RightGlyphSize.cy) div 2; + ARightGlyphRect.Bottom := ARightGlyphRect.Top + RightGlyphSize.cy; + if (Result > 0) and (ACaptionRect.Right > ARightGlyphRect.Left - RightSpacing.X) then + ACaptionRect.Right := ARightGlyphRect.Left - RightSpacing.X; + end; + + // Revert back, normalize when the text is rotated + if RotationAngle <> tra0 then begin + ACaptionRect := Rect(ACaptionRect.Top, ACaptionRect.Left, ACaptionRect.Bottom, ACaptionRect.Right); + AGlyphRect := Rect(AGlyphRect.Top, AGlyphRect.Left, AGlyphRect.Bottom, AGlyphRect.Right); + ARightGlyphRect := Rect(ARightGlyphRect.Top, ARightGlyphRect.Left, ARightGlyphRect.Bottom, ARightGlyphRect.Right); + end; +end; + +function SpDrawXPText(ACanvas: TCanvas; Caption: WideString; var ARect: TRect; + Flags: Cardinal; CaptionGlow: TSpGlowDirection = gldNone; + CaptionGlowColor: TColor = clYellow; RotationAngle: TSpTextRotationAngle = tra0): Integer; overload; + + function InternalDraw(var R: TRect): Integer; + begin + Result := 0; + case RotationAngle of + tra0: + if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then + Result := Windows.DrawTextA(ACanvas.Handle, PAnsiChar(AnsiString(Caption)), -1, R, Flags) + else + Result := Windows.DrawTextW(ACanvas.Handle, PWideChar(Caption), -1, R, Flags); + tra90, tra270: + Result := SpDrawRotatedText(ACanvas.Handle, Caption, R, Flags, RotationAngle); + end; + end; + +var + BS: TBrushStyle; + GlowR: TRect; + C, FC: TColor; +begin + BS := ACanvas.Brush.Style; + C := ACanvas.Brush.Color; + try + ACanvas.Brush.Style := bsClear; + + if (Flags and DT_CALCRECT = 0) and (CaptionGlow <> gldNone) then begin + FC := ACanvas.Font.Color; + ACanvas.Font.Color := CaptionGlowColor; + case CaptionGlow of + gldAll: + begin + GlowR := ARect; OffsetRect(GlowR, 0, -1); + InternalDraw(GlowR); + GlowR := ARect; OffsetRect(GlowR, 0, 1); + InternalDraw(GlowR); + GlowR := ARect; OffsetRect(GlowR, -1, 0); + InternalDraw(GlowR); + GlowR := ARect; OffsetRect(GlowR, 1, 0); + end; + gldTopLeft: + begin + GlowR := ARect; OffsetRect(GlowR, -1, -1); + InternalDraw(GlowR); + end; + gldBottomRight: + begin + GlowR := ARect; OffsetRect(GlowR, 1, 1); + InternalDraw(GlowR); + end; + end; + ACanvas.Font.Color := FC; + end; + + Result := InternalDraw(ARect); + + if IsRectEmpty(ARect) then + Result := 0 + else + if Flags and DT_CALCRECT <> 0 then begin + // [Bugfix] Windows bug: + // When DT_CALCRECT is used and the font is italic the + // resulting rect is incorrect + if fsItalic in ACanvas.Font.Style then + ARect.Right := ARect.Right + 1 + (ACanvas.Font.Size div 8) * 2; + end; + + finally + ACanvas.Brush.Style := BS; + ACanvas.Brush.Color := C; + end; +end; + +function SpDrawXPText(ACanvas: TCanvas; ARect: TRect; Caption: WideString; + CaptionGlow: TSpGlowDirection; CaptionGlowColor: TColor; CaptionAlignment: TAlignment; + Flags: Cardinal; GlyphSize: TSize; Layout: TSpGlyphLayout; PushedCaption: Boolean; + out ACaptionRect, AGlyphRect: TRect; + RotationAngle: TSpTextRotationAngle = tra0): Integer; overload; +var + DummyRightGlyphSize: TSize; + DummyRightGlyphRect: TRect; +begin + DummyRightGlyphSize.cx := 0; + DummyRightGlyphSize.cy := 0; + DummyRightGlyphRect := Rect(0, 0, 0, 0); + Result := SpCalcXPText(ACanvas, ARect, Caption, CaptionAlignment, Flags, GlyphSize, DummyRightGlyphSize, + Layout, PushedCaption, ACaptionRect, AGlyphRect, DummyRightGlyphRect, RotationAngle); + SpDrawXPText(ACanvas, Caption, ACaptionRect, Flags and not DT_CALCRECT, CaptionGlow, CaptionGlowColor, RotationAngle); +end; + +function SpDrawXPText(ACanvas: TCanvas; ARect: TRect; Caption: WideString; + CaptionGlow: TSpGlowDirection; CaptionGlowColor: TColor; CaptionAlignment: TAlignment; + Flags: Cardinal; IL: TCustomImageList; ImageIndex: Integer; Layout: TSpGlyphLayout; + Enabled, PushedCaption, DisabledIconCorrection: Boolean; out ACaptionRect, AGlyphRect: TRect; + RotationAngle: TSpTextRotationAngle = tra0): Integer; overload; +var + GlyphSize, DummyRightGlyphSize: TSize; + DummyRightGlyphRect: TRect; +begin + GlyphSize.cx := 0; + GlyphSize.cy := 0; + DummyRightGlyphSize.cx := 0; + DummyRightGlyphSize.cy := 0; + DummyRightGlyphRect := Rect(0, 0, 0, 0); + + if Assigned(IL) and (ImageIndex > -1) and (ImageIndex < IL.Count) then begin + GlyphSize.cx := IL.Width; + GlyphSize.cy := IL.Height; + end; + + Result := SpCalcXPText(ACanvas, ARect, Caption, CaptionAlignment, Flags, GlyphSize, DummyRightGlyphSize, + Layout, PushedCaption, ACaptionRect, AGlyphRect, DummyRightGlyphRect, RotationAngle); + + SpDrawXPText(ACanvas, Caption, ACaptionRect, Flags and not DT_CALCRECT, CaptionGlow, CaptionGlowColor, RotationAngle); + + if Assigned(IL) and (ImageIndex > -1) and (ImageIndex < IL.Count) then + SpDrawImageList(ACanvas, AGlyphRect, IL, ImageIndex, Enabled, DisabledIconCorrection); +end; + +function SpGetTextSize(DC: HDC; WS: WideString; NoPrefix: Boolean): TSize; +// Returns the size of the string, if NoPrefix is True, it first removes "&" +// characters as necessary. +// This procedure is 10x faster than using DrawText with the DT_CALCRECT flag +begin + Result.cx := 0; + Result.cy := 0; + if NoPrefix then + WS := SpStripAccelChars(WS); + if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then + Windows.GetTextExtentPoint32A(DC, PAnsiChar(AnsiString(WS)), Length(AnsiString(WS)), Result) + else + Windows.GetTextExtentPoint32W(DC, PWideChar(WS), Length(WS), Result); +end; + +function SpGetControlTextHeight(AControl: TControl; AFont: TFont): Integer; +// Returns the control text height based on the font +var + Sz: TSize; +begin + Sz := SpGetControlTextSize(AControl, AFont, 'WQqJ'); + Result := Sz.cy; +end; + +function SpGetControlTextSize(AControl: TControl; AFont: TFont; WS: WideString): TSize; +// Returns the control text size based on the font +var + ACanvas: TControlCanvas; +begin + ACanvas := TControlCanvas.Create; + try + ACanvas.Control := AControl; + ACanvas.Font.Assign(AFont); + Result := SpGetTextSize(ACanvas.Handle, WS, False); + finally + ACanvas.Free; + end; +end; + +function SpSameText(W1, W2: WideString): Boolean; +begin + {$IFNDEF UNICODE} + if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then + Result := AnsiSameText(AnsiString(W1), AnsiString(W2)) + else + Result := WideSameText(W1, W2); + {$ELSE} + Result := WideSameText(W1, W2); + {$ENDIF} +end; + +function SpStripAccelChars(S: WideString): WideString; +var + I: Integer; +begin + Result := S; + I := 1; + while I <= Length(Result) do begin + if Result[I] = '&' then + System.Delete(Result, I, 1); + Inc(I); + end; +end; + +function SpStripShortcut(S: WideString): WideString; +var + P: Integer; +begin + Result := S; + P := Pos(#9, Result); + if P <> 0 then + SetLength(Result, P - 1); +end; + +function SpStripTrailingPunctuation(S: WideString): WideString; +// Removes any colon (':') or ellipsis ('...') from the end of S and returns +// the resulting string +var + L: Integer; +begin + Result := S; + L := Length(Result); + if (L > 1) and (Result[L] = ':') then + SetLength(Result, L-1) + else if (L > 3) and (Result[L-2] = '.') and (Result[L-1] = '.') and + (Result[L] = '.') then + SetLength(Result, L-3); +end; + +function SpRectToString(R: TRect): string; +begin + Result := Format('%d, %d, %d, %d', [R.Left, R.Top, R.Right, R.Bottom]); +end; + +function SpStringToRect(S: string; out R: TRect): Boolean; +var + L: TStringList; +begin + Result := False; + R := Rect(0, 0, 0, 0); + L := TStringList.Create; + try + L.CommaText := S; + if L.Count = 4 then begin + R.Left := StrToIntDef(L[0], 0); + R.Top := StrToIntDef(L[1], 0); + R.Right := StrToIntDef(L[2], 0); + R.Bottom := StrToIntDef(L[3], 0); + Result := True; + end; + finally + L.Free; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Color Helpers } + +function SpColorToHTML(const Color: TColor): string; +var + R: TColorRef; +begin + R := ColorToRGB(Color); + Result := Format('#%.2x%.2x%.2x', [GetRValue(R), GetGValue(R), GetBValue(R)]); +end; + +function SpColorToString(const Color: TColor; TextType: TSpTBXColorTextType = cttDefault): string; +begin + case TextType of + cttDefault: + Result := ColorToString(Color); + cttHTML: + Result := SpColorToHTML(Color); + cttIdentAndHTML: + begin + Result := ColorToString(Color); + if (Length(Result) > 0) and (Result[1] = '$') then + Result := SpColorToHTML(Color); + end; + end; +end; + +function SpStringToColor(S: string; out Color: TColor): Boolean; +var + E, L: Integer; +begin + Result := False; + Color := clDefault; + L := Length(S); + if L < 2 then Exit; + + if (S[1] = '#') and (L = 7) then begin + Delete(S, 1, 1); // strip the # char + S := Format('$00%s%s%s', [Copy(S, 5, 2), Copy(S, 3, 2), Copy(S, 1, 2)]); + Color := StringToColor(S); + Result := True; + end + else begin + Result := IdentToColor(S, Longint(Color)); + if not Result and (L > 6) and (L < 10) and (S[1] = '$') then begin + Val(S, Color, E); + Result := E = 0; + end; + end; +end; + +procedure SpGetRGB(Color: TColor; out R, G, B: Integer); +begin + Color := ColorToRGB(Color); + R := GetRValue(Color); + G := GetGValue(Color); + B := GetBValue(Color); +end; + +function SpRGBToColor(R, G, B: Integer): TColor; +begin + if R < 0 then R := 0 else if R > 255 then R := 255; + if G < 0 then G := 0 else if G > 255 then G := 255; + if B < 0 then B := 0 else if B > 255 then B := 255; + Result := TColor(RGB(R, G, B)); +end; + +function SpLighten(Color: TColor; Amount: Integer): TColor; +var + R, G, B: Integer; +begin + Color := ColorToRGB(Color); + R := GetRValue(Color) + Amount; + G := GetGValue(Color) + Amount; + B := GetBValue(Color) + Amount; + Result := SpRGBToColor(R, G, B); +end; + +function SpBlendColors(TargetColor, BaseColor: TColor; Percent: Integer): TColor; +// Blend 2 colors with a predefined percent (0..100 or 0..1000) +// If Percent is 0 the result will be BaseColor, +// If Percent is 100 the result will be TargetColor. +// Any other value will return a color between base and target. +// For example if you want to add 70% of yellow ($0000FFFF) to a color: +// NewColor := SpBlendColor($0000FFFF, BaseColor, 70); +// The result will have 70% of yellow and 30% of BaseColor +var + Percent2, D, F: Integer; + R, G, B, R2, G2, B2: Integer; +begin + SpGetRGB(TargetColor, R, G, B); + SpGetRGB(BaseColor, R2, G2, B2); + + if Percent >= 100 then D := 1000 + else D := 100; + Percent2 := D - Percent; + F := D div 2; + + R := (R * Percent + R2 * Percent2 + F) div D; + G := (G * Percent + G2 * Percent2 + F) div D; + B := (B * Percent + B2 * Percent2 + F) div D; + + Result := SpRGBToColor(R, G, B); +end; + +function SpMixColors(TargetColor, BaseColor: TColor; Amount: Byte): TColor; +// Mix 2 colors with a predefined amount (0..255). +// If Amount is 0 the result will be BaseColor, +// If Amount is 255 the result will be TargetColor. +// Any other value will return a color between base and target. +// For example if you want to add 50% of yellow ($0000FFFF) to a color: +// NewColor := SpMixColors($0000FFFF, BaseColor, 128); +// The result will be BaseColor + 50% of yellow +var + R1, G1, B1: Integer; + R2, G2, B2: Integer; +begin + SpGetRGB(BaseColor, R1, G1, B1); + SpGetRGB(TargetColor, R2, G2, B2); + + R1 := (R2 - R1) * Amount div 255 + R1; + G1 := (G2 - G1) * Amount div 255 + G1; + B1 := (B2 - B1) * Amount div 255 + B1; + + Result := SpRGBToColor(R1, G1, B1); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Painting Helpers } + +function SpCenterRect(Parent: TRect; ChildWidth, ChildHeight: Integer): TRect; +begin + Result.Left := Parent.Left + (Parent.Right - Parent.Left - ChildWidth) div 2; + Result.Top := Parent.Top + (Parent.Bottom - Parent.Top - ChildHeight) div 2; + Result.Right := Result.Left + ChildWidth; + Result.Bottom := Result.Top + ChildHeight; +end; + +function SpCenterRect(Parent, Child: TRect): TRect; +begin + Result := SpCenterRect(Parent, Child.Right - Child.Left, Child.Bottom - Child.Top); +end; + +function SpCenterRectHoriz(Parent: TRect; ChildWidth: Integer): TRect; +begin + Result.Left := Parent.Left + (Parent.Right - Parent.Left - ChildWidth) div 2; + Result.Right := Result.Left + ChildWidth; + Result.Top := Parent.Top; + Result.Bottom := Parent.Bottom; +end; + +function SpCenterRectVert(Parent: TRect; ChildHeight: Integer): TRect; +begin + Result.Left := Parent.Left; + Result.Right := Parent.Right; + Result.Top := Parent.Top + (Parent.Bottom - Parent.Top - ChildHeight) div 2; + Result.Bottom := Result.Top + ChildHeight; +end; + +procedure SpFillRect(ACanvas: TCanvas; const ARect: TRect; BrushColor: TColor; PenColor: TColor = clNone); +var + C, C2: TColor; +begin + if BrushColor <> clNone then begin + C := ACanvas.Brush.Color; + C2 := ACanvas.Pen.Color; + ACanvas.Brush.Color := BrushColor; + ACanvas.Pen.Color := PenColor; + if PenColor = clNone then + ACanvas.FillRect(ARect) + else + ACanvas.Rectangle(ARect); + ACanvas.Brush.Color := C; + ACanvas.Pen.Color := C2; + end; +end; + +procedure SpDrawLine(ACanvas: TCanvas; X1, Y1, X2, Y2: Integer; Color: TColor); +var + C: TColor; +begin + if Color <> clNone then begin + C := ACanvas.Pen.Color; + ACanvas.Pen.Color := Color; + ACanvas.MoveTo(X1, Y1); + ACanvas.LineTo(X2, Y2); + ACanvas.Pen.Color := C; + end; +end; + +procedure SpDrawRectangle(ACanvas: TCanvas; ARect: TRect; CornerSize: Integer; + ColorL, ColorT, ColorR, ColorB, + InternalColorL, InternalColorT, InternalColorR, InternalColorB: TColor; + ForceRectBorders: TAnchors = []); +// Draws 2 beveled borders. +// CornerSize can be 0, 1 or 2. +// Color: left, top, right, bottom external border color +// InternalColor: left, top, right, bottom internal border color +// ForceRectBorders: forces the borders to be rect +var + Color: TColor; + CornerSizeTL, CornerSizeTR, CornerSizeBL, CornerSizeBR: Integer; +begin + Color := ACanvas.Pen.Color; + + if CornerSize < 0 then CornerSize := 0; + if CornerSize > 2 then CornerSize := 2; + CornerSizeTL := CornerSize; + CornerSizeTR := CornerSize; + CornerSizeBL := CornerSize; + CornerSizeBR := CornerSize; + if akLeft in ForceRectBorders then begin + CornerSizeTL := 0; + CornerSizeBL := 0; + end; + if akRight in ForceRectBorders then begin + CornerSizeTR := 0; + CornerSizeBR := 0; + end; + if akTop in ForceRectBorders then begin + CornerSizeTL := 0; + CornerSizeTR := 0; + end; + if akBottom in ForceRectBorders then begin + CornerSizeBL := 0; + CornerSizeBR := 0; + end; + + with ARect do begin + Dec(Right); + Dec(Bottom); + + // Internal borders + InflateRect(ARect, -1, -1); + if InternalColorL <> clNone then begin + ACanvas.Pen.Color := InternalColorL; + ACanvas.PolyLine([Point(Left, Bottom), Point(Left, Top)]); + end; + if InternalColorT <> clNone then begin + ACanvas.Pen.Color := InternalColorT; + ACanvas.PolyLine([Point(Left, Top), Point(Right, Top)]); + end; + if InternalColorR <> clNone then begin + ACanvas.Pen.Color := InternalColorR; + ACanvas.PolyLine([Point(Right, Bottom), Point(Right, Top - 1)]); + end; + if InternalColorB <> clNone then begin + ACanvas.Pen.Color := InternalColorB; + ACanvas.PolyLine([Point(Left, Bottom), Point(Right, Bottom)]); + end; + + // External borders + InflateRect(ARect, 1, 1); + if ColorL <> clNone then begin + ACanvas.Pen.Color := ColorL; + ACanvas.PolyLine([ + Point(Left, Bottom - CornerSizeBL), + Point(Left, Top + CornerSizeTL) + ]); + end; + if ColorT <> clNone then begin + ACanvas.Pen.Color := ColorT; + ACanvas.PolyLine([ + Point(Left, Top + CornerSizeTL), + Point(Left + CornerSizeTL, Top), + Point(Right - CornerSizeTR + 1, Top), + Point(Right, Top + CornerSizeTR) + ]); + end; + if ColorR <> clNone then begin + ACanvas.Pen.Color := ColorR; + ACanvas.PolyLine([ + Point(Right, Top + CornerSizeTR), + Point(Right , Bottom - CornerSizeBR) + ]); + end; + if ColorB <> clNone then begin + ACanvas.Pen.Color := ColorB; + ACanvas.PolyLine([ + Point(Right, Bottom - CornerSizeBR), + Point(Right - CornerSizeBR, Bottom), + Point(Left + CornerSizeBL, Bottom), + Point(Left, Bottom - CornerSizeBL) + ]); + end; + end; + + ACanvas.Pen.Color := Color; +end; + + +procedure SpDrawRectangle(ACanvas: TCanvas; ARect: TRect; + CornerSize: Integer; ColorTL, ColorBR, ColorTLInternal, ColorBRInternal: TColor; + ForceRectBorders: TAnchors); +// Draws 2 beveled borders. +// CornerSize can be 0, 1 or 2. +// TLColor, ColorBR: external border color +// InternalTL, ColorBRInternal: internal border color +// ForceRectBorders: forces the borders to be rect +var + Color: TColor; + CornerSizeTL, CornerSizeTR, CornerSizeBL, CornerSizeBR: Integer; +begin + Color := ACanvas.Pen.Color; + + if CornerSize < 0 then CornerSize := 0; + if CornerSize > 2 then CornerSize := 2; + CornerSizeTL := CornerSize; + CornerSizeTR := CornerSize; + CornerSizeBL := CornerSize; + CornerSizeBR := CornerSize; + if akLeft in ForceRectBorders then begin + CornerSizeTL := 0; + CornerSizeBL := 0; + end; + if akRight in ForceRectBorders then begin + CornerSizeTR := 0; + CornerSizeBR := 0; + end; + if akTop in ForceRectBorders then begin + CornerSizeTL := 0; + CornerSizeTR := 0; + end; + if akBottom in ForceRectBorders then begin + CornerSizeBL := 0; + CornerSizeBR := 0; + end; + + with ARect do begin + Dec(Right); + Dec(Bottom); + + // Internal borders + InflateRect(ARect, -1, -1); + if ColorTLInternal <> clNone then begin + ACanvas.Pen.Color := ColorTLInternal; + ACanvas.PolyLine([ + Point(Left, Bottom), + Point(Left, Top), + Point(Right, Top) + ]); + end; + if ColorBRInternal <> clNone then begin + ACanvas.Pen.Color := ColorBRInternal; + ACanvas.PolyLine([ + Point(Left, Bottom), + Point(Right, Bottom), + Point(Right, Top - 1) + ]); + end; + + // External borders + InflateRect(ARect, 1, 1); + if ColorTL <> clNone then begin + ACanvas.Pen.Color := ColorTL; + ACanvas.PolyLine([ + Point(Left + CornerSizeBL, Bottom), + Point(Left, Bottom - CornerSizeBL), + Point(Left, Top + CornerSizeTL), + Point(Left + CornerSizeTL, Top), + Point(Right - CornerSizeTR, Top), + Point(Right, Top + CornerSizeTR) + ]); + end; + if ColorBR <> clNone then begin + ACanvas.Pen.Color := ColorBR; + ACanvas.PolyLine([ + Point(Right, Top + CornerSizeTR), + Point(Right , Bottom - CornerSizeBR), + Point(Right - CornerSizeBR, Bottom), + Point(Left + CornerSizeBL - 1, Bottom) + ]); + end; + end; + + ACanvas.Pen.Color := Color; +end; + +procedure SpAlphaBlend(SrcDC, DstDC: HDC; SrcR, DstR: TRect; Alpha: Byte; + SrcHasAlphaChannel: Boolean = False); +// NOTE: AlphaBlend does not work on Windows 95 and Windows NT +var + BF: TBlendFunction; +begin + BF.BlendOp := AC_SRC_OVER; + BF.BlendFlags := 0; + BF.SourceConstantAlpha := Alpha; + if SrcHasAlphaChannel then + BF.AlphaFormat := AC_SRC_ALPHA + else + BF.AlphaFormat := 0; + Windows.AlphaBlend(DstDC, DstR.Left, DstR.Top, DstR.Right - DstR.Left, DstR.Bottom - DstR.Top, + SrcDC, SrcR.Left, SrcR.Top, SrcR.Right - SrcR.Left, SrcR.Bottom - SrcR.Top, BF); +end; + +procedure SpPaintTo(WinControl: TWinControl; ACanvas: TCanvas; X, Y: Integer); +// NOTE: PrintWindow does not work if the control is not visible +var + B: TBitmap; + PrevTop: Integer; +begin + // Use SpPrintWindow instead of PaintTo as many controls will not render + // properly (no text on editors, no scrollbars, incorrect borders, etc) + // http://msdn2.microsoft.com/en-us/library/ms535695.aspx + if Assigned(SpPrintWindow) then begin + ACanvas.Lock; + try + // It doesn't work if the control is not visible !!! + // Show it and move it offscreen + if not WinControl.Visible then begin + PrevTop := WinControl.Top; + WinControl.Top := 10000; // Move it offscreen + WinControl.Visible := True; + SpPrintWindow(WinControl.Handle, ACanvas.Handle, 0); + WinControl.Visible := False; + WinControl.Top := PrevTop; + end + else + SpPrintWindow(WinControl.Handle, ACanvas.Handle, 0); + finally + ACanvas.UnLock; + end; + end + else begin + // If SpPrintWindow is not available use PaintTo + // If the Control is a Form use GetFormImage instead + if WinControl is TCustomForm then begin + B := TCustomForm(WinControl).GetFormImage; + try + ACanvas.Draw(X, Y, B); + finally + B.Free; + end; + end + else + WinControl.PaintTo(ACanvas, X, Y); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ ImageList painting } + +procedure SpDrawIconShadow(ACanvas: TCanvas; const ARect: TRect; + ImageList: TCustomImageList; ImageIndex: Integer); +var + ImageWidth, ImageHeight: Integer; + I, J: Integer; + Src, Dst: ^Cardinal; + S, C, CBRB, CBG: Cardinal; + B1, B2: TBitmap; +begin + ImageWidth := ARect.Right - ARect.Left; + ImageHeight := ARect.Bottom - ARect.Top; + with ImageList do + begin + if Width < ImageWidth then ImageWidth := Width; + if Height < ImageHeight then ImageHeight := Height; + end; + + B1 := TBitmap.Create; + B2 := TBitmap.Create; + try + B1.PixelFormat := pf32bit; + B2.PixelFormat := pf32bit; + B1.Width := ImageWidth; + B1.Height := ImageHeight; + B2.Width := ImageWidth; + B2.Height := ImageHeight; + + BitBlt(B1.Canvas.Handle, 0, 0, ImageWidth, ImageHeight, ACanvas.Handle, ARect.Left, ARect.Top, SRCCOPY); + BitBlt(B2.Canvas.Handle, 0, 0, ImageWidth, ImageHeight, ACanvas.Handle, ARect.Left, ARect.Top, SRCCOPY); + ImageList.Draw(B2.Canvas, 0, 0, ImageIndex, True); + + for J := 0 to ImageHeight - 1 do + begin + Src := B2.ScanLine[J]; + Dst := B1.ScanLine[J]; + for I := 0 to ImageWidth - 1 do + begin + S := Src^; + if S <> Dst^ then + begin + CBRB := Dst^ and $00FF00FF; + CBG := Dst^ and $0000FF00; + C := ((S and $00FF0000) shr 16 * 29 + (S and $0000FF00) shr 8 * 150 + + (S and $000000FF) * 76) shr 8; + C := (C div 3) + (255 - 255 div 3); + Dst^ := ((CBRB * C and $FF00FF00) or (CBG * C and $00FF0000)) shr 8; + end; + Inc(Src); + Inc(Dst); + end; + end; + BitBlt(ACanvas.Handle, ARect.Left, ARect.Top, ImageWidth, ImageHeight, B1.Canvas.Handle, 0, 0, SRCCOPY); + finally + B1.Free; + B2.Free; + end; +end; + +procedure SpDrawImageList(ACanvas: TCanvas; const ARect: TRect; ImageList: TCustomImageList; + ImageIndex: Integer; Enabled, DisabledIconCorrection: Boolean); +begin + if Assigned(ImageList) and (ImageIndex > -1) and (ImageIndex < ImageList.Count) then + if Enabled then + ImageList.Draw(ACanvas, ARect.Left, ARect.Top, ImageIndex) + else + if DisabledIconCorrection then + SpDrawIconShadow(ACanvas, ARect, ImageList, ImageIndex) + else + ImageList.Draw(ACanvas, ARect.Left, ARect.Top, ImageIndex, False); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Gradients } + +procedure SpGradient(ACanvas: TCanvas; const ARect: TRect; + StartPos, EndPos, ChunkSize: Integer; C1, C2: TColor; const Vertical: Boolean); +// StartPos: start position relative to ARect, usually 0 +// EndPos: end position relative to ARect, usually ARect.Bottom - ARect.Top +// ChunkSize: size of the chunk of the gradient we need to paint + + procedure SpGradientSoft(ACanvas: TCanvas; const ARect: TRect; + StartPos, EndPos, ChunkSize: Integer; C1, C2: TColor; const Vertical: Boolean); + 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; + + {$IFDEF SYSTEM_GRADIENT} + procedure SpGradientSystem(ACanvas: TCanvas; const ARect: TRect; + StartPos, EndPos, ChunkSize: Integer; C1, C2: TColor; const Vertical: Boolean); + + procedure SetVertex(var AVertex: TTriVertex; const APoint: TPoint; ARGBColor: DWORD); + begin + AVertex.X := APoint.X; + AVertex.Y := APoint.Y; + AVertex.Red := MakeWord(0, GetRValue(ARGBColor)); + AVertex.Green := MakeWord(0, GetGValue(ARGBColor)); + AVertex.Blue := MakeWord(0, GetBValue(ARGBColor)); + AVertex.Alpha := 0; + end; + + const + AModesMap: array[Boolean] of DWORD = (GRADIENT_FILL_RECT_H, GRADIENT_FILL_RECT_V); + var + AVertices: array[0..1] of TTriVertex; + AGradientRect: TGradientRect; + ARGBColor1, ARGBColor2: DWORD; + Vertex: TPoint; + begin + ARGBColor1 := ColorToRGB(C1); + ARGBColor2 := ColorToRGB(C2); + Vertex := ARect.TopLeft; + if Vertical then + Vertex.Y := Vertex.Y + StartPos + else + Vertex.X := Vertex.X + StartPos; + SetVertex(AVertices[0], Vertex, ARGBColor1); + Vertex := ARect.BottomRight; + if Vertical then + Vertex.Y := ARect.Top + EndPos + 1 + else + Vertex.X := ARect.Left + EndPos + 1; + SetVertex(AVertices[1], Vertex, ARGBColor2); + AGradientRect.UpperLeft := 0; + AGradientRect.LowerRight := 1; + GradientFillSystem(ACanvas.Handle, AVertices[0], 2, AGradientRect, 1, AModesMap[Vertical]); + end; + {$ENDIF} + +begin + {$IFDEF SYSTEM_GRADIENT} + if Assigned(GradientFillSystem) then + SpGradientSystem(ACanvas, ARect, StartPos, EndPos, ChunkSize, C1, C2, Vertical) + else + {$ENDIF} + SpGradientSoft(ACanvas, ARect, StartPos, EndPos, ChunkSize, C1, C2, Vertical); +end; + +{ +procedure SpGradient(ACanvas: TCanvas; const ARect: TRect; + StartPos, EndPos, ChunkSize: Integer; C1, C2: TColor; const Vertical: Boolean); +// StartPos: start position relative to ARect, usually 0 +// EndPos: end position relative to ARect, usually ARect.Bottom - ARect.Top +// ChunkSize: size of the chunk of the gradient we need to paint +var + I: Integer; + r, g, b: Integer; + rc1, gc1, bc1: Integer; + rc2, gc2, bc2: Integer; + PrevColor: TColor; +begin + PrevColor := ACanvas.Brush.Color; + if ChunkSize = 0 then ChunkSize := 1; + SpGetRGB(C1, rc1, gc1, bc1); + SpGetRGB(C2, rc2, gc2, bc2); + for I := StartPos to EndPos do begin + r := rc1 + (((rc2 - rc1) * (I - StartPos)) div ChunkSize); + g := gc1 + (((gc2 - gc1) * (I - StartPos)) div ChunkSize); + b := bc1 + (((bc2 - bc1) * (I - StartPos)) div ChunkSize); + + ACanvas.Brush.Color := SpRGBToColor(r, g, b); + if Vertical then + ACanvas.FillRect(Rect(ARect.Left, ARect.Top + I, ARect.Right, ARect.Top + I + 1)) + else + ACanvas.FillRect(Rect(ARect.Left + I, ARect.Top, ARect.Left + I + 1, ARect.Bottom)); + end; + ACanvas.Brush.Color := PrevColor; +end; } + +procedure SpGradientFill(ACanvas: TCanvas; const ARect: TRect; + const C1, C2: TColor; const Vertical: Boolean); +var + GSize: Integer; +begin + if Vertical then + GSize := (ARect.Bottom - ARect.Top) - 1 + else + GSize := (ARect.Right - ARect.Left) - 1; + + SpGradient(ACanvas, ARect, 0, GSize, GSize, C1, C2, Vertical); +end; + +procedure SpGradientFillMirror(ACanvas: TCanvas; const ARect: TRect; + const C1, C2, C3, C4: TColor; const Vertical: Boolean); +var + GSize, ChunkSize, d1, d2: Integer; +begin + if Vertical then + GSize := (ARect.Bottom - ARect.Top) - 1 + else + GSize := (ARect.Right - ARect.Left) - 1; + + ChunkSize := GSize div 2; + if ChunkSize = 0 then ChunkSize := 1; + d1 := ChunkSize; + d2 := GSize; + + SpGradient(ACanvas, ARect, 0, d1, ChunkSize, C1, C2, Vertical); + SpGradient(ACanvas, ARect, d1, d2, ChunkSize, C3, C4, Vertical); +end; + +procedure SpGradientFillMirrorTop(ACanvas: TCanvas; const ARect: TRect; + const C1, C2, C3, C4: TColor; const Vertical: Boolean); +var + GSize, d1, d2: Integer; +begin + if Vertical then + GSize := (ARect.Bottom - ARect.Top) - 1 + else + GSize := (ARect.Right - ARect.Left) - 1; + + d1 := GSize div 3; + d2 := GSize; + + SpGradient(ACanvas, ARect, 0, d1, d1, C1, C2, Vertical); + SpGradient(ACanvas, ARect, d1, d2, d2 - d1, C3, C4, Vertical); +end; + +procedure SpGradientFillGlass(ACanvas: TCanvas; const ARect: TRect; + const C1, C2, C3, C4: TColor; const Vertical: Boolean); +var + GSize, ChunkSize, d1, d2, d3: Integer; +begin + if Vertical then + GSize := (ARect.Bottom - ARect.Top) - 1 + else + GSize := (ARect.Right - ARect.Left) - 1; + + ChunkSize := GSize div 3; + if ChunkSize = 0 then ChunkSize := 1; + d1 := ChunkSize; + d2 := ChunkSize * 2; + d3 := GSize; + + SpGradient(ACanvas, ARect, 0, d1, ChunkSize, C1, C2, Vertical); + SpGradient(ACanvas, ARect, d1, d2, ChunkSize, C2, C3, Vertical); + SpGradient(ACanvas, ARect, d2, d3, ChunkSize, C3, C4, Vertical); +end; + +procedure SpGradientFill9pixels(ACanvas: TCanvas; const ARect: TRect; + const C1, C2, C3, C4: TColor; const Vertical: Boolean); +// Mimics Vista menubar/toolbar blue gradient +var + GSize, d1, d2: Integer; +begin + if Vertical then + GSize := (ARect.Bottom - ARect.Top) - 1 + else + GSize := (ARect.Right - ARect.Left) - 1; + + d1 := GSize div 3; + if d1 > 9 then d1 := 9; + d2 := GSize; + + SpGradient(ACanvas, ARect, 0, d1, d1, C1, C2, Vertical); + SpGradient(ACanvas, ARect, d1, d2, d2 - d1, C3, C4, Vertical); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Element painting } + +procedure SpDrawArrow(ACanvas: TCanvas; X, Y: Integer; AColor: TColor; Vertical, Reverse: Boolean; Size: Integer); +var + C1, C2: TColor; +begin + C1 := ACanvas.Pen.Color; + C2 := ACanvas.Brush.Color; + ACanvas.Pen.Color := AColor; + ACanvas.Brush.Color := AColor; + + if Vertical then + if Reverse then + ACanvas.Polygon([Point(X, Y), Point(X - Size, Y + Size), Point(X + Size, Y + Size)]) + else + ACanvas.Polygon([Point(X - Size, Y), Point(X + Size, Y), Point(X, Y + Size)]) + else + if Reverse then + ACanvas.Polygon([Point(X, Y), Point(X + Size, Y + Size), Point(X + Size, Y - Size)]) + else + ACanvas.Polygon([Point(X, Y - Size), Point(X, Y + Size), Point(X + Size, Y)]); + + ACanvas.Pen.Color := C1; + ACanvas.Brush.Color := C2; +end; + +procedure SpDrawDropMark(ACanvas: TCanvas; DropMark: TRect); +var + C: TColor; + R: TRect; +begin + if IsRectEmpty(DropMark) then Exit; + C := ACanvas.Brush.Color; + + R := Rect(DropMark.Left + 1, DropMark.Top, DropMark.Right - 1, DropMark.Top + 2); + ACanvas.Rectangle(R); + R := Rect(DropMark.Left + 1, DropMark.Bottom - 2, DropMark.Right - 1, DropMark.Bottom); + ACanvas.Rectangle(R); + + R := Rect(DropMark.Left, DropMark.Top + 1, DropMark.Right, DropMark.Top + 3); + ACanvas.Rectangle(R); + R := Rect(DropMark.Left, DropMark.Bottom - 3, DropMark.Right, DropMark.Bottom - 1); + ACanvas.Rectangle(R); + + R := Rect(DropMark.Left + 1, DropMark.Top + 4, DropMark.Right - 1, DropMark.Bottom - 4); + ACanvas.Rectangle(R); + + { + // Standard DropMark + + R := Rect(DropMark.Left, DropMark.Top, DropMark.Right - 1, DropMark.Bottom - 1); + if IsRectEmpty(R) then Exit; + ACanvas.Brush.Color := clBlack; + ACanvas.Polygon([ + Point(R.Left, R.Top), + Point(R.Left + 2, R.Top + 2), + Point(R.Left + 2, R.Bottom - 2), + Point(R.Left, R.Bottom), + Point(R.Right, R.Bottom), + Point(R.Right - 2, R.Bottom - 2), + Point(R.Right - 2, R.Top + 2), + Point(R.Right, R.Top) + ]); + } + ACanvas.Brush.Color := C; +end; + +procedure SpDrawFocusRect(ACanvas: TCanvas; const ARect: TRect); +var + DC: HDC; + C1, C2: TColor; +begin + if not IsRectEmpty(ARect) then begin + DC := ACanvas.Handle; + C1 := SetTextColor(DC, clBlack); + C2 := SetBkColor(DC, clWhite); + ACanvas.DrawFocusRect(ARect); + SetTextColor(DC, C1); + SetBkColor(DC, C2); + end; +end; + +procedure SpDrawGlyphPattern(DC: HDC; const R: TRect; Width, Height: Integer; + const PatternBits; PatternColor: TColor); +var + B: TBitmap; + OldTextColor, OldBkColor: Longword; + OldBrush, Brush: HBrush; + BitmapWidth, BitmapHeight: Integer; +begin + OldTextColor := SetTextColor(DC, clBlack); + OldBkColor := SetBkColor(DC, clWhite); + B := TBitmap.Create; + try + BitmapWidth := 8; + if Width > BitmapWidth then BitmapWidth := Width; + BitmapHeight := 8; + if Height > BitmapHeight then BitmapHeight := Height; + + B.Handle := CreateBitmap(BitmapWidth, BitmapHeight, 1, 1, @PatternBits); + if PatternColor < 0 then Brush := GetSysColorBrush(PatternColor and $FF) + else Brush := CreateSolidBrush(PatternColor); + OldBrush := SelectObject(DC, Brush); + BitBlt(DC, (R.Left + R.Right + 1 - Width) div 2, (R.Top + R.Bottom + 1 - Height) div 2, + Width, Height, B.Canvas.Handle, 0, 0, ROP_DSPDxax); + SelectObject(DC, OldBrush); + if PatternColor >= 0 then DeleteObject(Brush); + finally + SetTextColor(DC, OldTextColor); + SetBkColor(DC, OldBkColor); + B.Free; + end; +end; + +procedure SpDrawGlyphPattern(ACanvas: TCanvas; ARect: TRect; PatternIndex: Integer; PatternColor: TColor); +// The pattern is a 8x8 bitmap +// The array has 16 elements, only the odd elements are used +// The first value of an element represents the bits from the 4 first horizontal pixels, +// and the next value represents the bits of the 4 last horizontal pixels. +// For example: 0 represents -------- +// $FF represents xxxxxxxx +// $C6 represents xx---xx- +const + ClosePattern: array [0..15] of Byte = ($C6, 0, $EE, 0, $7C, 0, $38, 0, $7C, 0, $EE, 0, $C6, 0, 0, 0); + MaximizePattern: array [0..15] of Byte = ($FF, 0, $FF, 0, $81, 0, $81, 0, $81, 0, $81, 0, $81, 0, $FF, 0); + MinimizePattern: array [0..15] of Byte = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, $7E, 0, $7E, 0, 0, 0); + RestorePattern: array [0..17] of Byte = ($3F, 0, $3F, 0, $21, 0, $FD, 0, $FD, 0, $87, 0, $84, 0, $84, 0, $FC, 0); +begin + case PatternIndex of + 0: SpDrawGlyphPattern(ACanvas.Handle, ARect, 8, 8, ClosePattern[0], PatternColor); + 1: SpDrawGlyphPattern(ACanvas.Handle, ARect, 8, 8, MaximizePattern[0], PatternColor); + 2: SpDrawGlyphPattern(ACanvas.Handle, ARect, 8, 8, MinimizePattern[0], PatternColor); + 3: SpDrawGlyphPattern(ACanvas.Handle, ARect, 8, 9, RestorePattern[0], PatternColor); + end; +end; + +procedure SpDrawXPButton(ACanvas: TCanvas; ARect: TRect; Enabled, Pushed, + HotTrack, Checked, Focused, Defaulted: Boolean; SkinType: TSpTBXSkinType); +var + Flags: Cardinal; + C: TColor; + State: TSpTBXSkinStatesType; +begin + SkinType := SpTBXSkinType(SkinType); + case SkinType of + sknNone: + begin + C := ACanvas.Brush.Color; + ACanvas.Brush.Color := clBtnFace; + ACanvas.FillRect(ARect); + if Defaulted or Focused then begin + ACanvas.Brush.Color := clWindowFrame; + ACanvas.FrameRect(ARect); + InflateRect(ARect, -1, -1); // Reduce the Rect for the focus rect + end; + if Pushed or Checked then begin + ACanvas.Brush.Color := clBtnShadow; + ACanvas.FrameRect(ARect); + end + else + DrawFrameControl(ACanvas.Handle, ARect, DFC_BUTTON, DFCS_BUTTONPUSH); + ACanvas.Brush.Color := C; + end; + sknWindows: + begin + if not Enabled then Flags := PBS_DISABLED + else if Pushed or Checked then Flags := PBS_PRESSED + else if HotTrack then Flags := PBS_HOT + else if Defaulted or Focused then Flags := PBS_DEFAULTED + else Flags := PBS_NORMAL; + DrawThemeBackground(ThemeServices.Theme[teButton], ACanvas.Handle, BP_PUSHBUTTON, Flags, ARect, nil); + end; + sknSkin: + begin + State := CurrentSkin.GetState(Enabled, Pushed, HotTrack, Checked); + CurrentSkin.PaintBackground(ACanvas, ARect, skncButton, State, True, True); + end; + end; + + if Focused then begin + InflateRect(ARect, -3, -3); + SpDrawFocusRect(ACanvas, ARect); + end; +end; + +procedure SpDrawXPCheckBoxGlyph(ACanvas: TCanvas; ARect: TRect; Enabled: Boolean; + State: TCheckBoxState; HotTrack, Pushed: Boolean; SkinType: TSpTBXSkinType); +var + Flags: Integer; + SknState: TSpTBXSkinStatesType; +begin + SkinType := SpTBXSkinType(SkinType); + Flags := 0; + case SkinType of + sknNone: + begin + case State of + cbChecked: Flags := DFCS_BUTTONCHECK or DFCS_CHECKED; + cbGrayed: Flags := DFCS_BUTTON3STATE or DFCS_CHECKED; + cbUnChecked: Flags := DFCS_BUTTONCHECK; + end; + if not Enabled then + Flags := Flags or DFCS_INACTIVE; + if Pushed then + Flags := Flags or DFCS_PUSHED; + DrawFrameControl(ACanvas.Handle, ARect, DFC_BUTTON, Flags); + end; + sknWindows: + begin + case State of + cbChecked: Flags := CBS_CHECKEDNORMAL; + cbGrayed: Flags := CBS_MIXEDNORMAL; + cbUnChecked: Flags := CBS_UNCHECKEDNORMAL; + end; + + if not Enabled then Inc(Flags, 3) + else + if Pushed then Inc(Flags, 2) + else if HotTrack then Inc(Flags); + DrawThemeBackground(ThemeServices.Theme[teButton], ACanvas.Handle, BP_CHECKBOX, Flags, ARect, nil); + end; + sknSkin: + begin + SknState := CurrentSkin.GetState(Enabled, Pushed, HotTrack, State in [cbChecked, cbGrayed]); + CurrentSkin.PaintMenuCheckMark(ACanvas, ARect, State = cbChecked, State = cbGrayed, False, SknState); + end; + end; +end; + +procedure SpDrawXPRadioButtonGlyph(ACanvas: TCanvas; ARect: TRect; Enabled: Boolean; + Checked, HotTrack, Pushed: Boolean; SkinType: TSpTBXSkinType); +var + Flags: Integer; + SknState: TSpTBXSkinStatesType; +begin + SkinType := SpTBXSkinType(SkinType); + case SkinType of + sknNone: + begin + Flags := DFCS_BUTTONRADIO; + if Checked then + Flags := Flags or DFCS_CHECKED; + if not Enabled then + Flags := Flags or DFCS_INACTIVE; + if Pushed then + Flags := Flags or DFCS_PUSHED; + DrawFrameControl(ACanvas.Handle, ARect, DFC_BUTTON, Flags); + end; + sknWindows: + begin + if Checked then Flags := RBS_CHECKEDNORMAL + else Flags := RBS_UNCHECKEDNORMAL; + + if not Enabled then Inc(Flags, 3) + else + if Pushed then Inc(Flags, 2) + else if HotTrack then Inc(Flags); + DrawThemeBackground(ThemeServices.Theme[teButton], ACanvas.Handle, BP_RADIOBUTTON, Flags, ARect, nil); + end; + sknSkin: + begin + SknState := CurrentSkin.GetState(Enabled, Pushed, HotTrack, Checked); + CurrentSkin.PaintMenuRadioMark(ACanvas, ARect, Checked, False, SknState); + end; + end; +end; + +procedure SpDrawXPEditFrame(ACanvas: TCanvas; ARect: TRect; Enabled, HotTrack: Boolean; + SkinType: TSpTBXSkinType; ClipContent: Boolean; AutoAdjust: Boolean); +var + PartID, Flags: Integer; + BorderR: TRect; + State: TSpTBXSkinStatesType; + Entry: TSpTBXSkinOptionEntry; +const + CP_BORDER = 4; // Available only on Vista with Delphi 2007 +begin + SkinType := SpTBXSkinType(SkinType); + + if ClipContent then begin + BorderR := ARect; + if HotTrack then + InflateRect(BorderR, -1, -1) + else + InflateRect(BorderR, -2, -2); + ExcludeClipRect(ACanvas.Handle, BorderR.Left, BorderR.Top, BorderR.Right, BorderR.Bottom); + end; + try + case SkinType of + sknNone: + if HotTrack then + SpDrawRectangle(ACanvas, ARect, 0, clBtnShadow, clBtnHighlight, clBtnFace, clBtnFace) + else + SpDrawRectangle(ACanvas, ARect, 0, clBtnFace, clBtnFace, clBtnFace, clBtnFace); + sknWindows: + begin + if SpIsWinVistaOrUp then begin + // Use the new API on Windows Vista + PartID := CP_BORDER; + if not Enabled then Flags := CBXS_DISABLED + else if HotTrack then Flags := CBXS_HOT + else Flags := CBXS_NORMAL; + end + else begin + PartID := 0; + Flags := 0; + end; + DrawThemeBackground(ThemeServices.Theme[teComboBox], ACanvas.Handle, PartID, Flags, ARect, nil); + end; + sknSkin: + begin + State := CurrentSkin.GetState(Enabled, False, HotTrack, False); + // Try to adjust the borders if only the internal borders are specified, + // used by some controls that need to paint the edit frames like + // TSpTBXPanel (HotTrack=True), TSpTBXListBox, TSpTBXCheckListBox, etc + if AutoAdjust then begin + Entry := SkinManager.CurrentSkin.Options(skncEditFrame, State).Borders; + if (Entry.Color1 = clNone) and (Entry.Color2 = clNone) and + (Entry.Color3 <> clNone) and (Entry.Color4 <> clNone) then + begin + CurrentSkin.PaintBackground(ACanvas, ARect, skncEditFrame, State, True, False); + SpDrawRectangle(ACanvas, ARect, Entry.SkinType, Entry.Color3, Entry.Color4); + Exit; + end; + end; + + CurrentSkin.PaintBackground(ACanvas, ARect, skncEditFrame, State, True, True); + end; + end; + finally + if ClipContent then + SelectClipRgn(ACanvas.Handle, 0); + end; +end; + +procedure SpDrawXPEditFrame(AWinControl: TWinControl; HotTracking: Boolean; + SkinType: TSpTBXSkinType; AutoAdjust, HideFrame: Boolean); +var + R: TRect; + DC: HDC; + ACanvas: TCanvas; +begin + DC := GetWindowDC(AWinControl.Handle); + try + ACanvas := TCanvas.Create; + try + ACanvas.Handle := DC; + GetWindowRect(AWinControl.Handle, R); + OffsetRect(R, -R.Left, -R.Top); + with R do + ExcludeClipRect(DC, Left + 2, Top + 2, Right - 2, Bottom - 2); + + if HideFrame then begin + ACanvas.Brush.Color := TControlAccess(AWinControl).Color; + ACanvas.FillRect(R); + end + else begin + // Don't use SpDrawParentBackground to paint the background it doesn't get + // the correct WindowOrg in this particular case + PerformEraseBackground(AWinControl, ACanvas.Handle); + SpDrawXPEditFrame(ACanvas, R, AWinControl.Enabled, HotTracking, SkinType, False, AutoAdjust); + end; + finally + ACanvas.Handle := 0; + ACanvas.Free; + end; + finally + ReleaseDC(AWinControl.Handle, DC); + end; +end; + +procedure SpDrawXPGrip(ACanvas: TCanvas; ARect: TRect; LoC, HiC: TColor); +var + I, J: Integer; + XCellCount, YCellCount: Integer; + R: TRect; + C: TColor; +begin + // 4 x 4 cells (Grey, White, Null) + // GG-- + // GGW- + // -WW- + // ---- + + C := ACanvas.Brush.Color; + XCellCount := (ARect.Right - ARect.Left) div 4; + YCellCount := (ARect.Bottom - ARect.Top) div 4; + if XCellCount = 0 then XCellCount := 1; + if YCellCount = 0 then YCellCount := 1; + + for J := 0 to YCellCount - 1 do + for I := 0 to XCellCount - 1 do begin + R.Left := ARect.Left + (I * 4) + 1; + R.Right := R.Left + 2; + R.Top := ARect.Top + (J * 4) + 1; + R.Bottom := R.Top + 2; + + ACanvas.Brush.Color := HiC; + ACanvas.FillRect(R); + OffsetRect(R, -1, -1); + ACanvas.Brush.Color := LoC; + ACanvas.FillRect(R); + end; + ACanvas.Brush.Color := C; +end; + +procedure SpDrawXPHeader(ACanvas: TCanvas; ARect: TRect; HotTrack, Pushed: Boolean; SkinType: TSpTBXSkinType); +var + Flags: Cardinal; + State: TSpTBXSkinStatesType; +begin + SkinType := SpTBXSkinType(SkinType); + case SkinType of + sknNone: + begin + DrawEdge(ACanvas.Handle, ARect, BDR_RAISEDINNER or BDR_RAISEDOUTER, BF_RECT or BF_SOFT); + end; + sknWindows: + begin + if Pushed then Flags := HIS_PRESSED + else if HotTrack then Flags := HIS_HOT + else Flags := HIS_NORMAL; + DrawThemeBackground(ThemeServices.Theme[teHeader], ACanvas.Handle, HP_HEADERITEM, Flags, ARect, nil); + end; + sknSkin: + begin + State := CurrentSkin.GetState(True, Pushed, HotTrack, False); + if (State = sknsPushed) and CurrentSkin.Options(skncHeader, State).IsEmpty then + State := sknsHotTrack; + CurrentSkin.PaintBackground(ACanvas, ARect, skncHeader, State, True, True); + end; + end; +end; + +procedure SpDrawXPListItemBackground(ACanvas: TCanvas; ARect: TRect; Selected, HotTrack, Focused: Boolean; + SkinType: TSpTBXSkinType; ForceRectBorders: Boolean; Borders: Boolean); +var + State: TSpTBXSkinStatesType; + PrevColor: TColor; +begin + PrevColor := ACanvas.Font.Color; + if SpTBXSkinType(SkinType) = sknSkin then begin + ACanvas.FillRect(ARect); + if HotTrack or Selected then begin + State := CurrentSkin.GetState(True, False, HotTrack, Selected); + ACanvas.Font.Color := CurrentSkin.GetTextColor(skncListItem, State); + if ForceRectBorders then + CurrentSkin.PaintBackground(ACanvas, ARect, skncListItem, State, True, Borders, False, [akLeft, akTop, akRight, akBottom]) + else + CurrentSkin.PaintBackground(ACanvas, ARect, skncListItem, State, True, Borders); + end; + end + else begin + if Selected then begin + ACanvas.Brush.Color := clHighlight; + ACanvas.Font.Color := clHighlightText; + end; + ACanvas.FillRect(ARect); + if Focused then + SpDrawFocusRect(ACanvas, ARect); + end; + ACanvas.Font.Color := PrevColor; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Skins painting } + +procedure SpPaintSkinBackground(ACanvas: TCanvas; ARect: TRect; SkinOption: TSpTBXSkinOptionCategory; Vertical: Boolean); +var + Part: TSpTBXSkinOptionEntry; + SkinType: Integer; +begin + Part := SkinOption.Body; + SkinType := SkinOption.Body.SkinType; + + if Vertical then + case SkinType of + 1: SkinType := 2; // Vertical Gradient to Horizontal + 2: SkinType := 1; // Horizontal Gradient to Vertical + + 3: SkinType := 4; // Vertical Glass Gradient to Horizontal + 4: SkinType := 3; // Horizontal Glass Gradient to Vertical + + 5: SkinType := 6; // Vertical Mirror Gradient to Horizontal + 6: SkinType := 5; // Horizontal Mirror Gradient to Vertical + + 7: SkinType := 8; // Vertical MirrorTop Gradient to Horizontal + 8: SkinType := 7; // Horizontal MirrorTop Gradient to Vertical + + 9: SkinType := 10; // Vertical 9Pixels Gradient to Horizontal + 10: SkinType := 9; // Horizontal 9Pixels Gradient to Vertical + end; + + case SkinType of + 0: begin // Solid + SpFillRect(ACanvas, ARect, Part.Color1); + end; + 1: begin // Vertical Gradient + SpGradientFill(ACanvas, ARect, Part.Color1, Part.Color2, True); + end; + 2: begin // Horizontal Gradient + SpGradientFill(ACanvas, ARect, Part.Color1, Part.Color2, False); + end; + 3: begin // Vertical Glass Gradient + SpGradientFillGlass(ACanvas, ARect, Part.Color1, Part.Color2, Part.Color3, Part.Color4, True); + end; + 4: begin // Horizontal Glass Gradient + SpGradientFillGlass(ACanvas, ARect, Part.Color1, Part.Color2, Part.Color3, Part.Color4, False); + end; + 5: begin // Vertical Mirror Gradient + SpGradientFillMirror(ACanvas, ARect, Part.Color1, Part.Color2, Part.Color3, Part.Color4, True); + end; + 6: begin // Horizontal Mirror Gradient + SpGradientFillMirror(ACanvas, ARect, Part.Color1, Part.Color2, Part.Color3, Part.Color4, False); + end; + 7: begin // Vertical MirrorTop Gradient + SpGradientFillMirrorTop(ACanvas, ARect, Part.Color1, Part.Color2, Part.Color3, Part.Color4, True); + end; + 8: begin // Horizontal MirrorTop Gradient + SpGradientFillMirrorTop(ACanvas, ARect, Part.Color1, Part.Color2, Part.Color3, Part.Color4, False); + end; + 9: begin // Vertical 9Pixels Gradient + SpGradientFill9Pixels(ACanvas, ARect, Part.Color1, Part.Color2, Part.Color3, Part.Color4, True); + end; + 10:begin // Horizontal 9Pixels Gradient + SpGradientFill9Pixels(ACanvas, ARect, Part.Color1, Part.Color2, Part.Color3, Part.Color4, False); + end; + end; +end; + +procedure SpPaintSkinBorders(ACanvas: TCanvas; ARect: TRect; SkinOption: TSpTBXSkinOptionCategory; + ForceRectBorders: TAnchors = []); +var + Part: TSpTBXSkinOptionEntry; +begin + Part := SkinOption.Borders; + case Part.SkinType of + 0, 1, 2: // Rectangle, Simple Rounded and Double Rounded Border + begin + SpDrawRectangle(ACanvas, ARect, Part.SkinType, Part.Color1, Part.Color2, Part.Color3, Part.Color4, ForceRectBorders); + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Misc } + +function SpIsWinVistaOrUp: Boolean; +begin + Result := (Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion >= 6); +end; + +function SpGetDirectories(Path: WideString; L: TStringList): Boolean; +var + SearchRec: TSearchRec; +begin + Result := False; + if DirectoryExists(Path) then begin + Path := IncludeTrailingPathDelimiter(Path) + '*.*'; + if FindFirst(Path, faDirectory, SearchRec) = 0 then begin + try + repeat + if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then + L.Add(SearchRec.Name); + until FindNext(SearchRec) <> 0; + Result := True; + finally + FindClose(SearchRec); + end; + end; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSkinOptionEntry } + +procedure TSpTBXSkinOptionEntry.AssignTo(Dest: TPersistent); +begin + if Dest is TSpTBXSkinOptionEntry then + with TSpTBXSkinOptionEntry(Dest) do begin + SkinType := Self.SkinType; + Color1 := Self.Color1; + Color2 := Self.Color2; + Color3 := Self.Color3; + Color4 := Self.Color4; + end + else inherited AssignTo(Dest); +end; + +constructor TSpTBXSkinOptionEntry.Create; +begin + inherited; + Reset; +end; + +procedure TSpTBXSkinOptionEntry.Fill(ASkinType: Integer; AColor1, AColor2, + AColor3, AColor4: TColor); +begin + FSkinType := ASkinType; + FColor1 := AColor1; + FColor2 := AColor2; + FColor3 := AColor3; + FColor4 := AColor4; +end; + +function TSpTBXSkinOptionEntry.IsEmpty: Boolean; +begin + Result := (FColor1 = clNone) and (FColor2 = clNone) and (FColor3 = clNone) and (FColor4 = clNone); +end; + +function TSpTBXSkinOptionEntry.IsEqual(AOptionEntry: TSpTBXSkinOptionEntry): Boolean; +begin + Result := (FSkinType = AOptionEntry.SkinType) and + (FColor1 = AOptionEntry.Color1) and (FColor2 = AOptionEntry.Color2) and + (FColor3 = AOptionEntry.Color3) and (FColor4 = AOptionEntry.Color4); +end; + +procedure TSpTBXSkinOptionEntry.Lighten(Amount: Integer); +begin + if FColor1 <> clNone then FColor1 := SpLighten(FColor1, Amount); + if FColor2 <> clNone then FColor2 := SpLighten(FColor2, Amount); + if FColor3 <> clNone then FColor3 := SpLighten(FColor3, Amount); + if FColor4 <> clNone then FColor4 := SpLighten(FColor4, Amount); +end; + +procedure TSpTBXSkinOptionEntry.Reset; +begin + FSkinType := 0; + FColor1 := clNone; + FColor2 := clNone; + FColor3 := clNone; + FColor4 := clNone; +end; + +procedure TSpTBXSkinOptionEntry.ReadFromString(S: string); +var + L: TStringList; +begin + Reset; + L := TStringList.Create; + try + L.CommaText := S; + try + if L.Count > 0 then FSkinType := StrToIntDef(L[0], 0); + if L.Count > 1 then FColor1 := StringToColor(L[1]); + if L.Count > 2 then FColor2 := StringToColor(L[2]); + if L.Count > 3 then FColor3 := StringToColor(L[3]); + if L.Count > 4 then FColor4 := StringToColor(L[4]); + except + // do nothing + end; + finally + L.Free; + end; +end; + +function TSpTBXSkinOptionEntry.WriteToString: string; +begin + Result := Format('%d, %s, %s, %s, %s', [FSkinType, + SpColorToString(FColor1), SpColorToString(FColor2), + SpColorToString(FColor3), SpColorToString(FColor4)]); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXThemeOptionCategory } + +procedure TSpTBXSkinOptionCategory.AssignTo(Dest: TPersistent); +begin + if Dest is TSpTBXSkinOptionCategory then + with TSpTBXSkinOptionCategory(Dest) do begin + Body.Assign(Self.Body); + Borders.Assign(Self.Borders); + TextColor := Self.TextColor; + end + else inherited AssignTo(Dest); +end; + +constructor TSpTBXSkinOptionCategory.Create; +begin + inherited; + FBody := TSpTBXSkinOptionEntry.Create; + FBorders := TSpTBXSkinOptionEntry.Create; + FTextColor := clNone; +end; + +destructor TSpTBXSkinOptionCategory.Destroy; +begin + FreeAndNil(FBody); + FreeAndNil(FBorders); + inherited; +end; + +function TSpTBXSkinOptionCategory.IsEmpty: Boolean; +begin + Result := FBody.IsEmpty and FBorders.IsEmpty and (FTextColor = clNone); +end; + +procedure TSpTBXSkinOptionCategory.Reset; +begin + FBody.Reset; + FBorders.Reset; + FTextColor := clNone; +end; + +procedure TSpTBXSkinOptionCategory.SaveToIni(MemIni: TMemIniFile; Section, Ident: string); +begin + if not IsEmpty then begin + MemIni.WriteString(Section, Ident + '.Body', Body.WriteToString); + MemIni.WriteString(Section, Ident + '.Borders', Borders.WriteToString); + MemIni.WriteString(Section, Ident + '.TextColor', SpColorToString(TextColor)); + end; +end; + +procedure TSpTBXSkinOptionCategory.LoadFromIni(MemIni: TMemIniFile; Section, Ident: string); +begin + Reset; + if Ident = '' then Ident := SSpTBXSkinStatesString[sknsNormal]; + + Body.ReadFromString(MemIni.ReadString(Section, Ident + '.Body', '')); + Borders.ReadFromString(MemIni.ReadString(Section, Ident + '.Borders', '')); + TextColor := StringToColor(MemIni.ReadString(Section, Ident + '.TextColor', 'clNone')); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXThemeOptions } + +procedure TSpTBXSkinOptions.AssignTo(Dest: TPersistent); +var + C: TSpTBXSkinComponentsType; + S: TSpTBXSkinStatesType; + DestOp: TSpTBXSkinOptions; +begin + if Dest is TSpTBXSkinOptions then begin + DestOp := TSpTBXSkinOptions(Dest); + for C := Low(C) to High(C) do + for S := Low(S) to High(S) do + DestOp.FOptions[C, S].Assign(Options(C, S)); + DestOp.ColorBtnFace := FColorBtnFace; + DestOp.FloatingWindowBorderSize := FFloatingWindowBorderSize; + DestOp.OfficeIcons := FOfficeIcons; + DestOp.OfficeMenu := FOfficeMenu; + DestOp.OfficeStatusBar := FOfficeStatusBar; + DestOp.FSkinAuthor := FSkinAuthor; + DestOp.FSkinName := FSkinName; + end + else inherited AssignTo(Dest); +end; + +procedure TSpTBXSkinOptions.BroadcastChanges; +begin + if Self = SkinManager.CurrentSkin then + SkinManager.BroadcastSkinNotification; +end; + +procedure TSpTBXSkinOptions.CopyOptions(AComponent, ToComponent: TSpTBXSkinComponentsType); +var + S: TSpTBXSkinStatesType; +begin + for S := Low(S) to High(S) do + FOptions[AComponent, S].AssignTo(FOptions[ToComponent, S]); +end; + +constructor TSpTBXSkinOptions.Create; +var + C: TSpTBXSkinComponentsType; + S: TSpTBXSkinStatesType; +begin + inherited; + FSkinName := 'Default'; + FColorBtnFace := clBtnFace; + FFloatingWindowBorderSize := 4; + for C := Low(C) to High(C) do + for S := Low(S) to High(S) do + FOptions[C, S] := TSpTBXSkinOptionCategory.Create; + + FillOptions; +end; + +destructor TSpTBXSkinOptions.Destroy; +var + C: TSpTBXSkinComponentsType; + S: TSpTBXSkinStatesType; +begin + for C := Low(C) to High(C) do + for S := Low(S) to High(S) do + FreeAndNil(FOptions[C, S]); + + inherited; +end; + +procedure TSpTBXSkinOptions.FillOptions; +begin + // Used by descendants to fill the skin options +end; + +procedure TSpTBXSkinOptions.Reset(ForceResetSkinProperties: Boolean); +var + C: TSpTBXSkinComponentsType; + S: TSpTBXSkinStatesType; +begin + if ForceResetSkinProperties then begin + FColorBtnFace := clBtnFace; + FFloatingWindowBorderSize := 4; + FOfficeIcons := False; + FOfficeMenu := False; + FOfficeStatusBar := False; + end; + + for C := Low(C) to High(C) do + for S := Low(S) to High(S) do + FOptions[C, S].Reset; +end; + +function TSpTBXSkinOptions.Options(Component: TSpTBXSkinComponentsType; State: TSpTBXSkinStatesType): TSpTBXSkinOptionCategory; +begin + if CSpTBXSkinComponents[Component].States = [sknsNormal] then + State := sknsNormal; + Result := FOptions[Component, State]; +end; + +function TSpTBXSkinOptions.Options(Component: TSpTBXSkinComponentsType): TSpTBXSkinOptionCategory; +begin + Result := FOptions[Component, sknsNormal]; +end; + +procedure TSpTBXSkinOptions.SaveToFile(Filename: WideString); +var + MemIni: TMemIniFile; +begin + MemIni := TMemIniFile.Create(Filename); + try + SaveToMemIni(MemIni); + MemIni.UpdateFile; + finally + MemIni.Free; + end; +end; + +procedure TSpTBXSkinOptions.SaveToMemIni(MemIni: TMemIniFile); +var + C: TSpTBXSkinComponentsType; + S: TSpTBXSkinStatesType; +begin + MemIni.WriteString('Skin', 'Name', FSkinName); + MemIni.WriteString('Skin', 'Author', FSkinAuthor); + MemIni.WriteString('Skin', 'ColorBtnFace', SpColorToString(FColorBtnFace)); + MemIni.WriteInteger('Skin', 'FloatingWindowBorderSize', FFloatingWindowBorderSize); + MemIni.WriteBool('Skin', 'OfficeIcons', FOfficeIcons); + MemIni.WriteBool('Skin', 'OfficeMenu', FOfficeMenu); + MemIni.WriteBool('Skin', 'OfficeStatusBar', FOfficeStatusBar); + + for C := Low(C) to High(C) do begin + for S := Low(S) to High(S) do + if S in CSpTBXSkinComponents[C].States then + FOptions[C, S].SaveToIni(MemIni, CSpTBXSkinComponents[C].Name, SSpTBXSkinStatesString[S]); + end; +end; + +procedure TSpTBXSkinOptions.SaveToStrings(L: TStrings); +var + MemIni: TMemIniFile; +begin + MemIni := TMemIniFile.Create(''); + try + MemIni.SetStrings(L); // Transfer L contents to MemIni + SaveToMemIni(MemIni); + L.Clear; + MemIni.GetStrings(L); // Transfer MemIni contents to L + finally + MemIni.Free; + end; +end; + +procedure TSpTBXSkinOptions.LoadFromFile(Filename: WideString); +var + L: TStringList; +begin + if FileExists(Filename) then begin + L := TStringList.Create; + try + L.LoadFromFile(Filename); + LoadFromStrings(L); + finally + L.Free; + end; + end; +end; + +procedure TSpTBXSkinOptions.LoadFromStrings(L: TStrings); +var + MemIni: TMemIniFile; + C: TSpTBXSkinComponentsType; + S: TSpTBXSkinStatesType; +begin + MemIni := TMemIniFile.Create(''); + try + MemIni.SetStrings(L); + + FSkinName := MemIni.ReadString('Skin', 'Name', ''); + FSkinAuthor := MemIni.ReadString('Skin', 'Author', ''); + FColorBtnFace := StringToColor(MemIni.ReadString('Skin', 'ColorBtnFace', 'clBtnFace')); + FFloatingWindowBorderSize := MemIni.ReadInteger('Skin', 'FloatingWindowBorderSize', 4); + FOfficeIcons := MemIni.ReadBool('Skin', 'OfficeIcons', False); + FOfficeMenu := MemIni.ReadBool('Skin', 'OfficeMenu', False); + FOfficeStatusBar := MemIni.ReadBool('Skin', 'OfficeStautsBar', False); + + for C := Low(C) to High(C) do begin + for S := Low(S) to High(S) do + if S in CSpTBXSkinComponents[C].States then + FOptions[C, S].LoadFromIni(MemIni, CSpTBXSkinComponents[C].Name, SSpTBXSkinStatesString[S]); + end; + + BroadcastChanges; + finally + MemIni.Free; + end; +end; + +function TSpTBXSkinOptions.GetOfficeIcons: Boolean; +// OfficeIcons is used to paint the menu items icons with Office XP shadows. +begin + Result := FOfficeIcons and (SkinManager.GetSkinType = sknSkin); +end; + +function TSpTBXSkinOptions.GetOfficeMenu: Boolean; +// When OfficeMenu is True the height of the separators on popup menus +// is 6 pixels, otherwise the size is 10 pixels. +// And when the item is disabled the hottrack is not painted. +begin + Result := FOfficeMenu 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; + SkinType: TSpTBXSkinType; +begin + if ImgSize = 0 then + ImgSize := 16; + + FillChar(MarginsInfo, SizeOf(MarginsInfo), 0); + SkinType := SkinManager.GetSkinType; + + if (SkinType = sknWindows) and SpIsWinVistaOrUp then begin + // Vista-like spacing + MarginsInfo.Margins := Rect(1, 3, 1, 3); // MID_MENUITEM + MarginsInfo.ImageTextSpace := 5 + 1; // TMI_MENU_IMGTEXTSPACE + MarginsInfo.LeftCaptionMargin := 3; // TMI_MENU_LCAPTIONMARGIN + MarginsInfo.RightCaptionMargin := 3; // TMI_MENU_RCAPTIONMARGIN + end + else + if (SkinType = sknSkin) then begin + // Office-like spacing + MarginsInfo.Margins := Rect(1, 3, 1, 3); // 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, 2, 0, 2); // 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; // GutterSize = GetPopupMargin = ItemInfo.PopupMargin +end; + +function TSpTBXSkinOptions.GetState(Enabled, Pushed, HotTrack, Checked: Boolean): TSpTBXSkinStatesType; +begin + Result := sknsNormal; + if not Enabled then Result := sknsDisabled + else begin + if Pushed then Result := sknsPushed + else + if HotTrack and Checked then Result := sknsCheckedAndHotTrack + else + if HotTrack then Result := sknsHotTrack + else + if Checked then Result := sknsChecked; + end; +end; + +function TSpTBXSkinOptions.GetTextColor(Component: TSpTBXSkinComponentsType; + State: TSpTBXSkinStatesType; SkinType: TSpTBXSkinType = sknSkin): TColor; +var + Flags: Integer; + VistaColor: Cardinal; +begin + Result := clNone; + SkinType := SpTBXSkinType(SkinType); + + if SkinType = sknSkin then begin + if State in CSpTBXSkinComponents[Component].States then begin + Result := Options(Component, State).TextColor; + if Result <> clNone then + Exit; // Text color is specified by the skin + end + else + Exit; // Exit if the State is not valid + end; + + if State = sknsDisabled then Result := clGrayText + else Result := clBtnText; + + case Component of + skncMenuItem: + if SpIsWinVistaOrUp and (SkinType = sknWindows) then begin + // Use the new API on Windows Vista + 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 SpIsWinVistaOrUp and (SkinType = sknWindows) then begin + // Use the new API on Windows Vista + Flags := MBI_NORMAL; + if State = sknsDisabled then Flags := MBI_DISABLED + else if State in [sknsHotTrack, sknsCheckedAndHotTrack] then Flags := MBI_HOT; + GetThemeColor(ThemeServices.Theme[teMenu], MENU_BARITEM, Flags, TMT_TEXTCOLOR, VistaColor); + Result := TColor(VistaColor); + end + else + 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; + skncButton: + if (SkinType = sknWindows) then begin + Flags := PBS_NORMAL; + case State of + sknsDisabled: Flags := PBS_DISABLED; + sknsHotTrack: Flags := PBS_HOT; + sknsPushed, sknsChecked, sknsCheckedAndHotTrack: Flags := PBS_PRESSED; + end; + GetThemeColor(ThemeServices.Theme[teButton], BP_PUSHBUTTON, Flags, TMT_TEXTCOLOR, VistaColor); + Result := TColor(VistaColor); + end; + skncListItem: + if SkinType <> sknSkin then + if State in [sknsChecked, sknsCheckedAndHotTrack] then + Result := clHighlightText; + skncDockablePanelTitleBar, skncStatusBar, skncTabToolbar: + if SkinType = sknSkin then + Result := GetTextColor(skncToolbarItem, State, SkinType); // Use skncToolbarItem to get the default text color + skncWindowTitleBar: + if SkinType = sknSkin then + Result := GetTextColor(skncToolbarItem, State, SkinType) // Use skncToolbarItem to get the default text color + else + if State = sknsDisabled then Result := clInactiveCaptionText + else Result := clCaptionText; + end; +end; + +procedure TSpTBXSkinOptions.PaintBackground(ACanvas: TCanvas; ARect: TRect; + Component: TSpTBXSkinComponentsType; State: TSpTBXSkinStatesType; + Background, Borders: Boolean; Vertical: Boolean = False; + ForceRectBorders: TAnchors = []); +var + BackgroundRect: TRect; + Op: TSpTBXSkinOptionCategory; +begin + Op := Options(Component, State); + + if Op.Borders.IsEmpty then + Borders := False; + if Op.Body.IsEmpty then + Background := False; + + if Background then begin + BackgroundRect := ARect; + if Borders then + InflateRect(BackgroundRect, -1, -1); + SpPaintSkinBackground(ACanvas, BackgroundRect, Op, Vertical); + end; + + if Borders then + SpPaintSkinBorders(ACanvas, ARect, Op, ForceRectBorders); +end; + +procedure TSpTBXSkinOptions.PaintMenuCheckMark(ACanvas: TCanvas; ARect: TRect; + Checked, Grayed, MenuItemStyle: Boolean; State: TSpTBXSkinStatesType); +var + X, Y: Integer; + PenC, BrushC, CheckColor: TColor; + Flags: Integer; + VistaCheckSize: TSize; +begin + if MenuItemStyle and SpIsWinVistaOrUp and (SkinManager.GetSkinType = sknWindows) then begin + // Use the new API on Windows Vista + if State = sknsDisabled then Flags := MC_CHECKMARKDISABLED + else Flags := MC_CHECKMARKNORMAL; + VistaCheckSize.cx := 0; + VistaCheckSize.cy := 0; + GetThemePartSize(ThemeServices.Theme[teMenu], ACanvas.Handle, MENU_POPUPCHECK, Flags, nil, TS_TRUE, VistaCheckSize); + ARect := SpCenterRect(ARect, VistaCheckSize.cx, VistaCheckSize.cy); + DrawThemeBackground(ThemeServices.Theme[teMenu], ACanvas.Handle, MENU_POPUPCHECK, Flags, ARect, nil); + end + else begin + X := ARect.Left + (ARect.Right - ARect.Left) div 2 - 1; + Y := ARect.Top + (ARect.Bottom - ARect.Top) div 2 + 1; + + PenC := ACanvas.Pen.Color; + BrushC := ACanvas.Brush.Color; + try + if MenuItemStyle then begin + CheckColor := clMenuText; // On sknNone it's clMenuText even when disabled + case SkinManager.GetSkinType of + sknWindows: + CheckColor := GetTextColor(skncCheckBox, State); + sknSkin: + CheckColor := GetTextColor(skncMenuItem, State); + end; + ACanvas.Brush.Color := CheckColor; + ACanvas.Pen.Color := CheckColor; + ACanvas.Polygon([Point(X - 3, Y - 2), Point(X - 1, Y), Point(X + 3, Y - 4), + Point(X + 3, Y - 3), Point(X - 1, Y + 1), Point(X - 3, Y - 1), Point(X - 3, Y -2)]); + end + else begin + CheckColor := GetTextColor(skncCheckBox, State); + ACanvas.Brush.Color := CheckColor; + ACanvas.Pen.Color := CheckColor; + PaintBackground(ACanvas, ARect, skncCheckBox, State, True, True); + if Checked then + ACanvas.Polygon([Point(X - 2, Y), Point(X, Y + 2), Point(X + 4, Y - 2), + Point(X + 4, Y - 4), Point(X, Y), Point(X - 2, Y - 2), Point(X - 2, Y)]) + else + if Grayed then begin + InflateRect(ARect, -3, -3); + // ACanvas.Brush.Color := Options(skncCheckBox, sknsChecked).Borders.Color1; + ACanvas.FillRect(ARect); + end; + end; + finally + ACanvas.Pen.Color := PenC; + ACanvas.Brush.Color := BrushC; + end; + end; +end; + +procedure TSpTBXSkinOptions.PaintMenuRadioMark(ACanvas: TCanvas; ARect: TRect; + Checked, MenuItemStyle: Boolean; State: TSpTBXSkinStatesType); +var + X, Y: Integer; + PenC, BrushC, CheckColor, FrameColor: TColor; + Flags: Integer; + VistaCheckSize: TSize; +begin + if MenuItemStyle and SpIsWinVistaOrUp and (SkinManager.GetSkinType = sknWindows) then begin + // Use the new API on Windows Vista + if State = sknsDisabled then Flags := MC_BULLETDISABLED + else Flags := MC_BULLETNORMAL; + VistaCheckSize.cx := 0; + VistaCheckSize.cy := 0; + GetThemePartSize(ThemeServices.Theme[teMenu], ACanvas.Handle, MENU_POPUPCHECK, Flags, nil, TS_TRUE, VistaCheckSize); + ARect := SpCenterRect(ARect, VistaCheckSize.cx, VistaCheckSize.cy); + DrawThemeBackground(ThemeServices.Theme[teMenu], ACanvas.Handle, MENU_POPUPCHECK, Flags, ARect, nil); + end + else begin + PenC := ACanvas.Pen.Color; + BrushC := ACanvas.Brush.Color; + try + if MenuItemStyle then begin + CheckColor := clMenuText; // On sknNone it's clMenuText even when disabled + case SkinManager.GetSkinType of + sknWindows: + CheckColor := GetTextColor(skncRadioButton, State); + sknSkin: + CheckColor := GetTextColor(skncMenuItem, State); + end; + ACanvas.Brush.Color := CheckColor; + ACanvas.Pen.Color := CheckColor; + X := ARect.Left + (ARect.Right - ARect.Left) div 2; + Y := ARect.Top + (ARect.Bottom - ARect.Top) div 2; + ACanvas.RoundRect(X - 3, Y - 3, X + 3, Y + 3, 2, 2); + end + else begin + CheckColor := GetTextColor(skncRadioButton, State); + FrameColor := Options(skncRadioButton, State).Borders.Color1; + if State = sknsDisabled then FrameColor := CheckColor; + if not Checked then CheckColor := clNone; + + // Keep it simple make the radio 13x13 + ARect.Left := ARect.Left + (ARect.Right - ARect.Left - 13) div 2; + ARect.Right := ARect.Left + 13; + ARect.Top := ARect.Top + (ARect.Bottom - ARect.Top - 13) div 2; + ARect.Bottom := ARect.Top + 13; + X := ARect.Left; + Y := ARect.Top; + + // Background + BeginPath(ACanvas.Handle); + ACanvas.Polyline([Point(X, Y + 8), Point(X, Y + 4), Point(X + 1, Y + 3), + Point(X + 1, Y + 2), Point(X + 2, Y + 1), Point(X + 3, Y + 1), + Point(X + 4, Y), Point(X + 8, Y), Point(X + 9, Y + 1), + Point(X + 10, Y + 1), Point(X + 11, Y + 2), Point(X + 11, Y + 3), + Point(X + 12, Y + 4), Point(X + 12, Y + 8), Point(X + 11, Y + 9), + Point(X + 11, Y + 10), Point(X + 10, Y + 11), Point(X + 9, Y + 11), + Point(X + 8, Y + 12), Point(X + 4, Y + 12), Point(X + 3, Y + 11), + Point(X + 2, Y + 11), Point(X + 1, Y + 10), Point(X + 1, Y + 8)]); + EndPath(ACanvas.Handle); + SelectClipPath(ACanvas.Handle, RGN_COPY); + PaintBackground(ACanvas, ARect, skncRadioButton, State, True, False); + SelectClipPath(ACanvas.Handle, 0); + SelectClipRgn(ACanvas.Handle, 0); + + // Frame + ACanvas.Brush.Color := FrameColor; + ACanvas.Pen.Color := FrameColor; + ACanvas.Polyline([Point(X, Y + 8), Point(X, Y + 4), Point(X + 1, Y + 3), + Point(X + 1, Y + 2), Point(X + 2, Y + 1), Point(X + 3, Y + 1), + Point(X + 4, Y), Point(X + 8, Y), Point(X + 9, Y + 1), + Point(X + 10, Y + 1), Point(X + 11, Y + 2), Point(X + 11, Y + 3), + Point(X + 12, Y + 4), Point(X + 12, Y + 8), Point(X + 11, Y + 9), + Point(X + 11, Y + 10), Point(X + 10, Y + 11), Point(X + 9, Y + 11), + Point(X + 8, Y + 12), Point(X + 4, Y + 12), Point(X + 3, Y + 11), + Point(X + 2, Y + 11), Point(X + 1, Y + 10), Point(X + 1, Y + 8)]); + + // Radio + if CheckColor <> clNone then begin + ACanvas.Brush.Color := CheckColor; + ACanvas.Pen.Color := CheckColor; + X := (ARect.Left + ARect.Right) div 2; + Y := (ARect.Top + ARect.Bottom) div 2 + 1; + ACanvas.RoundRect(X - 2, Y - 3, X + 3, Y + 2, 2, 2); + end; + end; + finally + ACanvas.Pen.Color := PenC; + ACanvas.Brush.Color := BrushC; + end; + end; +end; + +procedure TSpTBXSkinOptions.PaintWindowFrame(ACanvas: TCanvas; ARect: TRect; + IsActive, DrawBody: Boolean; BorderSize: Integer = 4); +var + C: TColor; + R: TRect; + I: Integer; + State: TSpTBXSkinStatesType; + Op: TSpTBXSkinOptionEntry; +begin + if IsActive then + State := sknsNormal + else + if Options(skncWindow, sknsDisabled).IsEmpty then + State := sknsNormal + else + State := sknsDisabled; + + C := ACanvas.Brush.Color; + if DrawBody then + PaintBackground(ACanvas, ARect, skncWindow, State, True, False); + R := ARect; + Op := Options(skncWindow, State).Borders; + for I := 1 to BorderSize do begin + if I = 1 then ACanvas.Brush.Color := Op.Color1 + else if I = 2 then ACanvas.Brush.Color := Op.Color2 + else if I = 3 then ACanvas.Brush.Color := Op.Color3 + else if I >= 4 then ACanvas.Brush.Color := Op.Color4; + ACanvas.FrameRect(R); + InflateRect(R, -1, -1); + end; + ACanvas.Brush.Color := C; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSkinsListEntry } + +destructor TSpTBXSkinsListEntry.Destroy; +begin + SkinClass := nil; + FreeAndNil(SkinStrings); + + inherited; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSkinsList } + +destructor TSpTBXSkinsList.Destroy; +begin + // Free all the skins options + while Count > 0 do + Delete(0); + inherited; +end; + +function TSpTBXSkinsList.AddSkin(SkinName: string; SkinClass: TSpTBXSkinOptionsClass): Integer; +var + K: TSpTBXSkinsListEntry; +begin + Result := -1; + if (SkinName <> '') and (IndexOf(SkinName) = -1) then begin + K := TSpTBXSkinsListEntry.Create; + try + K.SkinClass := SkinClass; + Result := AddObject(SkinName, K); // the list owns K + except + K.Free; + end; + end; +end; + +function TSpTBXSkinsList.AddSkin(SkinOptions: TStrings): Integer; +var + K: TSpTBXSkinsListEntry; + S: string; +begin + Result := -1; + K := TSpTBXSkinsListEntry.Create; + try + K.SkinStrings := TStringList.Create; + S := SkinOptions.Values['Name ']; + if S = '' then + S := SkinOptions.Values['Name']; + S := Trim(S); + if (S <> '') and (IndexOf(S) = -1) then begin + K.SkinStrings.Assign(SkinOptions); + Result := AddObject(S, K); // the list owns K + end + else + K.Free; + except + K.Free; + end; +end; + +function TSpTBXSkinsList.AddSkinFromFile(Filename: WideString): Integer; +var + L: TStringList; +begin + L := TStringList.Create; + try + L.LoadFromFile(Filename); + Result := AddSkin(L); + finally + L.Free; + end; +end; + +procedure TSpTBXSkinsList.AddSkinsFromFolder(Folder: WideString); +var + L: TStringList; + I: Integer; + S: string; +begin + L := TStringList.Create; + try + if SpGetDirectories(Folder, L) then begin + for I := 0 to L.Count - 1 do begin + S := IncludeTrailingPathDelimiter(Folder) + L[I] + '\Skin.ini'; + if FileExists(S) then + AddSkinFromFile(S); + end; + end; + finally + L.Free; + end; +end; + +procedure TSpTBXSkinsList.Delete(Index: Integer); +begin + if (Index > -1) and (Index < Count) then + SkinOptions[Index].Free; + inherited Delete(Index); +end; + +procedure TSpTBXSkinsList.GetSkinNames(SkinNames: TStrings); +var + I: Integer; +begin + SkinNames.BeginUpdate; + try + SkinNames.Clear; + SkinNames.Add('Default'); + for I := 0 to Count - 1 do + SkinNames.Add(Strings[I]); + finally + SkinNames.EndUpdate; + end; +end; + +function TSpTBXSkinsList.GetSkinOption(Index: Integer): TSpTBXSkinsListEntry; +begin + Result := TSpTBXSkinsListEntry(Objects[Index]); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSkinManager } + +constructor TSpTBXSkinManager.Create; +begin + FNotifies := TList.Create; + FCurrentSkin := TSpTBXSkinOptions.Create; + FSkinsList := TSpTBXSkinsList.Create; +end; + +destructor TSpTBXSkinManager.Destroy; +begin + FreeAndNil(FNotifies); + FreeAndNil(FCurrentSkin); + FreeAndNil(FSkinsList); + inherited; +end; + +procedure TSpTBXSkinManager.AddSkinNotification(AObject: TObject); +begin + if FNotifies.IndexOf(AObject) < 0 then FNotifies.Add(AObject); +end; + +procedure TSpTBXSkinManager.RemoveSkinNotification(AObject: TObject); +begin + FNotifies.Remove(AObject); +end; + +procedure TSpTBXSkinManager.Broadcast; +var + Msg: TMessage; + I: Integer; +begin + if FNotifies.Count > 0 then begin + Msg.Msg := WM_SPSKINCHANGE; + Msg.WParam := 0; + Msg.LParam := 0; + Msg.Result := 0; + for I := 0 to FNotifies.Count - 1 do + TObject(FNotifies[I]).Dispatch(Msg); + end; + if Assigned(FOnSkinChange) then FOnSkinChange(Self); +end; + +procedure TSpTBXSkinManager.BroadcastSkinNotification; +begin + Broadcast; +end; + +procedure TSpTBXSkinManager.LoadFromFile(Filename: WideString); +begin + FCurrentSkin.LoadFromFile(Filename); +end; + +procedure TSpTBXSkinManager.SaveToFile(Filename: WideString); +begin + FCurrentSkin.SaveToFile(Filename); +end; + +function TSpTBXSkinManager.GetCurrentSkinName: string; +begin + Result := FCurrentSkin.SkinName; +end; + +function TSpTBXSkinManager.GetSkinType: TSpTBXSkinType; +begin + Result := SpTBXSkinType(sknSkin); +end; + +function TSpTBXSkinManager.IsDefaultSkin: Boolean; +begin + Result := CurrentSkinName = 'Default'; +end; + +function TSpTBXSkinManager.IsXPThemesEnabled: Boolean; +begin + Result := ThemeServices.ThemesAvailable and UxTheme.UseThemes; +end; + +procedure TSpTBXSkinManager.SetSkin(SkinName: string); +var + I: Integer; + K: TSpTBXSkinsListEntry; +begin + if not SameText(SkinName, CurrentSkinName) then + if SameText(SkinName, 'Default') then + SetToDefaultSkin + else begin + I := FSkinsList.IndexOf(SkinName); + if I > -1 then begin + K := FSkinsList.SkinOptions[I]; + if Assigned(K.SkinClass) then begin + FCurrentSkin.Free; + FCurrentSkin := K.SkinClass.Create; + Broadcast; + end + else + if Assigned(K.SkinStrings) then begin + FCurrentSkin.Free; + FCurrentSkin := TSpTBXSkinOptions.Create; + FCurrentSkin.LoadFromStrings(K.SkinStrings); + end; + end; + end; +end; + +procedure TSpTBXSkinManager.SetToDefaultSkin; +begin + FCurrentSkin.Free; + FCurrentSkin := TSpTBXSkinOptions.Create; + Broadcast; +end; + +procedure TSpTBXSkinManager.ChangeControlSkinType(Control: TWinControl; + SkinType: TSpTBXSkinType; Recursive: Boolean = True); + + procedure ChangeSkinTypeProperty(Component: TComponent; TM: TSpTBXSkinType); + var + S: string; + PropInfo: PPropInfo; + begin + if Length(Component.ClassName) > 6 then begin + S := Copy(Component.ClassName, 1, 6); + if SameText(S, 'TSpTBX') then begin + PropInfo := GetPropInfo(Component, 'SkinType'); + if (PropInfo <> nil) and (PropInfo.PropType^.Kind = tkEnumeration) then + SetOrdProp(Component, PropInfo, Integer(TM)); + end; + end; + end; + +var + I: Integer; + C: TControl; +begin + for I := 0 to Control.ControlCount - 1 do begin + C := Control.Controls[I]; + ChangeSkinTypeProperty(C, SkinType); + if Recursive and (C is TWinControl) then + ChangeControlSkinType(C as TWinControl, SkinType, Recursive); + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXSkinSwitcher } + +constructor TSpTBXSkinSwitcher.Create(AOwner: TComponent); +begin + inherited; + SkinManager.AddSkinNotification(Self); +end; + +destructor TSpTBXSkinSwitcher.Destroy; +begin + SkinManager.RemoveSkinNotification(Self); + inherited; +end; + +function TSpTBXSkinSwitcher.GetSkin: string; +begin + Result := SkinManager.CurrentSkinName; +end; + +procedure TSpTBXSkinSwitcher.SetSkin(const Value: string); +begin + SkinManager.SetSkin(Value); +end; + +procedure TSpTBXSkinSwitcher.WMSpSkinChange(var Message: TMessage); +begin + if Assigned(FOnSkinChange) then FOnSkinChange(Self); +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Stock Objects } + +procedure InitializeStock; +begin + StockBitmap := TBitmap.Create; + StockBitmap.Width := 8; + StockBitmap.Height := 8; + + @SpPrintWindow := GetProcAddress(GetModuleHandle(user32), 'PrintWindow'); + + if not Assigned(FInternalSkinManager) then + FInternalSkinManager := TSpTBXSkinManager.Create; +end; + +procedure FinalizeStock; +begin + FreeAndNil(StockBitmap); + FreeAndNil(FInternalSkinManager); +end; + +initialization + InitializeStock; + {$IFDEF SYSTEM_GRADIENT} + FMsimg32Library := LoadLibrary(msimg32); + if FMsimg32Library <> 0 then + GradientFillSystem := GetProcAddress(FMsimg32Library, 'GradientFill') + {$ENDIF} + +finalization + FinalizeStock; + {$IFDEF SYSTEM_GRADIENT} + if FMsimg32Library <> 0 then + FreeLibrary(FMsimg32Library); + {$ENDIF} + +end. diff --git a/internal/2.4.4/1/Source/SpTBXTabs.pas b/internal/2.4.4/1/Source/SpTBXTabs.pas new file mode 100644 index 0000000..0cc3e11 --- /dev/null +++ b/internal/2.4.4/1/Source/SpTBXTabs.pas @@ -0,0 +1,3493 @@ +unit SpTBXTabs; + +{============================================================================== +Version 2.4.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: + - Tabbed docking + +History: +2 December 2009 - version 2.4.4 + - Fixed TabControl flicker when changing the caption of a tab + item, thanks to Simon H. for reporting this. + +13 September 2009 - version 2.4.3 + - Fixed TabControl flicker when closing/selecting/scrolling + tab items. + - Fixed incorrect TabControl painting when transparent + child controls get invalidated, thanks for Alfred Vink + for reporting this. + - Fixed incorrect TabControl scrolling, thanks to Henner + Drewes for reporting this. + +8 May 2009 - version 2.4.2 + - Fixed incorrect TabControl behavior, when deleting + the tabs the ActiveTabIndex is incorrectly set if + there are regular Items on the control, thanks to + Jonah for reporting this. + +15 March 2009 - version 2.4.1 + - No changes. + +17 January 2009 - version 2.4 + - No changes. + +26 September 2008 - version 2.3 + - No changes. + +29 July 2008 - version 2.2 + - No changes. + +26 June 2008 - version 2.1 + - No changes. + +3 May 2008 - version 2.0 + - Fixed incorrect close button painting on tab items, + thanks to Miha for reporting this. + +2 April 2008 - version 1.9.5 + - Fixed incorrect TabControl behavior, when deleting the + only visible Tab all the auto-hidden tabs will not + be showed on resize, thanks to Jim for reporting this. + +3 February 2008 - version 1.9.4 + - Fixed AV on TabControl when scrolling tabs, thanks + to Beta Xiong and Yucel Yavuz for reporting this. + - Fixed incorrect TabControl.ScrollState behavior + thanks to Michele for reporting this. + +19 January 2008 - version 1.9.3 + - Fixed recursion on TSpTBXTabToolbar.RightAlignItems, + thanks to Jim for reporting this. + +26 December 2007 - version 1.9.2 + - Minor bug fixes. + +1 December 2007 - version 1.9.1 + - Added OnTabClosing event to TSpTBXTabItem. + - Fixed incorrect tab items painting when TabPosition was + ttpBottom, thanks to Marko Savolainen for reporting this. + +20 November 2007 - version 1.9 + - Added TabBackgroundBorders property to TSpTBXTabSet and + TSpTBXTabControl, when set to true the tabs area is + painted with borders. + - Added TabCloseButton and TabCloseButtonImageIndex properties + to SpTBXTabSet and TSpTBXTabControl to control the close + button visibility on the tab items. + - Added TabMaxSize property to SpTBXTabSet and TSpTBXTabControl + to control the maximum size of the tab items. + - Improved tab scrolling, thanks to Kevin Lu for + reporting this. + +8 February 2007 - version 1.8.3 + - Added accel char handling to TSpTBXTabSet and TSpTBXTabControl + +17 December 2006 - version 1.8.2 + - No changes. + +24 November 2006 - version 1.8.1 + - Fixed incorrect Tab painting when the Default theme was used + and the ThemeType was tttFlat. + +27 August 2006 - version 1.8 + - Fixed incorrect OnActiveTabChanging handling when + ActiveTabIndex is changed on this event, thanks to + Serg Chechenin for reporting this. + +15 June 2006 - version 1.7 + - Fixed incorrect Tab painting when the default theme was used, + the captions were painted in a pushed state, thanks to + Mikalai Arapau for reporting this. + - Fixed incorrect Tab aligning when Autofit was used and the + tab control was parented by a Frame, thanks to + Henk van Kampen for reporting this. + +12 April 2006 - version 1.5 + - Fixed incorrect Tab painting when TabAutofit was true. + +27 February 2006 - version 1.4 + - Fixed flicker when reordering TSpTBXTabSet and TSpTBXTabControl + tabs, thanks to Alexey Naumov for reporting this. + - Fixed incorrect context menu handling in TSpTBXTabSet and + TSpTBXTabControl, thanks to Boris Yankov for reporting this. + - Added OnActiveTabReorder event to TSpTBXTabSet and TSpTBXTabControl. + +10 February 2006 - version 1.3 + - Added TabDragReorder property to TSpTBXTabSet and TSpTBXTabControl, + when this property is true it allows tabs reordering with + drag and drop. + - Added TabAutofit and TabAutofitMaxSize properties to TSpTBXTabSet + and TSpTBXTabControl. When TabAutofit is true the tabs are resized + to fit the tabset. + +28 December 2005 - version 1.2 + - Fixed incorrect TSpTBXTabControl background painting on some themes. + - Fixed incorrect OnActiveTabChange call when the component is being + loaded, thanks to Leroy Casterline for reporting this. + - Fixed incorrect tab scrolling when an item is deleted, thanks to + Daniel Rikowski for reporting this. + +18 October 2005 - version 1.1 + - Fixed incorrect TSpTBXTabItem painting on some themes. + - Added Margins property to TSpTBXPageControl. + +18 August 2005 - version 1.0 + - Added TabVisible property to TSpTBXTabSet and TSpTBXPageControl. + - Added OnActiveTabChanging event to TSpTBXTabSet and TSpTBXPageControl. + +10 June 2005 - version 0.9 + - SpTBXLib may now alternatively, at your option, be used and/or + distributed under the terms of the SpTBXLib License. + Please see the updated LICENSE.TXT file for more information. + - Fixed AV in TSpTBXTabSet and TSpTBXPageControl when used in a Frame + with TabPosition setted to dpBottom, thanks to Cyril Velter for the fix. + +20 May 2005 - version 0.8 + - Fixed tab scrolling of TSpTBXTabSet and TSpTBXPageControl, the tabs + were not allowed to scroll when one single tab was visible, thanks + to Anders Olsson for the fix. + - Added MakeVisible method to the TSpTBXTabSet and TSpTBXPageControl, + it scrolls the tabset, if necessary, to ensure a Tab is in view. + +16 February 2005 - version 0.7 + - No changes. + +23 December 2004 - version 0.6 + - Fixed TSpTBXTabControl reordering bug. + - Changed the order of the TSpTBXTabThemeType enumerated type. + - Added ActivePage property to the TSpTBXTabControl. + - Added Caption, ImageIndex, TabVisible and PopupMenu properties + to TSpTBXTabControl. + +30 August 2004 - version 0.5 + - No changes. + +21 July 2004 - version 0.4 + - Fixed TSpTBXTabControl design time bug, it was allowing to drop + components when ActiveTabIndex = -1 + - Fixed TSpTBXTabSet and TSpTBXTabControl design time bug, the + hidden items were not streamed to the DFM. + - Changed TSpTBXTabControl.OnTabClick event for OnActiveTabChange. + - Added GetPage method to TSpTBXTabControl to get the TSpTBXTabSheet + linked to a TSpTBXTabItem. + +12 July 2004 - version 0.3.1 + - Fixed nasty AV when setting TBXSwitcher.EnableXPStyles to false, + thanks to Alfred for reporting this. + Note: TBXThemeManager unloads the theme library and the theme + parts when some conditions are met, we must handle extra theme + parts outside TBXThemeManager space. + - Fixed incorrect TSpTBXTabSet.ActiveTabIndex property update at + design time. + - Fixed incorrect TSpTBXTabSet painting on some TBX themes, thanks + to Tim for reporting this. + +9 July 2004 - version 0.3 + - Fixed design time AVs when moving or deleting TabSheets. + - Published ThemeType and TabPosition properties for TSpTBXTabItem. + - New component added, TSpTBXTabSet, a fully customizable TabSet + with unicode and toolbar items support. + +28 June 2004 - version 0.2 + - No changes. + +22 June 2004 - version 0.1 + - Initial release. + +==============================================================================} + +interface + +{$BOOLEVAL OFF} // Unit depends on short-circuit boolean evaluation + +uses + Windows, Messages, Classes, SysUtils, Controls, Graphics, ImgList, Forms, + Dialogs, ExtCtrls, TB2Item, TB2Dock, TB2Toolbar, + SpTBXSkins, SpTBXItem, SpTBXControls; + +const + C_SpTBXTabGroupIndex = 7777; + WM_INVALIDATETABBACKGROUND = WM_USER + 7777; + +type + TSpTBXTabEdge = ( + tedNone, // No edge needed + tedLeft, // Left edge of the tab + tedRight // Right edge of the tab + ); + + TSpTBXTabPosition = ( + ttpTop, // Top aligned tabset + ttpBottom // Bottom aligned tabset + ); + + TSpTBXTabCloseButton = ( + tcbNone, // No close button on tabs + tcbActive, // Close button only on active tab + tcbAll // Close button on all the tabs + ); + + TSpTBXTabChangeEvent = procedure(Sender: TObject; TabIndex: Integer) of object; + TSpTBXTabChangingEvent = procedure(Sender: TObject; TabIndex, NewTabIndex: Integer; var Allow: Boolean) of object; + TSpTBXTabClosingEvent = procedure(Sender: TObject; var Allow, CloseAndFree: Boolean) of object; + + TSpTBXTabToolbar = class; + TSpTBXCustomTabSet = class; + TSpTBXCustomTabControl = class; + TSpTBXTabSheet = class; + + TSpTBXTabItemDragObject = class(TSpTBXCustomDragObject) + public + constructor Create(ASourceControl: TControl; AItem: TTBCustomItem); override; + end; + + { TSpTBXTabItem } + + TSpTBXTabItem = class(TSpTBXCustomItem) + private + FSkinType: TSpTBXSkinType; + FOnDrawTabCloseButton: TSpTBXDrawImageEvent; + FOnTabClose: TNotifyEvent; + FOnTabClosing: TSpTBXTabClosingEvent; + function GetTabColor: TColor; + function GetSkinType: TSpTBXSkinType; + procedure SetSkinType(const Value: TSpTBXSkinType); + protected + function DialogChar(CharCode: Word): Boolean; override; + procedure DoDrawTabCloseButton(ACanvas: TCanvas; State: TSpTBXSkinStatesType; + const PaintStage: TSpTBXPaintStage; var 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 } + + TSpTBXTabToolbarView = class(TSpTBXToolbarView) + public + procedure BeginUpdate; override; + procedure EndUpdate; override; + end; + + TSpTBXTabToolbar = class(TSpTBXToolbar) + private + FActiveTabRect: TRect; + FSkinType: TSpTBXSkinType; + FTabAutofit: Boolean; + FTabAutofitMaxSize: Integer; + FTabCloseButtonImageIndex: Integer; + FTabCloseButton: TSpTBXTabCloseButton; + FTabDragReorder: Boolean; + FTabBackgroundBorders: Boolean; + FTabColor: TColor; + FTabMaxSize: Integer; + FTabPosition: TSpTBXTabPosition; + procedure Scroll(ToRight: Boolean); + function GetActiveTab: TSpTBXTabItem; + procedure SetActiveTabIndex(Value: Integer); + procedure SetSkinType(const Value: TSpTBXSkinType); + procedure SetTabCloseButton(const Value: TSpTBXTabCloseButton); + procedure SetTabCloseButtonImageIndex(const Value: Integer); + procedure SetTabAutofit(const Value: Boolean); + procedure SetTabAutofitMaxSize(const Value: Integer); + procedure SetTabBackgroundBorders(const Value: Boolean); + procedure SetTabColor(const Value: TColor); + procedure SetTabMaxSize(const Value: Integer); + procedure SetTabPosition(const Value: TSpTBXTabPosition); + procedure CMDesignHitTest(var Message: TCMDesignHitTest); message CM_DESIGNHITTEST; + protected + FHiddenTabs: TSpTBXItemCacheCollection; + FActiveTabIndex: Integer; + FOwnerTabControl: TSpTBXCustomTabSet; + procedure Autofit; + function GetItemsTextColor(State: TSpTBXSkinStatesType): TColor; override; + function GetViewClass: TTBToolbarViewClass; 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 + {$IF CompilerVersion > 15} // For Delphi 2005 and up + property Padding; + property OnAlignInsertBefore; + property OnAlignPosition; + {$IFEND} + property PopupMenu; + property Caption: WideString read GetCaption write SetCaption; + property ImageIndex: Integer read GetImageIndex write SetImageIndex; + property TabVisible: Boolean read GetTabVisible write SetTabVisible default True; + end; + + { TSpTBXTabControl } + + TSpTBXCustomTabSet = class(TSpTBXCompoundItemsControl) + private + FItemMoveCount: Integer; + FItemMoved: TSpTBXTabItem; + FTabVisible: Boolean; + FLoadingActiveIndex: Integer; + FUpdatingIndex: Boolean; + FResizing: Boolean; + FOnDrawBackground: TSpTBXDrawEvent; + FOnActiveTabChange: TSpTBXTabChangeEvent; + FOnActiveTabChanging: TSpTBXTabChangingEvent; + FOnActiveTabReorder: TSpTBXTabChangeEvent; + FOnActiveTabReordering: TSpTBXTabChangingEvent; + procedure ReadHiddenItems(Reader: TReader); + procedure WriteHiddenItems(Writer: TWriter); + function GetActiveTabIndex: Integer; + procedure SetActiveTabIndex(Value: Integer); + function GetSkinType: TSpTBXSkinType; + procedure SetSkinType(const Value: TSpTBXSkinType); + function GetTabAutofit: Boolean; + procedure SetTabAutofit(const Value: Boolean); + function GetTabAutofitMaxSize: Integer; + procedure SetTabAutofitMaxSize(const Value: Integer); + function GetTabBackgroundBorders: Boolean; + procedure SetTabBackgroundBorders(const Value: Boolean); + function GetTabBackgroundColor: TColor; + procedure SetTabBackgroundColor(const Value: TColor); + function GetTabCloseButton: TSpTBXTabCloseButton; + procedure SetTabCloseButton(const Value: TSpTBXTabCloseButton); + function GetTabCloseButtonImageIndex: Integer; + procedure SetTabCloseButtonImageIndex(const Value: Integer); + function GetTabDragReorder: Boolean; + procedure SetTabDragReorder(const Value: Boolean); + function GetTabMaxSize: Integer; + procedure SetTabMaxSize(const Value: Integer); + function GetTabPosition: TSpTBXTabPosition; + procedure SetTabPosition(const Value: TSpTBXTabPosition); + procedure SetTabVisible(const Value: Boolean); + function GetTabToolbar: TSpTBXTabToolbar; + procedure CMColorchanged(var Message: TMessage); message CM_COLORCHANGED; + procedure CMSpTBXControlsInvalidate(var Message: TMessage); message CM_SPTBXCONTROLSINVALIDATE; + procedure WMEraseBkgnd(var Message: TMessage); message WM_ERASEBKGND; + procedure WMInvalidateTabBackground(var Message: TMessage); message WM_INVALIDATETABBACKGROUND; + procedure WMWindowPosChanged(var Message: TWMWindowPosChanged); message WM_WINDOWPOSCHANGED; + function GetActiveTab: TSpTBXTabItem; + 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 ActiveTab: TSpTBXTabItem read GetActiveTab; + 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; + {$IF CompilerVersion > 15} // For Delphi 2005 and up + property OnAlignInsertBefore; + property OnAlignPosition; + {$IFEND} + property OnCanResize; + property OnContextPopup; + property OnDockDrop; + property OnDockOver; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnGetSiteInfo; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnResize; + property OnStartDock; + property OnStartDrag; + property OnUnDock; + // TSpTBXCustomTabSet properties + property ActiveTabIndex; + property Images; + property TabAutofit; + property TabAutofitMaxSize; + property TabBackgroundColor; + property TabBackgroundBorders; + property TabCloseButton; + property TabCloseButtonImageIndex; + property TabDragReorder; + property TabMaxSize; + property TabPosition; + property TabVisible; + property SkinType; + property OnActiveTabChange; + property OnActiveTabChanging; + property OnActiveTabReorder; + property OnActiveTabReordering; + property OnDrawBackground; + end; + + { TSpTBXTabControl } + + TSpTBXCustomTabControl = class(TSpTBXCustomTabSet) + private + FEmptyTabSheet: TSpTBXTabSheet; + procedure RealignTabSheets; + function GetActivePage: TSpTBXTabSheet; + function GetPages(Index: Integer): TSpTBXTabSheet; + function GetPagesCount: Integer; + procedure SetActivePage(const Value: TSpTBXTabSheet); + procedure CMSpTBXControlsInvalidate(var Message: TMessage); message CM_SPTBXCONTROLSINVALIDATE; + procedure WMSpSkinChange(var Message: TMessage); message WM_SPSKINCHANGE; + protected + FPages: TList; + procedure DoActiveTabChange(const ItemIndex: Integer); override; + function GetFullRepaint: Boolean; override; + procedure TabInserted(Item: TSpTBXTabItem); override; + procedure TabDeleting(Item: TSpTBXTabItem; FreeTabSheet: Boolean = True); override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + function GetPage(Item: TSpTBXTabItem): TSpTBXTabSheet; + property ActivePage: TSpTBXTabSheet read GetActivePage write SetActivePage; + property Pages[Index: Integer]: TSpTBXTabSheet read GetPages; + property PagesCount: Integer read GetPagesCount; + end; + + TSpTBXTabControl = class(TSpTBXCustomTabControl) + published + property Align; + property Anchors; + property BiDiMode; + property Color; + property Constraints; + property DockSite; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property ParentColor; + property ParentBiDiMode; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowHint; + property Visible; + property OnCanResize; + property OnContextPopup; + property OnDockDrop; + property OnDockOver; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnGetSiteInfo; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnResize; + property OnStartDock; + property OnStartDrag; + property OnUnDock; + // TSpTBXCustomTabControl properties + property ActiveTabIndex; + property Images; + property TabAutofit; + property TabAutofitMaxSize; + property TabBackgroundColor; + property TabBackgroundBorders; + property TabCloseButton; + property TabCloseButtonImageIndex; + property TabDragReorder; + property TabMaxSize; + property TabPosition; + property TabVisible; + property SkinType; + property OnActiveTabChange; + property OnActiveTabChanging; + property OnActiveTabReorder; + property OnActiveTabReordering; + property OnDrawBackground; + end; + +function SpGetNextTabItemViewer(View: TTBView; IV: TTBItemViewer; GoForward: Boolean; SearchType: TSpTBXSearchItemViewerType): TTBItemViewer; +procedure SpDrawXPTab(ACanvas: TCanvas; ARect: TRect; Enabled, Checked, HotTrack, Focused: Boolean; Position: TSpTBXTabPosition; SkinType: TSpTBXSkinType; Edge: TSpTBXTabEdge = tedNone); +procedure SpDrawXPTabControlBackground(ACanvas: TCanvas; ARect: TRect; AColor: TColor; BottomTabs: Boolean; SkinType: TSpTBXSkinType); + +implementation + +uses + Themes, UxTheme, Types; + +type + TTBItemViewerAccess = class(TTBItemViewer); + TSpTBXCustomItemAccess = class(TSpTBXCustomItem); + TSpTBXDockAccess = class(TSpTBXDock); + TSpTBXToolbarAccess = class(TSpTBXToolbar); + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ Helpers } + +function SpGetNextTabItemViewer(View: TTBView; IV: TTBItemViewer; GoForward: Boolean; + SearchType: TSpTBXSearchItemViewerType): TTBItemViewer; +// Returns the left or right Tab item depending on GoForward +// SearchType can be: +// sivtNormal: Normal search +// sivtInmediate: Search for the inmediate ItemViewer +// sivtInmediateSkipNonVisible: Search for the next inmediate ItemViewer, skipping non visible ones +begin + Result := nil; + while Result = nil do begin + IV := SpGetNextItemSameEdge(View, IV, GoForward, SearchType); + if not Assigned(IV) then + Break // Not found, exit + else + if IV.Item is TSpTBXTabItem then begin + Result := IV; // Found Tab + Break; + end + else begin + case SearchType of + sivtInmediate: + Break; // Inmediate not found, exit + sivtInmediateSkipNonVisible: + if IV.Item.Visible then Break; // Inmediate not found and visible, exit + end; + end; + end; +end; + +procedure SpDrawXPTab(ACanvas: TCanvas; ARect: TRect; + Enabled, Checked, HotTrack, Focused: Boolean; Position: TSpTBXTabPosition; + SkinType: TSpTBXSkinType; Edge: TSpTBXTabEdge = tedNone); +var + Part, Flags: Cardinal; + B: TBitmap; + R, FlippedR: TRect; + State: TSpTBXSkinStatesType; +begin + SkinType := SpTBXSkinType(SkinType); + if (SkinType = sknNone) and not Checked then + Exit; + + B := TBitmap.Create; + try + B.Width := ARect.Right - ARect.Left; + B.Height := ARect.Bottom - ARect.Top; + R := Rect(0, 0, B.Width, B.Height); + B.Canvas.Brush.Color := clFuchsia; + B.Canvas.FillRect(R); + B.TransparentColor := clFuchsia; + B.Transparent := True; + + case SkinType of + sknNone: + if Checked then begin + Position := ttpTop; // Don't need to flip + B.Canvas.Brush.Color := ACanvas.Brush.Color; + B.Canvas.FillRect(R); + ExtCtrls.Frame3D(B.Canvas, R, clWindow, clWindowFrame, 1); + ExtCtrls.Frame3D(B.Canvas, R, B.Canvas.Brush.Color, clBtnShadow, 1); + R := Rect(0, 0, B.Width, B.Height); // Frame3D changed R + end; + sknWindows: + begin + case Edge of + tedLeft: Part := TABP_TABITEMLEFTEDGE; + tedRight: Part := TABP_TABITEMRIGHTEDGE; + else + Part := TABP_TABITEM; + end; + + Flags := TIS_NORMAL; + if not Enabled then Flags := TIS_DISABLED + else + if Checked then Flags := TIS_SELECTED + else + if HotTrack then Flags := TIS_HOT; + DrawThemeBackground(ThemeServices.Theme[teTab], B.Canvas.Handle, Part, Flags, R, nil); + end; + sknSkin: + begin + State := CurrentSkin.GetState(Enabled, False, HotTrack, Checked); + CurrentSkin.PaintBackground(B.Canvas, R, skncTab, State, True, True); + end; + end; + + // Flip top to bottom + if Position = ttpBottom then begin + // Unclear why extra "-1" is needed here. + FlippedR := R; + FlippedR.Top := R.Bottom - 1; + FlippedR.Bottom := R.Top - 1; + B.Canvas.CopyRect(R, B.Canvas, FlippedR); + end; + + // Draw focus + if Checked and Focused then begin + InflateRect(R, -3, -3); + SpDrawFocusRect(B.Canvas, R); + end; + + ACanvas.Draw(ARect.Left, ARect.Top, B); + finally + B.Free; + end; +end; + +procedure SpDrawXPTabControlBackground(ACanvas: TCanvas; ARect: TRect; AColor: TColor; + BottomTabs: Boolean; SkinType: TSpTBXSkinType); +var + B: TBitmap; + R: TRect; +begin + SkinType := SpTBXSkinType(SkinType); + B := TBitmap.Create; + try + B.Width := ARect.Right - ARect.Left; + B.Height := ARect.Bottom - ARect.Top; + R := Rect(0, 0, B.Width, B.Height); + + // Draw the top/bottom border + case SkinType of + sknNone: + begin + BottomTabs := False; // Don't flip + B.Canvas.Brush.Color := AColor; + B.Canvas.FillRect(R); + ExtCtrls.Frame3D(B.Canvas, R, clWindow, clWindowFrame, 1); + ExtCtrls.Frame3D(B.Canvas, R, AColor, clBtnShadow, 1); + R := Rect(0, 0, B.Width, B.Height); // Frame3D changed R + end; + sknWindows: + DrawThemeBackground(ThemeServices.Theme[teTab], B.Canvas.Handle, TABP_PANE, 0, R, nil); + sknSkin: + begin + B.Canvas.Brush.Color := clWhite; + B.Canvas.FillRect(R); + CurrentSkin.PaintBackground(B.Canvas, R, skncTabBackground, sknsNormal, True, True); + end; + end; + + // Flip top to bottom + if BottomTabs then begin + // Unclear why extra "-1" is needed here. + R.Top := B.Height - 1; + R.Bottom := -1 + end; + + ACanvas.CopyRect(ARect, B.Canvas, R); + finally + B.Free; + end; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXTabItemDragObject } + +constructor TSpTBXTabItemDragObject.Create(ASourceControl: TControl; + AItem: TTBCustomItem); +begin + inherited Create(ASourceControl, AItem); + DragCursorAccept := crDefault; + DragCursorCancel := crDefault; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXTabItem } + +constructor TSpTBXTabItem.Create(AOwner: TComponent); +begin + inherited; + DisplayMode := nbdmImageAndText; + GroupIndex := C_SpTBXTabGroupIndex; + Wrapping := twEndEllipsis; + Margins := 4; + FSkinType := sknSkin; +end; + +procedure TSpTBXTabItem.Click; +var + T: TSpTBXTabToolbar; + I: Integer; +begin + // Set the Checked property to True, Autocheck is False + // Checked will call Item.Invalidate, the TabSet.ItemNotification will + // handle the invalidation and set the ActiveTabIndex. + if not Checked and Enabled and Visible then begin + if GetTabToolbar(T) then begin + I := T.Items.IndexOf(Self); + if T.FOwnerTabControl.CanActiveTabChange(T.ActiveTabIndex, I) then + Checked := True; + end; + inherited; + end; +end; + +procedure TSpTBXTabItem.TabClose; +var + NextTab: TSpTBXTabItem; + T: TSpTBXTabToolbar; + CloseAndFree, CanTabClose: Boolean; +begin + if Visible then begin + GetTabToolbar(T); + if not Assigned(T) then Exit; + + CanTabClose := True; + CloseAndFree := False; + DoTabClosing(CanTabClose, CloseAndFree); + if CanTabClose then begin + // Check the next visible tab + NextTab := nil; + if Checked then begin + NextTab := GetNextTab(True, sivtInmediateSkipNonVisible); + if not Assigned(NextTab) then + NextTab := GetNextTab(False, sivtInmediateSkipNonVisible); + end; + + T.BeginUpdate; + try + Visible := False; + DoTabClose; + if CloseAndFree then + Free; // Removes the item from the parent, sends tbicDeleting notification and frees the item + if Assigned(NextTab) then + NextTab.Click; // Sends tbicInvalidate notification, which is handled by TSpTBXCustomTabSet.ItemNotification + finally + T.EndUpdate; + end; + 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; + var 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 +{ TSpTBXTabToolbarView } + +procedure TSpTBXTabToolbarView.BeginUpdate; +var + T: TSpTBXTabToolbar; +begin + if (FUpdating = 0) and (Owner is TSpTBXTabToolbar) then begin + T := TSpTBXTabToolbar(Owner); + if Assigned(T.FOwnerTabControl) then + SendMessage(T.FOwnerTabControl.Handle, WM_SETREDRAW, 0, 0); + end; + inherited; +end; + +procedure TSpTBXTabToolbarView.EndUpdate; +var + T: TSpTBXTabToolbar; +begin + inherited; + if (FUpdating = 0) and (Owner is TSpTBXTabToolbar) then begin + T := TSpTBXTabToolbar(Owner); + if Assigned(T.FOwnerTabControl) then begin + SendMessage(T.FOwnerTabControl.Handle, WM_SETREDRAW, 1, 0); + SpInvalidateSpTBXControl(T.FOwnerTabControl, True, False); + end; + 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); +var + Tab: TSpTBXTabItem; + IV: TTBItemViewer; +begin + inherited; + if Action = tbicInvalidateAndResize then begin + // Invalidate the NC area, draw the bottom border of the active tab + // Instead of invalidating every time, save the Rect that needs to be drawn + // (bottom border of the active tab) and see if it needs to be repainted + if not IsItemMoving then begin + Tab := ActiveTab; + if Assigned(Tab) and Tab.Visible then begin + IV := SpFindItemViewer(View, Tab); + if Assigned(IV) then + if not EqualRect(FActiveTabRect, IV.BoundsRect) then + InvalidateNC; + end; + end; + 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 + FActiveTabRect := IV.BoundsRect; + 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 not IsUpdating 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; + +function TSpTBXTabToolbar.GetViewClass: TTBToolbarViewClass; +begin + Result := TSpTBXTabToolbarView; +end; + +procedure TSpTBXTabToolbar.Autofit; +var + I, TabsCount, TabsWidth, TabsArea, NonTabsArea, RightAlignWidth: Integer; + IV: TTBItemViewer; + R: TRect; +begin + if not FTabAutofit or IsUpdating or (Items.Count = 0) then Exit; + + View.ValidatePositions; + View.BeginUpdate; + try + // Make all the clipped items visible + for I := 0 to FHiddenTabs.Count - 1 do + FHiddenTabs.Items[I].Item.Visible := True; + FHiddenTabs.Clear; + + 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; +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 (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) or IsUpdating 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 := View.NextSelectable(nil, True); + if Assigned(IV) then begin + iStart := IV.Index; + iEnd := IV.Index; + end + else begin + iStart := 0; + iEnd := 0; + end; + // Show items from left side of the first visible tab + 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 first visible tab + for I := iEnd to View.ViewerCount - 1 do begin + IV := View.Viewers[I]; + if not IV.Item.Visible and (RightAlignedList.IndexOf(IV) = -1) then begin + // If the item was hidden and can be showed remove it from the HiddenList + J := FHiddenTabs.IndexOf(IV.Item); + if J > -1 then begin + W := 0; + H := 0; + TTBItemViewerAccess(IV).CalcSize(Canvas, W, H); + VisibleWidth := VisibleWidth + W; + if (VisibleTabsCount = 0) or (VisibleWidth < CurrentDock.Width - 2) then begin + SpacerW := SpacerW - W; + FHiddenTabs.Delete(J); + IV.Item.Visible := True; + Inc(VisibleTabsCount); + end + else + Break; + end; + end; + end; + + // Hide items + if VisibleTabsCount > 1 then + for I := View.ViewerCount - 1 downto 0 do begin + IV := View.Viewers[I]; + if (VisibleTabsCount > 1) and (IV is TSpTBXTabItemViewer) and IV.Item.Visible and (IV.BoundsRect.Right > RightAlignedBorder) then + if RightAlignedList.IndexOf(IV) = -1 then begin + // If the item can't be showed add it to the HiddenList + SpacerW := SpacerW + (IV.BoundsRect.Right - IV.BoundsRect.Left); + FHiddenTabs.Add(IV.Item); + IV.Item.Visible := False; + Dec(VisibleTabsCount); + end; + end; + end; + + // Resize the spacer + if Assigned(Spacer) then + TSpTBXCustomItemAccess(Spacer.Item).CustomWidth := SpacerW; + + View.UpdatePositions; + finally + RightAlignedList.Free; + View.EndUpdate; + FState := FState - [tstRightAligning]; + end; +end; + +procedure TSpTBXTabToolbar.TabClose(ATab: TSpTBXTabItem); +begin + ATab.TabClose; +end; + +procedure TSpTBXTabToolbar.MakeVisible(ATab: TSpTBXTabItem); +var + TabIV, FirstIV, LastIV: TTBItemViewer; + I: Integer; + Spacer: TSpTBXItemViewer; +begin + if (Items.Count > 1) and Assigned(ATab) and (ATab.Visible = False) then begin + TabIV := View.Find(ATab); + FirstIV := View.NextSelectable(nil, True); + + // LastIV minus the right aligned items + Spacer := SpGetFirstRightAlignSpacer(View); + if Assigned(Spacer) then + LastIV := View.NextSelectable(Spacer, False) + else + LastIV := View.NextSelectable(nil, False); + + if Assigned(FirstIV) and Assigned(LastIV) then begin + for I := 0 to View.ViewerCount - 1 do begin + if TabIV.Index >= FirstIV.Index then + ScrollRight + else + ScrollLeft; + if TabIV.Item.Visible then + Break; + end; + end; + end; +end; + +procedure TSpTBXTabToolbar.Scroll(ToRight: Boolean); +var + FirstIV, LastIV: TTBItemViewer; + I, VisibleWidth: Integer; + Spacer: TSpTBXItemViewer; + + function ProcessScroll(IV: TTBItemViewer): Boolean; + var + IVIndex, ClippedIndex, VisibleTabsCount, W, H: Integer; + begin + Result := False; + + ClippedIndex := FHiddenTabs.IndexOf(IV.Item); + if Assigned(IV) and (ClippedIndex > -1) then begin + Result := True; // a clipped tab was found + BeginUpdate; + 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 + EndUpdate; + 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); + // To avoid flicker don't call InvalidateNC, use the following instead + if not IsUpdating then begin + View.InvalidatePositions; + SetWindowPos(Handle, 0, 0, 0, 0, 0, SWP_NOZORDER or SWP_NOSIZE or + SWP_NOMOVE or SWP_DRAWFRAME or SWP_SHOWWINDOW); + end; + 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, csSetCaption]; + Align := alClient; + Visible := False; +end; + +procedure TSpTBXTabSheet.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 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 + Message.Result := 1; + + 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; +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.GetActiveTab: TSpTBXTabItem; +begin + if Assigned(FToolbar) then + Result := Toolbar.ActiveTab + else + Result := nil; +end; + +function TSpTBXCustomTabSet.GetActiveTabIndex: Integer; +begin + if Assigned(FToolbar) then + Result := Toolbar.ActiveTabIndex + else + Result := -1; +end; + +procedure TSpTBXCustomTabSet.SetActiveTabIndex(Value: Integer); +begin + // When the component is reading from the DFM the Items are not created. + // We must save the value setted at design time and use it when the + // form is finally loaded. + if csReading in ComponentState then + FLoadingActiveIndex := Value + else + if Assigned(FToolbar) then + Toolbar.ActiveTabIndex := Value; +end; + +function TSpTBXCustomTabSet.GetTabCloseButton: TSpTBXTabCloseButton; +begin + if Assigned(FToolbar) then + Result := Toolbar.TabCloseButton + else + Result := tcbNone; +end; + +procedure TSpTBXCustomTabSet.SetTabCloseButton(const Value: TSpTBXTabCloseButton); +begin + if Assigned(FToolbar) then + Toolbar.TabCloseButton := Value; +end; + +function TSpTBXCustomTabSet.GetTabCloseButtonImageIndex: Integer; +begin + if Assigned(FToolbar) then + Result := Toolbar.TabCloseButtonImageIndex + else + Result := -1; +end; + +procedure TSpTBXCustomTabSet.SetTabCloseButtonImageIndex(const Value: Integer); +begin + if Assigned(FToolbar) then + Toolbar.TabCloseButtonImageIndex := Value; +end; + +function TSpTBXCustomTabSet.GetTabAutofit: Boolean; +begin + if Assigned(FToolbar) then + Result := Toolbar.TabAutofit + else + Result := False; +end; + +procedure TSpTBXCustomTabSet.SetTabAutofit(const Value: Boolean); +begin + if Assigned(FToolbar) then + Toolbar.TabAutofit := Value; +end; + +function TSpTBXCustomTabSet.GetTabAutofitMaxSize: Integer; +begin + if Assigned(FToolbar) then + Result := Toolbar.TabAutofitMaxSize + else + Result := -1; +end; + +procedure TSpTBXCustomTabSet.SetTabAutofitMaxSize(const Value: Integer); +begin + if Assigned(FToolbar) then + Toolbar.TabAutofitMaxSize := Value; +end; + +function TSpTBXCustomTabSet.GetTabBackgroundBorders: Boolean; +begin + if Assigned(FToolbar) then + Result := Toolbar.TabBackgroundBorders + else + Result := True; +end; + +procedure TSpTBXCustomTabSet.SetTabBackgroundBorders(const Value: Boolean); +begin + if Assigned(FToolbar) then Toolbar.TabBackgroundBorders := Value +end; + +function TSpTBXCustomTabSet.GetTabBackgroundColor: TColor; +begin + if Assigned(FToolbar) then + Result := FToolbar.Color + else + Result := clNone; +end; + +procedure TSpTBXCustomTabSet.SetTabBackgroundColor(const Value: TColor); +begin + if Assigned(FToolbar) then FToolbar.Color := Value +end; + +function TSpTBXCustomTabSet.GetTabDragReorder: Boolean; +begin + Result := False; + if Assigned(FToolbar) then + Result := Toolbar.TabDragReorder; +end; + +procedure TSpTBXCustomTabSet.SetTabDragReorder(const Value: Boolean); +begin + if Assigned(FToolbar) then + Toolbar.TabDragReorder := Value; +end; + +function TSpTBXCustomTabSet.GetTabMaxSize: Integer; +begin + Result := -1; + if Assigned(FToolbar) then + Result := Toolbar.TabMaxSize; +end; + +procedure TSpTBXCustomTabSet.SetTabMaxSize(const Value: Integer); +begin + if Assigned(FToolbar) then + Toolbar.TabMaxSize := Value; +end; + +function TSpTBXCustomTabSet.GetTabToolbar: TSpTBXTabToolbar; +begin + Result := FToolbar as TSpTBXTabToolbar; +end; + +function TSpTBXCustomTabSet.GetSkinType: TSpTBXSkinType; +begin + if Assigned(FToolbar) then + Result := Toolbar.SkinType + else + Result := sknNone; +end; + +procedure TSpTBXCustomTabSet.SetSkinType(const Value: TSpTBXSkinType); +begin + if Assigned(FToolbar) then begin + Toolbar.SkinType := Value; + InvalidateBackground; + end; +end; + +function TSpTBXCustomTabSet.GetTabPosition: TSpTBXTabPosition; +begin + if Assigned(FToolbar) then + Result := Toolbar.TabPosition + else + Result := ttpTop; +end; + +procedure TSpTBXCustomTabSet.SetTabPosition(const Value: TSpTBXTabPosition); +var + T: TSpTBXTabToolbar; +begin + if Assigned(FToolbar) and Assigned(FDock) then begin + T := Toolbar; + if T.TabPosition <> Value then begin + T.Visible := False; + T.Parent := nil; + T.TabPosition := Value; + case Value of + ttpTop: FDock.Position := dpTop; + ttpBottom: FDock.Position := dpBottom; + end; + T.CurrentDock := FDock; + T.Visible := True; + + InvalidateBackground; + end; + end; +end; + +procedure TSpTBXCustomTabSet.SetTabVisible(const Value: Boolean); +begin + if FTabVisible <> Value then begin + FTabVisible := Value; + if Assigned(FDock) then + FDock.Visible := Value; + end; +end; + +function TSpTBXCustomTabSet.GetTabSetHeight: Integer; +begin + if Assigned(FDock) then + Result := FDock.Height + else + Result := 0; +end; + +procedure TSpTBXCustomTabSet.DoDrawBackground(ACanvas: TCanvas; + ARect: TRect; const PaintStage: TSpTBXPaintStage; + var PaintDefault: Boolean); +begin + if Assigned(FOnDrawBackground) then FOnDrawBackground(Self, ACanvas, ARect, PaintStage, PaintDefault); +end; + +function TSpTBXCustomTabSet.DrawBackground(DC: HDC; ARect: TRect): Boolean; +var + ACanvas: TCanvas; + PaintDefault: Boolean; + R: TRect; +begin + Result := False; + if (csDestroying in ComponentState) or not Assigned(FDock) or + not Assigned(FBackground) or IsRectEmpty(ARect) then Exit; + + ACanvas := TCanvas.Create; + try + ACanvas.Handle := DC; + R := Rect(0, 0, ARect.Right - ARect.Left, ARect.Bottom - ARect.Top); + + if (FBackground.Width = R.Right) and (FBackground.Height = R.Bottom) and not Assigned(FOnDrawBackground) then + ACanvas.Draw(ARect.Left, ARect.Top, FBackground) + else begin + FBackground.Width := R.Right; + FBackground.Height := R.Bottom; + FBackground.Canvas.Brush.Color := clWhite; + FBackground.Canvas.FillRect(R); + + PaintDefault := True; + DoDrawBackground(FBackground.Canvas, R, pstPrePaint, PaintDefault); + if PaintDefault then + SpDrawXPTabControlBackground(FBackground.Canvas, R, Color, TabPosition = ttpBottom, SkinType); + PaintDefault := True; + DoDrawBackground(FBackground.Canvas, R, pstPostPaint, PaintDefault); + + ACanvas.Draw(ARect.Left, ARect.Top, FBackground); + end; + + Result := True; + finally + ACanvas.Handle := 0; + ACanvas.Free; + end; +end; + +procedure TSpTBXCustomTabSet.InvalidateBackground(InvalidateChildren: Boolean); +begin + // Force background repaint + if not (csDestroying in ComponentState) and Assigned(FToolbar) then begin + if Assigned(FBackground) then + FBackground.Width := 1; + SpInvalidateSpTBXControl(Self, InvalidateChildren, FResizing); + end; +end; + +procedure TSpTBXCustomTabSet.ItemNotification(Ancestor: TTBCustomItem; + Relayed: Boolean; Action: TTBItemChangedAction; Index: Integer; + Item: TTBCustomItem); +var + I: Integer; + Tab: TSpTBXTabItem; +begin + inherited; + + if Assigned(FToolbar) and not Relayed and not FToolbar.IsItemMoving then + case Action of + tbicSubitemsBeginUpdate: + begin + // When a Tab item is moved (TTBCustomItem.Move) + // tbicDeleting and tbicInserted change actions are fired + // but we don't want the associated TabSheet to be recreated + // because the children will be destroyed. + // When a TTBCustomItem is moved it is not recreated, it simply + // deletes and reinserts its reference in the items array. + // We need to find out if the item is being moved and stop the + // TabSheet recreation. + // The action sequence for a move operation is the following: + // tbicSubitemsBeginUpdate (FItemMoveCount = 1) + // tbicDeleting (FItemMoveCount = 2) + // tbicSubitemsBeginUpdate (FItemMoveCount = 1) + // tbicInserted (FItemMoveCount = 0) + // tbicSubitemsEndUpdate (FItemMoveCount = 0) + // tbicSubitemsEndUpdate (FItemMoveCount = 0) + FItemMoveCount := 1; + FItemMoved := nil; + end; + tbicSubitemsEndUpdate: + begin + // Destroy the TabSheet if the sequence was: + // tbicSubitemsBeginUpdate - tbicDeleting - tbicSubitemsEndUpdate + if FItemMoveCount = 2 then + TabDeleting(FItemMoved); + FItemMoveCount := 0; + FItemMoved := nil; + end; + tbicInserted: + if Assigned(Item) then begin + // Update the index if a new item is inserted before the ActiveTabIndex + I := Items.IndexOf(Item); + if (I > -1) and (I <= ActiveTabIndex) then begin + FUpdatingIndex := True; + try + // Don't change the ActiveTabIndex, just set the internal value + // because the page didn't change + Toolbar.FActiveTabIndex := Toolbar.FActiveTabIndex + 1; + finally + FUpdatingIndex := False; + end; + end; + if (Item is TSpTBXTabItem) then + TabInserted(Item as TSpTBXTabItem); + InvalidateBackground; + FItemMoveCount := 0; + FItemMoved := nil; + end; + tbicDeleting: + // The ItemViewer of the Item is not valid, it was destroyed by TTBView + // The Items array still has the Item. + if not (csDestroying in ComponentState) and Assigned(Item) then begin + FUpdatingIndex := True; + try + Tab := nil; + I := Items.IndexOf(Item); + if I > -1 then begin + if I < ActiveTabIndex then + // Don't change the ActiveTabIndex, just set the internal value + // because the page didn't change + Toolbar.FActiveTabIndex := Toolbar.FActiveTabIndex - 1 + else + if I = ActiveTabIndex then + if I = 0 then begin + if (Items.Count > 1) and (Items[1] is TSpTBXTabItem) then begin + // The first tab was deleted, change the internal value of + // Update the checked tab on WM_INVALIDATETABBACKGROUND + Tab := Items[1] as TSpTBXTabItem; + Tab.Click; + end + else + Toolbar.FActiveTabIndex := -1; + end + else begin + Dec(I); // Prev tab + if (I > -1) and (I < Items.Count) and (Items[I] is TSpTBXTabItem) then + SetActiveTabIndex(I) + else + Toolbar.FActiveTabIndex := -1; + end; + end; + + if (Item is TSpTBXTabItem) then + if FItemMoveCount = 1 then begin + FItemMoveCount := 2; + FItemMoved := Item as TSpTBXTabItem; + end + else begin + FItemMoveCount := 0; + TabDeleting(Item as TSpTBXTabItem); + end; + + if (csDesigning in ComponentState) or Assigned(Tab) then + PostMessage(Handle, WM_INVALIDATETABBACKGROUND, 0, 0) + else + InvalidateBackground; + finally + FUpdatingIndex := False; + end; + end; + tbicInvalidate: + // When the Item.Checked property changes we must reset the ActiveTabIndex + if not FUpdatingIndex and Assigned(Item) and (Item is TSpTBXTabItem) and + Item.Checked and Item.Enabled then + begin + I := Items.IndexOf(Item); + if I <> ActiveTabIndex then begin + FUpdatingIndex := True; + try + SetActiveTabIndex(I); + finally + FUpdatingIndex := False; + end; + end; + end; + end; +end; + +procedure TSpTBXCustomTabSet.TabDeleting(Item: TSpTBXTabItem; + FreeTabSheet: Boolean); +begin + if not (csDestroying in ComponentState) then + ScrollLeft; +end; + +procedure TSpTBXCustomTabSet.TabInserted(Item: TSpTBXTabItem); +var + I: Integer; + IV: TTBItemViewer; +begin + if not (csLoading in ComponentState) and Assigned(Item) and (Item is TSpTBXTabItem) then + if Items.Count = 1 then + Item.Click // Select the first Tab + else begin + // If the item is inserted after a hidden tab, we should also hide it + I := Items.IndexOf(Item) - 1; + if I > -1 then + if Toolbar.FHiddenTabs.IndexOf(Items[I]) > -1 then begin + IV := View.Find(Item); + if Assigned(IV) then begin + Toolbar.BeginUpdate; + try + Toolbar.FHiddenTabs.Add(Item); + Item.Visible := False; + finally + Toolbar.EndUpdate; + end; + end; + end; + end; +end; + +procedure TSpTBXCustomTabSet.CMColorchanged(var Message: TMessage); +begin + inherited; + if Assigned(FToolbar) then begin + Toolbar.TabColor := Color; + InvalidateBackground; + end; +end; + +procedure TSpTBXCustomTabSet.CMSpTBXControlsInvalidate(var Message: TMessage); +begin + InvalidateBackground; + Message.Result := 1; +end; + +procedure TSpTBXCustomTabSet.WMEraseBkgnd(var Message: TMessage); +var + R: TRect; +begin + if not DoubleBuffered or (Message.wParam = Message.lParam) then begin + if not (csDestroying in ComponentState) and GetFullRepaint then begin + R := ClientRect; + if FTabVisible then begin + case TabPosition of + ttpTop: Inc(R.Top, GetTabSetHeight - 2); + ttpBottom: Dec(R.Bottom, GetTabSetHeight - 2); + end; + end; + DrawBackground(TWMEraseBkgnd(Message).DC, R); + end; + end; + Message.Result := 1; +end; + +procedure TSpTBXCustomTabSet.WMInvalidateTabBackground(var Message: TMessage); +var + Tab: TSpTBXTabItem; + I: Integer; +begin + if Assigned(FToolbar) then begin + Tab := Toolbar.ActiveTab; + if Assigned(Tab) then begin + I := Items.IndexOf(Tab); + FUpdatingIndex := True; + try + Toolbar.FActiveTabIndex := -1; + SetActiveTabIndex(I); + finally + FUpdatingIndex := False; + end; + end; + if HandleAllocated then + RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN); + end; +end; + +procedure TSpTBXCustomTabSet.WMWindowPosChanged(var Message: TWMWindowPosChanged); +begin + FResizing := True; + inherited; + if GetFullRepaint then + InvalidateBackground; + FResizing := False; +end; + +//WMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWMWM +{ TSpTBXCustomTabControl } + +constructor TSpTBXCustomTabControl.Create(AOwner: TComponent); +begin + inherited; +// ControlStyle := ControlStyle - [csAcceptsControls]; + FPages := TList.Create; + + // FEmptyTabSheet is used to hide the rest of the TabSheets + // when ActiveTabIndex = -1 at design time. + FEmptyTabSheet := TSpTBXTabSheet.Create(Self); + FEmptyTabSheet.Parent := Self; + FEmptyTabSheet.TabControl := Self; + FEmptyTabSheet.Item := nil; + FEmptyTabSheet.Visible := True; + FEmptyTabSheet.BringToFront; + FEmptyTabSheet.ControlStyle := FEmptyTabSheet.ControlStyle - [csAcceptsControls]; + + Width := 289; + Height := 193; +end; + +destructor TSpTBXCustomTabControl.Destroy; +begin + FPages.Free; + inherited; +end; + +procedure TSpTBXCustomTabControl.DoActiveTabChange(const ItemIndex: Integer); +begin + if ItemIndex = -1 then begin + FEmptyTabSheet.Visible := True; + FEmptyTabSheet.BringToFront; + end + else + FEmptyTabSheet.Visible := False; + inherited; +end; + +procedure TSpTBXCustomTabControl.RealignTabSheets; +var + I, C: Integer; +begin + if HandleAllocated then begin + C := PagesCount; + for I := 0 to C - 1 do + Pages[I].Realign; + end; +end; + +function TSpTBXCustomTabControl.GetFullRepaint: Boolean; +begin + if not (csDestroying in ComponentState) then + Result := not Assigned(FPages) or (FPages.Count = 0) or not Assigned(FToolbar) or + not Assigned(Toolbar.ActiveTab) or not Toolbar.ActiveTab.Checked + else + Result := False; +end; + +function TSpTBXCustomTabControl.GetPage(Item: TSpTBXTabItem): TSpTBXTabSheet; +var + I: Integer; +begin + Result := nil; + I := Items.IndexOf(Item); + if (I > - 1) and Assigned(Item.Control) and (Item.Control is TSpTBXTabSheet) then + Result := Item.Control as TSpTBXTabSheet; +end; + +function TSpTBXCustomTabControl.GetActivePage: TSpTBXTabSheet; +begin + if ActiveTabIndex > -1 then + Result := GetPage(Items[ActiveTabIndex] as TSpTBXTabItem) + else + Result := nil; +end; + +procedure TSpTBXCustomTabControl.SetActivePage(const Value: TSpTBXTabSheet); +var + I: Integer; +begin + if Assigned(Value) and (FPages.IndexOf(Value) > -1) and Assigned(FToolbar) then begin + I := FToolbar.Items.IndexOf(Value.Item); + if I > -1 then ActiveTabIndex := I; + end; +end; + +function TSpTBXCustomTabControl.GetPages(Index: Integer): TSpTBXTabSheet; +begin + Result := TSpTBXTabSheet(FPages[Index]); +end; + +function TSpTBXCustomTabControl.GetPagesCount: Integer; +begin + Result := FPages.Count; +end; + +procedure TSpTBXCustomTabControl.TabInserted(Item: TSpTBXTabItem); +var + T: TSpTBXTabSheet; + I: Integer; +begin + // Create a TabSheet and Link it to the TabItem, only if the Item is created + // at DesignTime. + // If the Item is created from the DFM stream then the TabSheet will be + // automatically created, because it will also be streamed, but it won't be + // linked to the Item, this is done in TabSheet.ReadState + + if (csLoading in ComponentState) or not Assigned(Item) then Exit; + + for I := 0 to FPages.Count - 1 do begin + T := TSpTBXTabSheet(FPages[I]); + if T.Item = Item then begin + Exit; + raise Exception.Create('TabSheet Already Exists'); + end; + end; + + // Find unique name + I := 1; + while Owner.FindComponent('SpTBXTabSheet' + IntToStr(I)) <> nil do + inc(I); + + // The Form will be the owner, it will stream the tabsheet to the DFM + T := TSpTBXTabSheet.Create(Owner); + T.Name := 'SpTBXTabSheet' + IntToStr(I); + T.Parent := Self; + T.TabControl := Self; + T.Item := Item; + Item.Control := T; + T.SendToBack; + FPages.Add(T); + + inherited; +end; + +procedure TSpTBXCustomTabControl.TabDeleting(Item: TSpTBXTabItem; + FreeTabSheet: Boolean); +var + I: Integer; + T: TSpTBXTabSheet; +begin + inherited; + // The Toolbar will free the Items, and the Form will free the TabSheets + if (csDestroying in ComponentState) or not Assigned(Item) then Exit; + + for I := 0 to FPages.Count - 1 do begin + T := TSpTBXTabSheet(FPages[I]); + if Assigned(T) and Assigned(T.Item) and (T.Item = Item) then begin + FPages[I] := nil; + FPages.Delete(I); + if FreeTabSheet then begin + T.Item := nil; + T.Free; + end + else begin + // TabSheet deleted at design time, free the linked Item + T.Item.Free; + T.Item := nil; + end; + Break; + end; + end; +end; + +procedure TSpTBXCustomTabControl.CMSpTBXControlsInvalidate(var Message: TMessage); +var + I, C: Integer; +begin + // Force TabControl and TabSheets background repaint + inherited; + if not (csDestroying in ComponentState) and Assigned(FToolbar) then begin + C := PagesCount; + for I := 0 to C - 1 do + SpInvalidateSpTBXControl(Pages[I], True, True); + end; + Message.Result := 1; +end; + +procedure TSpTBXCustomTabControl.WMSpSkinChange(var Message: TMessage); +begin + inherited; + RealignTabSheets; +end; + +end. diff --git a/internal/2.4.4/1/SpTBXLib-LICENSE.txt b/internal/2.4.4/1/SpTBXLib-LICENSE.txt new file mode 100644 index 0000000..c7d8d2b --- /dev/null +++ b/internal/2.4.4/1/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) 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