From 5ae8570f179c9250b10d8d8d88a9a9543b86f50e Mon Sep 17 00:00:00 2001 From: david Date: Tue, 19 Jan 2010 16:33:40 +0000 Subject: [PATCH] =?UTF-8?q?Importaci=C3=B3n=20inicial?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.TB2k@4 3bd54fa2-43cb-4e0b-abbd-073ca4e1e836 --- internal/2.2.2/1/DemoProj/Demo.cfg | 33 + internal/2.2.2/1/DemoProj/Demo.dof | 29 + internal/2.2.2/1/DemoProj/Demo.dpr | 22 + internal/2.2.2/1/DemoProj/Demo.res | Bin 0 -> 876 bytes internal/2.2.2/1/DemoProj/Demo1.dfm | Bin 0 -> 11901 bytes internal/2.2.2/1/DemoProj/Demo1.pas | 254 + internal/2.2.2/1/DemoProj/DemoBCB.bpr | 179 + internal/2.2.2/1/DemoProj/DemoBCB.cpp | 22 + internal/2.2.2/1/DemoProj/DemoBCB.res | Bin 0 -> 876 bytes internal/2.2.2/1/DemoProj/DemoBCB6.bpr | 115 + internal/2.2.2/1/DemoProj/DemoBCB6.cpp | 34 + internal/2.2.2/1/DemoProj/DemoBCB6.res | Bin 0 -> 876 bytes internal/2.2.2/1/GPL-LICENSE.txt | 340 + internal/2.2.2/1/Glyphs.zip | Bin 0 -> 11257 bytes internal/2.2.2/1/LICENSE.txt | 17 + internal/2.2.2/1/Lib/D11/TB2Acc.dcu | Bin 0 -> 33790 bytes internal/2.2.2/1/Lib/D11/TB2Anim.dcu | Bin 0 -> 4581 bytes internal/2.2.2/1/Lib/D11/TB2Common.dcu | Bin 0 -> 19282 bytes internal/2.2.2/1/Lib/D11/TB2Consts.dcu | Bin 0 -> 1613 bytes internal/2.2.2/1/Lib/D11/TB2Dock.dcu | Bin 0 -> 104946 bytes .../2.2.2/1/Lib/D11/TB2DsgnConvertOptions.dcu | Bin 0 -> 5047 bytes .../2.2.2/1/Lib/D11/TB2DsgnConvertOptions.dfm | Bin 0 -> 903 bytes internal/2.2.2/1/Lib/D11/TB2DsgnConverter.dcu | Bin 0 -> 8726 bytes internal/2.2.2/1/Lib/D11/TB2DsgnConverter.dfm | Bin 0 -> 795 bytes .../2.2.2/1/Lib/D11/TB2DsgnItemEditor.dcu | Bin 0 -> 34914 bytes .../2.2.2/1/Lib/D11/TB2DsgnItemEditor.dfm | Bin 0 -> 2866 bytes .../2.2.2/1/Lib/D11/TB2DsgnItemEditor.res | Bin 0 -> 2520 bytes internal/2.2.2/1/Lib/D11/TB2ExtItems.dcu | Bin 0 -> 33310 bytes internal/2.2.2/1/Lib/D11/TB2Hook.dcu | Bin 0 -> 6326 bytes internal/2.2.2/1/Lib/D11/TB2Item.dcu | Bin 0 -> 128709 bytes internal/2.2.2/1/Lib/D11/TB2MDI.dcu | Bin 0 -> 23088 bytes internal/2.2.2/1/Lib/D11/TB2MDI.res | Bin 0 -> 712 bytes internal/2.2.2/1/Lib/D11/TB2MRU.dcu | Bin 0 -> 12108 bytes internal/2.2.2/1/Lib/D11/TB2Reg.dcu | Bin 0 -> 8705 bytes internal/2.2.2/1/Lib/D11/TB2ResCursors.res | Bin 0 -> 1304 bytes internal/2.2.2/1/Lib/D11/TB2ToolWindow.dcu | Bin 0 -> 13354 bytes internal/2.2.2/1/Lib/D11/TB2Toolbar.dcu | Bin 0 -> 47635 bytes internal/2.2.2/1/Lib/D11/TB2Ver.inc | 64 + internal/2.2.2/1/Lib/D11/TB2Version.dcu | Bin 0 -> 745 bytes internal/2.2.2/1/Lib/D11/tb2k_d11.bpl | Bin 0 -> 273408 bytes internal/2.2.2/1/Lib/D11/tb2k_d11.dcp | Bin 0 -> 380719 bytes internal/2.2.2/1/Lib/D11/tb2k_d11.dcu | Bin 0 -> 2421 bytes internal/2.2.2/1/Lib/D11/tb2kdsgn_d11.bpl | Bin 0 -> 82944 bytes internal/2.2.2/1/Lib/D11/tb2kdsgn_d11.dcp | Bin 0 -> 51084 bytes internal/2.2.2/1/Lib/D11/tb2kdsgn_d11.dcu | Bin 0 -> 4302 bytes .../2.2.2/1/Packages/TB2k_D11Group.groupproj | 44 + internal/2.2.2/1/Packages/tb2k_cb4.bpk | 183 + internal/2.2.2/1/Packages/tb2k_cb4.cpp | 29 + internal/2.2.2/1/Packages/tb2k_cb5.bpk | 96 + internal/2.2.2/1/Packages/tb2k_cb5.cpp | 29 + internal/2.2.2/1/Packages/tb2k_cb6.bpk | 130 + internal/2.2.2/1/Packages/tb2k_cb6.cpp | 14 + internal/2.2.2/1/Packages/tb2k_d10.bdsproj | 175 + internal/2.2.2/1/Packages/tb2k_d10.dpk | 48 + internal/2.2.2/1/Packages/tb2k_d10.res | Bin 0 -> 32 bytes internal/2.2.2/1/Packages/tb2k_d11.dpk | 49 + internal/2.2.2/1/Packages/tb2k_d11.dproj | 545 ++ internal/2.2.2/1/Packages/tb2k_d11.res | Bin 0 -> 5056 bytes internal/2.2.2/1/Packages/tb2k_d12.dpk | 48 + internal/2.2.2/1/Packages/tb2k_d12.dproj | 130 + internal/2.2.2/1/Packages/tb2k_d12.res | Bin 0 -> 32 bytes internal/2.2.2/1/Packages/tb2k_d4.dpk | 47 + internal/2.2.2/1/Packages/tb2k_d4.res | Bin 0 -> 32 bytes internal/2.2.2/1/Packages/tb2k_d5.dpk | 48 + internal/2.2.2/1/Packages/tb2k_d5.res | Bin 0 -> 32 bytes internal/2.2.2/1/Packages/tb2k_d6.dpk | 48 + internal/2.2.2/1/Packages/tb2k_d6.res | Bin 0 -> 32 bytes internal/2.2.2/1/Packages/tb2k_d7.dpk | 48 + internal/2.2.2/1/Packages/tb2k_d7.res | Bin 0 -> 32 bytes internal/2.2.2/1/Packages/tb2k_d9.dpk | 48 + internal/2.2.2/1/Packages/tb2k_d9.res | Bin 0 -> 32 bytes internal/2.2.2/1/Packages/tb2k_dn10.bdsproj | 197 + internal/2.2.2/1/Packages/tb2k_dn10.dpk | 120 + internal/2.2.2/1/Packages/tb2k_dn11.dpk | 120 + internal/2.2.2/1/Packages/tb2k_dn11.dproj | 82 + internal/2.2.2/1/Packages/tb2kdsgn_cb4.bpk | 181 + internal/2.2.2/1/Packages/tb2kdsgn_cb4.cpp | 23 + internal/2.2.2/1/Packages/tb2kdsgn_cb5.bpk | 95 + internal/2.2.2/1/Packages/tb2kdsgn_cb5.cpp | 23 + internal/2.2.2/1/Packages/tb2kdsgn_cb6.bpk | 125 + internal/2.2.2/1/Packages/tb2kdsgn_cb6.cpp | 18 + .../2.2.2/1/Packages/tb2kdsgn_d10.bdsproj | 175 + internal/2.2.2/1/Packages/tb2kdsgn_d10.dpk | 42 + internal/2.2.2/1/Packages/tb2kdsgn_d10.res | Bin 0 -> 32 bytes internal/2.2.2/1/Packages/tb2kdsgn_d11.bpi | Bin 0 -> 10020 bytes internal/2.2.2/1/Packages/tb2kdsgn_d11.dpk | 43 + internal/2.2.2/1/Packages/tb2kdsgn_d11.dproj | 552 ++ internal/2.2.2/1/Packages/tb2kdsgn_d11.res | Bin 0 -> 5056 bytes internal/2.2.2/1/Packages/tb2kdsgn_d12.dpk | 42 + internal/2.2.2/1/Packages/tb2kdsgn_d12.dproj | 126 + internal/2.2.2/1/Packages/tb2kdsgn_d12.res | Bin 0 -> 32 bytes internal/2.2.2/1/Packages/tb2kdsgn_d4.dpk | 42 + internal/2.2.2/1/Packages/tb2kdsgn_d4.res | Bin 0 -> 32 bytes internal/2.2.2/1/Packages/tb2kdsgn_d5.dpk | 42 + internal/2.2.2/1/Packages/tb2kdsgn_d5.res | Bin 0 -> 32 bytes internal/2.2.2/1/Packages/tb2kdsgn_d6.dpk | 42 + internal/2.2.2/1/Packages/tb2kdsgn_d6.res | Bin 0 -> 32 bytes internal/2.2.2/1/Packages/tb2kdsgn_d7.dpk | 42 + internal/2.2.2/1/Packages/tb2kdsgn_d7.res | Bin 0 -> 32 bytes internal/2.2.2/1/Packages/tb2kdsgn_d9.dpk | 42 + internal/2.2.2/1/Packages/tb2kdsgn_d9.res | Bin 0 -> 32 bytes .../2.2.2/1/Packages/tb2kdsgn_dn10.bdsproj | 188 + internal/2.2.2/1/Packages/tb2kdsgn_dn10.dpk | 111 + internal/2.2.2/1/Packages/tb2kdsgn_dn11.dpk | 112 + internal/2.2.2/1/Packages/tb2kdsgn_dn11.dproj | 82 + internal/2.2.2/1/README.txt | 22 + .../1/Source/Icons/TB2DsgnEditorImages.bmp | Bin 0 -> 1270 bytes .../2.2.2/1/Source/Icons/TTBBackground.bmp | Bin 0 -> 406 bytes .../2.2.2/1/Source/Icons/TTBBackground16.bmp | Bin 0 -> 246 bytes internal/2.2.2/1/Source/Icons/TTBDock.bmp | Bin 0 -> 406 bytes internal/2.2.2/1/Source/Icons/TTBDock16.bmp | Bin 0 -> 246 bytes internal/2.2.2/1/Source/Icons/TTBEditItem.bmp | Bin 0 -> 246 bytes .../2.2.2/1/Source/Icons/TTBGroupItem.bmp | Bin 0 -> 246 bytes .../2.2.2/1/Source/Icons/TTBImageList.bmp | Bin 0 -> 2322 bytes .../2.2.2/1/Source/Icons/TTBImageList16.bmp | Bin 0 -> 822 bytes .../2.2.2/1/Source/Icons/TTBItemContainer.bmp | Bin 0 -> 406 bytes .../1/Source/Icons/TTBItemContainer16.bmp | Bin 0 -> 246 bytes .../2.2.2/1/Source/Icons/TTBMDIHandler.bmp | Bin 0 -> 406 bytes .../2.2.2/1/Source/Icons/TTBMDIHandler16.bmp | Bin 0 -> 246 bytes .../2.2.2/1/Source/Icons/TTBMDIWindowItem.bmp | Bin 0 -> 246 bytes internal/2.2.2/1/Source/Icons/TTBMRUList.bmp | Bin 0 -> 406 bytes .../2.2.2/1/Source/Icons/TTBMRUList16.bmp | Bin 0 -> 246 bytes .../2.2.2/1/Source/Icons/TTBMRUListItem.bmp | Bin 0 -> 246 bytes .../2.2.2/1/Source/Icons/TTBPopupMenu.bmp | Bin 0 -> 1782 bytes .../2.2.2/1/Source/Icons/TTBPopupMenu16.bmp | Bin 0 -> 822 bytes .../2.2.2/1/Source/Icons/TTBToolWindow.bmp | Bin 0 -> 406 bytes .../2.2.2/1/Source/Icons/TTBToolWindow16.bmp | Bin 0 -> 246 bytes internal/2.2.2/1/Source/Icons/TTBToolbar.bmp | Bin 0 -> 406 bytes .../2.2.2/1/Source/Icons/TTBToolbar16.bmp | Bin 0 -> 246 bytes internal/2.2.2/1/Source/Icons/Thumbs.db | Bin 0 -> 30208 bytes internal/2.2.2/1/Source/TB2Acc.pas | 1393 ++++ internal/2.2.2/1/Source/TB2Anim.pas | 323 + internal/2.2.2/1/Source/TB2Common.pas | 1571 ++++ internal/2.2.2/1/Source/TB2Consts.pas | 34 + internal/2.2.2/1/Source/TB2Dock.pas | 5670 +++++++++++++ .../2.2.2/1/Source/TB2DsgnConvertOptions.dfm | Bin 0 -> 903 bytes .../1/Source/TB2DsgnConvertOptions.dfm.txt | 65 + .../2.2.2/1/Source/TB2DsgnConvertOptions.pas | 67 + internal/2.2.2/1/Source/TB2DsgnConverter.dfm | Bin 0 -> 795 bytes .../2.2.2/1/Source/TB2DsgnConverter.dfm.txt | 51 + internal/2.2.2/1/Source/TB2DsgnConverter.pas | 217 + internal/2.2.2/1/Source/TB2DsgnItemEditor.dfm | Bin 0 -> 2866 bytes .../2.2.2/1/Source/TB2DsgnItemEditor.dfm.txt | 184 + internal/2.2.2/1/Source/TB2DsgnItemEditor.pas | 1439 ++++ internal/2.2.2/1/Source/TB2DsgnItemEditor.res | Bin 0 -> 2520 bytes internal/2.2.2/1/Source/TB2ExtItems.pas | 990 +++ internal/2.2.2/1/Source/TB2Hook.pas | 344 + internal/2.2.2/1/Source/TB2Item.pas | 6982 +++++++++++++++++ internal/2.2.2/1/Source/TB2MDI.pas | 714 ++ internal/2.2.2/1/Source/TB2MDI.res | Bin 0 -> 712 bytes internal/2.2.2/1/Source/TB2MRU.pas | 417 + internal/2.2.2/1/Source/TB2OleMarshal.pas | 203 + internal/2.2.2/1/Source/TB2Reg.dcr | Bin 0 -> 5188 bytes internal/2.2.2/1/Source/TB2Reg.pas | 317 + internal/2.2.2/1/Source/TB2ResCursors.res | Bin 0 -> 1304 bytes internal/2.2.2/1/Source/TB2ToolWindow.pas | 258 + internal/2.2.2/1/Source/TB2Toolbar.pas | 1794 +++++ internal/2.2.2/1/Source/TB2Ver.inc | 64 + internal/2.2.2/1/Source/TB2Version.pas | 63 + internal/2.2.2/1/TB2k-LICENSE.txt | 61 + internal/2.2.2/1/tb2k.chm | Bin 0 -> 84104 bytes internal/2.2.2/1/whatsnew.htm | 419 + 162 files changed, 29197 insertions(+) create mode 100644 internal/2.2.2/1/DemoProj/Demo.cfg create mode 100644 internal/2.2.2/1/DemoProj/Demo.dof create mode 100644 internal/2.2.2/1/DemoProj/Demo.dpr create mode 100644 internal/2.2.2/1/DemoProj/Demo.res create mode 100644 internal/2.2.2/1/DemoProj/Demo1.dfm create mode 100644 internal/2.2.2/1/DemoProj/Demo1.pas create mode 100644 internal/2.2.2/1/DemoProj/DemoBCB.bpr create mode 100644 internal/2.2.2/1/DemoProj/DemoBCB.cpp create mode 100644 internal/2.2.2/1/DemoProj/DemoBCB.res create mode 100644 internal/2.2.2/1/DemoProj/DemoBCB6.bpr create mode 100644 internal/2.2.2/1/DemoProj/DemoBCB6.cpp create mode 100644 internal/2.2.2/1/DemoProj/DemoBCB6.res create mode 100644 internal/2.2.2/1/GPL-LICENSE.txt create mode 100644 internal/2.2.2/1/Glyphs.zip create mode 100644 internal/2.2.2/1/LICENSE.txt create mode 100644 internal/2.2.2/1/Lib/D11/TB2Acc.dcu create mode 100644 internal/2.2.2/1/Lib/D11/TB2Anim.dcu create mode 100644 internal/2.2.2/1/Lib/D11/TB2Common.dcu create mode 100644 internal/2.2.2/1/Lib/D11/TB2Consts.dcu create mode 100644 internal/2.2.2/1/Lib/D11/TB2Dock.dcu create mode 100644 internal/2.2.2/1/Lib/D11/TB2DsgnConvertOptions.dcu create mode 100644 internal/2.2.2/1/Lib/D11/TB2DsgnConvertOptions.dfm create mode 100644 internal/2.2.2/1/Lib/D11/TB2DsgnConverter.dcu create mode 100644 internal/2.2.2/1/Lib/D11/TB2DsgnConverter.dfm create mode 100644 internal/2.2.2/1/Lib/D11/TB2DsgnItemEditor.dcu create mode 100644 internal/2.2.2/1/Lib/D11/TB2DsgnItemEditor.dfm create mode 100644 internal/2.2.2/1/Lib/D11/TB2DsgnItemEditor.res create mode 100644 internal/2.2.2/1/Lib/D11/TB2ExtItems.dcu create mode 100644 internal/2.2.2/1/Lib/D11/TB2Hook.dcu create mode 100644 internal/2.2.2/1/Lib/D11/TB2Item.dcu create mode 100644 internal/2.2.2/1/Lib/D11/TB2MDI.dcu create mode 100644 internal/2.2.2/1/Lib/D11/TB2MDI.res create mode 100644 internal/2.2.2/1/Lib/D11/TB2MRU.dcu create mode 100644 internal/2.2.2/1/Lib/D11/TB2Reg.dcu create mode 100644 internal/2.2.2/1/Lib/D11/TB2ResCursors.res create mode 100644 internal/2.2.2/1/Lib/D11/TB2ToolWindow.dcu create mode 100644 internal/2.2.2/1/Lib/D11/TB2Toolbar.dcu create mode 100644 internal/2.2.2/1/Lib/D11/TB2Ver.inc create mode 100644 internal/2.2.2/1/Lib/D11/TB2Version.dcu create mode 100644 internal/2.2.2/1/Lib/D11/tb2k_d11.bpl create mode 100644 internal/2.2.2/1/Lib/D11/tb2k_d11.dcp create mode 100644 internal/2.2.2/1/Lib/D11/tb2k_d11.dcu create mode 100644 internal/2.2.2/1/Lib/D11/tb2kdsgn_d11.bpl create mode 100644 internal/2.2.2/1/Lib/D11/tb2kdsgn_d11.dcp create mode 100644 internal/2.2.2/1/Lib/D11/tb2kdsgn_d11.dcu create mode 100644 internal/2.2.2/1/Packages/TB2k_D11Group.groupproj create mode 100644 internal/2.2.2/1/Packages/tb2k_cb4.bpk create mode 100644 internal/2.2.2/1/Packages/tb2k_cb4.cpp create mode 100644 internal/2.2.2/1/Packages/tb2k_cb5.bpk create mode 100644 internal/2.2.2/1/Packages/tb2k_cb5.cpp create mode 100644 internal/2.2.2/1/Packages/tb2k_cb6.bpk create mode 100644 internal/2.2.2/1/Packages/tb2k_cb6.cpp create mode 100644 internal/2.2.2/1/Packages/tb2k_d10.bdsproj create mode 100644 internal/2.2.2/1/Packages/tb2k_d10.dpk create mode 100644 internal/2.2.2/1/Packages/tb2k_d10.res create mode 100644 internal/2.2.2/1/Packages/tb2k_d11.dpk create mode 100644 internal/2.2.2/1/Packages/tb2k_d11.dproj create mode 100644 internal/2.2.2/1/Packages/tb2k_d11.res create mode 100644 internal/2.2.2/1/Packages/tb2k_d12.dpk create mode 100644 internal/2.2.2/1/Packages/tb2k_d12.dproj create mode 100644 internal/2.2.2/1/Packages/tb2k_d12.res create mode 100644 internal/2.2.2/1/Packages/tb2k_d4.dpk create mode 100644 internal/2.2.2/1/Packages/tb2k_d4.res create mode 100644 internal/2.2.2/1/Packages/tb2k_d5.dpk create mode 100644 internal/2.2.2/1/Packages/tb2k_d5.res create mode 100644 internal/2.2.2/1/Packages/tb2k_d6.dpk create mode 100644 internal/2.2.2/1/Packages/tb2k_d6.res create mode 100644 internal/2.2.2/1/Packages/tb2k_d7.dpk create mode 100644 internal/2.2.2/1/Packages/tb2k_d7.res create mode 100644 internal/2.2.2/1/Packages/tb2k_d9.dpk create mode 100644 internal/2.2.2/1/Packages/tb2k_d9.res create mode 100644 internal/2.2.2/1/Packages/tb2k_dn10.bdsproj create mode 100644 internal/2.2.2/1/Packages/tb2k_dn10.dpk create mode 100644 internal/2.2.2/1/Packages/tb2k_dn11.dpk create mode 100644 internal/2.2.2/1/Packages/tb2k_dn11.dproj create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_cb4.bpk create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_cb4.cpp create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_cb5.bpk create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_cb5.cpp create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_cb6.bpk create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_cb6.cpp create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_d10.bdsproj create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_d10.dpk create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_d10.res create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_d11.bpi create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_d11.dpk create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_d11.dproj create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_d11.res create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_d12.dpk create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_d12.dproj create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_d12.res create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_d4.dpk create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_d4.res create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_d5.dpk create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_d5.res create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_d6.dpk create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_d6.res create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_d7.dpk create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_d7.res create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_d9.dpk create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_d9.res create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_dn10.bdsproj create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_dn10.dpk create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_dn11.dpk create mode 100644 internal/2.2.2/1/Packages/tb2kdsgn_dn11.dproj create mode 100644 internal/2.2.2/1/README.txt create mode 100644 internal/2.2.2/1/Source/Icons/TB2DsgnEditorImages.bmp create mode 100644 internal/2.2.2/1/Source/Icons/TTBBackground.bmp create mode 100644 internal/2.2.2/1/Source/Icons/TTBBackground16.bmp create mode 100644 internal/2.2.2/1/Source/Icons/TTBDock.bmp create mode 100644 internal/2.2.2/1/Source/Icons/TTBDock16.bmp create mode 100644 internal/2.2.2/1/Source/Icons/TTBEditItem.bmp create mode 100644 internal/2.2.2/1/Source/Icons/TTBGroupItem.bmp create mode 100644 internal/2.2.2/1/Source/Icons/TTBImageList.bmp create mode 100644 internal/2.2.2/1/Source/Icons/TTBImageList16.bmp create mode 100644 internal/2.2.2/1/Source/Icons/TTBItemContainer.bmp create mode 100644 internal/2.2.2/1/Source/Icons/TTBItemContainer16.bmp create mode 100644 internal/2.2.2/1/Source/Icons/TTBMDIHandler.bmp create mode 100644 internal/2.2.2/1/Source/Icons/TTBMDIHandler16.bmp create mode 100644 internal/2.2.2/1/Source/Icons/TTBMDIWindowItem.bmp create mode 100644 internal/2.2.2/1/Source/Icons/TTBMRUList.bmp create mode 100644 internal/2.2.2/1/Source/Icons/TTBMRUList16.bmp create mode 100644 internal/2.2.2/1/Source/Icons/TTBMRUListItem.bmp create mode 100644 internal/2.2.2/1/Source/Icons/TTBPopupMenu.bmp create mode 100644 internal/2.2.2/1/Source/Icons/TTBPopupMenu16.bmp create mode 100644 internal/2.2.2/1/Source/Icons/TTBToolWindow.bmp create mode 100644 internal/2.2.2/1/Source/Icons/TTBToolWindow16.bmp create mode 100644 internal/2.2.2/1/Source/Icons/TTBToolbar.bmp create mode 100644 internal/2.2.2/1/Source/Icons/TTBToolbar16.bmp create mode 100644 internal/2.2.2/1/Source/Icons/Thumbs.db create mode 100644 internal/2.2.2/1/Source/TB2Acc.pas create mode 100644 internal/2.2.2/1/Source/TB2Anim.pas create mode 100644 internal/2.2.2/1/Source/TB2Common.pas create mode 100644 internal/2.2.2/1/Source/TB2Consts.pas create mode 100644 internal/2.2.2/1/Source/TB2Dock.pas create mode 100644 internal/2.2.2/1/Source/TB2DsgnConvertOptions.dfm create mode 100644 internal/2.2.2/1/Source/TB2DsgnConvertOptions.dfm.txt create mode 100644 internal/2.2.2/1/Source/TB2DsgnConvertOptions.pas create mode 100644 internal/2.2.2/1/Source/TB2DsgnConverter.dfm create mode 100644 internal/2.2.2/1/Source/TB2DsgnConverter.dfm.txt create mode 100644 internal/2.2.2/1/Source/TB2DsgnConverter.pas create mode 100644 internal/2.2.2/1/Source/TB2DsgnItemEditor.dfm create mode 100644 internal/2.2.2/1/Source/TB2DsgnItemEditor.dfm.txt create mode 100644 internal/2.2.2/1/Source/TB2DsgnItemEditor.pas create mode 100644 internal/2.2.2/1/Source/TB2DsgnItemEditor.res create mode 100644 internal/2.2.2/1/Source/TB2ExtItems.pas create mode 100644 internal/2.2.2/1/Source/TB2Hook.pas create mode 100644 internal/2.2.2/1/Source/TB2Item.pas create mode 100644 internal/2.2.2/1/Source/TB2MDI.pas create mode 100644 internal/2.2.2/1/Source/TB2MDI.res create mode 100644 internal/2.2.2/1/Source/TB2MRU.pas create mode 100644 internal/2.2.2/1/Source/TB2OleMarshal.pas create mode 100644 internal/2.2.2/1/Source/TB2Reg.dcr create mode 100644 internal/2.2.2/1/Source/TB2Reg.pas create mode 100644 internal/2.2.2/1/Source/TB2ResCursors.res create mode 100644 internal/2.2.2/1/Source/TB2ToolWindow.pas create mode 100644 internal/2.2.2/1/Source/TB2Toolbar.pas create mode 100644 internal/2.2.2/1/Source/TB2Ver.inc create mode 100644 internal/2.2.2/1/Source/TB2Version.pas create mode 100644 internal/2.2.2/1/TB2k-LICENSE.txt create mode 100644 internal/2.2.2/1/tb2k.chm create mode 100644 internal/2.2.2/1/whatsnew.htm diff --git a/internal/2.2.2/1/DemoProj/Demo.cfg b/internal/2.2.2/1/DemoProj/Demo.cfg new file mode 100644 index 0000000..6b67b6f --- /dev/null +++ b/internal/2.2.2/1/DemoProj/Demo.cfg @@ -0,0 +1,33 @@ +-$A+ +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L+ +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$Y- +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 diff --git a/internal/2.2.2/1/DemoProj/Demo.dof b/internal/2.2.2/1/DemoProj/Demo.dof new file mode 100644 index 0000000..d8a22f2 --- /dev/null +++ b/internal/2.2.2/1/DemoProj/Demo.dof @@ -0,0 +1,29 @@ +[Compiler] +A=1 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=0 +Z=1 +ShowHints=1 +ShowWarnings=1 diff --git a/internal/2.2.2/1/DemoProj/Demo.dpr b/internal/2.2.2/1/DemoProj/Demo.dpr new file mode 100644 index 0000000..1697c6c --- /dev/null +++ b/internal/2.2.2/1/DemoProj/Demo.dpr @@ -0,0 +1,22 @@ +program Demo; + +uses + Forms, + Demo1 in 'Demo1.pas' {Form1}; + +{$R *.RES} + +{$IFDEF CLR} +[STAThread] // All VCL.NET projects that use Toolbar2000 must include this +{$ENDIF} +begin + Application.Initialize; + {$IFDEF CONDITIONALEXPRESSIONS} + {$IF CompilerVersion >= 18.5} + Application.MainFormOnTaskbar := True; + {$IFEND} + {$ENDIF} + Application.CreateForm(TForm1, Form1); + Application.Run; +end. + diff --git a/internal/2.2.2/1/DemoProj/Demo.res b/internal/2.2.2/1/DemoProj/Demo.res new file mode 100644 index 0000000000000000000000000000000000000000..a8371ab57e62b805e3cbaca0141aa85575085c64 GIT binary patch literal 876 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 E0X5XFmH+?% literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/DemoProj/Demo1.pas b/internal/2.2.2/1/DemoProj/Demo1.pas new file mode 100644 index 0000000..77c64b9 --- /dev/null +++ b/internal/2.2.2/1/DemoProj/Demo1.pas @@ -0,0 +1,254 @@ +unit Demo1; + +{ + Toolbar2000 demo project + + $jrsoftware: tb2k/DemoProj/Demo1.pas,v 1.9 2006/03/12 23:11:58 jr Exp $ +} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, ExtCtrls, Menus, ActnList, ImgList, ComCtrls, + TB2Item, TB2ExtItems, TB2Dock, TB2Toolbar, TB2MRU; + +type + TForm1 = class(TForm) + ActionList: TActionList; + actNew: TAction; + actOpen: TAction; + actSave: TAction; + actSaveAs: TAction; + actPageSetup: TAction; + actPrint: TAction; + actExit: TAction; + actUndo: TAction; + actCut: TAction; + actCopy: TAction; + actPaste: TAction; + actDelete: TAction; + actSelectAll: TAction; + actTimeDate: TAction; + actWordWrap: TAction; + actSetFont: TAction; + actFind: TAction; + actFindNext: TAction; + actReplace: TAction; + actHelpTopics: TAction; + actAbout: TAction; + actTestButton: TAction; + actTestEdit: TTBEditAction; + DockTop: TTBDock; + MenuToolbar: TTBToolbar; + ImageList: TTBImageList; + FMenu: TTBSubmenuItem; + FNew: TTBItem; + FOpen: TTBItem; + FSave: TTBItem; + FSaveAs: TTBItem; + FPageSetup: TTBItem; + FPrint: TTBItem; + FExit: TTBItem; + EMenu: TTBSubmenuItem; + EUndo: TTBItem; + ECut: TTBItem; + ECopy: TTBItem; + EPaste: TTBItem; + EDelete: TTBItem; + ESelectAll: TTBItem; + ETimeDate: TTBItem; + EWordWrap: TTBItem; + ESetFont: TTBItem; + SMenu: TTBSubmenuItem; + SFind: TTBItem; + SFindNext: TTBItem; + SReplace: TTBItem; + HMenu: TTBSubmenuItem; + HHelpTopics: TTBItem; + HAbout: TTBItem; + FMRU: TTBMRUListItem; + NBSeparatorItem3: TTBSeparatorItem; + NBSeparatorItem4: TTBSeparatorItem; + TestEdit: TTBEditItem; + MainToolbar: TTBToolbar; + NewButton: TTBItem; + OpenButton: TTBItem; + SaveButton: TTBItem; + DockBottom: TTBDock; + DockLeft: TTBDock; + DockRight: TTBDock; + BottomToolbar: TTBToolbar; + PopupMenuBarButton: TTBItem; + PopupToolbarButton: TTBItem; + Memo1: TMemo; + ContextPopupMenu: TTBPopupMenu; + StatusBar: TStatusBar; + ToolbarPopupMenu: TTBPopupMenu; + MRUList: TTBMRUList; + PrintButton: TTBItem; + CutButton: TTBItem; + CopyButton: TTBItem; + PasteButton: TTBItem; + UndoButton: TTBSubmenuItem; + actPrintPreview: TAction; + TBItem1: TTBItem; + FormatToolbar: TTBToolbar; + BoldItem: TTBItem; + ItalicItem: TTBItem; + UnderlineItem: TTBItem; + TBSeparatorItem1: TTBSeparatorItem; + AlignLeftItem: TTBItem; + CenterItem: TTBItem; + AlignRightItem: TTBItem; + TBSeparatorItem2: TTBSeparatorItem; + BulletsItem: TTBItem; + NBItem34: TTBItem; + NBSeparatorItem6: TTBSeparatorItem; + NBItem35: TTBItem; + NBItem36: TTBItem; + NBItem37: TTBItem; + NBItem38: TTBItem; + NBSeparatorItem7: TTBSeparatorItem; + NBItem39: TTBItem; + ComboBox1: TComboBox; + TBControlItem1: TTBControlItem; + TBSeparatorItem3: TTBSeparatorItem; + TBControlItem2: TTBControlItem; + ComboBox2: TComboBox; + actBold: TAction; + actItalic: TAction; + actUnderline: TAction; + actAlignLeft: TAction; + actCenter: TAction; + actAlignRight: TAction; + TBSeparatorItem4: TTBSeparatorItem; + actRedo: TAction; + RedoButton: TTBSubmenuItem; + TBItem2: TTBItem; + TBItem3: TTBItem; + TBItem4: TTBItem; + ERedo: TTBItem; + VMenu: TTBSubmenuItem; + VToolbars: TTBSubmenuItem; + VTStandard: TTBVisibilityToggleItem; + VTFormatting: TTBVisibilityToggleItem; + VTBottom: TTBVisibilityToggleItem; + VStatusBar: TTBItem; + actBullets: TAction; + procedure FormCreate(Sender: TObject); + procedure ItemClick(Sender: TObject); + procedure PopupMenuBarButtonClick(Sender: TObject); + procedure PopupToolbarButtonClick(Sender: TObject); + procedure MRUListClick(Sender: TObject; const Filename: String); + procedure AlignClick(Sender: TObject); + procedure BulletsItemClick(Sender: TObject); + procedure BoldItemClick(Sender: TObject); + procedure ItalicItemClick(Sender: TObject); + procedure UnderlineItemClick(Sender: TObject); + procedure VStatusBarClick(Sender: TObject); + procedure VMenuClick(Sender: TObject); + private + { Private declarations } + procedure OnHint(Sender: TObject); + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation + +uses + {$IFDEF CLR} Types, {$ENDIF} + CommCtrl, TB2Version; + +{$R *.DFM} + +procedure TForm1.FormCreate(Sender: TObject); +begin + Memo1.Text := 'Running on ' + Toolbar2000VersionPropText; + Application.OnHint := OnHint; +end; + +procedure TForm1.OnHint(Sender: TObject); +begin + StatusBar.Panels[0].Text := Application.Hint; +end; + +procedure TForm1.ItemClick(Sender: TObject); +begin + Application.MessageBox( {$IFNDEF CLR} PChar {$ENDIF} + ('You selected:'#13#10#13#10 + (Sender as TComponent).Name), + 'OnClick handler', MB_OK or MB_ICONINFORMATION); +end; + +procedure TForm1.MRUListClick(Sender: TObject; const Filename: String); +begin + Application.MessageBox( {$IFNDEF CLR} PChar {$ENDIF} + (Format('You selected "%s" from the MRU list.', [Filename])), + 'MRUListClick', MB_OK or MB_ICONINFORMATION); +end; + +procedure TForm1.VMenuClick(Sender: TObject); +begin + VStatusBar.Checked := StatusBar.Visible; +end; + +procedure TForm1.VStatusBarClick(Sender: TObject); +begin + { Force the StatusBar to always be at the bottom of the form. Without this + line of code, the status bar sometimes may appear above the bottom dock. + This is not a bug in Toolbar2000, but rather is due to the design of the + VCL's alignment system. } + StatusBar.Top := ClientHeight; + + { Toggle the status bar's visibility } + StatusBar.Visible := not StatusBar.Visible; +end; + +procedure TForm1.AlignClick(Sender: TObject); +begin + AlignLeftItem.Checked := (Sender = actAlignLeft); + CenterItem.Checked := (Sender = actCenter); + AlignRightItem.Checked := (Sender = actAlignRight); +end; + +procedure TForm1.BulletsItemClick(Sender: TObject); +begin + BulletsItem.Checked := not BulletsItem.Checked; +end; + +procedure TForm1.BoldItemClick(Sender: TObject); +begin + BoldItem.Checked := not BoldItem.Checked; +end; + +procedure TForm1.ItalicItemClick(Sender: TObject); +begin + ItalicItem.Checked := not ItalicItem.Checked; +end; + +procedure TForm1.UnderlineItemClick(Sender: TObject); +begin + UnderlineItem.Checked := not UnderlineItem.Checked; +end; + +procedure TForm1.PopupMenuBarButtonClick(Sender: TObject); +var + P: TPoint; +begin + P := Memo1.ClientToScreen(Point(8, 8)); + MenuToolbar.Items.Popup(P.X, P.Y, True); +end; + +procedure TForm1.PopupToolbarButtonClick(Sender: TObject); +var + P: TPoint; +begin + P := Memo1.ClientToScreen(Point(8, 8)); + MainToolbar.Items.Popup(P.X, P.Y, True); +end; + +end. diff --git a/internal/2.2.2/1/DemoProj/DemoBCB.bpr b/internal/2.2.2/1/DemoProj/DemoBCB.bpr new file mode 100644 index 0000000..9800232 --- /dev/null +++ b/internal/2.2.2/1/DemoProj/DemoBCB.bpr @@ -0,0 +1,179 @@ +# --------------------------------------------------------------------------- +!if !$d(BCB) +BCB = $(MAKEDIR)\.. +!endif + +# --------------------------------------------------------------------------- +# IDE SECTION +# --------------------------------------------------------------------------- +# The following section of the project makefile is managed by the BCB IDE. +# It is recommended to use the IDE to change any of the values in this +# section. +# --------------------------------------------------------------------------- + +VERSION = BCB.04.04 +# --------------------------------------------------------------------------- +PROJECT = DemoBCB.exe +OBJFILES = Demo1.obj DemoBCB.obj +RESFILES = DemoBCB.res +RESDEPEN = $(RESFILES) Demo1.dfm +LIBFILES = +LIBRARIES = vcl40.lib +SPARELIBS = vcl40.lib +PACKAGES = +DEFFILE = +# --------------------------------------------------------------------------- +PATHCPP = .; +PATHASM = .; +PATHPAS = .; +PATHRC = .; +DEBUGLIBPATH = $(BCB)\lib\debug +RELEASELIBPATH = $(BCB)\lib\release +USERDEFINES = +SYSDEFINES = _RTLDLL;NO_STRICT +# --------------------------------------------------------------------------- +CFLAG1 = -I$(BCB)\include;$(BCB)\include\vcl -Od -Hc -H=$(BCB)\lib\vcl40.csm -w -Ve -r- \ + -a8 -k -y -v -vi- -c -b- -w-par -w-inl -Vx -tW -tWM \ + -D$(SYSDEFINES);$(USERDEFINES) +PFLAGS = -U$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib;$(RELEASELIBPATH) \ + -I$(BCB)\include;$(BCB)\include\vcl -$YD -$W -$O- -v -JPHNE -M +RFLAGS = -i$(BCB)\include;$(BCB)\include\vcl +AFLAGS = /i$(BCB)\include /i$(BCB)\include\vcl /mx /w2 /zd +LFLAGS = -L$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib;$(RELEASELIBPATH) -aa -Tpe -x \ + -Gn -v +# --------------------------------------------------------------------------- +ALLOBJ = c0w32.obj Memmgr.Lib sysinit.obj $(OBJFILES) +ALLRES = $(RESFILES) +ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cp32mti.lib +# --------------------------------------------------------------------------- +!ifdef IDEOPTIONS + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +InMemoryExe=0 +ShowInfoMsgs=0 + +!endif + +# --------------------------------------------------------------------------- +# MAKE SECTION +# --------------------------------------------------------------------------- +# This section of the project file is not used by the BCB IDE. It is for +# the benefit of building from the command-line using the MAKE utility. +# --------------------------------------------------------------------------- + +.autodepend +# --------------------------------------------------------------------------- +!if !$d(BCC32) +BCC32 = bcc32 +!endif + +!if !$d(CPP32) +CPP32 = cpp32 +!endif + +!if !$d(DCC32) +DCC32 = dcc32 +!endif + +!if !$d(TASM32) +TASM32 = tasm32 +!endif + +!if !$d(LINKER) +LINKER = ilink32 +!endif + +!if !$d(BRCC32) +BRCC32 = brcc32 +!endif + +# --------------------------------------------------------------------------- +!if $d(PATHCPP) +.PATH.CPP = $(PATHCPP) +.PATH.C = $(PATHCPP) +!endif + +!if $d(PATHPAS) +.PATH.PAS = $(PATHPAS) +!endif + +!if $d(PATHASM) +.PATH.ASM = $(PATHASM) +!endif + +!if $d(PATHRC) +.PATH.RC = $(PATHRC) +!endif +# --------------------------------------------------------------------------- +$(PROJECT): $(OBJFILES) $(RESDEPEN) $(DEFFILE) + $(BCB)\BIN\$(LINKER) @&&! + $(LFLAGS) + + $(ALLOBJ), + + $(PROJECT),, + + $(ALLLIB), + + $(DEFFILE), + + $(ALLRES) +! +# --------------------------------------------------------------------------- +.pas.hpp: + $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< } + +.pas.obj: + $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< } + +.cpp.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) -n$(@D) {$< } + +.c.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) -n$(@D) {$< } + +.c.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) -n. {$< } + +.cpp.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) -n. {$< } + +.asm.obj: + $(BCB)\BIN\$(TASM32) $(AFLAGS) $<, $@ + +.rc.res: + $(BCB)\BIN\$(BRCC32) $(RFLAGS) -fo$@ $< +# --------------------------------------------------------------------------- + diff --git a/internal/2.2.2/1/DemoProj/DemoBCB.cpp b/internal/2.2.2/1/DemoProj/DemoBCB.cpp new file mode 100644 index 0000000..b4ea3e5 --- /dev/null +++ b/internal/2.2.2/1/DemoProj/DemoBCB.cpp @@ -0,0 +1,22 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop +USERES("DemoBCB.res"); +USEFORMNS("Demo1.pas", Demo1, Form1); +//--------------------------------------------------------------------------- +WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) +{ + try + { + Application->Initialize(); + Application->CreateForm(__classid(TForm1), &Form1); + Application->Run(); + } + catch (Exception &exception) + { + Application->ShowException(&exception); + } + return 0; +} +//--------------------------------------------------------------------------- + diff --git a/internal/2.2.2/1/DemoProj/DemoBCB.res b/internal/2.2.2/1/DemoProj/DemoBCB.res new file mode 100644 index 0000000000000000000000000000000000000000..32b522d0446895614bc4b68603238d2e2e1f4263 GIT binary patch literal 876 zcmb7@&q~BF5XQf53&o4>!Mia|mo;g+5L__E9`~^tgwG_$B?b zEiQ=Dew~^AW+ovJ0H~-CdNEws*J|WBYqG@F>$74kx@J&OcT|SqH+xQ-0DK|RJAN5b zg0AZb;wGXCz2mpvS3vzvYut|ZZN*CMX^nYm+t&NN-_JPd#LY*mNhj`hPA|C8YQeqM zTgzvdZ;aAuz4DOOcYdfZ_i24&v<}fGuC%ghV~<>^?Z#o^I&$V?KkJuVEjjBKJkHl< z)*t7~G~YS)8yvZD$_evf|IT?uJmXRjBOP$#Xi^Ah@c2h`ybzzr3` eIi7KkN4!uEc%>h0elOx}$WT>9x)t#jW%vP1A`iy^ literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/DemoProj/DemoBCB6.bpr b/internal/2.2.2/1/DemoProj/DemoBCB6.bpr new file mode 100644 index 0000000..28a1267 --- /dev/null +++ b/internal/2.2.2/1/DemoProj/DemoBCB6.bpr @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + + \ No newline at end of file diff --git a/internal/2.2.2/1/DemoProj/DemoBCB6.cpp b/internal/2.2.2/1/DemoProj/DemoBCB6.cpp new file mode 100644 index 0000000..c762f01 --- /dev/null +++ b/internal/2.2.2/1/DemoProj/DemoBCB6.cpp @@ -0,0 +1,34 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +//--------------------------------------------------------------------------- +USEFORMNS("Demo1.pas", Demo1, Form1); +//--------------------------------------------------------------------------- +WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) +{ + try + { + Application->Initialize(); + Application->CreateForm(__classid(TForm1), &Form1); + Application->Run(); + } + catch (Exception &exception) + { + Application->ShowException(&exception); + } + catch (...) + { + try + { + throw Exception(""); + } + catch (Exception &exception) + { + Application->ShowException(&exception); + } + } + return 0; +} +//--------------------------------------------------------------------------- + diff --git a/internal/2.2.2/1/DemoProj/DemoBCB6.res b/internal/2.2.2/1/DemoProj/DemoBCB6.res new file mode 100644 index 0000000000000000000000000000000000000000..e468bf918a523af7a3091b3eec019fa7b1c1693c GIT binary patch literal 876 zcmb_bF;2uV5Zu5uH0X-!NlA%xEfPT&DWU*=!4q&17bzp%{pX4_DNahW&!C{N_=1_S z(;tv z|In#nuj{navMjJhZPaM_QfNJD4x+|BdQI?CM=$p}-Rz^@qE3JH8vXRJG5P7?`N>Z` z^;5UnYGuEjugCL0h&O2V;=F@MIaK@b1)ytaHG_$|4Ry9gjf8ce7r;f$G$71Q;+N=W zkSqKfCkk>9V-oqZ{(-ldmnrWs9vrd4up7|(OL>%gd5|Y?BhQEl(|f_AGs*KsxD~ub GnS25s111yz literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/GPL-LICENSE.txt b/internal/2.2.2/1/GPL-LICENSE.txt new file mode 100644 index 0000000..45645b4 --- /dev/null +++ b/internal/2.2.2/1/GPL-LICENSE.txt @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/internal/2.2.2/1/Glyphs.zip b/internal/2.2.2/1/Glyphs.zip new file mode 100644 index 0000000000000000000000000000000000000000..60704428f161bb9768d0c5f4b7c214157ca99588 GIT binary patch literal 11257 zcmb`M30PCtw#UzqfgvQ31{ox9u;M)q#aOX2eQ?4c1S6b6RODhzz1o69jYy#=LIPHx zS{kpmT5E5Eg4bH#eQmX`IC4;|UZ*0pw_>3nZ7fz4hg*efNZvV+c*2&7eR(Qh{677C z`=7P}+!Nz5cHucnPr| zZbZoQXDDR!N~m*nkw7q`*Qbd<7Q*iZZt}5M%Sp_|6Y)%T=|B)S zfxtrCozi{%x`nvyeZ6xLClE)jJ&M%#TCGQLxQ|#OOeUhmKKN8`=mpIba?zBot}YG# z-o`_|FG;*{_(IzSisBrc2`f*~s)lH8F(;?LV$TZnHn;mo0pI37{{l z{?|v#Z2I{0XWSf>v+}eZNOfjJRAv-*Fwxz!?HW=W8I=`99YojvnyvGrD7ZQt%R~97 z>M%UX0|xZe{g!Aga)?(dnUL~SK|{99u&RTCF%Qo^(M*BW8i$KHu5e{;DD+a5G-(W~ zmluZ5m{!rCzE}^BrTWK=rRq!2j0q1{V$i-{+C>~<$DZKTySXet79Xz5%X<@QksanHudUOWW<_L1L|k2v zHL*fA8c@M0J}_JDpkhwSA5k%UoYIK5))pSx=x(?JT_W_J*ezl0EbL%pQZu^$>Z#g~ zjGF-s-z7azSK2fTq=hs^inFIDSq8mSu258?E`EMk7Ed_7s;cUCn^b@uK6bRM%yr_A z6#Vk{M(BF348M!cegs|Kdq=OohMvJNYs_;^nqnTWSmu!i)igwO{0jl}mi*j1Nnz6~ zpg-kGMPf=?qO+2vVel1=DgZ^jOhI54N}QFOT;i}K$%KeZdwM1sa$ttrD%W6Kw|#db zC6bt}a#)GZUW7CUUY!)SRTrArw~;5lpjN*O?fEz^yQ;uTv&tATKDZ(}IJhD_886Bo zj|VOdGhd%bq5v&CfzMNWi82u zF8Q1N{RPSpbD-{j@*MF>l_x8*n^&2<3TZ=9IO3QD*wbmah znRckej6-QX3o|lA%{?K#3tHj5u4lIKFWqjhFX3Mz)`ehKPyez>w5f+v0}p+h@GRmB_dZx7j@~H{K@;9_oG0_4)K=>G`1y~yPA}sB&Yu078M)yXzc1S#^$=lYyW=r zGi1YtHcY?ag1-jF+MqoJV+e`1hj*?3l76lKOajPQ_UWFA0-Frx3eHSTQKiU7*tus& z@&3lfQ^#6QovJ;0l>T#~R*H8BYxJI8w@twTm=`g>K-`ul{3~yQ7QVS(dspWJZ{|(R zF88av5C90YtO!FB90U&Jh?#Sg!-eV(R6Eiz=(1+VUAiC{dJ@9@vEnCEQk*Ky+2!h> zD_Nl-8zAmI5?u1Tf{)|hbohqM7No1@|AB8fTuQ3U4b#Ht;^S+>w~HEsZ<{oTvP@Na z!}Fo%!_s?*5i-2K5^}4nn0L-0nmy5VIC-gVAb*Nh#8agSa4 zHB=pfdvtC?KWc8OdR+wU-hI*8cj@>J)WuAV8Jnt%fA*alK8&$OXs=${sL@Q(P{}`S zE5CVK2(0S$y!Yh{+p2E#r$R*^(m3bW)#>%p6CFAi74>h~!MH9uHb>ob<2zmgugIeR zbnl#NTc5eZbm@_hrc^w=OdIh{tIW+ZLW@IoK-*u3OAFBVseXCEe zzLieIQ4f0_9qcLg*@*S@$p*QVKCG)x;Vo+DQ( z9dyy~9xwUOn|WFyhqqUTqK5oWx}X-f+VF_XC?b!agq&GXa06e(&;4_2WM®~o53 zyM+Hib0>1y1uOvPizgRu1B5ww8(o7rq)sczcz!#jGC$8o)U1@)Il=9&SlJ-oZu7;mI*JnL|zB38- z%Mk8qpxUIdM~D@xSAm(W{?@}4c7K97mW)jzS3bQM7*P#saVT-*He)P!VtnExQhs*;`#E z>5=lpg!BZ}oZ$}Q!j)+1ZJVTYyp0ia#IMbyZcpZ?)DN;*LB*a}1w|x4aBm z6Jx&$xMF_<26QmJ94*8-9j?JXIv+Yx>P)pd(^%8!=f;6uqJu-vWEl#(m1OkgXv`Z3 z$Pwd7e|x55%8uD`h0`0B1uc?onaTH&7vLLZesFc$)X89t;65IK?I9YxVhQr6=h_hujBBtzw7BFs!(4pI zl-G34{z_t1KHcz0G*(N09G@hrj~@>RYT|flN?pv1f08Tyuges5Y5fybktV9X7OR@gAiR9r<%V%Ajw;%6B{g0tV^^6 zthRgcf82fDCWkrJjGUB&3@10uHCWQYsa>#jt4c?mI^}vXar3;iMH(cCbD_c51np|^ zmAFxz1hmUbm!i)mHL=yzpstQa*Z5+aE+#Y4M@cDG0ZT< zWvdkzUUzpp8`s<3a4&@DfK;MA^RxV^>j!jiDwC5nLIV#_d$aH8_j(7lBf2IdUJJVM z!!^)qx88?6{Hb*%D7?0?p;&x{RNomh?oRbi+C(uxkp{k}hQIGe`jCDjoGZLmW^$)m zMcRJiezfj<*@vPp!NzLOg)^yIn@nc!;}hr#Kf%ctzA|^e@lK?RUT=&t7|NTl&tn^U zOr`A&o^RdLd|6uBK5F8qB4bpBZ~VHTjQXPRc#(=P1`lQXa_gBVg*n}O>^FAM!eBJU z(7^~pHuRVTv@ot&^QA!GAPmlkDH&ea{QbX}UUi5VZCNPO1Yb;+|_#n?Fhj|C)DN=sNM7KX7~B8jy$P6zEAUGC>z z?d~3QGC_N%24J?-g_42jVqC4t@qn%XQM^lZ*QZgm|Y&MC>deDB;h# zF230sRAdoWM8!0b`NlPts;c6AW3eo7ZyVR8_1vh?Cw3EEB@ozMJDWP%!=C%pH1`bZ z1SC{joyHYmq3x(K1$!tJLvQs`p(wiEYDMFZ|Adn3;HFj)(a(*E(3$Tcc>U2vu8SdC z2A;Oe75{i)8L*@B^fkiCFj9bdNG$Ivj?@u9_tzKco5^VM!K`rA;iIkXfypO( z#W!;Culy%^`~sFBYi@0HO&cmom6V#6>8z+wvJ>H%g01on_wgQEtVr!YRU&Y0<9hg{ zqeVj>C)Hfq&j0^f+gbvTJ)5(=aA8)~aa}eZ2tG3_nk!ygXZ!B91EW-=JGnglE^1-q zPuQ)63m1xZwbA~3Rbvcl`naHcZ=`5WNkI15Ami)!tzz@}52lr8WtqRx<@~84#9LG` zA!Q=j_5#_K0$jS_6R+cQhVD>0sZ=;AlP<` zD`(ml7?D7~KgOrOIs`))^FjZ5Jk$p|6Pfil(R;5-$iz_}~C))tzwPhmj{ zoRqSZH;0bAeQpY3;J}iVc$&r>$Cn@p&K=nWBe=E&ZBs~)1P6gE`O^T&js-yyoXW8z zU4{<1ciurWapv=dpd*pmqhYc7H$ zXaKS#?>Spiwb_9n2|9Kx`7TY`{X38X%`}#pNV_d})n=pYW)et(1`kWVF?xvI1A?IC!h-(ZtN{a3p!LC0XKCv9o+i+V zV5wC;LwpHvInXI!K{sDJIN%$AAlS*X;BFdp=<7ic?73O+ML)+59OS@$nB^`Ga*w-X zkOaF{mRvMuNDm8wU_;4*kpBQ^Z!bX*?DSaBI0(ks`#z8a+cB1$E*)6%adQTeU^B&% zpW8@#YXy>E8^n@R0|wT#H$@-_b|x(N{UG?bPXS4=sbI*#+&wqYR%+N<400BiF3TWj Q2K_sLelSnb{|-U_3juy0{{R30 literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/LICENSE.txt b/internal/2.2.2/1/LICENSE.txt new file mode 100644 index 0000000..47c1846 --- /dev/null +++ b/internal/2.2.2/1/LICENSE.txt @@ -0,0 +1,17 @@ +All files included in the Toolbar2000 archive are Copyright (C) 1998-2008 +Jordan Russell. + +Use and/or distribution of the files requires compliance with the +"Toolbar2000 License", found in TB2k-LICENSE.txt or at: + + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + +Alternatively, at your option, the files may be used and/or distributed under +the terms of the "GNU General Public License", found in GPL-LICENSE.txt or at: + + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + +NOTE: If you choose the GPL license option, your application as a whole must +also be licensed under the GPL. (Refer to section 2b of the GPL license.) +Therefore, you cannot choose the GPL license option if your application is +proprietary/closed-source. diff --git a/internal/2.2.2/1/Lib/D11/TB2Acc.dcu b/internal/2.2.2/1/Lib/D11/TB2Acc.dcu new file mode 100644 index 0000000000000000000000000000000000000000..3abd61adc30a2b30029ce13af53222f3e86785a4 GIT binary patch literal 33790 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 literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Lib/D11/TB2Anim.dcu b/internal/2.2.2/1/Lib/D11/TB2Anim.dcu new file mode 100644 index 0000000000000000000000000000000000000000..3c4057330c733acaf58b27968e2568110f5b0e8a GIT binary patch literal 4581 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 TZkOl=LNj#Z;zi^RLj3<9d|ShR literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Lib/D11/TB2Consts.dcu b/internal/2.2.2/1/Lib/D11/TB2Consts.dcu new file mode 100644 index 0000000000000000000000000000000000000000..98b2bed2239964ee7819aec2bb4f4d140a23cb1d GIT binary patch literal 1613 zcmb7E-)kII6h1qo+wHP#V<|MGDc(|}TTGYQX{v<w z%)Og5RdGRIiYO_fh+yrL&pwIZOCgGnKKeHl3%&}1@!UK6qur|LJRIiEob!F(Ip>=> z1#o0B3-FWl%j2DU6W|?a&Yi0$sg3>&vgJ6B$E!Rk3CVuxoVn=5$4aHuhH58_ul6%b zG1c$hjm|@mZES19HvrbN4RM<cY`P5M$z`ex8fgJupiOuQW%6kP^+UxDjC0a;g8qZ^gwn8 zZhZIg&mNoZYZ+nFgUTb!A8$10no31$G^xvg-&$&$rEpHQWuQACL^zX!$xI0#=PmEy z^(?l~O(z1IBf=ID)iy+hB%yMhgFp5dCgxn>LTa8E9t!5owfg8f+tSS_J;_ zC-IhP!lkLpO&W<|$PX;!#bHQBrBsHj@jfWt7)6+ph6>3OE8c9!oJ?x)pFz5-f^YHU zvNH2_6hpdqEXk`#GAq*|Y`SbhwN^|}Y?PQ5CpzX#gaS`)QcSg@fOK_)78d*yNL6X^ z%|yvMPHIsle6DQ_TCRoyhiIoP?LnlqX{4L?PCD+zD=U|THWsAH!wQX!P;#jLd0U^y z`XXi%n|>PH{uitDYq&?X^{?f9`eK^gLpX*#R293Kt_4Rn8%1jCsbzm{*%$24NHZ;P z<4;sX2J49<%Iv(*{{bhI7<4Ata@vSW2*v5Oa9dq~)ESn$;uefw7W!{lY4JDRe{T6J z$e-pC=8{P-+d6>ufQblkXQb!Eu1$1LFnZ)@*OI91GTq?Vb%PJ@>%L`tZNRAMCMN-^ zrE3xIcJ+cLaaS+elhL;3!~&8yQ89iq_!(&D8O;s&69ZP;H4mEVAKAaL>`VWjy$6iS zo)lu8YgN4Lm0p^MJQNG=ev)ASd;&oK0&KAL_5c6? literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Lib/D11/TB2Dock.dcu b/internal/2.2.2/1/Lib/D11/TB2Dock.dcu new file mode 100644 index 0000000000000000000000000000000000000000..28e04584ef5fb1331701b230622fc819eb5a6bf8 GIT binary patch literal 104946 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 Q8<&H!8#0)<3EaBY|4T8bt^fc4 literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Lib/D11/TB2DsgnConvertOptions.dcu b/internal/2.2.2/1/Lib/D11/TB2DsgnConvertOptions.dcu new file mode 100644 index 0000000000000000000000000000000000000000..ee230c769284b104974ddcaaa30e811c72f0eae4 GIT binary patch literal 5047 zcmeHKYitzP6~1SK*O#r0U1N+PJjM_M1!n`MCMdBg>|G3Q{Hk|(mIlT%cXtP7XErml zevp(nY1Ep4QfS%;QACrfN~<=CXd42JT0}*nRB57CY1LMh(lk;FgjnSdYNM)xo-;Gv zoxw)^*IyZ}cjw;kyXT&JUiWx8V|C}|GWMpizJ1~N=|wCuFWuRiw6jLSG=_!c^cNh> zH0#}wD+MVd{>+b97AMEW&clY<{hpwzsRNgCWTh0pP z;{fGsb2Qx@R3>!Uwh72CNGHsE!8C;7#J3ex*%5;xtD(|k@5*a$X6FUq9hT;Zl!KH% z5VR-&rR0oApwgR172&$+Ix*_f1H!UV7zyvNZ7pkj)YSC|Dzn9s3pq{kG(-P7mPwkS z9r1|%*k6%0YuYcopPe5>60*@zbj*}?P}CDR?>2By*a*!dXmJR__;D;*Glc3<<`bnc zM6m=O&~wB>LYIfoqV1UZ4joT|UdEv86dBVJONqGj4#WY|)+ll%A~gg_NrBp!V>=A> z9>SVJn5i5X6a`&YL=s;Ux`swvNwm9zv@OE%pnglsYDOCoLPsWoXWz}Ei zMp6uGiXfsGbv6l(%5*9n^&6oz&|A3EP6Amn<~vy+swPY_fWT;nP5ZExP!BaX)D zP{=p0|MB`R+&?g%wB&4ep0ejH!sZ6C&4xUr3-#9oGzEb!-IN{7cJf#Xlf_N5cZgPB zqM?pcvHO>42<_Tys^b0dp18)}^REQd28H#>dGWzCL7iGsBSC*BWPXWHl|)0EdZ%9X zr|Y{EwW7TfptN! z$COo}uBQ2rE&EJI%V-J)lxeJ)CUSr>z%%8&1TGAU{6bM!W8Ij{RtD?GeT0WjGALx# zE#zyb?K&tPDPmc2{k)FQ#X-U4Lg2^O`f0LDls1Aw?(uTai#>Y-!6B`;`w2fN42u9zz?lCX6u6{Sm<39Dx$5-B`w9VX>jU3w zq9LA6cjCH04^5?foaO&KduJV6J#R*Mf;}B=iPqmAiMMvK2DYksMpk^Q&b0}$Vk{bYr{Weq`+>1^PP3&E zP1hw2dr`}goScvp>PE0(k<5%FOX*%Lc)h|XN~R^H2h2jT;Et53?p4ALi`3#E69VaNd{h$OnW=q5|UzrWK~HN_mp(GUF0049|JG<>X-@E!*4QlUydrg#sN( zl^oL*hy&6S#c7u0N_TZ|Ylcg})1U)v>H`Z{#IQ5R1Lh05aD?3=jhRKs&Y4Bj1X)^U z4A;nxByce1Aj%?hP}}=>HA2r|DQDQ%*-#-6_f$J+)1oSU0yY&RG57%C3X_D&sNs zLG|SdIDYfDD_F~H@{XH)ELQbI^(pwLw`)t(O~G|6Hs?6be(cXy`vL035{uQofZ)G< zFjkH-M1G9Oe|)6U}-lfC2g<{?T&*f1SI$_fNk6w*@NL@6lrWT#J<>Ld7vKKM-;_h_JB# zb$2e{_JTVxaCnA;%HbXkCpfI&aFoMo4xi=F%3%YC?HoEeJjtPp!%hynIXuN-4~JtM9_Fx* z!w`pWa`*;^42P2(avb_N3~(6akmm3ThXRL<94rnFhhYv6aA@anki%mfKF47bha`um zIc(+dc@8}sUgGd7hw~gxaX7?boWpY*p6Bob4li>!!{H}YaQO^O?u1`)c#Ff^yy_~0 zs~hO-dVAGm6eeT%x$Ct#k)MA$T6JR%+-QVr3*kmpq`tN)G7GL%RY#7oeSq1VylRGY{DNnV93j;|KUi1^j6scC2YhKZ%TBe2(j*{C5uJQH2h4LF@y z(o3kwdkHAEs_ISO0qVwl87iO};!?Bg&SlO@w{UkWlS~1Ku;?6AXU_J(^LgQm$kx^e zza-YI4sytprobKZeQx};+|o|VZ5f%?E9Y?dXwjp7=}k||Ug2~(rXc z20N{#=+u*|qEpC=TFd0XcyiR@_UkG8v67W8m8pjQ!O- zLF+%9R==!iZnJPKir18V#OKXrCedJUg{a5!){NzEgcDMc0r!rQ>ck&9tcG0tX6QF{ C5*`@< literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Lib/D11/TB2DsgnConverter.dcu b/internal/2.2.2/1/Lib/D11/TB2DsgnConverter.dcu new file mode 100644 index 0000000000000000000000000000000000000000..ea33e71cae02581dcc76270063cf5e8265fc0b60 GIT binary patch literal 8726 zcmeHMeRLF6mVdAE!AsMSCL{r3gpPSyAPD7`vt*VAZ zLEC}M(3Gf%xX6g3p84=Nb7ps4mH06;89@-oaX22-jN%OIW>yr=8h1T&IG!xodtX&| zs%SWK=Ksy1yXxKFz4zUBzutSzOhU>kuOj4_T)(6${Zus(Ji(^A7A+<>EAnPZ)g|?D zA}mqMFQ)ohTH8Ny{d#s`(gn~eN%h6$@Q3Le77NMgKHu7al2XIc+B~VGs7?F%tU3}Y z4)kie)J;gNI1s-_S{Wtq7cFe=64jZzUpo*T*P+B^nEl|FQ};#31y^p^D24T{U;OG^ z%wr9FEpaU=>fx@JTt{}qCTFQDq%Cc-ri*e|I)p%Z7HCx^DU0+25-rwrH7>_qzW&}H zM_rAw77vV#$F;%aF-a|XBKk&jT$7?CBvJlm#z84o)G8)4NjrYve5^32rligI#u}D` zaC3L^^YzI$tx=;E+cWLtld%$xEq4x^MZKQ$PHb2v%8`WB8kfaHqLZ# z>d3(#Ps>h_P}e^Hi>0wbe@|RThsE6X)jf;rWesgwb3)X#y;Jr-6LU9oig8Wy_k^XS z&Xt!o1l3+^HdKSeaAX{WqfJJo@V+`ON0coZzB8bQ^mqaWvEo)m?H2WiublncXo;yY zuE@`R^G;37<;#ux-hEz+d2&Nvvnq+YbiC@*S3om2OhRSTg3U^IQjsND_l1%XVCj@% zafnFod*a*+u?ic!T8-;cKnIo&5URF80Wm5ygWqz~eTf`p!465)Kp84;)UOXzs1 zM_+^-j@1Mty+c$%x=9Rgim4FT$ZBMA1SQa=Y_USO2Eps?bC}6#!KSTZ!qkaTyaNRs zzG;&;i-|a9^uvfvwkrd_Kn(SL2slCyb~d4L+J1z}>@ubSKQigr3mFL*N#%%8X zIS;{E+m(p)7w4QHW6gOQ0gqkT3b9-I_dG>S@s>C$`YR$>e>??z*qq|vQ*+g|g8&wG zt1CDC^S00Cg(F4SnxL&ji-P!8lm52_QFpL8p=g%CZx8RG$SMoGZ~z z*n4Lo4DlG#32-)Tu0^oS4lY;3h!mNPbcZijD0(~^4@0sk^7VNtJFq%TSKfeNm0jhn zDM{_ceOZk{Z@Ce1$4WXSF~YZrxp}j8N_VHAW$`%AL-b0!;;|-S(k6jZ6U%At5;dgpi`0|-xnbcB{}9rND2sk_$CA#A>(}>O7h!?IDBh{Qb)SO0VW*| zK&iZ0tQc=bz_IqmDEJdnA95(g8_JeE7IUZI8cdcRWPzSDwg_HnJU;gz=5PQcxR^@l zW@f7QBJNlxxVBXZr?j1U6K4@AV%25_SsY8o)(zc4Oc)3`GHtae>&;#9MC5x??}LcW z3I@WkTPMJ$wjH@KvJuu{Zbg{qFHK+aX6%|vv*OOpRaiak5b|C|ZH~81UKN+N^dsx| z#$+;KCI4qr?>d0}aLkFgmR)FQaahE|>e8E^-xHf;=iqMc1(xV|8@X+rZx5WJ!yqDm zvX+g2`^^DAvgGvhQ_Zv~g^xk#E`@7VfI%y5m*f<-(vl#)wZS2M-i*CZKn7-q=1B;S zNI&}SbMwGJI~~~%B6+fdY*xqp06>RE{!brXw*dPwzP}m%_7Cx-sYjZ16%SKU7F-Ue zwAE5h{i5xYScxx-{l`NGnq$mofyeH@_QqV^S<*g8prDd$lOs}3 zUEj>}Z~%o137QCVOb7;>Oy?t^OX@lf69t=aK;QhH4>g;kq5apTA!F^_)}i)H-!?Hi z5s*M?L$~FtUq}4c#Y$1uMtpkF%zGhk9W+bF(2m=G2W{1%9n3Zz_6AG5}ndG#kF%mh4)4PG(p(ImD zH0y!SX1)=dfK%s4k=JNB^jt>}u_H9WeMdGokN-vW7daDI{Bp!(xBv`c39e7^`TDx7z4EB;Ubn2*p`@se*5@hr5fcusMw z5*LtyiA)-glex@03FiL>n4+d=(O$2t=w7&TW(B-(54?7k zcCC+iCpi2VC3WY$<83JvCBD<<3J1NkxssF>dkfJMQBr*(T+1sy``Z#fed8D3+0tZx zSLQ5XI~Uf~6b7V3w35`3n&N;24P31x#lls^W?!r%m4)Fa>EeQMgm~&oYill!t&i(7 zw+#qucvG4@j;h_4RSoLevg*9~>Xc-!L)$;0wioT%itUDiwoq1E8Sdo{k3k}n$2|)P zIH{7jUEV_UKqZ-4d_Ck4{B))2>mi@q{70JjJ^ZMgCipuI*;oT&;irV!OB5mg9z;Af z3>hxmOc)_``^L3K*`EZ$%E|90ye|~dJr_<~L*|TcmoyD7h`3D>*YpP_JV{fQwR6VX zJV#vKJ%IIQF;{cW4FEj@&^8P5d2C|b;l%Y{Z3R1@qz_~{O2>q=3?XFb%QBSY@&IHP zBb2eAa0{+xekrUkT?#3C|I-b)*2KQ+mgCd*R|xMNln?_x`1dwE69wk`|9}5|4-}A( z!DH*W$Lv`W0SYDd-00#ITSgR+DO`VECRB3r#o_mG>R8P4+Ov?e7K1u256_0ai{#Y; zAtB>jzz8v;bHsQQR|DUm?@@z|-nz)}GoxX|*w5+Pk#2ZKJIjp|w;*!(49;uuct#(6 z5Jq>bI}8f99~lVLAJ4Q8WZI8p+6Oc3r!ws$nb6l6|M~iXP}f12CNerVlJOe;^IXZY zzJbyQ=K{GQ<3D}OKg<<}hO=0|!0NBv)r(wEnrP5%$w@p0)6 zFJ`m<9EbY`?kfbCrnh}TQd7{zW#?a@&!Aq8XZ%BFD=taSYA{Y1{vpl_l+u^e&w;2B z8rs=3A5H0)>p(leRXOH#&rL+H1VZVdj*Zdr75(VdF}U>Qj>XR5cWpzXAqcZ%nwIfd z8f*y2eaAjL)UX~nqnYm?K+Djktz+PXbc?dznYL_D4`P233UYFoU|=Kf-k}u4}jd)GJ5O1ECR9 zcjy!v3+Xi#NT8O#)(_miW=$mH>FNSC>1}68YASMthKyT!GCOf53Q0&XP~2h$v>cHz|@1;t9x)o ze6eO~uNn0ZkG7vK?fZCSbTsF;pTJ^v`v+bH_n8?EKCll==Ucw};11)j>kb1ao@&q+ zc(TDKjM!zhFd(6zR6tFXSnHM#t_)8yyERu({eJ!5o0qp^zUl3s)gwdxkC+G_Hl-Tt8t z6vmo5b<}?vYU)(|@&3nPk=DY@W(Wmk>c&uv+Qy? z6Q17nF3B5(lcrZ!ykYYM&TC-?m*W>fxCHP+{v2--{=-v~yj#S$?(_LLUlH)N!2j6Q z!1E{-%$*W<#*HLk45Bwy0%EmG=z`nLeBwJSEUX$9*1?Uxoqy-nwF;!5y*k!)$C`DA z1FKd)0}wGR|MMK5*IGYnQH>9|NPdQwSiAVyfty#P-n;A0JJ3k9Z%)p>QCtj36*(=b z2bvY4^Xm?8$3{Tt;ckBcalbDR`o7?$e-aox@#Ep21B@-oxltMo%;PB%|vYeTvbi8GV+~ z4U9$@{TZXrF&bsGi_rw5FEg5CRAp3Wbdb?c869HuEk>Vb^p}jj!RR}To@DeRMo%&N zXE&_y9=I0y;4(7@Zd*;XLSS^7z}#@B08h-}o_M^@{khO1Tq(?Ue^rxWc?MfI`3!U?YV0lpy5bCBD_2DB8 z^og{|CA7GN`J07>8)57b=7JJ0SnNjm_qn`qW(7c&No7I?GNz(nHcVd4C3XuSf+QDM zyq1&Dk`edf0_JWj5QK9scc@@0_`X%x2fR-RRq$?_TkaMMSi$f_;lHOB43`OCmlxrb zb(O;0YWLk>-Q6Jfi7-(R3##B9=Wz>#KygnH9wB>*g(XBt3roKe$ll`OwgMuMlOg>6 KU@?9VivI_1QBTVN literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Lib/D11/TB2DsgnConverter.dfm b/internal/2.2.2/1/Lib/D11/TB2DsgnConverter.dfm new file mode 100644 index 0000000000000000000000000000000000000000..f684c17f209da2e10834ba14db6c65666b920583 GIT binary patch literal 795 zcma)(v69m;5QY_-SdN`sLPbI2>PqHbArbLhW|DKp7F-F6y?60gkus73xksU-ypEPP z;2C%iYLM;V+;9!u?nv7I)3?6^MCptqH}B^uou_eB3{-j7zR%19hY(#PydVmgfkYLc2L4*=vi=6X z*w;S;5X7Q`!igYUYQT1`+BM~9T^@n!HK>Kix6a3)hB(EKkWZJTHZyq)SD-b!hq`U_ zIeuf$@3#WJ^t_XqM}((#l2khMSXGeVtjD)%e;AFK}NHMz6{qmyDC85!Bc{YElX;OC4^$2dNN HoDk6;D60O= literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Lib/D11/TB2DsgnItemEditor.dcu b/internal/2.2.2/1/Lib/D11/TB2DsgnItemEditor.dcu new file mode 100644 index 0000000000000000000000000000000000000000..c2e0f9cd1190018000094caf8049a1f52119d4b1 GIT binary patch literal 34914 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 Oqv}lB099wxJpUI6>;|U* literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Lib/D11/TB2Hook.dcu b/internal/2.2.2/1/Lib/D11/TB2Hook.dcu new file mode 100644 index 0000000000000000000000000000000000000000..4bb35e97ddd4037fee64b9d5af8c1f4f042ebceb GIT binary patch literal 6326 zcmbtW3v64}8UD}B_4SQ=Yr7%!LR)1{mZl+utc_ci(WtUxJ53-Dlh_UED;WFQNpWq< zk2ZxCyoG2$0|_fHaNAG>WS69Iv&~0_#{*GQ9tsYddzJ zWoVXs?|=UPJOBIq=Y9vEWV{UEWZ2TQBz0gJa9VeBLu({*qZ9DG)cyfk;et$T{(0DmG@7I|k!XZ^Ae5 zEajSVTsh!Ph7zsbus)B;e;HNV{{P|ZSnYEFf984f5D>m$WBJ^t%Jb{3(dUB;td2-nR(XtpCVZi!UuN6%S&!_fDIq^dy(~fi6$Z4;kw{4P zhR=Wd0XfJ!hXxaDPmx1r@}Q>08;Z;E7k@Sr(7GZRf*gC`A7%Fhd3P)+??84?%BrWS zc!(-rVD0t}#${X3I~Zo}=rfMD42H3!yC~1+*J3}kg{i%u*1BF!xI^(j80xP;LGNJL zAK4j4@A%fud$+U4)9z*%-qY6UW^A3y z-s|dNeX=Fhbycvq)!uKjyW6@tpV;%^s-T{BS*JXdpiS%?y5+5eM0&l`-Qn!% zv8{JLOIeFIIJ^5@?KXEyS9eE$Z(FCOp}*7pG!-rCkrSD~RZn{L_wLjLOE5F`WGp6! z6Yc@5pTEst{>f+W1&#CJ41I|wJb*41=$U-1d9hCxG25QRUXg#@#*`PwXg;JsA}08Qu5Su5_@Nk@e`` zfy;j6#5SO)dgo9S&(GtOlL6TL{zvlw4ml(zl>FdR<*T_EuZxdZ*(DDDcU}IB)Ec?b{<^0NE>3{P>ygK5VWn&ap?~mA|~+SouA!epL%p!J53HhcVP#NfW*`d8z-Q zZ%uyo_WG7D97xbp(Hr*DX4gSAO@RiP&2F~f(DB5aWmPh5^Uya_KrEo7pcW7TC*)T)ZA&!Xm7E30*?uC{O>0?+^%!|HN%gGf_H7Xqw? z1}U3J+MNO{gKaB>j(D)c8*PRw;l>(6UZ50;kzU60r7&E<)6`dkV64E|P9oUIslDdm`PgzglTheZV&~a>?1R&H^EBq z)o3xT8PjiY-`upSeI}<)KUbKH)_4AYt=m@UsWKXyJ3@=v3|C?Hj9F$}hU2%0~H_88s%u{s4&Q)Ovhm7PE~VfV#KM zVzz;?=ECJ<)%95TMFpO!M)@soorfoj3XDo~Mgg^(K+qNF6U`F6z_RvCPzQ6?aV21o zm^RT@Be5HJ@Fp+)WJ&?Oh+(wCXa(N^u4Zm%V$K0v6(Z$-VgHzL2jHjWApWQ5>IUv0 zKzS>O4*^)Wsb@rha;PZ6VIhEoWl|4|0D7d=!yRozuU%6 zwk~Qk*@62r=9#9Z9dww3@@iF7y(IG%tjLATq9pU?L-$|CBfF^Z{vZ@e`SdsMj{EY( zc7fZh;0i0ax3YahEeP}OsGR8{^_HSVVLXmG15kL?sCP`k7EU}A5mSy6Z8p&+otGZj|hg5BS&T?x_EDs*W6tT5&Kb(Kyy_YF9lrhP2LD)P0iIVpGYY@YFz!jG z&TDsShu^)`@UTmaFQqn0y6N+3#GpM%Ib|4krqeyVWpZO*pMT7FM)xt*&h(|7GwF`$ zaC}lYHueUT1

N_ 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 I@gMcTUuGJTwg3PC literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Lib/D11/tb2k_d11.dcp b/internal/2.2.2/1/Lib/D11/tb2k_d11.dcp new file mode 100644 index 0000000000000000000000000000000000000000..cdd2157649d1d6d3201b003011c9ea4bd7c2b1cc GIT binary patch literal 380719 zcmeFad3c-El|O#9FW!ygB#=-!jf0aWCU!_lI)Pf2p@g zLX)zFVGBziU_wjU!W3ExVW2}77(z>dPHCZqmbC0`rqGraI)wqs^81{7-&K}u2ikdl ze|*hDuHJjjJ@?#u&pmfPr+?k1=t;ll?_g^Zo$L%G?M702QKs~Xr2Y|kn6U>o z=?N>>cCcMa!hR%-mrfYSj^qn@#{RrTPkIfKUaTaImrv?XCQ*aG)YIKN+QA+`x~<^# zn)2zwg%o%_`U?bnj|z{ppv3)KillkGLAQQG9MEE7KtAznV2n8GTtbU3}w$^?478dd~16rYf+N_ zxMXskcTaSHv7MjQ(>>Dx$yL%lUNW7Jc?8IvB?)7`nblbwik_FN}>rbId$^RZU7 z?=bdp#_E^a82bQ!)M=R23#v+=_yV)98CAYp<&oqscP(3O9i7wKdRigd|TwWw+Og=l+m!^hF+XGt@xsPA=-5b)b{;WJwNab$)^PFqb&U_&! zk4WG8#Am;h_WDQia!mUkQDE&H=;%A~sFkwhjl@yZ#a4<(0O z$T>VB7Z^)!tyGK1)dR60eXJwCrG1C!?Hw}kY23q3G%=w_1 zG8O+0ds$_>-7?QzX|-F9c2`-iWP6>~HO#updUB9m%~*o^%J&1tzT!a#5Mw~;t}@%y zRRkvWl%I~Z9cfQ-#rw9LnMxMU`TaNln07_7BNBR%=lb-6X;&w7UMey2&c|*{rCnk4 zEh&}b5PRoDA$8B}7we|#XK8mJksG3Z6n^~0b!k_;Cso**9s2d&aD!xz=f+Yy9=+i$ z$sQV~j)iXI_UH4mG?E(PU$$T>$$vPy5}AA|Pq-yIr{s*JMx+AQ_L93Jf^Lq8+(V6< zBxf*{NflC@NCk(82$Cep79J7gMH+uz+B^5jeUdXgl27FXKO&8Y;AuRuRKbv2HK(b? zaTJlpKQt6grLSo?BP4kQODcVlTOgA=?Y6IjE|-`H>@T!S)<~A;W9!TD z`c2z6W^+Tm7r$L6)pW#j6NWZ8_&_NX~;@WJ)Y$;3mYDNSSe#5QCPw2 zz#hnsPVme`;pvkDsx-ccm@A$hmqe6cGn0Gw#xKoHyEn>1DMEOuc0rR)yI0WemL<{F z9x5_qa@7e#-><1myJN%9*O1)wl@ET^sIeti$J$gOp2;7qXIsBm&jp`_7lD*KUjq zQu%-t>Ww#i=fB$|55>jen{{1r_tV`SDJ$dQVugtz$s_0LpwkZ|UmQ3Xl z(Ss62Lp^;PLf;@ZyhyJgTz13jS4%bh*?eLBn5;&&x1aT0sU|4rM-zqQRt0nCfvXpS z)t*5?h}U3M4BAj>7ipyT^yU*JM<^QYi}Gw{3AIBl7L`WABSUfyKmY55-pi#*p*6)I zA?jVUI&WfWWXFH}?^%%6b)n5%S}UU|sc$qjvMx0d8V}s}vQw%f*kE8FN|HD@5DP^g znt1**QVqqf9|%P^4{q>B210^M&eC9PAP@+}Vw|-a5L`c&%1xlZkEKH6>u+8*EL9*f zkjds#$c9T|gGksFj)YKw@xiXXf!-h&31>94b})7-Cr`DhOrxk5NeyC3*`LTIhA~v+ zFw0A4&wuXKSEZx4BxkT%NDYO?lUoxbQtGll{$iz65zbRBg@#896Bqnf?M+f8MgT45 z3W})!l?;?P#qw_9#Q?oU9!a5U-#@wchms3jdvH@<^d7Z^sVY0O&LHbokxdJ%&pD9=b| zZY;mm*|5u&b__)Nde?G22L#SJGASwYkI)=_V>d z^15ZuKzX2)yajF_J14+DJI$YK_0NX2QGby7icz8o7;O~!z`+9i|9VI{}0B_p)0-)wrl$KEsJ;sb;qVXP8|Lj}xcxY4nFlAULz)C(8{V+wl zf`LK$;OeLXAF&>PBmyj6QV${o@4T`It}-kXQ81S{E07qaHOJ!oRXbJIuwGJzmka-J z$5$m!tYmR;Q542RFb6Zb#D8&bpig?uD8xtc5&z?k{ zlp3!WE}~Vz_+TvDyEYPvgnL5@OL6qX{%EKxylI&imFWe}h5)1@6yqzx&;n?vR{Fhi>-(dqI+1v1lOB*T4CS z+`79Zx6p{e0M~{Xzc5M8WBlSuwK_bq!@%!(%`KQ=DKdu1#X5|~{xzt4%!kEFQyb$^ z-(#7Sh#c?zQM2S6!(4Pl`<`puFQsea@mwN_HbGoy2YTkmH%5Ocxs%!9WFfPn{i=H= z&H!H!0&16I+BY39HK3B{BQ#zBIv>DSw105hQ_Yf#qWi`QXWw|%ZE1Hrl9fmTcHL)l zN*)@}=qvAxet9dvd2Zh-ILvsif7eUi$KxFvoFXC2BcZglY{*cf4r+N+B3K@+`FQEP?;#y z7L6(!AH1ynmr{)wMS3s-4+i~l|L^|=C8Ft7B%4fRQZzc8m^`>$szVe;o-J7{a3YC` z>{x+wa!jNz;Ku+I4u-n?1Ccm-O*qgO4E6ihhE|h4!8C>oa{yhdACn<2K+Zrv`gT7r z9p$AA;uz@p7^NyGZKBf?ibunN*m2Z@Jv32{WY0?Fet&U8H>S6NOd^lf5~jC~ctp+@ zc6f5POU_pQd-Jn>A4paFXDj-9YP>If$Ks2yMiEgM0dA(xN)>}vLU$TsqN!oj^uJS# zoqAiW{ZJ%1Bk)u>H!WAPKF9)94qmn{6NpOzrMda(WmXtqMGKSG~(Ev>jps^YozW3WzVbHhBR z3T3k>mQ0NN?bi6`Q9z|Zs8ZeWjXnJdEHgG-c*8+_DWGRhTG=SMH}*i_G562??JtlT zeCd>j%Q|m+*m%u_If^WqHk3k&tT|>Z!HE2a-dM zE-+2i?i91#XHRp#E7iuuM=K-=E2+ZP_SyDpq&h=vcM5B$!V*L$Q|_J~F$JQ=i$NLt zBVm8+_}uRgD4(&-y#cQCs|eZ)Vdj#}2PLnFipBf-`IOm%ik!d(-pJ7Bulw1Lk}1O` zO_`muV`)oVj=<6Sgcz|>%fhBTgTOfFG66uFJ`P`-n&*vH32 zsTLS$i7`i^Mk63mQ}9kO;3;D#^oWw(IOL^ljT*Uy;7uBj4P;8O{Yl7GEPQH+w@#;l z3w5NQCVk0LFE!8!VABL++cr#ppiELyj(V?9GrV|W)2O8=MbT75tq7&IK5oFKUGoyy zVoTgut*9ItQu@+8StQBkNcBO_VsJ2UgRUtU>M&$cKBd;d(ERO6^Yb``%E>dLLTph9 zi)Bb~(rlnHkO#XxW0`_Hnn@|;$Wu~LTw^V2O!w#HVGLXfwxQ0ADhpG1Y@Fsp+s6`I zM}d_Slpc%`h+u^_E+WSnxCv&*Xzn|fPN#Ay>_?8$u%$E=NA5QwqbKnlG*R2iN31L+#^&|sTb+NQjE^Jj-lnTvaf@oT;b&W+2=Svas??}j*1d2!0MD2zQ`BLxb zPGr)B>#i-%^Ioi756Ue|=Djyo5(hTXOjXVIi3saPy)X3OmM4y2NNEIQ)wr0=55+yOA zlQWKGVj4%=!!$u8oZM*J3T5Kh!6$#Cx_pU=KCc(QAuCK4<5|$aN+5lNWIk0)<_Oap zt5NKg^ach-`2tbmW7e2V|8bU^40(xitCKmkeK?wNl%~xPY=rPxo)KAy*$M+eR5vMf zKFi|dN{&5BzxXFZLTGJy6lzh%hPBi`HiA85?XMVNU4(I_xw1U7XC(2P)vNzFF5{^?w)cBJGc;SvwgVHnzwW*_xj%MT}Z;EhUY`Ifr zqUC4t(^;)!(7pqX!#Jx&AU?(@panct`zQ5zZk$V&sH+?a8z-?uoc*pe;F+qkH^7sr z_{o*}3E?#7zXcoy3$2c&!Z<#(C1S#sTxnRn?WRw)i5RlUj9@z4teTi6#(#;4OoOfBQbaHQh76950 zrCB^biv)mhp|^tFw;uKVNbRk<)17HIA}h$ zNZ-i3EV-n6NLn0XD+Famx#`^RGDIN;Jx--tKDI zu~EiJ*RzGr1umtH)9f>EHB~4L*99$9%g*pNxlnQ{zyjv1^;v^~G+XqVIXkz{tL5IF zW|c1srtbAw`qS*hr+s!xo@SZrP>m*jgh~Kc-~7_mf12|QF;!dK8GLL@t;S(J`wUZf zc*|$Qp-GyZ_PBu=Wd0foZBkAkzy96X@r4WQm8=Q;*Rw^2)~aMaFX?QtDVkRG+><63jqyM2~0)p@d|wpa@*3D-O_O~N_l^uI!&`~7kR zBFGudtnPvFkq3#svcdc5xWlTK*bTnZtp2SgXMZl0mdERv*QtsTk?`56-=tal%gL68 zQUe}{(s}C{m)4FlrRKX(Rn_J(6j(2=xPDJ&l$z4+$C9xg#OYT8Sys9YDeESU)JQyV z@Y%=4Z&8I4a?e|=ku7pJ*>G0U$WC?&*+Q%Jrp_X*phPEIJbVU1QwI<_aKnLD&o9`$ zY=NC(8rddylbsYxBXfH7f_qVSwZ$_RCHa-(GfJ-1fI53Z;`4vfncdfoLTGuT29&(5 z$>xS&DxH9)Fip(737!jp6M!zlJPZYOTw^hWR#K@Uz}Kv`9cMqYWquS}ZKkxu z6H=l4xe33$*7X~!{h+M@60Zp_8s4%l&AQQH^;lMPummf z9pH7drz6?YSbC1E5PG1qn9xzmE<4T@JNx|6U|=8={IsII5pocQ3doicOhZQBq+9hAlcG#ONtqa(A ztu8uCS@O)|DzJ!~P)-&hiDzE~N!-?QREaeb@*95b&EGtIYQqwP{4K%IK_tWqsgW&3 ze{3whSObAq_x@?(w+|@w2sMt8ORq<_u^zn~qE?-;9&3G~9@A{eTS?z6brDKyN^K2^ zl6YO#7MhQMemo~*RZzm3^#4eKGS^Mw`oBbp!)dmg*(t@!@w#w=AMrjM06Tml1 z9#^MOrLkF~d;UcZqRS;@^5z68F8J_g57b%rI@A#a(;K(e=|qp-!j`|*~*)pr-whYShUgz^?F1EhvRLio3Equ%86;mdKuLpc?J_Pc1 zS$>nyNV|Lv%o&w=nxk`gl>dC$XT#4lTl#`Qdnl6!<8Bf%_NAA9!Vi(g;A!n?t7nZA zwj;Fay&sd@mf6t%#7JKn^H;;36-c~v$(}E7ww`Za&YIk~R<;d_J3&(pecH6#om}F^ zwS(Spye~S3&0A6#SGK(9OpUP%o98INLFI%Y-q#z#S!pcpWtiF9eU*G;4T=1tG6~(q z7g3kBeyW|Zi+!_WXmQ_BMPNmD zU*fVu9B{X1(ylbvpb762*8N;x9aEGZ$BBVLMx4+K5jl#s&Wo@>oW>J>(9aCl#Ug7)FwZ!)^Q|#6w>)aC;{lQ}EAO+&^6Fqc6 z*6fMIx;75tV0s;wOKWolj~M9HqOjbpFq|iVQsNK$-kWPX&A6TrDwNhj%2Wx0N{dB0 zf=ocQo?w_O&=iog1*yJ}@%91MJ)oX)eyOU>){XV9vOaSw3R#%LBk%(mzCNbV7%jPYt@+|{Ny*q(Sdo8JJTyw=!7qNuz!SK&o>h)-< zFDm;%jnd_^KJ}^%gxp zstB)6n7aQrY<4ajVrA-Va(5+?sa{MsDT|R5P2TR6%8=m3EP=C<`(eWjWAO`i+9@M?vK#gVoOy8LO=>IfSTpHu-45cw@tY8L2P$+1;}b+N!DFS^TI11f2*B zYJ()ohIO`rd}vzaD%0sNlKpkhe;)t3ZQO2E_cl~`;Y6knTPK1JkQ!MFs$(t^io>wtNgGnXcI*Y8TyO87$qlx>_&w`J_9;yS z`1W1PF&YK)MNqmD02=#O-&Y~qxxR96gnCREn_SAezMieo`Ym?oz)*$Z4g!+T+HRS% z+dhw1ICi6~hRm(NF7?jkdOIGvjPi#r`Zg~}(cc04*P7e}d%v5xs}MJOCLd{>G}1t; zII-V_z9}~GoXp9R-DlL+VVXC3rnaxs z3IKP^x~O)a!6%eO-LESy<8=Ipch6-W|!qG%mp0(*3JV)Snx*j~3q7)4!Wjj;C- zj#q>8H=F>ze^Ug{<O=8eA@O2`(+;%<2YbAx`w1nx&QrM1Z5P8i8F7FnKgs>QSQ{ zYw6-RA{+Ku)~k{BPFy`k95@_M!-|9r^np^;g4;~E-4c)1+3ElR@)n$W7Iw1tY4Homdvt zz7_p~_tg@#NN(I)m3nZpd2B&dX4FtEPMZHK{5v)NQ4)EYi&R#(Y`i2j=^9m&*K0yB zXfS@-mYn6Sl#R#oQ)o=(cy3&Fc&laOxwDq0SWi=mGIyxn_SDM8!&wp&@s30vBq;fg zS3UKz@n9H;B?cyr`mCoxp6UYCQ=Ufoi0@B5r?l5jy40-+fz4t=E=sR z*`mn=uf`JBEUxt&Yf4r$>nWFP%;S@dmywEQemq&p9*8Ut~K&ZFH0S8 zoh<*|?@H}-b;uv>s#M6;X)5+K`^>yvPjUt2kf8-i@4fSCopk5Rd{L^()nyXe5@!HB zM~kalp7}MY!_HGoTD~#9XPXQ3oAcOyej&lb`-()B(qkFeNa>#i;#`wEPdb7q!Q+ zRsP3ci#pwLrnzTLz6!%zyv>opJb+AAOnJSj&M}gC)NVA0@c(|#qy~n6!YbPwcFR+C zcjf5_pFp?=;bRE*BYYI$0fY}BJc#fh!Y2^khww#&-$wX0!g~-}oOa6rgmnmSN4OZ_ ztq4~mycuB_;eLd>5#ES!55nsaUW@QrgohFCMQCx^EteszLbwOvNeC}M7(%!k;ZB4* z5gtG|f$%AWV+ao;+>Wr$ZMO^~T!~Od7)F>vcsjxa!U=?@BixN}Gs5c;4j{Z0;d+Dz z5%wT_3Sk)GT#wxnLfD4Tk8lj(NeHh+xEkTj2v;J!2Von+hY&79_!Pp$2%kmRjPO;2 zO$gscI3Jgh%E(e5bECV)Gs4jC4o_!x?7N8oKd~qZDg5{t-OZPNw+tQEq3Uq9dA+ z^C`cCOXEsJ5SOV15|7aAc1&pkq{v`J2?HKSYOBGan`qF?Hn>do8R9f6E;he zpeOKnD-81rp-tSt!fRw;p@dlmdip3P=eV(P=fg{Gndu|b$&c`ho}J=;)yPn9wjie` zlm+tR1IK*bU`2xNjN$EOKAXeJ`Dg3zKe^OX+mZ$!^m0(e@+Y}25DNxE%Gs}8(Q zDh2#h7#mR@LsyF!{>IxM5ApYOJTBJVw^3AXh8}z>DWjoa)W4CxmaP*h$tXos5M1^a z9v0S9w4a{uiPZglv1NDR397pv8za<^EkCLmmYg^h56U}M-S^lAZmNQ&ceo&@S_0s< zN2Yq0Y^m%bUwzrAK8FMz_UP4TqP1MPL=yQzUyL6ETyf%Ox?qrmo_+?l zrjpwnCp(TaK4wj(^nLI$PYL<{Rswpo>_ft%Y2m{$ChdP==U6f0#o_Tzam9+%vUV|F z+yakjMB<(Nwv7pgzhN0aVU_YYry1RSVWI6rHD6^!7#wU{D32u zT-zxo%W?SPS;4^tb(OpD2%1fzHskX$j=E4x%vNhz$2&EA?e-7HoXaswF-c(D7gxBR z=9>8;<2CaorkmvZOxMi6Y`lX0wPbT6ga%ox8}#>vdtlrG_da@qp&;&VSN~7jQpPqn zH@gd4@WdB4h%R9_z4D7cw1Tf@55@6oM3=Cyh)AnI3}(+7xrE&!;_S^%LL3;qgxxA) zoJ(MR%#Um6$8{Xq)cU<8v*M+yhVH5VtLM_>^6%i@csuT!v|ofHc*CuG#%@bCSCXoO z#B-(Z#lADMF?VwnEbD|e4MzN%L+GbUbVqY_Z(mQCEUpM+LS9^aV*He)*)tH?h?lqh z-F`2&j+uQ)BaG6K=%wOYag~M-LUd1)u}>{&jF$ne@y!-eiwEf`y!aC140UK+T08k+ zaNmx%&73OH!m;-ncT1hp6;hgT_;KppWVgR!t?j_}Kkk)x;(T&;ytAad;Y^BOi9fo* zX*lM?nNtgfPooqAkuEq@Msa?lT#Tp%-P+<#1iTZ!_SuK$yyqfByPsd7sKs@7KOc>^ zFz5SCUcV;5xZU-x&v|Mpm+i-eta*RrSEA`t?Vzr{sXx*OSo`L&GW zWJ*(-g>O5l%vJHNa=wf1iN@t&ob=W+UqvXB7|r96DUWd5ef-*HAvG#)$l~yN9@F!z z#o@L9Y)0T!IjGb)D0Sqw{LCg~PNwbD{syk-Z_UL`ZUVrr9ge};#W7gGVzK^${iK!Q z6yTH&>(h+2@-w`4!>OH!Fdgcx;?vU)i0p204${ug|8Us$-)v0}E-k$*j(gl)(XkPF ze2L>qIzY41(cYSxrS>jSsga&8-U5OGj&jzk0B;x9nlV%! zlK60*rb66Zn4T!{IGoz7#w#gACiTnrSx#3W)m=1%Xidee^(XGLBvh!Ac%>7^hK_xf zlpf2k$RQRdU9uW$??NoIHumqc46AWJmVH(TH8gONI zbhHqp-^b$j;AkFmR`fXh22w1S)NuH3;5d>wTx@W%1#E$HbPIKcqBEy@mh2!o;ODFz z;_xQ{?NDm;w2sPCjGcaKPV9*A)2OwKqxWp}t3y9i4;Ezq!tSRgSnk}cq{6vn~OzyH(M~BbX)srVBW` z55lbq;Rq3)UracWp?Tc|G9V*6sErlJn8})IRj2$oC@)ngpHGxm7gL7W8pxz?OG=}S zABC(B?Mns~QaLJ00oN9N&3U$>Zc=mWdCfa#OZ^fhuPZ69Pa`k?h^UzzTt<8_Hk3`u zWPrn0*qZX?M^i~TE#r$bAj7v(HUZ+!e7gQD&Gt(k^s!C`!3Pwty zxS#7(x_54=U!YLAg?NE+cjotD{Xyw?3&GltPjA7|3@(SFF8PZiU&2>_9`iww!4|kL zoAV`5vs=-i3IQQQ<@A!y#+6{hr?7Dyu@L|pLY4WFT$lM&Wk#}+Q0e>RG@8|?imoD1 zd6jQSQ-dPIU{TkeddANn<71VKZ=#IX>KW&8r_(otY9KoZN*RyK`$iS53VBW@VEW8Q zbbX_+NR4iT?vv-zm4_x@F;CB&>cFh%btV>`yQO}f!o;1#MBkA!q0$F~W`0Q2i5cas zvDf9mwe3>VeX?YYyPTNr>sn2j@K@G0xd|i;S$hpL`VMf))T=&Rxy!i7USw?Cx=X#u z!!afekm=8>C+phqKq?PSrj|-?x--sKk4}qmb)3^KR1eZM93oU|XxwzMdah(bE$%S! zOVlGw4XsQE?Y~q#o76E&se{Pn>KU|#S6&5mUnvZMmmLs;S4}FhI&KvYhaJ~UV$gu9 z4;^d1FsaBYUeQo^;&qdai>Jw~IGs(*QRj@ZMw>3K$3RcAE>0$#w4;+umOhwh zFds}LlQdC$!FKhDM>tXR_GMBV5;-|BQdso4&1=)1uxh0Coy~WAa>_#kS2y1MzlB!d^bOIdhgv*3B=A6?7*dH)ukYI5#s#G6!B0{oy)Ezl)0*@ZZb$mw|%tZl)K21 zcdZIm>);-WZPa4L6JfFV%YBPr4JwRmf2&#DOE$obR@o)rWY)N?T&)T^1$WxFS|x+n z<%M190D+I5Ok_|sY6-a6D7+)Sb|4%aoBP1IX?J*FWZMXK+fLc^^Y`^Cm{i;UP6awj zEs&w={(}Ho)lI7WyQ#QECrGOOa)SkV^Wm1a17%GIV3ISp?2>y=D`^bfZ1df_gC>dG znn$wz&{w6Brr0~U)eLbO@VmJizF%swBh`0ID*F|U=fQ%vT6Qj3*@$ z*wzWdM%mm5#=v|~4EinF_-qdJ3`dCjW6X8+zJ>I)VTPrha1d$1%Q&hz}Q zo_*bZ@UjuTjX!orIP~1^9Y7%C@~Q=UH%EYV`%_w4aiY{gq92?XNsz?y-l$WcJEa#q z^!?8$Hs6UTMR7CmilO*KL0Ea8Y!x2a5+`c5o^W2V_~^dyTPev+SLSG^^Xmic*BY0c z_$?-BWV_LDa;TerH&`NvoD03fT^t-0kH#Z`9LCpVA``>z57u^nz3b28hC{#-rjw^V zFez(TI_)xAWv+xx)o@TbRpXXH?XkhWb@WTOFE3TWKKlka2kSu@?DlX|s;&*|2I&<& zS&-x>I?DSNx z9EOTH3^xL+;TTQTm$Kn6xzN?f!2I&N-+7xGdZ*R?ST4m66^l*lV|jsd!9nqgXs{dB za-;shx=`>Nm!P3B@iqXv`T{tU2y!FKW(dsU!~o&vhK-Zc__;5D*>_21m{wujLNnIC zhP(!P{TtBCl#*AcIX`a4KNRGrnRBU=^2usR8Ji`HDwhyH(;1`rAhDGF*R&UAcVNP6 z2sQcRz2B`fo+Dzg!As6j++-Ljv?^v46pI-@ODv}`Ob6>$r$?~n_&I@R8NeH%8ZZ^X z()Sm|Da|ABF9|%)kaCjRf1wy-(j?-~gaLCx2HMy%!Wtjt zr}dGX%0EB}>kJ5FEH^du5Jfi_qRE&DFU%t%C%qc5OGcCZ$BGGwq3}6DXcA-b?C-!@ z+Sa;a;t-t*9X4I0BrWH#Nyzs;{w@{A5i=pEg9Xs;D-o(IT_A% zen`;9$xza151TWjYZj>;axz66K!ZOrDJgF7O5tIclFt8#U`H9rDoX0V2%r}qG`lic z9BYqAKPE_%F^LMHC0q;w&Zh#85n7FgCPe6Qilh!9s-~B&o+!4{o+6Om4w`H|ZB7zR zZHMJUY==TD4iQM_5kjXn(Q}g^RAjP9@jOBF0wax5;1>u`tFfj?@QW0ybA?!;v|pll zT?VxHPB|!3Hoqmfi8U2+*qjfJn@I8eo?`Xd68)s%X+-KQDU-Wd6gyjERC!UTECY@) z1BLc1q=baE5Ku3>ZgYOIIU~jF=W>cQm0fJCuB3RKSD_JCQ{=2TCQfSOLSzI}`~Kj@e2 zryo?MdOeBkR39&MkgaYD8`?gIK_)A4WkP4EVJylq`-1`f&Q6%=$HG^v3R|{)_Zw1O zYjJeNr>}n>OT!}MR*`3zv=|i91gWuqc{~Us{$jg)v$VJwJ*hYq@sF)mdeX+P3-uxm z#)2u(`UvCLQW)W2zAsIxINwh=vnSy|2(sH!>xr!@0IA$!C%^CV4cjF*m6X2M{FCb} zRI&JIRlC`}7oB_`G@TL~%nDIZ_W|?YA#kG#MzIY0C*LJly#dyf$U)8Jzh@$eG}y&a z_HK!{`v^>RK}?aga)8CX8L~1(821xKjf#PZEZyw*K1DXDkw&%i1A&Pe?^hUsHyc1rB%TTK;RV{7=yo}VPbG=YU`s?HC3!0w{CUUF`Pd=s#Tm2 zJ$b>-1g~Nv1jhgcoE^cc;Zp>r%P0nLFv~%|AP`lR0i@_UL3-$ygt5Skp|_GybX3oW z2#+>&4U~YV%L-Tcza}h_W-}J&MXaYd+B1YkO<_P2gTr$r*bxuaFv#&D3(0(*@QyZ9 zFgEE61TU%+MV4j?uG|+x|p=q8c`9+`keAZ)?4>+P9qW zecmhdD9k!CNt#-m`^{}0-boFxAe>aBl4FI`E&|R6A4VYA5ra@EM}E5rg?gL;g)iNp zdOlCEIc6AI5vnZ;hkfS}l)ADZrGR2eJC-`1z*JN-Sjm>u?FEEE`lSei-yXe?fTW-d zz;K=}6^gzMSu6Yt;ZU;~aFp(QX$cUmJ5j332t+;5kSc=x{}D-97hO&WMSO9GD5Mvz zC zor&BY+__8RzTKM?U0v8B=f#U8I_1e>9e^~;+s-4P3u&@LiOjo5!E2mX0Xn-#kQzEb zyprGvKoZLW?8}g=tke*8A+i+xGT~_Tr*t+I=_vrg%WBTzQH3p-FN)r%B3w#Y!@nyA z1neF3#Qgp%D29ZC=gGUDvM(RWW=Ef-+_W(h%L?ve0SkJrDDyueur|=*ZVE5oPbs!Y za4^PD=M{WhL(QlSaK;9Hnv!bcp*Yu0zetf4yk^I?U|(h|OUtXG{vFOMY{v={nbcP) z2hu(Uy^VZeHav$b;(W&S7ic?p2T?ZgF_)5D_)T+}h3vr_rAjzoQ^;J3WVGl(<~&MXUExp46Uk(UmU+?D z;ko?kFc2o4$9->%!t$U z@`!0q$GDW5o^crSR_;s}F+M}$eD9(h=Q?q{rg*Kaou*b4&PBh(x}Gv9OKiF-R*2CE zeZ-8;uolETk8`;~yMvB>HEga>$K+>X3k$2YlQ?nne1?oqB^!FB6gA(Lnbj~R2iz3` zS3#H{O z;SB2m(~TrFAMI5gF|UI&<5k(r5Ze_;oXM)0Wx}`5`2>g8ifE`ak05PX#*U!>@JHXI z_{%76fP@C2%nYuAbP1c0{s);}%#$Uo7t0dT`(Y9BQ>LjC5Qq63b->DFZ@Z2DE7cu1 zv(pJI=yk)!A~s7nuX0(&!qYPr%+5%bIA7f02r@6%7Rq*$p+$0ve-3WlW{Q+BuRy)e z>~v=OME=R1YPfBgDRUB?#+((mq%%b-Y{(?Hp|Z)`g*uk%LXZ=F!l&z2lXtm@qImhl zFO^Qgz``vSsDZ43-rmd6@HKpOkZAx}ArBbG!%uHMA zk1~zfJYA#BXwWGu6U(O~Uvla)G^12yyZRAKTDZxTlFft2nM_y8_fQb{@Dr6_*%|=Z zBbuU=7eG*&+2q7H%Q1I5kT{ZQ$?CGDn$fUbUYMpDus>cl)1sl;IB7B$bKw?skZvQ- zRO%p2NPG+t50b@nOKc|jwE?;)lc`aaY{b-IzRI}1wS(~tl=aDoMvX3<@e_jy987TI zkc1>G9Es(?LX8@x7{qxhr!lEsti;w3c3{L4Y?Q`S31%GrUFS7(!8yRTSfsv$C^RPKC%F#a4VO``eI%W%yM6oE^e%{W$qq`qB=RU$iEd zc&Q4-9cMTxqifF2TOCWPOogR~DHgQ&B*O3SwxZ?Yc4K)vd;9duwpO?fVvOoFm;eX$B znZq}$q_{r{jB{#Fy86_b{+qVc?{WB!)diwd4tXPc|PF?St2MTw-P=-q#mVSy|fLXr$Rc5bN$7h{MYUPq@Jh6%gT# z3B|}Y&oW*5>-NVKX153v1|7{F+ye}Tqk~Eb;ATLHfK?cgg19Y9ul?qlg zytZ4!xivK0$`n!F<{AYJ_ZK&W`v%}*1F0*U>y+rOa5NU@cT72;y17;XMEu71+U7dC zfEw|y9gO?eh4?i|p1`^Y=UIvh5K_tD!(&Nxaa?*4KLAz)5$d18^fcTCX^NCbow=w% z@8=|pD#;96Vm^CT0V5)XNpLx-QITRYAm^*1x9=bz`VM5c-{owvqw^V~={6+#Me z`_{9_i=ht=h-Brx0pj5;LLTC?-bJjjHtDMrW4gvd?OJ5xs}Zr#*J4Te}0U@lgHb55(t!qrDyC1LpI|WRgEqz`BnXl%%nLXSY8B zKWVxRdw9ol$C3%$u_AW@OF==wPP1_`3y*OnoL7$1K;Yq5?e<0X2DZTN2c(`k4QAvU zfL|vrgbHbhXMsa({@HGCN8>DTQzCkb1AllhUGEoY_3TsNl@2hA#+z1gP>uHe*PGdCE6Lu2Hs%MUDEercU;M_lmH$l`GI0h1nQJK@@adSoN)nSiBcPAp#2q8{7o z#B_$P2DLR8f*+k4TqbgAAhA*Hm(@IJCi0Yzch1du11lW6B(SYW}x1S(u;r$lr=QV3!7m@IQJ{R`V2_nKTa10p=c03XYL9Lbp!zz@dBZ6wEb8pD98~kBE;*@I#L6By??%p77Ry3Kn*5;& z94&V)jFh{YpCTO3su|Hu0&_;n4i8U>ygrY-_6<8t^^dVZ6?7831r?*CL(suI2}MFxt48uzPX3|E<}Dm z?lPCtr~{03ODb(Zr98P$E9IfhND#gVgrA3-r4J=a!-^e!6!Tw@W1aO{bI)`xs1zDPpdlx>QFci4-KSI6r zPhF92Qni!-Svj?C$Mw9Oq7`-fn3`!>K@#c|$0*48GUV*H7Waor%F3W|Oye;1ioA(`Lr6AR)6WklA+Y)Sb``(ct(d*-(0c z$D`=Y$t|Ybc2b1!O60W1T0C5tgs@2!Lb&R7#7XcS`cdA1WE&IiOZ*K=c(WX1F>{63c{2jGC_`F*=h*`oI4A zoplx)Cc1|7M>5fs)r@GAE0q!5S*6P?bYzbF-avkHZKv)trz1ScEn8Nv$8?^Nd-0!p8qY^GBU6_{_9h-pmTPV$h?OCYfP0GRq{@dXhQB{h@ zg^4nH9aJ+Sty`+~kdeMTc^et*wY>HgqnA`wnE;9#m76y{8o4_ zGiUyfT79UCCGh#`4EQuGMg9gp584*H%zUbA5sY?X#y;b7ixfprgzq_ISWa^kEmht_p0C^PF}K!{tyR?WlHwL# z<&Zs1^GeC7F?)4k@;-R**neRvHY;A3EW@PIu4^E^Tu-UB`-!P@Gp#Dn0Y5;7P4?Yb zhMFqc)B&eijwsbF9MGY>-JZs!iVb=0wqvbg ztV^t}#Zu@)tyK=HY?L`8YE?>IyzGEv*}={A_9nAr!M(Flwa;wH;B=r@G*`Q|q?7$K%w1jOc#->J$Fx;jYMG;G#m#Dt z<=WD`*r`B7fQ7P>Zce~?;CIZ4pXF8+qtb}6%UaKN?X%pj0xJ|CsheHa2KM=VmIEqGO~^%Qm$i|d zk2$gmtXC2mMzvkmIqbrHmT#*lDsAfIyR1jEi?PX}!c^M4lkBq2W0zp>R|TpGX=K=C zJ(gX%&+?E8t5x#VMvYxoAG>^?$ePS0JRHV#^OZtnb5#>{3q`9URJ8 zdY#q}bLemL6#X?z9bLV6ii=3tLVr(*Jl-kJ!n?25YIK+gTF<8{i}M;??-2Q9Zypop9<@97F8_HcYTtD$Lko0NzNzxkjMcWB?u{;CvORO94R75~xW9sWQkr zFQBgzv{{8t?%F_^L0nh=0u2iAM9tmKI zfU8xY+F7(N35*HCI7!7Q*C&Cvmk|9bqM8q>BLHtEU`Pd;6(PX)5jd=Z)wHB;0DO#q zJt|P;QR~paI7}GpRSdNPxJCl>4T267L%A*l)Z+nkvkEnKECA;d@N^Yu>REuc5j3Gd z4Sk~7Rfj&2QUJz2v6A-*StVFM`P$?IR_1p>!3--nqTg)#N!MrG7ANmF?-}}yi}#yU zjd8}P}}$ca6bWetH9Dd z@*w4Xfr?}9kxvk8j|wa5k*^Z)G9%E?BWHO5+^YgjJ#saHu2n&*6sSG2hoIN1(2_ke zMJP9_DCK(O7-8*Ku}b&IJ%n?!ilefk_Q)FvdaDXmrJXt*s`hpQ-mU^wX*c%BgM@KF z#h9W;9wNkhR75o&rANL_z;CO-Nj00 zNIyXzErzN+ax+06Q=vsYa+rWmsKDYLxtpL*DNsX?40)(W9#R0t9y#ElQR-QhVCf#2 z@SsP&sN&QVZA)SlyvKtn(P0Ha@uRU2-rMatSst>oIdG717G`~kVe*90WFLjSQYSlF zb=_Wl-kIXA5_hFxA37@xFB!+;ijA5Yi;7XY)PoyTRaV@iNphbmpD~zZ=FZqZ!=0!I znCfqZ5BTZZZC$+JO&mCM9?-!q*ltGfhym=QPt~+A%w<1Vq2 z-05f=J|u6Y8b#fb2hCchTnG}swF^PwQ@;?zzo)0HZlY^^Kp*Ge%Lj6=Ug!a((p)LG zsCZI-i;8}!dz9rm21l zz$6MKd;mu01j8&G%ef8N|%qb5D_&Z_1~uJ*xD6bca&$+C-LDkoG26XIU3+T}X2B zLGPV2ts~0eNb2Zz?_IL-fnBK%uQ1Oi@Mgw!CU5lKJ=01sY_%N;r+d8LlK;_GFUGw0 z%G15hS87AwsN_{5r@Y^h{|{|m^mxA~8{dwXYBz1$jyNo7@?y33{%JclsHiK@vUGI4 zsY}Ex?*sDR(cs0ao(HEDRDD;Gb6V2g#S@+%$bUa`7Y98*l#LHJOEp8$f(fj_+QmJd zN95`4R%p8plxW9(&yQx1M%%{VY4&)2EE^xLmSWJjF~Sq=^!!BrsFp5d&*Rf}rO6vW zJo|*_XTnnq+Oyn4OZ{Ezfagj1Bb&Jhd43_6e@kuLQwE16Ej;L&Ti51oo~PyV@A^OF zTxY)LS5vU6Xs08d<#;^LOi%TQ=QnS-pEGGG(;Z)RP}Fu#sA@}TlEdy7rl>}x#78=( zdCdLN^aVcR+01?J-%ii!kK@%SmyqVNu!r+tm4_pEcajKA;TQCe4=vtZHCkN z*IjSQAH}N0v#z(M=$0RLE^^TIjvOpod{9-d3UU=Rh1sneUGGjIcr%%Q47=Vp&11|h z0SZNjpXJ))bQc_Get3%(VVA=?g&36?nf)%0Rd|mBqck*|xz`8fm98qQX<}52Sk|Hi zj*qOeW>^AQ6upY<&@-9qnl&A&YSE&~HP`SoZ1u?E$W=jR>e6o@-s>H<4;#_G}oJN<$>3Gkvno2OGMT<8aCt3APrAcD(y2EdU3qww# zyhV#w93iW|aaE$>4?Dtyz{!-fXz`+>$C}yin2GD>|A+I@Yhd^Gx$PD|!et0gLg+`h8sPxKl?YP^+YnA5T!wHj!o>)0M%aw-K7>sOA451F;bDYx z5x#+N7DA85ZmB~!A7K^3HiRC8A%qTu0|+e$6A0h4yDMdcZzJ4^@C}4}5WbFZKf+fL z-h=QJga;8GM)(B67ZJXS@L7bjymreWgsTxgg|G+V69`iXA452X@KJ<&5I%(PMuZ0u z-j47-ga;9R8{r{@_aJ;7;Q@qI6?V(*23GAW>@`Kb~5;}42EX0t4BwxTsWU{*yd8;v4tsEZ9AO;zipU;knKha!nT7H zthYT&!GP^`3O3tjxe=UhTSh^`=BFTK8=ye8r6?G-O;E7iwwHo2+szbA*zTiXr|mHc zcH0h9aDnX&3ijAM9t4-!=2NiO)<(g#wr0xjcH2q{?y>nPxX&gN>_yv73J%-$Q1FUv zKLxMa4pQ)j?FkCrw!KQhd$w6{;mI8K)f9N_F#Ta=RrVAGb@nj|X4&^pFxP$~1@rB< zQ_y5TNI|px5Cx0vuT!whUR8mh%|4%kmG(9YR@?m)oMhijf!{t%LCC(Fg0MYAOeE|B z6v*}j1>5cSP%vgse4MfRU;T&0;80Yxic{L7=q!^*Q5p@%rRex+D^?$&OHr5NM)92A zfAfzfH<)Sr#%yk=_u{wfOzuKqn_YQzHOZkC_sXe(CwXn;9xFBQB!^w(m=c!V72;$& zB2h?goz|ykSr?dPoqfXEyPAo(-$kAy(_TLuLX+w85$Ri>`0SUAzEn-FBICKS)Q(4Q zcq?5u$-(EmlUC0wcFAgTyQ;hSl>RS#j7s&blX(1~cJ|2sZ#=xFi(SvcpN?pn!TT>g zIqeN=2DZ5~RINqV!nulSdixF%8?%GW$=*uEo*h3P%S><=nwqOl&3R`j52a==sO}EG zaN`+zF8(vsXXo%J(Sy&To>XCLcIel8!wm`u4m|hHeR3b{`g6xF;+7$Ib6U=&X{9Qd zDpdo z9bb4ZymcNE+JK)%dtp3(nAnQO?liuYGxF6@!ZaxYExpqjRI2Lqz$@Gh2t0bq?k zHyq@h6&jLK7ujwfkSapKwV}Zf%wvUuoVc^IYcSr|e-~xs!f&$1MXo#Hx{aLwKsTTW zU+X`0f7;RAh3es%kgHoAnt%Vy2kWFtv3)8!DR(|wDSUW}815U@*)x_2$~#uw_t*x5 z|6Qp<)L0;!$>x6e!R)wH6X=WdMF%_My|HdTOonlfq4ip1H_U^f3cKSk^Xh?|5;HtG zWt{fFQWr?Up*82$3xv*X8d!36%7xBM;Q{u7B-K*wbm2-E_o8f#s+%Vg?jr2;-RQWjfM|wB0=Ns zPj^$3S5q7pJ|1^I#i9PVP;o)Jf&_`0BML{fhp3cQL5N7WcWopT3HOF7DTN170f+Y7SG){<%mCsz< zAvxiOIqvU#m>QCV9d9Z45yr*`K3glf0gQEryW(8RJ@|@-;sep%pA)vpfiscmYFj@0 zbJY0w9f}3~{h{|%JZkJ?NHB;ZH=)-=Uk-c?^dCz1a%<{88?u2*_zC^9Wx58~3_iqWE8XjtT{>wd5J)nWH94>Gb1UNjzQ<30s z8oZ6EGX{iXW6|dH&0UEJFb(|To4t3|_a#p_7#QT;u5#b^4oi)bbR}1lT;9Euzrkg4 zwIV)BT0ZcNB1dJbBzAdhBJLKEimH#K))+9jrTLTRs$4f-SK z*!=_X#g~Gc3QDPv=Zt$mUJw_3o#(bW9Et?FlJTPXBEn3gfa5zVzB#-$o=c46Xl$?_qX2duxOyQU-EbVSt&klRq9EFMV{DLHTs%Ja zyX}%2Uu&a%1O3P6UOgar@de?JVU#&O_xl4J%15{dC!UA>A%)cSj8IH%e%9=Z=Ejd**=s{{wZwwB;d;4PHQ-v#P<(t}vS4pLS zpV}7r>N5nKD==)#?@h!HduC{efbDdE9UXBEVL*`ix9m~ev?1xC6&ZT=q?L_nXMAH1RN(m!rFR3eu_utp=2K_>+gtwv*}%XU>5K8ohkMP9J)s=D zw03TjMur~v%J{D#E%M**yHaFCf`t^0{-4WDALmx40%XqDuLAl^QBy8EPG2KtaM{i z)63O3r7Kh1YBf%otCGOYrvae?)G(vv#!r_~j#NHGkkQj_!#5G(aD_>raJqy-g$Q)} zqbpQ=Dg?eiP2W@pkcLn+O<$CnGcPhEuC(${mg^`+L)zFK3PpHSEz+q)?2H5=>sF~r zmDqv)6>5x9?1BC@6hj3JhWtTdXce(Q%>V|~xK6~G{K2O^VpRxBFkgP>$4!#ARr|i+ zC%5G#FD+JKl%-eBoOavSPnM3-z=~a-uHnLuj(+LeQf)EdQHpg!vkxZmUs_9EZ$;U<#d5p>~$9;|A^faz0QSG-iN3%$O*XG6yTeLX|;>q>6N@h@*b{!%BdFfUGT+kJt@IM3)!vGne$o*yUIUW-uN*z2; z1ge86Y#MNH;N37;^j_!lXG)c-e{hQVarXGDC1)$|QJbIb`#`GVKU)=ln0G9`2wN*6 z3Jl+D`0O7m++_Gfr}`p&E|}CN;e6kSQuEaMsiFU+`Zr3k!ZCJWUm~WR`6PzQ6iox+ z(R9ViN4OW%WS%M>IDT@;Y3zNZhm5szn25NuSj7y(TkVf7&;LrQ6h#m#>VG3XE0W}W zT$bS7QtBa!3JQ*MQ@O&OgrdZR#zzw)Ltm#D2j4|GBj;Epd6RiRT$Iu>rk|4AX+{xi zKNKMctr_CjozDleW3Zw1zvTDSD>xwkxpxsMr|=p7=;q-nOlC z*p+VWN~^B4)sR$cC7rN#EMG!+M0&m;-b1f8pRP`#LU=%Vme|YTXzXbaV zSHcaO>>9c>{@&M!PXemtm%*{VQiUsq+xG~xQhft$9qEB|_bNOYk^DzW5^bZVzDI2< z<))IWuOI)7oThKZ{B7B)uAcPGf1(d1&~F2}onJ5huNWFHc|yzozVtxoL*Pg`kFUjD zBX}cnK#+L%bK4fd02Dt2^XT>0J3cgXXJ5g}H7zak{IATo44WXDmm=$8VrH4D1jC(I z_jy!HDR(fD!~D7ASN=QIH?Wq!&A>OzZ6pZ%`{(Q5y}K{aJ3KGl-*ZLnpJ%#Vx)isx z!e87yQby2Vj=a2z!^7IgfwVfrAtu=m%U-Fu<-{(Au&dpJ9xMN_mYu z{Or50KTnTATX?U$<@^-Wr1h zIpDUdDbaHi5XAa~C4q9(SUE5@6dQ)iDS5J)4CW_BN7D3Kdj%y{dJ^ICK~g0pO|_EJ z1F(FsC6J^Y3uKv0S*oopJmrhdn?kAQWu^*dh&)p%&-qp!=1ziIAQZeXe?CANKae9M z)|&_~N)N;+lf^5qxfiD#7O&)tCdjF!6CrO82P%w!Ax6g_eQ zWjn{rM*5R)ms~WI>PrpG&LBZ&px(TMk}bAVvJmms^&{{(4S$%jSj|M17Tl)M&AwfX zx=SgC)iLI*+d`>Ur_(gXCe+6>k}wuUOzu^bWc7efnuj@~Z-_M0)s)E+HrV(#OY&Dx z;)Nz_gdr!B1$(;sMRg>de@z7@nFY`fv=+FY5~i35QVoi39QqqdxBAib^L{A<6nzMx z9=VeeEViJ5V($McC0WB0N$l#oi&Dx>N<^E!Ccew2(HtsFLR)_ti=ctNpHfOZTM9|!GED5eiTFHa!xSh1gkAh1 zeI(;fpe{|W9fgs^Bk!PHAsVX`#;X}AL_c15PrgPeF7+rQsehdkFg410kU-Y=VfqSX z>3$XcJ}=dhBDgm*DpDzLQ3~1Hf^HF7ID&VwNCh;!{KplTNtvOv_WZ{6{vXncP=B~> z)*E4H0L^vE1RGj~CtmgWf|D7^=!u2tk!6GFkxx=`2zp;se*f5`lW0zrq$r)elPIJW zhoBJpR_M#`*ljZO@coqHaswr8P5Tg~(`r*7dez#)lw7ToL9eNCo~Bew=G@8S85Jkqk#Xz4;-(7OVSe`>4-HHYCI@8O#v6>mErbJf+fW*em zN@|x&4?bU&8ctz}F-!@TmLciFvZX&c{#Vc?Vf;3pMT@l1xC%H#?G{$U>4PE z%`^f=EgE~akPa%vu5}MdduP{BUvgw+!I#$AvLG5xQ_ox?&6N|)6iU0E(p(;ZNI?XS z-i)l8M~PX)Pdp!ypwtptPKlWxn@|VY(zK%M3cokBnmkd zMDC)#052?CO$uTi8Ee+;YMO@U5ZA2^7O4>U^C-!hLX~-e27xe^g7Ybpg>L$WpUg(r z)g5eQ#xm%-y2JGjAE1&JE*FwB<^t5(-J>3WgCRY?gZM=Jdh_^CIbjp_ zJ1c7{`wwrX)N}2!%pdKd9HAVO;9hU(8tKAt)PA5}eg2+x@GcVlh!IFXHKq9f!lJUM zKoU!cbk={Gpe9>cpq#stSO5)-q$#n&N`$ab%2h~#N3;cz?dd+OKgcON(ldW#h!!Kf zGFh{Re$fy0jv6MX#p%J(L0ZgL{$uPinw<29_l8byg<8_Tn_ANRck7R5{{rhdDuYk+ zS9J~aC8s_#ge8dhrd3FsK8D3dG0UG%U!vj*l^2D3rqSne@!8bsb@V;R3TXc5$lSTk zeryr1N)L_TS7(}5bnTJJv>tV76ym*rNVG_YF)@_hu#mo28`)`~5d+vk(}q-dez9rS zy?Wm0$VhtNyz_RR>?;{rxs;ao;?qAo^Q|r5CMNg+nyq=ACuV!{QtkXo9z60*o$i+{ zeXo5M3lH~0Q~U4&n5Tp6DifZq{okwFN5aQO1G_rghedz^)#!Lm(F2t`Wd5R~Q zN<$cL#?W|`(jiVRI0+2W$(8UL5@|Il);XMI?5)rD_2G#%^V^!;J-eZy42*WxZLo0! zjW19o-VAi{e6mMm`1dRsq)8?+yhs^7U{@i=Cyzjp>1UM5%P7dcNc{z+dRWb-mci-+ zlm{c(X0(VeDU6bvM+POJQhx?-RW+O1Lw$jrfHN@BJ8ATlQDIB>&|ne(+103q8p=MuZTX zLzI|Vmdqp4Q?F98@)76?n|ODC(qGGtEiB7lQ(|pK#miw{(xyZbk7vl5i^|@>qm-7}c(|)Ox`rXQM<^Yu znG9rm&*mVqK^pKRX<{I?2I`;^XIJP?-WS3PQm|JrOuiP{(oHVj3)sawvJxGTzIotV zF*Hz&D!Rl=x30A(gR-i&@Xrbg$=0TISvtf9XP_RYHT0CnzRpov*GjR ze)kmg^gKLOrBm6H4}T%n*Fz)v>!tU7>Y47Ocu*6zKIV(QbCz|^>rAKnSK^^C1d9u6 zL>jWGRPWrrDMp5Yp5*#Pqa%xYh55$m)kZo1mL^l|Ay4*jY80t-94a{kecwilb^5Gm z5RZEHMZ~SOi~A82Nm(vfbwPb!gnw>;fUV(==Y?Ml_k~3;?J!3&#d>F6*oQC_^5WC+ zDH^4pdtqL>w**$=U}u`lH|Pu+ZGGoqvLcIeQ7=5bDLCcHlEeBNt6BQ|+GqBr`#z96 z4^JCS=hbcQtJG7FFxjr0PdNPUT0>r6ghSO}v_U%7iRrE3V1=+W?G(Cdgk{)tHZY$fE-&aiIg>nL} z>-XcQ`Xcl}=A!QxuKC@$eN~B}BqoQI>8>FJ{Up`97%VRo@J4|bB4+J_LzBPTSH|>% zlLKIrZU)6$(iBcc8TLoIHq6-lscZWx_$x<%!Vi`hW(LhIoH5v!-;o-)?PuSg+*c`f zH|CA@_9lnOdB^?^7R*T?tPSBZglkhpMz&_zpEv*bgK(9CdDNMZp~|&+)qUsCnLQlj zT#e}sd&EiU17c%#X#efMS0W*;tl`5S+P;~>NJW1QU$dCoe-0WT!bl$^7;;P$YdNh$dRRbkY3QWy=sP@E>1*D3u`vg|A8tK|K1=hZIcG zos`!xqfC|uLg{r-6x2=yT+sneQe%5_ydz9+2>0cBjF=uGh5?)XB?Tds^r}wZSw3q* zZ<=7v^Bg6m$C3LoUsk49l`+?OGE1*DJxgg2iJ|v zrvGO`_~s8L6+E*`LyD;FB-(u4HmV#R5^uH7$X%yViVCDsgW|DxK8T#NqV|^IMZM%^ z8|GRhv4iVUsgYSsCtt{-ihCy9xfsqoa}SHXEt;I!sXC};D(6+g*E3=H#C^L!4oAl&vDtLO=9NI@`D-Ci{BYH|m^BIxqCt|&O;+|{$$i#W|$$qylbpLR9zFA50ok;_gq>vqfXU#;t@Ao_}P#wW-r@^Lmxzq)`+(-_)N@tCx`SLf~kzA7=ZDbQGp z2Fd6reK&OR9NBes_&#l9Ru z=IZ%58$_aKG$fWiqi0<5J!F~9owo9fBhs2LscyLlN)EY`@7ah+gGr~2lchiZdcxfQ z3;exc!U{Y*w&c*J-NR=~Wq5O*k=K^?Wxt%|eqY)Uv!> zd5C3(gm6`;{EHzzZ1Tk&$ec13#xmdt0!0tl2zaNJ&(>EKVuy(>SRHINk6R|fdf8>S<6E*>V z+>rb%{BaW*hA+fRVI@1XTMTnvUu09kVxWeN&kJE%&u?%5aasgQD z50i{6J54SFEn~ziC03Ud{i2zjlV2jQ=yJ&~xk*Q3ik&BhJWS8kw`eE1sn~{dYt1PN z9#zqk3wC0qJh;A@?#WS{Cjti7=a}Qy3v(xvA}U1(eC_q5rRJEooKFQ*P!m&P>a*+y z&LrF!Y9mex3iCFXva%*F#t<7>6jI@G)0zhr*>dO9>TGL%;f%0imJcW4a!DhgeFGWI z1S?o_k;#0Ko5!{A-(X#Y%{2P#65_7xrHf&%&;%}~We72*j8ImfZdShC)9k{z@WZ0v zUHw<5Mpg-vko;U!0{2P@y<~~Lz&8rfb_iw9)j?(juH|Y8PCIl0;nJ%q(1Yh?@JL}$ zJwl&lc2D~-w*y(BNZgEzGQem%6kcx1f`gtHUt$@;uDK*vNH^TjY*@jU2rD?Vb|FGi zKHS?>($UiHDjik37~z(oY~&Xk-otk0%;pd{!g;X2Lk*gBiIzIyr$rT(reKRw6A7n~L~9|$wL*QF6JaiG!92{I>e$7%fdg6j zT%Oy$Od16XXm^i$C0qNrmQ2x>(+3~qqsR|~jhQ6z5m|BQ&yzP((BN?#aI+FclEayL zXBm!h^DPdXYt}5!h~cF67H&Z1{6~c$1f0nr-dYlg-k?3+Ggq@-m=l(Jh0D`<3v8n+ z>q@ZP?G$Sz$ORUp)@fUe@=e(PnGF*TA7f!6gqtt@w+0(|k}~|kmYL)Fz|ylWHMmO} zMOGjpKycS9vpKU8%KE=tiM5}=9218Ms4Br-?$7n9+}3^yDn*RG%*jt_2p5jUOLT9h z;lqd8U}d=dI$?ihjzNy9S=4*Ro^H-iw6vR>SU71WBDt4(=_`IRrGW$!+aJaKX zFocBO(#C2oD7b5JOFSu*b8~wUp$eIFq8B4pmfK` z;H;UhLjz7U`9tkgSsZXRf@}vy#wf4A-TU_4XA8Kmt+_Cxyu58c+X~UhE7!)vE}^rm z4mUEkq>ZdXmaPsqvSPVEybN2(917!hgf$r%+3g^8%I`IUxV6^$$|(N7y?`~KuSj;S zvzE`6@-Q;CBL0zXnRFYQi#J!`}%GD~O!ZAiR@H1Ib$a68heOTp3yqC-LT)hcB!tPA-w=tmHc9rIg5<3t95XliON}7;Od} zvYk7CGmHVHloR%{YbJiNc z8eSH8)Tg*eVu0f~#B?z)XSHM>xxCX zPsQrz50pa~)hx%!Xg z;1Zf~_8_zjx(UZCRTGhEGyII31`=~qnO7g$nG8xqp>5h zPcSOwSuA&)<&smGF~d#QnuB@h0lLr<2L#lvugwGuZX=zUFaen|rqw0WQo%OE40}~S zwd&fUT$APWG)i}l4h<~B0ck9!5W37RE-@Odhz6s8C9oO1$u-EhOUVEgC4`Sc#-v>= zH%rZcPis%vs6Es3XShymqe4U`lNJ|sx}40#3rsCAWyP6G%Sg?ox8)SdcLx!?;GE_B zG-wxRd{hg_*CM0xECbG+lP4VR|E<|OS6>1|Za@jwlJbg)c38_bqa9}zzxweUgM=KS z)I<&qkjy65jShR9=x&7*@_{2e2ms-*vrN;46ZlpQSQ{fk4_}poDB94_K;(D!E<)E& z04nh9X`^-!g387XySn2ME%aS*h@uM zeez74ZTG{ig3ISpzv50oZq6C%p^F7M--JxdWeU(($`YcIOWRZStidX|>~0n$j*{xF$pw=-L-lf_&sq+-T{RbH9M32U)|RDFR?a$ZUs}#TJELbG zD7OsDg9k!}Eq|8*NFEy<=_RsS>vSV4XOs8ba7(pKgnJi8x>#@Jj0DX!hIkOPB2ZQu zEgx1!i-u&`UYw(My-Fx+th}+Mbml`nWZ1ys6ce`_g-=tAfuj?cx?Caw96Gc{%*y7> zG zk!vip54%fOZ<$<1mAL{EJ56XCoO} zpuB~1_}2_(i7SgRGs5dZT*{dBdD1r4Q1hfw&yF;>CpulM03tKmpt0;^4YBT=Ax0f27gVSrpL zpk*#+usVWEQ&M((d#{&^TLcnsaB`5?BmnBTg&(5V%9R*cyM$DgfSeQCk*T1d=$HHW@Ki#ys6BBVMCpVjA?JIAD_HU>6JLJO{?tGa=POQR=Z4E3dS&&vQ z*lAwykj)fitQ_{dF=cVKEX;BtIfun8H%(BKrAv4o63btjMrAF=(DGyuKweR66^fi) zKMdgxc{52A&N3E6j1eF6kQ7W?KRC@23RcE$j+hV|Q*Uq%y_vx{UOH*wg>boJDyIyK z5s`&dDsPU0EM4MeVIs0|9U$Iq&K%i9-|)@yjCQ_gxI5}ZlVmm_Fq|<9hurf8bWwe- zTrGGtN8q&J(nrpfrIBtf&QUAK`miB6#^mcN!W^v>!`;nxp%^>bQlPn3JKNn+;TFh( z>lV=2x@XhPjMP6Hof{tg;=lX4X9t9j(sBGq#NXtBa-0Y8L+s$dIQee(?4UXl?>M{i z@e>)BkEG}--Bv2c70}ILUHE0ZtkYG1pVAIMYF(gvwz|gnKq1QM+j&cZ1gh`njnYr} z3gr#GmH4Ud=&hk7a6n!+y8=JmyGM7>FMapq+rjR}a*K0J=N);z$hY_1_u%$OY+O$j6z&9x(TTT1>rw@cUz=!5>ULIjpQ5ex#Wl6-x{gIt(84p^c2&W zQ4p-~qD_ycfm5n(UiUfaMIVI2rr06WNSjU_uks7Fr zP^z)|8FQLNQn0ZEq`8v1q#)0C|5L5cJhC~`7`0MJ(n0c;KQ4d$(c46#Jy@vdgEy~u z_y?OJb+`pC)h&{fJ!4MsKg>A&7&VH&t8+ACPO13rtD8jmVK$}Es9`x!$DF80_Sa1| zla0-mF{eUg3Di}ZS@ibJm@`>q2-cMflGfpRxgJdSW6l(jQY6sb(<}*kp@-f_8FQwJ zEMbvFZMnPMJUr&aM3z!wajKi#-+CBNIg+<@qZls=8rZ+>WT+e_NVqve{^|NX%y9Zlp|6Vu`Zs_Z;yV~_ zes3Qj%Fvi8BH3S8M#(&{fg4mDybx&tE$N1KCPKdU$e(|*XEZ``o7QwZcH=Yu`UKHY zMqg!!9^Vr(=KNTs`RXc=ChA&={YvRg8FQWx>3-^3zJio|N`h3;n5RUB01b-tm1$b+ zQkF62S&29QMzj4|iSB12W(IYgAoz(*_=ty7mQk2zlv*{U0H z$8Z8Y@GkBdemWIt#C7Jb1w>u5Z}ZnLdp5~Rda#SG79Mk+eqqWj&r!dCO@m!b{Ft*( zeDu)>80?x4ekO;;oS%xXe%7Y8{YBs%byI))TvvpJg;Uvnqm-7;UEllZbwXGS77eE`GjxW5} z;uO97<{NQ8x}`VZyy0|@=M_W?9jEM#2u}mBkkmAT$!`cZQU3DS>UHU3SN+6U5-|rURed4=%plHmwM|}6Q z+V`wZsiOFshcErZ)Cj3sdi-y67>{Y)4Arn1jXFm4U~0!(LhF;=qj*4-2Qpa%TSPKf zhbwn*EWKk{A~EKCNqqN%19PaEWf+ymY9ftO&^I|&+C;_2mww`N$15Xsh3mvkD`U?4 z0QwWvAE8emt9?LNt7Fc8i6rRGb;EpAXMlHw#~dG20?PQQ%%Z_TdX@~=6CmPh%qb8_ zfx3!y!|i9sg!JMbeKMwOD*FB1oG5h&ghyEfq;&A_GcQ zT}KYHM*9In*W;@VIyhoxR^)_?8#Qb+dX1$pEsNNsff4k$o zf=FFpBqb(-{QE!s!@p3ag(E4x0$|Juh)<*rQ{q-2;!{X`^+U|$S0OH8@jbwEBehZb zeW8ndl!}{_sD&f2y<|?bmXz4-Q_1s8w+Iup{(ee zUYF;4r<8So<2$~!8Tnmz`P-$9#YQTD>8A ze~Is?q=AMYm3i~4(>F$ak>e=ymLP&sD1Y8lpJ=M|9WI6H29kF4QK1Wt|9w%7FVge- z?($bkc^1;iRI=sVe|>bS?_g;?o-MT8k5u-aOV9sQ+!uKrWe=1x3k??}m43XZb$Xp| zf2q)s+FVcsmu&gUInz=1AG*t*7Ywqp5JKal5AU1d+gDo8*IZl4V#z~vY`En=PdED_ zM}YHGX(L^hoh2io{eR!8d|DHR^Kk5+OBU(JHBr9J?*{+O2w4& ze9-@h;57pX-9a@>edH^D?(jwSpoX1-IwJ$&eB_OXzp=!3Z)sytIq&J~>85MDmiu-H z^kq%|+b*yQ3qt-! zg*-7KqzDM7=ZAR}UA~C_cz5}o1}7+)FgE@6{3nvWZKc8(kh84XE}`<*{mu9PDg`=F zeru_@NLHB$<(BWfbaahxv+M~rDJVLd%7660mp`}G7YU!}F27CGual|dU*~;q)~Ih& zDNP)#yTl#UW6tYahhE#@bDRZ^bDU;VN~9GC-&Q^59F@t~j5tnaCnc*{OkAon<~)i= z1a1XHP-Wnn31rzIUV9vK{zYcswFe=PSx4y#;kz;eFFq&(+jwRUdZ>WvU|X7UXh}!- z`*0FQ;)^mzHLV^whkHw+cv@@Bc}wQ0CrYjL5g*qcbDoqL%E;WcGAL4ALTcO`Y`OC~ zOX55)ajHxl&ZThNCZk8LAln4ILOB1J^CMX{Ox?jL$wAdfmy<*v-V)&FYsjuqIo!^O zUfpp6JTITPVg42E^FPtv+1fGY%*gxC=1pK@UPY`}uCQoN@Oel`QElkdNaPO4&#k2& z&TqP8*7JU6gYWiGgMW4iFc>ua@J3CjTmBZ0V9dbp{PvCx$9Wik>5KmNhPq>gS9IZa zmh>=y8lC~ptTJ8#A;u49i8#)%!|#NbVA%A1Ulj1m=ef3lEgdq*|RrJ71j~T^BZWR>X>U*XGh0mQRo8xR_BNyE^ z2w%|voe#xPRmZv0=U`UL_`Kam3QX!wmG^GsE%kof;j4@2Ntf*7_Ld@tx@CS%UR_B? z*Lt3cu1Ky+_7^!M^%V_8n7+ixzu`oIbK$MEUkgWl{zFc@Fd?psD0c#ZSOA`s(f*Mt z=TIQ#Zyy-x?RA#>-s^6N$SnoMXK>(|Plo*K%ieUl8=~k9JamBvyo}`AZw&dXIXNO9 zZZ{GabcOsM<;0>TqsdWGjur;pA^%~Y^QIFoND%))Q!wsNB!>FRop4bsuf56%2f7<3 zxlfp)#NA?kF6dSPx382(nxg?|Kc=k*iOJ6j>= zlmj#V1;pM1$QvhQY(hac<|dY>NRCd{wC(_Kf6qj;b|~P6+`x8}5a|5|VAl^!1iM1P zP9R=Z+!9d#38LVzu2r}>JB&hb)hGk0_X2YKVsqdI z;{|-dOcj&?hV88iu{IZ5fhflp@V*7S`z|x_0ury>DJ3&1&ob@O}Uu&jI*J0^F|vClVSt zYJm3u@ZPuZJe~ZC!kb8}^>_i|gFuY>KAw$@)0}I|K;lsaImuYkz{I3q!!&7UjepuVz3#x!NfS%V2=W9^Tc3ta)QZ0uEBN# zY{$f4tqP1>dR8;Z4W*HO2&CN;BP~%#@eCw4Zde2U0D$`^2E0xI#=L;;*w%QD0q^L< zcqxToCKpylOHC?BH=Eki!!sMcUV23XC+V4HG+S;rwDxsL;^d1A1w3e0xc zH|b*-fY}9@_WX0luXhK4F}SZMt8%-7@vvXR(4@@HKj6I#ysrH4_(NIo9wNMZ6`s9^ zk0*G=R)ScK0qcHXZOCuC!x-++8q1P+r4d?#E$Lkf%OkZOq@M$6TYib(gbEr^Me!1j z1eP15!*arZT%mgyNQMJ%kATQ00KGH+xQXmeDc6%edS0P;+H0Q}0@R-YwKxB~uNv(o zejQZhJ!)2*OhUO=QSM;=^=3ITR}QOkHMW?e-_)ZdD0~QoPvj43`g@&2@5TMJjGE@$ zSQht_(-kV(C-f`LXh#+9IW{gCKXe-{d+mYzYaoaGy&9QToACn90zgb_oDoYsxqPFx zo>JHzj_V_3!2KO?E%ujF>bm-@lXYnOsd`jV9Nit&%-`xk9G!QLFEnyUx~)q z3f(glOs@tAeI2-){4bfXMe(A9_EK=yg!BQ$DrY6hQmX>5w)@;YHwoxh0KMIR-(9Z! zzD$HIS7kkf@rqj>C= z)m*2l@raH-T8cVOqKO@1p2Q|GDGgtilzh+HX@R9^nECH4h-)14y)B;g&-NNW6e~kKyC9jIr^&Z3>S9 zg$$~2G8kBY0M_(^OU(YqsAM+`1c}6Shb(_n1G#j%HgwX1Gw^LJ>P-a77R)d5S6Z$c z2;b_44Ao|yc1Eoaqt-;h@_bz_)Xb51Fac-MFb>7x*YSAxO8gD8ll@t}PWU}oh^%FM zoyTIbx%gZim%V6>Vj2Un;Ib~dw>jP2)%lT9#u*J zI#>$DPowze%;Kk1aZkfUgcr)agK|3xjCqf>dk|_#2@lk;>U)ytf-0#vJ&59vKM;=t zad*KglT{EOjV4AU_(v08r2_K^Hs^*k6*&J1wEYFwY%xZMDU7aQhaJ(^#I!mE>!DG2 z3xWE7fqJw6t5A2i1Vq1qFgcMC&>RJnG3=9F*zTkh%+=Qu_6*oJA9I+Vfl6A`!xL0S2Eh)Z!0+sv`l{5z~+F~qU)GCde zs{On?E2b2vy%cTAc9jOe{{ry#K*DVS(FRwh7&aJVH2!Fu#{A?=rO}37;!#JUv_aKo zFI1bd-xz}W-ba010n3sKPFx*TvrSdwS#3aj8XJJhJpC2w*boShf8P}i!*=*SNyWVi z&?B|-eiab<5E7Mt>A7?X#5@t}CEdtf!}NLt(Ol8_e^)0^MP9)9l|yB)#X0~h#j zYAE5!V$sUs?ok|dhLSD3v&jF7&mVT;dDpNa%v*tfj>q$^#y>~mc?;{EaG4q$`1HCM z91zaMy-ovE-&Ix45mL(@%g?y12F*BtX6y{?J$K6zpUaIvyhvz!Qb8-7Jl}iqu=^o7 zw9+|pJRZfIiWh^^0|^xqSL+04#v>w*gd;FWmhrJ6UMyxHeg_60VztEy?iYUUpxkK) z#zQ*tz1DfoXx0+nkywc1uH?XQVv;ucjp6iqEU3akdY#~_u_$bKdTzs|w+an_b$Jc# zC&YZ$%mS~#ofY^QjQLj3&u3%I)IG7hh4}TT;NX3+V!Y;^?1D3|zZ*Re{8p?~fKttf zHy!D98b22+mQStA5BpBX3MpKqC58Fy>)%AbA625{F-a&mgPDL{IE-G{8<^oYC--0m zD``6-UWS;!?$x~IDQ*H@=>$*L7P;)KbsAzeJF9bSZ=feMr!lOZSlHY(>&4#K@mK)^ z_d3)Mo{f`U=g~*ezK+Rqw(uxW)wcK0wu6DI%%+h@lg$$6UhrqOsU9+7w4vU4E>|0n zv#c(!smS4wKl9|1;>8`!1L%e1>#S`((XQ=93R23?m z9?-J}%}j=&y)dXyA^GpZs**)P!|_GxPuU?U4_@iV_}u57)JZWOr#v7k{LW) ztGh`soN0QCN&M6FU`L3%KX;P(3q)!ZU`@4i4RoEVSv)u;=^w)sCq|jwPjXunB zf&{2-1D+@CxPtds0&;c02Z8{50PBMl{)bvVx5Tf#{^2GFHxj>CiyI({{Vdhpt}lZnsys?)O8BPW00^DG2`+=;CvrA z`wAbiiF5r=qNfmCE{RMke2*X?=8M8ixEghc0_gjJez-7WNieEVJiX+($q@iQ1Hj3` zZ|bnGFrFnNs4-41fTE`Wl?cX6C=5gC|JXxPac>SN>HSv1Sm68;P%DBN%l=)e zd?sVuU9zW9c5U$7>}0TT?p83KMI2frLIvTkT#p7l1EkHthU`dTYS2@;kz7wVke&t7 zjv#i4TrRt;xhoheTG)kP7A_)XbH76NXc569A({Yw0KmJ0Q}aDjLqcSza>i9>mOJAC zSaPB`&5%{jOGQfG@U#)4pdOBL!X$YlRzyEVcolxXj>aBVBzcS@uuapm5A^I0UTHQ| zNhJ{jl)M_L**(5|pjhJ$jr(_i9SvTU1C01zqQE>mM?{i!_b2wwdD0Y%U_u^eS?N4!%!^Ob z+NoKgdd8xCg)@-%0=Yf3-*$l2O~TPQ$(Ll0tfk0#z!&r(I!TCz{<_N-^!Me*iWb2? zES{9Fa-J-TLDk>v{#GV|rM?n5hy)vro2)_PPeEi?Xkj)k_M+`*ZTod&GS3Alp+ z>i|f@$^?Yvp<*XF<`GPL1JEZzW#d5;*^pbdiFV~gL>G7we+|S?(H(cZX(GB>ggfGK z4M@sJhm4X*rbq%CQrd2|*|`MpbBbVgn&=Z5 zo(FXew9L0_03Z0N0C03MaF-N83_ZAVCgt`Y)ll3;>e!lV8#k%<3jp}TryE;SMHnEn zH5+ErcD{I%rQ8|x)dmu*`N_PmEldctFD=G*xT@LU3n?9oYQc{tet!Y=JcfEU6-BXW zm%E};8Fq)mYqSb4cN&B7qIP*CFWJM3$siuj86955zpCR=9KL{|K?mV_maXc-+XS?Z zjQLvT_c}A*i{&lF(*C7b*gRIq^H~9(*1>e@AYPTiaFc^_ZVgSLDTrD`hGn)Ep-T6y zC$#Kwv}}73cCgHbd4+tAhGj<-9Dnjk7FQyFI8ybgT`ZB8>#n#wr$n|g;N_r`w<`=l zH^$;IAnq#~M~FpMMCj1v8imar1I4q^^aDU0F8bsh7SdU4HFfC<*n4GE0HIb zz@IEyYQww3dLzx}Yc&+PicM)2FOVXl@WIugXz{l&rjIDic%(>2sJM$hpXJv?!!=~k}kh|rlvMJ{Lm5j9OO{wz4_)}&Q15bjh6G^rQ}&=rUg7O}e!ogIKl z6kjv`hKphZtnit)9SVtbnSlft;h+P|rvS5}_*ZvW!~_%aJQxSR=A+JDr-DrX2NWW8 zxq(PqYbNU719fe2xrypvlgCA+PI+8`c^Yay@dFC~30RwpXO0KmhI&WHK7~Y@#2^bS zlM5TUp1loNJBrtjm%3O%V?B#i6Rl^-LO7rxN%m|=3WJe&-vHk3;#~zMptV2-(pw72 z(@aSjR@^rapqYOIsQtx%F`H@hCx;!LP)KAY7&Nh!tZ?oC&e39oZ@Nu1aj0#l6pn`? znvK-q5m0nHkn+Nx86S6%491UR{{-G;;Z_NqLz)j#?~ye9dKKU{1Fj~#&?L-&1fD87T9Olk8Es#ZFsvG}9}!DY;G)$lU4rH9sZfxwH@g!f{sSWJR^jHk-EBoHg5=W_e;ACzr> z8i6*K1Y;%CHsY54ga&r$29`mDs7}h!*5B1PjK)5*IPAZr;v%E3FA8*HuY>Z@>i~>I z`8vaX9DcxAfB=FJxWXZ)u6XI9#W%DpTimj~YkiUPF#NiGBe7EIxhiL7AcLMugJ=gx zoF`5zRXLXyfyrf5m$Wze&<*v$4PpQ80(3&mH;<t4=A+=6vsY{b~a zL0gaq8@^@QN5F8vp383Ei>NQkd^c}Xp!RJFi_;2hS-c)ElyU>3;#C~DAkKjs$)S0v zku_a|34ht`cZB^PtypI;Ze5`Jf}+-*z9c*Q$gTFcudwg}{{tY+7AtS}cAhs|%URNchs&=w@RKA6|+D5$MBRg3LuDRE#BDkAy1cBKTumeF7ltF4>Bw`F-9t9U*_l+e#OD zR4UDBqeH`K+L!)3I%q@KRSmS+SL<60>$kxN-6!%@IZd?nxZ+%?qCL8ml)m&!eHw7v z!d2tgS>&Vh1gBg%BbVM)kpL}>z6?5iEsykW!xTtzUQ5n zUZ?l8OE)IC>e`4dyNJ)Q*VD)@Vs(fM>1-GK$rp$tM zISR^We^GD?3U2rGYHdE!tDGXlH?eHBIlV;x31meDu#isu7TCp7p$|J)1>17bM5io~KrkF5>Mq`_Eg@W<0 zTCP<9at}aGmcYsGwk{YiNi0ZFj9Cg-cZ`5{EQv{l<&i|_SgeldiD|(7E#RW1PncTP zXj<5*D_^?kiq;#JtyqQwxO5b^^~z3psI#uZOzLR8aycE+6^Ye#m1g3y*2RgXiOxk! zMQUSRm6^JD`Lc!cmUnh8x>6)xWhaXy!WYRy=()A3ZJ7%qw2gg8Xx!(}xapb@h?3Ig#D#& z++mRd@1GUQTolg;We%N3+MW7RBg=~(hKW|t_B@b}mLjUo84?MFS+H(n*`!rxa1DUp@#i5l&VLR5do$qp z?vDC>FpWX9CI}yoZ5#F!ISQ zcCY6MZBg;Ov_#piQMFX5t0+b1f#7=qej|%|aI{E=gNk;Y zX=X$$)^QQMb_878uNrbwLzq(4^`P)w-2QBde@1|uB^0TwQ7&A|6G^Vq-y} zsyq|S{ph+mWe;HgNeNvqjEwg@rxptNj6|{r7KLA(8K^(Qfdz1V&Ii;iq)DLe@sRKU zNLW&aJrqR&dtO}%z)BxHN_0viCk3=dv`#Io&{dP|D_T$fUn4f@+o(5HhV_YAFKK{L zT~<$?ra=sW{}qaED%*s0pH1Jb=h3xiuV9(hEW7IHu0Ac&G|F_ZxODuB0_ogTL) zD;;x!u^JZr3?l+#l;^9h8l7VF8J#7UFEIn;_W-%8>}i`+gmNc1L%H)8j8oi>k{nvs z)la$s1n-xL^Z9U{ioX2~fKHZ8_t|z#QP$XEcXEdFL%AuagZAl)w4Cxqa&Ar3028u@Vit zErVA}-Yf$*o5t16;-R;pE!{mj%t7Y>eha`WqR;1h=n^p42j)h!w?LOb_Gn@t(;+XW zMz%Hvv2m%cSOn@WpstOU*&Xc0ZylkjtWtyMHIm-DJBsp~qpjErF$D|`B3_Nrq!kZd zmFi+Y2=u8FE5?kb>PK=>tODAclPTy{r68+tW;f8J99IO~)DRW!G;vv=@}n1yl=^SY z_XpukNs#wOIc-n7{HC3j#fY(QI3|3rFG#N!k3+G%5Ovc*0vt?3vvx#N0k>JKZqbb^ zod%pazz|E{48nC8M86-473(jg05M;eNQHsZAK0)XMIfnoHCCqFP3q1`xqe@w+S-s| zH=t61M^gSi-R$^C)4xM0YOG+y-5v{S}x>5tTrZ(oi8dTywyOn~?$?DSE3C2+urR>c3ylaekht z`Gf!pz;fdPxS=5;)`_?>N_fp_cKl(fznv%d5I&1*!B9vJ5-3)Dg^j`WQ;vD*5v-MY zX4iCt5zP*x_Ld|?L{NKvQR-h(L{l}#NZ<$?n>RtS2`CG?>|HqsV-Y5k&wg;@f$Rp( z!{TTk7Ka?rNs!BH1!>$K@L9A={;Pibx*NjEww9*DGp9=ZCxb*#P@TLYifZ$bugW>- z15XzL83@*%PN;pD$VDs%M#Z}^Kiy=G5!#&`?MEEEs**%xH$-HAH2z^%=L(x4 z0RT;l93`Tq%{s-epk(JILj=}i5dZgAR%t;IPqY9vupf(-p_bHG`@V4wynWL>iwk zw7WJCKON^4pWHnCa;$*%G{~EKU(63Np&gQYVtz20zU|?^=-Z<)9P7MUp`-TwI9XD} z^1p1bKLtxM_(%+|3G`6I@#EDP9k{?w7mfs=`0KGr(jE|Uy9kd544_#!w^J??cxy<1 ze=!!JjX;C3z0M!L7%P@6qh`ST-54vP?h{*Dz0Tl?(;`3>u4vKcZ=a5pZ~$wUltPep z^t2_Eff%Gj_9w}Pp$78jkMvhL8;ht~zFBTwx}R*_x3JknXGXC5bdIE6-*zt4jN0eg zdpcIYy@=eqP>Lp(U<@`tI#z}TQd6imci`Aj`!FB6LKSyI0ShP?#hcJ9IJ9Kjk$UUt zSUG|=l@vm#Xj>5p8%_fpeJ+ZMb7DmCD8R)=II3zqaq7Yd+wD|$XBv0dCU1nkXzGPl zS^_GCdXoQ=y6SaC67(JaHmh_hz-r9%ullakocc{>L^Q7ERBcAIq{S4XMGK?v2N-=v zqtiXMXRx*)L4%x)CA>5XBp}W;N)yDzf zbtW1U8cTaT1eW`B2FV?${Sn|coC&T&!)a#);3z-?2#0{Mt$fz_NDiir5Ytv@1l^mo z!!L>W79e((A1JYThSh@@Lu6>h1C+lr4Gr@i9Fe$yv>P6&fqFQ)>Z0=(U9o8C4diWK z*nUO(f`!uC|B<>#cR%fMlY-zdj3Q^qaUxS4XQPT$I35cMU>V3#fDi`$^YvH}C1}0& zGIqI}F>t?(e_@F=9;R*Y58)3ejR0P##F7E33jr@~$Rw*Wy?GB6kQog5i&$n5CBuYB z^|A%S8oEgTMBSJZLc$lnXs8eK(nGOA9j!4$D~+V$HXqERW{^SAR_6aA+Y|DHRJj9( zl%G@;TJbt8O1%!H5=Kn@3+SG`WH4cG_Ee_{7L-SViro*Hymqi7!@76RBc!42fB!&8|5==y=D0C%Fi)o?V>=nKFa zpy&lr0387ZDh?bP5{7Et*41e3#gl=slPR}-w0$$3T zuhf}VKjg%*kbe#2_@sj#S0YaJ!W7V8;dp348o@_5cMXxFL~lP}j)Iye1h#Y|D6929xmQh%bLu%MtMJPbzea zkESqNs~jI_(PSEPcy~jHPHJ*4)cnkrGXEodAe+xD>Pq=suD4RX27=VX(Z+K(B$Yy| zsj4QMhZGDYs=+NXVCI}jj~mPs=A*^TK%Dk%dmZ1qaomu)b~H6aTUNvZhJkjeuAM~B z&-Sy`rty)W{exiq5!a0;7cRk=;w8BCo0!!s>NN;kO7)HFIpb|@xjS)18mO(V@ zOo|q`14J~VP@b~rb&kKAdE)p8@bA?4TH+|`*WIQA`a?iZO*+>F7ju4HD;FEt;=ao7N#3%VM&9FoVRGee*k0G zq&Msa!1+$eE1hfPh;Y}H#Q41$UaKTxj0lnd=I?;HZ&FbvT?ceQ?XZFZgbs4c?nBwb zlNM)|eMObUNW`F54qODO75=!)znJv0aa%w+lorOl9_TbSx*H1Vf=I|KDf7K${!jB- zRYZ`+Lc|yH3X==PhasY8YBzA<-$2~SNe>jd++tZ$u?ui}=-7prys1D8Gm;8Y!>3du z_+~*KfbHTn3iPW8$9MyEL@VmYtqnh|q-bgbPIQ`5hT0kc03VwN|Nk8j(<>@GJQSBS zQJpNKK$)shw85lMI4Y9f{sG*JfJ;=&a~myW+?ZkDP*)p_3VXW7)=n)Gn>qr}`vJY8 zqSgytgnd)DGqRx1(dZOy#e6i;T_X*3{0w!ht-vM7mU)FMo^jn%l~a$~SP~-i1iKR6 zRjoF=;fNR_`;xqKJjAY?DjqSSC#O?1mfe*+X6`K%s zWfEP4y&3XviCGJC8rB<7>#(oIvKE3XH^?x9VO>M>8UKUY*67+a$AlA2H3YupG%*q! zJA&GGS3GOW4-NdS8bmv%Fz`KL3IO;n0QOfj*wnjTMb?UUYAme_prfQBK-U1~AYhJG zoHt%?GQk)M^)wWAXdJDKgigU|AZz0%0LiPo%hMRRQRG0Nc0Hglu-hY6TkQkAY0?sr zsQ+E4mRej)-kYv+z6k!(eI~SBqgAVLXYtLHFp=aPVW{~P)Lc_(a6u>w_ZG1+@~%GR z);&euF-~sZ_TEJUizpVia}@>75iQkG{{ZiQv0qq9F9@O8$-FT`MX>mt!gHhk%PD?k zvy5M%%QW88M@qst4FNR|y(7R#Di1O_n-P&f5^uq(C==jLkNOLIh%r&PRlqe5kQ~j8 zf~x3REO;RoG)MjK-JvmXm|-n_B{lhz~sPUF@nL z3UD=h6r`##MI<1&0YoIC{$IgX#Ohzm9in4JI?0pU46J~(Y{FR@CQXgvjG0oE291v$u?yunhXPKlEUdBo}^YHcvFGE#CpHGp}YlN zlmYQTlagYDlP-<=KToqOIg-kqjdCvo1EHhWX?wl9p@==%q+o zT5&UsdXx%35wPXG5(i()Vij=z^^s><$gfy-_B!=PV%}I;Hgrk;d!5TpV1cz5E7O-^ z(tn5Lfa2k^F%k;wmW(8+&tZH&9m{581Mf+?7ibi3HE>ibK0FZ<_IlA{u(;{=6vXiU z!03~QFz&Y2k#RvPfHX7j;8E44_vqJu_uzjvSK=&us}787^_kuyx|>TMwM6VXrlHTU zdSUEV8Svy{W6(%%$eVy}ue@k{#Dq4KK6^vn)-ZH^CBq2DO5JCCfg&FA{p2HEm1_&2 z2$yJjmtck_XW&GEd^~VuKtwH_wzH!2sC&V#lT6DJG>H_kQFD`0m<7%-DA-W>2sEZi zfT=Mn>xt=vLJM>g1*{?Vs~cg`fZA3W9)I6NGStEQG%3b&qRDHw@DwDU_U{MU&dSf; zVbSH(1`y|k3{}qO@N(w-WjD0o2+XpDiIzoIivuwE4z+xSu7zwolV(win8nwiioKOT z`>It%psoxrz06;jxN<@3^7dt&iOyE>n#kRFSq&*mmbWflVI|z_uPeoe8``gI?`%(8 z(S9uo&@&?e{@ixM!uFQd#QgcKSBTG$xp~r9zFd<@m!X(s$_^5uBa{ooWdH;pth~iT zFxtC91CjY-0@*Q-y#P2-*=92}V8%SsQ0P)HVx+;6jyhsvpp#w&6x;kF(GZ!NTktC zhA5mt;4G<{o7rD?tD-kGgxH6NeM)lVJu|D^57D7Xeko3A!!T85H8%G+{$8A?g82*` z{1%_5^6D9`+}MVu4Y#!*Bvn;|n<-Rx(1m4mX!UVLNrsNNx`RU)P`U@DH&tO3p$b=_ zuw(S)$Jty|NLU6Z1_%3bBP#g}>8w_3xxY#@3J!5P*5TD8S9e@F-#EwEhYGh>;c7~= zLbE5YWR0yVY^XArf8~5;fVAWa7nb98U^WtjCF#WF={QUSgM;Em#sD@`mcmi$K=6ie z2ENLf3vc)ntVZL}I@`pX-=UTbAZ{hVPF7Xt z2IKWYodzQVoqUUAA@b93%J7F5_m1wG=;Q}6;a#UEyzAh_^-Os3xr1hgybf~@^@a`U z&S6gjbNb|KF^8F$<{XyLIMhxX2eTOaLD9}90F;;<96w~@7&91e5_M=S>Vpg{j&{LC zz<_%aa4RO`5@8E2p5@wbbj1n{ODa4AmJjODP~HpBwUaBx$1PB0FXLDq&9bQpz_2dX zVE+cN&69By-2&4wGUFs8qZ*5xge)Vp@#1#ruEIIj?wI@nx-_Y~G?}wYH!)n&w6hq_ z?auE4Z#Q?RiD!1_HjSa}K*lh-@;-p-#?gaa;TYZcJwP3$ZnU6sbmLA9 zsb^w_BsZja?fXLj&8vog$ppm;h%?bm^6tg&w1c=?!_wm3?F6(~U2v|}1JnnxY!WmNZu$gp>3;z}j0q#fxR!&(|3k=gr*SkFepcBcK~T^7~EknmqDqtOqH4$iv<`c9xOsX@%N32MF@LbAF^1JmtHUJ^A6T-5u3nyP`JV4`C6 ztzRP{)U6Yu;^Z)5mtejP((B$yn)3bysGDlA6f{w>rO}q^rzcKU1se-G$=-9EqlCX* z4 z{wcAc^Zl+Gq+NCaK^m{#`6@N*6EH>Exu9$PHflXw(`eV~I^WsaIH5s}`$rW~ zO#oFlc4*Y^0QKYXhcQ>EytK>#D?rLKKiMfT|orsfTCyIBS?of`%bAA@a< z0%s9OS?eW5#xbO~DtTw2Mc3{od;Hk7jRZ7?6=B!km(7O^fZ}!$)TfoUc4_AB8 zlM0=t9vdA|G3nK$ZCQZ%4?pF#q8^UqP93BJzk6JeA+!%nX$|`9a6I zsK|Yo*6}^!V0(-k@@V8D@y0P#=lBi<5uczE3iuTP#}_Qa3n%JhK70X=uf7^~wf+Qu zwS!ym;So`v+BT>SNO^<7X{>0NSXAJqyV^B90QIxIkOJABGSKt7P?TTq=b8ahp+Ns9ZCjaC3`tpge%)@2Q`w)nWirP4KIMp+<%E1vnY^yPYUy58*%qhZ4 zk0kK^q)ZZMhYshrT^W2EaGkit=V;kQhy3*pN{Jh_X^L{3S8s&lg-acZpehP5;*17Rr%;CttempOvzK7drwBjTgZQ?r4o?GCQQE9<8 zX%e8!rx6OFzDL_ydwbyu!zQ6L@g3*M&p_d;48?8Y5FnjuKzpNk@XV;RaGUXVsN-A} zN8(hKSkOjZ8j#+MuW|LYxQ%BY79z*FD}l5+l~yRy@b32b5`3SozDMPEcb0dYm%5N+ zhRP9WBk4v#JRy#dR`t1vKl7bSj`Qp$B+XVy;Wp|DF+ix?HYCn*6ODUm!H*qCyj&#) z+gwKNL_$I(MB3~thQaAwNN-i?#ckq%5?SV`aWB%^RT@A^jdepfu04!|4l{vQD30^f zJRj~+R|z4M5K`_qFT|0uT%{DYiDo&@p#;9KP~Xescl}V9<8&@ThU-*@qPC@7Jt=-s z0kn4^sY@k=+Tcd#Rf^+$GKG|+N-1qa$R;hMgjIpQTZ`nBO0Kq(tuEYzjB8ZJ67CQc z{t4Q*A$6@v4YtXcc@VY(38ONh3C~)HktL8F=h&`_JMct=N)L~YwW|bC#`69?e(snp2 z^0um^Ad+~(M#^oKNZF=R3d!c7*}^%ttrBQ=s)Q z3DQhuf9xqre#=aD*^S2Rr{tq5nHr;qSzZm2-d0IbO0uqBN9h{MazbUn%R`pO3K{As z!#gSiHO$h=$GRx}q)MlTX~leO4W*q@X$bUi@AU@q21?DlP)xH;Wk~htuwx~Zqd?^# zY^{He-9~94l~!RD6$6vT(`Yq%xLtYV8uh(c?o6i#M+Z0hryQ+W6) zwc4UdlAX68=~wrX&`(#HDoBBOpKIFaj}=rS*9?`bm~*B2d$8@W$>;yeQEFDRN~MZO z)rsg9u4tpbHcC2rw#qXJd3XjC8_qJ*w0o;i%^a1fhz$y?DAGgDv}4OF@4|$w(gNa{ z)jj^e;R>`ep}yk`Z4&n~s0$_p4IBOSajL#mz1BTCUOykxuK_J^t`?s(6J;C`W>r z=Jj-r(#L00rt4&;<|4!B^uKyK0?T&esp+St<6r(86THeAA}WQYBDcp^l~)nX$5by9W)@1n;2z)UXhm}Y=60FV6w;5sZu0rwh|+AgR;7^$WHiM0 z=2Xfwsxsx{1`Wq|YzMV&gZfx7zaQ65;B$KwSbD4R8FTtZU&F1H_`FGd=8!OK`0;@z z6iU%hxlN@8#Jv>wUP&Wmv-%#E0xCG;JJw9Xy;Y^s-Ji-XpbH^U{Bp{$O=T!#v0Q{; zqhobc-<>J}Q#77mBTpZ{kGav;c#vdsyGjp;OF2-kfatkfeWznS$`JD%J3s=rL#6pC znhYhDQ;B=kSMdfIK5wARJJsh9qF_ga#pydXN}PH?B~@g5O^^TxcbCeANV+wmzB%;$ zVfDQ#`|E%xzm4+kR{0_{-i(NTWO#?jcwA-RW8jES7Ex|UK1IoUWpcB8S=8}eFQj#Q z#q$-ev_7S>g|wxEb+*Wv*O=EBr@WY{RW=Go+*&;YndCTmUS$+c7A(3& zw%aO!qcZJRnUs%JR~c&DUOh)tc|c_qKLY zs*HYK>nY~N8{>^jT;{#4aupfogYPbZR@b<{I)%KaVGO8z0cl70#zmg#jd?Y0OW#r1 zFo+Q9o6^(1>fqMK8p@9Lo>W;2NWBfu^}X#Ah}+D5JEd}kX}Z%(5Z@t@cWq;xQG4D+ z!fa?RHmwoWC6_mLQC{?4fy$?j%s47fqH&GP6H<97atyH%@DGV9SC~CpqH;w%deZTA zitN`lUT0|PsLCI5mvf3WU5y)L-IXerejU#7eNwyp|X}#y`zn{)ocPJ`XsJ1sU@%PS^?J4*wMJv6`MLEqgVp_ekw99XHe02d>nW0;WY0$bWd)Nk5zJ9p-1U^mu*Y8(r3{yw8H7o% zGL%oH3<)EHwAxgLis_W0Rb{Z(Qz}#SY|7NGGRgInNwsSLGA%CJIZ0KXOu$P*zdi+?R;xlUyvi(PB(J^pF8P6ETbRI0H! z+T*X^Ole6gO>lCLzu`_wOPOhsiF^EwJ1A|9N~86Kq3!ngn;xL_wJMz~F;a4S{1@-0 zgi)11CY-C+_V_P(ijp^|WE{KFHo_kNrTZ!IR+VThEcW<6@(QJGQfb5j%_bP0M=A9- znJPs1jVIbVgLzRWSnkA5mHAHN_UH=dbahj?5MsnH;~J)+^ag}KZuB_?(U)P_Fu)s; zCc5!m?MMhegzs2#I!uJEDhHYFDhHPLZ>8Dq0Y5Zmfycv+uRIZ64h$HcSzE4xWR7`NPGJutyZf zeR237ZlDI3KI*%4Qu4iEa8hFE-m8)d*arxI(xtF|)JM46#Kj4~nG4fLeJ>z4*Uk7i z50;MmkxUf_arg^i=g6;3A?#5p|J$(#rl4P2$7S+GbcNsuM)(QeHE9 zJz!>=qq6x~1E@T^%siLtJgg9K6Rc?8!)B(0%%s-I8-3GmokHv6R+(U~lkc2D>*V(T zpS^bhuQIFd#!t>ICpX9e0)&|WfdrCqlHp_~<3tCWljH<4lM5lqV5-QR2`7iwNpf;K znWTQP6O}3|YP9q(R@Bt;^-n8mRMgZm9sIiw8Lu%h{QK=!) z&}2?QuMx4!B4Wfx$O!Bg+#`UX7l_(zQCHZ_f-da`eTv$}eo4n>ZQOU!88giyOmL~0 zhfTT|hMu2u)^}$(EBuaP|4(TduRf6B-061&{5R>>Bab+Pxc&8JeY?{c@jF8PpF392 z0-)2t*Pj#bgx}Hc{{{0_Iw$e<7xlpm=d|B3<^LruC}NrJm>>NwEyGejJnL+%^PRw` z(dig+9rxe+Jz8R;B?3A)MyolG!yw=!;*#Kd^LXtIub&wGOug+q1e-vT^Be2%1V?n3 z#vIrBS!5Eht0DV%@S6Osn?^~l!5KL2&Dc54+{>+iv4(ee^MHD#bD&N7z@D~RC zh@>O5eIg&J9|HBLq^@kV7qe*_y2J7LDKJb+h5{^gi6sWJ%!6<$Bcr+VU^^z+)+Mvy z>=))aj@(;dJT4i1jp%>Lhl!+QV2*G?Qm}+KVr~Hd%>&wuLX)?lL82eDlaiL(s66cs zE20?GQiAn=K>U$Q%^OBg?Xx+wX ztv-T$L6UPDmFu<~j-Orv^`fNaHHsq}QeEdkz9h+58;tb9RwJwI`CA}emL$I(B3ZD02!lpmKuDDg`c+BKWqQ{jUrz{X7O3-*>TMLGkmEn|@co+ho%%D!3)J;q zm*2A**_{M~7#dRy(hW(_u^HBcy3fHUm%!3ZEX9&#Rk9x)a^|R78N->XJNc@{0u_s(4tarCZ3>kPI}L zFfSj2i5j3}?3YA30j}RV275I~0>YAqmYl$2UsNID+0sI65sgiZeae;l$W!%3uo;q# z%qHvV3Q)_5+ApbovAV9DQ3TIC89zgkXQl4Nr{$dms++jvuxAY=3#4}wl9ITtltl_X zDaos$cx1P!7fnI@4Jx!Li_5k#x6Kq$M|aqws7B_6A~G_MSft7v-RnNP6)8R{sd?Jn zGB60Q5`9|I{U)6bjPQ^>0-kH6)5jzau4bhBX?Pow^XBOi5RXe@e&X%J6bFSrAz9>F z4RtLb7gE16W0Td3!a%-Ag>q7oF`E^ax`0$fai5YTzeSQawScFbTJveildtlSM+hu6 z#4;;c)~YPFHiEH<7|%$?EHKLTi#aODIY~o2Frk!dmk|6I>Bw2hvNGY?6maaP2+m0k zH*HbD=fhM&=jG>>3HOJABV#Mn`-0?1oKak6kAWnUdxxg)rUi=`M+t&ol62amLYpzM z%+^hf@3N#6fMU+H=!hL&yk(2SdGj3Q?TX~fRc{?f`X;ICyDG^AqWRIZhU^3LW(Dw_ zrvjK)_)=Xq4!)zCkgRKx4-3R&=HLzDJZa2zNnC9c^@ zI2WMn;Xc$hSr*Qlek!folD zBb^!dSvJE8GDLY%+4P#kout8aw@xV0me2euTA3(*6QTT$Ac446sd7nHNg7m7?{CC}=07^JY86Qk2Lc z>kS-Pq>;sv!*5w_Do>o^DV03D8W|aucalTO4Jx#9izBcyahB*D7PJ5Uiv9}Qy-^_p z_~fk7StdA#h|lta1SBJ`J#rzL3zTt{uUhiu>9a;_*>198Qi;DtvRfDC^8Cyvo{bvno?S=kum>NM+qG zS-Fu4%UKL^mNRKi99AkWR}^fvISt8)y-#B5 zCg*2X(Opr~(Jup7UcdhoDY&L`4XIr0O?p9aU9Y&Vq%$trRwkO(R^+!Tj+NNSosa>r zt|(kQ&O4^>Er_>;WC=`4#vH+DE^L^K_3bL}l;riAGdJfOMQZP;c{(iFvXyz9)tnY8 z7L<$~v3SWXHsg2XnGUNw=Q(HNBfe8`Sp5_BgrD^Do^atiDJD8&o+nL z-jMBZbM;a#t%^R%@f0{$29(_m*$%JGi1p`b$t3qSWIKE|i>Wln6gG29VYVaNW`m^T zl11CHknPCT*iJ|`xdS2FvBGA7V_-(IsQVAH9r-pF;yWq1wCxAkj#V1lDaj@_A7ne$ z*mV92R-NQgw;p6W*4mudcQ7lttc?fRj`cQ&DeH{nO5Asl?bu**Bb#%QQ`;ku?YP@! zLq5++Hn~M0+p$q&IVV|^wftVuW-qsAJIa#yE?ay;&x@SrosD;#zByCR&p^*}w>hjC40e-E7t##o3I{8K zZYP(r(h`u~tCCaSwxKlyGtu*sH=#z927wy6CfSr4(Hp~ci$!Fs)Opd_csS2@&dkMZ1SA$%f~ZV}l2=lqL!$+b24S*}}8t)|5QS zs`MmEAA!pEOBTH+(YuHO$(7KPC_M$Ly->1QJ&Dpkm>N_hdGww{=_k;W6iY6vttpN;h=Z)06wm`->3&LOE?9H@d^xM=4l<>qy2-`$dw zV*B&6?k!j72+4knN$CVGa3>J9C;?nWMG8YQo| zrA}o#$xvq+(P}|%4tb6^H zQe@)kZqSO-{$Jr?T!{LpxhEZza?oZ6TZmgO20CEq(W{ zZVV0>{d_350hgZh-e-s7LlH2Yl1v_6$fb4OA$&h=eXq>6?|sT}Io>?AP`Vvio0atZ z#Jk?W^|hxLhPHw0jO5BR?+ycT^LZl8Nm8zQX&dNehlzex(sLANFvx!pCh|E+MsWM4 zFwpaySBT-fWXO`&bb(snTp;QNNkzhVn+9kbr-^h?Bhg)4Anni1qg-E-v^?#0EpUW$ z3yI^h)yL_8{8sSC2h62flSPhgiG#O_wRQT z*SzE+Un0%7tb-!weqFo`s&!2=SRFy%2?}^!e)n^Rg`Xl}`8wZiD8KLP-+A`r zmtOUr+K;@j)3ts5Q$KM!DtR{-CjTQ(JH3tt^d}1(s>``jw2S@DE{q2mz6{)X+UXcv z@UQ=#cN@Mretqa(Yx7y2^Kp3S0%S|!!mvtOoHMsLV~5ywl$A%)WOV4ET8NY-N!kgk zI8}0zcaORnF?Tmm@c14m+ znmQj8U6!#uzTGb4VvA3dR>XPL*?7+B%R_0s2TeR{)t2v;h~j!dDK6SaP|6`AiRE>f z3Z-1q)bct(qzXx*;~BKRD0g%_Zq5@&KyuKElznLI1`(?zF;Ba#2-Q(khBB>@bgeq> zP+(~dnnGJ^en|8#+p*Cct8j}FaI8d@v{rOv0g z&f6`DTIbVT=Uo=5Qr9ErFHe!oZb??opWrCZb6sU*sz|ChYx1mfb2()vEWc;65f&PU zSG9&hL@Y|c)*WHFU*3L4(H%qbnW~tb=M*|ts;XkYWJ|D;|4Ep>^V>aTwn7d`ZrcF< zk}!a8Z1)o*EZ4ZjB(%2QdBTZH0t%qCf8>~Q`d5`aw;r|#Z{(rNbgagV*SulKa9G^G za_@TDqhr&>VmfK0!|{GU*)Eb3J8p~-dg;X$RZOOfWGGBv&}0R`dRVe%H_97hkd+{4 zM5!a05qM5W-&=7QsSWZe7I)R#4!Z#O)=al534cAJ^ z-OMTn`LrZclU9?1ND7E!R&uOQ;805DW-+mzk*xWNS4lnVb{?nX%t@9+d-Nia&syXF ztp?bt<#3w^GA07I6kR_j*;gdw-r}DMEGYcvC4ZJ(5*F)`K$dcH@PcH`)k?)ZCcLQA zfdYm5qU0`6x$P2io2x0u0>u>UzgGTiC9E7Pl+u?)%4qz$Y*Ey{EM7+A*A( zZC#VxO2KLlL6h;iWYmjQ^9-82HzaSGLe)HlqDXI9VR{;9FXe=jWvzVi#TWnZBMlDR z3_am=EMzRW8XRu^`@dgw-Ey)0f5iFu#=X9yC@Qa`?8quypn~%<*yqS+To3X-N1qRt z7e|15(C@`{9ysL4d-b!i*eSoe8^xx`e3(-5V|F8rcVe=Rjc@B=E>)4aM1rvY46l+| z?>AsOpGH*eG0aF#`}lm?^Dl@d~#Jd2_#&Giye8ox!VbkmLZ2y&F> zO$FBHK$e|6XS-z&Rb^D65X{;rl)UB@KB65gs3TR8#Uu1@+WD=R7MiKaMlYqHdi*BPSwFpAaac8v?CqYg?P^aVZ%&Oh*+yGjTs`{jp4q!A>O*?#l^9X%%eDM+f`9)JZ9IP4Vz(jU)hO4aEk?+8T zNB1^62Jyi|ANJsnEc%1K_Z)&rnz!f4*`_~r7LpzHzoZ_-1ZI?L4+j7p( z739>~e~nyL$dAh2?Jcn1?C%&%>5W&Mbu5ADW`DQ$mT!Z}Ccoo(yZ#8j)rb&fFxVtz zMMJ#5e}dn#?dOwtbciHqk$aH%pp|%fdDh{);zY7T%y1P`0lQpwpcD#SWxE}|ljvD- z4-?+5jP&(-9bR0X#Mc6P9fxp>5!kRz6J$OrLKiCah${GzfL{uZ=QR#Ub#ytOLol}x zig^ZFvS_#1Yi<3RYyXLBs#1S#rY7tva$R*=bQXZRLLcz!j~I8?c0N&s2Han3@L^@V z63jFAlA)pDF*E{WgJi%i6l|_g$fwG?oJOgnVc;IXdkRLB!xE(@PJNcTvmD9 zX*4e(Odl+lkhoAb;WQpyLZW5}Eg|q$*`(8$SWKX>GKG;s!iERaXLvDEpvEpH-b71w z|JAZ7r_r@o^y*$%&P(7ScB@3V=KBX@1L&QUZ`g4#%&qcb+2JKLLf$SaA|3&57d|;OYyyAv?^eY9=LOoHqQvw5+mMIvV;GvDfO4l zCMb!WGzd|BH=H<4rrG&GvZw5f(|A?dG}>)>k@k9L`kGV{7X4QP#<=${9Ja{j$^8oSM;Ym($y? zIE@F=aV^#&r?y{B=p89;T5RDrAnd`H3o3n&AKyOjG|JQz=yLS>G`3%J8n0QD`?o9K z?(Nr|#`Z-cu*k*dvdE5&ih(>5r>L;IPh{j zDvX;sI_>YJ+wY`OYBRjH++m8ayHNA5!tD!AeU6LE8DVM`WU2(;a&7X!VXPBOf2-A-cq!i_26Ay1Iav8Ph(wevw z$fDH5n8_O2R_rofnNEtb-j_~5cw4DUpMR*;lw$de3$S}zxl1=j)KGFkj(K-(t5~GG z%+)bo+v7A=Rhdi3)TY=sBlMwSTfk+Mr^_k&ExCfnu@-NuUPKk_uA*RDjmtQgPHf2& zi**!(Omu-s9>U>F)OCPvchJ65rOY?L|i%TB|tz_GWESPboq}`>DFU*LsJYlOWamS98 zbh(Us)xsCt{2;Eiv)9_W&+?C!bi0&^Jxntt1k3C%+3!+k?j}dVNfc(?UlMj1_a#N2 z`fv<|h-2d3R1!&0eNKTIhz{KlyHQhOq^cm57mgm&a@7=v#w(H=87?pBcNrVgCX(VA zD=HaERXy6N4rcV1#9c;Pk}&gX2x7q-T@O5{8N#;JWzLWe90({@@PnlbTPIS*Zl1Fe zhj2Ldt6L{i=^7b&3fJYWQwd!f7ciPg^06Eei&l8QoV(F9{@m8XE@M+tCQ<6*Fb1b( zZtD@3KKbBSl%r+LHoNs`LStk$O0s?6fH-3(w@$nCsWEdV9+D#7qymzV_rhwV7H>O~TsgNs{EyL9K43`q@f zu}C$al#mvSY?*Z#MM)*BcJkd@&bahB7{>^fr1PN^`&i4CIhSrIEBxZt7rq#hnS)!- zrpgWp4-ZFig(PuRJt(zKbdkydjp0CmoQ@cQ=?Bx}n>mrOyHvOW6OM;*M#lA=jK|tHUrnXh zVt}L|>6&}2c=NnV_f2!G=)SDcb+OJm@zasDzkUr&`ricUF}mMVWYHr+_2 z+UD?KAJgS%u5G%NDoKe)a+&w)rrW6$O+Q^ooa3vz=L~V@Xz9yEnXf)%-%qEXpcdu~x-KkEHa)d`WWx4g4AO}!S zt`c85^_kq1=T2eu35Sp3s~n4O^1F=#NsWy>NlE@-ZDg{2V6m!)l+xwtI(wZDiVJ3q z(Lnd6f>e;GINHJb|E`g#JFSkh$?TvJARYu`YZ61%jq$gNLVSeVsAP|E2;gq^nI z#@xnYw?3C+cKwQt#p>(y#!`2R0g%_{+IklYd37rY;t43onjPAI^W97@r~7~O3$_h^s%CUV~sn7L8n|Y!czBd-09Y5S6s*#%tTdK zi)_PV?Hhyc6lSF4BymP?V<=S#fGOz$2adjaV^gYBf}fnDlmuog-`L_d?oX-@)8B{N z`~}}&()_b6WEHPBk2pryd9CVP+D{}q4QAEz%xBm z3v(6~O{Xs#?OsJ@FDN?Z*4-wGU_M*U7b6lcjM0pu2y7=HF>N1hAiDb9bL~>suBS>4~>jiUb|K`&2^bss*vO zW6;Ha6ku%X?$hZDU7qFdz%4?|9>04weQl!s@wmyH#@%P!y1!US2sp(>pv0P}wQw1A z-#zCx8q*Xjdz2|4yckIf+7PDB!_Z~ixa+K2_f{$iNw_6-nNr7P&k`IMF+|T2iyPs) z&LtQlN=)hkK+1$;!$|2}=hG{xyyujQxA3kD>9wCK!n#bAxwG!Nm|mrsl`mIi-h~a9 z(n~h4ceS~1ZMd9Zo+x=nI;=Y?S@g9HSJEpd>4dnDpYF6|{>vM#rca7`$0c)L*f5`7 zIt(BC+EZd5kDc9cEq$S2AhG9){s#jux5rrXub~Zh+(x_F?9}kTu|X8xu#jMO zsABE%=-QCs(dYX*pDd6Ri_xJC9*`CU6MnX^c#$ATc2bbB*}~EUT~T9MJcTobB0(+Za&&ZE7gVh1OjL3aACls+b24&e5irBCkm@Qx*?%+|8|>h`U`73 zx@S+9PJ8lyyBNZSJ3aceR*6A>5{>dZ7Ay>UjBd5PD*X2Adc-^a8|*R)6owL-f+8Lj zmAGLi-Atskuqi<^bvgQLBwUk)g)JW4cF}`qk7`heMRq9V6}Eef-%C?U$cDX-Xb~Y9 zgiPBE9^I>>mkF~=+tIkRe*dEE_Jeg) ze#ZIr;YC}e`TPUd&fNM)dOg*jNF)BS+4Y9U2&E}J)Bv`&TJP==zg`IFP!#&f_5F(` z)7;a_$vnP(D4`413(T~Xh&P2TdUSo=p}pS^T&3(C}w}1Wd^mPd# z<^q)PwOL-VG0*xF9(}r|f`$}Ce&@tV==dU{$73z)PJ4{Eq>*jzz@fwI zT-i(Rc(E0LQu5N$a((TrM|XhR#aL^;1(~dJHcxDJ?V0qA59*?9Qj#X)*vYkX9^L04A53g*-I_QamJS><-Ywe)s3 z&v+*&A4{yXrAz&M!F7+(lSW;!NlSULd9lhemWX~daHil!!gR*=y1?&E@TQ2PTQtpu9C~7w0;h6jmKPLw^^L?z8fZ}9S4Oln zj1?6Wdec^>d<>Ri9P<|xdG$@0ig+ZAH^{dQ9~7&+DNh*~3u}tKX(!BV=79d^t7(K^gtZDbA zozdWVdu(uyRDu+*F}!JQBHJ_UU(@f^H?=8}7kAlZtQqpAo156$N*$tn zc#*2m>M|0J#+8g+Umf?Rn=0$_RA=DT)e~ObJ#A+|4`t0qDG~9JORFcn`lg0-;SyXZ z=T}d8^`jE$0+L=)WU0o1xz&fgx~DX)6kDZ9m~ndbk!2Q>>YbTceRP?jRA48kIEa z-&u9ut9oDSOrxG1X;_O+=;LNrUGN%f?B*1U^*s?Drn5HTRTsV37gRDnSW>k^+597Y zeMPG-d5yJpP@Dp`)}d<)S6!yAo&&3{VpHubzJgU(y!vUC1cqAws;ene!JY~_Z=JVl zJ|Pv7RGYQxnio6NI28}5S%6h+PUIuQ8LO^)m76Zi!_1OgyWqd!HP*3^fXqshIPyGl z+keZ8o$MTgy8Bgeq}=k~_8RNeVp52;H~e>!1wgvObIreyz6fZVJMYiP)GLBR6RGy9 z-;rZJ%I|b_Od@O6P7;Z@P1Vdv{gciDl&Y@@6XhaN~K_`z34B< zOjRiw?*)Hhrd}x;x%RxjC}p;kb-{D~;)HA|#M-m|(#%xaEf)vp{N)LSDoM3x{1rr_ zGSRlVQEATl1DS?jt#0~Sd)i-38R8%{iYi)1zEAmUGK~T?m_?~Q>ED?$HY)TJ{$N6E zTv+FSWkDRXTz-^f3lkZYS(dp-Y1%ChDD-d^~-mVcCDQ4*8DP&=PLovbq<(U-FK zj@Y0PbR0+92vNA zoXtPAh#myy@=vEsDru6b&QtlbDU)imOy-|SUFr~`tTeXg&!uHE7x3uzw4M29GvWB- zjN8pe6urqN%#51+b16&6-r`T<^77B8OuqfDtSA3MW?#l#FP73ZSik%CcO~$<68K#S z{H_FkR|5b4DuI4amLu2WcV|?r^ySX3a%W7e@a5hC#(|#I?u;RzAJ`8p0vf<_U<6nV z3q}Gr*m|)4&?w9IzUA9vA>#0#*R8 z0?UEdfu+EVHSUaJpdVNSECv<=D}V*S8lWE-0_FkRfmy))Ko8IWW&q>Bg*;#G6z~r4 zDDXD$IPezmB=81s7I+G2VMbQ2VMp)051Xk1@4TCz#`xUU^(zS zuo`#{7y_OJb^+&r`+;YGao{X)5_lST7-07SO{FmMY#a)00Y3=z##Az zFbuo_><3;4P5`d~4+H0c)4;318Q>M*Ebub$EbtQW0`Ma63h)B(I`BO3Ht-xUYXj;Z zSOc5`hJa^)UBFpj7bfyaSofyaOsfYZRsz@xxxz$3t0 zz{9`=;1n?HF4RA;5I6xW1;&A4;1KWzupiicH|if~03*OSFbtdm?gt(Pb_3^tUBJu0 zcHlK&3oxSy^$#onhJZ!DAg~m;6IcPP0qz7=16zOrU^lP=7y*_8hk&KPX<#vM23Q2V z04xMv1{MJ4fqvjEU>0yBW+z=a&NN8lY`5O^Ed4!i~254-{F2VMup zf!BbOz4LlEw1J3~`foFk7fpfqa;2Gd7 za29wLcp7*CcnWwGcoKLGI0L)^JORwujQR%_0FMESfz!Zt;8EZZ@CeXfjQR)O0Zsw4 zwxIrj1;7blDKHKU0Ed7KY^f1n@O0yKb4 zz+=D=@FXw@oCWR#&H-zH=YZ9~%fJBeDzE~$04xXkOHlv7B49DF99RUb0Tu$AfCa$) zKtHe_moWmSPZ-dtN_jf zcLJ{hyMb4LVc=!p5bzT4Fz_O98h8PC0(c&H7I+SL9(Wdb1vm#>0GKGM}Q}Qhk>VnQ@}akB=7=o0(co1 z2hIbBfH#2sz&k(#=qW?}1O31-un4#xSPtw4)&RSJUBGr=1lR(M1Dk+Tz!2~#FbF&j z+zC7dtN~sGRs*jB1HfCr3g7~;9GF#(`Ue&Oi-EukSoB?J5 zPXRqZC#pZ&m*;$sW7_L{*x`KI`KptBj`t0@hupJka4B`6YkobT$hE%!Q0h9j4p8n2 z6aoUSu%Vb@WL=!ok$!BN*qf@#+r!7 z6mG^<_ez!rt z!tMfsh&w={4fjrhes?K-9CBYFVR5&IeoeS9Qz9naUG!_pJwd+?yW=Em+C4!ZkGX3I zj=QG`PPuOr?X-J=VAg$S6`;oBSq%t!`~*#&B7zoAIYGOpnxM-QB0`iKM89ghLj*g$ z(*!~9W#SBZyD4~+H;Xu1ybJWP-CIb%y1a3sb$gEz?DtksxUjdBAmS|`FuZd_>-SzJ zhvSgGVMhIB;)!L*%#3dW%w=ApUuQFG=+}kJZh}jh zbM)~_W`7CbY9?M7M+?Zr>(pognRxXXEg*A-IB#Um65Pr>OK>~$7R7!ivw))Y`259y zEZ-f1B3~(eEcOKmN_|0s3SSFBz*kN2Rr|^bYJBq~Wv6d}An045*h9W7qBZ$$P=FTS z4AHuL7YM?>Sz?L!t`Zo&Ym}CL-)Tzcknbw}iu(#F_=N8w1)ua45pBv>PH@;)LvX~` zL~ztMM^dJJ#|V!3_S47XzQYv!gfD|W&iF1V7wd%$hj41m16iv<3> z2tgn(PEeh9il8Phyw%}YMK5FFb(j}7JpCc`0-2q4Rl8%cC;!CZczCd&vhuYZvG{OL zD*b`~UjM$A232RhqvJJoC<1MGMUzl^x;U2#&z^ zg~od#gQG@l;8WROdW%gC_F{K5R-H#ihvWQaXx8!GFZO0OVQ*hFGE6_BKCwT8-o$Y@qORuHQ~U>BX^kG@zdUugvK7yR zfx5a@q%AlwA&ceuB> zc;J_tPDG;a(71soIw>Iy5vE5yjp07*GQIGD7kcq#8?q1?KJoACk44>`!|})%K1Xvc z@l+IlM#6Jy_l6CuUq*56fs?bsOgIkvph_p`ThGBv=mYJ6MQoY1*mKg^H*#)eWd#W0 zUgr^{&b@nIYeUmF=O69$?%NaG8*JeM^fudndv@<`YkQPgGMo2?I=Y%WnaADL)Y{3P zv-i~R+k;yepa}b)ZhJ*EYj^#DV0~v(TkFRre;kOeAT6VdA4!Qr<8S=_T@OW9?yj%v zJkSv8=-k`ZjTC$yjJ-LXjjhB(i&@=2ZmW#0*th#YeXzM1414yr)e}?HOW*1`zd(QI z;qP6c&X!O|M{rl@41FqiEVTE)p5|a@W82=A1N)j<@2@)0+W9FW(R*ZO#zji@t@x9t zJW+ZO7?)w-4ad>WL(qhSO$RsL`o+IQ>4h_mow-+c4IDxeHNvxhSy#{#@u9T4MvXp{ zDiUT4++Ve)FFcA?(*MG1I)4<+rpgNr9BeiEUi+7S^{Sporn$WsmEh^5gL-3G!>6O( zO8&e1YTJv^EdH|+>HARmTSHI-;;Iad4~7R0{uO;O8F0Sfq{1LhfBXf$AW_y;&`1=X zQsruSEZ7-(h6-eb@*%iqkK>K_wi@41Y7K4s_Ox}>?+&)^3N=iD&=bi*e}f(8{jmXu zqvufW=o3{>9yk~XR6a4-M+)tT@-j0OPO7(Sn1dg$VGh<)_3;{}^Im?YcMTZS8T9q- zHuWLp#wxlRpSKKfm`;ngK6Wq?$DK1JV=Q%wmcN;UyOG~kW~$TB$?+?fp+3ONtMKUl^B^^PNcG7DOng)ipy7Skw|7Cj-G03sCe3O;PdbLhO?(y4he1$Wp_}AAEpL7 z9F0AtD-I2ILy+T&;M*Oq6GUg}T0s<&a9qS(vwpiH zEI8byxrYY#n4?5&;_Z%u;=7l=L#s{Qe7hqmzWeUUlZ8Tc*zU=2{;;O{Z5uyu&kBt& zLX`J@`o52De*ZmLlJd3;=cRxA&O=-NQG@P5-{x4cz8Is1_&a~|X7Ap} z2!{H#jx~;Z{IZHD7-E7xKeRdHkzU6`zuuhD)a&s6Y;%?zLV6wRpWmEOxfZXV^^|3z zxXtKy-CX6q;(Y1Rix^&zB3IazW=j4$tR2n&_L5(}eFX`mJa)#Y(oveP_&YAme2Xw5 zC?hD&U0A7lzqS*VH(L|v+nh_Li51~m$Gr|adi?StnGeW-jm~OLUdIajEt-=TumAP%(|{$)yOH$;8O|>`p4sNW`*Dxl_k&W8exJ{6@Z7|VWOO<5)SY@JHY?M2M+^4c&oEOb4g3O>Q10N$e=Dd_C z4kI!>Nk4xx119dgoN4@jZ@{!WuV|a+IEz}ZKJv+{+UB!lj*ri0_U%Zw(V%~oBe&h@ z&iG?Ez5(yWdI#V=?CyS-@OC?$5s%}24hPSWS3Z%EFhg#L^3`C!&{Gj;RD)?Oq*3}(>i^^X;0kj zsohfZ>eLhGmp(b}^Jwje)qB9Q*M68e3iOTlfB%gxPo=9p!|jfXO2g{hEDi zpNQs)sjV{A_SH6nUf(xN^CqNJbP38#H>%9wQ%%KlYdL-~Isb9tWB(_*sy4~J@$R*6 zel*2QdsS_cr{k~P9e)+g6EaN~#IMf(;9YXYZ%^%AI73Sc6{TnEnh|S&Qq2 z%?yx3fQx%oZNtPsaCkU8A({F63i+KcA9x`=^J}%W0E}dvT6hQa{k>O#yWco+{_6fB0j+O)U-5o9U z!9AVu(S$I&x7|R|Jn8lzkJ{Mh{_Cmeie3Af50IY-PN7h1=bFF%QJ~k?+}675z@E;% z!e5leca*(HP7WW-J|98U`}Q2@*xj~IxET7#4L~5 z&P;S9bhrMF&;0UEG!Je$xS{K_x*u18lkjR=}~W{*5H_DAz@8h^~8 zyoFxf(b?S``q|u%$fwkS-v>I|_O!Hhbbg5)N1=guzwiwSsUw}=d*}0M9YD zUGuanN>AL&QuxR(N)Cz~x3-asjC?WAQ5@Nnt4 z(%M$PyQ#SWRm=5}i{y*TVKJruR{Jxriu(4T8=+S<%D%d?zt`P~8Qkw(U-v$w8Jyx3 z9L{Mrg%rQpgGRs2IsVZP+WoVuwBjIS|snW;d`NegeQ9pN&Bgh&(UQJp2-+%GV7f_Iq5jue0 zQ2(l|74fR}hS>~-pk%7;C?Z9>vdB=f{HdGvYP>CDu zm|r30bg!y!Yi`?npsurZchj!j&G>)k^Q0v!<@b)=LHO`kwV;4~h*#V%{;n@p%tUjA zi%@*wW;I$>xlIk2kUUC`Vi;Xhc|0E;5WWK@CX$-*KI?6>;BRQpj!0@ z9u0N3gj%~QLK#)uDm!;K)j!Ie!hOU4F&p)vq3&th)3xV|6W@PbGz-7#xN+P!9Q|}O z-)hBe&33oan+IiSX=-f=zPhQkvF-7P$~N~(FLpHRu}2StI?ySG7P!%~eZ<{rXN&;{ zqTU$w?e45^ZbC08n$zyi*0z1SLwiG9PoCYK=r_Je!NFJ8hF>jL=$ChQXLG2r^Q-iC z=I+kDRACqCM;3=5+CR|GTq_iP5&Z%)aDaa#jy#KlKYgD*<&f{rY$wlL33bEK8$`S3 z?nR_)B^oN7BpJgy>;ng5PjUI@wFJ@OSe+0%&wbR%Q`g72SqYs`LkX{V9a(BZ415`} zK~^7AA4Qa+8aS_Ogg#n{5fsk&YC#bp%#nyYz5+dnN#f+)B}lvW1{q9IzpVGi#%`>1!os<^j18XBZg0m|6Ib-IR`sTI{uKM20-E~c! zEx|pqV-jy0P^vDT`q7)Cxzl0BAs@?3AR*8m7_srnE>nHlqA+qYMP5dq% zHvjBw@$sk^f7kVmKI`~FG@9A5x4yn@PxrfrAN>r<5-ofbB3NU5IN0738!&qKR~C)J zJO=-Y#$amNJSN>Y{NthM3f9WjHgib+8|uV!Els6C`fuqAjk-cDxr@WNE=-oap~qNx z@?=*}Ijw%~ZMAHbi-DShW1cB+{c`wrj^Z~_%~Z1%+hVKuyMdF-ORF*j1)5U z#qh~Rl}$4o@!PTR)c=86G}IrUQ60-#A3E_j*Lt(?m_=V~7iOt*zF`k0|K6L=MPFr;)f0o<|50S&?eg8G3c+4=F2@u06(hr0=nB#=2{S z;Et}=M?1d==NyjXXiTqj?9#BAIj1E#%f@;q&;CU4G-9ZAUUH&_S%M{q4B!cjBRBL zoH_Ut+Z-z~79MEt3hnJa0CTR3ZMmL<%KAmG4|5tepRVq#UfY|8cg^i*Tc7>t_&;L= zZ8^Y(U)`g-S{uk(z&vPQ3z;^T-~Ha&XeQ`neNtoL@U8WjWA>0jyl%%|JjdbjDcD?3 z+Ixnq^lSvd!@NPP1Al>j`|x|uUi=#VZ!$lvUt+wB;~UFmL#DqUYnadHdM>csj_!{7 zww9J)YeUa%aOEIfJn%qCre6GHVbaPaa=WjE-_LseU%c=Rj+c8p8ZmqGK|`sw7y~Wg zab6eMeXbm$ z%}1xc9nIzZ?{2~@tfTYuD1qKp%+o9$w`+K!ufFfe7oL0A9bLto&2?R{2wEHJn(Lb% zEqI3+e`~$PkC!T#o6<^O1$W!N)|JG&f@SX&vbzSElghZYey`x{+H;r1M1Q zFBH}+1Cm~2g>6yGdpCWhM$n43FD72kNTnqerok3%3hHUC;;)u_Kq|$6*VsS$)eS$K zi{>X1F3{J675=Cn4g3D8mhkIi!|+FrV22HF1Ta4v1N!G29%Y9k)Ui*#`4zprSu&D8 z`{mb*quE&aH#h1W{`9A>9vPmHo~Q2+`EDg- zlH2D8i5y9Llm4AJR(0;7avT}OG^JAP>iM_g#vy2*xG0iOll!0l^e@n}p%2FObtBKV zzlpjzO6u^9J>Pg!ueTG^j>z!O%l}sv`k9VHMlUY)LLT0KxaX(QoJu>Dy#;qZ7ro2= zUD*)n#l#OwO(@S%BQo+VCCRTah->N2)8}={XZ0e&FB5T%LZoDJ{9h3nv?~YAiEaqI zm>7%D#P21tn~uouiwKg+sWbLtDk*=+e2Ppe#q~G*?6K&o%B1gKZ~OcI*V zD0@?SU6uD&f2H=ytD`wRBZ%9GV#7wXs>_?^68) zeNwBF9D-`qT%(dp*ihq(!6(oUfnR;s$Uj9rJPUk$*z;i2O%_f^)s<%KUlW>ENnq~u z`uY!gH=ve<)>Sf?l**xh-2e-j);mWobob|3IfoY)O7%%fW7004UhHP*qmuTGj5NgJ zu)_cAI+d$glboo}tercN@a45#^;)AtB}(PuGW`@~SXES&V-`eohP#HtgNNWZBo}s1 zU)|_HBRt9f{*Lg2Xh&>qHvO>Yf1`m3`#Q1J_YN=-C8Fcuy`4fSAqVYDxjcmJc`jAjmwutVaN z6m>R7*%{lrtFHaAKU+`kY>}mg@A%#hWfVWmQQ*^CYrhGp<~L+cEJ%EiK4&7qec_%b zzxa-D4gJ`62tCi=z9amw9e|3N6ErR4n5n~OA?NujqzMv_Cvp*?=u+;epZ5B6?J@IjKYyW3(3+jF_K(>EHSX zu-NKb8jNsXEK2_Ox18^tissd~9B60?Hn;79b9V3Vy~$C99@yf7anDS-k_lt{!{CYf z@r4aNc&>z3_c#UhL6P|0qYIz?r*jnDa0J~kZzLJ{$}fI!k*q=a0^P2=PVI`WL@ynO ze~#~q!i7m!uQ|RR-JpM~r@Vuxb-&h8X^`X5aBw6$y`9BB8|jbX|Z23LJMACSw}4EH5Sgg(1Hy_-Iz=jSrR-& z$?>xUY$n)9q^(+TE;7EJUGz3$6y8LPo6<1CUyC;rV*{IsNh_zs!LXP(3RN-YfFx47 zB`Fq@tY&8`F|AD@1NkW-TCqmM#Bgr}Z$I=zXh~O8*>+;POJ$?h#(qs)IE4Md)x@Bs zQ!-HZ@F0=3Y9q4H&(Jv89V0I%7OgD6(hwOldLqOK>+K=p(A0v)1|H=fA(B?w=stuC zq7J=AbeKkleZ-{c9Ig+1%1lK!5nra}(0r^?BvRxu+$Utx}qHX8XV(N?Q8bG7GdL?F|PI~x+#*cXFcJP`dl zQHoPhNU=K5fwQH3k=V!p76SH0hT@nAa)Y{}%SOJeF5-Jh6iR9f_WgXHD0V^-#!ToB zh=88mj0Xg=1Lx^0Iyw8RsWwJ~LE`>3DWW=)a*Zf7&Wm*Gmm-&a7eq2*1rd?)=<)=G zu}c{1Zsb}L_r|sm%`OK7;j5fzt~p2~El=k9+XxZX%V?VL8te%96NSW1P%(9;M4anJdrn+Wp5waDZG1PH-#5DZQwX=PsRO)af zhMr;?bhM6!HN`CGkyW~CqY!sTu$VpCO9iFX2i{H{Jv2(6vuJk0_4Ki~e}1*XC8k21 zu~Wn)$`Qk2B}OVS()<;Dw^d&m!9GS5TdN=*GeKpH`Xte5$|%$$vDZICWV>3auT=Wl zFB8>PB1xr=_V0ATplMy`SBSh)#w%u4-=vSW;;F{_Wg^)*m;LQ`_3xysd~^B_>AT&= z%pUP4^wo}4SR!kvh1jg-xK%)3?M9{doOcn?ZU%O@S+2`6`^+8m)lNJTDLTw*`fevj z^ocd}Q5)gJ2pjC{i}k>8I`~e~EUgDd;R>D)zLH70wu)SqKwW807x;J(GYx;w2(HG% zsUWm_uKAJe|0bq#)XKTljqIZ@c|9<+@tT16w1Ymaz$dXj%kAVI`sV8yX&VfqzpSBO zDQq6pO1OXIE=oESMr%!GftONy(y}Eh^DzX&e1zNAf4_Ur<56$8uN9|tMr&ICBkBqF zVUg-7`V*gx^dy)!1B0bWn_ zqA9zmL{j!z(ko4@>Ye=()rvOy39sx|=zBsa+b4TDiOLqQsOaHclvK?~sc*3skYUFU zL?gE;ysg%77|=Nslf~N;rZrqV$kdfo8kRL)4Dyb z&HYqxc8L=|_b=Qh*6Bq3HRh_MW|H9O{WisD=O3cU@fH#?6-xy5XW7(`QlUb<#Uz~d ze&k_NXt+3_jHLB2P9CH$c59XoFKiPjvbs`4D7qp!Dc?#AIoK6;(BygRTMyn;R7&;> zq*AX#LNPQ32YT>))}sjXtKZ+S4I2I=X?WbdehxbQBH_1K6mJLv~N z={ZRI{rkx|kYo1C^t)+)<#aEaD|giNfo=f|Lr)FPD%CD11q_b17gEY(EPDnQsNVx~6oAd$6H>#GV6 z5gn$Ioix)Hdj%1+N?}_T)3sL;MJqi~S)=q_D**8w`#a-Fv6!_uMg%SIN&AAIN@7V` zz8EJK%WmPS;k8MwpFbd)Rsg!K_y(eD`9#t3toUt75nGgqH9{OA7A?!vc+srGeeWQW zR_FWR^W*K4aM8V!sHL44Gh?&|oc8lr-AypT19oQP!{?*hQnSWK$@+l^bL#pz;!Pt~ z@-_|7{m-8VE0$mFf?^Z$xyOI~SD0bdVH0lz)6I##$e~yM?MJ{zrK)`W;Hv-l>!|OE zkq)H2FS7n`e%69DFybkG`qR}>tW(h6?#}7AV*QK$WKo+}Z2o98yLY6ep^3}kgP$vU z5W4{}zDEYGzSj3ERD<}z&H;pCvt`FR_aDOw*D3eW$1D~_;y+B1w0;V$-HL{#d}0y> zuBm~-fuqNtBzg{xSHha+#kwD_Kkxy){)9FQOL<*V?W%_A%ZQ4#4y94)E8;(=*j7Ui z=x`w{Sh))J+#h{pOz*ZV6A#S4qEK2>*G6qO#j16A$}ssu3Y(B5Z4CPtV$j-|$nE`~(gWv+8CxT;Na8RItqANSZ2t@;#ftR8TqqkN+qTZVa z3w^LNrrrx7mIRw{SvMVT<69PRDFE%?X{{H-*52qq*SV_~vCR_uQ~DzNTK1r@MxD1? zdZVkgPhukS@ejZ6X7nyJWlXLhl^ZAaxDAicz7tyWo2faQ6J1L?_;@?1&@gkR(C~L} zn2oMRMUG+%bkCD)H*zn?Ck9q4ok0_( zklE4J+k!oH*t$%;ISgM^G=2X58_&g}Svbvr;y{qu56s?(nwxUL9~0|BpZLnNuM$b! z9q#KL#RM9T3#>|#fE&{{C!(9uN5YGcl^aWsMAy(+OzcEr%f;N1G{PBLLp`3@ql9&Z z;0TAQ&8!%VuBO8*31#rEiSd$XLDvX!fX!v2#$aE>%-RT-!aA84)KGtTc*3Oq@a;$b zESf9McZ~4fTAW24E3SLx)crM{+yuj}ZnBmc9|b9C?I;dx4Edh{-n2s?ftW=@-|#Tse~ z(YwJwUD{K|013f~-xzt3AqH(wG!~CI;^~0vgsVav9zomd8Kn~@>92S=2!W{%Nb)Hf zzT$y7_(I<;FTRy<>p7ehZz+z)ja2VNaf}HP$&~&rB|fU85zTYC zX_Sv%+Q;rjt2l`VewMe+Qnp#sTi8Vn60G1idU>nrLvb3zIS>lptLI z-GeG#r{tt=OA`aeDAO@!3*V83muv*$f;lrD2yowA%bhXDP?IKzQp(N-O1vGeZaLx9><#imR92}|rn#g7%aPL<@9U%0dpr8w z%L>*fmb9$_kb*;Q(aJpRM`~qEfMp078G>W<`QKmO*2~n?FPSLS1NUW>xI}|bP zR=X6J)#4QycF2d9jGc}PW0@V-vx(IYu`hunh!H^>5>u9H(}>md6T?2VWb7CwuwE%< zlp=mRW^E)-8M7Lib72QoOye|70RC(!0goRT46)R3FfzaemqsU+?uF_wcOO941#u*3 zobP8lh)8PjSQm9^q8+n}-?wDZh^7?61~6F{OP7cU#1l%fjBN*Ay5Ca*Q?OxeEKW5v z?^{(hIU3y~5OqlKu23~F# zqxl!t#?sajk4GpIYoIp9MNuvzdoB9Di$(Reap~--dp{PHwRD5h_n9mzZ0T~RDLKtN zV9-R{;-gq7<*ozH$OJoJv}!yyF1oy>%U$0pLrGljJQyQqk~`s%C5um=_lpa4a6S|}zDSg4?n_%V zq$hSLr~xis|3wuvln=?;*NfVb9@ znZ{k1D3PUSbI??pS74(;AFkjMJv%KdP?ChUFWrWiVi=@Tu0+x0>U?t8nrG+@G!JFwx$RJnKvIMHBODoPy;nFq^^iG)fRAYlx zJM2LQw!b>gEZwRgN^FHCQMi>`G>nQRtBkI~!$wsKB`Rqd+R83rt0>KwmbNLeyehpm z%0zSNwkuX*spQFD#6^X52-Afm>|Of7mAG`7Lo1diYH4E!6K1iV{ZdMg4T8jA_bypa zv_KM3if!o;BykfT7hK>0)53%EjZSDUx5ML8=vYNO7#!UjALumtS!3Y7kmAHST$Z=A zZNr=978OSvX7V(DdCK_>>7wObp=^#@R@Ty9AuRQc;@~9&;1qCr2zrSRXuyT%-Sg|*Y0uI_U6YSJAZ(LBm$piMw)MIsb7iYH$ zk1bg9BbB&JJ;r{2cp*?j%G%JdI_Fg)Jzly2Vc<41B7F-Y=+X^HL~CxgNeI2P2_p_+a8(2zR82BcA+Cg_y&J@;^o&a< z8M!sRYL-gbWwms#FV7m-ftF5V!V=)`E!h&5u^6aTt7Yk^PD8%F76#!ko%N>Uy;38_ z)%a5eO|;U-AACr289cB<>45BQeem*$`!WxOM?-y)eyo2ej)baGuF}aRV^3}C{|_cX z)6A3wu(W1sQ`@vM;&?!aww0j@Sk0@dbv0M$TsYdmo<^!JaEB_;BC#xOaX*bL=^Grb z(gd}}&_-}vj0I_Ku{45SqJvj+(54k>oxk|a9JEV{{Y@OSDTUGu(w>CLZcvPSnu(h- z_)GBsE=NIlzW-8v2We9F5`710q%6mGpiR8f%CYWC6Rk<}vLsBrHNSdFc^C8z1bTX5gi3N!!-VnMr3jXug@02~qZs3rSihgPpzHiZ#1DjhvTY&n&0^ zLjl`Y#HHx}G&(0zvs+UpQaj>JGE=!{^%X^yteKxFCI1hapDE?57N#hS#mrA_I}y!U z`E@yLH+>>Jtn5W7RY%hVHr}{TF$rrczRmR%Xlje|_M079`L?iV(M=Gm~aVsA5R8z7s+ zDkzaItvz!Pn_sctQ}6B4EVktMDEEU^>Smd`@QBf4N5BQB*@-N~KDBPMDn3BX&&>hI zGO}4I+9W?YN0qDs6cgabm1)2c;+6s)3aKj^@460-|Rk z`Pk;D+AvmsrL6&TIGm293%dDUOAe?zUTq?mL2{kp`s?rnE>`c1S?#mVY)ffpZOLsW z@sPL3fwItP=7rOs&D+d8EO&I?kyJ6}s=%T#CYSc|Jonp^VoPm>bGA}djXnCNs2ZEd z;VY9OTiV{fD=Cazju48RDpB^rONvCTk@8+^Mgh}6FNfJM_f!;#FeMIIKLbDvp zQ*q+#E3Rv#?L%O0>*cZ(PI+w^gtH{9An;jEb=u6nyi!lj6@-~P4>f`2;H+)_;mB28 z>Vw;kK2mCzn}V{W+`~g+E?pv*1R#>Xh zh*FM_5v%h{wK%&^RgjcI8e+;)W-L&XFry$njiuRcyN$EDycVT(O(_$?nNFed_I^_4 zND(QuC;KP|@4*-Dw?gr#vAwEPS4F%B4&2Y8wu-8<$(?nn7oD~U#wAyH%0+?TDHgfL zWK9HFusESiXHe5+MPtWtXUSV8M5|{UEM8iVN|0PCxK&@X%B>16VAj9`=ERZ@VVDbu zsVV~te##cRM&MceCFuP%$bo!qY;vj0KtsRU_lJEu;rN4Bn%)KIS3F4+e)HhA&un0=v%@l zx3uVKR2!~IttO-)*CbXN+TccM)P^>?EiFnzVx^I5rBQ0RCa+0NYTQ6kZb%{5!uPlK zK6{^!nSn{)`~LGjb)K*^XRW>V+TUxhz4qG1iNB)E;Fl$K^%*yQiqllQ;_Yd!6k&}< zb)bw(wV2Vyea(1{Tilf(;Sal1igxr;dv4UdmqN)MRc_t&w_pA)N*UGn8bRcaDz4@1 zn;P}(WkKeSDjNTyMZJ4@aJi$3mw)oCT8J#D_|B@MXU&H`K2iAHL@pl9cG3{`p?`kk z=s;1F+91BDviJPrE9NJUj7z&6X2-w1plfMF+>tVH1p3I zeI_A{Y+Lzf&#G)ATk5BjM{3oiNf=KR{+RbB%@)PMbv zzxdcrCmw3fUzf`|WGX_+b?((a$$zVo*FV*(Z9O1@sb{OU{iGr{s<%AJ{iTm8 zKl<}y@4Zd+hEY>4fK>Pw>c9##GyPNm5XNUJ1e_Qd}>)%ecJ z+~|VVb~4d+ZExlKHJSvDDrZ)_bmXU$Ye=GDhh($cQRN#Psj{&os!{NL=+IYw@zW@3 zr|;?BC;4!^@LbowT_t8d`euxbH~B|3>ZOltaQ_ScgfV1%;>mx)KYOA%#%F`WW&T~K zuG{;h7>GaRU;WWs^DF1`?;Mjuy;sm1tbWE(d^nQ!%XI~+reo;5fHP3-5m+&2fdHJcf-evlcbsg|4!?hyMO7< zjTZLpZNYnpy{L;S3KhDkv!{b*h911d@GiAwfk}YlP2-8Eqe?%=tE<#C_tCJs`Jvgz z-*xeFiFuAIOl+H&%0F0hkbku?=l=!{KiMjy+pa` z$@qbu&W@u>!1%7Q+0@kTiT5YxT(=-afKLvowh1KVw?9|>qFW7ajy30B53t!G6(#Ze zmv4Vyn@^n!lt<7CsfZ9v&)EJPR=)VJ+kc|?zgO;4BO2oFw0abuszibq+~g@ER%nl+ zE0H{UwLa0=-%FK5i-bpcRf%LHn41`2jLeG11yV8kc+0q?W z{)h?mazM37ROXIRpZ6%`#Phu1xncp$r;eQ@)z*!?KM01@;5Rll=U)o2$;?4S6;-%? z{A{6mF;Gs6zXQL9HoS+G4>Z2ATk%7hLRmkBs2>%t?kQoVj6Ft3$GNJqoCKR?f)%2$ zr72jNo9@HPuQSGPtg!I~hs%;fSqcsgBfw$hq15tew1v`?10>VjZ8uajN@yL z5`)jY>Ks&GsY>fG*Bn+p#4AmAR$54~S&_^8gNWNtT_O6i z`f!OFJY3bBe?Gv5pJ_9qUa;}!%deNJ6M^@uYu-Plp=}?|F4rn8(Yl`(AyZ?ZIEuh_ClqNs>-Td=f{<5G>?W&+|Y2S zyZe>Zm|(PM$cb3XG5Xy>%NmUYy(mD1>dm`byF1^+JkDRbC1j=gOz3Vcn!BZb4+`80|Q6YEQ=Nzcg=AyX0eQO;qsy(EXMpPh#2Xi zurPCs63w?@XywCl;#bx~hHKFUVril8+k4pR=T~B?uIA7>+|zRqUIj}Q+ zz^~-0#qZ(2EKJ7utweL65c2!<3~dz7*K@$IG*gN&r9kgfjBn7Pdk*k=uJ0s*G9u7H zAU;Cu9_9{Cp_{~%=T~YV_M?`n(_>&E~wf|N<wS7yl};{}Uvg-=xT=#m;2%l0Tfasc(Og@;MI#ndw(7TceOszR04Tc8yv0W2w5@VU%a?%@k6L-P-6 zGirysCv55Le2OM^qM2Zfbu)6ghk3do`{=C2Z@T!N_qet1YKgcsyCPC69aVNt?>hK<3t0D zyq_-6_Gze~93FX(3j>Ch7R29p!@8q|L~K>+RP>5`TqQwd~u4}YORd$d5eln{TrcC;$x*P5Ry4_Y{F z?diRcKT&>Q8%>d#;uF&AVQEmE|`g3)6@YRvOeiQSMenzZ%Yh^Fyoh;9oSC z=VHaD(P;#cM9*LN-~RqXpXgRYSpoHRt~nMduj>(N!$#E;@x)jcE>e0ls1Cy+TIOF5 zmXpE2!iV*PUU16=x91;x*2>FM=Hcif<+D0?j0hgWIwk_NdCf$6>e*KDGSn$ zinPLlLt!s@!y|P8Qh&KrwdJlyyfIF|X9L%`U_mAgRs_o_BbY1#ldtD~)+zzhR7EnG zvpm5>qQyvb?xCbaQz8*6ZAbPpfxm||Tsf*)Ba z7(Zh|F_u1lj0=t~$n)Bo=PVpC;l>PNnk+3du1>|fBsi0mgmK0+E|y+?LJhV{!1k?1 z^*O&ODMlI=y}ejS%6u^qSqYs^PMcUOjQJ{uFB$0f^)y>yGId=S*%n%|h3g<#lG=nU zmmnpwVu`9?pM4MVGz{p=o@-$KK@`z@JyE3I4V;|(aS zJ)5BEAh2V9e{TiKTpV`o#2oDjYpBHr{N)e(@t09B{H6)c2t zQdCAr{h|~IBQ+u{mU#Vm^u%@!=QOGVqfoihjXbmc{140k#2@C8p-s*it7obc7=1Gin)o z3bII9P8^2>#}Hi!!f`+KQdB2YDw?DJgO&lm5^+-m+KM9Oo5r7O@u#J;L%4k~7py~) zCbhh%rlTc(aC<9h*mM!y7$7k%@8Nd~w7tYnBbS(brOUFApy^nRVy*D8@Xn;jVUB<1 zy#j4qr9?C&P!Uj3urBoUv0Tt;ZbZCzHkmp$)sko;be3!30DEGv7y5lwOIsYDuw>I3 zukkSh-GN@S-iB8PgpA0~U#N9ZcD{!@p{PCG)C0YP77U)dYR%o6A=pA~W8AU!2z&V& zhcgbEs02;apbmY|oYyb{-iCD#bxsR27E?uut6{PnP-{?CwJKfL!d`=*6_tD=?4$Z& z>OVUAPr|+`dcB-#0mXbR>^FNje!q%g1MqU#gTVqW`1@Qqn-3gTMfmUy2oLZzUNx8= zKg>(C6(7GG#z{p2_fHH&0{|-dZGnxpW z4~IQ`!-c=+Zt?Mp=f}BN7jK1q)Nfehf?yg1G;>LUiCf_uNx;*L-3kYc_UqkFlN{2G z7>xOhhY!QIFhRCrDjUQfyPzR7fdaHOy{zI;hmE)1msd@%*;)F-6Ev_XRmCj~mN_w4 zWa~P-ve3HkVqABtziT!wW)nZ}7w8^ril#}Tdx0@klF^Z^41AIh4GvDf1g9hFS8PMs zAMx-51$0SIBn$gWT6TT2@3`R0jP|6aVbB}y9pIV=u9wwEUsz!- zzaBA*6e%mHRwo4qDVa4y1$cPC!+r4nSM zBcqzE&1OcJ>TX!7WhV(*A~Rz4LUL8dTJg-LBCVS34`5Bq$I=TOp#l@G8c`bvYWTgj z3@QPB6U>7cvVk!}81XG2#5@L4Q`Vf%E=7c8R^PdK6MFV9B3Ut(iyqO)7G9>5<)Ni8 z-7SBaSL~OKhIsH9C;B#4HQu7sXPeTdC;= z1dAZ`8{@i=u{D0CqexrA_g&Zm(f*LkwMFQN(CNFnXay=#JQ{7Qjc#W+N+WYWG9S+R zfGu-tFW*W#k>etBsifHAuYgT9*qpvo8Ab$~Vj+jqR~($&;53o-Kzf0wHbw=frGisx z*LCnyz;8Coy4fM^)LOkXmt#2*b2*z|1b@ry!0g7%wH{n^z;!NbjZI1`(|VF}N^p@o zC~+eIF8pAkfr(E`KW0Bobw4YZNKph6%=$gxk_9f2+i>}P;&Lg83-*KZ5(Bu*VMMLd zzGN#9>=w+M0xN^D3=pe1!AdTf4y!e|6+xytt=hU%vrNEjBjqY|E|)aIO+z)f1i>Yt zIR=L4+U7|_KG%B#f*~D5u*uc5Pnc|J?;Qf)LG5$S$(9s7Y`xfmP6aI$3}vrJotd1# z=x3<36WZ^mskA~^c3yC;7F^`s!DL~s+c&{!Omiyv9(pD#-h;tQ-D#cRv`iGxCXaci z2a^3S@SD`iZIVIJm(2-wRf3(Zc%&_{n?+#qb1=E6+0_-%Ct8*7VPSflE0lcO=Gs_< zkKkMfzN+{&q{Z}3zm(#bxX+fFTqBZ#$-di=>}ND-1j`^vzUcYOJd!Z8(`YX6Tf2y zzkPRS*W+3Hr>bGMWXBi@)w|$s?WuA)Y!WtKZocDo8N(EXAGmjnjPIR0_fmuVduZdg zggxr5BpVXT?5$vWrVfQ{Etqz@KVoC*kK9oq8x{FP(+Tg~*8UnYI^w1VG^M}Yw)U*Z z;qG)fJZ67i2sN}Ed5pM!!=8s_>i-D#M9c)sb*$a6_87m>PE$sP`|ift--#37rZzfH zYFD3OtyG>)3}?^_$gvD^jJx~N%E4Cn%c6jEYMi?LYd0enOJ^HjJ;Go*?f$ZjsdeRM ztH*W0G;O=s?%6`t2-seBZ%E6Q$?7Vi$s65jMLJnAMvOxhreebK2fi-Pcb{8sHn$!L z@`t{#C*j9(Y!8%&-C;kTbd^E7pv~R7OP<6m$9hfn;Hzk(fRJO=?c^{y8L}*aEG3?; zcb3JPE3%6k*(K@E-}(C@?VzbYd%|ixHreIZ!sV4u$g{i?l7N6izZC zTNO@PsZz09V=ADlAzYJ(6i~BcSi3P(K--0IX}hsgAzcHu10K>HOtw}9jVslHZQ3D6 z)wl(3BjGd!W1}2Qhdq~R+hKCG3i}&SBB^g;KH*zKzZvKapJCsHT8^VcSm{L8?@L!j zSTikSfSsE_gi?rb+G8J{O2o6HzxPSDg{R&zB6#0ss}P7GgUs*xsgtvdRa;yTH)r?XfYmw)x{~I3Q1j=^VI7d5P4I3nCA4^hh%ZL^u*; zQ-*9J-f8=SXdR`G!Z6Mi0ZS%VL?*XsYIekC$tjAQ)_G^_Iay2eG1ZZio?JpQXUvPt zX&08Jgyd6&(yc(Abza&pnXO{Yl9?w$3;C+D@9rEvY}k`7wCHxL-U4`dz)6ceZ@iJe z07IC5^%=tCIfn{R1L`w{q)(--f16360um;?RUuPEnt1PIQYeo2&4@lLlpkSO7$yWZ z0hlHR@&s=odn+^TTFeJzS`cO;>_T7Trc9V9V5EF`nrxISjcQ51gjk~yp|Y2vD1+YL zGE0K_-eVPXuks_BgPH{6w4DcbAF^WL446eo0`EoOeZrfAy_4CH#H(HKqP~#Q1&?14 z1dDIN-)+o0mqjP3!sU&WV|jk*I7{tktjV8_Mr%sm=E3OSf%&BOlXNngk~c&hlKj%T z3(6o?5cfPdUi5B$LAUaA?q-K2PtrtE%E&B~^x}oIZG!o?!2Bkd_oQLoLv?#nGN-L= zO6Dxc7x;Yy{6hNUXdWv=VsctA*;fu#ss(#(*!{lq>4jRiI}e7xu)2w+^K*RRdNJ&R zq3oU;MsL0rc5iI&GCFn^{%ln?lTMSit)*G=NyxKO|17$qkcUj~R(*zz{3$8izPs~l zYBukwA-`QbKFRk#7|aFUA{xsJYVc&A{LbAX=oIQt7iv45UIWszrF;SEp3~CQDO@7* zynlvwISXvw6uRjT^Hh1-rc4g%hN}McdPb}ZDSZNpm)E;%q|XOFoP+M1%g(CP%+KkG)!r0lu`(13_eKl8<3(~ z|B9p1^sui+T#}|*1N*3C4-{NwCw;-F%G5!NWMCGRPGwHH0bz6~8zpJC-mTh}SJp)DxRh(77Q&1l@J zhBfLZOaSH;1#O0UX+o5ZtwJel(0T(LmG^1nHm;M4ix~RMnZe=Ya_G){9Ttic;5)6q z;NYt}Y!oj{O5Qt>l+5KqsGAA>$pi zd6h>tIFH21kVYE^{Ivl!ctU2Mw#{%RYKv3~5qTt3p(tP&_?8d>%8l^dkZj!DkH zmacbGry}k+yBAh8Vt@>$kU_~EGB_(UNIQIzt}TG|55c-3J?meR?30pp+SxWa1}%7h z1-xr~&dHV*x*5rlw%jRuDxIk_+bgOAy#5Tlnv&&&8X_Dw=pe=BwsApbl2&Z0Zqn>p zWK3XWwFg-Z`0jBuC%ngqnk>BsX|P?9+-Y~1vIzW+iIe>kU_b0DaInYzkdcG^$EnV5 zO7>}cqBA-&L_ZGRr+wC?oQ>y*n?*`4Qht*pcbAAoAgyj74~_o-3@3cQbj+?|2!UBh zGNb)@%4)E?q2isAwUFY9u zR|+g9advi7CHd0cDkWcjv|;$BeI88f{B_oOl&OJYgwZL29AWqY3m^G&yp1B%$*j^U z|As#fgnt3~B>e9>nhmaH+=-@~riZv>n6@X-u?n4okdgh{U^(a?v96g$w~vvx4t8ue zA{rb9p%VMAr7X`1=GO-^^XEuQ>K57WD=*>dkX60n+Fvi7$nPxH3RTj~o68q)MWDVD z?mgnkJm`Ynj}~hWYVfopMVDN1O&15;LwYLxWhj)7b42<62g-NC@1||9=<2*_gg0ob z^0{l_-0gV##mt<%o5HzpX0m^KlQ}qv@-P*`PctCDw@2D4D&VB3fb!Mp`i?Px;w{@Y zk^3=!NC2|F3|YtgbT%PGrKW(-!mc8v+!Ha~r?3)hVJ{kmHxbNn+59G=;apXo2SLWA zAZb_4G*2Wzlu3v(>90>C${q8bmU-V!VW&e(Q3=TNACTuoKl#eoi!Ta_N>IzJ1;q!= zQY&SO4g=&zFuq8iz9dB0cenmHo+|H2G?Sh@qVgiED|e5THV6JpZ5sxo(Atw_H&NPfJw<{b(CFqRtBaO z7*)Pavp`7ZdT+X3h+KICSWHXC`N1C}^Of1>o?C8h2x|vK-&aLBq5i=fOedvS+KiJ@ zY6L2LREm*yH6hm<VjdIBla4FA6UEvOtj86sSJ0f1 zR%LRWQtX2q4cU)as^7V<-$@HlqYxqeRY=4vWDeALdIsg|1K;lK-PV;@pQF$-`(CFO?~*#0Zzl}GmO(hzT2_%4gLx;86*C=SX)!D*|KPE z#w4CcS#Rv`>+9?=D3SRa#hNdRAEdyllCNy`VCsmscQF&ovp1TP?V29txT1N6l(KG_OU`oGrelFYQB=vQHmLRZt(5Q030+Qjra87<$?V)B-qR@&;GISoeRTZ z3-B9&_W^zlaJyW`;cIF$alUByUA+bf>gDU;ceV3={Bd*MaG`tNaG^U4yHgKNHd>Vr z&fS7#W`9qsQho7OIOy;=!N&Old_duU0Lug$<7dfmIx6}@`fly8oIZvM8_C}5R3N}B zv{+12Y1Ibnky{rSjc3y-o^^__n)BHKREgwTLKSO9H?p6%J-oR@Ta)Q|Tgq->p11Wt zvgvF(Z?j5fwZ*d&w@N8lTGi2clbmle*_fdxF)6fxu`6dZ zNe8n`3c?xlUZZdAF#1-P(W7ABOzD)#drKG%Tr0&&tJ9KAr-_BTgixP>P$fAZd|`#H zu%-&eyiEHg)3l1c!O?UD`WzTnPDK~Y4w>!cWdRj?6x4& zEExw_CkIQk{n{zq$aKeu32vQA6J-%tVM=AUD4WZ5i~vZ5+p5^0e4<1?&?EcS%XD zM}3>$iok00BYs$~hy7;FQgwKmp-&mgA=3wOY4PhNbP;&Dd2^SXqJ>rlUML+^At|7o zMR^_qWi&rk(~7VY#J;|hME%L?EbmEpGIX6}E^GV)1PzD6E`iN43-_RgFI6MYT%69?_P5$UnLv$O9>nyXQ1CvSyy zAv5j_O`xk96K|Z&sJ-}jBb>9nCxMGuTt7pTeFG=O_oWrhM5o-vF zjAp@^jx2COX?~o6vSoY}TRf1S#r2%Wn);fbL=CZ72H(CN4zNFkqKHpl4eR`oE2d21 zmW~hI2qpul`mM?%Be%kyZ7dEUOg;1Xv040pE*G?x2ji6~m9~%kqEI(#r#jKoOYs!I z=JR1Mg&*KQK55>KDz5{7*$->cDQHYxoEH~^bpJz*lpV_(?0^@c9-*?Ks(PNgENv=(OL2B77IU*s}^TxN5azq?g4@szoC z?1f`eS-_SGt%QNX<|eE@?K01_o!jylF*5rSGMmexYb&;2M|P*Nry$0Ws`Lt^PvU$Y~tqZAV6R zfpeCL#<_Lghtu7f4zj7yP6@e8%3RVaU@{l>Iykb~k8BbF@+P#kxm8UfO=ecIPOIiy z-!KQ`yto4!r-xGn`X^c;jz;lvs+8VdL`woeBgY#J69!K}5 zik+9t(zCSadc}iJMj5)LPw+r1J zISj}g?!S#GR%jpmgoGbouu!Y0(=Q{pBe^**ylI_~EE?mRG=PR=Hfh_67sR;M48AXc z??`U0qe7LkAeF+nJ)LOjdy+OGWqIaDeo~CD8j&^~w2)$HDJD|!k(1Jb0}+Qa644B$ z2NC}SB97;JUU1naV@uf)uMeD0OU`NMOdeK{>8{}WRq&loZb00W$EHi1=Uk=f_)Mm( z>wB7@*t?alf%WBN)-r~HTBeioM_Vi7X4izwBJE7UrRP~7=2#bbYmXr#S1^@}z_etT zRyi@EEW&-qt^6q%m84`eD;Vu7hmy|IU}N!c;bLvVIJ~p(v>pyG)qnZ56P|@lqe)diVCl#J6J4%!(%_GFw{aaiS4Ba7Lf)4=Yye0fY}aXZRbs7+cQm!T4b?_T@R19`iQk>!jZ$5AOHDn=@p)_`dw zkM40>JGUvVpQIhjm?>-kVEPD{uDcV{vyy4rl^&AD`uoI$?N&B{Z(ZKKX@zCoVp8(G zU7Hyv;C%!8>E6R;Fizy9?+jm~T9}cH(~fYeTFjq(MrT2K!TiHuK6o4EZxi#2l6l&t zAIyb%1+H7c^+aB!^R&e;FW2HSxM69l=9gW%CT4&6;?fHmy;~HSI1Nb<7kKvaNz`9oU9K`_r;z zUA;oGy5pC23X5*n!e-bx-73zi=sR7X# zuZ2Bm2>3S?DbM1XEIT#$n%zI(?QquSO=}T{ZG1QeNW-6^*j?g5Tv(IgB+nhLC3}9TSJI z0+{rJi7Ow`F|0f+Y9BMr&7|Y!h=>h-J>XZ8AE52Fm7^cF3dBxrQ4ZvxF`=WwonuE4 z`Y!G3FG}|0S81ufq_Eb=pbr^Typ2tc`zLr*Z07< z1B`3(@3AnZv0{$G-=*2!7opjnh6n|6u!u^m5`FDWWLIeir>6Wx4o;>H^DJ>Hl$do{FaEMB4wdf7o1oY>gwyc7w{9}(f@_bRVn69;c^;(!hQ z`>o0i9OQ^;O=iZ=aVd-t_L7A{`6kC}u@;hs=3Dv9=HdJion@KJqL<36X?vBP8rb6c{xkA(0 zi+&UF8he1fO5QcQsFn#Mk4NKW((vX1`)7V{iS}bH*Up~tBwk8fzdx+*g ztKLYL&-xb!-kr_=sw8%z-U;~l(#)ztYQs+b{5tMWf(PR?#mC7S#HphV7ms6@U6 z|94A-2@fV9Hm6V@`kN)%iWL1{%(AF@+`BRQf4-6jUuHSil+j!xy-D)m5)d$W%MRr| zw?y0G?El~?G-&*ZO9zrYhMkRlv7`Tky`}#@{7uN7s{h-BH!f)&ekob5LjY3TFm!If5U$@|6k>@e4nm@0W z)58;nIRx(jD2WAm5uKrKZHl?nv0P;&_q&Q`KI@SO)ib$@^4(1lmpYlNjOV^WUpMV` zsTXpUsoYl?&AsYH(7dwclq>I2u7aVvPbk11#RGQ|9+wkqg$JjlEQY2B3$oI@<+v;F za*7052;Rvk$_!rvO4s}_{!w0^b5|en>vOpn1O#S5H8cY}R*ikWkQc9d=tn>k5;VEhTX9Vp0k*c|sv(|t zQ1oL!7YcNK_4W?y%W0@9Mft%9NJ<1rE=VkIrzy%0Cx9*$=!MmWHsJ`st0?}9po<8) zqG|`hws^cH-U5N8}n)v5yk`| z<0HelDazG4LRSfNHu#v$eKkSI8Y@yXG*b2xvQ{92*kM`2sDWUx@C97e5(MNOCoYQv zd93ic7hJmqGGq#G>_T?!$`0YO!4rLuWS)I4B6R z1p(%G;NN$6ewOe<0-xuM%L$^p2IohK=!hW7u?EZqLHP^`aZI2+JO%_19yg^M76_!n zsXK19&`~1L0kwqi#|7R;cor8I$U=31kS7GvYdD<))tGafP$vZ{VDm=@K~v5M5sU}| zWNgOp1inU_BK#?V57pmVJE+s|p+Mnb@j3M{)>Vs`DrT1SBT^q9c2 zfB@Wid{EWCI=KKH<%~cUri@gnXje-M(Pzg6nTKDUJ*Robs4t%t-*c=toH@0_;(I`NwnpPkn$4r^U58sJj~!LNCERh(0chC`t& zcr6=PW!D<|5VAY{M1(NGDaxMvy07%T>=|DHoP`+$M<0#WiT}bFF2D&0Y#nPwhw}MbV z4u|dv-37@0h6j;IlIvJmR6i$QNyLKsx}Xk9YGX1J^MY2F z)37?Bav6?U30=#%+EC#$*CW5ah?Qr)Y_0%2Rp<|b%5QdX#b2l{VRY`hRufC34t#>P zz@)V-Qht3YBlO)>MTx*XAQB){nutA$=lQ~n%ym~C6BlZRAak>zQ1D_dV-!?s6^yd*u0mGp&^rXB=@Wxo%gtQbU(h=Q zoi0`z#sA7GhP+wUZ)6)4L|$W(2djHbR;Y)Sf+BZ&hvC@6d~ray#w0ZITrG%0$x4;~ z2lq0nlDkSQeX~NO$li{34&fP0PLklgHi>tolajoKL3w`?GkEUq0^I{ibn69O zz^>oqOm41KO{AAc<*}LDszKh)Z<^mFu~0C>j+1Evg%|Z$Rtz z1(mlHrhUH^^H%TGLqSDF`^QtZP_gIBMBMv|hV!Yo9-V>}QCB(dz zh1c)YVGz^`g6wKOwUVp2qP#Q`c)?e<{41_H6VF4%&`}8#&@rUlZQ#}*nwc%S7S{3h zg_znJ1OdHdVF{uMe4q$3Q=`C>o?4G_U;N#N9p&QjHm3UrcA zMA$KbwdmM*F>d(QN~+s40_)UTMk(#Mfvw1O3_Q(etY5XuX~t*M0aPGCZhaVx4P?z& zp=+$<6N21w-9u4d;tOM)mGZnn*}P@Il~)){HV(*F`Iv3MbO`d0(S1`19^nisCBe68 zO4^igsg*%xW$+#L3wDZFP+1rJsiFc`qN?$rQWdH&|(O{ZT^los-&6EQ;Cv)gW?UFIXYT9)Q!Ax6eBpAp%eRBS_O7Wqf zk_DT|J=XIFMZKnAiI0-LawB+;<0L{+f2PBbAh2eU6jjT^Qf?rc!F%CjAYu}cQ*Ci3f}v{y*eVOw z;==^&G_W-i>#G(=S3q3^s#c;TTc**&zYy3uiG`(Ve=&5wp1v} z0kX<8NDP^ms0NHx4EPxEjS}w#p6NQufhHiDBqE2|r4Zu_OB2jU2L^$SOKiZzGICegz~KC5fL^FT4H;+ifTZwgia_R?`898PpB@BOtge3D9HUsmI$? zj{2=5^!D(^mU0w*79a3E_>44R{?^Xk|5Q7rV)*F8rqjg z8fllB9frkzKycZZC8&GX;hL@X0|2q>M0^vX(O<$idRn%!D>n12M4)SUmYW4 zMG}%N(pS$CvQi@RDW%;{6t#7ch}KCWX8D)P=hZ8OT`#dgun>zY@5EPKVNk>*1#Kw> zg*k+-28gOkQn6g*EPu6xur)TUx%OX;61G-i>43zt3|y@sbe%*~4ck_NtLuqiwIZL=r9F zdbgA6CQ%)eRJrz;AlUIfb$EW9YJXVL;0T26`PrpaQ2Zf|KuSSzTvDVmNSr4oCnQN4 z!$*R|IccS`>vzcRqlf3GiPwmv!cNzN zRtS0D6`WoA92Ip;;*+fyjf+5VMiL~MG0qT!af#0*6N9ZjkN9VaP3MPQh3}g(2cl^iULr3s`zDN?N~V(Gqm4qm#=x z-6ctfpng4w4$HJWMf)1JSBykw48qHj&@hf`3MU~;iD4YSB5AU%3!TVyC^~2`o0EiT zZ7TCr5MhG3F6pgrFmTmEaCfb+B)BOP6j~&)tf(T@k?1j!2^;fynIzk~aB8pfV%9`Y z5Fz&3%3)|ScN>~a1q<9l##?CL+V?r_XmpgMUkaT@(iPBRYZ`eCWm>z%Q;bK)DTTq^ zCsVQGf3`wu?{Laf(NnBupyo)bpmRCa-sZ%oqZdhN4GNDW&JoKhXZur5ITm$=K}qHh zNhzPiRzz(biv2D_|uX5_{Xt#xWy`;ubhupJcnlB!0g@))}?Ax%@X$wF5v>2OAb z!vw?LA&BGAxP`b*5~E%WVkWpzi-~B$LcLp3=OtM~1poGEyCp?~NU_FgV?IR7Z=*!# zVMf67vT*0^q7a4g-gBDjE&)lCBypU*_b-MP6qi`@R6SGzl_en&KDL~ZH5n)NUp`K& zS-V6!t=C6Ls&0wSwTE>BgBJ%EKL_t1Lylj zM3fi>+JSRGJ5|lFB!V&AkpHmOGaCFJv@VImRGZvyA;H;OG1`Wlkc8QmKr@hIkW}!K z5^FhGIIQ)J(h58xk>q|vUWQZ+hqVLegD*qPlGtKkNrZTdW%Z$>v%}iK=pxj@X-T>S zq+&)+iaP+I$8QZSMg5P;1bIjRPXaR(!eQ;>1EhP5NfPo!00}NfbMbz2nDA$8c=Lw; zVePk0Qx@YApAQ$|KD+{mvTY}w0Ami4oVhha>h@Vl7O=(jMg>-tfX#%&!?fND7R=`Y z>BnxJAu-NNJfGX+aJv9@^wunOgGq@sQnTy!z@NS~L8+%CKE$~*Jde5rs#CY7iOaO4 z%Ap!yJr;#HthrnlXbjB=e1(TMlOmigVl+L7d3n|(!*=aJQ?H_0l^$dEz96Zxty^-{ zP#mhFrC*FYse19cL8uA>gw#k)uKUFee2{x z48>AO<&%$10r}%$LPks^wi?{_dQRQkO%r-l;<7Cd4Zx{sHDOmuY+=eM>Yy7Zy48|y zVVWT4pqwVk3Q5U5v|w$ZbzZ%CX$i2E4lG6t$Ij7=u+D+yW&)%wrB!Xc#4b$pJc&zH zM{b>^Ss^BAZLVNZ;!`DYWb)vX1`mNuQc@XeBt;=8L^m`xRT$%kRkzDcOKGhnBs-@d zl*~f3(9}s9JVb=rpp64EI#P=CyCp7%tTN&$8K6&4DHuCb_K zhqXnQgKt0;lE@&xauDy~>I+ngC3BQ~z@%{8#5}Amoe#bS#Yj?wlI|@Y*23;Qa2b>| z$$pJxp*%=3Bq+GAeyMsyt&XXBX`Z4Ns!GUJlDGUvez*&HtNC?9MS1oKXiF>=t|h`^ zZrrbJYJM^fTGSm<3Y z=tcs&CSbeH3tQU|88A;uJgJsK(yN6L;6@~lOruhut3E=Wl1MU*+A_WxA%fGAfVJ*9 zt@t=)I4VC|TKAl`Xd;Y}FeZ`C);*^!xk$;+m=uoIJ*O?53S(f8ON!*yJ*S1Q6PL4+ z#@V{(w6YnJWI|9_Ch>TfCh_wEW1YnN!!(Ic3RH#1s7e2`8XFf!$_pdrS~Vr(;#MrAH{4@(KrUY@}Z`V3Kt+t4h&JLrR?rmx)M-`(xzQH}yWn%v*7;4lC+C5P6n~ zT!(=WBmx$WQ{r{l#w4CGV0f65Yw>^^7{EQ_q9ABSrsR6EWnW$*Wcb|hmu=Ziniz@K zsFH6*)du}kzA^>rw%p8roq3C7aYY3JU1t2^5QrYz>u=i6F%ad7iNW>0=3QM)&7|N# zhB=8bO)ILu7{_lCkqx~)(avL+AyF77ZxW{&s$w~eRq~^EJI>ekH+6ydUf88pk|IP> zQRF9ldk{7#`OR-C{fg>RH{d)?;K>t=HOy8%` z2N;1s+~fESLWUO*bV#VosKtV?R>`}tn0EkCO4Mu?X$d57twSqMXRTmW)Q9X;cA~z*#Og(|2p!=54Sh)2fdRtRiIlzQFtG-$Ns6G}U z;fhBiTsUzbQ^DO(=vIvDS;&`sO;o`pS!h*)0)ANZpASw{2=m(#Kj?uED}*VA5O1TZ z1tg&^sBzIqeld!d(jX?}MJ_QLytiI7rUZzdShAsh@7fk<1{=^R`G%0)nOol7-E%;_ zRT-6KHi zR+(a114wMJD^AomJ0p>Ro_K$HdahTnZd~yIUWe{_5-%`qsOO&xBOyKUz-l zRGNvIqUnni>WQi}X_M4sVlmJ`?b20ozcH}ux9{DDxp(=2>){eTu_+BJht_^uMi;}S zdg6U)7&#)O5TgS#;Yj)f4tZ6=b+ zGbWa-5ByjFRo=?x|vL zPRY@o)*9W3MY<1!ck7ATUxgdl28q+!`z+-VRtiG8!VQ_0%Mg&2>&mi5J+UhjNgSt{ zOqd5O!Z`33mo@3uRa}Ikp*AoNT&YJ|PPiG{yy7mY&iR4`)~iRx!jfO^uvcdODLi2F-2m*;&C(FCEnrAGo6wNNAn_vZ5vW zD(HX1OUE)<-H=|)`AMgeOpc+YXEJFWE{Azo$we7hI-W^?wYjsglxy!Z;><%`vSAyS zp3S7aZP(a1$NQ}u*+o0!L*3GeOlmsGdy?25>^;~UTY6qk)ZMYAtT*%6^}RcYRk?Ih zPi+5{*uuNu4opjzPC3-hl(P@kP|KXlJU)qWXK3lPLy=CIoTa4%2i!|%GU@&{Cs~$o zzI0YkY|fzc(oK++yyE@VR%W=l(hHfadR8CLBvuB~OQjbxnHlU3j_H`qmR`!VC)>-o zHf>LyEWMn`WKQxK_e_~^Yb&gkCUIvDwZeuo0s3q{(T^tNE|Pn%VZ^yhh~)dfg`2YGtpQr-XJX5VChXg zQFF(FCcCS!+H)x4J)P~P^Lk>(o!O;++lhE~RlMJQkO4-{TN%1_^~Q+I+!?^ zxU|IW%cOXYcLrJEtmDb(B-4w1zC`t%i&tBZmryKw*q#);&Myx5GFWQuKHBL78($pq zWl-<5C8wPQU3%Hx-?tzBUaY2)w&;Cp4|X2x99~?QNxj=$w1{En;NlXW-7t`Hvc$@1 zB&Jjc`WKh_5|7-mdadztScR-zYaPVqlc%+dBbhXpE#3`dn4-C2i=)28h74re0XuGA zIxdxqSNby8chfAzLdvA$Q?huqFN1x*H5>u4IuKf1;j`P)Qnm~A6Mk4vsn8W*t?o~Z zE~@lpuxq!tbu;npQ!Fj7%;h_=XkBKFZ3a2w>}-u~A{!U2_hn#;u=xG48i_56`7+qe zp{LS*Hp$tIcyvY=Rb?`iE&8TexjlAUMqfo}QH?M0>v!yE7G|dZ1uKzzQEi6O@Dkld zmV=#_O6q(W7#`C2zOV+f7jU{{cZLkD($#m;Mk@uogPr3g4L-Y-Hf5JazvC`M#H4HO zz2+hV-QW0evZOJSQ3Y1qm55j+@LzXHlP|IQj!kBqJW{Fy@sfB(z4gha4*ozZ&#SH^ z;mg2mV{=+$`Bjy)XEJu}jxv-I$5-z+Oh~+5>BqW~?o8_3;#ZZH)#{RdUk2M|8Mlg+ zCR#F(N$oL(fcr|ZWThpCe2IJR*iLjn66gE#P|08>D~Qu|nw7TVetGOiCtN-5lA(+y zyq-i~+Bl^@9p>Doc4p1(S-aMpbFIij#iN<@V`uOrR)r}PwM6k)CMr(SZA{{K zAXa?FXFo1XIS8EBG+Ekc@pvW!2n)CMHYrOQDn6UZ0OHvi_wl7=;=uKV6Pc(mJdPx< zwg;>VGj*Ymj95Kk4!0ih!_!0-L`KL_k)Y1<=@Sx3PaR0rQ z35Ws_a%&}mRk3Jek3HGcSG7Oh4zFm7Az^K_Y2ig*;?Ny)Pp#|!-w|Qu!b^^xnX&?I z+cQH8FFUrjX?gVHA#>x>DC_2HEA8Fff}bzC;#k;~F9vc0o` zcC^UlxBCU8WJ)_oGj@)g20KTJ+1geoDy;C^_12VJZBYw}XDaio z{Y3F>VWr=$ex~I7pH@Fd3)f}ReXSZMuZ%S6=SbmtzuldP3=bPnTO#H!B~KhHjQJB$ z>uTyC+k~jQtV`4+x z7$>&Ew#)SH%5^qn;y&x?HD$|88H}30pk&b@?u*tH*7@z04N;U-QHhycRfW49MVmxs)=SZgVlwNe!DKqn52viPRtIJ7B>0q=L;+W zX+|bjqD-=r2MXhplhe%>^!x3n?JS)&$U94DpZ}TbV0(L0N6S>fK&m!N9kZW{U^%HY z3Nc=ADAky8#?Mcee6(QDZ{N2WWyoN49w`{|+s`VjY18F+yx>Tx+PkCe%7Ro$$Ng+^L!Kgp6Gf6IE6)TF`bg4dAi<^3tUpnnRQlxCQ;6Szna~A)Vp$Tk-HJXHx|mAQa9YjJhc5Z; zhGA9~QfJsJkE{Tx4^+lOms8CpriErSbS2eXlDYC0n)BOF514GXx9ALquKTTLS{tGG zB=A-rcLADh<@?^g56Z!yx)3~N$jXt<>dkbJ<`JoegOTh+2@|lwJU!s=q3zjo z-?3mcb!O7lGag)-omk4NDxC*;EVw!wcgLs}D%M%bM*@+Dd1bI7WpzUlu)aH;UdU}q*&m35*wszu#ll*oVm`(HKiUp4SwHSqtx8fYK#C^@4+&2=T9=bQ(;3^)sT z0q`>5EZ`jA4B$NAG@v_Ab4>w;04D*@0-gn&0vrdt0C)y)IHbA807n2v0Y?E(1C9fp z0z3~m0yqVD5^x6a1mGpW=Ku!)yBBD# ze!xM%ZouP!?SNx|3BYl{IN&5;6W|PBBj9zw20(X#=GqNd0$2yQ9g` z1Xu?c089Y-0Q&*mfP;W8z+-^(IgkhNCg3RGb-=TLbAVHTR{$>qUIx4lcnQ!|q`58v z1^_PrMgeC5s{m&J>j0+#+X1Hl2LLAlhXBt5jsQ*ojsl(qJP$YyI1P9P@B-i%;1$48 zz z#b|%PC}2Ne46qw80oV?B2rvP71TYSG0H30Mah1&jkm0J{N80Z#&!0FDC| z0!{;l051Us0Nsnw{(vDsH((Ud1sDUI&(?Dq0dE2(0Ivg%0?q-37Nh+EO8_qeRsvoE zi~(K*tOdLP*bg`hI0!fcI1D%qI1V@kcph*Pa2oJD;H4#Kf5664v_D`w;5gtQ;2FRp zfMbBi0Y?GP0GXfD?dCfYX4DfU|%NfOCMm0b|S1{(yCW zwSbL)HGm1gD!_ig7~mk_dcb3V>i|yxRsx;^tN;}9E7zex#*bg`dI0SeF@HpUQ zzzM)hfKz}M0cQX&0A2)~1-uS81L%vO{Q(OBrvM{>lYk9?=K+TRCjbLwXn(>3jssQ# zo&l@@90NQ9I0`rkcpC5m;3+^A&F{y<*v~7&9(9YN9#$U-Jg$5ykQK}$9FshEz$1(L1{W_x_C(3d45`COhX9-NHqXeea8N$t|Zu&Kg z*I)rI*^GNo9Yl{pss zvc`$BH0wJ3ie$NnB$_o$A6I9M5~#?UBcAKB&eN~;SyKdJS=R|vWi=44CaaJ@ZC3k2 zfRGj_0w~m?1WL3K0;O6L;Ud~)%3-B;oxp0%MYsy>3V}-P0)chf6yeru^YkmGg(zK> zRz<&Rv>^hu+Ia$X+9-kDS{;D~ZJI!%)=r>F8z2zZ&JweBZG=F#wvw3jYoqk*kcJ3| zs&c`Nz=o=F(T(7Vs&dJV2ym!mH$si0lHCX-j!JeT1UM?$ji}qGWcMio^KOLJMqPUl z(h_y;LC{LnwFjZAQP&>CctlNjTw#Dh4`Mi?COim3jhgU82}C><1fm{9dq#zLY6z_M zAPO@o#4}$C5c3Q#2B`9c2-JE)O9ARUF#@|ir>Q6no=`DBqvtyPYVySBSKJdNknmg~ z(C)cOpxZM}Tn>3I5$i$EdHOZvNf7RcXPSN;^E49cX{`l=9wgL##2e@#yzD3&U#8H`GlvAex3JJ(yvKRjKGv9L0qOihbY@aUUvz= zptqlJL*5YmI^sP}Jdb&g5XrE2kZ{MnCkc1L8z*qe8)LF~>*&|0w~@)>byI$4yzTUB z+&dZsIO~m3JDm3p(#J{fD5ab7o+sRlH%h-|y+f4lf_H$xMei_yOWxB2u6Soih&gW+ zWpv$phCbf(&JvjSP7rYE(*)f51)}un{Zwal`VfKL`bh!}`Y?e;y_>i+>8lAO^l<|1 z`ZR%V{n8SEetnLZ4d|ux@sNI&cn<1O`Zc6qB5*`^lhng{h`@3E2o>yveu5}Z>SF{( z^mRmeN}r@(r}bGX?WBI0z?42mU|OGNRiL}`@M~5N5xAfaQRj2{5XB88@*zeWO5{WM zHFRj-al#e)CJ2=HE)pp9O%aIrt`ms*W(chG#R*jS`UzC}n(%&U{-Uoc3gWcAx9ITa zQBHsT#{XNa`kC~)vx|({w@#H@} zsI++a@wcM1dC26yy%q7Klva(-QSUnTSD$P3vKSKao|FGxe7x0bL~QxZcfR`5Rz$7p zi?_vld?#AJ+3MX0`*6Ie4)c8XUCuWzx9c>Jb}ie zPF+oSN$U)KEs|g3txf&=`}no-p1&a60)g8We;Nj=zNU`m_+JvDKp?7n;&Flb1~9E2 z7U%cHg$l1Ug z*SSsqUrQeSyEc78te1VO`ceJ&@oOuBp~QOIhD(0%LR*0U>gj13*tEar-IHG^Y0KTf ztBS?n+COmliLUc)`5Tg|{`ZQ0=fiCQI?%(7cW^}IeDtxRy{+2Dfxh^eg%?9@Sv4Ka zTqGer)#?{X_N>iujtXp`s@Xiy(L}Xvf zE3)9_9$^)IIk?ys#8mgzT1|y=}EjhMU}mkp2fun+zr5L+wPo`r;?sur ziT1-0j7LfO?5f&avu#_| z&Tr61|Mu3_UV0m;xo_d;H~k9<(#P&>b|POUh$X%!`yJS{ee3p}dp6c@tFL;z{>Q{5 zUw+zB^YE6f_<#M|EJyi$*Ou7k?T@{IkFDMl z>`okv#ow>{n-8{8;8Fg?Q*bz|&A)5Yo)1?w)K+cVy}HV^woQNZ!+Un^h;6FM`7Isg0nePaIGr@qw|Vt?XJ7WGs1cj=LTc&9C7 z{;uz2pYN~V`&(_ks%{D$iK>3(;6HqzZQ-sRHG6hd)o>1gSEx~hYYa$1$hW!J?evZ4{A{+mg!&fc8+_J<+!V1*QV{YwXtoRo3A5B4>-Z8=M(2!2ix%G z^BzKPiS7IlaHt5R-`$tkkKx?rr&%u6(XuVEpXQe~4;^hb_5EJys=o!_M8|z=ckFNK zYsJSKAFclhW&-1)5$e!yMlAfD*y7f<#pdrd&Pz|{n(n>T7P1g<--`3}xxn(7?!qvy z-IocIZ^58mwl%fKr|5f${1ZR@Q2Qn z?43|r<$GG2n&baOXlnuZ)cqs+yu`vVX*GD$Ns+X|{yR|=)bEJ*^upN#p89L}T3O%u zuaW9*R6-Kw-|!uiFZqTX@b!$+Abc{>ir3gs(9aGv{}i2srVW}?@nlEyYp?HJW~<9R zxO}%W-ufD4yuc#-9{6R&@u83vJ#q{E)QH(Q3e?HL3U4`ZQVj5-z_F)*p9sOX%j zC@Co@F;OY0NHK4em{yQhc*GO*`+nDY*ZZz_--h~Czkh!E`LJfc&$GVkSd~ zz4K{1^Xvm~p0zC+yabsq>P#-^z{ZRBBWY+|9S(!m{mrmS=I^V|+i^8ax%unBx1Qe@ zFPRAw&E6R1ZqC(pwas@JQ(~pfyeUCEsv-^inZ={q;&^!utaF;1=FXPPKOrxyk>X`# zmHfXQd*xH{;Wq#5h6T+s&LHB%@mSuC^*}PyTtu88aBA^}NJpF=nJ~n74e!R^58ir4#lh2gm6Z}qf zpx4L$^6M6SM55XiB&Uw;X^W3;mRl=KB~^^Y-WkWi)^HL>q!8tOR3k_l;~)#`o)nMUbM zriqktj7`HZ$-1x?lBqlc2BaNFTF61ej)10UCyao2*FYA?MPxfqXQLTvOQ6G<+nvCz zA5+QTkkevdVO~bEqfkgzPZhD>O1_UQjv4`$+UUweBuYlydvZBB9EEQ6_}7r+&?PLB z+-_y>L|Q~9M~xDtzllWdehvuP3NtU^6X_J_&g8$A4=jaijPWG4|CSkNrFmL{o zMb`Zvq&tek-avkD8YqeaHMeII367S84Ayr5GE7fS3jS&NUA0Omlm2f<`(w}k zVKI`|zH?_#!-|%8H2EZH?9_$1W1nJr#!rzzU&|t>jXh7363Rs3){+J2J%rPDkZg3G zBtTPC?5PoL;)oL)`BJU?r8EjfrAPfTDYl@9V+#5T2{74aIv~*TJIb%HQ}$Q0ZX{|G zgnKnDp&2IS7%1qWg`od?@4TDX=h!IX^AfUnn#1jpWgXqg_q}j%gHtk-@b656-iFiw zZc>mD7W8yhhN@H3wbXB7KY8PNbk{@M+xlS<1r8YXY_pBf-gXY=tW}#kpIAIyLqqDcOG1}hS zNs?XXKvI#~NueLFRH+D3o&_Mo8EI}=DjwjfjlA?lXS1h1P2xlEN9%Fg1e^GE5*@Y7 z91|uffL@m7cbR@O)93I*SS^ts;RpY`{@52WoMRoX#kG;*TlbX5uQ9*P#ajg8TmCS2 z4_p<|&x#M@s;ZA+oGCtV3@AQcd+6w2ohDh@mvCEKM+BW&>qZ&?hq*+)CC?USjI#q! zTsQVZxA*+)vum!Vk6!b&Fnsi~NK(EEhI%1%oV@6FaCeLOnKndP{$}%=IUOU!o5*iz z9fbrD2bnfAX@~WL7-lLDq!k8f9Eo&C+b?By&b13&-1*QW&gFKrS3QRUaoGP1j+j9N zM<*nY$}#`aRcn1qN}y`if(Qn4^Ry92OS8dghpD~i%TJ_0@^&}OpSUNiz>*>Dt zyMJ}|+A|y3u1#(Hj#39ANw!8&=aP$1yr`PebX|+#(qBF_dVIXFWjWD$-6MC$i&~a9 zCF09^KEfZV6+yK+I>#SpX*d{|YxH%h&aEMXqaU5=m}vPQO6QkjHc?6Mx~uhsW*;%~ z<?ECxD!JXIJe<>^WZ0AB5h6w{ayO>_+-z9bmJ>#GC8Zk*~?;#l+j#f z_Vx&6TzLBXozTV1M%Eu%pjY2~suBLNb{X=r_kaIk4j_1{SWF3sh%el9<||?V*u5gO z_8U{<{%~h!TLNtsE$cTUZ+wuT!ewN_4NIyAD8Bt=Qcd9392t}9ZXUP`b1D2&jFBpe zD?S(Z#*&S-4gB_*Z;!bQHQtWPE?rK8fkU*cudJCl0Sg$SqQ7{9=PxJ{O`Pgk9UaRX zQ7F=%T=TOJO#z%+eH+_x|R*UyE=2F;}dY zB=_C+@OEg-1{BWIkxj4NB~Zyp6<}$ottFW(C^gI`oDdKNaG2x~PI4_~TTwQ@AnAN3$@I5OOYtl@LQW1SUc{DFM+p1^*{Ezy zI60a35-DSy6h5lc+=1bP7+T4Ezf8W-DSTR?y+V3QF5o%P34ApJ$t=}3NIJ)f3PT%N zeu9LQoXgvWRL}EgaERJym(ARJuIrM;Vt<>m^wJ-q+mrQ1W~Evkg1`N1%e^rF4q9zT z-KuD$wuG407ns6J?D;r(SYBEZX3N}|fiyeX z!p9B!NjlFNYc`HRx5v#M^&T>$$R#>QHu-zA5$RjqmmyUVb7AKINh!J%B;3IsZM&b; z6q)dfLvjJCo;aSii43g#T2^KIdniMiX3hKzNyR-&S9Z+m=uX_q9^&(cJ4LGM!B@zUGD8BHXWNY3ft2n_c! zwfFHGv#d2(G$*qL{E)4KR*e5@t#Dz5en~F2cKf@WwE6^<&9>&uEzYnn zhmI0xaml9`7u~UKq0fK+y=O%0(;`tep4$I9xl^o>DbF`ZDiOBZ?h<;dUcOXRTT?r{ z)=U|i0cJ-qmHyqH@{dTR4MXUms5aP}Vx%j$|QnMwB6!=fHyB_!Xikb62kVwG< zk?XHY&p#%`swc<_$0Kb?`>^bO2d=DTa?uxF)bByGjI!)nXMX#@xcG>kr5&?7+T+Y( zLpwc?x$SMM_uurRZzG2n*L;*YELw>-Lt9(g{=$5zt{k>nE#^JtNLaj;C)4E;;KqtW8*)*iXPLMivv8B1hkq)ZQ`t2-|UxaV#sif!yp#m8dXQIMfa+(<5HI{5oZ#_15Y& zGt|43dXw`-KVkLpLSgtaqorFwqJ{uTzIQJRO~{pQL`;|GATg}^qn6w(dvJncSoJ5x znj9z5$^-k;UMx69t;oAcx2reCCDCM$$|Un0?S6?YR*7jxRG%QBOzFou;QBKMBpNdo z{JCksY-;pde@T{eVO}sqH47Pwrm!9~Wn$k%iZUA5n#923Z74%Jy_`LR)61O80^kSx zz~QeSzhaK4;r2_|4?B9aE=xTx*h@$EV45VYcL1vF6O=q;GO7 z8SS1Z1&*8d>3Z}M73eev`c@#$XJy*V%g79e3`6SRX|yVYYvy_>*UO(0(s}` z<7AthBW>ku*tY^dlT%z8ZMYF~$z>*4$7e$at2Sz`9g0`G?x~KvS@jHDjn{rEr+&y3 zdb=^@Bns*3p?J;NeHQ2}@QOyJ>IH@`%X@xnHAK!e-}I;LOS0D>NX)osjSWmUYfUrx za67;?Oq2Z-=M`nc7E=LH-+gWIi8(Z$!hbDsI67A4OkuBF^VPTG7v%uanHwo_)Q)@MBZHGfE|HRY{gtK z6efB_m9J*-#%N$!)~cO~xuJvW>*i#)0FLXIcjgpK4$Nr>9wMLJk*lgHhvlXb{s9GY zRbO)IgYbahLbT#(SLiBQ$Em!T9o_BG?r!=E!)+3Lj7~Yu>m`NWOQw#h+8oIIFsBr9 z65v0{lNHFkUStcIvX-6mRf87tX04IheyJWZX01B$z^y~`_~&gv6YBFW_0x6rP|-~w}-!3gfH@!m%l_I zzQUhbtFV*{j(%kMe=~`!y3`ou%FZC!vsO;C^|!bF7uiOMLbh*bP|JJWD?ahr?~#fXL`jO#tCSB*pWOdp-Xu*Pz8e%y;vYwqCZ!3PJA$BX4<^&F-0 z+sA%9qazaKL^LPE;gbiO`3IN!nc}aeOF4>LscwRtz}sf*b>s7byT2;*L$;~SR+`waK+0KStDp;VLM9hB9$gN z^}#wJoOr-6Yg&kC4`l7sa_7i0Qg(#g;-wiuJEC~0Dyw)}L`HGmOPcc1p~$Uxk$DI> zp)t(CcSt8B;K;k3N)jayL3Cae+s(=88yk;K+udeM7%kj6)nA&6q!wXi%ST$ zAZIJ8?aMpP7B3l(KnWl2mS7FvOrPZR*T+qbNun5@bL zAuj97DnpuIBGr`p!3ZImc)%p=9Sm;!H67u@i zl_KuaoW;nA53~1{=UONd9&Sm!XK0nUHI)CL(aelhj%B z$}wh}eAijHv=lcX;^nUSi03pv&L+7GD{10xEdiC=k`c<9>|^>JB9eG7JeS;bC*VG) zi9m6~u8jKOoT@{5=0qwJyVQ9nugHcf7P>r=RlA9Inz-aCF5a%mDjwR5mWHf2xnn>o zb57V+L2grq82UO3qjfsOx2K_nLdDzQxg<_SlVT5959GwQO#V{rVrYXsou0adK}e9h zbArxnD4BNdI>2*mVmV8!zlcqNltM;bHdGxjmGPw=E#0kLnq}G%sr1~=i(^hgd*EH8NxX; z&pUp5F_ndtc(V&mzjRr^h=*qNN+%Wwn$3}iz9mfxmGR{YfpkMofrL1$iiG*wA4NTj zEIT*k328GsMY%PnPa_GC3@$AJaw&2aGA!=vmK9$-Mw3<9YM&w|1+(1oEz%Wl z&kqTLN+_jIy(e5?h#RQ0V%V2G3uf`+X;$X5z9?K^4OQJ}d&F5-A$*p%BL!0K(U`Wj zowE>g=PhmLX-=%6N>?q}n;_i!2McEJOcdD?kBMbfc82}3Qc=^)VSxZN|K=b=PB07P z**V*%g)C!8)TtRzHN@OSz&)RI7vaqkEz{ExLayAMk(^S}a1wtn5YBvI_q-HeJYto# zU&-C8Id_&ZYqD|Y9yW+W2uhvV^x+(`3hm@>Frur*=u&K%Im#CpW=%89@Bque-rCrTvBxI`;FSKQ0&s}<*Vt}83Zq;x; z+fXdad$%1O(lJdlT=q%;YeBSoy5$gHR^c*rJ{nz@IMkdnv!+nf%({)rdd2dU=vE6$ z&yY}PYJJfv2!YhGJuFn%C7D{OQ{tFE?JbFR%(R(!P3+v|A%xW~KGzCWOJ3$#@QRDi zb8$@jb)Y8`2L~RsUnOU`>v{)lkwOgvz8aF<2 z&re*Dsn*R??#NX8&YjlCRCVc24BzGYKGxutMW$-EmpqDJFuUdz9?yeOBo+nZuRu~w z&@dJvA?@t^AbzToFq@gKb;9EaeyP(ONAb6Ie&Y=?S|>P;o4>eJXy9VE$V6^FOU?HB zJlB-JzW<8H_IL$3Re>O1IWhjk+9xljpEuM4t|2$DLFBTcL%R8~yX(Z=^ zzVgi{< z?|47sYcaR?cRc>nl1C78n|GqmrZLVBb`SLYe5AR?yjJB=3%6jq`n56c6UOVfIFd`g<;D+iNhOYZmmBB1Lb$VvTNulY3)~^xS;fD{ z8x^G$`M9#G+!$L};o*WM$7JQkZJtP#*urhA(ANgu)Yqgkz=fsLQi@InP))<1~mvc>!q#oS>+-+YlD2O@5r*V2P?F6}7e-(QU~zR1t> z5BA3sSD$~8yUNdPndZlEVd;->$L=dE%K|ZM8)kT*UAgjrzkQMARpNY+Ew*e5@`wQQ zU;1+K#r=irUw=WB(hHtYq4ZdW8MAz2i{%;3Fh&`?`(UXt`iYPa>&oIvvS{mg!&edV z;2=zIa#<8r$X6ID!`?7l=_f9sl2@XDskFjXJ2PgCd#A$HG$m$?ey*aZIl7{A#){6E zam_Q(#X+Hq7fM8p((IsJqqaS`@2V?bLWO!#iTY%w3KjB)?b#g#D>#~; z6w%U#bwGR=i1+10jGBn!hui%oD<3y2CE=UAX-H>59wpTXf0Qw7v!Y`BS;j~wye%r9 zqvN$(%)TR&^S2ywqscs@n#?nWu)#6ow`VjP?1oPJgvig7RN1@vO;xBpkI4BCfcK@n zH3b@+$294H7*G&A|KOAe1w+x3!1yRIzFE9wy)BVeRYdV_RXD+|e1-^3A49t9GC*Pn zRbuur43(IiaRThO0Q=^69hGL}n2Kp19#t_#&gFa0=lcM8TtV7!5h@U~ddMVkPiMzU<3NKxWj_L!r{{UQ^H7zd$pgQKorBW~ zrOe$!%m*OmHdm9S}3N;bk`>@aNm(85xp{A_#yOa=J38k z$d+zFEZH>J0%J4e+nrs$>nLBpDia?@0_%`#q?Oll;~7KC>q=Ir%?ist zBB1Jc+8PfaKLf}&Twl^53pGelN4G1;^eUq*J^}2r0L#m-&kDwo!eA~iYfTJb+W|Hz zzt@!wZ3-&hyqGZ(bx}IR<;DZ}Tdt|ajPZ2u_Nc_t`yqWX52<|tsnwvqXG`r;Uqt|Q z7;Buk$p$NqG2G&f1P-eN=vX;RPRt|%c{h+7^7C8{OHz^71P>aP9fPS^RLe01l&)j7 zSc+5uw*_!5`5Uvz`5{`+lL{<7+X@T~u^VWg2HNWUFJwczo@jYN(`sfAO`Jj%OTPfS z4PXQLH#;(l_(2svlQj0)Jpdj8z>fSW*`%3BMU7Bs={DTCEDpS{0dHTvZ5z;D3PT=| zB(~hM?u;#x27$vKqK6c^eWinHJ=U^5fFA+y5i~`Iq@e|c4{VPbQMkSQ46n!TG(%Oc!-pZfuNJ?v=)ok>QxzHRc{v6P}?%HfcG7f=kb;zJCO0PXcY4`)I*NpV`CFn1}Mgg-0t2L+9|8 zwnR6_aVuK7SBt~EF~j$^>hJLPpV1k`j0aw?IHw`Wqtxt@tOLuSzXo}_lss9=m{&4D zm~TUv`R+p)o9V(7%ArZQaRa(uRo-vQ^2Shh@p!{iTH&3GU9jTG*m7f@X{KJY`bXN0 zekDV?iXAr|L5>F@N5Xx%B?c?8R{p|54=T9yMq&H4>_~vu2fRM_lr6=Y7op9Uu*CLc zhZCNiwJi*A8vwW2{d`=(5xsw!7>j2e-Ox~X{llN1qso9|*l?^ojs0{^^GF9Q2 zaX-s3tdP=c8IV$U-$J_k0lBT9DifsHDjF4Jx={h7y$cv%p9I+MoM4M{gIQaU0rm-i z9V&=rmh1~uTU3GB2fVcQ>ewO;yp6znqrlPrVQkG3^$@R1;icObYMVk#S9R)sexN-Cw1&d9deIe* zb#pCZnDI3VxKqKU>m%*h0q~v%UQ6MsjClV|yxj^fy^f+S;{2p}5&~HN4Xo9LpLAmR z!ID_fyTY6y^;EbP&4Q1`obOlA>3%Ap)hP`C{}+G<3a@bjTa&Jo^00zRH`mrl5&-Q4 z(2l}7*T#{0-73Mq?;*MSDxkp2I!~uPSYp13*aaD@g4~;WoFGobc_uEJtxh z2-99~Ruq{x<6&&{aD^L1eLW^NUa#;jz}{XqYW{qsLO9oj6+)$Q(^M8kPRWmQ`4l z5pO2>3@&1-*&S9J*&;Yw2n|%ZD)Qza!2A!#$iu`y^EGycQKgP-LWwh~5bC=S%3E~O zArx$bIi2Pk>w#s9o9jtNMZO$Rc`CdRWp3vJJmrI0V^kD1MKNYh@<*YPmLgR_c8q;r z-hCT@k7i}&IV zHmnVMeuPa26=FS~xyF|(iUL*co2!DT7VukNc+Kw`&#ac29-5(vL7J@ydl$M(!-%$R7UBkYLJ)={|ug%mrlkj1tJ&Rcbfwc)(;dHFc3M-(WvIjq} z^IGh=A#~sCM&uz^m9|?8ME=+1DGhl@Jae_-$@3Y{83+q}#*+*U`r`s+MFpW(UF z=*#!|CcWeyZ%p#kn|U^jXS(vYmePs}TkBVM|=v@Ea>#7Pf#y&+jC&TLcUf0BF{s-V^noN2NkhQ5v@rQ!|)A&7JoV<#9)NFwa9k1m^>gt$kGz%6FnaQWTk_sgw6glt@iJnEz;RM>jI4LIceCm8 z1xH^c7*8oif4$ww8^#wVfOcBZy!G_4I5;wl!WvNW%4DxG39+m*wm=MnR-kCb^>QRf z8-;5|K&}JXYm%$|+VLsFI1vn@h6NR|EbYKESo(`MZpkZCEXB?NFX(GXAED?$$1)(jgi&##tMr~Nc~@C<^b#5h;vWdYe1#SL9Gk8+%oB&nRHvB6*i0GQ=82YnjJ%ig^HmJ3@Mp5PHdp&7AqFM25Ggx z6B8JHiB7W%CQMq3qEQ*?jqpSxnWBm*2qwLGorsd0aFDfjbYd~dD-`+MEWIQOW;659 zr5J~2nmPg3wqkJgDlWWpr5}^Z%Qu#?jp|`#dD6u zV=w!HFVc6qpL~6a5BK}Cr;$Ld;7G1LJ;<_Or#SFfmi@*S7%o|RI*$w+6a(JQk_=c7 z0sXyePoHEG{fh3h57>eH(Z180NghyS;M?{Z44+$jdIa$|DTcDN1!8cW(|3A1VKyr+ z=uN*bhJy5+9#IOGt%?QjNJ^{5EBnCkfkvjYO_BZDsxhdy4ibO6q9U?G%zocu#@?am zc#;xNP4dVuTOH!}xuRs)sTcr{dM4L_L7u*c@Pmp9c-U%81+2hjP9Qh950k#jq)#fT zce)&gd;NUa>)nbzjC7~J0hSi9>`^QQ^<0oP+)sAl>pqom(6M=Cult%H)7`Jg=VqBY z$#c0kof%UC)&q)lm{}>c>72dpPA_>5Dju&jPqo+GeUv@IAw?>7u9Nn;+)sz7z{85c z4+E?mmA&qjhuI2`C?ba__B5U0KCz$V7ZsV$+JbBkZ1=ivJxs}tDh>kJMqsb|_5&rb z%EuJ>9FR3%NNmJ{4hGKbV=wZCV&h{m>|YeU|I7~3kLz@6Zy4flIJ1lNw-mil?w8u@ zE<8q`?xgze6*Y@XfY8gA`l**wP8w?+XkVxy?X;p5h~@sh?zUqAz~v2-jzP6wo9IEL z!81|nq9BDVrd&YYai*VSuOgSFO@DxC`anh&#{hA+bymX>rB=6|unz z41YXL7kq?CukmSqi`#dm1OtS%1!aqi5xU?dSZtc_``YDw ze)`%WlW=j7dGX?2*O>u-O#yrblTz*1rYj8BiDS&c1V!{(a}gjNCuy=Go$qjMQa0Fu z`yflUMsc%N3svAE)jpT&-Q!fmR7Is%qEA|YPN zsZgq6jI~(SnJf`8i2eDRg8E>kXEFw{&tMQcK@4I)HQuO^^DMm3Tx@Q@6xV1IN=maq z!2Gv9RADnA)0-5NU%R9kTw@(v zn-y1)d2uc{#@QU=FZe8q%h7av#`rYOZHhC!-S~_un;imfSFE{Ojn9~9M}l&8s7QY8 zifG6@$>sv|PQ^7s!Vow@R`&t(_oxpGm5|9 z1X-Ng9n;{vG>vnQ;`DJfi|0t1JHU9E&3FM^BgNz)6MaRnTyC>K{QZihh%8uR0LK+J z#~FA<4i4PD3XUsn4qzNq93?3?OoQ_SHYeKMA;lR`X3G?6y3Gc_!-_4%y7`P54!$Fb z4|A^=J^PGWn=Jl<-=tVP>Mm-q)!S@H?WkfY#Ty1u7Ii~=3+575Qd_fZR#c8-id7j? zpK*=NU?%y7Vlqvs&zPOYb6oLw)D6){Yfc*5TZ+wTaDB$SG}e=f75ksX+YA6~vbm7Y zQx=CZ$UdXl!Est~_@wBkA(XiFSh+tlo#$2bEeRJEXcs{fV##_@E8&VkO zVg&|_x1}*QDn|cYY%{b3{n`A9;Zvi@lf<6=7zx+O6TiUe5eD~2*GDmrgN@VoTYQy&H8NT zaY8!(8k1l8ZO@6do2hWy)*DA%HNHvDr>@=XL%Zq|ah@xw=IpL^k`@zWTYVTJuTylc ztthWw_vzdt__N77`QkPC((Qc5bG~Hd>G&Kn>_lMP^`ZUm;@>I3%gwPOFdUX z><5gSruoMI1AchVwOp=xMbzXHoWA~#hiCJH z@#TAj5Bu78>ObUZ0cN2wZ;8)11Ii?yy`RExebs|GEdl#l$s~`te*y!GD@x%Ms_$Oz zagZw@F3(6zVJU)-1bOV!aCs`=@+nHuoSE0xCSo`r;HiRBr#^e(TQ%|Vg6l!J7=D~0 zl$xtC3!->vbXgQP5x9Jp!*5gcLb;g&U$20xroN6)`#_pI7OcRX-cfOVETE^uOH)k4 zZKm0HanjdWZmH1aACJ1~Z}Rl|S+DlFy8NPE z$+CNUkfb#rq3l-sMcJuBx`1UQiVJ@whPpo-xCzIN8v4SfxU^(jX|F$#c4>*e&nf5i z;hRfW`xAff_2C1hYy64S+jbo1J*H!(#W}Ywgx*lv=TH2zt`F}jUFT2azFyd#lb|^1 z*N2BnH~16(!0W?Dl=k}*xo=BLnQ5V1sh2~aEE(`8a^GiaO$!M%A1~SDPvpL)P@7~D zQI3^t9;!$osbelvs4#K3WUD`s`(8{$v9gb_vuQVFdP{cu6AMyq(sH(KYcib(XMKJ6(c(S+ zMDAP5P*K!OyAZC%aeesV;(bH4Z&^jNUmw1|c)vgKPq;pOckuy#BJDb@lxpF;8(eCC zO0Mg}cNQP?C;ras!?zV5@+bZU*N68PAND7PxYyUQ2c7xOa7X!?;v@dV-*J6-SMiHO z)qKY?E0cFNNo((ZwD{;ymW)u=k}RP*78f7$Cvx9Kh)AiEp(1Ky@f-d`?#mew)g1ma z#@}&$c)0kuKau+~aI_gMjg?c2-x?|gq%x;1L_Q`IpB&1RA%;E)&1l)~tQ%8&%AZKR zVbE!RAaN?%%Ch3qXHgI2th!A8(rnj<7Zm3OhUjh~fep11lkOh7a7?fh=@t`-5 z_?KNDel!>yN>G$k>OzPpI(G{!=4B@;u zmj6YrvtJ(`4NeFoa$kb2?>5M$!^OeLfkf`>Y4sfsQmBmAhc^am0*Qa>_2D(asY7Mi zx&AMtO>>Gu!D&Om=-WxMX>LUDs=yF_xwij}C@X`(a3GO-KdH0As(mn+8_9BgcwVqB zkQn09U3)W)ls@(P@RNatKqB=zR;M7=ZJ{fV1sVg1+*fSt8&5=vQ>K`AfuMQn#KVF4 zLsvK2o*}Of-xF9E7-BT0?ZwGfh=YN}L**@P=TJ7R?SUmjm#)~fhuLuxgge)vB71k! z=0Hmz@lUxvygv{PB>th-hj#@MLluE`?+SCA>DKSYz>1+dBgbY4;$*x&ye0sFau4U6 z`{J?{WM!ats9w#vUxGj@#{^afh8Q+Dwn=5vhx7XIU|`Kq4Mud;Lth_$+TRx#!b25( z_5aQF;m7^!0*SM}KKz(}!;qFt%&(i9cvH5)2(2IV_YdU-*&c|st4c)O=N||p((Wa8 zjPnrH+G!=??DB6qi#X17cKA035`V+>;amM%hceFNmbUiD7byn(+X6!j#B*PG+~?mO zNTlAhY#xbV-m_mH9`)}Cq&fHLF|`ZtgbEk?cc!Z_C7S6mQja1|qkk}6B`I;ZWGa}$ z{#}8z2~C|j!vP2pahiX3x&hZCrk(p>w3O?^C;RsV5@&yX_!$4bK;r-H_2DOd`!g7> z)H^x<*6YI$`VM5U#y09%Umw21cQC!aXcZ*W_2FB6htex`N*wd2TuNt67jBIott zlYPeniEP)0Pr#9t#93S)Ug0Eu0ePZ z;cA2@5%wY+<9FwEA)JhG1;S|v69~fyqX-)jwjf-La0$XF!o>*t5H3VGfN(y-tq2SN5gtT%6~bc(ry)F!a4N#n2x|}q1Ma-Z2*)6tfUpu_CBhnnA%u+x z#~|!NI0|7u!Vw5JBP>I>9bpjRAVM#~JqQaB9!8jl@EF3=9^@P0DTH}Jciu^aL4#gohFKBRqs~5aB_Ddk`K#cmUykgohFC zLwFS79)!mc?nZbD;Vy&)#qPX8gk=bKA{>Ko2f_&mwTH(LAVRyVuX7TE<|_$;e3RL5jG+`hOhzQafEdUPa+H>98rq$M;Jml4Ph6; zsR%b9tU)+{a5BQp2qz%ihOiQ$3&rp81YP$T1BI?D4cA)N2R5B&eB$e0ALGYr_OB-M z-&Y&??`wL|uEx zl5m}3u)?*K(Yjn^cP>NuU3mdpyIO)>GU+Y{4_-lg;yR=~(e-TU{F%VVeuPm0iYm7dAG#j2$j)M|K%IUD$5yG6r4P?e8*n zxi*t?w`&`J?QvC7!2PZ+1_xdJ3=X*lna~ke9)lNMC;9QHYcqpmt`YqBhHE>29e0f& z*juhfemvOvoQof&lkUFbL-#r7R8kAx2o3 zf0)0PG3d=d#$a`RKclb7uVJt*{}>b6kRN5d z{``Ih1NplcY|7umU~~Ry#@m|T$6zpjfWfZ(W2EiQKh9uJ{y~1+mw%kW{``~tcp!fa zp%3PVnD;~ZT}rJk!ROVp62QtRb738N2iD%Z*m+g^qY3H^JZ%8T=P>a{}$c{_j2*D-zEYN4xp_e5|N>?$VpF5`5cl zzxMlBVX_CW&Bnj=-j94H=Cj|#6u*mR;FW@COZ&U;*&2-%HDD_oHko)g$9@nWWkOVk zW4I3=E3rW76$fCy;d|_3@lr*`4wcT9p2)IY{90~(jmBE=5`etZp!-{-oug>jsUyyS zwnw7hCSkZD)OSatit-34mJAD8Vo{uuZL3?wMRFX%{knrZBO1d|W^p=2iug^CV?J#A ziDEA#^8V_>Ti=Zr)VH)Hqsapgz7r2j7pIQogv)P6UH8NIu<2>}ytn+L*T((RX9FVK z+S(M2eRB9sb#agQFmpvG&*|eAR!Q1glF3h;`@lAn7EZRxL8Y1|V|CKK^?9&a{`c$rd>NQ+DT+o=F| zb9ZlaB{Sp|Qq5LL2c^{A-7TwUwsrqy>t{yA+>1K8Tj#7lRTg*S)R}zVJ-?wnBC3&h z9_t0`(kFWNG{u9{sqEU-?JX=0A*y@E>YnJXbB~tA#S1Qp_TH$FtY8MFF7WmWge;lf z+`Zb&9+MCX%Ez%KK@Cn{1Vz?&cdVd7TVLv18ELg&n!(@J>oPI-tVMHb8=g6OZLCl} z!hQa4&V4RcG;8LzAoKV$i`YG*QbyZ{p(wKEHcug#AKgGAucv_bC1^24~dp?2nt4KwP(jU`(i zJr*yKYNg(VfvCLmp1tuRF706g?BZ{}dn)E`#;YP9eB<0t#QpQ4(dFiZb`37c$A?CU z(p1+t_qsZfS^uJz1lCcL$(DGu^o22f@ggX^v2M=7Ux}>a$AVc6_02D+U$eqfhvPhbChstj3KtUd2z`A=q&F#k`LRK; z)dcz8k-Eik4}=wDRTFz;TpW^k`0a76@c`Swjm>lCHO^ho{QcE0zZ5TCuxK7iBs{aZ z;ks~hozSySeq$MlT$sNXG<>K|XN8+CIr+z$IL_JLcx}V%+4Xa0E?n>!6^4VmH!fJb;M%&ywR0EEnMNiY)ipmY zoOdNZ6yw9}84H`6=guM1#qZ!-srGHg?3uH#y^LSU*<^E0Q=ICX;QXNCY_vINC{FcF zaL!U+=gid7FZnp+9)^_cuY!97zf-O`GgW$!cBIX%z6$OOY;Kh%xI;F#`YO0D;&*DV zaqhweqVY^txxl$+^({ayYE*owZ)jT3EZD4wv%?FTuVqB)xVA1_%aXZ_I`-iM%7MQ> zsC16sif0DD5qZu`Ra3rq_it)Y@Yo1qKGPKs(&8`VgQqiL?0)vyHCM||e5%U+wBHCvB%el&bu3>`c+LM0;dmW*n->-oL2cYhV#xK2Q&pW9xy zDjMnSiB3u<&*|t%#1fGf_VU#vk9NeCooKR|yJ353(xc1cc9J|LJ-V5$q+de%d3G-F z$VLpeB4OhTw9=D^Cik{nd);te4xa{)^DOcIW~Q3u z^q0)QQs1XZ9ImOODcaI1^!NlbIXpd+%^kl%He&%@7-Q1shvUnvXj`Xw6y*Dt&EFLB zHmiO9mlhv<5DcPTuC7}Nm6g5zjkjZdFeG9A`!nbF;wTvp9~oKGM(g}-yX zElfRLLKB`+ehTk`p4Dy9>%fb05dh-Dqqn^4i5D$}TODobzC85Kr{l#kuL}L&kX2~L z+-FLo=0OI<)n^C3_58lLw_5%D>fMi=BTRuHnvJHpW5=_9Sd8Xm#;JzR1f#VT8d0DF015jf;$#YLa$26GWlOCiob?kF=uUyL>W?ryLUP zkCR%SPNmv^*w(hqgbFmLXs^b zjhT59+DmB^W|;>`Una%QFyfdQeuV_oXj3#0=Afn?Ezv6eh4p`r3Bx(~( z=2g-iqAAKTXF7N=klQqW%dfV!s5(7_n^bTD&+*5p)vw`G;4d>TIvZ-)I)8kD_Kb4SUQ-+LK- zo=$1K8H?AlcC-GLl4F#EqYakO1WFDg`COf>HOAp2jz}TOb~u8hF%D8{Q$3d~BONTF z$CGAsG^rOlsAADwR6dNW;bO@C`#ofQPZmau1rl_HD#+x}L#ky6k;9<}v&f}5W7ASG z$>gH`2~x^FkMa#hxT=YP)n+#*u_pSGqWT*irq38*QAlG)_EOCj&ia{Gg>0cF|%Jmp_L%laG zlG#=_k>Jn=awePW10*?GCP-q?`XDL8^ps>~KF#m8-9fRj%dew}awGwQtaMx6|Gk&t zJt1duHf(+Ql(RFI{5Wlb1F+L2cE3Nd^( z?o`w6q}Vd-Pv40bE=|tqXpfF~^vy;LfaC>U@D(_o>S>+X)7?hLp`f|0HPJKgSzxwd2~xxF;H!1LT&rC8HW%i5FH2j!O>w;spC_VHOzMd^8XOwya3L=Q_VP zenC1_Z?6^PL64Y<09}Sif?8~nYVYl>V@X5*qtQB`7+g+0JK7%aS#}}m4#7}Zm?)Ff zaipRPv13arT;cAX%Cux9ktH=gEg}+Co$f_xX@Y2_S(Pa&s3Oe?B%-Ua1(H4BrTh*@ zR{Ksza4J7LbMKg~o<=%6Fgu!^g&DoEt4Q`oBi7jYCKf3^SR>~MKR6OVRU!^Hh(qMz56GtzDNek%l%2gmcLr5nlwm77v~w0FeVksvPs%->QHtLOiSH@S?Ql< z;E<+4jlq7FK>)Kl|AHjxO9?O9l)*CSrEfO!ELyA3%XfT$6{{lhmJ)I!dQPF*d{tB#%xZGq#!amq4Ci z$$^?HV1%p}&|~&HlH5jSOW8BN^w#)D`*j^Bb-%}X#O^Om8Qi5umG|M++75X`23Etwx8^Lw+4q18GW;WLb2KhKhuO>R?` zoDY+8Vs>aT;L&QuHuBroK&K(Ank&&iOYR){GdnoR{5dk`C>v|`OtOET>{;`O+Gv&K zc5>QRX{X2xPO})lFeINW!7mQQXBOU<$Y)=^ot~~%Zac_p-#4Ct7e)4EGF4_PEM&wk zt*?;PeoiADPZiWx$(TzyW*O}yUoLf9#q%|A!WU4l3Nq_GSN0X~e+yJKy=m zGFa&58QiM3I6k2=HVi+=$PecA3``ml3>xvgUoBOrX>d%AkrVC(B=>2@% znig0sCq;~1#7#PfNfwXF3$xBts%tw0=@%q9b5Ly-vz+m5eU=4 zx3d7qM*CQ107;YpkATIhc3k~xYgx@{iBEs)&rhYQ29jwU`!gqPR*=UtCT$XB(!0rG zzu=%UZ+ECaB11~8X-H}YMB;phY$&#QGF6jv0}3oo5xo7-S+VI461BwNiH`zo+fm9H880MNlnQg5^lnja0iw4 zW76#xP|RwgY@HPTdzn)(?c6h@rd2ePC;`5ok%hM}B`}pID)Sz&h`dWTRZO3k*6jXI zX{soeG;33qUiw3kn*FJo3+eo6R_?y9E$4tnH-@l0SQ^0$_Z_4$yIS;yB-hF1wtS4J zdOl7bngfjoUKsCQ+L(bfJKC}m$o(X-LTa&QV@{?$PO-2weGeIE4KxPpZsYq%WFe*! zaS2?s?S4{e+BB*hxjaNlimax6`V2`a6%*FSh7eZsmn@nTBRnS>ZEePlj1ghzrQTmA zUy5~=BD_vYij`y477raBATg!-NfReKfuDgcEC^Glue=3AfmvnW`BA$pzF zVpc@d@MDybnG#fJP1gQs>mUiN!!jDi#FD~E^Iwz3K3ULYhQ%%ok! zHHHZkIT93~$@KB}ZvS8;>cx147j}2FW1mn!PV*$|y0F=!B6jh64}%BA z#G8_ggp>2~nv3c7wm%`dIQljuP7}64+G&fs9CE~2h<$_$;75uIYey5;7v+d%HX}wz zBszq2H>D~zC6|tq{g+;5X0Z}gW1Lo6W=Y<7W6iikZ)DuX;@`_E6Nzq_inyd?D8a<_ zKTQ7YGgRAQS`<6VQ0is^vpYIE8Dmv%LMTC;70)3at(|>RI`yQx2{LC0OH!LgGYg&oY}|+%Av}pZsPqF-A5SW7$;A3=%`Tr)H|MP_p?>nWpzd z=mf}411F!MWy>b7nm?wnQ>I{H0{4Km!M2Nhm`f2uXccZ0(52%}n3aM* z&3G#@vGtjM3LBUjDXRfBBdG=;1_^drLq#){nVOoolPsfRYC9ZOtuw36=~dynR{R&g zFl&*f^ia7NvCd#;OWfs_QNBz*IpcMT`=02dOh?7Adp#kbxDF*F92&OGD>?-MRx=ef zO@T3|0w$}Gl3gn&6gb0Z!N}?$ZbQqMxIO@o$zE!9SLW_@X;ZVCgxqINh0Iy)l1!ZP z>Xs$bWj+EYnyrkTICI4wPR)gRW;>%*&+= zJw>rsrj}bK&gp`6oPa)?9#Y%{tS8U1u{$0K7m{$7IV81D!QFV{RFUchlI;=)o9zn; zo>8fpQ0d8(s-#Y`LC7Lv%MxH&du^Lf!fKZhq~=w!3OI2YL1wyy$)Z-vFA+0F0;*Ex z<&tV%Cttrw_S(s#0wGcr{_rMT9(@sWFe;)+bQ4j#HAQ|$v=H{gd{rNKnY zha*$9GbKO9FZ-ZD0U+!{10(QD+lV~KpXM9~aNfdCwHId;le6~PRN|Mm+hziPazaV& zbQr)-wbx-2Nhlw4x5H-qv{%btbVn-7dzN-!{LcLIDGoIedAIS6Ehj=eRXMRN%@?0v zkmtJMPjB86+f_7?bCOQwB}sm1-_rA!4Hi|7Ry1>KC4ZX5akuf)dtO+7vu8TBo$J5K zkr_aQpMAH{hSO4*%F4?Vf~3?93Q{t$?vnPMMIsl@N=E9WUw-P@&K*VL#Zn!0>y|c|F^~THh?<^lMdQmk6{_U3+YAxze5h+VUR!974BJ{X zk#m*lY()Cplb;y1YID)}fCCAHyEZ=Zjay3|K>STb6a89z#`^pt&$rw*P*hnGjo|UW z_8uNVV#)db3@w?lhPrOXw;nN{&ODer!lDfIu*eJ<-kV26?#NbO3cN_OgDqh)` zYEmbK1qR8blet)gm)@1F6P={6fA^_N7eyxW*q zoce7e3y%nj=^g_GrhmAvipvV}i#W?8mlg1ab?I#r4;Wu6%fG)Ts;XU*Rc z&zcwWmH58gh-O0tVgQIEpUVum%&-9m6d)HI(nS=S1zZqt<9?6{uG}aN*l^nv99Q0) zaJq{H#9|;`{B9=1R-?VtMjTX#sy)gk%L5jy6F@2f(v@eUynPCa3riG^UA}Dr%* z5e4oOzx~qStSRg7U!{t9Rbi+oEXn0YA&cXXKwMQ)#qBN`5akSm!#4)-0RT6*ZwY9? z6@}QfjRWW9M!*2>i)V#vmbUb{f%_zIZ;Iu@eM8}LFHcr^MWI`$PXV>9H5ckhh06U$ z8Bz7Jw}77p@T#2R=6Pujq24S7rVqQ2|APShSWdkL72vqclBPAx9|Q8fE1h*fw##9L zk2PS_*&*5u^Cv*uGAk2e%vi>28U+R}iAS^4uRzJ^e6j?QNDIE)+nwl~i%LT2;bo*}CPTF5rF%xaao4&gyW5Jl9N{U5FRk#il{i^+}>N79zV* z1xF293YG9{T}XRS z!EkSj1tYDo*%aj*EZ}|$xW%sfw&==8$^V`laHes$;0^(<%e6EY+yMorHy>;QprE2z zTVOu}*ap|Fxxfx9Fh{-Dr^1oPp95!`YgsOwqYB5Nd9-9TF%Ou-fZ6T3)Tw!C4$F;M zRQz#;qTC7AYWCI4n{5Q21<)Z^lMZD2JHiT{$^~RQPQL)q8?I+E1Nq*8La>9&JFx*{XRZQDnJ`aSN`~waPWot%c zXo3lGbCu5?J%tNPfArCid%mmmemHjvgwt3k$uT4Fc4T>#Ue{z>sTTE3p1_0fg?-O$ zYRIQ?Tq|vD%vk%*SUi>}u2(2G#urw&S(-89wl|@Wun=QyNhV-zeGb4S0B*@&VFQ;N zYYWHbHI*9`J_%WF+~%op)y|9=V_9VL6|`Q7Oqp@9i&#Sht_QfQ^M7i|3s_I6P_Bm# zGp=xrEewm+6f=sEkFeZ|G2SRHwGu64qUFX|9}0U^5&JY$PZFBn^`xXQZJsCYBP z*QIf_Or$5;I^GCWggn@xhNI5n*T_&A<|MF_QXHRMu&kxE;}$UKsy1t7UQ^7dc%mY2 z5sKw?=zW{g6gR1<7NKcMteZpTV#s_X|L3~Mg=1awdWIS2dr-P^eZAbcz*iwsU=MUq zDedN}ptwAyps14V5VG7D?TJ(c^zk~I z+M$s9JHrE7*N$#-dDSp;;Au7)4(`ePY{=c`W4p}9MKv*F+#?mih9q|Gb+)wD;&5{h z8t9n{&w@w`&V05;W5&q8RODR;?YtSO8ii2-ml&xR6Wm<2CUD+Z_lJn<=fOMkd#f?y zO^A}AhZ)z3VZ1`xUPzj4~Z-tkx&&ntg zjTxg~ukeVyWAfK4(EKRBoX4ojP^i|P3lypkf_UAXdP~xM4?17d6jX+mBsP~=b40)^ z0$#{{!vo5Mp=Gin)G3S%;#eD05WN)9r@7ZV>R6~i+>;P9rkn}oU60-X{^w#?k&$Cd ztf+X15>phc??|jsCC0sQDHU48SlEfA%8=B2_gZIC7CuV(_PxaA!#s4|rq*aPA6&g#Qkt18(@PHWEeI zsgO9h%!s7#VFS)$;2d>hpk?FuLcXxIn+>x_o{-nt$X0G#N`ZH&WH>&|m<*jZd0-cb zEJ7lu+?Z&w6HyLDxiOtX*!>ES$4oK;YI^{Ics&ry3fAk{r(A~=OhDgm2!7t9Hlg5# z(0%tCk%wGW`XoK5{4ZQk8uE~OX6BeY*XbhTR1qe!Pv>8Ag)0v)YR0ZHrjt#)<+xrv zy*X=1UTM%{RNQ}a$Q-^E8imH#BHYc#zOWF_prZR1Ptp}~N@dp8ywb81{@bikLm|vW z$gdgMLZjZ0&r9}%^6S^-dq#N-&o#I*a)f8%^B0ddCI#xrZ924uv8)fXvnPcDdP+>9 z*~c4(Zvezois%zDg=1nE#oItStw_OoeIRZa?fXE@3(%ATwV<9k1Kd%3Eik`U7n`1} zmD-6u51uRarqV4@PYjSARCL@QCwy~LpcC6jEmPDIP@OWJ7$n08#ZUwWDb|U7B#bf% z+JmcIp0a#A0c{d$q?+ZXGsEW_UxI>Nd&=L(ms7>xcnR9Ut0ea=s}l5+{sHpxJ!r+} zWnsu1_=@G5_NV>Z$d#9e7oioKTS)5jO%gZ-fqhz$P}G!a zw$?pslouIlOr@K`u618iN&0+6cT}^r?%6e@E>zUiYPQxr=PEKRRt&0|t#!|9AYq9~ zkOgpCSAPBE63+ybz#OA5ztU6v{N-q)-g-53HH=woN-ZMRZRrj45QtGHQPnzQ8Jk-| z5uL5~Es$2&Bx@*$hMk8x-=#=t4LbyCuc8Lf>@6q8Fgn8^u2w{=)wkg58uM#P{gKlJ zcs=<5%d9Vj$;^qxw1-UV6q8b!2_$S+gn&LN*ynP;6lIz_ z6xpxMHm!9}8YFS2BJ!>2lvzI@ywFRP4C+j_3ngar@E~=c7Y|bJQar;m&CKm}j~^h{ zZj(#1q6@vWqI*>I0x|h!xK3>IKCmTkpY|Ef&R$p54u0Nmey%}J$R#Xvif&>0Xg-y( zJ)oGpVRdF2e1$e24DCV1Q>3~XJZo)ph`-S=36#Q&=Y}E z-aR(+F~#iYRfY@J6@fC}VVm_0i`A}%zT$Gh+7%e%lUY8lxQfi9g2>EB!9%(M8}gRo z@Yx3i!8F=tf?iH4Cck!C5M1XwxK1f9HxCPfe1T0Cf5G2SEI#}23m7YG#xrm`f^yod zrr3EH5R7AOM#x^E82#GeKX8q+xgfk(aTQtGH)Pi@bO4T^;_zCB0D&UAe8p3ycs%MP zAXsF7uUJMX7H4O_CNRNw)GoMDimOQYyKPb6$c|p%AX{S;N2)(?vB+01-kt)h_!|z3 zV)pBn+}Alp&{yNdDVw)a@fMi}4UzPvwysRX35v@zw_Q%UfbFt0w#g=2WM)~OYno^6 zWY6t}`*eQ&hdp6*hSwRLS9z-Vn7wjI<*2|g>Tkkk0ugs@$)sVzBQ-}1ybrJ!i{=k5 zgS%pKRD0OQIClVBI?4|NHBC{3H)l>gfEcEsy-E>_#Q;|8+D_E@VV1&*?opF@@Q@q^KelnbQG#-RDP1NGL*qn5f(9uGmJX73y=)F}6pSvYOfJGRdZAZ5FYs z{*0(CxO3jFd%Y&Bbeq;5ab0b|tG)9rS3RDYXb|qxQCFR3((_~CK6&cRDq$GY={>C$ zk?$<27Izk_nsj16C10axer>3T`f!Nl-KU5Fef*2k*~O^q6ct^X?7Oxz(gyVz_J>E@ zdZMxq+v}RRlk|R*UZZtM>7Cnv&1DMgn=ZSy)xrIKTQQpyUrL{&b#gFKn-!O4$YuXV z9n+9+RU9cc+S$WxQ(VeMYh9b!{c3eQ2I{D3`aFx z-e6*glbT2T!JvHS7)B|97?c^|EOT%?>?!y(?2FCU;7ctVg0Tw;lMiIjOnHUm28- z6b^}Fozz_CpAeJ}^W})+F!@5{)&9xB#NT#OGwQDiCjRLsH5>g?gYr4~9Qkp&1R_Iq z{%J#J$m;P$lxhB}hE}(7S{MT-HAnfwLHVk04)Lr`o{?~_d>YXD)x+5iG_4(!p<@2jKV-0;$GwNFyOk_RcB3C2W zbd+Z#G+I+*DwMv`eBa`s8y};a4yHs%KdBk^EeR&FAImbQC>cA$p@s>*mY{t0Gm}1e zw8R?Q5g{?g7af9MNNkDT|B+z7@g5zv!gqDQ{O$KG>X1UNyR> zu-Q&(9{2X<(vrSCg)l3RdRJ#K-qZ~3aF&yrhrMfZ7|^UIH4k|EhK}Z#H4`H4@vaLd z{$VFI2fZ7DiL6IC@VpOvVUg?(Z+~t^by9PicOWPquFqI-ndY0AK(>>b1Kv$R`EY$k zI5cd#hZIv>0xa#MW}kO+4kMNAq-L*oYfwIyn=x^H0#7EJa-gvz>fM&hB;-D*w9vaf zhh4I#|MYWbnT`)Ocy|O7|C*DUS9y14a1&MgafX&w;-Mz|^D$@S^8nF!2vLsd>nAD2pm&KJ*rop)cO&IUG#t zO=o4W)STx!M_<~EES;I@m z&Xwoo0h3eX%SXFLd((;4xPWEmmwB#nUi1~~+aWA9b6u0tlF}HY1AthLvRs8}%eRuA z%P#V^uW+Ob==-;T*g7y*0&Fa&r6FaUTQ za3$bLz!iX}0hPy(SU~l^8k+m<^sM7=mvZf&;fV`FbmLu=+5Vy zh$;+t25=JKX~5}#rvUwcZvrj_JP8;AJON12qhAH=13V5m0C)_LqDCJD9EWJlM*t~G z^kKj%z(ar(CHf#BMTdR@a3kP;z^#CTfI9&90qz3a3%Cbx4|Xs0{o1GJ(XT-rkDnC8cRGP5^bp|=>3azr)_VvX(YFvds&6N7 zOm8Oesy;yAgua`=Nqrnex9zd{iOWV?75&;|3(>EwHWstC&&DDhZ?|nF+z#6g0{yl= zBH3wU@oWcdOX=4x8;h8{+ZG~{y|w{L+-KWJzxLbk7=U7JM+ltc(R)wXcG0ghwmk&S z*;rKE&y}cAadY7okUTeXt>V;iaVM0jadAy*ii|t%8%47&G%{|D8RNE1jeZN)i#!PE z1qHml@SwJt!tq`}Tv}UYh=p!V2o#$l$}Aiibli4V>#pieT4-Vg!y%=ma#Q^fPAyEWN zUWtfP2qNk446f;l#y;`V;ajYstOVlI6qw2k*NA{CJOft}{S;>+?kFDl=>Pdjnt)nn zm@Sk~YBwwxmdaP~;CvTTsT9wa2T(*Fw$rpwvN=K!PJkkB@+`H4vlK%cU5HZ6-mQsI zBF|7~WoC$;C^`t2qFYE!iPY`7tZXT7S9ec083%O}$`TS$X6hu2888z@c7hwPPb1LS zbDIJ!h(sTXRt8`G23%h&8yF^pMBayJU{)lFRpfk_kY@ZtV1(`)3rnWTT%_~zo2Yy~ zEzv)$J?tLgx#|<&fU9wuiDZq){OR*(5H znqmV)PnJxndW?loKoIa~D6os@W~QT~O#%HFYGqE5c+3PkEq;S?nNf}sYJ*(05gbkt zfdP?QZwT!sYVwkivM!+Jq~yi_AtE&cXCyEd$CaNDQ6|~)5QR??SxJUsWrSG~f(=;i4uxOuPM>mDu<#~WL8DAX{8Ll3N1Mw<3g_pmU zvpxN|ruI?W*rQfuwqY=k>iHytG&Nuj&(qd`ik9<{m~4m$$Ix>!N(2?hz6`Z1 zqw0}(8U4@d+>kME(hQ_>qZ?+;Rm7S^!}!)`w})`2It^Y*`8I|NxMKV;?qEyd&QwOLfZ+-A zd&)lFK-j{4o6<1Xw0DEtsb`aMp-$c<*G#+TEA_tiO~HJ(jXCu+(d1KdYs2?z8yq(H zl$-@`C`~uRr({uXv{(6ffO(l-3}x^4N!?#b*NVK7j;|3!ID-huScemGgvLBUn&q0_ z$$k+1#R=_adA6$?q)UMYCpo*?td6Qtip=2Q*7V*0{RSV@m8gW#0&vwIXq zF6L@uB)s{+v*biFuwN>9(BWU9C%(2MIaO1_g@Py<>pJnMP$2%Rh`!3ks zn6Y-J((tp?&fxbw@Vhfp_0CCl3G>pzj=CO|+XrU%KBl%6-mm!J#f0$~gBL$?3Y=W@ zZLm~|8l`g8@c=w^T+KXnSa$#vN&kHht~v;Pp4rYcJmIL$EpV0DG}p(qCvr+` z?yMc>Z-n)jui84Z;j%Z714~I!@?|4UJQoiL)`Or(5`cl6+N^hh-vaz}i3bCTHyCUO zL5U>rR4)uf4b%WoWfJ8kl;pY>nArkTYM3O#cx}LT8!R0qhAh7m#xH1&*K+`6bOo7Cy3mZ=E7WRR)oTkwJ8hIMqm^JPQ$x3RK8#2T83YfuW>0TpqAT z_fvb8N)#C_%H!byd+%Oi-7Jw5zRo;?9k739BcWGFw6srbUuuIX-b$IAqb{!ppp~(m zas>ohF=qGM$e2AO^Nmd0!M5o7&hr7v9Fa76Nm~<$`pFpiWYBb1955GtnADDD+Jsn6IXjPds=Mq6YrBHD6zm5{VvgI2O# z%t#CEg@W{`B=zw5FJ!rdk+Hr*%a2JSFDH_(Eogteh48o}bQ^anplL8^*uUUh!k{xQ z#6Z_%(xK23l4gW*6$YxSEmS8Z6gIKV{iu z&5H{x@MtwD*uUUOLQ=uyf_cpa(zYa0wey5xSs^$?j+(#l6aJr81uO`ME+Z% zNm&YI7WkepTn&ISon-YDTg^}m)MfKZ4UQBIfD3a+GwagarMl#=` zme@MH?Far6ZT{ip?O3Sg_-**svO%*Q@SN_-2>_k}>;OCsxDoIa;C8?_0S5q20`3Jo z0k|LVRls9_#{o|O9s@iDcogs);1NK#9UAa}lK>9^LR0;qZq-!ZVbkuKIB~!Rjp^r) z(cfR>bZzrWi^f8SV2f8W|pf8X}g-#-QD?|U8e z_s>lI`U}OX`n3}}AGHn5cWci1-5&fKp|DCLoxvA2m(0_OJ(O_db}8_86(yZB@&A#Pib|q0b|fzHuK{ zgRn_~&S2S!n=F^>V$=BURG7`>}!e?yzQo+1{@pU~c3j1y&37bBQD>d;eR zFH5P8c6HD-!p4e$_$;#xje)ih7Pt1Q4Z#rekNz+fY^b3x47I^?HB*J?VeaR?M`*9C z7k_*mptKyAI|pJhp7Q#*tA7&CFZZ{_Ls1;Z-7tB`lWsT#jb~Ymc7Y`IT{kq9PFg7~^NFSi?j0+Mv_L z>X1u%J2=Qd{y6e{dfAwkbZYNmSFL~fs(OFZqIsv^DTCs(3|vjx@k-pfa1I4{hqL(5 z62PXJ>t76et2T58I$LGhzumv-%CHLqwW$lmo~pj+n_*{lSF|G#zhlyjA7#>`Z*w*A zipFl9cvC1@13f%~f^c@Jnvw)XAdqY#GZ#H1d1X8xDYLAnx6r?NnIAQ*{n`~_k1 zRSaK$j!^nVYC36ig2BI9Gt~FQd4}h#MbK5IDB`G<6)=L;^MttAC<6%YY>ajL3sxj` ze;^tXEjUKV93v;D?yo4tYzIuh1KW8?E4Cp{NkyAFL>vHMCOG^nR02 zrl=$eZ3zWB-Xf&g#>PM|uF@#i+g64g!SkFVl-VTFDeoW^+E`pfi!n6+bmzMIaE=^i zl=4Dr&HYM7u^zuj84WWPcQ8gZ#KPx)MEjT0cZn7~-fMoh&UEPY1cPOe!>mafn&rJ#~rH;@w6gw`Bls$ymm+sAwl z9(o|m;!~Q4tL9ZtKUlzu%YFqV zJdASItuGLTscc1+CWrp;yxJS>>g4xdWNdwm=;*ml;RHIO=eF3aUB4nKQ=L(AV|C$g z|BUPp0U(sJqQJqw7Nq$Xq32nxRqp9**3X~WOCkaK*>q;YVT^(Ha79kSkWYvrR zQwpx4{of^2LThlG!X!LR7}69}%A-q=|4fmC598kvhTe{q9Mm0MJ)QA~2}dEE6dc+t zwB~+7*aV4)W#W%Owdtj0?;_e~I4|B3iB)y9gm7Kd%6!RgpczH4;0j-LPP{^#DJFx0 zN4ex3qOqqXf)Nn=7m#44KxDK?Ky3pm-h!GZO?>j7_JW`x6vl*)ZUn)ICj1Z?ZfyL* zG_=}GDCK)K9dy1KyXS{krxYA}=HUy_ z-X3~x?Z)#dRq0slk(OQ|YqHnw32KP^H+?K$YQ|PR#RB0wuLNuz`qU zM95YBn1Wd{A$1{d+8oB2e6;aVgYk*}V;(+|v(dXqeIUN3Y6DJDF}TDg9$hR4Q}0X2 z!IlsHIS}QgCHNU)IoahzLQb@WwVL~-X6@k(XTIYSiP;X!Cjl#F)=d0hbE#Yz{;B-l zunMH-i7Ch#ehmL=quE<-ow{jxrWjl0@)+^KYnqAc2d`_YF~W}o)cCYbWIhxVx&jA2 z%9FyS3X?Ru@kz)swWT%AMhEZURFxUV)S1ZdoXV0W5Dg<%_QlDQi*V%(IhJKFOS4d1 zl$@1kQ*OGftzsjesZbMp1X1T#EkkGlHmF*FO;GhSzfG6pml;(38dXEE)uJKzGmC~G zVzJAB>dzvNaV+~+t~tns^Bl5>%?7i79K~dp^GDMP_23NJzr})THjLBC`jvY_rkjeF7tio_F(>QeTK)xQJyC|AFC_frBk43BM;Ss^1a)<^XZws;yZ%* z13H3ETkw?kqR;=Rch*iF>WUwOy5h&5g1Vw51omvyo$qRV$6A2j=B`ww2a8AZqaE!{ z?7O~;?NENZcIC1u_Fip{HaV+tjOK9`*cSG*wP|y;AdmkonlIK!&|jYY=_z&=WIYKr zpT$tMCQGG9yY|$&DfVq;wmI{q&f|O@k@X7FQ7mK%O!IxkbfQh*AkJwhJG*;|{hBgI zY8E9KScr2iv4~Bv&$&n8KzdE{WLDCIODLU3D@FC=Q|yb?j8L?!fhHZ*o@;5M_H+*w<`RN=7&(b`}%rc(t+;bY4qfg3S;dZoXlPeb#LrQ-CT5sZEDYq_Bi5 zBsV(4C39nEN2=6krr7iE^_nadH99YeCL;Ny=ooR5B&lwiV*m4Pl1-a7|GmPj#um+^ zM1x~0hdq*83PJJHF)`aZ#r~aif&yPeP&VQ}7Em3xO0IN9PG~EgtVwjYPO(R=JYCQ+ zG2~z9Vi%$Kv_@}`{Q4!&6up7V2ol}xQ|yaWmeAOg{5-sxq^!AHGNKr`qH=OlIJ7_C ze)x5*OwY5;DV5Wrl&bbBoXjxtB%_swL1>KzG#KbDhpBh_teV2ZLT6k zlBu!^38qG!v%t40HQ(ZNeCJ8N%2Gf^W3>5*@0b|GaR%a8z0`4!G7b>7k(M~Dbe{r1 zAWD2fwQ2ghrXXr1Z?(?q@fVE$2*&MisG@+jv=KX7=Vj2K2uWt7#VSWQDw=fq2Gc)* z>4u3aQ#0^xjt*u$l9@VPz>K~CkpDFD-#A{)kLk-IJdDxCP=2mumoP$+Uw&$U$GhNh zXTHkAtOE=F+b8RwN=N;$0h9N@|)Gj`B;QaA!Ei&{rE$*E(c4*a#t88gcuxU4KX;L_CcyG)$4VTk3Fu!ck3QPt(S1xHpTdY$4H2>c}J` zoIt%4b&hLkF${E+*uAi(jV%O*Yi9xDLf|hp$24t*9|*3I1w?i=wD8*^8xZU-fOM{g zRq89vQD-ESeM6+|%hj)d9hGW|fvSh7xC$1iC@dDQ|65xK!L_b{pg>+`8{X<8B-gVl z^_96v%ZiK3UT~hN*}Te>`Pe@Zy@%<|P!-i_vDrSh-wwTIu2=;u1$rYP$>nOZeSEDQ zD#To&s??|G2oEwHVXi$@>YJG@cE|(z`9roc2LklS5^d;Z1j0H>n!sEc3I!p0GF=HH zooQcl)hBAC{D#Hy4&-Ud#I>D(^hzXOrh(5TA#g1x;N8Z~08|m7xNZ|rcx`JRIzM?IuJcMJWk1R`*D&W6zI4z6QrD%JoG#{PA1|L_8vjaRhmHUGJ4D7bupqh z?R`Y#!bw&Z?cih5GlmB$IceWQ6r$IvBo))k!&Rx~nZZMqoVK4<=xQV#w5`NY_Kf90 zOHSEODTK9>&?yG6$HPOGoUxx#$d(E+K7D5$)~k!MTxT$S3*Z6nw0_x(P8NSgEH#Lx zNbzTyS*BS${)~Zo>mW&bg~TO=m?7*+fmKG=E<0(U2Lz%lTk`Xi^3G{?98~HX5_CZp zK!ocPD_UWTwLBs&=izkbZ?si6xhBCP0`XPH*~1?!aEN5S^!o zvh+!WlYb2y&}VKX{@Z1`ozC+I^tt_%xY<&QR&jBErH0wMT9UP>4Iayy?}~3rDVmPr7+MV(;;Ccg@x-51J^$xOqKj-zc=4 zQe;;*Uv}}PggG%@q?I(|eRiLHlTgS@!8P;s(JuQIa=n^#ag==X+Hc<~oYGngVXang zUi<8~2&J@SLK?rkX-PM)TkL&a?prxIThhu#Ji2=9+l5MCLJoDK@S?*h1|Rr*#}aNt-tK%HP^l?GuIDP z*VDG$smDm>o7WSzJ>JNL-Mk*P?G?Iq3B70DydJXcOI?}FQ)kdN=#6B&c|D`=_eRp) zyq?yd@J7;YU4xCO8Sun#Z- z*bf*2+yxi_+y}T4@F3s{z$1XofKWADnxJZ!=hW_+JUK+lgsVO|aTQH-(WrFfzDpf_RX5aAD z3_q|^p`$v`9t*`t)zeV=Y_l(e7ndd5&g6wnox@aGhK_|$`+y?^rjqE7v3Jd?mz(}I zoU9y}tO%*93x?f`q{ip6IsbJPP=;#;IC>?&SUvAQaY>tf(Xu6#HP60!Rhwf`ZPk)y z`e&F~e!^cJe<;|tB>r?bx3+rK!WH#(jWta*bxTUlzf;y`Z?0L=WYFVX2WKbpa<^#3 z+Yg6F;+RN3*oPkJHaz+M#ZBx*ol=>$)|`+2G6`y2dCbqyt+KbD2vNV&4X zzoM%0+nZi5GwMQ&YATm}>)@%dr?FyHLscU(RP|M5%?gje@7kIrHMKR@RP`;C3I63Q zVLv6fKvA){uCc1Nf}um5t>RVchsUbm4RJA5pw`{r_G3|AEEWidU>A7FsdsUF`ufE+6@C(D&b^PH2#=`gY-@+^B6ZEh_f`BRjL+@vjm*Vmn{VnrggrI2{wu3i z5lbeRixxMms;H}9QQc5i3u)9fH&j%WJPZMPVBd5-l~uK&{98ZT5_Y4oC3Ow8{>A%9 zpd-XbG*KLQaN+21E^7#Nej^09gqp&VR>-8Kl;o?du4r6U;jgC(L)yF!YNF^8R!E+T zV3PkPFPoUuH#aV-sw{c$9TddqYL@sbnrg1DDuFUOuWt_oLmg0=eCVCWoZ;L>6$_g% z=$fkQDw-RgV)bH4Xcg3I`KW7LwyJSa-7+pWmNZf%frJgLN-j;L%CYxDV&y@CkOXH< z1R@K|;i`#U)78}xYGuMFi}Hj@K77#)v%+JR)mKYCO?8q%<-=5jkJYvkGoYbv1*Y#~ zl;|Zb>?Ke!T-4RIu4=<)e?4I?G;pey(9im4S8&Dab*15vI2em%fRlOezTOdbE?cw; zBKZNaVHWP(UbkrtmZH|0RyGGNYVKSEPL|Ak^cW3T+|?QO*6hDA?7ni@;#G}JD;8Is z9sDh7wye<*(Zagre;0joZ`gxLUa_dE;;O33pHi_SFxRkNuxa;f^8~oFQl5>&xyx!- zHLhr^sH?5@FR2XDD9J+-_SuH2Y6zRHT!&~pd5|o~R&&j0^Sv2MpimQma+1eX4*r6F zLR*rW?1!ej{5SpN%=*bWP3(J_dos)W-FM%Gf+bxstckR@(zyNQi!C3yP;JnR3gZ{1 zDvG_5K6ZQE(LG@|`zI++-Z%Z`DpPeevxjwyD|J^8-ul{MQmX&_pFaszVp@cWA=fX8 z`#!Rp+8XHW4aCgk-_5$}S&Nn`Ml0JFsAl(HXaB)p)!Dhl&n&9u?}>MjHQK0TZ{h)A zhB=y0lW6f3OL!?@EFPu1V={0+?u&_Jtc8T>yK+H{C+y$6nPb;t*22sS?xiG?397_s znlMydGy-pjvx&gsb=@GKGsPT2TRMf%e2ZnOaPinDh-6|y5tVQS6l8lbHkY|X@i%Yg zTx!f&XIHQ%_9c=^zA86vl<;MqE++xx{Wovsrs%lp`7phiV?Q>QysfkTJ;yo-Az8j~ z+)MtgM?(FBxyuxSkGXDoBxIdBoZ8>s-W4QE^xM!;rs_Wngc0p1-2C0y;Sv7sZs?D* zd*#>1uKE&Y5LbI9BPm*V1FzKpE8RjZ{PaUjhPU;1Yzs*HT(b z{I^*}{LSWp)cTXn350pblPQ$`YhnV)z5fn^ggHwm1CSNr=|#-ag?d)82yr-a{*Y){ zk-`FHDD#6MZ8MnRjahcx?N_hoL&;2=)$;M5z>=V8p_v3bnW_z;U{5@>`CIGU%*a7S z(w8!tBc7tS5D6(UDI`_&WCtsS&l8S>so>c34^k}mFA$a#C6cgA4dq5cQwyzVQ7jpT zZ6%6?s)Ie$+G1VNn+Qn`AC>GivHEyTC--uWl{EejL_ zR`n5zd^Re%7I(#fp}O@%L$?z_LcI(RBX^`j(!<`JDN1EIo4dCYDnXVE1$RZE_J1U7 zLY?4xCPt>L%pJrIA|PcgrP3Ab^mt#2GR1YrSAfEWK-0p;5R3u?@vbQ4p7GeeL*YD9 z;?cZ^Q^Xp^G}s8RkzqsQMa5pf`HKCCCQDpKWPoJY3XLFJA=vnIV1MW$ zE1`=hp%R;PBg|}qFn@{0;(de|O^Ak2D`rexCy@ME`c6VkP*JQO>+prc3GO0-;?YA>!=89cm$1EmeDzb0hP_O3Oi1L1EK2QUY0QZ?b1io( z(%6bgeS$MOE}+;sqVTm>=Z16QExlcERuISGqJ3xIum2^T-4?AXmf=7WTG$@wTvv~Q z81_*;mUO{ZE5xpjZ%!?6;rHfQYCA1NY}hnKH)45;v|{Ao{)M?EkNutoPL8C&!+GoT zltPMkERPxX=hu`@^FR?aEm?*o8?8oG9Q6@1rb`w->=7w;!%tDcU@N_%G{F;2O8}Z# zY}Rr^eScEy>gS-hEtg^e%`?SzpMb;Dg6XY>GpDNn?Bm;fp%PVp4pQ2+d7P z5*oe~_YmIPv?Lw^kPa2UO%$f7q(T8FW@f;Ny+mft0fo$rH1ROe&?;D{qT}KD5x3#bvbFc~H zF&5wZrM+*4z5FSdRDmh&#-A_jk{N_S-gq*|tE}Nyi!?$KP4Zl1l2;LrwuAd9<11hl zU8ygO#5)4r>x!?bf#n_s4SgUEWv(i=&!lBPbUcEBx9->1sD~6=X%+K2~>dA6* zCzOwa{JGPV^jvGpESWEOEU38^pBGeGPo#@gmMef6J*4I^)npiDhMEmSDCO36;dDX* z;U~{>i>tE@Wpkw8e;A#zd+lf>K8w}iij-WW#v12lSPXNgX%Uh;<`p3s4{r6E&|;-B zMr?)dR5jU9Rz{IEFv#hGw5y9tvBFv}E=7gsup8)4$LPY^n6RLj^(h}lS0zkZ>qr$n z_CbVnrL}D-`3_r9i6g;KB_OGn)9w#j{vlRQZh&o!1Z#!h2MUVK=ESVZRQn6-9Tu*` zTon__9Yzl=wAO|1PEk_F6h|(qcK0mlhz>_$ngN!BAe#zxsrme6Ycum)X|_&QE@3s{ zX7h&ZO{yR_icY^ae}r2+f1DIojr_{G#acGr+A;-Q&hUkt$s7w4%c8`{CR*882son& zoYBlwj2MeCDOvE$Q+Z|z-ILf9bMatYK4Rr!PG~V78PO%2-N(|fV>HG|gda6bM!ZHD zSkSV^SQN8jK4vY(I*56#7&Z6UV02U}I$pGDQ=W#LG32)NX(%|Wl&vs778siZL6}(1 zB4xjdQOfcs^s5}egcD}(l{G_{y(6fNsbTdgSf86_@32!>%-&xlYi@FNM_yE30!nU> znpQ+s>+(xg)8^r)G<-izM&QQP{UjSObVULdh4{C5;XWI`EMLzNy9lX+v#4kn8L4YM z>#u3>HGM6Zzu&<^>X>Mq2eE7&D zZf|T^P=B586>!_-n88dV6S;9(;+g%eRp(a^IErus)6s&jn@9)Vqi@wd{fn(XZ$XC_ z;ZCfh1+Ub&B1H0aJXtStQ!;Z&eXADWiFVm|KJ#c&Q33y6wC$5EJ5Ax4^OCB%`ObK8 ztMBoz2lM+4;h7Yaf9Kko1e$U#_W#E-om(B#MoH1Dr##C4{p*$= z>Go}&5z61==c1b&!vBD53p+p)j|m;m{d3%x^U+ZLMhEvpU?HJ; z%X6?6SmTsWrywBhV0w~e+dKjpv7Op9{g6W4EA9HFiBdrOn)#4Z6i&)L1WTO ziTg~km%e{7&1eCKGNd2&>~~MKf6?xRZK$6R`Px`lq1}($Gct)b&Gx<0_rhnjAh#k#8nNf zCKrKM&b4KZ6ugkXPv#d>Lo5WAAh2Lk4JKo+-lp(KuoInOwG+LJ>_qz|Z@Njs5Rkmh z0}MDP z6ydep;{NlB#XS?@AY*y0ulUlGEYZ>CF3px_)Y=dB^K))nXfmgMr@;-YF1-Nug|VLY z_!w;=S@s^11*BYlO4$h%JS)I+(H7@DN{zYm3G#zL-`Zoe%VDZr+op|uufV|+W!tpz zZx`q_m1DGgt-wyz9HTKu8^>gkbk&kVOv=F-C6}Y*rkl1Y1#61ww#zIXjX5JZPf5j@ zPw!HBz6bBiejdMj_2O-tSIcf#4c`2FFCQ_lCL1w{JkH57pw=|aL!qMF*)+CS`_>kd z+A%3a@e$;=k9_L*RQn^NE>Uc#FL4^x)Pn1Z3o_JBMpY|8)!P4%u4=ByUi1uZ=KXj; zp|8MvZIrXng863yM*S)bkV+Iy1zvynX9=uj(_^nL!BGGgJIkz<=2*GC8%ZG+I+>LV-#*F zhwx9p`9=(3lW~S2yizh}Hv4K-lY9J)-sgXH=hwDvUMp+7cIY05I};Wxjuo@kxAsyW zuRd*@)$M_B4D0)iS6*_d{n8O!+%oZ|?2jNZN8D)1)NMB-bzL!C!dv7jDk}%T?@`lx z?^kPz<<%IQp2PvrqK$g*0}TN5b)RUNF);a_Nva#ktIPU;J@^2+rc+9=Geg(xW}G{H zvbC147j-6{eejNpzqfkZ=BVTvP1i4WVk7+9=^P!ca5L(}KjXy@4>?wo-KmB`}HnG55 zm8WV29#}`y@ec3VZJO(Rfsa?z&Y**pX8#Iu~&FtkkgU#Gk5+rF#Oqr*!cy&Fkg2&q8QT)ax~v0+ z_E5OD`6ZfMCB-HV4{A417s{PDh)Tb9z*=Y1m5Il!0ZP*nOS4sU;IJ~87WfWX-i%~1 zrMn}B%vw9tgj{DHWl1f z=$-c{t>-Rum`koB={Z?nNWrNXoYw1QIP)pJlrX&5k_e|n{M;uGc^Kqu#L|kr)3n6$E$foIfbzzq4 zoI`WX&^DZLjD49LIOJ3-(@)cS;eRF9%|B)k9@2WQ*R*Tbz)y%oyQ;+nsHWA!^~z|G zUg|NwEZ`Jjw-bH>#z|bF>xX{AP7+w@GU0$eW)l`*cnT2+)n!7TlN^f_2~1hGtb?bX zJB1kS-t9!=h4YN*f{r_}Sbkcs9?Wt%oSN$j+{?)VQU0d5$SdpiL_Q`^IE3?oI)I@ zLYE4BS+=MY9Qbg-vN1(2J|qSFj0pL7N}WvJW$rS!Df<Nc*-MjJN?8l{c3+0?&V1cEna?S8%bI@fI8n6ea&>7ZI~WqH;rjp?K0TSPKv)pp59|R zoV3(3i51#vgv4?wC@s4ar2dEc5y@-^%h>C~dM0iL1@Z`x{Spa>QWV%uplD9-lqg3v zPV9(X-+2nD1C~_0hIY~%-z8E@$EG_qV3cm9Nwiy1T2_M&nwWbeYJ_q^L%u3P?iEO- zS0}MqyH6n0g|Ng$3*n%^1ewZTsC*lS@b6$vHH^f==>>5cpq^)Gh0-pte?nO{e@yG|u#Rt^)H^)I%% zPJ1I6v>a%TvQ?VPE5Wf$hwDsI&#FZ$bBppr|DwuuPCDQ*Mvt1qd@(I?W%)AIEVEE1 zxg5U8U#x#InC=lirGHWDtno!M=wH-0YkiTS^)ITN zOMURMWYJ}?++ddboy|V@b7L_VQ|ezVaIWx065iTiHC!01AeXmI{^CuBY?XBLx6*T0l-6mD*=xIt^hm(*bL~- zhQlks>43F>wSYB%D*>wjI{^KFeSix9cLUA?90Z&VILT$tDg!J5ECH+noDSFlSOmBg zun=%N;3U9Zfa3u70geVd2$%&NeHQ_TzK?)g-%cP;KTcq@eugs5(+?5w z>w^Sp^kW2Sb$p)aT0oypAfm4%uwAbu(64t8*rWFm*r)F%a9AHC@T$I*6=drmkZY@A z<=G|?7-uUXFv-R|eLao4s`v5V_|5lC)O2@gyk*w9Rjp-ZcRRKDQD~6xU!|?lHlngC zNzqVjf9J>M>)i@f_qqc}(n3x?6`{UvxpAYokWg+1k}gjOivtw2{lg)$b@3_6{krgt1@Wc9kcfgxk!?~JV9^h<8e^zd6v5C4SX96@0G)N9D#3B| zBQ;w~B&JmD0ylb9N}W4bnEddygGv)Fp=H5-e3Ylo$_OiKWFDw?q^5IS9f(E(opH1! zrQCVZX|Re0SE|g!yEz_dPm?X(56;=srk`fJn!!U)QkXtFyrg~XQ zbS*R(BDLv;iVJ2wox;*0MVGo4h1$`scw3rgyXs*&3;WqLXeVBB{~ zZAy)GGF&>omDhLpyAeAoRg2wBAk@h*&bGB!%X+f>3!#T-2u>29HTuBot6nJ*=d zZhO;|sptfz$hyWBjiW92FSy3m8mTdV-b+d89Jhx zHk1FGtwFPbb2NGh|8kK%;3^(PU)G7Tz*7n>`dZFN9g1R>7Zq?Dr+DJl{~imj#;DUviXHquJ0X%!Lmve_nUE_dN>+onaN zND&bc-|%BW@JC3|QV{V^_*Kw9q3-6AnwC3%f&1ZZW}lsBW?$wxLCDeN7$INnb5lbb zTf;<)jf&EE?QVH&>}`Zhxq8PNExSv<<>>92a+&u@25OD2RgK!NoFXi8ea#cBPDn-1 zaoe=`x+%D0|Gd}uLRnOTd7BG`rV1vlnH4tcnC181uD+`r>C7zHR%Z@VYI&hn*&Gqq zD2o@T#}}FFNy6X+YC+L)tdi*xLRn0@8OQd7r@W~2vJR~&`>?bxHAP;Qx`!zznAYd1 z*Td2(<{8J4%t5>Elc*}{2Di)3s>&XbGjsC`oubk<4@ulwn9X-$(v$|Lz(v#LrmglF zR6*2F9fG2~l?B1AFj#W`1CAEg8hLxk3CWzXOwVIs)be(7+zN%~S%rJTT?^*M%dXj| zavDZHw`>VM7j|curox_;^ugq@8D`0SiKQ_1g3E0o-(qlhBxjl8`gAZDU1%1otj>bb zNDB+&&92td4IUgBYaNKXt6&`Ei_Zu*?4qMtZdy(yBy%)l@kYrl2U8!)Ij-uYpx1Y3 zj@ip07|Qk(t`kyHwZ|25FLKao&kAjuN$iLdAsS8YDNZj<{uLOc$$e_k@B4e=FhG;t z>M$r{WmEd{V9?}#eHijlUm%7%k-i>`_?X}RCu#CvwI z{XI@6)Q(L|45ThI(UwWoVnwrLu??cMl<55$p^1Ge+C~Oj$N@F&#uiVcz-m4c>pP}pAgbv9V5((SSvSn+UfM zZqL9SgnI}jgt7rk2vvmp2$lghLIc4?5C|&>%_giPJV1DeurUdb5H=AWBRnzSDZ(=Y zo+G?Kc!luBfDwe_2xkyR4H!o_k1&jI4B;fgsiyu>gYCG!qrO@^uJ5)CJ+5n-b_Dyh O7v!a;mC0+_(0>4cl2Um9 literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Lib/D11/tb2kdsgn_d11.bpl b/internal/2.2.2/1/Lib/D11/tb2kdsgn_d11.bpl new file mode 100644 index 0000000000000000000000000000000000000000..c1d4483911ed52603097111a141dd409c6bd6f50 GIT binary patch literal 82944 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 CgWD1S literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Lib/D11/tb2kdsgn_d11.dcp b/internal/2.2.2/1/Lib/D11/tb2kdsgn_d11.dcp new file mode 100644 index 0000000000000000000000000000000000000000..39ff18b1393dd8f9eda0494837056781ef3c8914 GIT binary patch literal 51084 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 L$nte;L-79qMKwxq literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Lib/D11/tb2kdsgn_d11.dcu b/internal/2.2.2/1/Lib/D11/tb2kdsgn_d11.dcu new file mode 100644 index 0000000000000000000000000000000000000000..8c312521069b1dffff7a5e00e8cf643c9b0343c2 GIT binary patch literal 4302 zcmeHJeP|p-6yM)Ay?eP{N)p<#mMZn5a*769n-Zi*J}zk@x%TW`(;%&OvpczLZ*TY5 zo1~W_5~PTzNd2IQNU%~xL_|cSh={a)AyPy{iWHF|(u#9Jn5{`sF^p1r z$O~-WJ8VlY3@#q1e&mQGgCl__722D(ow8jLqoM7dIJfh7Y4zomJ%N9Dje6Dge7SUF zqrBG z{)ts-uNS!CAq`5b@E+;;I+%Gkfs@7A>PRpdYEB;T?OILfShL}VJYNg5i@lnRX5)F& zj>xV~d5(^GZrYb#E(|o(eU1!9nSDImIxKwFOHS&z=OZs*Pif%9kZ;REe?0Hxo_cXg zR758 z?3y?j@71IdK4)ugP-_F#`?h^NUy!rDP}`cQN&R-MA!NJ^lohpdlbBYp3O*e*`@IQV zsnsjK8)~Q%&A{Y%Zd4@*&B4Wxqq;9Y5)Zer*j_1EC<;0!j}44A-@x@?j8hO-f%sEe zc?0{mqQjGn_XVC#dxbhqJZnX&%94#Tnr?W;G7hrVica7J6pNZn$+-CK)cbyUm< zT}D~8*KP zW1Z8jYcbY4+msZ?J2Go}cL=%I7OA?=Ny-;K63C}dVlJbw19tq!=te%NAI+z_JDY zCkvcZd`~yt7nV*hs)fp+X{7g?g#D(47DB?pM#2pl+(fw9LWXcFVFTeh3%3!vEZjlZ zLfA^!M(82jWnnwvZbC1ie;8T95Mh{bkA+dfPC}lr+d`2rMi?jDN7zTWzm5Zh34%+Q z?7V(6?c#!Z=26KdmEgT^{(t}3{j}e|AJV`i8c$)Am;TYjL z!t;a|2=jy&2`>>&5MIgPRl;jMc%AS@58foaW#MhYI~klLylde-!uu9JAeK)68o(ZWxJp9#MZekJ@y`28&Y zApDuZUxZ5pn1q!)T6whb=-{!I$2B~zW!qoR-%UJj;c>f}!8(FP=p?KePTQu*{z;|9 e!q-ft(%#}Uol2XgxtiL{qsCLFIc_{-81_GX8YI8~ literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Packages/TB2k_D11Group.groupproj b/internal/2.2.2/1/Packages/TB2k_D11Group.groupproj new file mode 100644 index 0000000..ae9329a --- /dev/null +++ b/internal/2.2.2/1/Packages/TB2k_D11Group.groupproj @@ -0,0 +1,44 @@ + + + {b13d8c1b-fcdb-4ac9-8e43-5525fb4724c8} + + + + + + + + Default.Personality + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/internal/2.2.2/1/Packages/tb2k_cb4.bpk b/internal/2.2.2/1/Packages/tb2k_cb4.bpk new file mode 100644 index 0000000..71a7b35 --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2k_cb4.bpk @@ -0,0 +1,183 @@ +# --------------------------------------------------------------------------- +!if !$d(BCB) +BCB = $(MAKEDIR)\.. +!endif + +# --------------------------------------------------------------------------- +# IDE SECTION +# --------------------------------------------------------------------------- +# The following section of the project makefile is managed by the BCB IDE. +# It is recommended to use the IDE to change any of the values in this +# section. +# --------------------------------------------------------------------------- + +VERSION = BCB.04.04 +# --------------------------------------------------------------------------- +PROJECT = tb2k_cb4.bpl +OBJFILES = ..\Source\TB2Common.obj ..\Source\TB2Consts.obj ..\Source\TB2Dock.obj \ + ..\Source\TB2ExtItems.obj ..\Source\TB2Item.obj ..\Source\TB2Toolbar.obj \ + ..\Source\TB2Version.obj ..\Source\TB2Hook.obj ..\Source\TB2ToolWindow.obj \ + ..\Source\TB2MRU.obj ..\Source\TB2Anim.obj ..\Source\TB2MDI.obj \ + ..\Source\TB2Acc.obj tb2k_cb4.obj +RESFILES = +RESDEPEN = $(RESFILES) +LIBFILES = +LIBRARIES = +SPARELIBS = Vcl40.lib +PACKAGES = vcl40.bpi +DEFFILE = +# --------------------------------------------------------------------------- +PATHCPP = .; +PATHASM = .; +PATHPAS = .;..\Source +PATHRC = .; +DEBUGLIBPATH = $(BCB)\lib\debug +RELEASELIBPATH = $(BCB)\lib\release +USERDEFINES = +SYSDEFINES = _RTLDLL;NO_STRICT;USEPACKAGES +# --------------------------------------------------------------------------- +CFLAG1 = -I..\Source;$(BCB)\include;$(BCB)\include\vcl -Od -Hc -H=$(BCB)\lib\vcl40.csm \ + -w -Ve -r- -a8 -k -y -v -vi- -c -b- -w-par -w-inl -Vx -tWM \ + -D$(SYSDEFINES);$(USERDEFINES) +PFLAGS = -U..\Source;$(BCB)\lib\obj;$(BCB)\lib;$(RELEASELIBPATH) \ + -I..\Source;$(BCB)\include;$(BCB)\include\vcl -$YD -$J- -v -JPHNE -M +RFLAGS = -i..\Source;$(BCB)\include;$(BCB)\include\vcl +AFLAGS = /i..\Source /i$(BCB)\include /i$(BCB)\include\vcl /mx /w2 /zd +LFLAGS = -L..\Source;$(BCB)\lib\obj;$(BCB)\lib;$(RELEASELIBPATH) \ + -D"Toolbar2000 Components (Jordan Russell)" -aa -Tpp -Gpr -x -Gn -Gl -Gi -v +# --------------------------------------------------------------------------- +ALLOBJ = c0pkg32.obj Memmgr.Lib $(PACKAGES) sysinit.obj $(OBJFILES) +ALLRES = $(RESFILES) +ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cp32mti.lib +# --------------------------------------------------------------------------- +!ifdef IDEOPTIONS + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +InMemoryExe=0 +ShowInfoMsgs=0 + +!endif + +# --------------------------------------------------------------------------- +# MAKE SECTION +# --------------------------------------------------------------------------- +# This section of the project file is not used by the BCB IDE. It is for +# the benefit of building from the command-line using the MAKE utility. +# --------------------------------------------------------------------------- + +.autodepend +# --------------------------------------------------------------------------- +!if !$d(BCC32) +BCC32 = bcc32 +!endif + +!if !$d(CPP32) +CPP32 = cpp32 +!endif + +!if !$d(DCC32) +DCC32 = dcc32 +!endif + +!if !$d(TASM32) +TASM32 = tasm32 +!endif + +!if !$d(LINKER) +LINKER = ilink32 +!endif + +!if !$d(BRCC32) +BRCC32 = brcc32 +!endif + +# --------------------------------------------------------------------------- +!if $d(PATHCPP) +.PATH.CPP = $(PATHCPP) +.PATH.C = $(PATHCPP) +!endif + +!if $d(PATHPAS) +.PATH.PAS = $(PATHPAS) +!endif + +!if $d(PATHASM) +.PATH.ASM = $(PATHASM) +!endif + +!if $d(PATHRC) +.PATH.RC = $(PATHRC) +!endif +# --------------------------------------------------------------------------- +$(PROJECT): $(OBJFILES) $(RESDEPEN) $(DEFFILE) + $(BCB)\BIN\$(LINKER) @&&! + $(LFLAGS) + + $(ALLOBJ), + + $(PROJECT),, + + $(ALLLIB), + + $(DEFFILE), + + $(ALLRES) +! +# --------------------------------------------------------------------------- +.pas.hpp: + $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< } + +.pas.obj: + $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< } + +.cpp.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) -n$(@D) {$< } + +.c.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) -n$(@D) {$< } + +.c.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) -n. {$< } + +.cpp.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) -n. {$< } + +.asm.obj: + $(BCB)\BIN\$(TASM32) $(AFLAGS) $<, $@ + +.rc.res: + $(BCB)\BIN\$(BRCC32) $(RFLAGS) -fo$@ $< +# --------------------------------------------------------------------------- + diff --git a/internal/2.2.2/1/Packages/tb2k_cb4.cpp b/internal/2.2.2/1/Packages/tb2k_cb4.cpp new file mode 100644 index 0000000..65d5caa --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2k_cb4.cpp @@ -0,0 +1,29 @@ +// $jrsoftware: tb2k/Packages/tb2k_cb4.cpp,v 1.9 2003/07/04 22:53:21 jr Exp $ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop +USEPACKAGE("vcl40.bpi"); +USEUNIT("..\Source\TB2Common.pas"); +USEUNIT("..\Source\TB2Consts.pas"); +USEUNIT("..\Source\TB2Dock.pas"); +USEUNIT("..\Source\TB2ExtItems.pas"); +USEUNIT("..\Source\TB2Item.pas"); +USEUNIT("..\Source\TB2Toolbar.pas"); +USEUNIT("..\Source\TB2Version.pas"); +USEUNIT("..\Source\TB2Hook.pas"); +USEUNIT("..\Source\TB2ToolWindow.pas"); +USEUNIT("..\Source\TB2MRU.pas"); +USEUNIT("..\Source\TB2Anim.pas"); +USEUNIT("..\Source\TB2MDI.pas"); +USEUNIT("..\Source\TB2Acc.pas"); +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- +// Package source. +//--------------------------------------------------------------------------- +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- + diff --git a/internal/2.2.2/1/Packages/tb2k_cb5.bpk b/internal/2.2.2/1/Packages/tb2k_cb5.bpk new file mode 100644 index 0000000..21efbe7 --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2k_cb5.bpk @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + + \ No newline at end of file diff --git a/internal/2.2.2/1/Packages/tb2k_cb5.cpp b/internal/2.2.2/1/Packages/tb2k_cb5.cpp new file mode 100644 index 0000000..33d2c2b --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2k_cb5.cpp @@ -0,0 +1,29 @@ +// $jrsoftware: tb2k/Packages/tb2k_cb5.cpp,v 1.9 2003/07/04 22:53:21 jr Exp $ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop +USEPACKAGE("vcl50.bpi"); +USEUNIT("..\Source\TB2Common.pas"); +USEUNIT("..\Source\TB2Consts.pas"); +USEUNIT("..\Source\TB2Dock.pas"); +USEUNIT("..\Source\TB2ExtItems.pas"); +USEUNIT("..\Source\TB2Item.pas"); +USEUNIT("..\Source\TB2Toolbar.pas"); +USEUNIT("..\Source\TB2Version.pas"); +USEUNIT("..\Source\TB2Hook.pas"); +USEUNIT("..\Source\TB2ToolWindow.pas"); +USEUNIT("..\Source\TB2MRU.pas"); +USEUNIT("..\Source\TB2Anim.pas"); +USEUNIT("..\Source\TB2MDI.pas"); +USEUNIT("..\Source\TB2Acc.pas"); +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- +// Package source. +//--------------------------------------------------------------------------- +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- + diff --git a/internal/2.2.2/1/Packages/tb2k_cb6.bpk b/internal/2.2.2/1/Packages/tb2k_cb6.bpk new file mode 100644 index 0000000..580309c --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2k_cb6.bpk @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + +[Linker] +LibPrefix= +LibSuffix= +LibVersion= + + \ No newline at end of file diff --git a/internal/2.2.2/1/Packages/tb2k_cb6.cpp b/internal/2.2.2/1/Packages/tb2k_cb6.cpp new file mode 100644 index 0000000..79fe10f --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2k_cb6.cpp @@ -0,0 +1,14 @@ +// $jrsoftware: tb2k/Packages/tb2k_cb6.cpp,v 1.2 2002/11/14 18:07:19 jr Exp $ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop +#pragma package(smart_init) +//--------------------------------------------------------------------------- +// Package source. +//--------------------------------------------------------------------------- +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- + diff --git a/internal/2.2.2/1/Packages/tb2k_d10.bdsproj b/internal/2.2.2/1/Packages/tb2k_d10.bdsproj new file mode 100644 index 0000000..5915d11 --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2k_d10.bdsproj @@ -0,0 +1,175 @@ + + + + + + + + + + + + tb2k_d10.dpk + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 44 + False + 1 + False + False + False + 16384 + 1048576 + 1069547520 + Toolbar2000 Components (Jordan Russell) + + + + ..\Lib\D10 + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/internal/2.2.2/1/Packages/tb2k_d10.dpk b/internal/2.2.2/1/Packages/tb2k_d10.dpk new file mode 100644 index 0000000..450237d --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2k_d10.dpk @@ -0,0 +1,48 @@ +package tb2k_d10; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3FC00000} +{$DESCRIPTION 'Toolbar2000 Components (Jordan Russell)'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + vcl; + +contains + TB2Version in '..\Source\TB2Version.pas', + TB2Toolbar in '..\Source\TB2Toolbar.pas', + TB2Consts in '..\Source\TB2Consts.pas', + TB2Dock in '..\Source\TB2Dock.pas', + TB2ExtItems in '..\Source\TB2ExtItems.pas', + TB2Item in '..\Source\TB2Item.pas', + TB2Common in '..\Source\TB2Common.pas', + TB2Hook in '..\Source\TB2Hook.pas', + TB2ToolWindow in '..\Source\TB2ToolWindow.pas', + TB2MRU in '..\Source\TB2MRU.pas', + TB2Anim in '..\Source\TB2Anim.pas', + TB2MDI in '..\Source\TB2MDI.pas', + TB2Acc in '..\Source\TB2Acc.pas'; + +end. + diff --git a/internal/2.2.2/1/Packages/tb2k_d10.res b/internal/2.2.2/1/Packages/tb2k_d10.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Packages/tb2k_d11.dpk b/internal/2.2.2/1/Packages/tb2k_d11.dpk new file mode 100644 index 0000000..61686e3 --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2k_d11.dpk @@ -0,0 +1,49 @@ +package tb2k_d11; + +{$R *.res} +{$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 Components (Jordan Russell)'} +{$RUNONLY} +{$IMPLICITBUILD OFF} +{$DEFINE RELEASE} + +requires + rtl, + vcl; + +contains + TB2Version in '..\Source\TB2Version.pas', + TB2Toolbar in '..\Source\TB2Toolbar.pas', + TB2Consts in '..\Source\TB2Consts.pas', + TB2Dock in '..\Source\TB2Dock.pas', + TB2ExtItems in '..\Source\TB2ExtItems.pas', + TB2Item in '..\Source\TB2Item.pas', + TB2Common in '..\Source\TB2Common.pas', + TB2Hook in '..\Source\TB2Hook.pas', + TB2ToolWindow in '..\Source\TB2ToolWindow.pas', + TB2MRU in '..\Source\TB2MRU.pas', + TB2Anim in '..\Source\TB2Anim.pas', + TB2MDI in '..\Source\TB2MDI.pas', + TB2Acc in '..\Source\TB2Acc.pas'; + +end. diff --git a/internal/2.2.2/1/Packages/tb2k_d11.dproj b/internal/2.2.2/1/Packages/tb2k_d11.dproj new file mode 100644 index 0000000..203c448 --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2k_d11.dproj @@ -0,0 +1,545 @@ + + + + {42085cda-8f18-4859-a681-a3109ff5e295} + tb2k_d11.dpk + Release + AnyCPU + DCC32 + ..\Lib\D11\tb2k_d11.bpl + + + 7.0 + False + False + 0 + RELEASE + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + + + 7.0 + DEBUG + All + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + + + Delphi.Personality + Package + +FalseTrueFalseFalseFalseTrueToolbar2000 Components (Jordan Russell)TrueFalse1000FalseFalseFalseFalseFalse103312521.0.0.01.0.0.0tb2k_d11.dpk + + + + + MainSource + + + + + + + + + + + + + + + + + + + diff --git a/internal/2.2.2/1/Packages/tb2k_d11.res b/internal/2.2.2/1/Packages/tb2k_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.2.2/1/Packages/tb2k_d12.dpk b/internal/2.2.2/1/Packages/tb2k_d12.dpk new file mode 100644 index 0000000..41f57e6 --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2k_d12.dpk @@ -0,0 +1,48 @@ +package tb2k_d12; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3FC00000} +{$DESCRIPTION 'Toolbar2000 Components (Jordan Russell)'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + rtl, + vcl; + +contains + TB2Version in '..\Source\TB2Version.pas', + TB2Toolbar in '..\Source\TB2Toolbar.pas', + TB2Consts in '..\Source\TB2Consts.pas', + TB2Dock in '..\Source\TB2Dock.pas', + TB2ExtItems in '..\Source\TB2ExtItems.pas', + TB2Item in '..\Source\TB2Item.pas', + TB2Common in '..\Source\TB2Common.pas', + TB2Hook in '..\Source\TB2Hook.pas', + TB2ToolWindow in '..\Source\TB2ToolWindow.pas', + TB2MRU in '..\Source\TB2MRU.pas', + TB2Anim in '..\Source\TB2Anim.pas', + TB2MDI in '..\Source\TB2MDI.pas', + TB2Acc in '..\Source\TB2Acc.pas'; + +end. diff --git a/internal/2.2.2/1/Packages/tb2k_d12.dproj b/internal/2.2.2/1/Packages/tb2k_d12.dproj new file mode 100644 index 0000000..4fe3f4c --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2k_d12.dproj @@ -0,0 +1,130 @@ + + + {1EA50D74-2EC7-4FC2-AA38-747CD0E9BCCA} + tb2k_d12.dpk + 12.0 + Debug + DCC32 + + + true + + + true + Base + true + + + true + Base + true + + + true + false + ..\Lib\D12 + ..\Lib\D12 + ..\Lib\D12 + ..\Lib\D12 + true + All + Toolbar2000 Components (Jordan Russell) + 3FC00000 + 1 + true + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;$(DCC_UnitAlias) + x86 + tb2k_d12.bpl + false + false + true + false + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + + + + + + + + + + + + + + + + + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + + + + + Delphi.Personality.12 + Package + + + + tb2k_d12.dpk + + + False + True + False + + + 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.2.2/1/Packages/tb2k_d12.res b/internal/2.2.2/1/Packages/tb2k_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.2.2/1/Packages/tb2k_d4.dpk b/internal/2.2.2/1/Packages/tb2k_d4.dpk new file mode 100644 index 0000000..c4b03d9 --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2k_d4.dpk @@ -0,0 +1,47 @@ +package tb2k_d4; + +{$R *.RES} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3FC00000} +{$DESCRIPTION 'Toolbar2000 Components (Jordan Russell)'} +{$IMPLICITBUILD ON} + +requires + vcl40; + +contains + TB2Version in '..\Source\TB2Version.pas', + TB2Toolbar in '..\Source\TB2Toolbar.pas', + TB2Consts in '..\Source\TB2Consts.pas', + TB2Dock in '..\Source\TB2Dock.pas', + TB2ExtItems in '..\Source\TB2ExtItems.pas', + TB2Item in '..\Source\TB2Item.pas', + TB2Common in '..\Source\TB2Common.pas', + TB2Hook in '..\Source\TB2Hook.pas', + TB2ToolWindow in '..\Source\TB2ToolWindow.pas', + TB2MRU in '..\Source\TB2MRU.pas', + TB2Anim in '..\Source\TB2Anim.pas', + TB2MDI in '..\Source\TB2MDI.pas', + TB2Acc in '..\Source\TB2Acc.pas'; + +end. + diff --git a/internal/2.2.2/1/Packages/tb2k_d4.res b/internal/2.2.2/1/Packages/tb2k_d4.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Packages/tb2k_d5.dpk b/internal/2.2.2/1/Packages/tb2k_d5.dpk new file mode 100644 index 0000000..28e5be4 --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2k_d5.dpk @@ -0,0 +1,48 @@ +package tb2k_d5; + +{$R *.RES} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3FC00000} +{$DESCRIPTION 'Toolbar2000 Components (Jordan Russell)'} +{$RUNONLY} +{$IMPLICITBUILD ON} + +requires + vcl50; + +contains + TB2Version in '..\Source\TB2Version.pas', + TB2Toolbar in '..\Source\TB2Toolbar.pas', + TB2Consts in '..\Source\TB2Consts.pas', + TB2Dock in '..\Source\TB2Dock.pas', + TB2ExtItems in '..\Source\TB2ExtItems.pas', + TB2Item in '..\Source\TB2Item.pas', + TB2Common in '..\Source\TB2Common.pas', + TB2Hook in '..\Source\TB2Hook.pas', + TB2ToolWindow in '..\Source\TB2ToolWindow.pas', + TB2MRU in '..\Source\TB2MRU.pas', + TB2Anim in '..\Source\TB2Anim.pas', + TB2MDI in '..\Source\TB2MDI.pas', + TB2Acc in '..\Source\TB2Acc.pas'; + +end. + diff --git a/internal/2.2.2/1/Packages/tb2k_d5.res b/internal/2.2.2/1/Packages/tb2k_d5.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Packages/tb2k_d6.dpk b/internal/2.2.2/1/Packages/tb2k_d6.dpk new file mode 100644 index 0000000..ea37a26 --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2k_d6.dpk @@ -0,0 +1,48 @@ +package tb2k_d6; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3FC00000} +{$DESCRIPTION 'Toolbar2000 Components (Jordan Russell)'} +{$RUNONLY} +{$IMPLICITBUILD ON} + +requires + vcl; + +contains + TB2Version in '..\Source\TB2Version.pas', + TB2Toolbar in '..\Source\TB2Toolbar.pas', + TB2Consts in '..\Source\TB2Consts.pas', + TB2Dock in '..\Source\TB2Dock.pas', + TB2ExtItems in '..\Source\TB2ExtItems.pas', + TB2Item in '..\Source\TB2Item.pas', + TB2Common in '..\Source\TB2Common.pas', + TB2Hook in '..\Source\TB2Hook.pas', + TB2ToolWindow in '..\Source\TB2ToolWindow.pas', + TB2MRU in '..\Source\TB2MRU.pas', + TB2Anim in '..\Source\TB2Anim.pas', + TB2MDI in '..\Source\TB2MDI.pas', + TB2Acc in '..\Source\TB2Acc.pas'; + +end. + diff --git a/internal/2.2.2/1/Packages/tb2k_d6.res b/internal/2.2.2/1/Packages/tb2k_d6.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Packages/tb2k_d7.dpk b/internal/2.2.2/1/Packages/tb2k_d7.dpk new file mode 100644 index 0000000..bc6fb9c --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2k_d7.dpk @@ -0,0 +1,48 @@ +package tb2k_d7; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3FC00000} +{$DESCRIPTION 'Toolbar2000 Components (Jordan Russell)'} +{$RUNONLY} +{$IMPLICITBUILD ON} + +requires + vcl; + +contains + TB2Version in '..\Source\TB2Version.pas', + TB2Toolbar in '..\Source\TB2Toolbar.pas', + TB2Consts in '..\Source\TB2Consts.pas', + TB2Dock in '..\Source\TB2Dock.pas', + TB2ExtItems in '..\Source\TB2ExtItems.pas', + TB2Item in '..\Source\TB2Item.pas', + TB2Common in '..\Source\TB2Common.pas', + TB2Hook in '..\Source\TB2Hook.pas', + TB2ToolWindow in '..\Source\TB2ToolWindow.pas', + TB2MRU in '..\Source\TB2MRU.pas', + TB2Anim in '..\Source\TB2Anim.pas', + TB2MDI in '..\Source\TB2MDI.pas', + TB2Acc in '..\Source\TB2Acc.pas'; + +end. + diff --git a/internal/2.2.2/1/Packages/tb2k_d7.res b/internal/2.2.2/1/Packages/tb2k_d7.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Packages/tb2k_d9.dpk b/internal/2.2.2/1/Packages/tb2k_d9.dpk new file mode 100644 index 0000000..56949e2 --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2k_d9.dpk @@ -0,0 +1,48 @@ +package tb2k_d9; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3FC00000} +{$DESCRIPTION 'Toolbar2000 Components (Jordan Russell)'} +{$RUNONLY} +{$IMPLICITBUILD ON} + +requires + vcl; + +contains + TB2Version in '..\Source\TB2Version.pas', + TB2Toolbar in '..\Source\TB2Toolbar.pas', + TB2Consts in '..\Source\TB2Consts.pas', + TB2Dock in '..\Source\TB2Dock.pas', + TB2ExtItems in '..\Source\TB2ExtItems.pas', + TB2Item in '..\Source\TB2Item.pas', + TB2Common in '..\Source\TB2Common.pas', + TB2Hook in '..\Source\TB2Hook.pas', + TB2ToolWindow in '..\Source\TB2ToolWindow.pas', + TB2MRU in '..\Source\TB2MRU.pas', + TB2Anim in '..\Source\TB2Anim.pas', + TB2MDI in '..\Source\TB2MDI.pas', + TB2Acc in '..\Source\TB2Acc.pas'; + +end. + diff --git a/internal/2.2.2/1/Packages/tb2k_d9.res b/internal/2.2.2/1/Packages/tb2k_d9.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Packages/tb2k_dn10.bdsproj b/internal/2.2.2/1/Packages/tb2k_dn10.bdsproj new file mode 100644 index 0000000..89d1181 --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2k_dn10.bdsproj @@ -0,0 +1,197 @@ + + + + + + + + + + + + tb2k_dn10.dpk + + + 7.0 + + + 0 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + False + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + True + False + False + 4096 + 1048576 + 1061158912 + Toolbar2000 .NET Components (Jordan Russell) + + + + ..\Lib\DN10 + $(BDSPROJECTSDIR)\Bpl + $(BDSPROJECTSDIR)\Bpl + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + True + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/internal/2.2.2/1/Packages/tb2k_dn10.dpk b/internal/2.2.2/1/Packages/tb2k_dn10.dpk new file mode 100644 index 0000000..001eaf6 --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2k_dn10.dpk @@ -0,0 +1,120 @@ +package tb2k_dn10; + +{$ALIGN 0} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3F400000} +{$DESCRIPTION 'Toolbar2000 .NET Components (Jordan Russell)'} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + System.Drawing, + Borland.Delphi, + Borland.Vcl, + Borland.VclRtl; + +contains + TB2Version in '..\Source\TB2Version.pas', + TB2Toolbar in '..\Source\TB2Toolbar.pas', + TB2Consts in '..\Source\TB2Consts.pas', + TB2Dock in '..\Source\TB2Dock.pas', + TB2ExtItems in '..\Source\TB2ExtItems.pas', + TB2Item in '..\Source\TB2Item.pas', + TB2Common in '..\Source\TB2Common.pas', + TB2Hook in '..\Source\TB2Hook.pas', + TB2ToolWindow in '..\Source\TB2ToolWindow.pas', + TB2MRU in '..\Source\TB2MRU.pas', + TB2Anim in '..\Source\TB2Anim.pas', + TB2MDI in '..\Source\TB2MDI.pas', + TB2Acc in '..\Source\TB2Acc.pas', + TB2OleMarshal in '..\Source\TB2OleMarshal.pas'; + +[assembly: AssemblyDescription('')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('')] +[assembly: AssemblyProduct('')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + + +// The Delphi compiler controls the AssemblyTitleAttribute via the ExeDescription. +// You can set this in the IDE via the Project Options. +// Manually setting the AssemblyTitle attribute below will override the IDE +// setting. +// [assembly: AssemblyTitle('')] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +//[assembly: AssemblyVersion('1.0.*')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided your output +// directory is the project directory (the default). +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('')] +[assembly: AssemblyKeyName('')] + +// +// Use the attributes below to control the COM visibility of your assembly. By +// default the entire assembly is visible to COM. Setting ComVisible to false +// is the recommended default for your assembly. To then expose a class and interface +// to COM set ComVisible to true on each one. It is also recommended to add a +// Guid attribute. +// + +[assembly: ComVisible(False)] +//[assembly: Guid('')] +//[assembly: TypeLibVersion(1, 0)] + +end. diff --git a/internal/2.2.2/1/Packages/tb2k_dn11.dpk b/internal/2.2.2/1/Packages/tb2k_dn11.dpk new file mode 100644 index 0000000..836af2d --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2k_dn11.dpk @@ -0,0 +1,120 @@ +package tb2k_dn11; + +{$ALIGN 0} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3F400000} +{$DESCRIPTION 'Toolbar2000 .NET Components (Jordan Russell)'} +{$RUNONLY} +{$IMPLICITBUILD OFF} +{$DEFINE DEBUG} + +requires + Borland.Delphi, + Borland.VclRtl, + Borland.Vcl; + +contains + TB2Version in '..\Source\TB2Version.pas', + TB2Toolbar in '..\Source\TB2Toolbar.pas', + TB2Consts in '..\Source\TB2Consts.pas', + TB2Dock in '..\Source\TB2Dock.pas', + TB2ExtItems in '..\Source\TB2ExtItems.pas', + TB2Item in '..\Source\TB2Item.pas', + TB2Common in '..\Source\TB2Common.pas', + TB2Hook in '..\Source\TB2Hook.pas', + TB2ToolWindow in '..\Source\TB2ToolWindow.pas', + TB2MRU in '..\Source\TB2MRU.pas', + TB2Anim in '..\Source\TB2Anim.pas', + TB2MDI in '..\Source\TB2MDI.pas', + TB2Acc in '..\Source\TB2Acc.pas', + TB2OleMarshal in '..\Source\TB2OleMarshal.pas'; + +[assembly: AssemblyDescription('')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('')] +[assembly: AssemblyProduct('')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + + +// The Delphi compiler controls the AssemblyTitleAttribute via the ExeDescription. +// You can set this in the IDE via the Project Options. +// Manually setting the AssemblyTitle attribute below will override the IDE +// setting. +// [assembly: AssemblyTitle('')] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +//[assembly: AssemblyVersion('1.0.*')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided your output +// directory is the project directory (the default). +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('')] +[assembly: AssemblyKeyName('')] + +// +// Use the attributes below to control the COM visibility of your assembly. By +// default the entire assembly is visible to COM. Setting ComVisible to false +// is the recommended default for your assembly. To then expose a class and interface +// to COM set ComVisible to true on each one. It is also recommended to add a +// Guid attribute. +// + +[assembly: ComVisible(False)] +//[assembly: Guid('')] +//[assembly: TypeLibVersion(1, 0)] + +end. diff --git a/internal/2.2.2/1/Packages/tb2k_dn11.dproj b/internal/2.2.2/1/Packages/tb2k_dn11.dproj new file mode 100644 index 0000000..e347261 --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2k_dn11.dproj @@ -0,0 +1,82 @@ + + + {e64e9cd0-bdee-45e5-a97a-7e85f9f52092} + Debug + AnyCPU + DCCIL + tb2k_dn11.dll + tb2k_dn11.dpk + + + 7.0 + False + False + 0 + RELEASE + 3F400000 + False + ..\Lib\DN11 + ..\Lib\DN11 + ..\Lib\DN11 + + + 7.0 + True + True + DEBUG + 3F400000 + False + ..\Lib\DN11 + ..\Lib\DN11 + ..\Lib\DN11 + + + DelphiDotNet.Personality + + +FalseTrueFalseFalseFalseTrueToolbar2000 .NET Components (Jordan Russell)TrueFalse1000FalseFalseFalseFalseFalse103312521.0.0.01.0.0.0tb2k_dn11.dpk + + + + Borland.VclRtl + 11.0.5000.9245 + Borland.VclRtl.dll + Borland.VclRtl.dll + False + + + Borland.Vcl + 11.0.5000.9245 + Borland.Vcl.dll + Borland.Vcl.dll + False + + + Borland.Delphi + 11.0.5000.9245 + Borland.Delphi.dll + Borland.Delphi.dll + False + + + + + MainSource + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/internal/2.2.2/1/Packages/tb2kdsgn_cb4.bpk b/internal/2.2.2/1/Packages/tb2kdsgn_cb4.bpk new file mode 100644 index 0000000..e3fe08e --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2kdsgn_cb4.bpk @@ -0,0 +1,181 @@ +# --------------------------------------------------------------------------- +!if !$d(BCB) +BCB = $(MAKEDIR)\.. +!endif + +# --------------------------------------------------------------------------- +# IDE SECTION +# --------------------------------------------------------------------------- +# The following section of the project makefile is managed by the BCB IDE. +# It is recommended to use the IDE to change any of the values in this +# section. +# --------------------------------------------------------------------------- + +VERSION = BCB.04.04 +# --------------------------------------------------------------------------- +PROJECT = tb2kdsgn_cb4.bpl +OBJFILES = ..\Source\TB2DsgnConverter.obj ..\Source\TB2DsgnItemEditor.obj \ + ..\Source\TB2DsgnConvertOptions.obj ..\Source\TB2Reg.obj tb2kdsgn_cb4.obj +RESFILES = ..\Source\TB2Reg.dcr +RESDEPEN = $(RESFILES) ..\Source\TB2DsgnConverter.dfm ..\Source\TB2DsgnItemEditor.dfm \ + ..\Source\TB2DsgnConvertOptions.dfm +LIBFILES = +LIBRARIES = +SPARELIBS = Vcl40.lib +PACKAGES = vcl40.bpi dclstd40.bpi tb2k_cb4.bpi +DEFFILE = +# --------------------------------------------------------------------------- +PATHCPP = .; +PATHASM = .; +PATHPAS = .;..\Source +PATHRC = .; +DEBUGLIBPATH = $(BCB)\lib\debug +RELEASELIBPATH = $(BCB)\lib\release +USERDEFINES = +SYSDEFINES = _RTLDLL;NO_STRICT;USEPACKAGES +# --------------------------------------------------------------------------- +CFLAG1 = -I..\Source;$(BCB)\include;$(BCB)\include\vcl -Od -Hc -H=$(BCB)\lib\vcl40.csm \ + -w -Ve -r- -a8 -k -y -v -vi- -c -b- -w-par -w-inl -Vx -tWM \ + -D$(SYSDEFINES);$(USERDEFINES) +PFLAGS = -U..\Source;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib;$(RELEASELIBPATH) \ + -I..\Source;$(BCB)\include;$(BCB)\include\vcl -$YD -$J- -v -JPHNE -M -LUdclstd40 +RFLAGS = -i..\Source;$(BCB)\include;$(BCB)\include\vcl +AFLAGS = /i..\Source /i$(BCB)\include /i$(BCB)\include\vcl /mx /w2 /zd +LFLAGS = -L..\Source;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib;$(RELEASELIBPATH) \ + -D"Toolbar2000 Design Package (Jordan Russell)" -aa -Tpp -Gpd -x -Gn -Gl -Gi -v +# --------------------------------------------------------------------------- +ALLOBJ = c0pkg32.obj Memmgr.Lib $(PACKAGES) sysinit.obj $(OBJFILES) +ALLRES = $(RESFILES) +ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cp32mti.lib +# --------------------------------------------------------------------------- +!ifdef IDEOPTIONS + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +InMemoryExe=0 +ShowInfoMsgs=0 + +!endif + +# --------------------------------------------------------------------------- +# MAKE SECTION +# --------------------------------------------------------------------------- +# This section of the project file is not used by the BCB IDE. It is for +# the benefit of building from the command-line using the MAKE utility. +# --------------------------------------------------------------------------- + +.autodepend +# --------------------------------------------------------------------------- +!if !$d(BCC32) +BCC32 = bcc32 +!endif + +!if !$d(CPP32) +CPP32 = cpp32 +!endif + +!if !$d(DCC32) +DCC32 = dcc32 +!endif + +!if !$d(TASM32) +TASM32 = tasm32 +!endif + +!if !$d(LINKER) +LINKER = ilink32 +!endif + +!if !$d(BRCC32) +BRCC32 = brcc32 +!endif + +# --------------------------------------------------------------------------- +!if $d(PATHCPP) +.PATH.CPP = $(PATHCPP) +.PATH.C = $(PATHCPP) +!endif + +!if $d(PATHPAS) +.PATH.PAS = $(PATHPAS) +!endif + +!if $d(PATHASM) +.PATH.ASM = $(PATHASM) +!endif + +!if $d(PATHRC) +.PATH.RC = $(PATHRC) +!endif +# --------------------------------------------------------------------------- +$(PROJECT): $(OBJFILES) $(RESDEPEN) $(DEFFILE) + $(BCB)\BIN\$(LINKER) @&&! + $(LFLAGS) + + $(ALLOBJ), + + $(PROJECT),, + + $(ALLLIB), + + $(DEFFILE), + + $(ALLRES) +! +# --------------------------------------------------------------------------- +.pas.hpp: + $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< } + +.pas.obj: + $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< } + +.cpp.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) -n$(@D) {$< } + +.c.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) -n$(@D) {$< } + +.c.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) -n. {$< } + +.cpp.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) -n. {$< } + +.asm.obj: + $(BCB)\BIN\$(TASM32) $(AFLAGS) $<, $@ + +.rc.res: + $(BCB)\BIN\$(BRCC32) $(RFLAGS) -fo$@ $< +# --------------------------------------------------------------------------- + diff --git a/internal/2.2.2/1/Packages/tb2kdsgn_cb4.cpp b/internal/2.2.2/1/Packages/tb2kdsgn_cb4.cpp new file mode 100644 index 0000000..08b9d21 --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2kdsgn_cb4.cpp @@ -0,0 +1,23 @@ +// $jrsoftware: tb2k/Packages/tb2kdsgn_cb4.cpp,v 1.4 2002/11/14 18:15:59 jr Exp $ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop +USEPACKAGE("vcl40.bpi"); +USEFORMNS("..\Source\TB2DsgnConverter.pas", Tb2dsgnconverter, TBConverterForm); +USEFORMNS("..\Source\TB2DsgnItemEditor.pas", Tb2dsgnitemeditor, TBItemEditForm); +USEFORMNS("..\Source\TB2DsgnConvertOptions.pas", Tb2dsgnconvertoptions, TBConvertOptionsForm); +USEUNIT("..\Source\TB2Reg.pas"); +USERES("..\Source\TB2Reg.dcr"); +USEPACKAGE("dclstd40.bpi"); +USEPACKAGE("tb2k_cb4.bpi"); +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- +// Package source. +//--------------------------------------------------------------------------- +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- + diff --git a/internal/2.2.2/1/Packages/tb2kdsgn_cb5.bpk b/internal/2.2.2/1/Packages/tb2kdsgn_cb5.bpk new file mode 100644 index 0000000..2950fbf --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2kdsgn_cb5.bpk @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + + \ No newline at end of file diff --git a/internal/2.2.2/1/Packages/tb2kdsgn_cb5.cpp b/internal/2.2.2/1/Packages/tb2kdsgn_cb5.cpp new file mode 100644 index 0000000..ba1bbd8 --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2kdsgn_cb5.cpp @@ -0,0 +1,23 @@ +// $jrsoftware: tb2k/Packages/tb2kdsgn_cb5.cpp,v 1.4 2002/11/14 18:15:59 jr Exp $ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop +USEPACKAGE("vcl50.bpi"); +USEFORMNS("..\Source\TB2DsgnConverter.pas", Tb2dsgnconverter, TBConverterForm); +USEFORMNS("..\Source\TB2DsgnItemEditor.pas", Tb2dsgnitemeditor, TBItemEditForm); +USEFORMNS("..\Source\TB2DsgnConvertOptions.pas", Tb2dsgnconvertoptions, TBConvertOptionsForm); +USEUNIT("..\Source\TB2Reg.pas"); +USERES("..\Source\TB2Reg.dcr"); +USEPACKAGE("dclstd50.bpi"); +USEPACKAGE("tb2k_cb5.bpi"); +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- +// Package source. +//--------------------------------------------------------------------------- +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- + diff --git a/internal/2.2.2/1/Packages/tb2kdsgn_cb6.bpk b/internal/2.2.2/1/Packages/tb2kdsgn_cb6.bpk new file mode 100644 index 0000000..1223631 --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2kdsgn_cb6.bpk @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + +[Linker] +LibPrefix= +LibSuffix= +LibVersion= + + \ No newline at end of file diff --git a/internal/2.2.2/1/Packages/tb2kdsgn_cb6.cpp b/internal/2.2.2/1/Packages/tb2kdsgn_cb6.cpp new file mode 100644 index 0000000..6fabfa6 --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2kdsgn_cb6.cpp @@ -0,0 +1,18 @@ +// $jrsoftware: tb2k/Packages/tb2kdsgn_cb6.cpp,v 1.2 2002/11/14 18:07:19 jr Exp $ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop +USEFORMNS("..\Source\TB2DsgnConverter.pas", Tb2dsgnconverter, TBConverterForm); +USEFORMNS("..\Source\TB2DsgnItemEditor.pas", Tb2dsgnitemeditor, TBItemEditForm); +USEFORMNS("..\Source\TB2DsgnConvertOptions.pas", Tb2dsgnconvertoptions, TBConvertOptionsForm); +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- +// Package source. +//--------------------------------------------------------------------------- +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- + diff --git a/internal/2.2.2/1/Packages/tb2kdsgn_d10.bdsproj b/internal/2.2.2/1/Packages/tb2kdsgn_d10.bdsproj new file mode 100644 index 0000000..e208fd9 --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2kdsgn_d10.bdsproj @@ -0,0 +1,175 @@ + + + + + + + + + + + + tb2kdsgn_d10.dpk + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 44 + False + 1 + False + False + False + 16384 + 1048576 + 1065353216 + Toolbar2000 Design Package (Jordan Russell) + + + + + + + + + + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/internal/2.2.2/1/Packages/tb2kdsgn_d10.dpk b/internal/2.2.2/1/Packages/tb2kdsgn_d10.dpk new file mode 100644 index 0000000..6286adf --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2kdsgn_d10.dpk @@ -0,0 +1,42 @@ +package tb2kdsgn_d10; + +{$R *.res} +{$R '..\Source\TB2Reg.dcr'} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3F800000} +{$DESCRIPTION 'Toolbar2000 Design Package (Jordan Russell)'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + vcl, + dclstd, + tb2k_d10; + +contains + TB2Reg in '..\Source\TB2Reg.pas', + TB2DsgnItemEditor in '..\Source\TB2DsgnItemEditor.pas' {TBItemEditForm}, + TB2DsgnConverter in '..\Source\TB2DsgnConverter.pas' {TBConverterForm}, + TB2DsgnConvertOptions in '..\Source\TB2DsgnConvertOptions.pas' {TBConvertOptionsForm}; + +end. + diff --git a/internal/2.2.2/1/Packages/tb2kdsgn_d10.res b/internal/2.2.2/1/Packages/tb2kdsgn_d10.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Packages/tb2kdsgn_d11.bpi b/internal/2.2.2/1/Packages/tb2kdsgn_d11.bpi new file mode 100644 index 0000000000000000000000000000000000000000..ffa6f2ec25d530201e1c5c7398c0828d18542399 GIT binary patch literal 10020 zcmdTK%W@k-y}SWoOE>nSxih z^TOWdu3T}XDQu7JpJjXObb(vWGxOrA;Z+Um;(B^!;uhN^$y#2zmIrI%qhK1AsN?boemyVT z1}^9<=s>!H&eHn6Yk>IG2sUpSp2wr(rCo1Ln(gCD-1Ce&eNUvmH|?6(iJ;+l(KaOz z`+ykR^(1e=D#zHLBkc2Rxss`YA*#M1gl~wf2_V3-`O-kcq_(!)?GvbRJQ`@-V*B3` zj%x`x=1u!h49^I|cL^BE<=JirLA_-cz&&Q0QVKh7nbjA_oRgjgIYF>&d8P84SEYj4 zB9Y2uQ!OVoJ*5^~Nl<|cybzRkb0D^R(Hz_yME^kY2pfSw0uO}GA7kwA(Xo*cc5t0( zTYzwk#&C>|vR`m7`s|%zC%QeHyKh5ip6d-w?gmkL9-Y5is4(dSAqvjqRNNYb289uv zE&7oX4`_zTXSn4j1lH zXy%2pJ49%15P=090+#Uj5ELNeLBOtSP(V5INJW`f-1H3P?rfRPJ+Y5Yfjp=zLXhWU5t}q>+B=F?4wRf7G3_=@~H&-*IcqUh zq+z!IVXzNw(GWIlQ0W8muXEP}Z-kwotY|c_27$Go&~}}oy(wUM3NaM8XVz_BSD45; zHro{hq4rM}ZMhktg5ph7U%)b?T^7Qs7|32Md3GgB`mWfhFPa_}Bq5t!m69LaQMEJI zlHu3!JWSaBe}&c86#7@f(8u8BujWbY*T_F+=HApOpZC(&N_7GROz8pwoZJ4KmJ_&fLayd*v5-WLn-6OIFJcEa# z5UbkyP#Cgm`;n|YuVL+cQx0M1r-Xk_1OJk6Ip(&3oK@e*%Y3KAhw&qWBzT}90gyle zhR_l`SfH|9(xXvoRvHl0Ly*zeR^H`?$4AR0pK80$r*^D(SnBFsX%;Eh9@M2?}t9Lc}@|UmcM6 zf??OJKJ-3WMp>2z_#J8o!cLyd1zO zfCgTkYB8GL^z9(rE|<7W$@Wt+cv5a`q*G?Inwq4)w=XN?*5|21w{Msy{VOx%sZg;7 zx)StnoRGqt4Uw+2gF>nMWaupoLx-AricT z6@6XimkNB7yK7Djk{U|trtgF;=WIFnPeDOnmto`#q)T{e!nOBALzf|XU0ve&Wl`e_ znHGp>T7xK-o@fA6nDQDr^vx30e}0LHh*Zxr{RHLX37K+|T2BhGW8H2Oj|~Nmvej3q{O8)tQ6@IvL}L0t~)T_82w3Jqt7=O6Zu7Cd4oo3WKey-(Z4E? z&a#l^rdf?nc^LNy>n#EcKX_lG9L1ssd$Lq74-KhR!)yxvWAx`zQz@icXyT`-ppA(5>iI zowGf&1RYnq-c-GK=ZV@E{@{BuxgXix7*?>IBSg_p26_z{?=35Ed_y>{5;IeoWM(iD zg{wetmk?Z1=`Lt+`=E+(RrGs>u4!4X7>EE}Q9(U6ElY+~kU#j0X-)+|MD@7rD$|+^ z5PY9`**F`6c@cQp+c4EX9t_EV-C!~nj*-w#Fh=^QV^D@sg<4wa0w4O!}cvh63(m3^=&nHHTP}1avM0(wSV{AdoX5NSFtc zZsJ8cek(j)juK~3GE>@YIZ={?r)to8Y$=lD!3EY&LZGD%$WK_Zj0BV%g)I8~JHpt1 D*O4xm literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Packages/tb2kdsgn_d11.dpk b/internal/2.2.2/1/Packages/tb2kdsgn_d11.dpk new file mode 100644 index 0000000..5765851 --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2kdsgn_d11.dpk @@ -0,0 +1,43 @@ +package tb2kdsgn_d11; + +{$R *.res} +{$R '..\Source\TB2Reg.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 Design Package (Jordan Russell)'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} +{$DEFINE RELEASE} + +requires + rtl, + vcl, + dclstd, + tb2k_d11; + +contains + TB2Reg in '..\Source\TB2Reg.pas', + TB2DsgnItemEditor in '..\Source\TB2DsgnItemEditor.pas' {TBItemEditForm}, + TB2DsgnConverter in '..\Source\TB2DsgnConverter.pas' {TBConverterForm}, + TB2DsgnConvertOptions in '..\Source\TB2DsgnConvertOptions.pas' {TBConvertOptionsForm}; + +end. diff --git a/internal/2.2.2/1/Packages/tb2kdsgn_d11.dproj b/internal/2.2.2/1/Packages/tb2kdsgn_d11.dproj new file mode 100644 index 0000000..07d76d0 --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2kdsgn_d11.dproj @@ -0,0 +1,552 @@ + + + {e51188c3-1c1e-47eb-b42e-bb80872f9ae7} + tb2kdsgn_d11.dpk + Release + AnyCPU + DCC32 + ..\Lib\D11\tb2kdsgn_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 + DEBUG + All + 3F800000 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + + + Delphi.Personality + Package + +FalseTrueFalseFalseTrueFalseToolbar2000 Design Package (Jordan Russell)TrueFalse1000FalseFalseFalseFalseFalse103312521.0.0.01.0.0.0tb2kdsgn_d11.dpk + + + + + MainSource + + +

TBConverterForm + + +
TBConvertOptionsForm
+
+ +
TBItemEditForm
+
+ + + + + + + + + + diff --git a/internal/2.2.2/1/Packages/tb2kdsgn_d11.res b/internal/2.2.2/1/Packages/tb2kdsgn_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.2.2/1/Packages/tb2kdsgn_d12.dpk b/internal/2.2.2/1/Packages/tb2kdsgn_d12.dpk new file mode 100644 index 0000000..b3ebd84 --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2kdsgn_d12.dpk @@ -0,0 +1,42 @@ +package tb2kdsgn_d12; + +{$R *.res} +{$R '..\Source\TB2Reg.dcr'} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3F800000} +{$DESCRIPTION 'Toolbar2000 Design Package (Jordan Russell)'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + rtl, + vcl, + dclstd, + tb2k_d12; + +contains + TB2Reg in '..\Source\TB2Reg.pas', + TB2DsgnItemEditor in '..\Source\TB2DsgnItemEditor.pas' {TBItemEditForm}, + TB2DsgnConverter in '..\Source\TB2DsgnConverter.pas' {TBConverterForm}, + TB2DsgnConvertOptions in '..\Source\TB2DsgnConvertOptions.pas' {TBConvertOptionsForm}; + +end. diff --git a/internal/2.2.2/1/Packages/tb2kdsgn_d12.dproj b/internal/2.2.2/1/Packages/tb2kdsgn_d12.dproj new file mode 100644 index 0000000..7bea712 --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2kdsgn_d12.dproj @@ -0,0 +1,126 @@ + + + {D9827544-06D4-4C36-9AA3-5858B2C844EA} + tb2kdsgn_d12.dpk + 12.0 + Debug + DCC32 + + + true + + + true + Base + true + + + true + Base + true + + + 3F800000 + tb2kdsgn_d12.bpl + 1 + true + x86 + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;$(DCC_UnitAlias) + Toolbar2000 Design Package (Jordan Russell) + All + false + false + true + true + false + true + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + + + + + + + +
TBItemEditForm
+
+ +
TBConverterForm
+
+ +
TBConvertOptionsForm
+
+ + + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
+ + + Delphi.Personality.12 + Package + + + + tb2kdsgn_d12.dpk + + + False + True + False + + + 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.2.2/1/Packages/tb2kdsgn_d12.res b/internal/2.2.2/1/Packages/tb2kdsgn_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.2.2/1/Packages/tb2kdsgn_d4.dpk b/internal/2.2.2/1/Packages/tb2kdsgn_d4.dpk new file mode 100644 index 0000000..b9c2f4e --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2kdsgn_d4.dpk @@ -0,0 +1,42 @@ +package tb2kdsgn_d4; + +{$R *.RES} +{$R '..\Source\TB2Reg.dcr'} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3F800000} +{$DESCRIPTION 'Toolbar2000 Design Package (Jordan Russell)'} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + vcl40, + dclstd40, + tb2k_d4; + +contains + TB2Reg in '..\Source\TB2Reg.pas', + TB2DsgnItemEditor in '..\Source\TB2DsgnItemEditor.pas' {TBItemEditForm}, + TB2DsgnConverter in '..\Source\TB2DsgnConverter.pas' {TBConverterForm}, + TB2DsgnConvertOptions in '..\Source\TB2DsgnConvertOptions.pas' {TBConvertOptionsForm}; + +end. + diff --git a/internal/2.2.2/1/Packages/tb2kdsgn_d4.res b/internal/2.2.2/1/Packages/tb2kdsgn_d4.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Packages/tb2kdsgn_d5.dpk b/internal/2.2.2/1/Packages/tb2kdsgn_d5.dpk new file mode 100644 index 0000000..bb80ebc --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2kdsgn_d5.dpk @@ -0,0 +1,42 @@ +package tb2kdsgn_d5; + +{$R *.RES} +{$R '..\Source\TB2Reg.dcr'} +{$ALIGN ON} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3F800000} +{$DESCRIPTION 'Toolbar2000 Design Package (Jordan Russell)'} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + vcl50, + dclstd50, + tb2k_d5; + +contains + TB2Reg in '..\Source\TB2Reg.pas', + TB2DsgnItemEditor in '..\Source\TB2DsgnItemEditor.pas' {TBItemEditForm}, + TB2DsgnConverter in '..\Source\TB2DsgnConverter.pas' {TBConverterForm}, + TB2DsgnConvertOptions in '..\Source\TB2DsgnConvertOptions.pas' {TBConvertOptionsForm}; + +end. + diff --git a/internal/2.2.2/1/Packages/tb2kdsgn_d5.res b/internal/2.2.2/1/Packages/tb2kdsgn_d5.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Packages/tb2kdsgn_d6.dpk b/internal/2.2.2/1/Packages/tb2kdsgn_d6.dpk new file mode 100644 index 0000000..da87e9e --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2kdsgn_d6.dpk @@ -0,0 +1,42 @@ +package tb2kdsgn_d6; + +{$R *.res} +{$R '..\Source\TB2Reg.dcr'} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3F800000} +{$DESCRIPTION 'Toolbar2000 Design Package (Jordan Russell)'} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + vcl, + dclstd, + tb2k_d6; + +contains + TB2Reg in '..\Source\TB2Reg.pas', + TB2DsgnItemEditor in '..\Source\TB2DsgnItemEditor.pas' {TBItemEditForm}, + TB2DsgnConverter in '..\Source\TB2DsgnConverter.pas' {TBConverterForm}, + TB2DsgnConvertOptions in '..\Source\TB2DsgnConvertOptions.pas' {TBConvertOptionsForm}; + +end. + diff --git a/internal/2.2.2/1/Packages/tb2kdsgn_d6.res b/internal/2.2.2/1/Packages/tb2kdsgn_d6.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Packages/tb2kdsgn_d7.dpk b/internal/2.2.2/1/Packages/tb2kdsgn_d7.dpk new file mode 100644 index 0000000..805b074 --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2kdsgn_d7.dpk @@ -0,0 +1,42 @@ +package tb2kdsgn_d7; + +{$R *.res} +{$R '..\Source\TB2Reg.dcr'} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3F800000} +{$DESCRIPTION 'Toolbar2000 Design Package (Jordan Russell)'} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + vcl, + dclstd, + tb2k_d7; + +contains + TB2Reg in '..\Source\TB2Reg.pas', + TB2DsgnItemEditor in '..\Source\TB2DsgnItemEditor.pas' {TBItemEditForm}, + TB2DsgnConverter in '..\Source\TB2DsgnConverter.pas' {TBConverterForm}, + TB2DsgnConvertOptions in '..\Source\TB2DsgnConvertOptions.pas' {TBConvertOptionsForm}; + +end. + diff --git a/internal/2.2.2/1/Packages/tb2kdsgn_d7.res b/internal/2.2.2/1/Packages/tb2kdsgn_d7.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Packages/tb2kdsgn_d9.dpk b/internal/2.2.2/1/Packages/tb2kdsgn_d9.dpk new file mode 100644 index 0000000..ca4e64a --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2kdsgn_d9.dpk @@ -0,0 +1,42 @@ +package tb2kdsgn_d9; + +{$R *.res} +{$R '..\Source\TB2Reg.dcr'} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3F800000} +{$DESCRIPTION 'Toolbar2000 Design Package (Jordan Russell)'} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + vcl, + dclstd, + tb2k_d9; + +contains + TB2Reg in '..\Source\TB2Reg.pas', + TB2DsgnItemEditor in '..\Source\TB2DsgnItemEditor.pas' {TBItemEditForm}, + TB2DsgnConverter in '..\Source\TB2DsgnConverter.pas' {TBConverterForm}, + TB2DsgnConvertOptions in '..\Source\TB2DsgnConvertOptions.pas' {TBConvertOptionsForm}; + +end. + diff --git a/internal/2.2.2/1/Packages/tb2kdsgn_d9.res b/internal/2.2.2/1/Packages/tb2kdsgn_d9.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Packages/tb2kdsgn_dn10.bdsproj b/internal/2.2.2/1/Packages/tb2kdsgn_dn10.bdsproj new file mode 100644 index 0000000..149e279 --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2kdsgn_dn10.bdsproj @@ -0,0 +1,188 @@ + + + + + + + + + + + + tb2kdsgn_dn10.dpk + + + 7.0 + + + 0 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Borland.Vcl.Windows;WinProcs=Borland.Vcl.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + Borland.Vcl.Design + False + + True + True + True + True + True + False + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + True + False + False + 4096 + 1048576 + 1056964608 + Toolbar2000 .NET Design Package (Jordan Russell) + + + + + $(BDSPROJECTSDIR)\Bpl + $(BDSPROJECTSDIR)\Bpl + + + + + True + + + + + + False + + + True + False + + + + $00000000 + + + + True + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + + + + + + + + + + + + + diff --git a/internal/2.2.2/1/Packages/tb2kdsgn_dn10.dpk b/internal/2.2.2/1/Packages/tb2kdsgn_dn10.dpk new file mode 100644 index 0000000..418a15d --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2kdsgn_dn10.dpk @@ -0,0 +1,111 @@ +package tb2kdsgn_dn10; + +{$ALIGN 0} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3F000000} +{$DESCRIPTION 'Toolbar2000 .NET Design Package (Jordan Russell)'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + System.Drawing, + Borland.Delphi, + Borland.Studio.Vcl.Design, + Borland.Vcl.Design.Standard, + tb2k_dn10; + +contains + TB2Reg in '..\Source\TB2Reg.pas', + TB2DsgnItemEditor in '..\Source\TB2DsgnItemEditor.pas', + TB2DsgnConverter in '..\Source\TB2DsgnConverter.pas', + TB2DsgnConvertOptions in '..\Source\TB2DsgnConvertOptions.pas'; + +[assembly: AssemblyDescription('')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('')] +[assembly: AssemblyProduct('')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + + +// The Delphi compiler controls the AssemblyTitleAttribute via the ExeDescription. +// You can set this in the IDE via the Project Options. +// Manually setting the AssemblyTitle attribute below will override the IDE +// setting. +// [assembly: AssemblyTitle('')] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +//[assembly: AssemblyVersion('1.0.*')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided your output +// directory is the project directory (the default). +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('')] +[assembly: AssemblyKeyName('')] + +// +// Use the attributes below to control the COM visibility of your assembly. By +// default the entire assembly is visible to COM. Setting ComVisible to false +// is the recommended default for your assembly. To then expose a class and interface +// to COM set ComVisible to true on each one. It is also recommended to add a +// Guid attribute. +// + +[assembly: ComVisible(False)] +//[assembly: Guid('')] +//[assembly: TypeLibVersion(1, 0)] + +end. diff --git a/internal/2.2.2/1/Packages/tb2kdsgn_dn11.dpk b/internal/2.2.2/1/Packages/tb2kdsgn_dn11.dpk new file mode 100644 index 0000000..b36d21b --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2kdsgn_dn11.dpk @@ -0,0 +1,112 @@ +package tb2kdsgn_dn11; + +{$ALIGN 0} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $3F000000} +{$DESCRIPTION 'Toolbar2000 .NET Design Package (Jordan Russell)'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} +{$DEFINE DEBUG} + +requires + Borland.Delphi, + Borland.Vcl, + Borland.VclRtl, + Borland.Vcl.Design.Standard, + tb2k_dn11; + +contains + TB2Reg in '..\Source\TB2Reg.pas', + TB2DsgnItemEditor in '..\Source\TB2DsgnItemEditor.pas', + TB2DsgnConverter in '..\Source\TB2DsgnConverter.pas', + TB2DsgnConvertOptions in '..\Source\TB2DsgnConvertOptions.pas'; + +[assembly: AssemblyDescription('')] +[assembly: AssemblyConfiguration('')] +[assembly: AssemblyCompany('')] +[assembly: AssemblyProduct('')] +[assembly: AssemblyCopyright('')] +[assembly: AssemblyTrademark('')] +[assembly: AssemblyCulture('')] + + +// The Delphi compiler controls the AssemblyTitleAttribute via the ExeDescription. +// You can set this in the IDE via the Project Options. +// Manually setting the AssemblyTitle attribute below will override the IDE +// setting. +// [assembly: AssemblyTitle('')] + + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +//[assembly: AssemblyVersion('1.0.*')] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided your output +// directory is the project directory (the default). +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile('')] +[assembly: AssemblyKeyName('')] + +// +// Use the attributes below to control the COM visibility of your assembly. By +// default the entire assembly is visible to COM. Setting ComVisible to false +// is the recommended default for your assembly. To then expose a class and interface +// to COM set ComVisible to true on each one. It is also recommended to add a +// Guid attribute. +// + +[assembly: ComVisible(False)] +//[assembly: Guid('')] +//[assembly: TypeLibVersion(1, 0)] + +end. diff --git a/internal/2.2.2/1/Packages/tb2kdsgn_dn11.dproj b/internal/2.2.2/1/Packages/tb2kdsgn_dn11.dproj new file mode 100644 index 0000000..621b653 --- /dev/null +++ b/internal/2.2.2/1/Packages/tb2kdsgn_dn11.dproj @@ -0,0 +1,82 @@ + + + {be3d3497-f4e5-4f7b-a5f7-0ad1f00fddb2} + Debug + AnyCPU + DCCIL + tb2kdsgn_dn11.dll + tb2kdsgn_dn11.dpk + + + 7.0 + False + False + 0 + RELEASE + 3F000000 + False + Borland.Vcl.Design + + + 7.0 + True + True + DEBUG + 3F000000 + False + Borland.Vcl.Design + + + DelphiDotNet.Personality + + +FalseTrueFalseFalseTrueFalseToolbar2000 .NET Design Package (Jordan Russell)TrueFalse1000FalseFalseFalseFalseFalse103312521.0.0.01.0.0.0tb2kdsgn_dn11.dpk + + + + Borland.VclRtl + 11.0.5000.9245 + Borland.VclRtl.dll + Borland.VclRtl.dll + False + + + Borland.Vcl + 11.0.5000.9245 + Borland.Vcl.dll + Borland.Vcl.dll + False + + + tb2k_dn11 + 0.0.0.0 + tb2k_dn11.dll + tb2k_dn11.dll + False + + + Borland.Delphi + 11.0.5000.9245 + Borland.Delphi.dll + Borland.Delphi.dll + False + + + Borland.Vcl.Design.Standard + 11.0.5000.9245 + Borland.Vcl.Design.Standard.dll + Borland.Vcl.Design.Standard.dll + False + + + + + MainSource + + + + + + + + \ No newline at end of file diff --git a/internal/2.2.2/1/README.txt b/internal/2.2.2/1/README.txt new file mode 100644 index 0000000..c8c520e --- /dev/null +++ b/internal/2.2.2/1/README.txt @@ -0,0 +1,22 @@ +=========================================================================== + Toolbar2000 README +=========================================================================== + +Thank you for downloading Toolbar2000. + +For details on installing and using Toolbar2000, please refer to the +Toolbar2000 help file - tb2k.chm. To open it, double-click it in Windows +Explorer. + +This file is in HTML Help format. If you are using an older version of +Windows that does not come with HTML Help, it can be downloaded at: + + http://msdn.microsoft.com/library/en-us/htmlhelp/html/hwMicrosoftHTMLHelpDownloads.asp + +You will also need Internet Explorer 4.0 or later (5.0 is preferred), +downloadable from: + + http://www.microsoft.com/ie/ + + +- Jordan Russell (www.jrsoftware.org) diff --git a/internal/2.2.2/1/Source/Icons/TB2DsgnEditorImages.bmp b/internal/2.2.2/1/Source/Icons/TB2DsgnEditorImages.bmp new file mode 100644 index 0000000000000000000000000000000000000000..24199798e3b5bd41156823cefafcaeea7793cb45 GIT binary patch literal 1270 zcmcgry-veG3^poi22_Q|U}WoBp{`M0fhlvPNU&yukw;-?=_B0G)$foY0+#6bK0BAB zMBNZ>d_O+>yU+IZq4>NOlP8RK&^PEU^h*4o8O~w)C5;F^X&Rp}VhL^Jcs$}D+9xq` z1;vjh4Epb~PdDxqG~CUk2tHkPJGstymvtW(rX^0^HD8OC3QX}RtYCm6$#C7j1Y!M~933Jz9IdrubnM?EU1Zb33>@4zm3iAMzqICLDOll~6N Ipg*wu0JkeX+W-In literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Source/Icons/TTBBackground.bmp b/internal/2.2.2/1/Source/Icons/TTBBackground.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ce49b5b03b3c302518475c0f190ccb1d18d9211d GIT binary patch literal 406 zcmZ`#u?@p83{!v}(XnIi=-xMcLaou8y?M($KFeE5Qf`0_p(RBLbP@l;A z%FS-#A8W3Mzf#N)R!Ur`XpzOn7#JK1I}Ub898xIh3i(7z?oIHVQm(Z&M62XEK?D!F z_r;5LXfo8T_NAv7BkIF4c&g`=j|6a$kHoXd2R+>@_lgf6Cj}Sr?hs=bd#U>QPrzd@ NUXoux&55hOkiKL%qTv7l literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Source/Icons/TTBBackground16.bmp b/internal/2.2.2/1/Source/Icons/TTBBackground16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..05dc86b0fc8391b305da7146685f2f87244997d5 GIT binary patch literal 246 zcmX|4u@S>C2qbr|eHkNjxc53Xjn3+zVJkNuGW&Kjx2KoT+8!wth zqavPjVif)X9XQpRgoqTV)LKKM52xNE1Ms4RaNV}26=r2uExW=*3I`8uhC*mpR_tE2aR1&IERoBjckN7jemTmW5h BdY=FQ literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Source/Icons/TTBEditItem.bmp b/internal/2.2.2/1/Source/Icons/TTBEditItem.bmp new file mode 100644 index 0000000000000000000000000000000000000000..08036faf1d44fd99fa020820bd9fe32fff0298a6 GIT binary patch literal 246 zcmZ?r{l)+RWk5;;hy|dSk%0v)(Eui~5kMJ`WJ3dl0+K)`!+`?_fHX+rKNvCm{|{mT qF%W`;fW%!~04NCrcki~B13^8I25~|32Ld!q9aLWj2=wE!fB*mh literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Source/Icons/TTBImageList.bmp b/internal/2.2.2/1/Source/Icons/TTBImageList.bmp new file mode 100644 index 0000000000000000000000000000000000000000..97548083824d852495d7f29db33221a1c4d28219 GIT binary patch literal 2322 zcmcJQ?N3rs9LMQRtM#V&s;z&Z_qDd%05eKq+!-jFFES+-YEoe8RjVx)IHw|9S!NGQ z%#tw8hfu&sO{c>tgtB}nAG2iBQOzk%4Y(aRR(F?)SF5w%IXm~<-~I4A_j|vGSS0Eo zE!0ke@fhewxB5QXkm4m7B%F7EdEMKiDP-Cb{onNjgRAYshwh*fTfvVLqZ3#$@j7<~pAv3u#kNqlx z-I~FAoXV(7=DbK3bm#J|*@@QcAi#wGIy=!QrE3H`G6TyF$mCZ@n6(#}bt$p>w6hJO z_~vw^UBYe8;+iCgIXD3$OLviLys{(Hf7l0^N{bG)SLQkHN(V8CO_koO5Ls^s&1jk_ zSJ0HjZ@e0-6DBmsl1wOM>h=2V-hh8|>wP-pDT8W`U5mVX!0R%IwLMtkf-~;hG}|-D zSsGUkJ#A~a7GIYMu#h=5|9QKDXJ_27PCN&}<|$dxz*V!cNk;~50f{_P7|56&gKYu zLFO9D+Xyj(r4})KB@8ci&QqBH;42kuUujIBhz@RT{;Ko&sD-50Z^^{{jgaZh60Q{_ zd{wagcVhgC;NviSO6Gd;nbnfG?<%ghnB`S6;ohIQ+DLl+kqlo2MuS+eNF_k>@^C9r zuQvk&M2pE4QP8{~lVbZc-bvPL+CsG0kZXc?AQ+8C@ZtHa27iw((4)h9s{{SIwIRcz zt8I3oYi8oD`@JPxFa4y6Xfg4AH<1ZS1>4`PUQe7YM2iJadBQmlnY-2NMvD764Rf%XqQf=XvRK$Wg@Y#HtG#v7mE15LWPuyEn&Hw-a literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Source/Icons/TTBImageList16.bmp b/internal/2.2.2/1/Source/Icons/TTBImageList16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..289b5031c1dc0fc7fe9fb0ae7a85b1eabb632b11 GIT binary patch literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H0s;3voj*M1X8oxE6>;xO%uQi1~QbquGMhJrKizB+z^a xiEKVl3oZm#53z-q_(HY?Ih1f&0ThSZ0#Q%AEogC##|nro$m)r)1z9~YYybeCl{WwY literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Source/Icons/TTBItemContainer.bmp b/internal/2.2.2/1/Source/Icons/TTBItemContainer.bmp new file mode 100644 index 0000000000000000000000000000000000000000..579433384b9fb870a058823a65491588245c199e GIT binary patch literal 406 zcmZ?royN!j24z4}1BfM{n2~`6EUo~R2Xjz}1_lNoVrXc9P(TvMWH@l(0FVYr{0Ae3 w|NlWOAO=E^5RfRR9;g5s4KuF-X!ZxF(G_1@T;Oa}aeo}*)KT971eAIY09KHx@Bjb+ literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Source/Icons/TTBItemContainer16.bmp b/internal/2.2.2/1/Source/Icons/TTBItemContainer16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..82417d0e2d56ef2395714359483322fe5883b6f4 GIT binary patch literal 246 zcmZ?r{l)+RWk5;;hy|dSk%0v)(Eucm@If$G08Rj9fQX@?0YU*uAd}(1fdfDqB=H}N t82q;dpCM)nS6Lt^JHnQFFJ%90aso*aoSZ009K5!w4=f4|sLBHtgc z2~`{Y!aTK{aH#!ro7c-=3NWDhD|8}KN~~pIHDFeV$x~XiWhY%@S6HQMWd2P#U=Hgi oD#OP}&d@xocgMn_+5NGomnZvXZ-zG`_vdBc8y9K{JFT^R0VkV!A^-pY literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Source/Icons/TTBMDIHandler16.bmp b/internal/2.2.2/1/Source/Icons/TTBMDIHandler16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..809e47846f99cff7e87026f2e3c5996ae521ef55 GIT binary patch literal 246 zcmah>F%p0v46AqE)k%DY?{N1oPRb@D&tmW!{DH}1t0|}}p-Fm8>9XEbvBPF?df8E5 z0tdau$};!`35uMn21QFD1h@uLibS*n@pJ@<4fq#Fh28LIX-$Zh08s~S=9 z3*d+uqY)4#rIf&8biLHOR7f0Y0rDH{5K!D&E5acJKQ%kk?7hx$vH3B^&eneH`KoQ_ G=eHYL$8LN8 literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Source/Icons/TTBMRUList.bmp b/internal/2.2.2/1/Source/Icons/TTBMRUList.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ccd304e6797fe852aa010cc44bd2a9a2368e1665 GIT binary patch literal 406 zcmb`AI}(5(3`Cb1XSjl;rRT8sE>vO%rJbGU;byquJJh<6nP(unCIMj-}|SWNaOIWDU@`%X8qHdZrW>1U=POhJso+GK_` SobOy`+6UwQtLbhNAK?WUMwN~L literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Source/Icons/TTBMRUList16.bmp b/internal/2.2.2/1/Source/Icons/TTBMRUList16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..48654a684f9bdf21a3fca23b5e37c713a11d0335 GIT binary patch literal 246 zcmZ?r{l)+RWk5;;hy|dSk%0v)(Eucm@If$G08Rj9fQX@?0YU*uAd}(1fdfDqB=H}N z82JQ3tLr293Ouzv2UW1)H2VE)#aFaf)L2I6(pz{$Ul9uD2t<%ZM^N%iY zj*o2^bs`?whiPxdEQA~9`O|_Ul!GPo2?9_##HRGUI2wjK3zQlosm&P2 zaio5fqY-SmzJJD2bY&dvYC_Bpr%my!a(sw!97o3CqWSCCl;kvLXDP>rOn&$*Qfe;v ulb_jO&50&o{Yb;>ci|+`=4us(=BBuTx?{tRq|Mbr&f5PUGw@HAOyCKK$)+Fx literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Source/Icons/TTBPopupMenu16.bmp b/internal/2.2.2/1/Source/Icons/TTBPopupMenu16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b3504eddc8b87b1faf9ba82b2b274862c1802dc8 GIT binary patch literal 822 zcmcJL!41MN3`LDN_5k9<2%Vs(oVc?FJFyT8kS%&(gz%J)tSBK-4`9Vs>pcJd`f^?N zmSdsLh qO+OR_1lp=wztyFn{5=C!`dx?Z5u->=o3|j{oA*{$yWZ*G8|F98$-(&m literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Source/Icons/TTBToolWindow16.bmp b/internal/2.2.2/1/Source/Icons/TTBToolWindow16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bc2712f4c87c471591b680f954cdb9296425219e GIT binary patch literal 246 zcmZ8au?>JQ3=0wx8*m19u=5VA*~(cRc!M805w_qo1*y2PT_;sKFBdsh*aVJ+4Yhf| z(4%+e#wVDdh}jK_E5#V$Hqcz8YBvzaT9EUHy+AgH+yT#2L_$EvoO6Vy)YW;YGZC@| N+bHioTV{B_eE`sLcd-Bf literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Source/Icons/TTBToolbar.bmp b/internal/2.2.2/1/Source/Icons/TTBToolbar.bmp new file mode 100644 index 0000000000000000000000000000000000000000..557096b77eb0274eb8dab804907c9179e8ae9109 GIT binary patch literal 406 zcmZ?royN!j24z4}1BfM{n2~`6EUo~R2Xjz}1_lNoVrXc9P(TvMWH@l(0FVYr{0Ae3 z|NlWOAO=E^5Rfp&0XmSt_i_Y4VgG2afGBG(|Ngzb9-;~hyMTd#y&NiD@c%!FY-GI* l<#2O=!Z0@2Vl;dIx7P#x2LwQIh{M1nG8-ZfA#ntQF#v$>tQY_Q literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Source/Icons/TTBToolbar16.bmp b/internal/2.2.2/1/Source/Icons/TTBToolbar16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..80c1d6620dca1730594c177e2bd0d9579f23bb47 GIT binary patch literal 246 zcmZ8axenm!UVH7<7LwtFEb0-|&w>~V6SalL zL+$+HdkpxD@F@_ZP&?oQCa{G@qksGog@TXY!#8vWK0;pcq4LN8EC3ro>Kq5a1@Hg@ zU=KhD5COY@-2gNJ6bV2IkOQ;;8$bb20($`}fEu6y_5pMNGe8gQ2N-|@03*NzumIcu zE5HsQZHoh9PT(NG1@Hhuz#)Ja-~;#p0YDHq3*83YF5=yw(#FYs0(S7 z4a5#8S2$x|A1I*3Y-bp0FTWKQXKsh?jIPH(d`6l6k13J*`!fLxwF6^YKN5fKu?``P z9RkvJ{!BphBR&x+)7R=pY)0d=V@2BSp9z1Y{D>_HAsL2%>u$Bhz~&QAMquK4?yf6(X(y;h<`wQz;D?<;vcr{ z{|J0O3Wx&705L!uI1Wevl7JL&0+0q|09il|K#rjRu_AC1Py&>JQ-BJf3aA060d+tF z&;$@UZHUhRI)E;q2O!Pf05AlMfU|%xa1J;Rm;i{ZDa2-gIbZ=;0#<-EU<23!c7Q$L z05}4OoD;;C0B67jK&<&P;0Cw@9)Ks{1$YBUog!_32`V4`3O$S>R*;dGL193nHbOFp z?t@c8#3SyEyWaQ-J zgu5yCQjqN>B_k(84uXLRGFaGn*w}bvL&ONGUaSqs% z@m&c`z-5%oDkoQKTV&!lcDRa%PeHktikg{)m5rT4K=81Tu*eaq6VfuWa`FnN)ipG= zw9n|AJ8yEq)Xdz%@uJfuXBXGY*RK2c`rYsk2n)X*5gBzS`tJS2q~r$=A3aXVewve; z_w0FoK}BU%bxrMyy88Bxmz`bRuX=h%M#siqPfWg z>}vzP8hAvYi?=czJhb&RhJK5?%dRTzwUL@X7fxj_O-cX8*X_sW)6+JJ!jg4b`nJ=3c>sPW!LgrJfT zqgJ%5CVWG4&GC49T22$c-1Cl{J~p-9uI9Fk1HQPSl1XNPb~{oYeR8B^s)o1GsEnSF zw^H*_XcUvPhXHL5SIeAZqJG6v-8q+y&{lz9fqO!X4Ev9jQ}s6T-+ZSkO+S-&Zu8bg zG8$Ef(>XE_kM7wvvh8@=f5=0B_AU4i0+i8r|MAH$e)In0ef&-rp2}>OqsPMxcTYJg za>rU93~Mr_DSUb&ttyO9o~irA5G9X|sIa@LV^UArGm5a2U8^^)rxMrVl6xJ*f5Wxu zJbF~oQI+@MPxD;=ukK3*5zaA*beEh1?$=PYR&+Qud z)_qU6;KLXC7igb4v|lNvKCZEOOZ`!UmF+1%#WtHcCmy09-6@JAAG=b`&)OcHRwSB; zr#|*WP~T&w#)o?tsE)pMs1+T1^vZ|wwd90kqPMm;frp$1)hgX>1;P~X!i3{j=vdjN zwP@r_%CU@S%O)8`n%q4(eWypyvTT>83l`(i^8Z4(&_r zM^SmI9bGbT9Hu=pzoM_hz980qV@o=bsM;i$PO4~6%|g66Rm=QxYrvdsVw7eOOQOdk ziyMq#%=(h+mbU^~h7PfXHV^de5w5uuB5~&Ot_X9Y+~W2MvDO!ga`H@(%y*Xi!(3;Y z+}8GSbHs9R(wvS<;<=Qgylzph+z{M!SuIOv>=!n2m6!j8VnClfSpvXZxmRB!aR zd#=2@6qeVeH6*n>Pd~D?zrp@h5wo7LXZt+`1-0;?UcILZ3f=m)4w=4!sp-n~GtJK; zrK}mNqL?@W?8MYs?G4gc>#Or*WL=GVyY1|XJm~JXV_0n z=$B%;n=ZEain5hadCrm65MQ)&E-5y{PK@2wSKZ(#cq!enVZ0L_VLGfk-nZ*@|vUPv%IX!N;)r1x?ox z)8$f+ef8zeESL-xdk)-m=(k1D^EjG#Hb!+VxiING&F+`Cdo3lV;U|g_N8@`8!)O=( zleyK{9qY|ooX*jjx`j8A^75{-k<>-6MyfPY=-0P;6Q5fPWG|PQ&ooF$6?pL8!_e{d z+s3CDr!gcQ6L$6==(7**du4G49o0){+y3k46zsA7^@u zWsSppRlp#~%Pa){VBRx%SC5YgRzqBkc?^|ob@*)yuOyB-FZuSh$w~TcZG1ZjoJOZeO0;pHv_@FmY> zL|a?z_p9uon9gD&o?q_vY_uN8F*O&RNU@+Opb;;ORd$m}j3cr;9lqF)%p!gG-^zqT8CB#UMrdrUo_FaGu*ojj^zn zOBFTy>+r9z9L^KE*h0&ex`0NpbX%fP=agEu!unJVJgxT{_{d4}PF{_;e^+ZFYVxt6T-HYsC-Vm7Dq$*N`HMx!C6%d?8!=9^p>PwlK6=?i6Z zbR_!NxN&<2K6#jofx|BQ_}i+|qxd7&GLZJAETlydHIx*EA+SB>_%r6=4bF3r!2&3;AC!XJrR zr6(6ZpRgETw%(QRmHx5B((-&{FXzSH!luq5rBcSwybEP}C-)5-O>UB`)eVRE(b2c> z%(6@|wA8VAu%7!=+9;DeZDP<(rM_bR*oUhVMp79V;a4IwGg8N#=QKuI0_b-;c~JBc zsTlTG+$uBa7`w_4c!$}zk^B5HhO&wk!Hv>Q6Z$?c+v%RE zp(SO*i`&q2PMq7Y?Duw{+xDmU|J44FxtKo_kogB>DhD}_UpxPC5z=bG`9^}skI^6g z`$y(Ku7Wm|&-xF2T0!=Q)x*5k4h%dHN7l!DZTW9O+R4xJU%Y>T{_S-)U#mX}^ds#Z z30DAQ-N-eFuLC}SFW?8<0Q`XfAP@)wf`OYr2!P0iLL3H!1Gj+)AQFfI?f}uiUEm%N z1H=MxKs@jRkO15V5&`6R$q+vP9s-Ym$3O~@3Zwz)Kn9QrJOQ!*MD8iXIY2Iu2Rs9w z1NlG!PzV$O#Xt#A3LtXj5LW<|Kow98)Bv@>3!o0D2O5Azpb0?aS|Dx(+JJVT19%B^ z0$o5i@Ctw~9@Pu<0sX)LFbE*W7>0NR7zM_Fao{yD0ZamKfGJ=am;q)1L~b791z-_a z0^S14z&l_CSOwk#YrqEpk=cNF6ZnYyKk#Xy76ax%zpsD!_X~UeGxJ|7Lq1-Fq9W;= zf{Uw(&cl11+#2pYFwdONjmTSmkspDfzG3B}l9KvOB)tms0*y`84 zG6bhM9|fO#E=`czEv&k1BRa{-IoeW9kH1!1alcZ!V?J#GyF$Uh?cQUuM_45OrlAt! z`-bU`tcquO)ktkUfqr)3>|AMSU0ut2hrZXgjPHlm>Px#aKipU^?Gm4wWM$1kqsm-G zJT>3`o;!Gi&=#Q?qE28!oBRgWpMAgn{o7psJ{u|ZqvSUiI&yv8zW9mHfiQC~M<$MJ zN5bT-4y;gHBJYsy$CDTqmR-GcK2}?rv8F8dRqqOZc;ScNm`%z(5&S`h?##Xw#=V41 zIAbj#q9PBbJ;{A?6m5z6(=KJd=xRUZ@Q7>7_w*jl*`u91NP948Ztr>+Q&JQ#s(Q## zu!IaNJS{Ehwcd^-qHL1q7%@hUVPX?`tOC{NSS1BsA6Ygp&#*PEAEPMtd#ATgg6Y>%>?0V#zZWOoHkh zcrJca7vMhQE%90=<@j;G(nj5|L)g3Vr&j5xo<;MRPzvcp#E6}jseUat=EZ#xzrm4& z=?a}g5%KXC&`FF)IpIHE`9>u(dwuE_ukNpk(VoU+58$*jorFl-*Ctpo z!<73?SyAW1!#rC1Uai>?6sG28bquLJ_s*$~scP$)j-1WcV6MG$ot+>OTe($Ub;OG_ z{a*DJUs315D*S3Z)bMbSw*yXDdn3PJucie6~n|V z&f{s6-(?AE;WA0Sv}Cz~Tk1D)%Vsw1Q!NMipFF!dSvg{yxBq^h`CG;(wAnJ^M?To- z5}3ynMJ~xrrt$Q*k9x!yHQ!d(=H6*b`p zO|9_G>A4}LNdMn*i`&;9;@_`7zTdz4@7}+9&*M+GKd@q5IWa}a!{ox!sfT?h)+5GM z%CJ)1n^E^PI?i#s-}tZ``{W@>Xnq(Ewxw6E7+)BtzC)#62e&9|()4{L4%@?>HW!LJ z@84nA&>!wkwI)<19X&BbK+eeWV9m#Cl;Eh_J^kH^OW2K3>E`Uktr^rj2PL_$$+AYJ znTKr-nMv|8`M*6p-dscM!m&^_xPPf>HFuPjQl$e+jH>;j@VpZb`}smQ%UA`;axImT z@Eh~#<*uft&VvIpC8zH%W(7Puw$h<{xo?Hh;N0)O^nk1We_ns+eIxewce{VZ_ZQ4R z;X^$V12E0-RqMa9A*~tIHxl^&0{s+l97^D8^_M|f`Oo?V{=EKA&&2Nj9r~Lg?M}Gf zMuOm<*Z;epe;fk6?w`y5|M~f&5Y^(4lO6N6%!F;aRqanCA{iuD={B|4(>Kp7PWnxB zb1eueF-=o5Q94um-m}h}ilS`gO0#8tak#BNCpl3r>EIPbqTpKc!qJuwl(aLJfESEwlUHM=jXyd;i9S z%=Y!qv2VoxexHB&+swbbqdm3iu;}TZ-Zw=ZQuXHDM@cuvN4OcY*7r%uC;CoM%UHH% zMTV_*YUueovh~v7?3+kjd{}mAi>h_SQrut3mFI?)^j4s8?@9Ax<4U&n_Iq*+E%+*F zl9OwgE@JX#zkPLjvS1=Tc`d}Sq-)__v82B83N`!WDKd+tdH*;eUTobTQYqe?Js^mI z6G4Z1_1yh(S2*@Wh!e%t2JS#(fdMY2E+;&rEN|UoPqcqH&WbaD&9mnUk@dg$W0GM=07qFuh~+TPS9%W#YGOnAL8Lm)drt0g^Mt~jMf6HJ}_MANvA#(jP|)YD$-n!|cdf@-s~ z`LVH1uj?}|{;Zb!=x=!9!;;}%!RE)0wR@^fY%oGcJGofSM&cjx=j0u~>D{L8#1jxt z?8)l#(9nz6oKi>D*D7aDPP=xupRK?hI+o&&trs?;Z$i%(yn6bvT{3vXjw)NL+MZ5T ziY-++7VmJ`Hup{j1PJ66co-Nhh;Nlv+N^7ysW~|~*tz52gybNXf13ByF!QG^2 zRI8f`-1P88qo~<3NiO7HS5qVrh*HQPfUzgT~#-IAwi|mSRI4OY_K8T?IAVUZWZ2K8|d@;TOBc_aB+rR9JML{gA9UVi|v(`f#H8 z=-ymS%J5UxX$J`SO&!uB3nl2++i;Z9m&XZtlkpf>k{+@%h0&u>NAoLgLNAzxoACLOmf7jvXr=Rr;|9SnN_Q2W$$3*h*+nRs; z6%THBi+$EF^5^w`8vpP89r`Iizwu}N^xyYS`BwK&nO$k=wP>ldekA1?RWnh3p8sQf zFB;Gn{3xxrFs$CS`GVjiTY+wdL{>dcKpTi?{Vb{HoQ{q2*FD1dINQ-68stdH>QUX? z(IxmiS|z1^@an+c06b9`UE0g^P2*JGoJ|-}gUWZeub~tvZ*-<767V+;!#%mG8RnXGPgl*Kw68uZt!ui_E;Qd? zFQRh(pcGL}X(n}3`z3of-FdCe%Y#D$T{9aMipLa`grAw%#8L`*oGy8$xKS|pY0`Mx zel)+^&-e8w|K0T`Z$ue}7YKwZ%|)ftBrNS6v4l?3xCL8HE!e*nRd^JiAH@_cIZ5x4 zaME+xVF`^Q7Zt?0w#8t1`B-l3V7#sQA?-O^zlBk?1aHT-o4W_qR0|SJI8G^!*alJ* zP*%dDn1muP6Ws3UzEJEXaHJ7UIc!79xR0n%UM=ZhhHNuQ^8vN$ zzDMsV#_}Ci5xu^L(x$jkQR=SQk41#2 zEKWRF?WL`*uYBNAoEweFuAkAGTY!x(ci_0gUY>p9o^>%xnkHA8I8}Wa9!VPRW-^G) z=vc959}{o7L&)kGkda&I*9I#oC~NZtX>!pd;B4DjZC~L=RBI#Rs)16t7vGGve*vKA%U`@$Wmo^y-Fuv(3U_`&MiS#`7Y#25n7e zzJAGO(Mg)5$iuzIommg6_?3$=$>+q#Tn%8$OsOz>Gi<&=jo(&ieo@OgTc7fLj{fev zGNVHutXZW9^Uq#tf0Hr)QcG?K`TpPaP`~X_xBIW}>vz8I-~BH)CjZa)uMJ9_#dsep zcSqCYhu4e5xL9&tE|?J9f91PlP*b}N&wKc+viv~I%{!BIo2*M(Ww3?S#S2kNYX&7W zFHas(P9UT^(3;bK>fz9wrQ4$*m2A12aTdYZHnRSmoeB}WF7c~BEN-QaCZtXcS>%!E z7@Vn!(iFQOUDY@{m!~n#X@qiN6k!Z_JA~^JRc?TXM;Ggu;(CCF=Fl^1SC_Wlo);~) z)+G5wx1~v`m@tU3XeBjdNf`ug$v^~3+{`e8lf%o^t~&2EYwvs-IYO6E>@rWAb(nQ#5~jS`<1^W@V; zqjp`Ui!q5`d{DB_tChYIHnky7MWdFSdR+py6b-L?&B2Cq%El!QOS0EJiCiW}qe29{ z0tUI-+zC8b{oF;wd`3BA6&jQ~t&##&U%n2V<>toV&El=dP%*Vc+269P->PdUeM3jT zhUN95#Pz*t;9`0H>v(@={+JHRZ?X*Wg-1&A{v-v)CY^n>aFri=ei%s!OtHg7>{Bmt69z3&J z&rQlp6}aSPJ=%D7lHYcJBz7hFOvDFSoS5bK#r%tg>x3@Xz|yV7*PuhL_v*H){lM^E z5seBvT9UbI*5hH#sa?9$c&>t7xo#XMmiEWtqExEoH?FvTpiC!Im0h2^16$;aO?kbQ zSaESS{f#bq+y0U9#J6z&>ihiX-)8=EopLp*OF;aZ7*&^3EKj)@Wq~D;kjl%Z;u?R` ztSZU_0zo9Z)U5}?6dfdHCH%?^XqNPc{O9LHO@_r$<^?7N(}zA3X!+Vat8=uZ&Lf|H zSLhOSQja`B|9XO9{UE7KNcdX9Qs&5H^}W7(`j;Ct^A|g-lRJZ}uPf}o>oW12|F8++ zB|>X8GSda(ve4kR4Ow>{Kka)ud5gCr*JpYMbcmFX(g;uX*u8Dwh-UQJm#QQX&Np8v zSKX`~Zm6-civf*_*C<`2g7<5z4)w%npiyGH^lLq;I}W2a0G-u4XM*N=m=%D^-4n8bMWpS zQ;@VpIepU23wiuf63OwW$&jDq_}3)Al;Q>{Yyh>O5=QV3eJ4N*qVMNAI3VFpB=t{p zAgQGwhZg}W_-u-#_?-dXuJgO+f6hS#Eq#s?EsSn93@+8_%Ywt&? zFMZ#3>A#dk&Mop3-_P@^2JbZcSM_lSl9M1ZKdDD0cq7_BWxmvb)H||L@aOsaGX1aR z4Ut1u*!@(G3e=q)cvU-iE1LgTNy5&A2`{{f1rEQ 0 then begin + {$IFNDEF CLR} + LresultFromObjectFunc := GetProcAddress(M, 'LresultFromObject'); + AccessibleObjectFromWindowFunc := GetProcAddress(M, 'AccessibleObjectFromWindow'); + if Assigned(LresultFromObjectFunc) and + Assigned(AccessibleObjectFromWindowFunc) then + {$ENDIF} + OleAccAvailable := True; + end; + InterlockedExchange(OleAccInited, 1); + end; + Result := OleAccAvailable; +end; + +{$IFNDEF CLR} +function AccObjectFromWindow(const Wnd: HWND; out ADisp: IDispatch): HRESULT; +begin + Result := AccessibleObjectFromWindowFunc(Wnd, OBJID_WINDOW, IDispatch, ADisp); + if Result <> S_OK then + ADisp := nil; +end; +{$ELSE} +function AccObjectFromWindow(const Wnd: HWND; out ADisp): HRESULT; +begin + Result := AccessibleObjectFromWindowFunc(Wnd, OBJID_WINDOW, + TypeOf(IDispatch).GUID, ADisp); + if Result <> S_OK then + ADisp := nil; +end; +{$ENDIF} + +{$IFNDEF CLR} +procedure DisconnectAccObjects; +{ This procedure calls CoDisconnectObject() on all acc. objects still + allocated. This is needed to prevent potential AV's when TB2k is compiled + into a DLL, since a DLL may be freed by the application while an MSAA + client still holds acc. object references. } +var + Obj, PrevObj: TTBCustomAccObject; +begin + Obj := LastAccObject; + while Assigned(Obj) do begin + { Make a copy of Obj.FPrevious since CoDisconnectObject may cause Obj + to be freed } + PrevObj := Obj.FPrevious; + { CoDisconnectObject should cause remote MSAA clients to release all + references to the object, thus destroying it (assuming the local + application doesn't have references of its own). } + CoDisconnectObject(Obj, 0); + Obj := PrevObj; + end; +end; +{$ELSE} +{ DisconnectAccObjects isn't implemented on .NET because: + - I'm not sure it's needed (the case mentioned above doesn't apply). + - Keeping references to objects in a global linked list would prevent the GC + from ever reclaiming the unused ones. + - The current implementation of TTBStandardOleMarshalObject.DisconnectObject + always returns E_NOTIMPL, so CoDisconnectObject would fail. + - Windows Forms doesn't appear to do it. (Its accessible objects are + derived from StandardOleMarshalObject, and they don't appear to override + the default E_NOTIMPL handling.) } +{$ENDIF} + +function GetAltKeyName: String; +{ This silly function is needed since ShortCutToText(VK_MENU) fails on Delphi + and C++Builder versions <= 4 } +{$IFNDEF CLR} +var + ScanCode: UINT; + KeyName: array[0..255] of Char; +begin + ScanCode := MapVirtualKey(VK_MENU, 0) shl 16; + if (ScanCode <> 0) and + (GetKeyNameText(ScanCode, KeyName, SizeOf(KeyName) div SizeOf(KeyName[0])) > 0) then + Result := KeyName + else + Result := 'Alt'; { shouldn't get here, but just in case... } +end; +{$ELSE} +begin + Result := ShortCutToText(VK_MENU); +end; +{$ENDIF} + +function VarIsInteger(const AVar: TTBVariant): Boolean; +{ Returns True if the specified variant is of type VT_I4, the only integer + type used/allowed in MSAA } +begin + {$IFNDEF CLR} + Result := (VarType(AVar) = varInteger); + {$ELSE} + Result := Assigned(AVar) and (System.Type.GetTypeCode(AVar.GetType) = TypeCode.Int32); + {$ENDIF} +end; + +procedure AssignObjectToVar(var AVariant: TTBVariant; const AObject: TTBBaseAccObject); +{ Creates a VT_DISPATCH-type variant that references AObject } +begin + {$IFNDEF CLR} + AVariant := IDispatch(AObject); + {$ELSE} + AVariant := AObject; + {$ENDIF} +end; + +{ TTBCustomAccObject } + +{$IFNDEF CLR} +constructor TTBCustomAccObject.Create; +begin + inherited Create; + { Add Self to linked list of objects } + EnterCriticalSection(LastAccObjectCritSect); + try + FPrevious := LastAccObject; + if Assigned(FPrevious) then + FPrevious.FNext := Self; + LastAccObject := Self; + finally + LeaveCriticalSection(LastAccObjectCritSect); + end; +end; +{$ENDIF} + +{$IFNDEF CLR} +destructor TTBCustomAccObject.Destroy; +begin + { Remove Self from linked list of objects } + EnterCriticalSection(LastAccObjectCritSect); + try + if LastAccObject = Self then + LastAccObject := FPrevious; + if Assigned(FPrevious) then + FPrevious.FNext := FNext; + if Assigned(FNext) then + FNext.FPrevious := FPrevious; + finally + LeaveCriticalSection(LastAccObjectCritSect); + end; + inherited; +end; +{$ENDIF} + +{ TTBViewAccObject } + +constructor TTBViewAccObject.Create(AView: TTBView); +begin + inherited Create; + FView := AView; + InterlockedIncrement(ViewAccObjectInstances); +end; + +{$IFNDEF CLR} +destructor TTBViewAccObject.Destroy; +begin + InterlockedDecrement(ViewAccObjectInstances); + if Assigned(FView) then begin + TTBViewAccess(FView).FAccObjectInstance := nil; + FView := nil; + end; + inherited; +end; +{$ELSE} +procedure TTBViewAccObject.Finalize; +begin + InterlockedDecrement(ViewAccObjectInstances); + inherited; +end; +{$ENDIF} + +procedure TTBViewAccObject.ClientIsDestroying; +begin + FView := nil; +end; + +function TTBViewAccObject.Check(const varChild: TTBVariant; + var ErrorCode: HRESULT): Boolean; +begin + if FView = nil then begin + ErrorCode := E_FAIL; + Result := False; + end + else if not VarIsInteger(varChild) or (Integer(varChild) <> CHILDID_SELF) then begin + ErrorCode := E_INVALIDARG; + Result := False; + end + else + Result := True; +end; + +function TTBViewAccObject.accDoDefaultAction(varChild: TTBVariant): HRESULT; +begin + Result := S_FALSE; +end; + +function TTBViewAccObject.accHitTest(xLeft, yTop: Integer; + out pvarID: TTBVariant): HRESULT; +var + ViewWnd, W: HWND; + R: TRect; + P: TPoint; + D: {$IFNDEF CLR} IDispatch {$ELSE} TObject {$ENDIF}; + V: TTBItemViewer; +begin + try + if FView = nil then begin + Result := E_FAIL; + Exit; + end; + ViewWnd := FView.Window.Handle; + GetWindowRect(ViewWnd, R); + P.X := xLeft; + P.Y := yTop; + if PtInRect(R, P) then begin + P := FView.Window.ScreenToClient(P); + W := ChildWindowFromPointEx(ViewWnd, P, CWP_SKIPINVISIBLE); + if (W <> 0) and (W <> ViewWnd) then begin + { Point is inside a child window (most likely belonging to a + TTBControlItem) } + Result := AccObjectFromWindow(W, D); + pvarID := D; + end + else begin + V := FView.ViewerFromPoint(P); + if Assigned(V) then + AssignObjectToVar(pvarID, V.GetAccObject) + else + pvarID := TTBVariant(Integer(CHILDID_SELF)); + Result := S_OK; + end; + end + else + Result := S_FALSE; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBViewAccObject.accLocation(out pxLeft, pyTop, pcxWidth, + pcyHeight: Integer; varChild: TTBVariant): HRESULT; +var + R: TRect; +begin + try + if not Check(varChild, Result) then + Exit; + GetWindowRect(FView.Window.Handle, R); + pxLeft := R.Left; + pyTop := R.Top; + pcxWidth := R.Right - R.Left; + pcyHeight := R.Bottom - R.Top; + Result := S_OK; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBViewAccObject.accNavigate(navDir: Integer; varStart: TTBVariant; + out pvarEnd: TTBVariant): HRESULT; +var + I: Integer; +begin + try + if not Check(varStart, Result) then + Exit; + Result := S_FALSE; + case navDir of + NAVDIR_FIRSTCHILD: begin + for I := 0 to FView.ViewerCount-1 do + if FView.Viewers[I].IsAccessible then begin + AssignObjectToVar(pvarEnd, FView.Viewers[I].GetAccObject); + Result := S_OK; + Break; + end; + end; + NAVDIR_LASTCHILD: begin + for I := FView.ViewerCount-1 downto 0 do + if FView.Viewers[I].IsAccessible then begin + AssignObjectToVar(pvarEnd, FView.Viewers[I].GetAccObject); + Result := S_OK; + Break; + end; + end; + end; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBViewAccObject.accSelect(flagsSelect: Integer; + varChild: TTBVariant): HRESULT; +begin + Result := DISP_E_MEMBERNOTFOUND; +end; + +function TTBViewAccObject.get_accChild(varChild: TTBVariant; + out ppdispChild {$IFNDEF CLR}: IDispatch{$ENDIF}): HRESULT; +var + I, J: Integer; + Viewer: TTBItemViewer; + Ctl: TControl; +begin + try + if FView = nil then begin + Result := E_FAIL; + Exit; + end; + if not VarIsInteger(varChild) then begin + Result := E_INVALIDARG; + Exit; + end; + I := Integer(varChild); + if I = CHILDID_SELF then begin + ppdispChild := Self; + Result := S_OK; + end + else begin + { Convert a one-based child index (I) into a real viewer index (J) } + J := 0; + while J < FView.ViewerCount do begin + if FView.Viewers[J].IsAccessible then begin + if I = 1 then Break; + Dec(I); + end; + Inc(J); + end; + if J >= FView.ViewerCount then begin + { 'I' was either negative or too high } + Result := E_INVALIDARG; + Exit; + end; + Viewer := FView.Viewers[J]; + if Viewer.Item is TTBControlItem then begin + { For windowed controls, return the window's accessible object instead + of the item viewer's } + Ctl := TTBControlItem(Viewer.Item).Control; + if (Ctl is TWinControl) and TWinControl(Ctl).HandleAllocated then begin + Result := AccObjectFromWindow(TWinControl(Ctl).Handle, ppdispChild); + Exit; + end; + end; + ppdispChild := Viewer.GetAccObject; + Result := S_OK; + end; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBViewAccObject.get_accChildCount(out pcountChildren: Integer): HRESULT; +var + Count, I: Integer; +begin + try + if Assigned(FView) then begin + Count := 0; + for I := 0 to FView.ViewerCount-1 do + if FView.Viewers[I].IsAccessible then + Inc(Count); + pCountChildren := Count; + Result := S_OK; + end + else + Result := E_FAIL; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBViewAccObject.get_accDefaultAction(varChild: TTBVariant; + out pszDefaultAction: WideString): HRESULT; +begin + Result := S_FALSE; +end; + +function TTBViewAccObject.get_accDescription(varChild: TTBVariant; + out pszDescription: WideString): HRESULT; +begin + Result := S_FALSE; +end; + +function TTBViewAccObject.get_accFocus(out pvarID: TTBVariant): HRESULT; +begin + Result := S_FALSE; +end; + +function TTBViewAccObject.get_accHelp(varChild: TTBVariant; + out pszHelp: WideString): HRESULT; +begin + Result := S_FALSE; +end; + +function TTBViewAccObject.get_accHelpTopic(out pszHelpFile: WideString; + varChild: TTBVariant; out pidTopic: Integer): HRESULT; +begin + pidTopic := 0; { Delphi doesn't implicitly clear Integer 'out' parameters } + Result := S_FALSE; +end; + +function TTBViewAccObject.get_accKeyboardShortcut(varChild: TTBVariant; + out pszKeyboardShortcut: WideString): HRESULT; +begin + try + if not Check(varChild, Result) then + Exit; + if vsMenuBar in FView.Style then begin + pszKeyboardShortcut := GetAltKeyName; + Result := S_OK; + end + else + Result := S_FALSE; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBViewAccObject.get_accName(varChild: TTBVariant; + out pszName: WideString): HRESULT; +var + S: String; +begin + try + if not Check(varChild, Result) then + Exit; + if Assigned(FView.ParentView) and Assigned(FView.ParentView.OpenViewer) then + S := StripAccelChars(TTBItemViewerAccess(FView.ParentView.OpenViewer).GetCaptionText); + if S = '' then + {$IFNDEF CLR} + S := TControlAccess(FView.Window).Caption; + {$ELSE} + S := FView.Window.GetText; + {$ENDIF} + pszName := S; + Result := S_OK; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBViewAccObject.get_accParent(out ppdispParent {$IFNDEF CLR}: IDispatch{$ENDIF}): HRESULT; +begin + try + if Assigned(FView) then begin + if Assigned(FView.ParentView) and Assigned(FView.ParentView.OpenViewer) then begin + ppdispParent := FView.ParentView.OpenViewer.GetAccObject; + Result := S_OK; + end + else + Result := AccObjectFromWindow(FView.Window.Handle, ppdispParent); + end + else + Result := E_FAIL; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBViewAccObject.get_accRole(varChild: TTBVariant; + out pvarRole: TTBVariant): HRESULT; +var + Role: Integer; +begin + try + if not Check(varChild, Result) then + Exit; + if FView.IsPopup then + Role := ROLE_SYSTEM_MENUPOPUP + else begin + if vsMenuBar in FView.Style then + Role := ROLE_SYSTEM_MENUBAR + else + Role := ROLE_SYSTEM_TOOLBAR; + end; + pvarRole := TTBVariant(Role); + Result := S_OK; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBViewAccObject.get_accSelection(out pvarChildren: TTBVariant): HRESULT; +begin + Result := S_FALSE; +end; + +function TTBViewAccObject.get_accState(varChild: TTBVariant; + out pvarState: TTBVariant): HRESULT; +begin + try + if not Check(varChild, Result) then + Exit; + pvarState := TTBVariant(Integer(0)); + Result := S_OK; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBViewAccObject.get_accValue(varChild: TTBVariant; + out pszValue: WideString): HRESULT; +begin + Result := S_FALSE; +end; + +function TTBViewAccObject.put_accName(varChild: TTBVariant; + const pszName: WideString): HRESULT; +begin + Result := S_FALSE; +end; + +function TTBViewAccObject.put_accValue(varChild: TTBVariant; + const pszValue: WideString): HRESULT; +begin + Result := S_FALSE; +end; + +{ TTBItemViewerAccObject } + +constructor TTBItemViewerAccObject.Create(AViewer: TTBItemViewer); +begin + inherited Create; + FViewer := AViewer; + InterlockedIncrement(ItemViewerAccObjectInstances); +end; + +{$IFNDEF CLR} +destructor TTBItemViewerAccObject.Destroy; +begin + InterlockedDecrement(ItemViewerAccObjectInstances); + if Assigned(FViewer) then begin + TTBItemViewerAccess(FViewer).FAccObjectInstance := nil; + FViewer := nil; + end; + inherited; +end; +{$ELSE} +procedure TTBItemViewerAccObject.Finalize; +begin + InterlockedDecrement(ItemViewerAccObjectInstances); + inherited; +end; +{$ENDIF} + +procedure TTBItemViewerAccObject.ClientIsDestroying; +begin + FViewer := nil; +end; + +function TTBItemViewerAccObject.Check(const varChild: TTBVariant; + var ErrorCode: HRESULT): Boolean; +begin + if FViewer = nil then begin + ErrorCode := E_FAIL; + Result := False; + end + else if not VarIsInteger(varChild) or (Integer(varChild) <> CHILDID_SELF) then begin + ErrorCode := E_INVALIDARG; + Result := False; + end + else + Result := True; +end; + +function TTBItemViewerAccObject.IsActionable: Boolean; +{ Returns True if 'doDefaultAction' may be performed on the viewer, i.e. if + it's visible/off-edge/clipped, enabled & selectable, and the view is + focusable. } +begin + Result := FViewer.IsAccessible and IsAvailable and IsFocusable; +end; + +function TTBItemViewerAccObject.IsAvailable: Boolean; +{ Returns True if the viewer's item is enabled and selectable } +begin + Result := FViewer.Item.Enabled and + (tbisSelectable in TTBCustomItemAccess(FViewer.Item).ItemStyle); +end; + +function TTBItemViewerAccObject.IsFocusable: Boolean; +{ Returns True if viewers on the view can be 'focused' (i.e. the view's window + doesn't have the csDesigning state, the window is visible and enabled, and + the application is active). } + + function IsWindowAndParentsEnabled(W: HWND): Boolean; + begin + Result := True; + repeat + if not IsWindowEnabled(W) then begin + Result := False; + Break; + end; + W := GetParent(W); + until W = 0; + end; + +var + ViewWnd, ActiveWnd: HWND; +begin + Result := False; + if csDesigning in FViewer.View.Window.ComponentState then + Exit; + ViewWnd := FViewer.View.Window.Handle; + if IsWindowVisible(ViewWnd) and IsWindowAndParentsEnabled(ViewWnd) then begin + if vsModal in FViewer.View.State then + Result := True + else begin + ActiveWnd := GetActiveWindow; + if (ActiveWnd <> 0) and + ((ActiveWnd = ViewWnd) or IsChild(ActiveWnd, ViewWnd)) then + Result := True; + end; + end; +end; + +procedure TTBItemViewerAccObject.HandleAccSelect(const AExecute: Boolean); +begin + if Assigned(FViewer) and + ((AExecute and IsActionable) or (not AExecute and IsFocusable)) then begin + FViewer.View.Selected := FViewer; + FViewer.View.ScrollSelectedIntoView; + if vsModal in FViewer.View.State then begin + if AExecute then + FViewer.View.ExecuteSelected(False); + end + else if (FViewer.View.ParentView = nil) and (GetCapture = 0) then begin + if AExecute then + FViewer.View.EnterToolbarLoop([tbetExecuteSelected, tbetFromMSAA]) + else + FViewer.View.EnterToolbarLoop([tbetFromMSAA]); + end; + end; +end; + +function TTBItemViewerAccObject.accDoDefaultAction(varChild: TTBVariant): HRESULT; +begin + try + if not Check(varChild, Result) then + Exit; + { NOTE: This must be kept in synch with get_accDefaultAction } + if IsActionable then begin + Result := S_OK; + if FViewer.View.OpenViewer = FViewer then begin + FViewer.View.CancelChildPopups; + { Like standard menus, cancel the modal loop when a top-level menu + is closed } + if (vsModal in FViewer.View.State) and not FViewer.View.IsPopup then + FViewer.View.EndModal; + end + else begin + FViewer.View.Selected := FViewer; + FViewer.View.ScrollSelectedIntoView; + TTBItemViewerAccess(FViewer).PostAccSelect(True); + end; + end + else + { Note: Standard menus return DISP_E_MEMBERNOTFOUND in this case but + that doesn't make much sense. The member is there but just isn't + currently available. } + Result := E_FAIL; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.accHitTest(xLeft, yTop: Integer; + out pvarID: TTBVariant): HRESULT; +var + P: TPoint; +begin + try + if FViewer = nil then begin + Result := E_FAIL; + Exit; + end; + P := FViewer.View.Window.ScreenToClient(Point(xLeft, yTop)); + if PtInRect(FViewer.BoundsRect, P) then begin + pvarID := TTBVariant(Integer(CHILDID_SELF)); + Result := S_OK; + end + else + Result := S_FALSE; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.accLocation(out pxLeft, pyTop, pcxWidth, + pcyHeight: Integer; varChild: TTBVariant): HRESULT; +var + R: TRect; + P: TPoint; +begin + try + if not Check(varChild, Result) then + Exit; + R := FViewer.BoundsRect; + P := FViewer.View.Window.ClientToScreen(Point(0, 0)); + OffsetRect(R, P.X, P.Y); + pxLeft := R.Left; + pyTop := R.Top; + pcxWidth := R.Right - R.Left; + pcyHeight := R.Bottom - R.Top; + Result := S_OK; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.accNavigate(navDir: Integer; varStart: TTBVariant; + out pvarEnd: TTBVariant): HRESULT; +var + I, J: Integer; + View: TTBView; +begin + try + if not Check(varStart, Result) then + Exit; + Result := S_FALSE; + if (navDir = NAVDIR_FIRSTCHILD) or (navDir = NAVDIR_LASTCHILD) then begin + { Return the child view's acc. object } + View := FViewer.View.OpenViewerView; + if Assigned(View) then begin + AssignObjectToVar(pvarEnd, View.GetAccObject); + Result := S_OK; + end; + end + else begin + I := FViewer.View.IndexOf(FViewer); + if I >= 0 then begin + case navDir of + NAVDIR_UP, NAVDIR_LEFT, NAVDIR_PREVIOUS: + for J := I-1 downto 0 do + if FViewer.View.Viewers[J].IsAccessible then begin + AssignObjectToVar(pvarEnd, FViewer.View.Viewers[J].GetAccObject); + Result := S_OK; + Break; + end; + NAVDIR_DOWN, NAVDIR_RIGHT, NAVDIR_NEXT: + for J := I+1 to FViewer.View.ViewerCount-1 do + if FViewer.View.Viewers[J].IsAccessible then begin + AssignObjectToVar(pvarEnd, FViewer.View.Viewers[J].GetAccObject); + Result := S_OK; + Break; + end; + end; + end; + end; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.accSelect(flagsSelect: Integer; + varChild: TTBVariant): HRESULT; +begin + try + if not Check(varChild, Result) then + Exit; + if flagsSelect <> SELFLAG_TAKEFOCUS then begin + Result := E_INVALIDARG; + Exit; + end; + if IsFocusable and (FViewer.Show or FViewer.Clipped) then begin + FViewer.View.Selected := FViewer; + FViewer.View.ScrollSelectedIntoView; + if not(vsModal in FViewer.View.State) and + (FViewer.View.ParentView = nil) then + TTBItemViewerAccess(FViewer).PostAccSelect(False); + end + else + Result := E_FAIL; + { ^ what Office XP returns when you try focusing an off-edge item } + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.get_accChild(varChild: TTBVariant; + out ppdispChild {$IFNDEF CLR}: IDispatch{$ENDIF}): HRESULT; +var + View: TTBView; +begin + try + if FViewer = nil then begin + Result := E_FAIL; + Exit; + end; + Result := E_INVALIDARG; + if VarIsInteger(varChild) then begin + if Integer(varChild) = CHILDID_SELF then begin + ppdispChild := Self; + Result := S_OK; + end + else if Integer(varChild) = 1 then begin + { Return the child view's acc. object } + View := FViewer.View.OpenViewerView; + if Assigned(View) then begin + ppdispChild := View.GetAccObject; + Result := S_OK; + end; + end; + end; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.get_accChildCount(out pcountChildren: Integer): HRESULT; +begin + try + if FViewer = nil then begin + Result := E_FAIL; + Exit; + end; + { Return 1 if the viewer has a child view } + if FViewer.View.OpenViewer = FViewer then + pCountChildren := 1 + else + pCountChildren := 0; + Result := S_OK; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.get_accDefaultAction(varChild: TTBVariant; + out pszDefaultAction: WideString): HRESULT; +begin + try + if not Check(varChild, Result) then + Exit; + if IsActionable then begin + { I'm not sure if these should be localized, or even if any screen + readers make use of this text... + NOTE: This must be kept in synch with accDoDefaultAction } + if FViewer.View.OpenViewer = FViewer then + pszDefaultAction := 'Close' + else if tbisSubmenu in TTBCustomItemAccess(FViewer.Item).ItemStyle then + pszDefaultAction := 'Open' + else if FViewer.View.IsPopup or (vsMenuBar in FViewer.View.Style) then + pszDefaultAction := 'Execute' + else + pszDefaultAction := 'Press'; + Result := S_OK; + end + else + Result := S_FALSE; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.get_accDescription(varChild: TTBVariant; + out pszDescription: WideString): HRESULT; +begin + Result := S_FALSE; +end; + +function TTBItemViewerAccObject.get_accFocus(out pvarID: TTBVariant): HRESULT; +begin + try + if FViewer = nil then begin + Result := E_FAIL; + Exit; + end; + if (vsModal in FViewer.View.State) and + (FViewer.View.Selected = FViewer) then begin + pvarID := TTBVariant(Integer(CHILDID_SELF)); + Result := S_OK; + end + else + Result := S_FALSE; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.get_accHelp(varChild: TTBVariant; + out pszHelp: WideString): HRESULT; +begin + Result := S_FALSE; +end; + +function TTBItemViewerAccObject.get_accHelpTopic(out pszHelpFile: WideString; + varChild: TTBVariant; out pidTopic: Integer): HRESULT; +begin + pidTopic := 0; { Delphi doesn't implicitly clear Integer 'out' parameters } + Result := S_FALSE; +end; + +function TTBItemViewerAccObject.get_accKeyboardShortcut(varChild: TTBVariant; + out pszKeyboardShortcut: WideString): HRESULT; +var + C: Char; +begin + try + if not Check(varChild, Result) then + Exit; + Result := S_FALSE; + if TTBItemViewerAccess(FViewer).CaptionShown then begin + C := FindAccelChar(TTBItemViewerAccess(FViewer).GetCaptionText); + if C <> #0 then begin + C := CharToLower(C); { like standard menus, always use lowercase... } + if FViewer.View.IsPopup then + pszKeyboardShortcut := C + else begin + { Prefix 'Alt+' } + pszKeyboardShortcut := GetAltKeyName + '+' + C; + end; + Result := S_OK; + end; + end; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.get_accName(varChild: TTBVariant; + out pszName: WideString): HRESULT; +var + C, S: String; +begin + try + if not Check(varChild, Result) then + Exit; + C := StripAccelChars(TTBItemViewerAccess(FViewer).GetCaptionText); + if not FViewer.IsToolbarStyle then + S := FViewer.Item.GetShortCutText; + if S = '' then + pszName := C + else + pszName := C + #9 + S; + Result := S_OK; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.get_accParent(out ppdispParent {$IFNDEF CLR}: IDispatch{$ENDIF}): HRESULT; +begin + try + if Assigned(FViewer) then begin + ppdispParent := FViewer.View.GetAccObject; + Result := S_OK; + end + else + Result := E_FAIL; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.get_accRole(varChild: TTBVariant; + out pvarRole: TTBVariant): HRESULT; +begin + try + if not Check(varChild, Result) then + Exit; + pvarRole := TTBVariant(Integer(TTBItemViewerAccess(FViewer).GetAccRole)); + Result := S_OK; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.get_accSelection(out pvarChildren: TTBVariant): HRESULT; +begin + Result := S_FALSE; +end; + +function TTBItemViewerAccObject.get_accState(varChild: TTBVariant; + out pvarState: TTBVariant): HRESULT; +var + Flags: Integer; +begin + try + if not Check(varChild, Result) then + Exit; + Flags := 0; + if FViewer.View.Selected = FViewer then begin + Flags := Flags or STATE_SYSTEM_HOTTRACKED; + if vsModal in FViewer.View.State then + Flags := Flags or STATE_SYSTEM_FOCUSED; + if FViewer.View.MouseOverSelected and FViewer.View.Capture then + { ^ based on "IsPushed :=" code in TTBView.DrawItem } + Flags := Flags or STATE_SYSTEM_PRESSED; + end; + if tbisSubmenu in TTBCustomItemAccess(FViewer.Item).ItemStyle then + Flags := Flags or STATE_SYSTEM_HASPOPUP; + if FViewer.Show or FViewer.Clipped then begin + if IsFocusable then + Flags := Flags or STATE_SYSTEM_FOCUSABLE; + end + else begin + { Mark off-edge items as invisible, like Office } + Flags := Flags or STATE_SYSTEM_INVISIBLE; + end; + if not IsAvailable then + Flags := Flags or STATE_SYSTEM_UNAVAILABLE; + if FViewer.Item.Checked then + Flags := Flags or STATE_SYSTEM_CHECKED; + pvarState := TTBVariant(Flags); + Result := S_OK; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.get_accValue(varChild: TTBVariant; + out pszValue: WideString): HRESULT; +begin + try + if not Check(varChild, Result) then + Exit; + if TTBItemViewerAccess(FViewer).GetAccValue(pszValue) then + Result := S_OK + else begin + { When S_FALSE is returned, the Inspect tool wants NULL in pszValue. + On Delphi for Win32, '' is NULL. On .NET, we have to assign nil. } + pszValue := {$IFNDEF CLR} '' {$ELSE} nil {$ENDIF}; + Result := S_FALSE; + end; + except + Result := E_UNEXPECTED; + end; +end; + +function TTBItemViewerAccObject.put_accName(varChild: TTBVariant; + const pszName: WideString): HRESULT; +begin + Result := S_FALSE; +end; + +function TTBItemViewerAccObject.put_accValue(varChild: TTBVariant; + const pszValue: WideString): HRESULT; +begin + Result := S_FALSE; +end; + +{$IFNDEF CLR} +{ Note: This COM initialization code based on code from DBTables } +var + SaveInitProc: Pointer; + NeedToUninitialize: Boolean; + +procedure InitCOM; +begin + if SaveInitProc <> nil then TProcedure(SaveInitProc); + NeedToUninitialize := SUCCEEDED(CoInitialize(nil)); +end; + +initialization + InitializeCriticalSection(LastAccObjectCritSect); + if not IsLibrary then begin + SaveInitProc := InitProc; + InitProc := @InitCOM; + end; +finalization + DisconnectAccObjects; + if NeedToUninitialize then + CoUninitialize; + DeleteCriticalSection(LastAccObjectCritSect); +{$ENDIF} +end. diff --git a/internal/2.2.2/1/Source/TB2Anim.pas b/internal/2.2.2/1/Source/TB2Anim.pas new file mode 100644 index 0000000..96d9756 --- /dev/null +++ b/internal/2.2.2/1/Source/TB2Anim.pas @@ -0,0 +1,323 @@ +unit TB2Anim; + +{ + Toolbar2000 + Copyright (C) 1998-2008 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2Anim.pas,v 1.13 2008/09/19 16:41:00 jr Exp $ +} + +interface + +{$I TB2Ver.inc} +{$Q-} + +uses + Windows, Messages, SysUtils, Classes; + +const + WM_TB2K_ANIMATIONENDED = WM_USER + $556; + +type + TTBAnimationDirection = set of (tbadLeft, tbadRight, tbadDown, tbadUp); + +procedure TBStartAnimation(const AWnd: HWND; const ABlend: Boolean; + const ADirection: TTBAnimationDirection); +procedure TBUpdateAnimation; +procedure TBEndAnimation(const Wnd: HWND); +function TBIsAnimationInProgress: Boolean; + +implementation + +uses + {$IFDEF CLR} System.Security, System.Runtime.InteropServices, System.Threading, {$ENDIF} + TB2Common; + +{ Notes to self: + - It originally had the NOMIRRORBITMAP flag on the BitBlt calls, because + Windows 2000's AnimateWindow function has it. But it had to be removed + because on Windows 98 with the Standard VGA or VMware video driver, it + caused no bits to be blitted, even though Windows 98 is supposed to + support NOMIRRORBITMAP according to the documentation. I don't think it's + necessary anyway. +} + +const + DCX_USESTYLE = $10000; + WS_EX_LAYERED = $80000; + NOMIRRORBITMAP = $80000000; + ULW_ALPHA = 2; + +type + PAnimateThreadFuncData = ^TAnimateThreadFuncData; + TAnimateThreadFuncData = record + FRunning: Boolean; + FWnd: HWND; + FTime: Integer; + FBlending: Boolean; + FStartStep, FCurStep: Integer; + FStartTime, FLastFrameTime: DWORD; + FWndDC, FBmpDC: HDC; + FBmp: HBITMAP; + FScreenClientRect: TRect; + FSize: TSize; + FLastPos: TPoint; + FDirection: TTBAnimationDirection; + end; + { Delphi.NET 2007 note: Because TRect/TSize/TPoint are wrongly declared as + 'packed', fields of these types must be preceded by an Integer- or + IntPtr-sized field to ensure correct alignment and avoid an alignment + fault on IA-64. } + +{$IFNDEF CLR} +var + UpdateLayeredWindowProc: function(Handle: HWND; hdcDest: HDC; + pptDst: PPoint; _psize: PSize; hdcSrc: HDC; pptSrc: PPoint; + crKey: COLORREF; var pblend: TBLENDFUNCTION; dwFlags: DWORD): BOOL; stdcall; +{$ELSE} +{ We can't use Borland.Vcl.Windows' UpdateLayeredWindow because the "pblend" + parameter is misdeclared (see QC #25130) } +[SuppressUnmanagedCodeSecurity, DllImport(user32, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'UpdateLayeredWindow')] +function UpdateLayeredWindowProc(Handle: HWND; hdcDest: HDC; const pptDst: TPoint; + const _psize: TSize; hdcSrc: HDC; const pptSrc: TPoint; + crKey: COLORREF; [in] var pblend: TBLENDFUNCTION; dwFlags: DWORD): BOOL; overload; external; +[SuppressUnmanagedCodeSecurity, DllImport(user32, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'UpdateLayeredWindow')] +function UpdateLayeredWindowProc(Handle: HWND; hdcDest: HDC; pptDst: IntPtr; + _psize: IntPtr; hdcSrc: HDC; pptSrc: IntPtr; + crKey: COLORREF; [in] var pblend: TBLENDFUNCTION; dwFlags: DWORD): BOOL; overload; external; +{$ENDIF} + +threadvar + AnimateData: TAnimateThreadFuncData; + +procedure FinalizeAnimation; +begin + {$IFNDEF CLR} + with PAnimateThreadFuncData(@AnimateData)^ do begin + {$ELSE} + with AnimateData do begin + {$ENDIF} + FRunning := False; + if FBmpDC <> 0 then begin + if FBlending then + SetWindowLong(FWnd, GWL_EXSTYLE, + GetWindowLong(FWnd, GWL_EXSTYLE) and not WS_EX_LAYERED) + else + SetWindowRgn(FWnd, 0, False); + BitBlt(FWndDC, 0, 0, FSize.cx, FSize.cy, FBmpDC, 0, 0, SRCCOPY); + DeleteDC(FBmpDC); + FBmpDC := 0; + end; + if FBmp <> 0 then begin + DeleteObject(FBmp); + FBmp := 0; + end; + if FWndDC <> 0 then begin + ReleaseDC(FWnd, FWndDC); + FWndDC := 0; + end; + if FWnd <> 0 then begin + SendNotifyMessage(FWnd, WM_TB2K_ANIMATIONENDED, 0, 0); + FWnd := 0; + end; + end; +end; + +function TBIsAnimationInProgress: Boolean; +begin + Result := AnimateData.FRunning; +end; + +procedure TBEndAnimation(const Wnd: HWND); +begin + if AnimateData.FRunning and + ((Wnd = 0) or (AnimateData.FWnd = Wnd)) then + FinalizeAnimation; +end; + +procedure TBStartAnimation(const AWnd: HWND; const ABlend: Boolean; + const ADirection: TTBAnimationDirection); +var + ZeroPt: TPoint; + R: TRect; + Blend: TBlendFunction; + Rgn: HRGN; +begin + FinalizeAnimation; + + ZeroPt.X := 0; + ZeroPt.Y := 0; + + try + {$IFNDEF CLR} + { Note: The pointer cast avoids GetTls calls for every field access } + with PAnimateThreadFuncData(@AnimateData)^ do begin + {$ELSE} + with AnimateData do begin + {$ENDIF} + FWnd := AWnd; + FBlending := ABlend and {$IFNDEF CLR} Assigned(UpdateLayeredWindowProc) + {$ELSE} (Win32MajorVersion >= 5) {$ENDIF}; + FDirection := ADirection; + GetCursorPos(FLastPos); + GetClientRect(FWnd, FScreenClientRect); + MapWindowPoints(FWnd, 0, FScreenClientRect, 2); + GetWindowRect(FWnd, R); + FWndDC := GetDCEx(FWnd, 0, DCX_WINDOW or DCX_CACHE {or DCX_USESTYLE ?}); + if FWndDC = 0 then + RaiseLastOSError; + FSize.cx := R.Right - R.Left; + FSize.cy := R.Bottom - R.Top; + FBmp := CreateCompatibleBitmap(FWndDC, FSize.cx, FSize.cy {or $01000000 ?}); + if FBmp = 0 then + RaiseLastOSError; + FBmpDC := CreateCompatibleDC(FWndDC); + if FBmpDC = 0 then + RaiseLastOSError; + // AnimateWindow calls SetLayout, but I'm not sure that we need to. + //if Assigned(SetLayoutProc) then + // SetLayoutProc(FBmpDC, 0); + SelectObject(FBmpDC, FBmp); + //SetBoundsRect(FBmpDC, nil, DCB_RESET or DCB_ENABLE); + SendMessage(FWnd, WM_PRINT, WPARAM(FBmpDC), PRF_NONCLIENT or PRF_CLIENT or + PRF_ERASEBKGND or PRF_CHILDREN); + //GetBoundsRect + if FBlending then begin + SetWindowLong(FWnd, GWL_EXSTYLE, GetWindowLong(FWnd, GWL_EXSTYLE) or WS_EX_LAYERED); + FTime := 175; { actually more like ~147 because FCurStep starts at 40 } + FCurStep := 40; + Blend.BlendOp := AC_SRC_OVER; + Blend.BlendFlags := 0; + Blend.SourceConstantAlpha := FCurStep; + Blend.AlphaFormat := 0; + Win32Check(UpdateLayeredWindowProc(FWnd, 0, {$IFNDEF CLR}@{$ENDIF} R.TopLeft, + {$IFNDEF CLR}@{$ENDIF} FSize, FBmpDC, {$IFNDEF CLR}@{$ENDIF} ZeroPt, + 0, Blend, ULW_ALPHA)); + end + else begin + FTime := 150; + FCurStep := 0; + Rgn := CreateRectRgn(0, 0, 0, 0); + if not BOOL(SetWindowRgn(FWnd, Rgn, False)) then + DeleteObject(Rgn); { just in case } + end; + FStartStep := FCurStep; + FStartTime := GetTickCount; + FLastFrameTime := FStartTime; + { These are the same flags AnimateWindow uses. SWP_ASYNCWINDOWPOS is + needed or else it doesn't "save bits" properly. + Note: SWP_ASYNCWINDOWPOS seems to have no effect on Windows 95 & NT 4.0, + so bits behind the window are not saved & restored correctly. } + SetWindowPos(FWnd, 0, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE or + SWP_NOZORDER or SWP_NOACTIVATE or SWP_SHOWWINDOW or SWP_NOREDRAW or + SWP_NOOWNERZORDER or SWP_ASYNCWINDOWPOS); + FRunning := True; + end; + except + FinalizeAnimation; + raise; + end; +end; + +procedure TBUpdateAnimation; +var + ThisFrameTime: DWORD; + ElapsedTime, NewStep: Integer; + P: TPoint; + Blend: TBlendFunction; + X, Y: Integer; + Rgn: HRGN; +begin + {$IFNDEF CLR} + with PAnimateThreadFuncData(@AnimateData)^ do begin + {$ELSE} + with AnimateData do begin + {$ENDIF} + if not FRunning then + Exit; + + { If 10 msec hasn't passed since the last call, exit. We don't want to + monopolize the CPU. } + ThisFrameTime := GetTickCount; + if ThisFrameTime - FLastFrameTime < 10 then + Exit; + FLastFrameTime := ThisFrameTime; + + ElapsedTime := ThisFrameTime - FStartTime; + if (ElapsedTime < 0) or (ElapsedTime >= FTime) then begin + FinalizeAnimation; + Exit; + end; + NewStep := FStartStep + ((255 * ElapsedTime) div FTime); + if (NewStep < 0) or (NewStep >= 255) then begin + FinalizeAnimation; + Exit; + end; + + GetCursorPos(P); + if (P.X <> FLastPos.X) or (P.Y <> FLastPos.Y) then begin + if PtInRect(FScreenClientRect, P) then begin + FinalizeAnimation; + Exit; + end; + FLastPos := P; + end; + + if NewStep > FCurStep then begin + FCurStep := NewStep; + if FBlending then begin + Blend.BlendOp := AC_SRC_OVER; + Blend.BlendFlags := 0; + Blend.SourceConstantAlpha := NewStep; + Blend.AlphaFormat := 0; + UpdateLayeredWindowProc(FWnd, 0, nil, nil, 0, nil, 0, Blend, ULW_ALPHA); + end + else begin + if tbadDown in FDirection then + Y := MulDiv(FSize.cy, NewStep, 255) - FSize.cy + else if tbadUp in FDirection then + Y := FSize.cy - MulDiv(FSize.cy, NewStep, 255) + else + Y := 0; + if tbadRight in FDirection then + X := MulDiv(FSize.cx, NewStep, 255) - FSize.cx + else if tbadLeft in FDirection then + X := FSize.cx - MulDiv(FSize.cx, NewStep, 255) + else + X := 0; + Rgn := CreateRectRgn(X, Y, X + FSize.cx, Y + FSize.cy); + if not BOOL(SetWindowRgn(FWnd, Rgn, False)) then + DeleteObject(Rgn); { just in case } + BitBlt(FWndDC, X, Y, FSize.cx, FSize.cy, FBmpDC, 0, 0, SRCCOPY); + end; + end; + end; +end; + +initialization + {$IFNDEF CLR} + UpdateLayeredWindowProc := GetProcAddress(GetModuleHandle(user32), + 'UpdateLayeredWindow'); + {$ENDIF} +finalization + FinalizeAnimation; +end. diff --git a/internal/2.2.2/1/Source/TB2Common.pas b/internal/2.2.2/1/Source/TB2Common.pas new file mode 100644 index 0000000..e94bb9d --- /dev/null +++ b/internal/2.2.2/1/Source/TB2Common.pas @@ -0,0 +1,1571 @@ +unit TB2Common; + +{ + Toolbar2000 + Copyright (C) 1998-2008 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2Common.pas,v 1.48 2008/09/17 19:46:30 jr Exp $ +} + +interface + +{$I TB2Ver.inc} + +uses + Windows, Classes, SysUtils, Messages, Controls, Forms; + +type + THandleWMPrintNCPaintProc = procedure(Wnd: HWND; DC: HDC; AppData: TObject); + TPaintHandlerProc = procedure(var Message: TWMPaint) of object; + + { The type of item a TList holds; it differs between Win32 and .NET VCL } + TListItemType = {$IFNDEF CLR} Pointer {$ELSE} TObject {$ENDIF}; + + {$IFNDEF CLR} + ClipToLongint = Longint; + {$ENDIF} + +function AddToFrontOfList(var List: TList; Item: TObject): Boolean; +function AddToList(var List: TList; Item: TObject): Boolean; +function ApplicationIsActive: Boolean; +function AreFlatMenusEnabled: Boolean; +function AreKeyboardCuesEnabled: Boolean; +procedure CallLockSetForegroundWindow(const ALock: Boolean); +function CallTrackMouseEvent(const Wnd: HWND; const Flags: DWORD): Boolean; +function CharToLower(const C: Char): Char; +{$IFDEF CLR} +function ClipToLongint(const I: Int64): Longint; inline; +{$ENDIF} +function CreateHalftoneBrush: HBRUSH; +function CreateMonoBitmap(const AWidth, AHeight: Integer; + const ABits: array of Byte): HBITMAP; +function CreateRotatedFont(DC: HDC): HFONT; +procedure DoubleBufferedRepaint(const Wnd: HWND); +procedure DrawHalftoneInvertRect(const DC: HDC; const NewRect, OldRect: TRect; + const NewSize, OldSize: TSize); +procedure DrawRotatedText(const DC: HDC; AText: String; const ARect: TRect; + const AFormat: Cardinal); +procedure DrawSmallWindowCaption(const Wnd: HWND; const DC: HDC; + const ARect: TRect; const AText: String; const AActive: Boolean); +function DrawTextStr(const DC: HDC; const AText: String; var ARect: TRect; + const AFormat: UINT): Integer; +function EscapeAmpersands(const S: String): String; +procedure FillRectWithGradient(const DC: HDC; const R: TRect; + const StartColor, EndColor: TColorRef; const HorizontalDirection: Boolean); +function FindAccelChar(const S: String): Char; +{$IFNDEF JR_D5} +procedure FreeAndNil(var Obj); +{$ENDIF} +function GetInputLocaleCodePage: UINT; +function GetMenuShowDelay: Integer; +function GetMessagePosAsPoint: TPoint; +function GetRectOfMonitorContainingPoint(const P: TPoint; const WorkArea: Boolean): TRect; +function GetRectOfMonitorContainingRect(const R: TRect; const WorkArea: Boolean): TRect; +function GetRectOfMonitorContainingWindow(const W: HWND; const WorkArea: Boolean): TRect; +function GetRectOfPrimaryMonitor(const WorkArea: Boolean): TRect; +function GetSystemNonClientMetrics(var Metrics: TNonClientMetrics): Boolean; +function GetSystemParametersInfoBool(const Param: UINT; const Default: BOOL): BOOL; +function GetTextExtentPoint32Str(const DC: HDC; const AText: String; + out ASize: TSize): BOOL; +function GetTextHeight(const DC: HDC): Integer; +function GetTextWidth(const DC: HDC; S: String; const Prefix: Boolean): Integer; +procedure HandleWMPrint(const Wnd: HWND; var Message: TMessage; + const NCPaintFunc: THandleWMPrintNCPaintProc; const AppData: TObject); +procedure HandleWMPrintClient(const PaintHandlerProc: TPaintHandlerProc; + const Message: {$IFNDEF CLR} TMessage {$ELSE} TWMPrintClient {$ENDIF}); +function IsWindowsXP: Boolean; +procedure InitTrackMouseEvent; +{$IFNDEF JR_D6} +function InvalidPoint(const At: TPoint): Boolean; +{$ENDIF} +function IsFillRectWithGradientAvailable: Boolean; +function Max(A, B: Integer): Integer; +function Min(A, B: Integer): Integer; +{$IFNDEF CLR} +function MethodsEqual(const M1, M2: TMethod): Boolean; +{$ENDIF} +function NeedToPlaySound(const Alias: String): Boolean; +procedure PlaySystemSound(const Alias: String); +procedure ProcessPaintMessages; +{$IFNDEF JR_D6} +procedure RaiseLastOSError; +{$ENDIF} +procedure RemoveMessages(const AMin, AMax: Integer); +procedure RemoveFromList(var List: TList; Item: TObject); +procedure SelectNCUpdateRgn(Wnd: HWND; DC: HDC; Rgn: HRGN); +function StripAccelChars(const S: String): String; +function StripTrailingPunctuation(const S: String): String; +function TextOutStr(const DC: HDC; const X, Y: Integer; + const AText: String): BOOL; +function UsingMultipleMonitors: Boolean; + +const + PopupMenuWindowNCSize = 3; + DT_HIDEPREFIX = $00100000; + +implementation + +uses + {$IFDEF CLR} Types, System.Security, System.Runtime.InteropServices, + System.Text, MultiMon, {$ENDIF} + MMSYSTEM, TB2Version; + +function ApplicationIsActive: Boolean; +{ Returns True if the application is in the foreground } +begin + Result := GetActiveWindow <> 0; +end; + +type + {$IFNDEF CLR} + PPrintEnumProcData = ^TPrintEnumProcData; + TPrintEnumProcData = record + {$ELSE} + TPrintEnumProcData = class + private + {$ENDIF} + PrintChildren: Boolean; + ParentWnd: HWND; + DC: HDC; + PrintFlags: LPARAM; + {$IFDEF CLR} + function PrintEnumProc(Wnd: HWND; LParam: LPARAM): BOOL; + {$ENDIF} + end; + +{$IFNDEF CLR} +function PrintEnumProc(Wnd: HWND; LParam: LPARAM): BOOL; stdcall; +{$ELSE} +function TPrintEnumProcData.PrintEnumProc(Wnd: HWND; LParam: LPARAM): BOOL; +{$ENDIF} +var + R: TRect; + SaveIndex: Integer; +begin + Result := True; { continue enumerating } + {$IFNDEF CLR} + with PPrintEnumProcData(LParam)^ do + {$ENDIF} + begin + { Skip window if it isn't a child/owned window of ParentWnd or isn't visible } + if (HWND(GetWindowLong(Wnd, GWL_HWNDPARENT)) <> ParentWnd) or + (GetWindowLong(Wnd, GWL_STYLE) and WS_VISIBLE = 0) then + { ^ don't use IsWindowVisible since it returns False if the window's + parent window is not visible } + Exit; + GetWindowRect(Wnd, R); + MapWindowPoints(0, ParentWnd, R, 2); + SaveIndex := SaveDC(DC); + { Like Windows, offset the window origin to the top-left coordinates of + the child/owned window } + MoveWindowOrg(DC, R.Left, R.Top); + { Like Windows, intersect the clipping region with the entire rectangle of + the child/owned window } + OffsetRect(R, -R.Left, -R.Top); + IntersectClipRect(DC, R.Left, R.Top, R.Right, R.Bottom); + { Send a WM_PRINT message to the child/owned window } + SendMessage(Wnd, WM_PRINT, WPARAM(DC), PrintFlags); + { Restore the DC's state, in case the WM_PRINT handler didn't put things + back the way it found them } + RestoreDC(DC, SaveIndex); + end; +end; + +procedure HandleWMPrint(const Wnd: HWND; var Message: TMessage; + const NCPaintFunc: THandleWMPrintNCPaintProc; const AppData: TObject); +{ note: AppData is an application-defined value which is passed to NCPaintFunc } +var + DC: HDC; + SaveIndex, SaveIndex2: Integer; + R: TRect; + P: TPoint; + Data: TPrintEnumProcData; +begin + if (Message.LParam and PRF_CHECKVISIBLE = 0) or IsWindowVisible(Wnd) then begin + DC := HDC(Message.WParam); + SaveIndex2 := SaveDC(DC); + try + if Message.LParam and PRF_NONCLIENT <> 0 then begin + SaveIndex := SaveDC(DC); + if Assigned(NCPaintFunc) then + NCPaintFunc(Wnd, DC, AppData); + RestoreDC(DC, SaveIndex); + end; + { Calculate the difference between the top-left corner of the window + and the top-left corner of its client area } + GetWindowRect(Wnd, R); + P.X := 0; P.Y := 0; + ClientToScreen(Wnd, P); + Dec(P.X, R.Left); Dec(P.Y, R.Top); + if Message.LParam and PRF_CLIENT <> 0 then begin + { Like Windows, the flags PRF_ERASEBKGND, PRF_CHILDREN, and PRF_OWNED + are ignored if PRF_CLIENT isn't also specified } + if Message.LParam and PRF_ERASEBKGND <> 0 then begin + { Send WM_ERASEBKGND } + SaveIndex := SaveDC(DC); + if Message.LParam and PRF_NONCLIENT <> 0 then + MoveWindowOrg(DC, P.X, P.Y); + SendMessage(Wnd, WM_ERASEBKGND, Message.WParam, 0); + RestoreDC(DC, SaveIndex); + end; + { Send WM_PRINTCLIENT } + SaveIndex := SaveDC(DC); + if Message.LParam and PRF_NONCLIENT <> 0 then + MoveWindowOrg(DC, P.X, P.Y); + SendMessage(Wnd, WM_PRINTCLIENT, Message.WParam, 0); + RestoreDC(DC, SaveIndex); + { Like Windows, always offset child/owned windows by the size of the + client area even if PRF_NONCLIENT isn't specified (a bug?) } + MoveWindowOrg(DC, P.X, P.Y); + {$IFDEF CLR} + Data := TPrintEnumProcData.Create; + {$ENDIF} + Data.ParentWnd := Wnd; + Data.DC := DC; + { Send WM_PRINT to child/owned windows } + if Message.LParam and PRF_CHILDREN <> 0 then begin + Data.PrintChildren := True; + Data.PrintFlags := (Message.LParam or (PRF_NONCLIENT or PRF_CLIENT or + PRF_ERASEBKGND or PRF_CHILDREN)) and not PRF_CHECKVISIBLE; + {$IFNDEF CLR} + EnumChildWindows(Wnd, @PrintEnumProc, LPARAM(@Data)); + {$ELSE} + EnumChildWindows(Wnd, Data.PrintEnumProc, 0); + {$ENDIF} + end; + if Message.LParam and PRF_OWNED <> 0 then begin + Data.PrintChildren := False; + Data.PrintFlags := Message.LParam; + {$IFNDEF CLR} + EnumWindows(@PrintEnumProc, LPARAM(@Data)); + {$ELSE} + EnumWindows(Data.PrintEnumProc, 0); + {$ENDIF} + end; + end; + finally + RestoreDC(DC, SaveIndex2); + end; + Message.Result := 1; + end + else begin + { Like Windows, return 0 when the PRF_CHECKVISIBLE flag is specified and + the window is not visible } + Message.Result := 0; + end; +end; + +procedure HandleWMPrintClient(const PaintHandlerProc: TPaintHandlerProc; + const Message: {$IFNDEF CLR} TMessage {$ELSE} TWMPrintClient {$ENDIF}); +var + DC: HDC; + Msg: TWMPaint; + SaveIndex: Integer; +begin + {$IFNDEF CLR} + DC := HDC(Message.WParam); + {$ELSE} + DC := Message.DC; + Msg := TWMPaint.Create; + {$ENDIF} + Msg.Msg := WM_PAINT; + Msg.DC := DC; + {$IFNDEF CLR} + Msg.Unused := 0; + {$ENDIF} + Msg.Result := 0; + SaveIndex := SaveDC(DC); + try + PaintHandlerProc(Msg); + finally + RestoreDC(DC, SaveIndex); + end; +end; + +function GetTextHeight(const DC: HDC): Integer; +var + TextMetric: TTextMetric; +begin + GetTextMetrics(DC, TextMetric); + Result := TextMetric.tmHeight; +end; + +function StripAccelChars(const S: String): String; +var + I: Integer; +begin + Result := S; + I := 1; + while I <= Length(Result) do begin + {$IFNDEF JR_WIDESTR} + if not(Result[I] in LeadBytes) then begin + {$ENDIF} + if Result[I] = '&' then + Delete(Result, I, 1); + Inc(I); + {$IFNDEF JR_WIDESTR} + end + else + Inc(I, 2); + {$ENDIF} + end; +end; + +function EscapeAmpersands(const S: String): String; +{ Replaces any '&' characters with '&&' } +var + I: Integer; +begin + Result := S; + I := 1; + while I <= Length(Result) do begin + {$IFNDEF JR_WIDESTR} + if not(Result[I] in LeadBytes) then begin + {$ENDIF} + if Result[I] = '&' then begin + Inc(I); + Insert('&', Result, I); + end; + Inc(I); + {$IFNDEF JR_WIDESTR} + end + else + Inc(I, 2); + {$ENDIF} + end; +end; + +function StripTrailingPunctuation(const S: String): String; +{ Removes any colon (':') or ellipsis ('...') from the end of S and returns + the resulting string } +var + L: Integer; +begin + Result := S; + L := Length(Result); + if (L > 1) and (Result[L] = ':') {$IFNDEF JR_WIDESTR} and (ByteType(Result, L) = mbSingleByte) {$ENDIF} then + SetLength(Result, L-1) + else if (L > 3) and (Result[L-2] = '.') and (Result[L-1] = '.') and + (Result[L] = '.') {$IFNDEF JR_WIDESTR} and (ByteType(Result, L-2) = mbSingleByte) {$ENDIF} then + SetLength(Result, L-3); +end; + +function GetTextWidth(const DC: HDC; S: String; const Prefix: Boolean): Integer; +{ Returns the width of the specified string using the font currently selected + into DC. If Prefix is True, it first removes "&" characters as necessary. } +var + Size: TSize; +begin + { This procedure is 10x faster than using DrawText with the DT_CALCRECT flag } + if Prefix then + S := StripAccelChars(S); + GetTextExtentPoint32Str(DC, S, Size); + Result := Size.cx; +end; + +procedure ProcessPaintMessages; +{ Dispatches all pending WM_PAINT messages. In effect, this is like an + 'UpdateWindow' on all visible windows } +var + Msg: TMsg; +begin + while PeekMessage(Msg, 0, WM_PAINT, WM_PAINT, PM_NOREMOVE) do begin + case Integer(GetMessage(Msg, 0, WM_PAINT, WM_PAINT)) of + -1: Break; { if GetMessage failed } + 0: begin + { Repost WM_QUIT messages } + PostQuitMessage(ClipToLongint(Msg.wParam)); + Break; + end; + end; + DispatchMessage(Msg); + end; +end; + +procedure RemoveMessages(const AMin, AMax: Integer); +{ Removes any messages with the specified ID from the queue } +var + Msg: TMsg; +begin + while PeekMessage(Msg, 0, AMin, AMax, PM_REMOVE) do begin + if Msg.message = WM_QUIT then begin + { Repost WM_QUIT messages } + PostQuitMessage(ClipToLongint(Msg.wParam)); + Break; + end; + end; +end; + +procedure SelectNCUpdateRgn(Wnd: HWND; DC: HDC; Rgn: HRGN); +var + R: TRect; + NewClipRgn: HRGN; +begin + if (Rgn <> 0) and (Rgn <> 1) then begin + GetWindowRect(Wnd, R); + if SelectClipRgn(DC, Rgn) = ERROR then begin + NewClipRgn := CreateRectRgnIndirect(R); + SelectClipRgn(DC, NewClipRgn); + DeleteObject(NewClipRgn); + end; + OffsetClipRgn(DC, -R.Left, -R.Top); + end; +end; + +function AddToList(var List: TList; Item: TObject): Boolean; +{ Returns True if Item didn't already exist in the list } +begin + if List = nil then + List := TList.Create; + Result := List.IndexOf(Item) = -1; + if Result then + List.Add(Item); +end; + +function AddToFrontOfList(var List: TList; Item: TObject): Boolean; +{ Returns True if Item didn't already exist in the list } +begin + if List = nil then + List := TList.Create; + Result := List.IndexOf(Item) = -1; + if Result then + List.Insert(0, Item); +end; + +procedure RemoveFromList(var List: TList; Item: TObject); +begin + if Assigned(List) then begin + List.Remove(Item); + if List.Count = 0 then begin + List.Free; + List := nil; + end; + end; +end; + +const + DefaultMenuShowDelay = 400; +{$IFNDEF CLR} +var + RegMenuShowDelay: Integer; + RegMenuShowDelayInited: BOOL = False; +function GetMenuShowDelay: Integer; + function ReadMenuShowDelayFromRegistry: Integer; + var + K: HKEY; + Typ, DataSize: DWORD; + Data: array[0..31] of Char; + Res: Longint; + E: Integer; + begin + Result := DefaultMenuShowDelay; + if RegOpenKeyEx(HKEY_CURRENT_USER, 'Control Panel\Desktop', 0, + KEY_QUERY_VALUE, K) = ERROR_SUCCESS then begin + DataSize := SizeOf(Data); + Res := RegQueryValueEx(K, 'MenuShowDelay', nil, @Typ, @Data, @DataSize); + RegCloseKey(K); + if Res <> ERROR_FILE_NOT_FOUND then begin + if (Res <> ERROR_SUCCESS) or (Typ <> REG_SZ) then + Result := 0 + else begin + Val(Data, Result, E); + if E <> 0 then Result := 0; + end; + end; + end; + end; +begin + if Lo(GetVersion) >= 4 then begin + if not SystemParametersInfo(106{SPI_GETMENUSHOWDELAY}, 0, @Result, 0) then begin + { SPI_GETMENUSHOWDELAY is only supported by Windows NT 4.0 and Windows 98. + On Windows 95, it must use the registry to retrieve this setting. } + if not RegMenuShowDelayInited then begin + RegMenuShowDelay := ReadMenuShowDelayFromRegistry; + InterlockedExchange(Integer(RegMenuShowDelayInited), Ord(True)); + end; + Result := RegMenuShowDelay; + end; + if Result < 0 then Result := 0; + end + else + Result := DefaultMenuShowDelay; +end; +{$ELSE} +function GetMenuShowDelay: Integer; +begin + { Since .NET requires Windows 98 or later, we can assume that + SPI_GETMENUSHOWDELAY is available } + if not SystemParametersInfo(SPI_GETMENUSHOWDELAY, 0, Result, 0) then + Result := DefaultMenuShowDelay; +end; +{$ENDIF} + +function AreFlatMenusEnabled: Boolean; +{ Returns True if "flat menus" are enabled. Always returns False on pre-XP + Windows versions. } +const + SPI_GETFLATMENU = $1022; +begin + { Interestingly, on Windows 2000, SystemParametersInfo(SPI_GETFLATMENU, ...) + succeeds and can return True in pvParam^ if the proper bit is set in + UserPreferencesMask. Since flat menus are not really used on Windows + 2000, call IsWindowsXP first to see if we're running at least XP. } + Result := IsWindowsXP and GetSystemParametersInfoBool(SPI_GETFLATMENU, False); +end; + +function AreKeyboardCuesEnabled: Boolean; +{ Returns True if "keyboard cues" are enabled. Always returns True on + pre-2000 Windows versions. } +const + SPI_GETKEYBOARDCUES = $100A; +begin + Result := (Win32MajorVersion < 5) or + GetSystemParametersInfoBool(SPI_GETKEYBOARDCUES, True); +end; + +function CreateFrameRectRgn(const ARect: TRect; const ASize: TSize): HRGN; +var + R: TRect; + InsideRgn: HRGN; +begin + if IsRectEmpty(ARect) then begin + { The rectangle is empty, so simply return a normalized empty region } + SetRectEmpty(R); + Result := CreateRectRgnIndirect(R); + end + else begin + Result := CreateRectRgnIndirect(ARect); + if Result <> 0 then begin + { Now hollow out the resulting region so that only a frame is left } + R := ARect; + InflateRect(R, -ASize.cx, -ASize.cy); + { If ASize is greater than the size of ARect, then InflateRect will + return a non-normalized rectangle larger than ARect. Test for this + condition by calling IsRectEmpty. } + if not IsRectEmpty(R) then begin + InsideRgn := CreateRectRgnIndirect(R); + if InsideRgn <> 0 then begin + CombineRgn(Result, Result, InsideRgn, RGN_XOR); + DeleteObject(InsideRgn); + end; + end; + end; + end; +end; + +procedure DrawInvertRect(const DC: HDC; const NewRect, OldRect: TRect; + const NewSize, OldSize: TSize; const Brush: HBRUSH); +{ Draws a dragging outline, hiding the old one if necessary. NewRect and/or + OldRect may be empty. } +var + SaveIndex: Integer; + UpdateRgn, OldRgn: HRGN; + R: TRect; +begin + { Create region containing the new rectangle } + UpdateRgn := CreateFrameRectRgn(NewRect, NewSize); + if UpdateRgn <> 0 then begin + { Combine that region with a region containing the old rectangle } + OldRgn := CreateFrameRectRgn(OldRect, OldSize); + if OldRgn <> 0 then begin + CombineRgn(UpdateRgn, OldRgn, UpdateRgn, RGN_XOR); + DeleteObject(OldRgn); + end; + + { Save the DC state so that the clipping region can be restored } + SaveIndex := SaveDC(DC); + try + { Draw the updated region } + SelectClipRgn(DC, UpdateRgn); + GetClipBox(DC, R); + SelectObject(DC, Brush); + PatBlt(DC, R.Left, R.Top, R.Right-R.Left, R.Bottom-R.Top, PATINVERT); + finally + RestoreDC(DC, SaveIndex); + end; + + DeleteObject(UpdateRgn); + end; +end; + +function CreateMonoBitmap(const AWidth, AHeight: Integer; + const ABits: array of Byte): HBITMAP; +begin + {$IFNDEF CLR} + Result := CreateBitmap(AWidth, AHeight, 1, 1, @ABits[0]); + {$ELSE} + { For some reason there isn't an overloaded version of CreateBitmap that + takes a TBytes parameter, so we have to use two calls } + Result := CreateBitmap(AWidth, AHeight, 1, 1, nil); + SetBitmapBits(Result, Length(ABits), ABits); + {$ENDIF} +end; + +function CreateHalftoneBrush: HBRUSH; +const + GrayPattern: array[0..15] of Byte = ( + $55, 0, $AA, 0, $55, 0, $AA, 0, $55, 0, $AA, 0, $55, 0, $AA, 0); +var + GrayBitmap: HBITMAP; +begin + GrayBitmap := CreateMonoBitmap(8, 8, GrayPattern); + Result := CreatePatternBrush(GrayBitmap); + DeleteObject(GrayBitmap); +end; + +procedure DrawHalftoneInvertRect(const DC: HDC; const NewRect, OldRect: TRect; + const NewSize, OldSize: TSize); +var + Brush: HBRUSH; +begin + Brush := CreateHalftoneBrush; + try + DrawInvertRect(DC, NewRect, OldRect, NewSize, OldSize, Brush); + finally + DeleteObject(Brush); + end; +end; + +var + GradientFillAvailable: Boolean; +{$IFNDEF CLR} +type + { Note: TTriVertex is unusable on Delphi 7 and earlier (COLOR16 is + misdeclared as a Shortint instead of a Word). } + TNewTriVertex = record + x: Longint; + y: Longint; + Red: Word; + Green: Word; + Blue: Word; + Alpha: Word; + end; +var + GradientFillFunc: function(DC: HDC; var Vertex: TNewTriVertex; + NumVertex: ULONG; Mesh: Pointer; NumMesh, Mode: ULONG): BOOL; stdcall; +{$ENDIF} + +procedure InitGradientFillFunc; +{$IFNDEF CLR} +var + M: HMODULE; +{$ENDIF} +begin + if (Win32MajorVersion >= 5) or + ((Win32MajorVersion = 4) and (Win32MinorVersion >= 10)) then begin + {$IFNDEF CLR} + M := {$IFDEF JR_D5} SafeLoadLibrary {$ELSE} LoadLibrary {$ENDIF} ('msimg32.dll'); + if M <> 0 then begin + GradientFillFunc := GetProcAddress(M, 'GradientFill'); + if Assigned(GradientFillFunc) then + GradientFillAvailable := True; + end; + {$ELSE} + GradientFillAvailable := True; + {$ENDIF} + end; +end; + +function IsFillRectWithGradientAvailable: Boolean; +begin + Result := GradientFillAvailable; +end; + +procedure FillRectWithGradient(const DC: HDC; const R: TRect; + const StartColor, EndColor: TColorRef; const HorizontalDirection: Boolean); +var + Vertexes: array[0..1] of {$IFNDEF CLR} TNewTriVertex {$ELSE} TTriVertex {$ENDIF}; + GradientRect: TGradientRect; + Mode: ULONG; +begin + if not GradientFillAvailable then + Exit; + Vertexes[0].x := R.Left; + Vertexes[0].y := R.Top; + Vertexes[0].Red := GetRValue(StartColor) shl 8; + Vertexes[0].Blue := GetBValue(StartColor) shl 8; + Vertexes[0].Green := GetGValue(StartColor) shl 8; + Vertexes[0].Alpha := 0; + Vertexes[1].x := R.Right; + Vertexes[1].y := R.Bottom; + Vertexes[1].Red := GetRValue(EndColor) shl 8; + Vertexes[1].Blue := GetBValue(EndColor) shl 8; + Vertexes[1].Green := GetGValue(EndColor) shl 8; + Vertexes[1].Alpha := 0; + GradientRect.UpperLeft := 0; + GradientRect.LowerRight := 1; + if HorizontalDirection then + Mode := GRADIENT_FILL_RECT_H + else + Mode := GRADIENT_FILL_RECT_V; + {$IFNDEF CLR} + GradientFillFunc(DC, Vertexes[0], 2, @GradientRect, 1, Mode); + {$ELSE} + GradientFill(DC, Vertexes, 2, GradientRect, 1, Mode); + {$ENDIF} +end; + +procedure DrawSmallWindowCaption(const Wnd: HWND; const DC: HDC; + const ARect: TRect; const AText: String; const AActive: Boolean); +{ Draws a (non-themed) small window caption bar. + On Windows Vista, a custom routine is used to work around an ugly bug in + DrawCaption that causes the text to be painted at the wrong coordinates. + Note: The value of the AText parameter may be ignored depending on which + routine is chosen. } + + procedure FillBackground; + const + CaptionBkColors: array[Boolean, Boolean] of Integer = + ((COLOR_INACTIVECAPTION, COLOR_ACTIVECAPTION), + (COLOR_GRADIENTINACTIVECAPTION, COLOR_GRADIENTACTIVECAPTION)); + var + LeftColor, RightColor: TColorRef; + begin + if GetSystemParametersInfoBool(SPI_GETGRADIENTCAPTIONS, False) and + IsFillRectWithGradientAvailable then begin + LeftColor := GetSysColor(CaptionBkColors[False, AActive]); + RightColor := GetSysColor(CaptionBkColors[True, AActive]); + if LeftColor <> RightColor then begin + FillRectWithGradient(DC, ARect, LeftColor, RightColor, True); + Exit; + end; + end; + FillRect(DC, ARect, GetSysColorBrush(CaptionBkColors[False, AActive])); + end; + +const + CaptionTextColors: array[Boolean] of Integer = + (COLOR_INACTIVECAPTIONTEXT, COLOR_CAPTIONTEXT); +var + Flags: UINT; + TextRect: TRect; + NonClientMetrics: TNonClientMetrics; + CaptionFont, SaveFont: HFONT; + SaveBkMode: Integer; + SaveTextColor: TColorRef; +begin + if ARect.Right <= ARect.Left then + Exit; + + { Prior to Windows Vista, continue to use DrawCaption. Don't want to risk + introducing new bugs on old OSes, plus on Windows 98, it's several times + faster than our custom routine. } + if Win32MajorVersion < 6 then begin + Flags := DC_TEXT or DC_SMALLCAP; + if AActive then + Flags := Flags or DC_ACTIVE; + if GetSystemParametersInfoBool(SPI_GETGRADIENTCAPTIONS, False) then + Flags := Flags or DC_GRADIENT; + DrawCaption(Wnd, DC, ARect, Flags); + end + else begin + FillBackground; + TextRect := ARect; + Inc(TextRect.Left, GetSystemMetrics(SM_CXEDGE)); + if (TextRect.Right > TextRect.Left) and + GetSystemNonClientMetrics(NonClientMetrics) then begin + CaptionFont := CreateFontIndirect(NonClientMetrics.lfSmCaptionFont); + if CaptionFont <> 0 then begin + SaveFont := SelectObject(DC, CaptionFont); + SaveBkMode := SetBkMode(DC, TRANSPARENT); + SaveTextColor := SetTextColor(DC, GetSysColor(CaptionTextColors[AActive])); + try + DrawTextStr(DC, AText, TextRect, DT_SINGLELINE or DT_NOPREFIX or + DT_VCENTER or DT_END_ELLIPSIS); + finally + SetTextColor(DC, SaveTextColor); + SetBkMode(DC, SaveBkMode); + SelectObject(DC, SaveFont); + DeleteObject(CaptionFont); + end; + end; + end; + end; +end; + +procedure DoubleBufferedRepaint(const Wnd: HWND); +var + ClientRect, ClipRect, R: TRect; + WndDC, BmpDC: HDC; + Bmp: HBITMAP; + SaveIndex: Integer; +begin + if IsWindowVisible(Wnd) and GetClientRect(Wnd, ClientRect) and + not IsRectEmpty(ClientRect) then begin + ValidateRect(Wnd, nil); + BmpDC := 0; + Bmp := 0; + WndDC := GetDC(Wnd); + if WndDC <> 0 then begin + try + { Only repaint the area that intersects the clipping rectangle } + if (GetClipBox(WndDC, ClipRect) <> Windows.ERROR) and + IntersectRect(R, ClientRect, ClipRect) then begin + Bmp := CreateCompatibleBitmap(WndDC, R.Right - R.Left, R.Bottom - R.Top); + if Bmp <> 0 then begin + BmpDC := CreateCompatibleDC(WndDC); + if BmpDC <> 0 then begin + SelectObject(BmpDC, Bmp); + SaveIndex := SaveDC(BmpDC); + SetWindowOrgEx(BmpDC, R.Left, R.Top, nil); + SendMessage(Wnd, WM_ERASEBKGND, WPARAM(BmpDC), 0); + SendMessage(Wnd, WM_PAINT, WPARAM(BmpDC), 0); + RestoreDC(BmpDC, SaveIndex); + BitBlt(WndDC, R.Left, R.Top, R.Right - R.Left, R.Bottom - R.Top, + BmpDC, 0, 0, SRCCOPY); + Exit; + end; + end; + end; + finally + if BmpDC <> 0 then DeleteDC(BmpDC); + if Bmp <> 0 then DeleteObject(Bmp); + ReleaseDC(Wnd, WndDC); + end; + end; + end; + { Fall back to invalidating if we didn't or couldn't double-buffer } + InvalidateRect(Wnd, nil, True); +end; + +{$IFNDEF CLR} +function MethodsEqual(const M1, M2: TMethod): Boolean; +begin + Result := (M1.Code = M2.Code) and (M1.Data = M2.Data); +end; +{$ENDIF} + +function GetRectOfPrimaryMonitor(const WorkArea: Boolean): TRect; +begin + if not WorkArea or not SystemParametersInfo(SPI_GETWORKAREA, 0, + {$IFNDEF CLR}@{$ENDIF} Result, 0) then + Result := Rect(0, 0, Screen.Width, Screen.Height); +end; + +{$IFNDEF CLR} +{ On Delphi for Win32, we don't use the MultiMon unit because its stubs for + MonitorFromRect and MonitorFromPoint are seriously bugged on Delphi 4. } +type + HMONITOR = type THandle; + TMonitorInfo = record + cbSize: DWORD; + rcMonitor: TRect; + rcWork: TRect; + dwFlags: DWORD; + end; +const + MONITOR_DEFAULTTONEAREST = $2; +var + MultiMonApis: record + MonitorFromRect: function(const lprcScreenCoords: TRect; dwFlags: DWORD): HMONITOR; stdcall; + MonitorFromPoint: function(ptScreenCoords: TPoint; dwFlags: DWORD): HMONITOR; stdcall; + MonitorFromWindow: function(hWnd: HWND; dwFlags: DWORD): HMONITOR; stdcall; + GetMonitorInfo: function(hMonitor: HMONITOR; var lpMonitorInfo: TMonitorInfo): BOOL; stdcall; + end; + MultiMonApisAvailable: Boolean; + +procedure InitMultiMonApis; +var + User32Handle: THandle; +begin + User32Handle := GetModuleHandle(user32); + MultiMonApis.MonitorFromRect := GetProcAddress(User32Handle, 'MonitorFromRect'); + MultiMonApis.MonitorFromPoint := GetProcAddress(User32Handle, 'MonitorFromPoint'); + MultiMonApis.MonitorFromWindow := GetProcAddress(User32Handle, 'MonitorFromWindow'); + MultiMonApis.GetMonitorInfo := GetProcAddress(User32Handle, 'GetMonitorInfoA'); + MultiMonApisAvailable := Assigned(MultiMonApis.MonitorFromRect) and + Assigned(MultiMonApis.MonitorFromPoint) and + Assigned(MultiMonApis.MonitorFromWindow) and + Assigned(MultiMonApis.GetMonitorInfo); +end; +{$ENDIF} + +function UsingMultipleMonitors: Boolean; +{ Returns True if the system has more than one display monitor configured. } +const + SM_CMONITORS = 80; +begin + { Note: On a single monitor Windows 95 or NT 4 system, GetSystemMetrics will + return 0 since those OSes do not support multiple monitors. On later + versions it returns 1. } + Result := {$IFNDEF CLR} MultiMonApisAvailable and {$ENDIF} + (GetSystemMetrics(SM_CMONITORS) > 1); +end; + +function GetRectOfMonitor(const M: HMONITOR; const WorkArea: Boolean; + var R: TRect): Boolean; +var + MonitorInfo: TMonitorInfo; +begin + {$IFNDEF CLR} + MonitorInfo.cbSize := SizeOf(MonitorInfo); + {$ELSE} + MonitorInfo.cbSize := Marshal.SizeOf(TypeOf(TMonitorInfo)); + {$ENDIF} + Result := {$IFNDEF CLR}MultiMonApis.{$ENDIF} GetMonitorInfo(M, MonitorInfo); + if Result then begin + if not WorkArea then + R := MonitorInfo.rcMonitor + else + R := MonitorInfo.rcWork; + end; +end; + +function GetRectOfMonitorContainingRect(const R: TRect; + const WorkArea: Boolean): TRect; +{ Returns the work area of the monitor which the rectangle R intersects with + the most, or the monitor nearest R if no monitors intersect. } +var + M: HMONITOR; +begin + if UsingMultipleMonitors then begin + M := {$IFNDEF CLR}MultiMonApis.{$ENDIF} MonitorFromRect(R, MONITOR_DEFAULTTONEAREST); + if GetRectOfMonitor(M, WorkArea, Result) then + Exit; + end; + Result := GetRectOfPrimaryMonitor(WorkArea); +end; + +function GetRectOfMonitorContainingPoint(const P: TPoint; + const WorkArea: Boolean): TRect; +{ Returns the screen area of the monitor containing the point P, or the monitor + nearest P if P isn't in any monitor's work area. } +var + M: HMONITOR; +begin + if UsingMultipleMonitors then begin + M := {$IFNDEF CLR}MultiMonApis.{$ENDIF} MonitorFromPoint(P, MONITOR_DEFAULTTONEAREST); + if GetRectOfMonitor(M, WorkArea, Result) then + Exit; + end; + Result := GetRectOfPrimaryMonitor(WorkArea); +end; + +function GetRectOfMonitorContainingWindow(const W: HWND; + const WorkArea: Boolean): TRect; +var + M: HMONITOR; +begin + if UsingMultipleMonitors then begin + M := {$IFNDEF CLR}MultiMonApis.{$ENDIF} MonitorFromWindow(W, MONITOR_DEFAULTTONEAREST); + if GetRectOfMonitor(M, WorkArea, Result) then + Exit; + end; + Result := GetRectOfPrimaryMonitor(WorkArea); +end; + +{$IFNDEF CLR} +var + TrackMouseEventInited: BOOL; + TrackMouseEventFunc: function(var EventTrack: TTrackMouseEvent): BOOL; stdcall; + +procedure InitTrackMouseEvent; +var + TrackMouseEventComCtlModule: THandle; +begin + { First look for TrackMouseEvent which is available on Windows 98 & NT 4 only. + If it doesn't exist, look for _TrackMouseEvent which is available on + Windows 95 if IE 3.0 or later is installed. } + if not TrackMouseEventInited then begin + TrackMouseEventFunc := GetProcAddress(GetModuleHandle(user32), + 'TrackMouseEvent'); + if @TrackMouseEventFunc = nil then begin + TrackMouseEventComCtlModule := + {$IFDEF JR_D5} SafeLoadLibrary {$ELSE} LoadLibrary {$ENDIF} (comctl32); + if TrackMouseEventComCtlModule <> 0 then + TrackMouseEventFunc := GetProcAddress(TrackMouseEventComCtlModule, + '_TrackMouseEvent'); + end; + InterlockedExchange(Integer(TrackMouseEventInited), Ord(True)); + end; +end; +{$ELSE} +procedure InitTrackMouseEvent; +begin +end; +{$ENDIF} + +function CallTrackMouseEvent(const Wnd: HWND; const Flags: DWORD): Boolean; +var + Track: TTrackMouseEvent; +begin + {$IFNDEF CLR} + Result := False; + if Assigned(TrackMouseEventFunc) then begin + Track.cbSize := SizeOf(Track); + Track.dwFlags := Flags; + Track.hwndTrack := Wnd; + Track.dwHoverTime := 0; + Result := TrackMouseEventFunc(Track); + end; + {$ELSE} + { .NET doesn't run on 95, so we can assume TrackMouseEvent is available } + Track.cbSize := Marshal.SizeOf(TypeOf(TTrackMouseEvent)); + Track.dwFlags := Flags; + Track.hwndTrack := Wnd; + Track.dwHoverTime := 0; + Result := TrackMouseEvent(Track); + {$ENDIF} +end; + +{$IFNDEF CLR} +var + LockSetForegroundWindowFunc: function(uLockCode: UINT): BOOL; stdcall; +{$ELSE} +[SuppressUnmanagedCodeSecurity, DllImport(user32, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'LockSetForegroundWindow')] +function LockSetForegroundWindowFunc(uLockCode: UINT): BOOL; external; +{$ENDIF} + +procedure CallLockSetForegroundWindow(const ALock: Boolean); +const + LSFW_LOCK = 1; + LSFW_UNLOCK = 2; +begin + {$IFNDEF CLR} + if Assigned(LockSetForegroundWindowFunc) then begin + {$ELSE} + if (Win32MajorVersion >= 5) or + ((Win32MajorVersion = 4) and (Win32MinorVersion >= 90)) then begin + {$ENDIF} + if ALock then + LockSetForegroundWindowFunc(LSFW_LOCK) + else + LockSetForegroundWindowFunc(LSFW_UNLOCK); + end; +end; + +{$IFNDEF JR_D5} +procedure FreeAndNil(var Obj); +var + P: TObject; +begin + P := TObject(Obj); + TObject(Obj) := nil; + P.Free; +end; +{$ENDIF} + +{$IFNDEF JR_D6} +procedure RaiseLastOSError; +begin + RaiseLastWin32Error; +end; +{$ENDIF} + +{$IFDEF CLR} +{ On .NET, when calling DrawText, GetTextExtentPoint32, or TextOut we can't + rely on the marshaller's automatic A/W function selection because they take + a character count. If we passed the result of Length(), as the VCL + incorrectly does in many places, the behavior would be incorrect on DBCS + Windows 9x/Me systems because when a Unicode string is downconverted to ANSI + the character count can increase (i.e. one Unicode character can become two + ANSI characters). + Below we define our own "A" function prototypes that take byte array + parameters, allowing us to pass the result of AnsiEncoding.GetBytes straight + to the functions without any conversion. (Borland's "A" prototypes use + "string" type parameters.) } +[SuppressUnmanagedCodeSecurity, DllImport(user32, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'DrawTextA')] +function _DrawTextA(hDC: HDC; [in] lpString: TBytes; nCount: Integer; + var lpRect: TRect; uFormat: UINT): Integer; external; +[SuppressUnmanagedCodeSecurity, DllImport(gdi32, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'GetTextExtentPoint32A')] +function _GetTextExtentPoint32A(DC: HDC; [in] Str: TBytes; Count: Integer; + out Size: TSize): BOOL; external; +[SuppressUnmanagedCodeSecurity, DllImport(gdi32, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'TextOutA')] +function _TextOutA(DC: HDC; X, Y: Integer; [in] Str: TBytes; + Count: Integer): BOOL; external; +{$ENDIF} + +function DrawTextStr(const DC: HDC; const AText: String; var ARect: TRect; + const AFormat: UINT): Integer; +{$IFNDEF CLR} +begin + Result := DrawText(DC, PChar(AText), Length(AText), ARect, AFormat); +end; +{$ELSE} +var + AnsiStr: TBytes; +begin + if Marshal.SystemDefaultCharSize = 1 then begin + AnsiStr := AnsiEncoding.GetBytes(AText); + Result := _DrawTextA(DC, AnsiStr, Length(AnsiStr), ARect, AFormat); + end + else + Result := DrawTextW(DC, AText, Length(AText), ARect, AFormat); +end; +{$ENDIF} + +function GetTextExtentPoint32Str(const DC: HDC; const AText: String; + out ASize: TSize): BOOL; +{$IFNDEF CLR} +begin + Result := GetTextExtentPoint32(DC, PChar(AText), Length(AText), ASize); +end; +{$ELSE} +var + AnsiStr: TBytes; +begin + if Marshal.SystemDefaultCharSize = 1 then begin + AnsiStr := AnsiEncoding.GetBytes(AText); + Result := _GetTextExtentPoint32A(DC, AnsiStr, Length(AnsiStr), ASize); + end + else + Result := GetTextExtentPoint32W(DC, AText, Length(AText), ASize); +end; +{$ENDIF} + +function TextOutStr(const DC: HDC; const X, Y: Integer; + const AText: String): BOOL; +{$IFNDEF CLR} +begin + Result := TextOut(DC, X, Y, PChar(AText), Length(AText)); +end; +{$ELSE} +var + AnsiStr: TBytes; +begin + if Marshal.SystemDefaultCharSize = 1 then begin + AnsiStr := AnsiEncoding.GetBytes(AText); + Result := _TextOutA(DC, X, Y, AnsiStr, Length(AnsiStr)); + end + else + Result := TextOutW(DC, X, Y, AText, Length(AText)); +end; +{$ENDIF} + +threadvar + FontExistsResult: Boolean; + +{$IFNDEF CLR} +function FontExistsCallback(const lplf: TLogFont; const lptm: TTextMetric; + dwType: DWORD; lpData: LPARAM): Integer; stdcall; +{$ELSE} +function FontExistsCallback([in] var lplf: TLogFont; [in] var lptm: TTextMetric; + dwType: DWORD; lpData: LPARAM): Integer; +{$ENDIF} +begin + FontExistsResult := True; + Result := 0; +end; + +function FontExists(const DC: HDC; const FaceName: String): Boolean; +begin + FontExistsResult := False; + EnumFonts(DC, {$IFNDEF CLR}PChar{$ENDIF}(FaceName), @FontExistsCallback, + {$IFNDEF CLR} nil {$ELSE} 0 {$ENDIF}); + Result := FontExistsResult; +end; + +function CreateRotatedFont(DC: HDC): HFONT; +{ Creates a font based on the DC's current font, but rotated 270 degrees } +var + LogFont: TLogFont; + TM: TTextMetric; + VerticalFontName: String; +begin + if GetObject(GetCurrentObject(DC, OBJ_FONT), + {$IFNDEF CLR} + SizeOf(LogFont), @LogFont + {$ELSE} + Marshal.SizeOf(TypeOf(TLogFont)), LogFont + {$ENDIF} + ) = 0 then begin + { just in case... } + Result := 0; + Exit; + end; + LogFont.lfEscapement := 2700; + LogFont.lfOrientation := 2700; + LogFont.lfOutPrecision := OUT_TT_ONLY_PRECIS; { needed for Win9x } + + { Don't let a random TrueType font be substituted when MS Sans Serif or + Microsoft Sans Serif are used. On Windows 2000 and later, hard-code Tahoma + because Arial can't display Japanese or Thai Unicode characters (on Windows + 2000 at least). On earlier versions, hard-code Arial since NT 4.0 doesn't + ship with Tahoma, and 9x doesn't do Unicode. } + {$IFNDEF CLR} + if (StrIComp(LogFont.lfFaceName, 'MS Sans Serif') = 0) or + (StrIComp(LogFont.lfFaceName, 'Microsoft Sans Serif') = 0) then begin + if Win32MajorVersion >= 5 then + StrPCopy(LogFont.lfFaceName, 'Tahoma') + else + StrPCopy(LogFont.lfFaceName, 'Arial'); + {$ELSE} + if SameText(LogFont.lfFaceName, 'MS Sans Serif', loInvariantLocale) or + SameText(LogFont.lfFaceName, 'Microsoft Sans Serif', loInvariantLocale) then begin + if Win32MajorVersion >= 5 then + LogFont.lfFaceName := 'Tahoma' + else + LogFont.lfFaceName := 'Arial'; + {$ENDIF} + { Set lfHeight to the actual height of the current font. This is needed + to work around a Windows 98 issue: on a clean install of the OS, + SPI_GETNONCLIENTMETRICS returns -5 for lfSmCaptionFont.lfHeight. This is + wrong; it should return -11 for an 8 pt font. With normal, unrotated text + this actually displays correctly, since MS Sans Serif doesn't support + sizes below 8 pt. However, when we change to a TrueType font like Arial, + this becomes a problem because it'll actually create a font that small. } + if GetTextMetrics(DC, TM) then begin + { If the original height was negative, keep it negative } + if LogFont.lfHeight <= 0 then + LogFont.lfHeight := -(TM.tmHeight - TM.tmInternalLeading) + else + LogFont.lfHeight := TM.tmHeight; + end; + end; + + { Use a vertical font if available so that Asian characters aren't drawn + sideways } + VerticalFontName := String('@') + LogFont.lfFaceName; + if FontExists(DC, VerticalFontName) then begin + {$IFNDEF CLR} + StrPLCopy(LogFont.lfFaceName, VerticalFontName, + (SizeOf(LogFont.lfFaceName) div SizeOf(LogFont.lfFaceName[0])) - 1); + {$ELSE} + LogFont.lfFaceName := VerticalFontName; + {$ENDIF} + end; + + Result := CreateFontIndirect(LogFont); +end; + +procedure DrawRotatedText(const DC: HDC; AText: String; const ARect: TRect; + const AFormat: Cardinal); +{ Like DrawText, but draws the text at a 270 degree angle. + The only format flag this function respects is DT_HIDEPREFIX. Text is always + drawn centered. } +var + RotatedFont, SaveFont: HFONT; + TextMetrics: TTextMetric; + X, Y, P, I, SU, FU: Integer; + SaveAlign: UINT; + SavePen, Pen: HPEN; +begin + RotatedFont := CreateRotatedFont(DC); + SaveFont := SelectObject(DC, RotatedFont); + + GetTextMetrics(DC, TextMetrics); + X := ARect.Left + ((ARect.Right - ARect.Left) - TextMetrics.tmHeight) div 2; + Y := ARect.Top + ((ARect.Bottom - ARect.Top) - GetTextWidth(DC, AText, True)) div 2; + + { Find the index of the character that should be underlined. Delete '&' + characters from the string. Like DrawText, only the last prefixed character + will be underlined. } + P := 0; + I := 1; + while I <= Length(AText) do begin + {$IFNDEF JR_WIDESTR} + if AText[I] in LeadBytes then + Inc(I) + else + {$ENDIF} + if AText[I] = '&' then begin + Delete(AText, I, 1); + { If the '&' was the last character, don't underline anything } + if I > Length(AText) then + P := 0 + else if AText[I] <> '&' then + P := I; + end; + Inc(I); + end; + + SaveAlign := SetTextAlign(DC, TA_BOTTOM); + TextOutStr(DC, X, Y, AText); + SetTextAlign(DC, SaveAlign); + { Underline } + if (P > 0) and (AFormat and DT_HIDEPREFIX = 0) then begin + SU := GetTextWidth(DC, Copy(AText, 1, P-1), False); + FU := SU + GetTextWidth(DC, AText[P], False); + Inc(X, TextMetrics.tmDescent - 2); + Pen := CreatePen(PS_SOLID, 1, GetTextColor(DC)); + SavePen := SelectObject(DC, Pen); + MoveToEx(DC, X, Y + SU, nil); + LineTo(DC, X, Y + FU); + SelectObject(DC, SavePen); + DeleteObject(Pen); + end; + + SelectObject(DC, SaveFont); + DeleteObject(RotatedFont); +end; + +function NeedToPlaySound(const Alias: String): Boolean; +{ This function checks the registry to see if the specified sound event alias + is assigned to a file. + The purpose of having this function is so it can avoid calls to PlaySound if + possible, because on Windows 2000 there is an annoying 1/3 second delay on + the first call to PlaySound. + Windows Explorer actually uses this same technique when playing sounds for + the Start menu. } +var + KeyName: String; + K: HKEY; + {$IFNDEF CLR} + Data: array[0..3] of WideChar; + {$ELSE} + Data: TBytes; + DataType: DWORD; + {$ENDIF} + DataSize: DWORD; + ErrorCode: Longint; +begin + if (Win32MajorVersion < 5) or (Win32Platform <> VER_PLATFORM_WIN32_NT) then begin + { No need to check pre-Windows 2000 versions since their PlaySound + functions don't have the delay; always return True. } + Result := True; + Exit; + end; + Result := False; + KeyName := 'AppEvents\Schemes\Apps\.Default\' + Alias + '\.Current'; + if RegOpenKeyEx(HKEY_CURRENT_USER, {$IFNDEF CLR}PChar{$ENDIF}(KeyName), + 0, KEY_QUERY_VALUE, K) = ERROR_SUCCESS then begin + try + {$IFNDEF CLR} + DataSize := SizeOf(Data); + { Note: Use the 'W' version of RegQueryValueEx for more speed } + ErrorCode := RegQueryValueExW(K, nil, nil, nil, @Data, @DataSize); + if ((ErrorCode = ERROR_SUCCESS) and (Data[0] <> #0)) or + (ErrorCode = ERROR_MORE_DATA) then + Result := True; + {$ELSE} + DataSize := 4 * SizeOf(WideChar); + SetLength(Data, DataSize); + ErrorCode := RegQueryValueExW(K, nil, nil, DataType, Data, DataSize); + if ((ErrorCode = ERROR_SUCCESS) and (Data[0] or Data[1] <> 0)) or + (ErrorCode = ERROR_MORE_DATA) then + Result := True; + {$ENDIF} + finally + RegCloseKey(K); + end; + end; +end; + +procedure PlaySystemSound(const Alias: String); +const + SND_SYSTEM = $00200000; +var + Flags: DWORD; +begin + Flags := SND_ALIAS or SND_ASYNC or SND_NODEFAULT; + if Win32Platform <> VER_PLATFORM_WIN32_NT then + Flags := Flags or SND_NOSTOP; { On 9x, native menus' sounds are NOSTOP } + if Win32MajorVersion >= 6 then + Flags := Flags or SND_SYSTEM; + PlaySound({$IFNDEF CLR}PChar{$ENDIF}(Alias), 0, Flags); +end; + +function Max(A, B: Integer): Integer; +begin + if A >= B then + Result := A + else + Result := B; +end; + +function Min(A, B: Integer): Integer; +begin + if A <= B then + Result := A + else + Result := B; +end; + +function FindAccelChar(const S: String): Char; +{ Finds the last accelerator key in S. Returns #0 if no accelerator key was + found. '&&' is ignored. } +{$IFNDEF CLR} +var + P: PChar; +begin + P := PChar(S); + Result := #0; + while True do begin + P := AnsiStrScan(P, '&'); + if P = nil then Break; + Inc(P); + if P^ <> '&' then begin + if P^ = #0 then Break; + Result := P^; + end; + Inc(P); + end; +end; +{$ELSE} +var + Len, I: Integer; +begin + Result := #0; + Len := Length(S); + if Len > 0 then begin { ensures S isn't nil } + I := 1; + while True do begin + I := System.String(S).IndexOf('&', I - 1) + 1; + if (I = 0) or (I >= Len) then + Break; + Inc(I); + if S[I] <> '&' then + Result := S[I]; + Inc(I); + end; + end; +end; +{$ENDIF} + +function IsWindowsXP: Boolean; +begin + Result := (Win32Platform = VER_PLATFORM_WIN32_NT) and + ((Win32MajorVersion > 5) or + ((Win32MajorVersion = 5) and (Win32MinorVersion >= 1))); +end; + +function GetInputLocaleCodePage: UINT; +{ Returns the code page identifier of the active input locale, or CP_ACP if + for some unknown reason it couldn't be determined. } +var + {$IFNDEF CLR} + Buf: array[0..15] of Char; + {$ELSE} + Buf: StringBuilder; + {$ENDIF} + ErrorCode: Integer; +begin + {$IFNDEF CLR} + if GetLocaleInfo(GetKeyboardLayout(0) and $FFFF, LOCALE_IDEFAULTANSICODEPAGE, + Buf, SizeOf(Buf) div SizeOf(Buf[0])) > 0 then begin + Buf[High(Buf)] := #0; { ensure null termination, just in case... } + Val(Buf, Result, ErrorCode); + {$ELSE} + Buf := StringBuilder.Create(16); + if GetLocaleInfo(GetKeyboardLayout(0) and $FFFF, LOCALE_IDEFAULTANSICODEPAGE, + Buf, Buf.Capacity) > 0 then begin + Val(Buf.ToString, Result, ErrorCode); + {$ENDIF} + { Just to be *completely* safe, verify that the code page returned by + GetLocaleInfo actually exists. The result of this function may be fed + into WideCharToMultiByte, and we don't want WideCharToMultiByte to fail + entirely because of a bad code page. } + if (ErrorCode <> 0) or not IsValidCodePage(Result) then + Result := CP_ACP; + end + else + Result := CP_ACP; +end; + +function GetMessagePosAsPoint: TPoint; +var + Pos: DWORD; +begin + Pos := GetMessagePos; + Result.X := Smallint(Pos and $FFFF); + Result.Y := Smallint(Pos shr 16); +end; + +function GetSystemNonClientMetrics(var Metrics: TNonClientMetrics): Boolean; +{$IFNDEF CLR} +begin + Metrics.cbSize := SizeOf(Metrics); + Result := SystemParametersInfo(SPI_GETNONCLIENTMETRICS, SizeOf(Metrics), + @Metrics, 0); +end; +{$ELSE} +begin + {$IFDEF JR_D11} + { On Delphi.NET 2007, Forms.GetNonClientMetrics is marked deprecated } + Metrics.cbSize := Marshal.SizeOf(TypeOf(TNonClientMetrics)); + Result := SystemParametersInfo(SPI_GETNONCLIENTMETRICS, Metrics.cbSize, + Metrics, 0); + {$ELSE} + Result := Forms.GetNonClientMetrics(Metrics); + {$ENDIF} +end; +{$ENDIF} + +function GetSystemParametersInfoBool(const Param: UINT; const Default: BOOL): BOOL; +{ Returns the value of the specified BOOL-type system parameter, or Default + if the function fails } +begin + if not SystemParametersInfo(Param, 0, {$IFNDEF CLR}@{$ENDIF} Result, 0) then + Result := Default; +end; + +{$IFDEF CLR} +{ Use our own declaration for CharLowerBuffA that takes a byte array directly + instead of StringBuilder } +[SuppressUnmanagedCodeSecurity, DllImport(user32, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'CharLowerBuffA')] +function _CharLowerBuffA([in, out] lpsz: TBytes; cchLength: DWORD): DWORD; external; +{$ENDIF} + +function CharToLower(const C: Char): Char; +{ Converts a single character to lowercase using the current code page } +{$IFNDEF CLR} +begin + Result := Char(CharLower(Pointer(Word(C)))); +end; +{$ELSE} +var + AnsiBytes: TBytes; +begin + { Note: On .NET we can't use LowerCase()/String.ToLower() because it uses + linguistic casing rules -- on a Turkish locale "I" is NOT mapped to "i". + This would break accelerator keys when running English apps. With + CharLower, "I" is always mapped to "i". } + if Marshal.SystemDefaultCharSize = 1 then begin + { On Windows 9x/Me we have to use CharLowerBuff since the character may be + two bytes when downconverted to ANSI. And we have to handle the + Unicode->ANSI conversion ourself so that we know the correct length to + pass to the function. } + AnsiBytes := AnsiEncoding.GetBytes(C); + _CharLowerBuffA(AnsiBytes, Length(AnsiBytes)); + Result := AnsiEncoding.GetChars(AnsiBytes)[0]; + end + else + Result := Char(Word(CharLowerW(IntPtr(Word(C))))); +end; +{$ENDIF} + +{$IFNDEF JR_D6} +function InvalidPoint(const At: TPoint): Boolean; +begin + Result := (At.X = -1) and (At.Y = -1); +end; +{$ENDIF} + +{$IFDEF CLR} +function ClipToLongint(const I: Int64): Longint; inline; +{ On Delphi.NET 2007, casting a LPARAM (THandle) directly into a Longint can + raise an overflow exception (possibly a bug?). By passing the LPARAM to + this function, which acts like a Longint(Int64()) cast, the exception can + be avoided. } +begin + Result := Longint(I); +end; +{$ENDIF} + +initialization + InitGradientFillFunc; + {$IFNDEF CLR} + InitMultiMonApis; + LockSetForegroundWindowFunc := GetProcAddress(GetModuleHandle(user32), + 'LockSetForegroundWindow'); + {$ENDIF} +end. diff --git a/internal/2.2.2/1/Source/TB2Consts.pas b/internal/2.2.2/1/Source/TB2Consts.pas new file mode 100644 index 0000000..fb29db0 --- /dev/null +++ b/internal/2.2.2/1/Source/TB2Consts.pas @@ -0,0 +1,34 @@ +unit TB2Consts; +{ $jrsoftware: tb2k/Source/TB2Consts.pas,v 1.8 2006/03/12 23:11:58 jr Exp $ } + +interface + +{$I TB2Ver.inc} + +resourcestring + { Exceptions } + STBToolbarIndexOutOfBounds = 'Toolbar item index out of range'; + STBToolbarItemReinserted = 'Toolbar item already inserted'; + STBToolbarItemParentInvalid = 'Toolbar item cannot be inserted into container of type %s'; + STBViewerNotFound = 'An item viewer associated the specified item could not be found'; + + { TTBChevronItem } + STBChevronItemMoreButtonsHint = 'More Buttons|'; + + { TTBMRUListItem } + STBMRUListItemDefCaption = '(MRU List)'; + + { TTBMDIWindowItem } + STBMDIWindowItemDefCaption = '(Window List)'; + + { TTBDock exception messages } + STBDockParentNotAllowed = 'A TTBDock control cannot be placed inside a tool window or another TTBDock'; + STBDockCannotChangePosition = 'Cannot change Position of a TTBDock if it already contains controls'; + + { TTBCustomDockableWindow exception messages } + STBToolwinNameNotSet = 'Cannot save dockable window''s position because Name property is not set'; + STBToolwinDockedToNameNotSet = 'Cannot save dockable window''s position because DockedTo''s Name property not set'; + +implementation + +end. diff --git a/internal/2.2.2/1/Source/TB2Dock.pas b/internal/2.2.2/1/Source/TB2Dock.pas new file mode 100644 index 0000000..cbc94b1 --- /dev/null +++ b/internal/2.2.2/1/Source/TB2Dock.pas @@ -0,0 +1,5670 @@ +unit TB2Dock; + +{ + Toolbar2000 + Copyright (C) 1998-2008 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2Dock.pas,v 1.127 2008/09/17 20:12:25 jr Exp $ +} + +interface + +{x$DEFINE TB2Dock_DisableLock} +{ Remove the 'x' to enable the define. It will disable calls to + LockWindowUpdate, which it calls to disable screen updates while dragging. + You may want to temporarily enable the define while debugging so you are able + to see your code window while stepping through the dragging routines. } + +{$I TB2Ver.inc} + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, IniFiles; + +type + TTBCustomForm = {$IFDEF JR_D3} TCustomForm {$ELSE} TForm {$ENDIF}; + + { TTBDock } + + TTBDockBoundLinesValues = (blTop, blBottom, blLeft, blRight); + TTBDockBoundLines = set of TTBDockBoundLinesValues; + TTBDockPosition = (dpTop, dpBottom, dpLeft, dpRight); + TTBDockType = (dtNotDocked, dtFloating, dtTopBottom, dtLeftRight); + TTBDockableTo = set of TTBDockPosition; + + TTBCustomDockableWindow = class; + TTBBasicBackground = class; + + TTBInsertRemoveEvent = procedure(Sender: TObject; Inserting: Boolean; + Bar: TTBCustomDockableWindow) of object; + TTBRequestDockEvent = procedure(Sender: TObject; Bar: TTBCustomDockableWindow; + var Accept: Boolean) of object; + + TTBDock = class(TCustomControl) + private + { Property values } + FPosition: TTBDockPosition; + FAllowDrag: Boolean; + FBoundLines: TTBDockBoundLines; + FBackground: TTBBasicBackground; + FBkgOnToolbars: Boolean; + FFixAlign: Boolean; + FCommitNewPositions: Boolean; + FLimitToOneRow: Boolean; + FOnInsertRemoveBar: TTBInsertRemoveEvent; + FOnRequestDock: TTBRequestDockEvent; + {$IFNDEF JR_D4} + FOnResize: TNotifyEvent; + {$ENDIF} + + { Internal } + FDisableArrangeToolbars: Integer; { Increment to disable ArrangeToolbars } + FArrangeToolbarsNeeded: Boolean; + FNonClientWidth, FNonClientHeight: Integer; + DockList: TList; { List of the toolbars docked, and those floating and have LastDock + pointing to the dock. Items are casted in TTBCustomDockableWindow's. } + DockVisibleList: TList; { Similar to DockList, but lists only docked and visible toolbars } + + { Property access methods } + //function GetVersion: TToolbar97Version; + procedure SetAllowDrag(Value: Boolean); + procedure SetBackground(Value: TTBBasicBackground); + procedure SetBackgroundOnToolbars(Value: Boolean); + procedure SetBoundLines(Value: TTBDockBoundLines); + procedure SetFixAlign(Value: Boolean); + procedure SetPosition(Value: TTBDockPosition); + //procedure SetVersion(const Value: TToolbar97Version); + + function GetToolbarCount: Integer; + function GetToolbars(Index: Integer): TTBCustomDockableWindow; + + { Internal } + procedure BackgroundChanged(Sender: TObject); + procedure ChangeDockList(const Insert: Boolean; const Bar: TTBCustomDockableWindow); + procedure ChangeWidthHeight(const NewWidth, NewHeight: Integer); + procedure CommitPositions; + procedure DrawNCArea(const DrawToDC: Boolean; const ADC: HDC; + const Clip: HRGN); + function GetDesignModeRowOf(const XY: Integer): Integer; + function HasVisibleToolbars: Boolean; + procedure RelayMsgToFloatingBars({$IFNDEF CLR}var{$ELSE}const{$ENDIF} Message: TMessage); + function ToolbarVisibleOnDock(const AToolbar: TTBCustomDockableWindow): Boolean; + procedure ToolbarVisibilityChanged(const Bar: TTBCustomDockableWindow; + const ForceRemove: Boolean); + + { Messages } + procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; + procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY; + procedure CMSysColorChange(var Message: TMessage); message CM_SYSCOLORCHANGE; + procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND; + procedure WMMove(var Message: TWMMove); message WM_MOVE; + {$IFNDEF JR_D4} + procedure WMSize(var Message: TWMSize); message WM_SIZE; + {$ENDIF} + procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE; + procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT; + procedure WMPrint(var Message: TMessage); message WM_PRINT; + procedure WMPrintClient(var Message: {$IFNDEF CLR} TMessage {$ELSE} TWMPrintClient {$ENDIF}); message WM_PRINTCLIENT; + procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND; + protected + procedure AlignControls(AControl: TControl; var Rect: TRect); override; + procedure CreateParams(var Params: TCreateParams); override; + procedure DrawBackground(DC: HDC; const DrawRect: TRect); virtual; + function GetPalette: HPALETTE; override; + procedure InvalidateBackgrounds; + procedure Loaded; override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure SetParent(AParent: TWinControl); override; + procedure Paint; override; + function UsingBackground: Boolean; virtual; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + + procedure ArrangeToolbars; + procedure BeginUpdate; + procedure EndUpdate; + function GetCurrentRowSize(const Row: Integer; var AFullSize: Boolean): Integer; + function GetHighestRow(const HighestEffective: Boolean): Integer; + function GetMinRowSize(const Row: Integer; + const ExcludeControl: TTBCustomDockableWindow): Integer; + + property CommitNewPositions: Boolean read FCommitNewPositions write FCommitNewPositions; + property NonClientWidth: Integer read FNonClientWidth; + property NonClientHeight: Integer read FNonClientHeight; + property ToolbarCount: Integer read GetToolbarCount; + property Toolbars[Index: Integer]: TTBCustomDockableWindow read GetToolbars; + published + property AllowDrag: Boolean read FAllowDrag write SetAllowDrag default True; + property Background: TTBBasicBackground read FBackground write SetBackground; + property BackgroundOnToolbars: Boolean read FBkgOnToolbars write SetBackgroundOnToolbars default True; + property BoundLines: TTBDockBoundLines read FBoundLines write SetBoundLines default []; + property Color default clBtnFace; + property FixAlign: Boolean read FFixAlign write SetFixAlign default False; + property LimitToOneRow: Boolean read FLimitToOneRow write FLimitToOneRow default False; + property PopupMenu; + property Position: TTBDockPosition read FPosition write SetPosition default dpTop; + //property Version: TToolbar97Version read GetVersion write SetVersion stored False; + property Visible; + + {$IFDEF JR_D5} + property OnContextPopup; + {$ENDIF} + property OnInsertRemoveBar: TTBInsertRemoveEvent read FOnInsertRemoveBar write FOnInsertRemoveBar; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnRequestDock: TTBRequestDockEvent read FOnRequestDock write FOnRequestDock; + {$IFDEF JR_D4} + property OnResize; + {$ELSE} + property OnResize: TNotifyEvent read FOnResize write FOnResize; + {$ENDIF} + end; + + { TTBFloatingWindowParent - internal } + + TTBToolWindowNCRedrawWhatElement = (twrdBorder, twrdCaption, twrdCloseButton); + TTBToolWindowNCRedrawWhat = set of TTBToolWindowNCRedrawWhatElement; + + TTBFloatingWindowParentClass = class of TTBFloatingWindowParent; + TTBFloatingWindowParent = class(TCustomForm) + private + FCloseButtonDown: Boolean; { True if Close button is currently depressed } + FDockableWindow: TTBCustomDockableWindow; + FParentForm: TTBCustomForm; + FShouldShow: Boolean; + + procedure CallRecreateWnd; + function GetCaptionRect(const AdjustForBorder, MinusCloseButton: Boolean): TRect; + function GetCloseButtonRect(const AdjustForBorder: Boolean): TRect; + procedure SetCloseButtonState(Pushed: Boolean); + procedure RedrawNCArea(const RedrawWhat: TTBToolWindowNCRedrawWhat); + + procedure CMShowingChanged(var Message: TMessage); message CM_SHOWINGCHANGED; + procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY; + procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED; + procedure WMActivate(var Message: TWMActivate); message WM_ACTIVATE; + procedure WMClose(var Message: TWMClose); message WM_CLOSE; + procedure WMGetMinMaxInfo(var Message: TWMGetMinMaxInfo); message WM_GETMINMAXINFO; + procedure WMMouseActivate(var Message: TWMMouseActivate); message WM_MOUSEACTIVATE; + procedure WMMove(var Message: TWMMove); message WM_MOVE; + procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE; + procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST; + procedure WMNCLButtonDblClk(var Message: TWMNCLButtonDblClk); message WM_NCLBUTTONDBLCLK; + procedure WMNCLButtonDown(var Message: TWMNCLButtonDown); message WM_NCLBUTTONDOWN; + procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT; + procedure WMNCRButtonUp(var Message: TWMNCRButtonUp); message WM_NCRBUTTONUP; + procedure WMPrint(var Message: TMessage); message WM_PRINT; + procedure WMPrintClient(var Message: {$IFNDEF CLR} TMessage {$ELSE} TWMPrintClient {$ENDIF}); message WM_PRINTCLIENT; + protected + procedure AlignControls(AControl: TControl; var Rect: TRect); override; + procedure CreateParams(var Params: TCreateParams); override; + procedure DrawNCArea(const DrawToDC: Boolean; const ADC: HDC; + const Clip: HRGN; RedrawWhat: TTBToolWindowNCRedrawWhat); dynamic; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + property DockableWindow: TTBCustomDockableWindow read FDockableWindow; + property CloseButtonDown: Boolean read FCloseButtonDown; + public + property ParentForm: TTBCustomForm read FParentForm; + end; + + { TTBCustomDockableWindow } + + TTBDockChangingEvent = procedure(Sender: TObject; Floating: Boolean; + DockingTo: TTBDock) of object; + TTBDragHandleStyle = (dhDouble, dhNone, dhSingle); + TTBDockMode = (dmCanFloat, dmCannotFloat, dmCannotFloatOrChangeDocks); + TTBFloatingMode = (fmOnTopOfParentForm, fmOnTopOfAllForms); + TTBSizeHandle = (twshLeft, twshRight, twshTop, twshTopLeft, + twshTopRight, twshBottom, twshBottomLeft, twshBottomRight); + { ^ must be in same order as HTLEFT..HTBOTTOMRIGHT } + TTBPositionExtraData = {$IFNDEF CLR} Pointer {$ELSE} TObject {$ENDIF}; + TTBPositionReadIntProc = function(const ToolbarName, Value: String; const Default: Longint; + const ExtraData: TTBPositionExtraData): Longint; + TTBPositionReadStringProc = function(const ToolbarName, Value, Default: String; + const ExtraData: TTBPositionExtraData): String; + TTBPositionWriteIntProc = procedure(const ToolbarName, Value: String; const Data: Longint; + const ExtraData: TTBPositionExtraData); + TTBPositionWriteStringProc = procedure(const ToolbarName, Value, Data: String; + const ExtraData: TTBPositionExtraData); + TTBReadPositionData = record + ReadIntProc: TTBPositionReadIntProc; + ReadStringProc: TTBPositionReadStringProc; + ExtraData: TTBPositionExtraData; + end; + TTBWritePositionData = record + WriteIntProc: TTBPositionWriteIntProc; + WriteStringProc: TTBPositionWriteStringProc; + ExtraData: TTBPositionExtraData; + end; + TTBDockableWindowStyles = set of (tbdsResizeEightCorner, tbdsResizeClipCursor); + TTBShrinkMode = (tbsmNone, tbsmWrap, tbsmChevron); + + TTBCustomDockableWindow = class(TCustomControl) + private + { Property variables } + FAutoResize: Boolean; + FDockPos, FDockRow, FEffectiveDockPos, FEffectiveDockRow: Integer; + FDocked: Boolean; + FCurrentDock, FDefaultDock, FLastDock: TTBDock; + FCurrentSize: Integer; + FFloating: Boolean; + FOnClose, FOnDockChanged, FOnMove, FOnRecreated, + FOnRecreating, {$IFNDEF JR_D4} FOnResize, {$ENDIF} + FOnVisibleChanged: TNotifyEvent; + FOnCloseQuery: TCloseQueryEvent; + FOnDockChanging, FOnDockChangingHidden: TTBDockChangingEvent; + FActivateParent, FHideWhenInactive, FCloseButton, FCloseButtonWhenDocked, + FFullSize, FResizable, FShowCaption, FStretch, FUseLastDock: Boolean; + FBorderStyle: TBorderStyle; + FDockMode: TTBDockMode; + FDragHandleStyle: TTBDragHandleStyle; + FDockableTo: TTBDockableTo; + FFloatingMode: TTBFloatingMode; + FSmoothDrag: Boolean; + FDockableWindowStyles: TTBDockableWindowStyles; + FLastRowSize: Integer; + FInsertRowBefore: Boolean; + + { Misc. } + FUpdatingBounds, { Incremented while internally changing the bounds. This allows + it to move the toolbar freely in design mode and prevents the + SizeChanging protected method from begin called } + FDisableArrange, { Incremented to disable Arrange } + FDisableOnMove, { Incremented to prevent WM_MOVE handler from calling the OnMoved handler } + FHidden: Integer; { Incremented while the toolbar is temporarily hidden } + FArrangeNeeded, FMoved: Boolean; + FInactiveCaption: Boolean; { True when the caption of the toolbar is currently the inactive color } + FFloatingPosition: TPoint; + FDockForms: TList; + FSavedAtRunTime: Boolean; + //FNonClientWidth, FNonClientHeight: Integer; + FDragMode, FDragSplitting, FDragCanSplit: Boolean; + FSmoothDragging: Boolean; + + { When floating. These are not used in design mode } + FCloseButtonDown: Boolean; { True if Close button is currently depressed } + FCloseButtonHover: Boolean; + FFloatParent: TTBFloatingWindowParent; { Run-time only: The actual Parent of the toolbar when it is floating } + + { Property access methods } + //function GetVersion: TToolbar97Version; + function GetNonClientWidth: Integer; + function GetNonClientHeight: Integer; + function IsLastDockStored: Boolean; + function IsWidthAndHeightStored: Boolean; + procedure SetAutoResize(Value: Boolean); + procedure SetBorderStyle(Value: TBorderStyle); + procedure SetCloseButton(Value: Boolean); + procedure SetCloseButtonWhenDocked(Value: Boolean); + procedure SetCurrentDock(Value: TTBDock); + procedure SetDefaultDock(Value: TTBDock); + procedure SetDockPos(Value: Integer); + procedure SetDockRow(Value: Integer); + procedure SetDragHandleStyle(Value: TTBDragHandleStyle); + procedure SetFloating(Value: Boolean); + procedure SetFloatingMode(Value: TTBFloatingMode); + procedure SetFloatingPosition(Value: TPoint); + procedure SetFullSize(Value: Boolean); + procedure SetLastDock(Value: TTBDock); + procedure SetResizable(Value: Boolean); + procedure SetShowCaption(Value: Boolean); + procedure SetStretch(Value: Boolean); + procedure SetUseLastDock(Value: Boolean); + //procedure SetVersion(const Value: TToolbar97Version); + + { Internal } + procedure CancelNCHover; + procedure DrawDraggingOutline(const DC: HDC; const NewRect, OldRect: TRect; + const NewDocking, OldDocking: Boolean); + procedure RedrawNCArea; + procedure SetCloseButtonState(Pushed: Boolean); + procedure ShowNCContextMenu(const PosX, PosY: Smallint); + procedure Moved; + function GetShowingState: Boolean; + procedure UpdateCaptionState; + procedure UpdateTopmostFlag; + procedure UpdateVisibility; + procedure ReadSavedAtRunTime(Reader: TReader); + procedure WriteSavedAtRunTime(Writer: TWriter); + + { Messages } + procedure CMColorChanged(var Message: TMessage); message CM_COLORCHANGED; + procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; + procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED; + procedure CMShowingChanged(var Message: TMessage); message CM_SHOWINGCHANGED; + procedure CMVisibleChanged(var Message: TMessage); message CM_VISIBLECHANGED; + {$IFDEF JR_D5} + procedure WMContextMenu(var Message: TWMContextMenu); message WM_CONTEXTMENU; + {$ENDIF} + procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND; + procedure WMMove(var Message: TWMMove); message WM_MOVE; + procedure WMMouseMove(var Message: TWMMouseMove); message WM_MOUSEMOVE; + procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE; + procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST; + procedure WMNCMouseLeave(var Message: TMessage); message $2A2 {WM_NCMOUSELEAVE}; + procedure WMNCMouseMove(var Message: TWMNCMouseMove); message WM_NCMOUSEMOVE; + procedure WMNCLButtonDblClk(var Message: TWMNCLButtonDblClk); message WM_NCLBUTTONDBLCLK; + procedure WMNCLButtonDown(var Message: TWMNCLButtonDown); message WM_NCLBUTTONDOWN; + procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT; + procedure WMNCRButtonUp(var Message: TWMNCRButtonUp); message WM_NCRBUTTONUP; + procedure WMPrint(var Message: TMessage); message WM_PRINT; + procedure WMPrintClient(var Message: {$IFNDEF CLR} TMessage {$ELSE} TWMPrintClient {$ENDIF}); message WM_PRINTCLIENT; + procedure WMSetCursor(var Message: TWMSetCursor); message WM_SETCURSOR; + {$IFNDEF JR_D4} + procedure WMSize(var Message: TWMSize); message WM_SIZE; + {$ENDIF} + protected + property ActivateParent: Boolean read FActivateParent write FActivateParent default True; + property AutoResize: Boolean read FAutoResize write SetAutoResize default True; + property BorderStyle: TBorderStyle read FBorderStyle write SetBorderStyle default bsSingle; + property Color default clBtnFace; + property CloseButton: Boolean read FCloseButton write SetCloseButton default True; + property CloseButtonDown: Boolean read FCloseButtonDown; + property CloseButtonHover: Boolean read FCloseButtonHover; + property CloseButtonWhenDocked: Boolean read FCloseButtonWhenDocked write SetCloseButtonWhenDocked default False; + property DefaultDock: TTBDock read FDefaultDock write SetDefaultDock; + property DockableTo: TTBDockableTo read FDockableTo write FDockableTo default [dpTop, dpBottom, dpLeft, dpRight]; + property DockableWindowStyles: TTBDockableWindowStyles read FDockableWindowStyles write FDockableWindowStyles; + property DockMode: TTBDockMode read FDockMode write FDockMode default dmCanFloat; + property DragHandleStyle: TTBDragHandleStyle read FDragHandleStyle write SetDragHandleStyle default dhSingle; + property FloatingMode: TTBFloatingMode read FFloatingMode write SetFloatingMode default fmOnTopOfParentForm; + property FullSize: Boolean read FFullSize write SetFullSize default False; + property InactiveCaption: Boolean read FInactiveCaption; + property HideWhenInactive: Boolean read FHideWhenInactive write FHideWhenInactive default True; + property Resizable: Boolean read FResizable write SetResizable default True; + property ShowCaption: Boolean read FShowCaption write SetShowCaption default True; + property SmoothDrag: Boolean read FSmoothDrag write FSmoothDrag default True; + property Stretch: Boolean read FStretch write SetStretch default False; + property UseLastDock: Boolean read FUseLastDock write SetUseLastDock default True; + //property Version: TToolbar97Version read GetVersion write SetVersion stored False; + + property OnClose: TNotifyEvent read FOnClose write FOnClose; + property OnCloseQuery: TCloseQueryEvent read FOnCloseQuery write FOnCloseQuery; + property OnDockChanged: TNotifyEvent read FOnDockChanged write FOnDockChanged; + property OnDockChanging: TTBDockChangingEvent read FOnDockChanging write FOnDockChanging; + property OnDockChangingHidden: TTBDockChangingEvent read FOnDockChangingHidden write FOnDockChangingHidden; + property OnMove: TNotifyEvent read FOnMove write FOnMove; + property OnRecreated: TNotifyEvent read FOnRecreated write FOnRecreated; + property OnRecreating: TNotifyEvent read FOnRecreating write FOnRecreating; + {$IFNDEF JR_D4} + property OnResize: TNotifyEvent read FOnResize write FOnResize; + {$ENDIF} + property OnVisibleChanged: TNotifyEvent read FOnVisibleChanged write FOnVisibleChanged; + + { Overridden methods } + procedure CreateParams(var Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + function GetPalette: HPALETTE; override; + procedure Loaded; override; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + function PaletteChanged(Foreground: Boolean): Boolean; override; + procedure SetParent(AParent: TWinControl); override; + + { Methods accessible to descendants } + procedure Arrange; + function CalcNCSizes: TPoint; virtual; + procedure ChangeSize(AWidth, AHeight: Integer); + function ChildControlTransparent(Ctl: TControl): Boolean; dynamic; + procedure Close; + procedure ControlExistsAtPos(const P: TPoint; var ControlExists: Boolean); virtual; + function DoArrange(CanMoveControls: Boolean; PreviousDockType: TTBDockType; + NewFloating: Boolean; NewDock: TTBDock): TPoint; virtual; abstract; + procedure DoDockChangingHidden(NewFloating: Boolean; DockingTo: TTBDock); dynamic; + procedure DoubleClick; + procedure DrawNCArea(const DrawToDC: Boolean; const ADC: HDC; + const Clip: HRGN); virtual; + procedure GetBaseSize(var ASize: TPoint); virtual; abstract; + function GetDockedCloseButtonRect(LeftRight: Boolean): TRect; virtual; + function GetFloatingWindowParentClass: TTBFloatingWindowParentClass; dynamic; + procedure GetMinShrinkSize(var AMinimumSize: Integer); virtual; + procedure GetMinMaxSize(var AMinClientWidth, AMinClientHeight, + AMaxClientWidth, AMaxClientHeight: Integer); virtual; + function GetShrinkMode: TTBShrinkMode; virtual; + procedure InitializeOrdering; dynamic; + function IsAutoResized: Boolean; + procedure ResizeBegin(SizeHandle: TTBSizeHandle); dynamic; + procedure ResizeEnd; dynamic; + procedure ResizeTrack(var Rect: TRect; const OrigRect: TRect); dynamic; + procedure ResizeTrackAccept; dynamic; + procedure SizeChanging(const AWidth, AHeight: Integer); virtual; + public + property Docked: Boolean read FDocked; + property Canvas; + property CurrentDock: TTBDock read FCurrentDock write SetCurrentDock stored False; + property CurrentSize: Integer read FCurrentSize write FCurrentSize; + property DockPos: Integer read FDockPos write SetDockPos default -1; + property DockRow: Integer read FDockRow write SetDockRow default 0; + property DragMode: Boolean read FDragMode; + property DragSplitting: Boolean read FDragSplitting; + property EffectiveDockPos: Integer read FEffectiveDockPos; + property EffectiveDockRow: Integer read FEffectiveDockRow; + property Floating: Boolean read FFloating write SetFloating default False; + property FloatingPosition: TPoint read FFloatingPosition write SetFloatingPosition; + property LastDock: TTBDock read FLastDock write SetLastDock stored IsLastDockStored; + property NonClientWidth: Integer read GetNonClientWidth; + property NonClientHeight: Integer read GetNonClientHeight; + + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + function GetParentComponent: TComponent; override; + function HasParent: Boolean; override; + procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override; + + procedure AddDockForm(const Form: TTBCustomForm); + procedure AddDockedNCAreaToSize(var S: TPoint; const LeftRight: Boolean); + procedure AddFloatingNCAreaToSize(var S: TPoint); + procedure BeginMoving(const InitX, InitY: Integer); + procedure BeginSizing(const ASizeHandle: TTBSizeHandle); + procedure BeginUpdate; + procedure DoneReadingPositionData(const Data: TTBReadPositionData); dynamic; + procedure EndUpdate; + procedure GetDockedNCArea(var TopLeft, BottomRight: TPoint; + const LeftRight: Boolean); + function GetFloatingBorderSize: TPoint; virtual; + procedure GetFloatingNCArea(var TopLeft, BottomRight: TPoint); + function IsMovable: Boolean; + procedure MoveOnScreen(const OnlyIfFullyOffscreen: Boolean); + procedure ReadPositionData(const Data: TTBReadPositionData); dynamic; + procedure RemoveDockForm(const Form: TTBCustomForm); + procedure WritePositionData(const Data: TTBWritePositionData); dynamic; + published + property Height stored IsWidthAndHeightStored; + property Width stored IsWidthAndHeightStored; + end; + + TTBBasicBackground = class(TComponent) + protected + procedure Draw(DC: HDC; const DrawRect: TRect); virtual; abstract; + function GetPalette: HPALETTE; virtual; abstract; + procedure RegisterChanges(Proc: TNotifyEvent); virtual; abstract; + procedure SysColorChanged; virtual; abstract; + procedure UnregisterChanges(Proc: TNotifyEvent); virtual; abstract; + function UsingBackground: Boolean; virtual; abstract; + end; + + TTBBackground = class(TTBBasicBackground) + private + FBitmap, FBitmapCache: TBitmap; + FBkColor: TColor; + FNotifyList: TList; + FTransparent: Boolean; + procedure BitmapChanged(Sender: TObject); + procedure SetBitmap(Value: TBitmap); + procedure SetBkColor(Value: TColor); + procedure SetTransparent(Value: Boolean); + protected + procedure Draw(DC: HDC; const DrawRect: TRect); override; + function GetPalette: HPALETTE; override; + procedure RegisterChanges(Proc: TNotifyEvent); override; + procedure SysColorChanged; override; + procedure UnregisterChanges(Proc: TNotifyEvent); override; + function UsingBackground: Boolean; override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + published + property Bitmap: TBitmap read FBitmap write SetBitmap; + property BkColor: TColor read FBkColor write SetBkColor default clBtnFace; + property Transparent: Boolean read FTransparent write SetTransparent default False; + end; + +procedure TBRegLoadPositions(const OwnerComponent: TComponent; + const RootKey: DWORD; const BaseRegistryKey: String); +procedure TBRegSavePositions(const OwnerComponent: TComponent; + const RootKey: DWORD; const BaseRegistryKey: String); +procedure TBIniLoadPositions(const OwnerComponent: TComponent; + const Filename, SectionNamePrefix: String); overload; +procedure TBIniLoadPositions(const OwnerComponent: TComponent; + const IniFile: TCustomIniFile; const SectionNamePrefix: String); overload; +procedure TBIniSavePositions(const OwnerComponent: TComponent; + const Filename, SectionNamePrefix: String); overload; +procedure TBIniSavePositions(const OwnerComponent: TComponent; + const IniFile: TCustomIniFile; const SectionNamePrefix: String); overload; + +procedure TBCustomLoadPositions(const OwnerComponent: TComponent; + const ReadIntProc: TTBPositionReadIntProc; + const ReadStringProc: TTBPositionReadStringProc; + const ExtraData: TTBPositionExtraData); +procedure TBCustomSavePositions(const OwnerComponent: TComponent; + const WriteIntProc: TTBPositionWriteIntProc; + const WriteStringProc: TTBPositionWriteStringProc; + const ExtraData: TTBPositionExtraData); + +function TBGetDockTypeOf(const Control: TTBDock; const Floating: Boolean): TTBDockType; +function TBGetToolWindowParentForm(const ToolWindow: TTBCustomDockableWindow): + TTBCustomForm; +function TBValidToolWindowParentForm(const ToolWindow: TTBCustomDockableWindow): + TTBCustomForm; + +implementation + +uses + {$IFDEF CLR} Types, System.Runtime.InteropServices, {$ENDIF} + Registry, Consts, Menus, + TB2Common, TB2Hook, TB2Consts; + +type + TControlAccess = class(TControl); + +const + DockedBorderSize = 2; + DockedBorderSize2 = DockedBorderSize*2; + DragHandleSizes: array[Boolean, TTBDragHandleStyle] of Integer = + ((9, 0, 6), (14, 14, 14)); + DragHandleXOffsets: array[Boolean, TTBDragHandleStyle] of Integer = + ((2, 0, 1), (3, 0, 5)); + HT_TB2k_Border = 2000; + HT_TB2k_Close = 2001; + HT_TB2k_Caption = 2002; + + DefaultBarWidthHeight = 8; + + ForceDockAtTopRow = 0; + ForceDockAtLeftPos = -8; + + PositionLeftOrRight = [dpLeft, dpRight]; + + twrdAll = [Low(TTBToolWindowNCRedrawWhatElement)..High(TTBToolWindowNCRedrawWhatElement)]; + + { Constants for TTBCustomDockableWindow registry values/data. + Don't localize any of these names! } + rvRev = 'Rev'; + rdCurrentRev = 2000; + rvVisible = 'Visible'; + rvDockedTo = 'DockedTo'; + rdDockedToFloating = '+'; + rvLastDock = 'LastDock'; + rvDockRow = 'DockRow'; + rvDockPos = 'DockPos'; + rvFloatLeft = 'FloatLeft'; + rvFloatTop = 'FloatTop'; + +threadvar + FloatingToolWindows: TList; + + +{ Misc. functions } + +function GetSmallCaptionHeight: Integer; +{ Returns height of the caption of a small window } +begin + Result := GetSystemMetrics(SM_CYSMCAPTION); +end; + +function GetMDIParent(const Form: TTBCustomForm): TTBCustomForm; +{ Returns the parent of the specified MDI child form. But, if Form isn't a + MDI child, it simply returns Form. } +var + I, J: Integer; +begin + Result := Form; + if Form = nil then Exit; + if {$IFDEF JR_D3} (Form is TForm) and {$ENDIF} + (TForm(Form).FormStyle = fsMDIChild) then + for I := 0 to Screen.FormCount-1 do + with Screen.Forms[I] do begin + if FormStyle <> fsMDIForm then Continue; + for J := 0 to MDIChildCount-1 do + if MDIChildren[J] = Form then begin + Result := Screen.Forms[I]; + Exit; + end; + end; +end; + +function TBGetDockTypeOf(const Control: TTBDock; const Floating: Boolean): TTBDockType; +begin + if Floating then + Result := dtFloating + else + if Control = nil then + Result := dtNotDocked + else begin + if not(Control.Position in PositionLeftOrRight) then + Result := dtTopBottom + else + Result := dtLeftRight; + end; +end; + +function TBGetToolWindowParentForm(const ToolWindow: TTBCustomDockableWindow): TTBCustomForm; +var + Ctl: TWinControl; +begin + Result := nil; + Ctl := ToolWindow; + while Assigned(Ctl.Parent) do begin + if Ctl.Parent is TTBCustomForm then + Result := TTBCustomForm(Ctl.Parent); + Ctl := Ctl.Parent; + end; + { ^ for compatibility with ActiveX controls, that code is used instead of + GetParentForm because it returns nil unless the form is the *topmost* + parent } + if Result is TTBFloatingWindowParent then + Result := TTBFloatingWindowParent(Result).ParentForm; +end; + +function TBValidToolWindowParentForm(const ToolWindow: TTBCustomDockableWindow): TTBCustomForm; +begin + Result := TBGetToolWindowParentForm(ToolWindow); + if Result = nil then + raise EInvalidOperation.{$IFDEF JR_D3}CreateFmt{$ELSE}CreateResFmt{$ENDIF} + (SParentRequired, [ToolWindow.Name]); +end; + +procedure SetWindowOwner(const Wnd, NewOwnerWnd: HWND); +begin + SetWindowLong(Wnd, GWL_HWNDPARENT, + {$IFDEF JR_D11} LONG_PTR {$ELSE} Longint {$ENDIF} (NewOwnerWnd)); +end; + +procedure ToolbarHookProc(Code: THookProcCode; Wnd: HWND; WParam: WPARAM; LParam: LPARAM); +var + I: Integer; + ToolWindow: TTBCustomDockableWindow; + WindowPos: {$IFNDEF CLR} PWindowPos {$ELSE} TWindowPos {$ENDIF}; + Form: TTBCustomForm; +begin + case Code of + hpSendActivate, + hpSendActivateApp: begin + if Assigned(FloatingToolWindows) then + for I := 0 to FloatingToolWindows.Count-1 do + { Hide or restore toolbars when a form or the application is + deactivated or activated, and/or update their caption state + (active/inactive) } + TTBCustomDockableWindow(FloatingToolWindows[I]).UpdateVisibility; + end; + hpSendWindowPosChanged: begin + if Assigned(FloatingToolWindows) then begin + {$IFNDEF CLR} + WindowPos := PWindowPos(LParam); + {$ELSE} + WindowPos := TWindowPos(Marshal.PtrToStructure(IntPtr(LParam), TypeOf(TWindowPos))); + {$ENDIF} + for I := 0 to FloatingToolWindows.Count-1 do begin + ToolWindow := TTBCustomDockableWindow(FloatingToolWindows[I]); + if (ToolWindow.FFloatingMode = fmOnTopOfParentForm) and ToolWindow.HandleAllocated then begin + { Call UpdateVisibility if parent form's visibility has + changed, or if it has been minimized or restored } + if ((WindowPos.flags and (SWP_SHOWWINDOW or SWP_HIDEWINDOW) <> 0) or + (WindowPos.flags and SWP_FRAMECHANGED <> 0)) then begin + Form := TBGetToolWindowParentForm(ToolWindow); + if Assigned(Form) and Form.HandleAllocated and ((Wnd = Form.Handle) or IsChild(Wnd, Form.Handle)) then + ToolWindow.UpdateVisibility; + end; + end; + end; + end; + end; + hpPreDestroy: begin + if Assigned(FloatingToolWindows) then + for I := 0 to FloatingToolWindows.Count-1 do begin + with TTBCustomDockableWindow(FloatingToolWindows[I]) do + { It must remove the form window's ownership of the tool window + *before* the form gets destroyed, otherwise Windows will destroy + the tool window's handle. } + if Assigned(Parent) and Parent.HandleAllocated and + (HWND(GetWindowLong(Parent.Handle, GWL_HWNDPARENT)) = Wnd) then + SetWindowOwner(Parent.Handle, Application.Handle); + { ^ Restore GWL_HWNDPARENT back to Application.Handle } + end; + end; + end; +end; + +type + {$IFNDEF CLR} + PFindWindowData = ^TFindWindowData; + TFindWindowData = record + {$ELSE} + TFindWindowData = class + private + {$ENDIF} + TaskActiveWindow, TaskFirstWindow, TaskFirstTopMost: HWND; + {$IFDEF CLR} + function DoFindWindow(Wnd: HWND; Param: LPARAM): BOOL; + {$ENDIF} + end; + +{$IFNDEF CLR} +function DoFindWindow(Wnd: HWND; Param: LPARAM): BOOL; stdcall; +{$ELSE} +function TFindWindowData.DoFindWindow(Wnd: HWND; Param: LPARAM): BOOL; +{$ENDIF} +begin + {$IFNDEF CLR} + with PFindWindowData(Param)^ do + {$ENDIF} + if (Wnd <> TaskActiveWindow) and (Wnd <> Application.Handle) and + IsWindowVisible(Wnd) and IsWindowEnabled(Wnd) then begin + if GetWindowLong(Wnd, GWL_EXSTYLE) and WS_EX_TOPMOST = 0 then begin + if TaskFirstWindow = 0 then TaskFirstWindow := Wnd; + end + else begin + if TaskFirstTopMost = 0 then TaskFirstTopMost := Wnd; + end; + end; + Result := True; +end; + +function FindTopLevelWindow(ActiveWindow: HWND): HWND; +var + FindData: TFindWindowData; +begin + {$IFDEF CLR} + FindData := TFindWindowData.Create; + {$ENDIF} + with FindData do begin + TaskActiveWindow := ActiveWindow; + TaskFirstWindow := 0; + TaskFirstTopMost := 0; + {$IFNDEF CLR} + EnumThreadWindows(GetCurrentThreadID, @DoFindWindow, LPARAM(@FindData)); + {$ELSE} + EnumThreadWindows(GetCurrentThreadID, DoFindWindow, 0); + {$ENDIF} + if TaskFirstWindow <> 0 then + Result := TaskFirstWindow + else + Result := TaskFirstTopMost; + end; +end; + +function IsAncestorOfWindow(const ParentWnd: HWND; Wnd: HWND): Boolean; +{ Returns True if Wnd is a child of, is owned by, or is the same window as + ParentWnd } +begin + while Wnd <> 0 do begin + if Wnd = ParentWnd then begin + Result := True; + Exit; + end; + Wnd := GetParent(Wnd); + end; + Result := False; +end; + +procedure RecalcNCArea(const Ctl: TWinControl); +begin + if Ctl.HandleAllocated then + SetWindowPos(Ctl.Handle, 0, 0, 0, 0, 0, SWP_FRAMECHANGED or + SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER); +end; + +procedure InvalidateAll(const Ctl: TWinControl); +{ Invalidate both non-client and client area, and erase. } +begin + if Ctl.HandleAllocated then + RedrawWindow(Ctl.Handle, nil, 0, RDW_FRAME or RDW_INVALIDATE or + RDW_ERASE or RDW_NOCHILDREN); +end; + +type + TSetCloseButtonStateProc = procedure(Pushed: Boolean) of object; + +function CloseButtonLoop(const Wnd: HWND; const ButtonRect: TRect; + const SetCloseButtonStateProc: TSetCloseButtonStateProc): Boolean; + function MouseInButton: Boolean; + var + P: TPoint; + begin + GetCursorPos(P); + Result := PtInRect(ButtonRect, P); + end; +var + Msg: TMsg; +begin + Result := False; + + SetCloseButtonStateProc(MouseInButton); + + SetCapture(Wnd); + + try + while GetCapture = Wnd do begin + case Integer(GetMessage(Msg, 0, 0, 0)) of + -1: Break; { if GetMessage failed } + 0: begin + { Repost WM_QUIT messages } + PostQuitMessage(ClipToLongint(Msg.wParam)); + Break; + end; + end; + + case Msg.Message of + WM_KEYDOWN, WM_KEYUP: + { Ignore all keystrokes while in a close button loop } + ; + WM_MOUSEMOVE: begin + { Note to self: WM_MOUSEMOVE messages should never be dispatched + here to ensure no hints get shown } + SetCloseButtonStateProc(MouseInButton); + end; + WM_LBUTTONDOWN, WM_LBUTTONDBLCLK: + { Make sure it doesn't begin another loop } + Break; + WM_LBUTTONUP: begin + if MouseInButton then + Result := True; + Break; + end; + WM_RBUTTONDOWN..WM_MBUTTONDBLCLK: + { Ignore all other mouse up/down messages } + ; + else + TranslateMessage(Msg); + DispatchMessage(Msg); + end; + end; + finally + if GetCapture = Wnd then + ReleaseCapture; + SetCloseButtonStateProc(False); + end; +end; + + +{ TTBDock - internal } + +constructor TTBDock.Create(AOwner: TComponent); +begin + inherited; + + ControlStyle := ControlStyle + [csAcceptsControls, csMenuEvents] - + [csClickEvents, csCaptureMouse, csOpaque]; + FAllowDrag := True; + FBkgOnToolbars := True; + DockList := TList.Create; + DockVisibleList := TList.Create; + Color := clBtnFace; + Position := dpTop; +end; + +procedure TTBDock.CreateParams(var Params: TCreateParams); +begin + inherited; + { Disable complete redraws when size changes. CS_H/VREDRAW cause flicker + and are not necessary for this control at run time } + if not(csDesigning in ComponentState) then + with Params.WindowClass do + Style := Style and not(CS_HREDRAW or CS_VREDRAW); +end; + +destructor TTBDock.Destroy; +begin + if Assigned(FBackground) then + FBackground.UnregisterChanges(BackgroundChanged); + inherited; + DockVisibleList.Free; + DockList.Free; +end; + +procedure TTBDock.SetParent(AParent: TWinControl); +begin + if (AParent is TTBCustomDockableWindow) or (AParent is TTBDock) then + raise EInvalidOperation.Create(STBDockParentNotAllowed); + + inherited; +end; + +procedure TTBDock.BeginUpdate; +begin + Inc(FDisableArrangeToolbars); +end; + +procedure TTBDock.EndUpdate; +begin + Dec(FDisableArrangeToolbars); + if FArrangeToolbarsNeeded and (FDisableArrangeToolbars = 0) then + ArrangeToolbars; +end; + +function TTBDock.HasVisibleToolbars: Boolean; +var + I: Integer; +begin + Result := False; + for I := 0 to DockList.Count-1 do + if ToolbarVisibleOnDock(TTBCustomDockableWindow(DockList[I])) then begin + Result := True; + Break; + end; +end; + +function TTBDock.ToolbarVisibleOnDock(const AToolbar: TTBCustomDockableWindow): Boolean; +begin + Result := (AToolbar.Parent = Self) and + (AToolbar.Visible or (csDesigning in AToolbar.ComponentState)); +end; + +function TTBDock.GetCurrentRowSize(const Row: Integer; + var AFullSize: Boolean): Integer; +var + I, J: Integer; + T: TTBCustomDockableWindow; +begin + Result := 0; + AFullSize := False; + if Row < 0 then Exit; + for I := 0 to DockList.Count-1 do begin + T := TTBCustomDockableWindow(DockList[I]); + if (T.FEffectiveDockRow = Row) and ToolbarVisibleOnDock(T) then begin + AFullSize := T.FullSize; + if not(Position in PositionLeftOrRight) then + J := T.Height + else + J := T.Width; + if J > Result then + Result := J; + end; + end; +end; + +function TTBDock.GetMinRowSize(const Row: Integer; + const ExcludeControl: TTBCustomDockableWindow): Integer; +var + I, J: Integer; + T: TTBCustomDockableWindow; +begin + Result := 0; + if Row < 0 then Exit; + for I := 0 to DockList.Count-1 do begin + T := TTBCustomDockableWindow(DockList[I]); + if (T <> ExcludeControl) and (T.FEffectiveDockRow = Row) and + ToolbarVisibleOnDock(T) then begin + J := T.FLastRowSize; + if J > Result then + Result := J; + end; + end; +end; + +function TTBDock.GetDesignModeRowOf(const XY: Integer): Integer; +{ Similar to GetRowOf, but is a little different to accomidate design mode + better } +var + HighestRowPlus1, R, CurY, CurRowSize: Integer; + FullSize: Boolean; +begin + Result := 0; + HighestRowPlus1 := GetHighestRow(True)+1; + CurY := 0; + for R := 0 to HighestRowPlus1 do begin + Result := R; + if R = HighestRowPlus1 then Break; + CurRowSize := GetCurrentRowSize(R, FullSize); + if CurRowSize = 0 then Continue; + Inc(CurY, CurRowSize); + if XY < CurY then + Break; + end; +end; + +function TTBDock.GetHighestRow(const HighestEffective: Boolean): Integer; +{ Returns highest used row number, or -1 if no rows are used } +var + I, J: Integer; +begin + Result := -1; + for I := 0 to DockList.Count-1 do + with TTBCustomDockableWindow(DockList[I]) do begin + if HighestEffective then + J := FEffectiveDockRow + else + J := FDockRow; + if J > Result then + Result := J; + end; +end; + +procedure TTBDock.ChangeWidthHeight(const NewWidth, NewHeight: Integer); +{ Same as setting Width/Height directly, but does not lose Align position. + Specifically, it ensures that a bottom-aligned dock stays above a + bottom-aligned TStatusBar when the only toolbar on the dock is undocked + and then redocked. } +begin + case Align of + alNone, alTop, alLeft: + SetBounds(Left, Top, NewWidth, NewHeight); + alBottom: + SetBounds(Left, Top-NewHeight+Height, NewWidth, NewHeight); + alRight: + SetBounds(Left-NewWidth+Width, Top, NewWidth, NewHeight); + end; +end; + +procedure TTBDock.AlignControls(AControl: TControl; var Rect: TRect); +begin + ArrangeToolbars; +end; + +function CompareDockRowPos(Item1, Item2: TListItemType): Integer; +begin + Result := TTBCustomDockableWindow(Item1).FDockRow - TTBCustomDockableWindow(Item2).FDockRow; + if Result = 0 then + Result := TTBCustomDockableWindow(Item1).FDockPos - TTBCustomDockableWindow(Item2).FDockPos; +end; + +procedure TTBDock.ArrangeToolbars; +{ The main procedure to arrange all the toolbars docked to it } +type + TPosDataRec = record + Row, ActualRow, PrecSpace, FullSize, MinimumSize, Size, Overlap, Pos: Integer; + ShrinkMode: TTBShrinkMode; + NeedArrange: Boolean; + end; +var + NewDockList: TList; + PosData: array of TPosDataRec; + + function IndexOfDraggingToolbar(const List: TList): Integer; + { Returns index of toolbar in List that's currently being dragged, or -1 } + var + I: Integer; + begin + for I := 0 to List.Count-1 do + if TTBCustomDockableWindow(List[I]).FDragMode then begin + Result := I; + Exit; + end; + Result := -1; + end; + + function ShiftLeft(const Row, StartIndex, MaxSize: Integer): Integer; + { Removes PrecSpace pixels from toolbars at or before StartIndex until the + right edge of the toolbar at StartIndex is <= MaxSize. + Returns the total number of PrecSpace pixels removed from toolbars. } + var + PixelsOffEdge, I, J: Integer; + begin + Result := 0; + PixelsOffEdge := -MaxSize; + for I := 0 to StartIndex do begin + if PosData[I].Row = Row then begin + Inc(PixelsOffEdge, PosData[I].PrecSpace); + Inc(PixelsOffEdge, PosData[I].Size); + end; + end; + if PixelsOffEdge > 0 then + for I := StartIndex downto 0 do begin + if PosData[I].Row = Row then begin + J := PixelsOffEdge; + if PosData[I].PrecSpace < J then + J := PosData[I].PrecSpace; + Dec(PosData[I].PrecSpace, J); + Dec(PixelsOffEdge, J); + Inc(Result, J); + if PixelsOffEdge = 0 then + Break; + end; + end; + end; + + function GetNextToolbar(const GoForward: Boolean; const Row: Integer; + const StartIndex: Integer): Integer; + var + I: Integer; + begin + Result := -1; + I := StartIndex; + while True do begin + if GoForward then begin + Inc(I); + if I >= NewDockList.Count then + Break; + end + else begin + Dec(I); + if I < 0 then + Break; + end; + if PosData[I].Row = Row then begin + Result := I; + Break; + end; + end; + end; + +var + LeftRight: Boolean; + EmptySize, HighestRow, R, CurPos, CurRowPixel, I, J, K, L, ClientW, + ClientH, MaxSize, TotalSize, PixelsPastMaxSize, Offset, CurRealPos, DragIndex, + MinRealPos, DragIndexPos, ToolbarsOnRow, CurRowSize: Integer; + T: TTBCustomDockableWindow; + S: TPoint; + RowIsEmpty: Boolean; +label FoundNextToolbar; +begin + if (FDisableArrangeToolbars > 0) or (csLoading in ComponentState) then begin + FArrangeToolbarsNeeded := True; + Exit; + end; + + NewDockList := nil; + Inc(FDisableArrangeToolbars); + try + { Work around VCL alignment bug when docking toolbars taller or wider than + the client height or width of the form. } + {if not(csDesigning in ComponentState) and HandleAllocated then + SetWindowPos(Handle, HWND_TOP, 0, 0, 0, 0, + SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);} + + LeftRight := Position in PositionLeftOrRight; + + if not HasVisibleToolbars then begin + EmptySize := Ord(FFixAlign); + if csDesigning in ComponentState then + EmptySize := 9; + if not LeftRight then + ChangeWidthHeight(Width, EmptySize) + else + ChangeWidthHeight(EmptySize, Height); + Exit; + end; + + { It can't read the ClientWidth and ClientHeight properties because they + attempt to create a handle, which requires Parent to be set. "ClientW" + and "ClientH" are calculated instead. } + ClientW := Width - FNonClientWidth; + if ClientW < 0 then ClientW := 0; + ClientH := Height - FNonClientHeight; + if ClientH < 0 then ClientH := 0; + + { Remove toolbars from DockList & DockVisibleList that are destroying, so + that no methods on these toolbars will be called. + This is needed because in certain rare cases ArrangeToolbars can be + indirectly called while a docked toolbar is being destroyed. } + for I := DockList.Count-1 downto 0 do begin + T := TTBCustomDockableWindow(DockList[I]); + if csDestroying in T.ComponentState then begin + DockList.Delete(I); + DockVisibleList.Remove(T); + end; + end; + + { If LimitToOneRow is True, only use the first row } + if FLimitToOneRow then + for I := 0 to DockList.Count-1 do + with TTBCustomDockableWindow(DockList[I]) do + FDockRow := 0; + + { Copy DockList to NewDockList, and ensure it is in correct ordering + according to DockRow/DockPos } + NewDockList := TList.Create; + NewDockList.Count := DockList.Count; + for I := 0 to NewDockList.Count-1 do + NewDockList[I] := DockList[I]; + I := IndexOfDraggingToolbar(NewDockList); + NewDockList.Sort(CompareDockRowPos); + DragIndex := IndexOfDraggingToolbar(NewDockList); + if (I <> -1) and TTBCustomDockableWindow(NewDockList[DragIndex]).FDragSplitting then begin + { When splitting, don't allow the toolbar being dragged to change + positions in the dock list } + NewDockList.Move(DragIndex, I); + DragIndex := I; + end; + DockVisibleList.Sort(CompareDockRowPos); + { Find highest row number } + HighestRow := GetHighestRow(False); + + { Create a temporary array that holds new position data for the toolbars } + SetLength(PosData, NewDockList.Count); + for I := 0 to NewDockList.Count-1 do begin + T := TTBCustomDockableWindow(NewDockList[I]); + PosData[I].ActualRow := T.FDockRow; + if ToolbarVisibleOnDock(T) then + PosData[I].Row := T.FDockRow + else + PosData[I].Row := -1; + PosData[I].Pos := T.FDockPos; + end; + + { Find FInsertRowBefore=True and FullSize=True toolbars and make sure there + aren't any other toolbars on the same row. If there are, shift them down + a row. } + for L := 0 to 1 do begin + R := 0; + while R <= HighestRow do begin + for I := 0 to NewDockList.Count-1 do begin + T := TTBCustomDockableWindow(NewDockList[I]); + if (PosData[I].ActualRow = R) and + (((L = 0) and T.FInsertRowBefore and not LimitToOneRow) or + ((L = 1) and T.FullSize)) then + for J := 0 to NewDockList.Count-1 do + if (J <> I) and (PosData[J].ActualRow = R) then begin + for K := 0 to NewDockList.Count-1 do begin + if K <> I then begin + if PosData[K].ActualRow >= R then + Inc(PosData[K].ActualRow); + if PosData[K].Row >= R then + Inc(PosData[K].Row); + end; + end; + Inc(HighestRow); + Break; + end; + end; + Inc(R); + end; + end; + + { Remove blank rows. + Note that rows that contain only invisible or currently floating toolbars + are intentionally not removed, so that when the toolbars are shown again, + they stay on their own row. } + R := 0; + while R <= HighestRow do begin + RowIsEmpty := True; + for I := 0 to NewDockList.Count-1 do + if PosData[I].ActualRow = R then begin + RowIsEmpty := False; + Break; + end; + if RowIsEmpty then begin + { Shift all ones higher than R back one } + for I := 0 to NewDockList.Count-1 do begin + if PosData[I].ActualRow > R then + Dec(PosData[I].ActualRow); + if PosData[I].Row > R then + Dec(PosData[I].Row); + end; + Dec(HighestRow); + end + else + Inc(R); + end; + + { Calculate positions and sizes of each row } + R := 0; + while R <= HighestRow do begin + if not LeftRight then + MaxSize := ClientW + else + MaxSize := ClientH; + + { Set initial sizes } + TotalSize := 0; + ToolbarsOnRow := 0; + MinRealPos := 0; + for I := 0 to NewDockList.Count-1 do begin + if PosData[I].Row = R then begin + T := TTBCustomDockableWindow(NewDockList[I]); + T.GetBaseSize(S); + if not LeftRight then + J := S.X + T.NonClientWidth + else + J := S.Y + T.NonClientHeight; + PosData[I].FullSize := J; + PosData[I].Size := J; + PosData[I].ShrinkMode := T.GetShrinkMode; + PosData[I].MinimumSize := 0; + T.GetMinShrinkSize(PosData[I].MinimumSize); + if PosData[I].MinimumSize > PosData[I].FullSize then + { don't allow minimum shrink size to be less than full size } + PosData[I].MinimumSize := PosData[I].FullSize; + if PosData[I].ShrinkMode = tbsmChevron then + Inc(MinRealPos, PosData[I].MinimumSize) + else + Inc(MinRealPos, PosData[I].FullSize); + { If the toolbar isn't the first toolbar on the row, and the toolbar + would go off the edge even after it's shrunk, then move it onto a + row of its own } + if (ToolbarsOnRow > 0) and (MinRealPos > MaxSize) and + not LimitToOneRow then begin + for K := I to NewDockList.Count-1 do begin + if PosData[K].ActualRow >= R then + Inc(PosData[K].ActualRow); + if PosData[K].Row >= R then + Inc(PosData[K].Row); + end; + Inc(HighestRow); + Break; + end; + Inc(TotalSize, J); + Inc(ToolbarsOnRow); + end; + end; + PixelsPastMaxSize := TotalSize - MaxSize; + + { Set initial arrangement; don't shrink toolbars yet } + DragIndexPos := 0; + CurPos := 0; + CurRealPos := 0; + MinRealPos := 0; + for I := 0 to NewDockList.Count-1 do begin + T := TTBCustomDockableWindow(NewDockList[I]); + if PosData[I].Row = R then begin + if (CurPos = 0) and (T.FullSize or T.Stretch) then + { Force to left } + J := 0 + else + J := T.FDockPos; + if I = DragIndex then + DragIndexPos := J; + { Don't let this toolbar overlap preceding toolbars by more than + the sum of their minimum sizes } + if J < MinRealPos then + J := MinRealPos; + if J > CurPos then begin + { There's a gap between the left edge or previous toolbar and + this toolbar } + if PixelsPastMaxSize <= 0 then begin + PosData[I].PrecSpace := J - CurPos; + CurPos := J; + end + else + { Don't allow a gap if exceeding MaxSize } + J := CurPos; + end + else begin + if J < CurRealPos then + PosData[I].Overlap := CurRealPos - J; + end; + + Inc(CurPos, PosData[I].Size); + CurRealPos := J + PosData[I].Size; + Inc(MinRealPos, PosData[I].MinimumSize); + end; + end; + + { If we aren't exceeding MaxSize, allow the toolbar being dragged + to push other toolbars to the left } + if (PixelsPastMaxSize < 0) and (DragIndex <> -1) and + (PosData[DragIndex].Row = R) then begin + I := GetNextToolbar(False, R, DragIndex); + if I <> -1 then begin + J := ShiftLeft(R, I, DragIndexPos); + if J > 0 then begin + { Ensure that toolbars that follow the toolbar being dragged stay + at the same place by increasing PrecSpace on the next toolbar } + I := GetNextToolbar(True, R, DragIndex); + if I <> -1 then + Inc(PosData[I].PrecSpace, J); + end; + end; + end; + + { If any toolbars are going off the edge of the dock, try to make them + at least partially visible by shifting preceding toolbars left } + I := GetNextToolbar(False, R, NewDockList.Count); + if I <> -1 then + ShiftLeft(R, I, MaxSize); + + { Shrink toolbars that overlap other toolbars (Overlaps[x] > 0) } + if PixelsPastMaxSize > 0 then begin + Offset := 0; + for I := 0 to NewDockList.Count-1 do begin + if PosData[I].Row <> R then + Continue; + T := TTBCustomDockableWindow(NewDockList[I]); + if (ToolbarsOnRow > 1) and T.FDragMode then + T.FDragCanSplit := True; + Inc(Offset, PosData[I].Overlap); + if Offset > PixelsPastMaxSize then + Offset := PixelsPastMaxSize; + if Offset > 0 then + for J := I-1 downto 0 do begin + if PosData[J].Row <> R then + Continue; + { How much can we shrink this toolbar J to get toolbar I to + its preferred position? } + if PosData[J].ShrinkMode = tbsmChevron then + L := Offset + else + L := 0; + K := -(PosData[J].Size - L - PosData[J].MinimumSize); { the number of pixels that exceed the minimum size } + if K > 0 then + { Don't shrink a toolbar below its minimum allowed size } + Dec(L, K); + Dec(PosData[J].Size, L); + Dec(PixelsPastMaxSize, L); + Dec(Offset, L); + if (Offset = 0) or + { This is needed so toolbars can push other toolbars to the + right when splitting: } + (J = DragIndex) then + Break; + end; + end; + end; + + { Still exceeding MaxSize? Make sure the rightmost toolbar(s) are + at least partially visible with a width of MinimumSize } + if PixelsPastMaxSize > 0 then begin + for I := NewDockList.Count-1 downto 0 do begin + if (PosData[I].Row <> R) or (PosData[I].ShrinkMode = tbsmNone) or + ((PosData[I].ShrinkMode = tbsmWrap) and (ToolbarsOnRow > 1)) then + Continue; + J := PosData[I].Size - PosData[I].MinimumSize; + if J > 0 then begin { can we shrink this toolbar any? } + if J > PixelsPastMaxSize then + J := PixelsPastMaxSize; + Dec(PosData[I].Size, J); + Dec(PixelsPastMaxSize, J); + end; + if PixelsPastMaxSize = 0 then + Break; + end; + end; + + { Set Poses, and adjust size of FullSize & Stretch toolbars } + CurPos := 0; + for I := 0 to NewDockList.Count-1 do begin + T := TTBCustomDockableWindow(NewDockList[I]); + if PosData[I].Row = R then begin + if T.FullSize or T.Stretch then begin + { Remove any preceding space from this toolbar } + Inc(PosData[I].Size, PosData[I].PrecSpace); + PosData[I].PrecSpace := 0; + end; + Inc(CurPos, PosData[I].PrecSpace); + if T.FullSize then begin + { Claim all space } + if PosData[I].Size < MaxSize then + PosData[I].Size := MaxSize; + end + else if T.Stretch then begin + { Steal any preceding space from the next toolbar } + for J := I+1 to NewDockList.Count-1 do + if PosData[J].Row = R then begin + Inc(PosData[I].Size, PosData[J].PrecSpace); + PosData[J].PrecSpace := 0; + goto FoundNextToolbar; + end; + { or claim any remaining space } + if PosData[I].Size < MaxSize - CurPos then + PosData[I].Size := MaxSize - CurPos; + FoundNextToolbar: + end; + PosData[I].Pos := CurPos; + Inc(CurPos, PosData[I].Size); + end; + end; + + Inc(R); + end; + + for I := 0 to NewDockList.Count-1 do begin + T := TTBCustomDockableWindow(NewDockList[I]); + T.FEffectiveDockRow := PosData[I].ActualRow; + T.FEffectiveDockPos := PosData[I].Pos; + { If FCommitNewPositions is True, update all the toolbars' DockPos and + DockRow properties to match the actual positions. + Also update the ordering of DockList to match NewDockList } + if FCommitNewPositions then begin + T.FDockRow := T.FEffectiveDockRow; + T.FDockPos := T.FEffectiveDockPos; + DockList[I] := NewDockList[I]; + end; + end; + + { Now actually move the toolbars } + CurRowPixel := 0; + for R := 0 to HighestRow do begin + CurRowSize := -1; + for I := 0 to NewDockList.Count-1 do begin + T := TTBCustomDockableWindow(NewDockList[I]); + if PosData[I].Row = R then begin + K := T.FCurrentSize; + T.FCurrentSize := PosData[I].Size; + if PosData[I].Size >= PosData[I].FullSize then begin + T.FCurrentSize := 0; + { Reason: so that if new items are added to a non-shrunk toolbar + at run-time (causing its width to increase), the toolbar won't + shrink unnecessarily } + end; + if (PosData[I].ShrinkMode <> tbsmNone) and (T.FCurrentSize <> K) then begin + { If Size is changing and we are to display a chevron or wrap, + call DoArrange to get an accurate row size } + S := T.DoArrange(False, TBGetDockTypeOf(Self, False), False, Self); + { Force a rearrange in case the actual size isn't changing but the + chevron visibility might have changed (which can happen if + items are added to a FullSize=True toolbar at run-time) } + PosData[I].NeedArrange := True; + end + else begin + if (PosData[I].ShrinkMode = tbsmWrap) and (PosData[I].Size < PosData[I].FullSize) then begin + { Preserve existing height (or width) on a wrapped toolbar + whose size isn't changing now } + S.X := T.Width - T.NonClientWidth; + S.Y := T.Height - T.NonClientHeight; + end + else + T.GetBaseSize(S); + end; + if not LeftRight then + K := S.Y + else + K := S.X; + T.FLastRowSize := K; + if K > CurRowSize then + CurRowSize := K; + end; + end; + if CurRowSize <> -1 then + Inc(CurRowSize, DockedBorderSize2) + else + CurRowSize := 0; + for I := 0 to NewDockList.Count-1 do begin + T := TTBCustomDockableWindow(NewDockList[I]); + if PosData[I].Row = R then begin + Inc(T.FUpdatingBounds); + try + K := T.FCurrentSize; + if PosData[I].NeedArrange then + T.FArrangeNeeded := True; + if not LeftRight then + T.SetBounds(PosData[I].Pos, CurRowPixel, PosData[I].Size, CurRowSize) + else + T.SetBounds(CurRowPixel, PosData[I].Pos, CurRowSize, PosData[I].Size); + if T.FArrangeNeeded then + { ^ don't arrange again if SetBounds call already caused one } + T.Arrange; + { Restore FCurrentSize since TTBToolbarView.DoUpdatePositions + clears it } + T.FCurrentSize := K; + finally + Dec(T.FUpdatingBounds); + end; + end; + end; + Inc(CurRowPixel, CurRowSize); + end; + + { Set the size of the dock } + if not LeftRight then + ChangeWidthHeight(Width, CurRowPixel + FNonClientHeight) + else + ChangeWidthHeight(CurRowPixel + FNonClientWidth, Height); + finally + Dec(FDisableArrangeToolbars); + FArrangeToolbarsNeeded := False; + FCommitNewPositions := False; + NewDockList.Free; + end; +end; + +procedure TTBDock.CommitPositions; +{ Copies docked toolbars' EffectiveDockRow and EffectiveDockPos properties + into DockRow and DockPos respectively. + Note that this does not reorder DockList like ArrangeToolbars does when + FCommitNewPositions=True. } +var + I: Integer; + T: TTBCustomDockableWindow; +begin + for I := 0 to DockVisibleList.Count-1 do begin + T := TTBCustomDockableWindow(DockVisibleList[I]); + T.FDockRow := T.FEffectiveDockRow; + T.FDockPos := T.FEffectiveDockPos; + end; +end; + +procedure TTBDock.ChangeDockList(const Insert: Boolean; + const Bar: TTBCustomDockableWindow); +{ Inserts or removes Bar from DockList } +var + I: Integer; +begin + I := DockList.IndexOf(Bar); + if Insert then begin + if I = -1 then begin + Bar.FreeNotification(Self); + DockList.Add(Bar); + end; + end + else begin + if I <> -1 then + DockList.Delete(I); + end; + ToolbarVisibilityChanged(Bar, False); +end; + +procedure TTBDock.ToolbarVisibilityChanged(const Bar: TTBCustomDockableWindow; + const ForceRemove: Boolean); +var + Modified, VisibleOnDock: Boolean; + I: Integer; +begin + Modified := False; + I := DockVisibleList.IndexOf(Bar); + VisibleOnDock := not ForceRemove and ToolbarVisibleOnDock(Bar); + if VisibleOnDock then begin + if I = -1 then begin + DockVisibleList.Add(Bar); + Modified := True; + end; + end + else begin + if I <> -1 then begin + DockVisibleList.Remove(Bar); + Modified := True; + end; + end; + + if Modified then begin + ArrangeToolbars; + + if Assigned(FOnInsertRemoveBar) then + FOnInsertRemoveBar(Self, VisibleOnDock, Bar); + end; +end; + +procedure TTBDock.Loaded; +begin + inherited; + { Rearranging is disabled while the component is loading, so now that it's + loaded, rearrange it. } + ArrangeToolbars; +end; + +procedure TTBDock.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited; + if Operation = opRemove then begin + if AComponent = FBackground then + Background := nil + else if AComponent is TTBCustomDockableWindow then begin + DockList.Remove(AComponent); + DockVisibleList.Remove(AComponent); + end; + end; +end; + +function TTBDock.GetPalette: HPALETTE; +begin + if UsingBackground and Assigned(FBackground) then + { ^ by default UsingBackground returns False if FBackground isn't assigned, + but UsingBackground may be overridden and return True when it isn't } + Result := FBackground.GetPalette + else + Result := 0; +end; + +procedure TTBDock.WMEraseBkgnd(var Message: TWMEraseBkgnd); +var + R, R2: TRect; + P1, P2: TPoint; + SaveIndex: Integer; +begin + { Draw the Background if there is one, otherwise use default erasing + behavior } + if UsingBackground then begin + R := ClientRect; + R2 := R; + { Make up for nonclient area } + P1 := ClientToScreen(Point(0, 0)); + P2 := Parent.ClientToScreen(BoundsRect.TopLeft); + Dec(R2.Left, Left + (P1.X-P2.X)); + Dec(R2.Top, Top + (P1.Y-P2.Y)); + SaveIndex := SaveDC(Message.DC); + IntersectClipRect(Message.DC, R.Left, R.Top, R.Right, R.Bottom); + DrawBackground(Message.DC, R2); + RestoreDC(Message.DC, SaveIndex); + Message.Result := 1; + end + else + inherited; +end; + +procedure TTBDock.Paint; +var + R: TRect; +begin + inherited; + { Draw dotted border in design mode } + if csDesigning in ComponentState then begin + R := ClientRect; + with Canvas do begin + Pen.Style := psDot; + Pen.Color := clBtnShadow; + Brush.Style := bsClear; + Rectangle(R.Left, R.Top, R.Right, R.Bottom); + Pen.Style := psSolid; + end; + end; +end; + +procedure TTBDock.WMMove(var Message: TWMMove); +begin + inherited; + if UsingBackground then + InvalidateBackgrounds; +end; + +{$IFNDEF JR_D4} +procedure TTBDock.WMSize(var Message: TWMSize); +begin + inherited; + if not(csLoading in ComponentState) and Assigned(FOnResize) then + FOnResize(Self); +end; +{$ENDIF} + +procedure TTBDock.WMNCCalcSize(var Message: TWMNCCalcSize); + + procedure ApplyToRect(var R: TRect); + begin + if blTop in BoundLines then Inc(R.Top); + if blBottom in BoundLines then Dec(R.Bottom); + if blLeft in BoundLines then Inc(R.Left); + if blRight in BoundLines then Dec(R.Right); + end; + +{$IFDEF CLR} +var + Params: TNCCalcSizeParams; +{$ENDIF} +begin + inherited; + { note to self: non-client size is stored in FNonClientWidth & + FNonClientHeight } + {$IFNDEF CLR} + ApplyToRect(Message.CalcSize_Params.rgrc[0]); + {$ELSE} + Params := Message.CalcSize_Params; + ApplyToRect(Params.rgrc0); + Message.CalcSize_Params := Params; + {$ENDIF} +end; + +procedure TTBDock.DrawNCArea(const DrawToDC: Boolean; const ADC: HDC; + const Clip: HRGN); + + procedure DrawLine(const DC: HDC; const X1, Y1, X2, Y2: Integer); + begin + MoveToEx(DC, X1, Y1, nil); LineTo(DC, X2, Y2); + end; +var + RW, R, R2, RC: TRect; + DC: HDC; + HighlightPen, ShadowPen, SavePen: HPEN; + FillBrush: HBRUSH; +label SkipFillRect; +begin + { This works around WM_NCPAINT problem described at top of source code } + {no! R := Rect(0, 0, Width, Height);} + GetWindowRect(Handle, RW); + R := RW; + OffsetRect(R, -R.Left, -R.Top); + + if not DrawToDC then + DC := GetWindowDC(Handle) + else + DC := ADC; + try + { Use update region } + if not DrawToDC then + SelectNCUpdateRgn(Handle, DC, Clip); + + { Draw BoundLines } + R2 := R; + if (BoundLines <> []) and + ((csDesigning in ComponentState) or HasVisibleToolbars) then begin + HighlightPen := CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNHIGHLIGHT)); + ShadowPen := CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNSHADOW)); + SavePen := SelectObject(DC, ShadowPen); + if blTop in BoundLines then begin + DrawLine(DC, R.Left, R.Top, R.Right, R.Top); + Inc(R2.Top); + end; + if blLeft in BoundLines then begin + DrawLine(DC, R.Left, R.Top, R.Left, R.Bottom); + Inc(R2.Left); + end; + SelectObject(DC, HighlightPen); + if blBottom in BoundLines then begin + DrawLine(DC, R.Left, R.Bottom-1, R.Right, R.Bottom-1); + Dec(R2.Bottom); + end; + if blRight in BoundLines then begin + DrawLine(DC, R.Right-1, R.Top, R.Right-1, R.Bottom); + Dec(R2.Right); + end; + SelectObject(DC, SavePen); + DeleteObject(ShadowPen); + DeleteObject(HighlightPen); + end; + Windows.GetClientRect(Handle, RC); + if not IsRectEmpty(RC) then begin + { ^ ExcludeClipRect can't be passed rectangles that have (Bottom < Top) or + (Right < Left) since it doesn't treat them as empty } + MapWindowPoints(Handle, 0, RC, 2); + OffsetRect(RC, -RW.Left, -RW.Top); + if EqualRect(RC, R2) then + { Skip FillRect because there would be nothing left after ExcludeClipRect } + goto SkipFillRect; + ExcludeClipRect(DC, RC.Left, RC.Top, RC.Right, RC.Bottom); + end; + FillBrush := CreateSolidBrush(ColorToRGB(Color)); + FillRect(DC, R2, FillBrush); + DeleteObject(FillBrush); + SkipFillRect: + finally + if not DrawToDC then + ReleaseDC(Handle, DC); + end; +end; + +procedure TTBDock.WMNCPaint(var Message: TMessage); +begin + DrawNCArea(False, 0, HRGN(Message.WParam)); +end; + +procedure DockNCPaintProc(Wnd: HWND; DC: HDC; AppData: TObject); +begin + TTBDock(AppData).DrawNCArea(True, DC, 0); +end; + +procedure TTBDock.WMPrint(var Message: TMessage); +begin + HandleWMPrint(Handle, Message, DockNCPaintProc, Self); +end; + +procedure TTBDock.WMPrintClient(var Message: + {$IFNDEF CLR} TMessage {$ELSE} TWMPrintClient {$ENDIF}); +begin + HandleWMPrintClient(PaintHandler, Message); +end; + +procedure TTBDock.CMSysColorChange(var Message: TMessage); +begin + inherited; + if Assigned(FBackground) then + FBackground.SysColorChanged; +end; + +procedure TTBDock.RelayMsgToFloatingBars({$IFNDEF CLR}var{$ELSE}const{$ENDIF} Message: TMessage); +var + I: Integer; + T: TTBCustomDockableWindow; +begin + for I := 0 to DockList.Count-1 do begin + T := TTBCustomDockableWindow(DockList[I]); + { Note: We must be careful about relaying WM_SYSCOMMAND. We can't send it + to classes that don't have special handling for it (as indicated by the + csMenuEvents style, which TTBToolWindow lacks) because the VCL's + default handling would send it back to the main form, resulting in + infinite recursion. } + if ((Message.Msg <> WM_SYSCOMMAND) or (csMenuEvents in T.ControlStyle)) and + T.Floating and T.CanFocus then begin + Message.Result := T.Perform(Message.Msg, Message.WParam, Message.LParam); + if Message.Result <> 0 then + Exit; + end; + end; +end; + +procedure TTBDock.WMSysCommand(var Message: TWMSysCommand); +begin + { Relay WM_SYSCOMMAND messages to floating toolbars which were formerly + docked. That way, items on floating menu bars can be accessed with Alt. } + if Message.CmdType and $FFF0 = SC_KEYMENU then + RelayMsgToFloatingBars({$IFNDEF CLR} TMessage(Message) {$ELSE} Message.OriginalMessage {$ENDIF}); +end; + +procedure TTBDock.CMDialogKey(var Message: TCMDialogKey); +begin + RelayMsgToFloatingBars({$IFNDEF CLR} TMessage(Message) {$ELSE} Message.OriginalMessage {$ENDIF}); + if Message.Result = 0 then + inherited; +end; + +procedure TTBDock.CMDialogChar(var Message: TCMDialogChar); +begin + RelayMsgToFloatingBars({$IFNDEF CLR} TMessage(Message) {$ELSE} Message.OriginalMessage {$ENDIF}); + if Message.Result = 0 then + inherited; +end; + +{ TTBDock - property access methods } + +procedure TTBDock.SetAllowDrag(Value: Boolean); +var + I: Integer; +begin + if FAllowDrag <> Value then begin + FAllowDrag := Value; + for I := 0 to ControlCount-1 do + if Controls[I] is TTBCustomDockableWindow then + RecalcNCArea(TTBCustomDockableWindow(Controls[I])); + end; +end; + +function TTBDock.UsingBackground: Boolean; +begin + Result := Assigned(FBackground) and FBackground.UsingBackground; +end; + +procedure TTBDock.DrawBackground(DC: HDC; const DrawRect: TRect); +begin + FBackground.Draw(DC, DrawRect); +end; + +procedure TTBDock.InvalidateBackgrounds; +{ Called after background is changed } +var + I: Integer; + T: TTBCustomDockableWindow; +begin + Invalidate; + { Synchronize child toolbars also } + for I := 0 to DockList.Count-1 do begin + T := TTBCustomDockableWindow(DockList[I]); + if ToolbarVisibleOnDock(T) then + { Invalidate both non-client and client area } + InvalidateAll(T); + end; +end; + +procedure TTBDock.SetBackground(Value: TTBBasicBackground); +begin + if FBackground <> Value then begin + if Assigned(FBackground) then + FBackground.UnregisterChanges(BackgroundChanged); + FBackground := Value; + if Assigned(Value) then begin + Value.FreeNotification(Self); + Value.RegisterChanges(BackgroundChanged); + end; + InvalidateBackgrounds; + end; +end; + +procedure TTBDock.BackgroundChanged(Sender: TObject); +begin + InvalidateBackgrounds; +end; + +procedure TTBDock.SetBackgroundOnToolbars(Value: Boolean); +begin + if FBkgOnToolbars <> Value then begin + FBkgOnToolbars := Value; + InvalidateBackgrounds; + end; +end; + +procedure TTBDock.SetBoundLines(Value: TTBDockBoundLines); +var + X, Y: Integer; + B: TTBDockBoundLines; +begin + if FBoundLines <> Value then begin + FBoundLines := Value; + X := 0; + Y := 0; + B := BoundLines; { optimization } + if blTop in B then Inc(Y); + if blBottom in B then Inc(Y); + if blLeft in B then Inc(X); + if blRight in B then Inc(X); + FNonClientWidth := X; + FNonClientHeight := Y; + RecalcNCArea(Self); + end; +end; + +procedure TTBDock.SetFixAlign(Value: Boolean); +begin + if FFixAlign <> Value then begin + FFixAlign := Value; + ArrangeToolbars; + end; +end; + +procedure TTBDock.SetPosition(Value: TTBDockPosition); +begin + if (FPosition <> Value) and (ControlCount <> 0) then + raise EInvalidOperation.Create(STBDockCannotChangePosition); + FPosition := Value; + case Position of + dpTop: Align := alTop; + dpBottom: Align := alBottom; + dpLeft: Align := alLeft; + dpRight: Align := alRight; + end; +end; + +function TTBDock.GetToolbarCount: Integer; +begin + Result := DockVisibleList.Count; +end; + +function TTBDock.GetToolbars(Index: Integer): TTBCustomDockableWindow; +begin + Result := TTBCustomDockableWindow(DockVisibleList[Index]); +end; + +(*function TTBDock.GetVersion: TToolbar97Version; +begin + Result := Toolbar97VersionPropText; +end; + +procedure TTBDock.SetVersion(const Value: TToolbar97Version); +begin + { write method required for the property to show up in Object Inspector } +end;*) + + +{ TTBFloatingWindowParent - Internal } + +procedure TTBFloatingWindowParent.CreateParams(var Params: TCreateParams); +const + ThickFrames: array[Boolean] of DWORD = (0, WS_THICKFRAME); +begin + inherited; + + { Disable complete redraws when size changes. CS_H/VREDRAW cause flicker + and are not necessary for this control at run time } + if not(csDesigning in ComponentState) then + with Params.WindowClass do + Style := Style and not(CS_HREDRAW or CS_VREDRAW); + + with Params do begin + { Note: WS_THICKFRAME and WS_BORDER styles are included to ensure that + sizing grips are displayed on child controls with scrollbars. The + thick frame or border is not drawn by Windows; TCustomToolWindow97 + handles all border drawing by itself. } + if not(csDesigning in ComponentState) then + Style := WS_POPUP or WS_BORDER or ThickFrames[FDockableWindow.FResizable] + else + Style := Style or WS_BORDER or ThickFrames[FDockableWindow.FResizable]; + { The WS_EX_TOOLWINDOW style is needed so there isn't a taskbar button + for the toolbar when FloatingMode = fmOnTopOfAllForms. } + ExStyle := WS_EX_TOOLWINDOW; + end; +end; + +procedure TTBFloatingWindowParent.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if (Operation = opRemove) and (AComponent = FParentForm) then + FParentForm := nil; +end; + +procedure TTBFloatingWindowParent.AlignControls(AControl: TControl; var Rect: TRect); +begin + { ignore Align setting of the child toolbar } +end; + +procedure TTBFloatingWindowParent.WMGetMinMaxInfo(var Message: TWMGetMinMaxInfo); +{$IFDEF CLR} +var + Temp: TMinMaxInfo; +{$ENDIF} +begin + inherited; + { Because the window uses the WS_THICKFRAME style (but not for the usual + purpose), it must process the WM_GETMINMAXINFO message to remove the + minimum and maximum size limits it imposes by default. } + {$IFNDEF CLR} + with Message.MinMaxInfo^ do begin + {$ELSE} + Temp := Message.MinMaxInfo; + with Temp do begin + {$ENDIF} + with ptMinTrackSize do begin + X := 1; + Y := 1; + { Note to self: Don't put GetMinimumSize code here, since + ClientWidth/Height values are sometimes invalid during a RecreateWnd } + end; + with ptMaxTrackSize do begin + { Because of the 16-bit (signed) size limitations of Windows 95, + Smallints must be used instead of Integers or Longints } + X := High(Smallint); + Y := High(Smallint); + end; + end; + {$IFDEF CLR} + Message.MinMaxInfo := Temp; + {$ENDIF} +end; + +procedure TTBFloatingWindowParent.CMShowingChanged(var Message: TMessage); +const + ShowFlags: array[Boolean] of UINT = ( + SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_HIDEWINDOW, + SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_SHOWWINDOW); +begin + { Must override TCustomForm/TForm's CM_SHOWINGCHANGED handler so that the + form doesn't get activated when Visible is set to True. } + SetWindowPos(WindowHandle, 0, 0, 0, 0, 0, ShowFlags[Showing and FShouldShow]); +end; + +procedure TTBFloatingWindowParent.CMDialogKey(var Message: TCMDialogKey); +begin + { If Escape if pressed on a floating toolbar, return focus to the form } + if (Message.CharCode = VK_ESCAPE) and + (KeyDataToShiftState(ClipToLongint(Message.KeyData)) = []) and + Assigned(ParentForm) then begin + ParentForm.SetFocus; + Message.Result := 1; + end + else + inherited; +end; + +procedure TTBFloatingWindowParent.CMTextChanged(var Message: TMessage); +begin + inherited; + RedrawNCArea([twrdCaption]); +end; + +function TTBFloatingWindowParent.GetCaptionRect(const AdjustForBorder, + MinusCloseButton: Boolean): TRect; +var + P: TPoint; +begin + Result := Rect(0, 0, ClientWidth, GetSmallCaptionHeight-1); + if MinusCloseButton then + Dec(Result.Right, Result.Bottom); + if AdjustForBorder then begin + P := FDockableWindow.GetFloatingBorderSize; + OffsetRect(Result, P.X, P.Y); + end; +end; + +function TTBFloatingWindowParent.GetCloseButtonRect(const AdjustForBorder: Boolean): TRect; +begin + Result := GetCaptionRect(AdjustForBorder, False); + Result.Left := Result.Right - (GetSmallCaptionHeight-1); +end; + +procedure TTBFloatingWindowParent.WMNCCalcSize(var Message: TWMNCCalcSize); + + procedure ApplyToRect(var R: TRect); + var + TL, BR: TPoint; + begin + FDockableWindow.GetFloatingNCArea(TL, BR); + Inc(R.Left, TL.X); + Inc(R.Top, TL.Y); + Dec(R.Right, BR.X); + Dec(R.Bottom, BR.Y); + end; + +{$IFDEF CLR} +var + Params: TNCCalcSizeParams; +{$ENDIF} +begin + { Doesn't call inherited since it overrides the normal NC sizes } + Message.Result := 0; + {$IFNDEF CLR} + ApplyToRect(Message.CalcSize_Params.rgrc[0]); + {$ELSE} + Params := Message.CalcSize_Params; + ApplyToRect(Params.rgrc0); + Message.CalcSize_Params := Params; + {$ENDIF} +end; + +procedure TTBFloatingWindowParent.WMNCPaint(var Message: TMessage); +begin + { Don't call inherited because it overrides the default NC painting } + DrawNCArea(False, 0, HRGN(Message.WParam), twrdAll); +end; + +procedure FloatingWindowParentNCPaintProc(Wnd: HWND; DC: HDC; AppData: TObject); +begin + with TTBFloatingWindowParent(AppData) do + DrawNCArea(True, DC, 0, twrdAll); +end; + +procedure TTBFloatingWindowParent.WMPrint(var Message: TMessage); +begin + HandleWMPrint(Handle, Message, FloatingWindowParentNCPaintProc, Self); +end; + +procedure TTBFloatingWindowParent.WMPrintClient(var Message: + {$IFNDEF CLR} TMessage {$ELSE} TWMPrintClient {$ENDIF}); +begin + HandleWMPrintClient(PaintHandler, Message); +end; + +procedure TTBFloatingWindowParent.WMNCHitTest(var Message: TWMNCHitTest); +var + P: TPoint; + R: TRect; + BorderSize: TPoint; + C: Integer; +begin + inherited; + with Message do begin + P := SmallPointToPoint(Pos); + GetWindowRect(Handle, R); + Dec(P.X, R.Left); Dec(P.Y, R.Top); + if Result <> HTCLIENT then begin + Result := HTNOWHERE; + if FDockableWindow.ShowCaption and PtInRect(GetCaptionRect(True, False), P) then begin + if FDockableWindow.FCloseButton and PtInRect(GetCloseButtonRect(True), P) then + Result := HT_TB2k_Close + else + Result := HT_TB2k_Caption; + end + else + if FDockableWindow.Resizable then begin + BorderSize := FDockableWindow.GetFloatingBorderSize; + if not(tbdsResizeEightCorner in FDockableWindow.FDockableWindowStyles) then begin + if (P.Y >= 0) and (P.Y < BorderSize.Y) then Result := HTTOP else + if (P.Y < Height) and (P.Y >= Height-BorderSize.Y-1) then Result := HTBOTTOM else + if (P.X >= 0) and (P.X < BorderSize.X) then Result := HTLEFT else + if (P.X < Width) and (P.X >= Width-BorderSize.X-1) then Result := HTRIGHT; + end + else begin + C := BorderSize.X + (GetSmallCaptionHeight-1); + if (P.X >= 0) and (P.X < BorderSize.X) then begin + Result := HTLEFT; + if (P.Y < C) then Result := HTTOPLEFT else + if (P.Y >= Height-C) then Result := HTBOTTOMLEFT; + end + else + if (P.X < Width) and (P.X >= Width-BorderSize.X-1) then begin + Result := HTRIGHT; + if (P.Y < C) then Result := HTTOPRIGHT else + if (P.Y >= Height-C) then Result := HTBOTTOMRIGHT; + end + else + if (P.Y >= 0) and (P.Y < BorderSize.Y) then begin + Result := HTTOP; + if (P.X < C) then Result := HTTOPLEFT else + if (P.X >= Width-C) then Result := HTTOPRIGHT; + end + else + if (P.Y < Height) and (P.Y >= Height-BorderSize.Y-1) then begin + Result := HTBOTTOM; + if (P.X < C) then Result := HTBOTTOMLEFT else + if (P.X >= Width-C) then Result := HTBOTTOMRIGHT; + end; + end; + end; + end; + end; +end; + +procedure TTBFloatingWindowParent.SetCloseButtonState(Pushed: Boolean); +begin + if FCloseButtonDown <> Pushed then begin + FCloseButtonDown := Pushed; + RedrawNCArea([twrdCloseButton]); + end; +end; + +procedure TTBFloatingWindowParent.WMNCLButtonDown(var Message: TWMNCLButtonDown); +var + P: TPoint; + R, BR: TRect; +begin + case ClipToLongint(Message.HitTest) of + HT_TB2k_Caption: begin + P := FDockableWindow.ScreenToClient(Point(Message.XCursor, Message.YCursor)); + FDockableWindow.BeginMoving(P.X, P.Y); + end; + HTLEFT..HTBOTTOMRIGHT: + if FDockableWindow.Resizable then + FDockableWindow.BeginSizing(TTBSizeHandle(ClipToLongint(Message.HitTest) - HTLEFT)); + HT_TB2k_Close: begin + GetWindowRect(Handle, R); + BR := GetCloseButtonRect(True); + OffsetRect(BR, R.Left, R.Top); + if CloseButtonLoop(Handle, BR, SetCloseButtonState) then + FDockableWindow.Close; + end; + else + inherited; + end; +end; + +procedure TTBFloatingWindowParent.WMNCLButtonDblClk(var Message: TWMNCLButtonDblClk); +begin + if ClipToLongint(Message.HitTest) = HT_TB2k_Caption then + FDockableWindow.DoubleClick; +end; + +procedure TTBFloatingWindowParent.WMNCRButtonUp(var Message: TWMNCRButtonUp); +begin + FDockableWindow.ShowNCContextMenu(Message.XCursor, Message.YCursor); +end; + +procedure TTBFloatingWindowParent.WMClose(var Message: TWMClose); +var + MDIParentForm: TTBCustomForm; +begin + { A floating toolbar does not use WM_CLOSE messages when its close button + is clicked, but Windows still sends a WM_CLOSE message if the user + presses Alt+F4 while one of the toolbar's controls is focused. Inherited + is not called since we do not want Windows' default processing - which + destroys the window. Instead, relay the message to the parent form. } + MDIParentForm := GetMDIParent(TBGetToolWindowParentForm(FDockableWindow)); + if Assigned(MDIParentForm) and MDIParentForm.HandleAllocated then + SendMessage(MDIParentForm.Handle, WM_CLOSE, 0, 0); + { Note to self: MDIParentForm is used instead of OwnerForm since MDI + childs don't process Alt+F4 as Close } +end; + +procedure TTBFloatingWindowParent.WMActivate(var Message: TWMActivate); +var + ParentForm: TTBCustomForm; +begin + if csDesigning in ComponentState then begin + inherited; + Exit; + end; + + ParentForm := GetMDIParent(TBGetToolWindowParentForm(FDockableWindow)); + + if Assigned(ParentForm) and ParentForm.HandleAllocated then + SendMessage(ParentForm.Handle, WM_NCACTIVATE, Ord(Message.Active <> WA_INACTIVE), 0); + + if Message.Active <> WA_INACTIVE then begin + { This works around a "gotcha" in TCustomForm.CMShowingChanged. When a form + is hidden, it uses the internal VCL function FindTopMostWindow to + find a new active window. The problem is that handles of floating + toolbars on the form being hidden can be returned by + FindTopMostWindow, so the following code is used to prevent floating + toolbars on the hidden form from being left active. } + if not IsWindowVisible(Handle) then + { ^ Calling IsWindowVisible with a floating toolbar handle will + always return False if its parent form is hidden since the + WH_CALLWNDPROC hook automatically updates the toolbars' + visibility. } + { Find and activate a window besides this toolbar } + SetActiveWindow(FindTopLevelWindow(Handle)) + else + { If the toolbar is being activated and the previous active window wasn't + its parent form, the form is activated instead. This is done so that if + the application is deactivated while a floating toolbar was active and + the application is reactivated again, it returns focus to the form. } + if Assigned(ParentForm) and ParentForm.HandleAllocated and + (Message.ActiveWindow <> ParentForm.Handle) then + SetActiveWindow(ParentForm.Handle); + end; +end; + +procedure TTBFloatingWindowParent.WMMouseActivate(var Message: TWMMouseActivate); +var + ParentForm, MDIParentForm: TTBCustomForm; +begin + if csDesigning in ComponentState then begin + inherited; + Exit; + end; + + { When floating, prevent the toolbar from activating when clicked. + This is so it doesn't take the focus away from the window that had it } + Message.Result := MA_NOACTIVATE; + + { Similar to calling BringWindowToTop, but doesn't activate it } + SetWindowPos(Handle, HWND_TOP, 0, 0, 0, 0, + SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE); + + { Since it is returning MA_NOACTIVATE, activate the form instead. } + ParentForm := TBGetToolWindowParentForm(FDockableWindow); + MDIParentForm := GetMDIParent(ParentForm); + if (FDockableWindow.FFloatingMode = fmOnTopOfParentForm) and + FDockableWindow.FActivateParent and + Assigned(MDIParentForm) and (GetActiveWindow <> Handle) then begin + { ^ Note to self: The GetActiveWindow check must be in there so that + double-clicks work properly on controls like Edits } + if MDIParentForm.HandleAllocated then + SetActiveWindow(MDIParentForm.Handle); + if (MDIParentForm <> ParentForm) and { if it's an MDI child form } + ParentForm.HandleAllocated then + BringWindowToTop(ParentForm.Handle); + end; +end; + +procedure TTBFloatingWindowParent.WMMove(var Message: TWMMove); +begin + inherited; + FDockableWindow.Moved; +end; + +procedure TTBFloatingWindowParent.DrawNCArea(const DrawToDC: Boolean; + const ADC: HDC; const Clip: HRGN; RedrawWhat: TTBToolWindowNCRedrawWhat); +{ Redraws all the non-client area (the border, title bar, and close button) of + the toolbar when it is floating. } +const + BorderColors: array[Boolean] of Integer = + (COLOR_ACTIVEBORDER, COLOR_INACTIVEBORDER); + CaptionBkColors: array[Boolean, Boolean] of Integer = + ((COLOR_ACTIVECAPTION, COLOR_INACTIVECAPTION), + (COLOR_GRADIENTACTIVECAPTION, COLOR_GRADIENTINACTIVECAPTION)); + CloseButtonState: array[Boolean] of UINT = (0, DFCS_PUSHED); +var + DC: HDC; + R, R2: TRect; + Gradient: Boolean; + SavePen: HPEN; + SaveIndex: Integer; + S: TPoint; +begin + if not HandleAllocated then Exit; + + if not DrawToDC then + DC := GetWindowDC(Handle) + else + DC := ADC; + try + { Use update region } + if not DrawToDC then + SelectNCUpdateRgn(Handle, DC, Clip); + + { Work around an apparent NT 4.0 & 2000 bug. If the width of the DC is + greater than the width of the screen, then any call to ExcludeClipRect + inexplicably shrinks the clipping rectangle to the screen width. I've + found that calling IntersectClipRect as done below magically fixes the + problem (but I'm not sure why). } + GetWindowRect(Handle, R); OffsetRect(R, -R.Left, -R.Top); + IntersectClipRect(DC, R.Left, R.Top, R.Right, R.Bottom); + + Gradient := GetSystemParametersInfoBool(SPI_GETGRADIENTCAPTIONS, False); + + { Border } + if twrdBorder in RedrawWhat then begin + { This works around WM_NCPAINT problem described at top of source code } + {no! R := Rect(0, 0, Width, Height);} + GetWindowRect(Handle, R); OffsetRect(R, -R.Left, -R.Top); + R2 := R; + DrawEdge(DC, R, EDGE_RAISED, BF_RECT or BF_ADJUST); + S := FDockableWindow.GetFloatingBorderSize; + InflateRect(R2, -(S.X - 1), -(S.Y - 1)); + FrameRect(DC, R2, GetSysColorBrush(COLOR_BTNFACE)); + SaveIndex := SaveDC(DC); + ExcludeClipRect(DC, R2.Left, R2.Top, R2.Right, R2.Bottom); + FillRect(DC, R, GetSysColorBrush(BorderColors[FDockableWindow.FInactiveCaption])); + RestoreDC(DC, SaveIndex); + end; + + if FDockableWindow.ShowCaption then begin + if (twrdCaption in RedrawWhat) and FDockableWindow.FCloseButton and + (twrdCloseButton in RedrawWhat) then + SaveIndex := SaveDC(DC) + else + SaveIndex := 0; + try + if SaveIndex <> 0 then + with GetCloseButtonRect(True) do + { Reduces flicker } + ExcludeClipRect(DC, Left, Top, Right, Bottom); + + { Caption } + if twrdCaption in RedrawWhat then begin + R := GetCaptionRect(True, FDockableWindow.FCloseButton); + DrawSmallWindowCaption(Handle, DC, R, Caption, + not FDockableWindow.FInactiveCaption); + + { Line below caption } + R := GetCaptionRect(True, False); + SavePen := SelectObject(DC, CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNFACE))); + MoveToEx(DC, R.Left, R.Bottom, nil); + LineTo(DC, R.Right, R.Bottom); + DeleteObject(SelectObject(DC, SavePen)); + end; + finally + if SaveIndex <> 0 then + RestoreDC(DC, SaveIndex); + end; + + { Close button } + if FDockableWindow.FCloseButton then begin + R := GetCloseButtonRect(True); + R2 := R; + InflateRect(R2, 0, -2); + Dec(R2.Right, 2); + if twrdCaption in RedrawWhat then begin + SaveIndex := SaveDC(DC); + ExcludeClipRect(DC, R2.Left, R2.Top, R2.Right, R2.Bottom); + FillRect(DC, R, GetSysColorBrush(CaptionBkColors[Gradient, + FDockableWindow.FInactiveCaption])); + RestoreDC(DC, SaveIndex); + end; + if twrdCloseButton in RedrawWhat then + DrawFrameControl(DC, R2, DFC_CAPTION, DFCS_CAPTIONCLOSE or + CloseButtonState[FCloseButtonDown]); + end; + end; + finally + if not DrawToDC then + ReleaseDC(Handle, DC); + end; +end; + +procedure TTBFloatingWindowParent.RedrawNCArea(const RedrawWhat: TTBToolWindowNCRedrawWhat); +begin + { Note: IsWindowVisible is called as an optimization. There's no need to + draw on invisible windows. } + if HandleAllocated and IsWindowVisible(Handle) then + DrawNCArea(False, 0, 0, RedrawWhat); +end; + +procedure TTBFloatingWindowParent.CallRecreateWnd; +{ This method exists for Delphi.NET: If we try to call RecreateWnd directly + in TTBCustomDockableWindow.SetResizable, we get this compiler error: + "Only methods of descendant types may access protected member + [Borland.Vcl]TWinControl.RecreateWnd across assembly boundaries" } +begin + RecreateWnd; +end; + + +{ TTBCustomDockableWindow } + +constructor TTBCustomDockableWindow.Create(AOwner: TComponent); +begin + inherited; + + ControlStyle := ControlStyle + + [csAcceptsControls, csClickEvents, csDoubleClicks, csSetCaption] - + [csCaptureMouse{capturing is done manually}, csOpaque]; + FAutoResize := True; + FActivateParent := True; + FBorderStyle := bsSingle; + FCloseButton := True; + FDockableTo := [dpTop, dpBottom, dpLeft, dpRight]; + FDockableWindowStyles := [tbdsResizeEightCorner, tbdsResizeClipCursor]; + FDockPos := -1; + FDragHandleStyle := dhSingle; + FEffectiveDockRow := -1; + FHideWhenInactive := True; + FResizable := True; + FShowCaption := True; + FSmoothDrag := True; + FUseLastDock := True; + + Color := clBtnFace; + + if not(csDesigning in ComponentState) then + InstallHookProc(Self, ToolbarHookProc, [hpSendActivate, hpSendActivateApp, + hpSendWindowPosChanged, hpPreDestroy]); + InitTrackMouseEvent; +end; + +destructor TTBCustomDockableWindow.Destroy; +begin + inherited; + FreeAndNil(FDockForms); { must be done after 'inherited' because Notification accesses FDockForms } + FreeAndNil(FFloatParent); + UninstallHookProc(Self, ToolbarHookProc); +end; + +function TTBCustomDockableWindow.HasParent: Boolean; +begin + if Parent is TTBFloatingWindowParent then + Result := False + else + Result := inherited HasParent; +end; + +function TTBCustomDockableWindow.GetParentComponent: TComponent; +begin + if Parent is TTBFloatingWindowParent then + Result := nil + else + Result := inherited GetParentComponent; +end; + +procedure TTBCustomDockableWindow.Moved; +begin + if not(csLoading in ComponentState) and Assigned(FOnMove) and (FDisableOnMove <= 0) then + FOnMove(Self); +end; + +procedure TTBCustomDockableWindow.WMMove(var Message: TWMMove); + + procedure Redraw; + { Redraws the control using an off-screen bitmap to avoid flicker } + var + CR, R: TRect; + W: HWND; + DC, BmpDC: HDC; + Bmp: HBITMAP; + begin + if not HandleAllocated then Exit; + CR := ClientRect; + W := Handle; + if GetUpdateRect(W, R, False) and EqualRect(R, CR) then begin + { The client area is already completely invalid, so don't bother using + an off-screen bitmap } + InvalidateAll(Self); + Exit; + end; + ValidateRect(W, nil); + BmpDC := 0; + Bmp := 0; + DC := GetDC(W); + try + BmpDC := CreateCompatibleDC(DC); + Bmp := CreateCompatibleBitmap(DC, CR.Right, CR.Bottom); + SelectObject(BmpDC, Bmp); + SendMessage(W, WM_NCPAINT, 0, 0); + SendMessage(W, WM_ERASEBKGND, WPARAM(BmpDC), 0); + SendMessage(W, WM_PAINT, WPARAM(BmpDC), 0); + BitBlt(DC, 0, 0, CR.Right, CR.Bottom, BmpDC, 0, 0, SRCCOPY); + finally + if BmpDC <> 0 then DeleteDC(BmpDC); + if Bmp <> 0 then DeleteObject(Bmp); + ReleaseDC(W, DC); + end; + end; + +begin + inherited; + FMoved := True; + if Docked and CurrentDock.UsingBackground then begin + { Needs to redraw so that the background is lined up with the dock at the + new position. } + Redraw; + end; + Moved; +end; + +{$IFNDEF JR_D4} +procedure TTBCustomDockableWindow.WMSize(var Message: TWMSize); +begin + inherited; + if not(csLoading in ComponentState) and Assigned(FOnResize) then + FOnResize(Self); +end; +{$ENDIF} + +procedure TTBCustomDockableWindow.UpdateCaptionState; +{ Updates the caption active/inactive state of a floating tool window. + Called when the tool window is visible or is about to be shown. } + + function IsPopupWindowActive: Boolean; + const + IID_ITBPopupWindow: TGUID = '{E45CBE74-1ECF-44CB-B064-6D45B1924708}'; + var + Ctl: TWinControl; + {$IFDEF CLR} + Intfs: array of System.Type; + I: Integer; + {$ENDIF} + begin + Ctl := FindControl(GetActiveWindow); + { Instead of using "is TTBPopupWindow", which would require linking to the + TB2Item unit, check if the control implements the ITBPopupWindow + interface. This will tell us if it's a TTBPopupWindow or descendant. } + {$IFNDEF CLR} + Result := Assigned(Ctl) and Assigned(Ctl.GetInterfaceEntry(IID_ITBPopupWindow)); + {$ELSE} + Result := False; + if Assigned(Ctl) then begin + Intfs := TypeOf(Ctl).GetInterfaces; + for I := Low(Intfs) to High(Intfs) do begin + if Intfs[I].GUID = IID_ITBPopupWindow then begin + Result := True; + Break; + end; + end; + end; + {$ENDIF} + end; + + function GetActiveFormWindow: HWND; + var + Ctl: TWinControl; + begin + Result := GetActiveWindow; + { If the active window is a TTBFloatingWindowParent (i.e. a control on a + floating toolbar is focused), return the parent form handle instead } + Ctl := FindControl(Result); + if Assigned(Ctl) and (Ctl is TTBFloatingWindowParent) then begin + Ctl := TTBFloatingWindowParent(Ctl).ParentForm; + if Assigned(Ctl) and Ctl.HandleAllocated then + Result := Ctl.Handle; + end; + end; + +var + Inactive: Boolean; + ActiveWnd: HWND; +begin + { Update caption state if floating, but not if a control on a popup window + (e.g. a TTBEditItem) is currently focused; we don't want the captions on + all floating toolbars to turn gray in that case. (The caption state will + get updated when we're called the next time the active window changes, + i.e. when the user dismisses the popup window.) } + if (Parent is TTBFloatingWindowParent) and Parent.HandleAllocated and + not IsPopupWindowActive then begin + Inactive := False; + if not ApplicationIsActive then + Inactive := True + else if (FFloatingMode = fmOnTopOfParentForm) and + (HWND(GetWindowLong(Parent.Handle, GWL_HWNDPARENT)) <> Application.Handle) then begin + { Use inactive caption if the active window doesn't own the float parent + (directly or indirectly). Note: For compatibility with browser-embedded + TActiveForms, we use IsAncestorOfWindow instead of checking + TBGetToolWindowParentForm. } + ActiveWnd := GetActiveFormWindow; + if (ActiveWnd = 0) or not IsAncestorOfWindow(ActiveWnd, Parent.Handle) then + Inactive := True; + end; + if FInactiveCaption <> Inactive then begin + FInactiveCaption := Inactive; + TTBFloatingWindowParent(Parent).RedrawNCArea(twrdAll); + end; + end; +end; + +function TTBCustomDockableWindow.GetShowingState: Boolean; + + function IsWindowVisibleAndNotMinimized(Wnd: HWND): Boolean; + begin + Result := IsWindowVisible(Wnd); + if Result then begin + { Wnd may not be a top-level window (e.g. in the case of an MDI child + form, or an ActiveForm embedded in a web page), so go up the chain of + parent windows and see if any of them are minimized } + repeat + if IsIconic(Wnd) then begin + Result := False; + Break; + end; + { Stop if we're at a top-level window (no need to check owner windows) } + if GetWindowLong(Wnd, GWL_STYLE) and WS_CHILD = 0 then + Break; + Wnd := GetParent(Wnd); + until Wnd = 0; + end; + end; + +var + HideFloatingToolbars: Boolean; + ParentForm: TTBCustomForm; +begin + Result := Showing and (FHidden = 0); + if Floating and not(csDesigning in ComponentState) then begin + HideFloatingToolbars := FFloatingMode = fmOnTopOfParentForm; + if HideFloatingToolbars then begin + ParentForm := TBGetToolWindowParentForm(Self); + if Assigned(ParentForm) and ParentForm.HandleAllocated and + IsWindowVisibleAndNotMinimized(ParentForm.Handle) then + HideFloatingToolbars := False; + end; + Result := Result and not (HideFloatingToolbars or (FHideWhenInactive and not ApplicationIsActive)); + end; +end; + +procedure TTBCustomDockableWindow.UpdateVisibility; +{ Updates the visibility of the tool window, and additionally the caption + state if floating and showing } +var + IsVisible: Boolean; +begin + if HandleAllocated then begin + IsVisible := IsWindowVisible(Handle); + if IsVisible <> GetShowingState then begin + Perform(CM_SHOWINGCHANGED, 0, 0); + { Note: CMShowingChanged will call UpdateCaptionState automatically + when floating and showing } + end + else if IsVisible and Floating then begin + { If we're floating and we didn't send the CM_SHOWINGCHANGED message + then we have to call UpdateCaptionState manually } + UpdateCaptionState; + end; + end; +end; + +function IsTopmost(const Wnd: HWND): Boolean; +begin + Result := GetWindowLong(Wnd, GWL_EXSTYLE) and WS_EX_TOPMOST <> 0; +end; + +procedure TTBCustomDockableWindow.UpdateTopmostFlag; +const + Wnds: array[Boolean] of HWND = (HWND_NOTOPMOST, HWND_TOPMOST); +var + ShouldBeTopmost: Boolean; +begin + if HandleAllocated then begin + if FFloatingMode = fmOnTopOfAllForms then + ShouldBeTopmost := True + else + ShouldBeTopmost := IsTopmost(HWND(GetWindowLong(Parent.Handle, GWL_HWNDPARENT))); + if ShouldBeTopmost <> IsTopmost(Parent.Handle) then + { ^ it must check if it already was topmost or non-topmost or else + it causes problems on Win95/98 for some reason } + SetWindowPos(Parent.Handle, Wnds[ShouldBeTopmost], 0, 0, 0, 0, + SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE); + end; +end; + +procedure TTBCustomDockableWindow.CMShowingChanged(var Message: TMessage); + + function GetPrevWnd(W: HWND): HWND; + var + WasTopmost, Done: Boolean; + ParentWnd: HWND; + begin + WasTopmost := IsTopmost(Parent.Handle); + Result := W; + repeat + Done := True; + Result := GetWindow(Result, GW_HWNDPREV); + ParentWnd := Result; + while ParentWnd <> 0 do begin + if WasTopmost and not IsTopmost(ParentWnd) then begin + Done := False; + Break; + end; + ParentWnd := HWND(GetWindowLong(ParentWnd, GWL_HWNDPARENT)); + if ParentWnd = W then begin + Done := False; + Break; + end; + end; + until Done; + end; + +const + ShowFlags: array[Boolean] of UINT = ( + SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_HIDEWINDOW, + SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_SHOWWINDOW); +var + Show: Boolean; + Form: TTBCustomForm; +begin + { inherited isn't called since TTBCustomDockableWindow handles CM_SHOWINGCHANGED + itself. For reference, the original TWinControl implementation is: + const + ShowFlags: array[Boolean] of Word = ( + SWP_NOSIZE + SWP_NOMOVE + SWP_NOZORDER + SWP_NOACTIVATE + SWP_HIDEWINDOW, + SWP_NOSIZE + SWP_NOMOVE + SWP_NOZORDER + SWP_NOACTIVATE + SWP_SHOWWINDOW); + begin + SetWindowPos(FHandle, 0, 0, 0, 0, 0, ShowFlags[FShowing]); + end; + } + if HandleAllocated then begin + Show := GetShowingState; + if Parent is TTBFloatingWindowParent then begin + if Show then begin + { If the toolbar is floating, set its "owner window" to the parent form + so that the toolbar window always stays on top of the form } + if FFloatingMode = fmOnTopOfParentForm then begin + Form := GetMDIParent(TBGetToolWindowParentForm(Self)); + if Assigned(Form) and Form.HandleAllocated and + (HWND(GetWindowLong(Parent.Handle, GWL_HWNDPARENT)) <> Form.Handle) then begin + SetWindowOwner(Parent.Handle, Form.Handle); + { Following is necessarily to make it immediately realize the + GWL_HWNDPARENT change } + SetWindowPos(Parent.Handle, GetPrevWnd(Form.Handle), 0, 0, 0, 0, SWP_NOACTIVATE or + SWP_NOMOVE or SWP_NOSIZE); + end; + end + else begin + SetWindowOwner(Parent.Handle, Application.Handle); + end; + { Initialize caption state after setting owner but before showing } + UpdateCaptionState; + end; + UpdateTopmostFlag; + { Show/hide the TTBFloatingWindowParent. The following lines had to be + added to fix a problem that was in 1.65d/e. In 1.65d/e, it always + kept TTBFloatingWindowParent visible (this change was made to improve + compatibility with D4's Actions), but this for some odd reason would + cause a Stack Overflow error if the program's main form was closed + while a floating toolwindow was focused. (This problem did not occur + on NT.) } + TTBFloatingWindowParent(Parent).FShouldShow := Show; + Parent.Perform(CM_SHOWINGCHANGED, 0, 0); + end; + SetWindowPos(Handle, 0, 0, 0, 0, 0, ShowFlags[Show]); + if not Show and (GetActiveWindow = Handle) then + { If the window is hidden but is still active, find and activate a + different window } + SetActiveWindow(FindTopLevelWindow(Handle)); + end; +end; + +procedure TTBCustomDockableWindow.CreateParams(var Params: TCreateParams); +begin + inherited; + + { Disable complete redraws when size changes. CS_H/VREDRAW cause flicker + and are not necessary for this control at run time } + if not(csDesigning in ComponentState) then + with Params.WindowClass do + Style := Style and not(CS_HREDRAW or CS_VREDRAW); +end; + +procedure TTBCustomDockableWindow.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited; + if Operation = opRemove then begin + if AComponent = FDefaultDock then + FDefaultDock := nil + else + if AComponent = FLastDock then + FLastDock := nil + else + RemoveFromList(FDockForms, AComponent); + end; +end; + +procedure TTBCustomDockableWindow.MoveOnScreen(const OnlyIfFullyOffscreen: Boolean); +{ Moves the (floating) toolbar so that it is fully (or at least mostly) in + view on the screen } +var + R, S, Test: TRect; +begin + if Floating then begin + R := Parent.BoundsRect; + S := GetRectOfMonitorContainingRect(R, True); + + if OnlyIfFullyOffscreen and IntersectRect(Test, R, S) then + Exit; + + if R.Right > S.Right then + OffsetRect(R, S.Right - R.Right, 0); + if R.Bottom > S.Bottom then + OffsetRect(R, 0, S.Bottom - R.Bottom); + if R.Left < S.Left then + OffsetRect(R, S.Left - R.Left, 0); + if R.Top < S.Top then + OffsetRect(R, 0, S.Top - R.Top); + Parent.BoundsRect := R; + end; +end; + +procedure TTBCustomDockableWindow.ReadPositionData(const Data: TTBReadPositionData); +begin +end; + +procedure TTBCustomDockableWindow.DoneReadingPositionData(const Data: TTBReadPositionData); +begin +end; + +procedure TTBCustomDockableWindow.WritePositionData(const Data: TTBWritePositionData); +begin +end; + +procedure TTBCustomDockableWindow.InitializeOrdering; +begin +end; + +procedure TTBCustomDockableWindow.SizeChanging(const AWidth, AHeight: Integer); +begin +end; + +procedure TTBCustomDockableWindow.ReadSavedAtRunTime(Reader: TReader); +begin + FSavedAtRunTime := Reader.ReadBoolean; +end; + +procedure TTBCustomDockableWindow.WriteSavedAtRunTime(Writer: TWriter); +begin + { WriteSavedAtRunTime only called when not(csDesigning in ComponentState) } + Writer.WriteBoolean(True); +end; + +procedure TTBCustomDockableWindow.DefineProperties(Filer: TFiler); +begin + inherited; + Filer.DefineProperty('SavedAtRunTime', ReadSavedAtRunTime, + WriteSavedAtRunTime, not(csDesigning in ComponentState)); +end; + +procedure TTBCustomDockableWindow.Loaded; +var + R: TRect; +begin + inherited; + { Adjust coordinates if it was initially floating } + if not FSavedAtRunTime and not(csDesigning in ComponentState) and + (Parent is TTBFloatingWindowParent) then begin + R := BoundsRect; + MapWindowPoints(TBValidToolWindowParentForm(Self).Handle, 0, R, 2); + BoundsRect := R; + MoveOnScreen(False); + end; + InitializeOrdering; + { Arranging is disabled while component was loading, so arrange now } + Arrange; +end; + +procedure TTBCustomDockableWindow.BeginUpdate; +begin + Inc(FDisableArrange); +end; + +procedure TTBCustomDockableWindow.EndUpdate; +begin + Dec(FDisableArrange); + if FArrangeNeeded and (FDisableArrange = 0) then + Arrange; +end; + +procedure TTBCustomDockableWindow.AddDockForm(const Form: TTBCustomForm); +begin + if Form = nil then Exit; + if AddToList(FDockForms, Form) then + Form.FreeNotification(Self); +end; + +procedure TTBCustomDockableWindow.RemoveDockForm(const Form: TTBCustomForm); +begin + RemoveFromList(FDockForms, Form); +end; + +function TTBCustomDockableWindow.IsAutoResized: Boolean; +begin + Result := AutoResize or Assigned(CurrentDock) or Floating; +end; + +procedure TTBCustomDockableWindow.ChangeSize(AWidth, AHeight: Integer); +var + S: TPoint; +begin + if Docked then + CurrentDock.ArrangeToolbars + else begin + S := CalcNCSizes; + Inc(AWidth, S.X); + Inc(AHeight, S.Y); + { Leave the width and/or height alone if the control is Anchored + (or Aligned) } + if not Floating then begin + if (akLeft in Anchors) and (akRight in Anchors) then + AWidth := Width; + if (akTop in Anchors) and (akBottom in Anchors) then + AHeight := Height; + end; + Inc(FUpdatingBounds); + try + SetBounds(Left, Top, AWidth, AHeight); + finally + Dec(FUpdatingBounds); + end; + end; +end; + +procedure TTBCustomDockableWindow.Arrange; +var + Size: TPoint; +begin + if (FDisableArrange > 0) or + { Prevent flicker while loading } + (csLoading in ComponentState) or + { Don't call DoArrangeControls when Parent is nil. The VCL sets Parent to + 'nil' during destruction of a component; we can't have an OrderControls + call after a descendant control has freed its data. } + (Parent = nil) then begin + FArrangeNeeded := True; + Exit; + end; + + FArrangeNeeded := False; + + Size := DoArrange(True, TBGetDockTypeOf(CurrentDock, Floating), Floating, + CurrentDock); + if IsAutoResized then + ChangeSize(Size.X, Size.Y); +end; + +procedure TTBCustomDockableWindow.SetBounds(ALeft, ATop, AWidth, AHeight: Integer); +begin + if not(csDesigning in ComponentState) and Floating then begin + { Force Top & Left to 0 if floating } + ALeft := 0; + ATop := 0; + if Parent is TTBFloatingWindowParent then + with Parent do + SetBounds(Left, Top, (Width-ClientWidth) + AWidth, + (Height-ClientHeight) + AHeight); + end; + if (FUpdatingBounds = 0) and ((AWidth <> Width) or (AHeight <> Height)) then + SizeChanging(AWidth, AHeight); + { This allows you to drag the toolbar around the dock at design time } + if (csDesigning in ComponentState) and not(csLoading in ComponentState) and + Docked and (FUpdatingBounds = 0) and ((ALeft <> Left) or (ATop <> Top)) then begin + if not(CurrentDock.Position in PositionLeftOrRight) then begin + FDockRow := CurrentDock.GetDesignModeRowOf(ATop+(Height div 2)); + FDockPos := ALeft; + end + else begin + FDockRow := CurrentDock.GetDesignModeRowOf(ALeft+(Width div 2)); + FDockPos := ATop; + end; + inherited SetBounds(Left, Top, AWidth, AHeight); { only pass any size changes } + CurrentDock.ArrangeToolbars; { let ArrangeToolbars take care of position changes } + end + else begin + inherited; + {if not(csLoading in ComponentState) and Floating and (FUpdatingBounds = 0) then + FFloatingPosition := BoundsRect.TopLeft;} + end; +end; + +procedure TTBCustomDockableWindow.SetParent(AParent: TWinControl); + procedure UpdateFloatingToolWindows; + begin + if Parent is TTBFloatingWindowParent then begin + AddToList(FloatingToolWindows, Self); + Parent.SetBounds(FFloatingPosition.X, FFloatingPosition.Y, + Parent.Width, Parent.Height); + end + else + RemoveFromList(FloatingToolWindows, Self); + end; + function ParentToCurrentDock(const Ctl: TWinControl): TTBDock; + begin + if Ctl is TTBDock then + Result := TTBDock(Ctl) + else + Result := nil; + end; +var + OldCurrentDock, NewCurrentDock: TTBDock; + NewFloating: Boolean; + SaveHandle: HWND; +begin + OldCurrentDock := ParentToCurrentDock(Parent); + NewCurrentDock := ParentToCurrentDock(AParent); + NewFloating := AParent is TTBFloatingWindowParent; + + if AParent = Parent then begin + { Even though AParent is the same as the current Parent, this code is + necessary because when the VCL destroys the parent of the tool window, + it calls TWinControl.Remove to set FParent instead of using SetParent. + However TControl.Destroy does call SetParent(nil), so it is + eventually notified of the change before it is destroyed. } + FCurrentDock := NewCurrentDock; + FFloating := NewFloating; + FDocked := Assigned(FCurrentDock); + UpdateFloatingToolWindows; + end + else begin + if not(csDestroying in ComponentState) and Assigned(AParent) then begin + if Assigned(FOnDockChanging) then + FOnDockChanging(Self, NewFloating, NewCurrentDock); + if Assigned(FOnRecreating) then + FOnRecreating(Self); + end; + + { Before changing between docked and floating state (and vice-versa) + or between docks, increment FHidden and call UpdateVisibility to hide the + toolbar. This prevents any flashing while it's being moved } + Inc(FHidden); + Inc(FDisableOnMove); + try + UpdateVisibility; + if Assigned(OldCurrentDock) then + OldCurrentDock.BeginUpdate; + if Assigned(NewCurrentDock) then + NewCurrentDock.BeginUpdate; + Inc(FUpdatingBounds); + try + if Assigned(AParent) then + DoDockChangingHidden(NewFloating, NewCurrentDock); + BeginUpdate; + try + { FCurrentSize probably won't be valid after changing Parents, so + reset it to zero } + FCurrentSize := 0; + + if Parent is TTBDock then begin + if not FUseLastDock or (FLastDock <> Parent) then + TTBDock(Parent).ChangeDockList(False, Self); + TTBDock(Parent).ToolbarVisibilityChanged(Self, True); + end; + + { By default, the VCL destroys a control's window handle when it + changes parents. Prevent that from happening by capturing the + current handle, detaching the control from its current parent, + then restoring the handle back. } + SaveHandle := 0; + if Assigned(AParent) then begin + SaveHandle := WindowHandle; + WindowHandle := 0; + end; + inherited SetParent(nil); + FCurrentDock := NewCurrentDock; + FFloating := NewFloating; + FDocked := Assigned(FCurrentDock); + try + if SaveHandle <> 0 then begin + WindowHandle := SaveHandle; + Windows.SetParent(SaveHandle, AParent.Handle); + SetWindowPos(SaveHandle, 0, 0, 0, 0, 0, SWP_FRAMECHANGED or + SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER); + end; + inherited; + except + { Failure is rare, but just in case, restore these back. } + FCurrentDock := ParentToCurrentDock(Parent); + FFloating := Parent is TTBFloatingWindowParent; + FDocked := Assigned(FCurrentDock); + raise; + end; + + { FEffectiveDockRow probably won't be valid on the new Parent, so + reset it to -1 so that GetMinRowSize will temporarily ignore this + toolbar } + FEffectiveDockRow := -1; + + { To conserve resources, free FFloatParent if it's no longer the + Parent. But don't do this while FSmoothDragging=True, because + destroying the window the user initially clicked down on causes + Windows to stop delivering mouse-move messages when the cursor is + moved over other applications' windows, even if we still have the + mouse capture. } + if not FSmoothDragging and + Assigned(FFloatParent) and (Parent <> FFloatParent) then + FreeAndNil(FFloatParent); + + if Parent is TTBDock then begin + if FUseLastDock and not FSmoothDragging then begin + LastDock := TTBDock(Parent); { calls ChangeDockList if LastDock changes } + TTBDock(Parent).ToolbarVisibilityChanged(Self, False); + end + else + TTBDock(Parent).ChangeDockList(True, Self); + end; + + UpdateFloatingToolWindows; + + { Schedule an arrange } + Arrange; + finally + EndUpdate; + end; + finally + Dec(FUpdatingBounds); + if Assigned(NewCurrentDock) then + NewCurrentDock.EndUpdate; + if Assigned(OldCurrentDock) then + OldCurrentDock.EndUpdate; + end; + finally + Dec(FDisableOnMove); + Dec(FHidden); + UpdateVisibility; + { ^ The above UpdateVisibility call not only updates the tool window's + visibility after decrementing FHidden, it also sets the + active/inactive state of the caption. } + end; + if Assigned(Parent) then + Moved; + + if not(csDestroying in ComponentState) and Assigned(AParent) then begin + if Assigned(FOnRecreated) then + FOnRecreated(Self); + if Assigned(FOnDockChanged) then + FOnDockChanged(Self); + end; + end; +end; + +procedure TTBCustomDockableWindow.AddDockedNCAreaToSize(var S: TPoint; + const LeftRight: Boolean); +var + TopLeft, BottomRight: TPoint; +begin + GetDockedNCArea(TopLeft, BottomRight, LeftRight); + Inc(S.X, TopLeft.X + BottomRight.X); + Inc(S.Y, TopLeft.Y + BottomRight.Y); +end; + +procedure TTBCustomDockableWindow.AddFloatingNCAreaToSize(var S: TPoint); +var + TopLeft, BottomRight: TPoint; +begin + GetFloatingNCArea(TopLeft, BottomRight); + Inc(S.X, TopLeft.X + BottomRight.X); + Inc(S.Y, TopLeft.Y + BottomRight.Y); +end; + +procedure TTBCustomDockableWindow.GetDockedNCArea(var TopLeft, BottomRight: TPoint; + const LeftRight: Boolean); +var + Z: Integer; +begin + Z := DockedBorderSize; { code optimization... } + TopLeft.X := Z; + TopLeft.Y := Z; + BottomRight.X := Z; + BottomRight.Y := Z; + if not LeftRight then begin + Inc(TopLeft.X, DragHandleSizes[CloseButtonWhenDocked, DragHandleStyle]); + //if FShowChevron then + // Inc(BottomRight.X, tbChevronSize); + end + else begin + Inc(TopLeft.Y, DragHandleSizes[CloseButtonWhenDocked, DragHandleStyle]); + //if FShowChevron then + // Inc(BottomRight.Y, tbChevronSize); + end; +end; + +function TTBCustomDockableWindow.GetFloatingBorderSize: TPoint; +{ Returns size of a thick border. Note that, depending on the Windows version, + this may not be the same as the actual window metrics since it draws its + own border } +const + XMetrics: array[Boolean] of Integer = (SM_CXDLGFRAME, SM_CXFRAME); + YMetrics: array[Boolean] of Integer = (SM_CYDLGFRAME, SM_CYFRAME); +begin + Result.X := GetSystemMetrics(XMetrics[Resizable]); + Result.Y := GetSystemMetrics(YMetrics[Resizable]); +end; + +procedure TTBCustomDockableWindow.GetFloatingNCArea(var TopLeft, BottomRight: TPoint); +begin + with GetFloatingBorderSize do begin + TopLeft.X := X; + TopLeft.Y := Y; + if ShowCaption then + Inc(TopLeft.Y, GetSmallCaptionHeight); + BottomRight.X := X; + BottomRight.Y := Y; + end; +end; + +function TTBCustomDockableWindow.GetDockedCloseButtonRect(LeftRight: Boolean): TRect; +var + X, Y, Z: Integer; +begin + Z := DragHandleSizes[CloseButtonWhenDocked, FDragHandleStyle] - 3; + if not LeftRight then begin + X := DockedBorderSize+1; + Y := DockedBorderSize; + end + else begin + X := (ClientWidth + DockedBorderSize) - Z; + Y := DockedBorderSize+1; + end; + Result := Bounds(X, Y, Z, Z); +end; + +function TTBCustomDockableWindow.CalcNCSizes: TPoint; +var + Z: Integer; +begin + if not Docked then begin + Result.X := 0; + Result.Y := 0; + end + else begin + Result.X := DockedBorderSize2; + Result.Y := DockedBorderSize2; + if CurrentDock.FAllowDrag then begin + Z := DragHandleSizes[FCloseButtonWhenDocked, FDragHandleStyle]; + if not(CurrentDock.Position in PositionLeftOrRight) then + Inc(Result.X, Z) + else + Inc(Result.Y, Z); + end; + end; +end; + +procedure TTBCustomDockableWindow.WMNCCalcSize(var Message: TWMNCCalcSize); + + procedure ApplyToRect(var R: TRect); + var + Z: Integer; + begin + InflateRect(R, -DockedBorderSize, -DockedBorderSize); + if CurrentDock.FAllowDrag then begin + Z := DragHandleSizes[FCloseButtonWhenDocked, FDragHandleStyle]; + if not(CurrentDock.Position in PositionLeftOrRight) then + Inc(R.Left, Z) + else + Inc(R.Top, Z); + end; + end; + +{$IFDEF CLR} +var + Params: TNCCalcSizeParams; +{$ENDIF} +begin + { Doesn't call inherited since it overrides the normal NC sizes } + Message.Result := 0; + if Docked then begin + {$IFNDEF CLR} + ApplyToRect(Message.CalcSize_Params.rgrc[0]); + {$ELSE} + Params := Message.CalcSize_Params; + ApplyToRect(Params.rgrc0); + Message.CalcSize_Params := Params; + {$ENDIF} + end; +end; + +procedure TTBCustomDockableWindow.WMSetCursor(var Message: TWMSetCursor); +var + P: TPoint; + R: TRect; + I: Integer; +begin + if Docked and CurrentDock.FAllowDrag and + (Message.CursorWnd = WindowHandle) and + (Smallint(Message.HitTest) = HT_TB2k_Border) and + (DragHandleStyle <> dhNone) then begin + GetCursorPos(P); + GetWindowRect(Handle, R); + if not(CurrentDock.Position in PositionLeftOrRight) then + I := P.X - R.Left + else + I := P.Y - R.Top; + if I < DockedBorderSize + DragHandleSizes[CloseButtonWhenDocked, DragHandleStyle] then begin + SetCursor(LoadCursor(0, IDC_SIZEALL)); + Message.Result := 1; + Exit; + end; + end; + inherited; +end; + +procedure TTBCustomDockableWindow.DrawNCArea(const DrawToDC: Boolean; + const ADC: HDC; const Clip: HRGN); +{ Redraws all the non-client area of the toolbar when it is docked. } +var + DC: HDC; + R: TRect; + VerticalDock: Boolean; + X, Y, Y2, Y3, YO, S, SaveIndex: Integer; + R2, R3, R4: TRect; + P1, P2: TPoint; + Brush: HBRUSH; + Clr: TColorRef; + UsingBackground, B: Boolean; + + procedure DrawRaisedEdge(R: TRect; const FillInterior: Boolean); + const + FillMiddle: array[Boolean] of UINT = (0, BF_MIDDLE); + begin + DrawEdge(DC, R, BDR_RAISEDINNER, BF_RECT or FillMiddle[FillInterior]); + end; + + function CreateCloseButtonBitmap: HBITMAP; + const + Pattern: array[0..15] of Byte = + (0, 0, $CC, 0, $78, 0, $30, 0, $78, 0, $CC, 0, 0, 0, 0, 0); + begin + Result := CreateMonoBitmap(8, 8, Pattern); + end; + + procedure DrawButtonBitmap(const Bmp: HBITMAP); + var + TempBmp: TBitmap; + begin + TempBmp := TBitmap.Create; + try + TempBmp.Handle := Bmp; + SetTextColor(DC, clBlack); + SetBkColor(DC, clWhite); + SelectObject(DC, GetSysColorBrush(COLOR_BTNTEXT)); + BitBlt(DC, R2.Left, R2.Top, R2.Right - R2.Left, R2.Bottom - R2.Top, + TempBmp.Canvas.Handle, 0, 0, $00E20746 {ROP_DSPDxax}); + finally + TempBmp.Free; + end; + end; + +const + CloseButtonState: array[Boolean] of UINT = (0, DFCS_PUSHED); +begin + if not Docked or not HandleAllocated then Exit; + + if not DrawToDC then + DC := GetWindowDC(Handle) + else + DC := ADC; + try + { Use update region } + if not DrawToDC then + SelectNCUpdateRgn(Handle, DC, Clip); + + { This works around WM_NCPAINT problem described at top of source code } + {no! R := Rect(0, 0, Width, Height);} + GetWindowRect(Handle, R); OffsetRect(R, -R.Left, -R.Top); + + VerticalDock := CurrentDock.Position in PositionLeftOrRight; + + Brush := CreateSolidBrush(ColorToRGB(Color)); + + UsingBackground := CurrentDock.UsingBackground and CurrentDock.FBkgOnToolbars; + + { Border } + if BorderStyle = bsSingle then + DrawRaisedEdge(R, False) + else + FrameRect(DC, R, Brush); + R2 := R; + InflateRect(R2, -1, -1); + if not UsingBackground then + FrameRect(DC, R2, Brush); + + { Draw the Background } + if UsingBackground then begin + R2 := R; + P1 := CurrentDock.ClientToScreen(Point(0, 0)); + P2 := CurrentDock.Parent.ClientToScreen(CurrentDock.BoundsRect.TopLeft); + Dec(R2.Left, Left + CurrentDock.Left + (P1.X-P2.X)); + Dec(R2.Top, Top + CurrentDock.Top + (P1.Y-P2.Y)); + InflateRect(R, -1, -1); + GetWindowRect(Handle, R4); + R3 := ClientRect; + with ClientToScreen(Point(0, 0)) do + OffsetRect(R3, X-R4.Left, Y-R4.Top); + SaveIndex := SaveDC(DC); + IntersectClipRect(DC, R.Left, R.Top, R.Right, R.Bottom); + ExcludeClipRect(DC, R3.Left, R3.Top, R3.Right, R3.Bottom); + CurrentDock.DrawBackground(DC, R2); + RestoreDC(DC, SaveIndex); + end; + + { The drag handle at the left, or top } + if CurrentDock.FAllowDrag then begin + SaveIndex := SaveDC(DC); + if not VerticalDock then + Y2 := ClientHeight + else + Y2 := ClientWidth; + Inc(Y2, DockedBorderSize); + S := DragHandleSizes[FCloseButtonWhenDocked, FDragHandleStyle]; + if FDragHandleStyle <> dhNone then begin + Y3 := Y2; + X := DockedBorderSize + DragHandleXOffsets[FCloseButtonWhenDocked, FDragHandleStyle]; + Y := DockedBorderSize; + YO := Ord(FDragHandleStyle = dhSingle); + if FCloseButtonWhenDocked then begin + if not VerticalDock then + Inc(Y, S - 2) + else + Dec(Y3, S - 2); + end; + Clr := GetSysColor(COLOR_BTNHIGHLIGHT); + for B := False to (FDragHandleStyle = dhDouble) do begin + if not VerticalDock then + R2 := Rect(X, Y+YO, X+3, Y2-YO) + else + R2 := Rect(Y+YO, X, Y3-YO, X+3); + DrawRaisedEdge(R2, True); + if not VerticalDock then + SetPixelV(DC, X, Y2-1-YO, Clr) + else + SetPixelV(DC, Y3-1-YO, X, Clr); + ExcludeClipRect(DC, R2.Left, R2.Top, R2.Right, R2.Bottom); + Inc(X, 3); + end; + end; + if not UsingBackground then begin + if not VerticalDock then + R2 := Rect(DockedBorderSize, DockedBorderSize, + DockedBorderSize+S, Y2) + else + R2 := Rect(DockedBorderSize, DockedBorderSize, + Y2, DockedBorderSize+S); + FillRect(DC, R2, Brush); + end; + RestoreDC(DC, SaveIndex); + { Close button } + if FCloseButtonWhenDocked then begin + R2 := GetDockedCloseButtonRect(VerticalDock); + if FCloseButtonDown then + DrawEdge(DC, R2, BDR_SUNKENOUTER, BF_RECT) + else if FCloseButtonHover then + DrawRaisedEdge(R2, False); + InflateRect(R2, -2, -2); + if FCloseButtonDown then + OffsetRect(R2, 1, 1); + DrawButtonBitmap(CreateCloseButtonBitmap); + end; + end; + + DeleteObject(Brush); + finally + if not DrawToDC then + ReleaseDC(Handle, DC); + end; +end; + +procedure TTBCustomDockableWindow.RedrawNCArea; +begin + { Note: IsWindowVisible is called as an optimization. There's no need to + draw on invisible windows. } + if HandleAllocated and IsWindowVisible(Handle) then + DrawNCArea(False, 0, 0); +end; + +procedure TTBCustomDockableWindow.WMNCPaint(var Message: TMessage); +begin + { Don't call inherited because it overrides the default NC painting } + DrawNCArea(False, 0, HRGN(Message.WParam)); +end; + +procedure DockableWindowNCPaintProc(Wnd: HWND; DC: HDC; AppData: TObject); +begin + with TTBCustomDockableWindow(AppData) do + DrawNCArea(True, DC, 0) +end; + +procedure TTBCustomDockableWindow.WMPrint(var Message: TMessage); +begin + HandleWMPrint(Handle, Message, DockableWindowNCPaintProc, Self); +end; + +procedure TTBCustomDockableWindow.WMPrintClient(var Message: + {$IFNDEF CLR} TMessage {$ELSE} TWMPrintClient {$ENDIF}); +begin + HandleWMPrintClient(PaintHandler, Message); +end; + +procedure TTBCustomDockableWindow.WMEraseBkgnd(var Message: TWMEraseBkgnd); +var + R, R2, R3: TRect; + P1, P2: TPoint; + SaveIndex: Integer; +begin + if Docked and CurrentDock.UsingBackground and CurrentDock.FBkgOnToolbars then begin + R := ClientRect; + R2 := R; + P1 := CurrentDock.ClientToScreen(Point(0, 0)); + P2 := CurrentDock.Parent.ClientToScreen(CurrentDock.BoundsRect.TopLeft); + Dec(R2.Left, Left + CurrentDock.Left + (P1.X-P2.X)); + Dec(R2.Top, Top + CurrentDock.Top + (P1.Y-P2.Y)); + GetWindowRect(Handle, R3); + with ClientToScreen(Point(0, 0)) do begin + Inc(R2.Left, R3.Left-X); + Inc(R2.Top, R3.Top-Y); + end; + SaveIndex := SaveDC(Message.DC); + IntersectClipRect(Message.DC, R.Left, R.Top, R.Right, R.Bottom); + CurrentDock.DrawBackground(Message.DC, R2); + RestoreDC(Message.DC, SaveIndex); + Message.Result := 1; + end + else + inherited; +end; + +function TTBCustomDockableWindow.GetPalette: HPALETTE; +begin + if Docked then + Result := CurrentDock.GetPalette + else + Result := 0; +end; + +function TTBCustomDockableWindow.PaletteChanged(Foreground: Boolean): Boolean; +begin + Result := inherited PaletteChanged(Foreground); + if Result and not Foreground then begin + { There seems to be a bug in Delphi's palette handling. When the form is + inactive and another window realizes a palette, docked TToolbar97s + weren't getting redrawn. So this workaround code was added. } + InvalidateAll(Self); + end; +end; + +procedure TTBCustomDockableWindow.DrawDraggingOutline(const DC: HDC; + const NewRect, OldRect: TRect; const NewDocking, OldDocking: Boolean); +var + NewSize, OldSize: TSize; +begin + with GetFloatingBorderSize do begin + if NewDocking then NewSize.cx := 1 else NewSize.cx := X; + NewSize.cy := NewSize.cx; + if OldDocking then OldSize.cx := 1 else OldSize.cx := X; + OldSize.cy := OldSize.cx; + end; + DrawHalftoneInvertRect(DC, NewRect, OldRect, NewSize, OldSize); +end; + +procedure TTBCustomDockableWindow.CMColorChanged(var Message: TMessage); +begin + { Make sure non-client area is redrawn } + InvalidateAll(Self); + inherited; { the inherited handler calls Invalidate } +end; + +procedure TTBCustomDockableWindow.CMTextChanged(var Message: TMessage); +begin + inherited; + if Parent is TTBFloatingWindowParent then + TTBFloatingWindowParent(Parent).Caption := Caption; +end; + +procedure TTBCustomDockableWindow.CMVisibleChanged(var Message: TMessage); +begin + if not(csDesigning in ComponentState) and Docked then + CurrentDock.ToolbarVisibilityChanged(Self, False); + inherited; + if Assigned(FOnVisibleChanged) then + FOnVisibleChanged(Self); +end; + +type + TRowSize = record + Size: Integer; + FullSizeRow: Boolean; + end; + TDockedSize = class + Dock: TTBDock; + BoundsRect: TRect; + Size: TPoint; + RowSizes: array of TRowSize; + end; + +procedure TTBCustomDockableWindow.BeginMoving(const InitX, InitY: Integer); +const + SplitCursors: array[Boolean] of {$IFNDEF CLR} PChar {$ELSE} Integer {$ENDIF} = + (IDC_SIZEWE, IDC_SIZENS); +var + UseSmoothDrag: Boolean; + DockList: TList; + NewDockedSizes: TList; + OriginalDock, MouseOverDock: TTBDock; + MoveRect: TRect; + StartDocking, PreventDocking, PreventFloating, WatchForSplit, SplitVertical: Boolean; + ScreenDC: HDC; + OldCursor: HCURSOR; + NPoint, DPoint: TPoint; + OriginalDockRow, OriginalDockPos: Integer; + FirstPos, LastPos, CurPos: TPoint; + + function FindDockedSize(const ADock: TTBDock): TDockedSize; + var + I: Integer; + begin + for I := 0 to NewDockedSizes.Count-1 do begin + Result := TDockedSize(NewDockedSizes[I]); + if Result.Dock = ADock then + Exit; + end; + Result := nil; + end; + + function GetRowOf(const RowSizes: array of TRowSize; const XY: Integer; + var Before: Boolean): Integer; + { Returns row number of the specified coordinate. Before is set to True if it + was in the top (or left) quarter of the row. } + var + HighestRow, R, CurY, NextY, CurRowSize, EdgeSize: Integer; + FullSizeRow: Boolean; + begin + Before := False; + HighestRow := High(RowSizes); + CurY := 0; + for R := 0 to HighestRow do begin + CurRowSize := RowSizes[R].Size; + FullSizeRow := FullSize or RowSizes[R].FullSizeRow; + if CurRowSize = 0 then + Continue; + NextY := CurY + CurRowSize; + if not FullSizeRow then + EdgeSize := CurRowSize div 4 + else + EdgeSize := CurRowSize div 2; + if XY < CurY + EdgeSize then begin + Result := R; + Before := True; + Exit; + end; + if not FullSizeRow and (XY < NextY - EdgeSize) then begin + Result := R; + Exit; + end; + CurY := NextY; + end; + Result := HighestRow+1; + end; + + procedure Dropped; + var + NewDockRow: Integer; + Before: Boolean; + MoveRectClient: TRect; + C: Integer; + DockedSize: TDockedSize; + begin + if MouseOverDock <> nil then begin + DockedSize := FindDockedSize(MouseOverDock); + MoveRectClient := MoveRect; + OffsetRect(MoveRectClient, -DockedSize.BoundsRect.Left, + -DockedSize.BoundsRect.Top); + if not FDragSplitting then begin + if not(MouseOverDock.Position in PositionLeftOrRight) then + C := (MoveRectClient.Top+MoveRectClient.Bottom) div 2 + else + C := (MoveRectClient.Left+MoveRectClient.Right) div 2; + NewDockRow := GetRowOf(DockedSize.RowSizes, C, Before); + if Before then + WatchForSplit := False; + end + else begin + NewDockRow := FDockRow; + Before := False; + end; + if WatchForSplit then begin + if (MouseOverDock <> OriginalDock) or (NewDockRow <> OriginalDockRow) then + WatchForSplit := False + else begin + if not SplitVertical then + C := FirstPos.X - LastPos.X + else + C := FirstPos.Y - LastPos.Y; + if Abs(C) >= 10 then begin + WatchForSplit := False; + FDragSplitting := True; + SetCursor(LoadCursor(0, SplitCursors[SplitVertical])); + end; + end; + end; + FDockRow := NewDockRow; + if not(MouseOverDock.Position in PositionLeftOrRight) then + FDockPos := MoveRectClient.Left + else + FDockPos := MoveRectClient.Top; + Parent := MouseOverDock; + if not FSmoothDragging then + CurrentDock.CommitNewPositions := True; + FInsertRowBefore := Before; + try + CurrentDock.ArrangeToolbars; + finally + FInsertRowBefore := False; + end; + end + else begin + WatchForSplit := False; + FloatingPosition := MoveRect.TopLeft; + Floating := True; + { Make sure it doesn't go completely off the screen } + MoveOnScreen(True); + end; + + { Make sure it's repainted immediately (looks better on really slow + computers when smooth dragging is enabled) } + Update; + end; + + procedure MouseMoved; + var + OldMouseOverDock: TTBDock; + OldMoveRect: TRect; + Pos: TPoint; + + function GetDockRect(Control: TTBDock): TRect; + var + I: Integer; + begin + for I := 0 to NewDockedSizes.Count-1 do + with TDockedSize(NewDockedSizes[I]) do begin + if Dock <> Control then Continue; + Result := Bounds(Pos.X-MulDiv(Size.X-1, NPoint.X, DPoint.X), + Pos.Y-MulDiv(Size.Y-1, NPoint.Y, DPoint.Y), + Size.X, Size.Y); + Exit; + end; + SetRectEmpty(Result); + end; + + function CheckIfCanDockTo(Control: TTBDock; R: TRect): Boolean; + const + DockSensX = 25; + DockSensY = 25; + var + S, Temp: TRect; + Sens: Integer; + begin + with Control do begin + Result := False; + + InflateRect(R, 3, 3); + S := GetDockRect(Control); + + { Like Office, distribute ~25 pixels of extra dock detection area + to the left side if the toolbar was grabbed at the left, both sides + if the toolbar was grabbed at the middle, or the right side if + toolbar was grabbed at the right. If outside, don't try to dock. } + Sens := MulDiv(DockSensX, NPoint.X, DPoint.X); + if (Pos.X < R.Left-(DockSensX-Sens)) or (Pos.X >= R.Right+Sens) then + Exit; + + { Don't try to dock to the left or right if pointer is above or below + the boundaries of the dock } + if (Control.Position in PositionLeftOrRight) and + ((Pos.Y < R.Top) or (Pos.Y >= R.Bottom)) then + Exit; + + { And also distribute ~25 pixels of extra dock detection area to + the top or bottom side } + Sens := MulDiv(DockSensY, NPoint.Y, DPoint.Y); + if (Pos.Y < R.Top-(DockSensY-Sens)) or (Pos.Y >= R.Bottom+Sens) then + Exit; + + Result := IntersectRect(Temp, R, S); + end; + end; + + var + R, R2: TRect; + I: Integer; + Dock: TTBDock; + Accept: Boolean; + TL, BR: TPoint; + begin + OldMouseOverDock := MouseOverDock; + OldMoveRect := MoveRect; + + GetCursorPos(Pos); + + if FDragSplitting then + MouseOverDock := CurrentDock + else begin + { Check if it can dock } + MouseOverDock := nil; + if StartDocking and not PreventDocking then + for I := 0 to DockList.Count-1 do begin + Dock := TTBDock(DockList[I]); + if CheckIfCanDockTo(Dock, FindDockedSize(Dock).BoundsRect) then begin + MouseOverDock := Dock; + Accept := True; + if Assigned(MouseOverDock.FOnRequestDock) then + MouseOverDock.FOnRequestDock(MouseOverDock, Self, Accept); + if Accept then + Break + else + MouseOverDock := nil; + end; + end; + end; + + { If not docking, clip the point so it doesn't get dragged under the + taskbar } + if MouseOverDock = nil then begin + R := GetRectOfMonitorContainingPoint(Pos, True); + if Pos.X < R.Left then Pos.X := R.Left; + if Pos.X > R.Right then Pos.X := R.Right; + if Pos.Y < R.Top then Pos.Y := R.Top; + if Pos.Y > R.Bottom then Pos.Y := R.Bottom; + end; + + MoveRect := GetDockRect(MouseOverDock); + + { Make sure title bar (or at least part of the toolbar) is still accessible + if it's dragged almost completely off the screen. This prevents the + problem seen in Office 97 where you drag it offscreen so that only the + border is visible, sometimes leaving you no way to move it back short of + resetting the toolbar. } + if MouseOverDock = nil then begin + R2 := GetRectOfMonitorContainingPoint(Pos, True); + R := R2; + with GetFloatingBorderSize do + InflateRect(R, -(X+4), -(Y+4)); + if MoveRect.Bottom < R.Top then + OffsetRect(MoveRect, 0, R.Top-MoveRect.Bottom); + if MoveRect.Top > R.Bottom then + OffsetRect(MoveRect, 0, R.Bottom-MoveRect.Top); + if MoveRect.Right < R.Left then + OffsetRect(MoveRect, R.Left-MoveRect.Right, 0); + if MoveRect.Left > R.Right then + OffsetRect(MoveRect, R.Right-MoveRect.Left, 0); + + GetFloatingNCArea(TL, BR); + I := R2.Top + 4 - TL.Y; + if MoveRect.Top < I then + OffsetRect(MoveRect, 0, I-MoveRect.Top); + end; + + { Empty MoveRect if it's wanting to float but it's not allowed to, and + set the mouse cursor accordingly. } + if PreventFloating and not Assigned(MouseOverDock) then begin + SetRectEmpty(MoveRect); + SetCursor(LoadCursor(0, IDC_NO)); + end + else begin + if FDragSplitting then + SetCursor(LoadCursor(0, SplitCursors[SplitVertical])) + else + SetCursor(OldCursor); + end; + + { Update the dragging outline } + if not UseSmoothDrag then + DrawDraggingOutline(ScreenDC, MoveRect, OldMoveRect, MouseOverDock <> nil, + OldMouseOverDock <> nil) + else + if not IsRectEmpty(MoveRect) then + Dropped; + end; + + procedure BuildDockList; + + function AcceptableDock(const D: TTBDock): Boolean; + begin + Result := D.FAllowDrag and (D.Position in DockableTo); + end; + + procedure Recurse(const ParentCtl: TWinControl); + var + D: TTBDockPosition; + I: Integer; + begin + if ContainsControl(ParentCtl) or not ParentCtl.HandleAllocated or + not IsWindowVisible(ParentCtl.Handle) then + Exit; + with ParentCtl do begin + for D := Low(D) to High(D) do + for I := 0 to ParentCtl.ControlCount-1 do + if (Controls[I] is TTBDock) and (TTBDock(Controls[I]).Position = D) then + Recurse(TWinControl(Controls[I])); + for I := 0 to ParentCtl.ControlCount-1 do + if (Controls[I] is TWinControl) and not(Controls[I] is TTBDock) then + Recurse(TWinControl(Controls[I])); + end; + if (ParentCtl is TTBDock) and AcceptableDock(TTBDock(ParentCtl)) and + (DockList.IndexOf(ParentCtl) = -1) then + DockList.Add(ParentCtl); + end; + + var + ParentForm: TTBCustomForm; + DockFormsList: TList; + I, J: Integer; + begin + { Manually add CurrentDock to the DockList first so that it gets priority + over other docks } + if Assigned(CurrentDock) and AcceptableDock(CurrentDock) then + DockList.Add(CurrentDock); + ParentForm := TBGetToolWindowParentForm(Self); + DockFormsList := TList.Create; + try + if Assigned(FDockForms) then begin + for I := 0 to Screen.{$IFDEF JR_D3}CustomFormCount{$ELSE}FormCount{$ENDIF}-1 do begin + J := FDockForms.IndexOf(Screen.{$IFDEF JR_D3}CustomForms{$ELSE}Forms{$ENDIF}[I]); + if (J <> -1) and (FDockForms[J] <> ParentForm) then + DockFormsList.Add(FDockForms[J]); + end; + end; + if Assigned(ParentForm) then + DockFormsList.Insert(0, ParentForm); + for I := 0 to DockFormsList.Count-1 do + Recurse(TWinControl(DockFormsList[I])); + finally + DockFormsList.Free; + end; + end; + +var + Accept: Boolean; + R: TRect; + Msg: TMsg; + NewDockedSize: TDockedSize; + I, J: Integer; +begin + Accept := False; + SplitVertical := False; + WatchForSplit := False; + OriginalDock := CurrentDock; + OriginalDockRow := FDockRow; + OriginalDockPos := FDockPos; + try + FDragMode := True; + FDragSplitting := False; + if Docked then begin + FDragCanSplit := False; + CurrentDock.CommitNewPositions := True; + CurrentDock.ArrangeToolbars; { needed for WatchForSplit assignment below } + SplitVertical := CurrentDock.Position in PositionLeftOrRight; + WatchForSplit := FDragCanSplit; + end; + DockList := nil; + NewDockedSizes := nil; + try + UseSmoothDrag := FSmoothDrag; + FSmoothDragging := UseSmoothDrag; + + NPoint := Point(InitX, InitY); + { Adjust for non-client area } + if not(Parent is TTBFloatingWindowParent) then begin + GetWindowRect(Handle, R); + R.BottomRight := ClientToScreen(Point(0, 0)); + DPoint := Point(Width-1, Height-1); + end + else begin + GetWindowRect(Parent.Handle, R); + R.BottomRight := Parent.ClientToScreen(Point(0, 0)); + DPoint := Point(Parent.Width-1, Parent.Height-1); + end; + Dec(NPoint.X, R.Left-R.Right); + Dec(NPoint.Y, R.Top-R.Bottom); + + PreventDocking := GetKeyState(VK_CONTROL) < 0; + PreventFloating := DockMode <> dmCanFloat; + + { Build list of all TTBDock's on the form } + DockList := TList.Create; + if DockMode <> dmCannotFloatOrChangeDocks then + BuildDockList + else + if Docked then + DockList.Add(CurrentDock); + + { Ensure positions of each possible dock are committed } + for I := 0 to DockList.Count-1 do + TTBDock(DockList[I]).CommitPositions; + + { Set up potential sizes for each dock type } + NewDockedSizes := TList.Create; + for I := -1 to DockList.Count-1 do begin + NewDockedSizes.Expand; + NewDockedSize := TDockedSize.Create; + try + with NewDockedSize do begin + if I = -1 then begin + { -1 adds the floating size } + Dock := nil; + SetRectEmpty(BoundsRect); + Size := DoArrange(False, TBGetDockTypeOf(CurrentDock, Floating), True, nil); + AddFloatingNCAreaToSize(Size); + end + else begin + Dock := TTBDock(DockList[I]); + BoundsRect := Dock.ClientRect; + MapWindowPoints(Dock.Handle, 0, BoundsRect, 2); + if Dock <> CurrentDock then begin + Size := DoArrange(False, TBGetDockTypeOf(CurrentDock, Floating), False, Dock); + AddDockedNCAreaToSize(Size, Dock.Position in PositionLeftOrRight); + end + else + Size := Point(Width, Height); + end; + end; + if Assigned(NewDockedSize.Dock) then begin + SetLength(NewDockedSize.RowSizes, NewDockedSize.Dock.GetHighestRow(True) + 1); + for J := 0 to High(NewDockedSize.RowSizes) do begin + NewDockedSize.RowSizes[J].Size := NewDockedSize.Dock.GetCurrentRowSize(J, + NewDockedSize.RowSizes[J].FullSizeRow); + end; + end; + except + NewDockedSize.Free; + raise; + end; + NewDockedSizes.Add(NewDockedSize); + end; + + { Before locking, make sure all pending paint messages are processed } + ProcessPaintMessages; + + { Save the original mouse cursor } + OldCursor := GetCursor; + + SetRectEmpty(MoveRect); + if not UseSmoothDrag then begin + { This uses LockWindowUpdate to suppress all window updating so the + dragging outlines doesn't sometimes get garbled. (This is safe, and in + fact, is the main purpose of the LockWindowUpdate function) + IMPORTANT! While debugging you might want to enable the 'TB2Dock_DisableLock' + conditional define (see top of the source code). } + {$IFNDEF TB2Dock_DisableLock} + LockWindowUpdate(GetDesktopWindow); + {$ENDIF} + { Get a DC of the entire screen. Works around the window update lock + by specifying DCX_LOCKWINDOWUPDATE. } + ScreenDC := GetDCEx(GetDesktopWindow, 0, + DCX_LOCKWINDOWUPDATE or DCX_CACHE or DCX_WINDOW); + end + else + ScreenDC := 0; + try + SetCapture(Handle); + + { Initialize } + StartDocking := Docked; + MouseOverDock := nil; + GetCursorPos(FirstPos); + LastPos := FirstPos; + MouseMoved; + StartDocking := True; + + { Stay in message loop until capture is lost. Capture is removed either + by this procedure manually doing it, or by an outside influence (like + a message box or menu popping up) } + while GetCapture = Handle do begin + case Integer(GetMessage(Msg, 0, 0, 0)) of + -1: Break; { if GetMessage failed } + 0: begin + { Repost WM_QUIT messages } + PostQuitMessage(ClipToLongint(Msg.wParam)); + Break; + end; + end; + + case Msg.Message of + WM_KEYDOWN, WM_KEYUP: + { Ignore all keystrokes while dragging. But process Ctrl and Escape } + case Word(Msg.wParam) of + VK_CONTROL: + if PreventDocking <> (Msg.Message = WM_KEYDOWN) then begin + PreventDocking := Msg.Message = WM_KEYDOWN; + MouseMoved; + end; + VK_ESCAPE: + Break; + end; + WM_MOUSEMOVE: begin + { Note to self: WM_MOUSEMOVE messages should never be dispatched + here to ensure no hints get shown during the drag process } + CurPos := GetMessagePosAsPoint; + if (LastPos.X <> CurPos.X) or (LastPos.Y <> CurPos.Y) then begin + MouseMoved; + LastPos := CurPos; + end; + end; + WM_LBUTTONDOWN, WM_LBUTTONDBLCLK: + { Make sure it doesn't begin another loop } + Break; + WM_LBUTTONUP: begin + Accept := True; + Break; + end; + WM_RBUTTONDOWN..WM_MBUTTONDBLCLK: + { Ignore all other mouse up/down messages } + ; + else + TranslateMessage(Msg); + DispatchMessage(Msg); + end; + end; + finally + { Since it sometimes breaks out of the loop without capture being + released } + if GetCapture = Handle then + ReleaseCapture; + + if not UseSmoothDrag then begin + { Hide dragging outline. Since NT will release a window update lock if + another thread comes to the foreground, it has to release the DC + and get a new one for erasing the dragging outline. Otherwise, + the DrawDraggingOutline appears to have no effect when this happens. } + ReleaseDC(GetDesktopWindow, ScreenDC); + ScreenDC := GetDCEx(GetDesktopWindow, 0, + DCX_LOCKWINDOWUPDATE or DCX_CACHE or DCX_WINDOW); + SetRectEmpty(R); + DrawDraggingOutline(ScreenDC, R, MoveRect, True, MouseOverDock <> nil); + ReleaseDC(GetDesktopWindow, ScreenDC); + + { Release window update lock } + {$IFNDEF TB2Dock_DisableLock} + LockWindowUpdate(0); + {$ENDIF} + end; + end; + + { Move to new position only if MoveRect isn't empty } + FSmoothDragging := False; + if Accept and not IsRectEmpty(MoveRect) then + { Note: Dropped must be called again after FSmoothDragging is reset to + False so that TTBDock.ArrangeToolbars makes the DockPos changes + permanent } + Dropped; + + { LastDock isn't automatically updated while FSmoothDragging=True, so + update it now that it's back to False } + if FUseLastDock and Assigned(CurrentDock) then + LastDock := CurrentDock; + + { To conserve resources, free FFloatParent if it's no longer the Parent. + (SetParent doesn't do this automatically when FSmoothDragging=True.) } + if Assigned(FFloatParent) and (Parent <> FFloatParent) then + FreeAndNil(FFloatParent); + finally + FSmoothDragging := False; + if not Docked then begin + { If we didn't end up docking, restore the original DockRow & DockPos + values } + FDockRow := OriginalDockRow; + FDockPos := OriginalDockPos; + end; + if Assigned(NewDockedSizes) then begin + for I := NewDockedSizes.Count-1 downto 0 do + TDockedSize(NewDockedSizes[I]).Free; + NewDockedSizes.Free; + end; + DockList.Free; + end; + finally + FDragMode := False; + FDragSplitting := False; + end; +end; + +function TTBCustomDockableWindow.ChildControlTransparent(Ctl: TControl): Boolean; +begin + Result := False; +end; + +procedure TTBCustomDockableWindow.ControlExistsAtPos(const P: TPoint; + var ControlExists: Boolean); +var + I: Integer; +begin + for I := 0 to ControlCount-1 do + if not ChildControlTransparent(Controls[I]) and Controls[I].Visible and + PtInRect(Controls[I].BoundsRect, P) then begin + ControlExists := True; + Break; + end; +end; + +procedure TTBCustomDockableWindow.DoubleClick; +begin + if Docked then begin + if DockMode = dmCanFloat then begin + Floating := True; + MoveOnScreen(True); + end; + end + else + if Assigned(LastDock) then + Parent := LastDock + else + if Assigned(DefaultDock) then begin + FDockRow := ForceDockAtTopRow; + FDockPos := ForceDockAtLeftPos; + Parent := DefaultDock; + end; +end; + +function TTBCustomDockableWindow.IsMovable: Boolean; +begin + Result := (Docked and CurrentDock.FAllowDrag) or Floating; +end; + +procedure TTBCustomDockableWindow.MouseDown(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +var + P: TPoint; + CtlExists: Boolean; +begin + inherited; + if (Button <> mbLeft) or not IsMovable then + Exit; + { Ignore message if user clicked on a child control } + P := Point(X, Y); + if PtInRect(ClientRect, P) then begin + CtlExists := False; + ControlExistsAtPos(P, CtlExists); + if CtlExists then + Exit; + end; + + if not(ssDouble in Shift) then begin + BeginMoving(X, Y); + MouseUp(mbLeft, [], -1, -1); + end + else + { Handle double click } + DoubleClick; +end; + +procedure TTBCustomDockableWindow.WMNCHitTest(var Message: TWMNCHitTest); +var + P: TPoint; + R: TRect; +begin + inherited; + if Docked then + with Message do begin + P := SmallPointToPoint(Pos); + GetWindowRect(Handle, R); + Dec(P.X, R.Left); Dec(P.Y, R.Top); + if Result <> HTCLIENT then begin + Result := HTNOWHERE; + if FCloseButtonWhenDocked and CurrentDock.FAllowDrag and + PtInRect(GetDockedCloseButtonRect( + TBGetDockTypeOf(CurrentDock, Floating) = dtLeftRight), P) then + Result := HT_TB2k_Close + else + Result := HT_TB2k_Border; + end; + end; +end; + +procedure TTBCustomDockableWindow.WMNCMouseMove(var Message: TWMNCMouseMove); +var + InArea: Boolean; +begin + inherited; + { Note: TME_NONCLIENT was introduced in Windows 98 and 2000 } + if (Win32MajorVersion >= 5) or + (Win32MajorVersion = 4) and (Win32MinorVersion >= 10) then + CallTrackMouseEvent(Handle, TME_LEAVE or $10 {TME_NONCLIENT}); + InArea := (ClipToLongint(Message.HitTest) = HT_TB2k_Close); + if FCloseButtonHover <> InArea then begin + FCloseButtonHover := InArea; + RedrawNCArea; + end; +end; + +procedure TTBCustomDockableWindow.WMNCMouseLeave(var Message: TMessage); +begin + if not MouseCapture then + CancelNCHover; + inherited; +end; + +procedure TTBCustomDockableWindow.CMMouseLeave(var Message: TMessage); +begin + inherited; + { On Windows versions that can't send a WM_NCMOUSELEAVE message, trap + CM_MOUSELEAVE to detect when the mouse moves from the non-client area to + another control. } + CancelNCHover; +end; + +procedure TTBCustomDockableWindow.WMMouseMove(var Message: TWMMouseMove); +begin + { On Windows versions that can't send a WM_NCMOUSELEAVE message, trap + WM_MOUSEMOVE to detect when the mouse moves from the non-client area to + the client area. + Note: We are overriding WM_MOUSEMOVE instead of MouseMove so that our + processing always gets done first. } + CancelNCHover; + inherited; +end; + +procedure TTBCustomDockableWindow.CancelNCHover; +begin + if FCloseButtonHover then begin + FCloseButtonHover := False; + RedrawNCArea; + end; +end; + +procedure TTBCustomDockableWindow.Close; +var + Accept: Boolean; +begin + Accept := True; + if Assigned(FOnCloseQuery) then + FOnCloseQuery(Self, Accept); + { Did the CloseQuery event return True? } + if Accept then begin + Hide; + if Assigned(FOnClose) then + FOnClose(Self); + end; +end; + +procedure TTBCustomDockableWindow.SetCloseButtonState(Pushed: Boolean); +begin + if FCloseButtonDown <> Pushed then begin + FCloseButtonDown := Pushed; + RedrawNCArea; + end; +end; + +procedure TTBCustomDockableWindow.WMNCLButtonDown(var Message: TWMNCLButtonDown); +var + R, BR: TRect; + P: TPoint; +begin + case ClipToLongint(Message.HitTest) of + HT_TB2k_Close: begin + GetWindowRect(Handle, R); + BR := GetDockedCloseButtonRect( + TBGetDockTypeOf(CurrentDock, Floating) = dtLeftRight); + OffsetRect(BR, R.Left, R.Top); + if CloseButtonLoop(Handle, BR, SetCloseButtonState) then + Close; + end; + HT_TB2k_Border: begin + P := ScreenToClient(GetMessagePosAsPoint); + if IsMovable then + BeginMoving(P.X, P.Y); + end; + else + inherited; + end; +end; + +procedure TTBCustomDockableWindow.WMNCLButtonDblClk(var Message: TWMNCLButtonDblClk); +begin + if ClipToLongint(Message.HitTest) = HT_TB2k_Border then begin + if IsMovable then + DoubleClick; + end + else + inherited; +end; + +procedure TTBCustomDockableWindow.ShowNCContextMenu(const PosX, PosY: Smallint); + + {$IFNDEF JR_D5} + { Note: this is identical to TControl.CheckMenuPopup (from Delphi 4), + except where noted. + TControl.CheckMenuPopup is unfortunately 'private', so it can't be called + outside of the Controls unit. } + procedure CheckMenuPopup; + var + Control: TControl; + PopupMenu: TPopupMenu; + begin + if csDesigning in ComponentState then Exit; + Control := Self; + while Control <> nil do + begin + { Added TControlAccess cast because GetPopupMenu is 'protected' } + PopupMenu := TControlAccess(Control).GetPopupMenu; + if (PopupMenu <> nil) then + begin + if not PopupMenu.AutoPopup then Exit; + SendCancelMode(nil); + PopupMenu.PopupComponent := Control; + { Changed the following. LPARAM of WM_NCRBUTTONUP is in screen + coordinates, not client coordinates } + {with ClientToScreen(SmallPointToPoint(Pos)) do + PopupMenu.Popup(X, Y);} + PopupMenu.Popup(PosX, PosY); + Exit; + end; + Control := Control.Parent; + end; + end; + {$ENDIF} + +begin + {$IFDEF JR_D5} + { Delphi 5 and later use the WM_CONTEXTMENU message for popup menus } + SendMessage(Handle, WM_CONTEXTMENU, WPARAM(Handle), MAKELPARAM(Word(PosX), Word(PosY))); + {$ELSE} + CheckMenuPopup; + {$ENDIF} +end; + +procedure TTBCustomDockableWindow.WMNCRButtonUp(var Message: TWMNCRButtonUp); +begin + ShowNCContextMenu(Message.XCursor, Message.YCursor); +end; + +{$IFDEF JR_D5} +procedure TTBCustomDockableWindow.WMContextMenu(var Message: TWMContextMenu); +{ Unfortunately TControl.WMContextMenu ignores clicks in the non-client area. + On docked toolbars, we need right clicks on the border, part of the + non-client area, to display the popup menu. The only way I see to have it do + that is to create a new version of WMContextMenu specifically for the + non-client area, and that is what this method is. + Note: This is identical to Delphi 2006's TControl.WMContextMenu, except where + noted. } +var + Pt, Temp: TPoint; + Handled: Boolean; + PopupMenu: TPopupMenu; +begin + { Added 'inherited;' here } + inherited; + if Message.Result <> 0 then Exit; + if csDesigning in ComponentState then + begin + inherited; + Exit; + end; + + Pt := SmallPointToPoint(Message.Pos); + if InvalidPoint(Pt) then + Temp := Pt + else + begin + Temp := ScreenToClient(Pt); + { Changed the following. We're only interested in the non-client area } + {if not PtInRect(ClientRect, Temp) then} + if PtInRect(ClientRect, Temp) then + begin + {inherited;} + Exit; + end; + end; + + Handled := False; + DoContextPopup(Temp, Handled); + Message.Result := Ord(Handled); + if Handled then Exit; + + PopupMenu := GetPopupMenu; + if (PopupMenu <> nil) and PopupMenu.AutoPopup then + begin + SendCancelMode(Self); + PopupMenu.PopupComponent := Self; + if InvalidPoint(Pt) then + Pt := ClientToScreen(Point(0, 0)); + PopupMenu.Popup(Pt.X, Pt.Y); + Message.Result := 1; + end; + + if Message.Result = 0 then + inherited; +end; +{$ENDIF} + +procedure TTBCustomDockableWindow.GetMinShrinkSize(var AMinimumSize: Integer); +begin +end; + +function TTBCustomDockableWindow.GetFloatingWindowParentClass: TTBFloatingWindowParentClass; +begin + Result := TTBFloatingWindowParent; +end; + +procedure TTBCustomDockableWindow.GetMinMaxSize(var AMinClientWidth, + AMinClientHeight, AMaxClientWidth, AMaxClientHeight: Integer); +begin +end; + +function TTBCustomDockableWindow.GetShrinkMode: TTBShrinkMode; +begin + Result := tbsmNone; +end; + +procedure TTBCustomDockableWindow.ResizeBegin; +begin +end; + +procedure TTBCustomDockableWindow.ResizeTrack(var Rect: TRect; const OrigRect: TRect); +begin +end; + +procedure TTBCustomDockableWindow.ResizeTrackAccept; +begin +end; + +procedure TTBCustomDockableWindow.ResizeEnd; +begin +end; + +procedure TTBCustomDockableWindow.BeginSizing(const ASizeHandle: TTBSizeHandle); +var + UseSmoothDrag, DragX, DragY, ReverseX, ReverseY: Boolean; + MinWidth, MinHeight, MaxWidth, MaxHeight: Integer; + DragRect, OrigDragRect: TRect; + ScreenDC: HDC; + OrigPos, OldPos: TPoint; + + procedure DoResize; + begin + BeginUpdate; + try + ResizeTrackAccept; + Parent.BoundsRect := DragRect; + SetBounds(Left, Top, Parent.ClientWidth, Parent.ClientHeight); + finally + EndUpdate; + end; + + { Make sure it doesn't go completely off the screen } + MoveOnScreen(True); + end; + + procedure MouseMoved; + var + Pos: TPoint; + OldDragRect: TRect; + begin + GetCursorPos(Pos); + { It needs to check if the cursor actually moved since last time. This is + because a call to LockWindowUpdate (apparently) generates a mouse move + message even when mouse hasn't moved. } + if (Pos.X = OldPos.X) and (Pos.Y = OldPos.Y) then Exit; + OldPos := Pos; + + OldDragRect := DragRect; + DragRect := OrigDragRect; + if DragX then begin + if not ReverseX then Inc(DragRect.Right, Pos.X-OrigPos.X) + else Inc(DragRect.Left, Pos.X-OrigPos.X); + end; + if DragY then begin + if not ReverseY then Inc(DragRect.Bottom, Pos.Y-OrigPos.Y) + else Inc(DragRect.Top, Pos.Y-OrigPos.Y); + end; + if DragRect.Right-DragRect.Left < MinWidth then begin + if not ReverseX then DragRect.Right := DragRect.Left + MinWidth + else DragRect.Left := DragRect.Right - MinWidth; + end; + if (MaxWidth > 0) and (DragRect.Right-DragRect.Left > MaxWidth) then begin + if not ReverseX then DragRect.Right := DragRect.Left + MaxWidth + else DragRect.Left := DragRect.Right - MaxWidth; + end; + if DragRect.Bottom-DragRect.Top < MinHeight then begin + if not ReverseY then DragRect.Bottom := DragRect.Top + MinHeight + else DragRect.Top := DragRect.Bottom - MinHeight; + end; + if (MaxHeight > 0) and (DragRect.Bottom-DragRect.Top > MaxHeight) then begin + if not ReverseY then DragRect.Bottom := DragRect.Top + MaxHeight + else DragRect.Top := DragRect.Bottom - MaxHeight; + end; + + ResizeTrack(DragRect, OrigDragRect); + if not UseSmoothDrag then + DrawDraggingOutline(ScreenDC, DragRect, OldDragRect, False, False) + else + DoResize; + end; +var + Accept: Boolean; + Msg: TMsg; + R: TRect; +begin + if not Floating then Exit; + + Accept := False; + + UseSmoothDrag := FSmoothDrag; + + MinWidth := 0; + MinHeight := 0; + MaxWidth := 0; + MaxHeight := 0; + GetMinMaxSize(MinWidth, MinHeight, MaxWidth, MaxHeight); + Inc(MinWidth, Parent.Width-Width); + Inc(MinHeight, Parent.Height-Height); + if MaxWidth > 0 then + Inc(MaxWidth, Parent.Width-Width); + if MaxHeight > 0 then + Inc(MaxHeight, Parent.Height-Height); + + DragX := ASizeHandle in [twshLeft, twshRight, twshTopLeft, twshTopRight, + twshBottomLeft, twshBottomRight]; + ReverseX := ASizeHandle in [twshLeft, twshTopLeft, twshBottomLeft]; + DragY := ASizeHandle in [twshTop, twshTopLeft, twshTopRight, twshBottom, + twshBottomLeft, twshBottomRight]; + ReverseY := ASizeHandle in [twshTop, twshTopLeft, twshTopRight]; + + ResizeBegin(ASizeHandle); + try + { Before locking, make sure all pending paint messages are processed } + ProcessPaintMessages; + + if not UseSmoothDrag then begin + { This uses LockWindowUpdate to suppress all window updating so the + dragging outlines doesn't sometimes get garbled. (This is safe, and in + fact, is the main purpose of the LockWindowUpdate function) + IMPORTANT! While debugging you might want to enable the 'TB2Dock_DisableLock' + conditional define (see top of the source code). } + {$IFNDEF TB2Dock_DisableLock} + LockWindowUpdate(GetDesktopWindow); + {$ENDIF} + { Get a DC of the entire screen. Works around the window update lock + by specifying DCX_LOCKWINDOWUPDATE. } + ScreenDC := GetDCEx(GetDesktopWindow, 0, + DCX_LOCKWINDOWUPDATE or DCX_CACHE or DCX_WINDOW); + end + else + ScreenDC := 0; + try + SetCapture(Handle); + if (tbdsResizeClipCursor in FDockableWindowStyles) and + not UsingMultipleMonitors then begin + R := GetRectOfPrimaryMonitor(False); + ClipCursor({$IFNDEF CLR}@{$ENDIF} R); + end; + + { Initialize } + OrigDragRect := Parent.BoundsRect; + DragRect := OrigDragRect; + if not UseSmoothDrag then begin + SetRectEmpty(R); + DrawDraggingOutline(ScreenDC, DragRect, R, False, False); + end; + GetCursorPos(OrigPos); + OldPos := OrigPos; + + { Stay in message loop until capture is lost. Capture is removed either + by this procedure manually doing it, or by an outside influence (like + a message box or menu popping up) } + while GetCapture = Handle do begin + case Integer(GetMessage(Msg, 0, 0, 0)) of + -1: Break; { if GetMessage failed } + 0: begin + { Repost WM_QUIT messages } + PostQuitMessage(ClipToLongint(Msg.wParam)); + Break; + end; + end; + + case Msg.Message of + WM_KEYDOWN, WM_KEYUP: + { Ignore all keystrokes while sizing except for Escape } + if Word(Msg.wParam) = VK_ESCAPE then + Break; + WM_MOUSEMOVE: + { Note to self: WM_MOUSEMOVE messages should never be dispatched + here to ensure no hints get shown during the drag process } + MouseMoved; + WM_LBUTTONDOWN, WM_LBUTTONDBLCLK: + { Make sure it doesn't begin another loop } + Break; + WM_LBUTTONUP: begin + Accept := True; + Break; + end; + WM_RBUTTONDOWN..WM_MBUTTONDBLCLK: + { Ignore all other mouse up/down messages } + ; + else + TranslateMessage(Msg); + DispatchMessage(Msg); + end; + end; + finally + { Since it sometimes breaks out of the loop without capture being + released } + if GetCapture = Handle then + ReleaseCapture; + ClipCursor(nil); + + if not UseSmoothDrag then begin + { Hide dragging outline. Since NT will release a window update lock if + another thread comes to the foreground, it has to release the DC + and get a new one for erasing the dragging outline. Otherwise, + the DrawDraggingOutline appears to have no effect when this happens. } + ReleaseDC(GetDesktopWindow, ScreenDC); + ScreenDC := GetDCEx(GetDesktopWindow, 0, + DCX_LOCKWINDOWUPDATE or DCX_CACHE or DCX_WINDOW); + SetRectEmpty(R); + DrawDraggingOutline(ScreenDC, R, DragRect, False, False); + ReleaseDC(GetDesktopWindow, ScreenDC); + + { Release window update lock } + {$IFNDEF TB2Dock_DisableLock} + LockWindowUpdate(0); + {$ENDIF} + end; + end; + + if not UseSmoothDrag and Accept then + DoResize; + finally + ResizeEnd; + end; +end; + +procedure TTBCustomDockableWindow.DoDockChangingHidden(NewFloating: Boolean; + DockingTo: TTBDock); +begin + if not(csDestroying in ComponentState) and Assigned(FOnDockChangingHidden) then + FOnDockChangingHidden(Self, NewFloating, DockingTo); +end; + +{ TTBCustomDockableWindow - property access methods } + +function TTBCustomDockableWindow.GetNonClientWidth: Integer; +begin + Result := CalcNCSizes.X; +end; + +function TTBCustomDockableWindow.GetNonClientHeight: Integer; +begin + Result := CalcNCSizes.Y; +end; + +function TTBCustomDockableWindow.IsLastDockStored: Boolean; +begin + Result := FCurrentDock = nil; {}{should this be changed to 'Floating'?} +end; + +function TTBCustomDockableWindow.IsWidthAndHeightStored: Boolean; +begin + Result := (CurrentDock = nil) and not Floating; +end; + +procedure TTBCustomDockableWindow.SetCloseButton(Value: Boolean); +begin + if FCloseButton <> Value then begin + FCloseButton := Value; + + { Update the close button's visibility } + if Parent is TTBFloatingWindowParent then + TTBFloatingWindowParent(Parent).RedrawNCArea([twrdCaption, twrdCloseButton]); + end; +end; + +procedure TTBCustomDockableWindow.SetCloseButtonWhenDocked(Value: Boolean); +begin + if FCloseButtonWhenDocked <> Value then begin + FCloseButtonWhenDocked := Value; + if Docked then + RecalcNCArea(Self); + end; +end; + +procedure TTBCustomDockableWindow.SetDefaultDock(Value: TTBDock); +begin + if FDefaultDock <> Value then begin + FDefaultDock := Value; + if Assigned(Value) then + Value.FreeNotification(Self); + end; +end; + +procedure TTBCustomDockableWindow.SetCurrentDock(Value: TTBDock); +begin + if not(csLoading in ComponentState) then begin + if Assigned(Value) then + Parent := Value + else + Parent := TBValidToolWindowParentForm(Self); + end; +end; + +procedure TTBCustomDockableWindow.SetDockPos(Value: Integer); +begin + FDockPos := Value; + if Docked then + CurrentDock.ArrangeToolbars; +end; + +procedure TTBCustomDockableWindow.SetDockRow(Value: Integer); +begin + FDockRow := Value; + if Docked then + CurrentDock.ArrangeToolbars; +end; + +procedure TTBCustomDockableWindow.SetAutoResize(Value: Boolean); +begin + if FAutoResize <> Value then begin + FAutoResize := Value; + if Value then + Arrange; + end; +end; + +procedure TTBCustomDockableWindow.SetBorderStyle(Value: TBorderStyle); +begin + if FBorderStyle <> Value then begin + FBorderStyle := Value; + if Docked then + RecalcNCArea(Self); + end; +end; + +procedure TTBCustomDockableWindow.SetDragHandleStyle(Value: TTBDragHandleStyle); +begin + if FDragHandleStyle <> Value then begin + FDragHandleStyle := Value; + if Docked then + RecalcNCArea(Self); + end; +end; + +procedure TTBCustomDockableWindow.SetFloating(Value: Boolean); +var + ParentFrm: TTBCustomForm; + NewFloatParent: TTBFloatingWindowParent; +begin + if FFloating <> Value then begin + if Value and not(csDesigning in ComponentState) then begin + ParentFrm := TBValidToolWindowParentForm(Self); + if FFloatParent = nil then begin + NewFloatParent := GetFloatingWindowParentClass.CreateNew(nil); + try + with NewFloatParent do begin + FDockableWindow := Self; + BorderStyle := bsToolWindow; + ShowHint := True; + Visible := True; + { Note: The above line doesn't actually make it visible at this + point since FShouldShow is still False. } + end; + except + NewFloatParent.Free; + raise; + end; + FFloatParent := NewFloatParent; + end; + ParentFrm.FreeNotification(FFloatParent); + FFloatParent.FParentForm := ParentFrm; + FFloatParent.Caption := Caption; + Parent := FFloatParent; + SetBounds(0, 0, Width, Height); + end + else + Parent := TBValidToolWindowParentForm(Self); + end; +end; + +procedure TTBCustomDockableWindow.SetFloatingMode(Value: TTBFloatingMode); +begin + if FFloatingMode <> Value then begin + FFloatingMode := Value; + if HandleAllocated then + Perform(CM_SHOWINGCHANGED, 0, 0); + end; +end; + +procedure TTBCustomDockableWindow.SetFloatingPosition(Value: TPoint); +begin + FFloatingPosition := Value; + if Floating and Assigned(Parent) then + Parent.SetBounds(Value.X, Value.Y, Parent.Width, Parent.Height); +end; + +procedure TTBCustomDockableWindow.SetFullSize(Value: Boolean); +begin + if FFullSize <> Value then begin + FFullSize := Value; + if Docked then + CurrentDock.ArrangeToolbars; + end; +end; + +procedure TTBCustomDockableWindow.SetLastDock(Value: TTBDock); +begin + if FUseLastDock and Assigned(FCurrentDock) then + { When docked, LastDock must be equal to DockedTo } + Value := FCurrentDock; + if FLastDock <> Value then begin + if Assigned(FLastDock) and (FLastDock <> Parent) then + FLastDock.ChangeDockList(False, Self); + FLastDock := Value; + if Assigned(Value) then begin + FUseLastDock := True; + Value.FreeNotification(Self); + Value.ChangeDockList(True, Self); + end; + end; +end; + +procedure TTBCustomDockableWindow.SetResizable(Value: Boolean); +begin + if FResizable <> Value then begin + FResizable := Value; + if Floating and (Parent is TTBFloatingWindowParent) then begin + { Recreate the window handle because Resizable affects whether the + tool window is created with a WS_THICKFRAME style } + TTBFloatingWindowParent(Parent).CallRecreateWnd; + end; + end; +end; + +procedure TTBCustomDockableWindow.SetShowCaption(Value: Boolean); +begin + if FShowCaption <> Value then begin + FShowCaption := Value; + if Floating then begin + { Recalculate FloatingWindowParent's NC area, and resize the toolbar + accordingly } + RecalcNCArea(Parent); + Arrange; + end; + end; +end; + +procedure TTBCustomDockableWindow.SetStretch(Value: Boolean); +begin + if FStretch <> Value then begin + FStretch := Value; + if Docked then + CurrentDock.ArrangeToolbars; + end; +end; + +procedure TTBCustomDockableWindow.SetUseLastDock(Value: Boolean); +begin + if FUseLastDock <> Value then begin + FUseLastDock := Value; + if not Value then + LastDock := nil + else + LastDock := FCurrentDock; + end; +end; + +(*function TTBCustomDockableWindow.GetVersion: TToolbar97Version; +begin + Result := Toolbar97VersionPropText; +end; + +procedure TTBCustomDockableWindow.SetVersion(const Value: TToolbar97Version); +begin + { write method required for the property to show up in Object Inspector } +end;*) + + +{ TTBBackground } + +{$IFNDEF CLR} +type + PNotifyEvent = ^TNotifyEvent; +{$ENDIF} + +constructor TTBBackground.Create(AOwner: TComponent); +begin + inherited; + FBkColor := clBtnFace; + FBitmap := TBitmap.Create; + FBitmap.OnChange := BitmapChanged; +end; + +destructor TTBBackground.Destroy; +{$IFNDEF CLR} +var + I: Integer; +{$ENDIF} +begin + inherited; + FBitmapCache.Free; + FBitmap.Free; + if Assigned(FNotifyList) then begin + {$IFNDEF CLR} + for I := FNotifyList.Count-1 downto 0 do + Dispose(PNotifyEvent(FNotifyList[I])); + {$ENDIF} + FNotifyList.Free; + end; +end; + +procedure TTBBackground.BitmapChanged(Sender: TObject); +var + I: Integer; +begin + { Erase the cache and notify } + FreeAndNil(FBitmapCache); + if Assigned(FNotifyList) then + for I := 0 to FNotifyList.Count-1 do + {$IFNDEF CLR} + PNotifyEvent(FNotifyList[I])^(Self); + {$ELSE} + TNotifyEvent(FNotifyList[I])(Self); + {$ENDIF} +end; + +procedure TTBBackground.Draw(DC: HDC; const DrawRect: TRect); +var + UseBmp: TBitmap; + R2: TRect; + SaveIndex: Integer; + DC2: HDC; + Brush: HBRUSH; + P: TPoint; +begin + if FBitmapCache = nil then begin + FBitmapCache := TBitmap.Create; + FBitmapCache.Palette := CopyPalette(FBitmap.Palette); + FBitmapCache.Width := FBitmap.Width; + FBitmapCache.Height := FBitmap.Height; + if not FTransparent then begin + { Copy from a possible DIB to our DDB } + BitBlt(FBitmapCache.Canvas.Handle, 0, 0, FBitmapCache.Width, + FBitmapCache.Height, FBitmap.Canvas.Handle, 0, 0, SRCCOPY); + end + else begin + with FBitmapCache do begin + Canvas.Brush.Color := FBkColor; + R2 := Rect(0, 0, Width, Height); + Canvas.BrushCopy(R2, FBitmap, R2, + FBitmap.Canvas.Pixels[0, Height-1] or $02000000); + end; + end; + FBitmap.Dormant; + end; + UseBmp := FBitmapCache; + + DC2 := 0; + SaveIndex := SaveDC(DC); + try + if UseBmp.Palette <> 0 then begin + SelectPalette(DC, UseBmp.Palette, True); + RealizePalette(DC); + end; + { Note: versions of Toolbar97 prior to 1.68 used 'UseBmp.Canvas.Handle' + instead of DC2 in the BitBlt call. This was changed because there + seems to be a bug in D2/BCB1's Graphics.pas: if you called + .Background.LoadFromFile() twice the background + would not be shown. } + if (UseBmp.Width = 8) and (UseBmp.Height = 8) then begin + { Use pattern brushes to draw 8x8 bitmaps. + Note: Win9x can't use bitmaps <8x8 in size for pattern brushes } + Brush := CreatePatternBrush(UseBmp.Handle); + GetWindowOrgEx(DC, P); + SetBrushOrgEx(DC, DrawRect.Left - P.X, DrawRect.Top - P.Y, nil); + FillRect(DC, DrawRect, Brush); + DeleteObject(Brush); + end + else begin + { BitBlt is faster than pattern brushes on large bitmaps } + DC2 := CreateCompatibleDC(DC); + SelectObject(DC2, UseBmp.Handle); + R2 := DrawRect; + while R2.Left < R2.Right do begin + while R2.Top < R2.Bottom do begin + BitBlt(DC, R2.Left, R2.Top, UseBmp.Width, UseBmp.Height, + DC2, 0, 0, SRCCOPY); + Inc(R2.Top, UseBmp.Height); + end; + R2.Top := DrawRect.Top; + Inc(R2.Left, UseBmp.Width); + end; + end; + finally + if DC2 <> 0 then + DeleteDC(DC2); + { Restore the palette and brush origin back } + RestoreDC(DC, SaveIndex); + end; +end; + +function TTBBackground.GetPalette: HPALETTE; +begin + Result := FBitmap.Palette; +end; + +procedure TTBBackground.SysColorChanged; +begin + if FTransparent and (FBkColor < 0) then + BitmapChanged(nil); +end; + +function TTBBackground.UsingBackground: Boolean; +begin + Result := (FBitmap.Width <> 0) and (FBitmap.Height <> 0); +end; + +procedure TTBBackground.RegisterChanges(Proc: TNotifyEvent); +var + I: Integer; + {$IFNDEF CLR} + P: PNotifyEvent; + {$ENDIF} +begin + if FNotifyList = nil then + FNotifyList := TList.Create; + for I := 0 to FNotifyList.Count-1 do begin + {$IFNDEF CLR} + P := FNotifyList[I]; + if MethodsEqual(TMethod(P^), TMethod(Proc)) then + {$ELSE} + if @TNotifyEvent(FNotifyList[I]) = @Proc then + {$ENDIF} + Exit; + end; + {$IFNDEF CLR} + FNotifyList.Expand; + New(P); + P^ := Proc; + FNotifyList.Add(P); + {$ELSE} + FNotifyList.Add(@Proc); + {$ENDIF} +end; + +procedure TTBBackground.UnregisterChanges(Proc: TNotifyEvent); +var + I: Integer; + {$IFNDEF CLR} + P: PNotifyEvent; + {$ENDIF} +begin + if FNotifyList = nil then + Exit; + for I := 0 to FNotifyList.Count-1 do begin + {$IFNDEF CLR} + P := FNotifyList[I]; + if MethodsEqual(TMethod(P^), TMethod(Proc)) then begin + {$ELSE} + if @TNotifyEvent(FNotifyList[I]) = @Proc then begin + {$ENDIF} + FNotifyList.Delete(I); + {$IFNDEF CLR} + Dispose(P); + {$ENDIF} + Break; + end; + end; +end; + +procedure TTBBackground.SetBkColor(Value: TColor); +begin + if FBkColor <> Value then begin + FBkColor := Value; + if FTransparent then + BitmapChanged(nil); + end; +end; + +procedure TTBBackground.SetBitmap(Value: TBitmap); +begin + FBitmap.Assign(Value); +end; + +procedure TTBBackground.SetTransparent(Value: Boolean); +begin + if FTransparent <> Value then begin + FTransparent := Value; + BitmapChanged(nil); + end; +end; + + +{ Global procedures } + +procedure TBCustomLoadPositions(const OwnerComponent: TComponent; + const ReadIntProc: TTBPositionReadIntProc; + const ReadStringProc: TTBPositionReadStringProc; + const ExtraData: TTBPositionExtraData); +var + Rev: Integer; + + function FindDock(AName: String): TTBDock; + var + I: Integer; + begin + Result := nil; + for I := 0 to OwnerComponent.ComponentCount-1 do + if (OwnerComponent.Components[I] is TTBDock) and + {$IFNDEF CLR} + (CompareText(OwnerComponent.Components[I].Name, AName) = 0) then begin + {$ELSE} + SameText(OwnerComponent.Components[I].Name, AName, loInvariantLocale) then begin + {$ENDIF} + Result := TTBDock(OwnerComponent.Components[I]); + Break; + end; + end; + + procedure ReadValues(const Toolbar: TTBCustomDockableWindow; const NewDock: TTBDock); + var + Pos: TPoint; + Data: TTBReadPositionData; + LastDockName: String; + ADock: TTBDock; + begin + with Toolbar do begin + DockRow := ReadIntProc(Name, rvDockRow, DockRow, ExtraData); + DockPos := ReadIntProc(Name, rvDockPos, DockPos, ExtraData); + Pos.X := ReadIntProc(Name, rvFloatLeft, 0, ExtraData); + Pos.Y := ReadIntProc(Name, rvFloatTop, 0, ExtraData); + Data.ReadIntProc := ReadIntProc; + Data.ReadStringProc := ReadStringProc; + Data.ExtraData := ExtraData; + ReadPositionData(Data); + FloatingPosition := Pos; + if Assigned(NewDock) then + Parent := NewDock + else begin + //Parent := Form; + Floating := True; + MoveOnScreen(True); + if (Rev >= 3) and FUseLastDock then begin + LastDockName := ReadStringProc(Name, rvLastDock, '', ExtraData); + if LastDockName <> '' then begin + ADock := FindDock(LastDockName); + if Assigned(ADock) then + LastDock := ADock; + end; + end; + end; + Arrange; + DoneReadingPositionData(Data); + end; + end; + +var + DocksDisabled: TList; + I: Integer; + ToolWindow: TComponent; + ADock: TTBDock; + DockedToName: String; +begin + DocksDisabled := TList.Create; + try + with OwnerComponent do + for I := 0 to ComponentCount-1 do + if Components[I] is TTBDock then begin + TTBDock(Components[I]).BeginUpdate; + DocksDisabled.Add(Components[I]); + end; + + for I := 0 to OwnerComponent.ComponentCount-1 do begin + ToolWindow := OwnerComponent.Components[I]; + if ToolWindow is TTBCustomDockableWindow then + with TTBCustomDockableWindow(ToolWindow) do begin + {}{should skip over toolbars that are neither Docked nor Floating } + if Name = '' then + Continue; + Rev := ReadIntProc(Name, rvRev, 0, ExtraData); + if Rev = 2000 then begin + Visible := ReadIntProc(Name, rvVisible, Ord(Visible), ExtraData) <> 0; + DockedToName := ReadStringProc(Name, rvDockedTo, '', ExtraData); + if DockedToName <> '' then begin + if DockedToName <> rdDockedToFloating then begin + ADock := FindDock(DockedToName); + if (ADock <> nil) and (ADock.FAllowDrag) then + ReadValues(TTBCustomDockableWindow(ToolWindow), ADock); + end + else + ReadValues(TTBCustomDockableWindow(ToolWindow), nil); + end; + end; + end; + end; + finally + for I := DocksDisabled.Count-1 downto 0 do + TTBDock(DocksDisabled[I]).EndUpdate; + DocksDisabled.Free; + end; +end; + +procedure TBCustomSavePositions(const OwnerComponent: TComponent; + const WriteIntProc: TTBPositionWriteIntProc; + const WriteStringProc: TTBPositionWriteStringProc; + const ExtraData: TTBPositionExtraData); +var + I: Integer; + N, L: String; + Data: TTBWritePositionData; +begin + for I := 0 to OwnerComponent.ComponentCount-1 do + if OwnerComponent.Components[I] is TTBCustomDockableWindow then + with TTBCustomDockableWindow(OwnerComponent.Components[I]) do begin + if Name = '' then + Continue; + if Floating then + N := rdDockedToFloating + else if Docked then begin + if CurrentDock.FAllowDrag then begin + N := CurrentDock.Name; + if N = '' then + raise Exception.Create(STBToolwinDockedToNameNotSet); + end + else + N := ''; + end + else + Continue; { skip if it's neither floating nor docked } + L := ''; + if Assigned(FLastDock) then + L := FLastDock.Name; + WriteIntProc(Name, rvRev, rdCurrentRev, ExtraData); + WriteIntProc(Name, rvVisible, Ord(Visible), ExtraData); + WriteStringProc(Name, rvDockedTo, N, ExtraData); + WriteStringProc(Name, rvLastDock, L, ExtraData); + WriteIntProc(Name, rvDockRow, FDockRow, ExtraData); + WriteIntProc(Name, rvDockPos, FDockPos, ExtraData); + WriteIntProc(Name, rvFloatLeft, FFloatingPosition.X, ExtraData); + WriteIntProc(Name, rvFloatTop, FFloatingPosition.Y, ExtraData); + Data.WriteIntProc := WriteIntProc; + Data.WriteStringProc := WriteStringProc; + Data.ExtraData := ExtraData; + WritePositionData(Data); + end; +end; + +type + TIniReadWriteData = class + private + IniFile: TCustomIniFile; + SectionNamePrefix: String; + end; + +function IniReadInt(const ToolbarName, Value: String; const Default: Longint; + const ExtraData: TTBPositionExtraData): Longint; +begin + Result := TIniReadWriteData(ExtraData).IniFile.ReadInteger( + TIniReadWriteData(ExtraData).SectionNamePrefix + ToolbarName, Value, Default); +end; +function IniReadString(const ToolbarName, Value, Default: String; + const ExtraData: TTBPositionExtraData): String; +begin + Result := TIniReadWriteData(ExtraData).IniFile.ReadString( + TIniReadWriteData(ExtraData).SectionNamePrefix + ToolbarName, Value, Default); +end; +procedure IniWriteInt(const ToolbarName, Value: String; const Data: Longint; + const ExtraData: TTBPositionExtraData); +begin + TIniReadWriteData(ExtraData).IniFile.WriteInteger( + TIniReadWriteData(ExtraData).SectionNamePrefix + ToolbarName, Value, Data); +end; +procedure IniWriteString(const ToolbarName, Value, Data: String; + const ExtraData: TTBPositionExtraData); +begin + TIniReadWriteData(ExtraData).IniFile.WriteString( + TIniReadWriteData(ExtraData).SectionNamePrefix + ToolbarName, Value, Data); +end; + +procedure TBIniLoadPositions(const OwnerComponent: TComponent; + const IniFile: TCustomIniFile; const SectionNamePrefix: String); +var + Data: TIniReadWriteData; +begin + Data := TIniReadWriteData.Create; + try + Data.IniFile := IniFile; + Data.SectionNamePrefix := SectionNamePrefix; + TBCustomLoadPositions(OwnerComponent, IniReadInt, IniReadString, Data); + finally + Data.Free; + end; +end; + +procedure TBIniLoadPositions(const OwnerComponent: TComponent; + const Filename, SectionNamePrefix: String); +var + IniFile: TIniFile; +begin + IniFile := TIniFile.Create(Filename); + try + TBIniLoadPositions(OwnerComponent, IniFile, SectionNamePrefix); + finally + IniFile.Free; + end; +end; + +procedure TBIniSavePositions(const OwnerComponent: TComponent; + const IniFile: TCustomIniFile; const SectionNamePrefix: String); +var + Data: TIniReadWriteData; +begin + Data := TIniReadWriteData.Create; + try + Data.IniFile := IniFile; + Data.SectionNamePrefix := SectionNamePrefix; + TBCustomSavePositions(OwnerComponent, IniWriteInt, IniWriteString, Data); + finally + Data.Free; + end; +end; + +procedure TBIniSavePositions(const OwnerComponent: TComponent; + const Filename, SectionNamePrefix: String); +var + IniFile: TIniFile; +begin + IniFile := TIniFile.Create(Filename); + try + TBIniSavePositions(OwnerComponent, IniFile, SectionNamePrefix); + finally + IniFile.Free; + end; +end; + +function RegReadInt(const ToolbarName, Value: String; const Default: Longint; + const ExtraData: TTBPositionExtraData): Longint; +begin + Result := TRegIniFile(ExtraData).ReadInteger(ToolbarName, Value, Default); +end; +function RegReadString(const ToolbarName, Value, Default: String; + const ExtraData: TTBPositionExtraData): String; +begin + Result := TRegIniFile(ExtraData).ReadString(ToolbarName, Value, Default); +end; +procedure RegWriteInt(const ToolbarName, Value: String; const Data: Longint; + const ExtraData: TTBPositionExtraData); +begin + TRegIniFile(ExtraData).WriteInteger(ToolbarName, Value, Data); +end; +procedure RegWriteString(const ToolbarName, Value, Data: String; + const ExtraData: TTBPositionExtraData); +begin + TRegIniFile(ExtraData).WriteString(ToolbarName, Value, Data); +end; + +procedure TBRegLoadPositions(const OwnerComponent: TComponent; + const RootKey: DWORD; const BaseRegistryKey: String); +var + Reg: TRegIniFile; +begin + Reg := TRegIniFile.Create(''); + try + {$IFDEF JR_D5} + Reg.Access := KEY_QUERY_VALUE; + {$ENDIF} + Reg.RootKey := RootKey; + if Reg.OpenKey(BaseRegistryKey, False) then + TBCustomLoadPositions(OwnerComponent, RegReadInt, RegReadString, Reg); + finally + Reg.Free; + end; +end; + +procedure TBRegSavePositions(const OwnerComponent: TComponent; + const RootKey: DWORD; const BaseRegistryKey: String); +var + Reg: TRegIniFile; +begin + Reg := TRegIniFile.Create(''); + try + Reg.RootKey := RootKey; + Reg.CreateKey(BaseRegistryKey); + if Reg.OpenKey(BaseRegistryKey, True) then + TBCustomSavePositions(OwnerComponent, RegWriteInt, RegWriteString, Reg); + finally + Reg.Free; + end; +end; + +end. diff --git a/internal/2.2.2/1/Source/TB2DsgnConvertOptions.dfm b/internal/2.2.2/1/Source/TB2DsgnConvertOptions.dfm new file mode 100644 index 0000000000000000000000000000000000000000..9d5ad455139a68dd6c12b8f4c375030fc52b7d08 GIT binary patch literal 903 zcmaKr&yLeD5XQX;jq|7Ng2W1rJ@tr|Biy!WqgHA+r7VylRGY{DNnV93j;|KUi1^j6scC2YhKZ%TBe2(j*{C5uJQH2h4LF@y z(o3kwdkHAEs_ISO0qVwl87iO};!?Bg&SlO@w{UkWlS~1Ku;?6AXU_J(^LgQm$kx^e zza-YI4sytprobKZeQx};+|o|VZ5f%?E9Y?dXwjp7=}k||Ug2~(rXc z20N{#=+u*|qEpC=TFd0XcyiR@_UkG8v67W8m8pjQ!O- zLF+%9R==!iZnJPKir18V#OKXrCedJUg{a5!){NzEgcDMc0r!rQ>ck&9tcG0tX6QF{ C5*`@< literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Source/TB2DsgnConvertOptions.dfm.txt b/internal/2.2.2/1/Source/TB2DsgnConvertOptions.dfm.txt new file mode 100644 index 0000000..a1b062f --- /dev/null +++ b/internal/2.2.2/1/Source/TB2DsgnConvertOptions.dfm.txt @@ -0,0 +1,65 @@ +object TBConvertOptionsForm: TTBConvertOptionsForm + Left = 225 + Top = 133 + BorderIcons = [biSystemMenu, biMinimize] + BorderStyle = bsDialog + Caption = 'Convert Menu' + ClientHeight = 90 + ClientWidth = 249 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 8 + Top = 8 + Width = 81 + Height = 13 + Caption = '&Menu to convert:' + FocusControl = MenuCombo + end + object MenuCombo: TComboBox + Left = 8 + Top = 24 + Width = 233 + Height = 21 + Style = csDropDownList + ItemHeight = 13 + TabOrder = 0 + end + object ConvertButton: TButton + Left = 8 + Top = 57 + Width = 73 + Height = 23 + Caption = '&Convert' + Default = True + ModalResult = 1 + TabOrder = 1 + end + object HelpButton: TButton + Left = 168 + Top = 57 + Width = 73 + Height = 23 + Caption = '&Help' + TabOrder = 2 + OnClick = HelpButtonClick + end + object Button1: TButton + Left = 88 + Top = 57 + Width = 73 + Height = 23 + Cancel = True + Caption = 'Cancel' + ModalResult = 2 + TabOrder = 3 + end +end diff --git a/internal/2.2.2/1/Source/TB2DsgnConvertOptions.pas b/internal/2.2.2/1/Source/TB2DsgnConvertOptions.pas new file mode 100644 index 0000000..5c47a46 --- /dev/null +++ b/internal/2.2.2/1/Source/TB2DsgnConvertOptions.pas @@ -0,0 +1,67 @@ +unit TB2DsgnConvertOptions; + +{ + Toolbar2000 + Copyright (C) 1998-2005 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2DsgnConvertOptions.pas,v 1.6 2005/01/06 03:56:50 jr Exp $ +} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls; + +type + TTBConvertOptionsForm = class(TForm) + MenuCombo: TComboBox; + Label1: TLabel; + ConvertButton: TButton; + HelpButton: TButton; + Button1: TButton; + procedure HelpButtonClick(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +implementation + +{$R *.DFM} + +procedure TTBConvertOptionsForm.HelpButtonClick(Sender: TObject); +const + SMsg1 = 'This will import the contents of a TMainMenu or TPopupMenu ' + + 'component on the form.'#13#10#13#10 + + 'The new items will take the names of the old menu ' + + 'items. The old menu items will have "_OLD" appended to the end of ' + + 'their names.'#13#10#13#10 + + 'After the conversion process completes, you should verify that ' + + 'everything was copied correctly. Afterward, you may delete the ' + + 'old menu component.'; +begin + Application.MessageBox(SMsg1, 'Convert Help', MB_OK or MB_ICONINFORMATION); +end; + +end. diff --git a/internal/2.2.2/1/Source/TB2DsgnConverter.dfm b/internal/2.2.2/1/Source/TB2DsgnConverter.dfm new file mode 100644 index 0000000000000000000000000000000000000000..f684c17f209da2e10834ba14db6c65666b920583 GIT binary patch literal 795 zcma)(v69m;5QY_-SdN`sLPbI2>PqHbArbLhW|DKp7F-F6y?60gkus73xksU-ypEPP z;2C%iYLM;V+;9!u?nv7I)3?6^MCptqH}B^uou_eB3{-j7zR%19hY(#PydVmgfkYLc2L4*=vi=6X z*w;S;5X7Q`!igYUYQT1`+BM~9T^@n!HK>Kix6a3)hB(EKkWZJTHZyq)SD-b!hq`U_ zIeuf$@3#WJ^t_XqM}((#l2khMSXGeVtjD)%e;AFK}NHMz6{qmyDC85!Bc{YElX;OC4^$2dNN HoDk6;D60O= literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Source/TB2DsgnConverter.dfm.txt b/internal/2.2.2/1/Source/TB2DsgnConverter.dfm.txt new file mode 100644 index 0000000..7d2cbaf --- /dev/null +++ b/internal/2.2.2/1/Source/TB2DsgnConverter.dfm.txt @@ -0,0 +1,51 @@ +object TBConverterForm: TTBConverterForm + Left = 200 + Top = 104 + AutoScroll = False + Caption = 'Conversion Status' + ClientHeight = 218 + ClientWidth = 425 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = True + Position = poScreenCenter + OnClose = FormClose + PixelsPerInch = 96 + TextHeight = 13 + object MessageList: TListBox + Left = 8 + Top = 8 + Width = 409 + Height = 169 + Anchors = [akLeft, akTop, akRight, akBottom] + ItemHeight = 13 + TabOrder = 0 + end + object CloseButton: TButton + Left = 176 + Top = 185 + Width = 73 + Height = 23 + Anchors = [akRight, akBottom] + Cancel = True + Caption = '&Close' + Enabled = False + TabOrder = 1 + OnClick = CloseButtonClick + end + object CopyButton: TButton + Left = 256 + Top = 185 + Width = 161 + Height = 23 + Anchors = [akRight, akBottom] + Caption = 'C&opy Messages to Clipboard' + Enabled = False + TabOrder = 2 + OnClick = CopyButtonClick + end +end diff --git a/internal/2.2.2/1/Source/TB2DsgnConverter.pas b/internal/2.2.2/1/Source/TB2DsgnConverter.pas new file mode 100644 index 0000000..e1a2456 --- /dev/null +++ b/internal/2.2.2/1/Source/TB2DsgnConverter.pas @@ -0,0 +1,217 @@ +unit TB2DsgnConverter; + +{ + Toolbar2000 + Copyright (C) 1998-2005 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2DsgnConverter.pas,v 1.16 2005/01/06 03:56:50 jr Exp $ +} + +interface + +{$I TB2Ver.inc} + +uses + Windows, SysUtils, Classes, Controls, Forms, Menus, StdCtrls, + TB2Item; + +type + TTBConverterForm = class(TForm) + MessageList: TListBox; + CloseButton: TButton; + CopyButton: TButton; + procedure CloseButtonClick(Sender: TObject); + procedure CopyButtonClick(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + end; + +procedure DoConvert(const ParentItem: TTBCustomItem; const Owner: TComponent); + +implementation + +{$R *.DFM} + +uses + Clipbrd, TB2DsgnConvertOptions; + +procedure DoConvert(const ParentItem: TTBCustomItem; const Owner: TComponent); +const + SPropNotTransferred = 'Warning: %s property not transferred on ''%s''.'; +var + ConverterForm: TTBConverterForm; + + procedure Log(const S: String); + begin + ConverterForm.MessageList.Items.Add(S); + ConverterForm.MessageList.TopIndex := ConverterForm.MessageList.Items.Count-1; + ConverterForm.Update; + end; + + procedure Recurse(MenuItem: TMenuItem; TBItem: TTBCustomItem); + var + I: Integer; + Src: TMenuItem; + IsSep, IsSubmenu: Boolean; + Dst: TTBCustomItem; + N: String; + begin + for I := 0 to MenuItem.Count-1 do begin + Src := MenuItem[I]; + IsSep := (Src.Caption = '-'); + IsSubmenu := False; + if not IsSep then begin + if Src.Count > 0 then + IsSubmenu := True; + if not IsSubmenu then + Dst := TTBItem.Create(Owner) + else + Dst := TTBSubmenuItem.Create(Owner); + Dst.Action := Src.Action; + {$IFDEF JR_D6} + Dst.AutoCheck := Src.AutoCheck; + {$ENDIF} + Dst.Caption := Src.Caption; + Dst.Checked := Src.Checked; + if Src.Default then + Dst.Options := Dst.Options + [tboDefault]; + Dst.Enabled := Src.Enabled; + Dst.GroupIndex := Src.GroupIndex; + Dst.HelpContext := Src.HelpContext; + Dst.ImageIndex := Src.ImageIndex; + Dst.RadioItem := Src.RadioItem; + Dst.ShortCut := Src.ShortCut; + {$IFDEF JR_D5} + Dst.SubMenuImages := Src.SubMenuImages; + {$ENDIF} + Dst.OnClick := Src.OnClick; + end + else begin + Dst := TTBSeparatorItem.Create(Owner); + end; + Dst.Hint := Src.Hint; + Dst.Tag := Src.Tag; + Dst.Visible := Src.Visible; + if not IsSep then + { Temporarily clear the menu item's OnClick property, so that renaming + the menu item doesn't cause the function name to change } + Src.OnClick := nil; + try + N := Src.Name; + Src.Name := N + '_OLD'; + Dst.Name := N; + finally + if not IsSep then + Src.OnClick := Dst.OnClick; + end; + TBItem.Add(Dst); + {$IFDEF JR_D5} + if @Src.OnAdvancedDrawItem <> nil then + Log(Format(SPropNotTransferred, ['OnAdvancedDrawItem', Dst.Name])); + {$ENDIF} + if @Src.OnDrawItem <> nil then + Log(Format(SPropNotTransferred, ['OnDrawItem', Dst.Name])); + if @Src.OnMeasureItem <> nil then + Log(Format(SPropNotTransferred, ['OnMeasureItem', Dst.Name])); + if IsSubmenu then + Recurse(Src, Dst); + end; + end; + +var + OptionsForm: TTBConvertOptionsForm; + I: Integer; + C: TComponent; + Menu: TMenu; +begin + Menu := nil; + OptionsForm := TTBConvertOptionsForm.Create(Application); + try + for I := 0 to Owner.ComponentCount-1 do begin + C := Owner.Components[I]; + if (C is TMenu) and not(C is TTBPopupMenu) then + OptionsForm.MenuCombo.Items.AddObject(C.Name, C); + end; + if OptionsForm.MenuCombo.Items.Count = 0 then + raise Exception.Create('Could not find any menus on the form to convert'); + OptionsForm.MenuCombo.ItemIndex := 0; + if (OptionsForm.ShowModal <> mrOK) or (OptionsForm.MenuCombo.ItemIndex < 0) then + Exit; + Menu := TMenu(OptionsForm.MenuCombo.Items.Objects[OptionsForm.MenuCombo.ItemIndex]); + finally + OptionsForm.Free; + end; + ParentItem.SubMenuImages := Menu.Images; + ConverterForm := TTBConverterForm.Create(Application); + ConverterForm.Show; + ConverterForm.Update; + Log(Format('Converting ''%s'', please wait...', [Menu.Name])); + ParentItem.ViewBeginUpdate; + try + Recurse(Menu.Items, ParentItem); + finally + ParentItem.ViewEndUpdate; + end; + Log('Done!'); + ConverterForm.CloseButton.Enabled := True; + ConverterForm.CopyButton.Enabled := True; +end; + + +{ TTBConverterForm } + +procedure TTBConverterForm.FormClose(Sender: TObject; + var Action: TCloseAction); +begin + Action := caFree; +end; + +procedure TTBConverterForm.CloseButtonClick(Sender: TObject); +begin + Close; +end; + +procedure TTBConverterForm.CopyButtonClick(Sender: TObject); +begin + Clipboard.AsText := MessageList.Items.Text; +end; + + +procedure FreeConverterForms; +var + I: Integer; + Form: TCustomForm; +label Restart; +begin + Restart: + for I := 0 to Screen.CustomFormCount-1 do begin + Form := Screen.CustomForms[I]; + if Form is TTBConverterForm then begin + Form.Free; + goto Restart; + end; + end; +end; + +initialization +finalization + FreeConverterForms; +end. diff --git a/internal/2.2.2/1/Source/TB2DsgnItemEditor.dfm b/internal/2.2.2/1/Source/TB2DsgnItemEditor.dfm new file mode 100644 index 0000000000000000000000000000000000000000..748a7cda66491df4c58d876553ae3d5180707d5a GIT binary patch literal 2866 zcma)8&2r;J5FX1vk}TPANO9oilZ(rS4a)=I$aW<~ymna%djwgUji(~ds7B*B=EPR< zAUwuixbqkscm;|h^o%sJtle5TWx6}_b@%u6wERyO1;O=gFr7~)x4~?&nxmJ4FC2t| z%!gLgAt`O~1AN7WrSO5P9}vweV{g`)y_7UM5lS+Bz_?)2vV&<|-g z^f4!I^ZULyB-layMG|`)hXOBTBeu0<84-k0v!BW)F{U1rj(K-M$B`gU@Si5s$G4@m zpkBfk&7(aGpbwyo0WCwnl5CNFBK3wGtzsniEXe(xnW~X56 zPt@^tJOhrbh~KD7&I)Hht?I(Gcy^!0P#FU70BZi8;Ju{}3fnk=ZoWfD?DjYz57g|0 ziIll_Lt^aX1VgioTAf=OL;uEwwZdV%pvl3u{0-Z$7!#Higlk2cVOYSzCZrG8?CZR_ z4ZKZw_%PutH3vGRJw+S$2fe z9?8ue$%NuYA9CJ*IVIlxmo&c(27YE{Z{KhY9R4ty)K4HYY54gx7B%Yqm=gA6}R3 z-Vyrf@74sCS_bsy>Ex!&`pb~R!;o*`hERA5`eYx8M+mu4WvR)DKA*tOrxG>PzJ;+F z6zkc8wHOkL`5@oVrCscgKk_+#Mt!&dWp809WU(iOBeOv3y~cYPz1|4{`%aIu4esGc z23oSQjwNkrc5k=g1D5;X890J=x$t(vcwx!~D5vGK6F}udWwrqXi;`*yU6rtiM+jWTWX#kXbN&+E{&)G~pO(^}fT%7I5|$V0(+o>+1MUx~t3O>G=g|Axxc=T+z; zZH;_u&Nx=jQ#0HiNtd}$>mzdpV$I}wgs&JKbI$fKHd67j3`ssHeqvu8nYBTMT5m0H zHxlNQhU)~!R^D0@{;k?jyKJIg0@R4>dMrKEpxYzqtYNpLuL|BO!OxBuHFReg!jFX- zd}pM*dC6^cuHtq|+(G4b4cMK)=j#Jxca*!;EZ6FHDxqq+W+}RHS!O=3!WXIkQ?IX& zdbxA + ColumnClick = False + DragMode = dmAutomatic + HideSelection = False + MultiSelect = True + ReadOnly = True + RowSelect = True + PopupMenu = TBPopupMenu1 + TabOrder = 1 + ViewStyle = vsReport + OnChange = ListViewChange + OnDblClick = ListViewDblClick + OnEnter = ListViewEnter + OnDragDrop = ListViewDragDrop + OnDragOver = ListViewDragOver + OnKeyDown = ListViewKeyDown + OnKeyPress = ListViewKeyPress + end + object Toolbar: TTBToolbar + Left = 0 + Top = 0 + Width = 440 + Height = 19 + Align = alTop + Caption = 'Toolbar' + DockPos = 0 + FullSize = True + LinkSubitems = ToolbarItems + ParentShowHint = False + ShowHint = True + TabOrder = 0 + end + object TBPopupMenu1: TTBPopupMenu + LinkSubitems = ToolbarItems + Left = 256 + Top = 120 + end + object TBItemContainer1: TTBItemContainer + Left = 224 + Top = 120 + object ToolbarItems: TTBSubmenuItem + object NewItemButton: TTBItem + Caption = 'New &Item' + Hint = 'New Item' + ImageIndex = 0 + ShortCut = 45 + OnClick = NewItemButtonClick + end + object NewSubmenuButton: TTBItem + Caption = 'New &Submenu' + Hint = 'New Submenu' + ImageIndex = 1 + ShortCut = 16429 + OnClick = NewSubmenuButtonClick + end + object NewSepButton: TTBItem + Caption = 'New Se¶tor' + Hint = 'New Separator' + ImageIndex = 2 + ShortCut = 189 + OnClick = NewSepButtonClick + end + object MoreMenu: TTBSubmenuItem + Caption = '&More' + Options = [tboDropdownArrow] + end + object TBSeparatorItem1: TTBSeparatorItem + end + object CutButton: TTBItem + Caption = 'Cu&t' + Enabled = False + Hint = 'Cut' + ImageIndex = 5 + OnClick = CutButtonClick + end + object CopyButton: TTBItem + Caption = '&Copy' + Enabled = False + Hint = 'Copy' + ImageIndex = 4 + OnClick = CopyButtonClick + end + object PasteButton: TTBItem + Caption = '&Paste' + Hint = 'Paste' + ImageIndex = 6 + OnClick = PasteButtonClick + end + object DeleteButton: TTBItem + Caption = '&Delete Item' + Enabled = False + Hint = 'Delete Item' + ImageIndex = 3 + ShortCut = 46 + OnClick = DeleteButtonClick + end + object TBSeparatorItem2: TTBSeparatorItem + end + object MoveUpButton: TTBItem + Caption = 'Move &Up' + Hint = 'Move Up' + ImageIndex = 7 + ShortCut = 32806 + OnClick = MoveUpButtonClick + end + object MoveDownButton: TTBItem + Caption = 'Move D&own' + Hint = 'Move Down' + ImageIndex = 8 + ShortCut = 32808 + OnClick = MoveDownButtonClick + end + object TBSeparatorItem3: TTBSeparatorItem + end + object TBSubmenuItem1: TTBSubmenuItem + Caption = '&Tools' + Options = [tboDropdownArrow] + object TConvertMenu: TTBItem + Caption = '&Convert TMainMenu/TPopupMenu...' + OnClick = TConvertMenuClick + end + end + end + end +end diff --git a/internal/2.2.2/1/Source/TB2DsgnItemEditor.pas b/internal/2.2.2/1/Source/TB2DsgnItemEditor.pas new file mode 100644 index 0000000..a8b35fc --- /dev/null +++ b/internal/2.2.2/1/Source/TB2DsgnItemEditor.pas @@ -0,0 +1,1439 @@ +unit TB2DsgnItemEditor; + +{ + Toolbar2000 + Copyright (C) 1998-2008 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2DsgnItemEditor.pas,v 1.63 2008/09/25 18:49:31 jr Exp $ +} + +interface + +{$I TB2Ver.inc} + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + {$IFDEF CLR} System.ComponentModel, {$ENDIF} + StdCtrls, ExtCtrls, Buttons, ComCtrls, ImgList, Menus, + TB2Item, TB2Toolbar, TB2Dock, + {$IFDEF JR_D6} + DesignIntf, DesignWindows, DesignEditors; + {$ELSE} + DsgnIntf, DsgnWnds, LibIntf; + {$ENDIF} + +const + CM_DEFERUPDATE = WM_USER + 100; + +type + TTBItemEditForm = class(TDesignWindow) + TreeView: TTreeView; + ListView: TListView; + Splitter1: TSplitter; + Toolbar: TTBToolbar; + NewSubmenuButton: TTBItem; + NewItemButton: TTBItem; + NewSepButton: TTBItem; + DeleteButton: TTBItem; + TBSeparatorItem1: TTBSeparatorItem; + TBPopupMenu1: TTBPopupMenu; + TBItemContainer1: TTBItemContainer; + ToolbarItems: TTBSubmenuItem; + CopyButton: TTBItem; + CutButton: TTBItem; + PasteButton: TTBItem; + MoreMenu: TTBSubmenuItem; + TBSeparatorItem2: TTBSeparatorItem; + TBSubmenuItem1: TTBSubmenuItem; + TConvertMenu: TTBItem; + TBSeparatorItem3: TTBSeparatorItem; + MoveUpButton: TTBItem; + MoveDownButton: TTBItem; + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure TreeViewChange(Sender: TObject; Node: TTreeNode); + procedure NewSubmenuButtonClick(Sender: TObject); + procedure NewItemButtonClick(Sender: TObject); + procedure ListViewChange(Sender: TObject; Item: TListItem; + Change: TItemChange); + procedure DeleteButtonClick(Sender: TObject); + procedure NewSepButtonClick(Sender: TObject); + procedure ListViewDragOver(Sender, Source: TObject; X, Y: Integer; + State: TDragState; var Accept: Boolean); + procedure ListViewDragDrop(Sender, Source: TObject; X, Y: Integer); + procedure TreeViewEnter(Sender: TObject); + procedure TreeViewDragDrop(Sender, Source: TObject; X, Y: Integer); + procedure TreeViewDragOver(Sender, Source: TObject; X, Y: Integer; + State: TDragState; var Accept: Boolean); + procedure CopyButtonClick(Sender: TObject); + procedure ListViewKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); + procedure CutButtonClick(Sender: TObject); + procedure PasteButtonClick(Sender: TObject); + procedure FormActivate(Sender: TObject); + procedure ListViewKeyPress(Sender: TObject; var Key: Char); + procedure ListViewDblClick(Sender: TObject); + procedure ListViewEnter(Sender: TObject); + procedure TreeViewKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); + procedure TConvertMenuClick(Sender: TObject); + procedure TreeViewKeyPress(Sender: TObject; var Key: Char); + procedure MoveUpButtonClick(Sender: TObject); + procedure MoveDownButtonClick(Sender: TObject); + private + FParentComponent: TComponent; + FRootItem, FSelParentItem: TTBCustomItem; + FNotifyItemList: TList; + FSettingSel, FRebuildingTree, FRebuildingList: Integer; + function AddListViewItem(const Index: Integer; + const Item: TTBCustomItem): TListItem; + procedure CMDeferUpdate(var Message: TMessage); message CM_DEFERUPDATE; + procedure Copy; + procedure CreateNewItem(const AClass: TTBCustomItemClass); + procedure Cut; + procedure Delete; + procedure DeleteItem(const Item: TTBCustomItem); + function GetItemTreeCaption(AItem: TTBCustomItem): String; + procedure GetSelItemList(const AList: TList); + procedure ItemNotification(Ancestor: TTBCustomItem; Relayed: Boolean; + Action: TTBItemChangedAction; Index: Integer; Item: TTBCustomItem); + procedure MoreItemClick(Sender: TObject); + procedure MoveItem(CurIndex, NewIndex: Integer); + procedure Paste; + procedure RebuildList; + procedure RebuildTree; + procedure SelectInObjectInspector(AList: TList); + procedure SetSelParentItem(ASelParentItem: TTBCustomItem); + function TreeViewDragHandler(Sender, Source: TObject; X, Y: Integer; + Drop: Boolean): Boolean; + procedure UnregisterAllNotifications; + protected + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + function UniqueName(Component: TComponent): String; override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + {$IFDEF JR_D6} + function EditAction(Action: TEditAction): Boolean; override; + {$ELSE} + procedure EditAction(Action: TEditAction); override; + {$ENDIF} + function GetEditState: TEditState; override; + end; + + TTBItemsEditor = class(TDefaultEditor) + public + procedure Edit; override; + procedure ExecuteVerb(Index: Integer); override; + function GetVerb(Index: Integer): String; override; + function GetVerbCount: Integer; override; + end; + + TTBItemsPropertyEditor = class(TStringProperty) + public + procedure Edit; override; + function GetAttributes: TPropertyAttributes; override; + function GetValue: String; override; + end; + +procedure TBRegisterItemClass(AClass: TTBCustomItemClass; + const ACaption: String; ResInstance: HINST); + +implementation + +{$R *.DFM} + +uses + {$IFDEF CLR} System.Drawing, System.IO, System.Reflection, {$ENDIF} + TypInfo, CommCtrl, TB2Version, TB2Common, TB2DsgnConverter; + +type +{$IFNDEF JR_D5} + TDesignerSelectionList = TComponentList; +{$ENDIF} +{$IFDEF JR_D6} + TDesignerSelectionList = IDesignerSelections; +{$ENDIF} + + TItemClassInfo = class + ItemClass: TTBCustomItemClass; + Caption: String; + ImageIndex: Integer; + end; + +var + ItemClasses: TList; + ItemImageList: TImageList; + +{$IFNDEF JR_D6} +function CreateSelectionList: TDesignerSelectionList; +begin + Result := TDesignerSelectionList.Create; +end; +{$ENDIF} + +procedure FreeItemClasses; +var + I: Integer; + IC: TList; +begin + if ItemClasses = nil then Exit; + IC := ItemClasses; + ItemClasses := nil; + for I := IC.Count-1 downto 0 do + TItemClassInfo(IC[I]).Free; + IC.Free; +end; + +{ Note: AFAIK, there is no need for a similar function on .NET since assemblies + can't be unloaded. When a design-time package is uninstalled, it remains + loaded until the IDE is restarted. } +{$IFNDEF CLR} +procedure UnregisterModuleItemClasses(AModule: {$IFDEF JR_D5} LongWord {$ELSE} Integer {$ENDIF}); +var + I: Integer; + Info: TItemClassInfo; +begin + I := 0; + while I < ItemClasses.Count do begin + Info := TItemClassInfo(ItemClasses[I]); + if FindClassHInstance(Info.ItemClass) = AModule then begin + ItemClasses.Delete(I); + Info.Free; + end + else + Inc(I); + end; + { Note: TTBItemEditForm also holds references to item classes, but since + Delphi automatically closes all editor forms before compiling/removing + a package, we don't need to remove them. } +end; +{$ENDIF} + +{$IFNDEF CLR} +function LoadItemImage(Instance: HINST; const ResName: String): Integer; +var + Bmp: TBitmap; +begin + Bmp := TBitmap.Create; + try + Bmp.Handle := LoadBitmap(Instance, {$IFNDEF CLR}PChar{$ENDIF}(ResName)); + if Bmp.Handle = 0 then + Result := -1 + else + Result := ItemImageList.AddMasked(Bmp, Bmp.Canvas.Pixels[0, Bmp.Height-1]); + finally + Bmp.Free; + end; +end; +{$ELSE} +function LoadItemImage(const AAssembly: System.Reflection.Assembly; + const ResName: String): Integer; +var + Bmp: TBitmap; + ResStream: System.IO.Stream; + ResBmp: System.Drawing.Bitmap; +begin + Bmp := TBitmap.Create; + try + ResStream := AAssembly.GetManifestResourceStream(ResName); + if ResStream = nil then begin + Result := -1; + Exit; + end; + try + ResBmp := System.Drawing.Bitmap.Create(ResStream); + try + Bmp.LoadFromBitmap(ResBmp); + finally + ResBmp.Dispose; + end; + finally + ResStream.Close; + end; + Result := ItemImageList.AddMasked(Bmp, Bmp.Canvas.Pixels[0, Bmp.Height-1]); + finally + Bmp.Free; + end; +end; +{$ENDIF} + +procedure TBRegisterItemClass(AClass: TTBCustomItemClass; + const ACaption: String; ResInstance: HINST); +var + I: Integer; + Info: TItemClassInfo; +begin + { Hack for Delphi.NET 2006 bug: + If you start Delphi, open & rebuild the tb2k_dn10 package only, then open + the Demo project, the IDE calls the Register procedure on tb2kdsgn_d10 a + second time, without reloading either of the two packages. As a result, + the TBRegisterItemClass calls are repeated. To avoid doubled items on the + editor form's More menu, check if the class was already registered. } + for I := 0 to ItemClasses.Count-1 do + if TItemClassInfo(ItemClasses[I]).ItemClass = AClass then + Exit; + Info := TItemClassInfo.Create; + Info.ItemClass := AClass; + Info.Caption := ACaption; + {$IFNDEF CLR} + Info.ImageIndex := LoadItemImage(ResInstance, + Uppercase(AClass.ClassName {$IFDEF JR_D9} , loInvariantLocale {$ENDIF})); + {$ELSE} + Info.ImageIndex := LoadItemImage(Assembly.GetCallingAssembly, + AClass.ClassName + '.bmp'); + {$ENDIF} + ItemClasses.Add(Info); +end; + +function GetItemClassImage(AClass: TTBCustomItemClass): Integer; +var + I: Integer; + Info: TItemClassInfo; +begin + for I := ItemClasses.Count-1 downto 0 do begin + Info := TItemClassInfo(ItemClasses[I]); + if AClass.InheritsFrom(Info.ItemClass) then begin + Result := Info.ImageIndex; + if Result >= 0 then + Exit; + end; + end; + if AClass.InheritsFrom(TTBSubmenuItem) then + Result := 1 + else if AClass.InheritsFrom(TTBSeparatorItem) then + Result := 2 + else + Result := 0; +end; + +procedure ShowEditForm(AParentComponent: TComponent; ARootItem: TTBCustomItem; + const ADesigner: {$IFDEF JR_D6} IDesigner {$ELSE} IFormDesigner {$ENDIF}); +var + I: Integer; + Form: TCustomForm; + EditForm: TTBItemEditForm; +begin + if Assigned(ARootItem.LinkSubitems) then begin + case MessageDlg(Format('The LinkSubitems property is set to ''%s''. ' + + 'Would you like to edit that item instead?', + [ARootItem.LinkSubitems.Name]), mtConfirmation, [mbYes, mbNo, mbCancel], 0) of + mrYes: begin + AParentComponent := ARootItem.LinkSubitems; + ARootItem := ARootItem.LinkSubitems; + end; + mrCancel: Exit; + end; + end; + for I := 0 to Screen.FormCount-1 do begin + Form := Screen.Forms[I]; + if Form is TTBItemEditForm then + if TTBItemEditForm(Form).FRootItem = ARootItem then begin + Form.Show; + if Form.WindowState = wsMinimized then + Form.WindowState := wsNormal; + Exit; + end; + end; + EditForm := TTBItemEditForm.Create(Application); + try + EditForm.Designer := ADesigner; + EditForm.FParentComponent := AParentComponent; + AParentComponent.FreeNotification(EditForm); + EditForm.FRootItem := ARootItem; + ARootItem.FreeNotification(EditForm); + EditForm.FSelParentItem := ARootItem; + EditForm.Caption := 'Editing ' + AParentComponent.Name; + EditForm.RebuildTree; + EditForm.RebuildList; + {$IFDEF JR_D9} + EditForm.PopupMode := pmExplicit; + {$ENDIF} + EditForm.Show; + except + EditForm.Free; + raise; + end; +end; + +function IsSubmenuItem(Item: TTBCustomItem): Boolean; +begin + Result := tbisSubitemsEditable in Item.GetItemStyle; +end; + +procedure ShowVersion; +const + AboutText = + '%s'#13#10 + + 'Copyright (C) 1998-2008 by Jordan Russell'#13#10 + + 'For conditions of distribution and use, see LICENSE.TXT.'#13#10 + + #13#10 + + 'Visit my web site for the latest versions of Toolbar2000:'#13#10 + + 'http://www.jrsoftware.org/'; +begin + MessageDlg(Format(AboutText, [Toolbar2000VersionPropText]), mtInformation, + [mbOK], 0); +end; + + +{ TTBItemEditForm } + +constructor TTBItemEditForm.Create(AOwner: TComponent); +var + I: Integer; + Info: TItemClassInfo; + Item: TTBItem; +begin + inherited; + FNotifyItemList := TList.Create; + ToolbarItems.SubMenuImages := ItemImageList; + ListView.SmallImages := ItemImageList; + { Populate the 'More' menu } + for I := 0 to ItemClasses.Count-1 do begin + Info := TItemClassInfo(ItemClasses[I]); + Item := TTBItem.Create(Self); + Item.Caption := Info.Caption; + Item.ImageIndex := GetItemClassImage(Info.ItemClass); + Item.Tag := {$IFNDEF CLR}Integer{$ELSE}TTag{$ENDIF}(Info.ItemClass); + Item.OnClick := MoreItemClick; + MoreMenu.Add(Item); + end; +end; + +destructor TTBItemEditForm.Destroy; +begin + inherited; + if Assigned(FNotifyItemList) then begin + UnregisterAllNotifications; + FNotifyItemList.Free; + FNotifyItemList := nil; + end; +end; + +procedure TTBItemEditForm.FormClose(Sender: TObject; + var Action: TCloseAction); +begin + Action := caFree; +end; + +procedure TTBItemEditForm.FormActivate(Sender: TObject); +begin + SetSelParentItem(FSelParentItem); +end; + +procedure TTBItemEditForm.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if (Operation = opRemove) and + ((AComponent = FParentComponent) or (AComponent = FRootItem)) then + { Must use Free instead of Close, since Close causes the freeing of the + form to be delayed until the next message. We have to destroy the form + immediately, otherwise Delphi will crash when Compile is clicked on the + TB2k package. } + Free; + {}{temp:} + (*if (Operation = opRemove) and (FNotifyItemList.IndexOf(AComponent) <> -1) then begin + outputdebugstring(pchar('Still in list: ' + AComponent.name)); + //beep; + end;*) +end; + +function TTBItemEditForm.UniqueName(Component: TComponent): String; +begin + Result := Designer.UniqueName(Component.ClassName); +end; + +function TTBItemEditForm.GetEditState: TEditState; +begin + Result := []; + if ActiveControl = ListView then begin + if Assigned(ListView.Selected) then + Result := [esCanDelete, esCanCut, esCanCopy]; + if ClipboardComponents then + Include(Result, esCanPaste); + end; +end; + +{$IFDEF JR_D6} +function TTBItemEditForm.EditAction(Action: TEditAction): Boolean; +{$ELSE} +procedure TTBItemEditForm.EditAction(Action: TEditAction); +{$ENDIF} +begin + {$IFDEF JR_D6} + Result := True; + {$ENDIF} + case Action of + eaCut: Cut; + eaCopy: Copy; + eaPaste: Paste; + eaDelete: Delete; + {$IFDEF JR_D6} + else + Result := False; + {$ENDIF} + end; +end; + +procedure TTBItemEditForm.UnregisterAllNotifications; +var + I: Integer; +begin + for I := FNotifyItemList.Count-1 downto 0 do begin + //outputdebugstring(pchar('Unregall: ' + TTBCustomItem(FNotifyItemList[I]).name)); + TTBCustomItem(FNotifyItemList[I]).UnregisterNotification(ItemNotification); + FNotifyItemList.Delete(I); + end; +end; + +procedure TTBItemEditForm.ItemNotification(Ancestor: TTBCustomItem; + Relayed: Boolean; Action: TTBItemChangedAction; Index: Integer; + Item: TTBCustomItem); +var + ListItem: TListItem; + TreeNode: TTreeNode; + I: Integer; + C: String; +begin + { Manipulate the list view when items are inserted, deleted, or their Caption + changes } + case Action of + tbicInserted: + begin + if (Ancestor = FSelParentItem) and not Relayed then + AddListViewItem(Index, Item); + if IsSubmenuItem(Item) then + RebuildTree; + end; + tbicDeleting: + if (Ancestor = FSelParentItem) and not Relayed then begin + ListItem := ListView.FindData(0, Item, True, False); + if Assigned(ListItem) then + ListItem.Delete; + end; + tbicInvalidateAndResize: + if (Ancestor = FSelParentItem) and not Relayed then begin + ListItem := ListView.FindData(0, Item, True, False); + if Assigned(ListItem) and (ListItem.Caption <> TTBCustomItem(Item).Caption) then + ListItem.Caption := TTBCustomItem(Item).Caption; + end; + end; + { Update tree view when an item is deleted, or a Caption changes } + if Action = tbicDeleting then begin + I := FNotifyItemList.IndexOf(Item); + if I <> -1 then begin + //outputdebugstring(pchar('Deleting, so unreging: ' + item.name)); + TTBCustomItem(Item).UnregisterNotification(ItemNotification); + FNotifyItemList.Delete(I); + end; + end; + if Action in [tbicDeleting, tbicInvalidateAndResize, tbicNameChanged] then begin + TreeNode := TreeView.Items.GetFirstNode; + while Assigned(TreeNode) do begin + if TreeNode.Data = Item then begin + if Action = tbicDeleting then begin + TreeNode.Delete; + if FSelParentItem = Item then + SetSelParentItem(TTBCustomItem(Item).Parent); + end + else begin + { tbicInvalidateAndResize, tbicNameChanged: } + C := GetItemTreeCaption(Item); + if TreeNode.Text <> C then + TreeNode.Text := C; + end; + Break; + end; + TreeNode := TreeNode.GetNext; + end; + end; +end; + +function TTBItemEditForm.GetItemTreeCaption(AItem: TTBCustomItem): String; +begin + if AItem <> FRootItem then begin + Result := AItem.Caption; + if Result = '' then + Result := '[' + AItem.Name + ']'; + end + else + Result := '(Root)'; +end; + +procedure TTBItemEditForm.RebuildTree; + + procedure Recurse(const AParentItem: TTBCustomItem; const ATreeNode: TTreeNode; + var FoundSelParentItem: TTreeNode); + var + I: Integer; + NewNode: TTreeNode; + ChildItem: TTBCustomItem; + begin + {}AParentItem.FreeNotification(Self); + AParentItem.RegisterNotification(ItemNotification); + FNotifyItemList.Add(AParentItem); + NewNode := TreeView.Items.AddChild(ATreeNode, GetItemTreeCaption(AParentItem)); + NewNode.Data := AParentItem; + if AParentItem = FSelParentItem then + FoundSelParentItem := NewNode; + for I := 0 to AParentItem.Count-1 do begin + ChildItem := AParentItem[I]; + if IsSubmenuItem(ChildItem) then + Recurse(ChildItem, NewNode, FoundSelParentItem); + end; + end; + +var + FoundSelParentItem: TTreeNode; +begin + Inc(FRebuildingTree); + try + TreeView.Items.BeginUpdate; + try + TreeView.Items.Clear; + UnregisterAllNotifications; + FoundSelParentItem := nil; + Recurse(FRootItem, nil, FoundSelParentItem); + if FoundSelParentItem = nil then + SetSelParentItem(FRootItem) + else + TreeView.Selected := FoundSelParentItem; + TreeView.Items[0].Expand(True); + finally + TreeView.Items.EndUpdate; + end; + finally + Dec(FRebuildingTree); + end; +end; + +function TTBItemEditForm.AddListViewItem(const Index: Integer; + const Item: TTBCustomItem): TListItem; +begin + Result := ListView.Items.Insert(Index); + Result.Data := Item; + if not(Item is TTBControlItem) then begin + Result.Caption := Item.Caption; + Result.Subitems.Add(Item.ClassName); + Result.ImageIndex := GetItemClassImage(TTBCustomItemClass(Item.ClassType)); + end + else begin + Result.Caption := '(Control)'; + Result.Subitems.Add(Item.ClassName); + Result.ImageIndex := -1; + end; +end; + +procedure TTBItemEditForm.RebuildList; +var + ChildItem: TTBCustomItem; + I: Integer; +begin + Inc(FRebuildingList); + try + ListView.Items.BeginUpdate; + try + ListView.Items.Clear; + if Assigned(FSelParentItem) then begin + for I := 0 to FSelParentItem.Count-1 do begin + ChildItem := FSelParentItem[I]; + { Check for csDestroying because deleting an item in the tree view + causes the parent item to be selected, and the parent item won't + get a notification that the item is deleting since notifications + were already sent } + if not(csDestroying in ChildItem.ComponentState) then + AddListViewItem(I, ChildItem); + end; + { Add an empty item to the end } + ListView.Items.Add.ImageIndex := -1; + end; + finally + ListView.Items.EndUpdate; + end; + { Work around a strange TListView bug(?). Without this, the column header + isn't painted properly. } + if HandleAllocated then + SetWindowPos(ListView.Handle, 0, 0, 0, 0, 0, SWP_FRAMECHANGED or + SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER); + finally + Dec(FRebuildingList); + end; +end; + +procedure TTBItemEditForm.SelectInObjectInspector(AList: TList); +var + CompList1, CompList2: TDesignerSelectionList; + I: Integer; + C: TComponent; +begin + { Designer.SetSelections will make components appear selected on the form. + It will also select the component in Object Inspector, but only if the + form has the focus. TDesignWindow.SetSelection will select the component + in Object Inspector regardless of whether the form has the focus. } + CompList1 := CreateSelectionList; + CompList2 := CreateSelectionList; + for I := 0 to AList.Count-1 do begin + C := TComponent(AList[I]); + { Must check for csDestroying. If SetSelection is passed a component that's + destroying, Delphi will crash. } + if not(csDestroying in C.ComponentState) then begin + CompList1.Add(C); + CompList2.Add(C); + end; + end; + if CompList1.Count = 0 then begin + {$IFNDEF JR_D6} + CompList1.Free; + CompList2.Free; + {$ENDIF} + end + else begin + Designer.SetSelections(CompList1); + { Note: Never pass an empty list to SetSelection or Delphi will crash } + { History here: + - 1.34: SetSelection call remarked out because it fixed Delphi 6 issue + with random AV's after the editor was closed. + - 1.38: SetSelection call restored because without it, Ctrl+X/C/V didn't + work. + - 1.40: SetSelection call disabled on Delphi 6 only because AV problem + still seems to exist despite another change which I thought fixed it. + On D6 it isn't necessary to call SetSelection for Ctrl+X/C/V to work. + Note: Using "ComponentDesigner.SetSelection(Designer, nil, CompList2);" + instead seems to fix the AV problem, but for consistency with Delphi's + TMainMenu editor (which only selects items when its parent form is + focused), I decided not to call SetSelection at all on D6. + } + {$IFNDEF JR_D6} + SetSelection(CompList2); + {$ENDIF} + end; +end; + +procedure TTBItemEditForm.GetSelItemList(const AList: TList); +var + ListItem: TListItem; +begin + ListItem := nil; + while True do begin + ListItem := ListView.GetNextItem(ListItem, sdAll, [isSelected]); + if ListItem = nil then + Break; + if Assigned(ListItem.Data) then + AList.Add(ListItem.Data); + end; +end; + +procedure TTBItemEditForm.SetSelParentItem(ASelParentItem: TTBCustomItem); +{ - Rebuilds the list view to match a new selection (ASelParentItem) in the + tree view + - Updates toolbar + - Selects selected item(s) into Object Inspector } +var + I: Integer; + TreeNode: TTreeNode; + ItemIsSelected: Boolean; + List: TList; +begin + if FSettingSel > 0 then + Exit; + List := TList.Create; + Inc(FSettingSel); + try + if FSelParentItem <> ASelParentItem then begin + FSelParentItem := ASelParentItem; + NewSubmenuButton.Enabled := Assigned(ASelParentItem); + NewItemButton.Enabled := Assigned(ASelParentItem); + NewSepButton.Enabled := Assigned(ASelParentItem); + for I := 0 to MoreMenu.Count-1 do + MoreMenu[I].Enabled := Assigned(ASelParentItem); + if not Assigned(TreeView.Selected) or (TreeView.Selected.Data <> FSelParentItem) then begin + if FSelParentItem = nil then + TreeView.Selected := nil + else begin + TreeNode := TreeView.Items.GetFirstNode; + while Assigned(TreeNode) do begin + if TreeNode.Data = FSelParentItem then begin + TreeView.Selected := TreeNode; + Break; + end; + TreeNode := TreeNode.GetNext; + end; + end; + end; + RebuildList; + end; + + ItemIsSelected := (ActiveControl = ListView) and Assigned(ListView.Selected) and + Assigned(ListView.Selected.Data); + if ItemIsSelected then + GetSelItemList(List); + + CutButton.Enabled := ItemIsSelected; + CopyButton.Enabled := ItemIsSelected; + PasteButton.Enabled := (ActiveControl = ListView); + DeleteButton.Enabled := ItemIsSelected or + ((ActiveControl = TreeView) and (FSelParentItem <> FRootItem)); + MoveUpButton.Enabled := ItemIsSelected and + (FSelParentItem.IndexOf(TTBCustomItem(List.First)) > 0); + MoveDownButton.Enabled := ItemIsSelected and + (FSelParentItem.IndexOf(TTBCustomItem(List.Last)) < FSelParentItem.Count-1); + + if ActiveControl = ListView then begin + if List.Count = 0 then + { No item was selected, or the blank item was selected. + Select the root item so it looks like no item was selected in + Object Inspector } + List.Add(FRootItem); + end + else if not Assigned(ASelParentItem) or (ASelParentItem = FRootItem) then + List.Add(FParentComponent) + else + List.Add(ASelParentItem); + SelectInObjectInspector(List); + finally + Dec(FSettingSel); + List.Free; + end; +end; + +procedure TTBItemEditForm.Cut; +begin + Copy; + Delete; +end; + +procedure TTBItemEditForm.Copy; +var + SelList: TList; + CompList: TDesignerSelectionList; + I: Integer; + Item: TTBCustomItem; +begin + if ListView.Selected = nil then Exit; + CompList := nil; + SelList := TList.Create; + try + GetSelItemList(SelList); + CompList := CreateSelectionList; + for I := 0 to SelList.Count-1 do begin + Item := TTBCustomItem(SelList[I]); + if Item is TTBControlItem then + raise EInvalidOperation.Create('Cannot cut or copy TTBControlItems'); + CompList.Add(Item); + end; + CopyComponents(FParentComponent.Owner, CompList); + finally + {$IFNDEF JR_D6} + CompList.Free; + {$ENDIF} + SelList.Free; + end; +end; + +procedure TTBItemEditForm.Paste; +var + CompList: TDesignerSelectionList; +begin + if FSelParentItem = nil then Exit; + CompList := CreateSelectionList; + try + PasteComponents(FParentComponent.Owner, FSelParentItem, CompList); + if CompList.Count <> 0 then + Designer.Modified; + finally + {$IFNDEF JR_D6} + CompList.Free; + {$ENDIF} + end; +end; + +procedure TTBItemEditForm.DeleteItem(const Item: TTBCustomItem); +begin + if csAncestor in Item.ComponentState then + raise EInvalidOperation.Create('Items introduced in an ancestor form cannot be deleted'); + //Designer.ValidateRename(Item, Item.Name, ''); + Item.Free; + Designer.Modified; +end; + +procedure TTBItemEditForm.Delete; +var + List: TList; + Item: TTBCustomItem; + ListItem: TListItem; +begin + List := TList.Create; + try + List.Add(FSelParentItem); + SelectInObjectInspector(List); + finally + List.Free; + end; + FSelParentItem.ViewBeginUpdate; + try + while Assigned(ListView.Selected) do begin + Item := TTBCustomItem(ListView.Selected.Data); + if Item = nil then + Break; + DeleteItem(Item); + end; + finally + FSelParentItem.ViewEndUpdate; + end; + { After deleting the items, select the item with the focus } + ListItem := ListView.GetNextItem(nil, sdAll, [isFocused]); + if Assigned(ListItem) then + ListItem.Selected := True; +end; + +procedure TTBItemEditForm.MoveItem(CurIndex, NewIndex: Integer); +var + WasFocused: Boolean; +begin + WasFocused := ListView.Items[CurIndex].Focused; + + FSelParentItem.Move(CurIndex, NewIndex); + Designer.Modified; + + if WasFocused then + ListView.Items[NewIndex].Focused := True; + ListView.Items[NewIndex].Selected := True; +end; + +procedure TTBItemEditForm.TreeViewChange(Sender: TObject; Node: TTreeNode); +var + NewSelectedParentItem: TTBCustomItem; +begin + if (FRebuildingTree > 0) or (FSettingSel > 0) then Exit; + if Node = nil then + NewSelectedParentItem := nil + else + NewSelectedParentItem := TTBCustomItem(Node.Data); + SetSelParentItem(NewSelectedParentItem); +end; + +procedure TTBItemEditForm.TreeViewEnter(Sender: TObject); +{ When the tree view gets the focus, act as if the currently selected item + was clicked. } +begin + ListView.Selected := nil; + SetSelParentItem(FSelParentItem); +end; + +procedure TTBItemEditForm.CMDeferUpdate(var Message: TMessage); +begin + SetSelParentItem(FSelParentItem); +end; + +procedure TTBItemEditForm.ListViewChange(Sender: TObject; Item: TListItem; + Change: TItemChange); +var + Msg: TMsg; +begin + if (FRebuildingList > 0) or (FSettingSel > 0) or (Change <> ctState) or + (csDestroying in ListView.ComponentState) then + Exit; + if not PeekMessage(Msg, Handle, CM_DEFERUPDATE, CM_DEFERUPDATE, + PM_NOREMOVE or PM_NOYIELD) then + PostMessage(Handle, CM_DEFERUPDATE, 0, 0); +end; + +procedure TTBItemEditForm.ListViewEnter(Sender: TObject); +begin + { When list view gets the focus, update the toolbar } + SetSelParentItem(FSelParentItem); +end; + +procedure TTBItemEditForm.ListViewDblClick(Sender: TObject); +var + SelItem: TTBCustomItem; + PropCount, I: Integer; + Props: {$IFNDEF CLR} PPropList {$ELSE} TPropList {$ENDIF}; + PropInfo: {$IFNDEF CLR} PPropInfo {$ELSE} TPropInfo {$ENDIF}; + MethodName: String; + Method: TMethod; +begin + SelItem := nil; + if Assigned(ListView.Selected) then + SelItem := TTBCustomItem(ListView.Selected.Data); + if SelItem = nil then Exit; + if IsSubmenuItem(SelItem) then begin + SetSelParentItem(SelItem); + Exit; + end; + {$IFNDEF CLR} + PropCount := GetPropList(SelItem.ClassInfo, [tkMethod], nil); + GetMem(Props, PropCount * SizeOf(PPropInfo)); + try + GetPropList(SelItem.ClassInfo, [tkMethod], Props); + {$ELSE} + Props := GetPropList(SelItem.ClassInfo, [tkMethod]); + PropCount := Length(Props); + {$ENDIF} + for I := PropCount-1 downto 0 do begin + PropInfo := Props[I]; + {$IFNDEF CLR} + if CompareText(String(PropInfo.Name), 'OnClick') = 0 then begin + {$ELSE} + if SameText(PropInfo.Name, 'OnClick', loInvariantLocale) then begin + {$ENDIF} + Method := GetMethodProp(SelItem, PropInfo); + MethodName := Designer.GetMethodName(Method); + if MethodName = '' then begin + MethodName := SelItem.Name + 'Click'; + Method := Designer.CreateMethod(MethodName, GetTypeData( + {$IFNDEF CLR} PropInfo.PropType^ {$ELSE} PropInfo.TypeInfo {$ENDIF})); + SetMethodProp(SelItem, PropInfo, Method); + Designer.Modified; + end; + if Designer.MethodExists(MethodName) then + Designer.ShowMethod(MethodName); + Break; + end; + end; + {$IFNDEF CLR} + finally + FreeMem(Props); + end; + {$ENDIF} +end; + +procedure TTBItemEditForm.ListViewKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); +begin + case Key of + VK_RETURN: begin + Key := 0; + ActivateInspector(#0); + end; + VK_INSERT: begin + Key := 0; + if ssCtrl in Shift then + NewSubmenuButtonClick(Sender) + else + NewItemButtonClick(Sender); + end; + VK_DELETE: begin + Key := 0; + Delete; + end; + end; +end; + +procedure TTBItemEditForm.TreeViewKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); +begin + case Key of + VK_RETURN: begin + Key := 0; + ActivateInspector(#0); + end; + VK_DELETE: begin + Key := 0; + DeleteButtonClick(Sender); + end; + end; +end; + +procedure TTBItemEditForm.TreeViewKeyPress(Sender: TObject; var Key: Char); +begin + if (Key >= #33) and (Key <= #126) then begin + ActivateInspector(Key); + Key := #0; + end + else if Key = #13 then + Key := #0; { suppress beep } +end; + +procedure TTBItemEditForm.ListViewKeyPress(Sender: TObject; var Key: Char); +begin + if Key = '-' then begin + NewSepButtonClick(Sender); + Key := #0; + end + else if (Key >= #33) and (Key <= #126) then begin + ActivateInspector(Key); + Key := #0; + end; +end; + +procedure TTBItemEditForm.ListViewDragOver(Sender, Source: TObject; X, + Y: Integer; State: TDragState; var Accept: Boolean); +{ List item dragged over the list view } +var + Item: TListItem; +begin + Accept := False; + if (Sender = ListView) and (Source = ListView) and (ListView.SelCount = 1) then begin + Item := ListView.GetItemAt(X, Y); + if Assigned(Item) and (Item <> ListView.Selected) then + Accept := True; + end; +end; + +procedure TTBItemEditForm.ListViewDragDrop(Sender, Source: TObject; X, + Y: Integer); +{ List item dropped onto another list item } +var + ListItem: TListItem; + Item: TTBCustomItem; + NewIndex: Integer; +begin + if (Sender = ListView) and (Source = ListView) and (ListView.SelCount = 1) then begin + ListItem := ListView.GetItemAt(X, Y); + if Assigned(ListItem) and (ListItem <> ListView.Selected) and Assigned(FSelParentItem) then begin + NewIndex := FSelParentItem.IndexOf(TTBCustomItem(ListItem.Data)); + if NewIndex <> -1 then begin + ListView.Items.BeginUpdate; + { For good performance and to prevent Object Inspector flicker, increment + FSettingSel to prevent calls to SetSelParentItem while moving items } + Inc(FSettingSel); + try + Item := TTBCustomItem(ListView.Selected.Data); + MoveItem(FSelParentItem.IndexOf(Item), NewIndex); + finally + Dec(FSettingSel); + ListView.Items.EndUpdate; + end; + { After decrementing FSettingSel, now call SetSelParentItem, to update + the toolbar buttons } + SetSelParentItem(FSelParentItem); + end; + end; + end; +end; + +function TTBItemEditForm.TreeViewDragHandler(Sender, Source: TObject; + X, Y: Integer; Drop: Boolean): Boolean; +var + Node: TTreeNode; + ListItem: TListItem; + Item, NewParentItem: TTBCustomItem; + ItemList: TList; + I: Integer; + NeedRebuildTree: Boolean; +begin + Result := False; + if (Sender = TreeView) and (Source = ListView) then begin + Node := TreeView.GetNodeAt(X, Y); + if Assigned(Node) and (Node <> TreeView.Selected) then begin + NewParentItem := TTBCustomItem(Node.Data); + ItemList := TList.Create; + try + ListItem := nil; + while True do begin + ListItem := ListView.GetNextItem(ListItem, sdAll, [isSelected]); + if ListItem = nil then + Break; + Item := TTBCustomItem(ListItem.Data); + if Assigned(Item) and (Item <> NewParentItem) and + not Item.ContainsItem(NewParentItem) and + not(Item is TTBControlItem) then begin + Result := True; + ItemList.Add(Item); + end; + end; + if Drop then begin + NeedRebuildTree := False; + for I := 0 to ItemList.Count-1 do begin + Item := TTBCustomItem(ItemList[I]); + Item.Parent.Remove(Item); + NewParentItem.Add(Item); + Designer.Modified; + if IsSubmenuItem(Item) then + NeedRebuildTree := True; + end; + if NeedRebuildTree then + RebuildTree; + end; + finally + ItemList.Free; + end; + end; + end; +end; + +procedure TTBItemEditForm.TreeViewDragOver(Sender, Source: TObject; X, + Y: Integer; State: TDragState; var Accept: Boolean); +{ List item dragged over the tree view } +begin + Accept := TreeViewDragHandler(Sender, Source, X, Y, False); +end; + +procedure TTBItemEditForm.TreeViewDragDrop(Sender, Source: TObject; X, + Y: Integer); +{ List item dropped onto the tree view } +begin + TreeViewDragHandler(Sender, Source, X, Y, True); +end; + +procedure TTBItemEditForm.CreateNewItem(const AClass: TTBCustomItemClass); +var + NewIndex: Integer; + NewItem: TTBCustomItem; + ListItem: TListItem; +begin + if FSelParentItem = nil then Exit; + NewIndex := -1; + if (GetKeyState(VK_SHIFT) >= 0) and Assigned(ListView.Selected) then + NewIndex := FSelParentItem.IndexOf(TTBCustomItem(ListView.Selected.Data)); + if NewIndex = -1 then + NewIndex := FSelParentItem.Count; + NewItem := AClass.Create(FParentComponent.Owner{Designer.Form}); + try + NewItem.Name := Designer.UniqueName(NewItem.ClassName); + FSelParentItem.Insert(NewIndex, NewItem); + except + NewItem.Free; + raise; + end; + Designer.Modified; + ListView.Selected := nil; + ListItem := ListView.FindData(0, NewItem, True, False); + if Assigned(ListItem) then begin + ListItem.Selected := True; + ListItem.Focused := True; + ListItem.MakeVisible(False); + ListView.SetFocus; + end; +end; + +procedure TTBItemEditForm.NewSubmenuButtonClick(Sender: TObject); +begin + CreateNewItem(TTBSubmenuItem); +end; + +procedure TTBItemEditForm.NewItemButtonClick(Sender: TObject); +begin + CreateNewItem(TTBItem); +end; + +procedure TTBItemEditForm.NewSepButtonClick(Sender: TObject); +begin + CreateNewItem(TTBSeparatorItem); +end; + +procedure TTBItemEditForm.MoreItemClick(Sender: TObject); +begin + CreateNewItem(TTBCustomItemClass((Sender as TTBItem).Tag)); +end; + +procedure TTBItemEditForm.CutButtonClick(Sender: TObject); +begin + Cut; +end; + +procedure TTBItemEditForm.CopyButtonClick(Sender: TObject); +begin + Copy; +end; + +procedure TTBItemEditForm.PasteButtonClick(Sender: TObject); +begin + Paste; +end; + +procedure TTBItemEditForm.DeleteButtonClick(Sender: TObject); +begin + if ActiveControl = ListView then + Delete + else if (ActiveControl = TreeView) and (FSelParentItem <> FRootItem) then + DeleteItem(FSelParentItem); +end; + +procedure TTBItemEditForm.MoveUpButtonClick(Sender: TObject); +var + SelList: TList; + I, J: Integer; + Item: TTBCustomItem; + ListItem: TListItem; +begin + if FSelParentItem = nil then Exit; + SelList := TList.Create; + try + GetSelItemList(SelList); + if SelList.Count = 0 then Exit; + + ListView.Items.BeginUpdate; + FSelParentItem.ViewBeginUpdate; + { For good performance and to prevent Object Inspector flicker, increment + FSettingSel to prevent calls to SetSelParentItem while moving items } + Inc(FSettingSel); + try + for I := 0 to SelList.Count-1 do begin + Item := TTBCustomItem(SelList[I]); + J := FSelParentItem.IndexOf(Item); + if J <> -1 then + MoveItem(J, J-1); + end; + ListItem := ListView.FindData(0, SelList[0], True, False); + if Assigned(ListItem) then + ListItem.MakeVisible(False); + finally + Dec(FSettingSel); + FSelParentItem.ViewEndUpdate; + ListView.Items.EndUpdate; + end; + { After decrementing FSettingSel, now call SetSelParentItem, to update + the toolbar buttons } + SetSelParentItem(FSelParentItem); + finally + SelList.Free; + end; +end; + +procedure TTBItemEditForm.MoveDownButtonClick(Sender: TObject); +var + SelList: TList; + I, J: Integer; + Item: TTBCustomItem; + ListItem: TListItem; +begin + if FSelParentItem = nil then Exit; + SelList := TList.Create; + try + GetSelItemList(SelList); + if SelList.Count = 0 then Exit; + + ListView.Items.BeginUpdate; + FSelParentItem.ViewBeginUpdate; + { For good performance and to prevent Object Inspector flicker, increment + FSettingSel to prevent calls to SetSelParentItem while moving items } + Inc(FSettingSel); + try + for I := SelList.Count-1 downto 0 do begin + Item := TTBCustomItem(SelList[I]); + J := FSelParentItem.IndexOf(Item); + if J <> -1 then + MoveItem(J, J+1); + end; + ListItem := ListView.FindData(0, SelList[SelList.Count-1], True, False); + if Assigned(ListItem) then + ListItem.MakeVisible(False); + finally + Dec(FSettingSel); + FSelParentItem.ViewEndUpdate; + ListView.Items.EndUpdate; + end; + { After decrementing FSettingSel, now call SetSelParentItem, to update + the toolbar buttons } + SetSelParentItem(FSelParentItem); + finally + SelList.Free; + end; +end; + +procedure TTBItemEditForm.TConvertMenuClick(Sender: TObject); +begin + if FSelParentItem = nil then Exit; + DoConvert(FSelParentItem, FParentComponent.Owner); +end; + + +{ TTBItemsEditor } + +procedure TTBItemsEditor.Edit; +var + Item: TTBCustomItem; +begin + if Assigned(Component) then begin + Item := TBGetItems(Component); + if Assigned(Item) then + ShowEditForm(Component, Item, Designer); + end; +end; + +procedure TTBItemsEditor.ExecuteVerb(Index: Integer); +begin + case Index of + 0: Edit; + 1: ShowVersion; + end; +end; + +function TTBItemsEditor.GetVerbCount: Integer; +begin + Result := 2; +end; + +function TTBItemsEditor.GetVerb(Index: Integer): String; +begin + case Index of + 0: Result := 'Edit...'; + 1: Result := 'Version...'; + else + Result := ''; + end; +end; + + +{ TTBItemsPropertyEditor } + +procedure TTBItemsPropertyEditor.Edit; +var + Editor: {$IFDEF JR_D6} IComponentEditor {$ELSE} TComponentEditor {$ENDIF}; +begin + if PropCount <> 1 then Exit; + Editor := GetComponentEditor(GetComponent(0) as TComponent, Designer); + try + Editor.Edit; + finally + {$IFNDEF JR_D6} + Editor.Free; + {$ENDIF} + end; +end; + +function TTBItemsPropertyEditor.GetAttributes: TPropertyAttributes; +begin + Result := inherited GetAttributes + [paDialog, paReadOnly]; +end; + +function TTBItemsPropertyEditor.GetValue: String; +begin + Result := '(TB2000 Items)'; +end; + +initialization + ItemImageList := TImageList.Create(nil); + {$IFNDEF CLR} + ItemImageList.Handle := ImageList_LoadImage(HInstance, 'TB2_DSGNEDITORIMAGES', + 16, 0, clFuchsia, IMAGE_BITMAP, 0); + {$ELSE} + { Initialize the image list as plain ILC_COLOR (4-bit), because on Windows + 2000, at color depths > 16 (what TImageList's ILC_COLORDDB would give us + when running on a true-color display), selected images are drawn with an + ugly dithering effect } + ItemImageList.Handle := ImageList_Create(16, 16, ILC_COLOR or ILC_MASK, 4, 4); + LoadItemImage(Assembly.GetExecutingAssembly, 'TB2DsgnEditorImages.bmp'); + {$ENDIF} + ItemClasses := TList.Create; + {$IFNDEF CLR} + AddModuleUnloadProc(UnregisterModuleItemClasses); + {$ENDIF} +finalization + {$IFNDEF CLR} + RemoveModuleUnloadProc(UnregisterModuleItemClasses); + {$ENDIF} + FreeItemClasses; + FreeAndNil(ItemImageList); +end. diff --git a/internal/2.2.2/1/Source/TB2DsgnItemEditor.res b/internal/2.2.2/1/Source/TB2DsgnItemEditor.res new file mode 100644 index 0000000000000000000000000000000000000000..938763ea4eb730d48f3bdec584a4c6e0b8f5642e GIT binary patch literal 2520 zcmd5;v2GJV5FIdz3uHN;KuH-Pq)<>8WGf(XIYfvkp>l1>mY}n{xPwojr|~CjaqaXe zU08A&YxCaB?VZn-6$ubzq`ldl-Ff%+?cUfTB2Um_^oDN3t{;iKK_te9@=;#PGx;oi zxsWqCmjQZj5zXZTd?v3D9bhim$#Lq5JVo~h8bc2Rps<-c>o*@WOd>Lyxx*7(w3#dx z3rvtKU37=1^N*tc-1_N_eOek+{;OFvY<9v1W2R+VXjWvZK_rhcuA1vGx|zeS_QGlq z7G|E|WQA(`^fU)9aYQ+}AkGvkL-{jdo*nKB^g1QsD4w&MXG z*a=pY`$_xT!bt$`Yd&#BI@;lTS|cdm9&vm~=RG>SLS0#6A504!?z=t0b!(H4`gte3 znh)n{qdIn8%cTc{3Dg=tmY-weqvebJKHBlD>-@48?EZA2^Ris-IN0s4>LTxD?FV?~ zxQrX9QBFDzwv#@G{iMGTxyB2hqj|k##Y|O_m2!Y8>9$)Nj}d08YGb)>-_1}65k)OD zhbOvL7g-;Ft2WwM;9I%kWuL+`K)<}hr*&l>OVs@PK^3XZ3o^9d5^8gXUyfWZ<-Prm z)ar=b3w>-qbJaEX_pSEacDzyj)A=2xsL#uWJ{k16ly^|)0=K7mgYJn&J9|h&d~HEH zq2s=TK?s5X4V5aO%D6A%Deo>%je0v8@n6U%v~&C)$*s5jrTuT63e;5=)?&S0v)&ie g>2y+$i@uMG$;8$bD_>tOEBc;xV7f;2Y)x;w1>5{Q8vp Value then begin + for I := 0 to FClients.Count - 1 do + if TBasicActionLink(FClients[I]) is TTBEditItemActionLink then + TTBEditItemActionLink(FClients[I]).SetEditCaption(Value); + FEditCaption := Value; + Change; + end; +end; + +procedure TTBEditAction.SetEditOptions(Value: TTBEditItemOptions); +var + I: Integer; +begin + if FEditOptions <> Value then begin + for I := 0 to FClients.Count - 1 do + if TBasicActionLink(FClients[I]) is TTBEditItemActionLink then + TTBEditItemActionLink(FClients[I]).SetEditOptions(Value); + FEditOptions := Value; + Change; + end; +end; + +procedure TTBEditAction.SetEditWidth(Value: Integer); +var + I: Integer; +begin + if FEditWidth <> Value then begin + for I := 0 to FClients.Count - 1 do + if TBasicActionLink(FClients[I]) is TTBEditItemActionLink then + TTBEditItemActionLink(FClients[I]).SetEditWidth(Value); + FEditWidth := Value; + Change; + end; +end; + +procedure TTBEditAction.SetOnAcceptText(Value: TTBAcceptTextEvent); +var + I: Integer; +begin + {$IFNDEF CLR} + if not MethodsEqual(TMethod(FOnAcceptText), TMethod(Value)) then begin + {$ELSE} + if @FOnAcceptText <> @Value then begin + {$ENDIF} + for I := 0 to FClients.Count - 1 do + if TBasicActionLink(FClients[I]) is TTBEditItemActionLink then + TTBEditItemActionLink(FClients[I]).SetOnAcceptText(Value); + FOnAcceptText := Value; + Change; + end; +end; + +procedure TTBEditAction.SetText(Value: String); +var + I: Integer; +begin + if FText <> Value then begin + for I := 0 to FClients.Count - 1 do + if TBasicActionLink(FClients[I]) is TTBEditItemActionLink then + TTBEditItemActionLink(FClients[I]).SetText(Value); + FText := Value; + Change; + end; +end; + + +{ TTBEditItemActionLink } + +procedure TTBEditItemActionLink.AssignClient(AClient: TObject); +begin + FClient := AClient as TTBEditItem; +end; + +function TTBEditItemActionLink.IsEditCaptionLinked: Boolean; +begin + if Action is TTBEditAction then + Result := TTBEditItem(FClient).EditCaption = TTBEditAction(Action).EditCaption + else + Result := False; +end; + +function TTBEditItemActionLink.IsEditOptionsLinked: Boolean; +begin + if Action is TTBEditAction then + Result := TTBEditItem(FClient).EditOptions = TTBEditAction(Action).EditOptions + else + Result := False; +end; + +function TTBEditItemActionLink.IsEditWidthLinked: Boolean; +begin + if Action is TTBEditAction then + Result := TTBEditItem(FClient).EditWidth = TTBEditAction(Action).EditWidth + else + Result := False; +end; + +function TTBEditItemActionLink.IsOnAcceptTextLinked: Boolean; +begin + if Action is TTBEditAction then + {$IFNDEF CLR} + Result := MethodsEqual(TMethod(TTBEditItem(FClient).OnAcceptText), + TMethod(TTBEditAction(Action).OnAcceptText)) + {$ELSE} + Result := @TTBEditItem(FClient).OnAcceptText = @TTBEditAction(Action).OnAcceptText + {$ENDIF} + else + Result := False; +end; + +function TTBEditItemActionLink.IsTextLinked: Boolean; +begin + if Action is TTBEditAction then + Result := TTBEditItem(FClient).Text = TTBEditAction(Action).Text + else + Result := False; +end; + +procedure TTBEditItemActionLink.SetEditCaption(const Value: String); +begin + if IsEditCaptionLinked then TTBEditItem(FClient).EditCaption := Value; +end; + +procedure TTBEditItemActionLink.SetEditOptions(Value: TTBEditItemOptions); +begin + if IsEditOptionsLinked then TTBEditItem(FClient).EditOptions := Value; +end; + +procedure TTBEditItemActionLink.SetEditWidth(const Value: Integer); +begin + if IsEditWidthLinked then TTBEditItem(FClient).EditWidth := Value; +end; + +procedure TTBEditItemActionLink.SetOnAcceptText(Value: TTBAcceptTextEvent); +begin + if IsOnAcceptTextLinked then TTBEditItem(FClient).OnAcceptText := Value; +end; + +procedure TTBEditItemActionLink.SetText(const Value: String); +begin + if IsTextLinked then TTBEditItem(FClient).Text := Value; +end; + + +{ TTBEditItem } + +constructor TTBEditItem.Create(AOwner: TComponent); +begin + inherited; + FEditOptions := EditItemDefaultEditOptions; + FEditWidth := EditItemDefaultEditWidth; +end; + +procedure TTBEditItem.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + inherited; + if Action is TTBEditAction then + with TTBEditAction(Sender) do + begin + if not CheckDefaults or (Self.EditCaption = '') then + Self.EditCaption := EditCaption; + if not CheckDefaults or (Self.EditOptions = []) then + Self.EditOptions := EditOptions; + if not CheckDefaults or (Self.Text = '') then + Self.Text := Text; + if not CheckDefaults or not Assigned(Self.OnAcceptText) then + Self.OnAcceptText := OnAcceptText; + end; +end; + +function TTBEditItem.GetActionLinkClass: TTBCustomItemActionLinkClass; +begin + Result := TTBEditItemActionLink; +end; + +function TTBEditItem.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + if not(tboUseEditWhenVertical in EditOptions) and + (AView.Orientation = tbvoVertical) then + Result := inherited GetItemViewerClass(AView) + else + Result := TTBEditItemViewer; +end; + +function TTBEditItem.NeedToRecreateViewer(AViewer: TTBItemViewer): Boolean; +begin + Result := GetItemViewerClass(AViewer.View) <> AViewer.ClassType; +end; + +procedure TTBEditItem.Clear; +begin + Text := ''; +end; + +procedure TTBEditItem.Click; +begin + inherited; +end; + +procedure TTBEditItem.DoBeginEdit(Viewer: TTBEditItemViewer); +begin + if Assigned(FOnBeginEdit) then + FOnBeginEdit(Self, Viewer, Viewer.EditControl); +end; + +function TTBEditItem.IsEditOptionsStored: Boolean; +begin + Result := (EditOptions <> EditItemDefaultEditOptions) and + ((ActionLink = nil) or not(ActionLink is TTBEditItemActionLink) or + not TTBEditItemActionLink(ActionLink).IsEditOptionsLinked); +end; + +function TTBEditItem.IsEditCaptionStored: Boolean; +begin + Result := (ActionLink = nil) or not(ActionLink is TTBEditItemActionLink) or + not TTBEditItemActionLink(ActionLink).IsEditCaptionLinked; +end; + +function TTBEditItem.IsEditWidthStored: Boolean; +begin + Result := (EditWidth <> EditItemDefaultEditWidth) and + ((ActionLink = nil) or not(ActionLink is TTBEditItemActionLink) or + not TTBEditItemActionLink(ActionLink).IsEditWidthLinked); +end; + +function TTBEditItem.IsTextStored: Boolean; +begin + Result := (ActionLink = nil) or not(ActionLink is TTBEditItemActionLink) or + not TTBEditItemActionLink(ActionLink).IsTextLinked; +end; + +procedure TTBEditItem.SetCharCase(Value: TEditCharCase); +begin + if FCharCase <> Value then begin + FCharCase := Value; + Text := Text; { update case } + end; +end; + +procedure TTBEditItem.SetEditOptions(Value: TTBEditItemOptions); +begin + if FEditOptions <> Value then begin + FEditOptions := Value; + Change(True); + end; +end; + +procedure TTBEditItem.SetEditCaption(Value: String); +begin + if FEditCaption <> Value then begin + FEditCaption := Value; + Change(True); + end; +end; + +procedure TTBEditItem.SetEditWidth(Value: Integer); +begin + if FEditWidth <> Value then begin + FEditWidth := Value; + Change(True); + end; +end; + +procedure TTBEditItem.SetMaxLength(Value: Integer); +begin + if FMaxLength <> Value then begin + FMaxLength := Value; + Change(False); + end; +end; + +procedure TTBEditItem.SetText(Value: String); +begin + case FCharCase of + ecUpperCase: Value := {$IFNDEF CLR} AnsiUpperCase {$ELSE} UpperCase {$ENDIF} (Value); + ecLowerCase: Value := {$IFNDEF CLR} AnsiLowerCase {$ELSE} LowerCase {$ENDIF} (Value); + end; + if FText <> Value then begin + FText := Value; + Change(False); + end; +end; + + +{ TTBEditItemViewer } + +procedure TTBEditItemViewer.EditWndProc(var Message: TMessage); +var + Item: TTBEditItem; + + procedure AcceptText; + var + S: String; + Accept: Boolean; + begin + S := FEditControl.Text; + Accept := True; + if Assigned(Item.FOnAcceptText) then + Item.FOnAcceptText(Self, S, Accept); + if Accept then + Item.Text := S; + end; + +begin + Item := TTBEditItem(Self.Item); + if Message.Msg = WM_CHAR then + case Word(Message.WParam) of + VK_TAB: begin + FEditControlStatus := [ecsAccept]; + AcceptText; + Exit; + end; + VK_RETURN: begin + FEditControlStatus := [ecsAccept, ecsClose]; + AcceptText; + Exit; + end; + VK_ESCAPE: begin + FEditControlStatus := []; + Exit; + end; + end; + TEditAccess(FEditControl).WndProc(Message); + if Message.Msg = WM_KILLFOCUS then begin + { Someone has stolen the focus from us, so 'cancel mode'. (We have to + handle WM_KILLFOCUS in addition to the upstream WM_CANCELMODE handling + since we don't always hold the mouse capture.) } + View.CancelMode; + FEditControlStatus := [ecsClose]; + end; +end; + +procedure TTBEditItemViewer.GetEditRect(var R: TRect); +var + Item: TTBEditItem; + DC: HDC; +begin + Item := TTBEditItem(Self.Item); + DC := GetDC(0); + try + SelectObject(DC, View.GetFont.Handle); + R := BoundsRect; + if not View.IsToolbar and (Item.EditCaption <> '') then begin + Inc(R.Left, GetTextWidth(DC, Item.EditCaption, True) + + EditMenuMidWidth + EditMenuTextMargin * 2); + end; + finally + ReleaseDC(0, DC); + end; +end; + +procedure TTBEditItemViewer.CalcSize(const Canvas: TCanvas; + var AWidth, AHeight: Integer); +var + Item: TTBEditItem; + DC: HDC; +begin + Item := TTBEditItem(Self.Item); + DC := Canvas.Handle; + AWidth := Item.FEditWidth; + AHeight := GetTextHeight(DC) + (EditMenuTextMargin * 2) + 1; + if not IsToolbarStyle and (Item.EditCaption <> '') then begin + Inc(AWidth, GetTextWidth(DC, Item.EditCaption, True) + EditMenuMidWidth + + EditMenuTextMargin * 2); + end; + { Review: Should the height include external leading on fonts that use it, + such as the default menu font on Windows Me Trad. Chinese? Office 2000 + seems to insist on using Tahoma on Chinese Windows, so I'm not sure how it + handles external leading on edit items. } +end; + +function TTBEditItemViewer.CaptionShown: Boolean; +begin + Result := not IsToolbarStyle and inherited CaptionShown; +end; + +function TTBEditItemViewer.GetCaptionText: String; +begin + Result := TTBEditItem(Item).EditCaption; +end; + +procedure TTBEditItemViewer.Paint(const Canvas: TCanvas; + const ClientAreaRect: TRect; IsSelected, IsPushed, UseDisabledShadow: Boolean); +const + FillColors: array[Boolean] of TColor = (clBtnFace, clWindow); + TextColors: array[Boolean] of TColor = (clGrayText, clWindowText); +var + Item: TTBEditItem; + S: String; + R: TRect; + W: Integer; +begin + Item := TTBEditItem(Self.Item); + R := ClientAreaRect; + + { Caption } + if not IsToolbarStyle and (Item.EditCaption <> '') then begin + S := Item.EditCaption; + W := GetTextWidth(Canvas.Handle, S, True) + EditMenuTextMargin * 2; + R.Right := R.Left + W; + if IsSelected then + Canvas.FillRect(R); + Inc(R.Left, EditMenuTextMargin); + DrawItemCaption(Canvas, R, S, UseDisabledShadow, DT_SINGLELINE or + DT_LEFT or DT_VCENTER); + R := ClientAreaRect; + Inc(R.Left, W + EditMenuMidWidth); + end; + + { Border } + if IsSelected and Item.Enabled then + DrawEdge(Canvas.Handle, R, BDR_SUNKENOUTER, BF_RECT); + InflateRect(R, -1, -1); + Canvas.Brush.Color := FillColors[not Item.Enabled]; + Canvas.FrameRect(R); + InflateRect(R, -1, -1); + + { Fill } + Canvas.Brush.Color := FillColors[Item.Enabled]; + Canvas.FillRect(R); + InflateRect(R, -1, -1); + + { Text } + if Item.Text <> '' then begin + S := Item.Text; + Canvas.Brush.Style := bsClear; { speed optimization } + Canvas.Font.Color := TextColors[Item.Enabled]; + DrawTextStr(Canvas.Handle, S, R, DT_SINGLELINE or DT_NOPREFIX); + end; +end; + +procedure TTBEditItemViewer.GetCursor(const Pt: TPoint; var ACursor: HCURSOR); +var + R: TRect; +begin + if not Item.Enabled then + Exit; + GetEditRect(R); + OffsetRect(R, -BoundsRect.Left, -BoundsRect.Top); + InflateRect(R, -2, -2); + if PtInRect(R, Pt) then + ACursor := LoadCursor(0, IDC_IBEAM); +end; + +function TTBEditItemViewer.EditLoop(const CapHandle: HWND): Boolean; + + procedure ControlMessageLoop; + + function PointInWindow(const Wnd: HWND; const P: TPoint): Boolean; + var + W: HWND; + begin + Result := False; + W := WindowFromPoint(P); + if W = 0 then Exit; + if W = Wnd then + Result := True + else + if IsChild(Wnd, W) then + Result := True; + end; + + function ContinueLoop: Boolean; + begin + Result := (ecsContinueLoop in FEditControlStatus) and + not View.IsModalEnding and FEditControl.Focused and Item.Enabled; + { Note: View.IsModalEnding is checked since TTBView.CancelMode doesn't + destroy popup windows; it merely hides them and calls EndModal. So if + IsModalEnding returns True we can infer that CancelMode was likely + called. } + end; + + var + Msg: TMsg; + IsKeypadDigit: Boolean; + ScanCode: Byte; + V: Integer; + begin + try + while ContinueLoop do begin + { Examine the next message before popping it out of the queue } + if not PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE) then begin + WaitMessage; + Continue; + end; + case Msg.message of + WM_SYSKEYDOWN: begin + { Exit immediately if Alt+[key] or F10 are pressed, but not + Alt+Shift, Alt+`, or Alt+[keypad digit] } + if not(Word(Msg.wParam) in [VK_MENU, VK_SHIFT, VK_HANJA]) then begin + IsKeypadDigit := False; + { This detect digits regardless of whether Num Lock is on: } + ScanCode := Byte(Msg.lParam shr 16); + if ScanCode <> 0 then + for V := VK_NUMPAD0 to VK_NUMPAD9 do + if MapVirtualKey(V, 0) = ScanCode then begin + IsKeypadDigit := True; + Break; + end; + if not IsKeypadDigit then begin + FEditControlStatus := [ecsClose]; + Exit; + end; + end; + end; + WM_SYSKEYUP: begin + { Exit when Alt is released by itself } + if Word(Msg.wParam) = VK_MENU then begin + FEditControlStatus := [ecsClose]; + Exit; + end; + end; + WM_LBUTTONDOWN, WM_LBUTTONDBLCLK, + WM_RBUTTONDOWN, WM_RBUTTONDBLCLK, + WM_MBUTTONDOWN, WM_MBUTTONDBLCLK, + WM_NCLBUTTONDOWN, WM_NCLBUTTONDBLCLK, + WM_NCRBUTTONDOWN, WM_NCRBUTTONDBLCLK, + WM_NCMBUTTONDOWN, WM_NCMBUTTONDBLCLK: begin + { If a mouse click outside the edit control is in the queue, + exit and let the upstream message loop deal with it } + if Msg.hwnd <> FEditControl.Handle then + Exit; + end; + WM_MOUSEMOVE, WM_NCMOUSEMOVE: begin + if GetCapture = CapHandle then begin + if PointInWindow(FEditControl.Handle, Msg.pt) then + ReleaseCapture; + end + else if GetCapture = 0 then begin + if not PointInWindow(FEditControl.Handle, Msg.pt) then + SetCapture(CapHandle); + end; + if GetCapture = CapHandle then + SetCursor(LoadCursor(0, IDC_ARROW)); + end; + end; + { Now pop the message out of the queue } + if not PeekMessage(Msg, 0, Msg.message, Msg.message, PM_REMOVE or PM_NOYIELD) then + Continue; + if ((Msg.message >= WM_MOUSEFIRST) and (Msg.message <= WM_MOUSELAST)) and + (Msg.hwnd = CapHandle) then + { discard, so that the selection doesn't get changed } + else begin + TranslateMessage(Msg); + DispatchMessage(Msg); + end; + end; + finally + { Make sure there are no outstanding WM_*CHAR messages } + RemoveMessages(WM_CHAR, WM_DEADCHAR); + RemoveMessages(WM_SYSCHAR, WM_SYSDEADCHAR); + end; + end; + + procedure RestoreEditControlWndProc; + {$IFNDEF CLR} + var + OrigWndProc: TWndMethod; + begin + { NOTE: We can't assign WndProc to WindowProc directly because on Delphi 4 + and 5, the compiler generates incorrect code, causing an AV at run-time } + OrigWndProc := TEditAccess(FEditControl).WndProc; + FEditControl.WindowProc := OrigWndProc; + end; + {$ELSE} + begin + IControl(FEditControl).RestoreWndProc; + end; + {$ENDIF} + +var + Item: TTBEditItem; + R: TRect; + ActiveWnd, FocusWnd: HWND; +begin + Item := TTBEditItem(Self.Item); + GetEditRect(R); + if IsRectEmpty(R) then begin + Result := False; + Exit; + end; + + ActiveWnd := GetActiveWindow; + FocusWnd := GetFocus; + + { Create the edit control } + InflateRect(R, -3, -3); + //View.FreeNotification(Self); + FEditControl := TEdit.Create(nil); + try + FEditControl.Visible := False; + FEditControl.BorderStyle := bsNone; + FEditControl.AutoSize := False; + FEditControl.Font.Assign(View.GetFont); + FEditControl.Text := Item.Text; + FEditControl.CharCase := Item.FCharCase; + FEditControl.MaxLength := Item.FMaxLength; + FEditControl.BoundsRect := R; + FEditControl.WindowProc := EditWndProc; + FEditControl.ParentWindow := View.Window.Handle; + FEditControl.SelectAll; + Item.DoBeginEdit(Self); + FEditControl.Visible := True; + FEditControl.SetFocus; + if GetActiveWindow <> ActiveWnd then + { don't gray out title bar of old active window } + SendMessage(ActiveWnd, WM_NCACTIVATE, 1, 0) + else + ActiveWnd := 0; + + FEditControlStatus := [ecsContinueLoop]; + ControlMessageLoop; + finally + { Restore the original window procedure before destroying the control so + it doesn't see a WM_KILLFOCUS message } + RestoreEditControlWndProc; + FreeAndNil(FEditControl); + end; + + { ensure the area underneath the edit control is repainted immediately } + View.Window.Update; + { If app is still active, set focus to previous control and restore capture + to CapHandle if another control hasn't taken it } + if GetActiveWindow <> 0 then begin + SetFocus(FocusWnd); + if GetCapture = 0 then + SetCapture(CapHandle); + end; + if ActiveWnd <> 0 then + SendMessage(ActiveWnd, WM_NCACTIVATE, Ord(GetActiveWindow = ActiveWnd), 0); + { The SetFocus call above can change the Z order of windows. If the parent + window is a popup window, reassert its topmostness. } + if View.Window is TTBPopupWindow then + SetWindowPos(View.Window.Handle, HWND_TOPMOST, 0, 0, 0, 0, + SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE); + { Send an MSAA "focus" event now that we're returning to the regular modal loop } + View.NotifyFocusEvent; + + Result := ecsClose in FEditControlStatus; + if not Result and (GetCapture = CapHandle) then begin + if ecsAccept in FEditControlStatus then + { if we are accepting but not closing, Tab must have been pressed } + View.Selected := View.NextSelectable(View.Selected, + GetKeyState(VK_SHIFT) >= 0); + end; +end; + +function TTBEditItemViewer.DoExecute: Boolean; +begin + { Close any delay-close popup menus before entering the edit loop } + View.CancelChildPopups; + Result := False; + if EditLoop(View.GetCaptureWnd) then begin + View.EndModal; + if ecsAccept in FEditControlStatus then + Result := True; + end; +end; + +procedure TTBEditItemViewer.MouseBeginEdit; +begin + if Item.Enabled then + Execute(True) + else begin + if (View.ParentView = nil) and not View.IsPopup then + View.EndModal; + end; +end; + +procedure TTBEditItemViewer.MouseDown(Shift: TShiftState; X, Y: Integer; + var MouseDownOnMenu: Boolean); +begin + if IsPtInButtonPart(X, Y) then { for TBX... } + MouseBeginEdit + else + inherited; +end; + +procedure TTBEditItemViewer.MouseUp(X, Y: Integer; MouseWasDownOnMenu: Boolean); +begin + if IsPtInButtonPart(X, Y) then { for TBX... } + MouseBeginEdit + else + inherited; +end; + +function TTBEditItemViewer.UsesSameWidth: Boolean; +begin + Result := False; +end; + +function TTBEditItemViewer.GetAccRole: Integer; +const + ROLE_SYSTEM_TEXT = $2a; { from OleAcc.h } +begin + Result := ROLE_SYSTEM_TEXT; +end; + +function TTBEditItemViewer.GetAccValue(var Value: WideString): Boolean; +begin + Value := TTBEditItem(Item).Text; + Result := True; +end; + + +{ TTBToolbarVisibilityItem } + +procedure TTBVisibilityToggleItem.Click; +begin + if Assigned(FControl) then + FControl.Visible := not FControl.Visible; + inherited; +end; + +procedure TTBVisibilityToggleItem.InitiateAction; +begin + UpdateProps; +end; + +procedure TTBVisibilityToggleItem.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if (Operation = opRemove) and (AComponent = FControl) then + Control := nil; +end; + +procedure TTBVisibilityToggleItem.SetControl(Value: TControl); +begin + if FControl <> Value then begin + FControl := Value; + if Assigned(Value) then begin + Value.FreeNotification(Self); + if (Caption = '') and not(csLoading in ComponentState) then + {$IFNDEF CLR} + Caption := TControlAccess(Value).Caption; + {$ELSE} + Caption := Value.GetText; + {$ENDIF} + end; + UpdateProps; + end; +end; + +procedure TTBVisibilityToggleItem.UpdateProps; +begin + if (ComponentState * [csDesigning, csLoading, csDestroying] = []) then + Checked := Assigned(FControl) and FControl.Visible; +end; + +end. diff --git a/internal/2.2.2/1/Source/TB2Hook.pas b/internal/2.2.2/1/Source/TB2Hook.pas new file mode 100644 index 0000000..fbc6f62 --- /dev/null +++ b/internal/2.2.2/1/Source/TB2Hook.pas @@ -0,0 +1,344 @@ +unit TB2Hook; + +{ + Toolbar2000 + Copyright (C) 1998-2006 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2Hook.pas,v 1.17 2006/03/12 23:11:59 jr Exp $ +} + +interface + +uses + Windows; + +type + THookProcCode = (hpSendActivate, hpSendActivateApp, hpSendWindowPosChanged, + hpPreDestroy, hpGetMessage); + THookProcCodes = set of THookProcCode; + + THookProc = procedure(Code: THookProcCode; Wnd: HWND; WParam: WPARAM; LParam: LPARAM); + +procedure InstallHookProc(AUser: TObject; AProc: THookProc; ACodes: THookProcCodes); +procedure UninstallHookProc(AUser: TObject; AProc: THookProc); + +implementation + +uses + {$IFDEF CLR} System.Runtime.InteropServices, {$ENDIF} + SysUtils, Classes, Messages, TB2Common; + +type + THookType = (htCallWndProc, htCBT, htGetMessage); + THookTypes = set of THookType; + + THookUserData = class + Prev: THookUserData; + User: TObject; + InstalledHookTypes: THookTypes; + end; + + THookProcData = class + Proc: THookProc; + Codes: THookProcCodes; + LastUserData: THookUserData; + end; + + THookInfo = class + Handles: array[THookType] of HHOOK; + Counts: array[THookType] of Longint; + end; + +threadvar + HookInfo: THookInfo; + HookProcList: TList; + + +function CallWndProcHook(Code: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; +{$IFNDEF CLR} stdcall; {$ENDIF} +type + THookProcCodeMsgs = hpSendActivate..hpSendWindowPosChanged; +const + MsgMap: array[THookProcCodeMsgs] of UINT = + (WM_ACTIVATE, WM_ACTIVATEAPP, WM_WINDOWPOSCHANGED); +var + J: THookProcCodeMsgs; + I: Integer; + CWPStruct: {$IFNDEF CLR} PCWPStruct {$ELSE} TCWPStruct {$ENDIF}; +begin + if Assigned(HookProcList) and (Code = HC_ACTION) then begin + {$IFNDEF CLR} + CWPStruct := PCWPStruct(LParam); + {$ELSE} + CWPStruct := TCWPStruct(Marshal.PtrToStructure(IntPtr(LParam), TypeOf(TCWPStruct))); + {$ENDIF} + for J := Low(J) to High(J) do + if CWPStruct.Message = MsgMap[J] then begin + for I := 0 to HookProcList.Count-1 do + try + with THookProcData(HookProcList.List[I]) do + if J in Codes then + Proc(J, CWPStruct.hwnd, CWPStruct.WParam, CWPStruct.LParam); + except + end; + Break; + end; + end; + Result := CallNextHookEx(HookInfo.Handles[htCallWndProc], Code, WParam, LParam); +end; + +function CBTHook(Code: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; +{$IFNDEF CLR} stdcall; {$ENDIF} +var + I: Integer; +begin + if Assigned(HookProcList) and (Code = HCBT_DESTROYWND) then + for I := 0 to HookProcList.Count-1 do + try + with THookProcData(HookProcList.List[I]) do + if hpPreDestroy in Codes then + Proc(hpPreDestroy, HWND(WParam), 0, 0); + except + end; + Result := CallNextHookEx(HookInfo.Handles[htCBT], Code, WParam, LParam); +end; + +function GetMessageHook(Code: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; +{$IFNDEF CLR} stdcall; {$ENDIF} +var + I: Integer; +begin + if Assigned(HookProcList) and (Code = HC_ACTION) then + for I := 0 to HookProcList.Count-1 do + try + with THookProcData(HookProcList.List[I]) do + if hpGetMessage in Codes then + Proc(hpGetMessage, 0, WParam, LParam); + except + end; + Result := CallNextHookEx(HookInfo.Handles[htGetMessage], Code, WParam, LParam); +end; + +function HookCodesToTypes(Codes: THookProcCodes): THookTypes; +const + HookCodeToType: array[THookProcCode] of THookType = + (htCallWndProc, htCallWndProc, htCallWndProc, htCBT, htGetMessage); +var + J: THookProcCode; +begin + Result := []; + for J := Low(J) to High(J) do + if J in Codes then + Include(Result, HookCodeToType[J]); +end; + +var + HookProcs: array[THookType] of TFNHookProc; +const + HookIDs: array[THookType] of Integer = + (WH_CALLWNDPROC, WH_CBT, WH_GETMESSAGE); + +procedure InstallHooks(ATypes: THookTypes; var InstalledTypes: THookTypes); +var + T: THookType; +begin + if HookInfo = nil then + HookInfo := THookInfo.Create; + + { Don't increment reference counts for hook types that were already + installed previously } + ATypes := ATypes - InstalledTypes; + + { Increment reference counts first. This should never raise an exception. } + for T := Low(T) to High(T) do + if T in ATypes then begin + Inc(HookInfo.Counts[T]); + Include(InstalledTypes, T); + end; + + { Then install the hooks } + for T := Low(T) to High(T) do + if T in InstalledTypes then begin + if HookInfo.Handles[T] = 0 then begin + { On Windows NT platforms, SetWindowsHookExW is used to work around an + apparent bug in Windows NT/2000/XP: if an 'ANSI' WH_GETMESSAGE hook + is called *before* a 'wide' WH_GETMESSAGE hook, then WM_*CHAR + messages passed to the 'wide' hook use ANSI character codes. + This is needed for compatibility with the combination of Tnt Unicode + Controls and Keyman. See "Widechar's and tb2k" thread on the + newsgroup from 2003-09-23 for more information. } + if Win32Platform = VER_PLATFORM_WIN32_NT then + HookInfo.Handles[T] := SetWindowsHookExW(HookIDs[T], HookProcs[T], + 0, GetCurrentThreadId) + else + HookInfo.Handles[T] := SetWindowsHookEx(HookIDs[T], HookProcs[T], + 0, GetCurrentThreadId); + { .NET note: A reference to the delegate passed to SetWindowsHookEx + must exist for as long as the hook is installed, otherwise the GC + will collect it and the app will crash. Hence we always pass a + global variable (HookProcs[]) to SetWindowsHookEx. } + end; + end; +end; + +procedure UninstallHooks(const ATypes: THookTypes; const Force: Boolean); +var + T: THookType; +begin + { HookInfo can be nil if InstallHooks was never called previously (e.g. when + we're being called with Force=True), or if it was called but failed with + an exception } + if HookInfo = nil then + Exit; + + { Decrement reference counts first. This should never raise an exception. } + if not Force then + for T := Low(T) to High(T) do + if T in ATypes then + Dec(HookInfo.Counts[T]); + + { Then uninstall the hooks } + for T := Low(T) to High(T) do + if T in ATypes then begin + if (Force or (HookInfo.Counts[T] = 0)) and (HookInfo.Handles[T] <> 0) then begin + UnhookWindowsHookEx(HookInfo.Handles[T]); + HookInfo.Handles[T] := 0; + end; + end; + + { If all hooks are uninstalled, free HookInfo } + for T := Low(T) to High(T) do + if (HookInfo.Counts[T] <> 0) or (HookInfo.Handles[T] <> 0) then + Exit; + FreeAndNil(HookInfo); +end; + +procedure InstallHookProc(AUser: TObject; AProc: THookProc; ACodes: THookProcCodes); +var + Found: Boolean; + I: Integer; + UserData: THookUserData; + ProcData: THookProcData; +label 1; +begin + if HookProcList = nil then + HookProcList := TList.Create; + Found := False; + UserData := nil; { avoid warning } + for I := 0 to HookProcList.Count-1 do begin + ProcData := THookProcData(HookProcList[I]); + if @ProcData.Proc = @AProc then begin + UserData := ProcData.LastUserData; + while Assigned(UserData) do begin + if UserData.User = AUser then begin + { InstallHookProc was already called for AUser/AProc. Go ahead and + call InstallHooks again just in case the hooks weren't successfully + installed last time. } + goto 1; + end; + UserData := UserData.Prev; + end; + UserData := THookUserData.Create; + UserData.Prev := ProcData.LastUserData; + UserData.User := AUser; + UserData.InstalledHookTypes := []; + ProcData.LastUserData := UserData; + Found := True; + Break; + end; + end; + if not Found then begin + UserData := THookUserData.Create; + try + UserData.Prev := nil; + UserData.User := AUser; + UserData.InstalledHookTypes := []; + HookProcList.Expand; + ProcData := THookProcData.Create; + except + UserData.Free; + raise; + end; + ProcData.Proc := AProc; + ProcData.Codes := ACodes; + ProcData.LastUserData := UserData; + HookProcList.Add(ProcData); + end; +1:InstallHooks(HookCodesToTypes(ACodes), UserData.InstalledHookTypes); +end; + +procedure UninstallHookProc(AUser: TObject; AProc: THookProc); +var + I: Integer; + ProcData: THookProcData; + NextUserData, UserData: THookUserData; + T: THookTypes; +begin + if HookProcList = nil then Exit; + for I := 0 to HookProcList.Count-1 do begin + ProcData := THookProcData(HookProcList[I]); + if @ProcData.Proc = @AProc then begin + { Locate the UserData record } + NextUserData := nil; + UserData := ProcData.LastUserData; + while Assigned(UserData) and (UserData.User <> AUser) do begin + NextUserData := UserData; + UserData := UserData.Prev; + end; + if UserData = nil then + Exit; + + { Remove record from linked list } + if NextUserData = nil then begin + { It's the last item in the list } + if UserData.Prev = nil then begin + { It's the only item in the list, so destroy the ProcData record } + HookProcList.Delete(I); + ProcData.Free; + end + else + ProcData.LastUserData := UserData.Prev; + end + else + NextUserData.Prev := UserData.Prev; + + T := UserData.InstalledHookTypes; + UserData.Free; + UninstallHooks(T, False); + Break; + end; + end; + if HookProcList.Count = 0 then + FreeAndNil(HookProcList); +end; + + +initialization + { Work around Delphi.NET 2005 bug: declaring a constant array of procedural + types crashes the compiler (see QC #10381; 2006 fixes it). So we instead + declare HookProcs as a variable, and initialize the elements here. } + HookProcs[htCallWndProc] := CallWndProcHook; + HookProcs[htCBT] := CBTHook; + HookProcs[htGetMessage] := GetMessageHook; +finalization + UninstallHooks([Low(THookType)..High(THookType)], True); +end. diff --git a/internal/2.2.2/1/Source/TB2Item.pas b/internal/2.2.2/1/Source/TB2Item.pas new file mode 100644 index 0000000..6891cdd --- /dev/null +++ b/internal/2.2.2/1/Source/TB2Item.pas @@ -0,0 +1,6982 @@ +unit TB2Item; + +{ + Toolbar2000 + Copyright (C) 1998-2008 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2Item.pas,v 1.313 2008/09/19 16:35:48 jr Exp $ +} + +interface + +{$I TB2Ver.inc} +{x$DEFINE TB2K_NO_ANIMATION} + { Enabling the above define disables all menu animation. For debugging + purpose only. } +{x$DEFINE TB2K_USE_STRICT_O2K_MENU_STYLE} + { Enabling the above define forces it to use clBtnFace for the menu color + instead of clMenu, and disables the use of flat menu borders on Windows + XP with themes enabled. } + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + {$IFDEF CLR} TB2OleMarshal, {$ENDIF} + StdCtrls, CommCtrl, Menus, ActnList, ImgList, TB2Anim; + +type + TTBCustomItem = class; + TTBCustomItemClass = class of TTBCustomItem; + TTBCustomItemActionLink = class; + TTBCustomItemActionLinkClass = class of TTBCustomItemActionLink; + TTBItemViewer = class; + TTBItemViewerClass = class of TTBItemViewer; + TTBPopupWindow = class; + TTBPopupWindowClass = class of TTBPopupWindow; + TTBView = class; + + TTBDoneAction = (tbdaNone, tbdaCancel, tbdaClickItem, tbdaOpenSystemMenu, + tbdaHelpContext); + TTBDoneActionData = record + DoneAction: TTBDoneAction; + { tbdaClickItem-specific fields: } + ClickItem: TTBCustomItem; + Sound: Boolean; + { tbdaOpenSystemMenu-specific fields: } + Wnd: HWND; + Key: Word; + { tbdaHelpContext-specific fields: } + ContextID: Integer; + end; + TTBInsertItemProc = procedure(AParent: TComponent; AItem: TTBCustomItem) of object; + TTBItemChangedAction = (tbicInserted, tbicDeleting, tbicSubitemsChanged, + tbicSubitemsBeginUpdate, tbicSubitemsEndUpdate, tbicInvalidate, + tbicInvalidateAndResize, tbicRecreateItemViewers, tbicNameChanged, + tbicSubMenuImagesChanged); + TTBItemChangedProc = procedure(Sender: TTBCustomItem; Relayed: Boolean; + Action: TTBItemChangedAction; Index: Integer; Item: TTBCustomItem) of object; + TTBItemDisplayMode = (nbdmDefault, nbdmTextOnly, nbdmTextOnlyInMenus, nbdmImageAndText); + TTBItemOption = (tboDefault, tboDropdownArrow, tboImageAboveCaption, + tboLongHintInMenuOnly, tboNoAutoHint, tboNoRotation, tboSameWidth, + tboShowHint, tboToolbarStyle, tboToolbarSize); + TTBItemOptions = set of TTBItemOption; + TTBItemStyle = set of (tbisSubmenu, tbisSelectable, tbisSeparator, + tbisEmbeddedGroup, tbisClicksTransparent, tbisCombo, tbisNoAutoOpen, + tbisSubitemsEditable, tbisNoLineBreak, tbisRightAlign, tbisDontSelectFirst, + tbisRedrawOnSelChange, tbisRedrawOnMouseOverChange); + TTBPopupAlignment = (tbpaLeft, tbpaRight, tbpaCenter); + TTBPopupEvent = procedure(Sender: TTBCustomItem; FromLink: Boolean) of object; + TTBSelectEvent = procedure(Sender: TTBCustomItem; Viewer: TTBItemViewer; + Selecting: Boolean) of object; + + ETBItemError = class(Exception); + + TTBImageChangeLink = class(TChangeLink) + private + FLastWidth, FLastHeight: Integer; + end; + {$IFNDEF JR_D5} + TImageIndex = type Integer; + {$ENDIF} + + TTBCustomItem = class(TComponent) + private + FActionLink: TTBCustomItemActionLink; + FAutoCheck: Boolean; + FCaption: String; + FChecked: Boolean; + FDisplayMode: TTBItemDisplayMode; + FEnabled: Boolean; + FEffectiveOptions: TTBItemOptions; + FGroupIndex: Integer; + FHelpContext: THelpContext; + FHint: String; + FImageIndex: TImageIndex; + FImages: TCustomImageList; + FImagesChangeLink: TTBImageChangeLink; + FItems: TList; + FItemStyle: TTBItemStyle; + FLinkParents: TList; + FMaskOptions: TTBItemOptions; + FOptions: TTBItemOptions; + FInheritOptions: Boolean; + FNotifyList: TList; + FOnClick: TNotifyEvent; + FOnPopup: TTBPopupEvent; + FOnSelect: TTBSelectEvent; + FParent: TTBCustomItem; + FParentComponent: TComponent; + FRadioItem: Boolean; + FShortCut: TShortCut; + FSubMenuImages: TCustomImageList; + FSubMenuImagesChangeLink: TTBImageChangeLink; + FLinkSubitems: TTBCustomItem; + FVisible: Boolean; + + procedure DoActionChange(Sender: TObject); + function ChangeImages(var AImages: TCustomImageList; + const Value: TCustomImageList; var AChangeLink: TTBImageChangeLink): Boolean; + class procedure ClickWndProc(var Message: TMessage); {$IFDEF CLR} static; {$ENDIF} + function FindItemWithShortCut(AShortCut: TShortCut; + var ATopmostParent: TTBCustomItem): TTBCustomItem; + function FixOptions(const AOptions: TTBItemOptions): TTBItemOptions; + function GetAction: TBasicAction; + function GetCount: Integer; + function GetItem(Index: Integer): TTBCustomItem; + procedure ImageListChangeHandler(Sender: TObject); + procedure InternalNotify(Ancestor: TTBCustomItem; NestingLevel: Integer; + Action: TTBItemChangedAction; Index: Integer; Item: TTBCustomItem); + {$IFDEF JR_D6} + function IsAutoCheckStored: Boolean; + {$ENDIF} + function IsCaptionStored: Boolean; + function IsCheckedStored: Boolean; + function IsEnabledStored: Boolean; + function IsHelpContextStored: Boolean; + function IsHintStored: Boolean; + function IsImageIndexStored: Boolean; + function IsOnClickStored: Boolean; + function IsShortCutStored: Boolean; + function IsVisibleStored: Boolean; + procedure Notify(Action: TTBItemChangedAction; Index: Integer; Item: TTBCustomItem); + procedure RefreshOptions; + procedure SetAction(Value: TBasicAction); + procedure SetCaption(Value: String); + procedure SetChecked(Value: Boolean); + procedure SetDisplayMode(Value: TTBItemDisplayMode); + procedure SetEnabled(Value: Boolean); + procedure SetGroupIndex(Value: Integer); + procedure SetImageIndex(Value: TImageIndex); + procedure SetImages(Value: TCustomImageList); + procedure SetInheritOptions(Value: Boolean); + procedure SetLinkSubitems(Value: TTBCustomItem); + procedure SetMaskOptions(Value: TTBItemOptions); + procedure SetOptions(Value: TTBItemOptions); + procedure SetRadioItem(Value: Boolean); + procedure SetSubMenuImages(Value: TCustomImageList); + procedure SetVisible(Value: Boolean); + procedure SubMenuImagesChanged; + procedure TurnSiblingsOff; + protected + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); dynamic; + procedure Change(NeedResize: Boolean); virtual; + function CreatePopup(const ParentView: TTBView; const ParentViewer: TTBItemViewer; + const PositionAsSubmenu, SelectFirstItem, Customizing: Boolean; + const APopupPoint: TPoint; const Alignment: TTBPopupAlignment): TTBPopupWindow; virtual; + procedure DoPopup(Sender: TTBCustomItem; FromLink: Boolean); virtual; + procedure EnabledChanged; virtual; + function GetActionLinkClass: TTBCustomItemActionLinkClass; dynamic; + function GetChevronParentView: TTBView; virtual; + procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override; + function GetItemViewerClass(AView: TTBView): TTBItemViewerClass; virtual; + function GetPopupWindowClass: TTBPopupWindowClass; virtual; + class procedure IndexError; + procedure Loaded; override; + function NeedToRecreateViewer(AViewer: TTBItemViewer): Boolean; virtual; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + function OpenPopup(const SelectFirstItem, TrackRightButton: Boolean; + const PopupPoint: TPoint; const Alignment: TTBPopupAlignment; + const ReturnClickedItemOnly: Boolean): TTBCustomItem; + procedure RecreateItemViewers; + procedure SetChildOrder(Child: TComponent; Order: Integer); override; + procedure SetName(const NewName: TComponentName); override; + {$IFNDEF CLR} + procedure SetParentComponent(Value: TComponent); override; + {$ENDIF} + + property ActionLink: TTBCustomItemActionLink read FActionLink write FActionLink; + property ItemStyle: TTBItemStyle read FItemStyle write FItemStyle; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + function HasParent: Boolean; override; + function GetParentComponent: TComponent; override; + + procedure Add(AItem: TTBCustomItem); + procedure Clear; + procedure Click; virtual; + function ContainsItem(AItem: TTBCustomItem): Boolean; + procedure Delete(Index: Integer); + function GetItemStyle: TTBItemStyle; + function GetShortCutText: String; + function IndexOf(AItem: TTBCustomItem): Integer; + procedure InitiateAction; virtual; + procedure Insert(NewIndex: Integer; AItem: TTBCustomItem); + function IsShortCut(var Message: TWMKey): Boolean; + procedure Move(CurIndex, NewIndex: Integer); + function Popup(X, Y: Integer; TrackRightButton: Boolean; + Alignment: TTBPopupAlignment = tbpaLeft; + ReturnClickedItemOnly: Boolean = False): TTBCustomItem; + procedure PostClick; + procedure RegisterNotification(ANotify: TTBItemChangedProc); + procedure Remove(Item: TTBCustomItem); + {$IFDEF CLR} + procedure SetParentComponent(Value: TComponent); override; + {$ENDIF} + procedure UnregisterNotification(ANotify: TTBItemChangedProc); + procedure ViewBeginUpdate; + procedure ViewEndUpdate; + + property Action: TBasicAction read GetAction write SetAction; + property AutoCheck: Boolean read FAutoCheck write FAutoCheck {$IFDEF JR_D6} stored IsAutoCheckStored {$ENDIF} default False; + property Caption: String read FCaption write SetCaption stored IsCaptionStored; + property Count: Integer read GetCount; + property Checked: Boolean read FChecked write SetChecked stored IsCheckedStored default False; + property DisplayMode: TTBItemDisplayMode read FDisplayMode write SetDisplayMode default nbdmDefault; + property EffectiveOptions: TTBItemOptions read FEffectiveOptions; + property Enabled: Boolean read FEnabled write SetEnabled stored IsEnabledStored default True; + property GroupIndex: Integer read FGroupIndex write SetGroupIndex default 0; + property HelpContext: THelpContext read FHelpContext write FHelpContext stored IsHelpContextStored default 0; + property Hint: String read FHint write FHint stored IsHintStored; + property ImageIndex: TImageIndex read FImageIndex write SetImageIndex stored IsImageIndexStored default -1; + property Images: TCustomImageList read FImages write SetImages; + property InheritOptions: Boolean read FInheritOptions write SetInheritOptions default True; + property Items[Index: Integer]: TTBCustomItem read GetItem; default; + property LinkSubitems: TTBCustomItem read FLinkSubitems write SetLinkSubitems; + property MaskOptions: TTBItemOptions read FMaskOptions write SetMaskOptions default []; + property Options: TTBItemOptions read FOptions write SetOptions default []; + property Parent: TTBCustomItem read FParent; + property ParentComponent: TComponent read FParentComponent write FParentComponent; + property RadioItem: Boolean read FRadioItem write SetRadioItem default False; + property ShortCut: TShortCut read FShortCut write FShortCut stored IsShortCutStored default 0; + property SubMenuImages: TCustomImageList read FSubMenuImages write SetSubMenuImages; + property Visible: Boolean read FVisible write SetVisible stored IsVisibleStored default True; + property OnClick: TNotifyEvent read FOnClick write FOnClick stored IsOnClickStored; + property OnPopup: TTBPopupEvent read FOnPopup write FOnPopup; + property OnSelect: TTBSelectEvent read FOnSelect write FOnSelect; + end; + + TTBCustomItemActionLink = class(TActionLink) + protected + FClient: TTBCustomItem; + procedure AssignClient(AClient: TObject); override; + {$IFDEF JR_D6} + function IsAutoCheckLinked: Boolean; virtual; + {$ENDIF} + function IsCaptionLinked: Boolean; override; + function IsCheckedLinked: Boolean; override; + function IsEnabledLinked: Boolean; override; + function IsHelpContextLinked: Boolean; override; + function IsHintLinked: Boolean; override; + function IsImageIndexLinked: Boolean; override; + function IsShortCutLinked: Boolean; override; + function IsVisibleLinked: Boolean; override; + function IsOnExecuteLinked: Boolean; override; + {$IFDEF JR_D6} + procedure SetAutoCheck(Value: Boolean); override; + {$ENDIF} + procedure SetCaption(const Value: String); override; + procedure SetChecked(Value: Boolean); override; + procedure SetEnabled(Value: Boolean); override; + procedure SetHelpContext(Value: THelpContext); override; + procedure SetHint(const Value: String); override; + procedure SetImageIndex(Value: Integer); override; + procedure SetShortCut(Value: TShortCut); override; + procedure SetVisible(Value: Boolean); override; + procedure SetOnExecute(Value: TNotifyEvent); override; + end; + + {$IFNDEF CLR} + TTBBaseAccObject = class(TInterfacedObject, IDispatch) + {$ELSE} + TTBBaseAccObject = class(TTBStandardOleMarshalObject) + {$ENDIF} + public + procedure ClientIsDestroying; virtual; abstract; + {$IFNDEF CLR} + { IDispatch } + function GetTypeInfoCount(out Count: Integer): HResult; stdcall; + function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall; + function GetIDsOfNames(const IID: TGUID; Names: Pointer; + NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall; + function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; + Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall; + {$ENDIF} + end; + + TTBItemViewer = class + private + FBoundsRect: TRect; + FClipped: Boolean; + FGroupLevel: Integer; + FItem: TTBCustomItem; + FOffEdge: Boolean; + FShow: Boolean; + FView: TTBView; + procedure AccSelect(const AExecute: Boolean); + function GetIndex: Integer; + protected + FAccObjectInstance: TTBBaseAccObject; + procedure CalcSize(const Canvas: TCanvas; var AWidth, AHeight: Integer); + virtual; + function CaptionShown: Boolean; dynamic; + function DoExecute: Boolean; virtual; + procedure DrawItemCaption(const Canvas: TCanvas; ARect: TRect; + const ACaption: String; ADrawDisabledShadow: Boolean; AFormat: UINT); virtual; + procedure Entering; virtual; + function GetAccRole: Integer; virtual; + function GetAccValue(var Value: WideString): Boolean; virtual; + function GetCaptionText: String; virtual; + procedure GetCursor(const Pt: TPoint; var ACursor: HCURSOR); virtual; + function GetImageList: TCustomImageList; + function ImageShown: Boolean; + function IsRotated: Boolean; + function IsToolbarSize: Boolean; + function IsPtInButtonPart(X, Y: Integer): Boolean; virtual; + procedure KeyDown(var Key: Word; Shift: TShiftState); virtual; + procedure Leaving; virtual; + procedure LosingCapture; virtual; + procedure MouseDown(Shift: TShiftState; X, Y: Integer; + var MouseDownOnMenu: Boolean); virtual; + procedure MouseMove(X, Y: Integer); virtual; + procedure MouseUp(X, Y: Integer; MouseWasDownOnMenu: Boolean); virtual; + procedure MouseWheel(WheelDelta: Integer; X, Y: Integer); virtual; + procedure Paint(const Canvas: TCanvas; const ClientAreaRect: TRect; + IsSelected, IsPushed, UseDisabledShadow: Boolean); virtual; + procedure PostAccSelect(const AExecute: Boolean); + function UsesSameWidth: Boolean; virtual; + public + State: set of (tbisInvalidated, tbisLineSep); + property BoundsRect: TRect read FBoundsRect; + property Clipped: Boolean read FClipped; + property Index: Integer read GetIndex; + property Item: TTBCustomItem read FItem; + property OffEdge: Boolean read FOffEdge; + property Show: Boolean read FShow; + property View: TTBView read FView; + constructor Create(AView: TTBView; AItem: TTBCustomItem; AGroupLevel: Integer); virtual; + destructor Destroy; override; + procedure Execute(AGivePriority: Boolean); + function GetAccObject: TTBBaseAccObject; + function GetHintText: String; + function IsAccessible: Boolean; + function IsToolbarStyle: Boolean; + function ScreenToClient(const P: TPoint): TPoint; + end; + TTBViewOrientation = (tbvoHorizontal, tbvoVertical, tbvoFloating); + TTBEnterToolbarLoopOptions = set of (tbetMouseDown, tbetExecuteSelected, + tbetFromMSAA); + TTBViewState = set of (vsModal, vsMouseInWindow, vsDrawInOrder, vsOppositePopup, + vsIgnoreFirstMouseUp, vsShowAccels, vsDropDownMenus, vsNoAnimation); + TTBViewStyle = set of (vsMenuBar, vsUseHiddenAccels, vsAlwaysShowHints); + TTBViewTimerID = (tiOpen, tiClose, tiScrollUp, tiScrollDown); + + TTBViewClass = class of TTBView; + TTBView = class(TComponent) + private + FViewers: TList; { at front to minimize code size } + FActiveTimers: set of TTBViewTimerID; + FBackgroundColor: TColor; + FBaseSize: TPoint; + FCapture: Boolean; + FCaptureWnd: HWND; + FChevronOffset: Integer; + FChevronParentView: TTBView; + FChevronSize: Integer; + FCurParentItem: TTBCustomItem; + FCustomizing: Boolean; + FDoneActionData: TTBDoneActionData; + FInternalViewersAtEnd: Integer; + FInternalViewersAtFront: Integer; + FIsPopup: Boolean; + FIsToolbar: Boolean; + FMaxHeight: Integer; + FMonitorRect: TRect; + FMouseOverSelected: Boolean; + FNewViewersGetHighestPriority: Boolean; + FOpenViewer: TTBItemViewer; + FOpenViewerView: TTBView; + FOpenViewerWindow: TTBPopupWindow; + FParentView: TTBView; + FParentItem: TTBCustomItem; + FPriorityList: TList; + FOrientation: TTBViewOrientation; + FScrollOffset: Integer; + FSelected: TTBItemViewer; + FSelectedViaMouse: Boolean; + FShowDownArrow: Boolean; + FShowUpArrow: Boolean; + FState: TTBViewState; + FStyle: TTBViewStyle; + FUpdating: Integer; + FUsePriorityList: Boolean; + FValidated: Boolean; + FWindow: TWinControl; + FWrapOffset: Integer; + + procedure DeletingViewer(Viewer: TTBItemViewer); + procedure DrawItem(Viewer: TTBItemViewer; DrawTo: TCanvas; Offscreen: Boolean); + procedure FreeViewers; + function GetViewer(Index: Integer): TTBItemViewer; + function GetViewerCount: Integer; {$IFDEF JR_D9} inline; {$ENDIF} + procedure ImagesChanged; + function InsertItemViewers(const NewIndex: Integer; + const AItem: TTBCustomItem; const AGroupLevel: Integer; + const AddToPriorityList, TopOfPriorityList: Boolean): Integer; + procedure ItemNotification(Ancestor: TTBCustomItem; Relayed: Boolean; + Action: TTBItemChangedAction; Index: Integer; Item: TTBCustomItem); + procedure LinkNotification(Ancestor: TTBCustomItem; Relayed: Boolean; + Action: TTBItemChangedAction; Index: Integer; Item: TTBCustomItem); + procedure RecreateItemViewer(const I: Integer); + procedure Scroll(ADown: Boolean); + procedure SetCustomizing(Value: Boolean); + procedure SetSelected(Value: TTBItemViewer); + procedure SetUsePriorityList(Value: Boolean); + procedure StartTimer(const ATimer: TTBViewTimerID; const Interval: Integer); + procedure StopAllTimers; + procedure StopTimer(const ATimer: TTBViewTimerID); + procedure UpdateCurParentItem; + protected + FAccObjectInstance: TTBBaseAccObject; + procedure AutoSize(AWidth, AHeight: Integer); virtual; + function CalculatePositions(const CanMoveControls: Boolean; + const AOrientation: TTBViewOrientation; + AWrapOffset, AChevronOffset, AChevronSize: Integer; + var ABaseSize, TotalSize: TPoint; + var AWrappedLines: Integer): Boolean; + procedure DoUpdatePositions(var ASize: TPoint); virtual; + function GetChevronItem: TTBCustomItem; virtual; + procedure GetMargins(AOrientation: TTBViewOrientation; var Margins: TRect); + virtual; + function GetMDIButtonsItem: TTBCustomItem; virtual; + function GetMDISystemMenuItem: TTBCustomItem; virtual; + function GetParentToolbarView: TTBView; + function GetRootView: TTBView; + function HandleWMGetObject(var Message: TMessage): Boolean; + procedure InitiateActions; + procedure KeyDown(var Key: Word; Shift: TShiftState); virtual; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure SetAccelsVisibility(AShowAccels: Boolean); + public + constructor Create(AOwner: TComponent; AParentView: TTBView; + AParentItem: TTBCustomItem; AWindow: TWinControl; + AIsToolbar, ACustomizing, AUsePriorityList: Boolean); reintroduce; virtual; + destructor Destroy; override; + procedure BeginUpdate; + procedure CancelCapture; + procedure CancelChildPopups; + procedure CancelMode; + procedure CloseChildPopups; + function ContainsView(AView: TTBView): Boolean; + procedure DrawSubitems(ACanvas: TCanvas); + procedure EndModal; + procedure EndModalWithClick(AViewer: TTBItemViewer); + procedure EndModalWithHelp(AContextID: Integer); + procedure EndModalWithSystemMenu(AWnd: HWND; AKey: Word); + procedure EndUpdate; + procedure EnterToolbarLoop(Options: TTBEnterToolbarLoopOptions); + procedure ExecuteSelected(AGivePriority: Boolean); + function Find(Item: TTBCustomItem): TTBItemViewer; + function FirstSelectable: TTBItemViewer; + function GetAccObject: TTBBaseAccObject; + function GetCaptureWnd: HWND; + function GetFont: TFont; virtual; + procedure GetOffEdgeControlList(const List: TList); + procedure GivePriority(AViewer: TTBItemViewer); + procedure HandleHintShowMessage(var Message: TCMHintShow); + function HighestPriorityViewer: TTBItemViewer; + procedure Invalidate(AViewer: TTBItemViewer); + procedure InvalidatePositions; virtual; + function IndexOf(AViewer: TTBItemViewer): Integer; + function IsModalEnding: Boolean; + function NextSelectable(CurViewer: TTBItemViewer; GoForward: Boolean): TTBItemViewer; + function NextSelectableWithAccel(CurViewer: TTBItemViewer; Key: Char; + RequirePrimaryAccel: Boolean; var IsOnlyItemWithAccel: Boolean): TTBItemViewer; + procedure NotifyFocusEvent; + function OpenChildPopup(const SelectFirstItem: Boolean): Boolean; + procedure RecreateAllViewers; + procedure ScrollSelectedIntoView; + procedure Select(Value: TTBItemViewer; ViaMouse: Boolean); + procedure SetCapture; + procedure TryValidatePositions; + procedure UpdateSelection(const P: TPoint; const AllowNewSelection: Boolean); + function UpdatePositions: TPoint; + procedure ValidatePositions; + function ViewerFromPoint(const P: TPoint): TTBItemViewer; + + property BackgroundColor: TColor read FBackgroundColor write FBackgroundColor; + property BaseSize: TPoint read FBaseSize; + property Capture: Boolean read FCapture; + property ChevronOffset: Integer read FChevronOffset write FChevronOffset; + property ChevronSize: Integer read FChevronSize write FChevronSize; + property Customizing: Boolean read FCustomizing write SetCustomizing; + property IsPopup: Boolean read FIsPopup; + property IsToolbar: Boolean read FIsToolbar; + property MouseOverSelected: Boolean read FMouseOverSelected; + property NewViewersGetHighestPriority: Boolean read FNewViewersGetHighestPriority + write FNewViewersGetHighestPriority; + property ParentView: TTBView read FParentView; + property ParentItem: TTBCustomItem read FParentItem; + property OpenViewer: TTBItemViewer read FOpenViewer; + property OpenViewerView: TTBView read FOpenViewerView; + property Orientation: TTBViewOrientation read FOrientation write FOrientation; + property Selected: TTBItemViewer read FSelected write SetSelected; + property SelectedViaMouse: Boolean read FSelectedViaMouse; + property State: TTBViewState read FState; + property Style: TTBViewStyle read FStyle write FStyle; + property UsePriorityList: Boolean read FUsePriorityList write SetUsePriorityList; + property Viewers[Index: Integer]: TTBItemViewer read GetViewer; + property ViewerCount: Integer read GetViewerCount; + property Window: TWinControl read FWindow; + property WrapOffset: Integer read FWrapOffset write FWrapOffset; + end; + + TTBRootItemClass = class of TTBRootItem; + TTBRootItem = class(TTBCustomItem); + { same as TTBCustomItem, except there's a property editor for it } + + TTBItem = class(TTBCustomItem) + published + property Action; + property AutoCheck; + property Caption; + property Checked; + property DisplayMode; + property Enabled; + property GroupIndex; + property HelpContext; + property Hint; + property ImageIndex; + property Images; + property InheritOptions; + property MaskOptions; + property Options; + property RadioItem; + property ShortCut; + property Visible; + + property OnClick; + property OnSelect; + end; + + TTBGroupItem = class(TTBCustomItem) + public + constructor Create(AOwner: TComponent); override; + published + property InheritOptions; + property LinkSubitems; + property MaskOptions; + property Options; + end; + + TTBSubmenuItem = class(TTBCustomItem) + private + function GetDropdownCombo: Boolean; + procedure SetDropdownCombo(Value: Boolean); + public + constructor Create(AOwner: TComponent); override; + published + property Action; + property AutoCheck; + property Caption; + property Checked; + //property DisplayAsToolbar; + property DisplayMode; + property DropdownCombo: Boolean read GetDropdownCombo write SetDropdownCombo default False; + property Enabled; + property GroupIndex; + property HelpContext; + property Hint; + property ImageIndex; + property Images; + property InheritOptions; + property LinkSubitems; + property MaskOptions; + property Options; + property RadioItem; + property ShortCut; + property SubMenuImages; + property Visible; + + property OnClick; + property OnPopup; + property OnSelect; + end; + + TTBSeparatorItem = class(TTBCustomItem) + private + FBlank: Boolean; + procedure SetBlank(Value: Boolean); + protected + function GetItemViewerClass(AView: TTBView): TTBItemViewerClass; override; + public + constructor Create(AOwner: TComponent); override; + published + property Blank: Boolean read FBlank write SetBlank default False; + property Hint; + property Visible; + end; + + TTBSeparatorItemViewer = class(TTBItemViewer) + protected + procedure CalcSize(const Canvas: TCanvas; + var AWidth, AHeight: Integer); override; + procedure Paint(const Canvas: TCanvas; const ClientAreaRect: TRect; + IsSelected, IsPushed, UseDisabledShadow: Boolean); override; + function UsesSameWidth: Boolean; override; + end; + + TTBControlItem = class(TTBCustomItem) + private + FControl: TControl; + FDontFreeControl: Boolean; + procedure SetControl(Value: TControl); + protected + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + property DontFreeControl: Boolean read FDontFreeControl write FDontFreeControl; + published + property Control: TControl read FControl write SetControl; + end; + + TTBPopupView = class(TTBView) + protected + procedure AutoSize(AWidth, AHeight: Integer); override; + public + function GetFont: TFont; override; + end; + + ITBPopupWindow = interface + ['{E45CBE74-1ECF-44CB-B064-6D45B1924708}'] + end; + + TTBPopupWindow = class(TCustomControl, ITBPopupWindow) + private + FAccelsVisibilitySet: Boolean; + FAnimationDirection: TTBAnimationDirection; + FView: TTBView; + procedure CMHintShow(var Message: TCMHintShow); message CM_HINTSHOW; + procedure CMShowingChanged(var Message: TMessage); message CM_SHOWINGCHANGED; + procedure WMClose(var Message: TWMClose); message WM_CLOSE; + procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND; + procedure WMGetObject(var Message: TMessage); message WM_GETOBJECT; + procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE; + procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT; + procedure WMPaint(var Message: TWMPaint); message WM_PAINT; + procedure WMPrint(var Message: TMessage); message WM_PRINT; + procedure WMPrintClient(var Message: {$IFNDEF CLR} TMessage {$ELSE} TWMPrintClient {$ENDIF}); message WM_PRINTCLIENT; + protected + procedure CreateParams(var Params: TCreateParams); override; + procedure CreateWnd; override; + procedure DestroyWindowHandle; override; + function GetViewClass: TTBViewClass; dynamic; + procedure Paint; override; + procedure PaintScrollArrows; virtual; + public + constructor CreatePopupWindow(AOwner: TComponent; const AParentView: TTBView; + const AItem: TTBCustomItem; const ACustomizing: Boolean); virtual; + destructor Destroy; override; + + property View: TTBView read FView; + end; + + ITBItems = interface + ['{A5C0D7CC-3EC4-4090-A0F8-3D03271877EA}'] + function GetItems: TTBCustomItem; + end; + + TTBItemContainer = class(TComponent, ITBItems) + private + FItem: TTBRootItem; + function GetImages: TCustomImageList; + function GetItems: TTBCustomItem; + procedure SetImages(Value: TCustomImageList); + protected + procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + + property Items: TTBRootItem read FItem; + published + property Images: TCustomImageList read GetImages write SetImages; + end; + + TTBPopupMenu = class(TPopupMenu, ITBItems) + private + FItem: TTBRootItem; + //procedure SetItems(Value: TTBCustomItem); + function GetImages: TCustomImageList; + function GetItems: TTBCustomItem; + function GetLinkSubitems: TTBCustomItem; + function GetOptions: TTBItemOptions; + procedure RootItemClick(Sender: TObject); + procedure SetImages(Value: TCustomImageList); + procedure SetLinkSubitems(Value: TTBCustomItem); + procedure SetOptions(Value: TTBItemOptions); + protected + {$IFNDEF JR_D5} + procedure DoPopup(Sender: TObject); + {$ENDIF} + function GetRootItemClass: TTBRootItemClass; dynamic; + procedure SetChildOrder(Child: TComponent; Order: Integer); override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override; + function IsShortCut(var Message: TWMKey): Boolean; override; + procedure Popup(X, Y: Integer); override; + function PopupEx(X, Y: Integer; ReturnClickedItemOnly: Boolean = False): TTBCustomItem; + published + property Images: TCustomImageList read GetImages write SetImages; + property Items: TTBRootItem read FItem; + property LinkSubitems: TTBCustomItem read GetLinkSubitems write SetLinkSubitems; + property Options: TTBItemOptions read GetOptions write SetOptions default []; + end; + + TTBCustomImageList = class(TImageList) + private + FCheckedImages: TCustomImageList; + FCheckedImagesChangeLink: TChangeLink; + FDisabledImages: TCustomImageList; + FDisabledImagesChangeLink: TChangeLink; + FHotImages: TCustomImageList; + FHotImagesChangeLink: TChangeLink; + FImagesBitmap: TBitmap; + FImagesBitmapMaskColor: TColor; + procedure ChangeImages(var AImageList: TCustomImageList; + Value: TCustomImageList; AChangeLink: TChangeLink); + procedure ImageListChanged(Sender: TObject); + procedure ImagesBitmapChanged(Sender: TObject); + procedure SetCheckedImages(Value: TCustomImageList); + procedure SetDisabledImages(Value: TCustomImageList); + procedure SetHotImages(Value: TCustomImageList); + procedure SetImagesBitmap(Value: TBitmap); + procedure SetImagesBitmapMaskColor(Value: TColor); + {$IFDEF CLR} + procedure WriteLeft(Writer: TWriter); + procedure WriteTop(Writer: TWriter); + {$ENDIF} + protected + procedure DefineProperties(Filer: TFiler); override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + property CheckedImages: TCustomImageList read FCheckedImages write SetCheckedImages; + property DisabledImages: TCustomImageList read FDisabledImages write SetDisabledImages; + property HotImages: TCustomImageList read FHotImages write SetHotImages; + property ImagesBitmap: TBitmap read FImagesBitmap write SetImagesBitmap; + property ImagesBitmapMaskColor: TColor read FImagesBitmapMaskColor + write SetImagesBitmapMaskColor default clFuchsia; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure DrawState(Canvas: TCanvas; X, Y, Index: Integer; + Enabled, Selected, Checked: Boolean); virtual; + end; + + TTBImageList = class(TTBCustomImageList) + published + property CheckedImages; + property DisabledImages; + property HotImages; + property ImagesBitmap; + property ImagesBitmapMaskColor; + end; + +const + {$IFNDEF TB2K_USE_STRICT_O2K_MENU_STYLE} + tbMenuBkColor = clMenu; + tbMenuTextColor = clMenuText; + {$ELSE} + tbMenuBkColor = clBtnFace; + tbMenuTextColor = clBtnText; + {$ENDIF} + + tbMenuVerticalMargin = 4; + tbMenuImageTextSpace = 1; + tbMenuLeftTextMargin = 2; + tbMenuRightTextMargin = 3; + + tbMenuSeparatorOffset = 12; + + tbMenuScrollArrowHeight = 19; + + tbDropdownArrowWidth = 8; + tbDropdownArrowMargin = 3; + tbDropdownComboArrowWidth = 11; + tbDropdownComboMargin = 2; + + tbLineSpacing = 6; + tbLineSepOffset = 1; + tbDockedLineSepOffset = 4; + + WM_TB2K_CLICKITEM = WM_USER + $100; + +function TBGetItems(const AObject: TObject): TTBCustomItem; +procedure TBInitToolbarSystemFont; + +var + ToolbarFont: TFont; + + +implementation + +uses + {$IFDEF CLR} System.Runtime.InteropServices, System.Text, System.Threading, + Types, WinUtils, {$ENDIF} + TB2Consts, TB2Common, IMM, TB2Acc; + +{$UNDEF ALLOCHWND_CLASSES} +{$IFNDEF CLR} + {$IFDEF JR_D6} + {$DEFINE ALLOCHWND_CLASSES} + {$ENDIF} +{$ENDIF} + +var + LastPos: TPoint; + +threadvar + ClickWndRefCount: Integer; + ClickWnd: HWND; + ClickList: TList; + +type + TTBModalHandler = class + private + FCreatedWnd: Boolean; + FInited: Boolean; + FWnd: HWND; + FRootPopup: TTBPopupWindow; + FSaveFocusWnd: HWND; + procedure WndProc(var Msg: TMessage); + public + constructor Create(AExistingWnd: HWND); + destructor Destroy; override; + procedure Loop(const RootView: TTBView; const AMouseDown, AExecuteSelected, + AFromMSAA, TrackRightButton: Boolean); + property RootPopup: TTBPopupWindow read FRootPopup write FRootPopup; + property Wnd: HWND read FWnd; + end; + + TItemChangedNotificationData = class + private + Proc: TTBItemChangedProc; + RefCount: Integer; + end; + + {$IFNDEF CLR} + TComponentAccess = class(TComponent); + TControlAccess = class(TControl); + {$ENDIF} + +const + ViewTimerBaseID = 9000; + MaxGroupLevel = 10; + + +{ Misc. } + +function TBGetItems(const AObject: TObject): TTBCustomItem; +{ If AObject is an item, returns AObject, otherwise finds the root item + associated with AObject. If AObject is not a TTBCustomItem and does not + implement the ITBItems interface, nil is returned. } +var + Intf: ITBItems; +begin + if AObject is TTBCustomItem then + Result := TTBCustomItem(AObject) + else begin + {$IFNDEF CLR} + if AObject.GetInterface(ITBItems, Intf) then + {$ELSE} + Intf := ITBItems(AObject); + if Assigned(Intf) then + {$ENDIF} + Result := Intf.GetItems + else + Result := nil; + end; +end; + +procedure DestroyClickWnd; +begin + if ClickWnd <> 0 then begin + {$IFDEF ALLOCHWND_CLASSES}Classes.{$ENDIF} DeallocateHWnd(ClickWnd); + ClickWnd := 0; + end; + FreeAndNil(ClickList); +end; + +procedure ReferenceClickWnd; +begin + Inc(ClickWndRefCount); +end; + +procedure ReleaseClickWnd; +begin + Dec(ClickWndRefCount); + if ClickWndRefCount = 0 then + DestroyClickWnd; +end; + +procedure QueueClick(const AItem: TObject; const AArg: Integer); +{ Adds an item to ClickList and posts a message to handle it. AItem must be + either a TTBCustomItem or TTBItemViewer. } +var + I: Integer; +begin + if ClickWnd = 0 then + ClickWnd := {$IFDEF ALLOCHWND_CLASSES}Classes.{$ENDIF} AllocateHWnd(TTBCustomItem.ClickWndProc); + if ClickList = nil then + ClickList := TList.Create; + + { Add a new item to ClickList or replace an empty one } + I := ClickList.IndexOf(nil); + if I = -1 then + I := ClickList.Add(AItem) + else + ClickList[I] := AItem; + + PostMessage(ClickWnd, WM_TB2K_CLICKITEM, AArg, I); +end; + +procedure RemoveFromClickList(const AItem: TObject); +{ Any class that potentially calls QueueClick needs to call RemoveFromClickList + before an instance is destroyed to ensure that any references to the + instance still in ClickList are removed. } +var + I: Integer; +begin + if Assigned(ClickList) and Assigned(AItem) then + for I := 0 to ClickList.Count-1 do + if ClickList[I] = AItem then + ClickList[I] := ClickList; + { ^ The special value of ClickList is assigned to the item instead of + of nil because we want the index to stay reserved until the + WM_TB2K_CLICKITEM message for the index is processed. We don't want + the WM_TB2K_CLICKITEM message that's still in the queue to later + refer to a different item; this would result in queued clicks being + processed in the wrong order in a case like this: + A.PostClick; B.PostClick; A.Free; C.PostClick; + C's click would end up being processed before A's, because C would + get A's index. } +end; + +function ProcessDoneAction(const DoneActionData: TTBDoneActionData; + const ReturnClickedItemOnly: Boolean): TTBCustomItem; +begin + Result := nil; + case DoneActionData.DoneAction of + tbdaNone: ; + tbdaClickItem: begin + if DoneActionData.Sound and NeedToPlaySound('MenuCommand') then + PlaySystemSound('MenuCommand'); + Result := DoneActionData.ClickItem; + if not ReturnClickedItemOnly then + Result.PostClick; + end; + tbdaOpenSystemMenu: begin + SendMessage(DoneActionData.Wnd, WM_SYSCOMMAND, SC_KEYMENU, DoneActionData.Key); + end; + tbdaHelpContext: begin + { Based on code in TPopupList.WndProc: } + if Assigned(Screen.ActiveForm) and + (biHelp in Screen.ActiveForm.BorderIcons) then + Application.HelpCommand(HELP_CONTEXTPOPUP, DoneActionData.ContextID) + else + Application.HelpContext(DoneActionData.ContextID); + end; + end; +end; + + +{ TTBCustomItemActionLink } + +procedure TTBCustomItemActionLink.AssignClient(AClient: TObject); +begin + FClient := AClient as TTBCustomItem; +end; + +{$IFDEF JR_D6} +function TTBCustomItemActionLink.IsAutoCheckLinked: Boolean; +begin + Result := (FClient.AutoCheck = (Action as TCustomAction).AutoCheck); +end; +{$ENDIF} + +function TTBCustomItemActionLink.IsCaptionLinked: Boolean; +begin + Result := inherited IsCaptionLinked and + (FClient.Caption = (Action as TCustomAction).Caption); +end; + +function TTBCustomItemActionLink.IsCheckedLinked: Boolean; +begin + Result := inherited IsCheckedLinked and + (FClient.Checked = (Action as TCustomAction).Checked); +end; + +function TTBCustomItemActionLink.IsEnabledLinked: Boolean; +begin + Result := inherited IsEnabledLinked and + (FClient.Enabled = (Action as TCustomAction).Enabled); +end; + +function TTBCustomItemActionLink.IsHelpContextLinked: Boolean; +begin + Result := inherited IsHelpContextLinked and + (FClient.HelpContext = (Action as TCustomAction).HelpContext); +end; + +function TTBCustomItemActionLink.IsHintLinked: Boolean; +begin + Result := inherited IsHintLinked and + (FClient.Hint = (Action as TCustomAction).Hint); +end; + +function TTBCustomItemActionLink.IsImageIndexLinked: Boolean; +begin + Result := inherited IsImageIndexLinked and + (FClient.ImageIndex = (Action as TCustomAction).ImageIndex); +end; + +function TTBCustomItemActionLink.IsShortCutLinked: Boolean; +begin + Result := inherited IsShortCutLinked and + (FClient.ShortCut = (Action as TCustomAction).ShortCut); +end; + +function TTBCustomItemActionLink.IsVisibleLinked: Boolean; +begin + Result := inherited IsVisibleLinked and + (FClient.Visible = (Action as TCustomAction).Visible); +end; + +function TTBCustomItemActionLink.IsOnExecuteLinked: Boolean; +begin + Result := inherited IsOnExecuteLinked and + {$IFNDEF CLR} + MethodsEqual(TMethod(FClient.OnClick), TMethod(Action.OnExecute)); + {$ELSE} + (@FClient.OnClick = @Action.OnExecute); + {$ENDIF} +end; + +{$IFDEF JR_D6} +procedure TTBCustomItemActionLink.SetAutoCheck(Value: Boolean); +begin + if IsAutoCheckLinked then FClient.AutoCheck := Value; +end; +{$ENDIF} + +procedure TTBCustomItemActionLink.SetCaption(const Value: string); +begin + if IsCaptionLinked then FClient.Caption := Value; +end; + +procedure TTBCustomItemActionLink.SetChecked(Value: Boolean); +begin + if IsCheckedLinked then FClient.Checked := Value; +end; + +procedure TTBCustomItemActionLink.SetEnabled(Value: Boolean); +begin + if IsEnabledLinked then FClient.Enabled := Value; +end; + +procedure TTBCustomItemActionLink.SetHelpContext(Value: THelpContext); +begin + if IsHelpContextLinked then FClient.HelpContext := Value; +end; + +procedure TTBCustomItemActionLink.SetHint(const Value: string); +begin + if IsHintLinked then FClient.Hint := Value; +end; + +procedure TTBCustomItemActionLink.SetImageIndex(Value: Integer); +begin + if IsImageIndexLinked then FClient.ImageIndex := Value; +end; + +procedure TTBCustomItemActionLink.SetShortCut(Value: TShortCut); +begin + if IsShortCutLinked then FClient.ShortCut := Value; +end; + +procedure TTBCustomItemActionLink.SetVisible(Value: Boolean); +begin + if IsVisibleLinked then FClient.Visible := Value; +end; + +procedure TTBCustomItemActionLink.SetOnExecute(Value: TNotifyEvent); +begin + if IsOnExecuteLinked then FClient.OnClick := Value; +end; + + +{ TTBCustomItem } + +{}function ItemContainingItems(const AItem: TTBCustomItem): TTBCustomItem; +begin + if Assigned(AItem) and Assigned(AItem.FLinkSubitems) then + Result := AItem.FLinkSubitems + else + Result := AItem; +end; + +constructor TTBCustomItem.Create(AOwner: TComponent); +begin + inherited; + FEnabled := True; + FImageIndex := -1; + FInheritOptions := True; + FItemStyle := [tbisSelectable, tbisRedrawOnSelChange, tbisRedrawOnMouseOverChange]; + FVisible := True; + ReferenceClickWnd; +end; + +destructor TTBCustomItem.Destroy; +var + I: Integer; +begin + Destroying; + RemoveFromClickList(Self); + { Changed in 0.33. Moved FParent.Remove call *after* the child items are + deleted. } + for I := Count-1 downto 0 do + Items[I].Free; + if Assigned(FParent) then + FParent.Remove(Self); + FreeAndNil(FItems); + FActionLink.Free; + FActionLink := nil; + FreeAndNil(FSubMenuImagesChangeLink); + FreeAndNil(FImagesChangeLink); + inherited; + if Assigned(FNotifyList) then begin + for I := FNotifyList.Count-1 downto 0 do + TItemChangedNotificationData(FNotifyList[I]).Free; + FNotifyList.Free; + end; + FLinkParents.Free; + ReleaseClickWnd; +end; + +{$IFDEF JR_D6} +function TTBCustomItem.IsAutoCheckStored: Boolean; +begin + Result := (ActionLink = nil) or not FActionLink.IsAutoCheckLinked; +end; +{$ENDIF} + +function TTBCustomItem.IsCaptionStored: Boolean; +begin + Result := (ActionLink = nil) or not FActionLink.IsCaptionLinked; +end; + +function TTBCustomItem.IsCheckedStored: Boolean; +begin + Result := (ActionLink = nil) or not FActionLink.IsCheckedLinked; +end; + +function TTBCustomItem.IsEnabledStored: Boolean; +begin + Result := (ActionLink = nil) or not FActionLink.IsEnabledLinked; +end; + +function TTBCustomItem.IsHintStored: Boolean; +begin + Result := (ActionLink = nil) or not FActionLink.IsHintLinked; +end; + +function TTBCustomItem.IsHelpContextStored: Boolean; +begin + Result := (ActionLink = nil) or not FActionLink.IsHelpContextLinked; +end; + +function TTBCustomItem.IsImageIndexStored: Boolean; +begin + Result := (ActionLink = nil) or not FActionLink.IsImageIndexLinked; +end; + +function TTBCustomItem.IsShortCutStored: Boolean; +begin + Result := (ActionLink = nil) or not FActionLink.IsShortCutLinked; +end; + +function TTBCustomItem.IsVisibleStored: Boolean; +begin + Result := (ActionLink = nil) or not FActionLink.IsVisibleLinked; +end; + +function TTBCustomItem.IsOnClickStored: Boolean; +begin + Result := (ActionLink = nil) or not FActionLink.IsOnExecuteLinked; +end; + +function TTBCustomItem.GetAction: TBasicAction; +begin + if FActionLink <> nil then + Result := FActionLink.Action + else + Result := nil; +end; + +function TTBCustomItem.GetActionLinkClass: TTBCustomItemActionLinkClass; +begin + Result := TTBCustomItemActionLink; +end; + +procedure TTBCustomItem.DoActionChange(Sender: TObject); +begin + if Sender = Action then ActionChange(Sender, False); +end; + +procedure TTBCustomItem.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + if Action is TCustomAction then + with TCustomAction(Sender) do + begin + {$IFDEF JR_D6} + if not CheckDefaults or (Self.AutoCheck = False) then + Self.AutoCheck := AutoCheck; + {$ENDIF} + if not CheckDefaults or (Self.Caption = '') then + Self.Caption := Caption; + if not CheckDefaults or (Self.Checked = False) then + Self.Checked := Checked; + if not CheckDefaults or (Self.Enabled = True) then + Self.Enabled := Enabled; + if not CheckDefaults or (Self.HelpContext = 0) then + Self.HelpContext := HelpContext; + if not CheckDefaults or (Self.Hint = '') then + Self.Hint := Hint; + if not CheckDefaults or (Self.ImageIndex = -1) then + Self.ImageIndex := ImageIndex; + if not CheckDefaults or (Self.ShortCut = scNone) then + Self.ShortCut := ShortCut; + if not CheckDefaults or (Self.Visible = True) then + Self.Visible := Visible; + if not CheckDefaults or not Assigned(Self.OnClick) then + Self.OnClick := OnExecute; + end; +end; + +procedure TTBCustomItem.SetAction(Value: TBasicAction); +begin + if Value = nil then begin + FActionLink.Free; + FActionLink := nil; + end + else begin + if FActionLink = nil then + FActionLink := GetActionLinkClass.Create(Self); + FActionLink.Action := Value; + FActionLink.OnChange := DoActionChange; + { Note: Delphi's Controls.pas and Menus.pas merely check for + "csLoading in Value.ComponentState" here. But that doesn't help when + the Action property references an action on another form / data module + that has already finished loading. So we check two things: + 1. csLoading in Value.ComponentState + 2. csLoading in ComponentState + In the typical case where the item and action list reside on the same + form, #1 and #2 are both true. + Only #1 is true when Action references an action on another form / data + module that is created *after* the item (e.g. if Form1.TBItem1.Action = + Form2.Action1, and Form1 is created before Form2). + Only #2 is true when Action references an action on another form / data + module that is created *before* the item (e.g. if Form2.TBItem1.Action = + Form1.Action1, and Form1 is created before Form2). } + ActionChange(Value, (csLoading in Value.ComponentState) or + (csLoading in ComponentState)); + Value.FreeNotification(Self); + end; +end; + +procedure TTBCustomItem.InitiateAction; +begin + if FActionLink <> nil then FActionLink.Update; +end; + +procedure TTBCustomItem.Loaded; +begin + inherited; + if Action <> nil then ActionChange(Action, True); +end; + +procedure TTBCustomItem.GetChildren(Proc: TGetChildProc; Root: TComponent); +var + I: Integer; +begin + for I := 0 to Count-1 do + Proc(Items[I]); +end; + +procedure TTBCustomItem.SetChildOrder(Child: TComponent; Order: Integer); +var + I: Integer; +begin + I := IndexOf(Child as TTBCustomItem); + if I <> -1 then + Move(I, Order); +end; + +function TTBCustomItem.HasParent: Boolean; +begin + Result := True; +end; + +function TTBCustomItem.GetParentComponent: TComponent; +begin + if (FParent <> nil) and (FParent.FParentComponent <> nil) then + Result := FParent.FParentComponent + else + Result := FParent; +end; + +procedure TTBCustomItem.SetName(const NewName: TComponentName); +begin + if Name <> NewName then begin + inherited; + if Assigned(FParent) then + FParent.Notify(tbicNameChanged, -1, Self); + end; +end; + +procedure TTBCustomItem.SetParentComponent(Value: TComponent); +var + RootItem: TTBCustomItem; +begin + if FParent <> nil then FParent.Remove(Self); + if Value <> nil then begin + RootItem := TBGetItems(Value); + if Assigned(RootItem) then + RootItem.Add(Self) + else + raise ETBItemError.CreateFmt(STBToolbarItemParentInvalid, [Value.ClassName]); + end; +end; + +procedure TTBCustomItem.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if Operation = opRemove then begin + RemoveFromList(FLinkParents, AComponent); + if AComponent = Action then Action := nil; + if AComponent = Images then Images := nil; + if AComponent = SubMenuImages then SubMenuImages := nil; + if AComponent = LinkSubitems then LinkSubitems := nil; + end; +end; + +class procedure TTBCustomItem.IndexError; +begin + raise ETBItemError.Create(STBToolbarIndexOutOfBounds); +end; + +class procedure TTBCustomItem.ClickWndProc(var Message: TMessage); +var + List: TList; + I: Integer; + Item: TObject; +begin + if Message.Msg = WM_TB2K_CLICKITEM then begin + List := ClickList; { optimization... } + if Assigned(List) then begin + I := ClipToLongint(Message.LParam); + if (I >= 0) and (I < List.Count) then begin + Item := List[I]; + List[I] := nil; + { If the item value is set to ClickList, then it was 'removed' from + the list by RemoveFromClickList } + if Item = List then + Item := nil; + end + else + Item := nil; + + { Remove trailing nil items from ClickList. This is not *necessary*, but + it will make RemoveFromClickList faster if we clean out items that + aren't used, and may never be used again. } + for I := List.Count-1 downto 0 do begin + if List[I] = nil then + List.Delete(I) + else + Break; + end; + + if Assigned(Item) then begin + try + if Item is TTBCustomItem then + TTBCustomItem(Item).Click + else if Item is TTBItemViewer then + TTBItemViewer(Item).AccSelect(Message.WParam <> 0); + except + Application.HandleException(Item); + end; + end; + end; + end + else + with Message do + Result := DefWindowProc(ClickWnd, Msg, wParam, lParam); +end; + +procedure TTBCustomItem.PostClick; +{ Posts a message to the message queue that causes the item's Click handler to + be executed when control is returned to the message loop. + This should be called instead of Click when a WM_SYSCOMMAND message is + (possibly) currently being handled, because TApplication.WndProc's + CM_APPSYSCOMMAND handler disables the VCL's processing of focus messages + until the Perform(WM_SYSCOMMAND, ...) call returns. (An OnClick handler which + calls TForm.ShowModal needs focus messages to be enabled or else the form + will be shown with no initial focus.) } +begin + QueueClick(Self, 0); +end; + +procedure TTBCustomItem.Click; +begin + if Enabled then begin + { Following code based on D6's TMenuItem.Click } + {$IFDEF JR_D6} + if (not Assigned(ActionLink) and AutoCheck) or + (Assigned(ActionLink) and not ActionLink.IsAutoCheckLinked and AutoCheck) then + {$ELSE} + if AutoCheck then + {$ENDIF} + Checked := not Checked; + { Following code based on D4's TControl.Click } + { Call OnClick if assigned and not equal to associated action's OnExecute. + If associated action's OnExecute assigned then call it, otherwise, call + OnClick. } + if Assigned(FOnClick) and (Action <> nil) and + {$IFNDEF CLR} + not MethodsEqual(TMethod(FOnClick), TMethod(Action.OnExecute)) then + {$ELSE} + (@FOnClick <> @Action.OnExecute) then + {$ENDIF} + FOnClick(Self) + else + if not(csDesigning in ComponentState) and (ActionLink <> nil) then + ActionLink.Execute {$IFDEF JR_D6}(Self){$ENDIF} + else + if Assigned(FOnClick) then + FOnClick(Self); + end; +end; + +function TTBCustomItem.GetCount: Integer; +begin + if FItems = nil then + Result := 0 + else + Result := FItems.Count; +end; + +function TTBCustomItem.GetItem(Index: Integer): TTBCustomItem; +begin + if (FItems = nil) or (Index < 0) or (Index >= FItems.Count) then begin + IndexError; + Result := nil; + Exit; + end; + Result := TTBCustomItem(FItems.List[Index]); +end; + +procedure TTBCustomItem.Add(AItem: TTBCustomItem); +begin + Insert(Count, AItem); +end; + +procedure TTBCustomItem.InternalNotify(Ancestor: TTBCustomItem; + NestingLevel: Integer; Action: TTBItemChangedAction; Index: Integer; + Item: TTBCustomItem); +{ Note: Ancestor is Item's parent, or in the case of a group item relayed + notification, it can also be a group item which *links* to Item's parent + (i.e. ItemContainingItems(Ancestor) = Item.Parent). } + + procedure RelayToParentOf(const AItem: TTBCustomItem); + begin + if NestingLevel > MaxGroupLevel then + Exit; + if (tbisEmbeddedGroup in AItem.ItemStyle) and Assigned(AItem.Parent) then begin + if Ancestor = Self then + AItem.Parent.InternalNotify(AItem, NestingLevel + 1, Action, Index, Item) + else + { Don't alter Ancestor on subsequent relays; only on the first. } + AItem.Parent.InternalNotify(Ancestor, NestingLevel + 1, Action, Index, Item); + end; + end; + +var + I: Integer; + P: TTBCustomItem; + SaveProc: TTBItemChangedProc; +begin + { If Self is a group item, relay the notification to the parent } + RelayToParentOf(Self); + { If any group items are linked to Self, relay the notification to + those items' parents } + if Assigned(FLinkParents) then + for I := 0 to FLinkParents.Count-1 do begin + P := TTBCustomItem(FLinkParents[I]); + if P <> Parent then + RelayToParentOf(P); + end; + if Assigned(FNotifyList) then begin + I := 0; + while I < FNotifyList.Count do begin + with TItemChangedNotificationData(FNotifyList[I]) do begin + SaveProc := Proc; + Proc(Ancestor, Ancestor <> Self, Action, Index, Item); + end; + { Is I now out of bounds? } + if I >= FNotifyList.Count then + Break; + { Only proceed to the next index if the list didn't change } + {$IFNDEF CLR} + if MethodsEqual(TMethod(TItemChangedNotificationData(FNotifyList[I]).Proc), + TMethod(SaveProc)) then + {$ELSE} + if @TItemChangedNotificationData(FNotifyList[I]).Proc = @SaveProc then + {$ENDIF} + Inc(I); + end; + end; +end; + +procedure TTBCustomItem.Notify(Action: TTBItemChangedAction; Index: Integer; + Item: TTBCustomItem); +begin + InternalNotify(Self, 0, Action, Index, Item); +end; + +procedure TTBCustomItem.ViewBeginUpdate; +begin + Notify(tbicSubitemsBeginUpdate, -1, nil); +end; + +procedure TTBCustomItem.ViewEndUpdate; +begin + Notify(tbicSubitemsEndUpdate, -1, nil); +end; + +procedure TTBCustomItem.Insert(NewIndex: Integer; AItem: TTBCustomItem); +begin + if Assigned(AItem.FParent) then + raise ETBItemError.Create(STBToolbarItemReinserted); + if (NewIndex < 0) or (NewIndex > Count) then IndexError; + if FItems = nil then + FItems := TList.Create; + FItems.Insert(NewIndex, AItem); + AItem.FParent := Self; + ViewBeginUpdate; + try + Notify(tbicInserted, NewIndex, AItem); + AItem.RefreshOptions; + finally + ViewEndUpdate; + end; +end; + +procedure TTBCustomItem.Delete(Index: Integer); +var + Item: TTBCustomItem; +begin + Item := Items[Index]; { will raise exception if out of range } + Notify(tbicDeleting, Index, Item); + Item.FParent := nil; + FItems.Delete(Index); +end; + +function TTBCustomItem.IndexOf(AItem: TTBCustomItem): Integer; +var + I: Integer; +begin + for I := 0 to Count-1 do + if FItems.List[I] = AItem then begin + Result := I; + Exit; + end; + Result := -1; +end; + +procedure TTBCustomItem.Remove(Item: TTBCustomItem); +var + I: Integer; +begin + I := IndexOf(Item); + //if I = -1 then raise ETBItemError.Create(STBToolbarItemNotFound); + if I <> -1 then + Delete(I); +end; + +procedure TTBCustomItem.Clear; +var + I: Integer; +begin + for I := Count-1 downto 0 do + Items[I].Free; +end; + +procedure TTBCustomItem.Move(CurIndex, NewIndex: Integer); +var + Item: TTBCustomItem; +begin + if CurIndex <> NewIndex then begin + if (NewIndex < 0) or (NewIndex >= Count) then IndexError; + Item := Items[CurIndex]; + ViewBeginUpdate; + try + Delete(CurIndex); + Insert(NewIndex, Item); + finally + ViewEndUpdate; + end; + end; +end; + +function TTBCustomItem.ContainsItem(AItem: TTBCustomItem): Boolean; +begin + while Assigned(AItem) and (AItem <> Self) do + AItem := AItem.Parent; + Result := Assigned(AItem); +end; + +procedure TTBCustomItem.RegisterNotification(ANotify: TTBItemChangedProc); +var + I: Integer; + Data: TItemChangedNotificationData; +begin + if FNotifyList = nil then FNotifyList := TList.Create; + for I := 0 to FNotifyList.Count-1 do + with TItemChangedNotificationData(FNotifyList[I]) do + {$IFNDEF CLR} + if MethodsEqual(TMethod(ANotify), TMethod(Proc)) then begin + {$ELSE} + if @ANotify = @Proc then begin + {$ENDIF} + Inc(RefCount); + Exit; + end; + FNotifyList.Expand; + Data := TItemChangedNotificationData.Create; + Data.Proc := ANotify; + Data.RefCount := 1; + FNotifyList.Add(Data); +end; + +procedure TTBCustomItem.UnregisterNotification(ANotify: TTBItemChangedProc); +var + I: Integer; + Data: TItemChangedNotificationData; +begin + if Assigned(FNotifyList) then + for I := 0 to FNotifyList.Count-1 do begin + Data := TItemChangedNotificationData(FNotifyList[I]); + {$IFNDEF CLR} + if MethodsEqual(TMethod(Data.Proc), TMethod(ANotify)) then begin + {$ELSE} + if @Data.Proc = @ANotify then begin + {$ENDIF} + Dec(Data.RefCount); + if Data.RefCount = 0 then begin + FNotifyList.Delete(I); + Data.Free; + if FNotifyList.Count = 0 then + FreeAndNil(FNotifyList); + end; + Break; + end; + end; +end; + +function TTBCustomItem.GetPopupWindowClass: TTBPopupWindowClass; +begin + Result := TTBPopupWindow; +end; + +procedure TTBCustomItem.DoPopup(Sender: TTBCustomItem; FromLink: Boolean); +begin + if Assigned(FOnPopup) then + FOnPopup(Sender, FromLink); + if not(tbisCombo in ItemStyle) then + Click; +end; + +var + PlayedSound: Boolean = False; + +function TTBCustomItem.CreatePopup(const ParentView: TTBView; + const ParentViewer: TTBItemViewer; const PositionAsSubmenu, SelectFirstItem, + Customizing: Boolean; const APopupPoint: TPoint; + const Alignment: TTBPopupAlignment): TTBPopupWindow; + + function CountObscured(X, Y, W, H: Integer): Integer; + var + I: Integer; + P: TPoint; + V: TTBItemViewer; + begin + Result := 0; + if ParentView = nil then + Exit; + P := ParentView.FWindow.ClientToScreen(Point(0, 0)); + Dec(X, P.X); + Dec(Y, P.Y); + Inc(W, X); + Inc(H, Y); + for I := 0 to ParentView.FViewers.Count-1 do begin + V := ParentView.Viewers[I]; + if V.Show and (V.BoundsRect.Left >= X) and (V.BoundsRect.Right <= W) and + (V.BoundsRect.Top >= Y) and (V.BoundsRect.Bottom <= H) then + Inc(Result); + end; + end; + +var + EventItem, ParentItem: TTBCustomItem; + Opposite: Boolean; + ChevronParentView: TTBView; + X, X2, Y, Y2, W, H: Integer; + P: TPoint; + RepeatCalcX: Boolean; + ParentItemRect: TRect; + MonitorRect: TRect; + AnimDir: TTBAnimationDirection; +begin + EventItem := ItemContainingItems(Self); + if EventItem <> Self then + EventItem.DoPopup(Self, True); + DoPopup(Self, False); + + ChevronParentView := GetChevronParentView; + if ChevronParentView = nil then + ParentItem := Self + else + ParentItem := ChevronParentView.FParentItem; + + Opposite := Assigned(ParentView) and (vsOppositePopup in ParentView.FState); + Result := GetPopupWindowClass.CreatePopupWindow(nil, ParentView, ParentItem, + Customizing); + try + if Assigned(ChevronParentView) then begin + ChevronParentView.FreeNotification(Result.View); + Result.View.FChevronParentView := ChevronParentView; + Result.View.FIsToolbar := True; + Result.View.Style := Result.View.Style + + (ChevronParentView.Style * [vsAlwaysShowHints]); + Result.Color := clBtnFace; + end; + + { Calculate ParentItemRect, and MonitorRect (the rectangle of the monitor + that the popup window will be confined to) } + if Assigned(ParentView) then begin + ParentView.ValidatePositions; + ParentItemRect := ParentViewer.BoundsRect; + P := ParentView.FWindow.ClientToScreen(Point(0, 0)); + OffsetRect(ParentItemRect, P.X, P.Y); + if not IsRectEmpty(ParentView.FMonitorRect) then + MonitorRect := ParentView.FMonitorRect + else + MonitorRect := GetRectOfMonitorContainingRect(ParentItemRect, False); + end + else begin + ParentItemRect.TopLeft := APopupPoint; + ParentItemRect.BottomRight := APopupPoint; + MonitorRect := GetRectOfMonitorContainingPoint(APopupPoint, False); + end; + Result.View.FMonitorRect := MonitorRect; + + { Initialize item positions and size of the popup window } + if ChevronParentView = nil then + Result.View.FMaxHeight := (MonitorRect.Bottom - MonitorRect.Top) - + (PopupMenuWindowNCSize * 2) + else + Result.View.WrapOffset := (MonitorRect.Right - MonitorRect.Left) - + (PopupMenuWindowNCSize * 2); + if SelectFirstItem then + Result.View.Selected := Result.View.FirstSelectable; + Result.View.UpdatePositions; + W := Result.Width; + H := Result.Height; + + { Calculate initial X,Y position of the popup window } + if Assigned(ParentView) then begin + if not PositionAsSubmenu then begin + if ChevronParentView = nil then begin + if (ParentView = nil) or (ParentView.FOrientation <> tbvoVertical) then begin + if GetSystemMetrics(SM_MENUDROPALIGNMENT) = 0 then + X := ParentItemRect.Left + else + X := ParentItemRect.Right - W; + Y := ParentItemRect.Bottom; + end + else begin + X := ParentItemRect.Left - W; + Y := ParentItemRect.Top; + end; + end + else begin + if ChevronParentView.FOrientation <> tbvoVertical then begin + X := ParentItemRect.Right - W; + Y := ParentItemRect.Bottom; + end + else begin + X := ParentItemRect.Left - W; + Y := ParentItemRect.Top; + end; + end; + end + else begin + X := ParentItemRect.Right - PopupMenuWindowNCSize; + Y := ParentItemRect.Top - PopupMenuWindowNCSize; + end; + end + else begin + X := APopupPoint.X; + Y := APopupPoint.Y; + case Alignment of + tbpaRight: Dec(X, W); + tbpaCenter: Dec(X, W div 2); + end; + end; + + { Adjust the Y position of the popup window } + { If the window is going off the bottom of the monitor, try placing it + above the parent item } + if (Y + H > MonitorRect.Bottom) and + ((ParentView = nil) or (ParentView.FOrientation <> tbvoVertical)) then begin + if not PositionAsSubmenu then + Y2 := ParentItemRect.Top + else + Y2 := ParentItemRect.Bottom + PopupMenuWindowNCSize; + Dec(Y2, H); + { Only place it above the parent item if it isn't going to go off the + top of the monitor } + if Y2 >= MonitorRect.Top then + Y := Y2; + end; + { If it's still going off the bottom (which can be possible if a menu bar + was off the screen to begin with), clip it to the bottom of the monitor } + if Y + H > MonitorRect.Bottom then + Y := MonitorRect.Bottom - H; + if Y < MonitorRect.Top then + Y := MonitorRect.Top; + + { Other adjustments to the position of the popup window } + if not PositionAsSubmenu then begin + if (ParentView = nil) and (Alignment = tbpaRight) and (X < MonitorRect.Left) then + Inc(X, W); + if X + W > MonitorRect.Right then begin + if Assigned(ParentView) or (Alignment <> tbpaLeft) then + X := MonitorRect.Right; + Dec(X, W); + end; + if X < MonitorRect.Left then + X := MonitorRect.Left; + if (ParentView = nil) or (ParentView.FOrientation <> tbvoVertical) then begin + Y2 := ParentItemRect.Top - H; + if Y2 >= MonitorRect.Top then begin + { Would the popup window obscure less items if it popped out to the + top instead? } + if (CountObscured(X, Y2, W, H) < CountObscured(X, Y, W, H)) or + ((Y < ParentItemRect.Bottom) and (Y + H > ParentItemRect.Top) and + (X < ParentItemRect.Right) and (X + W > ParentItemRect.Left)) then + Y := Y2; + end; + { Make sure a tall popup window doesn't overlap the parent item } + if (Y < ParentItemRect.Bottom) and (Y + H > ParentItemRect.Top) and + (X < ParentItemRect.Right) and (X + W > ParentItemRect.Left) then begin + if ParentItemRect.Right + W <= MonitorRect.Right then + X := ParentItemRect.Right + else + X := ParentItemRect.Left - W; + if X < MonitorRect.Top then + X := MonitorRect.Top; + end; + end + else begin + X2 := ParentItemRect.Right; + if X2 + W <= MonitorRect.Right then begin + { Would the popup window obscure less items if it popped out to the + right instead? } + if (CountObscured(X2, Y, W, H) < CountObscured(X, Y, W, H)) or + ((Y < ParentItemRect.Bottom) and (Y + H > ParentItemRect.Top) and + (X < ParentItemRect.Right) and (X + W > ParentItemRect.Left)) then + X := X2; + end; + { Make sure a wide popup window doesn't overlap the parent item } + if (Y < ParentItemRect.Bottom) and (Y + H > ParentItemRect.Top) and + (X < ParentItemRect.Right) and (X + W > ParentItemRect.Left) then begin + if ParentItemRect.Bottom + H <= MonitorRect.Bottom then + Y := ParentItemRect.Bottom + else + Y := ParentItemRect.Top - H; + if Y < MonitorRect.Top then + Y := MonitorRect.Top; + end; + end; + end + else begin + { Make nested submenus go from left to right on the screen. Each it + runs out of space on the screen, switch directions } + repeat + RepeatCalcX := False; + X2 := X; + if Opposite or (X2 + W > MonitorRect.Right) then begin + if Assigned(ParentView) then + X2 := ParentItemRect.Left + PopupMenuWindowNCSize; + Dec(X2, W); + if not Opposite then + Include(Result.View.FState, vsOppositePopup) + else begin + if X2 < MonitorRect.Left then begin + Opposite := False; + RepeatCalcX := True; + end + else + Include(Result.View.FState, vsOppositePopup); + end; + end; + until not RepeatCalcX; + X := X2; + if X < MonitorRect.Left then + X := MonitorRect.Left; + end; + + { Determine animation direction } + AnimDir := []; + if not PositionAsSubmenu then begin + if Y >= ParentItemRect.Bottom then + Include(AnimDir, tbadDown) + else if Y + H <= ParentItemRect.Top then + Include(AnimDir, tbadUp); + if X >= ParentItemRect.Right then + Include(AnimDir, tbadRight) + else if X + W <= ParentItemRect.Left then + Include(AnimDir, tbadLeft); + end + else begin + if X + W div 2 >= ParentItemRect.Left + (ParentItemRect.Right - ParentItemRect.Left) div 2 then + Include(AnimDir, tbadRight) + else + Include(AnimDir, tbadLeft); + end; + Result.FAnimationDirection := AnimDir; + + Result.SetBounds(X, Y, W, H); + if Assigned(ParentView) then begin + Result.FreeNotification(ParentView); + ParentView.FOpenViewerWindow := Result; + ParentView.FOpenViewerView := Result.View; + ParentView.FOpenViewer := ParentViewer; + if ParentView.FIsToolbar then begin + Include(ParentView.FState, vsDropDownMenus); + ParentView.Invalidate(ParentViewer); + ParentView.FWindow.Update; + end; + end; + Include(Result.View.FState, vsDrawInOrder); + if not NeedToPlaySound('MenuPopup') then begin + { Don't call PlaySound if we don't have to } + Result.Visible := True; + end + else begin + if not PlayedSound then begin + { Work around Windows 2000 "bug" where there's a 1/3 second delay upon the + first call to PlaySound (or sndPlaySound) by painting the window + completely first. This way the delay isn't very noticable. } + PlayedSound := True; + Result.Visible := True; + Result.Update; + PlaySystemSound('MenuPopup'); + end + else begin + PlaySystemSound('MenuPopup'); + Result.Visible := True; + end; + end; + CallNotifyWinEvent(EVENT_SYSTEM_MENUPOPUPSTART, Result.View.FWindow.Handle, + OBJID_CLIENT, CHILDID_SELF); + { Call NotifyFocusEvent now that the window is visible } + if Assigned(Result.View.Selected) then + Result.View.NotifyFocusEvent; + except + Result.Free; + raise; + end; +end; + +function TTBCustomItem.OpenPopup(const SelectFirstItem, TrackRightButton: Boolean; + const PopupPoint: TPoint; const Alignment: TTBPopupAlignment; + const ReturnClickedItemOnly: Boolean): TTBCustomItem; +var + ModalHandler: TTBModalHandler; + Popup: TTBPopupWindow; + DoneActionData: TTBDoneActionData; +begin + ModalHandler := TTBModalHandler.Create(0); + try + Popup := CreatePopup(nil, nil, False, SelectFirstItem, False, PopupPoint, + Alignment); + try + Include(Popup.View.FState, vsIgnoreFirstMouseUp); + ModalHandler.RootPopup := Popup; + ModalHandler.Loop(Popup.View, False, False, False, TrackRightButton); + DoneActionData := Popup.View.FDoneActionData; + finally + ModalHandler.RootPopup := nil; + { Remove vsModal state from the root view before any TTBView.Destroy + methods get called, so that NotifyFocusEvent becomes a no-op } + Exclude(Popup.View.FState, vsModal); + Popup.Free; + end; + finally + ModalHandler.Free; + end; + Result := ProcessDoneAction(DoneActionData, ReturnClickedItemOnly); +end; + +function TTBCustomItem.Popup(X, Y: Integer; TrackRightButton: Boolean; + Alignment: TTBPopupAlignment = tbpaLeft; + ReturnClickedItemOnly: Boolean = False): TTBCustomItem; +var + P: TPoint; +begin + P.X := X; + P.Y := Y; + Result := OpenPopup(False, TrackRightButton, P, Alignment, + ReturnClickedItemOnly); +end; + +function TTBCustomItem.FindItemWithShortCut(AShortCut: TShortCut; + var ATopmostParent: TTBCustomItem): TTBCustomItem; + + function DoItem(AParentItem: TTBCustomItem; LinkDepth: Integer): TTBCustomItem; + var + I: Integer; + NewParentItem, Item: TTBCustomItem; + begin + Result := nil; + NewParentItem := AParentItem; + if Assigned(NewParentItem.LinkSubitems) then begin + NewParentItem := NewParentItem.LinkSubitems; + Inc(LinkDepth); + if LinkDepth > 25 then + Exit; { prevent infinite link recursion } + end; + for I := 0 to NewParentItem.Count-1 do begin + Item := NewParentItem.Items[I]; + if Item.ShortCut = AShortCut then begin + Result := Item; + Exit; + end; + Result := DoItem(Item, LinkDepth); + if Assigned(Result) then begin + ATopmostParent := Item; + Exit; + end; + end; + end; + +begin + ATopmostParent := nil; + Result := DoItem(Self, 0); +end; + +function TTBCustomItem.IsShortCut(var Message: TWMKey): Boolean; +var + ShortCut: TShortCut; + ShiftState: TShiftState; + ShortCutItem, TopmostItem, Item, EventItem: TTBCustomItem; + I: Integer; +label StartOver; +begin + Result := False; + ShiftState := KeyDataToShiftState(ClipToLongint(Message.KeyData)); + ShortCut := Menus.ShortCut(Message.CharCode, ShiftState); +StartOver: + ShortCutItem := FindItemWithShortCut(ShortCut, TopmostItem); + if Assigned(ShortCutItem) then begin + { Send OnPopup/OnClick events to ShortCutItem's parents so that they can + update the Enabled state of ShortCutItem if needed } + Item := Self; + repeat + if not Item.Enabled then + Exit; + EventItem := ItemContainingItems(Item); + if not(csDesigning in ComponentState) then begin + for I := 0 to EventItem.Count-1 do + EventItem.Items[I].InitiateAction; + end; + if not(tbisEmbeddedGroup in Item.ItemStyle) then begin + if EventItem <> Item then begin + try + EventItem.DoPopup(Item, True); + except + Application.HandleException(Self); + end; + end; + try + Item.DoPopup(Item, False); + except + Application.HandleException(Self); + end; + end; + ShortCutItem := Item.FindItemWithShortCut(ShortCut, TopmostItem); + if ShortCutItem = nil then + { Can no longer find the shortcut inside TopmostItem. Start over + because the shortcut might have moved. } + goto StartOver; + Item := TopmostItem; + until Item = nil; + if ShortCutItem.Enabled then begin + try + ShortCutItem.Click; + except + Application.HandleException(Self); + end; + Result := True; + end; + end; +end; + +function TTBCustomItem.GetChevronParentView: TTBView; +begin + Result := nil; +end; + +function TTBCustomItem.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + Result := TTBItemViewer; +end; + +function TTBCustomItem.NeedToRecreateViewer(AViewer: TTBItemViewer): Boolean; +begin + Result := False; +end; + +function TTBCustomItem.GetItemStyle: TTBItemStyle; +begin + { This public method exists for TB2DsgnItemEditor. It needs access to + ItemStyle but can't access a protected member across assembly boundaries. } + Result := FItemStyle; +end; + +function TTBCustomItem.GetShortCutText: String; +var + P: Integer; +begin + P := Pos(#9, Caption); + if P = 0 then begin + if ShortCut <> 0 then + Result := ShortCutToText(ShortCut) + else + Result := ''; + end + else + Result := Copy(Caption, P+1, Maxint); +end; + +procedure TTBCustomItem.Change(NeedResize: Boolean); +const + ItemChangedActions: array[Boolean] of TTBItemChangedAction = + (tbicInvalidate, tbicInvalidateAndResize); +begin + if Assigned(FParent) then + FParent.Notify(ItemChangedActions[NeedResize], -1, Self); +end; + +procedure TTBCustomItem.RecreateItemViewers; +begin + if Assigned(FParent) then + FParent.Notify(tbicRecreateItemViewers, -1, Self); +end; + +procedure TTBCustomItem.ImageListChangeHandler(Sender: TObject); +var + Resize: Boolean; +begin + if Sender = FSubMenuImages then begin + FSubMenuImagesChangeLink.FLastWidth := FSubMenuImages.Width; + FSubMenuImagesChangeLink.FLastHeight := FSubMenuImages.Height; + SubMenuImagesChanged; + end + else begin + { Sender is FImages } + Resize := False; + if (FImagesChangeLink.FLastWidth <> FImages.Width) or + (FImagesChangeLink.FLastHeight <> FImages.Height) then begin + FImagesChangeLink.FLastWidth := FImages.Width; + FImagesChangeLink.FLastHeight := FImages.Height; + Resize := True; + end; + Change(Resize); + end; +end; + +procedure TTBCustomItem.SubMenuImagesChanged; +begin + Notify(tbicSubMenuImagesChanged, -1, nil); +end; + +procedure TTBCustomItem.TurnSiblingsOff; +var + I: Integer; + Item: TTBCustomItem; +begin + if (GroupIndex <> 0) and Assigned(FParent) then begin + for I := 0 to FParent.Count-1 do begin + Item := FParent[I]; + if (Item <> Self) and (Item.GroupIndex = GroupIndex) then + Item.Checked := False; + end; + end; +end; + +procedure TTBCustomItem.SetCaption(Value: String); +begin + if FCaption <> Value then begin + FCaption := Value; + Change(True); + end; +end; + +procedure TTBCustomItem.SetChecked(Value: Boolean); +begin + if FChecked <> Value then begin + FChecked := Value; + Change(False); + if Value then + TurnSiblingsOff; + end; +end; + +procedure TTBCustomItem.SetDisplayMode(Value: TTBItemDisplayMode); +begin + if FDisplayMode <> Value then begin + FDisplayMode := Value; + Change(True); + end; +end; + +procedure TTBCustomItem.EnabledChanged; +begin + Change(False); +end; + +procedure TTBCustomItem.SetEnabled(Value: Boolean); +begin + if FEnabled <> Value then begin + FEnabled := Value; + EnabledChanged; + end; +end; + +procedure TTBCustomItem.SetGroupIndex(Value: Integer); +begin + if FGroupIndex <> Value then begin + FGroupIndex := Value; + if Checked then + TurnSiblingsOff; + end; +end; + +procedure TTBCustomItem.SetImageIndex(Value: TImageIndex); +var + HadNoImage: Boolean; +begin + if FImageIndex <> Value then begin + HadNoImage := FImageIndex = -1; + FImageIndex := Value; + Change(HadNoImage xor (Value = -1)); + end; +end; + +function TTBCustomItem.ChangeImages(var AImages: TCustomImageList; + const Value: TCustomImageList; var AChangeLink: TTBImageChangeLink): Boolean; +{ Returns True if image list was resized } +var + LastWidth, LastHeight: Integer; +begin + Result := False; + LastWidth := -1; + LastHeight := -1; + if Assigned(AImages) then begin + LastWidth := AImages.Width; + LastHeight := AImages.Height; + AImages.UnregisterChanges(AChangeLink); + if Value = nil then begin + AChangeLink.Free; + AChangeLink := nil; + Result := True; + end; + end; + AImages := Value; + if Assigned(Value) then begin + Result := (Value.Width <> LastWidth) or (Value.Height <> LastHeight); + if AChangeLink = nil then begin + AChangeLink := TTBImageChangeLink.Create; + AChangeLink.FLastWidth := Value.Width; + AChangeLink.FLastHeight := Value.Height; + AChangeLink.OnChange := ImageListChangeHandler; + end; + Value.RegisterChanges(AChangeLink); + Value.FreeNotification(Self); + end; +end; + +procedure TTBCustomItem.SetImages(Value: TCustomImageList); +begin + if FImages <> Value then + Change(ChangeImages(FImages, Value, FImagesChangeLink)); +end; + +procedure TTBCustomItem.SetSubMenuImages(Value: TCustomImageList); +begin + if FSubMenuImages <> Value then begin + ChangeImages(FSubMenuImages, Value, FSubMenuImagesChangeLink); + SubMenuImagesChanged; + end; +end; + +procedure TTBCustomItem.SetInheritOptions(Value: Boolean); +begin + if FInheritOptions <> Value then begin + FInheritOptions := Value; + RefreshOptions; + end; +end; + +procedure TTBCustomItem.SetLinkSubitems(Value: TTBCustomItem); +begin + if Value = Self then + Value := nil; + if FLinkSubitems <> Value then begin + if Assigned(FLinkSubitems) then + RemoveFromList(FLinkSubitems.FLinkParents, Self); + FLinkSubitems := Value; + if Assigned(Value) then begin + Value.FreeNotification(Self); + AddToList(Value.FLinkParents, Self); + end; + Notify(tbicSubitemsChanged, -1, nil); + end; +end; + +function TTBCustomItem.FixOptions(const AOptions: TTBItemOptions): TTBItemOptions; +begin + Result := AOptions; + if not(tboToolbarStyle in Result) then + Exclude(Result, tboToolbarSize); +end; + +procedure TTBCustomItem.RefreshOptions; +const + NonInheritedOptions = [tboDefault]; + ChangeOptions = [tboDefault, tboDropdownArrow, tboImageAboveCaption, + tboNoRotation, tboSameWidth, tboToolbarStyle, tboToolbarSize]; +var + OldOptions, NewOptions: TTBItemOptions; + I: Integer; + Item: TTBCustomItem; +begin + OldOptions := FEffectiveOptions; + if FInheritOptions and Assigned(FParent) then + NewOptions := FParent.FEffectiveOptions - NonInheritedOptions + else + NewOptions := []; + NewOptions := FixOptions(NewOptions - FMaskOptions + FOptions); + if FEffectiveOptions <> NewOptions then begin + FEffectiveOptions := NewOptions; + if (OldOptions * ChangeOptions) <> (NewOptions * ChangeOptions) then + Change(True); + for I := 0 to Count-1 do begin + Item := Items[I]; + if Item.FInheritOptions then + Item.RefreshOptions; + end; + end; +end; + +procedure TTBCustomItem.SetMaskOptions(Value: TTBItemOptions); +begin + if FMaskOptions <> Value then begin + FMaskOptions := Value; + RefreshOptions; + end; +end; + +procedure TTBCustomItem.SetOptions(Value: TTBItemOptions); +begin + Value := FixOptions(Value); + if FOptions <> Value then begin + FOptions := Value; + RefreshOptions; + end; +end; + +procedure TTBCustomItem.SetRadioItem(Value: Boolean); +begin + if FRadioItem <> Value then begin + FRadioItem := Value; + Change(False); + end; +end; + +procedure TTBCustomItem.SetVisible(Value: Boolean); +begin + if FVisible <> Value then begin + FVisible := Value; + Change(True); + end; +end; + + +{ TTBGroupItem } + +constructor TTBGroupItem.Create(AOwner: TComponent); +begin + inherited; + ItemStyle := ItemStyle + [tbisEmbeddedGroup, tbisSubitemsEditable]; +end; + + +{ TTBSubmenuItem } + +constructor TTBSubmenuItem.Create(AOwner: TComponent); +begin + inherited; + ItemStyle := ItemStyle + [tbisSubMenu, tbisSubitemsEditable]; +end; + +function TTBSubmenuItem.GetDropdownCombo: Boolean; +begin + Result := tbisCombo in ItemStyle; +end; + +procedure TTBSubmenuItem.SetDropdownCombo(Value: Boolean); +begin + if (tbisCombo in ItemStyle) <> Value then begin + if Value then + ItemStyle := ItemStyle + [tbisCombo] + else + ItemStyle := ItemStyle - [tbisCombo]; + Change(True); + end; +end; + + +{ TTBSeparatorItem } + +constructor TTBSeparatorItem.Create(AOwner: TComponent); +begin + inherited; + ItemStyle := ItemStyle - [tbisSelectable, tbisRedrawOnSelChange, + tbisRedrawOnMouseOverChange] + [tbisSeparator, tbisClicksTransparent]; +end; + +function TTBSeparatorItem.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + Result := TTBSeparatorItemViewer; +end; + +procedure TTBSeparatorItem.SetBlank(Value: Boolean); +begin + if FBlank <> Value then begin + FBlank := Value; + Change(False); + end; +end; + + +{ TTBSeparatorItemViewer } + +procedure TTBSeparatorItemViewer.CalcSize(const Canvas: TCanvas; + var AWidth, AHeight: Integer); +begin + if not IsToolbarStyle then + { Office 2000's menu separators have a hard-coded height of 10 } + AHeight := 10 + else begin + AWidth := 6; + AHeight := 6; + end; +end; + +procedure TTBSeparatorItemViewer.Paint(const Canvas: TCanvas; + const ClientAreaRect: TRect; IsSelected, IsPushed, UseDisabledShadow: Boolean); +var + DC: HDC; + R: TRect; + ToolbarStyle, Horiz, LineSep: Boolean; +begin + DC := Canvas.Handle; + if TTBSeparatorItem(Item).FBlank then + Exit; + + R := ClientAreaRect; + ToolbarStyle := IsToolbarStyle; + Horiz := not ToolbarStyle or (View.FOrientation = tbvoVertical); + LineSep := tbisLineSep in State; + if LineSep then + Horiz := not Horiz; + if Horiz then begin + R.Top := R.Bottom div 2 - 1; + if not ToolbarStyle then + InflateRect(R, -tbMenuSeparatorOffset, 0) + else if LineSep then begin + if View.FOrientation = tbvoFloating then + InflateRect(R, -tbLineSepOffset, 0) + else + InflateRect(R, -tbDockedLineSepOffset, 0); + end; + DrawEdge(DC, R, EDGE_ETCHED, BF_TOP); + end + else begin + R.Left := R.Right div 2 - 1; + if LineSep then + InflateRect(R, 0, -tbDockedLineSepOffset); + DrawEdge(DC, R, EDGE_ETCHED, BF_LEFT); + end; +end; + +function TTBSeparatorItemViewer.UsesSameWidth: Boolean; +begin + Result := False; +end; + + +{ TTBControlItem } + +constructor TTBControlItem.Create(AOwner: TComponent); +begin + inherited; + ItemStyle := ItemStyle - [tbisSelectable] + [tbisClicksTransparent]; +end; + +destructor TTBControlItem.Destroy; +begin + inherited; + { Free the associated control *after* the item is completely destroyed } + if not FDontFreeControl and Assigned(FControl) and + not(csAncestor in FControl.ComponentState) then + FControl.Free; +end; + +procedure TTBControlItem.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if (Operation = opRemove) and (AComponent = FControl) then + Control := nil; +end; + +procedure TTBControlItem.SetControl(Value: TControl); +begin + if FControl <> Value then begin + FControl := Value; + if Assigned(Value) then + Value.FreeNotification(Self); + Change(True); + end; +end; + + +{ TTBItemViewer } + +constructor TTBItemViewer.Create(AView: TTBView; AItem: TTBCustomItem; + AGroupLevel: Integer); +begin + inherited Create; + FItem := AItem; + FView := AView; + FGroupLevel := AGroupLevel; + ReferenceClickWnd; +end; + +destructor TTBItemViewer.Destroy; +begin + RemoveFromClickList(Self); + if Assigned(FAccObjectInstance) then begin + FAccObjectInstance.ClientIsDestroying; + FAccObjectInstance := nil; + end; + inherited; + ReleaseClickWnd; +end; + +function TTBItemViewer.GetAccObject: TTBBaseAccObject; +begin + if FAccObjectInstance = nil then begin + if not InitializeOleAcc then begin + Result := nil; + Exit; + end; + FAccObjectInstance := TTBItemViewerAccObject.Create(Self); + end; + Result := FAccObjectInstance; +end; + +procedure TTBItemViewer.AccSelect(const AExecute: Boolean); +{ Called by ClickWndProc when an item of type TTBItemViewer is in ClickList } +var + Obj: {$IFNDEF CLR} IDispatch {$ELSE} TTBBaseAccObject {$ENDIF}; +begin + { Ensure FAccObjectInstance is created by calling GetAccObject. Store the + reference as an interface so that the object will be destroyed when we + exit if it's no longer used. } + Obj := GetAccObject; + if Assigned(Obj) then + (FAccObjectInstance as TTBItemViewerAccObject).HandleAccSelect(AExecute); +end; + +procedure TTBItemViewer.PostAccSelect(const AExecute: Boolean); +{ Internally called by TTBItemViewerAccObject. Don't call directly. } +begin + QueueClick(Self, Ord(AExecute)); +end; + +function TTBItemViewer.IsAccessible: Boolean; +{ Returns True if MSAA clients should know about the viewer, specifically + if it's either shown, off-edge, or clipped (in other words, not completely + invisible/inaccessible). } +begin + { Note: Can't simply check Item.Visible because the chevron item's Visible + property is always True } + Result := Show or OffEdge or Clipped; +end; + +function TTBItemViewer.GetCaptionText: String; +var + P: Integer; +begin + Result := Item.Caption; + P := Pos(#9, Result); + if P <> 0 then + SetLength(Result, P-1); +end; + +function TTBItemViewer.GetHintText: String; +begin + Result := GetShortHint(Item.Hint); + { If there is no short hint, use the caption for the hint. Like Office, + strip any trailing colon or ellipsis. } + if (Result = '') and not(tboNoAutoHint in Item.EffectiveOptions) and + (not(tbisSubmenu in Item.ItemStyle) or (tbisCombo in Item.ItemStyle) or + not CaptionShown) then + Result := StripAccelChars(StripTrailingPunctuation(GetCaptionText)); + { Call associated action's OnHint event handler to post-process the hint } + if Assigned(Item.ActionLink) and + (Item.ActionLink.Action is TCustomAction) then begin + if not TCustomAction(Item.ActionLink.Action).DoHint(Result) then + Result := ''; + { Note: TControlActionLink.DoShowHint actually misinterprets the result + of DoHint, but we get it right... } + end; + { Add shortcut text } + if (Result <> '') and Application.HintShortCuts and + (Item.ShortCut <> scNone) then + Result := Format('%s (%s)', [Result, ShortCutToText(Item.ShortCut)]); +end; + +function TTBItemViewer.CaptionShown: Boolean; +begin + Result := (GetCaptionText <> '') and (not IsToolbarSize or + (Item.ImageIndex < 0) or (Item.DisplayMode in [nbdmTextOnly, nbdmImageAndText])) or + (tboImageAboveCaption in Item.EffectiveOptions); +end; + +function TTBItemViewer.ImageShown: Boolean; +begin + {}{should also return false if Images=nil (use UsedImageList?)} + ImageShown := (Item.ImageIndex >= 0) and + ((Item.DisplayMode in [nbdmDefault, nbdmImageAndText]) or + (IsToolbarStyle and (Item.DisplayMode = nbdmTextOnlyInMenus))); +end; + +function TTBItemViewer.GetImageList: TCustomImageList; +var + V: TTBView; +begin + Result := Item.Images; + if Assigned(Result) then + Exit; + V := View; + repeat + if Assigned(V.FCurParentItem) then begin + Result := V.FCurParentItem.SubMenuImages; + if Assigned(Result) then + Break; + end; + if Assigned(V.FParentItem) then begin + Result := V.FParentItem.SubMenuImages; + if Assigned(Result) then + Break; + end; + V := V.FParentView; + until V = nil; +end; + +function TTBItemViewer.IsRotated: Boolean; +{ Returns True if the caption should be drawn with rotated (vertical) text, + underneath the image } +begin + Result := (View.Orientation = tbvoVertical) and + not (tboNoRotation in Item.EffectiveOptions) and + not (tboImageAboveCaption in Item.EffectiveOptions); +end; + +procedure TTBItemViewer.CalcSize(const Canvas: TCanvas; + var AWidth, AHeight: Integer); +var + ToolbarStyle: Boolean; + DC: HDC; + TextMetrics: TTextMetric; + H, LeftMargin: Integer; + ImgList: TCustomImageList; + S: String; + RotatedFont, SaveFont: HFONT; +begin + ToolbarStyle := IsToolbarStyle; + DC := Canvas.Handle; + ImgList := GetImageList; + if ToolbarStyle then begin + AWidth := 6; + AHeight := 6; + end + else begin + AWidth := 0; + AHeight := 0; + end; + if not ToolbarStyle or CaptionShown then begin + if not IsRotated then begin + GetTextMetrics(DC, TextMetrics); + Inc(AHeight, TextMetrics.tmHeight); + Inc(AWidth, GetTextWidth(DC, GetCaptionText, True)); + if ToolbarStyle then + Inc(AWidth, 6); + end + else begin + { Vertical text isn't always the same size as horizontal text, so we have + to select the rotated font into the DC to get an accurate size } + RotatedFont := CreateRotatedFont(DC); + SaveFont := SelectObject(DC, RotatedFont); + GetTextMetrics(DC, TextMetrics); + Inc(AWidth, TextMetrics.tmHeight); + Inc(AHeight, GetTextWidth(DC, GetCaptionText, True)); + if ToolbarStyle then + Inc(AHeight, 6); + SelectObject(DC, SaveFont); + DeleteObject(RotatedFont); + end; + end; + if ToolbarStyle and ImageShown and Assigned(ImgList) then begin + if not IsRotated and not(tboImageAboveCaption in Item.EffectiveOptions) then begin + Inc(AWidth, ImgList.Width + 1); + if AHeight < ImgList.Height + 6 then + AHeight := ImgList.Height + 6; + end + else begin + Inc(AHeight, ImgList.Height); + if AWidth < ImgList.Width + 7 then + AWidth := ImgList.Width + 7; + end; + end; + if ToolbarStyle and (tbisSubmenu in Item.ItemStyle) then begin + if tbisCombo in Item.ItemStyle then + Inc(AWidth, tbDropdownComboArrowWidth) + else + if tboDropdownArrow in Item.EffectiveOptions then begin + if View.Orientation <> tbvoVertical then + Inc(AWidth, tbDropdownArrowWidth) + else + Inc(AHeight, tbDropdownArrowWidth); + end; + end; + if not ToolbarStyle then begin + Inc(AHeight, TextMetrics.tmExternalLeading + tbMenuVerticalMargin); + if Assigned(ImgList) then begin + H := ImgList.Height + 3; + if H > AHeight then + AHeight := H; + LeftMargin := MulDiv(ImgList.Width + 3, AHeight, H); + end + else + LeftMargin := AHeight; + Inc(AWidth, LeftMargin + tbMenuImageTextSpace + tbMenuLeftTextMargin + + tbMenuRightTextMargin); + S := Item.GetShortCutText; + if S <> '' then + Inc(AWidth, (AHeight - 6) + GetTextWidth(DC, S, True)); + Inc(AWidth, AHeight); + end; +end; + +procedure TTBItemViewer.DrawItemCaption(const Canvas: TCanvas; ARect: TRect; + const ACaption: String; ADrawDisabledShadow: Boolean; AFormat: UINT); +var + DC: HDC; + + procedure Draw; + begin + if not IsRotated then + DrawTextStr(DC, ACaption, ARect, AFormat) + else + DrawRotatedText(DC, ACaption, ARect, AFormat); + end; + +var + ShadowColor, HighlightColor, SaveTextColor: DWORD; +begin + DC := Canvas.Handle; + if not ADrawDisabledShadow then + Draw + else begin + ShadowColor := GetSysColor(COLOR_BTNSHADOW); + HighlightColor := GetSysColor(COLOR_BTNHIGHLIGHT); + OffsetRect(ARect, 1, 1); + SaveTextColor := SetTextColor(DC, HighlightColor); + Draw; + OffsetRect(ARect, -1, -1); + SetTextColor(DC, ShadowColor); + Draw; + SetTextColor(DC, SaveTextColor); + end; +end; + +procedure TTBItemViewer.Paint(const Canvas: TCanvas; + const ClientAreaRect: TRect; IsSelected, IsPushed, UseDisabledShadow: Boolean); +var + ShowEnabled, HasArrow: Boolean; + MenuCheckWidth, MenuCheckHeight: Integer; + + function GetDrawTextFlags: UINT; + begin + Result := 0; + if not AreKeyboardCuesEnabled and (vsUseHiddenAccels in View.FStyle) and + not(vsShowAccels in View.FState) then + Result := DT_HIDEPREFIX; + end; + + procedure DrawSubmenuArrow; + var + BR: TRect; + Bmp: TBitmap; + + procedure DrawWithColor(AColor: TColor); + const + ROP_DSPDxax = $00E20746; + var + DC: HDC; + SaveTextColor, SaveBkColor: TColorRef; + begin + Canvas.Brush.Color := AColor; + DC := Canvas.Handle; + SaveTextColor := SetTextColor(DC, clWhite); + SaveBkColor := SetBkColor(DC, clBlack); + BitBlt(DC, BR.Left, BR.Top, MenuCheckWidth, MenuCheckHeight, + Bmp.Canvas.Handle, 0, 0, ROP_DSPDxax); + SetBkColor(DC, SaveBkColor); + SetTextColor(DC, SaveTextColor); + Canvas.Brush.Style := bsClear; + end; + + begin + Bmp := TBitmap.Create; + try + Bmp.Monochrome := True; + Bmp.Width := MenuCheckWidth; + Bmp.Height := MenuCheckHeight; + BR := Rect(0, 0, MenuCheckWidth, MenuCheckHeight); + DrawFrameControl(Bmp.Canvas.Handle, BR, DFC_MENU, DFCS_MENUARROW); + OffsetRect(BR, ClientAreaRect.Right - MenuCheckWidth, + ClientAreaRect.Top + ((ClientAreaRect.Bottom - ClientAreaRect.Top) - MenuCheckHeight) div 2); + if not UseDisabledShadow then begin + if ShowEnabled and (tbisCombo in Item.ItemStyle) and IsSelected then begin + OffsetRect(BR, 1, 1); + DrawWithColor(clBtnText); + end + else + DrawWithColor(Canvas.Font.Color); + end + else begin + OffsetRect(BR, 1, 1); + DrawWithColor(clBtnHighlight); + OffsetRect(BR, -1, -1); + DrawWithColor(clBtnShadow); + end; + finally + Bmp.Free; + end; + end; + + procedure DrawDropdownArrow(R: TRect; Rotated: Boolean); + + procedure DrawWithColor(AColor: TColor); + var + X, Y: Integer; + P: array[0..2] of TPoint; + begin + X := (R.Left + R.Right) div 2; + Y := (R.Top + R.Bottom) div 2; + if not Rotated then begin + Dec(Y); + P[0].X := X-2; + P[0].Y := Y; + P[1].X := X+2; + P[1].Y := Y; + P[2].X := X; + P[2].Y := Y+2; + end + else begin + Dec(X); + P[0].X := X; + P[0].Y := Y+2; + P[1].X := X; + P[1].Y := Y-2; + P[2].X := X-2; + P[2].Y := Y; + end; + Canvas.Pen.Color := AColor; + Canvas.Brush.Color := AColor; + Canvas.Polygon(P); + end; + + begin + if not UseDisabledShadow then + DrawWithColor(Canvas.Font.Color) + else begin + OffsetRect(R, 1, 1); + DrawWithColor(clBtnHighlight); + OffsetRect(R, -1, -1); + DrawWithColor(clBtnShadow); + end; + end; + + function GetDitherBitmap: TBitmap; + begin + Result := AllocPatternBitmap(clBtnFace, clBtnHighlight); + Result.HandleType := bmDDB; { needed for Win95, or else brush is solid white } + end; + +const + EdgeStyles: array[Boolean] of UINT = (BDR_RAISEDINNER, BDR_SUNKENOUTER); + BlackCheckMarkPoints: array[0..6] of TPoint = ( + (X: -2; Y: -2), (X: 0; Y: 0), (X: 4; Y: -4), + (X: 4; Y: -3), (X: 0; Y: 1), (X: -2; Y: -1), + (X: -2; Y: -2)); + WhiteCheckMarkPoints: array[0..4] of TPoint = ( + (X: -3; Y: -2), (X: -3; Y: -1), (X: 0; Y: 2), + (X: 5; Y: -3), (X: 5; Y: -5)); +var + ToolbarStyle, ImageIsShown: Boolean; + R, RC, RD: TRect; + S: String; + ImgList: TCustomImageList; + I, X, Y: Integer; + BlackPoints: array[0..6] of TPoint; + WhitePoints: array[0..4] of TPoint; + DrawTextFlags: UINT; + LeftMargin: Integer; + TextMetrics: TTextMetric; +begin + ToolbarStyle := IsToolbarStyle; + ShowEnabled := Item.Enabled or View.Customizing; + HasArrow := (tbisSubmenu in Item.ItemStyle) and + ((tbisCombo in Item.ItemStyle) or (tboDropdownArrow in Item.EffectiveOptions)); + MenuCheckWidth := GetSystemMetrics(SM_CXMENUCHECK); + MenuCheckHeight := GetSystemMetrics(SM_CYMENUCHECK); + ImgList := GetImageList; + ImageIsShown := ImageShown and Assigned(ImgList); + LeftMargin := 0; + if not ToolbarStyle then begin + if Assigned(ImgList) then + LeftMargin := MulDiv(ImgList.Width + 3, ClientAreaRect.Bottom, ImgList.Height + 3) + else + LeftMargin := ClientAreaRect.Bottom; + end; + + { Border } + RC := ClientAreaRect; + if ToolbarStyle then begin + if HasArrow then begin + if tbisCombo in Item.ItemStyle then begin + Dec(RC.Right, tbDropdownComboMargin); + RD := RC; + Dec(RC.Right, tbDropdownComboArrowWidth - tbDropdownComboMargin); + RD.Left := RC.Right; + end + else begin + if View.Orientation <> tbvoVertical then + RD := Rect(RC.Right - tbDropdownArrowWidth - tbDropdownArrowMargin, 0, + RC.Right - tbDropdownArrowMargin, RC.Bottom) + else + RD := Rect(0, RC.Bottom - tbDropdownArrowWidth - tbDropdownArrowMargin, + RC.Right, RC.Bottom - tbDropdownArrowMargin); + end; + end + else + SetRectEmpty(RD); + if (IsSelected and ShowEnabled) or Item.Checked or + (csDesigning in Item.ComponentState) then begin + if not(tbisCombo in Item.ItemStyle) then + DrawEdge(Canvas.Handle, RC, EdgeStyles[IsPushed or Item.Checked], BF_RECT) + else begin + DrawEdge(Canvas.Handle, RC, EdgeStyles[(IsPushed and View.FCapture) or Item.Checked], BF_RECT); + if (IsSelected and ShowEnabled) or + (csDesigning in Item.ComponentState) then + DrawEdge(Canvas.Handle, RD, EdgeStyles[IsPushed and not View.FCapture], BF_RECT); + end; + end; + if HasArrow then begin + if not(tbisCombo in Item.ItemStyle) and IsPushed then + OffsetRect(RD, 1, 1); + DrawDropdownArrow(RD, not(tbisCombo in Item.ItemStyle) and + (View.Orientation = tbvoVertical)); + end; + InflateRect(RC, -1, -1); + if Item.Checked and not (IsSelected and ShowEnabled) then begin + Canvas.Brush.Bitmap := GetDitherBitmap; + Canvas.FillRect(RC); + Canvas.Brush.Style := bsClear; + end; + InflateRect(RC, -1, -1); + if Item.Checked or + ((IsSelected and IsPushed) and + (not(tbisCombo in Item.ItemStyle) or View.FCapture)) then + OffsetRect(RC, 1, 1); + if HasArrow and not(tbisCombo in Item.ItemStyle) then begin + if View.Orientation <> tbvoVertical then + Dec(RC.Right, tbDropdownArrowWidth) + else + Dec(RC.Bottom, tbDropdownArrowWidth); + end; + end + else begin + { On selected menu items, fill the background with the selected color. + Note: This assumes the brush color was not changed from the initial + value. } + if IsSelected then begin + R := RC; + if ImageIsShown or Item.Checked then + Inc(R.Left, LeftMargin + tbMenuImageTextSpace); + if (tbisCombo in Item.ItemStyle) and IsSelected and ShowEnabled then + Dec(R.Right, MenuCheckWidth); + Canvas.FillRect(R); + end; + end; + + { Adjust brush & font } + Canvas.Brush.Style := bsClear; + if tboDefault in Item.EffectiveOptions then + with Canvas.Font do Style := Style + [fsBold]; + GetTextMetrics(Canvas.Handle, TextMetrics); + + { Caption } + if CaptionShown then begin + S := GetCaptionText; + R := RC; + DrawTextFlags := GetDrawTextFlags; + if ToolbarStyle then begin + if ImageIsShown then begin + if not IsRotated and not(tboImageAboveCaption in Item.EffectiveOptions) then + Inc(R.Left, ImgList.Width + 1) + else + Inc(R.Top, ImgList.Height + 1); + end; + DrawItemCaption(Canvas, R, S, UseDisabledShadow, + DT_SINGLELINE or DT_CENTER or DT_VCENTER or DrawTextFlags) + end + else begin + Inc(R.Left, LeftMargin + tbMenuImageTextSpace + tbMenuLeftTextMargin); + { Like standard menus, shift the text up one pixel if the text height + is 4 pixels less than the total item height. This is done so underlined + characters aren't displayed too low. } + if (R.Bottom - R.Top) - (TextMetrics.tmHeight + TextMetrics.tmExternalLeading) = tbMenuVerticalMargin then + Dec(R.Bottom); + Inc(R.Top, TextMetrics.tmExternalLeading); + DrawItemCaption(Canvas, R, S, UseDisabledShadow, + DT_SINGLELINE or DT_LEFT or DT_VCENTER or DrawTextFlags); + end; + end; + + { Shortcut and/or submenu arrow (menus only) } + if not ToolbarStyle then begin + S := Item.GetShortCutText; + if S <> '' then begin + R := RC; + R.Left := R.Right - (R.Bottom - R.Top) - GetTextWidth(Canvas.Handle, S, True); + { Like standard menus, shift the text up one pixel if the text height + is 4 pixels less than the total item height. This is done so underlined + characters aren't displayed too low. } + if (R.Bottom - R.Top) - (TextMetrics.tmHeight + TextMetrics.tmExternalLeading) = tbMenuVerticalMargin then + Dec(R.Bottom); + Inc(R.Top, TextMetrics.tmExternalLeading); + DrawItemCaption(Canvas, R, S, UseDisabledShadow, + DT_SINGLELINE or DT_LEFT or DT_VCENTER or DT_NOPREFIX); + end; + if tbisSubmenu in Item.ItemStyle then begin + if tbisCombo in Item.ItemStyle then begin + R := RC; + R.Left := R.Right - MenuCheckWidth; + if IsSelected and ShowEnabled then + DrawEdge(Canvas.Handle, R, BDR_SUNKENOUTER, BF_RECT or BF_MIDDLE) + else begin + Dec(R.Left); + if not IsSelected then + DrawEdge(Canvas.Handle, R, EDGE_ETCHED, BF_LEFT) + else + DrawEdge(Canvas.Handle, R, BDR_SUNKENOUTER, BF_LEFT); + end; + end; + DrawSubmenuArrow; + end; + end; + + { Image, or check box } + if ImageIsShown or (not ToolbarStyle and Item.Checked) then begin + R := RC; + if ToolbarStyle then begin + if not IsRotated and not(tboImageAboveCaption in Item.EffectiveOptions) then + R.Right := R.Left + ImgList.Width + 2 + else + R.Bottom := R.Top + ImgList.Height + 2; + end + else begin + R.Right := R.Left + LeftMargin; + if (IsSelected and ShowEnabled) or Item.Checked then + DrawEdge(Canvas.Handle, R, EdgeStyles[Item.Checked], BF_RECT or BF_MIDDLE); + if Item.Checked and not IsSelected then begin + InflateRect(R, -1, -1); + Canvas.Brush.Bitmap := GetDitherBitmap; + Canvas.FillRect(R); + Canvas.Brush.Style := bsClear; + InflateRect(R, 1, 1); + end; + if Item.Checked then + OffsetRect(R, 1, 1); + end; + if ImageIsShown then begin + X := R.Left + ((R.Right - R.Left) - ImgList.Width) div 2; + Y := R.Top + ((R.Bottom - R.Top) - ImgList.Height) div 2; + if ImgList is TTBCustomImageList then + TTBCustomImageList(ImgList).DrawState(Canvas, X, Y, Item.ImageIndex, + ShowEnabled, IsSelected, Item.Checked) + else + ImgList.Draw(Canvas, X, Y, Item.ImageIndex, ShowEnabled); + end + else + if not ToolbarStyle and Item.Checked then begin + { Draw default check mark or radio button image when user hasn't + specified their own } + X := (R.Left + R.Right) div 2; + Y := (R.Top + R.Bottom) div 2; + if Item.RadioItem then begin + Canvas.Pen.Color := clBtnText; + Canvas.Brush.Color := clBtnText; + Canvas.RoundRect(X-3, Y-3, X+2, Y+2, 2, 2); + Canvas.Pen.Color := clBtnHighlight; + Canvas.Brush.Style := bsClear; + Canvas.RoundRect(X-4, Y-4, X+3, Y+3, 6, 6); + end + else begin + Dec(X, 2); + Inc(Y); + for I := Low(BlackPoints) to High(BlackPoints) do begin + BlackPoints[I].X := X + BlackCheckMarkPoints[I].X; + BlackPoints[I].Y := Y + BlackCheckMarkPoints[I].Y; + end; + for I := Low(WhitePoints) to High(WhitePoints) do begin + WhitePoints[I].X := X + WhiteCheckMarkPoints[I].X; + WhitePoints[I].Y := Y + WhiteCheckMarkPoints[I].Y; + end; + Canvas.Pen.Color := clBtnText; + Polyline(Canvas.Handle, BlackPoints, Length(BlackPoints)); + Canvas.Pen.Color := clBtnHighlight; + Polyline(Canvas.Handle, WhitePoints, Length(WhitePoints)); + end; + end; + end; +end; + +procedure TTBItemViewer.GetCursor(const Pt: TPoint; var ACursor: HCURSOR); +begin +end; + +function TTBItemViewer.GetIndex: Integer; +begin + Result := View.IndexOf(Self); +end; + +function TTBItemViewer.IsToolbarSize: Boolean; +begin + Result := View.FIsToolbar or (tboToolbarSize in Item.FEffectiveOptions); +end; + +function TTBItemViewer.IsToolbarStyle: Boolean; +begin + Result := View.FIsToolbar or (tboToolbarStyle in Item.FEffectiveOptions); +end; + +function TTBItemViewer.IsPtInButtonPart(X, Y: Integer): Boolean; +var + W: Integer; +begin + Result := not(tbisSubmenu in Item.ItemStyle); + if tbisCombo in Item.ItemStyle then begin + if IsToolbarStyle then + W := tbDropdownComboArrowWidth + else + W := GetSystemMetrics(SM_CXMENUCHECK); + Result := X < (BoundsRect.Right - BoundsRect.Left) - W; + end; +end; + +procedure TTBItemViewer.MouseDown(Shift: TShiftState; X, Y: Integer; + var MouseDownOnMenu: Boolean); + + procedure HandleDefaultDoubleClick(const View: TTBView); + { Looks for a tboDefault item in View and ends the modal loop if it finds + one. } + var + I: Integer; + Viewer: TTBItemViewer; + Item: TTBCustomItem; + begin + for I := 0 to View.FViewers.Count-1 do begin + Viewer := View.Viewers[I]; + Item := Viewer.Item; + if (Viewer.Show or Viewer.Clipped) and (tboDefault in Item.EffectiveOptions) and + (tbisSelectable in Item.ItemStyle) and Item.Enabled and Item.Visible then begin + Viewer.Execute(True); + Break; + end; + end; + end; + +var + WasAlreadyOpen: Boolean; +begin + if not Item.Enabled then begin + if (View.FParentView = nil) and not View.FIsPopup then + View.EndModal; + Exit; + end; + if IsPtInButtonPart(X, Y) then begin + if IsToolbarStyle then begin + View.CancelChildPopups; + View.SetCapture; + View.Invalidate(Self); + end; + end + else begin + WasAlreadyOpen := (View.FOpenViewer = Self); + if View.OpenChildPopup(False) then begin + if WasAlreadyOpen and ((View.FParentView = nil) and not View.FIsPopup) then + MouseDownOnMenu := True; + if (ssDouble in Shift) and not(tbisCombo in Item.ItemStyle) then + HandleDefaultDoubleClick(View.FOpenViewerView); + end; + end; +end; + +procedure TTBItemViewer.MouseMove(X, Y: Integer); +begin +end; + +procedure TTBItemViewer.MouseUp(X, Y: Integer; MouseWasDownOnMenu: Boolean); +var + HadCapture, IsToolbarItem: Boolean; +begin + HadCapture := View.FCapture; + View.CancelCapture; + IsToolbarItem := (View.FParentView = nil) and not View.FIsPopup; + if not View.FMouseOverSelected or not Item.Enabled or + (tbisClicksTransparent in Item.ItemStyle) then begin + if IsToolbarItem then + View.EndModal; + Exit; + end; + if (tbisSubmenu in Item.ItemStyle) and not IsPtInButtonPart(X, Y) then begin + if IsToolbarItem and MouseWasDownOnMenu then + View.EndModal; + end + else begin + { it's a 'normal' item } + if not IsToolbarStyle or HadCapture then + Execute(True); + end; +end; + +procedure TTBItemViewer.MouseWheel(WheelDelta, X, Y: Integer); +begin +end; + +procedure TTBItemViewer.LosingCapture; +begin + View.Invalidate(Self); +end; + +procedure TTBItemViewer.Entering; +begin + if Assigned(Item.FOnSelect) then + Item.FOnSelect(Item, Self, True); +end; + +procedure TTBItemViewer.Leaving; +begin + if Assigned(Item.FOnSelect) then + Item.FOnSelect(Item, Self, False); +end; + +procedure TTBItemViewer.KeyDown(var Key: Word; Shift: TShiftState); +begin +end; + +function TTBItemViewer.ScreenToClient(const P: TPoint): TPoint; +begin + Result := View.FWindow.ScreenToClient(P); + Dec(Result.X, BoundsRect.Left); + Dec(Result.Y, BoundsRect.Top); +end; + +function TTBItemViewer.UsesSameWidth: Boolean; +{ If UsesSameWidth returns True, the item viewer's width will be expanded to + match the widest item viewer on the same view whose UsesSameWidth method + also returns True. } +begin + Result := (tboImageAboveCaption in Item.FEffectiveOptions) and + (tboSameWidth in Item.FEffectiveOptions) and IsToolbarSize; +end; + +function TTBItemViewer.DoExecute: Boolean; +{ Low-level 'execute' handler. Returns True if the caller should call + GivePriority on the viewer (normally, if the 'execute' operation was a + success and the modal loop is ending). } +begin + View.EndModalWithClick(Self); + Result := True; +end; + +procedure TTBItemViewer.Execute(AGivePriority: Boolean); +{ Calls DoExecute and, if applicable, View.GivePriority. Note that it is up to + the caller to check the viewer's visibility and enabled state. } +begin + if DoExecute and AGivePriority then + View.GivePriority(Self); +end; + +function TTBItemViewer.GetAccRole: Integer; +{ Returns the MSAA "role" of the viewer. } +const + { Constants from OleAcc.h } + ROLE_SYSTEM_CLIENT = $a; + ROLE_SYSTEM_MENUITEM = $c; + ROLE_SYSTEM_SEPARATOR = $15; + ROLE_SYSTEM_PUSHBUTTON = $2b; + ROLE_SYSTEM_BUTTONMENU = $39; +begin + if Item is TTBControlItem then + Result := ROLE_SYSTEM_CLIENT + else if tbisSeparator in Item.ItemStyle then + Result := ROLE_SYSTEM_SEPARATOR + else if View.IsPopup or (vsMenuBar in View.Style) then + Result := ROLE_SYSTEM_MENUITEM + else if tbisSubmenu in Item.ItemStyle then + Result := ROLE_SYSTEM_BUTTONMENU + else + Result := ROLE_SYSTEM_PUSHBUTTON; +end; + +function TTBItemViewer.GetAccValue(var Value: WideString): Boolean; +{ Gets the MSAA "value" text of the viewer. Returns True if something was + assigned to Value, or False if the viewer does not possess a "value". } +begin + Result := False; +end; + + +{ TTBView } + +constructor TTBView.Create(AOwner: TComponent; AParentView: TTBView; + AParentItem: TTBCustomItem; AWindow: TWinControl; + AIsToolbar, ACustomizing, AUsePriorityList: Boolean); +begin + {$IFDEF CLR} + { TB2Acc's IAccessible implementations must be called from the same thread + that created the view, so verify that the program has [STAThread] } + CheckThreadingModel(System.Threading.ApartmentState.STA); + {$ENDIF} + inherited Create(AOwner); + FViewers := TList.Create; + FBackgroundColor := clDefault; + FCustomizing := ACustomizing; + FIsPopup := not AIsToolbar; + FIsToolbar := AIsToolbar; + FNewViewersGetHighestPriority := True; + FParentView := AParentView; + FParentItem := AParentItem; + if Assigned(FParentItem) then begin + //FIsToolbar := FIsToolbar or FParentItem.FDisplayAsToolbar; + FParentItem.RegisterNotification(LinkNotification); + FParentItem.FreeNotification(Self); + end; + FUsePriorityList := AUsePriorityList; + FWindow := AWindow; + UpdateCurParentItem; +end; + +destructor TTBView.Destroy; +begin + CloseChildPopups; + if Assigned(FAccObjectInstance) then begin + FAccObjectInstance.ClientIsDestroying; + { Get rid of our own reference to FAccObjectInstance. Normally the + reference count will be now be zero and FAccObjectInstance will be + freed, unless MSAA still holds a reference. } + {$IFNDEF CLR} + FAccObjectInstance._Release; + {$ENDIF} + FAccObjectInstance := nil; + end; + { If parent view is a toolbar, invalidate the open item so that it's + redrawn back in the "up" position } + if Assigned(ParentView) and ParentView.FIsToolbar then begin + Include(ParentView.FState, vsNoAnimation); + if Assigned(ParentView.FOpenViewer) then + ParentView.Invalidate(ParentView.FOpenViewer); + end; + if Assigned(FCurParentItem) then + FCurParentItem.UnregisterNotification(ItemNotification); + if Assigned(FParentItem) then + FParentItem.UnregisterNotification(LinkNotification); + inherited; + FPriorityList.Free; + FreeViewers; + FreeAndNil(FViewers); + { Now that we're destroyed, "focus" the parent view } + if Assigned(FParentView) then + FParentView.NotifyFocusEvent; +end; + +function TTBView.GetAccObject: TTBBaseAccObject; +begin + if FAccObjectInstance = nil then begin + if not InitializeOleAcc then begin + Result := nil; + Exit; + end; + FAccObjectInstance := TTBViewAccObject.Create(Self); + { Strictly as an optimization, take a reference for ourself and keep it + for the lifetime of the view. (Destroy calls _Release.) } + {$IFNDEF CLR} + FAccObjectInstance._AddRef; + {$ENDIF} + end; + Result := FAccObjectInstance; +end; + +function TTBView.HandleWMGetObject(var Message: TMessage): Boolean; +begin + { Note: In a 64-bit build, object identifiers can come in either + sign-extended or zero-extended from 32 to 64 bits. Clip to 32 bits here + to ensure we accept both forms. } + if (ClipToLongint(Message.LParam) = Longint(OBJID_CLIENT)) and InitializeOleAcc then begin + Message.Result := LresultFromObjectFunc( + {$IFNDEF CLR} ITBAccessible {$ELSE} TypeOf(ITBAccessible).GUID {$ENDIF}, + Message.WParam, GetAccObject); + Result := True; + end + else + Result := False; +end; + +procedure TTBView.UpdateCurParentItem; +var + Value: TTBCustomItem; +begin + Value := ItemContainingItems(FParentItem); + if FCurParentItem <> Value then begin + CloseChildPopups; + if Assigned(FCurParentItem) then + FCurParentItem.UnregisterNotification(ItemNotification); + FCurParentItem := Value; + if Assigned(Value) then + Value.RegisterNotification(ItemNotification); + RecreateAllViewers; + if Assigned(Value) and not(csDesigning in Value.ComponentState) then + InitiateActions; + end; +end; + +procedure TTBView.InitiateActions; +var + I: Integer; +begin + { Use a 'while' instead of a 'for' since an InitiateAction implementation + may add/delete items } + I := 0; + while I < FViewers.Count do begin + Viewers[I].Item.InitiateAction; + Inc(I); + end; +end; + +procedure TTBView.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited; + if Operation = opRemove then begin + if AComponent = FParentItem then begin + FParentItem := nil; + UpdateCurParentItem; + if Assigned(FParentView) then + FParentView.CloseChildPopups; + end + else if AComponent = FOpenViewerWindow then begin + FOpenViewerWindow := nil; + FOpenViewerView := nil; + FOpenViewer := nil; + end + else if AComponent = FChevronParentView then + FChevronParentView := nil; + end +end; + +function TTBView.ContainsView(AView: TTBView): Boolean; +begin + while Assigned(AView) and (AView <> Self) do + AView := AView.FParentView; + Result := Assigned(AView); +end; + +function TTBView.GetRootView: TTBView; +begin + Result := Self; + while Assigned(Result.FParentView) do + Result := Result.FParentView; +end; + +function TTBView.GetParentToolbarView: TTBView; +begin + Result := Self; + while Assigned(Result) and not Result.FIsToolbar do + Result := Result.FParentView; +end; + +function TTBView.GetViewer(Index: Integer): TTBItemViewer; +begin + if (Index < 0) or (Index >= FViewers.Count) then begin + TTBCustomItem.IndexError; + Result := nil; + Exit; + end; + Result := TTBItemViewer(FViewers.List[Index]); +end; + +function TTBView.GetViewerCount: Integer; +begin + Result := FViewers.Count; +end; + +procedure TTBView.FreeViewers; +var + I: Integer; + Viewer: TTBItemViewer; +begin + if Assigned(FViewers) then begin + for I := FViewers.Count-1 downto 0 do begin + Viewer := Viewers[I]; + FViewers.Delete(I); + Viewer.Free; + end; + end; +end; + +procedure TTBView.InvalidatePositions; +begin + if FValidated then begin + FValidated := False; + if Assigned(FWindow) and FWindow.HandleAllocated then + InvalidateRect(FWindow.Handle, nil, True); + end; +end; + +procedure TTBView.ValidatePositions; +begin + if not FValidated then + UpdatePositions; +end; + +procedure TTBView.TryValidatePositions; +begin + if (FUpdating = 0) and + (not Assigned(FParentItem) or not(csLoading in FParentItem.ComponentState)) and + (not Assigned(FParentItem.Owner) or not(csLoading in FParentItem.Owner.ComponentState)) then + ValidatePositions; +end; + +(*procedure TTBView.TryRevalidatePositions; +begin + if FValidated then begin + if FUpdating = 0 then begin + FreePositions; + UpdatePositions; + end + else + InvalidatePositions; + end; +end;*) + +function TTBView.Find(Item: TTBCustomItem): TTBItemViewer; +var + I: Integer; +begin + for I := 0 to FViewers.Count-1 do + if Viewers[I].Item = Item then begin + Result := Viewers[I]; + Exit; + end; + raise ETBItemError.Create(STBViewerNotFound); +end; + +function TTBView.IndexOf(AViewer: TTBItemViewer): Integer; +var + I: Integer; +begin + if Assigned(AViewer) then + for I := 0 to FViewers.Count-1 do + if FViewers.List[I] = AViewer then begin + Result := I; + Exit; + end; + Result := -1; +end; + +procedure TTBView.DeletingViewer(Viewer: TTBItemViewer); +begin + if FSelected = Viewer then + FSelected := nil; + if FOpenViewer = Viewer then + CloseChildPopups; +end; + +procedure TTBView.RecreateItemViewer(const I: Integer); +var + OldViewer, NewViewer: TTBItemViewer; + J: Integer; +begin + OldViewer := Viewers[I]; + DeletingViewer(OldViewer); + NewViewer := OldViewer.Item.GetItemViewerClass(Self).Create(Self, + OldViewer.Item, OldViewer.FGroupLevel); + FViewers[I] := NewViewer; + if Assigned(FPriorityList) then begin + J := FPriorityList.IndexOf(OldViewer); + if J <> -1 then + FPriorityList[J] := NewViewer; + end; + OldViewer.Free; +end; + +function TTBView.InsertItemViewers(const NewIndex: Integer; + const AItem: TTBCustomItem; const AGroupLevel: Integer; + const AddToPriorityList, TopOfPriorityList: Boolean): Integer; +var + NewViewer: TTBItemViewer; + LinkItem: TTBCustomItem; + I: Integer; +begin + if AGroupLevel > MaxGroupLevel then begin + Result := 0; + Exit; + end; + + FViewers.Expand; + NewViewer := AItem.GetItemViewerClass(Self).Create(Self, AItem, + AGroupLevel); + FViewers.Insert(NewIndex, NewViewer); + if AddToPriorityList and FUsePriorityList then begin + if not TopOfPriorityList then + AddToList(FPriorityList, NewViewer) + else + { When new items are inserted programmatically at run-time, place + them at the top of FPriorityList } + AddToFrontOfList(FPriorityList, NewViewer); + end; + Result := 1; + + { If a new group item is being inserted, insert all its child items too } + if not FCustomizing and (tbisEmbeddedGroup in AItem.ItemStyle) then begin + LinkItem := ItemContainingItems(AItem); + for I := 0 to LinkItem.Count-1 do begin + Inc(Result, InsertItemViewers(NewIndex + Result, LinkItem.Items[I], + AGroupLevel + 1, AddToPriorityList, TopOfPriorityList)); + end; + end; +end; + +procedure TTBView.ItemNotification(Ancestor: TTBCustomItem; Relayed: Boolean; + Action: TTBItemChangedAction; Index: Integer; Item: TTBCustomItem); + + procedure ItemInserted; + var + NewLevel, Start, InsertPoint, Last: Integer; + GroupItem, NextItem: TTBCustomItem; + Found, SearchAgain: Boolean; + begin + InvalidatePositions; + NewLevel := 0; + Start := 0; + if Ancestor = FCurParentItem then + InsertPoint := FViewers.Count + else begin + { Ancestor <> FCurParentItem, so apparently an item has been inserted + inside a group item } + repeat + Found := False; + while Start < FViewers.Count do begin + GroupItem := Viewers[Start].Item; + if (tbisEmbeddedGroup in GroupItem.ItemStyle) and (GroupItem = Ancestor) then begin + NewLevel := Viewers[Start].FGroupLevel + 1; + Inc(Start); + Found := True; + Break; + end; + Inc(Start); + end; + if not Found then + { Couldn't find Ancestor; it shouldn't get here } + Exit; + InsertPoint := Start; + SearchAgain := False; + while (InsertPoint < FViewers.Count) and + (Viewers[InsertPoint].FGroupLevel >= NewLevel) do begin + if (Viewers[InsertPoint].Item = Item) and + (Viewers[InsertPoint].FGroupLevel = NewLevel) then begin + { If the item we were going to insert already exists, then there + must be multiple instances of the same group item. This can + happen when are two group items on the same toolbar each + linking to the same submenu item, with the submenu item + containing a group item of its own, and an item is inserted + inside that. } + SearchAgain := True; + Break; + end; + Inc(InsertPoint); + end; + until not SearchAgain; + end; + if InsertPoint = FViewers.Count then begin + { Don't add items after the chevron or MDI buttons item } + Dec(InsertPoint, FInternalViewersAtEnd); + if InsertPoint < 0 then + InsertPoint := 0; { just in case? } + end; + { If the new item wasn't placed at the end, adjust InsertPoint accordingly } + if Index < Item.Parent.Count-1 then begin + Last := InsertPoint; + InsertPoint := Start; + NextItem := Item.Parent.Items[Index+1]; + while (InsertPoint < Last) and + ((Viewers[InsertPoint].Item <> NextItem) or + (Viewers[InsertPoint].FGroupLevel <> NewLevel)) do + Inc(InsertPoint); + end; + InsertItemViewers(InsertPoint, Item, NewLevel, True, + not(csLoading in Item.ComponentState) and FNewViewersGetHighestPriority); + end; + + procedure ItemDeleting; + + procedure DeleteItem(DeleteIndex: Integer); + var + Viewer: TTBItemViewer; + begin + Viewer := Viewers[DeleteIndex]; + DeletingViewer(Viewer); + RemoveFromList(FPriorityList, Viewer); + FreeAndNil(Viewer); + FViewers.Delete(DeleteIndex); + end; + + var + I: Integer; + DeleteLevel: Integer; + begin + InvalidatePositions; + I := 0; + DeleteLevel := 0; + while I < FViewers.Count do begin + if DeleteLevel > 0 then begin + if Viewers[I].FGroupLevel >= DeleteLevel then begin + DeleteItem(I); + Continue; + end + else + DeleteLevel := 0; + end; + if Viewers[I].Item = Item then begin + { Delete the item, and any group item children afterward } + DeleteLevel := Viewers[I].FGroupLevel + 1; + DeleteItem(I); + Continue; + end; + Inc(I); + end; + end; + +var + I: Integer; +begin + case Action of + tbicInserted: ItemInserted; + tbicDeleting: ItemDeleting; + tbicSubitemsChanged: begin + { If Relayed=True, LinkSubitems must have changed on a child group + item. Currently there isn't any optimized way of handling this + situation; just recreate all viewers. } + if Relayed then + RecreateAllViewers; + end; + tbicSubitemsBeginUpdate: BeginUpdate; + tbicSubitemsEndUpdate: EndUpdate; + tbicInvalidate: begin + for I := 0 to FViewers.Count-1 do + if Viewers[I].Item = Item then + Invalidate(Viewers[I]); + end; + tbicInvalidateAndResize: InvalidatePositions; + tbicRecreateItemViewers: begin + InvalidatePositions; + for I := 0 to FViewers.Count-1 do + if Viewers[I].Item = Item then + RecreateItemViewer(I); + end; + tbicSubMenuImagesChanged: ImagesChanged; + else + { Prevent TryValidatePositions from being called below on Actions other than + those listed above. Currently there are no other Actions, but for forward + compatibility, we should ignore unknown Actions completely. } + Exit; + end; + TryValidatePositions; +end; + +procedure TTBView.LinkNotification(Ancestor: TTBCustomItem; Relayed: Boolean; + Action: TTBItemChangedAction; Index: Integer; Item: TTBCustomItem); +{ This notification procedure watches for tbicSubitemsChanged notifications + from FParentItem } +begin + case Action of + tbicSubitemsChanged: begin + { LinkSubitems may have changed on FParentItem, e.g. on the root item + of a toolbar, so see if FCurParentItem needs updating } + UpdateCurParentItem; + end; + tbicSubMenuImagesChanged: begin + { In case the images were inherited from the actual parent instead of + the linked parent... } + if FParentItem <> FCurParentItem then + ImagesChanged; + end; + end; +end; + +procedure TTBView.ImagesChanged; +begin + InvalidatePositions; + TryValidatePositions; + if Assigned(FOpenViewerView) then + FOpenViewerView.ImagesChanged; +end; + +procedure TTBView.GivePriority(AViewer: TTBItemViewer); +{ Move item to top of priority list. Rearranges items if necessary. } +var + I: Integer; +begin + if Assigned(FChevronParentView) then begin + I := AViewer.Index + FChevronParentView.FInternalViewersAtFront; + if I < FChevronParentView.FViewers.Count then { range check just in case } + FChevronParentView.GivePriority(FChevronParentView.Viewers[I]); + Exit; + end; + if Assigned(FPriorityList) then begin + I := FPriorityList.IndexOf(AViewer); + if I <> -1 then begin + FPriorityList.Move(I, 0); + if not FValidated or AViewer.OffEdge then + UpdatePositions; + end; + end; + { Call GivePriority on parent view, so that if an item on a submenu is + clicked, the parent item of the submenu gets priority. } + if Assigned(FParentView) and Assigned(FParentView.FOpenViewer) then + FParentView.GivePriority(FParentView.FOpenViewer); +end; + +function TTBView.HighestPriorityViewer: TTBItemViewer; +{ Returns index of first visible, non-separator item at top of priority list, + or -1 if there are no items found } +var + I: Integer; + J: TTBItemViewer; +begin + ValidatePositions; + Result := nil; + if Assigned(FPriorityList) then begin + for I := 0 to FPriorityList.Count-1 do begin + J := TTBItemViewer(FPriorityList[I]); + if J.Show and not(tbisSeparator in J.Item.ItemStyle) then begin + Result := J; + Break; + end; + end; + end + else begin + for I := 0 to FViewers.Count-1 do begin + J := Viewers[I]; + if J.Show and not(tbisSeparator in J.Item.ItemStyle) then begin + Result := J; + Break; + end; + end; + end; +end; + +procedure TTBView.StartTimer(const ATimer: TTBViewTimerID; + const Interval: Integer); +{ Starts a timer. Stops any previously set timer of the same ID first. + Note: WM_TIMER messages generated by timers set by the method are handled + in PopupMessageLoop. } +begin + StopTimer(ATimer); + if (FWindow is TTBPopupWindow) and FWindow.HandleAllocated then begin + SetTimer(FWindow.Handle, ViewTimerBaseID + Ord(ATimer), Interval, nil); + Include(FActiveTimers, ATimer); + end; +end; + +procedure TTBView.StopAllTimers; +var + I: TTBViewTimerID; +begin + for I := Low(I) to High(I) do + StopTimer(I); +end; + +procedure TTBView.StopTimer(const ATimer: TTBViewTimerID); +begin + if ATimer in FActiveTimers then begin + if (FWindow is TTBPopupWindow) and FWindow.HandleAllocated then + KillTimer(FWindow.Handle, ViewTimerBaseID + Ord(ATimer)); + Exclude(FActiveTimers, ATimer); + end; +end; + +function TTBView.OpenChildPopup(const SelectFirstItem: Boolean): Boolean; +var + Item: TTBCustomItem; +begin + StopTimer(tiClose); + StopTimer(tiOpen); + if FSelected <> FOpenViewer then begin + CloseChildPopups; + if Assigned(FSelected) then begin + Item := FSelected.Item; + if Item.Enabled and (tbisSubmenu in Item.ItemStyle) then + Item.CreatePopup(Self, FSelected, not FIsToolbar, SelectFirstItem, + False, Point(0, 0), tbpaLeft); + end; + end; + Result := Assigned(FOpenViewer); +end; + +procedure TTBView.CloseChildPopups; +begin + if Assigned(FOpenViewerView) then + FOpenViewerView.CloseChildPopups; + StopTimer(tiClose); + FOpenViewerWindow.Free; + FOpenViewerWindow := nil; + FOpenViewerView := nil; + FOpenViewer := nil; +end; + +procedure TTBView.CancelChildPopups; +begin + if FIsToolbar then + Exclude(FState, vsDropDownMenus); + CloseChildPopups; +end; + +function TTBView.ViewerFromPoint(const P: TPoint): TTBItemViewer; +var + I: Integer; +begin + ValidatePositions; + for I := 0 to FViewers.Count-1 do begin + if Viewers[I].Show and + PtInRect(Viewers[I].BoundsRect, P) then begin + Result := Viewers[I]; + Exit; + end; + end; + Result := nil; +end; + +procedure TTBView.NotifyFocusEvent; +{ Notifies Active Accessibility of a change in "focus". Has no effect if the + view or the root view lacks the vsModal state, or if the modal loop is + ending (EndModal* was called). } +var + I, ChildID, J: Integer; +begin + { Note: We don't notify about windows not yet shown (e.g. a popup menu that + is still initializing) because that would probably confuse screen readers. + Also allocating a window handle at this point *might* not be a good idea. } + if (vsModal in FState) and (vsModal in GetRootView.FState) and + not IsModalEnding and + FWindow.HandleAllocated and IsWindowVisible(FWindow.Handle) then begin + if Assigned(FSelected) and FSelected.IsAccessible then + I := IndexOf(FSelected) + else + I := -1; + if (I < 0) and Assigned(FParentView) then begin + { If we have no selected item, report the the selected item on the parent + view as having the "focus". + Note: With standard menus, when you go from having a selection to no + selection on a submenu, it sends two focus events - first with the + client window as having the focus, then with the parent item. I + figure that's probably a bug, so I don't try to emulate that behavior + here. } + FParentView.NotifyFocusEvent; + end + else begin + if I >= 0 then begin + { Convert viewer index into a one-based child index. + (TTBViewAccObject.get_accChild does the inverse.) } + ChildID := 1; + for J := 0 to I-1 do + if Viewers[J].IsAccessible then + Inc(ChildID); + end + else begin + { If there is no (accessible) selection and no parent view, report + the client window itself as being "focused". This is what happens + when a standard context menu has no selection. } + ChildID := CHILDID_SELF; + end; + CallNotifyWinEvent(EVENT_OBJECT_FOCUS, FWindow.Handle, OBJID_CLIENT, ChildID); + end; + end; +end; + +procedure TTBView.SetSelected(Value: TTBItemViewer); +begin + Select(Value, False); +end; + +procedure TTBView.Select(Value: TTBItemViewer; ViaMouse: Boolean); +{ Sets the current selection. + When the selection is changing it will also, if necessary, open/close child + popups. How exactly this works depends on the setting of ViaMouse. If + ViaMouse is True it will delay the opening/closing of popups using timers. } +var + OldSelected: TTBItemViewer; + NewMouseOverSelected: Boolean; + P: TPoint; +begin + OldSelected := FSelected; + if Value <> OldSelected then begin + { If there's a new selection and the parent item on the parent view + isn't currently selected, select it. Also stop any timer running on + the parent view. } + if Assigned(Value) and Assigned(FParentView) and + Assigned(FParentView.FOpenViewer) and + (FParentView.FSelected <> FParentView.FOpenViewer) then begin + FParentView.Selected := FParentView.FOpenViewer; + FParentView.StopTimer(tiClose); + FParentView.StopTimer(tiOpen); + end; + + { Handle automatic closing of child popups } + if vsModal in FState then begin + { If the view is a toolbar, or if the new selection didn't come from + the mouse, close child popups immediately } + if FIsToolbar or not ViaMouse then begin + { Always stop any close timer because CloseChildPopups may not be + called below } + StopTimer(tiClose); + if Value <> FOpenViewer then + { ^ But don't close if selection is returning to the open item. + Needed for the "FParentView.Selected := FParentView.FOpenViewer" + line above to work. } + CloseChildPopups; + end + else begin + { Otherwise, delay-close any child popup } + if Assigned(FOpenViewerView) and not(tiClose in FActiveTimers) then + StartTimer(tiClose, GetMenuShowDelay); + end; + end; + + CancelCapture; + if Assigned(OldSelected) then + OldSelected.Leaving; + FSelected := Value; + FSelectedViaMouse := ViaMouse; + end; + + NewMouseOverSelected := False; + if Assigned(Value) and Assigned(FWindow) then begin + P := GetMessagePosAsPoint; + if FindDragTarget(P, True) = FWindow then begin + P := FWindow.ScreenToClient(P); + NewMouseOverSelected := (ViewerFromPoint(P) = Value); + if NewMouseOverSelected and FCapture and + not Value.IsPtInButtonPart(P.X - Value.BoundsRect.Left, + P.Y - Value.BoundsRect.Top) then + NewMouseOverSelected := False; + end; + end; + + if Value <> OldSelected then begin + FMouseOverSelected := NewMouseOverSelected; + if Assigned(OldSelected) and (tbisRedrawOnSelChange in OldSelected.Item.ItemStyle) then + Invalidate(OldSelected); + if Assigned(Value) then begin + if tbisRedrawOnSelChange in Value.Item.ItemStyle then + Invalidate(Value); + Value.Entering; + end; + NotifyFocusEvent; + + { Handle automatic opening of a child popup } + if vsModal in FState then begin + { If the view is a toolbar, immediately open any child popup } + if FIsToolbar then begin + if Assigned(Value) then begin + if ViaMouse and Assigned(FParentView) then begin + { On chevron popups, always drop down menus when mouse passes + over them, like Office 2000 } + Include(FState, vsDropDownMenus); + end; + if (vsDropDownMenus in FState) and + (ViaMouse or not(tbisNoAutoOpen in Value.Item.ItemStyle)) then + OpenChildPopup(not ViaMouse); + end; + end + else begin + { Otherwise, delay-open any child popup if the selection came from + the mouse } + StopTimer(tiOpen); + if ViaMouse and Assigned(Value) and (tbisSubmenu in Value.Item.ItemStyle) then + StartTimer(tiOpen, GetMenuShowDelay); + end; + end; + end + else if FMouseOverSelected <> NewMouseOverSelected then begin + FMouseOverSelected := NewMouseOverSelected; + if Assigned(Value) and FCapture and (tbisRedrawOnMouseOverChange in Value.Item.ItemStyle) then + Invalidate(Value); + end; +end; + +procedure TTBView.UpdateSelection(const P: TPoint; const AllowNewSelection: Boolean); +{ Called in response to a mouse movement, this method updates the current + selection, updates the vsMouseInWindow view state, and enables/disables + scroll timers. } + + function IsPtInScrollArrow(ADownArrow: Boolean): Boolean; + var + P2: TPoint; + R: TRect; + begin + Result := False; + if (vsModal in FState) and (vsMouseInWindow in FState) and not FCapture and + (P.X <> Low(Integer)) then begin + P2 := FWindow.ScreenToClient(P); + R := FWindow.ClientRect; + if PtInRect(R, P2) then begin + if ADownArrow then + Result := FShowDownArrow and (P2.Y >= R.Bottom - tbMenuScrollArrowHeight) + else + Result := FShowUpArrow and (P2.Y < tbMenuScrollArrowHeight); + end; + end; + end; + +var + NewSelected, ViewerAtPoint: TTBItemViewer; + P2: TPoint; + MouseWasInWindow: Boolean; +begin + ValidatePositions; + + if FCapture then begin + { If we have the capture, don't allow the selection to change. And always + set vsMouseInWindow so that if the mouse is released outside the window, + the "remove the selection" code below will be reached the next time + UpdateSelection is called. } + NewSelected := FSelected; + Include(FState, vsMouseInWindow); + end + else begin + { If modal, default to keeping the existing selection } + if vsModal in FState then + NewSelected := FSelected + else + NewSelected := nil; + + { Is the mouse inside the window? } + MouseWasInWindow := vsMouseInWindow in FState; + if (P.X <> Low(Integer)) and Assigned(FWindow) and (FindDragTarget(P, True) = FWindow) then begin + { If we're a popup window and the mouse is inside, default to no selection } + if FIsPopup then + NewSelected := nil; + Include(FState, vsMouseInWindow); + if AllowNewSelection or Assigned(FSelected) then begin + P2 := FWindow.ScreenToClient(P); + ViewerAtPoint := ViewerFromPoint(P2); + if Assigned(ViewerAtPoint) then + NewSelected := ViewerAtPoint; + end; + end + else begin + Exclude(FState, vsMouseInWindow); + { If we're a popup window and the mouse just moved outside the window + while no submenu was open or a non-submenu-displaying item was + selected, remove the selection } + if FIsPopup and Assigned(NewSelected) and MouseWasInWindow and + (not Assigned(FOpenViewerView) or not(tbisSubmenu in NewSelected.Item.ItemStyle)) then + NewSelected := nil; + end; + end; + + { Now we set the new Selected value } + Select(NewSelected, True); + + { Update scroll arrow timers } + if IsPtInScrollArrow(False) then begin + StopTimer(tiScrollDown); + if not(tiScrollUp in FActiveTimers) then + StartTimer(tiScrollUp, 100); + end + else if IsPtInScrollArrow(True) then begin + StopTimer(tiScrollUp); + if not(tiScrollDown in FActiveTimers) then + StartTimer(tiScrollDown, 100); + end + else begin + StopTimer(tiScrollUp); + StopTimer(tiScrollDown); + end; +end; + +procedure TTBView.RecreateAllViewers; +var + Item: TTBCustomItem; + I: Integer; +begin + { Since the FViewers list is being rebuilt, FOpenViewer and FSelected + will no longer be valid, so ensure they're set to nil. } + CloseChildPopups; + Selected := nil; + + InvalidatePositions; + + FreeAndNil(FPriorityList); + FreeViewers; + FInternalViewersAtFront := 0; + FInternalViewersAtEnd := 0; + + { MDI system menu item } + Item := GetMDISystemMenuItem; + if Assigned(Item) then + Inc(FInternalViewersAtFront, InsertItemViewers(FViewers.Count, Item, 0, + False, False)); + + { Items } + if Assigned(FCurParentItem) then begin + for I := 0 to FCurParentItem.Count-1 do + InsertItemViewers(FViewers.Count, FCurParentItem.Items[I], 0, + True, False); + end; + + { MDI buttons item } + Item := GetMDIButtonsItem; + if Assigned(Item) then begin + for I := 0 to Item.Count-1 do + Inc(FInternalViewersAtEnd, InsertItemViewers(FViewers.Count, + Item.Items[I], 0, False, False)); + end; + + { Chevron item } + Item := GetChevronItem; + if Assigned(Item) then + Inc(FInternalViewersAtEnd, InsertItemViewers(FViewers.Count, Item, 0, + False, False)); +end; + +function TTBView.CalculatePositions(const CanMoveControls: Boolean; + const AOrientation: TTBViewOrientation; + AWrapOffset, AChevronOffset, AChevronSize: Integer; + var ABaseSize, TotalSize: TPoint; + var AWrappedLines: Integer): Boolean; +{ Returns True if the positions have changed } +type + TTempPosition = record + BoundsRect: TRect; + Show, OffEdge, LineSep, Clipped, SameWidth: Boolean; + { Include an Integer field to enforce Integer alignment of the record + (which we don't get by default due to TRect being wrongly declared as + 'packed'). Needed to avoid alignment fault on Delphi.NET 2007 IA-64. } + DummyAlignment: Integer; + end; + TTempPositionArrayItem = record + Pos: TTempPosition; + end; +var + DC: HDC; + LeftX, TopY, CurX, CurY: Integer; + NewPositions: array of TTempPositionArrayItem; + GroupSplit, DidWrap: Boolean; + LineStart, HighestHeightOnLine, HighestWidthOnLine: Integer; + + function GetSizeOfGroup(const StartingIndex: Integer): Integer; + var + I: Integer; + begin + Result := 0; + for I := StartingIndex to FViewers.Count-1 do begin + with NewPositions[I] do begin + if not Pos.Show then + Continue; + if tbisSeparator in Viewers[I].Item.ItemStyle then + Break; + if AOrientation <> tbvoVertical then + Inc(Result, Pos.BoundsRect.Right) + else + Inc(Result, Pos.BoundsRect.Bottom); + end; + end; + end; + + procedure Mirror; + { Reverses the horizontal ordering (i.e. first item becomes last) } + var + I, NewRight: Integer; + begin + for I := 0 to FViewers.Count-1 do + with NewPositions[I] do + if Pos.Show then begin + NewRight := TotalSize.X - Pos.BoundsRect.Left; + Pos.BoundsRect.Left := TotalSize.X - Pos.BoundsRect.Right; + Pos.BoundsRect.Right := NewRight; + end; + end; + + procedure HandleMaxHeight; + { Decreases, if necessary, the height of the view to FMaxHeight, and adjusts + the visibility of the scroll arrows } + var + MaxOffset, I, MaxTop, MaxBottom: Integer; + begin + FShowUpArrow := False; + FShowDownArrow := False; + if (FMaxHeight > 0) and (TotalSize.Y > FMaxHeight) then begin + MaxOffset := TotalSize.Y - FMaxHeight; + if FScrollOffset > MaxOffset then + FScrollOffset := MaxOffset; + if FScrollOffset < 0 then + FScrollOffset := 0; + FShowUpArrow := (FScrollOffset > 0); + FShowDownArrow := (FScrollOffset < MaxOffset); + MaxTop := 0; + if FShowUpArrow then + MaxTop := tbMenuScrollArrowHeight; + MaxBottom := FMaxHeight; + if FShowDownArrow then + Dec(MaxBottom, tbMenuScrollArrowHeight); + for I := 0 to FViewers.Count-1 do begin + with NewPositions[I] do begin + if not IsRectEmpty(Pos.BoundsRect) then begin + OffsetRect(Pos.BoundsRect, 0, -FScrollOffset); + if Pos.Show and + ((Pos.BoundsRect.Top < MaxTop) or + (Pos.BoundsRect.Bottom > MaxBottom)) then begin + Pos.Show := False; + Pos.Clipped := True; + end; + end; + end; + end; + TotalSize.Y := FMaxHeight; + end + else + FScrollOffset := 0; + end; + + procedure FinalizeLine(const LineEnd: Integer; const LastLine: Boolean); + var + I, RightAlignStart: Integer; + Item: TTBCustomItem; + IsButton: Boolean; + Z: Integer; + begin + if LineStart <> -1 then begin + if DidWrap and (FChevronParentView = nil) then begin + { When wrapping on a docked toolbar, extend TotalSize.X/Y to + AWrapOffset so that the toolbar always fills the whole row } + if (AOrientation = tbvoHorizontal) and (TotalSize.X < AWrapOffset) then + TotalSize.X := AWrapOffset + else if (AOrientation = tbvoVertical) and (TotalSize.Y < AWrapOffset) then + TotalSize.Y := AWrapOffset; + end; + RightAlignStart := -1; + for I := LineStart to LineEnd do begin + with NewPositions[I] do begin + if not Pos.Show then + Continue; + Item := Viewers[I].Item; + if (RightAlignStart < 0) and (tbisRightAlign in Item.ItemStyle) then + RightAlignStart := I; + IsButton := FIsToolbar or (tboToolbarSize in Item.FEffectiveOptions); + if FIsToolbar then begin + if LastLine and not DidWrap and (AOrientation <> tbvoFloating) then begin + { In case the toolbar is docked next to a taller/wider toolbar... } + HighestWidthOnLine := TotalSize.X; + HighestHeightOnLine := TotalSize.Y; + end; + { Make separators on toolbars as tall/wide as the tallest/widest item } + if tbisSeparator in Item.ItemStyle then begin + if AOrientation <> tbvoVertical then + Pos.BoundsRect.Bottom := Pos.BoundsRect.Top + HighestHeightOnLine + else + Pos.BoundsRect.Right := Pos.BoundsRect.Left + HighestWidthOnLine; + end + else begin + { Center the item } + if AOrientation <> tbvoVertical then begin + Z := (HighestHeightOnLine - (Pos.BoundsRect.Bottom - Pos.BoundsRect.Top)) div 2; + Inc(Pos.BoundsRect.Top, Z); + Inc(Pos.BoundsRect.Bottom, Z); + end + else begin + Z := (HighestWidthOnLine - (Pos.BoundsRect.Right - Pos.BoundsRect.Left)) div 2; + Inc(Pos.BoundsRect.Left, Z); + Inc(Pos.BoundsRect.Right, Z); + end; + end; + end + else begin + { Make items in a menu as wide as the widest item } + if not IsButton then begin + with Pos.BoundsRect do Right := Left + HighestWidthOnLine; + end; + end; + end; + end; + if RightAlignStart >= 0 then begin + Z := 0; + for I := LineEnd downto RightAlignStart do begin + with NewPositions[I] do begin + if not Pos.Show then + Continue; + if AOrientation <> tbvoVertical then + Z := Min(AWrapOffset, TotalSize.X) - Pos.BoundsRect.Right + else + Z := Min(AWrapOffset, TotalSize.Y) - Pos.BoundsRect.Bottom; + end; + Break; + end; + if Z > 0 then begin + for I := RightAlignStart to LineEnd do begin + with NewPositions[I] do begin + if not Pos.Show then + Continue; + if AOrientation <> tbvoVertical then begin + Inc(Pos.BoundsRect.Left, Z); + Inc(Pos.BoundsRect.Right, Z); + end + else begin + Inc(Pos.BoundsRect.Top, Z); + Inc(Pos.BoundsRect.Bottom, Z); + end; + end; + end; + end; + end; + end; + LineStart := -1; + HighestHeightOnLine := 0; + HighestWidthOnLine := 0; + end; + + procedure PositionItem(const CurIndex: Integer; var Pos: TTempPosition); + var + O, X, Y: Integer; + IsLineSep, Vert: Boolean; + begin + if LineStart = -1 then begin + LineStart := CurIndex; + HighestHeightOnLine := 0; + HighestWidthOnLine := 0; + end; + IsLineSep := False; + Vert := (AOrientation = tbvoVertical); + if not Vert then + O := CurX + else + O := CurY; + if (AWrapOffset > 0) and (O > 0) then begin + if not Vert then + Inc(O, Pos.BoundsRect.Right) + else + Inc(O, Pos.BoundsRect.Bottom); + if (tbisSeparator in Viewers[CurIndex].Item.ItemStyle) and + ((GroupSplit and not(tbisNoLineBreak in Viewers[CurIndex].Item.ItemStyle)) + or (O + GetSizeOfGroup(CurIndex+1) > AWrapOffset)) then begin + DidWrap := True; + Inc(AWrappedLines); + if not Vert then begin + CurX := 0; + Inc(CurY, HighestHeightOnLine); + end + else begin + CurY := 0; + Inc(CurX, HighestWidthOnLine); + end; + FinalizeLine(CurIndex-1, False); + LineStart := CurIndex+1; + if not Vert then begin + Pos.BoundsRect.Right := 0; + Pos.BoundsRect.Bottom := tbLineSpacing; + end + else begin + Pos.BoundsRect.Right := tbLineSpacing; + Pos.BoundsRect.Bottom := 0; + end; + Pos.LineSep := True; + IsLineSep := True; + end + else if O > AWrapOffset then begin + { proceed to next row } + DidWrap := True; + Inc(AWrappedLines); + if not Vert then begin + CurX := LeftX; + Inc(CurY, HighestHeightOnLine); + end + else begin + CurY := TopY; + Inc(CurX, HighestWidthOnLine); + end; + GroupSplit := True; + FinalizeLine(CurIndex-1, False); + LineStart := CurIndex; + end; + end; + if Pos.BoundsRect.Bottom > HighestHeightOnLine then + HighestHeightOnLine := Pos.BoundsRect.Bottom; + if Pos.BoundsRect.Right > HighestWidthOnLine then + HighestWidthOnLine := Pos.BoundsRect.Right; + X := CurX; + Y := CurY; + if X < 0 then X := 0; + if Y < 0 then Y := 0; + OffsetRect(Pos.BoundsRect, X, Y); + if IsLineSep then begin + if not Vert then begin + CurX := LeftX; + Inc(CurY, tbLineSpacing); + end + else begin + CurY := TopY; + Inc(CurX, tbLineSpacing); + end; + GroupSplit := False; + end; + end; + +var + SaveOrientation: TTBViewOrientation; + ChevronItem: TTBCustomItem; + CalcCanvas: TCanvas; + LastWasSep, LastWasButton, IsButton, IsControl: Boolean; + Item: TTBCustomItem; + Ctl: TControl; + ChangedBold: Boolean; + I, HighestSameWidthViewerWidth, Total, J, TotalVisibleItems: Integer; + IsFirst: Boolean; + Viewer: TTBItemViewer; + UseChevron, NonControlsOffEdge, TempViewerCreated: Boolean; + Margins: TRect; +label FoundItemToHide; +begin + SaveOrientation := FOrientation; + AWrappedLines := 1; + ChevronItem := GetChevronItem; + DC := 0; + CalcCanvas := nil; + try + FOrientation := AOrientation; + + CalcCanvas := TCanvas.Create; + DC := GetDC(0); + CalcCanvas.Handle := DC; + CalcCanvas.Font.Assign(GetFont); + + SetLength(NewPositions, FViewers.Count); + + { Figure out which items should be shown } + LastWasSep := True; { set to True initially so it won't show leading seps } + for I := 0 to FViewers.Count-1 do begin + Item := Viewers[I].Item; + IsControl := Item is TTBControlItem; + with NewPositions[I] do begin + { Pos.Show is initially False since SetLength initializes to zero } + if Item = ChevronItem then + Continue; + if Assigned(FChevronParentView) then begin + if IsControl then + Continue; + FChevronParentView.ValidatePositions; + J := I + FChevronParentView.FInternalViewersAtFront; + if J < FChevronParentView.FViewers.Count then + { range check just in case } + Viewer := FChevronParentView.Viewers[J] + else + Viewer := nil; + if (Viewer = nil) or (not Viewer.OffEdge and not(tbisSeparator in Item.ItemStyle)) then + Continue; + end; + if not IsControl then begin + if not(tbisEmbeddedGroup in Item.ItemStyle) or FCustomizing then begin + Pos.Show := Item.Visible; + { Don't display two consecutive separators } + if Pos.Show then begin + if (tbisSeparator in Item.ItemStyle) and LastWasSep then + Pos.Show := False; + LastWasSep := tbisSeparator in Item.ItemStyle; + end; + end; + end + else begin + { Controls can only be rendered on a single Parent, so only + include the control if its parent is currently equal to + FWindow } + Ctl := TTBControlItem(Item).FControl; + if Assigned(Ctl) and Assigned(FWindow) and (Ctl.Parent = FWindow) and + (Ctl.Visible or (csDesigning in Ctl.ComponentState)) then begin + Pos.Show := True; + LastWasSep := False; + end; + end; + end; + end; + + { Hide any trailing separators, so that they aren't included in the + base size } + for I := FViewers.Count-1 downto 0 do begin + with NewPositions[I] do + if Pos.Show then begin + if not(tbisSeparator in Viewers[I].Item.ItemStyle) then + Break; + Pos.Show := False; + end; + end; + + { Calculate sizes of all the items } + HighestSameWidthViewerWidth := 0; + for I := 0 to FViewers.Count-1 do begin + Item := Viewers[I].Item; + IsControl := Item is TTBControlItem; + with NewPositions[I] do begin + { Pos.BoundsRect is currently empty since SetLength initializes to zero } + if not Pos.Show then + Continue; + if not IsControl then begin + ChangedBold := False; + if tboDefault in Item.EffectiveOptions then + with CalcCanvas.Font do + if not(fsBold in Style) then begin + ChangedBold := True; + Style := Style + [fsBold]; + end; + Viewer := Viewers[I]; + TempViewerCreated := False; + if Item.NeedToRecreateViewer(Viewer) then begin + if CanMoveControls then begin + RecreateItemViewer(I); + Viewer := Viewers[I]; + end + else begin + Viewer := Item.GetItemViewerClass(Self).Create(Self, Item, 0); + TempViewerCreated := True; + end; + end; + try + Viewer.CalcSize(CalcCanvas, Pos.BoundsRect.Right, Pos.BoundsRect.Bottom); + if Viewer.UsesSameWidth then begin + Pos.SameWidth := True; + if (Pos.BoundsRect.Right > HighestSameWidthViewerWidth) then + HighestSameWidthViewerWidth := Pos.BoundsRect.Right; + end; + finally + if TempViewerCreated then + Viewer.Free; + end; + if ChangedBold then + with CalcCanvas.Font do + Style := Style - [fsBold]; + end + else begin + Ctl := TTBControlItem(Item).FControl; + Pos.BoundsRect.Right := Ctl.Width; + Pos.BoundsRect.Bottom := Ctl.Height; + end; + end; + end; + + { Increase widths of SameWidth items if necessary. Also calculate + ABaseSize.X (or Y). } + ABaseSize.X := 0; + ABaseSize.Y := 0; + for I := 0 to FViewers.Count-1 do begin + with NewPositions[I] do begin + if Pos.SameWidth and (Pos.BoundsRect.Right < HighestSameWidthViewerWidth) then + Pos.BoundsRect.Right := HighestSameWidthViewerWidth; + if AOrientation <> tbvoVertical then + Inc(ABaseSize.X, Pos.BoundsRect.Right) + else + Inc(ABaseSize.Y, Pos.BoundsRect.Bottom); + end; + end; + + { Hide partially visible items, mark them as 'OffEdge' } + if AOrientation <> tbvoVertical then + Total := ABaseSize.X + else + Total := ABaseSize.Y; + NonControlsOffEdge := False; + UseChevron := Assigned(ChevronItem) and (AChevronOffset > 0) and + (Total > AChevronOffset); + if UseChevron then begin + Dec(AChevronOffset, AChevronSize); + while Total > AChevronOffset do begin + { Count number of items. Stop loop if <= 1 } + TotalVisibleItems := 0; + for I := FViewers.Count-1 downto 0 do begin + if NewPositions[I].Pos.Show and not(tbisSeparator in Viewers[I].Item.ItemStyle) then + Inc(TotalVisibleItems); + end; + if TotalVisibleItems <= 1 then + Break; + { Hide any trailing separators } + for I := FViewers.Count-1 downto 0 do begin + if NewPositions[I].Pos.Show then begin + if not(tbisSeparator in Viewers[I].Item.ItemStyle) then + Break; + NewPositions[I].Pos.Show := False; + if AOrientation <> tbvoVertical then + Dec(Total, NewPositions[I].Pos.BoundsRect.Right) + else + Dec(Total, NewPositions[I].Pos.BoundsRect.Bottom); + goto FoundItemToHide; + end; + end; + { Find an item to hide } + if Assigned(FPriorityList) then + I := FPriorityList.Count-1 + else + I := FViewers.Count-1; + while I >= 0 do begin + if Assigned(FPriorityList) then begin + Viewer := TTBItemViewer(FPriorityList[I]); + J := Viewer.Index; + end + else begin + Viewer := Viewers[I]; + J := I; + end; + if NewPositions[J].Pos.Show and not(tbisSeparator in Viewer.Item.ItemStyle) then begin + NewPositions[J].Pos.Show := False; + NewPositions[J].Pos.OffEdge := True; + if AOrientation <> tbvoVertical then + Dec(Total, NewPositions[J].Pos.BoundsRect.Right) + else + Dec(Total, NewPositions[J].Pos.BoundsRect.Bottom); + if not NonControlsOffEdge and not(Viewer.Item is TTBControlItem) then + NonControlsOffEdge := True; + goto FoundItemToHide; + end; + Dec(I); + end; + Break; { prevent endless loop } + FoundItemToHide: + { Don't show two consecutive separators } + LastWasSep := True; { set to True initially so it won't show leading seps } + for J := 0 to FViewers.Count-1 do begin + Item := Viewers[J].Item; + with NewPositions[J] do begin + if Pos.Show then begin + if (tbisSeparator in Item.ItemStyle) and LastWasSep then begin + Pos.Show := False; + if AOrientation <> tbvoVertical then + Dec(Total, Pos.BoundsRect.Right) + else + Dec(Total, Pos.BoundsRect.Bottom); + end; + LastWasSep := tbisSeparator in Item.ItemStyle; + end; + end; + end; + end; + end; + + { Hide any trailing separators after items were hidden } + for I := FViewers.Count-1 downto 0 do begin + with NewPositions[I] do + if Pos.Show then begin + if not(tbisSeparator in Viewers[I].Item.ItemStyle) then + Break; + Pos.Show := False; + end; + end; + + { Set the ABaseSize.Y (or X) *after* items were hidden } + for I := 0 to FViewers.Count-1 do begin + with NewPositions[I] do + if Pos.Show then begin + if AOrientation <> tbvoVertical then begin + if Pos.BoundsRect.Bottom > ABaseSize.Y then + ABaseSize.Y := Pos.BoundsRect.Bottom; + end + else begin + if Pos.BoundsRect.Right > ABaseSize.X then + ABaseSize.X := Pos.BoundsRect.Right; + end; + end; + end; + + { On menus, set all non-separator items to be as tall as the tallest item } + {if not FIsToolbar then begin + J := 0; + for I := 0 to FViewers.Count-1 do begin + Item := Viewers[I].Item; + with NewPositions[I] do + if Pos.Show and not(tbisSeparator in Item.ItemStyle) and + not(tboToolbarSize in Item.FEffectiveOptions) and + (Pos.BoundsRect.Bottom - Pos.BoundsRect.Top > J) then + J := Pos.BoundsRect.Bottom - Pos.BoundsRect.Top; + end; + for I := 0 to FViewers.Count-1 do begin + Item := Viewers[I].Item; + with NewPositions[I] do + if Pos.Show and not(tbisSeparator in Item.ItemStyle) and + not(tboToolbarSize in Item.FEffectiveOptions) then + Pos.BoundsRect.Bottom := Pos.BoundsRect.Top + J; + end; + end;} + + { Calculate the position of the items } + GetMargins(AOrientation, Margins); + LeftX := Margins.Left; + TopY := Margins.Top; + if AWrapOffset > 0 then begin + Dec(AWrapOffset, Margins.Right); + if AWrapOffset < 1 then AWrapOffset := 1; + end; + CurX := LeftX; + CurY := TopY; + GroupSplit := False; + DidWrap := False; + LastWasButton := FIsToolbar; + LineStart := -1; + for I := 0 to FViewers.Count-1 do begin + Item := Viewers[I].Item; + with NewPositions[I] do begin + if not Pos.Show then + Continue; + IsButton := FIsToolbar or (tboToolbarSize in Item.FEffectiveOptions); + if LastWasButton and not IsButton then begin + { On a menu, if last item was a button and the current item isn't, + proceed to next row } + CurX := LeftX; + CurY := TotalSize.Y; + end; + LastWasButton := IsButton; + PositionItem(I, NewPositions[I].Pos); + if IsButton and (AOrientation <> tbvoVertical) then + Inc(CurX, Pos.BoundsRect.Right - Pos.BoundsRect.Left) + else + Inc(CurY, Pos.BoundsRect.Bottom - Pos.BoundsRect.Top); + if Pos.BoundsRect.Right > TotalSize.X then + TotalSize.X := Pos.BoundsRect.Right; + if Pos.BoundsRect.Bottom > TotalSize.Y then + TotalSize.Y := Pos.BoundsRect.Bottom; + end; + end; + if FViewers.Count <> 0 then + FinalizeLine(FViewers.Count-1, True); + Inc(TotalSize.X, Margins.Right); + Inc(TotalSize.Y, Margins.Bottom); + if AOrientation = tbvoVertical then + Mirror; + HandleMaxHeight; + if CanMoveControls then begin + for I := 0 to FViewers.Count-1 do begin + Item := Viewers[I].Item; + if Item is TTBControlItem then begin + if NewPositions[I].Pos.Show then begin + Ctl := TTBControlItem(Item).FControl; + if not EqualRect(NewPositions[I].Pos.BoundsRect, Ctl.BoundsRect) then + Ctl.BoundsRect := NewPositions[I].Pos.BoundsRect; + end + else if NewPositions[I].Pos.OffEdge or NewPositions[I].Pos.Clipped then begin + { Simulate hiding of OddEdge controls by literally moving them + off the edge. Do the same for Clipped controls. } + Ctl := TTBControlItem(Item).FControl; + Ctl.SetBounds(FWindow.ClientWidth, FWindow.ClientHeight, + Ctl.Width, Ctl.Height); + end; + end; + end; + end; + { Set size of line separators } + if FIsToolbar then + for I := 0 to FViewers.Count-1 do begin + Item := Viewers[I].Item; + with NewPositions[I] do + if Pos.Show and (tbisSeparator in Item.ItemStyle) and + Pos.LineSep then begin + if AOrientation <> tbvoVertical then + Pos.BoundsRect.Right := TotalSize.X + else + Pos.BoundsRect.Bottom := TotalSize.Y; + end; + end; + + { Position the chevron item } + if UseChevron then begin + if CanMoveControls then + ChevronItem.Enabled := NonControlsOffEdge; + NewPositions[FViewers.Count-1].Pos.Show := True; + I := AChevronOffset; + if AOrientation <> tbvoVertical then begin + if I < TotalSize.X then + I := TotalSize.X; + NewPositions[FViewers.Count-1].Pos.BoundsRect := Bounds(I, 0, + AChevronSize, TotalSize.Y); + end + else begin + if I < TotalSize.Y then + I := TotalSize.Y; + NewPositions[FViewers.Count-1].Pos.BoundsRect := Bounds(0, I, + TotalSize.X, AChevronSize); + end; + end; + + { Commit changes } + Result := False; + if CanMoveControls then begin + for I := 0 to FViewers.Count-1 do begin + Viewer := Viewers[I]; + with NewPositions[I] do begin + if not Result and + (not EqualRect(Viewer.BoundsRect, Pos.BoundsRect) or + (Viewer.Show <> Pos.Show) or + ((tbisLineSep in Viewer.State) <> Pos.LineSep)) then + Result := True; + Viewer.FBoundsRect := Pos.BoundsRect; + Viewer.FShow := Pos.Show; + Viewer.FOffEdge := Pos.OffEdge; + Viewer.FClipped := Pos.Clipped; + if Pos.LineSep then + Include(Viewer.State, tbisLineSep) + else + Exclude(Viewer.State, tbisLineSep); + end; + end; + end; + finally + FOrientation := SaveOrientation; + if Assigned(CalcCanvas) then + CalcCanvas.Handle := 0; + if DC <> 0 then ReleaseDC(0, DC); + CalcCanvas.Free; + end; + if (ABaseSize.X = 0) or (ABaseSize.Y = 0) then begin + { If there are no visible items... } + {}{scale this?} + ABaseSize.X := 23; + ABaseSize.Y := 22; + if TotalSize.X < 23 then TotalSize.X := 23; + if TotalSize.Y < 22 then TotalSize.Y := 22; + end; +end; + +procedure TTBView.DoUpdatePositions(var ASize: TPoint); +{ This is called by UpdatePositions } +var + WrappedLines: Integer; +begin + { Don't call InvalidatePositions before CalculatePositions so that + endless recursion doesn't happen if an item's CalcSize uses a method that + calls ValidatePositions } + CalculatePositions(True, FOrientation, FWrapOffset, FChevronOffset, + FChevronSize, FBaseSize, ASize, WrappedLines); + FValidated := True; + { Need to call ValidateRect before AutoSize, otherwise Windows will + erase the client area during a resize } + if FWindow.HandleAllocated then + ValidateRect(FWindow.Handle, nil); + AutoSize(ASize.X, ASize.Y); + if FWindow.HandleAllocated then + DoubleBufferedRepaint(FWindow.Handle); +end; + +function TTBView.UpdatePositions: TPoint; +{ Called whenever the size or orientation of a view changes. When items are + added or removed from the view, InvalidatePositions must be called instead, + otherwise the view may not be redrawn properly. } +begin + Result.X := 0; + Result.Y := 0; + DoUpdatePositions(Result); +end; + +procedure TTBView.AutoSize(AWidth, AHeight: Integer); +begin +end; + +function TTBView.GetChevronItem: TTBCustomItem; +begin + Result := nil; +end; + +procedure TTBView.GetMargins(AOrientation: TTBViewOrientation; + var Margins: TRect); +begin + if AOrientation = tbvoFloating then begin + Margins.Left := 4; + Margins.Top := 2; + Margins.Right := 4; + Margins.Bottom := 1; + end + else begin + Margins.Left := 0; + Margins.Top := 0; + Margins.Right := 0; + Margins.Bottom := 0; + end; +end; + +function TTBView.GetMDIButtonsItem: TTBCustomItem; +begin + Result := nil; +end; + +function TTBView.GetMDISystemMenuItem: TTBCustomItem; +begin + Result := nil; +end; + +function TTBView.GetFont: TFont; +begin + if Assigned(ToolbarFont) then + Result := ToolbarFont + else begin + { ToolbarFont is destroyed during unit finalization, but in rare cases + this method may end up being called from ValidatePositions *after* + unit finalization if Application.Run is never called; see the + "EConvertError" newsgroup thread. We can't return nil because that would + cause an exception in the calling function, so just return the window + font. It's not the *right* font, but it shouldn't matter since the app + is exiting anyway. } + Result := {$IFNDEF CLR}TControlAccess{$ENDIF}(FWindow).Font; + end; +end; + +procedure TTBView.DrawItem(Viewer: TTBItemViewer; DrawTo: TCanvas; + Offscreen: Boolean); +const + COLOR_MENUHILIGHT = 29; + clMenuHighlight = TColor(COLOR_MENUHILIGHT or $80000000); +var + Bmp: TBitmap; + DrawToDC, BmpDC: HDC; + DrawCanvas: TCanvas; + R1, R2, R3: TRect; + IsOpen, IsSelected, IsPushed: Boolean; + ToolbarStyle: Boolean; + UseDisabledShadow: Boolean; + SaveIndex, SaveIndex2: Integer; + WindowOrg: TPoint; + BkColor: TColor; +begin + ValidatePositions; + + if tbisInvalidated in Viewer.State then begin + Offscreen := True; + Exclude(Viewer.State, tbisInvalidated); + end; + + R1 := Viewer.BoundsRect; + if not Viewer.Show or IsRectEmpty(R1) or (Viewer.Item is TTBControlItem) then + Exit; + R2 := R1; + OffsetRect(R2, -R2.Left, -R2.Top); + + IsOpen := FOpenViewer = Viewer; + IsSelected := (FSelected = Viewer); + IsPushed := IsSelected and (IsOpen or (FMouseOverSelected and FCapture)); + ToolbarStyle := Viewer.IsToolbarStyle; + + DrawToDC := DrawTo.Handle; + Bmp := nil; + { Must deselect any currently selected handles before calling SaveDC, because + if they are left selected and DeleteObject gets called on them after the + SaveDC call, it will fail on Win9x/Me, and thus leak GDI resources. } + DrawTo.Refresh; + SaveIndex := SaveDC(DrawToDC); + try + IntersectClipRect(DrawToDC, R1.Left, R1.Top, R1.Right, R1.Bottom); + GetClipBox(DrawToDC, R3); + if IsRectEmpty(R3) then + Exit; + + if not Offscreen then begin + MoveWindowOrg(DrawToDC, R1.Left, R1.Top); + { Tweak the brush origin so that the checked background drawn behind + checked items always looks the same regardless of whether the item + is positioned on an even or odd Left or Top coordinate. } + if GetWindowOrgEx(DrawToDC, WindowOrg) then + SetBrushOrgEx(DrawToDC, -WindowOrg.X, -WindowOrg.Y, nil); + DrawCanvas := DrawTo; + end + else begin + Bmp := TBitmap.Create; + Bmp.Width := R2.Right; + Bmp.Height := R2.Bottom; + DrawCanvas := Bmp.Canvas; + BmpDC := DrawCanvas.Handle; + SaveIndex2 := SaveDC(BmpDC); + SetWindowOrgEx(BmpDC, R1.Left, R1.Top, nil); + FWindow.Perform(WM_ERASEBKGND, WPARAM(BmpDC), 0); + RestoreDC(BmpDC, SaveIndex2); + end; + + { Initialize brush } + if not ToolbarStyle and IsSelected then begin + {$IFNDEF TB2K_USE_STRICT_O2K_MENU_STYLE} + if AreFlatMenusEnabled then + { Windows XP uses a different fill color for selected menu items when + flat menus are enabled } + DrawCanvas.Brush.Color := clMenuHighlight + else + {$ENDIF} + DrawCanvas.Brush.Color := clHighlight; + end + else + DrawCanvas.Brush.Style := bsClear; + + { Initialize font } + DrawCanvas.Font.Assign(GetFont); + if Viewer.Item.Enabled then begin + if not ToolbarStyle and IsSelected then + DrawCanvas.Font.Color := clHighlightText + else begin + if ToolbarStyle then + DrawCanvas.Font.Color := clBtnText + else + DrawCanvas.Font.Color := tbMenuTextColor; + end; + UseDisabledShadow := False; + end + else begin + DrawCanvas.Font.Color := clGrayText; + { Use the disabled shadow if either: + 1. The item is a toolbar-style item. + 2. The item is not selected, and the background color equals the + button-face color. + 3. The gray-text color is the same as the background color. + Note: Windows actually uses dithered text in this case. } + BkColor := ColorToRGB({$IFNDEF CLR}TControlAccess{$ENDIF}(FWindow).Color); + UseDisabledShadow := ToolbarStyle or + (not IsSelected and (BkColor = ColorToRGB(clBtnFace))) or + (ColorToRGB(clGrayText) = BkColor); + end; + + Viewer.Paint(DrawCanvas, R2, IsSelected, IsPushed, UseDisabledShadow); + + if Offscreen then + BitBlt(DrawToDC, R1.Left, R1.Top, Bmp.Width, Bmp.Height, DrawCanvas.Handle, + 0, 0, SRCCOPY); + finally + DrawTo.Refresh; { must do this before a RestoreDC } + RestoreDC(DrawToDC, SaveIndex); + Bmp.Free; + end; +end; + +procedure TTBView.DrawSubitems(ACanvas: TCanvas); +var + ClipRect: TRect; + + procedure DoDraw(const AViewer: TTBItemViewer); + var + Temp: TRect; + begin + { Speed optimization: Only call DrawItem on viewers that intersect the + canvas's clipping rectangle. Without this check, moving the mouse across + a toolbar with thousands of visible items uses 100% of the CPU. } + if AViewer.Show and IntersectRect(Temp, ClipRect, AViewer.BoundsRect) then + DrawItem(AViewer, ACanvas, False) + else begin + { Not going to draw the item. Go ahead and clear the tbisInvalidated + flag if it's set so it won't needlessly double-buffer next time. } + Exclude(AViewer.State, tbisInvalidated); + end; + end; + +var + I: Integer; +begin + ValidatePositions; + ClipRect := ACanvas.ClipRect; + + { Draw non-selected items before drawing the selected item, so that when the + selection is changing there's no brief window in which two items appear + to be selected } + for I := 0 to FViewers.Count-1 do begin + if (vsDrawInOrder in FState) or (Viewers[I] <> FSelected) then + DoDraw(Viewers[I]); + end; + if not(vsDrawInOrder in FState) and Assigned(FSelected) then + DoDraw(FSelected); + + Exclude(FState, vsDrawInOrder); +end; + +procedure TTBView.Invalidate(AViewer: TTBItemViewer); +begin + if not FValidated or not Assigned(FWindow) or not FWindow.HandleAllocated then + Exit; + if AViewer.Show and not IsRectEmpty(AViewer.BoundsRect) and + not(AViewer.Item is TTBControlItem) then begin + Include(AViewer.State, tbisInvalidated); + InvalidateRect(FWindow.Handle, {$IFNDEF CLR}@{$ENDIF} AViewer.BoundsRect, False); + end; +end; + +procedure TTBView.SetAccelsVisibility(AShowAccels: Boolean); +var + I: Integer; + Viewer: TTBItemViewer; +begin + { Always show accels when keyboard cues are enabled } + AShowAccels := AShowAccels or not(vsUseHiddenAccels in FStyle) or + AreKeyboardCuesEnabled; + if AShowAccels <> (vsShowAccels in FState) then begin + if AShowAccels then + Include(FState, vsShowAccels) + else + Exclude(FState, vsShowAccels); + if Assigned(FWindow) and FWindow.HandleAllocated and + IsWindowVisible(FWindow.Handle) then + { ^ the visibility check is just an optimization } + for I := 0 to FViewers.Count-1 do begin + Viewer := Viewers[I]; + if Viewer.CaptionShown and + (FindAccelChar(Viewer.GetCaptionText) <> #0) then + Invalidate(Viewer); + end; + end; +end; + +function TTBView.FirstSelectable: TTBItemViewer; +var + FirstViewer: TTBItemViewer; +begin + Result := NextSelectable(nil, True); + if Assigned(Result) then begin + FirstViewer := Result; + while tbisDontSelectFirst in Result.Item.ItemStyle do begin + Result := NextSelectable(Result, True); + if Result = FirstViewer then + { don't loop endlessly if all items have the tbisDontSelectFirst style } + Break; + end; + end; +end; + +function TTBView.NextSelectable(CurViewer: TTBItemViewer; + GoForward: Boolean): TTBItemViewer; +var + I, J: Integer; +begin + ValidatePositions; + Result := nil; + if FViewers.Count = 0 then Exit; + J := -1; + I := IndexOf(CurViewer); + while True do begin + if GoForward then begin + Inc(I); + if I >= FViewers.Count then I := 0; + end + else begin + Dec(I); + if I < 0 then I := FViewers.Count-1; + end; + if J = -1 then + J := I + else + if I = J then + Exit; + if (Viewers[I].Show or Viewers[I].Clipped) and Viewers[I].Item.Visible and + (tbisSelectable in Viewers[I].Item.ItemStyle) then + Break; + end; + Result := Viewers[I]; +end; + +function TTBView.NextSelectableWithAccel(CurViewer: TTBItemViewer; + Key: Char; RequirePrimaryAccel: Boolean; var IsOnlyItemWithAccel: Boolean): TTBItemViewer; + + function IsAccelItem(const Index: Integer; + const Primary, EnabledItems: Boolean): Boolean; + var + S: String; + LastAccel: Char; + Viewer: TTBItemViewer; + Item: TTBCustomItem; + begin + Result := False; + Viewer := Viewers[Index]; + Item := Viewer.Item; + if (Viewer.Show or Viewer.Clipped) and (tbisSelectable in Item.ItemStyle) and + (Item.Enabled = EnabledItems) and + Item.Visible and Viewer.CaptionShown then begin + S := Viewer.GetCaptionText; + if S <> '' then begin + LastAccel := FindAccelChar(S); + if Primary then begin + if LastAccel <> #0 then + Result := (CharToLower(LastAccel) = CharToLower(Key)); + end + else + if (LastAccel = #0) and (Key <> ' ') then + Result := (CharToLower(S[1]) = CharToLower(Key)); + end; + end; + end; + + function FindAccel(I: Integer; + const Primary, EnabledItems: Boolean): Integer; + var + J: Integer; + begin + Result := -1; + J := -1; + while True do begin + Inc(I); + if I >= FViewers.Count then I := 0; + if J = -1 then + J := I + else + if I = J then + Break; + if IsAccelItem(I, Primary, EnabledItems) then begin + Result := I; + Break; + end; + end; + end; + +var + Start, I: Integer; + Primary, EnabledItems: Boolean; +begin + ValidatePositions; + Result := nil; + IsOnlyItemWithAccel := False; + if FViewers.Count = 0 then Exit; + + Start := IndexOf(CurViewer); + for Primary := True downto False do + if not RequirePrimaryAccel or Primary then + for EnabledItems := True downto False do begin + I := FindAccel(Start, Primary, EnabledItems); + if I <> -1 then begin + Result := Viewers[I]; + IsOnlyItemWithAccel := not EnabledItems or + (FindAccel(I, Primary, EnabledItems) = I); + Exit; + end; + end; +end; + +procedure TTBView.EnterToolbarLoop(Options: TTBEnterToolbarLoopOptions); +var + ModalHandler: TTBModalHandler; +begin + if vsModal in FState then Exit; + ModalHandler := TTBModalHandler.Create(FWindow.Handle); + try + { remove all states except... } + FState := FState * [vsShowAccels]; + try + Include(FState, vsModal); + { Must ensure that DoneAction is reset to tbdaNone *before* calling + NotifyFocusEvent so that the IsModalEnding call it makes won't return + True } + FDoneActionData.DoneAction := tbdaNone; + { Now that the vsModal state has been added, send an MSAA focus event } + if Assigned(Selected) then + NotifyFocusEvent; + ModalHandler.Loop(Self, tbetMouseDown in Options, + tbetExecuteSelected in Options, tbetFromMSAA in Options, False); + finally + { Remove vsModal state from the root view before any TTBView.Destroy + methods get called (as a result of the CloseChildPopups call below), + so that NotifyFocusEvent becomes a no-op } + Exclude(FState, vsModal); + StopAllTimers; + CloseChildPopups; + UpdateSelection(Point(Low(Integer), Low(Integer)), True); + end; + finally + ModalHandler.Free; + end; + SetAccelsVisibility(False); + ProcessDoneAction(FDoneActionData, False); +end; + +procedure TTBView.SetCustomizing(Value: Boolean); +begin + if FCustomizing <> Value then begin + FCustomizing := Value; + RecreateAllViewers; + end; +end; + +procedure TTBView.BeginUpdate; +begin + Inc(FUpdating); +end; + +procedure TTBView.EndUpdate; +begin + Dec(FUpdating); + if FUpdating = 0 then + TryValidatePositions; +end; + +procedure TTBView.GetOffEdgeControlList(const List: TList); +var + I: Integer; + Item: TTBCustomItem; +begin + for I := 0 to FViewers.Count-1 do begin + Item := Viewers[I].Item; + if (Item is TTBControlItem) and Viewers[I].OffEdge and + (TTBControlItem(Item).FControl is TWinControl) then + List.Add(TTBControlItem(Item).FControl); + end; +end; + +procedure TTBView.SetCapture; +begin + FCapture := True; +end; + +procedure TTBView.CancelCapture; +begin + if FCapture then begin + FCapture := False; + LastPos.X := Low(LastPos.X); + if Assigned(FSelected) then + FSelected.LosingCapture; + end; +end; + +procedure TTBView.KeyDown(var Key: Word; Shift: TShiftState); + + procedure SelNextItem(const ParentView: TTBView; const GoForward: Boolean); + begin + ParentView.Selected := ParentView.NextSelectable(ParentView.FSelected, + GoForward); + ParentView.ScrollSelectedIntoView; + end; + + procedure HelpKey; + var + V: TTBView; + ContextID: Integer; + begin + ContextID := 0; + V := Self; + while Assigned(V) do begin + if Assigned(V.FSelected) then begin + ContextID := V.FSelected.Item.HelpContext; + if ContextID <> 0 then Break; + end; + V := V.FParentView; + end; + if ContextID <> 0 then + EndModalWithHelp(ContextID); + end; + +var + ParentTBView: TTBView; +begin + ParentTBView := GetParentToolbarView; + case Key of + VK_TAB: begin + SelNextItem(Self, GetKeyState(VK_SHIFT) >= 0); + end; + VK_RETURN: begin + ExecuteSelected(True); + end; + VK_MENU, VK_F10: begin + EndModal; + end; + VK_ESCAPE: begin + Key := 0; + if FParentView = nil then + EndModal + else + FParentView.CancelChildPopups; + end; + VK_LEFT, VK_RIGHT: begin + if (Self = ParentTBView) and (Orientation = tbvoVertical) then + OpenChildPopup(True) + else if Key = VK_LEFT then begin + if Assigned(ParentTBView) and (ParentTBView.Orientation <> tbvoVertical) then begin + if (Self = ParentTBView) or + (FParentView = ParentTBView) then + SelNextItem(ParentTBView, False) + else + FParentView.CloseChildPopups; + end + else begin + if Assigned(FParentView) then + FParentView.CancelChildPopups; + end; + end + else begin + if ((Self = ParentTBView) or not OpenChildPopup(True)) and + (Assigned(ParentTBView) and (ParentTBView.Orientation <> tbvoVertical)) then begin + { If we're on ParentTBView, or if the selected item can't display + a submenu, proceed to next item on ParentTBView } + SelNextItem(ParentTBView, True); + end; + end; + end; + VK_UP, VK_DOWN: begin + if (Self = ParentTBView) and (Orientation <> tbvoVertical) then + OpenChildPopup(True) + else + SelNextItem(Self, Key = VK_DOWN); + end; + VK_HOME, VK_END: begin + Selected := NextSelectable(nil, Key = VK_HOME); + ScrollSelectedIntoView; + end; + VK_F1: HelpKey; + else + Exit; { don't set Key to 0 for unprocessed keys } + end; + Key := 0; +end; + +function TTBView.IsModalEnding: Boolean; +begin + Result := (GetRootView.FDoneActionData.DoneAction <> tbdaNone); +end; + +procedure TTBView.EndModal; +var + RootView: TTBView; +begin + RootView := GetRootView; + RootView.FDoneActionData.DoneAction := tbdaCancel; +end; + +procedure TTBView.EndModalWithClick(AViewer: TTBItemViewer); +var + RootView: TTBView; +begin + RootView := GetRootView; + RootView.FDoneActionData.ClickItem := AViewer.Item; + RootView.FDoneActionData.Sound := AViewer.FView.FIsPopup; + RootView.FDoneActionData.DoneAction := tbdaClickItem; +end; + +procedure TTBView.EndModalWithHelp(AContextID: Integer); +var + RootView: TTBView; +begin + RootView := GetRootView; + RootView.FDoneActionData.ContextID := AContextID; + RootView.FDoneActionData.DoneAction := tbdaHelpContext; +end; + +procedure TTBView.EndModalWithSystemMenu(AWnd: HWND; AKey: Word); +var + RootView: TTBView; +begin + RootView := GetRootView; + RootView.FDoneActionData.Wnd := AWnd; + RootView.FDoneActionData.Key := AKey; + RootView.FDoneActionData.DoneAction := tbdaOpenSystemMenu; +end; + +procedure TTBView.ExecuteSelected(AGivePriority: Boolean); +{ Normally called after an Enter or accelerator key press on the view, this + method 'executes' or opens the selected item. It ends the modal loop, except + when a submenu is opened. } +var + Item: TTBCustomItem; +begin + if Assigned(FSelected) and FSelected.Item.Enabled then begin + Item := FSelected.Item; + if (tbisCombo in Item.ItemStyle) or not OpenChildPopup(True) then begin + if tbisSelectable in Item.ItemStyle then + FSelected.Execute(AGivePriority) + else + EndModal; + end + end + else + EndModal; + {$IFNDEF CLR} + Exit; asm db 0,'Toolbar2000 (C) 1998-2008 Jordan Russell',0 end; + {$ENDIF} +end; + +procedure TTBView.Scroll(ADown: Boolean); +var + CurPos, NewPos, I: Integer; +begin + ValidatePositions; + if ADown then begin + NewPos := High(NewPos); + CurPos := FMaxHeight - tbMenuScrollArrowHeight; + for I := 0 to FViewers.Count-1 do begin + with Viewers[I] do + if Clipped and not(tbisSeparator in Item.ItemStyle) and + (BoundsRect.Bottom < NewPos) and (BoundsRect.Bottom > CurPos) then + NewPos := BoundsRect.Bottom; + end; + if NewPos = High(NewPos) then + Exit; + Dec(NewPos, FMaxHeight - tbMenuScrollArrowHeight); + end + else begin + NewPos := Low(NewPos); + CurPos := tbMenuScrollArrowHeight; + for I := 0 to FViewers.Count-1 do begin + with Viewers[I] do + if Clipped and not(tbisSeparator in Item.ItemStyle) and + (BoundsRect.Top > NewPos) and (BoundsRect.Top < CurPos) then + NewPos := BoundsRect.Top; + end; + if NewPos = Low(NewPos) then + Exit; + Dec(NewPos, tbMenuScrollArrowHeight); + end; + Inc(FScrollOffset, NewPos); + UpdatePositions; +end; + +procedure TTBView.ScrollSelectedIntoView; +begin + ValidatePositions; + if (FSelected = nil) or not FSelected.Clipped then + Exit; + + if FSelected.BoundsRect.Top < tbMenuScrollArrowHeight then begin + Dec(FScrollOffset, tbMenuScrollArrowHeight - FSelected.BoundsRect.Top); + UpdatePositions; + end + else if FSelected.BoundsRect.Bottom > FMaxHeight - tbMenuScrollArrowHeight then begin + Dec(FScrollOffset, (FMaxHeight - tbMenuScrollArrowHeight) - + FSelected.BoundsRect.Bottom); + UpdatePositions; + end; +end; + +procedure TTBView.SetUsePriorityList(Value: Boolean); +begin + if FUsePriorityList <> Value then begin + FUsePriorityList := Value; + RecreateAllViewers; + end; +end; + +function TTBView.GetCaptureWnd: HWND; +begin + Result := GetRootView.FCaptureWnd; +end; + +procedure TTBView.CancelMode; +var + View: TTBView; +begin + EndModal; + + { Hide all parent/child popup windows. Can't actually destroy them using + CloseChildPopups because this method may be called while inside + TTBEditItemViewer's message loop, and it could result in the active + TTBEditItemViewer instance being destroyed (leading to an AV). } + View := Self; + while Assigned(View.FOpenViewerView) do + View := View.FOpenViewerView; + repeat + View.StopAllTimers; + if View.FWindow is TTBPopupWindow then + View.FWindow.Visible := False; + View := View.FParentView; + until View = nil; + + { Note: This doesn't remove the selection from a top-level toolbar item. + Unfortunately, we can't do 'Selected := nil' because it would destroy + child popups and that must'nt happen for the reason stated above. } +end; + +procedure TTBView.HandleHintShowMessage(var Message: TCMHintShow); + + procedure UpdateInfo(var Info: {$IFDEF JR_D12}Controls.{$ENDIF} THintInfo); + var + V: TTBItemViewer; + begin + Info.HintStr := ''; + V := ViewerFromPoint(Info.CursorPos); + if Assigned(V) then begin + Info.CursorRect := V.BoundsRect; + Info.HintStr := V.GetHintText; + Info.HintData := V; + end; + end; + +{$IFNDEF CLR} +begin + UpdateInfo(Message.HintInfo^); +end; +{$ELSE} +var + Info: THintInfo; +begin + Info := Message.HintInfo; + UpdateInfo(Info); + Message.HintInfo := Info; +end; +{$ENDIF} + + +{ TTBModalHandler } + +constructor TTBModalHandler.Create(AExistingWnd: HWND); + + procedure RemoveFocusIfOnOtherThread; + { This ensures that the message loop will receive key messages when an Adobe + Reader (8.1.2) control embedded in a TWebBrowser is currently focused. + The Reader control is actually hosted in a separate thread (in a separate + process, AcroRd32.exe). When Alt/Alt+[letter] is pressed, Reader calls + GetAncestor(..., GA_ROOT) and forwards the WM_SYSCOMMAND/WM_SYSCHAR + message to that window using SendMessage (not PostMessage, for some + reason). The focus, however, is left on the Reader control. Consequently, + any keystrokes will generate key messages in the Reader thread's queue + instead of ours. To avoid that, call SetFocus(0) to remove the focus if + it's currently on another thread's window. When no window has the focus, + key messages will be posted to the active window, which *should* be a + form owned by the same thread as us. } + var + FocusWnd: HWND; + begin + FocusWnd := GetFocus; + if (FocusWnd <> 0) and + (GetWindowThreadProcessId(FocusWnd, nil) <> GetCurrentThreadId) then begin + FSaveFocusWnd := FocusWnd; + SetFocus(0); + end; + end; + +begin + inherited Create; + LastPos := GetMessagePosAsPoint; + if AExistingWnd <> 0 then + FWnd := AExistingWnd + else begin + FWnd := {$IFDEF ALLOCHWND_CLASSES}Classes.{$ENDIF} AllocateHWnd(WndProc); + FCreatedWnd := True; + end; + RemoveFocusIfOnOtherThread; + { Like standard menus, don't allow other apps to steal the focus during + our modal loop. This also prevents us from losing activation when + "active window tracking" is enabled and the user moves the mouse over + another application's window. } + CallLockSetForegroundWindow(True); + SetCapture(FWnd); + SetCursor(LoadCursor(0, IDC_ARROW)); + CallNotifyWinEvent(EVENT_SYSTEM_MENUSTART, FWnd, OBJID_CLIENT, CHILDID_SELF); + FInited := True; +end; + +destructor TTBModalHandler.Destroy; +begin + CallLockSetForegroundWindow(False); + if FWnd <> 0 then begin + if GetCapture = FWnd then + ReleaseCapture; + if FInited then + CallNotifyWinEvent(EVENT_SYSTEM_MENUEND, FWnd, OBJID_CLIENT, CHILDID_SELF); + if FCreatedWnd then + {$IFDEF ALLOCHWND_CLASSES}Classes.{$ENDIF} DeallocateHWnd(FWnd); + end; + if (FSaveFocusWnd <> 0) and (GetFocus = 0) then + SetFocus(FSaveFocusWnd); + inherited; +end; + +procedure TTBModalHandler.WndProc(var Msg: TMessage); +begin + Msg.Result := DefWindowProc(FWnd, Msg.Msg, Msg.WParam, Msg.LParam); + if (Msg.Msg = WM_CANCELMODE) and Assigned(FRootPopup) then begin + try + { We can receive a WM_CANCELMODE message during a modal loop if a dialog + pops up. Respond by hiding menus to make it look like the modal loop + has returned, even though it really hasn't yet. + Note: Similar code in TTBCustomToolbar.WMCancelMode. } + FRootPopup.View.CancelMode; + except + Application.HandleException(Self); + end; + end; +end; + +procedure TTBModalHandler.Loop(const RootView: TTBView; + const AMouseDown, AExecuteSelected, AFromMSAA, TrackRightButton: Boolean); +var + OriginalActiveWindow: HWND; + + function GetActiveView: TTBView; + begin + Result := RootView; + while Assigned(Result.FOpenViewerView) do + Result := Result.FOpenViewerView; + end; + + function GetCaptureView: TTBView; + begin + Result := RootView; + while Assigned(Result) and not Result.FCapture do + Result := Result.FOpenViewerView; + end; + + procedure UpdateAllSelections(const P: TPoint; const AllowNewSelection: Boolean); + var + View, CapView: TTBView; + begin + View := GetActiveView; + CapView := GetCaptureView; + while Assigned(View) do begin + if (CapView = nil) or (View = CapView) then + View.UpdateSelection(P, AllowNewSelection); + View := View.FParentView; + end; + end; + + function GetSelectedViewer(var AView: TTBView; var AViewer: TTBItemViewer): Boolean; + { Returns True if AViewer <> nil. } + var + View: TTBView; + begin + { Look for a capture item first } + AView := GetCaptureView; + if Assigned(AView) then + AViewer := AView.FSelected + else begin + AView := nil; + AViewer := nil; + View := RootView; + repeat + if Assigned(View.FSelected) and View.FMouseOverSelected then begin + AView := View; + AViewer := View.FSelected; + Break; + end; + if vsMouseInWindow in View.FState then begin + { ...there is no current selection, but the mouse is still in the + window. This can happen if the mouse is over the non-client area + of the toolbar or popup window, or in an area not containing an + item. } + AView := View; + Break; + end; + View := View.FOpenViewerView; + until View = nil; + end; + Result := Assigned(AViewer); + end; + + function ContinueLoop: Boolean; + begin + { Don't continue if the mouse capture is lost, if a (modeless) top-level + window is shown causing the active window to change, or if EndModal* was + called. } + Result := (GetCapture = FWnd) and (GetActiveWindow = OriginalActiveWindow) + and not RootView.IsModalEnding; + end; + + function SendKeyEvent(const View: TTBView; var Key: Word; + const Shift: TShiftState): Boolean; + begin + Result := True; + if Assigned(View.FSelected) then begin + View.FSelected.KeyDown(Key, Shift); + if RootView.IsModalEnding then + Exit; + end; + if Key <> 0 then begin + View.KeyDown(Key, Shift); + if RootView.IsModalEnding then + Exit; + end; + Result := False; + end; + + procedure DoHintMouseMessage(const Ctl: TControl; const P: TPoint); + var + M: TMessage; + begin + {$IFDEF CLR} + M := TMessage.Create; + {$ENDIF} + M.Msg := WM_MOUSEMOVE; + M.WParam := 0; + M.LParam := MAKELPARAM(Word(P.X), Word(P.Y)); + M.Result := 0; + Application.HintMouseMessage(Ctl, M); + end; + + procedure MouseMoved; + var + Cursor: HCURSOR; + View: TTBView; + Viewer: TTBItemViewer; + P: TPoint; + begin + UpdateAllSelections(LastPos, True); + Cursor := 0; + if GetSelectedViewer(View, Viewer) then begin + P := View.FWindow.ScreenToClient(LastPos); + if ((vsAlwaysShowHints in View.FStyle) or + (tboShowHint in Viewer.Item.FEffectiveOptions)) and not View.FCapture then begin + { Display popup hint for the item. Update is called + first to minimize flicker caused by the hiding & + showing of the hint window. } + View.FWindow.Update; + DoHintMouseMessage(View.FWindow, P); + end + else + Application.CancelHint; + Dec(P.X, Viewer.BoundsRect.Left); + Dec(P.Y, Viewer.BoundsRect.Top); + Viewer.GetCursor(P, Cursor); + end + else + Application.CancelHint; + if Cursor = 0 then + Cursor := LoadCursor(0, IDC_ARROW); + SetCursor(Cursor); + if Assigned(Viewer) then + Viewer.MouseMove(P.X, P.Y); + end; + + procedure UpdateAppHint; + var + View: TTBView; + begin + View := RootView; + while Assigned(View.FOpenViewerView) and Assigned(View.FOpenViewerView.FSelected) do + View := View.FOpenViewerView; + if Assigned(View.FSelected) then + Application.Hint := GetLongHint(View.FSelected.Item.Hint) + else + Application.Hint := ''; + end; + + procedure HandleTimer(const View: TTBView; const ID: TTBViewTimerID); + begin + case ID of + tiOpen: begin + { Similar to standard menus, always close child popups, even if + Selected = OpenViewer. + Note: CloseChildPopups and OpenChildPopup will stop the tiClose + and tiOpen timers respectively. } + View.CloseChildPopups; + View.OpenChildPopup(False); + end; + tiClose: begin + { Note: CloseChildPopups stops the tiClose timer. } + View.CloseChildPopups; + end; + tiScrollUp: begin + if View.FShowUpArrow then + View.Scroll(False) + else + View.StopTimer(tiScrollUp); + end; + tiScrollDown: begin + if View.FShowDownArrow then + View.Scroll(True) + else + View.StopTimer(tiScrollDown); + end; + end; + end; + +var + MouseDownOnMenu: Boolean; + Msg: TMsg; + P: TPoint; + Ctl: TControl; + View: TTBView; + ConvertedKey: Char; + IsOnlyItemWithAccel: Boolean; + MouseIsDown: Boolean; + Key: Word; + Shift: TShiftState; + Viewer: TTBItemViewer; +begin + RootView.FDoneActionData.DoneAction := tbdaNone; + RootView.ValidatePositions; + try + try + RootView.FCaptureWnd := FWnd; + MouseDownOnMenu := False; + if AMouseDown then begin + P := RootView.FSelected.ScreenToClient(GetMessagePosAsPoint); + RootView.FSelected.MouseDown([], P.X, P.Y, MouseDownOnMenu); + if RootView.IsModalEnding then + Exit; + MouseDownOnMenu := False; { never set MouseDownOnMenu to True on first click } + end + else if AExecuteSelected then begin + RootView.ExecuteSelected(not AFromMSAA); + if RootView.IsModalEnding then + Exit; + end; + OriginalActiveWindow := GetActiveWindow; + while ContinueLoop do begin + TBUpdateAnimation; + { Examine the next message before popping it out of the queue } + if not PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE) then begin + { No message available; wait for one to arrive } + if TBIsAnimationInProgress then + { While animating, if no message arrives within 1 ms, loop back and + call TBUpdateAnimation again to see if it's ready for a new frame. + Note: We don't use a timer to call TBUpdateAnimation because on + Windows 98, timers only have a resolution of 55 ms in my tests, + too poor for smooth animation. (timeBeginPeriod does not help.) + Sleep and MsgWaitForMultipleObjects, on the other hand, appear to + have a resolution of 5 ms by default. (Better resolution is + possible with a call to timeBeginPeriod, but we don't need it.) + Note: On 2000/XP, timers and Sleep both have a resolution of 10-15 + ms by default. } + MsgWaitForMultipleObjects(0, {$IFNDEF CLR} THandle(nil^) {$ELSE} [] {$ENDIF}, + False, 1, QS_ALLINPUT) + else + WaitMessage; + Continue; + end; + case Msg.message of + WM_LBUTTONDOWN, WM_RBUTTONDOWN: begin + P := Msg.pt; + Ctl := FindDragTarget(P, True); + { Was the mouse not clicked on a popup, or was it clicked on a + popup that is not a child of RootView? + (The latter can happen when in customization mode, for example, + if the user right-clicks a popup menu being customized and + the context menu is displayed.) } + if not(Ctl is TTBPopupWindow) or + not RootView.ContainsView(TTBPopupWindow(Ctl).View) then begin + { If the root view is a popup, or if the root view is a toolbar + and the user clicked outside the toolbar or in its non-client + area (e.g. on its drag handle), exit } + if RootView.FIsPopup or (Ctl <> RootView.FWindow) or + not PtInRect(RootView.FWindow.ClientRect, RootView.FWindow.ScreenToClient(P)) then + Exit + else + if Msg.message = WM_LBUTTONDOWN then begin + { If the user clicked inside a toolbar on anything but an + item, exit } + UpdateAllSelections(P, True); + if (RootView.FSelected = nil) or not RootView.FMouseOverSelected or + (tbisClicksTransparent in RootView.FSelected.Item.ItemStyle) then + Exit; + end; + end; + end; + end; + { Now pop the message out of the queue } + if not PeekMessage(Msg, 0, Msg.message, Msg.message, PM_REMOVE or PM_NOYIELD) then + Continue; + case Msg.message of + $4D: + { This undocumented message is sent to the focused window when + F1 is pressed. Windows handles it by sending a WM_HELP message + to the same window. We don't want this to happen while a menu + is up, so swallow the message. } + ; + WM_CONTEXTMENU: + { Windows still sends WM_CONTEXTMENU messages for "context menu" + keystrokes even if WM_KEYUP messages are never dispatched, + so it must specifically ignore this message } + ; + WM_KEYFIRST..WM_KEYLAST: begin + Application.CancelHint; + MouseIsDown := (GetKeyState(VK_LBUTTON) < 0) or + (TrackRightButton and (GetKeyState(VK_RBUTTON) < 0)); + case Msg.message of + WM_KEYDOWN, WM_SYSKEYDOWN: + begin + if Msg.wParam = VK_PROCESSKEY then + { Don't let IME process the key } + Msg.wParam := WPARAM(ImmGetVirtualKey(Msg.hwnd)); + Key := Word(Msg.wParam); + if not MouseIsDown or (Key = VK_F1) then begin + if SendKeyEvent(GetActiveView, Key, + KeyDataToShiftState(ClipToLongint(Msg.lParam))) then + Exit; + { If it's not handled by a KeyDown method, translate + it into a WM_*CHAR message } + if Key <> 0 then + TranslateMessage(Msg); + end; + end; + WM_CHAR, WM_SYSCHAR: + if not MouseIsDown then begin + Key := Word(Msg.wParam); + View := GetActiveView; + {$IFDEF CLR} + { On .NET, under Windows 9x/Me we must convert the character + code from ANSI->Unicode. (We shouldn't get any double-byte + characters due to our VK_PROCESSKEY handling above.) } + if Marshal.SystemDefaultCharSize = 1 then + ConvertedKey := Encoding.GetEncoding(GetInputLocaleCodePage). + GetChars([Byte(Key)])[0] + else + {$ENDIF} + ConvertedKey := Chr(Key); + Viewer := View.NextSelectableWithAccel(View.FSelected, + ConvertedKey, False, IsOnlyItemWithAccel); + if Viewer = nil then begin + if (Key in [VK_SPACE, Ord('-')]) and + not RootView.FIsPopup and (View = RootView) and + (GetActiveWindow <> 0) then begin + RootView.EndModalWithSystemMenu(GetActiveWindow, Key); + Exit; + end + else + MessageBeep(0); + end + else begin + View.Selected := Viewer; + View.ScrollSelectedIntoView; + if IsOnlyItemWithAccel then + View.ExecuteSelected(True); + end; + end; + end; + end; + WM_TIMER: + begin + Ctl := FindControl(Msg.hwnd); + if Assigned(Ctl) and (Ctl is TTBPopupWindow) and + (Msg.wParam >= ViewTimerBaseID + Ord(Low(TTBViewTimerID))) and + (Msg.wParam <= ViewTimerBaseID + Ord(High(TTBViewTimerID))) then begin + if Assigned(TTBPopupWindow(Ctl).FView) then + HandleTimer(TTBPopupWindow(Ctl).FView, + TTBViewTimerID(Msg.wParam - ViewTimerBaseID)); + end + else + DispatchMessage(Msg); + end; + $118: ; + { ^ Like standard menus, don't dispatch WM_SYSTIMER messages + (the internal Windows message used for things like caret + blink and list box scrolling). } + WM_MOUSEFIRST..WM_MOUSELAST: + case Msg.message of + WM_MOUSEMOVE: begin + if (Msg.pt.X <> LastPos.X) or (Msg.pt.Y <> LastPos.Y) then begin + LastPos := Msg.pt; + MouseMoved; + end; + end; + WM_MOUSEWHEEL: + if GetSelectedViewer(View, Viewer) then begin + P := Viewer.ScreenToClient(Msg.pt); + Viewer.MouseWheel(Smallint(Msg.wParam shr 16), P.X, P.Y); + end; + WM_LBUTTONDOWN, WM_LBUTTONDBLCLK, WM_RBUTTONDOWN: + if (Msg.message <> WM_RBUTTONDOWN) or TrackRightButton then begin + Application.CancelHint; + MouseDownOnMenu := False; + Exclude(RootView.FState, vsIgnoreFirstMouseUp); + UpdateAllSelections(Msg.pt, True); + if GetSelectedViewer(View, Viewer) then begin + if Msg.message <> WM_LBUTTONDBLCLK then + Shift := [] + else + Shift := [ssDouble]; + P := Viewer.ScreenToClient(Msg.pt); + Viewer.MouseDown(Shift, P.X, P.Y, MouseDownOnMenu); + LastPos := GetMessagePosAsPoint; + end; + end; + WM_LBUTTONUP, WM_RBUTTONUP: + if (Msg.message = WM_LBUTTONUP) or TrackRightButton then begin + UpdateAllSelections(Msg.pt, False); + { ^ False is used so that when a popup menu is + displayed with the cursor currently inside it, the item + under the cursor won't be accidentally selected when the + user releases the button. The user must move the mouse at + at least one pixel (generating a WM_MOUSEMOVE message), + and then release the button. } + if not GetSelectedViewer(View, Viewer) then begin + { Mouse was not released over any item. Cancel out of the + loop if it's outside all views, or is inside unused + space on a topmost toolbar } + if not Assigned(View) or + ((View = RootView) and RootView.FIsToolbar) then begin + if not(vsIgnoreFirstMouseUp in RootView.FState) then + Exit + else + Exclude(RootView.FState, vsIgnoreFirstMouseUp); + end; + end + else begin + P := Viewer.ScreenToClient(Msg.pt); + Viewer.MouseUp(P.X, P.Y, MouseDownOnMenu); + end; + end; + end; + else + DispatchMessage(Msg); + end; + if not ContinueLoop then + Exit; + if LastPos.X = Low(LastPos.X) then begin + { The capture was released; generate a fake mouse movement to update + the selection } + LastPos := GetMessagePosAsPoint; + MouseMoved; + end; + UpdateAppHint; + end; + finally + RootView.CancelCapture; + end; + finally + RootView.FCaptureWnd := 0; + Application.Hint := ''; + { Make sure there are no outstanding WM_*CHAR messages } + RemoveMessages(WM_CHAR, WM_DEADCHAR); + RemoveMessages(WM_SYSCHAR, WM_SYSDEADCHAR); + { Nor any outstanding 'send WM_HELP' messages caused by an earlier press + of the F1 key } + RemoveMessages($4D, $4D); + end; +end; + + +{ TTBPopupView } + +procedure TTBPopupView.AutoSize(AWidth, AHeight: Integer); +begin + with FWindow do + SetBounds(Left, Top, AWidth + (PopupMenuWindowNCSize * 2), + AHeight + (PopupMenuWindowNCSize * 2)); +end; + +function TTBPopupView.GetFont: TFont; +begin + Result := (Owner as TTBPopupWindow).Font; +end; + + +{ TTBPopupWindow } + +constructor TTBPopupWindow.CreatePopupWindow(AOwner: TComponent; + const AParentView: TTBView; const AItem: TTBCustomItem; + const ACustomizing: Boolean); +begin + inherited Create(AOwner); + Visible := False; + SetBounds(0, 0, 320, 240); + ControlStyle := ControlStyle - [csCaptureMouse]; + ShowHint := True; + Color := tbMenuBkColor; + FView := GetViewClass.Create(Self, AParentView, AItem, Self, False, + ACustomizing, False); + Include(FView.FState, vsModal); + + { Inherit the font from the parent view, or use the system menu font if + there is no parent view } + if Assigned(AParentView) then + Font.Assign(AParentView.GetFont) + else + Font.Assign(ToolbarFont); + + { Inherit the accelerator visibility state from the parent view. If there + is no parent view (i.e. it's a standalone popup menu), then default to + hiding accelerator keys, but change this in CreateWnd if the last input + came from the keyboard. } + if Assigned(AParentView) then begin + if vsUseHiddenAccels in AParentView.FStyle then + Include(FView.FStyle, vsUseHiddenAccels); + if vsShowAccels in AParentView.FState then + Include(FView.FState, vsShowAccels); + end + else + Include(FView.FStyle, vsUseHiddenAccels); + + if Application.Handle <> 0 then + { Use Application.Handle if possible so that the taskbar button for the app + doesn't pop up when a TTBEditItem on a popup menu is focused } + ParentWindow := Application.Handle + else + { When Application.Handle is zero, use GetDesktopWindow() as the parent + window, not zero, otherwise UpdateControlState won't show the window } + ParentWindow := GetDesktopWindow; +end; + +destructor TTBPopupWindow.Destroy; +begin + Destroying; + { Before destroying the window handle we need to close any child popups so + that pixels behind the popups are properly restored without generating a + WM_PAINT message. } + if Assigned(FView) then + FView.CloseChildPopups; + { Ensure window handle is destroyed *before* FView is freed, since + DestroyWindowHandle calls CallNotifyWinEvent which may result in + FView.HandleWMObject being called } + if HandleAllocated then + DestroyWindowHandle; + FreeAndNil(FView); + inherited; +end; + +function TTBPopupWindow.GetViewClass: TTBViewClass; +begin + Result := TTBPopupView; +end; + +procedure TTBPopupWindow.CreateParams(var Params: TCreateParams); +const + CS_DROPSHADOW = $00020000; +begin + inherited; + with Params do begin + Style := (Style and not (WS_CHILD or WS_GROUP or WS_TABSTOP)) or WS_POPUP; + ExStyle := ExStyle or WS_EX_TOPMOST or WS_EX_TOOLWINDOW; + WindowClass.Style := WindowClass.Style or CS_SAVEBITS; + { Enable drop shadow effect on Windows XP and later } + if IsWindowsXP then + WindowClass.Style := WindowClass.Style or CS_DROPSHADOW; + end; +end; + +procedure TTBPopupWindow.CreateWnd; +const + WM_CHANGEUISTATE = $0127; + WM_QUERYUISTATE = $0129; + UIS_INITIALIZE = 3; + UISF_HIDEACCEL = $2; +var + B: Boolean; +begin + inherited; + { On a top-level popup window, send WM_CHANGEUISTATE & WM_QUERYUISTATE + messages to the window to see if the last input came from the keyboard + and if the accelerator keys should be shown } + if (FView.ParentView = nil) and not FAccelsVisibilitySet then begin + FAccelsVisibilitySet := True; + SendMessage(Handle, WM_CHANGEUISTATE, UIS_INITIALIZE, 0); + B := (SendMessage(Handle, WM_QUERYUISTATE, 0, 0) and UISF_HIDEACCEL = 0); + FView.SetAccelsVisibility(B); + end; +end; + +procedure TTBPopupWindow.DestroyWindowHandle; +begin + { Before destroying the window handle, we must stop any animation, otherwise + the animation thread will use an invalid handle } + TBEndAnimation(WindowHandle); + { Cleanly destroy any timers before the window handle is destroyed } + if Assigned(FView) then + FView.StopAllTimers; + CallNotifyWinEvent(EVENT_SYSTEM_MENUPOPUPEND, WindowHandle, OBJID_CLIENT, + CHILDID_SELF); + inherited; +end; + +procedure TTBPopupWindow.WMGetObject(var Message: TMessage); +begin + if not FView.HandleWMGetObject(Message) then + inherited; +end; + +procedure TTBPopupWindow.CMShowingChanged(var Message: TMessage); +const + ShowFlags: array[Boolean] of UINT = ( + SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_HIDEWINDOW, + SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_SHOWWINDOW); + SPI_GETMENUFADE = $1012; +var + Blend: Boolean; +begin + { Must override TCustomForm/TForm's CM_SHOWINGCHANGED handler so that the + form doesn't get activated when Visible is set to True. } + + { Handle animation. NOTE: I do not recommend trying to enable animation on + Windows 95 and NT 4.0 because there's a difference in the way the + SetWindowPos works on those versions. See the comment in the + TBStartAnimation function of TB2Anim.pas. } + {$IFNDEF TB2K_NO_ANIMATION} + if ((FView.ParentView = nil) or not(vsNoAnimation in FView.FParentView.FState)) and + Showing and (FView.Selected = nil) and not IsWindowVisible(WindowHandle) and + GetSystemParametersInfoBool(SPI_GETMENUANIMATION, False) then begin + Blend := GetSystemParametersInfoBool(SPI_GETMENUFADE, False); + if Blend or (FAnimationDirection <> []) then begin + TBStartAnimation(WindowHandle, Blend, FAnimationDirection); + Exit; + end; + end; + {$ENDIF} + + { No animation... } + if not Showing then begin + { Call TBEndAnimation to ensure WS_EX_LAYERED style is removed before + hiding, otherwise windows under the popup window aren't repainted + properly. } + TBEndAnimation(WindowHandle); + end; + SetWindowPos(WindowHandle, 0, 0, 0, 0, 0, ShowFlags[Showing]); +end; + +procedure TTBPopupWindow.WMEraseBkgnd(var Message: TWMEraseBkgnd); +begin + { May be necessary in some cases... } + TBEndAnimation(WindowHandle); + inherited; +end; + +procedure TTBPopupWindow.WMPaint(var Message: TWMPaint); +begin + { Must abort animation when a WM_PAINT message is received } + TBEndAnimation(WindowHandle); + inherited; +end; + +procedure TTBPopupWindow.Paint; +begin + FView.DrawSubitems(Canvas); + PaintScrollArrows; +end; + +procedure TTBPopupWindow.PaintScrollArrows; + + procedure DrawArrow(const R: TRect; ADown: Boolean); + var + X, Y: Integer; + P: array[0..2] of TPoint; + begin + X := (R.Left + R.Right) div 2; + Y := (R.Top + R.Bottom) div 2; + Dec(Y); + P[0].X := X-3; + P[0].Y := Y; + P[1].X := X+3; + P[1].Y := Y; + P[2].X := X; + P[2].Y := Y; + if ADown then + Inc(P[2].Y, 3) + else begin + Inc(P[0].Y, 3); + Inc(P[1].Y, 3); + end; + Canvas.Pen.Color := tbMenuTextColor; + Canvas.Brush.Color := tbMenuTextColor; + Canvas.Polygon(P); + end; + +begin + if FView.FShowUpArrow then + DrawArrow(Rect(0, 0, ClientWidth, tbMenuScrollArrowHeight), False); + if FView.FShowDownArrow then + DrawArrow(Bounds(0, ClientHeight - tbMenuScrollArrowHeight, + ClientWidth, tbMenuScrollArrowHeight), True); +end; + +procedure TTBPopupWindow.WMClose(var Message: TWMClose); +begin + { do nothing -- ignore Alt+F4 keypresses } +end; + +procedure TTBPopupWindow.WMNCCalcSize(var Message: TWMNCCalcSize); + + procedure ApplyToRect(var R: TRect); + begin + InflateRect(R, -PopupMenuWindowNCSize, -PopupMenuWindowNCSize); + end; + +{$IFDEF CLR} +var + Params: TNCCalcSizeParams; +{$ENDIF} +begin + {$IFNDEF CLR} + ApplyToRect(Message.CalcSize_Params.rgrc[0]); + {$ELSE} + Params := Message.CalcSize_Params; + ApplyToRect(Params.rgrc0); + Message.CalcSize_Params := Params; + {$ENDIF} + inherited; +end; + +procedure PopupWindowNCPaintProc(Wnd: HWND; DC: HDC; AppData: TObject); +var + R: TRect; + {$IFNDEF TB2K_USE_STRICT_O2K_MENU_STYLE} + Brush: HBRUSH; + {$ENDIF} +begin + GetWindowRect(Wnd, R); OffsetRect(R, -R.Left, -R.Top); + {$IFNDEF TB2K_USE_STRICT_O2K_MENU_STYLE} + if not AreFlatMenusEnabled then begin + {$ENDIF} + DrawEdge(DC, R, EDGE_RAISED, BF_RECT or BF_ADJUST); + FrameRect(DC, R, GetSysColorBrush(COLOR_BTNFACE)); + {$IFNDEF TB2K_USE_STRICT_O2K_MENU_STYLE} + end + else begin + FrameRect(DC, R, GetSysColorBrush(COLOR_BTNSHADOW)); + Brush := CreateSolidBrush(ColorToRGB(TTBPopupWindow(AppData).Color)); + InflateRect(R, -1, -1); + FrameRect(DC, R, Brush); + InflateRect(R, -1, -1); + FrameRect(DC, R, Brush); + DeleteObject(Brush); + end; + {$ENDIF} +end; + +procedure TTBPopupWindow.WMNCPaint(var Message: TMessage); +var + DC: HDC; +begin + DC := GetWindowDC(Handle); + try + SelectNCUpdateRgn(Handle, DC, HRGN(Message.WParam)); + PopupWindowNCPaintProc(Handle, DC, Self); + finally + ReleaseDC(Handle, DC); + end; +end; + +procedure TTBPopupWindow.WMPrint(var Message: TMessage); +begin + HandleWMPrint(Handle, Message, PopupWindowNCPaintProc, Self); +end; + +procedure TTBPopupWindow.WMPrintClient(var Message: + {$IFNDEF CLR} TMessage {$ELSE} TWMPrintClient {$ENDIF}); +begin + HandleWMPrintClient(PaintHandler, Message); +end; + +procedure TTBPopupWindow.CMHintShow(var Message: TCMHintShow); +begin + FView.HandleHintShowMessage(Message); +end; + + +{ TTBItemContainer } + +constructor TTBItemContainer.Create(AOwner: TComponent); +begin + inherited; + FItem := TTBRootItem.Create(Self); + FItem.ParentComponent := Self; +end; + +destructor TTBItemContainer.Destroy; +begin + FItem.Free; + inherited; +end; + +function TTBItemContainer.GetItems: TTBCustomItem; +begin + Result := FItem; +end; + +procedure TTBItemContainer.GetChildren(Proc: TGetChildProc; Root: TComponent); +begin + FItem.GetChildren(Proc, Root); +end; + +function TTBItemContainer.GetImages: TCustomImageList; +begin + Result := FItem.SubMenuImages; +end; + +procedure TTBItemContainer.SetImages(Value: TCustomImageList); +begin + FItem.SubMenuImages := Value; +end; + + +{ TTBPopupMenu } + +constructor TTBPopupMenu.Create(AOwner: TComponent); +begin + inherited; + FItem := GetRootItemClass.Create(Self); + FItem.ParentComponent := Self; + FItem.OnClick := RootItemClick; +end; + +destructor TTBPopupMenu.Destroy; +begin + FItem.Free; + inherited; +end; + +function TTBPopupMenu.GetItems: TTBCustomItem; +begin + Result := FItem; +end; + +procedure TTBPopupMenu.GetChildren(Proc: TGetChildProc; Root: TComponent); +begin + FItem.GetChildren(Proc, Root); +end; + +procedure TTBPopupMenu.SetChildOrder(Child: TComponent; Order: Integer); +begin + FItem.SetChildOrder(Child, Order); +end; + +function TTBPopupMenu.GetRootItemClass: TTBRootItemClass; +begin + Result := TTBRootItem; +end; + +function TTBPopupMenu.GetImages: TCustomImageList; +begin + Result := FItem.SubMenuImages; +end; + +function TTBPopupMenu.GetLinkSubitems: TTBCustomItem; +begin + Result := FItem.LinkSubitems; +end; + +function TTBPopupMenu.GetOptions: TTBItemOptions; +begin + Result := FItem.Options; +end; + +procedure TTBPopupMenu.SetImages(Value: TCustomImageList); +begin + FItem.SubMenuImages := Value; +end; + +procedure TTBPopupMenu.SetLinkSubitems(Value: TTBCustomItem); +begin + FItem.LinkSubitems := Value; +end; + +procedure TTBPopupMenu.SetOptions(Value: TTBItemOptions); +begin + FItem.Options := Value; +end; + +procedure TTBPopupMenu.RootItemClick(Sender: TObject); +begin + if Sender = FItem then + Sender := Self; + DoPopup(Sender); +end; + +{$IFNDEF JR_D5} +procedure TTBPopupMenu.DoPopup(Sender: TObject); +begin + if Assigned(OnPopup) then OnPopup(Sender); +end; +{$ENDIF} + +procedure TTBPopupMenu.Popup(X, Y: Integer); +begin + PopupEx(X, Y, False); +end; + +function TTBPopupMenu.PopupEx(X, Y: Integer; + ReturnClickedItemOnly: Boolean = False): TTBCustomItem; +begin + {$IFDEF JR_D5} + {$IFDEF JR_D9} + SetPopupPoint(Point(X, Y)); + {$ELSE} + PPoint(@PopupPoint)^ := Point(X, Y); + {$ENDIF} + {$ENDIF} + Result := FItem.Popup(X, Y, TrackButton = tbRightButton, + TTBPopupAlignment(Alignment), ReturnClickedItemOnly); +end; + +function TTBPopupMenu.IsShortCut(var Message: TWMKey): Boolean; +begin + Result := FItem.IsShortCut(Message); +end; + + +{ TTBImageList } + +constructor TTBCustomImageList.Create(AOwner: TComponent); +begin + inherited; + FCheckedImagesChangeLink := TChangeLink.Create; + FCheckedImagesChangeLink.OnChange := ImageListChanged; + FDisabledImagesChangeLink := TChangeLink.Create; + FDisabledImagesChangeLink.OnChange := ImageListChanged; + FHotImagesChangeLink := TChangeLink.Create; + FHotImagesChangeLink.OnChange := ImageListChanged; + FImagesBitmap := TBitmap.Create; + FImagesBitmap.OnChange := ImagesBitmapChanged; + FImagesBitmapMaskColor := clFuchsia; +end; + +destructor TTBCustomImageList.Destroy; +begin + FreeAndNil(FImagesBitmap); + FreeAndNil(FHotImagesChangeLink); + FreeAndNil(FDisabledImagesChangeLink); + FreeAndNil(FCheckedImagesChangeLink); + inherited; +end; + +procedure TTBCustomImageList.ImagesBitmapChanged(Sender: TObject); +begin + if not ImagesBitmap.Empty then begin + Clear; + AddMasked(ImagesBitmap, FImagesBitmapMaskColor); + end; +end; + +procedure TTBCustomImageList.ImageListChanged(Sender: TObject); +begin + Change; +end; + +{$IFDEF CLR} +procedure TTBCustomImageList.WriteLeft(Writer: TWriter); +begin + Writer.WriteInteger(DesignInfo shr 16); +end; + +procedure TTBCustomImageList.WriteTop(Writer: TWriter); +begin + Writer.WriteInteger(DesignInfo and $FFFF); +end; +{$ENDIF} + +procedure TTBCustomImageList.DefineProperties(Filer: TFiler); +{$IFNDEF CLR} +type + TProc = procedure(ASelf: TObject; Filer: TFiler); +{$ELSE} +var + Ancestor: TComponent; + AncestorInfo: Longint; + DesignInfo: Longint; +{$ENDIF} +begin + if (Filer is TReader) or FImagesBitmap.Empty then + inherited + else begin + {$IFNDEF CLR} + { Bypass TCustomImageList.DefineProperties when we've got an ImageBitmap } + TProc(@TComponentAccess.DefineProperties)(Self, Filer); + {$ELSE} + { On .NET I'm not aware of any way to bypass an inherited method, so we + have to handle DefineProperties all by ourself. The following code is + copied from TComponentHelper.DefineProperties, with references to + private fields changed and the Read* methods removed. } + AncestorInfo := 0; + DesignInfo := Self.DesignInfo; + Ancestor := TComponent(Filer.Ancestor); + if Ancestor <> nil then + AncestorInfo := Ancestor.DesignInfo; + Filer.DefineProperty('Left', nil, WriteLeft, (DesignInfo and $FFFF) <> + (AncestorInfo and $FFFF)); + Filer.DefineProperty('Top', nil, WriteTop, (DesignInfo shr 16) <> + (AncestorInfo shr 16)); + {$ENDIF} + end; +end; + +procedure TTBCustomImageList.DrawState(Canvas: TCanvas; X, Y, Index: Integer; + Enabled, Selected, Checked: Boolean); +begin + if not Enabled and Assigned(DisabledImages) then + DisabledImages.Draw(Canvas, X, Y, Index) + else if Checked and Assigned(CheckedImages) then + CheckedImages.Draw(Canvas, X, Y, Index, Enabled) + else if Selected and Assigned(HotImages) then + HotImages.Draw(Canvas, X, Y, Index, Enabled) + else + Draw(Canvas, X, Y, Index, Enabled); +end; + +procedure TTBCustomImageList.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited; + if Operation = opRemove then begin + if AComponent = CheckedImages then CheckedImages := nil; + if AComponent = DisabledImages then DisabledImages := nil; + if AComponent = HotImages then HotImages := nil; + end; +end; + +procedure TTBCustomImageList.ChangeImages(var AImageList: TCustomImageList; + Value: TCustomImageList; AChangeLink: TChangeLink); +begin + if Value = Self then + Value := nil; + if AImageList <> Value then begin + if Assigned(AImageList) then + AImageList.UnregisterChanges(AChangeLink); + AImageList := Value; + if Assigned(Value) then begin + Value.RegisterChanges(AChangeLink); + Value.FreeNotification(Self); + end; + { Don't call Change while loading because it causes the Delphi IDE to + think the form has been modified (?). Also, don't call Change while + destroying since there's no reason to. } + if not(csLoading in ComponentState) and + not(csDestroying in ComponentState) then + Change; + end; +end; + +procedure TTBCustomImageList.SetCheckedImages(Value: TCustomImageList); +begin + ChangeImages(FCheckedImages, Value, FCheckedImagesChangeLink); +end; + +procedure TTBCustomImageList.SetDisabledImages(Value: TCustomImageList); +begin + ChangeImages(FDisabledImages, Value, FDisabledImagesChangeLink); +end; + +procedure TTBCustomImageList.SetHotImages(Value: TCustomImageList); +begin + ChangeImages(FHotImages, Value, FHotImagesChangeLink); +end; + +procedure TTBCustomImageList.SetImagesBitmap(Value: TBitmap); +begin + FImagesBitmap.Assign(Value); +end; + +procedure TTBCustomImageList.SetImagesBitmapMaskColor(Value: TColor); +begin + if FImagesBitmapMaskColor <> Value then begin + FImagesBitmapMaskColor := Value; + ImagesBitmapChanged(nil); + end; +end; + + +{ TTBBaseAccObject } + +{ According to the MSAA docs: + "With Active Accessibility 2.0, servers can return E_NOTIMPL from IDispatch + methods and Active Accessibility will implement the IAccessible interface + for them." + And there was much rejoicing. } + +{$IFNDEF CLR} +function TTBBaseAccObject.GetIDsOfNames(const IID: TGUID; Names: Pointer; + NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; +begin + Result := E_NOTIMPL; +end; + +function TTBBaseAccObject.GetTypeInfo(Index, LocaleID: Integer; + out TypeInfo): HResult; +begin + Result := E_NOTIMPL; +end; + +function TTBBaseAccObject.GetTypeInfoCount(out Count: Integer): HResult; +begin + Result := E_NOTIMPL; +end; + +function TTBBaseAccObject.Invoke(DispID: Integer; const IID: TGUID; + LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, + ArgErr: Pointer): HResult; +begin + Result := E_NOTIMPL; +end; +{$ENDIF} + + +{ Initialization & finalization } + +procedure TBInitToolbarSystemFont; +var + NonClientMetrics: TNonClientMetrics; +begin + if GetSystemNonClientMetrics(NonClientMetrics) then + ToolbarFont.Handle := CreateFontIndirect(NonClientMetrics.lfMenuFont); +end; + +initialization + ToolbarFont := TFont.Create; + TBInitToolbarSystemFont; +finalization + DestroyClickWnd; + FreeAndNil(ToolbarFont); +end. diff --git a/internal/2.2.2/1/Source/TB2MDI.pas b/internal/2.2.2/1/Source/TB2MDI.pas new file mode 100644 index 0000000..09ec768 --- /dev/null +++ b/internal/2.2.2/1/Source/TB2MDI.pas @@ -0,0 +1,714 @@ +unit TB2MDI; + +{ + Toolbar2000 + Copyright (C) 1998-2008 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2MDI.pas,v 1.15 2008/04/23 21:54:37 jr Exp $ +} + +interface + +{$I TB2Ver.inc} + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + Menus, TB2Item, TB2Toolbar; + +type + TTBMDIButtonsItem = class; + TTBMDISystemMenuItem = class; + + TTBMDIHandler = class(TComponent) + private + FButtonsItem: TTBMDIButtonsItem; + FSystemMenuItem: TTBMDISystemMenuItem; + FToolbar: TTBCustomToolbar; + procedure SetToolbar(Value: TTBCustomToolbar); + protected + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + published + property Toolbar: TTBCustomToolbar read FToolbar write SetToolbar; + end; + + TTBMDIWindowItem = class(TTBCustomItem) + private + FForm: TForm; + FOnUpdate: TNotifyEvent; + FWindowMenu: TMenuItem; + procedure ItemClick(Sender: TObject); + procedure SetForm(AForm: TForm); + protected + procedure EnabledChanged; override; + procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + public + constructor Create(AOwner: TComponent); override; + procedure InitiateAction; override; + published + property Enabled; + property OnUpdate: TNotifyEvent read FOnUpdate write FOnUpdate; + end; + + TTBMDISystemMenuItem = class(TTBCustomItem) + private + FImageList: TImageList; + procedure CommandClick(Sender: TObject); + protected + function GetItemViewerClass(AView: TTBView): TTBItemViewerClass; override; + public + constructor Create(AOwner: TComponent); override; + procedure Click; override; + end; + + TTBMDISystemMenuItemViewer = class(TTBItemViewer) + protected + procedure CalcSize(const Canvas: TCanvas; var AWidth, AHeight: Integer); + override; + procedure Paint(const Canvas: TCanvas; const ClientAreaRect: TRect; + IsSelected, IsPushed, UseDisabledShadow: Boolean); override; + end; + + TTBMDIButtonType = (tbmbMinimize, tbmbRestore, tbmbClose); + + TTBMDIButtonItem = class(TTBCustomItem) + private + FButtonType: TTBMDIButtonType; + protected + function GetItemViewerClass(AView: TTBView): TTBItemViewerClass; override; + public + constructor Create(AOwner: TComponent); override; + end; + + TTBMDIButtonItemViewer = class(TTBItemViewer) + protected + procedure CalcSize(const Canvas: TCanvas; var AWidth, AHeight: Integer); + override; + procedure Paint(const Canvas: TCanvas; const ClientAreaRect: TRect; + IsSelected, IsPushed, UseDisabledShadow: Boolean); override; + end; + + TTBMDISepItem = class(TTBSeparatorItem) + protected + function GetItemViewerClass(AView: TTBView): TTBItemViewerClass; override; + end; + + TTBMDISepItemViewer = class(TTBSeparatorItemViewer) + protected + procedure CalcSize(const Canvas: TCanvas; var AWidth, AHeight: Integer); + override; + end; + + TTBMDIButtonsItem = class(TTBCustomItem) + private + FMinimizeItem: TTBMDIButtonItem; + FRestoreItem: TTBMDIButtonItem; + FCloseItem: TTBMDIButtonItem; + FSep1, FSep2: TTBMDISepItem; + procedure InvalidateSystemMenuItem; + procedure ItemClick(Sender: TObject); + procedure UpdateState(W: HWND; Maximized: Boolean); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + end; + +implementation + +uses + {$IFDEF CLR} System.Text, System.Runtime.InteropServices, WinUtils, {$ENDIF} + TB2Common, TB2Consts, CommCtrl; + +type + TTBCustomToolbarAccess = class(TTBCustomToolbar); + +function GetMenuItemStr(const AMenu: HMENU; const APos: Integer): String; +{$IFNDEF CLR} +var + Buf: array[0..1023] of Char; +begin + if GetMenuString(AMenu, APos, Buf, SizeOf(Buf) div SizeOf(Buf[0]), MF_BYPOSITION) > 0 then + Result := Buf + else + Result := ''; +end; +{$ELSE} +var + Buf: StringBuilder; +begin + Buf := StringBuilder.Create(1024); + if GetMenuString(AMenu, APos, Buf, Buf.Capacity, MF_BYPOSITION) > 0 then + Result := Buf.ToString + else + Result := ''; +end; +{$ENDIF} + + +{ TTBMDIHandler } + +constructor TTBMDIHandler.Create(AOwner: TComponent); +begin + inherited; + FSystemMenuItem := TTBMDISystemMenuItem.Create(Self); + FButtonsItem := TTBMDIButtonsItem.Create(Self); +end; + +destructor TTBMDIHandler.Destroy; +begin + Toolbar := nil; + inherited; +end; + +procedure TTBMDIHandler.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited; + if (AComponent = FToolbar) and (Operation = opRemove) then + Toolbar := nil; +end; + +procedure TTBMDIHandler.SetToolbar(Value: TTBCustomToolbar); +var + Rebuild: Boolean; +begin + if FToolbar <> Value then begin + if Assigned(FToolbar) then begin + Rebuild := False; + if TTBCustomToolbarAccess(FToolbar).FMDIButtonsItem = FButtonsItem then begin + TTBCustomToolbarAccess(FToolbar).FMDIButtonsItem := nil; + Rebuild := True; + end; + if TTBCustomToolbarAccess(FToolbar).FMDISystemMenuItem = FSystemMenuItem then begin + TTBCustomToolbarAccess(FToolbar).FMDISystemMenuItem := nil; + Rebuild := True; + end; + if Rebuild and Assigned(FToolbar.View) then + FToolbar.View.RecreateAllViewers; + end; + FToolbar := Value; + if Assigned(Value) then begin + Value.FreeNotification(Self); + TTBCustomToolbarAccess(Value).FMDIButtonsItem := FButtonsItem; + TTBCustomToolbarAccess(Value).FMDISystemMenuItem := FSystemMenuItem; + Value.View.RecreateAllViewers; + end; + end; +end; + + +{ TTBMDISystemMenuItem } + +constructor TTBMDISystemMenuItem.Create(AOwner: TComponent); +begin + inherited; + ItemStyle := ItemStyle + [tbisSubMenu, tbisDontSelectFirst] - + [tbisRedrawOnSelChange, tbisRedrawOnMouseOverChange]; + Caption := '&-'; + + {$R TB2MDI.res} + FImageList := TImageList.Create(Self); + FImageList.Handle := ImageList_LoadBitmap(HInstance, 'TB2SYSMENUIMAGES', + 16, 0, clSilver); + SubMenuImages := FImageList; +end; + +function TTBMDISystemMenuItem.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + Result := TTBMDISystemMenuItemViewer; +end; + +procedure TTBMDISystemMenuItem.Click; +var + I: Integer; + Form: TForm; + M: HMENU; + State: UINT; + ID: Word; + Item: TTBCustomItem; +begin + inherited; + Clear; + if Application.MainForm = nil then + Exit; + Form := Application.MainForm.ActiveMDIChild; + if Form = nil then + Exit; + M := GetSystemMenu(Form.Handle, False); + for I := 0 to GetMenuItemCount(M)-1 do begin + State := GetMenuState(M, I, MF_BYPOSITION); + if State and MF_SEPARATOR <> 0 then + Add(TTBSeparatorItem.Create(Self)) + else begin + Item := TTBCustomItem.Create(Self); + if State and MF_GRAYED <> 0 then + Item.Enabled := False; + Item.Caption := GetMenuItemStr(M, I); + ID := Word(GetMenuItemID(M, I)); + Item.Tag := {$IFDEF CLR}TTag{$ENDIF}(ID); + case ID and $FFF0 of + SC_RESTORE: Item.ImageIndex := 3; + SC_MINIMIZE: Item.ImageIndex := 2; + SC_MAXIMIZE: Item.ImageIndex := 1; + SC_CLOSE: begin + Item.ImageIndex := 0; + Item.Options := Item.Options + [tboDefault]; + end; + end; + Item.OnClick := CommandClick; + Add(Item); + end; + end; +end; + +procedure TTBMDISystemMenuItem.CommandClick(Sender: TObject); +var + Form: TForm; +begin + if Assigned(Application.MainForm) then begin + Form := Application.MainForm.ActiveMDIChild; + if Assigned(Form) then + SendMessage(Form.Handle, WM_SYSCOMMAND, Word(TTBCustomItem(Sender).Tag), + LPARAM(GetMessagePos())); + end; +end; + + +{ TTBMDISystemMenuItemViewer } + +procedure TTBMDISystemMenuItemViewer.CalcSize(const Canvas: TCanvas; + var AWidth, AHeight: Integer); +begin + AWidth := GetSystemMetrics(SM_CXSMICON) + 2; + AHeight := GetSystemMetrics(SM_CYSMICON) + 2; +end; + +procedure TTBMDISystemMenuItemViewer.Paint(const Canvas: TCanvas; + const ClientAreaRect: TRect; IsSelected, IsPushed, UseDisabledShadow: Boolean); + + function GetIconHandle: HICON; + var + Form: TForm; + begin + Result := 0; + if Assigned(Application.MainForm) then begin + Form := Application.MainForm.ActiveMDIChild; + if Assigned(Form) then + Result := Form.Icon.Handle; + end; + if Result = 0 then + Result := Application.Icon.Handle; + if Result = 0 then + Result := LoadIcon(0, IDI_APPLICATION); + end; + +var + R: TRect; + TempIcon: HICON; +begin + R := ClientAreaRect; + InflateRect(R, -1, -1); + TempIcon := CopyImage(GetIconHandle, IMAGE_ICON, R.Right - R.Left, + R.Bottom - R.Top, LR_COPYFROMRESOURCE); + DrawIconEx(Canvas.Handle, R.Left, R.Top, TempIcon, 0, 0, 0, 0, DI_NORMAL); + DestroyIcon(TempIcon); +end; + + +{ TTBMDIButtonItem } + +constructor TTBMDIButtonItem.Create(AOwner: TComponent); +begin + inherited; + ItemStyle := ItemStyle - [tbisSelectable, tbisRedrawOnSelChange] + + [tbisRightAlign]; +end; + +function TTBMDIButtonItem.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + Result := TTBMDIButtonItemViewer; +end; + + +{ TTBMDIButtonItemViewer } + +procedure TTBMDIButtonItemViewer.CalcSize(const Canvas: TCanvas; + var AWidth, AHeight: Integer); +begin + if NewStyleControls then begin + AWidth := GetSystemMetrics(SM_CXMENUSIZE) - 2; + if AWidth < 0 then AWidth := 0; + AHeight := GetSystemMetrics(SM_CYMENUSIZE) - 4; + if AHeight < 0 then AHeight := 0; + end + else begin + AWidth := 16; + AHeight := 14; + end; +end; + +procedure TTBMDIButtonItemViewer.Paint(const Canvas: TCanvas; + const ClientAreaRect: TRect; IsSelected, IsPushed, UseDisabledShadow: Boolean); +const + ButtonTypeFlags: array[TTBMDIButtonType] of UINT = (DFCS_CAPTIONMIN, + DFCS_CAPTIONRESTORE, DFCS_CAPTIONCLOSE); + PushedFlags: array[Boolean] of UINT = (0, DFCS_PUSHED); + EnabledFlags: array[Boolean] of UINT = (DFCS_INACTIVE, 0); +begin + DrawFrameControl(Canvas.Handle, ClientAreaRect, DFC_CAPTION, + ButtonTypeFlags[TTBMDIButtonItem(Item).FButtonType] or + PushedFlags[IsPushed] or EnabledFlags[Item.Enabled]); +end; + + +{ TTBMDISepItem } + +function TTBMDISepItem.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + Result := TTBMDISepItemViewer; +end; + + +{ TTBMDISepItemViewer } + +procedure TTBMDISepItemViewer.CalcSize(const Canvas: TCanvas; + var AWidth, AHeight: Integer); +begin + if View.Orientation <> tbvoVertical then begin + AWidth := 2; + AHeight := 6; + end + else begin + AWidth := 6; + AHeight := 2; + end; +end; + + +{ TTBMDIButtonsItem } + +var + CBTHookHandle: HHOOK; + MDIButtonsItems: TList; + +function WindowIsMDIChild(W: HWND): Boolean; +var + I: Integer; + MainForm, ChildForm: TForm; +begin + MainForm := Application.MainForm; + if Assigned(MainForm) then + for I := 0 to MainForm.MDIChildCount-1 do begin + ChildForm := MainForm.MDIChildren[I]; + if ChildForm.HandleAllocated and (ChildForm.Handle = W) then begin + Result := True; + Exit; + end; + end; + Result := False; +end; + +function CBTHook(Code: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; +{$IFNDEF CLR} stdcall; {$ENDIF} +var + Maximizing: Boolean; + WindowPlacement: TWindowPlacement; + I: Integer; +begin + case Code of + HCBT_SETFOCUS: begin + if WindowIsMDIChild(HWND(WParam)) and Assigned(MDIButtonsItems) then begin + for I := 0 to MDIButtonsItems.Count-1 do + TTBMDIButtonsItem(MDIButtonsItems[I]).InvalidateSystemMenuItem; + end; + end; + HCBT_MINMAX: begin + if WindowIsMDIChild(HWND(WParam)) and Assigned(MDIButtonsItems) and + (Word(LParam) in [SW_SHOWNORMAL, SW_SHOWMAXIMIZED, SW_MINIMIZE, SW_RESTORE]) then begin + Maximizing := (Word(LParam) = SW_MAXIMIZE); + if (Word(LParam) = SW_RESTORE) and not IsZoomed(HWND(WParam)) then begin + {$IFNDEF CLR} + WindowPlacement.length := SizeOf(WindowPlacement); + {$ELSE} + WindowPlacement.length := Marshal.SizeOf(TypeOf(TWindowPlacement)); + {$ENDIF} + GetWindowPlacement(HWND(WParam), {$IFNDEF CLR}@{$ENDIF} WindowPlacement); + Maximizing := (WindowPlacement.flags and WPF_RESTORETOMAXIMIZED <> 0); + end; + for I := 0 to MDIButtonsItems.Count-1 do + TTBMDIButtonsItem(MDIButtonsItems[I]).UpdateState(HWND(WParam), + Maximizing); + end; + end; + HCBT_DESTROYWND: begin + if WindowIsMDIChild(HWND(WParam)) and Assigned(MDIButtonsItems) then begin + for I := 0 to MDIButtonsItems.Count-1 do + TTBMDIButtonsItem(MDIButtonsItems[I]).UpdateState(HWND(WParam), + False); + end; + end; + end; + Result := CallNextHookEx(CBTHookHandle, Code, WParam, LParam); +end; + +const + { Note: On .NET, we must keep a reference to the delegate alive for as long + as the hook is installed, otherwise the GC will collect it and the app + will crash. Storing the delegate in a typed constant will do the trick. } + CBTHookDelegate: TFNHookProc = CBTHook; + +constructor TTBMDIButtonsItem.Create(AOwner: TComponent); + + function CreateItem(const AType: TTBMDIButtonType): TTBMDIButtonItem; + begin + Result := TTBMDIButtonItem.Create(Self); + Result.FButtonType := AType; + Result.OnClick := ItemClick; + end; + +begin + inherited; + ItemStyle := ItemStyle + [tbisEmbeddedGroup]; + FMinimizeItem := CreateItem(tbmbMinimize); + FRestoreItem := CreateItem(tbmbRestore); + FCloseItem := CreateItem(tbmbClose); + FSep1 := TTBMDISepItem.Create(Self); + FSep1.Blank := True; + FSep1.ItemStyle := FSep1.ItemStyle + [tbisRightAlign, tbisNoLineBreak]; + FSep2 := TTBMDISepItem.Create(Self); + FSep2.Blank := True; + FSep2.ItemStyle := FSep2.ItemStyle + [tbisRightAlign, tbisNoLineBreak]; + Add(FSep1); + Add(FMinimizeItem); + Add(FRestoreItem); + Add(FSep2); + Add(FCloseItem); + UpdateState(0, False); + if not(csDesigning in ComponentState) then begin + AddToList(MDIButtonsItems, Self); + if CBTHookHandle = 0 then + CBTHookHandle := SetWindowsHookEx(WH_CBT, CBTHookDelegate, 0, GetCurrentThreadId); + end; +end; + +destructor TTBMDIButtonsItem.Destroy; +begin + RemoveFromList(MDIButtonsItems, Self); + if (MDIButtonsItems = nil) and (CBTHookHandle <> 0) then begin + UnhookWindowsHookEx(CBTHookHandle); + CBTHookHandle := 0; + end; + inherited; +end; + +procedure TTBMDIButtonsItem.UpdateState(W: HWND; Maximized: Boolean); +var + HasMaxChild, VisibilityChanged: Boolean; + + procedure UpdateVisibleEnabled(const Item: TTBCustomItem; + const AEnabled: Boolean); + begin + if (Item.Visible <> HasMaxChild) or (Item.Enabled <> AEnabled) then begin + Item.Visible := HasMaxChild; + Item.Enabled := AEnabled; + VisibilityChanged := True; + end; + end; + +var + MainForm, ActiveMDIChild, ChildForm: TForm; + I: Integer; +begin + HasMaxChild := False; + ActiveMDIChild := nil; + if not(csDesigning in ComponentState) then begin + MainForm := Application.MainForm; + if Assigned(MainForm) then begin + for I := 0 to MainForm.MDIChildCount-1 do begin + ChildForm := MainForm.MDIChildren[I]; + if ChildForm.HandleAllocated and + (((ChildForm.Handle = W) and Maximized) or + ((ChildForm.Handle <> W) and IsZoomed(ChildForm.Handle))) then begin + HasMaxChild := True; + Break; + end; + end; + ActiveMDIChild := MainForm.ActiveMDIChild; + end; + end; + + VisibilityChanged := False; + UpdateVisibleEnabled(TTBMDIHandler(Owner).FSystemMenuItem, True); + UpdateVisibleEnabled(FSep1, True); + UpdateVisibleEnabled(FMinimizeItem, (ActiveMDIChild = nil) or + (GetWindowLong(ActiveMDIChild.Handle, GWL_STYLE) and WS_MINIMIZEBOX <> 0)); + UpdateVisibleEnabled(FRestoreItem, True); + UpdateVisibleEnabled(FSep2, True); + UpdateVisibleEnabled(FCloseItem, True); + + if VisibilityChanged and Assigned((Owner as TTBMDIHandler).FToolbar) then begin + TTBMDIHandler(Owner).FToolbar.View.InvalidatePositions; + TTBMDIHandler(Owner).FToolbar.View.TryValidatePositions; + end; +end; + +procedure TTBMDIButtonsItem.ItemClick(Sender: TObject); +var + MainForm, ChildForm: TForm; + Cmd: WPARAM; +begin + MainForm := Application.MainForm; + if Assigned(MainForm) then begin + ChildForm := MainForm.ActiveMDIChild; + if Assigned(ChildForm) then begin + { Send WM_SYSCOMMAND messages so that we get sounds } + if Sender = FRestoreItem then + Cmd := SC_RESTORE + else if Sender = FCloseItem then + Cmd := SC_CLOSE + else + Cmd := SC_MINIMIZE; + SendMessage(ChildForm.Handle, WM_SYSCOMMAND, Cmd, LPARAM(GetMessagePos())); + end; + end; +end; + +procedure TTBMDIButtonsItem.InvalidateSystemMenuItem; +var + View: TTBView; +begin + if Assigned((Owner as TTBMDIHandler).FToolbar) then begin + View := TTBMDIHandler(Owner).FToolbar.View; + View.Invalidate(View.Find(TTBMDIHandler(Owner).FSystemMenuItem)); + end; +end; + + +{ TTBMDIWindowItem } + +constructor TTBMDIWindowItem.Create(AOwner: TComponent); +var + Form: TForm; +begin + inherited; + ItemStyle := ItemStyle + [tbisEmbeddedGroup]; + Caption := STBMDIWindowItemDefCaption; + FWindowMenu := TMenuItem.Create(Self); + + if not(csDesigning in ComponentState) then begin + { Need to set WindowMenu before MDI children are created. Otherwise the + list incorrectly shows the first 9 child windows, even if window 10+ is + active. } + Form := Application.MainForm; + if (Form = nil) and (Screen.FormCount > 0) then + Form := Screen.Forms[0]; + SetForm(Form); + end; +end; + +procedure TTBMDIWindowItem.GetChildren(Proc: TGetChildProc; Root: TComponent); +begin +end; + +procedure TTBMDIWindowItem.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited; + if (Operation = opRemove) and (AComponent = FForm) then + SetForm(nil); +end; + +procedure TTBMDIWindowItem.SetForm(AForm: TForm); +begin + if FForm <> AForm then begin + if Assigned(FForm) and (FForm.WindowMenu = FWindowMenu) then + FForm.WindowMenu := nil; + FForm := AForm; + if Assigned(FForm) then + FForm.FreeNotification(Self); + end; + if Assigned(FForm) then + FForm.WindowMenu := FWindowMenu; +end; + +procedure TTBMDIWindowItem.EnabledChanged; +var + I: Integer; +begin + inherited; + for I := 0 to Count-1 do + Items[I].Enabled := Enabled; +end; + +procedure TTBMDIWindowItem.InitiateAction; +var + MainForm: TForm; + I: Integer; + M: HMENU; + Item: TTBCustomItem; + ItemCount: Integer; +begin + inherited; + if csDesigning in ComponentState then + Exit; + MainForm := Application.MainForm; + if Assigned(MainForm) then + SetForm(MainForm); + if FForm = nil then + Exit; + if FForm.ClientHandle <> 0 then + { This is needed, otherwise windows selected on the More Windows dialog + don't move back into the list } + SendMessage(FForm.ClientHandle, WM_MDIREFRESHMENU, 0, 0); + M := FWindowMenu.Handle; + ItemCount := GetMenuItemCount(M) - 1; + if ItemCount < 0 then + ItemCount := 0; + while Count < ItemCount do begin + Item := TTBCustomItem.Create(Self); + Item.Enabled := Enabled; + Item.OnClick := ItemClick; + Add(Item); + end; + while Count > ItemCount do + Items[Count-1].Free; + for I := 0 to ItemCount-1 do begin + Item := Items[I]; + Item.Tag := {$IFDEF CLR}TTag{$ENDIF}(Word(GetMenuItemID(M, I+1))); + Item.Caption := GetMenuItemStr(M, I+1); + Item.Checked := GetMenuState(M, I+1, MF_BYPOSITION) and MF_CHECKED <> 0; + end; + if Assigned(FOnUpdate) then + FOnUpdate(Self); +end; + +procedure TTBMDIWindowItem.ItemClick(Sender: TObject); +var + Form: TForm; +begin + Form := Application.MainForm; + if Assigned(Form) then + PostMessage(Form.Handle, WM_COMMAND, Word(TTBCustomItem(Sender).Tag), 0); +end; + +end. diff --git a/internal/2.2.2/1/Source/TB2MDI.res b/internal/2.2.2/1/Source/TB2MDI.res new file mode 100644 index 0000000000000000000000000000000000000000..4a6203581a390a61c4fb08e5e23f5205e7b9749e GIT binary patch literal 712 zcmcJJI}QRd3`7S+k&+`&QX)>UAR$Bn4N!0cj*&9Q+M9(pn`8k2C8PK=9y_)qEwG%6 zk-p(Rl{zXpPj%5&Yn^q&j@s#@s}5uv?P2F}ZZ#iMElE4frHN*Ez@Og{C7xm|0Z)oW z^?i@vBOP)H_;Pnv`Zr=o$y>NbB2P7#n@0H&u@taYuQVx?KKP(J0{4d@k;k9&CcyeI uSpE3_prU(EaO02prvKRA4*0mg{$CdGJv)4$_mz8Ug9~U4rmwu!{~R9{E(V(b literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Source/TB2MRU.pas b/internal/2.2.2/1/Source/TB2MRU.pas new file mode 100644 index 0000000..86f0bca --- /dev/null +++ b/internal/2.2.2/1/Source/TB2MRU.pas @@ -0,0 +1,417 @@ +unit TB2MRU; + +{ + Toolbar2000 + Copyright (C) 1998-2006 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2MRU.pas,v 1.24 2006/03/12 23:11:59 jr Exp $ +} + +interface + +{$I TB2Ver.inc} + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + TB2Item, IniFiles, Registry; + +type + TTBMRUListClickEvent = procedure(Sender: TObject; const Filename: String) of object; + + TTBMRUList = class(TComponent) + private + FAddFullPath: Boolean; + FContainer: TTBCustomItem; + FHidePathExtension: Boolean; + FList: TStrings; + FMaxItems: Integer; + FOnChange: TNotifyEvent; + FOnClick: TTBMRUListClickEvent; + FPrefix: String; + procedure ClickHandler(Sender: TObject); + procedure SetHidePathExtension(Value: Boolean); + procedure SetList(Value: TStrings); + procedure SetMaxItems(Value: Integer); + protected + property Container: TTBCustomItem read FContainer; + function GetItemClass: TTBCustomItemClass; virtual; + procedure SetItemCaptions; virtual; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Add(Filename: String); + procedure Remove(const Filename: String); + procedure LoadFromIni(Ini: TCustomIniFile; const Section: String); + procedure LoadFromRegIni(Ini: TRegIniFile; const Section: String); + procedure SaveToIni(Ini: TCustomIniFile; const Section: String); + procedure SaveToRegIni(Ini: TRegIniFile; const Section: String); + published + { MaxItems must be published before Items } + property AddFullPath: Boolean read FAddFullPath write FAddFullPath default True; + property HidePathExtension: Boolean read FHidePathExtension write SetHidePathExtension default True; + property MaxItems: Integer read FMaxItems write SetMaxItems default 4; + property Items: TStrings read FList write SetList; + property OnClick: TTBMRUListClickEvent read FOnClick write FOnClick; + property OnChange: TNotifyEvent read FOnChange write FOnChange; + property Prefix: String read FPrefix write FPrefix; + end; + + TTBMRUListItem = class(TTBCustomItem) + private + FMRUList: TTBMRUList; + procedure SetMRUList(Value: TTBMRUList); + protected + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + public + constructor Create(AOwner: TComponent); override; + published + property MRUList: TTBMRUList read FMRUList write SetMRUList; + //property Caption; + //property LinkSubitems; + end; + +implementation + +uses + {$IFDEF CLR} System.Text, System.IO, {$ENDIF} + TB2Common, TB2Consts, CommDlg; + +procedure ChangeFileNameToTitle(var S: String); +{$IFNDEF CLR} +var + Buf: array[0..MAX_PATH-1] of Char; +begin + if GetFileTitle(PChar(S), Buf, SizeOf(Buf) div SizeOf(Buf[0])) = 0 then + S := Buf; +end; +{$ELSE} +var + Buf: StringBuilder; +begin + Buf := StringBuilder.Create(MAX_PATH); + if GetFileTitle(S, Buf, Buf.Capacity) = 0 then + S := Buf.ToString; +end; +{$ENDIF} + + +{ TTBMRUListStrings } + +type + TTBMRUListStrings = class(TStrings) + private + FInternalList: TStrings; + FMRUList: TTBMRUList; + procedure Changed; + public + constructor Create; + destructor Destroy; override; + procedure Clear; override; + procedure Delete(Index: Integer); override; + function Get(Index: Integer): String; override; + function GetCount: Integer; override; + function IndexOf(const S: String): Integer; override; + procedure Insert(Index: Integer; const S: String); override; + procedure Move(CurIndex, NewIndex: Integer); override; + procedure Put(Index: Integer; const S: String); override; + end; + +constructor TTBMRUListStrings.Create; +begin + inherited; + FInternalList := TStringList.Create; +end; + +destructor TTBMRUListStrings.Destroy; +begin + inherited; + FInternalList.Free; +end; + +procedure TTBMRUListStrings.Changed; +begin + if Assigned(FMRUList.FOnChange) and + not(csLoading in FMRUList.ComponentState) then + FMRUList.FOnChange(FMRUList); +end; + +procedure TTBMRUListStrings.Clear; +var + I: Integer; +begin + for I := FInternalList.Count-1 downto 0 do + Delete(I); +end; + +procedure TTBMRUListStrings.Delete(Index: Integer); +begin + FMRUList.FContainer[Index].Free; + FInternalList.Delete(Index); + FMRUList.SetItemCaptions; + Changed; +end; + +function TTBMRUListStrings.Get(Index: Integer): String; +begin + Result := FInternalList[Index]; +end; + +function TTBMRUListStrings.GetCount: Integer; +begin + Result := FInternalList.Count; +end; + +function TTBMRUListStrings.IndexOf(const S: String): Integer; +begin + { This is identical to TStrings.IndexOf except we use SameFileName. } + for Result := 0 to GetCount - 1 do + {$IFDEF JR_D6} + if SameFileName(Get(Result), S) then Exit; + {$ELSE} + if AnsiCompareFileName(Get(Result), S) = 0 then Exit; + {$ENDIF} + Result := -1; +end; + +procedure TTBMRUListStrings.Insert(Index: Integer; const S: String); +var + Item: TTBCustomItem; +begin + Item := FMRUList.GetItemClass.Create(FMRUList.FContainer); + Item.OnClick := FMRUList.ClickHandler; + FMRUList.FContainer.Insert(Index, Item); + FInternalList.Insert(Index, S); + FMRUList.SetItemCaptions; + Changed; +end; + +procedure TTBMRUListStrings.Move(CurIndex, NewIndex: Integer); +begin + FInternalList.Move(CurIndex, NewIndex); + FMRUList.FContainer.Move(CurIndex, NewIndex); + FMRUList.SetItemCaptions; + Changed; +end; + +procedure TTBMRUListStrings.Put(Index: Integer; const S: String); +begin + FInternalList[Index] := S; + FMRUList.SetItemCaptions; + Changed; +end; + + +{ TTBMRUList } + +constructor TTBMRUList.Create(AOwner: TComponent); +begin + inherited; + FAddFullPath := True; + FHidePathExtension := True; + FMaxItems := 4; + FPrefix := 'MRU'; + FList := TTBMRUListStrings.Create; + TTBMRUListStrings(FList).FMRUList := Self; + FContainer := TTBCustomItem.Create(nil); +end; + +destructor TTBMRUList.Destroy; +begin + FContainer.Free; + FList.Free; + inherited; +end; + +procedure TTBMRUList.Add(Filename: String); +var + I: Integer; +begin + if AddFullPath then + Filename := ExpandFileName(Filename); + { If Filename is already in the MRU list, move it to the top } + I := FList.IndexOf(Filename); + if I <> -1 then begin + if I > 0 then + FList.Move(I, 0); + FList[0] := Filename; { ...in case the capitalization changed } + end + else + FList.Insert(0, Filename); +end; + +procedure TTBMRUList.Remove(const Filename: String); +var + I: Integer; +begin + I := FList.IndexOf(Filename); + if I <> -1 then + FList.Delete(I); +end; + +procedure TTBMRUList.LoadFromIni(Ini: TCustomIniFile; const Section: String); +var + I: Integer; + S: String; +begin + FList.Clear; + for I := 1 to FMaxItems do begin + S := Ini.ReadString(Section, FPrefix + IntToStr(I), ''); + if S <> '' then + FList.Add(S); + end; +end; + +procedure TTBMRUList.LoadFromRegIni(Ini: TRegIniFile; const Section: String); +var + I: Integer; + S: String; +begin + FList.Clear; + for I := 1 to FMaxItems do begin + S := Ini.ReadString(Section, FPrefix + IntToStr(I), ''); + if S <> '' then + FList.Add(S); + end; +end; + +procedure TTBMRUList.SaveToIni(Ini: TCustomIniFile; const Section: String); +var + I: Integer; +begin + for I := 1 to FMaxItems do begin + if I <= FList.Count then + Ini.WriteString(Section, FPrefix + IntToStr(I), FList[I-1]) + else + Ini.DeleteKey(Section, FPrefix + IntToStr(I)); + end; +end; + +procedure TTBMRUList.SaveToRegIni(Ini: TRegIniFile; const Section: String); +var + I: Integer; +begin + for I := 1 to FMaxItems do begin + if I <= FList.Count then + Ini.WriteString(Section, FPrefix + IntToStr(I), FList[I-1]) + else + Ini.DeleteKey(Section, FPrefix + IntToStr(I)); + end; +end; + +procedure TTBMRUList.SetItemCaptions; +var + I, J: Integer; + Key: Char; + S: String; +begin + while FList.Count > FMaxItems do + FList.Delete(FList.Count-1); + for I := 0 to FContainer.Count-1 do begin + Key := #0; + if I < 9 then + Key := Chr(Ord('1') + I) + else begin + { No more numbers; try letters } + J := I - 9; + if J < 26 then + Key := Chr(Ord('A') + J); + end; + S := FList[I]; + if HidePathExtension then + ChangeFileNameToTitle(S); + S := EscapeAmpersands(S); + if Key <> #0 then + FContainer[I].Caption := Format('&%s %s', [Key, S]) + else + FContainer[I].Caption := S; + end; +end; + +procedure TTBMRUList.ClickHandler(Sender: TObject); +var + I: Integer; +begin + I := FContainer.IndexOf(TTBCustomItem(Sender)); + if I <> -1 then begin + if I > 0 then + FList.Move(I, 0); + if Assigned(FOnClick) then + FOnClick(Self, FList[0]); + end; +end; + +procedure TTBMRUList.SetHidePathExtension(Value: Boolean); +begin + if FHidePathExtension <> Value then begin + FHidePathExtension := Value; + SetItemCaptions; + end; +end; + +procedure TTBMRUList.SetList(Value: TStrings); +begin + FList.Assign(Value); +end; + +procedure TTBMRUList.SetMaxItems(Value: Integer); +begin + FMaxItems := Value; + SetItemCaptions; +end; + +function TTBMRUList.GetItemClass: TTBCustomItemClass; +begin + Result := TTBCustomItem; +end; + + +{ TTBMRUListItem } + +constructor TTBMRUListItem.Create(AOwner: TComponent); +begin + inherited; + ItemStyle := ItemStyle + [tbisEmbeddedGroup]; + Caption := STBMRUListItemDefCaption; +end; + +procedure TTBMRUListItem.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited; + if (AComponent = FMRUList) and (Operation = opRemove) then + SetMRUList(nil); +end; + +procedure TTBMRUListItem.SetMRUList(Value: TTBMRUList); +begin + if FMRUList <> Value then begin + FMRUList := Value; + if Assigned(FMRUList) then begin + Value.FreeNotification(Self); + LinkSubitems := FMRUList.FContainer; + end + else + LinkSubitems := nil; + end; +end; + +end. diff --git a/internal/2.2.2/1/Source/TB2OleMarshal.pas b/internal/2.2.2/1/Source/TB2OleMarshal.pas new file mode 100644 index 0000000..fdca5c3 --- /dev/null +++ b/internal/2.2.2/1/Source/TB2OleMarshal.pas @@ -0,0 +1,203 @@ +unit TB2OleMarshal; + +{ + Toolbar2000 + Copyright (C) 1998-2008 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2OleMarshal.pas,v 1.4 2008/09/17 18:04:09 jr Exp $ + + This unit implements the TTBStandardOleMarshalObject class, an exact clone of + .NET Framework 2.0's StandardOleMarshalObject class, which isn't available + on the .NET Framework 1.1-based Delphi 2006. + On Delphi 2007, I had planned to switch to StandardOleMarshalObject, but it + turns out there's a bug that causes it raise AV's on x64 & IA-64 (seen as + E_POINTER on the client side). Coincidentally, TTBStandardOleMarshalObject + does not suffer from this bug (even though it was intended to be an exact + clone!). + + The class "replaces the standard common language runtime (CLR) free-threaded + marshaler with the standard OLE STA marshaler." It "prevents calls made into + a hosting object by OLE from entering threads other than the UI thread." + For more information, see: + http://msdn2.microsoft.com/system.runtime.interopservices.standardolemarshalobject.aspx +} + +interface + +{$I TB2Ver.inc} + +uses + System.Runtime.InteropServices, Windows; + +type + { Our declaration for IMarshal } + [ComImport, + GuidAttribute('00000003-0000-0000-C000-000000000046'), + InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + ITBMarshal = interface + [PreserveSig] + function GetUnmarshalClass([MarshalAs(UnmanagedType.LPStruct)] riid: Guid; + pv: IntPtr; dwDestContext: Longint; pvDestContext: IntPtr; + mshlflags: Longint; out pCid: Guid): HRESULT; + [PreserveSig] + function GetMarshalSizeMax([MarshalAs(UnmanagedType.LPStruct)] riid: Guid; + pv: IntPtr; dwDestContext: Longint; pvDestContext: IntPtr; + mshlflags: Longint; out pSize: Longint): HRESULT; + [PreserveSig] + function MarshalInterface([in, MarshalAs(UnmanagedType.Interface)] pStm: TObject; + [MarshalAs(UnmanagedType.LPStruct)] riid: Guid; pv: IntPtr; + dwDestContext: Longint; pvDestContext: IntPtr; mshlflags: Longint): HRESULT; + [PreserveSig] + function UnmarshalInterface([in, MarshalAs(UnmanagedType.Interface)] pStm: TObject; + [MarshalAs(UnmanagedType.LPStruct)] riid: Guid; out ppv: IntPtr): HRESULT; + [PreserveSig] + function ReleaseMarshalData([in, MarshalAs(UnmanagedType.Interface)] pStm: TObject): HRESULT; + [PreserveSig] + function DisconnectObject(dwReserved: Longint): HRESULT; + end; + + TTBStandardOleMarshalObject = class(System.MarshalByRefObject, ITBMarshal) + private + function GetStdMarshaller(const riid: Guid; const dwDestContext: Longint; + const mshlflags: Longint): IntPtr; + { IMarshal } + function GetUnmarshalClass(riid: Guid; pv: IntPtr; dwDestContext: Longint; + pvDestContext: IntPtr; mshlflags: Longint; out pCid: Guid): HRESULT; + function GetMarshalSizeMax(riid: Guid; pv: IntPtr; dwDestContext: Longint; + pvDestContext: IntPtr; mshlflags: Longint; out pSize: Longint): HRESULT; + function MarshalInterface(pStm: TObject; riid: Guid; pv: IntPtr; + dwDestContext: Longint; pvDestContext: IntPtr; mshlflags: Longint): HRESULT; + function UnmarshalInterface(pStm: TObject; riid: Guid; out ppv: IntPtr): HRESULT; + function ReleaseMarshalData(pStm: TObject): HRESULT; + function DisconnectObject(dwReserved: Longint): HRESULT; + end; + +implementation + +{ Note: According to http://blogs.msdn.com/cbrumme/archive/2003/04/15/51335.aspx + the Marshal.ReleaseComObject(pStm) calls are needed to work around a "quirk + of OLE32 on some versions of the operating system". } + +uses + System.Security; + +const + ole32 = 'ole32.dll'; + +[SuppressUnmanagedCodeSecurity, DllImport(ole32, CharSet = CharSet.Unicode, EntryPoint = 'CoGetMarshalSizeMax')] +function _CoGetMarshalSizeMax(out pulSize: Longint; + [in, MarshalAs(UnmanagedType.LPStruct)] riid: Guid; pUnk: IntPtr; + dwDestContext: Longint; pvDestContext: IntPtr; + mshlflags: Longint): HRESULT; external; +[SuppressUnmanagedCodeSecurity, DllImport(ole32, CharSet = CharSet.Unicode, EntryPoint = 'CoGetStandardMarshal')] +function _CoGetStandardMarshal([in, MarshalAs(UnmanagedType.LPStruct)] iid: Guid; + pUnk: IntPtr; dwDestContext: Longint; pvDestContext: IntPtr; + mshlflags: Longint; out ppMarshal: IntPtr): HRESULT; external; +[SuppressUnmanagedCodeSecurity, DllImport(ole32, CharSet = CharSet.Unicode, EntryPoint = 'CoMarshalInterface')] +function _CoMarshalInterface([in, MarshalAs(UnmanagedType.Interface)] pStm: TObject; + [in, MarshalAs(UnmanagedType.LPStruct)] riid: Guid; pUnk: IntPtr; + dwDestContext: Longint; pvDestContext: IntPtr; + mshlflags: Longint): HRESULT; external; + +function TTBStandardOleMarshalObject.GetStdMarshaller(const riid: Guid; + const dwDestContext: Longint; const mshlflags: Longint): IntPtr; +var + V_1: IntPtr; +begin + Result := nil; + V_1 := Marshal.GetIUnknownForObject(Self); + if V_1 <> nil then begin + try + if _CoGetStandardMarshal(riid, V_1, dwDestContext, nil, mshlflags, Result) = S_OK then + Exit; + finally + Marshal.Release(V_1); + end; + end; + { Note: Localizing this message isn't necessary because a user will never + see it; the .NET runtime will catch it and translate it into a + COR_E_EXCEPTION HRESULT. } + raise InvalidOperationException.Create('TTBStandardOleMarshalObject.GetStdMarshaller failed'); +end; + +function TTBStandardOleMarshalObject.GetUnmarshalClass(riid: Guid; pv: IntPtr; + dwDestContext: Longint; pvDestContext: IntPtr; mshlflags: Longint; + out pCid: Guid): HRESULT; +begin + { StandardOleMarshalObject does "pCid := TypeOf(IStdMarshal).GUID" here, but + we haven't declared IStdMarshal anywhere, so create a fresh Guid } + pCid := Guid.Create('00000017-0000-0000-C000-000000000046'); { CLSID_StdMarshal } + Result := S_OK; +end; + +function TTBStandardOleMarshalObject.GetMarshalSizeMax(riid: Guid; pv: IntPtr; + dwDestContext: Longint; pvDestContext: IntPtr; mshlflags: Longint; + out pSize: Longint): HRESULT; +var + V_0: IntPtr; +begin + V_0 := GetStdMarshaller(riid, dwDestContext, mshlflags); + try + Result := _CoGetMarshalSizeMax(pSize, riid, V_0, dwDestContext, pvDestContext, mshlflags); + finally + Marshal.Release(V_0); + end; +end; + +function TTBStandardOleMarshalObject.MarshalInterface(pStm: TObject; riid: Guid; + pv: IntPtr; dwDestContext: Longint; pvDestContext: IntPtr; + mshlflags: Longint): HRESULT; +var + V_0: IntPtr; +begin + V_0 := GetStdMarshaller(riid, dwDestContext, mshlflags); + try + Result := _CoMarshalInterface(pStm, riid, V_0, dwDestContext, pvDestContext, mshlflags); + finally + Marshal.Release(V_0); + if pStm <> nil then + Marshal.ReleaseComObject(pStm); + end; +end; + +function TTBStandardOleMarshalObject.UnmarshalInterface(pStm: TObject; + riid: Guid; out ppv: IntPtr): HRESULT; +begin + ppv := nil; + if pStm <> nil then + Marshal.ReleaseComObject(pStm); + Result := E_NOTIMPL; +end; + +function TTBStandardOleMarshalObject.ReleaseMarshalData(pStm: TObject): HRESULT; +begin + if pStm <> nil then + Marshal.ReleaseComObject(pStm); + Result := E_NOTIMPL; +end; + +function TTBStandardOleMarshalObject.DisconnectObject(dwReserved: Longint): HRESULT; +begin + Result := E_NOTIMPL; +end; + +end. diff --git a/internal/2.2.2/1/Source/TB2Reg.dcr b/internal/2.2.2/1/Source/TB2Reg.dcr new file mode 100644 index 0000000000000000000000000000000000000000..ec4d2e1fb13ce8677af59e46650b8783296f5868 GIT binary patch literal 5188 zcmd5=J#XAb5FHx<=Z(lnvM9Z)VVE>N?B17qbwg?kvQm*ot( z5p~r-6Wm)9#B9}dwhmG|a4Aw$kzacMKk@iksj?oh6V?}Ryw}^>D}f&druQ)p{oy`i zh9!OXi<&O^?hu~)L*9W$x=%iv%wh1~a+xP>mdiZpej>hfXQ6%IARqB-$o~lJlm5*y z!VnDa4Q~kYJ;;RjVvw8x zWiriKVYQv_j^Ve@$ahEb5xFnXUBu2j`Wu3Jw2;##gvxq~i?S+Eg#3WPAO;B;5f^2^ zQk9S&aFWS`o$3$H;(eVZZV2eRH(dSsta1d8y_I9^zZ2}cPuPi!p>OZ_+;YQdjvqH% zkC9>E);8h)4i7V)@=s>?wB?v43(gF*nFpB`S<<&d1H79Wd^ey6c~2|c0a3o62fs#&W;sP- zLoRWrnx?Eh)wHB-Bq675rW){(+bnD3FJstdGQ#tC0_~b@JeQuY*T_EXM>=AEdLM1{ z3}vuUI-CDEyIkd)Dw^f%KVe;-UxopnUxr0;KJ*j0^Gn0Jo3DHJ`_Xf%cvdg%ayYTe zd<-8fb^B}RDz+N7R75Enr$}sK6dtuT`i|Nfbw};}{j}Zi*6n?^D^3npy6t^-6&um} z`zS24JS&4hCxwWq-NF@p!}?LtqV@}4_%D+xD6MzjN32+4OB%FI|{l)%6;0ExsGc z(i$fstrzV^9r^rICd+$E6YIlNne3h3yS>Mfea7G8gO%>X9@}9fPK)2xTt=)LZK7`5 UV%lCz+t`i#Hm1t_UA$?dZ(Jd5%K!iX literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Source/TB2Reg.pas b/internal/2.2.2/1/Source/TB2Reg.pas new file mode 100644 index 0000000..3cacb90 --- /dev/null +++ b/internal/2.2.2/1/Source/TB2Reg.pas @@ -0,0 +1,317 @@ +unit TB2Reg; + +{ + Toolbar2000 + Copyright (C) 1998-2008 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2Reg.pas,v 1.32 2008/09/18 19:08:40 jr Exp $ +} + +interface + +{$I TB2Ver.inc} + +uses + Windows, SysUtils, Classes, Graphics, Controls, Dialogs, ActnList, ImgList, + {$IFDEF JR_D6} DesignIntf, DesignEditors, VCLEditors, {$ELSE} DsgnIntf, {$ENDIF} + TB2Toolbar, TB2ToolWindow, TB2Dock, TB2Item, TB2ExtItems, TB2MRU, TB2MDI, + TB2DsgnItemEditor; + +procedure Register; +procedure TBRegisterClasses(const AClasses: array of TPersistentClass); + +implementation + +{$IFDEF CLR} +{ Delphi.NET doesn't use DCR files for component icons } +{$R 'Icons\TTBBackground.bmp'} +{$R 'Icons\TTBBackground16.bmp'} +{$R 'Icons\TTBDock.bmp'} +{$R 'Icons\TTBDock16.bmp'} +{$R 'Icons\TTBImageList.bmp'} +{$R 'Icons\TTBImageList16.bmp'} +{$R 'Icons\TTBItemContainer.bmp'} +{$R 'Icons\TTBItemContainer16.bmp'} +{$R 'Icons\TTBMDIHandler.bmp'} +{$R 'Icons\TTBMDIHandler16.bmp'} +{$R 'Icons\TTBMRUList.bmp'} +{$R 'Icons\TTBMRUList16.bmp'} +{$R 'Icons\TTBPopupMenu.bmp'} +{$R 'Icons\TTBPopupMenu16.bmp'} +{$R 'Icons\TTBToolbar.bmp'} +{$R 'Icons\TTBToolbar16.bmp'} +{$R 'Icons\TTBToolWindow.bmp'} +{$R 'Icons\TTBToolWindow16.bmp'} +{$ENDIF} + +uses + {$IFDEF CLR} WinUtils, {$ENDIF} + ImgEdit; + +{$IFDEF JR_D5} + +{ TTBImageIndexPropertyEditor } + +{ Unfortunately TComponentImageIndexPropertyEditor seems to be gone in + Delphi 6, so we have to use our own image index property editor class } + +type + TTBImageIndexPropertyEditor = class(TIntegerProperty + {$IFDEF JR_D6} , ICustomPropertyListDrawing {$ENDIF}) + public + function GetAttributes: TPropertyAttributes; override; + procedure GetValues(Proc: TGetStrProc); override; + function GetImageListAt(Index: Integer): TCustomImageList; virtual; + + // ICustomPropertyListDrawing + procedure ListMeasureHeight(const Value: string; ACanvas: TCanvas; + var AHeight: Integer); {$IFNDEF JR_D6} override; {$ENDIF} + procedure ListMeasureWidth(const Value: string; ACanvas: TCanvas; + var AWidth: Integer); {$IFNDEF JR_D6} override; {$ENDIF} + procedure ListDrawValue(const Value: string; ACanvas: TCanvas; + const ARect: TRect; ASelected: Boolean); {$IFNDEF JR_D6} override; {$ENDIF} + end; + +function TTBImageIndexPropertyEditor.GetAttributes: TPropertyAttributes; +begin + Result := [paMultiSelect, paValueList, paRevertable]; +end; + +function TTBImageIndexPropertyEditor.GetImageListAt(Index: Integer): TCustomImageList; +begin + Result := nil; +end; + +procedure TTBImageIndexPropertyEditor.GetValues(Proc: TGetStrProc); +var + ImgList: TCustomImageList; + I: Integer; +begin + ImgList := GetImageListAt(0); + if Assigned(ImgList) then + for I := 0 to ImgList.Count-1 do + Proc(IntToStr(I)); +end; + +procedure TTBImageIndexPropertyEditor.ListDrawValue(const Value: string; + ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean); +var + ImgList: TCustomImageList; + X: Integer; +begin + ImgList := GetImageListAt(0); + ACanvas.FillRect(ARect); + X := ARect.Left + 2; + if Assigned(ImgList) then begin + ImgList.Draw(ACanvas, X, ARect.Top + 2, StrToInt(Value)); + Inc(X, ImgList.Width); + end; + ACanvas.TextOut(X + 3, ARect.Top + 1, Value); +end; + +procedure TTBImageIndexPropertyEditor.ListMeasureHeight(const Value: string; + ACanvas: TCanvas; var AHeight: Integer); +var + ImgList: TCustomImageList; +begin + ImgList := GetImageListAt(0); + AHeight := ACanvas.TextHeight(Value) + 2; + if Assigned(ImgList) and (ImgList.Height + 4 > AHeight) then + AHeight := ImgList.Height + 4; +end; + +procedure TTBImageIndexPropertyEditor.ListMeasureWidth(const Value: string; + ACanvas: TCanvas; var AWidth: Integer); +var + ImgList: TCustomImageList; +begin + ImgList := GetImageListAt(0); + AWidth := ACanvas.TextWidth(Value) + 4; + if Assigned(ImgList) then + Inc(AWidth, ImgList.Width); +end; + +{ TTBItemImageIndexPropertyEditor } + +type + TTBItemImageIndexPropertyEditor = class(TTBImageIndexPropertyEditor) + public + function GetImageListAt(Index: Integer): TCustomImageList; override; + end; + +function TTBItemImageIndexPropertyEditor.GetImageListAt(Index: Integer): TCustomImageList; +var + C: TPersistent; + Item: TTBCustomItem; +begin + Result := nil; + { ? I'm guessing that the Index parameter is a component index (one that + would be passed to the GetComponent function). } + C := GetComponent(Index); + if C is TTBCustomItem then begin + Item := TTBCustomItem(C); + repeat + Result := Item.Images; + if Assigned(Result) then + Break; + Item := Item.Parent; + if Item = nil then + Break; + Result := Item.SubMenuImages; + until Assigned(Result); + end; +end; + +{$ENDIF} + +{ TTBImageListEditor } + +type + TTBImageListEditor = class(TComponentEditor) + public + procedure Edit; override; + procedure ExecuteVerb(Index: Integer); override; + function GetVerb(Index: Integer): String; override; + function GetVerbCount: Integer; override; + end; + +procedure TTBImageListEditor.Edit; +var + ImgList: TTBImageList; +begin + ImgList := Component as TTBImageList; + if not ImgList.ImagesBitmap.Empty then begin + if MessageDlg('The image list''s ImagesBitmap property has ' + + 'a bitmap assigned. Because of this, any changes you make in the ' + + 'Image List Editor will not be preserved when the form is saved.'#13#10#13#10 + + 'Do you want to open the editor anyway?', mtWarning, + [mbYes, mbNo], 0) <> mrYes then + Exit; + end; + EditImageList(ImgList); +end; + +procedure TTBImageListEditor.ExecuteVerb(Index: Integer); +begin + if Index = 0 then + Edit; +end; + +function TTBImageListEditor.GetVerbCount: Integer; +begin + Result := 1; +end; + +function TTBImageListEditor.GetVerb(Index: Integer): String; +begin + if Index = 0 then + Result := 'ImageList Editor...' + else + Result := ''; +end; + + +procedure TBRegisterClasses(const AClasses: array of TPersistentClass); +{$IFDEF CLR} +var + I: Integer; + FoundClass: TPersistentClass; +{$ENDIF} +begin + {$IFDEF CLR} + { Hack for Delphi.NET (2006): If you recompile an already-installed package + the IDE doesn't unload the old package before installing the new one. + Therefore, we must search for and unregister any existing classes before + registering new ones, to avoid having two incompatible sets of classes + registered at the same time. + Without this, if we rebuild tb2kdsgn_dn10 (which implicitly reloads + tb2k_dn10) and then attempt to open the Demo project's main form in the + IDE, we get a "Toolbar item cannot be inserted into container of type + TTBToolbar" exception inside TTBCustomItem.SetParentComponent, because + apparently the TTBToolbar class it's trying to use is located in the new + assembly, while the item class is located in the old assembly. + Note: It appears that this issue only affects registered classes; there + is no need for an "UnRegisterComponents" call. } + for I := High(AClasses) downto Low(AClasses) do begin + { Unregister all classes with the same name } + while True do begin + FoundClass := GetClass(AClasses[I].ClassName); + if FoundClass = nil then + Break; + UnRegisterClass(FoundClass); + end; + end; + {$ENDIF} + RegisterClasses(AClasses); +end; + +procedure Register; +begin + { Note: On Delphi.NET 2006, it's possible for this procedure to be called + a second time on the same tb2kdsgn instance. See comments in + TBRegisterItemClass. } + + RegisterComponents('Toolbar2000', [TTBDock, TTBToolbar, TTBToolWindow, + TTBPopupMenu, TTBImageList, TTBItemContainer, TTBBackground, TTBMRUList, + TTBMDIHandler]); + {$IFDEF JR_D4} + RegisterActions('', [TTBEditAction], nil); + {$ENDIF} + RegisterNoIcon([TTBCustomItem]); + TBRegisterClasses([TTBItem, TTBGroupItem, TTBSubmenuItem, TTBSeparatorItem, + TTBEditItem, TTBMRUListItem, TTBControlItem, TTBMDIWindowItem, + TTBVisibilityToggleItem]); + + RegisterComponentEditor(TTBCustomToolbar, TTBItemsEditor); + RegisterComponentEditor(TTBItemContainer, TTBItemsEditor); + RegisterComponentEditor(TTBPopupMenu, TTBItemsEditor); + RegisterComponentEditor(TTBImageList, TTBImageListEditor); + RegisterPropertyEditor(TypeInfo(TTBRootItem), nil, '', TTBItemsPropertyEditor); + {$IFDEF JR_D5} + RegisterPropertyEditor(TypeInfo(TImageIndex), TTBCustomItem, 'ImageIndex', + TTBItemImageIndexPropertyEditor); + {$ENDIF} + {$IFDEF JR_D6} + { TShortCut properties show up like Integer properties in Delphi 6 + without this... } + RegisterPropertyEditor(TypeInfo(TShortCut), TTBCustomItem, '', + TShortCutProperty); + {$ENDIF} + + { Link in images for the toolbar buttons } + {$IFNDEF CLR} + {$R TB2DsgnItemEditor.res} + {$ELSE} + {$R 'Icons\TB2DsgnEditorImages.bmp'} + {$R 'Icons\TTBEditItem.bmp'} + {$R 'Icons\TTBGroupItem.bmp'} + {$R 'Icons\TTBMDIWindowItem.bmp'} + {$R 'Icons\TTBMRUListItem.bmp'} + {$ENDIF} + TBRegisterItemClass(TTBEditItem, 'New &Edit', HInstance); + TBRegisterItemClass(TTBGroupItem, 'New &Group Item', HInstance); + TBRegisterItemClass(TTBMRUListItem, 'New &MRU List Item', HInstance); + TBRegisterItemClass(TTBMDIWindowItem, 'New MDI &Windows List', HInstance); + TBRegisterItemClass(TTBVisibilityToggleItem, 'New &Visibility-Toggle Item', HInstance); +end; + +end. diff --git a/internal/2.2.2/1/Source/TB2ResCursors.res b/internal/2.2.2/1/Source/TB2ResCursors.res new file mode 100644 index 0000000000000000000000000000000000000000..e09ab15dfffb5b8fcb12fc48ac835711927ab2a5 GIT binary patch literal 1304 zcmds$Jx;_h5QU#(ln7~yAV8u(kTP^BD3LY`K`SJFBv=l>4YD?lyHNT zDY6W25?kyd6c7px6MY_!J+d7?4*(=Yq=nrj+c$pRFoyvxi&s~CQV5HbK|*q3_%-HS z8+^2)8~wyAla$ag;M&Rqc_tO%Qs#}+E-vX`fXydh?~#52q|OhS=Z$CRwt6a3IZBZ^ zsb9$ru?`HS#*{EN?bsdr-=Q0C@E|!68Q>g;C~%1p#yG(Q$2h|gt~qjr3%1^}*!R>2 zyyY}$S5buwmURl6&h;q;H)L_)A`= z5tS-BRO;3!_@t3O?!IeDHCn$1)~L-^25jFp-ZHiv|EC%i3mO%ypi`oi^!s|Ucn1ZG Bgx~-G literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Source/TB2ToolWindow.pas b/internal/2.2.2/1/Source/TB2ToolWindow.pas new file mode 100644 index 0000000..90d5592 --- /dev/null +++ b/internal/2.2.2/1/Source/TB2ToolWindow.pas @@ -0,0 +1,258 @@ +unit TB2ToolWindow; + +{ + Toolbar2000 + Copyright (C) 1998-2005 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2ToolWindow.pas,v 1.18 2005/01/06 03:56:50 jr Exp $ +} + +interface + +{$I TB2Ver.inc} + +uses + Windows, Classes, Graphics, Controls, TB2Dock; + +type + { TTBToolWindow } + + TTBToolWindow = class(TTBCustomDockableWindow) + private + FMinClientWidth, FMinClientHeight, FMaxClientWidth, FMaxClientHeight: Integer; + FBarHeight, FBarWidth: Integer; + function CalcSize(ADock: TTBDock): TPoint; + function GetClientAreaWidth: Integer; + procedure SetClientAreaWidth(Value: Integer); + function GetClientAreaHeight: Integer; + procedure SetClientAreaHeight(Value: Integer); + procedure SetClientAreaSize(AWidth, AHeight: Integer); + protected + function DoArrange(CanMoveControls: Boolean; PreviousDockType: TTBDockType; + NewFloating: Boolean; NewDock: TTBDock): TPoint; override; + procedure GetBaseSize(var ASize: TPoint); override; + procedure GetMinMaxSize(var AMinClientWidth, AMinClientHeight, + AMaxClientWidth, AMaxClientHeight: Integer); override; + procedure Paint; override; + procedure SizeChanging(const AWidth, AHeight: Integer); override; + public + constructor Create(AOwner: TComponent); override; + + procedure ReadPositionData(const Data: TTBReadPositionData); override; + procedure WritePositionData(const Data: TTBWritePositionData); override; + published + property ActivateParent; + property Align; + property Anchors; + property BorderStyle; + property Caption; + property Color; + property CloseButton; + property CloseButtonWhenDocked; + property ClientAreaHeight: Integer read GetClientAreaHeight write SetClientAreaHeight; + property ClientAreaWidth: Integer read GetClientAreaWidth write SetClientAreaWidth; + property CurrentDock; + property DefaultDock; + property DockableTo; + property DockMode; + property DockPos; + property DockRow; + property DragHandleStyle; + property FloatingMode; + property Font; + property FullSize; + property HideWhenInactive; + property LastDock; + property MaxClientHeight: Integer read FMaxClientHeight write FMaxClientHeight default 0; + property MaxClientWidth: Integer read FMaxClientWidth write FMaxClientWidth default 0; + property MinClientHeight: Integer read FMinClientHeight write FMinClientHeight default 32; + property MinClientWidth: Integer read FMinClientWidth write FMinClientWidth default 32; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property Resizable; + property ShowCaption; + property ShowHint; + property Stretch; + property SmoothDrag; + property TabOrder; + property UseLastDock; + {}{property Version;} + property Visible; + + property OnClose; + property OnCloseQuery; + {$IFDEF JR_D5} + property OnContextPopup; + {$ENDIF} + property OnDragDrop; + property OnDragOver; + property OnDockChanged; + property OnDockChanging; + property OnDockChangingHidden; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnMove; + property OnRecreated; + property OnRecreating; + property OnResize; + property OnVisibleChanged; + end; + +implementation + +const + { Constants for TTBToolWindow-specific registry values. Do not localize! } + rvClientWidth = 'ClientWidth'; + rvClientHeight = 'ClientHeight'; + + +{ TTBToolWindow } + +constructor TTBToolWindow.Create(AOwner: TComponent); +begin + inherited; + FMinClientWidth := 32; + FMinClientHeight := 32; + { Initialize the client size to 32x32 } + SetBounds(Left, Top, 32, 32); +end; + +procedure TTBToolWindow.Paint; +var + R: TRect; +begin + { Draw dotted border in design mode } + if csDesigning in ComponentState then + with Canvas do begin + R := ClientRect; + Pen.Style := psDot; + Pen.Color := clBtnShadow; + Brush.Style := bsClear; + Rectangle(R.Left, R.Top, R.Right, R.Bottom); + Pen.Style := psSolid; + end; +end; + +procedure TTBToolWindow.ReadPositionData(const Data: TTBReadPositionData); +begin + inherited; + { Restore ClientAreaWidth/ClientAreaHeight variables } + if Resizable then + with Data do + SetClientAreaSize(ReadIntProc(Name, rvClientWidth, FBarWidth, ExtraData), + ReadIntProc(Name, rvClientHeight, FBarHeight, ExtraData)); +end; + +procedure TTBToolWindow.WritePositionData(const Data: TTBWritePositionData); +begin + inherited; + { Write values of FBarWidth/FBarHeight } + with Data do begin + WriteIntProc(Name, rvClientWidth, FBarWidth, ExtraData); + WriteIntProc(Name, rvClientHeight, FBarHeight, ExtraData); + end; +end; + +procedure TTBToolWindow.GetMinMaxSize(var AMinClientWidth, AMinClientHeight, + AMaxClientWidth, AMaxClientHeight: Integer); +begin + AMinClientWidth := FMinClientWidth; + AMinClientHeight := FMinClientHeight; + AMaxClientWidth := FMaxClientWidth; + AMaxClientHeight := FMaxClientHeight; +end; + +procedure TTBToolWindow.SizeChanging(const AWidth, AHeight: Integer); +begin + FBarWidth := AWidth; + if Parent <> nil then Dec(FBarWidth, Width - ClientWidth); + FBarHeight := AHeight; + if Parent <> nil then Dec(FBarHeight, Height - ClientHeight); +end; + +function TTBToolWindow.CalcSize(ADock: TTBDock): TPoint; +begin + Result.X := FBarWidth; + Result.Y := FBarHeight; + if Assigned(ADock) and (FullSize or Stretch) then begin + { If docked and stretching, return the minimum size so that the toolbar + can shrink below FBarWidth/FBarHeight } + if not(ADock.Position in [dpLeft, dpRight]) then + Result.X := FMinClientWidth + else + Result.Y := FMinClientHeight; + end; +end; + +procedure TTBToolWindow.GetBaseSize(var ASize: TPoint); +begin + ASize := CalcSize(CurrentDock); +end; + +function TTBToolWindow.DoArrange(CanMoveControls: Boolean; + PreviousDockType: TTBDockType; NewFloating: Boolean; NewDock: TTBDock): TPoint; +begin + Result := CalcSize(NewDock); +end; + +function TTBToolWindow.GetClientAreaWidth: Integer; +begin + if Parent = nil then + Result := Width + else + Result := ClientWidth; +end; + +procedure TTBToolWindow.SetClientAreaWidth(Value: Integer); +begin + SetClientAreaSize(Value, ClientAreaHeight); +end; + +function TTBToolWindow.GetClientAreaHeight: Integer; +begin + if Parent = nil then + Result := Height + else + Result := ClientHeight; +end; + +procedure TTBToolWindow.SetClientAreaHeight(Value: Integer); +begin + SetClientAreaSize(ClientAreaWidth, Value); +end; + +procedure TTBToolWindow.SetClientAreaSize(AWidth, AHeight: Integer); +var + Client: TRect; +begin + if Parent = nil then + SetBounds(Left, Top, AWidth, AHeight) + else begin + Client := GetClientRect; + SetBounds(Left, Top, Width - Client.Right + AWidth, + Height - Client.Bottom + AHeight); + end; +end; + +end. diff --git a/internal/2.2.2/1/Source/TB2Toolbar.pas b/internal/2.2.2/1/Source/TB2Toolbar.pas new file mode 100644 index 0000000..2264fd5 --- /dev/null +++ b/internal/2.2.2/1/Source/TB2Toolbar.pas @@ -0,0 +1,1794 @@ +unit TB2Toolbar; + +{ + Toolbar2000 + Copyright (C) 1998-2008 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2Toolbar.pas,v 1.126 2008/06/23 18:05:47 jr Exp $ +} + +interface + +{$I TB2Ver.inc} + +uses + {$IFDEF JR_D9} Types, {$ENDIF} + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, ImgList, + Menus, ActnList, + TB2Item, TB2Dock; + +type + TTBCustomToolbar = class; + TTBChevronItem = class; + TTBChevronItemClass = class of TTBChevronItem; + + TTBToolbarViewClass = class of TTBToolbarView; + TTBToolbarView = class(TTBView) + private + FToolbar: TTBCustomToolbar; + protected + procedure AutoSize(AWidth, AHeight: Integer); override; + procedure DoUpdatePositions(var ASize: TPoint); override; + function GetChevronItem: TTBCustomItem; override; + function GetMDIButtonsItem: TTBCustomItem; override; + function GetMDISystemMenuItem: TTBCustomItem; override; + public + constructor Create(AOwner: TComponent; AParentView: TTBView; + AParentItem: TTBCustomItem; AWindow: TWinControl; + AIsToolbar, ACustomizing, AUsePriorityList: Boolean); override; + function GetFont: TFont; override; + procedure InvalidatePositions; override; + end; + + TTBChevronPriorityForNewItems = (tbcpHighest, tbcpLowest); + + TTBCustomToolbar = class(TTBCustomDockableWindow, ITBItems) + private + FBaseSize: TPoint; + FChevronItem: TTBChevronItem; + FChevronMoveItems: Boolean; + FChevronPriorityForNewItems: TTBChevronPriorityForNewItems; + FDisableAlignArrange: Integer; + FFloatingWidth: Integer; + FIgnoreMouseLeave: Boolean; + FItem: TTBRootItem; + FLastWrappedLines: Integer; + FMenuBar: Boolean; + FOnShortCut: TShortCutEvent; + FProcessShortCuts: Boolean; + FMainWindowHookInstalled: Boolean; + FShrinkMode: TTBShrinkMode; + FSizeData: TObject; + FSystemFont: Boolean; + FUpdateActions: Boolean; + + procedure CancelHover; + function CalcChevronOffset(const ADock: TTBDock; + const AOrientation: TTBViewOrientation): Integer; + function CalcWrapOffset(const ADock: TTBDock): Integer; + function CreateWrapper(Index: Integer; Ctl: TControl): TTBControlItem; + function FindWrapper(Ctl: TControl): TTBControlItem; + function GetChevronHint: String; + function GetImages: TCustomImageList; + function GetItems: TTBCustomItem; + function GetLinkSubitems: TTBCustomItem; + function GetOptions: TTBItemOptions; + procedure InstallMainWindowHook; + function IsChevronHintStored: Boolean; + class function MainWindowHook(var Message: TMessage): Boolean; {$IFDEF CLR} static; {$ENDIF} + procedure SetChevronHint(const Value: String); + procedure SetChevronMoveItems(Value: Boolean); + procedure SetChevronPriorityForNewItems(Value: TTBChevronPriorityForNewItems); + procedure SetFloatingWidth(Value: Integer); + procedure SetImages(Value: TCustomImageList); + procedure SetLinkSubitems(Value: TTBCustomItem); + procedure SetMainWindowHook; + procedure SetMenuBar(Value: Boolean); + procedure SetOptions(Value: TTBItemOptions); + procedure SetProcessShortCuts(Value: Boolean); + procedure SetShrinkMode(Value: TTBShrinkMode); + procedure SetSystemFont(Value: Boolean); + procedure UninstallMainWindowHook; + procedure UpdateViewProperties; + + procedure CMColorChanged(var Message: TMessage); message CM_COLORCHANGED; + {$IFNDEF CLR} + procedure CMControlChange(var Message: TCMControlChange); message CM_CONTROLCHANGE; + procedure CMControlListChange(var Message: TCMControlListChange); message CM_CONTROLLISTCHANGE; + {$ENDIF} + procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED; + procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; + procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY; + procedure CMHintShow(var Message: TCMHintShow); message CM_HINTSHOW; + procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; + procedure CMShowHintChanged(var Message: TMessage); message CM_SHOWHINTCHANGED; + procedure CMWinIniChange(var Message: TWMWinIniChange); message CM_WININICHANGE; + procedure WMCancelMode(var Message: TWMCancelMode); message WM_CANCELMODE; + procedure WMGetObject(var Message: TMessage); message WM_GETOBJECT; + procedure WMMouseLeave(var Message: TMessage); message WM_MOUSELEAVE; + procedure WMNCMouseMove(var Message: TWMNCMouseMove); message WM_NCMOUSEMOVE; + {$IFNDEF JR_D5} + procedure WMRButtonUp(var Message: TWMRButtonUp); message WM_RBUTTONUP; + {$ENDIF} + procedure WMSetCursor(var Message: TWMSetCursor); message WM_SETCURSOR; + procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND; + protected + FMDIButtonsItem: TTBCustomItem; + FMDISystemMenuItem: TTBCustomItem; + FView: TTBToolbarView; + procedure AlignControls(AControl: TControl; var Rect: TRect); override; + procedure BuildPotentialSizesList(SizesList: TList); dynamic; + {$IFDEF CLR} + procedure ControlChange(Inserting: Boolean; Child: TControl); override; + procedure ControlListChange(Inserting: Boolean; Child: TControl); override; + {$ENDIF} + procedure ControlExistsAtPos(const P: TPoint; var ControlExists: Boolean); + override; + function DoArrange(CanMoveControls: Boolean; PreviousDockType: TTBDockType; + NewFloating: Boolean; NewDock: TTBDock): TPoint; override; + {$IFDEF JR_D5} + procedure DoContextPopup(MousePos: TPoint; var Handled: Boolean); override; + {$ENDIF} + procedure GetBaseSize(var ASize: TPoint); override; + procedure GetMinBarSize(var MinimumSize: TPoint); + procedure GetMinShrinkSize(var AMinimumSize: Integer); override; + function GetShrinkMode: TTBShrinkMode; override; + function GetChevronItemClass: TTBChevronItemClass; dynamic; + function GetItemClass: TTBRootItemClass; dynamic; + function GetViewClass: TTBToolbarViewClass; dynamic; + procedure Loaded; override; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); override; + procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; + procedure Paint; override; + procedure ResizeBegin(ASizeHandle: TTBSizeHandle); override; + procedure ResizeTrack(var Rect: TRect; const OrigRect: TRect); override; + procedure ResizeTrackAccept; override; + procedure ResizeEnd; override; + procedure SetChildOrder(Child: TComponent; Order: Integer); override; + + property SystemFont: Boolean read FSystemFont write SetSystemFont default True; + property OnShortCut: TShortCutEvent read FOnShortCut write FOnShortCut; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure BeginUpdate; + procedure EndUpdate; + procedure CreateWrappersForAllControls; + procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override; + procedure GetTabOrderList(List: TList); override; + procedure InitiateAction; override; + function IsShortCut(var Message: TWMKey): Boolean; + function KeyboardOpen(Key: Char; RequirePrimaryAccel: Boolean): Boolean; + procedure ReadPositionData(const Data: TTBReadPositionData); override; + procedure WritePositionData(const Data: TTBWritePositionData); override; + + property ChevronHint: String read GetChevronHint write SetChevronHint stored IsChevronHintStored; + property ChevronMoveItems: Boolean read FChevronMoveItems write SetChevronMoveItems default True; + property ChevronPriorityForNewItems: TTBChevronPriorityForNewItems read FChevronPriorityForNewItems + write SetChevronPriorityForNewItems default tbcpHighest; + property FloatingWidth: Integer read FFloatingWidth write SetFloatingWidth default 0; + property Images: TCustomImageList read GetImages write SetImages; + property Items: TTBRootItem read FItem; + property LinkSubitems: TTBCustomItem read GetLinkSubitems write SetLinkSubitems; + property Options: TTBItemOptions read GetOptions write SetOptions default []; + property MenuBar: Boolean read FMenuBar write SetMenuBar default False; + property ProcessShortCuts: Boolean read FProcessShortCuts write SetProcessShortCuts default False; + property ShrinkMode: TTBShrinkMode read FShrinkMode write SetShrinkMode default tbsmChevron; + property UpdateActions: Boolean read FUpdateActions write FUpdateActions default True; + property View: TTBToolbarView read FView; + published + property Hint stored False; { Hint is set dynamically; don't save it } + end; + + TTBToolbar = class(TTBCustomToolbar) + published + property ActivateParent; + property Align; + property Anchors; + property AutoResize; + property BorderStyle; + property Caption; + property ChevronHint; + property ChevronMoveItems; + property ChevronPriorityForNewItems; + property CloseButton; + property CloseButtonWhenDocked; + property Color; + property CurrentDock; + property DefaultDock; + property DockableTo; + property DockMode; + property DockPos; + property DockRow; + property DragHandleStyle; + property FloatingMode; + property FloatingWidth; + property Font; + property FullSize; + property HideWhenInactive; + property Images; + property Items; + property LastDock; + property LinkSubitems; + property MenuBar; + property Options; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ProcessShortCuts; + property Resizable; + property ShowCaption; + property ShowHint; + property ShrinkMode; + property SmoothDrag; + property Stretch; + property SystemFont; + property TabOrder; + property UpdateActions; + property UseLastDock; + property Visible; + + property OnClose; + property OnCloseQuery; + {$IFDEF JR_D5} + property OnContextPopup; + {$ENDIF} + property OnDragDrop; + property OnDragOver; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnMove; + property OnRecreated; + property OnRecreating; + property OnDockChanged; + property OnDockChanging; + property OnDockChangingHidden; + property OnResize; + property OnShortCut; + property OnVisibleChanged; + end; + +{ TTBChevronItem & TTBChevronItemViewer } + + TTBChevronItem = class(TTBCustomItem) + private + FToolbar: TTBCustomToolbar; + function GetDefaultHint: String; + protected + function GetChevronParentView: TTBView; override; + function GetItemViewerClass(AView: TTBView): TTBItemViewerClass; override; + public + constructor Create(AOwner: TComponent); override; + end; + + TTBChevronItemViewer = class(TTBItemViewer) + protected + procedure Paint(const Canvas: TCanvas; const ClientAreaRect: TRect; + IsSelected, IsPushed, UseDisabledShadow: Boolean); override; + end; + +const + tbChevronSize = 12; + + +implementation + +uses + {$IFDEF CLR} System.Runtime.InteropServices, System.Text, {$ENDIF} + TB2Consts, TB2Common, TB2Hook; + +const + { Constants for TTBCustomToolbar-specific registry values. Do not localize! } + rvFloatRightX = 'FloatRightX'; + DockTypeToOrientation: array[TTBDockType] of TTBViewOrientation = + (tbvoHorizontal, tbvoFloating, tbvoHorizontal, tbvoVertical); + +type + { Used internally by the TTBCustomToolbar.Resize* methods } + TToolbarSizeData = class + public + SizeHandle: TTBSizeHandle; + NewSizes: TList; { List of valid new sizes. Items are casted into TSmallPoints } + OrigWidth, OrigHeight, NCXDiff: Integer; + CurRightX: Integer; + DisableSensCheck, OpSide: Boolean; + DistanceToSmallerSize, DistanceToLargerSize: Integer; + end; + + +procedure HookProc(Code: THookProcCode; Wnd: HWND; WParam: WPARAM; + LParam: LPARAM); +var + Msg: {$IFNDEF CLR} PMsg {$ELSE} TMsg {$ENDIF}; + MainForm: TForm; +begin + { Work around an annoying Windows or VCL bug. If you close all MDI child + windows, the MDI client window gets the focus, and when it has the focus, + pressing Alt+[char] doesn't send a WM_SYSCOMMAND message to the form for + some reason. It seems silly to have to use a hook for this, but I don't + see a better workaround. + Also, route Alt+- to the main form so that when an MDI child form is + maximized, Alt+- brings up the TB2k MDI system menu instead of the + system's. } + if Code = hpGetMessage then begin + {$IFNDEF CLR} + Msg := PMsg(LParam); + {$ELSE} + Msg := TMsg(Marshal.PtrToStructure(IntPtr(LParam), TypeOf(TMsg))); + {$ENDIF} + if (Msg.message = WM_SYSCHAR) and (Msg.hwnd <> 0) then begin + { Note: On Windows NT/2000/XP, even though we install the hook using + SetWindowsHookExW, Msg.wParam may either be an ANSI character or a + Unicode character, due to an apparent bug on these platforms. It is + an ANSI character when the message passes through a separate + SetWindowsHookExA-installed WH_GETMESSAGE hook first, and that hook + calls us via CallNextHookEx. Windows apparently "forgets" to convert + the character from ANSI back to Unicode in this case. + We can't convert the character code because there seems to be no way + to detect whether it is ANSI or Unicode. So we can't really do much + with Msg.wParam, apart from comparing it against character codes that + are the same between ANSI and Unicode, such as '-'. } + MainForm := Application.MainForm; + if Assigned(MainForm) and MainForm.HandleAllocated and (GetCapture = 0) and + ((Msg.hwnd = MainForm.ClientHandle) or + ((Msg.wParam = Ord('-')) and (MainForm.ClientHandle <> 0) and + IsChild(MainForm.ClientHandle, Msg.hwnd))) then begin + { Redirect the message to the main form. + Note: Unfortunately, due to a bug in Windows NT 4.0 (and not + 2000/XP/9x/Me), modifications to the message don't take effect if + another WH_GETMESSAGE hook has been installed above this one. + (The bug is that CallNextHookEx copies lParam^ to a local buffer, but + does not propogate the changes made by the hook back to lParam^ when + it returns.) I don't know of any clean workaround, other than to + ensure other WH_GETMESSAGE hooks are installed *before* + Toolbar2000's. } + Msg.hwnd := MainForm.Handle; + {$IFDEF CLR} + Marshal.StructureToPtr(TObject(Msg), IntPtr(LParam), False); + {$ENDIF} + end; + end; + end; +end; + +constructor TTBChevronItem.Create(AOwner: TComponent); +begin + inherited; + FToolbar := AOwner as TTBCustomToolbar; + ItemStyle := ItemStyle + [tbisSubMenu, tbisNoAutoOpen]; + Hint := GetDefaultHint; + Caption := EscapeAmpersands(GetShortHint(Hint)); +end; + +function TTBChevronItem.GetChevronParentView: TTBView; +begin + Result := FToolbar.FView; +end; + +function TTBChevronItem.GetDefaultHint: String; +begin + Result := STBChevronItemMoreButtonsHint; +end; + +function TTBChevronItem.GetItemViewerClass(AView: TTBView): TTBItemViewerClass; +begin + Result := TTBChevronItemViewer; +end; + +procedure TTBChevronItemViewer.Paint(const Canvas: TCanvas; + const ClientAreaRect: TRect; IsSelected, IsPushed, UseDisabledShadow: Boolean); +const + HorzPattern: array[0..15] of Byte = + ($CC, 0, $66, 0, $33, 0, $66, 0, $CC, 0, 0, 0, 0, 0, 0, 0); + VertPattern: array[0..15] of Byte = + ($88, 0, $D8, 0, $70, 0, $20, 0, $88, 0, $D8, 0, $70, 0, $20, 0); +var + DC: HDC; + R2: TRect; + TempBmp: TBitmap; + + procedure DrawPattern(const Color, Offset: Integer); + begin + SelectObject(DC, GetSysColorBrush(Color)); + BitBlt(DC, R2.Left, R2.Top + Offset, R2.Right - R2.Left, + R2.Bottom - R2.Top, TempBmp.Canvas.Handle, 0, 0, $00E20746 {ROP_DSPDxax}); + end; + +begin + DC := Canvas.Handle; + R2 := ClientAreaRect; + if Item.Enabled then begin + if IsPushed then + DrawEdge(DC, R2, BDR_SUNKENOUTER, BF_RECT) + else if IsSelected and not(csDesigning in Item.ComponentState) then + DrawEdge(DC, R2, BDR_RAISEDINNER, BF_RECT); + end; + + if View.Orientation <> tbvoVertical then begin + R2.Top := 4; + R2.Bottom := R2.Top + 5; + Inc(R2.Left, 2); + R2.Right := R2.Left + 8; + end + else begin + R2.Left := R2.Right - 9; + R2.Right := R2.Left + 5; + Inc(R2.Top, 2); + R2.Bottom := R2.Top + 8; + end; + if IsPushed then + OffsetRect(R2, 1, 1); + TempBmp := TBitmap.Create; + try + if View.Orientation = tbvoVertical then + TempBmp.Handle := CreateMonoBitmap(8, 8, VertPattern) + else + TempBmp.Handle := CreateMonoBitmap(8, 8, HorzPattern); + SetTextColor(DC, clBlack); + SetBkColor(DC, clWhite); + if Item.Enabled then + DrawPattern(COLOR_BTNTEXT, 0) + else begin + DrawPattern(COLOR_BTNHIGHLIGHT, 1); + DrawPattern(COLOR_BTNSHADOW, 0); + end; + finally + TempBmp.Free; + end; +end; + + +{ TTBToolbarView } + +constructor TTBToolbarView.Create(AOwner: TComponent; AParentView: TTBView; + AParentItem: TTBCustomItem; AWindow: TWinControl; + AIsToolbar, ACustomizing, AUsePriorityList: Boolean); +begin + FToolbar := AOwner as TTBCustomToolbar; + inherited; +end; + +procedure TTBToolbarView.AutoSize(AWidth, AHeight: Integer); +begin + FToolbar.FBaseSize := BaseSize; + if FToolbar.IsAutoResized then + FToolbar.ChangeSize(AWidth, AHeight); +end; + +procedure TTBToolbarView.DoUpdatePositions(var ASize: TPoint); +begin + { Reset CurrentSize because it probably won't be valid after positions + are recalculated [2001-06-24] } + FToolbar.CurrentSize := 0; + FToolbar.GetMinBarSize(ASize); + { On FullSize toolbars, increase ASize.X/Y to WrapOffset so that + right-aligned items always appear at the right edge even when the toolbar + isn't wrapping } + if FToolbar.FullSize then begin + if (Orientation = tbvoHorizontal) and (ASize.X < WrapOffset) then + ASize.X := WrapOffset + else if (Orientation = tbvoVertical) and (ASize.Y < WrapOffset) then + ASize.Y := WrapOffset; + end; + { Increment FDisableAlignArrange so that we don't recursively arrange when + CalculatePositions moves controls } + Inc(FToolbar.FDisableAlignArrange); + try + inherited; + finally + Dec(FToolbar.FDisableAlignArrange); + end; +end; + +procedure TTBToolbarView.InvalidatePositions; +begin + { Reset CurrentSize because it probably won't be valid after positions + are recalculated [2001-06-04] } + FToolbar.CurrentSize := 0; + inherited; +end; + +function TTBToolbarView.GetFont: TFont; +begin + if not FToolbar.SystemFont then + Result := FToolbar.Font + else + Result := inherited GetFont; +end; + +function TTBToolbarView.GetChevronItem: TTBCustomItem; +begin + Result := FToolbar.FChevronItem; +end; + +function TTBToolbarView.GetMDIButtonsItem: TTBCustomItem; +begin + Result := FToolbar.FMDIButtonsItem; +end; + +function TTBToolbarView.GetMDISystemMenuItem: TTBCustomItem; +begin + Result := FToolbar.FMDISystemMenuItem; +end; + + +{ TTBCustomToolbar } + +type + {}TTBCustomItemAccess = class(TTBCustomItem); + TTBItemViewerAccess = class(TTBItemViewer); + +constructor TTBCustomToolbar.Create(AOwner: TComponent); +begin + inherited; + ControlStyle := ControlStyle + [csAcceptsControls, csActionClient] - + [csCaptureMouse]; + DockableWindowStyles := DockableWindowStyles - [tbdsResizeEightCorner, + tbdsResizeClipCursor]; + FItem := GetItemClass.Create(Self); + FItem.ParentComponent := Self; + FChevronItem := GetChevronItemClass.Create(Self); + FChevronItem.LinkSubitems := FItem; + FChevronMoveItems := True; + FView := GetViewClass.Create(Self, nil, FItem, Self, True, False, + not(csDesigning in ComponentState)); + FView.BackgroundColor := clBtnFace; + FUpdateActions := True; + FShrinkMode := tbsmChevron; + FSystemFont := True; + Color := clBtnFace; + SetBounds(Left, Top, 23, 22);{} +end; + +destructor TTBCustomToolbar.Destroy; +begin + { Call Destroying to ensure csDestroying is in ComponentState now. Only + needed for Delphi 4 and earlier since Delphi 5 calls Destroying in + TComponent.BeforeDestruction } + Destroying; + UninstallHookProc(Self, HookProc); + UninstallMainWindowHook; + FreeAndNil(FView); + FreeAndNil(FChevronItem); + FreeAndNil(FItem); + inherited; +end; + +function TTBCustomToolbar.GetItems: TTBCustomItem; +begin + Result := FItem; +end; + +function TTBCustomToolbar.GetItemClass: TTBRootItemClass; +begin + Result := TTBRootItem; +end; + +function TTBCustomToolbar.GetViewClass: TTBToolbarViewClass; +begin + Result := TTBToolbarView; +end; + +function TTBCustomToolbar.GetChevronItemClass: TTBChevronItemClass; +begin + Result := TTBChevronItem; +end; + +procedure TTBCustomToolbar.CreateWrappersForAllControls; +{ Create wrappers for any controls that don't already have them } +var + L: TList; + I, J, C: Integer; +begin + if ControlCount = 0 then + Exit; + L := TList.Create; + try + L.Capacity := ControlCount; + for I := 0 to ControlCount-1 do + L.Add(Controls[I]); + C := FItem.Count-1; + for I := 0 to C do + if FItem[I] is TTBControlItem then begin + J := L.IndexOf(TTBControlItem(FItem[I]).Control); + if J <> -1 then + L[J] := nil; + end; + for I := 0 to L.Count-1 do + if Assigned(L[I]) then + CreateWrapper(FItem.Count, TControl(L[I])); + finally + L.Free; + end; +end; + +procedure TTBCustomToolbar.Loaded; +begin + CreateWrappersForAllControls; + inherited; +end; + +procedure TTBCustomToolbar.GetChildren(Proc: TGetChildProc; Root: TComponent); +begin + TTBCustomItemAccess(TTBCustomItem(FItem)).GetChildren(Proc, Root); + inherited; +end; + +procedure TTBCustomToolbar.SetChildOrder(Child: TComponent; Order: Integer); +begin + if Child is TTBCustomItem then + TTBCustomItemAccess(TTBCustomItem(FItem)).SetChildOrder(Child, Order); +end; + +procedure TTBCustomToolbar.AlignControls(AControl: TControl; var Rect: TRect); +{ VCL calls this whenever any child controls in the toolbar are moved, sized, + inserted, etc., and also when the toolbar is resized. } +begin + if FDisableAlignArrange = 0 then + Arrange; +end; + +procedure TTBCustomToolbar.InitiateAction; +begin + inherited; + {}{ also add this to popupmenu(?) } + { Update visible top-level items } + if FUpdateActions then + FView.InitiateActions; +end; + +procedure TTBCustomToolbar.CMColorChanged(var Message: TMessage); +begin + { Synchronize FView.BackgroundColor with the new color } + if Assigned(FView) then + FView.BackgroundColor := Color; + inherited; +end; + +function TTBCustomToolbar.CreateWrapper(Index: Integer; + Ctl: TControl): TTBControlItem; +var + I: Integer; + S: String; +begin + Result := TTBControlItem.Create(Owner); + Result.Control := Ctl; + if (csDesigning in ComponentState) and Assigned(Owner) then begin + { Needs a name for compatibility with form inheritance } + I := 1; + while True do begin + S := Format('TBControlItem%d', [I]); + if Owner.FindComponent(S) = nil then + Break; + Inc(I); + end; + Result.Name := S; + end; + FItem.Insert(Index, Result); +end; + +function TTBCustomToolbar.FindWrapper(Ctl: TControl): TTBControlItem; +var + I: Integer; + Item: TTBCustomItem; +begin + Result := nil; + for I := 0 to FItem.Count-1 do begin + Item := FItem[I]; + if (Item is TTBControlItem) and + (TTBControlItem(Item).Control = Ctl) then begin + Result := TTBControlItem(Item); + Break; + end; + end; +end; + +{$IFNDEF CLR} +procedure TTBCustomToolbar.CMControlChange(var Message: TCMControlChange); +{$ELSE} +procedure TTBCustomToolbar.ControlChange(Inserting: Boolean; Child: TControl); +{$ENDIF} +{ A CM_CONTROLCHANGE handler must be used instead of a CM_CONTROLLISTCHANGE + handler because when a CM_CONTROLLISTCHANGE message is sent it is relayed to + *all* parents. CM_CONTROLCHANGE messages are only sent to the immediate + parent. } + + procedure HandleControlChange(Inserting: Boolean; Child: TControl); + begin + { Don't automatically create TTBControlItem wrappers if the component + is loading or being updated to reflect changes in an ancestor form, + because wrappers will be streamed in } + if Inserting and not(csLoading in ComponentState) and + not(csUpdating in ComponentState) and + (FindWrapper(Child) = nil) then + CreateWrapper(FItem.Count, Child); + end; + +begin + inherited; + {$IFNDEF CLR} + HandleControlChange(Message.Inserting, Message.Control); + {$ELSE} + HandleControlChange(Inserting, Child); + {$ENDIF} +end; + +{$IFNDEF CLR} +procedure TTBCustomToolbar.CMControlListChange(var Message: TCMControlListChange); +{$ELSE} +procedure TTBCustomToolbar.ControlListChange(Inserting: Boolean; Child: TControl); +{$ENDIF} +{ Don't handle deletions inside CM_CONTROLCHANGE because CM_CONTROLCHANGE is + sent *before* a control begins removing itself from its parent. (It used + to handle both insertions and deletions inside CM_CONTROLCHANGE but this + caused AV's.) } + + procedure HandleControlListChange(Inserting: Boolean; Child: TControl); + var + Item: TTBControlItem; + begin + if not Inserting and Assigned(FItem) then begin + while True do begin + Item := FindWrapper(Child); + if Item = nil then Break; + { The control is being removed the control, not necessarily destroyed, + so set DontFreeControl to True } + Item.DontFreeControl := True; + Item.Free; + end; + end; + end; + +begin + inherited; + {$IFNDEF CLR} + HandleControlListChange(Message.Inserting, Message.Control); + {$ELSE} + HandleControlListChange(Inserting, Child); + {$ENDIF} +end; + +procedure TTBCustomToolbar.CMHintShow(var Message: TCMHintShow); +{ Since the items on a toolbar aren't "real" controls, it needs a CM_HINTSHOW + handler for their hints to be displayed. } +begin + FView.HandleHintShowMessage(Message); +end; + +procedure TTBCustomToolbar.CMShowHintChanged(var Message: TMessage); +begin + inherited; + if ShowHint then + FView.Style := FView.Style + [vsAlwaysShowHints] + else + FView.Style := FView.Style - [vsAlwaysShowHints]; +end; + +procedure TTBCustomToolbar.WMGetObject(var Message: TMessage); +begin + if not FView.HandleWMGetObject(Message) then + inherited; +end; + +procedure TTBCustomToolbar.WMSetCursor(var Message: TWMSetCursor); +var + P: TPoint; + Viewer: TTBItemViewer; + Cursor: HCURSOR; +begin + if not(csDesigning in ComponentState) and + (Message.CursorWnd = WindowHandle) and + (Smallint(Message.HitTest) = HTCLIENT) then begin + { Note: This should not change the selection, because we can receive this + message during a modal loop if a user sets "Screen.Cursor := crDefault" + inside a submenu's OnClick handler (which really isn't recommended, as + it won't necessarily restore the cursor we set originally). } + GetCursorPos(P); + P := ScreenToClient(P); + Viewer := FView.ViewerFromPoint(P); + if Assigned(Viewer) then begin + Cursor := 0; + Dec(P.X, Viewer.BoundsRect.Left); + Dec(P.Y, Viewer.BoundsRect.Top); + TTBItemViewerAccess(Viewer).GetCursor(P, Cursor); + if Cursor <> 0 then begin + SetCursor(Cursor); + Message.Result := 1; + Exit; + end; + end; + end; + inherited; +end; + +procedure TTBCustomToolbar.WMSysCommand(var Message: TWMSysCommand); +var + ConvertedKey: Char; +begin + if FMenuBar and CanFocus then + with Message do + if (CmdType and $FFF0 = SC_KEYMENU) and (Key <> VK_SPACE) and + (GetCapture = 0) then begin + {$IFNDEF CLR} + {$IFDEF JR_WIDESTR} + { Under Unicode Win32 VCL, no conversion required } + WideChar(ConvertedKey) := WideChar(Key); + {$ELSE} + if Win32Platform = VER_PLATFORM_WIN32_NT then begin + { On Windows NT 4/2000/XP, Key is a wide character, so we have to + convert it. Pressing Alt+N in a Russian input locale, for example, + results in a Key value of $0442. + This could perhaps be considered a bug in Windows NT since the + character codes in other messages such as WM_SYSCHAR aren't left + in Unicode form. + The conversion isn't done with the system code page, but rather + with the code page of the currently active input locale, like + Windows does when sending WM_(SYS)CHAR messages. } + if WideCharToMultiByte(GetInputLocaleCodePage, 0, @WideChar(Key), 1, + @AnsiChar(ConvertedKey), 1, nil, nil) <> 1 then + Exit; { shouldn't fail, but if it does, we can't continue } + end + else begin + { On Windows 95/98/Me, Key is not a wide character. } + AnsiChar(ConvertedKey) := AnsiChar(Key); + end; + {$ENDIF} + {$ELSE} + if Marshal.SystemDefaultCharSize = 2 then begin + { Strings are Unicode on .NET, so no need to downconvert to ANSI } + ConvertedKey := WideChar(Key); + end + else begin + { On Windows 98/Me, we have to convert ANSI->Unicode, using the + code page of the currently active input locale } + ConvertedKey := Encoding.GetEncoding(GetInputLocaleCodePage). + GetChars([Byte(Key)])[0]; + end; + {$ENDIF} + if not KeyboardOpen(ConvertedKey, False) then begin + if Key = Ord('-') then Exit; + MessageBeep(0); + end; + Result := 1; + end; +end; + +procedure TTBCustomToolbar.Paint; +var + R: TRect; +begin + { Draw dotted border in design mode on undocked toolbars } + if not Docked and (csDesigning in ComponentState) then + with Canvas do begin + R := ClientRect; + Pen.Style := psDot; + Pen.Color := clBtnShadow; + Brush.Style := bsClear; + Rectangle(R.Left, R.Top, R.Right, R.Bottom); + Pen.Style := psSolid; + end; + FView.DrawSubitems(Canvas); +end; + +procedure TTBCustomToolbar.CMDialogKey(var Message: TCMDialogKey); +begin + if not(csDesigning in ComponentState) and + (Message.CharCode = VK_MENU) and FMenuBar and CanFocus then + FView.SetAccelsVisibility(True); + inherited; +end; + +procedure TTBCustomToolbar.CMDialogChar(var Message: TCMDialogChar); +begin + { On toolbars that aren't menu bars, handle CM_DIALOGCHAR instead of + WM_SYSCOMMAND. + Note: We have to check for csDesigning because on Delphi 2005/2006 we get + CM_DIALOG* messages if Alt+[key] is pressed while a form with a toolbar is + open in the embedded designer, and a tab other than Design is currently + selected (e.g., Code). } + if not(csDesigning in ComponentState) and + not FMenuBar and CanFocus and (Message.CharCode <> 0) then + if KeyboardOpen(Chr(Message.CharCode), True) then begin + Message.Result := 1; + Exit; + end; + inherited; +end; + +procedure TTBCustomToolbar.CancelHover; +begin + if not MouseCapture then + FView.UpdateSelection(Point(Low(Integer), Low(Integer)), True); +end; + +procedure TTBCustomToolbar.CMMouseLeave(var Message: TMessage); +begin + CancelHover; + inherited; +end; + +{$IFDEF JR_D5} +procedure TTBCustomToolbar.DoContextPopup(MousePos: TPoint; + var Handled: Boolean); +begin + CancelHover; + inherited; +end; +{$ENDIF} + +{$IFNDEF JR_D5} +{ Delphi 4 and earlier don't have a DoContextPopup method; we instead have to + trap WM_RBUTTONUP to determine if a popup menu (might) be displayed } +procedure TTBCustomToolbar.WMRButtonUp(var Message: TWMRButtonUp); +begin + CancelHover; + inherited; +end; +{$ENDIF} + +procedure TTBCustomToolbar.MouseMove(Shift: TShiftState; X, Y: Integer); +var + P: TPoint; + Item: TTBCustomItem; +begin + if not(csDesigning in ComponentState) then begin + P := ClientToScreen(Point(X, Y)); + FView.UpdateSelection(P, True); + if Assigned(FView.Selected) then begin + Item := FView.Selected.Item; + if not(tboLongHintInMenuOnly in Item.EffectiveOptions) then + Hint := Item.Hint + else + Hint := ''; + end + else + Hint := ''; + end; + { Call TrackMouseEvent to be sure that we are notified when the mouse leaves + the window. We won't get a CM_MOUSELEAVE message if the mouse moves + directly from the toolbar to another application's window } + CallTrackMouseEvent(Handle, TME_LEAVE); + inherited; +end; + +procedure TTBCustomToolbar.WMCancelMode(var Message: TWMCancelMode); +begin + inherited; + { We can receive a WM_CANCELMODE message during a modal loop if a dialog + pops up. Respond by hiding menus to make it look like the modal loop + has returned, even though it really hasn't yet. + Note: Similar code in TTBModalHandler.WndProc. } + if vsModal in FView.State then + FView.CancelMode; +end; + +procedure TTBCustomToolbar.WMMouseLeave(var Message: TMessage); +begin + { A WM_MOUSELEAVE handler is necessary because the control won't get a + CM_MOUSELEAVE message if the user presses Alt+Space. Also, CM_MOUSELEAVE + messages are also not sent if the application is in a + Application.ProcessMessages loop. } + if not FIgnoreMouseLeave then + CancelHover; + inherited; +end; + +procedure TTBCustomToolbar.WMNCMouseMove(var Message: TWMNCMouseMove); +begin + Hint := ''; + CancelHover; + inherited; +end; + +function TTBCustomToolbar.KeyboardOpen(Key: Char; + RequirePrimaryAccel: Boolean): Boolean; +var + I: TTBItemViewer; + IsOnlyItemWithAccel: Boolean; +begin + Result := False; + { Sanity check: Bail out early if re-entered } + if vsModal in FView.State then + Exit; + I := nil; + FView.SetAccelsVisibility(True); + try + if Key = #0 then begin + I := FView.FirstSelectable; + if I = nil then Exit; + FView.Selected := I; + FView.EnterToolbarLoop([]); + end + else begin + I := FView.NextSelectableWithAccel(nil, Key, RequirePrimaryAccel, + IsOnlyItemWithAccel); + if (I = nil) or not I.Item.Enabled then + Exit; + if IsOnlyItemWithAccel then begin + FView.Selected := I; + FView.EnterToolbarLoop([tbetExecuteSelected]); + end + else if FMenuBar then begin + FView.Selected := I; + FView.EnterToolbarLoop([]); + end + else + Exit; + end; + Result := True; + finally + if Assigned(I) then + FView.SetAccelsVisibility(False); + end; +end; + +procedure TTBCustomToolbar.MouseDown(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); +var + OldParent: TWinControl; + P: TPoint; + Item: TTBCustomItem; +begin + OldParent := Parent; + inherited; + if Parent <> OldParent then + { if the inherited handler (TTBDockableWindow.MouseDown) changed the Parent + (due to the toolbar moving between docks), nothing else should be done } + Exit; + if not(csDesigning in ComponentState) and (Button = mbLeft) then begin + P := ClientToScreen(Point(X, Y)); + FView.UpdateSelection(P, True); + if Assigned(FView.Selected) then begin + Item := FView.Selected.Item; + if not(tbisClicksTransparent in TTBCustomItemAccess(Item).ItemStyle) then begin + FIgnoreMouseLeave := True; + try + FView.EnterToolbarLoop([tbetMouseDown]); + finally + FIgnoreMouseLeave := False; + end; + end; + end; + end; +end; + +procedure TTBCustomToolbar.CMFontChanged(var Message: TMessage); +begin + inherited; + if not FSystemFont then + Arrange; +end; + +function TTBCustomToolbar.GetChevronHint: String; +begin + Result := FChevronItem.Hint; +end; + +procedure TTBCustomToolbar.SetChevronHint(const Value: String); +begin + FChevronItem.Hint := Value; + FChevronItem.Caption := EscapeAmpersands(GetShortHint(Value)); +end; + +procedure TTBCustomToolbar.SetChevronMoveItems(Value: Boolean); +begin + if FChevronMoveItems <> Value then begin + FChevronMoveItems := Value; + FView.UsePriorityList := Value and not(csDesigning in ComponentState); + end; +end; + +procedure TTBCustomToolbar.SetChevronPriorityForNewItems(Value: TTBChevronPriorityForNewItems); +begin + FChevronPriorityForNewItems := Value; + FView.NewViewersGetHighestPriority := (Value = tbcpHighest); +end; + +function TTBCustomToolbar.IsChevronHintStored: Boolean; +begin + Result := (FChevronItem.Hint <> FChevronItem.GetDefaultHint); +end; + +function TTBCustomToolbar.GetImages: TCustomImageList; +begin + Result := FItem.SubMenuImages; +end; + +procedure TTBCustomToolbar.SetImages(Value: TCustomImageList); +begin + FItem.SubMenuImages := Value; +end; + +function TTBCustomToolbar.GetLinkSubitems: TTBCustomItem; +begin + Result := FItem.LinkSubitems; +end; + +procedure TTBCustomToolbar.SetLinkSubitems(Value: TTBCustomItem); +begin + FItem.LinkSubitems := Value; +end; + +procedure TTBCustomToolbar.SetMenuBar(Value: Boolean); +begin + if FMenuBar <> Value then begin + FMenuBar := Value; + if Value then begin + ControlStyle := ControlStyle + [csMenuEvents]; + FView.Style := FView.Style + [vsMenuBar, vsUseHiddenAccels]; + end + else begin + ControlStyle := ControlStyle - [csMenuEvents]; + FView.Style := FView.Style - [vsMenuBar, vsUseHiddenAccels]; + end; + if not(csLoading in ComponentState) then begin + FullSize := Value; + if Value then + ShrinkMode := tbsmWrap + else + ShrinkMode := tbsmChevron; + CloseButton := not Value; + ProcessShortCuts := Value; + end; + if Value and not(csDesigning in ComponentState) then + InstallHookProc(Self, HookProc, [hpGetMessage]) + else + UninstallHookProc(Self, HookProc); + SetMainWindowHook; + end; +end; + +function TTBCustomToolbar.GetOptions: TTBItemOptions; +begin + Result := FItem.Options; +end; + +procedure TTBCustomToolbar.SetOptions(Value: TTBItemOptions); +begin + FItem.Options := Value; +end; + +procedure TTBCustomToolbar.SetProcessShortCuts(Value: Boolean); +begin + if FProcessShortCuts <> Value then begin + FProcessShortCuts := Value; + SetMainWindowHook; + end; +end; + +procedure TTBCustomToolbar.SetSystemFont(Value: Boolean); +begin + if FSystemFont <> Value then begin + FSystemFont := Value; + Arrange; + end; +end; + +procedure TTBCustomToolbar.SetShrinkMode(Value: TTBShrinkMode); +begin + if FShrinkMode <> Value then begin + FShrinkMode := Value; + if Docked then + CurrentDock.ArrangeToolbars + else if not Floating then + Arrange; + end; +end; + +procedure TTBCustomToolbar.SetFloatingWidth(Value: Integer); +begin + if FFloatingWidth <> Value then begin + FFloatingWidth := Value; + if Floating then begin + UpdateViewProperties; + Arrange; + end; + end; +end; + +function TTBCustomToolbar.CalcWrapOffset(const ADock: TTBDock): Integer; +begin + if ADock = nil then + Result := FFloatingWidth + else begin + if FShrinkMode = tbsmWrap then begin + if not(ADock.Position in [dpLeft, dpRight]) then + Result := ADock.Width - ADock.NonClientWidth - NonClientWidth + else + Result := ADock.Height - ADock.NonClientHeight - NonClientHeight; + end + else + Result := 0; + end; +end; + +function TTBCustomToolbar.CalcChevronOffset(const ADock: TTBDock; + const AOrientation: TTBViewOrientation): Integer; +begin + if (FShrinkMode = tbsmChevron) and Docked and (ADock = CurrentDock) then begin + Result := CurrentSize; + { Subtract non-client size } + if AOrientation <> tbvoVertical then + Dec(Result, NonClientWidth) + else + Dec(Result, NonClientHeight); + if Result < 0 then + Result := 0; { in case CurrentSize wasn't properly initialized yet } + end + else + Result := 0; +end; + +procedure TTBCustomToolbar.UpdateViewProperties; +var + DT: TTBDockType; +begin + DT := TBGetDockTypeOf(CurrentDock, Floating); + FView.Orientation := DockTypeToOrientation[DT]; + FView.ChevronSize := tbChevronSize; + if Assigned(CurrentDock) or Floating then begin + FView.ChevronOffset := CalcChevronOffset(CurrentDock, FView.Orientation); + FView.WrapOffset := CalcWrapOffset(CurrentDock); + end + else begin + FView.ChevronOffset := 0; + FView.WrapOffset := 0; + { Only enable chevron/wrapping when the width of the toolbar is fixed } + if not AutoResize or ((akLeft in Anchors) and (akRight in Anchors)) then begin + if FShrinkMode = tbsmChevron then + FView.ChevronOffset := Width - NonClientWidth + else if FShrinkMode = tbsmWrap then + FView.WrapOffset := Width - NonClientWidth; + end; + end; +end; + +{}{DOCKING STUFF} + +procedure TTBCustomToolbar.ReadPositionData(const Data: TTBReadPositionData); +begin + inherited; + with Data do + FloatingWidth := ReadIntProc(Name, rvFloatRightX, 0, ExtraData); +end; + +procedure TTBCustomToolbar.WritePositionData(const Data: TTBWritePositionData); +begin + inherited; + with Data do + WriteIntProc(Name, rvFloatRightX, FFloatingWidth, ExtraData); +end; + +procedure TTBCustomToolbar.GetMinBarSize(var MinimumSize: TPoint); +var + WH: Integer; +begin + MinimumSize.X := 0; + MinimumSize.Y := 0; + if Docked then begin + WH := CurrentDock.GetMinRowSize(EffectiveDockRow, Self); + if not(CurrentDock.Position in [dpLeft, dpRight]) then + MinimumSize.Y := WH + else + MinimumSize.X := WH; + end; +end; + +procedure TTBCustomToolbar.GetBaseSize(var ASize: TPoint); +begin + FView.ValidatePositions; + ASize := FBaseSize; +end; + +function TTBCustomToolbar.DoArrange(CanMoveControls: Boolean; + PreviousDockType: TTBDockType; NewFloating: Boolean; NewDock: TTBDock): TPoint; +var + DT: TTBDockType; + O: TTBViewOrientation; + TempBaseSize: TPoint; +begin + //outputdebugstring (pchar(format('%s.DoArrange(%d)', [Name, Ord(CanMoveControls)]))); + if CanMoveControls then begin + UpdateViewProperties; + Result := FView.UpdatePositions; + end + else begin + DT := TBGetDockTypeOf(NewDock, NewFloating); + O := DockTypeToOrientation[DT]; + Result.X := 0; + Result.Y := 0; + FView.CalculatePositions(False, O, CalcWrapOffset(NewDock), + CalcChevronOffset(NewDock, O), tbChevronSize, TempBaseSize, Result, + FLastWrappedLines); + end; +end; + +procedure TTBCustomToolbar.ControlExistsAtPos(const P: TPoint; + var ControlExists: Boolean); +var + P2: TPoint; +begin + inherited; + if not ControlExists and not(csDesigning in ComponentState) then begin + P2 := ClientToScreen(P); + FView.UpdateSelection(P2, True); + if Assigned(FView.Selected) and + not(tbisClicksTransparent in TTBCustomItemAccess(FView.Selected.Item).ItemStyle) then + ControlExists := True; + end; +end; + +procedure TTBCustomToolbar.BuildPotentialSizesList(SizesList: TList); +var + Margins: TRect; + MinX, SaveWrapX: Integer; + X, PrevWrappedLines: Integer; + S: TPoint; + S2: TSmallPoint; +begin + View.GetMargins(tbvoFloating, Margins); + MinX := Margins.Left + Margins.Right; + SaveWrapX := FFloatingWidth; + try + { Add the widest size to the list } + FFloatingWidth := 0; + S := DoArrange(False, dtNotDocked, True, nil); + SizesList.Add(TListItemType(PointToSmallPoint(S))); + { Calculate and add rest of sizes to the list } + PrevWrappedLines := 1; + X := S.X-1; + while X >= MinX do begin + FFloatingWidth := X; + S := DoArrange(False, dtNotDocked, True, nil); + if S.X > X then { if it refuses to go any smaller } + Break + else + if X = S.X then begin + S2 := PointToSmallPoint(S); + if FLastWrappedLines <> PrevWrappedLines then + SizesList.Add(TListItemType(S2)) + else + SizesList[SizesList.Count-1] := TListItemType(S2); + PrevWrappedLines := FLastWrappedLines; + Dec(X); + end + else + X := S.X; + end; + finally + FFloatingWidth := SaveWrapX; + end; +end; + +function CompareSizesX(Item1, Item2: TListItemType): Integer; +begin + { Sorts in descending order } + Result := TSmallPoint(Item2).X - TSmallPoint(Item1).X; +end; + +function CompareSizesY(Item1, Item2: TListItemType): Integer; +begin + { Sorts in descending order } + Result := TSmallPoint(Item2).Y - TSmallPoint(Item1).Y; +end; + +procedure TTBCustomToolbar.ResizeBegin(ASizeHandle: TTBSizeHandle); +const + MaxDistance = 12; +var + I, NewSize: Integer; + S, N: TSmallPoint; + P: TPoint; +begin + inherited; + + FSizeData := TToolbarSizeData.Create; + + with TToolbarSizeData(FSizeData) do begin + SizeHandle := ASizeHandle; + OrigWidth := Parent.Width; + OrigHeight := Parent.Height; + NCXDiff := ClientToScreen(Point(0, 0)).X - Parent.Left; + CurRightX := FFloatingWidth; + DisableSensCheck := False; + OpSide := False; + + NewSizes := TList.Create; + BuildPotentialSizesList(NewSizes); + for I := 0 to NewSizes.Count-1 do begin + P := SmallPointToPoint(TSmallPoint(NewSizes[I])); + AddFloatingNCAreaToSize(P); + NewSizes[I] := TListItemType(PointToSmallPoint(P)); + end; + if ASizeHandle in [twshTop, twshBottom] then + NewSizes.Sort(CompareSizesY) + else + NewSizes.Sort(CompareSizesX); + + { Calculate distance in pixels to the nearest potential sizes smaller and + larger than the current size, up to a maximum of MaxDistance pixels. } + DistanceToSmallerSize := 0; + DistanceToLargerSize := 0; + for I := 0 to NewSizes.Count-1 do begin + S := TSmallPoint(NewSizes[I]); + if (S.X = OrigWidth) and (S.Y = OrigHeight) then begin + if I > 0 then begin + N := TSmallPoint(NewSizes[I-1]); + if ASizeHandle in [twshLeft, twshRight] then + NewSize := N.X - S.X + else + NewSize := N.Y - S.Y; + if NewSize > MaxDistance then + NewSize := MaxDistance; + DistanceToLargerSize := NewSize; + end; + if I < NewSizes.Count-1 then begin + N := TSmallPoint(NewSizes[I+1]); + if ASizeHandle in [twshLeft, twshRight] then + NewSize := S.X - N.X + else + NewSize := S.Y - N.Y; + if NewSize > MaxDistance then + NewSize := MaxDistance; + DistanceToSmallerSize := NewSize; + end; + Break; + end; + end; + end; +end; + +procedure TTBCustomToolbar.ResizeTrack(var Rect: TRect; const OrigRect: TRect); +var + Pos: TPoint; + NewOpSide: Boolean; + Reverse: Boolean; + I: Integer; + P: TSmallPoint; +begin + inherited; + + with TToolbarSizeData(FSizeData) do begin + Pos.X := Rect.Right - Rect.Left; + Pos.Y := Rect.Bottom - Rect.Top; + + { Like Office, don't change from the original size until the mouse is moved + a reasonable distance left/up or right/down. Without this, dragging the + mouse just one pixel in either direction would cause the toolbar to + change sizes. } + if SizeHandle in [twshLeft, twshRight] then + NewOpSide := Pos.X < OrigWidth + else + NewOpSide := Pos.Y < OrigHeight; + if (not DisableSensCheck) or (OpSide <> NewOpSide) then begin + DisableSensCheck := False; + OpSide := NewOpSide; + if SizeHandle in [twshLeft, twshRight] then begin + if (Pos.X > OrigWidth-DistanceToSmallerSize) and (Pos.X < OrigWidth+DistanceToLargerSize) then + Pos.X := OrigWidth; + end + else begin + if (Pos.Y > OrigHeight-DistanceToSmallerSize) and (Pos.Y < OrigHeight+DistanceToLargerSize) then + Pos.Y := OrigHeight; + end; + end; + + Rect := OrigRect; + + if SizeHandle in [twshLeft, twshRight] then + Reverse := Pos.X > OrigWidth + else + Reverse := Pos.Y > OrigHeight; + if not Reverse then + I := 0 + else + I := NewSizes.Count-1; + while True do begin + P := TSmallPoint(NewSizes[I]); + if SizeHandle in [twshLeft, twshRight] then begin + if (not Reverse and ((I = NewSizes.Count-1) or (Pos.X >= P.X))) or + (Reverse and ((I = 0) or (Pos.X <= P.X))) then begin + if I = 0 then + CurRightX := 0 + else + CurRightX := P.X - NCXDiff*2; + if SizeHandle = twshRight then + Rect.Right := Rect.Left + P.X + else + Rect.Left := Rect.Right - P.X; + Rect.Bottom := Rect.Top + P.Y; + DisableSensCheck := not EqualRect(Rect, OrigRect); + Break; + end; + end + else begin + if (not Reverse and ((I = NewSizes.Count-1) or (Pos.Y >= P.Y))) or + (Reverse and ((I = 0) or (Pos.Y <= P.Y))) then begin + if I = NewSizes.Count-1 then + CurRightX := 0 + else + CurRightX := P.X - NCXDiff*2; + if SizeHandle = twshBottom then + Rect.Bottom := Rect.Top + P.Y + else + Rect.Top := Rect.Bottom - P.Y; + Rect.Right := Rect.Left + P.X; + DisableSensCheck := not EqualRect(Rect, OrigRect); + Break; + end; + end; + if not Reverse then + Inc(I) + else + Dec(I); + end; + end; +end; + +procedure TTBCustomToolbar.ResizeTrackAccept; +begin + inherited; + FloatingWidth := TToolbarSizeData(FSizeData).CurRightX; +end; + +procedure TTBCustomToolbar.ResizeEnd; +begin + inherited; + if Assigned(FSizeData) then begin + with TToolbarSizeData(FSizeData) do + FreeAndNil(NewSizes); + FreeAndNil(FSizeData); + end; +end; + +function TTBCustomToolbar.GetShrinkMode: TTBShrinkMode; +begin + Result := FShrinkMode; +end; + +procedure TTBCustomToolbar.GetMinShrinkSize(var AMinimumSize: Integer); +var + I: TTBItemViewer; +begin + I := FView.HighestPriorityViewer; + if Assigned(I) then begin + if not(CurrentDock.Position in [dpLeft, dpRight]) then + AMinimumSize := I.BoundsRect.Right - I.BoundsRect.Left + else + AMinimumSize := I.BoundsRect.Bottom - I.BoundsRect.Top; + end; + if not(CurrentDock.Position in [dpLeft, dpRight]) then + Inc(AMinimumSize, NonClientWidth) + else + Inc(AMinimumSize, NonClientHeight); + Inc(AMinimumSize, tbChevronSize); +end; + +procedure TTBCustomToolbar.BeginUpdate; +begin + FView.BeginUpdate; +end; + +procedure TTBCustomToolbar.EndUpdate; +begin + FView.EndUpdate; +end; + +procedure TTBCustomToolbar.GetTabOrderList(List: TList); +var + CtlList: TList; + I, J: Integer; + CtlI, CtlJ: TWinControl; +begin + inherited; + { Remove off-edge items and their children from List } + CtlList := TList.Create; + try + FView.GetOffEdgeControlList(CtlList); + for I := 0 to CtlList.Count-1 do begin + CtlI := TWinControl(CtlList[I]); + J := 0; + while J < List.Count do begin + CtlJ := TWinControl(List[J]); + if (CtlJ = CtlI) or CtlI.ContainsControl(CtlJ) then + List.Delete(J) + else + Inc(J); + end; + end; + finally + CtlList.Free; + end; +end; + +procedure TTBCustomToolbar.CMWinIniChange(var Message: TWMWinIniChange); +begin + inherited; + if {$IFNDEF CLR}TMessage{$ENDIF}(Message).WParam = SPI_SETNONCLIENTMETRICS then begin + TBInitToolbarSystemFont; + Arrange; + end; +end; + +function TTBCustomToolbar.IsShortCut(var Message: TWMKey): Boolean; +begin + Result := False; + if Assigned(FOnShortCut) then + FOnShortCut(Message, Result); + Result := Result or FItem.IsShortCut(Message); +end; + +var + HookCount: Integer; + HookList: TList; + +class function TTBCustomToolbar.MainWindowHook(var Message: TMessage): Boolean; + + function GetActiveForm: TCustomForm; + var + Wnd: HWND; + Ctl: TWinControl; + begin + { Note: We don't use Screen.ActiveCustomForm because when an EXE calls a + DLL that shows a modal form, Screen.ActiveCustomForm doesn't change in + the EXE; it remains set to the last form that was active in the EXE. + Use FindControl(GetActiveWindow) instead to avoid this problem; it will + return nil when a form in another module is active. } + Result := nil; + Wnd := GetActiveWindow; + if Wnd <> 0 then begin + Ctl := FindControl(Wnd); + if Assigned(Ctl) and (Ctl is TCustomForm) then + Result := TCustomForm(Ctl); + end; + end; + + function HandleShortCutOnForm(const Form: TCustomForm): Boolean; + var + I: Integer; + Toolbar: TTBCustomToolbar; + {$IFDEF CLR} + KeyMsg: TWMKey; + {$ENDIF} + begin + Result := False; + if Form = nil then + Exit; + for I := 0 to HookList.Count-1 do begin + Toolbar := TTBCustomToolbar(HookList[I]); + if Toolbar.ProcessShortCuts and + (TBGetToolWindowParentForm(Toolbar) = Form) and + IsWindowEnabled(Form.Handle) then begin + {$IFNDEF CLR} + if Toolbar.IsShortCut(TWMKey(Message)) then begin + {$ELSE} + KeyMsg := TWMKey.Create(Message); + if Toolbar.IsShortCut(KeyMsg) then begin + {$ENDIF} + Message.Result := 1; + Result := True; + Exit; + end; + end; + end; + end; + + function TraverseControls(Container: TWinControl): Boolean; + var + I: Integer; + Control: TControl; + begin + Result := False; + if Container.Showing then + for I := 0 to Container.ControlCount - 1 do begin + Control := Container.Controls[I]; + if Control.Visible and Control.Enabled then begin + if (csMenuEvents in Control.ControlStyle) and + ((Control is TTBDock) or (Control is TTBCustomToolbar)) and + (Control.Perform(WM_SYSCOMMAND, TMessage(Message).WParam, + TMessage(Message).LParam) <> 0) or (Control is TWinControl) and + TraverseControls(TWinControl(Control)) then begin + Result := True; + Exit; + end; + end; + end; + end; + +var + ActiveForm: TCustomForm; + ActiveMDIChild: TForm; +begin + Result := False; + if (Message.Msg = CM_APPKEYDOWN) and Assigned(HookList) then begin + { Process shortcuts on toolbars. Search forms in this order: + 1. If the active form is an MDI parent form, the active MDI child form + if it has the focus. + 2. The active form. + 3. The main form. } + ActiveForm := GetActiveForm; + if Assigned(ActiveForm) and (ActiveForm is TForm) and + (TForm(ActiveForm).FormStyle = fsMDIForm) then begin + ActiveMDIChild := TForm(ActiveForm).ActiveMDIChild; + { Don't search the child form if a control on the MDI parent form is + currently focused (i.e. Screen.ActiveCustomForm <> ActiveMDIChild) } + if Assigned(ActiveMDIChild) and + (Screen.ActiveCustomForm = ActiveMDIChild) and + HandleShortCutOnForm(ActiveMDIChild) then begin + Result := True; + Exit; + end; + end; + if HandleShortCutOnForm(ActiveForm) then + Result := True + else begin + if (Application.MainForm <> ActiveForm) and + HandleShortCutOnForm(Application.MainForm) then + Result := True; + end; + end + else if Message.Msg = CM_APPSYSCOMMAND then begin + { Handle "Alt or Alt+[key] pressed on secondary form" case. If there's a + menu bar on the active form we want the keypress to go to it instead of + to the main form (the VCL's default handling). } + ActiveForm := GetActiveForm; + if Assigned(ActiveForm) and IsWindowEnabled(ActiveForm.Handle) and + IsWindowVisible(ActiveForm.Handle) and TraverseControls(ActiveForm) then begin + Message.Result := 1; + Result := True; + end; + end; +end; + +procedure TTBCustomToolbar.SetMainWindowHook; +begin + if (ProcessShortCuts or MenuBar) and not(csDesigning in ComponentState) then + InstallMainWindowHook + else + UninstallMainWindowHook; +end; + +procedure TTBCustomToolbar.InstallMainWindowHook; +begin + if FMainWindowHookInstalled then + Exit; + if HookCount = 0 then + Application.HookMainWindow(MainWindowHook); + Inc(HookCount); + AddToList(HookList, Self); + FMainWindowHookInstalled := True; +end; + +procedure TTBCustomToolbar.UninstallMainWindowHook; +begin + if not FMainWindowHookInstalled then + Exit; + FMainWindowHookInstalled := False; + RemoveFromList(HookList, Self); + Dec(HookCount); + if HookCount = 0 then + Application.UnhookMainWindow(MainWindowHook); +end; + +end. diff --git a/internal/2.2.2/1/Source/TB2Ver.inc b/internal/2.2.2/1/Source/TB2Ver.inc new file mode 100644 index 0000000..f96696b --- /dev/null +++ b/internal/2.2.2/1/Source/TB2Ver.inc @@ -0,0 +1,64 @@ +{ $jrsoftware: tb2k/Source/TB2Ver.inc,v 1.11 2008/09/13 21:06:45 jr Exp $ } + +{ Determine Delphi/C++Builder version } +{$IFNDEF VER90} { if it's not Delphi 2.0 } + {$IFNDEF VER93} { and it's not C++Builder 1.0 } + {$DEFINE JR_D3} { then it must be at least Delphi 3 or C++Builder 3 } + {$IFNDEF VER100} { if it's not Delphi 3.0 } + {$IFNDEF VER120} { Delphi 4/5's command line compiler doesn't like the ObjExportAll directive, so don't include it on Delphi 4/5 } + {$IFNDEF VER130} + {$ObjExportAll On} { <- needed for compatibility with run-time packages in C++Builder 3+ } + {$ENDIF} + {$ENDIF} + {$IFNDEF VER110} { and it's not C++Builder 3.0 } + {$DEFINE JR_D4} { then it must be at least Delphi 4 or C++Builder 4 } + {$IFNDEF VER120} {$IFNDEF VER125} { if it's not Delphi 4 or C++Builder 4 } + {$DEFINE JR_D5} { then it must be at least Delphi 5 or C++Builder 5 } + {$IFNDEF VER130} { if it's not Delphi 5 or C++Builder 5 } + {$DEFINE JR_D6} { then it must be at least Delphi 6 or C++Builder 6 } + {$IFNDEF VER140} { if it's not Delphi 6 or C++Builder 6 } + {$DEFINE JR_D7} { then it must be at least Delphi 7 } + {$IFNDEF VER150} { if it's not Delphi 7 } + {$DEFINE JR_D8} { then it must be at least Delphi 8 } + {$IFNDEF VER160} { if it's not Delphi 8 } + {$DEFINE JR_D9} { then it must be at least Delphi 9 (2005) } + {$IFNDEF VER170} { if it's not Delphi 9 (2005) } + {$DEFINE JR_D10} { then it must be at least Delphi 10 (2006) } + { Delphi 11 (2007) is an odd case: it defines VER180 and VER185 on Win32, and VER190 on .NET } + {$IFDEF VER185} { if it's Win32 Delphi 11 (2007) exactly } + {$DEFINE JR_D11} { then it must be at least Delphi 11 (2007) } + {$ENDIF} + {$IFNDEF VER180} { if it's neither Delphi 10 (2006) nor Win32 Delphi 11 (2007) } + {$DEFINE JR_D11} { then it must be at least Delphi 11 (2007) } + {$IFNDEF VER190} { if it's not .NET Delphi 11 (2007) } + {$DEFINE JR_D12} { then it must be at least Delphi 12 (2009) } + {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} +{$ENDIF} + +{$IFDEF JR_D6} + {$IF SizeOf(Char) > 1} + {$DEFINE JR_WIDESTR} { defined if String type = WideString } + {$IFEND} + {$IF not Defined(CLR) and (SizeOf(Pointer) <> 4)} + {$MESSAGE WARN 'This version of Toolbar2000 has not been tested on 64-bit Delphi for Win32'} + {$IFEND} +{$ENDIF} + +{$ALIGN ON} +{$BOOLEVAL OFF} +{$LONGSTRINGS ON} +{$TYPEDADDRESS OFF} +{$WRITEABLECONST ON} +{$IFDEF JR_D6} + {$WARN SYMBOL_PLATFORM OFF} +{$ENDIF} diff --git a/internal/2.2.2/1/Source/TB2Version.pas b/internal/2.2.2/1/Source/TB2Version.pas new file mode 100644 index 0000000..f9fb9c9 --- /dev/null +++ b/internal/2.2.2/1/Source/TB2Version.pas @@ -0,0 +1,63 @@ +unit TB2Version; + +{ + Toolbar2000 + Copyright (C) 1998-2008 by Jordan Russell + All rights reserved. + + The contents of this file are subject to the "Toolbar2000 License"; you may + not use or distribute this file except in compliance with the + "Toolbar2000 License". A copy of the "Toolbar2000 License" may be found in + TB2k-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/TB2k-LICENSE.txt + + Alternatively, the contents of this file may be used under the terms of the + GNU General Public License (the "GPL"), in which case the provisions of the + GPL are applicable instead of those in the "Toolbar2000 License". A copy of + the GPL may be found in GPL-LICENSE.txt or at: + http://www.jrsoftware.org/files/tb2k/GPL-LICENSE.txt + If you wish to allow use of your version of this file only under the terms of + the GPL and not to allow others to use your version of this file under the + "Toolbar2000 License", indicate your decision by deleting the provisions + above and replace them with the notice and other provisions required by the + GPL. If you do not delete the provisions above, a recipient may use your + version of this file under either the "Toolbar2000 License" or the GPL. + + $jrsoftware: tb2k/Source/TB2Version.pas,v 1.69 2008/09/13 21:39:24 jr Exp $ +} + +interface + +{$I TB2Ver.inc} + +const + Toolbar2000Version = '2.2.2'; + Toolbar2000VersionPropText = 'Toolbar2000 version ' + Toolbar2000Version + {$IFDEF CLR} + ' (.NET)' {$ENDIF}; + +type + TToolbar2000Version = type string; + +implementation + +const + Sig: {$IFNDEF CLR} PAnsiChar {$ELSE} AnsiString {$ENDIF} = + '- ' + Toolbar2000VersionPropText + + {$IFDEF VER90} '/D2'+ {$ENDIF} {$IFDEF VER93} '/CB1'+ {$ENDIF} + {$IFDEF VER100} '/D3'+ {$ENDIF} {$IFDEF VER110} '/CB3'+ {$ENDIF} + {$IFDEF VER120} '/D4'+ {$ENDIF} {$IFDEF VER125} '/CB4'+ {$ENDIF} + {$IFNDEF BCB} {$IFDEF VER130} '/D5'+ {$ENDIF} {$ELSE} {$IFDEF VER130} '/CB5'+ {$ENDIF} {$ENDIF} + {$IFNDEF BCB} {$IFDEF VER140} '/D6'+ {$ENDIF} {$ELSE} {$IFDEF VER140} '/CB6'+ {$ENDIF} {$ENDIF} + {$IFNDEF BCB} {$IFDEF VER150} '/D7'+ {$ENDIF} {$ELSE} {$IFDEF VER150} '/CB7'+ {$ENDIF} {$ENDIF} + {$IFNDEF BCB} {$IFDEF VER170} '/D9'+ {$ENDIF} {$ELSE} {$IFDEF VER170} '/CB9'+ {$ENDIF} {$ENDIF} + {$IFNDEF VER185} {$IFNDEF BCB} {$IFDEF VER180} '/D10'+ {$ENDIF} {$ELSE} {$IFDEF VER180} '/CB10'+ {$ENDIF} {$ENDIF} {$ENDIF} + {$IFNDEF BCB} {$IFDEF VER185} '/D11'+ {$ENDIF} {$ELSE} {$IFDEF VER185} '/CB11'+ {$ENDIF} {$ENDIF} + {$IFNDEF BCB} {$IFDEF VER190} '/D11'+ {$ENDIF} {$ELSE} {$IFDEF VER190} '/CB11'+ {$ENDIF} {$ENDIF} + {$IFNDEF BCB} {$IFDEF VER200} '/D12'+ {$ENDIF} {$ELSE} {$IFDEF VER200} '/CB12'+ {$ENDIF} {$ENDIF} + ', Copyright (C) 1998-2008 by Jordan Russell -'; + +{$IFNDEF CLR} +initialization + Sig := Sig; +{$ENDIF} +end. diff --git a/internal/2.2.2/1/TB2k-LICENSE.txt b/internal/2.2.2/1/TB2k-LICENSE.txt new file mode 100644 index 0000000..47984b4 --- /dev/null +++ b/internal/2.2.2/1/TB2k-LICENSE.txt @@ -0,0 +1,61 @@ +Toolbar2000 License v3.2 +======================== + +"Author" herein refers to Jordan Russell (the creator of the Toolbar2000 +components). +"Software" refers to all files bearing this notice, as well as any other +files and source code included with Toolbar2000 (typically extracted from a +.zip archive), and all content in them, regardless of whether any +modifications have been made. + +Except where otherwise noted, all of the documentation and Software included +in the Toolbar2000 package is copyrighted by Jordan Russell (the Author). + +Copyright (C) 1998-2008 Jordan Russell. All rights reserved. + +Use and distribution of the software is permitted provided that all of the +following terms are accepted: + +1. The Software is provided "as-is," without any express or implied + warranty. In no event shall the Author be held liable for any damages + arising from the use of the Software. + +2. All redistributions of the Software's files must be in their original, + unmodified form. Distributions of modified versions of the files is not + permitted without express written permission of the Author. + +3. All redistributions of the Software's files must retain all copyright + notices and web site addresses that are currently in place, and must + include this list of conditions without modification. + +4. None of the Software's files may be redistributed for profit or as part + of another software package without express written permission of the + Author. + +5. You are permitted to Compile the Software into any kind of applications. + ("Compile" here refers to the automatic process of translating the + Software's source code into executable machine code by a compiler such + as the one included with Borland's Delphi or C++Builder.) + However, compilation into commercial or shareware applications, or any + applications that you or your organization are profiting from, requires + registration (payment) of the software. Such payment is made to the Author + of the Software (Jordan Russell). + For information on registering, see the Toolbar2000 documentation or this + web page: + http://www.jrsoftware.org/tb2kreg.php + +6. Redistribution of any of the Software's files in object form (including + but not limited to .DCU and .OBJ formats) is strictly prohibited without + express written permission of the Author. + +7. Full backward compatibility in future versions of the Software is not + guaranteed. In no event shall the Author be held liable for any + inconvenience or damages arising from lack of backward compatibility. + +If you do not agree to all of the above terms, you are not permitted to +use the Software in any way, and all copies of it must be deleted from your +system(s). + +Jordan Russell +jr-2008 AT jrsoftware.org +http://www.jrsoftware.org/ diff --git a/internal/2.2.2/1/tb2k.chm b/internal/2.2.2/1/tb2k.chm new file mode 100644 index 0000000000000000000000000000000000000000..fb55b185d9a1741c0144dacf21b151aa3ab0cfef GIT binary patch literal 84104 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%0A$$7|FctQHjks3j%;U7RnpF7D?wB^V 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 + +

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

+ +

2.2.2 (2008-09-25)

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

2.2.1 (2007-06-23)

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

2.2.0 (2006-04-17)

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

2.1.8 (2006-01-09)

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

2.1.7 (2005-12-17)

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

2.1.6 (2005-07-30)

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

2.1.5 (2004-12-13)

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

2.1.4 (2004-02-28)

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

2.1.3 (2003-11-23)

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

2.1.2 (2003-08-10)

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

2.1.1-beta (2003-07-13)

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

2.1.0-beta (2003-07-05)

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

2.0.16 (2003-03-28)

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

2.0.15 (2002-09-29)

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

2.0.14 (2002-05-10)

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

2.0.13 (2002-04-06)

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

2.0.12 (2002-03-06)

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

2.0.11 (2002-02-23)

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

2.0.10 (2002-02-13)

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

2.0.9 (2002-01-11)

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

2.0.8 (2001-12-27)

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

2.0.7 (2001-12-19)

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

2.0.6 (2001-11-14)

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

2.0.5 (2001-10-09)

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

2.0.4 (2001-09-30)

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

2.0.3 (2001-09-13)

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

2.0.2 (2001-08-19)

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

2.0.1 (2001-08-04)

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

2.0.0 (2001-07-21)

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

Beta Releases

+ +

2.0-BETA6 (2001-07-18)

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

2.0-BETA5 (2001-07-09)

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

2.0-BETA4 (2001-07-01)

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

2.0-BETA3 (2001-06-25)

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

2.0-BETA2 (2001-06-18)

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

2.0-BETA1 (2001-06-12)

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

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

T{8A%ulwhDz31z^HYSXU$Jni$QaU8dtB3fD`~AcP{g!gsR{ci1gzMRG z?I>Sm7}vDoa@0{pET@km1g1(QlLskOP0K0v8oQ5j(89l8uH>t5hvjsk^>P)R zQem&99s7(7ATW0Xd+PI|^kE^MEZjZ3dmj(U>zNnBja;&>P<)4D zAFt-gg{|TQm!egd8^^dawf{TTKKwjCe3D1k3?tj|3~bzj{c@aU+g(NGWyNsY-_YsQ z?kWPw%jO4PQfM>XzR$=4eq%mxv#MZmAs)juLelyrCJ%|r^O(v%hd;PgaU9CTo+q)q zI_5saGn02&PUi{Omf_upP<>4v8#$O?6Wj0#PDu939i_B+tP`jgIcIYXIY=sBl?PbqeOt#dZHRk2H`VR+9pB$g`9 z>9tYOaNB3N3u(p5XGF>O^Scz8xJ&U&k2UiM8;gqgG>k9)CElT#OwUMajr~JvhR$1Nd8P0HYoT zntLeD*)cnhQ&XLLF z3ak^pmVU+lDaJdqV5~(tBPcyQX3a2emvCh9%5f&Myh`U0uj0h@*BC~UScyDU!$UZc zjf|1klYQ#Z#I~fhS%U$nwMo-a21)(X1gE1FN!3Uu@dHiBInI)QW@Zbf3%{&k_zHXg ziI<;bd+Fk&hJFpu-${+A5^#LGTm;eqAO{-Bfg{pEAO~y70Z}>(LOkM=POgaYSSUH(w_!r8gmr6N@M5e6dg=$8uBQKd4v6rjXaWxw#eWHZB zZi)1!id@E|SCThX*mVrnFb6wZ2s^97HqVEh*GaP_WY$E^N2P^anY4&wz!RlpQpeTl znZ9QBw33CKjudmuzZ2y}QD)%85^kWJ3*^z;u97M;N?O@QH+z;BJVQFRRCQG{x{5t@ zT+Aq~;@D!UlniB^m{Q|q0ZtjYo1$a_MU7+?=Vp`%sV4jzsg@}nw_8t+AfS?~HgZim zZXM=uB@^knTS~ZD6Ss(~lsw!L#w%mbnvDFWK!!-^xu!<0sf?@OnDIZoEVPXN6C1te+K;{X5v literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Lib/D11/TB2Item.dcu b/internal/2.2.2/1/Lib/D11/TB2Item.dcu new file mode 100644 index 0000000000000000000000000000000000000000..d29d1cc932442e86a143558cff4d75e6754d1fcf GIT binary patch literal 128709 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 z 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 literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Lib/D11/TB2MDI.dcu b/internal/2.2.2/1/Lib/D11/TB2MDI.dcu new file mode 100644 index 0000000000000000000000000000000000000000..06ad1d7082e6d6eacd991c2af1ce5714024cc56d GIT binary patch literal 23088 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 NoM%$$a=t0>KLA95;@SWJ literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Lib/D11/TB2MDI.res b/internal/2.2.2/1/Lib/D11/TB2MDI.res new file mode 100644 index 0000000000000000000000000000000000000000..4a6203581a390a61c4fb08e5e23f5205e7b9749e GIT binary patch literal 712 zcmcJJI}QRd3`7S+k&+`&QX)>UAR$Bn4N!0cj*&9Q+M9(pn`8k2C8PK=9y_)qEwG%6 zk-p(Rl{zXpPj%5&Yn^q&j@s#@s}5uv?P2F}ZZ#iMElE4frHN*Ez@Og{C7xm|0Z)oW z^?i@vBOP)H_;Pnv`Zr=o$y>NbB2P7#n@0H&u@taYuQVx?KKP(J0{4d@k;k9&CcyeI uSpE3_prU(EaO02prvKRA4*0mg{$CdGJv)4$_mz8Ug9~U4rmwu!{~R9{E(V(b literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Lib/D11/TB2MRU.dcu b/internal/2.2.2/1/Lib/D11/TB2MRU.dcu new file mode 100644 index 0000000000000000000000000000000000000000..39f8fda636685f8330f7edfff505f62cf203524a GIT binary patch literal 12108 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 literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Lib/D11/TB2ResCursors.res b/internal/2.2.2/1/Lib/D11/TB2ResCursors.res new file mode 100644 index 0000000000000000000000000000000000000000..e09ab15dfffb5b8fcb12fc48ac835711927ab2a5 GIT binary patch literal 1304 zcmds$Jx;_h5QU#(ln7~yAV8u(kTP^BD3LY`K`SJFBv=l>4YD?lyHNT zDY6W25?kyd6c7px6MY_!J+d7?4*(=Yq=nrj+c$pRFoyvxi&s~CQV5HbK|*q3_%-HS z8+^2)8~wyAla$ag;M&Rqc_tO%Qs#}+E-vX`fXydh?~#52q|OhS=Z$CRwt6a3IZBZ^ zsb9$ru?`HS#*{EN?bsdr-=Q0C@E|!68Q>g;C~%1p#yG(Q$2h|gt~qjr3%1^}*!R>2 zyyY}$S5buwmURl6&h;q;H)L_)A`= z5tS-BRO;3!_@t3O?!IeDHCn$1)~L-^25jFp-ZHiv|EC%i3mO%ypi`oi^!s|Ucn1ZG Bgx~-G literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Lib/D11/TB2ToolWindow.dcu b/internal/2.2.2/1/Lib/D11/TB2ToolWindow.dcu new file mode 100644 index 0000000000000000000000000000000000000000..3586990c2a80b5c18f36311781f2e03d45ddccd6 GIT binary patch literal 13354 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 literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Lib/D11/TB2Toolbar.dcu b/internal/2.2.2/1/Lib/D11/TB2Toolbar.dcu new file mode 100644 index 0000000000000000000000000000000000000000..1abc0e75497e1fa70ec3ed6896dfcc639baa0700 GIT binary patch literal 47635 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 literal 0 HcmV?d00001 diff --git a/internal/2.2.2/1/Lib/D11/TB2Ver.inc b/internal/2.2.2/1/Lib/D11/TB2Ver.inc new file mode 100644 index 0000000..f96696b --- /dev/null +++ b/internal/2.2.2/1/Lib/D11/TB2Ver.inc @@ -0,0 +1,64 @@ +{ $jrsoftware: tb2k/Source/TB2Ver.inc,v 1.11 2008/09/13 21:06:45 jr Exp $ } + +{ Determine Delphi/C++Builder version } +{$IFNDEF VER90} { if it's not Delphi 2.0 } + {$IFNDEF VER93} { and it's not C++Builder 1.0 } + {$DEFINE JR_D3} { then it must be at least Delphi 3 or C++Builder 3 } + {$IFNDEF VER100} { if it's not Delphi 3.0 } + {$IFNDEF VER120} { Delphi 4/5's command line compiler doesn't like the ObjExportAll directive, so don't include it on Delphi 4/5 } + {$IFNDEF VER130} + {$ObjExportAll On} { <- needed for compatibility with run-time packages in C++Builder 3+ } + {$ENDIF} + {$ENDIF} + {$IFNDEF VER110} { and it's not C++Builder 3.0 } + {$DEFINE JR_D4} { then it must be at least Delphi 4 or C++Builder 4 } + {$IFNDEF VER120} {$IFNDEF VER125} { if it's not Delphi 4 or C++Builder 4 } + {$DEFINE JR_D5} { then it must be at least Delphi 5 or C++Builder 5 } + {$IFNDEF VER130} { if it's not Delphi 5 or C++Builder 5 } + {$DEFINE JR_D6} { then it must be at least Delphi 6 or C++Builder 6 } + {$IFNDEF VER140} { if it's not Delphi 6 or C++Builder 6 } + {$DEFINE JR_D7} { then it must be at least Delphi 7 } + {$IFNDEF VER150} { if it's not Delphi 7 } + {$DEFINE JR_D8} { then it must be at least Delphi 8 } + {$IFNDEF VER160} { if it's not Delphi 8 } + {$DEFINE JR_D9} { then it must be at least Delphi 9 (2005) } + {$IFNDEF VER170} { if it's not Delphi 9 (2005) } + {$DEFINE JR_D10} { then it must be at least Delphi 10 (2006) } + { Delphi 11 (2007) is an odd case: it defines VER180 and VER185 on Win32, and VER190 on .NET } + {$IFDEF VER185} { if it's Win32 Delphi 11 (2007) exactly } + {$DEFINE JR_D11} { then it must be at least Delphi 11 (2007) } + {$ENDIF} + {$IFNDEF VER180} { if it's neither Delphi 10 (2006) nor Win32 Delphi 11 (2007) } + {$DEFINE JR_D11} { then it must be at least Delphi 11 (2007) } + {$IFNDEF VER190} { if it's not .NET Delphi 11 (2007) } + {$DEFINE JR_D12} { then it must be at least Delphi 12 (2009) } + {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} {$ENDIF} + {$ENDIF} + {$ENDIF} + {$ENDIF} +{$ENDIF} + +{$IFDEF JR_D6} + {$IF SizeOf(Char) > 1} + {$DEFINE JR_WIDESTR} { defined if String type = WideString } + {$IFEND} + {$IF not Defined(CLR) and (SizeOf(Pointer) <> 4)} + {$MESSAGE WARN 'This version of Toolbar2000 has not been tested on 64-bit Delphi for Win32'} + {$IFEND} +{$ENDIF} + +{$ALIGN ON} +{$BOOLEVAL OFF} +{$LONGSTRINGS ON} +{$TYPEDADDRESS OFF} +{$WRITEABLECONST ON} +{$IFDEF JR_D6} + {$WARN SYMBOL_PLATFORM OFF} +{$ENDIF} diff --git a/internal/2.2.2/1/Lib/D11/TB2Version.dcu b/internal/2.2.2/1/Lib/D11/TB2Version.dcu new file mode 100644 index 0000000000000000000000000000000000000000..153764ab20f40300a6a22b4b041fb4a245b55a15 GIT binary patch literal 745 zcmZuuU279T6umpfG%jlzsz?k~wjZf$Y}RB$w1FVC2}OM|G^tRD=ypGnf$i?HyAe|# zT+o+RluA)Vutxk3B1oYSijO|}4}{QyuRd94($J>p%rIZ)+&kyo83P#VAb@XXCLi-R zh5@ma8R?GZxY#n^Kp=1T<FIAAT~2?5HSK%T~itwCW*Mv}JeqSuzJ|u-tS#Z3&!yp#2WPW~NnP+n ziJ~;gdSi307M{K#o2sGBVpBGZX6J#ut*8U!<(nq<0F-Q>3m@)(dHEeF*#l((C40y{ zqr`_QmSrr;j+9EJde&EAn=NEQXn2pb91`>|grF;-ZLKON_gb+Y@klgr#MAwtnG)0X~6d()xKOGcL@_qV_ioaY;rziP> zWj7sMt9!gqxX7n-xv3aM6 h#w0j&I>MmYHjfe;905)*A~u$aB2 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%0A8XifvVbwP)&DI@7@Yp;E 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