From f410727ca1d238e24ed382cebac3916cb11d4dd8 Mon Sep 17 00:00:00 2001 From: david Date: Fri, 30 May 2008 11:49:33 +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.TMSSoftware@8 ccf39c52-e665-a648-be6a-52d81bcb5567 --- .../1.5.0.2/1/Demo/AdvInputTaskDialogDemo.dpr | 13 + .../1/Demo/AdvInputTaskDialogDemo.dproj | 113 + .../1.5.0.2/1/Demo/AdvInputTaskDialogDemo.res | Bin 0 -> 5280 bytes .../1.5.0.2/1/Demo/AdvMsgBoxExplorer.dpr | 14 + .../1.5.0.2/1/Demo/AdvMsgBoxExplorer.dproj | 41 + .../1.5.0.2/1/Demo/AdvMsgBoxExplorer.res | Bin 0 -> 4396 bytes .../1.5.0.2/1/Demo/TaskDialogExplorer.dpr | 14 + .../1.5.0.2/1/Demo/TaskDialogExplorer.dproj | 41 + .../1.5.0.2/1/Demo/TaskDialogExplorer.res | Bin 0 -> 4396 bytes .../1/Demo/UAdvInputTaskDialogDemo.dfm | 100 + .../1/Demo/UAdvInputTaskDialogDemo.pas | 69 + .../internal/1.5.0.2/1/Demo/Unit1.dfm | 130 + .../internal/1.5.0.2/1/Demo/Unit1.pas | 125 + .../internal/1.5.0.2/1/Demo/fmMain.dfm | 310 + .../internal/1.5.0.2/1/Demo/fmMain.pas | 293 + .../internal/1.5.0.2/1/Lib/D11/AdvGDIP.dcu | Bin 0 -> 54924 bytes .../1.5.0.2/1/Lib/D11/AdvGlowButton.dcu | Bin 0 -> 106460 bytes .../1.5.0.2/1/Lib/D11/AdvGroupBox.dcu | Bin 0 -> 19675 bytes .../1.5.0.2/1/Lib/D11/AdvHintInfo.dcu | Bin 0 -> 2787 bytes .../1.5.0.2/1/Lib/D11/AdvOfficeButtons.dcu | Bin 0 -> 103180 bytes .../internal/1.5.0.2/1/Lib/D11/AdvStyleIF.dcu | Bin 0 -> 1321 bytes .../internal/1.5.0.2/1/Lib/D11/GDIPicture.dcu | Bin 0 -> 8345 bytes .../1.5.0.2/1/Lib/D11/PictureContainer.dcu | Bin 0 -> 30582 bytes .../internal/1.5.0.2/1/Lib/D11/TaskDialog.dcu | Bin 0 -> 125071 bytes .../1.5.0.2/1/Lib/D11/TaskDialogDE.dcu | Bin 0 -> 2086 bytes .../1.5.0.2/1/Lib/D11/TaskDialogEx.dcu | Bin 0 -> 8298 bytes .../1.5.0.2/1/Lib/D11/TaskDialogPkgD2007.bpl | Bin 0 -> 358912 bytes .../1.5.0.2/1/Lib/D11/TaskDialogPkgD2007.dcp | Bin 0 -> 353639 bytes .../1.5.0.2/1/Lib/D11/TaskDialogPkgD2007.dcu | Bin 0 -> 3998 bytes .../1.5.0.2/1/Lib/D11/TaskDialogRegDE.dcu | Bin 0 -> 693 bytes .../internal/1.5.0.2/1/Source/AdvGroupBox.pas | 661 ++ .../1.5.0.2/1/Source/AdvOfficeButtons.pas | 2698 +++++++++ .../1.5.0.2/1/Source/AdvOfficeButtons.res | Bin 0 -> 6784 bytes .../internal/1.5.0.2/1/Source/TaskDialog.pas | 4423 ++++++++++++++ .../internal/1.5.0.2/1/Source/TaskDialog.res | Bin 0 -> 20004 bytes .../1.5.0.2/1/Source/TaskDialogDE.pas | 84 + .../1.5.0.2/1/Source/TaskDialogEx.pas | 300 + .../1.5.0.2/1/Source/TaskDialogPkgD2007.dpk | 50 + .../1.5.0.2/1/Source/TaskDialogPkgD2007.dproj | 543 ++ .../1.5.0.2/1/Source/TaskDialogPkgD2007.res | Bin 0 -> 3008 bytes .../1.5.0.2/1/Source/TaskDialogRegDE.pas | 49 + .../internal/1.5.0.2/1/Source/advgdip.pas | 2897 +++++++++ .../1.5.0.2/1/Source/advglowbutton.pas | 5298 +++++++++++++++++ .../1.5.0.2/1/Source/advglowbuttondb.res | Bin 0 -> 5716 bytes .../internal/1.5.0.2/1/Source/advhintinfo.pas | 92 + .../internal/1.5.0.2/1/Source/advstyleif.pas | 62 + .../internal/1.5.0.2/1/Source/gdipicture.pas | 384 ++ .../internal/1.5.0.2/1/Source/htmlengo.pas | 2357 ++++++++ .../1.5.0.2/1/Source/picturecontainer.pas | 241 + .../internal/1.5.0.2/1/Source/tmsdefs.inc | 189 + .../internal/1.5.0.2/1/Source/wiif.pas | 255 + .../internal/1.5.0.2/1/Source/wiimpl.pas | 897 +++ 52 files changed, 22743 insertions(+) create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Demo/AdvInputTaskDialogDemo.dpr create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Demo/AdvInputTaskDialogDemo.dproj create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Demo/AdvInputTaskDialogDemo.res create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Demo/AdvMsgBoxExplorer.dpr create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Demo/AdvMsgBoxExplorer.dproj create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Demo/AdvMsgBoxExplorer.res create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Demo/TaskDialogExplorer.dpr create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Demo/TaskDialogExplorer.dproj create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Demo/TaskDialogExplorer.res create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Demo/UAdvInputTaskDialogDemo.dfm create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Demo/UAdvInputTaskDialogDemo.pas create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Demo/Unit1.dfm create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Demo/Unit1.pas create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Demo/fmMain.dfm create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Demo/fmMain.pas create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/AdvGDIP.dcu create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/AdvGlowButton.dcu create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/AdvGroupBox.dcu create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/AdvHintInfo.dcu create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/AdvOfficeButtons.dcu create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/AdvStyleIF.dcu create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/GDIPicture.dcu create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/PictureContainer.dcu create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/TaskDialog.dcu create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/TaskDialogDE.dcu create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/TaskDialogEx.dcu create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/TaskDialogPkgD2007.bpl create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/TaskDialogPkgD2007.dcp create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/TaskDialogPkgD2007.dcu create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/TaskDialogRegDE.dcu create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Source/AdvGroupBox.pas create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Source/AdvOfficeButtons.pas create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Source/AdvOfficeButtons.res create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Source/TaskDialog.pas create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Source/TaskDialog.res create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Source/TaskDialogDE.pas create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Source/TaskDialogEx.pas create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Source/TaskDialogPkgD2007.dpk create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Source/TaskDialogPkgD2007.dproj create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Source/TaskDialogPkgD2007.res create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Source/TaskDialogRegDE.pas create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Source/advgdip.pas create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Source/advglowbutton.pas create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Source/advglowbuttondb.res create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Source/advhintinfo.pas create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Source/advstyleif.pas create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Source/gdipicture.pas create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Source/htmlengo.pas create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Source/picturecontainer.pas create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Source/tmsdefs.inc create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Source/wiif.pas create mode 100644 TAdvTaskDialog/internal/1.5.0.2/1/Source/wiimpl.pas diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Demo/AdvInputTaskDialogDemo.dpr b/TAdvTaskDialog/internal/1.5.0.2/1/Demo/AdvInputTaskDialogDemo.dpr new file mode 100644 index 0000000..ea78c08 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.0.2/1/Demo/AdvInputTaskDialogDemo.dpr @@ -0,0 +1,13 @@ +program AdvInputTaskDialogDemo; + +uses + Forms, + UAdvInputTaskDialogDemo in 'UAdvInputTaskDialogDemo.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Demo/AdvInputTaskDialogDemo.dproj b/TAdvTaskDialog/internal/1.5.0.2/1/Demo/AdvInputTaskDialogDemo.dproj new file mode 100644 index 0000000..cbce3c2 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.0.2/1/Demo/AdvInputTaskDialogDemo.dproj @@ -0,0 +1,113 @@ + + + {40ed30c4-44b3-4d9c-8bf7-596b00214c5a} + Debug + AnyCPU + DCC32 + AdvInputTaskDialogDemo.exe + AdvInputTaskDialogDemo.dpr + + + 7.0 + False + False + 0 + RELEASE + + + 7.0 + DEBUG + + + Delphi.Personality + + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Microsoft Office XP Sample Automation Server Wrapper Components + Microsoft Office 2000 Sample Automation Server Wrapper Components + CodeGear C++Builder Office 2000 Servers Package + CodeGear C++Builder Office XP Servers Package + + + AdvInputTaskDialogDemo.dpr + + + + + + + MainSource + + +
Form1
+
+
+
\ No newline at end of file diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Demo/AdvInputTaskDialogDemo.res b/TAdvTaskDialog/internal/1.5.0.2/1/Demo/AdvInputTaskDialogDemo.res new file mode 100644 index 0000000000000000000000000000000000000000..be94ddf25bdb844df2435f4a878210f039e9ba4f GIT binary patch literal 5280 zcmbVQO>Y}j6n#+^AS9p?EZBME6^fLvHZ4#km?(TGf&wZvEJvkw8OSLK0bDNmWgNE?Dyx-UAxtGT%&%e)~=7+ zeC6N7hZu%!o@2%%pXM@OfLETiT@DU)6F##SuFZ8*B$Mq~p?$2q>SGvfAD3~AOCDxU z$2Aw^MQrBb90!aEKC!dhxies&83(ixbKZwIw0v6ST5<~L-UOJmOvaFg}gg%yF4#w2gy!^kp66A&%r<_AviTB@b$pGeQn>tR)BG zadufhbIO>agX{&^CS8Z zPxMa70qq&EY1nVMFV1jYvlq@dkP|T#n{hop*0Ju1$vV(BbL@FG;9J-iDhFyLhMd3Q z&O8UyC+8%mMd8Rn+PEJaXAXq}v1tuGf58NIa$=iYB?rKgS_C)s>|fPJ?y-+Jyu&3n z;^~=s{l=kH>1WOz;!;2J!#k}!D*nbxJoFGlv>`rm^=)B(ao>nvH^kE#_PRsQr2)=} zC1>vS+Zo9@G0#{_9O{y@2S2{Ka!-NFabh!uwCCV+zvR0GelT)TL;Zmp@3X!Es$Xh@ zILt@r&uGdu$bUwyo&(y3uYSIM$vF?d$nqFY#f- zG~+zmynp9%@6SQ&j_(&aYAnX1emQ@%saNt8B0kn}USiG^OXjiH-bT*ZePCPq*?fGh zY3lZ8$N121_!8UWE4I$(nXg~O)%=4S#te&|-x27|81rHdw)cT=5eh1<`mvQv@PL;I@UR*NZmss-NcwDPNV)J8M=HYXUwJ7;+ zRr$8OpYtv1R_%6odC!Pla>%sJT+~0D=e>FzhqC4y#2}ZtKab5ESMMy_6$fHn{BVpm z?=Bc8o)Oo`JJT|}%Ip6S-TDy*6tze=i`Tc=LF7ka?yyk?luk$euud9bkyvVoYaq90R zIou4}_!$R!(RPhI$hw)&1$6UlERMy!ski;~%*SiFoSw=&*V(?C;$5}g;$7EY73bo3 zapGKo!GB@@z+S;#!cM#$!_#j1ImXWpv=iqRX)m373$fn^Mgv$aU>3#6V)3DKZVgrx z@3{wV+wHpVVLR>zc>C0U*Wj-i_&p;C`_b3SpEiSZ+=+XgK@vw>&7&x7wmyINoy|^~M#IO0 zqW}TobgMZT#rMWGCrG-$b2J@NoOf;HUAV*H8R>B?L-VZhy9R zdu4rX;}d}E{)17{jnXt3ZI8N7`s1iOo{SK1sky2=deK1?gG2X7`e0@w<880kPh3fQ zK5>pJ`3IJpm0$XCFL|1->?Ffs5-;y0@pzOBQZI!&N;&tS27k4wgURDTzx!=;^eFi? z!pYsc``O*c_cqoyHoD!t_1<1>>7WzuPdfXeQ`5lMZ%767tGWCg*1 z16$2bx*H!NH=|l6f?(3$?y>^5ntPo=8u@c)J}9`1ehGYY^&HjB)lxIqZLZp7K*zcN E06`ulwEzGB literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Demo/AdvMsgBoxExplorer.dpr b/TAdvTaskDialog/internal/1.5.0.2/1/Demo/AdvMsgBoxExplorer.dpr new file mode 100644 index 0000000..bc37470 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.0.2/1/Demo/AdvMsgBoxExplorer.dpr @@ -0,0 +1,14 @@ +program AdvMsgBoxExplorer; + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.MainFormOnTaskbar := True; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Demo/AdvMsgBoxExplorer.dproj b/TAdvTaskDialog/internal/1.5.0.2/1/Demo/AdvMsgBoxExplorer.dproj new file mode 100644 index 0000000..79dd07c --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.0.2/1/Demo/AdvMsgBoxExplorer.dproj @@ -0,0 +1,41 @@ + + + {3be14241-b500-4048-b206-8a73172c37f9} + AdvMsgBoxExplorer.dpr + Debug + AnyCPU + DCC32 + AdvMsgBoxExplorer.exe + + + 7.0 + False + False + 0 + RELEASE + + + 7.0 + DEBUG + + + Delphi.Personality + VCLApplication + +FalseTrueFalseFalseFalse1000FalseFalseFalseFalseFalse103312521.0.0.01.0.0.0 + Microsoft Office XP Sample Automation Server Wrapper Components + Microsoft Office 2000 Sample Automation Server Wrapper Components + CodeGear C++Builder Office 2000 Servers Package + CodeGear C++Builder Office XP Servers Package + AdvMsgBoxExplorer.dpr + + + + + MainSource + + +
Form1
+
+
+
\ No newline at end of file diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Demo/AdvMsgBoxExplorer.res b/TAdvTaskDialog/internal/1.5.0.2/1/Demo/AdvMsgBoxExplorer.res new file mode 100644 index 0000000000000000000000000000000000000000..42a5081b0f34660600159e4ef01b88cf6d6e4558 GIT binary patch literal 4396 zcmbW5y^ice5QS^C0YtD8>OhncYij4bkxI`SUKc$3L2~0G z4YcQTpML1=@$u27Qd~1m`TfHO>$~2t3H`7cZ|8G;)&Iu_jKogOT=JO4$=9oRO{KR< z9Jb;r0;xCR}WxtJm8Xnv>Vt-cbiktZ1FiOkc<%53&Y;wHhS>xp3 zTJLU$Kl$`gG1!i*9w@DrX!}{(3e(c#p-ye$v@+KZ`w94sukAENCp7^IS`8)ZxqB>wRfSnxB4fhON9C+7S;u9;r(avLTvEx&7{Sa}x z%^Y)Z;GOzA_9*NFJf#Qe1N$O=E8Ez?m#|i-dHDJC*B`-Q4i0{1i~LAz0AD@!R2NL% z;p+IKY_J`qyAbl@@ynmbJHkQZS=fm7XYT7s^_rh8Ilu|bz{YRGmmPf%CVdcNa@=?x zq&w{!f&(#v;q_14xp7c`vgSFh)!^V`oe$>8p>qHmIYj*(Q{3Ui7_OcJVR| zjg@=t1BWxbV9Q_Bw8ftsx;1`sZt_d~Q-9N#GKq{u4LO zbKC(DzxM_>$Qo&Rv&%UHd*M)GOfI$$>zu3CI4nJX00S;teU43z*L#-n$^op)hdE^LEF>pt zgpJ=bUE-}ee)k%V`XRp~Q)j=sk4pl2XC6tstNIkbCG-X{k~i)|-r?xIr1|Z)oY%kQ zUS^x9iQwvMTuNhj-258El+ZItsh?Sg73oPshvqUybnA1B?q*} z_J%yT-Q04axT#J0Nx$#axgSkFUgh%i+kk&k9y$oJR6I0&l~X06BD`mLFLFRAq_`^A2=pY2!4PxhO1 XKHL8__%}oUXWZZWzZ(1ta%2AiiCQ9h literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Demo/TaskDialogExplorer.dpr b/TAdvTaskDialog/internal/1.5.0.2/1/Demo/TaskDialogExplorer.dpr new file mode 100644 index 0000000..e1ac7bc --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.0.2/1/Demo/TaskDialogExplorer.dpr @@ -0,0 +1,14 @@ +program TaskDialogExplorer; + +uses + Forms, + fmMain in 'fmMain.pas' {MainForm}; + +{$R *.res} + +begin + Application.Initialize; + Application.MainFormOnTaskbar := True; + Application.CreateForm(TMainForm, MainForm); + Application.Run; +end. diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Demo/TaskDialogExplorer.dproj b/TAdvTaskDialog/internal/1.5.0.2/1/Demo/TaskDialogExplorer.dproj new file mode 100644 index 0000000..9ae7939 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.0.2/1/Demo/TaskDialogExplorer.dproj @@ -0,0 +1,41 @@ + + + {15a8d16e-1063-4b59-8cb3-07496f176779} + TaskDialogExplorer.dpr + Debug + AnyCPU + DCC32 + TaskDialogExplorer.exe + + + 7.0 + False + False + 0 + RELEASE + + + 7.0 + DEBUG + + + Delphi.Personality + VCLApplication + +FalseTrueFalseFalseFalse1000FalseFalseFalseFalseFalse103312521.0.0.01.0.0.0 + Microsoft Office XP Sample Automation Server Wrapper Components + Microsoft Office 2000 Sample Automation Server Wrapper Components + CodeGear C++Builder Office 2000 Servers Package + CodeGear C++Builder Office XP Servers Package + TaskDialogExplorer.dpr + + + + + MainSource + + +
MainForm
+
+
+
\ No newline at end of file diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Demo/TaskDialogExplorer.res b/TAdvTaskDialog/internal/1.5.0.2/1/Demo/TaskDialogExplorer.res new file mode 100644 index 0000000000000000000000000000000000000000..42a5081b0f34660600159e4ef01b88cf6d6e4558 GIT binary patch literal 4396 zcmbW5y^ice5QS^C0YtD8>OhncYij4bkxI`SUKc$3L2~0G z4YcQTpML1=@$u27Qd~1m`TfHO>$~2t3H`7cZ|8G;)&Iu_jKogOT=JO4$=9oRO{KR< z9Jb;r0;xCR}WxtJm8Xnv>Vt-cbiktZ1FiOkc<%53&Y;wHhS>xp3 zTJLU$Kl$`gG1!i*9w@DrX!}{(3e(c#p-ye$v@+KZ`w94sukAENCp7^IS`8)ZxqB>wRfSnxB4fhON9C+7S;u9;r(avLTvEx&7{Sa}x z%^Y)Z;GOzA_9*NFJf#Qe1N$O=E8Ez?m#|i-dHDJC*B`-Q4i0{1i~LAz0AD@!R2NL% z;p+IKY_J`qyAbl@@ynmbJHkQZS=fm7XYT7s^_rh8Ilu|bz{YRGmmPf%CVdcNa@=?x zq&w{!f&(#v;q_14xp7c`vgSFh)!^V`oe$>8p>qHmIYj*(Q{3Ui7_OcJVR| zjg@=t1BWxbV9Q_Bw8ftsx;1`sZt_d~Q-9N#GKq{u4LO zbKC(DzxM_>$Qo&Rv&%UHd*M)GOfI$$>zu3CI4nJX00S;teU43z*L#-n$^op)hdE^LEF>pt zgpJ=bUE-}ee)k%V`XRp~Q)j=sk4pl2XC6tstNIkbCG-X{k~i)|-r?xIr1|Z)oY%kQ zUS^x9iQwvMTuNhj-258El+ZItsh?Sg73oPshvqUybnA1B?q*} z_J%yT-Q04axT#J0Nx$#axgSkFUgh%i+kk&k9y$oJR6I0&l~X06BD`mLFLFRAq_`^A2=pY2!4PxhO1 XKHL8__%}oUXWZZWzZ(1ta%2AiiCQ9h literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Demo/UAdvInputTaskDialogDemo.dfm b/TAdvTaskDialog/internal/1.5.0.2/1/Demo/UAdvInputTaskDialogDemo.dfm new file mode 100644 index 0000000..685effd --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.0.2/1/Demo/UAdvInputTaskDialogDemo.dfm @@ -0,0 +1,100 @@ +object Form1: TForm1 + Left = 0 + Top = 0 + Caption = 'TAdvInputTaskDialog demo' + ClientHeight = 225 + ClientWidth = 406 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + OldCreateOrder = False + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 264 + Top = 22 + Width = 91 + Height = 13 + Caption = 'Preset input value:' + end + object Label2: TLabel + Left = 264 + Top = 103 + Width = 34 + Height = 13 + Caption = 'Result:' + end + object RadioGroup1: TRadioGroup + Left = 16 + Top = 16 + Width = 233 + Height = 161 + Caption = 'Select input control' + ItemIndex = 0 + Items.Strings = ( + 'Edit' + 'Combo editor' + 'Combo list' + 'Memo' + 'Date picker' + 'Custom control (spin editor)') + TabOrder = 0 + end + object Button1: TButton + Left = 264 + Top = 72 + Width = 121 + Height = 25 + Caption = 'Show inputdialog' + TabOrder = 1 + OnClick = Button1Click + end + object Edit1: TEdit + Left = 264 + Top = 45 + Width = 121 + Height = 21 + TabOrder = 2 + Text = 'preset' + end + object Edit2: TEdit + Left = 264 + Top = 122 + Width = 121 + Height = 21 + TabOrder = 3 + end + object SpinEdit1: TSpinEdit + Left = 16 + Top = 195 + Width = 121 + Height = 22 + MaxValue = 0 + MinValue = 0 + TabOrder = 4 + Value = 0 + Visible = False + end + object AdvInputTaskDialog1: TAdvInputTaskDialog + CommonButtons = [] + DefaultButton = 0 + Icon = tiInformation + InputType = itEdit + InputItems.Strings = ( + 'BMW' + 'Audi' + 'Mercedes' + 'Porsche' + 'VW' + 'Ferrari') + Title = 'Windows Vista Input dialog' + Content = 'Enter value here' + OnDialogInputSetText = AdvInputTaskDialog1DialogInputSetText + OnDialogInputGetText = AdvInputTaskDialog1DialogInputGetText + Left = 352 + Top = 152 + end +end diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Demo/UAdvInputTaskDialogDemo.pas b/TAdvTaskDialog/internal/1.5.0.2/1/Demo/UAdvInputTaskDialogDemo.pas new file mode 100644 index 0000000..ee4bdd9 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.0.2/1/Demo/UAdvInputTaskDialogDemo.pas @@ -0,0 +1,69 @@ +unit UAdvInputTaskDialogDemo; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, ExtCtrls, TaskDialog, Spin; + +type + TForm1 = class(TForm) + AdvInputTaskDialog1: TAdvInputTaskDialog; + RadioGroup1: TRadioGroup; + Button1: TButton; + Edit1: TEdit; + Label1: TLabel; + Label2: TLabel; + Edit2: TEdit; + SpinEdit1: TSpinEdit; + procedure Button1Click(Sender: TObject); + procedure AdvInputTaskDialog1DialogInputGetText(Sender: TObject; + var Text: string); + procedure AdvInputTaskDialog1DialogInputSetText(Sender: TObject; + Text: string); + private + { Private declarations } + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation + +{$R *.dfm} + +procedure TForm1.AdvInputTaskDialog1DialogInputGetText(Sender: TObject; + var Text: string); +begin + Text := SpinEdit1.Text; +end; + +procedure TForm1.AdvInputTaskDialog1DialogInputSetText(Sender: TObject; + Text: string); +begin + SpinEdit1.Text := Text; +end; + +procedure TForm1.Button1Click(Sender: TObject); +begin + case radiogroup1.ItemIndex of + 0: AdvInputTaskDialog1.InputType := itEdit; + 1: AdvInputTaskDialog1.InputType := itComboEdit; + 2: AdvInputTaskDialog1.InputType := itComboList; + 3: AdvInputTaskDialog1.InputType := itMemo; + 4: AdvInputTaskDialog1.InputType := itDate; + 5: + begin + AdvInputTaskDialog1.InputType := itCustom; + AdvInputTaskDialog1.InputControl := SpinEdit1; + + end; + end; + AdvInputTaskDialog1.InputText := Edit1.Text; + AdvInputTaskDialog1.Execute; + Edit2.Text := AdvInputTaskDialog1.InputText; +end; + +end. diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Demo/Unit1.dfm b/TAdvTaskDialog/internal/1.5.0.2/1/Demo/Unit1.dfm new file mode 100644 index 0000000..3f3e4c6 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.0.2/1/Demo/Unit1.dfm @@ -0,0 +1,130 @@ +object Form1: TForm1 + Left = 0 + Top = 0 + Caption = 'AdvMessageBox Test' + ClientHeight = 303 + ClientWidth = 380 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + OldCreateOrder = False + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 14 + Top = 16 + Width = 47 + Height = 13 + Caption = 'Caption: ' + end + object Label2: TLabel + Left = 30 + Top = 48 + Width = 25 + Height = 13 + Caption = 'Icon:' + end + object Label3: TLabel + Left = 29 + Top = 76 + Width = 26 + Height = 13 + Caption = 'Text:' + end + object Label4: TLabel + Left = 14 + Top = 184 + Width = 41 + Height = 13 + Caption = 'Buttons:' + end + object Label5: TLabel + Left = 24 + Top = 232 + Width = 34 + Height = 13 + Caption = 'Result:' + end + object lbresults: TLabel + Left = 64 + Top = 232 + Width = 3 + Height = 13 + end + object BtnTMS: TButton + Left = 65 + Top = 264 + Width = 145 + Height = 25 + Caption = 'TMS TAdvMessageBox' + TabOrder = 0 + OnClick = BtnTMSClick + end + object BtnWindows: TButton + Left = 216 + Top = 264 + Width = 145 + Height = 25 + Caption = 'Windows Messagebox' + TabOrder = 1 + OnClick = BtnWindowsClick + end + object edCaption: TEdit + Left = 61 + Top = 13 + Width = 300 + Height = 21 + TabOrder = 2 + Text = 'Test of MessageBox' + end + object cbIcon: TComboBox + Left = 61 + Top = 45 + Width = 300 + Height = 21 + ItemHeight = 13 + ItemIndex = 0 + TabOrder = 3 + Text = 'Select Icon' + Items.Strings = ( + 'Select Icon' + 'MB_ICONEXCLAMATION' + 'MB_ICONWARNING' + 'MB_ICONASTERISK' + 'MB_ICONINFORMATION' + 'MB_ICONQUESTION' + 'MB_ICONSTOP' + 'MB_ICONERROR' + 'MB_ICONHAND') + end + object MemoInfo: TMemo + Left = 61 + Top = 76 + Width = 300 + Height = 89 + Lines.Strings = ( + 'Sample short message.') + TabOrder = 4 + end + object cbButtons: TComboBox + Left = 64 + Top = 184 + Width = 297 + Height = 21 + ItemHeight = 13 + TabOrder = 5 + Text = 'Pick Buttons' + Items.Strings = ( + 'Pick the buttons to show' + 'ABORT, RETRY, IGNORE' + 'CANCEL, TRY AGAIN, CONTINUE' + 'OK' + 'OK, CANCEL' + 'RETRY, CANCEL' + 'YES, NO' + 'YES, NO, CANCEL') + end +end diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Demo/Unit1.pas b/TAdvTaskDialog/internal/1.5.0.2/1/Demo/Unit1.pas new file mode 100644 index 0000000..9ab33f9 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.0.2/1/Demo/Unit1.pas @@ -0,0 +1,125 @@ +unit Unit1; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls; + +type + TForm1 = class(TForm) + BtnTMS: TButton; + BtnWindows: TButton; + Label1: TLabel; + edCaption: TEdit; + Label2: TLabel; + cbIcon: TComboBox; + Label3: TLabel; + MemoInfo: TMemo; + Label4: TLabel; + cbButtons: TComboBox; + Label5: TLabel; + lbresults: TLabel; + procedure BtnWindowsClick(Sender: TObject); + procedure BtnTMSClick(Sender: TObject); + private + Fmbtitle: string; + FBoxInformation: string; + FBoxflags: integer; + { Private declarations } + procedure MakeDialog(id: string); + procedure Setmbtitle(const Value: string); + procedure SetBoxInformation(const Value: string); + procedure SetBoxflags(const Value: integer); + public + { Public declarations } + + property BoxTitle: string read Fmbtitle write Setmbtitle; + property BoxInformation: string read FBoxInformation write SetBoxInformation; + property Boxflags: integer read FBoxflags write SetBoxflags; + end; + +var + Form1: TForm1; + +implementation + +uses + TaskDialog; + +{$R *.dfm} + +const + MB_CANCELTRYCONTINUE = $00000006; + iconlist: array[1..8] of integer = + (MB_ICONEXCLAMATION, + MB_ICONWARNING, + MB_ICONINFORMATION, + MB_ICONASTERISK, + MB_ICONQUESTION, + MB_ICONSTOP, + MB_ICONERROR, + MB_ICONHAND); + btnlist: array[1..7] of integer = + ( MB_ABORTRETRYIGNORE, + MB_CANCELTRYCONTINUE, + MB_OK, + MB_OKCANCEL, + MB_RETRYCANCEL, + MB_YESNO, + MB_YESNOCANCEL); + + + +// Create dialog fields for the messagebox +procedure TForm1.MakeDialog(id: string); +var + i: Integer; +begin + // make box fields from ui + BoxTitle := edCaption.text + ' ('+id+')'; // title + BoxInformation := memoInfo.Lines[0]; // info + for i := 1 to memoInfo.Lines.count - 1 do + BoxInformation := BoxInformation + #10+MemoInfo.Lines[i]; + BoxFlags := 0; + if cbIcon.ItemIndex > 0 then + BoxFlags := BoxFlags or IconList[cbIcon.ItemIndex]; + if cbButtons.ItemIndex > 0 then + BoxFlags := boxFlags or btnlist[cbButtons.itemindex]; +end; + +procedure TForm1.BtnTMSClick(Sender: TObject); +var + res: integer; +begin + MakeDialog('TMS'); + res := AdvMessagebox(0,pchar(BoxInformation), pchar(BoxTitle), BoxFlags); + lbResults.caption := IntToStr(res); +end; + +procedure TForm1.BtnWindowsClick(Sender: TObject); +var + res: integer; +begin + MakeDialog('WINDOWS'); + res := Messagebox(0,pchar(BoxInformation),pchar(BoxTitle),BoxFlags); + lbResults.caption := InttoStr(res); +end; + + +procedure TForm1.SetBoxflags(const Value: integer); +begin + FBoxflags := Value; +end; + +procedure TForm1.SetBoxInformation(const Value: string); +begin + FBoxInformation := Value; +end; + +procedure TForm1.Setmbtitle(const Value: string); +begin + Fmbtitle := Value; +end; + +end. diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Demo/fmMain.dfm b/TAdvTaskDialog/internal/1.5.0.2/1/Demo/fmMain.dfm new file mode 100644 index 0000000..a1d4604 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.0.2/1/Demo/fmMain.dfm @@ -0,0 +1,310 @@ +object MainForm: TMainForm + Left = 0 + Top = 0 + Hint = 'Thiis the Windows title for the dialog b ox' + Caption = 'TMS TAdvTaskDialog Explorer' + ClientHeight = 426 + ClientWidth = 530 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + OldCreateOrder = False + Position = poDesktopCenter + ShowHint = True + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 136 + Top = 278 + Width = 321 + Height = 13 + Caption = 'Separate button names with spaces (Use quotes to embed spaces)' + end + object Label3: TLabel + Left = 8 + Top = 4 + Width = 81 + Height = 13 + Caption = 'Include elements' + end + object Label2: TLabel + Left = 36 + Top = 238 + Width = 81 + Height = 13 + Caption = 'Common Buttons' + end + object Label4: TLabel + Left = 58 + Top = 164 + Width = 61 + Height = 13 + Caption = 'Expand label' + end + object Label5: TLabel + Left = 306 + Top = 163 + Width = 72 + Height = 13 + Caption = 'Collapse Label:' + end + object Label6: TLabel + Left = 19 + Top = 367 + Width = 74 + Height = 13 + Caption = 'Default button:' + end + object Button1: TButton + Left = 242 + Top = 393 + Width = 264 + Height = 25 + Caption = 'Test TAdvTaskDialog' + TabOrder = 0 + OnClick = Button1Click + end + object cbFooter: TCheckBox + Left = 18 + Top = 325 + Width = 97 + Height = 17 + Caption = 'Include Footer' + Checked = True + State = cbChecked + TabOrder = 1 + OnClick = cbFooterClick + end + object cbExpanded: TCheckBox + Left = 18 + Top = 126 + Width = 84 + Height = 17 + Caption = 'More Details' + Checked = True + State = cbChecked + TabOrder = 2 + OnClick = cbExpandedClick + end + object cbVerify: TCheckBox + Left = 19 + Top = 303 + Width = 81 + Height = 12 + Caption = 'Verify text' + Checked = True + State = cbChecked + TabOrder = 3 + OnClick = cbVerifyClick + end + object cbRadioButtons: TCheckBox + Left = 19 + Top = 187 + Width = 89 + Height = 17 + Caption = 'Radio buttons' + Checked = True + State = cbChecked + TabOrder = 4 + OnClick = cbRadioButtonsClick + end + object edCustomButtons: TEdit + Left = 128 + Top = 261 + Width = 378 + Height = 21 + TabOrder = 5 + Text = '"Custom 1" "Custom 2"' + end + object memoRadiobuttons: TMemo + Left = 128 + Top = 185 + Width = 377 + Height = 45 + Lines.Strings = ( + 'Radio Button 1' + 'Radio Button 2' + 'Radio Button 3') + TabOrder = 6 + end + object cbCustom: TCheckBox + Left = 19 + Top = 263 + Width = 89 + Height = 17 + Caption = 'Custom Buttons' + Checked = True + State = cbChecked + TabOrder = 7 + OnClick = cbCustomClick + end + object edVerifyText: TEdit + Left = 127 + Top = 299 + Width = 377 + Height = 21 + TabOrder = 8 + Text = 'Check box if you can read :)' + end + object cbCaption: TCheckBox + Left = 19 + Top = 23 + Width = 89 + Height = 17 + Caption = 'Caption' + Checked = True + State = cbChecked + TabOrder = 9 + OnClick = cbCaptionClick + end + object edCaption: TEdit + Left = 129 + Top = 21 + Width = 378 + Height = 21 + Hint = 'Text for the Windows dialog box caption.' + TabOrder = 10 + Text = 'Test of AdvTaskDialog' + end + object MemoFooter: TMemo + Left = 127 + Top = 323 + Width = 378 + Height = 35 + Lines.Strings = ( + 'Sample Footer message' + 'For example: If you do this you will loose all unsaved changes!') + TabOrder = 11 + end + object cbInstruction: TCheckBox + Left = 19 + Top = 46 + Width = 83 + Height = 17 + Caption = 'Instruction' + Checked = True + State = cbChecked + TabOrder = 12 + OnClick = cbInstructionClick + end + object MemoInstruction: TMemo + Left = 128 + Top = 48 + Width = 377 + Height = 33 + Lines.Strings = ( + 'This is the bold blue main instruction and' + 'can be mulitple lines.') + TabOrder = 13 + end + object cbContent: TCheckBox + Left = 19 + Top = 86 + Width = 64 + Height = 17 + Caption = 'Content' + Checked = True + State = cbChecked + TabOrder = 14 + OnClick = cbContentClick + end + object MemoContent: TMemo + Left = 128 + Top = 87 + Width = 377 + Height = 32 + Lines.Strings = ( + 'This is the normal "content" of the dialog.' + ' Notice it'#39's in relatively small print.') + TabOrder = 15 + end + object cbBtnOK: TCheckBox + Left = 129 + Top = 240 + Width = 50 + Height = 10 + Caption = 'cbOK' + Checked = True + State = cbChecked + TabOrder = 16 + end + object cbBtnNo: TCheckBox + Left = 246 + Top = 240 + Width = 50 + Height = 10 + Caption = 'cbNo' + TabOrder = 17 + end + object cbBtnCancel: TCheckBox + Left = 366 + Top = 240 + Width = 66 + Height = 10 + Caption = 'cbCancel' + TabOrder = 18 + end + object cbBtnClose: TCheckBox + Left = 442 + Top = 240 + Width = 62 + Height = 10 + Caption = 'cbClose' + TabOrder = 19 + end + object cbBtnRetry: TCheckBox + Left = 304 + Top = 240 + Width = 60 + Height = 10 + Caption = 'cbRetry' + TabOrder = 20 + end + object cbBtnYes: TCheckBox + Left = 182 + Top = 240 + Width = 55 + Height = 10 + Caption = 'cbYes' + TabOrder = 21 + end + object MemoExpand: TMemo + Left = 128 + Top = 125 + Width = 376 + Height = 33 + Lines.Strings = ( + 'This is for extended details that are initiall hidden' + 'unless user clicks the "view more" button.') + TabOrder = 22 + end + object edExpand: TEdit + Left = 127 + Top = 161 + Width = 121 + Height = 21 + TabOrder = 23 + Text = 'More Detail' + end + object edCollapse: TEdit + Left = 384 + Top = 161 + Width = 121 + Height = 21 + TabOrder = 24 + Text = 'Less Detail' + end + object spnDefButton: TSpinEdit + Left = 127 + Top = 364 + Width = 46 + Height = 22 + MaxValue = 0 + MinValue = 0 + TabOrder = 25 + Value = 0 + end +end diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Demo/fmMain.pas b/TAdvTaskDialog/internal/1.5.0.2/1/Demo/fmMain.pas new file mode 100644 index 0000000..440d6e9 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.0.2/1/Demo/fmMain.pas @@ -0,0 +1,293 @@ +unit fmMain; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, TaskDialog, StdCtrls, Spin; + +type + TMainForm = class(TForm) + Button1: TButton; + cbFooter: TCheckBox; + cbExpanded: TCheckBox; + cbVerify: TCheckBox; + cbRadioButtons: TCheckBox; + cbBtnOK: TCheckBox; + cbBtnYes: TCheckBox; + cbBtnNo: TCheckBox; + cbBtnCancel: TCheckBox; + cbBtnRetry: TCheckBox; + cbBtnClose: TCheckBox; + edCustomButtons: TEdit; + Label1: TLabel; + Label3: TLabel; + memoRadiobuttons: TMemo; + cbCustom: TCheckBox; + edVerifyText: TEdit; + cbCaption: TCheckBox; + edCaption: TEdit; + MemoFooter: TMemo; + cbInstruction: TCheckBox; + MemoInstruction: TMemo; + cbContent: TCheckBox; + MemoContent: TMemo; + Label2: TLabel; + MemoExpand: TMemo; + edExpand: TEdit; + edCollapse: TEdit; + Label4: TLabel; + Label5: TLabel; + Label6: TLabel; + spnDefButton: TSpinEdit; + procedure Button1Click(Sender: TObject); + procedure Button3Click(Sender: TObject); + procedure specialButtonClick(sender: tObject; buttonid: integer); + procedure cbCaptionClick(Sender: TObject); + procedure cbRadioButtonsClick(Sender: TObject); + procedure cbCustomClick(Sender: TObject); + procedure cbVerifyClick(Sender: TObject); + procedure cbFooterClick(Sender: TObject); + procedure cbInstructionClick(Sender: TObject); + procedure cbContentClick(Sender: TObject); + procedure cbExpandedClick(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + MainForm: TMainForm; + +implementation + +{$R *.dfm} + +procedure tmsShowmessage(const Title,Instruction,content: string; icon: tTaskDialogIcon); +var + td: tAdvTaskDialog; +begin + td := tAdvTaskDialog.Create(application); + td.Title := title; + td.Instruction := Instruction; + td.Content := Content; + td.icon := icon; + td.Execute; + td.Free; +end {ShowmessageEx}; + +procedure TMainForm.Button1Click(Sender: TObject); +var + td : tAdvTaskDialog; + msg: string; + ButtonChecked: integer; // custom button number checked + lab: string; + txt: string; + i: Integer; + inQuote: boolean; + resname: string; +begin + // + td := tAdvTaskDialog.Create(self); + td.Clear; + td.DialogPosition := dpOwnerFormCenter; + + // Dialog box Caption or Title + if cbCaption.checked then + td.Title := edCaption.text; + + // Main Instruction field + if cbInstruction.checked then + begin + // Note this field will not transform \n to #13#10 + td.Instruction := memoInstruction.lines.text; + end; + + // Content -- relatively small black text + if cbContent.checked then + td.Content := MemoContent.lines.text; + + // Radio buttons optional + if cbradioButtons.checked then + begin + td.RadioButtons.Add('Button 1'); + td.RadioButtons.Add('Button 2'); +// for i := 0 to MemoRadioButtons.Lines.count - 1 do +// td.RadioButtons.Add(MemoRadioButtons.Lines[i]); + td.DefaultRadioButton := -1; + end; + // verification checkbox: probably most used for 'Do Not Show again' + if cbVerify.checked then + td.VerificationText := edVerifytext.Text; + + // Expansiion text + if cbExpanded.checked then + td.ExpandedText := memoExpand.lines.text; + // these don't show if expandedtext is blank + td.ExpandControlText := edCollapse.text; + td.CollapsControlText := edExpand.Text; + + // Programmer defined Custom Buttons + if cbCustom.Checked and (length(edCustombuttons.text) > 0) then + begin + td.CommonButtons := []; + txt := edCustomButtons.text; + if length(txt) > 0 then + begin + lab := ''; + inquote := false; + for i := 1 to length(txt) do + begin + if txt[i] = '"' then + inQuote := not Inquote; + if ((txt[i] = ' ') and (not inQuote)) or (i = length(txt)) then + begin // have end of a button + if (i = length(txt)) and (txt[i] <> ' ') then + lab := lab + txt[i]; + if length(lab) > 0 then + td.CustomButtons.add(lab); + lab := ''; + end else if txt[i] <> '"' then + lab := lab + txt[i]; + end; + end; + end; + // Common buttons To be shown + if cbBtnOK.checked then + td.CommonButtons := td.CommonButtons + [cbOK]; + if cbBtnYes.checked then + td.CommonButtons := td.CommonButtons + [cbYes]; + if cbBtnNo.checked then + td.CommonButtons := td.CommonButtons + [cbNo]; + if cbBtnCancel.checked then + td.CommonButtons := td.CommonButtons + [cbCancel]; + if cbBtnRetry.checked then + td.CommonButtons := td.CommonButtons + [cbRetry]; + if cbBtnClose.checked then + td.CommonButtons := td.CommonButtons + [cbClose]; + + if spnDefButton.Value <> 0 then + td.DefaultButton := spnDefButton.Value; + + // Footer message + if cbFooter.checked then + begin + msg := ''; + for i := 0 to MemoFooter.Lines.count - 1 do + msg := msg +memoFooter.lines[i]+ '\n'; + setlength(msg,length(msg)-2); + td.Footer := msg; + end; + + td.Icon := tiWarning; + td.FooterIcon := tfiError; + + ButtonChecked := td.Execute; + + msg := ''; + if cbRadioButtons.checked then + msg := 'Radio Button #'+IntToStr(td.RadioButtonResult-199)+' was selected.'+#13#10; + if buttonChecked < 100 then + begin // it's a standard button + case ButtonChecked of + id_OK: resname := 'cbOK'; + id_YES: resname := 'cbYES'; + id_NO: resname := 'cbNO'; + id_CANCEL: resname := 'cbCANCEL'; + id_RETRY: resname := 'cbRETRY'; + id_ABORT: resname := 'cbCLOSE'; + else + resname := 'UNKNOWN'; + end; + end else begin + resName := td.CustomButtons[ButtonChecked-100]; + end; + msg := msg +'<'+resname+'> Button (#'+IntToStr(ButtonChecked)+') was clicked.'; + if cbVerify.Checked then + begin + msg := msg + #13#10+'Verify box was '; + if not td.VerifyResult then + msg := msg +'NOT '; + msg := msg + 'checked.'; + end; + td.Free; + tmsShowmessage('TaskDialog Espoerer',msg,'',tiInformation); + +end; + +procedure TMainForm.Button3Click(Sender: TObject); +begin + tmsShowmessage('This is the Title','This is the Instruction','This is the content',tiWarning); +end; + +procedure TMainForm.cbCaptionClick(Sender: TObject); +begin + edCaption.Enabled := (sender as tCheckbox).checked; + if edCaption.Enabled and (edCaption.Text = '') then + edCaption.text := 'Test of AdvTaskDialog'; +end; + +procedure TMainForm.cbContentClick(Sender: TObject); +begin + MemoContent.Enabled := (sender as tCheckbox).checked; + if MemoContent.Enabled and (MemoContent.lines.count = 0) then + memoContent.lines.text := 'This is the normal "content" of the dialog.'#13#10+ + 'Notice it''s in relatively small print.'; +end; + +procedure TMainForm.cbCustomClick(Sender: TObject); +begin + edCustomButtons.Enabled := (sender as tCheckbox).checked; + if edCustomButtons.enabled and (edCustomButtons.Text = '') then + edCustomButtons.text := '"Custom 1" "Custom 2"'; +end; + +procedure TMainForm.cbExpandedClick(Sender: TObject); +begin + MemoExpand.enabled := (sender as tCheckbox).checked; +end; + +procedure TMainForm.cbFooterClick(Sender: TObject); +begin + MemoFooter.Enabled := (sender as tcheckbox).checked; + if MemoFooter.Enabled and (MemoFooter.Lines.count = 0) then + memoFooter.Lines.Text := 'Sample footer Message'#13#10+ + 'For Example: If you do this you will loose all unsaved changes.'; +end; + +procedure TMainForm.cbInstructionClick(Sender: TObject); +begin + MemoInstruction.Enabled := (sender as tCheckbox).Checked; + if MemoInstruction.Enabled and (memoInstruction.lines.count = 0) then + MemoInstruction.Lines.text := 'This is the bold blue main instruction and'#1310+ + 'can be mulitple lines.'; +end; + +procedure TMainForm.cbRadioButtonsClick(Sender: TObject); +begin + memoRadioButtons.Enabled := (sender as tCheckbox).checked; + if memoradioButtons.Enabled and (memoRadioButtons.lines.count = 0) then + begin + memoRadioButtons.Lines.Add('Test Radio Button #1'); + memoRadioButtons.Lines.Add('Test Radio button #2'); + MemoRadioButtons.Lines.Add('Test Radio Button #3'); + end; +end; + +procedure TMainForm.cbVerifyClick(Sender: TObject); +begin + edVerifyText.enabled := (sender as tCheckbox).Checked; + if edverifyText.Enabled and (edVerifyText.Text = '') then + edVerifyText.text := 'Check Box if you can read :)'; +end; + +procedure TMainForm.specialButtonClick(sender: tObject; buttonid: integer); +var + td: tAdvTaskDialog; +begin + td := sender as tAdvTaskDialog; + td.tag := buttonid; +end; + +end. diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/AdvGDIP.dcu b/TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/AdvGDIP.dcu new file mode 100644 index 0000000000000000000000000000000000000000..5a42a598faf74ef9a67e6471d9b03dfa63da06b5 GIT binary patch literal 54924 zcmeIb3wV^(oj-o&&CFzyyh$b@nM}fEla!&5g_MA}qUaKGfwTq_NPwuQLo!K5b0Zft zwy{GoZ7yOI(efF2uNCH~HaV4J_C;zwt{&}RH9 zpr4J-)xox=mcVf6!vATEuW0KIGzB^nb~L`!=IwZ17WA?}V|!~gCA3>HFAa8e_`B z*vswQ~qI(q_}sM-@Mx^50`==68?y1x2c zpuQm<-L#^O_~3bMu&tr}-Y)c6NA1nGtX$6fn|;|Wx7>WgKf2y;bd;{WWmPGUj9XD! zB6_1xkBYs~UR$xUhR3?9WXF88?eAZ1blzMHUZuQiJF2Lip1*wMa+6Nccdjg}tyxuk z^V5C5E`kQd=uDde>!3k=1+p6Ow|f3F@av|eimtMaJ^mKn@Ndi5Ti;->^iu`bH@KE} z`a7C~^`y14rlh^4y|dyM_1|eqE7;>D&}pP{HHfk?~P{d1{e(iYakbdrNOq zdz(O*xl2S8pPPei7NM&H-Bp3MvbKg2ze&Yq!R}Un2jPPE1$Zu-ICBw?<{pmECT&Fb z6xj04_SV(){?A$`K@U6Hw9L;cf$<J376p-f48Ye#!m zup36Z8kHOD?&WkGjXaEl&f=2WTQ{IYRt1`1d&PfFn;C_q%H=3tSEYfLK({30u^Hif z2sTFgD9kDh8Jvc<8&VJ%GRaOQRz|c;`)3r1yrMB9o8|4Dt^V#6?cMhTdaF7Ejlugk zL!Jnf6DH!tiA1ROQh!(T>h9i_0H@{%s@q5euX-SO9jpiho0?7ft9Y0+O95eMYVQhg z63(4Bgqz#_4LpiB65a|_E%WM#f#<}$IxI-oRiU+)3MLArxax!@8*Eeu&rE5j|6ZyF zKY0M6^YF^B#B<3;a?t=m6Or7A=gCt@9&zE(A}O~6MqD^Qs^nJr?-ljQQBz}7bWLZl zwH4JKP7qPamITvcaG-8q+=9`Vv*0NrSXfi=QiX!%mK3Jv*a-SCR`i{g_BQD;m@?<# z#l!oKnKM_4ZG-XZ=E5TEk$`(;YJkBR&QaM0MLom?Ry}GBfv%Lr742`TMcoJp6?LTs9 zPRf1ka1v$J%t=bXG0@2qicU6zM50W_NyODsHgudcCPononWS+>1u=wK^4GOC*xek? z0Z$*nbE5R)XNH#^*MX;r;3@QsNFyrMoM&pw^qccBbvtt!j+;sO6!c^smUW^X5HU4- z%3(2?PoC1$XQEPya^-ey9A2CSAAUrF)$J|82I^lN!N)_sG%=O_D?G&gUQgSFL`LF$uN@oZ$p(L76D9W?; zIsN{X7(<5GwJ#RfmI3Qa^85Kzq^7q6(Thd2M$yG>-9ZdM{;namL`2&Q5^Idu0d_cj zUfZ%+$%Qpk?hvsI1~SAx_@{L@m9hfe96P`gKDhsba$g#?KQg(+EwD6g@H>atsU=S@ zSwWhlDkK#@O!E-?i9l%ud;&;x18m*5zPE2hK|+m69Fj3f(o3aOAx3KsZeO}7uA*&| zA01$b&3WNhMW1KvV+*!aOz(#nO?7T2ZBk6MH@DwA#Qt7jG+(L-vjTqG5c|GB*$dL6 z-D0Inb~Gwlr5K5#HJcjEiPYdt#iZu+*vX{wVWoY!(FvFPTU-4l?VX*lNdc7EL6JeH zZ$@-l%=CL&1JvF9okQ$-k|It_CDGHJpG`4QhY{TS`^9vuWarsvkOI>%cpau?e(ZcN_(w{ zPxPfwd?os8uobg1RPADc(F+`expRPhuX<(O$^u6X{S1j;z7%8n!^fK;_QvkvCD zP>BTz25NxSIff2b!KN8eAra-%*J9m*EJ+P!L_=)wo-e<*it>rocLV$qI{gxz>&$_J}~Z3S0^?z}zowu3ZJgr(!}P#y3rLJ>?RT z)+^dOgZIP#_O}eNJu@>rHKcn^bhcA{rNxxOhTgAw?O|B>B6%#g7(Y*z05& zy?SGhzY}$4m}^}kR*|D@GJB~q9@9KNV>MYhg<9EOjK0#2w*NC>)^dGQEMgS;-vm0} z$MXnfxiE$Og}~1AWk_NaWovs|gTjvp{49eSen9)Z3j3bG&i1JsswO?>pYbrq+rD%bMn#!sGj7dGpYxTL;zK*3m=F2c)X`!&Q z3xmKATO;tA&uzk^=eM^Fu{wdX`%+A}byRM*3yjlemWgHimYxR4yi;IZzDyGx9y?kB z!WeB32@(sEObG_qPfJc-UI!1u6d96{2{iBI%P*?ExQ!Sr2lcejAoZ1H4Yh7=lMLLl zcCxhn0)a8!KvbX?1?z{{fI!)OQw$W*DD<#EBcleIMz+otl=BdKSYTZyEX}U(3AFd1 zXm<*%8S zhmcZZp;vjE5jArcn^i_GetmS^)?2Ce=0vB2+t?Dol4%v@v9!v%yp!fUDC6G$n&;8jQq)nEfQdrtf@x$qa#0?^ep^r*Jo03B; zAh34dpII4*Icl)W#Hd*$MFqu9Dj41)Qn|)UMRU|4)+SOV7Nl5t4X|Ii4?T1T&F0Xt z+nSWJArbF$o7a^^5!`XAZ2DbP1Qy)tW}0mH1rFBMOt%92XhW<);Oqsu88^U2KD%P* zu7czmb8JY&!f0WB)=cIcle+dc{%eT++dtVJ-9Q?oThXg~+hFm2A+TCOiWNJ+8a?); z4allBJ|yCO+ASD<9zAj2?`eAs~=xc+cAM6}bFD0YUI^>o4eeM-c_q+)Bcr?D|uPYYtp@I-BAzrezaUD=K$b~&KX zROT6h(J^NZwk=#B)%ph!n}XQR_O>RhD$vyQIT7pj#TRdA@8mO~Ln12Or(*&d0P}L; zR=g+$V*ex%9-m%ZUmxh|Dh;#+NspIAyw{gr+jdVImNiUM z5zOHQHb)E?Vzo3Z?1ut74fAO=+J%w-ERZvNsfeSkMVi@Dx*_(uK;`fD73h7XE((Zk8{@gj=md z4Y8jJ{OkfJ6>(430Q2R3@veq~cyt^39g@Ejs+L#rg~;*&_7C@D3^u~?4aWq2*VNLC z_9s$=7f!zN#jjp_cY#aM4zPcoH>J1*4v-`rU_VaWP})|IA}GUzuleUJ?%;&93J005 zm0tWzCnuBS2^&C$GeyzW=jW3HF5-GHT)QA)V z?8c8ie(?dA;s``YB2vQfsGs@)_V1th=Nm!=8K}S@dXS%N!;1Fydj#^;f85dhl>(0$ zS=-iZpuhI&HUIcv0bgN6E0GIv6>S|oD2M0#-?{dy1sQ4$$czjrWR+}rW+c{ke)ON2 z0|k6FKFk&NfU_-Kzv=0rg3JiE0vloy8^Kr6{yO=u-+ZXRQB{mh=K(gi>*H%5F0j*& z5MPKZ;MLEUd12rJUs>@DUi~~mrtl>ew{$f7S2qV6(V0FHe))W#YgM2@#u?Lu#N}9q zY?HAsixm(PBiV$Y}g5;$WK zKd;@k07rh}F2(y?#971|(}IE|?gELOBIQr&HPMm2bW>afyw>}un}4qJHwPd!j=6j( zCOnoI33pE5+%N*Rns2Fv1(ZD`8e+>| z;G#;7xGf15E>HZq2!%Qk4fOp_`+3GawQtm=(4N^=|A zXc2P_6(MJ`TJutZS6Q63HC#)Y3OQ>QJV;6Y4=atc$l*z(oVo=|D9x|g%Qj1UuJqqG z#LkEwI>VPPPD7A`M$0?GQM>1FzHsYy?x+du;`w1*o4{f9N8pOCGa)w$q+KBw{DleG zEs#!Ms#PYIlPCbsFND47JZs;k9U*5qtz|`-gbDE>_(32Q;Y4ywE!0oo#jzC?p)cb@>-A}iaNYnRX~}rOkU(XV^$(Ip5S)TA)^rcY~26)#!kk)L=iQ> zN}vv5pRps*RWKk(J>Fzx}8&;izS=4;nHIV*uu$aePSOTHgH#khCDV+Po+nJXT6 zT4>7Ko=n*P?WXzP6Pkvj2iW6B27ms{tSsV4tend8$ZCN-TT4| z&(4Y`dfra!{`rQ#eU244#qR;O=|9$2KR?S&cx$7Ywl6v31%}RLMGUaTr$6`7i-JOR zFVUo*Z2gy8e;_E#hyiwd$A_*Xvog63X#5d5_}5*vBQG&>AFIqAOqSLMKfL!_FZ+^$ zji$jq>7Li#euYdlqKz%1A(kSdHJ>Bch^?X_mL?+X6oDNu(s$3L0Y5MTAZf*a8}2xgsKkXlUzahwQtawGV8EHEbJN?^#DB28<8DO7%bW8bbq7Nv0(mA-Z^It?C z5K#l{>jz)VeSMZr<*X_o#HPBR9{dq2NHRqZuSkyBSM23i|LNMV9-f+; zETe@l{VTTW*w>#PIyyC1mz&Eq?e_$*d9@asN3)Jk{foH5Ym3U+PuOfM+u~qKO}lWj zx80riL)Ks~V0jK6?_t-oTqh25;$XFh6|h`eJw?^e4sYFuLQg&Ot&L2#d)Ssddlx34 zPBsfEjII7q$n)>NdyDDpO(clx=~ zAk9~tY=GrC+xaBJ$sPiIML%;CZhfwGbfB8-1g7nMd=|ncf@eS+QiSg2Ml}(2)LZJ^|3?)YL%+u~G za~gs);{c6g!bI^-3Mf; zI_jyHIMD<01)Xdp6P@k}g{Eyv`+};LPK>Hf)`>>US)pdp$;2~i70>oo-U@42p6gz@ zwdrK5Siat3@@u5n36C9xLYID-`wgqy`;@Hzn%qepj0%O0{`fDCTIElWZwKGnlC-rc4&^~*YlQqJk)YCCMCv!(J@4&HgHPFeT z=I71C@htN|r_PdvLZ{mk_NvU1`Jfh+uaC!R{F7^;P|=SsUMo3;8)v>~BVACZ09NlR zN901Gn;so_EsBY3XvjYC_youDLZJsAnDZCW{8WE<82!O0P02apG~zf1{yrh+@sIrp zcQ#b@-TuqbdYY=ee)iSQL54y<-1y~hPr#&Q!V36=ibNEX>8xeNq!gL>1ZgOA;Rjp4 z7L^xEZB6dD>SQ>Xhgckj4TVY@|5Z25{y_mqjlwT$#8-O$I0y{S7}QspaQGQX>Eu9%-&wsc+#NnV(QFS|w_f)0f~ z9?YE@vmlbY%%`Qv=+)2WJfNj@bJyHrEYkC1@fi0IcPR89&R;Kxsf!%qZiNcto)Cv0 zctg$K#3Ii(kz0N3^p<>B`_ZVlOm0n@w1F@rv-j3lTr0S?{c*jH`mEoMj%2?Fk=}ZdHs{vw~ zigtSY()VH(bbJ@zl!Zw^fjC?E3y53+gIiuA&eUNBKxifKbncK~BK`7bT-o_g?#n3G+@@|_}$tRl`;RFRddX(A&j zL}kT(fyLtCn9}Dbv<2h~JW`-C31(^hghMFw=r?w$4r*eN=fH+#6U_SUCW{b*dfV}Y zepw7A>U=>B;Y7~+9oa?Rj6|EDwU@~&z&VgrjLl&(O7Q7Ggc3FKC8kj5ma{LWL}w$< z1$q26CnviD8JXxss8DE`r{IgxJn{`5C=Fu5s}gzPD-p(vRRHQ2`TkgMq~~$~m6#<`>+V1$}3KI2j&j(KKD9F^XGh zg9l%eoWM$tql($%FwJ`9tk%LET5A9C#J_zaEe-b2+hA`|p7iGPn+b*(V~nztqQM&r z0S50B6pZjlP(KFmiBz{RH;UI_9;vwHy}=2_)v%#8kF4AP#Cj(&6ngg;S8S?m8*wZ{ zjeYr|6-f)in{5<>$x@H^DrG42ork~vJt>{Oa)8&Oo$NYHU3jyRvL|>^b8-yC3$mv7 zKP`h|xVOl*t$HVafz;wHhLh$ik9oeTcts^%M;(vMXfQ+<>;2YHX!Fl*YL`W#+DLvv z15R=Cp&w;ZrATR_VtO?;6ngl(r?d#tyfCSgQ>vHO%*NDm>dEY}nv8m$-fViiSC|4d zZyTSNX|7}9m2csNEK%3wYeLA9c=@; zC^yzHBPgTZ^R_f&lfH74ktckGenN^Vx2E)AOA({c#(OJ0WG*^0vv^T(SUbaPFS_K$ ze+hnqxl%gnGUAPT(E`VR(8EznSC_}0A(Wu=ATe zY&%-k#2*b9*Gf4z@ZC(aofB4G_Y1MxL z#%u4EmtK*AjeeMCELOFc*C?$^@bdc>q0o_s&qgo#8yqaFoN@?|Do75WR0(q~#78+k zVJ>*lNgX(YPnZYuMuhx^2pr2he>iWF<(L7`4I1Qr`->BiEYOU1=! zPC}u^H~;BEl-#TA+hAX3A)j4qy%OGcjr`3a7DZ}IuW1&p4BV?e2^3<5`ZpeA_dn__ z&$F)%v^08HsWZGU=f%EUhX;l*SL?dp!)CeaciGM*4nY%I?L)JX@iMz2(eH5(Wq_Dm8T>Gp_K2dKSCJ z?XwjoBBR)|riW|ru(LL$GG%97N_7g#shF43i>b4-B1OxOE`?YF$u2E&m}I-8Y%o}_ z7)*;~029L}uJmp|hy{qtbq_U!GvJg{XAisG6>bL&3`~RLGKKXtF>NHK*YCRB#8h!= zq#5-tTd(4j8$&%~ZY@-7`Xnm$kINV;Mlf!^s+x}|Zc}5ZY0SP^FouT4wAsV%h%CoF z&2{w#)m7N3~i6GKOf6YF7jMe2EYT=vk@%DzSDdRGix z!I>+t%NW$_=hGdSSi&XP( zi0msCH5C~u2#3ix1t2Cy#uq7$Q=}%S?UgD$&ZrSz*MLbIs&It|KMlF5P(0jW9;(GW zN(|6q!r6g0D2hHtbE#FFls0JErgLeJ6SM1gRfU-ugJUDjMt9i)kqnR>6NA4c1~9ND z24Y6bUsLq3s>n{aQSmcnO*(|^i5SeJLr6nRL{Hdk=ERRrg)9Bl()AeVQRz>sM)tI- zJ>+Q{r+hkfHl6kol&aysLWCVf^|1+ek571<2&uh9OUz3W^~)v2XfgW~R~ik4I!2q} zKSS&oaYw5OGso1;%9Yy9VZ|xk%t^JJmx&2lj+x2$E$4*dMJLt5NA!$-{OY@pZemX$ z!_TN9e#USPgyWBX?8+7EU5(6h3HqJkJfBIOJr2(w63?Y5{V-2uc0hejQBQ|PG}uL) z4m4C-_SgTqiv1j_J*!lER@HtUpY}Jh?zhx&l3A=ER~;w8vsWA^nZ;_{R^3Or^k-9N zUrl<+)urG6iKS<|$-YfOdNE0-A`Iuc4f9)1JgFy!d8)cVmDVX@I)7>qi!Ex_K%|}l6Qy}~ z+CvBL$-AVN{B~}1x6-H+Q2Z?Uqv0I;$}B((uirH{tcuCn%_VEsqv&aLHT04D%$!Ff z@wm>cl#}lpAJ zh1lI9r?;9|E9=?Fu#3FQwp(!{586-^+^k#M>>lE@VwXDxCz{IST6egm>$5K=bCf~^ z^OhJTU}YG??jKUj$%q)5)0PBZLu0MPw9#6uw7%eB&ud~O&BKn^RdJA8m1}PkV>!%K z8!>^APDB}Ur4HT0S>8>8#r#5zI#>!@QlC zZ?G`O1ZD#ry##Y~q)ANn%sGYJQ6<;X#Hsj%M;BrpB=lgMMQUQ6+GcKK8JE;HGphT1 z9^Yp6uqU1QrfueY)}5PY*=8o+Q>s3TJ?%DWMWs%g>@X-Bd04j z?%opQe5Nzk7Nn+u{A8z*WrY11H$NLGKL<2Rew?QK#F&Im&&UmB0o-kBni{rkJVngGz z(OC^gO2yy{X~YV?RM?{7G(eL)0)+}9W+xOgypCyMrhKWphzWctGn4Ussnd#`MK@$o zObo)h`MGYpJSMi`QpGthm<`2>{AaOsV2t0bx4iKt`vLr(U26Q^rN-K@-;?VU>;H22 zzQFnIN}U~pUmNjz%EHg^2l(PE3@Jt_3qMCXbw}`{5nbwMI0Nm(keq>N1(CJv7^L!Z zDlke!x(t0dOzJeOdE`*(Q=G^rkxJ0$BVWV5hj^j#!mK8mLM>9vsDp-?iK-L7L#%~Z zqEVSy>cT-6No2z+Q_N`UA(`tVYh^H{Ao(J)BnQ=CXL8pBuIr)pTO zhT3~fwT8#SwMVlXV`U&dLscm#{DSW<)EZWYV^o{ALEkBq4Sn6!* zA}0ApWp5z`sItTIRci!!pCYG8kBQt=O(9}{Y6{a&R8515;W*{7nYhuChMApQ(nu6F zbxUWk30aI>%GjYe)7k>5YLxNcjPCju_9O6oQWf!&MiDz3`3GV>>@n~YC&a{xEZ-)c z#oXRJv5YZ`t&CVN#rM#hxqMiqPMVvCn z9G>7?0FfMw;{AbO;V`i<6>pwmL2Ij&Pm>a+oV`d)+z&OF)fhi#^AuCFuR{*2k+1)I zC~gmX5OsG%!aq>yVJk!@r%zMvtejFY1r6y&&ija1lUE}W=WXQpJTa#R z6=rVAakXMVIkqq;p_hEb$5BJ<0x>Dv)ez=kOv2<6=X%A6OoN3H_L6Ack2hY4$y|&E zVJ1azJU46QkPX*L6eeKS-M@i#FlRn|(Se%hQu$c_~(<{RuOp5hX3E z=G5xoha{=n(z{d#$dhA;oIcv2y)A?65PFo^>*GDju#NN!UzH`cu#Mry%p%y4PnxFK znI{U0owAhYh!rfQnbr9AWV&KWU6xp(xAAXp^9h$>RMOsm=+EH?#=ZHnGAb_{MkVYA zin)++(-^hgb%&zJ8b6q_^_d*w5~n9a|F`l+0gT z$LESXq{*A(X_6S$#8QY6nhdG}xJpZqyX9FV^E%iEQ<3I7_)%~)g=UK+bc#KnjJtP2 z?ro9W4@}J6XlPRRY~oI~&7^yt(7lm0M;f=IpNx6VM9kYFnV(Y3&BmgTR(VWISKTz* zj9j`>OJ(COT%F~tvEVWh>mFhqxo{;}!(@K)Wvh!ys%1uQ97GPWO(d}yg&&?fW2uav zQ}wXdG{~eb!$&-~Wz5EU3_nsvt~FXzW+qwfSlJT?&v0rm#O@_w&reQRZl3L4?(W-~ z0VWb%q(sx?kV`X6@Twnd|2gZY+1zW&2ES$uJ>=N&bHRK@m($Y~C~MsiXu$V|xOuJg zx8b}xoi>=oW{auDY;yd9nSo4XxRy(OP0S#yQdg7I_2WpzutG=Q8rgN1@+K{Fb7mjO zY*jL8)j`NKyv!OBN?vAkPC?nPC~1XXP+~9l|8`*r~wMX%y35=nbIHSzgT!oc5tt>emP@JNh zK{fHAsaaSjqZP>gKrTAQEcU44N?x_l&u~Nd&k(zXxWf+#GdFe_6<2aZPAg8~Dxkqb zF0ND&6L=tICgXb`XB97+tHtv5F${e~J`FAXgq<3kXy8KvjvlpORhbWcks~5By}-G{ z1B>$L=u{fsp=YDS`@hQnr4BeJLjIG)ccsPS)qsQBwS-$vnYa{JsW| zCi4U>qcie+R_S5cYor}OF>||*{D76_Z2-&moSGb2Jaw>5&XPWcd4;1;u65J<6(QD3 zoXM9AyE87sB{Pjf{7_il)%o2|{K$xg`N4>G@^>g=tS%QRj+R}0a(KCRUnFiTtob%E zv%FT|Ve1n4k}`dP-Q1>jR%caap)`t>EQ@Pr+=CcmUm|H(GBT-d<^vXWiUmJKD<_rl zkN>ESt;E4wd?Uo>_pliNodEC!vCKQeo@d)Ii_I`qIep^6%;42+kA9tb6LN{32my!? z^c#pitOF6c;D+#zK!(`&oGN-Eg)36xTObzHNa8lJh%l-YeAd&v6A_kEy`3qyVio#gH#|mW0aW z>w#B-muyOGUe6J)BbK}v3pm2{q#_Tm{b6rHI?6O-;hh(sm!wZ!nsRYzXOVZF7m~A; zWHOSn7)`Inu>VccpL*!^a7Oq(&SWMJ9yZ&_#nXf(+$3Ii?yT^Zk?h4vHu<7bHrldy zONBj8lGi-c5SC0UpFFR&Uh)^^i!RvrE-={v-r}lba7MG1oDW@%v+VjfQ5MNKs2Jlb z+qiNhct8I#afs1nylg1X{U)n_RGS^X(F-|eY*(I(;y*59u5%i5mEG#PsIi}yGCRYk z$o_LI?m}Ein$49K#~g9XnEguJa^_;J{QKoMyRz|-TQ75E#<7pVr!dL%a>SARKb}i| z6mu%BQF&^iUT%8H;fQwGma=`9ZBSzCOEPUPUmTkrw}NR`;!2qY*|v|b*q#!P?27G5 zT*+aZYhN7O8n=?^_?4`=PQ#pY=`|;{%g0*b==Ml*>9&zmR!_aBX)Mueh0?|ZLU!}J7>R( zEl$lx>344bmMlqP}dMYqNv>0;K&8)?LYR z2Ti0TbvIAh9hSOBML78U5vsU%+4ibPr%f(KNDlH!JxgDTRH;)aw%GPb^KjcbR4{i>wS=GyCEyB!Zu>8@a|{Sfx%mb>#D zE%dc-CwqY9#kb;%@cc#jX{;Ve4mg;-Vawg-Pt;NLK}E^GT*p5=2jve*<@wh#@U1)f z1$U+;A}1%gHeXGhn;!n;H(i;&0r>ErhZ^rBZn5`|O=igzoNX;`d3`G{f>VFl{z+ zds?OQsC4wDW?bIZQi4NxxY}8pjohD+sp?U8)AOKQW5dxqxdB| ze*D?El7pJ7-^l{b?JPxh{9R9%m%A|cb(J$O&UaA9pKCdd!0aCAFv4}%l{yy(x4Phu z(6rVu(^^=!`-gbLb|Z4y$$izJl-MW z>$wGd?Ah{_uIZv6fG`(?*iRP)k-&)_i%}5C5@RihK`Mwei8AGL2hUDsG{Vmj*%D#S zXCKe!bcrdFR|hby;p0@)S|~Z2s-HjZvgOHCB5zN;SiZ*P6M4&%dCL$78La!wB9A^! z{6vgA&XE{v9_LL#9_LAvDUX>`isE+JiX_6EmAolbWs4+6DEZ`*<;z_2gpzZll5(ev zloYBh<|I$XQ0+#EDNHsRn;`pel$u(xLR*@tgETLbD3j(Ryb>y+5&Jo!QXT$H zT4JJV=SFkw)XG#M<4-?TUg}yTGF~JzZa%Rua$d)2o{o|8^%7HuS5t|&%RQAm#a*$Dvn~c*iCBnaf)ZntVX$v&C!T#H|4NjB7}_R zzf-={RVnJALe@d}T^msYgPh{|7&Wj}VhVMm25?Fkfgt`3Z@bcfI#Neu#@Ow9~c7fDga0v`7R5aeo0d^zlu}@)1Me&XeP@4(0 zU!p`gz4(0jDp##2r)pVFa<~u+>!PR*aH1De=O)l_!7rB)qs2jquo{qeQXuG%LOI3j zX(+yPDJZ_fGTu~1qbXE_N23wN9C2JC%w@Dbh1%!|C4(x;cux~q4Uz^Y4J=B~jO|T9 z37%3|H)t&{P=dan=uaCdKp&an5#n)1rAPt~^?oDB_YnCz1`^~ZCg&cz97??heNmCe?q=8%a;e|{h%2X&PP;}F?_TdgrlO2sXz!B3GA`uko z&S>q!(;S%>8#%&}K7}M%bOW{ap~FK;%!x)!=ZJX)t;E4^B!PseB!iSBppt}@;kHav{ceS#>og(Ti!y(Wyp+@ZoZ@w}w{tEl?K5}{J{pnjCB#9AC`=45 zw?Y15FXSImILZ)Tv;wA@Foz8cT9?8E33F6pgwAg~Q~r6^eleKrlkFr$%rDeNt!OI8 zIoTUAn#u`@DNKVXF;@(eet04cZQ`U#Vrdhn)1b~Ng`(~lMLm*+8aOSJn3_!)cLdK! zgt-yaxv3GnqqsWwYlbM5fE#+8RnfFGk2n1g-{Xda5fz^pehUz|%|!FQ!evrFjatS= zvXj&l&Kb$TI%cw?S&(!=CCdP}sCW9nY^xj0E*h!8ELN)Br1hvufJifo*;}vVUlSl%s5a4^oW}bT*A2cQI1bm_{8vQXCTf_ zBjU8!$ZC$vRLEq@3sNB7%<h;|pI{t3 z0&OODCFUqxvVo(L0ltXi=PA5PZ65-aOzopcVUkQcfI#MDQF$yH2V2CkixoDWnjrS( zKvzsmZ&Zi`V+qOl=$KTUsrl;DJ?b>)57jsw62H6D6Hz0)wudI*n2nA z>Pg&hQaEHEGz<7)n}FxL1^nIp9L9Ylmau-pK7LHDTutubG4|LspXuoIH?{h6TY_!( zW8}c7xEp>;n@`YvHij_4**J}701lGeCt%fn1vzAB3Q6^~FEF8IT0ha41 za%_wu({Pa~J~rDDP`4IRB>gF<7T;&cxVXd`<7!;a2_?k;oPIxDqm|_M8~5De*+{GS z+$@ui2MDiZkC#Tp>*lW#5mCG)CM-$`7p&uWv!hpwc?PiP&HvJ!I4@L^BYuA`;`iT2{C+0l_koDt z-;elxFyc2AO&l!_cHhZ!?36i9peWpm+tQFkPo?#NxIGx zw%7O28M+kuQHfFu@|#^%@o;eo#vGiBo?sY{PaQe z7>riNyCMo;8qJ%n_!aG)!TYfS=x@o1Mq;(Uo9;r)i$=k1yVu{@fLrF9+ObTZADx0$ z`pro!nwsxgx73mO4tIHPd3 z%#bx7@7C^!q;#|P)$Zq>;8N~!P_*D;QQq=tDN6xauFodLEfI9rwk3it*tT$vxcZv& zR^vjfJGEn6q;26R_bxae^|dD4muwJywdsm$)4kT}GHc5X z*4AsQEq7JNxS%?nb{NF&5H|1l71+^NQAgfCJ^rQBv2U7=x?Vcwozmvwh10?p0m_xr z0^f}Pkyk?xmc$XaKwl*-IjRO<`fMNl#pG+f?Rlc4agi4|TiRF5`=Q6V6xy7zxQL5B zIaAD2_+N|*PUXd%;ag3kuQHV}ru$1HFD#2*?khh)_WwmaBEap*r%g_dKozU@+?;(I{MRAgl;`2 zyTHY(AD^~Ry4#&^`f;houTNVnRdM)(Uq-Emqdsi~==i+VuM3yLIJi$+C3%4;FAVwo zX^W({Kg{34;j$wm|0k4COLpX%7)qEUKW!!GTp%=4u2GeDr{V`LOvQiPk}9u8mG_~_OHh?X468G~ zK~@84>=fZxvH?5?Jom=0um~k|a^t{c#nOl)4p(xy;h%r1U_G3r37^c@xN_0vh*-i` zzeoIre>D8s=CcfL(eO_<|2te6cJ#OIq<`N03v!f>{=&WaHNdf?*M^VYc5KW?6#wu4 z|0{w2t`bhpJYHbYTt)IbZacQxpcPH|wqt{~!D{=l z+Tjm|YxP0*aII^w%D(<37vnJ*6yrt=A*);*tFM2_P1x0I);{<~w`;JC^``_q}qcVO; z=C=P2JsF2ShsnnarKs8GoAHkqhmqB-C=H{$21{HhCo!#}V`C-P-(FL>`u5fQ!_2q) z8#d8GcVUOW3pkp3r2*p146TH!uYjB-waD^R_krl`*4+Pbb zO<{DPc5L{qg?~V6D6x~8YsPw9Yq|E&bNE=OZ;VB88$O2SP&c{uz?+{%O=>%3uEBEG z@G04BhF^)*=3Ws^4o&))slfl_CNxpIoJ6aR%)$$_jC?iysk5$L6G{4~=RQ^qs?JsWhF(R(~pu zeL|){zG|OIX6H{c)N9rbzlGlF81A(HR$KUo{u6lYrN^{2{=f{f1HrmHF zy2du@Y9J9khlUc^qp==+tj9gplR-ArFsi1JMUHbA;9%bdD=!VA!Ce~e(TCS(43}Nz zy>WgEukHw@v1Qx9My(@tO&OBxfpnrxrRG<5v&<5JI{N>aM?$Im#S6| zW6%|}KT=)vyd3uz9=Wxyu3^yK{0pdx{>+mddmlg8Z=s0nCwx%f^72RF%)T|;rw{jJ zC<@B#&TwY`fJ)dT>SGL#U*`3}^-Ll?mzv6flw3>w7iwRExAEMDt~5kY zpO(5_vgn#I+%wIr>qA%3)ofUxo%fSy_pR}?tHTK9Wy4jjg(n7A&|q#IX;3Vm#QOaS z_Kw(J#k_=_26$$Zv*=g1Fv3N<+df`zG7Yy>Br>@+Zt@t}7_7WZKIU+b%UsRvMm2Ni z6Mas#OY%d};$&;%tscIp(ZV*xs>2C}wMluZVW$Ea_^*3X!lf>|%uU`#-rJCObRjV& z!hnT+>`B!mhQq7ZC8_@3=wO%!MCul?d`UD2VZF$a`*G+OYHYX81BPFtPIVNCCz^YN zi)7r|w1^vL&Vi{?)O%**QK9!<@}LT#fa3$9ks4P>l@Fnzb0NzdPI-YQx{4^bCWfa1 zJwW9c&X_rvbt}0ovoYWC0W#QoJpFJ z%H|tE^mZARKQ5n{HuHbIU8WmPZuvCWclqtI%koEz+DC=MS>V$X4A|ywCI-6m=27lT zXamB_#3)y8=YCe!R`Oh}<6F7wx0x}cjbU#KI4RCyCvcp(GM|r&%*Rkr$tKURGlqic zQWIm&_FH#kjG>n2vNi{*jI(#EPfR5-XlM zVyt-TsIlV72*iq~UFBHuv;q(--Zf5q!Z`7?^Dul2)*g#sFmz}&=YKqt{ zfw9&imR>%=iVN?6u&(3uIpHLKdgG)p029dnA4tH9lz@B()t$d|aZckkO}mkb-E%+A|o=Z(0JjHmaECoGIe`}MBz^h^2l9$FAH z`5}`~LAf!)rFn0x=Yz4HcgK2u8ObW9OEcD!JJvHZx`|?$F&BP_EGe4j#-23L0E)2+ z4&>eTu`YeA%Qet4w>vQX>7=Kk165 zaKx)u51*k$AUWdFsJFr>tkuJnm%neLRSUUHA70A1C002c!{E=|aHC;g)dMlwUUj(epVsgY zK^v^Ea;7wVA_D&j7=vIlMeu*`(bKWkG&j>nG-eyoX6x?*zONPN7XU8+;#)Jei`p_< zx>q07Tsl58V@r!$fUri#cV%puaZ3^0wizy4uFID1vdwhaX1Q#$UARlvg-dZ=wt{>e z-=VQ($IV1Smu*_E?!!-CTp_~kx<4*g4ACa+*+OI`;K&Ma0Bsi`|Xw-3X-WG5aAk1;-_!x|> z$8oE^8E~^>osMs>*tP=V>nOGzjx{>Ij$+&ESc1@@yT8C;wu5R3XoPztni#vkB;vO*ec__NGcS@i}SW>kXBDjx;|yLj#uq%webZ=DoE?_ zyAGsv6O&d?nXTjHZrgg0)=5%7e)~b{zgk`w=yMya3n_ z=t!{JHUp*s_5n@@>;;?y*aNs2a3f#^U@KrPU=Yv`7yxVq^aJ(+;`3K}KVTi;Ho#iI zy@1t#`vEHf4*^yH9tSJ~JPB9~cn0uBz!AX3fENH40bT(t0!&D>+vWjg0?q;S0r~)o z0rLQ>0jC4j0cHbk1k42N1xy3n0hkPU6fgns6rcm}44@5g1n^^s1-J~U0DpwgB)jbr zWCHxbrRM>BgpvpN9SR2EJjx&7Llg(V2QIx2;5QHk@E*z>;8zd@@JrM%z%N|-Ie>Rj zzW_f+@#}Wm&rtdRKXvKZ0B<300B^eVB7mQ`^cw-*Km`E&2;~p(I^+TT3*-U3hRO!` zA;bc_f+7ca86^(zl1o1fa0KNH@B?HQ;6>yX;05Fs;CbX0;5pDrliT~A2S_3V_H`ka&{dU47$ZRs`I(Zp%mvO;}* zic>4i(M~0LwDJ@^nBvt&64SMJQd0EZlnm_xf6mbR5r0L-KZ5v#BubN^??HSfe@@X4 zAU;pVA4YtIF8G{8d@X;@(23?;O0Ml(N+JdA^XZVBqn%0Iu8)Fb=}c|eEIm1OhPL!N zZCgUFwrsvWCzUI>H-Rg-C^bi0I!mia^=QlH>J_P|w$uzgkeZo&cvaq(_0a)s>@3%(+yzwlrN^ zHbWmx&DWORs_js?1$wrd#~cjDEOx8ZWp2*tP(qG&B8_Wa=jOROE^-xc>)QT=M7_tI zp`A=f*G{Kp=$qYM?F@fT(YNCHihSOUGzq8*O0y3#FUa(VkY+@tIpHqVGI<)eK7ur( zZe1UBFVTFGE<5d7?JhU2NxVy|nx@sv)Yj!|x31B8IXYdtBL^tAwn5h#^7U$@ZFJ*G z!f$BJ88XQX{B&z~bNpt3-<;M>_#K?Z3|!!+@Q2ep`iV4`PWp}jUPwbZ-K1^RbF{K_ zltrQLNJr_+*LJ9wxq5cGsB@jyl`lPC+m9Mul%Aq5O3%>C(qWVkcUZ>xiGC(2=}#}$ znsu!>F&B?QfgEZ>eS%-LXyk+7u_Ilzw*5rCN~=RN93_3`>t{sjjUx3(I&X0tH&-8p zY{!%gJ#z}`79D7Yo;L-$=4u68)p=9g`i)aO)NDrMfu5~b6FNt8h-SAQWXY~{ZF+{T z2dCs}eN%M3Z%Uz-$>Y-X9aC0l2c~%S15>Wo=E=CzQ zaUnBTtAkaVp5fLVo)y}3k5`}Wxn2v%$}RTfYC(yw#dEKG4&r%-eD1^ZpnTrunXB#N z&mMiB=R@r*_#O8=z~Na>xpti6()Hx5x!NgSvTi*uYrf`(mZ#HF^rEbMtxrA|XU&q& zZoMwctsMsK=`>vrWUbWuvQo4_R-(Qw%cbu|*oSZs;b>Ndc81eu=qIzh+DXal9XyZV z`D|v2el9DQY7!N6E^CQ)0Tpxw-TicC4t^VzG+$5f@^*bXleg<^FWU1mEg_jw@~*kq zJB@fO_U6N3Ow`V0&A_vu_v+Q&Ld^$#&t`h`Af6Y?=gr;}+h(uVb~rvIt~&#xq^@1S zgk-Z9O#_A(-eG(O#!nr=W59#)DSTYDj;)Ew+BeuXr?!A;7c}jfk-6+!$y%~@E*bB~ zV^~fBNV6|W2iW5&Be2(VAq`-^$3edic(Mr`^!NxI@>CNz>=`8RzGnx43m!j#i=I9L zqn>$F0On+65-7^bBd{oIlyLqm2mK0UjnJ>wto;NwW}P9>mvuN5;CR*v0w=Qe5jd5# zo51O;Z3NC_ogr`~>l^`_cd;A5=N+YAbG+H~tH@hHzk0p31p2&-2=sfC2@HDY5ZLMs z5ZLD3NZ=9gW&%6B?@&pc^qwPd$~#KnjJKG;JKpsK&U%9cM!dZQ-uLzsIOlzYzy%@fwh<`HzL83zBD$Cd^__Hr$ z0tB*m(683)0|Yi^pC-_oJwl)_+u;G|&z??TFuRz*w(MF0k7VO&VN_~%AA!Bu+X(E- z-bdg-_HhCSv(FMZls%7B8p$pu@P2kRfpgh@0vEDd30%w`Brux2hrpHW0|ab2M+rD` zP7z4RIZf&o=bR-_mUEOqWlk-D>YP>rwK@F+>T_@kz6DiV+S2zaL>Q!VZM32z>~Cgc}ix5axld55bSH7@-p3 z6oL=*nFt5*yaOQt&sP$lBf<#68HAGv#}N)8>_^y(unnOfp%!A0dEHi7*c#6CoMFfiQ~l_dB=S*CW&+)FMs>L4*K;KhFRE0hkxLnE(I) literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/AdvGlowButton.dcu b/TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/AdvGlowButton.dcu new file mode 100644 index 0000000000000000000000000000000000000000..1da9ac8978e11e4983a91c0dbac359d8fe833b8f GIT binary patch literal 106460 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

e|up@kOj@U$RF%qm^?NVpKK+XVdnh3?yE)HOq7 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 literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/AdvGroupBox.dcu b/TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/AdvGroupBox.dcu new file mode 100644 index 0000000000000000000000000000000000000000..d37d0303780be52ab346ff6a2361385c6c38975e GIT binary patch literal 19675 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 D|BU6d literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/AdvOfficeButtons.dcu b/TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/AdvOfficeButtons.dcu new file mode 100644 index 0000000000000000000000000000000000000000..9eb6131b4dceff739f0beea264c7633c58aac350 GIT binary patch literal 103180 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

niq@vqNM8pb&NJ^f~T9UF^YtmHa$0XL0 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 literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/AdvStyleIF.dcu b/TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/AdvStyleIF.dcu new file mode 100644 index 0000000000000000000000000000000000000000..334e69e488c61bdcd206c6738fd7af7e4664ee73 GIT binary patch literal 1321 zcmZux-*4Mg6h6L9ogXuf8=|b*s@X7CHu^u6>=DId+xn zWD6h`fhxLGnuaE(X<{4i+Y=86P1_WynzZc&BqYSI7vAXL52z|_;W{pj%WBEix!-rr zJ@=gR`MwMgIoJu1EZ#r5uXdvcP-sN0NOsl0xv?w2rj~eFtq^CeYyC?y=`rpf1(lVm z#KuJcEtJcdHZEzhf+yyGdZw|&F6n0eyH`KHsf9*NqD$?yf7G%JESsAzUB_B*#$huB zxpcXF?_|DnOg0E6kFIUx`SiGKsskCT{6xB~N=1koNpmxTP33aA6_P?W> zs&$syntyz1Iy*OcEcfG|$MfMgu{~v}WdpmLoqOxCnCB@tQ?is1RV`sc2D#tXm87TO z8hr5m#UGH8+^)~3B-@#zbg`W}rig+~rZr7h@R5Om#Hdlmbs(?b`I!d*G2-PU-KgMF z9V#x1#4ay8ZRiymT6IaE_@b9=<LRYzVZ{Y`F<_HSnb=mb4y!IE?5Jw!zp5^}Y~)aI zc6Lf?X=epCm+xlyL&01dS(q(0gdx=b#u!8(*`8as68GoG+d8r38uX^WeF`hl032XX zVp2Bj7*IP{IF3suHWEi-z_Ci4Ye_@@NVav$tbwBtc(3nL6qFk%zGI$r6aYeBz@eUH z#152#I1iDh9kW_s7*ODk!?(M>Xj~n=Wj@(Iv-iY)1pQqSwlh|7$uhBNx2mZj7GhsB zlYY9D5LUAENDv9rjceg%vw8lTw3B32HtRn|*7}p0+xLgxjNa&d>b6ksfyj znoX$?r(Sa;SHno8Xy=ZYI5tncz@F;E<0=b1$Gv@FhZ@!es#YUw1T< A6aWAK literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/GDIPicture.dcu b/TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/GDIPicture.dcu new file mode 100644 index 0000000000000000000000000000000000000000..65d7e2b33ac7bbf8f365e9bc9c983d469ee27b63 GIT binary patch literal 8345 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 literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/TaskDialogDE.dcu b/TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/TaskDialogDE.dcu new file mode 100644 index 0000000000000000000000000000000000000000..df50021d26581508c9a7d4280393588bd076526d GIT binary patch literal 2086 zcmb7EU2GIp6h3!ocdupWj-{?Gg0zC90h|%? zthBC=7}kiJjgOmAT`@{JuGwyBIPFwQF*U)ljIs_zLP@p6YN*;zy>5*6BvRE({_>9Z z$phY2fjBX0Q)00ts;>zUh(B|vvQ!8^K;}2SfNi1i4 z*Yy4tb^R)Y-3)j#PUm16I?)}si5Rqq}NNvXD1$DCmxcwHHq=+8{tkr0~f!Xoo$5ekJms`aO3)=i0~pO?v6kcbZn|&h|30? zfq(8^`xTt2W}&?4E)Vh2lJk)DpXauEuJA_(`)Ys4-?Fm1)u&;!Jsj!I~lmoRQUq8Otq~d#Q~Md zm!{dGMv=}4 z=tm-@kujJ@G+5l1yR&Cu-|(|^ohWuDPPY~7=@RxVymjzk;Ga;JG?9!LQ@a!nB7If%}u= aIw#>nk0%Qpe6c1^pI@z+q|dL{NdE$)s&w7} literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/TaskDialogEx.dcu b/TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/TaskDialogEx.dcu new file mode 100644 index 0000000000000000000000000000000000000000..3d23f88a823bc01f72d42a5c2ace7402bfdaabee GIT binary patch literal 8298 zcmeHLYj6|S6~1>@$cqrR9E>5x5X&{HQH%zU6C{%AWBdscVvJ>UJ#IrltPtFIw+%fU)kXEsO0hN0iyaMmIGHY#`)!^*xV_ z_k?G7+T2a9X1AlYz0tMt$Wkh7(PJE8HhOW>k)_CMboWO^z6T*+foJ80jXWoQ?{7c5 z=qp$j3I%vJ_{DAec%LyUMuedMjoZKbqR-?EMg@0jUeFp8c|RYSzSnouf2&I2aQZ|( z(ijTD#$HYoLcxQk-#+fQXyPUz8fHbV`v37R83uSpIO3FC}L1%HtDBKY$gJds|0^Y9B3ex|`0Z49u{sOzlfgx}!m z6GR!oG_)$~&(8VL%l;V+E5JFY*SnhcJy-IO3$~Gk#z17tyFKke(YZiiRAkaVd zQ21^CbOphRb@Ftk!VrnD{jlrWz87!hyajN`twEv??qwtRD4e*-(-`Urhk|@i+~%C; z^O-&EAyM%4yEem0@r8p|{qs@?M-%T8g8ZsTD9lGhfsZEGCD;AMI>3q$>*c*~ljS+O zWtmgpSQ3U~L|CE|uI5>Bs5zp4`zAqw(ysYq4=FW~@KGILJDdJ-}{sST|*X>-!`$7@EiBG1~xlDwc z_3@1m7FQp~hl#hB2%^NZijPFWSU6LMk{h1T$JXYD!P_j!C-S=D97$j`I?*k!mv4p8 z-6sUSp)C+P&dap%(J1RDapb(ynnRHu647ZMa%YVltS4UgM#WGMS#Y%QVj~;e%tjAv zZCnIIO06nHkQ<$%5P*rF0rx#2$hXVQvkrg`x9DvYBSZwbv6}S?p=G_I7z%ccK57GT zON0$~3mn-w6BL7gYS8M=81`sOpqj*Sk!}f4Zs8HW9+o(-Q7%*26hj*;cFWGW`b1SR zr~!Z&3CUK>@W2tM^OkvoEk4H6$jWC;ngf(_N=$6=up8WBD17jnNB-sOQ$AuoJcXMiG=dW*n%wOb4UkvS@{vIh3`J~g}j>ZTN zdHUgB->)EPlmj5AQmFqg`4O%@p6eC)j{xDDMHIIN!@b~?)@$1wvrYaI*`y4~66&-2 z{bf0}sAfgl?XQ5{*^~}dXA}UOcP0Q@0--HR)U`87tvD;r75ip;bPM4y&qhd>oOyJi zs2*2JTy^C)oT64akd#EVYhV8!o4=CSl?8xsI+N^fg1apr4muTSXhKJ?=&Rmg53aYz-4t8WK-=hCrPY&Ipl8P!5I z{`1f;;?>A5XGWHI2bz2S)Lr(wC`Vm0szKF^)}dpFJaf@1ivw}h^D~vInW1 z<0`#e3~81_9jM_XEg}#@pA+WgI~;kK8S6B7p7-*l$Y2EG36mcLNN&^Tc($;nJv3mTQ)2C*~%w^QTJ z&JyxXRcCk%eMWd6qtl7i%JCt~gjF@4u`(OPU~ACJ_t}uC!fIX_Yzzq8Cb?@=p+XDj z?a=hfb(K}=86~@H+QoNC$=bD&wcn^@1)1AkRQ+{wUirAwT>Car0EL@UaHGQQ*A&=u zE682G%ZUysU%ieSly6*9A}4IN7s;%JZ@uU@X%Z<-S^Fb}@VNJ*Fx#J8vbXk(?M#2Bn%a`1h!a% znH6n{wF$%AbD*eJ6BcEJC}Ak?AiL`|fF+sfN&ZSq5Z}-cMLGm&6$wMt1jxUo$x{q! zEhY@MV#46m5G6?lT{R^P)mDOXB~iKhUcz7>2Y*^sP_0RK>ePbkMG))I07y2pi zX}t!?lMG|zbXX0PHyK6+Co=k}3zZKezIudIA->Wb& zVExK}=RWIAj2K#wwW_&OiPG9KLYhFc{(sfa+%Jx@v$;i@W96A1cf3q|jT@?@lXb&~ zs^Iv=ipLAOKos9lDmNC+}^cI4kZ=VuNq+`--vQH6wpbTki z6Vh>YpKse+Ul6P~KYiD`(tFajYap0?-wC?KmKZC^330j0Nrpmywk8&H7hlrDC-<89ZZQOR{pwzn?P+1&|>y;DoP z@e0r}FH?s}>bxcmso=F;UEa8*dmZf9r7{eS!32FWet*~clnrH>HcSUUkI5v8sh6eE zoDRihhw_@*0IC#Ib6C{^!dzBKN2Nc=s)_#_k@8PsdpX{DjT}HC$-1laisZ7$V5#lO zF4x4Hr$MI7J13;;(s7BI>X=KE%Xb0o9Hj>HuFi24I4-qxE4MA(Z!$>&*R`TIRz0X} z6eSlEf6@Y(B)QD-CrjX_E}@?8aoDlTrI77%U3n8?r6|Ks8kneAKe2vj+hQWbLp>cdGM_;B#1q)a z;O80hNrX>U;8PX&qy<0D;O{Wl!r4SdFJ8&0ql(^usj?*BD$Qa1Fw>7p}u_4Z{_O>zO;uqX>`Q ziBB_lr`>$kfKSfFXHC>9yZM|2zfedGRO1&+)Ph24KTP4KlzOB}zPZDE!H9oaNWE$@ zkC#saQKij1q1;rOF;z}gS-|5eSyE0tS_TsfWiwONCFWvE!Ie=j6`HN;q|#igY^tRy zsMpHi#5A~*GEoOi<_^jM$5}}|R0@NMvfo3kEu}V=Qr%@#U@a^Gyo{;=1^1c->Snh0 zQ=0K{Rlm)=H)+YBV#%Q1{K2F>hxO(UCpV2Kn?@A#N0RU{#r#Pye^N1jGTZz~z4^s- zAugup;xlD1fI}8DWx!|5GpXI^X(LsQsLK>(=MCuD>go&dvb&vjQZU5nS~BdS&%x)@ zbO)L2p)ncu(i8Bxk1i&YmuV{*enOAK=OEorChyZ@WEi1G$nYmxAj60BBpJ@rgJc+^ X_mbi7^kFhwriaP!IUOg%B+dQ{A$zZ9 literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/TaskDialogPkgD2007.bpl b/TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/TaskDialogPkgD2007.bpl new file mode 100644 index 0000000000000000000000000000000000000000..b057518f2a961cb4807ef512cada0342b26f89d6 GIT binary patch literal 358912 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 z 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 literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/TaskDialogPkgD2007.dcp b/TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/TaskDialogPkgD2007.dcp new file mode 100644 index 0000000000000000000000000000000000000000..7b1e7c4d6658a9622dd4a9b441658e32ef203334 GIT binary patch literal 353639 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

HbJyt#j_M-0;qc#dPUlP0$|KLXoz%)x zjh(%T^+c5*yrCKeCQcZwJ^RuE!3B2`TB{Z4z9O2Aq79`9p*MsA=WPCLY+D@d9Sw+? zsRP(BuRFBh_C&Hj$);hyZ94QH;Sy$xMhtTqEH(GZixpVgIyuE)1>-Ck%;_*7B(pKl z)b+n;!%zd`vs8v!Dg)kf)2lzln7<{_k98QD=S`hna|l!n(2`ikfy?&4`Kih(K7l>nG zcINHmOkU6jL)NB5s*lav?fjhr`)$LB6zh&Oowrk)S|_ifE?X>aZ`m;OhgiSkqp*sP z2w&cLP1vzHaiYx}8tUzNj4y_z10!jXG z#;F;LqEmZ98J$(?$Ho)nJjvQc%DPV-g0nKGV&zyqk{nTDs%5eg6(X9PyLeb55fKwR zXG~)GfSE~UTyw|71vhD14-Y3k?$Whmm6vTGO<+ti*>jX1XaJ@IHCI$TZd*<;Ed zvlfk|b$Avk8&#Cf;gSRS>T0RKrCA|jW|%RG%q-9Q+^FQLy%y`7PWTeb^7Es};7b%# z>}0JbM4OB=A^ChvSGI;guvbPL$})Oqo~(1YjAqR5@;WA_PQEy$qv7hncXjo{m)rA& zk{re{hLVM2DIHrDQPg08kGG;R6#(9-D*$KA7r$}}kmW`Bcp4Mys2*RoacLRl8%XG@ z2I{el*ovjbHk^YCQ}Fd-%mI@<32b?w`AdKqKh>X3^+z*vnS+leg}jzleDlcZPpfh8 zyiuwpUsP3@^Nq;#Q3zcm@bco&VL8LcUfV*k_mcW5~qYm&^=OfjNh76kB73X+1a3LS->1jR`DUx5rvTt$#2n z13(Ma%DF|T^$S!NRBIPC=;7d@4U&Nm8IR8iLo&KzD{Hm7Bp zR&jCX<(h!3$p+bs?({suR0^)y@Yd8-44bYoiTSLVO~?fgUt}FUlbNr`IvOtSY+gBY zbBipxK|WDp607o*+epTR)^MSDmT-tVMh!%n?yxmmCVLj=$zyxL!#hKbWAt1^$E)$2 z!*f}fzqq6s>-9B;>6{_Y)WS!bh2m_bpSBROLJUjY{+XzSyX&Vd!38;+T{lXrAG-cO z&A|og9#uuEl@hDcN z4;O$+`r~^oSDkST8-Z#9pq4Rbx{wtKV$oJAE$nU!!6at z0m=o0uH4lbHmmR)hn zttNBevGtRBhpaQpvVCB)$$ak07hk&aYT)>WGR>QS+jPM_7sUpxGspWy1JGQP10_ZYMqAn z(Z;6k0kZI%SY}=6`-7WGW$Vn+ECS-5zViC2fq->dagARWdWf~-&@ZQ4Rl4b_O{JGx zXBO$P#Fr@l^HUqTt<%OC_*lFo<~s*I|NSqOPWa-c(k|=Fay>I6Aqh`>FVMYlxpf+L z5mC-8coS>GocHeiO6mPzZL!XDX*lA!;j(p4G|61vV8#a}CNn0J3 z_zL#~&6_>eY2#}IM(e1E`*`E;OShCh2kwikGqIgbe8VA@D@jJhTGL}&7qb$pc%{E3 z5zC&f_FZ4vd-bN$1ytf}5|YsS!IJ;lR%<=aT(jtTi}cMUrulI6rM?!gzr)wC8hhQB zx}+N<>4CGSkJnpF*-7BBN>9{&vRe9J^GzEnEuC^KTp?|+RoXh)medMqt|Pd^`|LeUg+ZGldPqtaAUA>C{Pdy8P7U{FALQ3n3K;GcX+tu;S;x59qq z*+o8I<7)BN3xzGS7tFJ)nLgPdRyPoX==&jh>fW-Ob)s!7M7~sciWQdXviIw z#=Y&fB-5F`uoU{xZSGA~NE0Ntb4fJJhtgqb)*Eh9v_dL!xJ^A_sp56FDTw4Xw<(0= zRkuk-@`~G@UK345`yye<{5!V|Kcb<5uvGLk3=tKEF!*i_jYOg9&!FlYpT$@ab`Kwt zR!H@(Dz*`7oaA<(1bu8w4Z(Qq?NeSzl5W;`dvstG)GXpZyFpXtwkP9^fx#WgxXLgY zdhHT=O*B{%!*DjHhHei+w+mf6%$ko#ZX0G_`0k)WGE0#0jF3^0ErVwTA-f@D=@)hs zX+mt8kgRf$$d`o39JN?cAn_-V=pR9%-b@g9NC=!_(2+cb79VJ)1EIfw&?{b4t063H z_^{GJIGQJplN@G9IwmBYnpYC{7|8l1WW`pfvXr*PHY-<1b4ZfOuCy&An|<oP^ismxm{G213PK;Dy(x9ttRJXoY93vZ_kI_ zkoXuRzA{TMP^z*8*??)ajs=SSlSJWf$W#X=)jAdqCt? zWyme>LM!rm7J1Fc%BxDBSCy7mRd!zcL|#VI8`gr6#{qM2_j1+X6u0+#!@m{`+7iJtU%miMT3U@(@6=t&A z9L|KL5;v46b|{fNM+v+uP&>gFp~N-jtA?|ru{WpIu~>*THhYv!yn;Z{egmnyMv|J< z6Z(YEoS4Sm0YKt!A@N~zSnt9%B`%KRaj{#-FjgWHKyP3mx z9x%NOro-mDhOKzmq)!OQlQq3vf|TDuim9L~JL^Hg$+Kqj17-IYm~PlG?e9|x9yXU3 z+_XuIhBw(Tk_}5YpRBY6*xrx|X(0uLAtq^4>GW}|nQ}?mnD$19sx7zzgIZ0JZcMyg zaO?G;fFg&W$G5=jE7*Lqj+X|~I~ArYrx&2^J(jYs&$n1gEJaeK3893N9_q8SR#GGd z*GwBqL3A%kxsgFwM{yCDa+c_0CPhub_zsS7#o7HV>z=7kiq5Wf8z(zZg{V8I!i zb?Q1QZD|>w#9$O{p*~_?K0(wCYa2!&=voNcUNGM%h0qzxozzmUVDJXZ*E6rIG< z31nRdS$7wlpI=rl$vP-x=?ka!TC9hIoNbV^*C>a^O={t)Y`m*PXGm^wSP13as^S*P z>wYm+huCjG?12%)Ley~~inn~DDA6lk4>?B*&@F0iM$Z%K+azwCu*tNu|X4~o8+*vvE)_4`x@D>Q0@CR zyw8PGu#tuEJVi$5qck|kejBnMuuRp9Mo+=Mhhx!1ohNRf>KGhBtk#Yp_RkRejHPI^ zuILz;3$YkMDP!~v)atGgQu9=@vP}yjk3i&`mfjs^t#U9g!LWo+V{MvcZxQnFnHFER zq1Of4n#sa925voWxqb6Zn}xS*&R#URn~B&=iza#z>Y~Yfh$y#iMjOy%2#>3DX)8$; z()m=v-9j8bEY)eGdGG?rn_;C@lw5h>-zWGd8Tbt*p9c{hD<&a&3C8d%q*MqgnxZvm z2rzQp_KFqV*2z0IZxyE5s%rt8$p;QHDO*dYpOQ}s-&F@m4Un|fdesiICTW=JIxGZE z$sew+?Q&YFvGM6kkMTp8*V7~Pgf;DkmN&Ig*EcIJ|Axu774@=BxXd=S zC1~|R^1Mvmw$kakatnD{Q}`AHPO(u_$Q1}7T|&s|xk?$s<_!>3YnxKAb%Q|=rZJdI z=Z%^HAzNoep`c>JG-~F02=>_=n{^6`RfloXRvMi23qkl)SS%b1LGTr2Gdo0m1EK;p zPr(j{rlWM08r2*ww|QM0)lD&dNC-V+B%!S-h}{mcgSPoQigZ#%ks*zoaJ!I}M@5uX zQ*j$)ZMR{8L?=s~OR)8{okA3yh=9+7_=g2hgHDII+jd#ywwt8jZRY7YFT+4We|v3Z zl@1~~*@)#x>6_9C(}{uxtJ!=AlW}XWRCJ=iD>)8ZrC5tp_O4YbaNsZ}yy4lST@Nbu`!lSa!A3Y;j&{n=-|?c zrn2KXU@>sC(E{qyAye6j91=0mvPox1x`7rw2A3c|Y2fLmki&|sXJYVgvRO{T7DoN0 z4JH$oQdt28N^9)OcxjKtyx4g&X5tFsTpJIQlKIFCXL$i)w1VLIY`CtVsnY5wMox8- z$LzGt|FC2la%!Sg42+@hu`n`j-(h-_v27@w@dA65RRs19Ik~$ZAmKX-C;VK4etg#i8WaPw=`ibOp+V}h~olQ z(Bx|bh-`5}z^qWQu^w8K18OSdv-er{CQo`0--H1^5pb)37dG)xY<+)v5V$G8IR(zv z#AdzFqY~g^0WRcVwxbTXTHwkBuB53g&iC7~X%x;r@&G+ipk17G6(%&2R1yGcN*1b{ zqoP2aE>KE_t7s_;Y-@q5%))gmxIy5m1+Iwa#y^@x;f8>mA&?~;NkkKyu;)ZG-Wy|Y^H@n(<(vG zq7c*+(zHf(*CSCI+R}1?q*Gyd-SSc#Ibh#`ZbzV<>N=Ms9XUa$ZhT>oTOO;HhL4mT+E3Q2j*Df2NR|{yds7r2P z%aI$2X-J^U1X`^m%aQBsu=7_1MTttmChL;r$Ph`mM&MNms>`Tm6bcdb_L!%( z*lH2=wkwD^c4aiN$9%HeR%^xbvJh(H+p6}MEgmY(EdpL7mV@b4(H`@(V}#u)uq6V^ zU%2cs&oq%Dy9B;S|FUL}dDaxd-YKvX1UKd??8Pj-RY9n(CaSvy)wpabggo<+#YA(T zpkaQiyeHe$Voy#){6EXbIk)pxLXiT%)1!9$2?~rkv*)C)mm7rG@DPBqFdVN zETo>A{oG-CRM5bjEZPbxYoV3s6tca73{zFf?BIea#%nI(ln3;b`vs+wQL@Hr-oXir(JiYYUs4Ebs9~$iz*H*^ zw8R4fTgb7j#R2Ifg#tB5sKWwfp>a;JkacH*@N_-l z2|;LAMh=q8%>CoA>#)udOhvp0ueEY(xr)rpi;4@oNkPSlpar(-D>EM+`yjxH6i6h-+k3HW`4?-uxRnm1^rJ#vs} zE*CUey|;A4N=_3HXtnQE-CsI#oCL^%BD?pNjvOX@RNz$!S}BiAq&)frg_XU|*kf6` zn*!Wg0k%;$CWrP|Y&!|wufVm=zGBEhQ=CBsp?Bi#4sznF6-=#RD(Kp93Ts;z746pr zlp#S|n(ZI1-qUznEIO#8|Ei$3vg0WvmvjcBLgT<6MlS*n7iLFRfWoa&pqj4}6ouGw zjmZ~%9+n1Gl}5#WVK^fw9dw=o9YX=KsTvuwyHSw1h=dOj;Mg3 z8jT8q?o%n0V=6!~N25^WJRqn_K!x4z=ug?v6(F9QL%drMyAZB>Vi+j}*MM+-4&lRk zLYS5gz5wCE9KuJl2TVsW`Od-9Li?| zr6Lh(g6?xUbk7SqNMvVh(7+p%bvcy#1tlah$}TE&eGc7Af=)=JQ#(M}m_vC$N6AaW zwQS0vJSZshbk<85bxTo85gHl$jd7Hq*L9?7v~ndcW@Nr1pN{2_V9D26H!}urkypoX zSTN}FP~({^)5=(u7cJMZysNPAu4?mabJJq8qZ(b+B56*gt?VP44NF&|Gm@kYld&Yi zST>i=vNZWog;J3l%OL`0ZDO+p$uS-4Aqp_7zu!+`^@M`c;$+EgwiIM4rh(PwQhl7< z$2xnff~nCaMR$`Zrvk6Fi*bW%1GoCoqW!vIK(U~+Fcn=6K4LpwbX;eTazRu;Wpfqr zaoVw>V>+6N3Jtf}){D$dS2||HWamqZX4oeDLxRa{O>BK#k`~UvVhW?*iuEvzZD^o^ zF3{=1_~LXGfi6%%EO4Pnl>$NYX(nmNY&ki_g|S7of)a+qnBzDz+zi1}fKd*h2ifpO z0BwAo9`I_)xmJNI11HIRJ0CbXT?=%B+y#PLH^4c}1~>|WTVR{d+;qU?SO60&lzMAz zr@ZdK_{P@6#$=MT^$HAZ7{j*G8k%1y@FV?HRFA;Wz)xAlg?)yotX>rdE)BPn_=%?MbMbjN8+2`m*|iM>QNS{moi8?LOhvUe>y*k-`kD@+Dc)~X#R3Zi+w ze#&#mj@cYNEB9j@{gOHR_Uvw#C7SR20WsLBWLof6IW(P}Q&$Ojc1cb+!J-1P^%9Cn@&&G+4EZtjTn%#jZ|-O+#XnL7KO zRndGOi7HBvsp>R;+vl7b&G*T-ky>>%?Jykeo&Ij;v}nH1O!Xp0`^@xi=k&aurJJC# zEh~oebZ&9ZjQ&p?r*n;SR^F(TqYOMxDI{~gL1#_g$dSW0dgPFubE5y`SvuX$xnt8_ zTUBAM*y5a@H(2FpuQ`v$xiBw_SaQ#Ekj`S~qUgW!9Gw}?^M|!L+YF~3m>@>fRM=!~ zo?~<-Ixmd=51gW7b$%{yL?^o%H5BuTyc!;N)QwdPTNunMB$YVqsL$JTYTBU7RGeBY z>yW6i9HDd2(HQ-gpP;iJpVbU^G6*-HqU}fr=2|_?Mc!e8zDiIYmW_61&H;PRur94u3p;^2>m3{ADUQt9XAg}kWSCcVB!-`u z^ME}Z{bvu%*=6s|JJiybU33KObqHmfXOMiO{mSS+bzIJM_Sk40of`c4TYhH0#E?B6 z9qp_ZVY%TC%UNqr<{dcci?6=yri^pX%8~7<=xAq_p#88nek38lsIj zeO>gQJ}76geIWX;JtwEye$}X^*T3Y>Z?`G-4blJJDLKXVFOBNE!Ug!t`23of>>I}{ zXQVT7j@iC4swW_hsGhLykZsebo&W~T6V|aKHT5Q|$PFnP`N1L>GY~MtVV?7#Yf$fH9zO!7! z@I_s4skPk{{R{`=%(mT}Z)M1@%2g-jGiYTQFFwA2$ zJ?e2dR@=QWjAE*wTB}*#q|}*gKfv6Hi5%-;I47+4qX{#Xv7Lo;-1?(2 z-G_8P(gR4JM|uM3Gf0aa7SleYi;?a{>O=Y{(r%;=BbAZvM%st;0i=US??XC-^lqfv zk=}`PC(>O=cO%`2bRW`NknTr%BhrINwa>`?igY5D@@Xk?uy?g>)a%)8Ti0K| z*opTi?^6+GtTH8cT6Yo2-PRlF=|1aqlssS^qGY#q7bOo{TZm-8wVRTctR6}ZSdUS1 z&}t%*H?31BIb^M-LT4%!Y=@}_Mf0T0=B)6-GxctLW^HbjZZzMT@Q9j{!?(xdj>lykFQ zzt_yJ^Uc1$*ODsndpegj`aHN{vj%szzO#ld^)1n4({;WCG+gJa9Inl7@U_$VY~s?} zk*@RAUjnSV^j5vsH|GvWc02C>BNz8tusFu9Xw_dIt6t!XD`!>&QaHtO;mU`mhwXG_ zD7NP~>5^alrMD3qEzKwwEZEtai`;kY=5wBi*y*lQfpK6Fiajw@zH4uDE~*XN8Wa7v zR>peogTIRu;G0bvAmBDx{32y8zhvsE5jtHbM#W$_8-1bBMkmA3HL(J9+ti|4vv0+< zcF@g0j4<~mV15@a7Q)5Vx3;>DwyxGj`l3kOW-D&F#h&(9>!raLB39gItX%VJ!{MJ@ ztqqJ^yUds0pWC2ZgKKM+8q#^$mmKUuG!^6*-6SUr`;bO&|l1KymU8WfpNIW)w_*tT}is>b>dpn!|~R$uaq$N!rbMvwh^XzhmLd1U9Xqg}ZNeDBR~T^^xNCvSa}y;ukByLsdw3GlyOuT8C?z35469 zSCT0UznA#B0%Gji&CNum+}w;isg-R3G9$X~w3!b^vM*saUd4?ovT=JglnT%xPE41A z<^(QYhwoxjUxd4PG0o)h83M9Gm0Y^Aq9=B>VuFB%Oe*$Q`mMio8NE48{n<^>?B&Fd=q6D8jktP> z2MDR$qsn$CwS|93SEG*Ow?)&}c#5p_`tP51wc$#3!{zI`OW7?;SGMw-+AUqaRzJI& zy|BGLn&}H9eerPOyU+W-s=LoUQVff-yE1*CN&oaKA3TCKsgb9z+B!c{(&(#S-La&8 zbwgWoTSq6mk=@?e(a_M=-u;c#vIisOC>5>6dNPPkJ-FZ{J<$4Wb!2jrui3lWPBCOx53}m(ft}7L2L6fM>*}!lU~7XarC8{pLPHTa8*V6haDHE;8Qdr`QH;3 zZp1x;_!PAX3qKnlEwDxCt2^Awh9kl+=}q4lDZ=rY_{|~gw)t_~7l;9Nji!J#|MjME zks@|av&<>k74xpPa5ybz=(zDow>7*Kq21U_5AQ(X#OaSm#x?p^dsq3r9j%_`X0NBw z*Sci(hkvV$6awDhX>Onb%{~dh1n5Nidk5%vV($PeTh|n6Z=?`rkD;BYdFXGV|0gc8 zFXn|KaUGHPmwtchB2*%?0KM7*sP*#d`4QSN&I)qs+*RkYezSfJZ6Gi4J-P`uns<0w zJKH@S-c~=I5FD|iIL+QBKdaheJanR<&E95TtGDP&z&in|Z}a=xT7F67MB!c4?rClG zd+Ix5L_r2=ZENrFHu+Y~cKy9JQc5(fjjO%Q&A#?dU+3(>VwhW_Dt+eQ8TuV^_16;YwjzsNNrw`R%XFw@LuS_JbgerErnY{GwM6 zhs)YmbT&l?(pg!`(npE5#2^j??7n5Tip@%ePDC6ClyEyQu)GVBpt>QUmmWckzB;KG`cd8 z3f*(p2Mu9cbKAgu_$IBxQrVGaPqzQi_x+@*gNfFvO+ms0Qr_VV0!CMgR>d z&MMl4-zys61Ky5@s9MPynh!G%{`8)gsv||dM&D{rC&+xA%O>ym`JqTDLAA!CJu`M;cFy zl%ah5s;3qifhw5(+FyV8J-A-W>V|G_;}Y*eIC8k$-&^%q7tr;IP+;ji8)<#O$TPjs_ z*=wic%4ukT+Cg0xBwAzoD$P_B#V!Ck5d~gkqs2oBQR@;P)1(A}5SR#!}eifaW zU?;07x>9)0f#7)&m#@XM#Jie;0Tb$M?pVz91ko3^)U&Kwu!!-=wE&D$06KrZkm^pr zbsoz?U8zDZT%AQoA+;0L$=s9x{_b`!WpjY?9S?w~zOBRGfg_^3eM=DTcZp>NwV4q)aXqHb?zYa54gBM2C4$aXv}^)|Q9{t;@r7!Qr!CiKAm zw$@r6;q{=ovyY+wGEmK9eVhR_fA+_qviKU?mN6x)zDDTq7%2!~YujG>g|^IfV$N&# zHL|jBm4Iq)>-4hz0~lrrt~#1LGX^WI%hw3&c$Rp4tq7Iq9iI@_U7@1GJWT-mbP)8O~5@c6wnB zLMu1^cmbv#%w72n%8&27_hbYkK*C!5+rLiN`eM9_6N>?;VMAN`Zi(&{AOEF>8FYKE zhUUFAAI?l7>>0UO?x?(1n@lvg0Xtg)?tz{{C=4?-RQ4_5rxJxhJLNliF8ee>pJ^13 zrW4ro3Y<noOX@1>k2B68HOR zND2#bXePl8w$xt-eol@^w$F^0WHupjZL=nl_2M+>NQDDI`CP&qNrLIYU3Y zmwtdqaPz#TD{D}!8m=Oop`6C+%)dx@Lvdh1HgwsXld-_aA*BgkLnMZh(MOCJHwI$Y z63XCED+BRNLvJ(|S|$%}C2Y07Gl+H^gX!Q&ipUyI=t`7BbLZV>T(~bXEk9|0Cc#B0 z*T(;pXonH2()!{nqVoEOh}57uH6nH;(!Ezhxk67eiSHfRrO$t!y!uu|I?cYm%WJmN z%vgiWsx5lUXl59z9>YO7)tMQL$@?G^m#R|`(?NHP`}-piM^CyFCWy(CfBt^UFfyno zPXCf*V4}#R669}}ZhbaV)Dsost9bt!>z2zSuAXQMKB(!#fICjl$besBat38!@M$PX zlk#6ti4C3$1a2UCk#fX5Q4R-iY+y?QS79eo)31Bf8F7Vh3{Eso<@t|=Kigr9H((a8 z%70A~oS1c{qZwRo{oIA$ofs)kCfG-1#LQP3F8R~#cSTB)RGBiyT4>;y3J|PZXW|;> z)Pv+Xll;2csX@izq$m2S?&9BEGB;x5QVw3`_#}dB?3qZS!3t%jckU$14LLUE&c^Uh zktND?Tua$?Z8M4ORJ}4NBWL3TPZFQOv`VmENBSCy!9wRO0@JvO$1^g;x8G^_Nd%{j zV<;>yT5`|!EO7}|{4R^|U4)QGT^8 zdz5}T`g-{0#y#|8@9XjOBvP4QC=VT&I}ARl(D@>9#J^|g2|_Ule~x}SNvJ=8$N!{9 z7t4-4zldjyVYJ(TA}*SndIzxnnLfMs>}e5aS2Br}AG{6N{npD3kz%@a9m~NS^qV`b zUc#1aQ2Guz8AF%Wuzqb_xS(e7{Nta;%2rV-%vB-*{j@xVs{zn_u*!3^Y5cu}SNNb@ zitwdau}B4iY>G^N%d#lZ0r8W;EcLRSWNY$H??6yaQX9JCqvt9kE*u7{Jb(4q_oO4^ z)ko#5L3B#bo$`l=BQ|oaK;|2#&wLz%cyw<}uWMescMBRyCeQ69cI~Zg>*IHg71JX+QSi4#Fh*dJ@3wzIDn4z~IeU z;@N_-Wq1$A{pye3_Z^HlYLus^zI^t%krL%W(Q?vrU+Bm9uOkqOCOA*`t6!QH!Cg8! z(1ky^Yygcx2T`~;fAp=#&=@#l4O*lUsEQ#qVz1$)*fV$Li)vG1&|=TcSqDVP5?#5{1t@=yvR>6`_1wH+N$NJ02SK3zd6~2RxU_cA9U}X zr(n(*Ow-r-Y)3Qv|D3kT7Rs0E?!K4b-J#}707cf;&p&aM8vImK@B`G?XlxG*0T0sd z)Pgfm|J3rHvz(lPErbRN&RGP{!uM8*lBHX_5yP_O50$7j{O07eA{ zMlNDIf$8ws1YS2`ePj8GJ0@dgxLuBuD>3+Og`c`3rT%(sGw)S_9iB&4DRd-@_;(VW zsu~T#1Jt1x&x2~VV2mRA+us}>v3<#6W4y>LZVqh9p@8;L5A?G?GHS$IdEab5sY=q zSfp70__d+M5oa*g)F13kM+1*v&$(9iMl+<@g(R*S-w!;o8Fb+4jKG3otE#R3Z_t zzYba#L2DEylA@Q{`>qWvjFbjrZ2l-W1Xy%?nt5_KCu83FP9$w6^v#JtJ$*K#*4zCPg}d4iczDXu}6tZxF0ZQ-(v|5|qg# zqQ#odBzlBD5v(v6qj!ffx}xnc0Z=#CaYW6n*KyflS z(I3<3>G4B)oT#az)Ba;ZL3@Z&b3CbV&ueTZjVxQaaO$i{nw_3uMtZJa2<0a#3=ImJBuyN3 z|CmD)0ImnE+_PB^HQtjHQf%RLeIgcWCNl7$uZ*sd+xjzI1SnREN!|B6UP{V~Y)7CO zIuMLO!EAvJL|Otgi$IQW+LyuHGuTFwMYIv+=pt)lg+x>H1Zjt%CWk;T_9_Ybmy>C1 zv~&{B{Qeuyw}OqS#Alm}C@)|sFwgnLpL>9%pGu6}SbFB&$eTfsH4m*B0;*NOHlUDs z$|#>wRRNkV#xqAqtJ6e~r9}mLS1nf3$s|9cczdd#fKhZk2#cb-h(NtykSs~+wBB&T zzro#M0Ypz_1blI+!t$g^)#O0!s=PAd6rKH%DTp0Y+C? z)kf9D6B)y@ax@yQqg8P>OmADp9$m^KhRp_aYl1x%D`-f=n4f`)6c8IO8z5{n%^)QT zjWV7$z@Q@y+6|m+pwA%V6i(e}pWwler6oWcgCcZO$CviKcoW6~-hqrZnq;3FZn*l( z3()_w6HmvVcdV5LXbiD>`Q_N-!G9~>_>-MCJWqH={DJE?w*$|9EBN}Au0O*kI0!Yw z)|%D@VxJ>;xdv~GGm_6|ftA&QivWhIC^TD6#K0G;nd(Bsl2h+qf_I=wjQzUn=6M!X8FTLame?^+Bf$%zWg*OTiFzIoGo}@>^$vm`zf}k~lkQ1|zYz<7FNT|~dC~<0+OdDyyJ&8yr8%S`X zaz=U0c*-zXzNC99Vb93r<^4Ku|ECj;Q9C9dt9NG*>MR30vo~8*<|jSyrL{AO@XTQd z#Zrcwhzv%~ULdX{3WJdi3&d49xhQCTan2&53cV_VC?1+hxJm;KFNBn-CY_kY7bwmq zvQzbBh+Z7kmWpDF zh{90q`t{{T!Wt?~T_V0X2Zi>|7fn_W%1})zN*iRZBqD<=(;QAwznhTf=uN}dh!r$9 zPawv#Bj3N27{==vlvUv`5aJX)!nn-(Wx^Zk(HBR+VhhgS$PtPj)&k?3FABH@#6Y~wWG3|LG!x%ylz+XbVKtK%16rlcHzyV{1D69xa zujgP$f7*8Od%|eigGbT+4ML#PR`LOY#wTwQ6f5N#l-Ij>*YL-jj0ENoVQ9k<>qu&R zSSF1kq;dOBf91Vy^drgvhv&Wa{53|M6vU+@1MB5NMp}V)V#QSsT?{OikI4l=kyg$@ zT=U%YNxFPd4jpo5wm_xuTwp6<4YpCv6-;NdDR9o_&&Dce4RUM;u(Z~gK*z?u!kRk0 z<`CA88GuIm47hCno1cb@{S7UAeUesEHth=!u}+e2aBsjH^UqT!>EfdT+NgNP7c4)c z?wH%>nV-D6H{wKx$sh0C^3Zr1s4B+eA3XXKcayf5sVHFdVZ0CeKEXBb)%9)n5=Qd@ zaB^FV-s^tC?)>cD_U? zt&nQqe8mWdb8vV51Hm=tSK`-S2&%P5K4q8y*VU0KJ!86Ow@#h-PNy z1aZ6?!#URJbUnuy#)Ew9S4o*@TwYRZhUS;bJ~R=anqq-Snmhwb*lqFH;F(6V ztH)fvNMf|=P}}Wq2(D$y;9bez5>#`_h86~ACB88)s#(Tq5H}IZ(wAym!}m1wr7*wY zdm5--_@0J7EXLEUhVNfYI`SQ7Fr_ri)%BhC8%xIzz6}z8VK7C_ zg>5@?6CtKJB3jaEuRr7}Xf3WrAGZHQMsW0{_}dS*mBfnbiN)B46DL(Cdjazl+f>3T znmyAd6E^Yc6LUn|H=jyGnCAylFP|Geie7`gtiYNiX8vpB)E{m+yqn$&=;$6PXl#H5 zbP#2FSl0eU>SXl@SQPI>?fDUb0S6&)ZwC%$7ci=+XfW%M zlPy{D;08jTmE^Gv%6-`O7KmY!V<5#wUKll8+5L|*gQ1+ue=s{W+#t%nB7fq0fo_16 zwGpa03>)QC?*~i%3lmJ;m*0uw==_qQ%IuFhl zq1%|zb?UJwvUX$)-K(3$4ZJuahc0zR$C|~hp1)5w$+9(+KI|iwBsfoJFBY~v?LIbZ z?_4T&pFXkrjaTrpZYgE0Y)Ex>R(E!HvhA;}jowvkqt+x2$84SUO{?3c zJK1)!QjTo)bS&`_8|yI?U?;ZCHjCYJ;j&I_{c85E@-|@4HSJyd$3GUm5-DLyDz^}M z2fi}@*oD}UNQx^k+vYP5@P@!z0+vuFvVk`Zcvhnbv@AtqzHk1=1HX@yXee5(y#LNM zrPveNjLnQ$8;e~8pQRnIL>59F1)Hdvq0E5M%g}?4fVBB2M-*5lDsBzw)hp zG&T}@2dN!+($vR%4Va*8_w_|cJur#QHL70Z!fXfr)5{)tnR*5`z1GmA_FoAl_M>Ph zaPnon_kj<}R(exSuOhWw_QBo?tr+cVB8_wB%sH>7C&@mtlOku<5jGSJ#1fG@?0&!q zTwJZi4&h**_MEOKQob2tZ>=?wS$Yz`C$!ENPxd3~r`Pb|YMoMb8pr2G;~4pfMyA*l zy$tasf|i9(j}|(y?LBy@Ph@${Bg)j~gR zQdbQhnVP9xltqJg5mTf6!KriDzqNC!qxndfMg#wEX~c4`&YwHpY?E#Kqsd@qZhw@K zF3lpPaiLHwG4KD@NyL}hB{F4TFtu4z-SU^>qKXQVRDxu2br z@%cYHU#6D+8?`JsjY}9CyBg~BV-d1fs&;{bPS;^yD#k-hyAfry#g%vRG~6K}y1L@u ztS}j8>q|&sL9YkjfH*btWL=GgK z2ZY9vl)~L2OeNkJ)o_--3uqfjlA5;`UXlZ2h;buYnK@0W&uFfOkib1*KXj!U6*GF*NMhkO zRN$-H|OWk`y?+=B&!E&mf1bUydlp*aCCP)fN})F}>IYD6=-0 z=sepK#ZU$AEPyoT_k@kG^#{nh#scw$_W7^EZ?FHGvczbsHXcef%lLDwb}(Ev~e`9 zESX}_H1rt-D*MkyDDiM!wPY+g(eXzq{uSYfb})8T!x)q;mC~uY!U_w;bk@(UfE8Vs zz}UwOBTJk33|lvbwYa>^25nQ!2*eT7G2r8`QJ`Qv?bFrGv{IfK8c+^D06 zefX~~U-ro~%RGN}yf~vrEWXDL*UPSgvHKRC-3mSa^_6&oloZ%A_R?QF1o}(`o zw90yG#z@@;ak)fw3KgBgJ$FHtKrMGhb!xUO4bR0)<9dy0HeG2Dmd`&}p5n}Ty=JVO zXr|P?u-$DVQz}z)jq)^J7X~%C?eGGW$#QcFgFWzBA9fBXod=^52kq;1(@Y}vHE8*Y zQ{eN{v)2(C@oa9(VH`&HCP8DF!&v4U%BAVE6osRYaA=2eaE-<_az?zoSuFXQmEJte zI{BPb(?+cHddsE&MeJbrLAHJ}{Wx zB7Mw(=9y*Lu0uk;{Ot7uzy4}*bx|mxHg7O}_^UTQd4VLAgc4*Mya2%WeQQV@$C#@p z7%{C0Y6x4TlN@iUE)QY1B!6?D%qX`=rstSgTXmU+1HcP<><6LK zFt$i`j&c!7iCgsXwjA0bxj3q*x;T^&@v=UU+9DNmL<#AsL*T2{wf!<=mT`PpwLO$z zpBrtF#&giP>WWaJ7033l<1=&vt}Rjpr}H#ka$8IK_fJKkxo6tIteS`S5Ftw1@-E)vinwn@Mme zD4G2N4z&`CrQlOY>9&;1!p2G|k~ zE1FrV)0nE6)ctwI<4^u}uo(1Vq3`U^opJH+NM9FVs={+P)LdN%sHX8e4z@4>ipmQ) z%vN0jQiINmIfir&tNLBYfv%Yob^2++o3woJ2KP^Y*AFd|=~j%j0W@L$A{}Wy^0`+j zm-0|D>)ezr(ov2y&m6Cpt(>+(V*9`Q{`X()E3UQ#d)k(5k}>sOtg-lNI!I3cI_JhqsZ)$2+{rTb8ma+ z50@7kDpnib5JmLTDTzOJ7w4@VHZ&okg$Le#^iN&IGiiUUZtO*<;Fs18yuG}*+7`{w zVGU?O-#h-%U&zLQ&@l>VKpX z?2wA9ZI*hAORBU`ImSs2o7=|69~F{Ia^vEFkX(Vw=Y!K}l*c5I+5wxT++k@lYHb<_ zOP2R5O@m0@uC#jE@$qq3a@18?V}Vpeo+h~#Ra!#WZUE7?N^6oV0pRpXC-#@)KstO- zHBFj4`7A|&X;M>}yP&hl7nYu={K##JLJya_0P!61-*6X2`y#P)2Cwo$F{rr6;Wnp8 zfme`{1~0e^dis*gXeMx+|K{=F^fKD)KwFtHCJoWCd??G;hisN&r@jg*q#GQSPIi9* zogq>oZF5!H@$Q};!qT=6D+~E?6AUm-+BUt?+L@7)Y3OIGG<6`ahfh|Ll~IA{xlzP2 zw>1BB;| zKjGt5zR+&DV;C(J|9anDfM&pRay8cb0})y%Pm(Pzuv^LtEDljd;jR^u1Im$;LRBgw zbaXa!G&c!G`%=5bqhqYJ_TU5PHDSs1flh`?kpZ(}M=CF(y~}QSmh?52uu4%;*JP=v zWl&c6)|fBuQ^j0rw;VOIcHWr^_M)A;DlJ6R1A|prDBM7QRS@aK^>75QoQ^vX;IJJD zI^RCzv6U@}*e$nbH5jyK51p)oay#7CX4)bUmYO%ik-YJcjx}aS)X;@Hv^A*AF502C zNhgdThp)%&mIwY$Hddk{$Xrz>)Q1Bt432&N-V>D;e4r6T<1(45OzWpfmVqi$FOp=H zCEedczk2Ccl73xLWka;UzH|IuRb^%0l~0rAw^!M51a}B=0Pv-imQ^q}e$`c4y7{j~ zRd&3WPbU);r{+`@vG@l_Cx=Y0wDS|wSAol2<-)m<+OsZ>Im+Bh%`vZnlfLh^qn0q# zOyc2fw?+B&hTD!q^_7QL+!oLf!3%EO0*#|r&?NEnwA&mc6AYbjJF!$F3om-o?LZ;L z(=Qovjd*;*ZKhysc?g=I(OVE0FxN-P@%t`!fy{#H?QRP~CI!)(*)IyC+uRl$wnD6% z-8RxWfe2vP=ytHvb@0S$+>`+D=t;LJhV;#oEcAw@J^N3hK)innOV{r`>2|KgwY{jxbg(pwZJM*UeY+AJPYpSpawU6 z#2S{0T96mNDy0br`@_9`0I(9&D{asVx z{VZx!nwL6w^m+4>N^_VhY5&PedlPdTg&f2VMufu-nJTSpxPkJnHB~zJx%hGj zj{%_S;XD+5mYXVFEIW1x3jiL_iqqEcSPOL!3vn(II_R)8xg2PGRwSy?B-jODpt6LC zqZlAy$;v`r0s-i)a`HW$=s4ihS5!GznB-5ZstTDsI0ew{Rn}E}0ApENW$mV))6h<< zTxxYe)H%FH*P741?jOu`lie6 zAP-cKflu6pAQkwq^v&fQqNDLZoD#-Rw2MA*t8t7X8$gRcaodEgUH73Fkf=T{_{3ez z%<7A)u-PZwRyMB&^L1!wJ&~X?INF7vl*FwS;(0BU?_HM?kEWCELOh1!839=i0vzKm z9yhz4J+b&2@#s0>w&89SJR&}9XAeF60nyLZ97tz`PLAy--9@V2+>iF6;J%h6+;f^L zPq?kobZ0*zs_PjPfPP~viAIgG_S z6FiuZLmC}wl10U%AG__nu^`TYps@NTp0J9pJnjG3ZRt%#5V{tXlT8w_P?&X+i#~Ka zX?jT=5esA|+y$WwlwA4(hVJoo(R37h%%ILbgvTa2V*+7~M$m3+JdS9FoSt^u;_P#@ zuypZ5=mp}aSB$NJK{T^qp%8K__I`{?j%9p(G@Lw&Lg1H=Ft`zu)wufnz{hSUxsMVL z>K}lRhD5BELNrQ&pL3};@G}uklK{j>dt6?xJPmz}$$|)!m~F2uFosC<;ApKFr|}56 zM-7nEqz4g9ECVp+G<4^cmO=h2Sy>dM#lT**EAFi<gvoNKl91VWHPx-0wjb>NG37}DNqJP!HUa35=bQwAc(Z3I3$xWH8*lWaEm2v zv66y?w)Q9ef-A0C>6Y%&Eq=w7uIZMwbW2xU=}N!VE#1;eSNVxux?+WX-_N;xKIe1E zB<*+iwf`)>UY^W(Zs+=(=RD^*=M!##l|_0Ee=fD}Gv--ZYzo^8Wg$k=mSo!$7Mg15 zBmAn6>IbDNwbYNPFL-CzRnZ$2HdXYq3Zc-FJd7Qce_Lpk$Iwz_#?oE`Ej7c#jE!cs zbhmS5VeZRJTbhh$EJ$2)g1ji~X_dmN!-#TqssXRJhi;Vl6(KLtk3N=Vs`W0L%E7 zGdP1nA(vP$UQu6j{E+8&r@~^0s0lI1V!qe}0-$wd6*sKH z*M3%P5T8v@SU4acEOf<&MHmfr%j@d#X%5u0j5ERcKx1|NhUJMn>z3e~0~;FfSqnk> za8ay~K=?ukimo%=Ulf~2kkvJf7#l;?{$NpTyu#9(aKq|G2of?54TXa{xvCsb7R501 zg)|!BE-O1xdvaUs@B`}bWsd1 z0N~3Jf+JnD7NX7+k!o4K0bhZFD2xKGTJkAN4FQp9(9p$@;h*3TV?d(wsj=Kr8a7}s zmP2H6po4iR#+l(yT7sf(F zOyL>TJQJ^~) zpc)Ov_|{kr`YktSZ-*6EmttHCW&7mF>gW zG~_pW94b3uOwC=@*CAu(nnC~K%ej7^@FDZ>-N6?cjN;(yKIwmbH=56X;8Sw^TTNts zMDvg(Jd~Z}Ero}|-?NGA&+lEn-ZT~O)#G)k-Xw87`TE>^8iaBORZq9YpkYa#DlY)$Foc2pS9%k`fL!}Io;sDBd}PGR#3 zqgm}ev|TKX2Jhunz~2?oU>ogv+VMA>Lfxqr91kT+Sc%qbu-c4X_-B6`tnjav)>s7` z$8f5(uvafBe`AO?dma2B3^xCp*2XOKF8pMxaB8)M?^#pi`^=t_hpy*V-)d?DPd{S8 zYJ4vP+l$6d+V66**?IoU0ns_qsRV1hr>%s|RPION!h}PUO!c?1)1~x{rm6I0zj}n4 zq=^^NQZrIZ)#dr)VW(#=>NnZvYFCP|iw#9X)OfUuox;92D_TJt4niL4Wuz%=%+yNX zT59Y{-%{TGIcw9so46AP)_q~jH#5v?V0jo7+z0=(a0TfvgXBSpqLQ9pbtEhX%o zVABELnc{553g3xLt?-If1vw(B)S(vp6`17R`JjzQG$g=v)#OtH$8(CK`oM*wKyY2* zF}nae4`!v;jG`=^9XwGpOVA*}XfVM~r%TvWKbT%nOw~7(>`dj8S>XC}aGkt29`Ixe zMpqOgJSr%j>$Eo)FP&N8zXG>elXgF5wHe%IX2Edip-!D1W8m#8k!?9818*&E1I0ZG z0k@4wK)l+~+d@n@&HAE~OZ|gJ`&BALMCG0UHn$5j$DNOM&wR2QSnCvOR5xNZS z-val>{wxQ3*+wm_`CTOnb7y032lp4ybcp83xBmE<_+&P{5YppHdZnjyTgWwJ{}QtA zp6U>-4@Xo_K2s>GSEmGc_r4ws4*nOwzpcf_KWrcFI)9o?>lFVStl{v5_AXyWYUYVN zf70;Y<~B|B9?>$C9i{kJlw#|?NeBGaAT*CWxEnhgg3?$;TG(Ci7UfhgTeegkFXH5p zPATamE<}fic>Ixmy;Kn-nii~~;U87t=tVt8gHq!?pB9!d;4{%y7<3yy7^D@Z8F6+m zRAeXCco+WuMQc~Lz#w=-9=-s!ioWpr_G8`dydEKzWpF@37N z)R)cd(;8}9;-ej&L_2&ok#!(swF9#)9mW=7OWklxvGwj|i|uk!jb8)fy*KIYt1p05 z%#(_rcQG;V$Yi6F*#P@GxE&}mY@-I}Oz`dX(MdIF$TNyv%yXC%JFc398tMVlr@{1T z`y39LJgW@wd`?yX10yL`|r9kNw34rj`PeKdlOj0z#SVn;M{x4qxQZVa1{QTMZo`S;UhGL$FDqeH zw33}wg>i>s&g92$bn6@idI1HBXZ6}^g%C0Rgi{H7+CVT8PRwxlGwXWPM}Y~YQQtZw zWEBQVNzbG2hY~`!=OJVeLh7<++k`+B>5Nfdzs0yrG4>c#y!30j!1lXfo6Oo|V~g#{ z$jTm9B0PE>T7y5L02#+2V_ViuHW^CEjbaax7Ohj9^k`N&eiSF!+J6IX`?6@M)5egw zx^r%86t^<>C{o;T`ii1G4`zomGfOIFl|wUAuTFsDbKp3bxw7pUI65E10LN#*@mv;} zGggJMQKQejrx1o^Q2T9DEIry!e`^@*{x{fN&f05Z7p%;d0h%T3ZsNCdcz*m15%7B! z{Br!C$jon_;#c9>h?*k;98Z8_)IU@Yf04>}Q1K%-RRUkWLQIKrd%T_Rf5LCYK~m_T zWl7f}60D9Z28{8R7K#$6H&_#bIQeYlp(;Iy4P9xxh}h7I0+B6O3j(Y$mSo-JzcHIk z&AMvJS!cW$nB%`O-wJ^j`Rk3(WzX@G??_xi0&3ED(GTK0Z6zfRDI+^)j(_TCaW@oZ zqwEa4BSRjg-{$-GW%-*~RJ%q52S?c2pf`sQV`ig+Hw!Jfap&1t^ZhYD1*&PpE$khH z2gENl3BcDl!{#DNwhC1q}F?COD#V>E%+>%@klOyM9%((qBWH~ou9C1txnS|)d)Owd=HpdFun?$AvX5zUMV-c0Ba|lfhqsrK`lE)JrvZS)Wf6y2c z(l=-rR^*PuI@1E*AvsXXoz3QW!3f=R51KCRzx-K8(}f*<^+H9ixbdB&-1r+&8oos>?58KLSL92xR0u-eam0iOTiDDxhG-8l zol00i5CLZpEhB`I2>Pj|B^uElS@_@+Z(9WEwYvqdSl$C+CM zK~OQbBJjk33!2>u&qGiPISBPo2x}JwfFb749 zm^wgz7V$6i^D+8a!mf+tegQmi{(b0(#5gjQpd;W_vXmWZs+szOVwhO%m{|S({_!vo zb)6J+PNeTUW(ibN*gYw@f^c7hO%KB_Ix3>CjIU1<$Yj58+gHesN?B{Z2#NaD zLBx6gZ4L=Af$B@xMlxnMn~W-4jPTSTzVC@ziZ?33t`Y36`Y-z({BWo%bupaQbkvEc zMufD}Uk$z3CX`T-x0{l@j5^Y!!~;UsKuA#_8afctTP3LMXuev(DA|G&cM6FnljmKh zv5dU8g|SUqV4o@4Wf(yVhy_Nh*PHBJs*5^6 zn06?73al>%eEI*~!$>Z}^7dc|>lD8$FD?^?D+088Sc)Ksk)bS)#JC zE$>E!eZlW$XiM-rWb!L^cE0ja-U&YAf=6=P4JQo>+SACmhj)4G3q{J{j5B!+0*;sh zN}U4KyW8lT4UiEJ#&dStb##>bKcPCv{~1;qdkV!9$;od{Roq}yQx%7%riqu?`1rnE z6<~8}HxLos!EMnU*bmATi8|q=Stpksv{vJ_s8U_9$mvT6sudWzRXIFy8IEtb!P-}* zCZo&F(A~7_z&sfobTL=n&KCCcZ!P}+E*vCiN1BuHwIo!aI2{5M4!m=io)8QP@bwkULFZyGw-2oYggFkb~ zfTP&*LRx`S48C|C+D@7*X|i|edVBcI$01@cNC64Dnq;<+1fxQPc09o7CRxutFtS_N zbvnfEGsU>}hK{(0^^kKexHYpJGxPyFVpIomN|;?J)oqt4)HU#+SWIi?V~}_`cr|PH z1A5I6G9obQs$qn)O75Q%IjEE7k$V6Wm$U{}32{#s8pssvaZbXU6@7M+9JARUh6=L$ z#t3vHE3brYqDDKx+2HKKr59IpU<0MTc>!Mas6sURRY#-Q`XBsGnZnJZtjW(c{HtLTclOZ1$Vb6yW%l|UC$Gw&_(n(zYe85dTuv&0?~-!W`Cucb zjn{q$N#{*TB~FbiK3D=ln;T!r>E!z0BZM#AS4~zPtt$Fg_0S4%?9YDOS#oVw zg;BP^B&FV5t*U?21tt72`0dZ0A9OM_z56ZfTQD-n|4odGOvaJLh@GL&^WXu#o@6UI zIX~Av+CPn7PYyJud)p|wBOJ}uLImiVax@zYFNKES$J(I8&G0c;9;#k`Y) zsdNbue+b4xY~IuYcyP220-^M?o_Vh9X!gv}3k_V~G=(yoQ1C|BlN5>{ekHV$g%JJe z778mIm%iP?p1NW4m{ZvmITetl*9ttf_!w{6fBLuQUO%5*I&49eQ+=p1ynN56zH&9Y zWLQ3`UM1`mJT#z!@~CV@_C~~4mC%m$M~w2K&@cV&ngyd_9v;hMj!RfOobz?>q607^qyNrNSA@g?;&KAM(ytLDQt@_7H(`lTPV&g ziD*TJ`rb5JxQy4CWhU2*yE9#+pdDY{GLXT0L& zbs@`GP{8sFUScKJvOavPKT*KgON&qYjAQ|;DR_nD0q3mG*j~U=1wUqC{7U$YJq4`4 z;8o78&S&f|VEYPw!nv))Gc^V5V8KrbbLo6v;qd~7prcQyRUn9BS*AjeM&r`BukeHi zmVfE0R7(&VtZC_7U*Vt!h6;!cl3H9E^%b6UBUPGBF;)(`byJE`AtqbQQ2O1;3`oSnBf?UiRR?9af^az_{YZ5H2l_u>`eZ?=0}wZVX*3 zz-3T&KI>}1%-8)>*z{m6S2?(SbT^`N_)vH!GCfqgSS(G*-vsxQ%FnJ98$M)r9q>J@ zvh!*+RR-AB1HSzVRsdGoJ64Rn;q&1LT7mOxb>|CcivT^Oprb+D)|Tw*q2l11RLfl*0-ozgFlFq5biwVFJ)27F3vP3W^5=4)~5LXl|{5O3_Kcjwu-G zrblBkR<#-6;|iQB!L*h$w!0s&6ABipHDA|!c^?3S3Xor`2jzj~AwW+mXrPv^Z7??P zC~{A!+;A--rg?ZeK+^{SI;}vE)4|^g1mHXXXA~e(3!T=Apx++6J&1P;(JDRzR--pO zxfSptz|Sf8STGg`tM+%(82ecic&{nE0uzrLZj8O20QkHDk2b-)+6pHLoC^wPjESS! z)r|eTA4nG!Qjv+I>c!YE4*}yXg`t-O)-Pkf7zFsT0vDSMxQfOeM0EL^=Ye%)2rM`? z1=b~B7S7=nR-jh&`72T6UQ@Zba`p(=k7I!ODoBrG#ue1s&U(?>aexB~JX(RZ!9n8~ zI5`R@w^sBA?NJz_4^{%0uYh^ASliWc5o14rN6lBHfMaSCUAR-z#J^BlM^6X9D#Z(- zDIgUqq`X=lc%gvvHUl_L0rP7ygh((y^+w710WDL|!dll0us_-dgs4IYLxIr8Px({C zzkV2?m=h#s{vm*-DNwGU;!(Ve%{&U&3;vn(rYE4PbiECFti@T1GAUrl7Je8 z5GEE%^KFQ^}ObpIT z7YV#h2lF11ZG9=9*soXMJfVDqlHK7i^_A>~??OR~1XQc{4*&QfLP;rZifUq1?jejmg+a}wFzDm( zJN%RD31OQ;uvo}hyTdNl}WPlpYwYWrBU&Q6IH&$kaM zf7SH}jISNX%U>%&%KwHtMPY}ve)R7as3*!VYN&e@YM$1lJxuXESw45H#dn`Vrdt}? zTj2gT1nYz42g@z&hfQp|I`jJlcAz3qVPWrA*rO!2Rvv_73X+_P9F63lA}J8c&Qxjs zp9u7#iXuX1up$&{o^9y+Ljv(o`4z2Ao>a&|IfWG3!{t7$H4ZDZut4Lp#s6c$(O2QC zfMke1qR{*T;T3^!t^69b6%dXp1iXksijTCLk~pnmS_P0~zaDd7l8W^ITJVci#5By~ z3Nx%tRsT$ZI-??AtHue1n#WO6q6cL;ZLM{<{IFJvGm2uAhvBG%JX!vvMsik>WGjoz z|FUR?!SX>3@0`LL?X_6?!-A%`qL`WvCc|qAzmQuka&@(p{aE=iO~83Y5OJ=S{vQeE z(TXTB$N0IRaEnb`+XAd6PgzA7QEUsqQc@%Z%0QBapTa#`ewIoD?r(Xb!Uj~R=gQ9! zDjBYq6)xRD<_oH7=3^xZt@=&X=FpXnav&d&S2n8a^4IxJ4&j5=2+auWCdAZz5$a`ri~p zSIVzwL^+CRl#;|1oiKJ);VzV4&`9zXNr@tHnA!fH2}!S&zowBDDKfLwgz>N1_)Pg3 z4ZB!jo2|x&s`ywl^Z#5(xLAHsqZy}Y3RS_>aAN*n3WB%F-_i)m6an{rF=L)UI#qs3 zLyAhI4+h1kc)=*SP+UZIpajgymIwYX7}u{9$1$F#NyyA>>F(HJOz$ImY=!~^_zh=f zTsl+y2#i0Kou{8^0J@Hhh`9=yZ@Wqga2gUJXZ|h0tt*4Y3rBVO&W3) zJ5qi`t8PM3E3tbc^6@`243$sNo z^ivYOi7VsxE*rI%3q$!*8RtM5&zr)u1utGs3*Ko?^j^eV)?P5CC(5y`osod}5TjpH z;u!sB6}DsZ=%vHYDO|gXib7Hf*{-jzDzJSoWz*ZTOxF~u-1X63&P#v$D#hteT-zOb zY43o-(|3Gc3Oq+4Iu-=C>dse~=JMj!)#X(E*hGymW?w`;d?I{ZjD{0 z2)q=$rm`jfs6zKphMK~b*fE7|DiWm(HI*%Krzu=hk=T`?rn@D@3>Sr6^|)1eTv2#$ zR=o82TyGM!Rq;~m^Cd|W*I3t21!~*#LdDQnPq1XTDAF-_eG$%#^5H2L*B?^JE%2jH zPv*b~=A_pn7PJPz4RDf9?*}xYput*xv6Zoh4k5cnWfzESbrlrgqX5?_a9DzIWf-7A zfa(<}M}Tl66_7K4tW=N)9M&U(Mnn zgD7$Wpv@9A6HAi)Yw++bZ!5*_q)%bw>33Q2z}o-Xacw6dY;z*;%c(&4^Bvdr5yEzb zfETyLy=3sNBS^o3kVBMrtkr{;+6iN)!pJi*cza)3L(p9cnya9^EiWYrxJLoW@oj6A zO9u(QPr>o>8eRu}!QXavEcSU1tL%`vJKt~MCdnysyzW;paRY>U7Qm+i#O|OSMnQ;x zJyk}qLkgBHBL@L_B2JJeB}7}t500gE{ICS*8`mRaY2$iCF~j~8-idz0`0g*<)XLf;fRx z82Z;hSa`44G^8q18n=@Qw?LaG)OF##V)u}&Ols(-6naEM=hG^@S1dv6E7xoIrxkuK zrY^4XQ1?=S-AmCKg{fY10+zNEks+io^atBm_={ozYOg$4YBkb16IY+0;itsfldeot z8DSB;rtq@mlw;wC#DY^(S*P(kukgYWk2ldnVzpUWnbc4(DAZhuDw^jZvD(yEuF-HW zD%^;|P4^`6rgk%mA=a9@%61L^Erp+rXASA`Z8Va$!l02Zn;7!xEnv7e2v-zV7_Og< zZNh!!wTxU%`b4?fU+&h4P!ow?Ke6osV zC_G(k01}l6ZJ^~ik-6$);pxKmUr@O~L(Z4TVsQ)@7lXBTh03rvHnYLVxJbaa@A^wv z9o1t1jD4~{ABU`*3imFj=hj;H?r=i755Qs#2n#^o(FX7kfa6SH9;cL-kpVplXqg5j zQVTi=Xw-zN01N4|V%N_A95cZ=X8Z*fl=A>hGeO>g6_)1m$G&A_QQaq{%o3C5o72Xv(gRfqov_91(XnVl!g z#6SE%T@2_t7nFYsg1Q*c^(Hi5#p5XAL4cEPu%bQ#a7qK?_=J4giuydjX*XC=Uk13{ z1n1HSA!=NPM8SL!7#$`syH+eG6u1LGp9!G2qINR>9*rV@o0&hVcI_tI$`c=E6}Q5{ zG!C5YCQgJ8cM7%?Zx#R{0fc@N!4++=65yRCSVj}jr|)n~ngnc@36n7cILqAF$=Ihi z1GvWoN!v00yTd+%~ zh|3WZ4mGJAMzBj~34GK9gWS$OK*c*|!mY>xrC=@{rUD!{F>>XGgI*Yc-FTI(rV|zv zwwd7w-RAKAzZT|NYx<`>IuO&nHF*^h%@=u>s05< zGq-aS&Dfy_6UJ4Ggv z^dqUZy)F=AHyoY-Ou1PvR@gIPepA#vdg#dYt7Ni|Q=kv#h;u7k%EqZs%>>#3lqsOT z1vou{wg6EDni+9CYy#@UICN3W#Gs9nigM@y`1p7To@Rmd*Bby{K;Rh)9M7{I3#-$p zoj2^HwvZK!E9|CaQ)k5@EbFJCYKj=mH#kD%_rL%Bryg4fd}c=ZW?jvyW_}*=`@7#~ zUDkeNpU>jXgP3tBtF|F@YzzxM!xF)xW0vk7KZP~bu+Z@__%KL4D?BlVWkJgH9I0Wj zP$L=~#sM$R3|LI`&bR0qK01s^A(#gW+O&-MDh9_e-!`M7rXzH64BKwhYzdtj!}<+K zIXwnXmDaO<-x(<;*tC(WATDD8=aPVo@TPk^lK|sO;si@NWj-paL`i4m#uwgv@c!C1-@tinf@R!o$_WM8c30!PIMe(d} z5U=y&6;T{R2ibB2%;OKZKBx?~izu%HbF(oDdS?G5x;JqBv1P0Rd3y}MQY_aZm$L-oK4XT# z|MER-#0{l{TCPFupi*?}fa@dicaXBV_5xGuuXOoB+D$a4lWm=?3-O)yUi_85kB7WY z-n_Yci}75#Oh?ggLvV!p^5@gjbqtTI7Yk)90w+k6exY8!vw$Jx*t#?v`)?Gs?f4uG69FE{M9-LRj%z@S)q@RQtk2M^Ab+ zp8Du$?Tvfo7MFi7z1zXfdP|L1ZS~+4pDzqplo}89$j7B_QZi#$ye9X?=Q(h&nFXOZv4Z^dgJt8rivscz2crxa*UFZzfj*!QCoG#=Sncf=h}MM^hJ|?oSB7f z!$Ul@URts76R?E?lU_~Vs8^2^fnEw>CKBzIt7Sh)-gn_n@djoluPn7*U{b3ujqj}8D z456pHyJpYx9=d|_p|W43XJ%rjhjVd`ox93@>DJVG2WdfEoT9Jnjr6=sGUO(lkX^$e zS@!F6S0-Y)TO{JyacNnQx}?)7QOBEZmU=+xOSKZnbi;B#wtWer& zlGs0-f4uBcx_emu5~)x zJv}88IzMo%B%%6BY^X$>~AIu^n@HE zbD=ap5^?VwoRDv%t1}hK!+l1SuK9gzLXnYPk%^NjTg+z8Wou@wc6dVZFcsnhM!YG; zn`_^MaYlM^reZjqVMOL(v2CAFW~37t8JRDz5sU8Gv-CBT9){Qg59#I!_yFxiOpY5YRS3=Q#SUj!8HZg9lkzSLDErt!vFmiQpmhqdHbSJwu;ekJx70He*$sUg( z0Wa#DtEKZD6UJJ$#ofV?6)~MYU%J3ZFR~TVs(~~Y(8k)4KIgnOev?&HdVlp`X<}GD zGNyr_+YuKGcx$lAzxI{ZjFb;QEF6l@&eA&P40P4Y8HK@XW|{fIfZSGEZ=`F7Z6I4f zg=`|NH^q18+e=qEXS1tNXl%|4$InBtNtUh|wv7}Uwd!|m)d!a-&YIG7hQrz%vN%JP zrLJ_n;V?d2JpLjo zcP>w^E`VZh=*InV>c;M-Q)4$9>1mm3CZbmef6L(5KEq*(xdg~C7><8@?6zTxZUbfhgivVmDk&e*vu9aGKD@p1hlkqTGj^w8-|c&S zLuMgVx)7p8rDPDaee5ph(vz|1BjcKGAG^m$*N?nKqysraK|9xv-DjkijhrRcFWkn> z#Ib(t!%h`FMBTCFrQ2%6%*(Bn7`xv{-!YP+X>M#j6`&R8tLs)lG#>(VLjAgm3JR_Mted)T?g48coy(1$9M zZ|o7n?s4;+Hkg~vJ%?9MUnx22uzQB$CJIXqHCaQ=UZLEJCC5fMoCPN_sWT0l*Gi6$ za5$5a!6t5~COcDd!mxYtJSz!JBj?3(?vvhfvSiRm&l+|tS#(r@EyqeuI_+hzj@EtU zeI=)i^qgS@xqUtBN=_Sg=cZ@PY`6NTkm=64k~2mcRdYP{u4 z@ns`DRxhk*4*KLt&$P%D1BXwOw{}gQeUm=e%-6IwY`8fVxoV_KbPm<45^EQ&SXEuK zDjK3XTN*KnS?L=Dql_-s;z&+bdXkNm%X}(|ECiZ2BgMSi3xD_vn@=SEtX6DcMv-cEBJ3@u)P$hfTZ1Sc;GzR(vb%Ys*l zmutA)^tFO$7Ft#p<~2U97R0jBlSRqq>&W_jasIK|D+SXsV9KpI$GluHgL;eC)>cf> zcDNbzRzcjmJ!}yMrwit0!H(wDwY8enBn7%a3s#P_A-O8vQ?O>ZhP2`Uwim3Ufkv&8>3Azyu-<$4SjClZR3r+L!%by@ zxu77Gm97+$Zy`4F0KCzBH$oiE<`krdV<;}EU(0XLYV+m%K8BNg_CNpspBDJzTA)3E zVAwOoeqVlmDDNE79HbYJ29RDs>O<-)@%ygjh4PA!UPT&3dIf15>1CvKNZ&%b4(Uat zeMm1LJ%;o=(vwJELwW}3Ii#;4J&W`r(lbb}AU%!LH`ebvg)|@ONu=YD4kC>qJ%MyC z(&I=INRJ_{M|u?LdZb5?wj(`^bUV@~k?uiy2UT={ThINQ;pskrp96gft)N5u`atPa+K< z^_8LjkrpGpmWy^kdKGCM(kn=lNG~JpL;4odT}Uq?J%scE(i2F}BRz%mHKb>eoiz(gf0zNY^7BM4Co=0_irS$C2(qdJO3yq(_mSMS2A3TSyNh zEiOm@Bb|Zt5Yjl(gGdud_am)G`Y=)h-JcuEH}>KkQ)4Ubl3fYlAsvHV4V;#`pIBrK_C5!1&b(|7R2|I3^pSer6eAV5z5@)9!lm1>nT|f zTu(_N*iK1Ja62V+!3)Jmt^}`8ay8gT5-OwQXeds}vCu(+od_MFWH5B149UsRar$*CG)T$m(B=vBE2n4@{mMxa z%9)&FlzBGi6#Y7vbC#0Vasq^MJ_muo2D^}Rl_Xru8KhrVbJkOGEoVC=zVJRu0^uVQ zk>rGZM4lh6qogQYOi6J#PRY3Nc}mK{hbW1KcTqAe+(*fb@JS+%hYwLQH$0z``Qds> z7KG1{ghV)pe$|ANl+=Z<65X0`4Z+rjPg9Z%C&nR3g^!O%k`6DRq&=KOtna9$Iasdo zZ~Tr&L7!(?6xB6fVZqzFavSScSJ%|8o>{kiam^>bGtcNM)Ny8ZC41hy=R5OQb5MjT zFxHY?2cJW0syk=y3CPSu3o_ue zFvD4E)-V6I7viE+3!Yc!kN=3c*IGg>b8|%KwF=i=LMY=JrKr`(mJ~%+)@*G`@sEjq zEBw9BwiYTdZmf1Cdz&^LqudfRH`S8tYwKN_>}YOFbw5L}F$z}Oox-hR5gGg}K_Utw z-zYkc%$Dp$ot7kI8JvQNp4NTiUOCWOuuw?g!G>+y z=(*^o=4`Yuc^w$T-_nUje}~lZ82h3O<0~tdIY#J@<^hE}+e%H6V6B|AGFd<}m7;ZtXzlwh&*u$4x)! z-c4sWcz{Scfkjqmb7DtpWTrjy->S=BZk=Gyn@RZCwshfM+qU?=J4;(fdmzjvz*s9* zQV5X`YJYp>=SQ~|yMdiu+ny)TL>CBW8C`hzlwPnkI$1>BU4Tht>f^L`?Yue@pabw z;23;1dUdJ|9}J*x_0{3~*!UE@5vs_=bBF3pV7z)yU&7l>H+TvoQ}vIdOV)Dmf$i_W zHm_lK&|-@ZQz*8E`m|CB3lhgKOOE;%xa}PIa0c7=!L~H-fT6LqKI?#o>JRu1NM2s= z*-!phbnh7cn!RmQfiL}=RTvEs^g6%6Quu!D-Ju6rD33KfPO6l<6baA2XM>jDGAHf+WG~}+hcJlVvisBk>Dkh$k5+~Z-@8y*7 zlJ($DyW`LcXW;|8vf6ITybHxQd-8VseIF0yecA8(SSas+-}jMF-s67XUECPIQ`q7` zVVA{X@FPvEsLmRksnKSH*n=F=v1NgO-1E zn*+nFk(0Gy)SYTYS9=V7nx(CkE=*aGK^idvKTqCPbQAT+_gX zd55OYb1YUcyB)f})UEp`HbGs-p{|23lDc+&J%m*j;*%6py_8uVlo??7G>5YiQlFJV zpAiDS&VdUtLFa8g__VE=J7kj^d&q(4M0B`RRC>Gu`p)3!0$7~)H+>l(honAZ*_H`%()l|& z%wJXXvn9A1o1eDS=XYHG=MnFVTCy8DQGitU!T-PX;g)Q#((-T8N|qZYav?F%KJ zxdZvG)_Tsr`Y&4Z1qZp&d;jFm9%>DuWZ0UZn-8FJAy11?TV_*M^+r1W`*4%|_ zX}8KrK6vFXmZ1KW(b(CrmWq}8MCa$gg|ZYEf6Z3fxuTD97t+R1&>H{tm5Z%mp23ez zXAC_1F>O>GbzUo*fi5y0&AA7SiXeMH~*p)E0%reZ$cMa0@Z7A zOv*E}mR2tovr!a}n!UxprVd}pqB$CBK!M0%@o2|iey=6CECF8Cd};?8Xq>+N{Q}9~bv-qk`;u*Z;D2i!7)L{tlSS}f_il9Zv%ING6|L3&DE+BO-2l2kDPPO5yavH%Hs~#fP z#CJjX(+XhK%KMiJhze<}BE-tf#zPK-TTYp%D+V*FNe-iAFM@;b;SrrJ>8%zLC^I7Q z<^&SDy*k;mX?5>5JTFBeIDq=r3E*810Ph3!0*orZ$`{v~iH~R?_~`KXJ161X`9N6K znQZ1+e30-_pn92ihX=?XNQ9ykpS@az0ptqo6?zG`Hv`)oBf-KGtj#<=EyXmZyxL@Yx=rW}-Z~bxfY5-Y;2_SA z7l%fbIfi&PA8gdo=3rCJNcTHdrQo2U$-5L5B*$0H=ndrsq%LUh?CjkHIz;^n@f&_9hKYI77AB=sIHE(7#vgG98pZN zNhES;BrZ$o(BT<53ZzNnjH*0@+3MG`Hr>0)ssYD$@XUlibY*z!@iK562TxH>2afC; ztt)6OQyXwTd`h};IBYW2Q@}_)EW+ilO+-w?o@$sN^~o`{Ipe|<9mMt85WF}GzWfM; z)tznWW}06dz}G`DQ+Ww^CLeav=4wcbLh!LI^J=hD?4nP`VQlNTiS8zgsl=rc^Gs0$ zy2(w=Q=4vuy0JKjBA5-Q4}8^_yr`Hht2g!aHuG0gm3YeRO?LP82`ei^ElZX@XV2$o zqOGlymu(oY%fyA)Lbrl^NN>w{6T`LV=i+WK;f+fggh@x&BDhV*-F@l4G)J85fk;D+ zj6#8kClxqmtp}#H#uM%w^>9KA?TFiLWZ3ib#mT+5)Iop4M2`tx zk*IEoDG7*++WPoyLfJoKb=VS&J01`(fyFv-RjQfF;YF7~za=%GH4^KS_oTSm;n1c& z{KxBI^^ymM#IcP=vw_Tg6LA#vt22vY`I}z1KB+j>b%t*wjZe zy?7E7`ORWmN{n0NKVA;o4AD8-Y3RO^iI(F{s4Zfz z$y-?Hiy3ZQa~bK{;>q5&^a%FQrF?5kj0N8cH(wx$eerNuVxwnaSt=CzK?t;NRPY+x z=9a>c4^WMK4fAMhvn|YPj^vdTJ1H@u7w8pL+F_x&lcll1o7>jIyogw(1&doUvlx<` zSKV_)arx%HOE54;3K|ic5E|l~!5u?N&&Iz!T}XcfM@;R>3s>ej}D%I4t2 zhd<|3^G9%UPkYX4ab{LzH8=`o>oBWK!_>};(GW$lt&X1UWZ(YqZtP3TFqUDcQI1U1 zvxaRBUSqyHBe`Ny&(2ImRt9fG%gPZ0d`@OMv&~F8Wm(ylUUw6jvvZhL|7KmjnxlNx zA6}VG&qOP9DskeSBU;I}A+Sla$}2EGFeGnSBXV;_jLo^~IoWwd>;#S(#TO(#4Kgl% z*!C%DBU!y9x|b|TJ~dPQXz^3xc-b;mPGLiudph+BkIK-M<9C0=R+U7G*7vljd1E?O zmz##HhS{N(vLO4^+k7Su8b){RQj>mMl4r)gcGo#9tP*mGy0u$E}l*Bfq z6^$7D^o!b5ZYOQig=3m+G=w=Z!CA|Nj=I@Yw}a*ExUzq+su4^$B3sgNa~rS*A*UPo z0JEtt3mNic0}W9^TmNfx!}nm+SvOHUXAM^ji6#r?VSRMXp6jT(HMV$dZ7N>u^A@5l z*y<`mEDz>Fd%8*-1&O7rKu1s$%N$nUhHhpiRs7}tz z-m6OH0P)gwyshEuD6rF?8-QGrJ=6K(TLr*jLEGxA2gy-W%eZCSEM(?CKw z?DIsn9V$>AJjP?XEAAYSUae(csf8ge?EP*_hblKfSGxBW-n;{z#UdkHaQLq(Q;x zkqF!J&(CYb7T8hOO1&grXtE7${t0t4J&X})a|W42VzuBuX%xt%!sZNe6mYLZ-O+Y({1fnq|V!7D8Dr}de9xd{R#5qZ3&r(LS4&lYN?H-+? zRqTi**5-1wp+l^WZfRJ7rC?mBZ8K)$g8Gu;;t?b5(8-o$+cBbz29jMgR$mEJlOdOH zQ_D79kZ+<|vNJZe4L`G7+uqwI*D=;@>!AZt8uaNt+%Ce=#yE2z&^a2d15|F)z$vwX zxqC~%Iq?us>7mtaXdEizoO)5R2iH@y84u z2bJ*c^ZYXL`iFU}te{$$n0gdQV?d^)&G6v7>?@EHWue63@0^%^1+DU?eQFIs2Xsgl z`jF;gY%FxBU{NfZ%3(Hh%0j)NXj$O7F-|bY)O#qH-5}zNHb=Etavn&6p?cj%YgEf- z;e4!fbO^Ixg50C8trFP!T38dDV~MD>Zs(C7hQo^VYE!O|qn=#Sib+6+lf>nGvfzS^ zM{O++5SMSOtpyY09uq?NBRHvTLP$Ra2RO&Jhi$F~f>a_h1e{Ylg_`CLhdSG`fuaCp z0IjogBut#gdjPFt5vNR0a-bj`Bl^#rJC;w*$#gAVbv8|OC(!0wRSlpzSlGe5iV7s# zh8IM}oBt2!zqB=+1J@(gX9OsYPSVGA29O%qve(tMCO#sZBMHOPT0%1sI!A5;t;U?C zdO1yvzXpm{vm)5Ewbr=|{pTY(WLs;wdLl~|(k}WB$8)YG%R771E%Iw-YdSV{cHV>c z4MbRzv(`H5QXSDbAgWUv`&#*9XeO^oTz^<5rG>IAwIwAYAV-4Z(&nW3s<(9{y1SDi zu33!*)nHh`Ozr4|>6+77iAJKTwXt@NLCJbZ<;pqmq2^-F=kRdMInq$0-vT<@t&xN5 zMR#g<6kT9(_D-l>_p2GJTGT^Ndw`r(_E-T&fHFah8`Jo4ZTf~qa0(F?nQad@0u*N( z3ohnrw?&tSgKz<42b`9kaJ7n3^N=K{>K$ay-cWvm))c_t&9<(Ij3(% zOT`9s&JVjimKo|?e=N&sXo$6!<=Z8(A)=R@bMi*;8e3a_9kh_c#t9>Qp6bHJ1U&uFK}q30vG!g|+B)xD z-IbEncj~1^aV6Zg`l!k()^s;@&TLsC+BV0{ty=@Z;x}`c7nuY(N4H6YhYBEtZpRPv zq`?+ons;os5*dBrhpxLm)HGM#X#KM7DV?u0RRy@5&3JN#F3kJqXIBM9c`1wT)Q09} zS7pmOJm@oi`sKUsy)7=W=FBE6x|5qXBfBc%XsDHdJ@=sxOuT(s_Ki7a6Q4%zyB}@* zWntuvrTvjub}W~wwqf~-wW|^h18hd+Z{p}Z-@;gUZQXJLRWDmMz)m*j-7v3kVsgEdnw&%^iz3cYs$lZ1Qk+STnJRM4OId9(gX6?A_Sdkjti8kD2 z=)l#~0e0rLZ``(&N)}N->L}da8ep#okWt0&h?9;cW_Nw*n}?ScXIJGkDuNv{vnabN zSKenOWMtE`ZH4*Su~Axf9X=3*+cE=e+H=2*f0(iBHmH2fYk<+c=w(!{0*!WA=e+~$ zF9pPiMKs9LbnB)8_ALSOSB-MtJ5a^R$&QV4L*1qFKynvuf}0bSgwI&5q-EY{viw%L zV-;@1CCT>olA#AnAc^|pnz3|QBKHx_8Tpw}(E1>*(M8~Du zaVxwVibz26ssaSrK=b^YE0?cZel}PYXrwF*7oKq@7%MPsChkuhU@w33a}Bh}$MQ`G z{V~AK3V;#IvjCka$EzaWA1k!-K~PPw|07_**k~t=gI^cmP%L7C#e3=l?7RSlt8z>b z)ni>?;6%geAatpjjmq%cQ^8oCvJM+@KYM`fy601GtfHzE>G^bl|E>YHTL29=aNPj= zf<sqg<4Leo;V!v3v!^AwzrD0DD*fLRBFJpfVSJw|~v5lR@ZMm5Uc}z(oRbjjv5AS33!b1S8Cj^!ei@LF3q~42nXz(l@UTPrZuL)#- ztkR9VDA{z69sBD7J6JW!jZKxC`lltIX*>~xR&v8pO%6UDtjZ=R9(h0(Uq+4vW4SV` zwk?T~Vy+PRGJEyrKD@4|sogvYSVi}EH7y&F`Pe%03-y{(RiNda2~4FZ*ceHSMs4rxXjbqG0zSp0hWDfMUIl$aK&Qr34b@Pe zw)sP2`mNTIP^ki#{gR=VE$Nv2D^)z?qdRCmnowQ2iOJy4aJHz zI{ewymJ;e}qd*8(RW`x2q;|Jq zFb}YY1T>^U$^CFosc(kqOc=6l zDV%RM;PO4)0$$Qh7q!vYzZOJBta5mw0rr-__Q#?wY_l>Z>$e4RFgAW@kAmcJFqVZ6!dbTiR}=qUZ@dmnii8n@8}MniJwKCGw?SJ!gvLk8I6h1)NEj9RbQ z0T%a12H2AV!HA7=Ak-51(*o+Ria4NDu4%2G`sl~@1gi=g9YB zxo65hPK6q4hti8sN!Y;S7v+|EGUjIp5K$3XHbkpnmA6rCL~xXo-)XsVTdg zTEYffy@_^0Ndbda*6EhwR@?w<7BGKRo(`jOT)1)Rz}?%SPa1UyO2Gl!Fiz|aUjA!< z{mb9_9^FU<8D$5r-qr!N_;Ud@stW8-64+AW&)wKZ6}Q76l7lt}W5x=sTaTXF`Wtfd z#PHf_2VNd&s=;E2o<1bg$13 z{dJKG^^3RP`dV;ULJxf`!e2C?jtD5MV;qmvsbz?^Tz@4XdD!@;JLb%m#rkWJTY%i| z&W={{rK8=S5xIr2?8L^-ZoXqXF0w|&@WNtS3e0PTJ@UNB9}~;JGl|>pE4JW$0l0ex z*xw33Nh~kX)P&DpR;N1BRF3b8{Lc}HwCuRYDtkHtxidhnR=(SZBvrQqy2b=7=QXtAGrAw>w{Gx z#Rd5PFk^J0Z5{Fy6Xg9ohH}=*M3!bC1IQ8(B3tMVXJ$bAJ4u8L5(hFM?RAX@phOCcNU-;;K3uqz}1D*cL z`6K>M&WB~-IGn3Z@-4zM2j5?DKTWg}2YhX^yMw!ajtdN(Admm$bSA zh+g2ZI4Wg<=;RQk{ns1*;X^xS1gplN=go6Ub@&MQi+{6!)2F8et4egZb&d&)&%Jol z-+VTPjf2O@DZtMppSt;hCCEEMaJ-)^xLs)uobx6`r(#*6K5c(1>e?P4Zw`|$iEVZjncCDtKOtZKG^;1qmZ4& zLa_o34tFfU-V(4v=ozy1geYDgg8oK8D`G_&w7~@bUVsENNS54cs>O!iaY7rxW<-_cS5=}yUBi=_xA+}O6X7{~K z<;)G0#&n#Ubey^ObDYr?cAR-S&b$GRGhtzAY@9CZW*{LdZyTOOB#+349_O`Q!hAlP zyg1=u)XtqdcYxjgIB)n5>?ricxfwVKfinj4=U41|KHGS% zPi`Gx=fpgn6dNUCcgP|nUzD&6@AjD9|PXJ&!*`xuoT|n{_M2Z4rhkz7RNg66USsk>%ymO`g z#YZj&oJD{i&E#h*0sxAg5+o}Oh*@eWNEQJQv)F}>ssd)Vk)#rhdlw+i29lBpWcG+` zJ5^hNRENOm5W-Y_p$B<&-wITPm(aw+Q&UZ3&(Mp_B^Lu#*-N^3^rgzW5U9#s(#2h` zbO58W&j+dsmUNLfNQKlY$ZH&;2iq#hxjr9|3gc9(VQdQpR zKvfWQ*zu^GQyfc#O{%<;(CkaP$chxUsLCJY)ReDsPVf?nU6D}P3UWM9RVa8^!JrCu zjLWp!e@A&MIuE9f@LZ=W^)N4o?%aNoa}-7)q;TW$5N{Hmhb(Ri9^_fvXhRk^?e=qC zl!Y8_sy)oR$>nn17pTe+-K2Tt_J~@-Zr)Ub(KEJhtnl&bax#|J@8bd+TR~( zN25sqVfUT;+)YoX15K{f8g%>|)o zsFq(G{Nd8SpCQL0SANt&;qK%k-;eAL^+%?OvB)8Wf8(Q{sr^Ar&P$;giJ*JeSG#{0 znY@2TBr4{m01?F(jy+%Tqq4x1Jn9eCSwu6T@Ef~ciW~sVIOq!vNL2G~`_U~g7Y8cx z^o=%;zJ4QSz_vyjq&aehiGPuHNn-D**z3 zoYIQe1=_C%rk|di=Wk}8sSNbeJ(_$2tfGN*2ky-T*@G+^?BsW7f^0V!IA5{^hwj>c z`NS+CNN^BkalC^G#M1VszIGcI70ua5Z-!F%LXa(GmHsYF9tbvzXuYWky5IiE7hhc} z=s2RNir1r@61mZZ%!{o(>j}h5&+iD|?LdqgTjN1iz@o-BnQomefAdr}pk##CV8G|A zE4Tfq&B@2Nm6Q3l@g#6>y191~|1-ELg}?a#ax8eG6WbobZpKOnK2 zXwC##6{{44aGzqLh!r4sMz~$o8YZV*#Dd05k0-TW5?h>{mCG+$q4PV>&{xml~t^1p%4)@|V*nEHUr@oxXz@{x@ zN9cuFmw`(QxD5A>xGc=(3~Z<{nO`gilgr=P^SNCvCbpg%*#qg4*P+b3^z|1Hu!Csn zUw`E{#}$#OP@~%F6zHR{q##?)Dzmz{DL^Z-{dIRRA~k+SG9o;o#kqaLkDh??kMGZU z;G#qcwaV=_;YD+x1;m3JLADXx`J?$_defA~OCBI6)$hv^gEDJVb5oE_XO$)&sf0b= zte1rwCrM2Tt%R8VTm;SZxEEff5-4jfUn1c|G_mWvh@ut|cWh(&*$&!Ku2pR&wm7eHG7{IC$$oO1jQKgO9f!?>kl>l z*@%qOWzOhmw+9p*ryN92$LusI4f^Gc6SiBG>zi1e-me@m(+lCup zd4fdj40%1Qev|sZ_WTy)ukXtKZTi1Xe(pv(D#nrAqD~m@FqI0MU<(R^1z{{WUJkO^ zESgJ}U=O*yL`Kt8&G51N9(HWGTKwaFS>nPL{vDS@FPds&UvCN~09ih5u)F&3`Jy1Z ziB$##j_j%-K8PZ_Y`^3yX+)=ae_jO?WE~xKQ&i@3q~r%?q)??SY&D^e!+^=7dk>VJ zax;kraP-`Y1>j?vuJEGYcQR+^c{hEfphp3S0iTVeIr)$h*VV{X-L#ix?<{gN#H8PDRIYniPrP41|U$-MxL zBP<#8lF2<&;cd)^FS_kpS12{Dz`mfE0gm1?_vHE-%+-R|m$bm^XFtE@8>e`+AnZo1 zk(FXRNzKBCu#1JHj}K2j)JMR;;i-qd@Xb2OA=tye7ZPOiup#0TLdwtZkuk|4IUI{Z z3Rj?u1M2H#Af%OinFjr zqLSP`_(w8Rqq$91RCkcw^?%v>`uHk~EC1)d=H9%J_nSAO2@(n_(I8Q<;^ro~fhZv% zBw(ymFUh@^NAt!_ZX~v}QpJijZD~uF*kFy7u2|_xD_yZ-!8KM~v0{rg-O`nA*-E!q z(-zm*Mt|Qk^UU+ib6*ndZ}<24{jvCYJh^kuoS8W@bLPyMH>APznw|zd7l zm`%pYF!A$_;7M)qsK(P={aL8lsIyzVO(uR#68xw&o{GnBPC|aHtMaj2f3^~wzHsB7 zD<(BghAt^}hJ&i%yem;LsEv$4Qydq)`q;5@wF4%rSeZ<45TnUTVlxa3Z^6ZkHqkTb0 zsr1f=ZEYg6oSroc>dgAcNG=x5d#nw$oDZoyjZgXYm4Cl!CO+i0)cLS3!<8n#xDmOb z*0o*ZBGhfE6Z@L52+bQ4(-zV?#3C}M^6z@?g;6bXn0ud6;~z+Hj#|L*pSbay&7UsEo*E;m^=&WjS-+ESM0rd@vSTNi1&OhT}*hswDCf z3FE*dy6EN?7ZxPuVJb*z65LU=zm{gvy341Jj~d7i>A?z(mq}%4x?jsae@O}S!PkE@ zQ6H1`3=2zGc)Ehk;;n-k+`L%(%^(~xE!uubI{02L-K>Wt#PZZH-|ctb@nC*kseMhL zGw4xjoyHPkK9&%BJy4b<*1kJD$~;&5h{d0Uy@nZe>GKOrZ0n@k{lND!@Evr|-SxW8 zx6X;k5fRxlv&D?QCuw5(;tiR#{);Rj$}P>ENd(a@;boe^-TKwyy(QW$H$R+2U4GK z*H$>B)LmNYU~ycqm>tamDu_*w=`0uc1i;6gyyX54qYzGQe(X_hav80nLjl{93E4u& z%4~yRTbg|J$W0Pk!7E5}_Yuok!K)-r7WG-Ymdz0OEj{mSP9|iHY(}%*2-d5o&#F6{ zT0bhJC{9+5dA_28l^UH(eR}RuJ{c{~+=PsgQHk-bV7wK1{A65lV$wfiDHE(NjFU&R zg{|BMcEi#6G#SJm<(BBYRwPUSd5ub-6AA1`es77BU$9n6Os8LhWPFcUydnYU7;~RP zo8|k-&|q%?>!Zmza)ZSh0bEm@!lQIpMMJ~i#CNse8`GEheZ64n2h&r@@7*hPCMQge zo=CVo;8C7o8ZaRjT_bD&m&xP}CXE1{LmI(an$=D(8F$FK1UlAEh7FyRn5T4PAg^5_ z71|1h`IVt=9?I)GlbP~uFn>y@o2Q&$9#r1=Kr=Kv%EifsQsY`?mNN(Hh5p_7;op^T zN3Ta&<$7Re_Ks{MxRoXNRQi0{fI|ryDrOWZE=VC2W27jlnB5{~Ojf^%h~AXXnX)P( zqN>;86EjUUA6h@`;2-qErW~UjIG!#Ykj&m|Ew!=(n0za-@?>Wwzz~iFP zJuYezC3EDEUVJ=#K5dobarMsd0-~Nt>8)sgJ#N&@X`+rHswI`$Pi)lE6kgjbwKy%P zSn#E>lV?e9L+mG7(LaNKK`L62!5$MsGhb>)6@pim%u8=c&x1`xDq51vCUHwzCb-eI zK4UMW(ZhfI=7R(EsgI!8PY7W@p&Jx@DuEvED&dPCLB;bP^4P$*K9N2@5!V;N)t_30 zdN8;OrG)r?5x*F@qMW%H>c9U<^I+<)ki92G_MQ}Np_Dlpf=d4zVzC^t zTLypU^EJYGN=t@0|6MHoC)4N8n0^h?-!Vh_cYNgZht4~FFVf%31Zk9C668L?h#HI7 zOK3=M!%hGGlOwEhUlY=MO|M*93-&0Nx=Qryf+8PnI&=acr)nHnm(9bCs#Nkto6 zMV+8>kBR8CHCT_XEx9Wlh&++%xmSuSueN*W90u8^bh`9`(>bSdz;Rq~G?kJJ09x)= z0$}M*yL#kOBRi5dyp*)z8Nq=@V?9sWnmOkZ1eemZC341`Y`vUh1QzE63$h$_7Uv1B70i~VLAy#>DoujDK${6Y%8k+b(2`3!4I(!&CvzAcO~sJ-MC-N<9T0h~QjY5kNB;ub!c0_CW*-W_d=W?j|S5>?Dt- zGHDFgJFaeai4ZWm8O*%1V0jrj4*MEH+IBBg6R}$+*x^L4iJfkF-2ygkvtW72Y!X{u z^@5=(e<&!QT1ffxgYl+Wt`U#K*pM#vwn2>uW@LNwJ?*{iQ}N)NaMbiN5g370n3B4 z$Y_YoBnmhbC$e@q5Gg7|K0d1&z1oQE)b)JyU^*;#k^Q1&gvKT|u z$=F`OjykQuj#nf94W^x7YDq^UlbNP+^PUrF4eg*{N7EOL9lJaUOg4c@L3(sKH8FdX zk?4|+30^c%l49k%u8gMfxs2m273r;3)Z{~=Z9HVuB&~x773jpMy<#5a5f|&|k5ETX z@22fp#!fQQbq}2JoTl!4g5}_$^!e0nq#PI(e;2Y)pH3BT#Q-XhEULGS4mnPX&sc8JQtK*L)PD% z9C>+1`m5mjs1Ws|x~QE&f0x=h=usX5N4_79dxO~$_dF#dzm&U4<|(V9JhiwH&{@KU zUh29fDQpDg70qg5Szcw{1Kzx)d5~r)%ig1WZp^Z0RK!Eb-(FS`M*gIVXb@3jOZFgQ z9!aOEacoRs6vRlXP4E*fqg>a`lrgmS5wIPnE@N<2O6`Qyx=NQ|Ar2W53%wifM)V14 z6>{{%`gl+&1w~2-H z3N)I<1lVlNC?DxCxaiY4&AED9up*^lVuf`s=4y8+e*~N1j7u?Q7<^pVFy3F0rEIj) zAB*ruw7q`vJUIUeocCumn>ah^P!@Xhd^(iHdbV}*BEWq7CMa9MG@wt2bYf}?C16Lk zlygYtXvQt3WE6coe^Wl%#1cyG(+_6FNiZ#+6c;Kmaf0t6!BZKZG$jaUFHJp`@YSo! z4M*>Mu{R9Zl8=~|GLe_UIMt^;ua1WBU&zm7Mw2N&h5%%HkR)1veoWs3)6C51%KIDU zS8XD_7=h~E$hVQ!g3NwXe-j;|R2yfssi++#hzO3d#mM@Yt~u!!B=dVP_GUtJ8ciDq z_4vT0F(jLIn_wtUHv~gnkDdjywoK?znOR~zvqLbYZcNP3|BUBC4P}#g=Kf1IWj>Z^ zd;NK#Y@XMZjbTIbS(Rp#jxyfQr_aAAE^ipmrgKnA7ShO{_!F^7m%(F%48ah;lI?Ms{gPB*4WJq}zR=?(EIUzXC zOT^K9U^L6 zUDw!Lt0=#`ZGQZ`(7+YJ4Q<$ZZWl^>CPA=uX^WZxal-Y3}0Dx{peNV0pZA2V2gRgtPK!|F+YZ9mV5i4PCvS9Ocm*x=KA`!Y&6{gq`4z&V^o@a$D2oa$%<5| z3$al#!!)+T8?S#<5}wyq>Et(2duk-%98g=&pXv~1rwC& zDUm99GUJ3+nrr(A9=xuE%lTaV4w1> zH$kP4Y!OEx=@baS#7^v$R@Q-CX?E?%N|t<_d2yxSOBOlLqi(dYpO9iB_^a8l zS`7C33aH>qW=p-`Wk`>P7va8X0-LSbuvcU@iS3nE!Hwp9@#YFNRQ(w?&~P?6UJN4$ zdokFcfvr@X@Mp6DGJ4!ZZUc;e0>heJU!Y8a`~K|zE=zuJ<^#xjmh)=h`d-sG(?~~=HjR|WGd88byjAQjRg|YOrN~LMnvzrK zh8I|v-S5yJi}1&r^v4zW<5l`&G5$C#8>Q%6#pjir1<7s7`Fh;cHj30XiqtlW)HX(^ zw)DJGvm&+aIk%cp6Vv|{+VsB)?f{zhFVUv|m($i+{3iDR!4mvl3`p()f~HX%Oa><^Pa?R6DCs4q95WElOkOgWO zTrS;+lSV4G(QW5>aJ&N?kF(ZoaD;jdvr{H<{Mvg2Pty(rGL?A_KLvhga#om2FR?Qn zxbP@9Br|6=y=fq~uLs78jub&A2SjQna}bjwJ-tsOJxeZJQd0J1PGE9OFkw4~nUw@l zCO!OWTS4wBY&XW$Ef&8=xd0#x01FcC82O;6E|@Ls4pSt)FY@VA^|>xPV(1%rBmrCiawo`fldDGTpPra_vkP7| z^1|B6u`{88_~Mprs7sGPZ_cWkTYzS4}> zmG%d%^Tl(2z|g;8&q%3@Fdz67mp@5y`EGQnNy@Kk6}zJRO!>=)wh3EJrp2`_Nf}J4 zR_s%@<%&yD>b_UE(lrF~e8sgrN%;Vr%2T9+BZud_@6UP=Gc=Z~y7cnYI_dbwVe4Nb zS-VCoQyR9tCfDK`PEvLxtx&8}wpzuCv@IV@SsvqmDpQszTg@ShtJtMjT&t8+{7SRB zmbsKNSCf*AUneZCHkaaaH7hRs+G}-faw&dSi{cdA@X*ert!BN|HRe+Gxo%*QPTE{$ zZY9lqBm1@6;#%rf7P@buLe`wKy4u`|*ZoO`Q!TD8x8ir-!f;-TYl~ZnxHnK{YqmIC z<8Eb}yF-~jWrGk;xs{C#O2%n7-WgPsOD#7j)>+Dk#ZpWfZe#kTmNo>qFx%7u+9B~X zZskoxJ?mDw5p_a}nt`ZpM%m4yW*};s7SQgy!FA59{2Eaw-AaFhQZgk)rBpK+WxtVX zt_X0jnJBW7F=8nYflfZzMQA>(I4zV?u_PcZK3AMPjetb!(}klisFwDxXnG zle+Mt0=tr6w$cugvSh{Hao4T#C4&^aK*VHs53-vBk@3xGRGD6R1g_sYuWg|3Dhhm+N($)()kD#M# z$nj!hXAL$Jw)cSwrEk!v+9BM^WaS>z{!%S}8S*9ibjiMA{Ty<*n#H&eIh67Il6}Q` zH*(mjQ4mjWvT`4QFIl-5paGzky6;yMdh7B-QUF`g-4OCKB^?2uJ%V3a$4@$Ct2tnG zO(rYj$-9(UTE`!Gyspl*JwmTU#wBAZwEY?(AjD%Vvr%a zG{ogenp5ep^@AZ#g=56BNhFq}nbBZ2>?tV4f{wt@Lwb1S*ZTGt3m??N+nEM@=*hZO zt{q$uLuNtnRemmrEiBSQaRjkd!!A(-xttTMoI5m3 zh4%D@V(s`K9rb?a)?%uD_UDLYr$)ug_Q*4JYhA;#9J zlySF)F_&>P4`m$HP*NGU=T+E7EPFJBT$G)8RAqZL4A11FkJeSYMtLT8Ynjv*(PWw@)$Cdnjyiigi z4J?r}EXEV*62i|CIjbQ!t0!NmyTx^ovpNvNY9EU+!D2iqv+81LoQp*aF~p>X;AuSd z?Yb)05ncy}v^p@(7V#RGVlkeIQv;R@$QF1CR*_x<*yRlQAIgUO9Rh2T|Iuv7->sn} z3GB@#`KQGqwlYMfhLGjIJDcR6E0V!eO~x4`XuI+35tsxz7FpC!AOU-t@=+|Xltq4; z2&i*}D%DV2PR~45*X%mVo1TlRj754T{Zcm#7wmB+K3Xi$5M~9kni5(l zP)>d{590Ha_$st;Nk&~v6qT`v16d@zr5Zw((eW&j(K3++Rg`{a6-7Ong&cTwEF>sn z&t^e_K7q|ZT+=~P#Gj=2^*ROOM^m_|78(Ra3V4V!o`{}H0$8mh5nV!-QOs6>q_I>! zaf#R!6uV6)KSFZA&gO)Y-Ot z)R`*KrY655ANlOkP*Qb9@~PG~#Ul1IZ5z=La&?X|Z96EENs;z0K_JKTP~I&9i5U{x zjReHWJTeHj#=%T5%r=2>X>nlIy&Wi|NZSR<$+rdpk(N)0p;$y2L+lWUWW><+(;!wo zL+*@^Y-7k_fuyvsc!5}hEEBt95jz-SR3IoV&Et<)2N-fseB@Dv+$)e&Waei_yps&I zFCJ=wq4vi^If_Ug2L#FuhTInoj>QajFfMK>!ySr?Yh}128jiQ!=bx*)$u-UggcC6X z!f1Y`4SW1qjOWwKXQ4Yt`$xEWCf78&(pa$wS5?z?qw+}Ky zut7t}jo=uwXjcoa4t8u3QW+W>|+a9MD5q>5IDYS|3WaC65aOWt_dV$NOej4Kg z2bq_|>etD@Ixbn|Y@`$rWI5m#b2bsoEV*E&>QrDBk18`4yt)Kc2B=I22f?S9C^qR7 zNG+OTA*B=%6fSW(5OJ3gW>8?#OlSFkZp$SFwf)oyDsCMpCV$KETS9++5oDE)b?7l&MJvgJ_)$_HuCi9iIR?~f@I_Hmok5b5eEw&={T?GgMpQFKDCr8pFk_VJ?esMe?pNbi!wao||d zNt;@)XA{jvQV|5vZNOa*bOioD(W$6v)!9kZ-U!5n7KYEXQPit=>gfNX$fzY5KXf=&VgGkH?d+2-oH# z#5kz^Yb~0H>LD^ma~zaImMpWh>-sC`zokXzY--i{B^@OW#)fk#E}FEdS5L=<&Cp^6 z!+5AcN70l`UHUi2pD480&pY{8NvJ0a9d`BO(O%oO1XrbG#UUS|I;$-1KVVYfC zFf9j_DFj~qI|?)H(+dpKZ^~^{ozZw*7Yq&-=FSkE+(3PaiVM$z-K-e7T18*xlO>8+ zu~@Wr9@bh|Y***WCDbEv%a{FRNeYv9$Uy(mN2%zOt~)ZXS9#d+1U&*&)UQ zWrYjuYDp|#5b=2rqslE@n23r`sTh@`u);2>Q0NDq;M@%ze5f0kEU2`b`<9^42E+3j z!%h_}jVo+j78O@%BQwew;Flt(M+=tO)n#%)g?6Yi*=|hSCMCzRsN&zA0gE2LtaK4POf zcBKcxOf6B~qByZ|U%_g->iZiw#diD3f>yg)Gd(M^8lo~~sxX$PvVyi5OBat(Y?g8h z*4xb{Q(QTj9Yd@dBWhTk%J6X0SFe=Q7k!kC`qL`Y9r=TH z_0s9$a-B+?Smg|C%im%*PY6t@8TlQE$LwlpblG_Jq!Lbej@#A7gk)OA;#eQOiz=gv zZtT=J;W-hd;`uzUitTY>wPor>96RP2kLt2oER>ViHUG_P`=IA!{4}PO%3jZ@s9vF^ zp-m|n?}SshVb5v1S}Y4oi*2-+A0dr&~r9^k@N-ox4@xZ9G4?$9QoZtDyq6Lw>S|!*~ZcI1I4*`syeQF zh`Mpi3JIk#keQ2D&Q~PLQ`|U`){ee5(vrKtVIK2E`KydIBT6@-p37P2Fi){{Qe+m( zPAq$8uuv7>_N`)TRzzgDWmyn8oV#f+`FKvH!#va1Q!te6v7DuevZ1TYhiUn8g3e5+rkRrH z%BgplhkxT{U#YDAoCb$FN6tw+vWVJ{v)W;H1~Fwc{eZD7r`2J02I-ObXu*C`D}dpX z)8;TcgE*~TkFmB&**6mvWgs)hpMXNx*N&Wk!@NuZ*94V{?=z#kspqm)N7NLO z)95?Zh|Dl(^x)IkT~T#F%+Wz~3W_)|p1mom=vp2Uo99QfBT?0+Md5PA4=&Y1*@F)A zERX1>k?G#-Ee>gEiYrCQT-=?#HAM;)dW1BqBVFh#UjhtoXDEe(Nwe+~A+_W84p$?cH2!&-X0 z&C9DPMn$DQ1h+6$W$JN&uxM3g{dbT(po1pS-3ya+ZgHZjr1=_9hakN zxcY9O%2H2~`kA}AcdoG}2qh#EE=@fpN0l&D#i^%BiY%(^q2Y(>3R2HF)NH*55Rr#h z<))r>VBwWTlLuMmALj%?MzTcod61AP ziP9MU=<$@P=n*KIr0PV9#fedhG1L7DQsIf|@f3$sYJySNs$(hcxGdx*eKaL4iiM1= z8cWG^qPm%=qMZ3hQgWSYhAb!=77nEpIAKsyge!Ethm4sGA~t9rOeuDn4azt~RR>Z^ zofz?%9Aw9fVYBQ{DRWBe=t#`KRqabzKuA^qxvp6b_NFX!n(LZd6MIrBoM_1`l5FRZ zA7(VA(y3<3#ir1z-6>0{Ff5zVQ4A-^aLO`gtnd3!F!GvYuns|vAN_V`k=Mcy(LboiJqjDxwkrFG^Dg^V$8M83A>-=R&V3x zzC<&SO|I>+U11%ryC!6tYbdtm=r-#z*AAze!#jkojF^+N*tL`532i57!}|7~?y02V z1X$k<^>vd;yAxnr>g(#xC5_4rUE;jFzHTCEPXc7qs^w>s_9ozaU6XJ5nWTLQqONPG zJDs#Y0n*n{cPi;X0%UbV)5)ZR)FR>tq9M@L6CMP~c+#N+B(2>YfgmiejuS~oC<&%{ z^r{r@{o$ms*j6b&fj5+Nl=PO!gN&-$o^*^9J>zT)PF_sB(Hi}I+mepUs&IK{&+Th^ z1A&gNq!Y2NxMd9t-p+vNYiiPXY+q}wU)6HOqCnEg_^662*C(BdZBvL;ab;W5Y3D=A zLyIr!4f{h~{*q3$`?iufnyFFVscx9_kkYx|^I;in`TO7h|E~o8R|5Ylf&Z1j|IZTW z+L@%JR;Jo54u>n%2RLSRr8WQ_0c-_41Q-B32-pRPivdyx0rvxL1>6U?9S}Efq>cja z0XzaY3OEk98*mbE7|@btx9kK=1Ka_)0B{J<2e=(D0Jsfs5O6EtHoz@_I{*g(cLPQM z_W^DKJOtPUcoa|tJOLO0JO$_nJPU}6KT;IUPrGO293jyl^mje0# zy?|c82Eb*2ZGcMw1Avu)n*b{Sw*W2#+zz+^a2T)*@Bm;b;22;r;4#1gz|(-afM)?S z0n^g$mNdXhKsTTd&;i&0XaQ^k`~b-U{1vGJypKcy-b0!I@48ZV0{j`02lyid1Mm*y z5AZg`0q}cQ>IA^=kXVM@@)l$c@E=GD;5VpYfM2^({Qz&GegS?3@dNx4(g*m3D|HCq z4U`Swbyw;hfSfcq^Z;H$WoOzgFCtlh7a($g=OJ-`=Uk~3 z0EZ!GfM-!$fM-xzfTvMffTvJefFGc=08b)yfbXGv08gNN0N;gJ0Umdyo&;uXEe3cP=>a^1`UQ9pr3J8{xkmt}>_`J}5^xCc9N=!i3BUt@X914` zo&h`wcpC65;3>dKz>|RPY`bL~FcV?XzzV=)fL_3(fU5z=0R4bR0J{JW0d566 z2)G;Y0N`H0{eXu6_W>RS+zU7kxCihw;3(iZz}i*af%+a0qY^a35d<@F3tOz+-@2fa8EF;2FRG;5k4)pd}aG3osL~4X_xn z6>uToYQSZH4S;Qc^?+S~KENSBFW?y9GQe|yO93l9=w5)!04o6N0T%+c0WJUx0G0s` z0+s>}0Tu%e0~P@810NVg3 z0J{Ls0uBP60o)FF8gM7zDZo)c+$5B`A8;IS4DbZtalqq%CjpNEP5>SSOv^|81C{|E z0jvi+1lR_65HJFG0B{@Ne!v}o`v6A)_W~XO+ygiUI0|?Ia5vy7z+u2Cz@31(1*m_( zGQc6gO2F-aKEQ2&t$i%Ito$$fVqHvz%sz~ zfR%u4fc1c_fUSV50Rw;yfP;YbfI9$vfCm7*fJXtB0iFb03OE5+3Fs(7{R0*QE(BZ( zxB##funcf3U@72Ez+%8XfCYdD0CNG40cHY@1Ev8^0J;Gkvr+$mnSd6+V!$b=*#&@; zfR%vf0KI?{fU5z|0{Q{Z0B!+14LAgN3UD9bNx(6{aln&+Cjid@9tX6d`mL@s>z9=s zPU|AYI$^agK7Fb3)ii6G)t`kEQEB!FflT{e55TDBAb~v|Tr+1?_IYrnm{r;D86t4N zGfd#1XNjX+mk zDS=IS4FtC2RpbDSQ{X59*jrFcV1L0<0tX6O2^=gKC1$4!4iGp~Fh<~P!3hEr z1*Zs{E0`iMS&&-*FjY`Sz*1OAz)|QU;4ZAEguI2V1bl^+1R4sD5^ioGd&>;8fu_fzyR&2uv29BQRCyrRZrzl>{=2EV%#$MVSPOi;4-97A+)D zRqrLGpWQu#I&sRSZL+X-wb+CyM#(N>c6 z_M)8xb`#kUmS zLVTt83h+7bO{O8Q_)g(Ff$u23L-_XL+l_ArzHRsh@dfbt@GZcXhR=d;5;7jgcLd)k zzU}z7;v2-*h3^F9e;nU2d`Iz(;X8uw5Wa)>4&d95Zy&zB`1ar%#kU*ZFutAmcHkSr zw;kU$d|UBt!56`|311gJ6<+|KAK!X>ZTMR8)#IB&yO_jx4&Ma6v-r;7JB{xYzLWUI z@tsKWU!*8m8%y91!@t5iA4IE9US3<@q+(}EIPi7Fc};IhOT(I4U)`GW`c*Z)Tc2HG z?VUwFHBM39>+j3ye0GV_;p9t%iV{q!?&;|a_`Bb~aCab>MB8*ifv|fx_*{^#6om`$ z2bX;6o55sbuNnJoU)K}vSat7YW~iX0al@_f{+F-u2Lp7;9X4DBdTFQ6_mZE#+dx+b zf<55?yFV?`PUt5Iogre^s(row{`QRrDAc2e27-Rv`L@E}-O(8c|A27W0w*nd{u3c` z1VUaseTp#lmT)96aP)!qLN317AkaZh#gL=U-`N-FBg8BbnO_MvO3_k97%_a9LR?k# zeQZ7Tt9iRd@ypA9`F_>%S}3)OVR-!C7Oef}5Y`uiIE_-%(+xrLGJnZ)*YyaGk;T*Y zHQx!PaSqxQbAKIs^NYcxl|9`dwY#6{BV_k&R{L4TQ>&W&DxPIvlBSzEL&;UBxnK<{ zGQ9Axdyzs%m?>C2m1SQ_V(y_^Xja%|Uk))x7wL zQm(}6MoSMPn45F-$01u&Pv2O|t=|nfak4njA7B|wVPrf&OM>FzEJ1T1__dr{d?+jn z2#5WHHJ#zV?*3*$dq)x)Wj!`kqiWnM>LE3McY9#nm4CS&sC8<0N6+njXs`~ploa{! z$OXZq7GBEwS5I9ZbggLeuJpCE_}DKS_Nvhzp%i$zH~2ffot-`HUwm%iXee!YgRkM{ zhQ_r%Z}m#w_qP1DB9zQ&sGglUciKX9`6+VR*Aof12Y$W1@ve}&x#i~Onp$s*_u>nG zcpCX(l^vk`q+ywzeE%pPPEog}eq%{6wT0cPIOrR|p0~`mzW*+A%F&PiAPZ`tDrieI4N~fH+{Fa{I zmey@TCzA7A&f3jqFMZ`2H($N!rXbviM@7MnD zK(mMt1Jg?oAf;eIvH_co#Nf(L)Xw%oTV0xk9q1>!PlEf9Nbn*8XE{eeFb z0{6Weh?cOw8@e`(#`kA)EUG;oYtkHxZ9LLry&n~e)e6k;QPrzxXFOeMnNq=NG4x^JgBdMRp-=wtW33@)f0sAX-?MO}>@AD}yz1Dy zM^i`#bqbybmttTIQ@UA+j4P(E|l51YMDwK+br0<|9%6NQx zh%TGfs=7~0V*_qEXHAZCN)G#XkyQCFjfURkVR6~|D~Xlwb)lzkg7hS)v@ZLVBQLKA zIn*GQIx}y3>0eP9f)}E(v%2&sjhP!iol7s@P`fsAXgbVF?;y2zII-jngMuWR+knd zbQ~(shPf(D!L!(l62=zE3$0mSOKc)4&-U{3j<*U=6Z4ojl&5WGiz>prgv`*>^&{gv z;g3y6Yn&XPNx1UxGmUtzN|;(Ru63S4w#yPm7P95dewy@WW%xe-xAU(q+cBRmcRhn9d z5Gv@ln7%5E^|%cQ|3VifWMu3iosm%6L&~$ZG$BW6^K->gy|)=w6H7m-Cik86z^1Se(H-qv9?$0vp{=$rD1$G;fHQ+x8R3v>uzkXlEqZdNJ*&mw+JEh`tRE3rC|&+6sXr>vHtq`rkk!wf99>b)4f(aK`CKZ1N-4S z;pA(VS+BB|FFIyds*>D`?ek&x7%VhH*XvLgXWsj;vea>J^|j);jBD|j#2RMQdz6yo z5^EnGn=VYn)plE~bcx@!=~1lsKm%5bz$*326*dzqdNaJ%iP%FTHeQ;LGNReLh<*j4 z=igZ2h#!4eM8{AnM@OSY+)Biqdn!pTg|jrt%Z-wta`8KJ?9_0xlq?jequrzADBg6$DG!wX+h&P@FeS*$`9FW=-Cu^NKb9|{U8)_3Ln#LdE6rYyXPl#h#)@hp!y zWu_&N=p{(>nq)am=^YL$J)L(}@W3OzW*%HEfyt#{vcffDH!?0Uu@jR?!6YUlY>)wu zh2YULEf0rHYh5sYq>KoSPU;wZt^}W3KG5qqs9gJADP6@DpwTc(anb8|nSvAE-;KkG zj}72;6?k>7)p>c8Yw_ZeW>hnn&XKd!C7c!>CC62ogcw@g;Uz9!VtP^&xos0kT{vx0^|eUo zY9#dJqjEwnQ$p5K2NJ5Ug&^=Alqs1mk&Icex{(L&72tk&+S=JFnBa-LIAVdR2{s=G zo0pH+T85;4V@_(0oYWj6sX5U}?Gs7GdoSmmn@Yc2&7RAV z245sd|Nfd$>LT0+>=}q_9k#lK7FWcoxaQ%BuT9p)?^)+5m!{NF8T*)HNl^-$aKW&a z-leX(`aY%#6~%f3E*2Ky&N`--6vciEt`ioaNp-v@A$TK{s|Zf7tL=$w=nPaxg26zT zyrR}#Tp=vb8Fj{^BqRiin`-27ERoB?fTt|vB+hW1J!5X5Ru5@LYJ8YkI)`}Y) zPYH~1N9|#I#w4Lm3zUAb?P0seVFTujz|hUBJpYI7g!`8V&R(eHZN<+xEv<_S8s$Pqo>-2K%-uS~- z`xYx$IYhXfjLyT>5KS@eG5ajNhdC!O2k0#c6=%p z?OWJtn{whJs6??v@}hC;zJ)HEB}x77@-4L497#CYoG24Q+fWJA2Aewx2l%F;H#b6WT6*KYf^hNyO?+!ikau*s4ud zUs7kL_5X)m$z3-psavp3iZ<5{0n+B$VZaK&J%F^i_BbGIu00D#n`+Z^#y8hy z0@CK%VnEtly8ti~uo93q*LneIb8Q14ZLVztq|LQmfY@BS6#$!ShXAm-b{GJgYxe$`(JY@+K6& zH^2Pa`1=vgdxt^n&V}>ea}aOq0M=skrFs0V`vYTEvay(lLSWNK-{)uF6QBhu!;|^Q ziCLFSvm`xRA}x6wUWt|SKY#hQCSq@d{Jf+7;e_kW?H$q#4C_fIw<5U| zLuNlD`5ZVXuOASuifl)?LtAJ+k=hCi?jCjZtf6N-=EBl&6`-Ef)Vm zeiW9@tH;e5BPvW>aKg7&%4%%}xAW&Ii=AtVjrPf!6}%l@ zM4wwI=iXJyU3XbZD!K0N(KzHqbI@8icvOSOgrWo$;y&$=ld?F0#A#U4~W<`V)+_R=~8#ynvFfT zufS^x@S5O7(ywdb&N^0bMM=ejL%a0A7PY?3tF zGov3&9_67GZX=&oC!cJOjG+5yQ}f4UGM+s__TYmC+2b0SgO@nj&f`DufI;$ILBhEt zr&?JOyY4Yap3q2=M5QEW*cs8+?l*|OrxCgIDoVCG8P(Un4l2BV`y{8}(|Qj>MZYkD zoy?fl<^<+b%+v!>;Mwx%5fhG_#iQLl9Uzgv%I*H$tuO}7FhslkP2(haCp4KFO zg>d}nh925Wtv*r9}A6*wH zsr`1#Ctay`*ey4?Qtz}|Zgi#IW4GMkO11cz6W;k ziu>`u>+Zn+R^5sJHTC0v&CFEJg-=)7l8dse=^yM2)Ymafd6vIpppSm5K{AwQM;Xe= z_4*dS>u&hz2eK_3v+dTjSvP8Hro5XqcK2r@6RtgAtn~(yRx~u$wytD5C`0L(3S*yC zq%*+xSZ!YQQdx+ejKfy6cI@N~CV_DhQ&O{zF|h#IBzZ zB=vo3VFa>GDtv)my2eAN!A|HkBz6`(4nd1dfbra@wizse9N7}^w3lV{_caECYI^|N zjjo`lU+z=-E_?d*SxC4nOUA8HI|l;c`;-BWwU%Yd*v3xmcDhd)IIGOn-^cf2-lu$lhh>;bb(JX97dbZTVz(|?GIZYG_Ds#Ji!XN9 z3vpB6EiGM#Gv>qkslY0J*5_gUNP7Pq6*jR=~UzOi;w62F;6P{>`QDUu{#aHErm znz(K-E?%#`6J#m+h8)d3k#2ri!dcba*t)8g?dF$GBE+1Lh6?q@+jc+7J{ z(A`AVEXm-Ore}Vqxm|#~A^o2Zh4{Gz>6k(a_sXzy3zwby&T^bvAU6%|0H^Z{9lzQ- zps}dw>SeNVGq27{IC7XnIZ`kMw*#lvH(dXJ>~xz!=1yj1VbwhHrZ8 zJJ)LE!Kn%M3#UeK=mxj+_-XS2K`ftKE!e^tqIfn+cy}%ba9pmsuLEVqkTMJ1#!4&a)wuRNvj+8R_5_0B;6bHOb~s z>|qn#!G&(DYyI-p-VT3%fNoRk>kkjU=D+*{6B^S|l@oMhhsaL}oh!v=t6y|CS>W~P znC5dHKPU8TDQ1lO^37<97#;HmqR5gxYTOq8Pda;%*Md7H)ppv2*VBy~#BS3L9=tnz zWd?1Sk3wQ@$w}WMe4NPP01EX!A@gG*YhHxE#K-zJ2ihb3fxpIQ%;h}=WUQYt=7i0E zudgwoBQeGaY4&&$dZQYIg#eN4+SdO2V6st>cX^9~_}z%z{_MrbRi`7%QAtJvyO}GV zH>mP(v_+U33jjs&a%CD$=v1gjF95vYN{OJD5!MabRWM?DcSy(}hU)gSH| zM96g%0s>mC#Lrs%L{HQ=o62Xq!~rgZ(LUdQ&AIZ<5bYjmW^SK-kx$pKpUcfZtBs#F z+-|xsd(HwJ#9>*T{oA}Za1O;dG4{6{4MPRf?d!N$HLSKj+H~V6n-Lj7eIMNVTxJM| zFq`UbUhAuAX>4W(%y>YpZ*6^z?|C|L#-6ODXhn-|xGa=X+j4V_cV$g8Vl4dNj}@UL z1g!McwLDI=Y51|Ge%11ozLoW>e5s#75PRO0qOaR^%l);XR8XvIY_6?t_Ia=WB|FiE zkhL|wRV}{er|7p6zgrrc7(X}u=BR(z@p{aL+g+8$57%BdVL7jjXLX{8)7^s*C;NY$+sYU(vjL6*Fzp zcvh&q&7tnk{9DnIP#Vt#ZMQ)X%dnI73)I%U@L^s{Xx5r`oLlT}=>Y*IC)J-AxG0pe zCeYo{fC;)k6nJ*r*G2`#aXOs8t$F90U%4(sd#&nv+9Q1zOuYN=p=8L29_Ix253XJH zLdc2C+^n@+H|oo`rpDXko1*Ho*Vi^)&nn7MU)$ze^DG6r*R4UDX|DA(UltC1A8C=% zNF^xQzwEB|4hQYpqvKIfU1%eL@EV$xZ~XX=9zt*8Q%j<#Uthi>h@)K*I`>BbnhJCf8qa2#x>XN13|&`^xj|U&F~y zI^aeJ--z2ceqZwgSO|UI_Vz&Mr5}Isf>8GLfkE1Ehckw{6945r4-G&?@gqf4h*>QS zeWBXU5TD5OJ=!?h6H3-Zjo^R3zxy*N7N?gH|_m4xfy85wGKB$JfnC4%+sq;pR z1RA6M?rZ(mH-(bBHZ)$3ZQaPt;&(naZaQWLj!=@?X8YwudzWL_(S9BM!7q-GdN%ME z|KXltEVLN``q|I)Yo7f#m=-do<5tLK$1r!`6d!(Sa5w^m;j6F^mp|Y5%z-ExF{$N4Ra2~ zL}Sh!*ovI0fkfs_Xvx1pk*TtY{g@kqewS+R&p^h?k7Osm)msS$Avb7QN5?OBCQq|C0 zcK%MD9CeIOP=stb0va88Q9ntDEE&PI|Lrjmw937M5QTCCv@Pj|gwGP*)GF$6?3m9> zz7)e0ErN#6orEyS5fZ5;9p1N#P$pFZ6dO1mAdD&NTnOLb;hHQ+|MJPh^FRMX8*(Ov zW8+kaZOrU@iEw1_vQxDb$Jg!0fZg#ggvgN*b)7wE7~P?l2~!#mL+yJF4l%Mh+%Y0c z*U88(4RpLpfiyMa$u$QyMKCzB&OUBV5QP=W?N>1v%0HbW{x`xHxknr=_iqv+Lr(_? zIt_4&LJQ?k-cYL5T9w%SCMF?)IZc>6Jtp0hpkkWAW=M*iy;uj1N)7{;Kh#hG;I*Y1WucZ3t~CgS)^ zHKB022Z?S$T&A2(u;%37B=QU6l9Q3Zi5{AU2(6qGjV8_@Rusre% zR!;e?#FR}vy^&r+IFArzaU7ntus1MFA(ML&k)ZKtweoEui6>%^2&qw;|1b?Jtu7uV zl6ZyG+pu7`mnii{YqTypR!{kUjPQDQjKZUasP#bEe`f|V*k8B9LVTRaE{G#2N)6n| ztlCF3@q`H)ttP)qB=K4eNc2kl$7zW4`g;OIFu|y#eCWCPky8(1-p#c&w?STf_swHu zhZ#iGn}75U6oU~^zN&@|U-v!#?v>D;5`r@tqVRke&-lu>Aqkd)T^YY>MQ@A=%_YS7(+2Ep!7x#6-E z-vmKT1GmEweD_#zYbdp*;pWO`X<=PDyg(}`+Uc$@!@s4yZl zuu%*|bmPY7x*JDA>7c7?tZ7{XvQ^7{wbh`+)M(YsHH{4o-c_}??8Wa{AZqd5(4x__ z6AdNM(Ac`hx6r+iZYz7{rpiEHtR?(F+wOZuW6r6!zzTDA7iygk&2tt`GB7HcQ zLyIMorw?@ob-izNE;hoYsQKYgI`q3N`;(`Ym*MtcL)u@y)N~8on4yh!X!|U9Jq;%M zctQP`GrkGom|S?f+c)-v`>y)svF+xuO+$QwqUY;eF^l36*3cxg<2uen(^zz2lr#=v zcqh+=k2sh{M+)5(%~#{W`K~0snA^doLV4hYCG(~4wwLGUN#i1lA|ZFjBttK01c;Hl zMGWD+pFZO*5hUccmzoC()$F=Rh`UkVoOCr;d4}KhWm&qbVIs*AULYmA!jzluO-zS{OOwrV2 zA7xIiN-dn{ttA>u=VerwSgfL(Dd)489BHUveKox3h3mAiMyz(TFk6Jr|FFy?`7SI5*AXRVxEkzY3fJ`n zE_EVz5PTWTJ(Lgo(A?ct27>*!QW}PROs%D-Hyo2Ngjx$buZj{d%?5gN&orwD6k1%_(v{TYQCB4VMGq1Pzf*|mX+68_Q; zKa@&uc8V>c(i@4cYgoxuYwd>4n$Fwq1RMCi7gfyl!uOrluI+bVt>FN9tYaq0yg=*` z`(fVaO!~KcT?30;LN#uh+_GRk%?~dp>6qqS5C+GM5K}`8*hC$K$Euu4VN@`vc^$K6 zR86ulil`%bWAYN#&`r7kT6^y%3|#W8asnL>QF+s-S8+?HF&sLvylcO?6zdv%VR%og zZwqyIJWp9Ql~Epn|AVk5btSN9Ag2jw@($EAXgyRLn9mS}X})V7xPMD{lL)KBnB%qM z%R;ZUG|gX2pB(d~$e`cp1Dlvp%XJ{a;`q!Fi-a>HENw&>TXaScnp z$i^$>8)R6Tj5*m_+)fsi(ebzo>=(!e+d&A@l#X_$3PQLBN`pUOH9&)yK z(zc`LzVOLw=iglQX>TNolwcn{6%_6ymplb%DL@jG z!W9(5NR*7BODQPkqB6OvSXygQRTxNF{jq>&ZhzkuO4@+Fk9#ARl)m>3kvmc2ml0#M zoN9OuZ+q?w{-q&jIm`dQed*XLq{xcGrN2bV7NS$ODk&(Xy>kUF0fHBKWB-{i_^*T* zwOXU*!X&+eZfct?g2_ok`zz2V*cNvx^ACx_-QHOjY2VnV`hWCAG<3Z>$ZljRFb}na z{-ZhL$yuM)BCD#y-`f1Ip|o|d!<)TpeAU-4Usd}S)-Pc0YEe!utMo8}<-QhLoNBD~ z9k~w#$zX#uk}h0B`q?MHe-ZnQGE%}{{qd4uC>cE0_;B^)4K1&7hS~tI_MQihgj~Qj zdGYAcIN@f2ml%C8gnje3&psPU1;t7}3utY+;=Mmsz{oYI*cip=G7P%f>XkJsufGzs zq2y}JQC8O1T<@!;^*!i`bq&z2H2Hxve4G1g`orvcI%i9Z+7$?AUv+L(D5;$PcsKc{ z51}Zr@aek$UOk$-l!$of-~m;key1e1?{(!@>GcH>MzTonC}Oa3u%XK>gu~y6ne8 z$#li1x4UDN+DV&d+B@tGcwrHHglrA|&7T>2?d$kM?biPAZ~j-tB!vQE(aQz9fLs<*EnT1ZLyu>Sb|B-R<{!oe^Z;e8akauS3GZ$Ne zvv}2+h_cLKtFWK)=BIyfA;f1~3rKexA_*gaUcnq2e%pnXjdwN!-2?x%el^|ZX{LCz z>*X6EJ#(Per2lZxHcCyNMQ{6;kAEwaqK$O)2I`JmlV3z1U`Q>(LwS8?P)||JAR!u} z{zTkx*OU1oL&{|rUA7pL2SoFR+uud3pj&@!ug!7aA*=-Z`!=$gtL^E36E#|kfW~?tKfZs_o%?RtUjZQ^pla+(@a<~h1D{W zdFK90LU|N7PN6@%ZdYnB%Zwne{QOUO?g|yghOebNS=;@ckIc>Sz#SQvr4qe&z0^($A0oZ0}20(u`B( z%y7fRFn|pf@SYTsG-e=VwVh3b^Ad4f6A6cD#fXvid5G539!<5|L+z285z}LIx9R`n z1*N8ZkY;45Qd6TFM_CIeGp5eprFIUsz4OCoU=lBHqM*q5=NGel5^>#&pQ!#AQ%hWh z(G~)K|I!neJx5+&qoq!J536TQS5Hs>MyO6|RJu}STXbeiOsJAfq@C0uSYI>pdd>60 zvshmyjn*!_2SXZe+p$%IMY8O_+Ka(W;U0= z4f_K31Rd-R(C@BZg?S?V$=c23f4TnmuogL)mh3ktM_%T7Sr*aky=gg2C(40ZjP`T2 zH)0zWMwy#eHLh#+HZ7d~nH$BjhINZQger-{l=`I3BLv35RQa{o(;r)LUnoNkAupf* zxUU#<#n>#$gtt*HNx?^#LyVm&rItzdW-~VS1ZeCfzkGN8C*H@hOLVY43@;C>9d&B| zyGL#qVkHtYOA=8`ER~uV264SrUV}j#N;sOkj{g&}b^84@h+j#xrk>V-{Z$y6c!|Qq zTOJpgF~o7b)8IA{&Q0eA*gK`~eWK+*WfPajCjgsd$;Lx98qRkt zf6`JE`3oQ*G!58IuYKQh6wT2@gfpIwR5KT$qf%RNs9w5^N|NjXka)FtEX+&naa+(vM zY44Cv%fbjWonWTZ%OptHh}012RtP%n4D&?_(KM9he!Xf#@Ua7+C#vW?RmeEmMCY19@s3u}!75W?>`)aQ zsS3qCPDO{QOxe&5LeVj(kbJ<3j#q{BQ&e<@ii~S<2kLp>ZQWt5ttQE}&{7}O)3xf* z>$qcF|6RK5w)yCT0*zhWsCM|nZtn}wXcO7~a5w5lN7En7OFlpdDIOuH;kDz6b8N!c zOlXf0k1w2|-2;6`R8&mqdBHGZVj=fagw8Oc0$tr$_h|~vH;1wd=$JosOKcopW8G(B zMJvijmwcM)1D0MPsf zJ(iif37cbNhVP3Zp>88grh(B`Nbf~3CO}N=%;T{?{q$|J*!b-5^F)TZomM-v!`%OJ z_WPma4m_ISXW9EjBy$J`i$>Df|Jmm;L~Fmwo5E^O_}QIby9rYr5w;4t>xUF%kkzT- zzWztdWGmrM{U-`a*JJW+ao;lsdU2C|cgL5^k$oL%{|E)~h5%u~B^bmS&Bh;@WAk0H z4^W^~m!N04Ws>QMk}VpPR+KJa+5_&jwbf9`ef^lOV|eErd8OfyMIRk_P}N}73`bVy z&{=Kcv{}MatL$vJL>F^7j~$e`DvBFvNUpJIT;uByIK$ITrYY-Nfev=>6pMW2M~KX~ z#~N{0M#mLH32AKZ-LKN!W6QB^5Vu{07cCO*vnsfe3^zZ^P5F6nQ_`0_(f@#-*9 zd~LL)$o!<#-$hFxQR4M|(F3s|laEpYgNspukB|vN0NffdGI7oMm&9aq7#!-)mxH{N zLeYCG7HbayXeSO?y{?L8S6gioF4ZTR1#P_MmCQ{}Vwmvq`5!{L#F!M!eRU;*sL5=IV)DdQ4_lR6x9P zKdP-Zx&cwKT48rxn5klF#n9=*xOa2K;@S;Wd~{)&o-t~hDUX=7>U)J5pNb{g**z!$ zaehh))6ZTp_A`o33@J-~n_;rl}dH_8!BIgQlHF>aJ!luAixsy1p%Zq!yeA&py+ zhBRueHl#<5l^Z42Y1LY%H8s7FYo$g$&%4&%Yp>a}M~rjNpVc2)%zmHstap8XzY9LC z4u|{=xjbVrwAFgrq6|sBex&k2^O8Z0eKBBte6(Zzz5M^md&|tmXzR+sCzN?x@icsj zgYKfTaLq*r8BhwNETEj@!DJ4*YEf;W#<+$CQ<(gl zLt9(p^n9CbP?B$##BvFnGWa0foTejlcF^xjOL3V3qHt6?J=x*WAQHDaFq*4L3adUX zZ!6iIaZhho4Nx;hw?hkM6z4HfACe;N>e~_Nq$U@wV$w*E=1Bb5AMK!0i1*#=Xmf2b zzw5wb^ATslxKSfA*xhn?=aEV)jD|GBK%*QRw$h7Qc5B(GhVK`1eUm!O6#8;5QV~4v zw&{{ek{c5eRWgYJn0A6i$9~}i`*4~G_6rB_fph{u+(pw&4G8ZYDLq9hq?M(@x2TIe zE1W|yQ6(NrM;R1B+3fMvAR^pCC45*|NUD)5LA;zKjR4$o7o;Kytt(hWI<}=6*luYv zq^2bi!|Bu2S-E*AxVO++GiDm(C_+y9RGJB4H*`Ez$L_0gDD2jz@DP$FNN%a}Sf3q$ z(vZ3jJNKulGoA9JlXnRzojfXZpt#ai=>)+y*td`LQ5cjeqL@CNj#rcdOS`)G5O!=Z zr{kG*-xf!@Cc(IVX;mgA5K)|X2%-Wc^}%kr0s>_xUh&%FT+)Lo6{zB>tK`{ zC!DhKK}r&$#9{l9I5w7|ShT{jRnlM#I9EEnX!|S1Dgf_lZjv-Ab;~j3+$-0zvdWG%Kd;4=ORGb+sL-kp-G(cz7DcY{rL_R~a5{PX zL=#mXtSk%Ns?~U!5+2v>>5%cGXLMJV$lUv`w9*U#j$GJ{>($NWAa_o{k z%s}RgGR`rawK`o^Y#5t!Qa-^lCmU(iOHzvND2uzBlv<|mbfbg~>37k$q&1g;PF8f@ z1$A0&7^tnQx%Fd8Y}57JgahI6zMcI;&vDPGmwDZqUg4R}{wSW47FXO_0jSNbV~D2D z%%QXv`OP~3&gJ#AMpX!vtg}3UrvR0tdL+$K$?c^n#Y)y45{Ukgm-2KIVBbKr!|GT? zx~E%2t-{0?xWyvs7+%d3dyyE8^Y3D_9vx}A`j}Vfm6SFJSfkxX2+AA5I2 z(q6PzisZd%=CC!|7GsFC8hNumuQ;(tT1|ILO2__Bx(P<(_<>mGFQ7f<#4Y{(Jv_xJ zy#^|khhfF>^z<8U+PLHU0ZQ8|hD2%2s{a42VW*W@@+`R+D<+J%o)GuicyyB%?%guW zJlaml<{;wP$cfS#5kV_)|H_4mkMucJT8(2PooB@1Nq&im=tTNImrnVYx5>!gmP)%d z;R4Z>|AKRkv9!Y%8S{TP^t3X8kFV;-1~6mhLk{;LR$9GG<1ihR7YSzPL7HC0K}5Pd zYj(#ScxbjPt6ivL?_HK(LuS`ih zUTz74Q1}&E9#9AOmsW@PL=&1-n84bB!$#b1s)=2DnsK!n_Fpu%X%#)_Y)%Yz^U0KG zInpY6wpY98r8U$iy9(-IjCbjs#`*5v(<=Dlwy+&$TB8K>?y>DFt?J^~CrhjNiNhPP zkYtCI)=XAC^g&*6l*Mk#RUt3YX-z)m{!Qv_yR`b>9lOojV_dJwgc-3Z;Yy{olC-0V z=GMx)>F2!3OY{Ex;5Dj!g? zQ4IBYVwLfiBa(Km9Q(W+>O82`;sDif)FwgbT!mMUI9U6zrUGa^)eQzWq@YfrD;f~< zTn0ZDVzSbM7)j9r6v;pbS#0PAp|JBz1~+pqHf?O|-2&@e3Rk!LZSY0`zAq_$+szr6 zl_Ol^6x298l8ENu6gsO(C(n`G#nsrt7fO|V9B5_ljBrx^{)(Ct36L6&DHm~~rELe& zIm74h_389c9GRln*ecrFFdSdzWOhT=aA=BrP}_cSj*p}7auO%w1np*#6t_)Rd&|(& zBstv_z3l^Z99=3h&RN*ZD$XH=PGzn7ZwALJfwKT&9m8B&!``@ETvKGNtsl+MYM5W$vkhG@;+)2&V+v9=x3Im&(?NM1r(3B3{Ftb$CU=UEom(t)tH!#}$H`LF zQ**OUZklm$s(R|SvzI~vk)X;RPl_Z$$uiTP&NTDTS4LXzx}-=U$|0FI9aV|1Ppt5~ z%Te`tm*??A)G_49PdchBW47}e1kx((5`O7+qZrD-PwUhJV?IBATC3oU&C$<#c`e(M ziJ$g0=~DbOZzb2`PwVn=EB>~x8}FxI)X4GsxfA%6@V?=a4ocKu^WuunNPOsyv2uJ# zxR6ne5B8meLHy#k4GtL{Wx3Y;Y9IDg`91rij7&MdjTh<5GMj22fuZZYM;RFf#wWbQ z+tj#Qd?E|d__V4lb8r1FCu;kyI`QdG1u9UM**&}ydwX~v=k7amj@&{)DD!s@?-?CF zaFlHlUo`qc_l=IS&Eku9Q=mm=HoYwK)v??+Z_NeEU>sPKs-rA>PsX@MBR;ZqK(``} zvRw0q>hVP$z+H9~atG$OW zGm*8MqwJg01%GOAjRNL(nC>~sUNS#xWkK`vUb4J!l$|#P-m;J>*xnE8V!eo)De;%B zRzj%dmVslPh@&aTvqCDR4Y*(e0%dt70IJyHmrZf7EI%P+8}YX$B70NFJf$I84T^s4 zTZJ19?Od=dvva_V%2%TAjf8mA_09n+7Jp!V)HdOUg`<@sp7(uY^YbC?Y_QDV$yW@I zvaN-kow=e|batB5518MyO?i?h89#_u{|^-QqpU-ZrJ)vOHUAUGhE3-Z8~~B#GLRlMaV^t{%$Q z&OnDQ*l8t`VMp25=bwrcaUFbJBiPD0%4W?kT3HtVVj;g}e)pF7yKpLs>e8Q^pZusy zvTvb~wv{~ne35nnq=iEK_|p%}N3>Iv%V=(J(HGgd zZz1!S%0voNLxmK6-2B2@B~ka=%uim##4$=B-XGl^_`@>o1k$s8nAhc_tn6bABjubH z-*!dYV+d-a`31>UKL*oaa8tf3j<`bKE*ojqdV}|~S}*&xoFebb8(?|>k#J5Ni1he9A9=M^%Nd)S z$ca;CxWI_>kDfgIe47>vZh+~=#N>c*{m)+N*stZR`SwIkG`J}{5kS6c!>{H>wf!ib zo$W#iRQG#wUWkcu)Y;B2aUEsfGQXi5b++^SU#RQmH&p-5cDny{lzrR$iEuhxjap!k%Q3AD9d_pst{9>{{KIu$ zh>P0VIfM&@NFeizRu)3|VXxLq z1WB`WA~^fg*}g%oDTowt&iG0ELeG}$QLQmZ4N>CS0ZIR1{-F)yTD>V%7a>Uc=&OIR zd`PS1wMR{DYx#o;`p$nUxH_TbeB(P4IoqiAxZ#K^mRJ4hNv%4#As07Q6L04b&6oGT z5;~&gw9HTBRFO6g2r-;L^7B7Erd0;Y-VQ@>;_#yQ>JY4Mc==3>Pr3KjPWj#kS1eiWqVXv4Qzl zg?*jzuC5^<@TTD~8Nh@`?;Bw+DiraM%+sVA=k#k9<9gKLZ^bbG8rB(6J9E zwRq$xHNI5rUCJ=RFS1Amz9H`ZNWg|cpJ3RJBMPwK3mFS*LzVcZhqZ2U17WS5Ts+t4 z!u@MsEB01;SJ!ANxwaiC=zS}qZGRZ<8*sO8VBS^f1rpfagA}!Ne|WCgTkG?J-HT7q z<3*kSg$E>&gIOHg5bc0nQ&Q0-gdjx&S|D0H8i>}=7W}5@k-G}tLFPr$t))_g%SL_j zDHJglK@vXv_r>0+EMB1WZXC!s5bqf7V&@UXJv&f*-iUafB#wxu4H3OJ;^Q+e{JAmW z7p5HXcR1pwvFGS8{w|DUU@*dqm3IKfa0=MBk&WHdIv23-=p7sLlXRhh95neg?>cW$ zU?olPPWKA74W&eMo%c}i-Rt3+61?>Al;~pLMpfonf#6^5*chVV69WFtb>8t50rSem z3&Xq40tEbq9q?;m4=>Uk8~L+QwXoFlEJb>Lowv=;BW<^A{zyjc(4H>#;2RNN?GWA= zM3H%7ry2Q!Pv6%k(CdDHlnh_<6) z1AB2J+!nZD4&wHyHn4oHFyd=PL5B8zzbssOI50qFthgD&0`|Q?IM5UCGkM#L!;_B0O!@P_AFJ_SHju>URlHb4r;kk2Ty6=5BoY$EJh&zUdP5f ziXP54kr7DqxC1)T-9I16fVU0owN>E^7>X-kKhP10 z;gQ}h_U~_nGY?=~+8*ucV()(~tPgaw^9KUESROR&MekAJ4`;OZ4ivD@Qd3N-aFZA! zxk-<$CElqodheJ05(0iJ;z5ROXn<>!1eGKjk6a_jQ=^u>f)|5w-_#LSY?9Po5ga1kSw}E{ojLa7%WWZ2( zm)XH@VE3;I%PtI6z^tNZd|pwjXczn5_Z?OAdv-lLFKXvEMD6?<)k@U9uY@xWZ0W=w z7_eB?b6WdcIM4-+gr%-7_V+J@vv5H{`S7W*mwtD#R}P1LT!cTDZiRhx9i*#^{U~=i z92{0`MRlMGL0r3;i*H zKf2I}cn5EVGy3>n(OY4C80Cov&VID;c3AJj)j0F#)Z1Y%T7@U!rTG^BvkiaNia(#g zpOxazo%l0?KXEB$FV*e0!x?qY(qFmwYx`bkvt{8w=`U!pWeR`Q@o&xiFZ!1IpJA<* znsm=Cj1`~TOGyDgKM!lv5<#6U`7q@ZN#R?ae!}_z& z%Aa#Uj&zEMY&m-qOw_cVT@GslWB6m5{usv}Q_Eq4qC9Lu2XA(46c){~fKXxY^x{qK z`Tuz6c^3TC39VWak7XCIYK*zHx*Y{Mdpk~g#`EaW?P@J&W5jKKU7?z4 z2X)Q(@eRS=3~;we?l#STX9ixrC}3aGz<7i+wyng-Exd#Am%vz9?Y$l2amjdR3LTYQ zd{BN6l(f>ZJWM1?$P0LE=#ym!NG7=N2$J|h`nG|G)}h+cOE z-6_yLbk@kta3o{IQ_;mvYqu~+cZ>`uP` z6tJgA*9(#}MeI2zPL6=^OCW67^SMMqKS(Y~5?JbTiLhyu2NYib#WOyw(w9hr(O5+R zVoYRLRw5G?`$0AWvYvZf^tmo6+%rI&)&avP7{+$GFf2)iGS?Vk9WCLw5V*b!u3tTy z=_Et7MceQoL(FcjK!=XZ7_>G=?O_@_flpv?;Zm8F>rrn>q&0{wLR1GlCq_e(!G4(bR3O< z!8Q)IKl!nv%%WKV0uyK*>j3nMWEa~&wB?f4T~qb&9Jn6>_xTSxxOHc9P%TMIT@%(i z$p^w;2I0#m9fX#$t1vLd2&lJ!?Id06C2eskTDMbt?hTXsZd(DoNeT zxi}>W)-QtfAII|@wEl>HA2-8M!0ynYV@%Sy>&Opkf^8aXZ#?HHlo+Wf(H)dj?wW~% zqTm_^*V`X)azU9xlEJ-z+hH6z2xqg1|0$>&~J8u|5l@rnr;p8;dJmVMHn zqFnnaQ>Rwsv`_DX^LcRAYW~}Eo?3xZJzNaVUU0T)hNfg~7i-hrLe^rPhPn=on)x%5 z)x8GtbJ@HAj)8DcJD~6tfDc7Q46zGXk5UM4VP$0lt(WkXl~oAnoD9glKanTHq5HE4 z>WH@B?4oofEWcggDJ**x2Ma^IU0n&p=t7YLVylqUYY~}|o41?wSVgnfM z(WDnjUX)6@4C29|9}NaOO2t z_eM$Pt~Gi_c>@MS{UEB$P-`aDBo;B3ASk<=CF5PL$&5`!D#Yf69B>YRvoRyvkrFK8 zdpwHAN|3t5x?i%ox8r=00J0&FMKdDrcNXg~U%B9Gyj@tT3TM$m2LIX8j}NbgbL5An zI99%f@bQ&!uHz%eem|`5iQxqpv5t>9DuK3lVfo{`;%}^|Y26zVDp_L4^$7T;GCaCK%Oz_#) z<)Gy*u%5}-n4+NOVHXCZ%PW)G>slav0Hkvng(*qDPNYV@)pWVH$k0@*oPqE`5MIu> zBPHQ8M3^rL-A5vnl;Xu;FjjzZDP;xC6BRTf88@V?_QH%-r&P5C#D;eTRX0oGl&YFb zRZ#T_Fh;x;DI?Fbs9G|*7f(c9sXt)t25YtVcO0zf$9ZYWV*x7k^^(=Sdm&cyaxEx7 z1j^>yD9RhXW=ZK@Kojozg7j&S#=V`+whzkfmrN-W(Od}x&3@2KtfX5^GP>)A=-Stx zLHc2kp75?vc?Q!Zr3=|0eF~&!S0X*MGO4vDT0aKTCqa7QHl#djj!4qGS1RsiYX{~^ zFkkg9Cwq~&!<={~qqje3A}J6NZE&p7g2U0nQvhJ!P)o{?yP;lM8Sp*L0tLbXAHAl{E4 zW_`z;sq0r(EDi)f>npH2Jom=bqQ%MuSgXOh;B$_pRnjgZ&6T9?181i(7ckd>`MU2O zN0O)s&DVuXC9`|=O0+%$-VcD+I#vwWuAXuZBj6JsP&vkWO^g9-CTrVS(n)P#Vd{?t7YZ-b(e)V=DU4U#*5 z;CvrA$Nj0t9p9wt*ef~R3pF^ceKt^j1e8;^q5Kw6j!R1Sc8Dh!S;7M0K@gttA9J=t z$;%PeIfAf`BXVI~;7l+!`wr-0Y;8_>(IrfH;XQS}3p^3e5RaH~t1Mjnk4b zWp>(z$iP|-*316X{olV*I?YJZls$mmquvL`rQ0y_9(7hSx|eUBnbE%Cf#?tp`a#dF zU^OyRO>@mr^t@zEJ&HDWfJHWd_%RUUWSOJNJG$xxNnD<)tLD4Em_NxgXyD!p?&{3c ziOLZvyd!+Ym>%zLAxg<=U1tfIAK5tC>wM%lNe%Qo!CIr8i4z_Yx*f zhl>RT=z9pPH#0x)$TgfVu{u5t2Qv6s1#^~*gEV{DedOr$~wQloGuw@F68EzE1EB>ZvD8>vYth>Oq_asYE($73lCM}xk~o5suq636*3#k2)~aB@xrX>x zE^CP2OIZEx=_*cs4C#l*pd94(F%l2h&lu0sF%p$r&4@-xbXO8l@;e1cyqjlo zTIP(iw1=#6l2Wab3vYHgl(II(HK=sipwlR-Z<_Y+m%by(zMISz#7_7n=&@uxj*_nu zB~7Dak`<3?IdrlfjzFxI!Da*o{fb^)?3nfz+8pzB3G8CL84l6f6Ryw32FS!SKK+d6 z$we$Uak(0=7GFXQrva29`&g<}z^T%69MY$RkiK0 z*_$+wxFQLY%LEZBFXtd3Zh-P^;5#WPWBfGPb;+5mq`6kpNAH!;`LnIgs z%z$QCEFJvzYd-f*D&ZnfV>`3&4ebcXi_(<0F zq%^U1c)gS&ZIbwQYTLY0?cW3Ybk;|1uXaqb^Z9uywaqi}Nb27O>ulCT4xOzQ!<>Q+ zO4i#ZhMm?RJ`Li9Bx0-J;n)Br#vw@@cDXZc4s+y5+n;_m@QLeLbS}72mbpevJ!(r8 z`3UE1M3F0UQE)7YNbARK zM1C-HS~9st)3N9AWAIf5S0zQ$K2ZGyYQ|?Isr!u0e3wxy$3V?bW5(7PEV%u#xLHn0 z=Uv^`cM>0a1nUc6jRsLF6Q+TVsyZ)OgX%+*@P7T7f%);^Q;`>NOSR(*+Qvj{HvrJT zso<)J&H=aT7_P`pX>8fEoUsEJY`2A2W#|_3ieHT(RvUu36b(O*d9-MVHHCZ{)A93y zrcH)eECjnF+4u?6REQl3!4?OB4Ucvz#EyqxQ-gkiC+AABS96$Ifccs-k3{cY2=iqm13@*-1{v z!%Szmd~nX&ut$$%Grfh?8l~AibGM2&u!?|vYk_Ht<9VOLaTA^~xQ-xv)@s)>8V2-o z_Da(F@EZN+X)nK~o?&QN#}DW|bG zR^ui#?-!$LV{y{2o*dNS^oZK0<_>Epeq!Xc&00I0u=1xTv_O z7%u<&q^DBCGR=c&Ebw9p7nT;6D!?iWC=#Su`*Fj~wR$zu;||<}smk{Me5c0lF&ZB0 z6EiTz!mDs>ko&@tz&*hR(N0;(6+Y?NCWSew5C;vAXdBW0OZh5QPRFePxEH5iB*4yw z2XVYmepYhj6(^e@ogixsXB>H+O$&wQ8>lsW}r7TCt z%yP=*2TppTQobf3dgg&8L~#H|$t7sD3NopH8N0Bo~N5 zi3laA3jPShqf%@pjySCdX(goNQfdY-q@27K@V&4lCsrOrp6^-n+9rHqJk1-25=hU(^6cJ5LYwXd3?_TcShpY zxZ#k0b3n~VRKAK*OX~t)XC-X43k+OW0Xio^tEA$xtmbP=fXqrru7p^Jbtsi?0P~W> z6iAFnC57xJfO8VK)&W#0mw}v@$gBo?!4>C8JQ^-s(pog87o{ARP5Bd( z%)4k5q7`1SB=7T!Ru~=cwY8NQxXWcpD*U3SJg<3|iR`i^sMKX+sfBOxHn+OCT4{5y zNMx4Ucm`e+t@pO#Z3NB?27@O(S0y%E!BU|Kyr^;R+TvOcXK&=3^jwqh90krRL*PX( z$JZCv3p~@YNh9wFC0-o2gLqwfS*>`H`4V_h=YC?vG44m#5zLbGBYUj? zM>Q5V66!zRc?ZhhkSL|o3UXXiag&X^DRDvG?bzyObMR>KD1rIk7`sSxwu(k=3cR?A zW1_`T1@BpBE_YXkI9`ca9*6f9_bPCogy$r{IsY2&VX$~m@nA>~hVVfBUf{(74s9-O zR-hpX&5}^gTgbt!#jOfBSAt;`66eW984-hnw&FGgnJfwNI8M!)M1W3RD6igBDW(FE%HU6h1Pd+_(bu9qDh&=ui{!u zJP%+!_c2*KsrV?DK19|CA7*9Pz&#u(KB9QoEIs5ZL706_;KhyH%dz5PikC|1B~S5U zm&i@r&$;4rik~X!XHBvn9-Di(ud~Hx6<^iT*J{O=QaUTRrXYJY9U6kPPEFiR5=C2q`n0m>=Z$6U8S?e6z#{Ej2_Y=WFlh(5d1n6WS`Fc@|VH z75Umj+{1M7wCSNudf=BjNEey8`Pv6LdbW7hMDLgA{6u=iPYw4oS3F04kcd&~XO-p0 z&eVKuJBPni{E`_&Ou`E+xETX$bchtH=_#P}f&qU6$6Y91S}SzvwQyoK z(5BVv4W2T+9@Bx3u(?oe_Q&ULeSU+s$ZnktVG1es>d@InF%=r*ez5{^kFS9zKl8`% zc~pKj8psHcDT+fhE=7R`dG8Huy^tM}GJgX<0L$1{2l0JEeh)N|%`0xbl`$_((8B}iwa)M&sRoo+ls)(zSl5S^7G(w3Vz_GmXDI41>J7=!hX4m9Gv zhm5nh)umlx8-F<9rOe_eGG*OGys26t+pkt`NMI z0&qbBvL%2UFM&J)`9&$ulX7_ijj>!FK(V76@ngX!ySxUeZ0M{iT z(0~S1%BCTEUCNAxM)MFNW3QcsXi1848yc;UZO9xTHzXw3&TPKm`Q1YHYhL`rD}WK|dmsRyJ?LIMra=q+PKS|fzzQW$DL0uPPs7#$IT zH)_q0ZPIVT48O+%Xn4h2!i;@u3Zii-3O4MG4Zy&P)vHcJdPquFp+dz+1Y%EgbQrery=Q@# zkO<4aC7pwGGD*sheIQZ`kRFlJRZ5vM5#g&q98(Y?!ty8@499Dp5c*;XS>2F)0Fh8W zppHuv1%*k!&Bj=z76Ighgaqgey4?lULU>9F*O1U^{_R#Gq}2m9En!e5>FgdU(+JdQ ziOOogUKoasWC4P)oz0<>#+i~wJZB_8Z)hCmw$_kjQFxt^5`P0fz{uF0gZO?{eh-N6 zbP$oT&rCpe&XV!f4z=-GoGHKp#jKR)%7n2awiuyBjF%)Pn=stax7mO$<`ZB}0s`3A zH*Y#IwisHC)%ST@2;a7FAs;?3BnV|ozZfCmMJWuzr_zBe_LAxgQcP+k^gfF-y)7Om&}9jt2tN_qVfY&7;arXjpgA`nnasxV8J^x}p$!rGd=g+t%TSR1 z`fJNGv~gufaVX(YDL{Vn@bWZ4LJ|T+?cN25FCSh$PKewj1n*#g_^rdsM+lKG5r(|$ z265qaN~$6$Oxm=$LGn^5&ou2x!0R2x8i*oNw90wI3z&|>%cYb^WfGO+xK#zvUmRYp zB2c*mWhvGo05J4&3Tm^IBMRoLm5_$?WlH8sTPp7dqL^GE{i~#GwaY~Wpq458YKh83 zVG@&t#U%=Po0RB~Sk-@?sB5K&N~k@`AyV>MpCDIf28&S&v{A~b1Y2$I;xx&cq>S1p ztLe4+zr_W@G)qiSy$FKfuTuqTmEzS3h0@3^5lNdwtx-_QL}Bp?!S+iS#Z?{3FB;So zMx~tV>ln;0Zl?5#Nldoco>&XbZ1EZ;SX=@Ew#6PqXL2>7(`yT%fgJ5DRulE06ms=O zNBXJHtj7#(@d(LBr96i`D|cssm?gxxL}USBkBb(YNqR_1iC-PyEDn-zHP$102Cl=8==&m9H!X2gY0N%*ahyb_Z4p{bOVqm-s-BS| z>i4)v^yrI|dJCDC6q_QQ;5r4&oW#%uY;P}~%V?~_iGyj#<}F!8 zkT+E3yRV16eP^g0yCB7@C|uRn%wg|9;~M1lMF|Na`J@Gz!``80szD1Lt|6yC|<;pw6sYS_2eT zi}NJ{$8Ko-%Inbt=G?mZe1R!aF|;D*^_iGc>rN@5l}cPd>D#n(E<@}nZ%jKg_+kd1D;lC(Us<Oe5_6*upn2%RsjyQE}7twaZu1vsy{m3n#IWd&PrVJoO@FlQXQhYov3N~tGk zw8iR6(TBYUPm#DuibDy9?hbp$X6ZChvy^8io}WAHeQurrtr8HjmP*95*1LFvnu<0{ zUYVt?7g>1~DTz?#nt8ilg0T_cSU$3Rl$DezKBCe`Zt_}Yk%;HFAiX>-C% zqfzN2&t(xndOBVbB~MucOi<@4eh+JJ~C~17k0#~e}QDeeV zq_%jI0-ClVPNS?iDB+_ZPfG}mjuY?d0<)RAi8B_aQnl^Qw17}+w4|QeZ!_y>B-mHm z6Ys{JITM@Ply8)CXC=TdIwc^)mNo~NH0LBLv$n4T%dEqI-NA(%=Eu-TLTrodEbz@R z2YE_hvXr-KFG-lRgU$kev31>Aa>VR<<|N8I>>)a-K!ez^&M(QQq(>t;FM;$l0^TJ8 znb@Qbm4v9cA&M6y#xji$<;Au%0j#9DC}G&N?}PF2DAuqko?9GG z#1J#Fxy+LY3I2K_=FxaxCop1H*}^PIjA5_o2a3$Cq@tFQ$hpEGF9NU8jiiWZd!@PvW-nIt5gW!&sUioQGG{}4wWDLG>1PNf7|?=qlbKgB`4B{9ltBu|wD1rwV2 zfc_DVtSYG@I{r6Sj3hcoMI#wlpj3N?qbf@($p;PkBsz<_5p!}0CE7V~dEJbuM6Cpp z6845vz~9M{)g`kgvR)#s7bRH0+r>f6CDms6ZImGOMGS;{fCJ~&&6@+*CJB^JQn0|c zKFU$!C9tQBe;5NwRHn6{9ngC?D71PZe}hb&Rtc1kWFXK!j%+JwHlxsHqbRa`e=ooW zIEn(a(t5v*Yl*f$Mh|YH;Tf`VXi1|IlL-t=GYXa_0zk`>q0)cA{HdVZE_Z1%?ca?l1mCad1@A5 ztqL3}UY2m@(no-`B|@)AX!1%%fbCBNUzK2&Ws(4kCZexNv}4sHz+ws#DSure6Bj)K zEUo~}ynbDR)isX*>rI9(Soy{h*@djydIpdLswA0y) z#kHOJo>gaDZlFn%1Ael7x3kQ%YQ_bXX!$@uFM3v;b%DwY{eIkLlNb8^Y&U+G7yA7S z<^y&bo>k{u{9C1%2f}Z}O=_35hL7qmq0at{4a{b5dK1<3o?LA0C)(q{$&(uF+l6U_ z3)>$zXt%*VMeS_v|zWppY8(ncv=Wu1h>WOZbyzX!*edbLY{G)YJ{WmgwEbaQ6UMzyN| zG)n+Z3-zg{HW(Ykbxy3%Nd!*&DFzZ4i)j(a+Z6d@eOSLSZ{ssIuGK=m-zhh37ch26 zi$Wfia$YKhtpvMBO#l*;5V}a!*A*Y?wPN9)hCD9ibe%_$3tIpTi(MD`8n+U_$1MvkbqEKKa#?-YjW88i5ZfglJXop;h^T; zVXp^fQjk{D5+YmN!(JcE#vuIDQWi?c&cj{7 z7&L{Olt^5aKCG@3144Beg<;7xiOF`fn1Mmf97nZ=TNT#p(nlz<5e|%M=2)sZ+^l$b zU3$PgKxt9~1ro5+lZ9Wd3f0tYP=O=iX) zaG>05G1eq*N^#HgMMpB@_rD9z;*1~nJ6m)tGrr5|S6%9P0_&gs&(^3{-O1gI+32@>Wz9+akEZAaaDMv z=u~F>{Z1uPSgWZ)2WIcs5pVoZ(X@LW(tfv?xQa0VjhD#3d7Fbg_YW4G&W!(3x`8Jf zL*Qu=D?0P;V!#*I`5g})gSMiXccp}#0OG_uSE8xtY-aqS^kZVCg2GT+bS^XAm@b2A zyMh!LsN5>0&5ZAM(mCwI@%%{c1c-2~@&S{uwr@BtI*0P2ms|?D zlT-HIJYhjv>)vLc7s>5DBPUFIi>-zX;$NGEu|CRTa4aH{)uV%)#t{i;Az=tb7 zRd_8epX$h&Yu-Ouc-^HHcUB6V5a5Q&cwmEtuV==0uB4{(*sYmRcK>7k6)RlIjBi?z zjn=z)==%$AxU|?#g_CCz+;eN;%`^gA-`+Vg#PN-V%bD>HuB6=h_6~s`Pzs|gpjCw) zJ^o-ahh4R(Uhw`UaVdjqu({Beu5VtwsE6Vf61eZOLPJj;qNvqchD{kP?YVN#rG+6q z{=T#nmnm>Cw=h?aS2{h}akY;%)ToLYh535CJ}qye?;s5aDywCCfb*xr@!=6P2+M1W zTvE(c1Jq3Wnk_Mo^)Ib0b&0gAZ#&Z0)<*Q?CKrvVIEZQcu0fk)A3UKD@4MI0=GtO@ z4EEI8GClqgXTrEqBQnWXTzI5b3S(+*xgKvwGYon5mFECjcHC|rI1ukZ!$xNgCf9D( zlRL~5`f@Il=YE-$qPHF%Ut8%?lH8b(sFLYm@7k(&kzh#{($h+?=-O&M{^2we%#opK z1<<;7n;!o_IsqW=_5hV9Aq8--acymySt@*sy2!J_ITY)!UR$rnA4^9W6hYbS@#8Z@ zxP?miFrD~}ch$7CH0|S(&1)O=d*EZ|%r_xLayP@N$I(A=`Lt(pBu%X7GAz(>TDhQOi1bEQK93|=~BUdJzkYg5b9MBN|l4x3!-}b>2$oJ6j<8H!?8TG z?%U!>*Cg1Lf>@fBNeM(0CmuroLP6Z6M{&y)5GXg!gzx!+UOnEFW*p6vP~>x9Y|DKQ zcg6?AyO}jD57#yBF~ze5gL=F)<%Da%9vhqPn5~6I8g5H8jm%$itu5|MC zD$ds*EjW^<=fo?E*yIB#&D4Pt}mF<YU1F9h;@}6>nED< zHMd|o%?{b3Lag{CWT?`~>btJwpG`B(5U_dZi-_D7e-`r3>G3`3=mah~b{R_=W+3xL z>&7wj`LlYwI$c)f&>UB@e>VT6H0vcPWgpHHzGw31(vOmTJe4PP>b_+aYn+b~dDR}$*SL~M`bUrgV#eQ=h0jvvZjc(yza9;Qst8X^yH8s&yw+1lyc{RgXWCW~o#zD{|j*EsF%AKdjHc zmVN@5w_iC|ygL7S`bE?#Oycx75e$rBhHsuVsA=KfcVUvhIsf(a^)XM&i^gY{)_99)E*DUMtd(+HeI@?Iz`j^&tjPx3LbDVj* ziN&=wJ|lU{$So=D{h#<6!$@9^a`QuN3#J+79Xqc5{xzXAwa1)T-aaL-1C{sNixk`A zBfZgq<~6xSdJVVpwkr`HY+RFXq&KVjh1amF*A%50UBxN^DVH$fdO{dxC|^@*Brn{% zCA?`!!G(xtqp>DpB(KxC6PdOUT&Va+e|dG8kzV7NaAl9D|Bcnc$}}@Uy~#}~Bn`37tgbTBo4c#`GI<`H zT3wyCS6Ugwx%Z(MAB7&ATD{GP-Y8<-DJd{NhhxSa5sfMG&=lli)8ESW+QpC&@ExCqv1TDj{4QDMtU8h zYDI?ob(z>zuWmEq?PFQ{jMbGxiOGIdOEX^Ln zdDD`6_pOen>7B;;>RAr%{bpWongw6jGvJ<<@&=9cMhT{U1n%p4-e{WD#oi~ok~f}a z@soF9d03b74jJjKjj4w|$SaPr*loEgypT6xq&NAL`!}xJcC&etY4*R;d=l5IGGRuH z<#4jHF_U-1NN*)6!Pt@@OkO~l&O4T7tyK*(rD8jtH}&q=_-&C?Y)A5r8_7pWa3E>N z$WTuWA4Je!!{mQ7K2Z69l8s`hKc08Oh?mu@9~)Sov~%Uy=bg_!Wh5Qca=zVFGnYMW zV2ha(I#=P{_CjCEK1~Xs^;9<)+>kZ1*=JJfiU!0y^v2KZp39!O9TdqxCyqJvZ1!0r zzCkGLJd>fEuIAX8>~lu^Zh>_!g{#~B9DF8w)`)Ku;QNx|x80n9Svhh#`=ylBI2oCU zp3a_2sk54NbdF>qd)|oO#nsrt7fO|V9B5_lj5K9mFyePOb0Ps!)0lnHh?k2v(bBe> zXZYz{T&>SuFyiZ7D4oEX+U!dyi;bz#&&~KZr_LgCJ_I1+4!Hu7a-tvvQnzHQIjd-cZIA>uqt9T@P$%q#^ z39b5Hntda6#I21!ZXfF)w(^UzZ>G#zTR)ni@zR~2y_~X!nTvMTJKMS0oSB*)G89RfL?}vT+LMXxXs9e5BsPm1 zL**$`h;oSM&9>0yK+l=rJ7shh_`m-DuN3&N6u5l~^ltOA;CPf_njOKHN)ibKzcr8-jZst^s!mt`F`_xE{E^)n3nXmL3ejy$QDz z?hUx*aF^g#!+jlYJ>2VXTj5@V8-sfl?jYPNa1X(~40jUlCAd>?7vP?PdlBv#xEJ7_ zgF6rRBHTH+H{iYmcNy+1Tw{&ba}I7f+_P}2;m*KqgnI^VGu+c~_rslr8;5%e?lrh4 z;4Z;E4tE*u6kH?U>p2EDAMO#j5xA3ZH^ZHPTMhRR+3-ihnowx4Q?siR=DMGo8eZ$ZGu}1 zw-Ig=+jdmQd&xYKaU;m*J$TD~@(hx<00eN{zpntZk7H2a#!Y4sfFA!#hG!~B!RdUaSY(b%94gF+e`)nSlFW8*q3%4qD6 z4hth1o6zgYnbe!fIikb<5meG);s`3~x%Bb4?jz@fUQW&_y_&+C)@La0r}b%a&gjR< znbD7sb5_4j-p}bb$eGoRHE>?iOUe73UPaCYSPzD?05idGF6mbYd0Ag3*%ci|6E${K zhh0RCUDILCP-EA1SS!@n>pJWaYHUe|`9O``(65toQ-`%bJld+mMxe$#2F!$M%xA#t zlEw_<8hH;HlN3;{0sAW&%Qs;6N@GO^OtxsO)PUI&ypn3b29d_f444?wSh)e~Gss&5 z7FIM?Y3!$8RR%0cX{_3Su{VuvGhn_=!xN}5%BHb;1LlN~aYipWO$ICmA^!~621AY+ zXUN~U(MY-+GMdSmF!qx(Xwe#HYm`qdlQO#Vg#o2j(cqwRpxh^7Qi6IvEH zt!NEwv-ScM;vQED^mBmB`*R-`^99_Wk@lr(#{1v=!7H8!}FGeY?w#5Md|x>+k*LFLnj&Yd-Y5+uJfU8asI5 z^KW(g8lpYJv0?f%Si=vGiPge?E_(bgy7Ow1wEuL$Cm+Rkv2?<%{fSt8)4T5vxw2Yh>?!^6M1_H)ztRV#kg|D@#yhzI#?>F3Pr*If8Z$mz?D zo}s6H{|`P0E$LV7&`@+7pWZ(8#iH))nw?mN?1}M9j6LJ@Ds;EDGtO1fcJ*`D5G2u& z-6Zbl%tT(3O)SRnw|VT2XS_V)TOp2%?TvL~SAJ;x2hn?PpbY zvA-j6z9N2NC_aKC1_1oM(z$2wvI zbg%Q@2$9!f-xH`1+4L`whQY3Y&Hc&RbzS%^?-K34Hu`Xv(Xu^W7bnYeUpeskKk5p$ z@NM03zUq+s+8@8!l~HkD)%R*HBPTnC&C-FQ`N;qN`+w=y`v>;MdixK?{_6SRA9eG` zr}u5SybEb6R(Eihzbj*B-HyiZUwyR8*Fuj|kG?Z^M|T#EWcKjH>lj)4g&qIU;+lke*e)wMjmuW|RoyXto}?ye7h;-4$KGx2Fx zeM8G19>R|RemuUTes@d#-fz%v|IRp_IQjjryt$*xzw5Cl9@|^D`%^b_yY;5%$6~ws z`?`PY$N$?4k1FZ>C@f@) z*8f}xZ!iP~{~7$d!dM0X{4=VrsX(M~kMIR7N7*?S21 zo)kc9sVGdKgha-{n|NOg1~3M|6psx@2$7J;W-0kO*iak~u2m5rK~D*wvT{F(6Ec;=qEyz8(FLU8 z2MCgo7J$^n4&sq20;1MENQi`NSI>#mku;&a@of_`AxM~zqkCh~PTq<>k|e@08ew$t zaS|oup%iV8c6_WGV}ZWTCz8U&s^zn0+}cR^UNzlB<8O*Z+C_UraI}K^Ve+tA^?*W0 z_E0`Tf;?3qdgN!5JeZmL90`h559XmRQF4a<8_5$&MPuJVv+MbE5-CaqnOQwff`oKL zifpH382%iI5}Fc-_^RyZNs^$tNQB=K-_5kBKz552_V4`g-`b#=@*VANw>Vh#S0r1l z%FNxOzb3&NRnXAW58DKN-7k|Q;wGW;y$`)9@1`#jEJwn`QHbx;N9uif`&qF!HaLnN zfmim+i2)+AR^#@QBnjzH{oqeYVrvgSruMIrV3iC9g5Bu*uhQ3I^{Xf-R=4_(NdZ}s zYb04KebRs=js{Ys@5Wak#M>=T?`YX|U)_$KwYwj#uiO7CY)e-t!A!vS-hA~U1R|ZI_L7l;V=z;#nv_<^Dk1rlcjJ_%OFsWN8eK!u9 z-^J;dM@UK|B#{Y?!&WSX_)!stX@ZjvWbKqhp`s4Eo+#|EP>;S2I)gPi1n(}ACPaxp zGTTm{?b3+>C%s23yfi`9wW@_GGPK3$j+-X_*vlK&Dw%=672zqOb5@%jBR%)k&3pjW zCZS11SR@c(eVN1w?H!1%68%*OyE2h=L&N<;|Ma=mQVhnZ5R!@CrN^%SyZMvKn7EVi=EJSB9uaukXS1W(EyVn}GX zY&k{$YvkF^04XHJdWGL4Vrr7oPNPA(=6d1iHIpfE+}EzKK)~oCA1u-#nWL@POUoTccEL0 zQ)(JP71F(=c^SN9Y@xO!!$0pOS{FagD9YNbdHc(LpIc)v2fALsXZVQrz8eqCd#XtXg+r8&8faS*w1#V-- zwXPiTp$XFg{_)X;tMA|=y6+)g;`zrDpZ(GQkRPpJT3((whKWaOAL-3ui-jNjr^H$% zPFIM=Ww-%-63t60zgmlViQX~%*gzC*e)Yd#PJ%L*&=i^-Z5f)u#6A(R5}oWx%C!*b zErubF4Rv37xc4kFQpseDM5w9!4E2TyqZ@e-1-53s111dftrNMJ{rHh@Xm}d`SI6%{ z&z^np9%O;`H(&k$rbAQ}-u}~ndmBxFIJq0mc<+PMmPOIU4^vMo^m}c~qu=k=D@;(` z5A~zn+2)T5F}(QWyK26VUU56ln;od2Izd-bAFuu9lgK6hk$?Esvp?6nGutuShRx3h zBX9i{!V&>fSR&LZVnRzIRM^o!Fir!*w@HH#CYXK1&SUh2tarlQnH@b(96-tV^IwlX zWGl|^3GlhceefpZLtk)xzbBSWpZy&@NT%`ap?`QkQp~z(gA@xTSnoOi<+1;_JM=`; z)Af66_tkHI^x@rguVI>o-pcfHWm{E2w+_Ib+Q!{2mmvdP{n!XUh{GpcnCiEV#L1#x zw~lFdOFtG6mKs+7VMnL8DN0Kg-5Get;S=*e_$++x8|gHCqLiA)Cd|d8#*Y@(cdx2& ze7)y`Z+=#mIcwd?%$Cuko3GH^o|i|53{5HKIm3hqI}x>xIouGT?r@@ZH1U4MJjgx( z4CdX9z1?(;0O^QKJAdWR-m#!`!A1v^M{zUQUgm<_5fz%W_z3e z#qdKN2MSuE!ygk9**zcYuG@0&y$@8h5A@K|3hNfeq$rWv`^VfYPH~ht>0+Uh3{G*3 zI5ulx==x@2(veY|y)=xi@9d88Q&wYQc}JLpxxGho)L>2O=#18wIH4o`IUrmoal2JQ zTy;|JQ43mr>_Pfb#GF!?Baq@`%EX*abs8o^0=A36>Ufl z+6x#WN^B}P-HQ2d(MdC2V`3>*Sem+h3`BwB{fo%RDyu6ct4QcaxeCIf&TW|ZSi#PU z6^oCvy(OyQK#F4t1fi##B{TnqkNMKv7BBQ(7Fx1a_&F9bg&OG zbNq@WK@28D&&1Op)j?!VCu|4ZM&H{XLgpO8yq)Br@m9J=X}N#(n3-fzc6T_an4j2l z6W4ILdLCCrC3Zd>n%LL5^iUkNPMmAw=5HjS88;3nNYu!RHkY|Z$=QXd2TWxMF5Op0 zmAV~vm_7ZC=l@pgsFGV<-i|7JD`Y!<$i0v{{D59CwTKZxXGfK_qWvj+mrL45JF1j5 z?ccyJtG+UJ9pNbBy2=dvw8v%j^wS=hHR7i^8f)efISgyVPkU4|n$b~~*;M<;(~sBh zJ<9$cjP{LQD$r z*KnAaRjqgcGC>mAJ zc7V1JTH2)SPQQ>Ausb!dU9i}SUD(XoEQkg{wEmGwpTcCR2a-z`iCY{+M*@zg!EtZ! za|#86->a5ix9F&S92lZtc<6u{9X%4LmD{99pa6c$j;?@Z`w_x*D}=jTqUh|65lTBk z*?Bc1A(%V)c4Gl6^oKoryI3JnSpc8bDgYH*TL{lTWCX3FkY^g(HkhOs91xHoM=pF7ZV2=}3n?+UX5=VO^526o& z=wxliNnNRQclohPiKpfYn2uaN*oWMvk{Po|-So3bcMpMf2((|>deW<~h9#?)%HycT z=B6Ubh&kB+*N4INCz_h0cKOgLwi6bWTa|%g2~#H!c7pKy9#uKNs+?VCj#0FL6&?ps0Lj(=w3Oaoh-D|&~N8VA=R@p7GDbe%!r$W zF%bS^y`GXV?8WS6C$G}<*Au*wQ>~|OZ}9s61paz0tPKyqeHAV>0I!5S&vK~e030S# z?;FtW-0ieWoW~=&t;FXT*)M`&f zUKn8=U(hzHBUwo4Uz@fnqLcI%H-bLImOXfb=DJ54_p+$BodxhK*P|WrvO``x6uz9n zUvxQe&fBm{pYk&O4xH~h=IxogRlI>!1nkiS-a|R##mfpsT(tu^;^C2=GGD_p`U&{^ z5SufOd;7RQJS?KLff$WO4Lk#5#tA~DA7E_vAcPT1nAKpn>UbY<0KVwYOj$)xZGJr&Y-5`bNl0MHZ__+-QjnON>NWtR+#C zB?{P0Gh{IzJ)A6M@Mbo&kWG-kR!c_DwF`~R^jusbd7CBAgFGoo7ncdM-@=gAYN{?8 zeu$%%*e^y~czfrn7cX4Itnc!rcf*IzaqF}5fsyM}4tp)>D(B$nym#kKLJV4nr1#}X zI%-K*IeQ8`LUN2!YurL)+X%k!;axmO@o;1ak zInLDdwu>jvD*em6PUEo^3!A0pjP;cCX8#i5@QTDSiBrp**L+X7)Zb*{rX)@+d*0n5 z+=#!NaGAki5KpmKQ0rM(?^6O*?&mFz`KZVV3#Ps@YrW83=C2|`yp4Fug2`7Ky}F=_ z`6hgLWy7SKwr~NZ7+LYC@*958;hmDxCQNx~W!6g%t(-9h|A)P|4~*j~?}cYqv#Z@% z$7t=V!FZcyh)YiOl z-xzR;CK>-)U~{K8#u4Fda8Yg(Y^Jcdpktk z+xu}fon8uj`pt6RG0(GO3}pb<)5*nUx%L=^bzE3wQ~=A($4KT0VJXT$Q$j4GC>KPQ zof1ZJ31|wx_?Q_Y|IY{`>m{5Dzx9||A!bv;O3r;v;nyBBBSh+~FfxkL?#|m(Sy+15suQBc?=xmLNZS>m#|1-tzYa{S7a7k86O9&_ z`K|{TNjDk4{G{uuFk%-X>z5tB&8z?j>YBxbc1Hl^?G}?+VIo~Z(_~tp*jOi#> z*GcocisdAGgh?s*Ip%%L-DC)lUs=q|f#w&c^K?^vODzofmBqraSQrMlp(q)CYq78j zrd!dD3SjXIi{C7d2=kkj#wnG!LTqdj^)=7 z%W+;MtZ?5D?K%QGnZhW1eu1Ts4lJe1 zi1k8=r(4p#4p>Te66=;JVQIPiR=Sv2x9b&lX&3co-cLN3Vac;G^M2w{Vd?AWk z#mviz$8O?Hm3vody6Y-o zlSvxw*5Li#MoqsXAp47HgFgy&jy3pM&uUHgqLUq38hmirJ1~=+G~SWaGoFa1UkPBS zZ*&d*lBXqyEVB-&SzaIWv}w9it1OYgi#*~qmS*oA@wDd_Ab-zXgFocir0L$!vInS_ zk+cTC-_xb(ZilkGYO*Yr|2Avzdpuh;{r-$BI7qW~4Sv+KP17Bt<@6fMr?@Ao>0XJl zyd*PTdd=|?v8|rCru#|F0*5S+s0ho3{&r6)hlt?K+}7YDp57eFU%*Lg@T)w7n(p;2 zdkT2PVdD~Bkm+mi%RQr-eydFuBy$bk?-|RX`lJ(ERveZ!_-pEJO}|zlOStm-1Yy`Z zz_MF|zpU=j^h>O=z)NfJ)9T(F^1)n#KdWF&4>d3@Ek(Ties|U4ImNoc8>LIIZ85zX727gdJtfhVGY`#zj z)Cnz>Z4G{0J))%?*5LQ6M;($ReM0uBlbXfJlM&^#FWi`VOzRnRXLnrjzgOG)uu^nH zh4+F2oRWvU0yzbF8S*^jCCF*WX~@fv7a^}fUV!v_;JpBHIpjIWRgh;PBal;&?T}|6 zw?dwRj6FfjkB|0eK1XFysv6A;?+CgOGkNyca;0 zLykk@H2?krahiVxo#uDn>d}-xS-J9viu1yU3$}V7&J|oDalQaEL^y+7fC(U+K`y|w z4bC7JV4??SkPG4@E*I<}aisurPB?>HfGH}ROE18T42~ifOcSO{_0vO-dYOLt)oUb* z)hQA|bwBCK)ng>8)I%hy)gvUr>Txn@SI?8!q>j?VE|nc<{=+Jlbf6h?emnU^7u?y< zu(OXzRpyr% zzVGK>{6)4?%301ft8{LXovD=0FaLWTxmKIUM&id7P6rbzon3zO{%`zQqL7_EjSn6A zW#xgS7vqoicrOjFlZAAr6@FZO;w`6>g>-ydXnaljFQ&3Nfh?bm&N$PY@bXO>o-aK8 z{bT`Ffmvw2Cj3PwOt(F-bWzgRn(FDHC^DUw4y$w|*x&vpq58zqqCZRcH_|Rg;~=(Y zGp)Wb!_1S{0e*VA8z(dqe_HlXOVZo4xua{tT6SjIa?m<~)%9r4hW`?KKIy@E^FDt3 z+l$?BT^rUgbCnT01SC#q_YSb<&L_bOI)-?}RN7arr-dEv#!vRH&FSs}EKQvWJp9F^ zcWt~UJ`!iI@pSM9a@?aM(yz#Ha=hw$PwGd;TZj64DU%926T74%^wxvnNj1{l&2!v1 z`|j-;SQ8zNmk+us9nQfg3p%=a!Z_M`5%N57^qqgy57XiIpz(}Oz|;A$&(Pz{^ZO;N ztSH*pua12_o7Z1k?0Bdjhxc(HeC=3YlpGAOOvvM$fBI>8>jC`*`uX}u-IfArm_cHfiqAy+n1J^K68^Z(4cu|MHA;`!9SekYvN>W$xf z|Mqjk$x`E|zT0Q&rXL@d&#WVE7zMHIpX>wye$e4g+8Xa!ODDq9&a)>18~Hg3IwAAt zXFK;MixImxJVUH)gJSqEAOH0;bP|KPXD6HC_kQG#JghCz5|17)nF`TGa-=Cx@ z#K%q)c$0pF&3pO>b_^d#7GXyfC@6pO(bIK@lk<6({qL*5a^!-E05Uka4O$ zS%x^VV}k4`a?38(ZFf~Er!xErB)#pUJ!?}t?>uq#-XyI^=_iz<1H<#$PJAG#t?#&J zW83{L>$lwhGu4^xFoUaYH$>LqB!Dx%VeYU-Om+ zw{)y;Tg&QK5$(War{r;#=aaX*bAB?gaSJNomiCs;wl&-Y4R$De zt%josivtN-@Vqw_e{`UKXawiFT6QrP5~V0B%Tt!JAWjG2s!bF+D`m*f{KfOHrMs7y zXCA<&`tgS~wZWu+%Y7)B&Fzu(tf>9>zU#rwEuCGPH++|h(u5RVt)&pmTkpZ(~^ zWu53H?%RlbcmO@5?oDGJe-c^K*>-QFvxR!7WROl6S^%k=K%Xle0<#|PvN``X52wV| z^YJiE1%L8q-~48B9!`O+N0->yv0-h;eH&Jy6G0bBV|KRDbzB#EiZ+LLc`nEOiYT=El z6u;MYbTzMU(Vr4Nz9+_BY9P?=V73!@>%T1czwz7HA!+NACD6HLM=CMGJRdxbaEa=jPJ zUIn-Bu0uJKs|d8-lbasL5kge#H9Jy0%qPPOf4}`r$zohXj3Rg^PPC*FWAFRndrzXH z6l<*H_$KLLpOc4%Ja?LoY?AXvqO8>P_x=FyC4D1NzIFR?LNUDK1ekXm91+D>tv%B@ z4!UKeq#onTiRB+`fmbBdm=2G0e}ce@IXs*H>qvZw9-$6W1lC7~M<($b?akb)FCSAyR`P)gokqnE zeiZb}^Y6S{KC?-GH)Hqe=?}l>ZPHOz>lxQ%fcl!YW@>=Lg}?2&pRp@E`1+ntyks5> zg;8DyT^&xXYHZH3vmZmMP4_-kX?I>#IwH%AH{*z`ZbvnSP8c1cbFG#CkTzyZ`#5_!H0XAumU#1F=TR*T~>#^z?^tq80~+ zx5nwR#J~PlK4>yN(YZPv55cx!#CH-7pqC3Y< ze|Y-$2yWx(&_GYTc|U&Pl}=E+(}ABb4XzdI@9%5gkN6ZJo`w^EGaruLnJhu1_#N8( zfWmY1Fc|A;>x;^d|2sVfE}bL&TlyOz@~_4@`c*7`wPO4k{~kTkxG{Z%en7twwE6k_ zd;KMSPK}H%(xZ7IHhf0zMS50hMutEAiLe|Pzsg1R9XQOrW8^YD zK;n!C6vi*;Au=1c*tg=PU+OR6=awB&oQL@*dVq-2@ny2VYTDD!*XU=t867G1zabT3 z4=5wV>-yWbuU$_uQa{4MX{bbKh4dTQNWYsO(dbtRJ2*~9wt1_$<%jA4qdJOeyoqWy zoCff7+=RpzbQVxOp2ra|)?iistps44?q*9y6VwXkiP!n~uaLj0L-J9ehn^X&g@R$P zFSLfj_SW4=q39tamh4#_o}nuz62X3dch|2EB?F1!u0C|-Js4+hUh=DzbY__+gNOt3 zRYL=>>vSgFn;35H@9ADoW_XYK$VcKGqa$7Ppx8(z(d^rKDk&_=J9@NSdW6iNZfceE zh+>IHx6&hDVz_Mt9spt;ge>|Ik&Z6P?IJmvvlKgcg5VKHycioq{DYJ==<6vS|L{j= zH{dlEB|a*@o5H$ToXV#To+bdWQ@ww5C>EzUe}fL_-y|#$YiY%a$j4LA5mTMT$BFjUxROcFN%t-QqhOx zsrRVgps$1ByCfNeubP$(5e$Qbx0+45x0-f-V2q|;Xg~#e)ehDg0SSX!o6YZl6?@d) z(Y2)o4DjBTl;u$iIcG}{mc>UJh6~a~SJy6`=t-7{)A@R&FJ4l8_dnqj@wly)^wF&t_uYg8K*iH}$NS-m$XH-?{j_vvl)j zoi$v;**HuT`-#c@o1??CoE?f8u8u^b=YyD~9|w5G#8{fg{*a`|ZS-^v+Y1akl}IEL*0 z2zei~)Fa?>8|K8!;;~G>_;5M*-w9eRGJ;>DxPm_y4_U3Isnox-MjS=QR77J(hvJV| zBhFM^1K+d0gGkBmtR<~KHl%;-A8g+8WouS*5)mV_Kx~N8!{*{bRzn6!RP?)KXh|xX zDMh_0!#SJ08;rT0wYaWb)2@3_1T*PN#=9?b*M1h>Q!o3Evp9ZRBhi|l(wk;CtY1yo zLhA_!D7G1@^>H}4{y3>@otauH0o5J;;aY>W{gHz_mQsP522bcI(7$t*Ir8^WXxbXg zU3av%V_oT?Bj}VY?OXJA&6JPu_KmXFXD{xgsy+`hoXoidYXie?qi1Fv*7NWvg<|oC zxu%^6rmp@+M9_4Poh*bC(O4|rbL;Ov2e06`Zw{>s?qK`-epdP5pMeNVPwII+H`Z=P zzWcy!m}ED6k$}BQ&fCCVcf@0l;0^#bKz{Opn?9{Ch45>={-XKqwWk4U@$Pc9@-EcZ?F=E_T}eNEBRzc5_swLDU)<@(GWsPv4hpXp^?b=;ka=Wt zbgI@}sBhJ4V{)BNS1@`ShowTk%*t z61F>jeb2vuBTLr(!Jj<~|IX5rHS~Txc7k{7Z~x+3J7#EGlJ-dNEJY zwR!z>4X-~4#x1>1REbUavC2D1dh6TNTSRxUPV>8@txA6zTHb5^9jWKn%X*f8iCypb ze5_kOAB=pmxDp{ZB1x<75%N2Nm}Kny=1xV(Nd!EIXKK^;sgi37cv8(Y)R$S=T01%Y zK)Rfa$khlkEmN)cJ>=@c_I17+mArURTS<49N5gKutC+kz*hW(BAIX(RERIt>m~xJ6 zY(o}e8DgDS***Q>i!Wdid>xghzS!&Ay7wK)`FPaY_TZMSTiVuiY-roCw&ni1uV8I@ zA%Bh;9onv7>{i&qmHBER*(_+Ep~LZ$gb10nr58!VB4rV$PJa%P){A6W7h^bb*CF- zLtk*``@-+S{+*F{Z&R9+J?0iHXHaB;4ys>b%_8=;ydq{|P{g=7M(IfDzA^KQ2lCPa!ipomB1Js( zFQ*)h{0aookTF;+m>a*G3k0#?%QdLS!*OIBddzRgi}C6A?F-Ni99t zOEjF4{g@{5ikjScQ^ayU>cHZgcQ&woi^XG2Am3d=}z17XJP(+USVQo2rEh0CP5+cp6H!< z0r2rJy*<=$r`Xlgr0>MJfy}iq2o9ThaXiCij(~ISBhvX_R_OdXW8RN#8btF^OQ1o$=Hs@RuST=Kt%42kgKDg0$YqJRD2dU>0O&2*s=9l+$ z?HT4NGHO+R-{)3*cG%`9y-(?9iR;fRw>QGkygundiG$zyJMPqTtOj*#>4Ha~Mu< z#*VH2H+ncNfto|%JcrY^7?fPz|K~9Fk`Pb>ZhY)zhw}!Ey{xb|HujP*{>{f;QdsmE z=*52FH)8B%h5a`idszeGUDg{p_Ojx?abqtD_up;oC53roV=oEd4HHYl2Zr7~)%>dID&wkWqH@KbSb#uVRuIWglKejLD((Y_uw5%;=^xpTiv*lVg zF1DkF4v;NFIC|9lh`18P>3fhfqP`HzR$DXTsLxE~7e{$%H!GsuysK@hokz<#C)0qK zYoPp|T&pAyZ**{&b2E|`(0Nv_k|&G6FImyBn~HL&%4}JhfSl*7oC-i+=BAf-*?2Bu z@yNM3BkyeZMb61c>*nlc9h{Pp<1pB6mdpt<&yoAaTq{^!b8pdHQGYjDmQQ=jjgfWd z8gW$it^w8vZg48aZt1|bOy7WMn`Ex3GPdkc%JQ8dO7Q{m`|=8mXX0%Q)Olg2C#LmT z9C$6h!5F+huNcrqBuefZ8;6{~=X`S)MS%B$?BcLodQW}3*bTjz*7N2(a-pvb-*ZF3 z@`*@0LS$Q!J4c7G+P@vggp$J@iNp;=9Knmy;$gEJvU15Ryot>&bA4@d?($7%Y3xgL zXRZ~F_7<>#shRkEzEXS#D!rS+KNj@%e1hitkXcViAOj6|naxiBYoOsyam*A~xUthv z`6W@@GR*BBIxS9-G7-!= zU{`;fVvs)m&tVeV$dH^z*Eayl_D)ighMY)1u4^ZH(K*aW=My!w`rP&c*o{}53V`}R zvDD34QSM9N`BdH<2iy5%M~3%Ir;^I2K6dseaiy7Am+i)6*|L%!P^R~t#_{>IPZW;L zP@Y|7n$`h1#VKtxZ#O=6dKH1^IH14Zrq|Abn&+5)OCIQX4eRYj$4=3H<45*RAtBpy z__pWMP=J^lU9cNiJ4N$%W(=u3iuDa34G-rL+#A6g{vhA*{w=7(o_r%A#-nd6d&s8) zPA3p{gL$VqnZY6Q8OflPWRQV;-e=2oYy-df^~kfkWoHHG?b~iQ_l1e!4pXv0V?J4e zREaX>93!8PM;b4%8{0b;1*idwxtSSxe)w$IK|GJ@Ox)ymAPD)S)rKS3F*&EK%7G@_ z%5L<%{VtG#wC}!^Ca|p?td87blT|jhP0aW<27kxxnecXTHUp`%3B>UY9#jq~F;`9I zPKjxoXG+W$Ss*#2#C(GXRm01KZdpz%6Mbcwozm0Mm+l%^di&j(rbdx4bUrX*uhiOP zt(`HC%L*QsRapWM-3UXs+09SqH#*Ec_rzM5=}KNV8Zx2nN*b@Rx7cOkY1!gn&x2XY zg1N0RGnfd@MfDG{DIS83t;%pnJjcD#Pgt&cep0?z`ioHEAe-)L^UM5~?rZZa_$Af@ z6y*r6lP=Wvk}1kXx?EaJEGWt#-5D+B9u(y~uC*5TRR;^@3#-HUB^?v1!B25OtBnkK z1;EbAP55OT%IYGOaV%>qe%Tz%+J?v0BS`xS(=V%j8W)#ImsQgV7yig{Sv4Nv{%Yg0 zYVyH|N2PQ*vRM>#Ir9DChU%~F*OpZYwk z<0WxzMOj+3nHAx5{`^y){7%#^Zma_^(7sgnmHxji`32Cn*~HDXCCu+^{a*F+Tdi?3 zEhugW-W2cqyOJjsJYLdeiJNIfIA3|!2XFq~CJmQq-;K+(zkd%d(?)Ax=e-6n{dWvC zSUOyF9zXS?P?zy1oq_6s;~zztDU8(yHo_;detIdQDuvJ7qNWOz7nHDV_YDy@fuZO+-tP}3#_J)f1-|N_J--NQ{)lh&xVLU0J%zrtgaV4GSN+^q84EdQ# z|M^0!*1tA2#61Qh{AZuNMQv7n@TyKelIAO3>9SiNZv9>Z&qx)xVkcHhUWXYH#rkh< zQG-5pnKjm~T?s{dHS8LLcscBeY>bZVNGRT>u%{6p=R^F?X=IuUZ-l0=#cE4wY(+;b(F1m;-~th8x##D%sKtJ% z1S*t=ePKUydrf}rDwKp4F6``QbJhtZ@mg5E*l(GVs119zjKl|qkxkw(-KZTpemzW? zjPk>QT%@oxki_E`nF0Ov0yo$W z164QJj>pe41NsX$a3ek4JOtd>9v=YiO3u3wcd5{T{wS5S^0Ra+TvEV zOgjyQfP2A_eAmO2NYp~SWd`u!TJ?h4J^+*+-oX2mJHC*M@&MIQZG%Hqs*3+lt?FT6 zx`#(8ay*W&nsL++M}Hf({&)7nPc23BleOwo4zbj$*Q=od_zvSCX=|H1qe(hCFhF_n z=~~#{}AdCT-Hi&p08C~)835Lvg;S9VUlM&;NSCuT6OZDDTnng5e-sX;zDV7 z(Y{cvL#JlLxOuuKhNk6mEpa`%Owo2NaqWN@SfUP(Zl}L?&|d@e*F#IZ=qjQ;Dg1r^ z5`M$vGUb7dOA0sAmO|=-v~^+ieq=WOY6`1c`CoT0DO}e-GCa^voz%)DMXd9~lP&y7 zZMYC0>EZau{dg<1MB5O5)ch@VV%}0*h0SUvt5c|=uZD1MUlM~gT$Js7Ii%`;y%;Kt z^o-~~UI?kMA%o{bKISqI4HCbe3%O&I1$$;ge)97t>d?1CJ|t57`W90@B7U9@xv3}C zzK)on$!q8qaBv+d$KRg~6~tMO`l*n*y?20m&?nem)Q5g7q{2xcz51b$m*U)y_OCq_ z@-eTF_{9p`)sKfW*F&xz$m#2>-%TiAJa-)l;vc7kvg6eCkPlfTdeO=2A<8lKvlH(p z4nvO+*lBjaj9(A=@l*FDqG)>nM%Q1gkM}`42(A9Bg<>4le~Y&_!5VMlTnh54v>jpL zz2wM_R``@he6*R_DHQp9}cRgExV}S`OK~A_?xLo znYGl%`=067!|ntX(z)wlaT|3)**W7fD%mvt)N9!}7rr(9vC&}^GCBk86n?LRuZ|)8 z_oOR~quk^^lh-bo9L6IyJ~1ofxGNmskK*JE6BTxkE9_xI4WxI_74~s2?D1~=j6&6n z%0qq6CRbQv!7(?Ico2atW$k@KQPe(P1EPbT5dJ*zbxtT1L8!$fFG|fNUKi!MD?E?E zG0zqB`GnCxI3TV5;K7b1em)?_X9IQmp(S7z=w11*`(U6?K_HO z0MYop>h(}D%ht9&<5}JHkOzY>Dq7!uG_>u>m|oC_(J2kUZ-e+fh{*5QIV66%u7?8n zndlo4Pd33|Al@f_ekkPM-qZJp_!*fEdEw0)KT&7K*^lk~2YNq^{4t9-dB?AZii~*k zdUOg2Z)?AY*PLbH*^nnSyk(T?^b`_6e`6%%J9`~{;V`D#qWJM~`kSgM{yud*#6Be` zk?`yE=KytsL1Y&HnBa#CAq?YlI>36xncsv8cl5-_p#gN$_=OW}`mb}p38_1VlIXf> zgOn%zJ>3abgtf1Q{Nxmr?QO?v(b-Tz_Xr}n;(3hQ`*x;=u}=fTc;6XxkF7xKMz==8 z=a8qb54{;)c`oGbW6m2A%B^3=SD+8&ih(sW=*`r=zHW4o^H2Q-h1`S16pRG586*OK zwUI`1q0EqT#_!4Bg#1)}^!{M+BtX{m_cWjg4kH!#^EN6C{MnxvCIIx2g?;fy^PESEVsPVT2PNeBJe7vl1>?(?jEJ4CU81CzO?; zkh%`nEwI6T;X1@p{}HR5hdFEVrlGq)0PlAd&j3+ zuYo{cC<90GqJJFiLF>fdbjvk)98M^ADk!kFVa(CozmXM~hF>`L20vhTGE+Vtj@7;? zonEtk9Me(y9V@t2Yvp~7r1&m-8BAB8{^&?(06qL*^U4j)_#&I;M(> zNSZ@O;zCGV%EmFv6s;1i zgb#u6qZC0Fm+A%T93&;3RUriVW(2u%vhWEh(OyA|(a4(DBRmDNlhO(J8Uer9F-5FJ z19~Z--?qEh3eDK>r}QfESjdG=70r;9@v9+sf_|c!+qM#+X=;Sw?KWfV;s$;IN&Y-?n4z%`po8N>1=?w ze{Mv?lhp=LH;*zOh&>zZW6BbKPyjk-qrOxLw6_3l*Y8O_ zgp7b%*$sy8^8)FpKyt3^Y-~cygaE4n*vF}wby94Zox%8`0Hc)eD5#cO%3@3dP5yC1)Sg+nHhvi#RsILxHC{2`rE&==&M_^|+DoO~8vdMUQo$dj+I(ACDyKr)Gdy2E?uIAIaq-J|6V#L?p)r zqH}-BxBda`HlPi#mP7y*0cfAQRF0OCUTr4kMwRzY0(Blx54&ru z-J}HjUK)c;&J9aB2>QevI|6nQV2`^U8vPfj(wq>Ow`8l~(j)~?ZwBf)r?O@Ze@dV_ zk3$htdGZFZ)quV11dECBCtc?StaE9}XX$`h3QSi)lU!O}DO;O-K%LGRm7VzmY6(!Q z=0Lq7P@O9$-zN>cI^Z=F)TdX@YXZW##h6>Q0kaq|Z3UYOo|I^cA`uge*LQ+4Vk-Pe zmutTMMRLwc6MMrD(8EBF7TocqW;^J@r2dnxpa6A_Fp6Dgrht4CAjb+UmEQbVNL*cLMl0(kqj>PJSzH+Wg+_6`LmMx_^aa@Y>Vb9KL#)n>ofrh6F}TX~KG*qs zAW^ysfSq%S7^8H>0xwH9%MVYXOIrxI%bv}0#tA-$T^BSEuM%($wO#bCD}dzky5-J| zy5}14xY$}IxY;X{fzrV*{1fEjhdWJGI|z;w(?)=P`8)dB#HdBL*GT9?7Hw&eyXDAs&H zj?V#^ngcS8xt9R)h!@P=jAaIM9~F?yPk-i+)#9NBm3kg9PkA4gG3Asu(jD)3>Sv226$WqE8=QloG@h0g;gyF+@RPo_MQ@ zp4v={F$bMCK)EKsGM0nPOf*UQ$<(Jm-dH$8`Tm^9_vb*MvBBtv*JYB9X!^_PTlHK? zZN}`jglvBKP62vT;S(qT6Im*Ns$9@?4`ygZ{|#uV!paXxV2a2?nwF>$aLdwX&7{al z4$%PlEkN!mTww=UB!*~MfT0grgFw%ilatV8mu-MQ4fuo9n9SrWVLxtpS|8sT@4;>~ z_Q8$_1)_<&4x>2ui2~Elg%C& zd(~dX*0uft+zXvdVW}9qcwN}SO#71AIevKI$I&e`_F{}Ec$#;KemK?o2`DnNS$xHNO883;;|INi$6zlrwaSztOV=W zf<45vm%vRO!roj^B?p4Y#7_ftx^Tn^m1@ejIYIC0`OYlGE1QV0b9nFH~&KpgaiWJL6w`pWnH6wmVlF=L8cLbSLY1?&;P?(=OcuoOBP5lt-tb6Q|# zELTaGHe~5@fIaMcOpdKQifO`1Jq1DS>52#UJ>oj1OK>hnKM3sX9aM!%FjK~ z0`Ut#Jm-wKmU7r%p?^WLwFJXCE+Uq|dBe>Dvm*1!lJH1mmVPJNN|)K>cf= zy8QFx#4BOi*&JJ{yr&eK&HMYY&1F5sI4scTsJk+KJPPr!_0*>^7zYujQZa$=dtJ( zu((Z4qf0<$i)h+x#WO%1^JBKctPi=&RzyWm+3E;lFH!ADgf#AyCG5*RC_v}vg01ZF zE5JSCgv;3DZh^ZZd*w)@kY5GxDJNjo5APGe+4^>qVW1G72Id7nEnk`W?MPh&dbZ*; z(HVdF8t`ZQ;4czaiGfB)bfcmwxaTo9CF{?q%Z&JrxR#e}~2JCzbnyUQx z+3J<*ih%XuOSLyi4>F0%v#VBe;_{LhK)+-X7ly18m*=V0pJ8FYR8qS@1{I@b(4e=k zWTeFelg7;F#mnXL%Q9j4U}PmDEc)vS<)uu*B0$Py5Q(gO@SQ7(tVl5s18qiD#Osy> zm_(&;!%8A5=G%@$MF3@dUd&80iOQ1qUOpDq&Jj_0UgY!hPDEuPeP*7wAu1BG$Z~8v z1azZDM8!mwGQBDnG?S>*0Bw_o-roeX5)}cL(HBXPvl5kMfJ|v1Dw&WOL`9%yv_c6z zji@XI{2ppB61)vj5y%YG6WhE*KvT{;G z^*6IpCMwkV?9Bz$N>p4xozgIgX`5+%rl1rm5F-Il3KKDnQcMZNjIp_dm`*7?fZZB6jM;P( z7i*q^Qk)l<8I(f8w4oGUzzzmLDI`>BGE1fu(;|p$(N3ong}~nz0HtukM-I;j;B3{@ zpcFnJ9(G1#lwwvOW~;L@rC0>e;{i|#Gn(m?!e6O>Ke9D^E2Rhn^;`gyLPB+*6y*Xv zTNjO*D^m(T;4cTP9~CR5s1c|cltQW%Mmv)!g$8U_kpniP6b%A6@gNisJT#zE)i6=I)d0sl%g0R zMV+#QQHr<#oujj~Qi^%N9dp8ElwwfeW>5-i*0G0%nwAw*b!83$vEOTy~)s zE(PY1qLUwynjZ>LoL}*oqkkXGyY9;cAGyqu!A=bXfq$y#-EwgjN%%&iVVm|33ixb= zi0IQ7jc!~;{O1GzLeXQlTs^LLp3vK(c)niP_Pi6ogQT5W>ato?L9UD5-~COyznp z7f9rbfLsX3#$s&HFd@yRzZjEY6#t^k__GPJ%ObEjDyc~!%MjeA;s|)J8J-jGbyevf zi)?)k~@2voSsu;Xif;VeE-?%AYvqhS6h{Gb=%K^HlIBghj;l0%Yvq-)v z8n0e{XyDAj;&+EX_JR`ogu6Dw^%G3!-(+!V*hePU*D7vB`Mxsink`tjt8@nEvR-&t zj7YuEVdaQ9G4d*2C3X)E8!FEn^R`yspMqkwP!zRpj*q}oc-wGibUT#2P)3AO z9BWsUor8GZVm{}QR21(XJZ}@vi(2_}w)&tbUpowCd%BV>v_p9c%1uHU(BFi|8hFt8 z+B9@sLg#N48~bqQx=VY~wN+>Wt?U!WF1c5f&jq2|CUjbB^GM&lY$%{8p9w=1HC4t4 zK~dgW165q8{H@}%gS=P{O-g8dt@?I;B)S2LUZK!hjjy+&d?5nWpimXJ%HIV=(KbOl zDzrtq76a{mT=?)Maq-+w&-Fa_ z9fszB&@5=}#0{LoI2<1D!|8|E4t9RlHvyZ2!p7H1J6C~#;Eq6XNGSZR_w9|+sD z0fRq(Z1xHnOr{&K`U`{q_p#Y&GB_p-;Cz7}7F3j1c9%kPTxc|C^baj`2T6Cr(3u~3 z==PUBiLI`Nj^5*&j-VT-(9Q^*A38q3gQ|{HQ$iJh%4{;PG?MbHQ2N9kaJ+V`HqbHJ(>`Nqa$PDPXhxyt0>+7lo2um0HRxCrCRjwDX{q z24@I(iu9L+zQoXT2N^IpPX?ETfo6UwpmWVfK3*|&cv`A*dFVX zYEL6Q_K3&);57B@d)(@0k5g6g3tgeUofMi+Um#7f(D1it>nC)dxk|dA&=u-4jL=-Z zUQE#|7b*`_T?0^Dx?W9+DxoMuhOw`U`pO`IRT~QZTqxdoe1ak#78)<#uM5RvM@dm* zDEQ>bN!5ETi08}o=M9CTMX0{(CHO`@w!idXDSa$)dQaHQOY7Ez>E5cnRj_2QVNpmo zf2)`8i8<-6I9w7ez*kXMtSr>$EKjt z5Xo#8Muq$E}sj8DQXRk2Rxc37c?`{(h!R-@90d6D;`u8kW`-N4e%TDbJZ)2u| zRVSpd$Hfc&jr{|o1MTs?Q6%N)gi#(bThH&%P|L8h2 z7o=q!GolEJmUl#$!37`!zp3t@92Y1I06OW0~vN_g#M@LNMQ4v|JndE?yBmNjIRk}a)?759p^EJn4N2W z^?bAa%<6WW(0;Sn)4I*&a|IONGa$6HL}+&|Q_KN@ri?HU)&$WmT#IPT^vx3f`spce zYxpLgAFmT1_5=oO_^^k)a=PSJ&^CU97U%{sV!x@dGU8&P2(+?QXEw2>DD#LA2Zb)3 zEfXs)7fOjO6DzJVpBrp>9M7x8b33*iPFM1>;%vD_C~esCa-qv$%XLCy!< zGF9gHpR?sgp~_&(tA!?=Ek}eRlP$Lhl`UIt6IwgA+%A;qY=vbxnOq+L=Pomf!*mU`K_4F@#rM@hrgb zbxbI%WHd~=-9l#}m8VFxN2t07MPowPq?6;T zq&*_EY2>(=;ExI=D-?t2SCMW~=+cREBWaHbZ6Ni1eP6@3ItsbK)b5G1}Cz-b)dglg*9l8`Fwfa=-J)wWI4Wd=`37NU zL!LP?UbW~l;bI`PO4v%|ne*bvqN*}8>_*d0AN*)OPK^DF!aCM!VIv4Or^TK{9^D`! z46FoOqQ);{NkACM1e;T1iZVsI&0?YxY>64eq}?!)2sUTOs}~hh!eF#X7)b=1lVj2o zo9hx5f?!L8m<=c~sUb`>X^^MQ0VQmv;CJ*OaxN6ZUsf?q-%*w+hGK^To zg;5$0=UkY=qqwJpl^qY~bhu?vqg2Md;spy2=VX|H>M0%+c4-uwQ{nPO`lu_b1#M{|#1CJ|_f9)m#d6($ma=IofI z7sa;EurO(_M2z*I_6sX3?ak!J<7tLE?ak!J2ZW)8_GZ%KgThXty_w|rkgzgoZzeZB zEQ~C)HGcSR^bK?l0w(~g|y`aICg2#wY%amfe#P+c`u@_KDCRM&(`BGy4X zpB2xoTrv!mtD43_NT!9EHbCPMnhcg1fz~gy=`3>-l*Oj91MB2sdRO^Y6w07bf?W?A zGo5hE4qdsftDk4x-HX9;dpSmKRYI?yHRQ86$}4-zF|w*Ql&rwk;0BZ=mi1p5CuLYD zY4opeq@|N;&`*-SM(7!@5XJY(3DPYWI^q>lslPHs+B%`7)l9vrymFp24MJ0F*>;H_ zrztV3gxZ0zT_KD{VN`6{0|~-4{MhU)S*#WoUcQ+TD$QR3MMNmlSylsSTZGo0r>!QN zHer)asM<)|F0>X7+(oKQLX}4021(f^l$k_qH|e(uy$uoDM+V!3K^hUO0G)~&Ix7*Q z_u@ilA!3iIeG~L%N@%?Xy*Nb0)GMCD-+#25O=q7}wF%1lK|^Ki`g}|sC?~X0p-Sgq zQHsf!uEh+VUe#3XI{VmOzWGGCJ`4~xW|yW2t4lXekrh7idxVvTS3UK9jx&Apd9u(y z;CqFYCN(*+G+16;UTvE0(@pCGY?+-OWZUC*|7(~czF*f$T*zNeTxeWZ$XuwZoVd^d z0azrT1pwl?>k-PtgF;`ZpF~jHuhfv@kWd7qBMMM9kn*suY>;Wi1Mg?)y?S#)1rmhe z&4jSBp$aY+Gro57YTfvVF!o7fY7e*aR1cDso}EX9r8(FQG1ctNU6R?PFtZz>`Z=(x z8hfn`;A7$q`CJ~GBP^MtU(5X9__wQrSk z!(eq#D*sc$So&0R#&n=!Qi|#s-Hv}%zfvS|HWegoPlB zoMbToJ;}4eMC!9NrCLf6x-8dX8giiU^)8F9#WDlZkvzgEjRSIGB{IjKZlz}tr&JSS}1LG*Y5fdJ3w9olN60xmC4cCeb*FSs}y1!bGBR z5~V^Vs4*S6>_d3SF_c^PGW_eqsUefVP&#H&P`;a7Gb0Z*&llZiOr-^ZNd(HD8>Lo z*zChBcV(ouJ;Rc(>Ap9^a+7Y!yU^zkF=A4q6O%Bl(%BJ{F80>*>BMBKcr3FIq9xl* zg~>jMmPCcZ!alA-6BimQ`?v;G%2dhhV-~7jp_15#3xoPW@!ZNjh?tBDm4$tTp&1jJ z4E90XWVg_!vyTXrdrYPLz2od-uTXkh*@kaLSxm%ZpZ?g6cr3&qaKF%}6OV-$i;Nq} zG~z+Z143y-JV<{~=+lS?=?)2X58I3kSfsKpFf92FK4 zwU{Nvq)?<&i<(Mkj|r_kwP+xlKtL`)kx3z?~|!h4s5&O&CuEraytWuc{-qgV7-E>n0{3=Qqlq+=9#=VB$^nGqU^ z08wSSDxO;j5Y>ZghDstpeSSil6{>Us)J3syy@|#E&zIB(q!S}p)|#qBfF50$$&R)y zKCuwJH@;_nVUxytwl1C`3;i2hY*_J>s*5>0x>$L+(zFU1kx8RGc`O;x@@FBFwUI zsL{o%r8io{8}=M(&*DKc<{YX`*g9~i-HUgVG3r~pu(an;dl&Cr3`4!zZ4$;A911g7 z(r%zG-Hs0czUT3@o><_k!vNrUa44J~K6U+L#G!cIbt}9K5sVSgRtE4r45isDAx17% zp0!Qr9eGw%SY+o}abY$m&q@hPXP(t7Oy=TQgTgQ?&l(k0&OB>Om^kyS-NM9yXYCRC zY&>hPFmmQu`-F)j&)P36oO#x`Ffk~U%(3)Zct99srBDact!ydOAz_t`LLC-Hb5W=X zVK@hcIwI_{Q>decnInao6ef-o>X>2SM4^rw7TGA&31O8Bg*qjS=b}(&(hMCb)RZus zgF>AZc3COZIboHJLY)^zb5N)Y!fs9qbuq)zi9${5ma(;T@bCMq=9m2Tx4->^Pc>0D zxn6Op5I--C&>_MfD(=|=c0%yQh^MvNcdAVBomQr`6J`2_NNkGJH~-?EOR$1V4E@ED zdcWcK2D9rQetCA9_VrvATFbVVYoxj&R6enB7Q0fWuU{eEjIMj@JgZ+)%xs=1qjAMm z-9R2!oM+oguIU>7y?67;Nkm7q-KQc}0b+*sM0nmbL1*w`QIDG9- zBvP^XcII4ixGB|#y9c8^srRxwp_UE~4()Uw*HUlJw3JVxGP~tfC$v;YreV4>EH>C@ z+aH?DfjA-TYPf657_Nu!ZHn{_r}(wv)m5jo)Z6m{rIENevdbbCtU9Bm-gbi+48c`3 zl`n!|3M^rxsmqmTwbbwB9S33*ECv@V&uOXEdA%=j0R}Nud0tDsBQFRfLNF|XNbTxB zUU?zkct{+MfgGv4m~W9H9y&$Tqj9iuI^P0eY=k*8U>N%R$jS*OcF~i46{F8IisZ#c|}d$;z%F^4R^2U zi4G6PS-g4&`ui}GFFiAEkL#+udIQ~5Z^p9ywv}5(x?>|ll#WhJ`L2(S z^^cA;RJsDG&H3URyA>F+l<$V3rqUBg_2q>t(Q<+v>l<(?=%qVt%fGzRA4vUvUSS#& z8WiGAe`RqX_0GHi_-Z`8J=Acgez71jm_MFf7|b_wE$jar_AV1v|7&Jpc_7u5S3J|t zf;&M^FRTjW*%@25J+OQ{zpy%xTAx?^&^p+(D!o6@aHr9@`PX)MYGF8#=ckgjH|DB~ zFjFTM)&x>b`Nm1wL&8ud7cS2?W%Qw9`w4i`RvAenMSN&tVO=0~cV6-0I~NFU=b?oS zfmC~5Z%eb+JVtlugPYEd?GMLeBjXEKOh`D zE_p8kVf059Mgpn+yz)!hmOv0gqr-RHspnV?>ey20v!fU7gAX<=O^wEuu4Mn;S<|qv zC6MPBOAnL<7^_*>7D(NdSEQG2?;aUqxmLBXJ&<}=o-gAwK`-0(vi^me0=W#QO?T8e z45ue6x^gO82{dCkJyEeWr#`|KgXPtMifw^h#$FNvYCz`LYhOh)kjvQ14kydlYj;IF z-%LXEtYfdiic}z%v6mFJ8y_u9T1GH1?99Gsj-j&hcCMv3&F1Zv0k$Jl}ehIesfYk<<81%C9$I{8oM{r}0~6 zpj7vVVm0MwavHx$?@Qyi@~NE0ZfHQ#NhiwKzbw z3`K|I&5zvE*PVf=)BMr0OL-vbx1uvYZBB@(vdj4+vhzVsh}+7p1Z?MjZBvatJ#)0Y zsca^XNEr}W2FfjER|Bc{5r8eeVSnc}RD1KPUvAthhP*s$Q=8Ag5wCwDH>LT0O zIj4M?laZZT5H3n}=NfV5Jcu=d{HIbT7t|El(pTHKBP4P^bc10XUa-6>EI5 zIVrS!XNXd%eGBS}Qt!(vu&x0L>b3@Rd4k1(*W&zR(7T|aDE0olVjwd24U0qjf>lMi zf6uvRMaqPokp+!KsXKCwyzY#Gz1g^6bzX0pJ#WK;NRjQdoNZmCuMBrOK*9Eh7qk@F zPH5Y{oaWSqMLf8mEsuyJcu`vYo(1hiskU4*3vUXisTA(6j3vQq^Ec(u;&fl8fSBm?rq<2&JcVPauqSW?$g63z1SWieG0}XeX%})Od z%NEjNX|!)=ba-rjG>;?-541d%tLMjyQmwhhaq0GKWB%pyQ}$oiHKW5L{k=w=V>Pt7 ze^(B}{_6R?_7&I(GGpW)oIhBU^Rzfc%0yswz%_r=K69O7AdUa81;>hVnZ!0SB$v_k zmEi6h0?j(Wo(}FQ%6Z*NFS^Vz_W9u6{Gx_d&rz}rv!{al?8hrk1wehESn6i2D5q)I z6T$uYRo=M=+mpfZ{IWy#v`sM|k_n(blAj13$ge(f7rU%39||6{ACqOvO70hn-nZGH zG#)&ZU;9MiScmd^gNKV!t86+Tr#P9T`LW=H{rK4FRRliwfW9|)q$qWN9uWd+?qm9B z@MuwLOCIRCPV06BC+$baPMLATBm0)%vAkOklwX!0RiaG$2TL#K_wg`!L1XC^`?0-aQGgn-n6po5P3cVDA3iHP zC@#HPl#1t3or#;=7(tjRxt3pAtsLQ4$*et-bIPjhG~sZGt2lLQ)6!i7OK-mmq`_=_<&Nbq;uo(XRkXBJ3Jptv|yXA_9y8%^OrFsGE5 zt0vWf@;Ops+BQ`Ms`5yQ`C@sXI;WJFZ!`r1;bLrvXJxW7Gt=~$#g?7e|5_ZVA#`SX zcc!UPBn+JojQoM+#i?4GthF<4@&xLNQ!97?tFigE zz`sup^d3@`qQfPst6lRI9fNFxoPlhCEG|`D5y%?I)sT&ljgW(os~~qnHbCx&tb;rV zxg2r=vIg=fWEk=|WHsak$STOIkmZoYLDdz6tcEOxtb_DJHbQzJTOeJKU68YWUr`kD z8e}izRmd^O8OXhmS0KkBFGC)JyaYJ`ISn}pc@gpiH zWDxQIWEgTBvH@~GWFzE0$OzFjDb!~+#hU|i@g4_gI1KAE)2iXSM2-yPJ0vUna1i2b=8)PG73UU?X zC}acV9>_Y#{gBHc4?xyHPC$ksCn2jL{pBcs$STNk$QsBXWCLU|WCYR=*$(M}+zaV~ z9EY6spiL#~D#glvS| z4Y>+(A7lgMLC8ADBaq7>k3-f#PCb# z=PP!9Oc|f&UZJ>W-0oYC`V{vvFaGq^?px~h`0K*TpR~AJ+!H|@L*1r!k%+33B;x87 z5-D|>M6ZhLaoozFihI4>%BZ@Z#F&a}p4`fA6&D)0l|3r%wQ(zZ)ng?P`&3*L6(Qni02hM4h46C)FVRI-$0Z z$tksl!aJijl9*DDlQ^qhAaPE;O5(g)OqLhaY7!S!+%4r+rqu}&m(-&qF00o_cSSu+ zA)lfZvClh7 zV!!tynT&hu=+^;nio`+hHWG)t@cE5odf`$W$@IbrHj?RulW(_j)C)h*NUay{nBB@T zFFY-~mE+z6Bu;qYfEH=@PLMd`9iw2+dXJL0;5|j+qW3IePJ7!)T=Mpkxa{3W;)?e$ zi5c%CiL2g564$&D60_d@gy|}*A>k=(pojj#<%C&Y=%R;Jg$L+YxUjt(qRY3J#8%%p ziEX|~5>X#KLZYJh;PMd_#RtERs3^W^5`(@gBu0I+B*uLH3W(i4xIaV=`rz0QIp~9f zLFAwho(YkIKKL<24*K9o5IN|Bi$LU{?*NHIKKS=T4*DiY9Pu3@%%i>u5|h4idU(ti zC2`yrCUMT^C*65p6^RSJ2#IN54T;OX1`=0%?F%8o+FlYh+Bk{j+9ZiO4bEKLN`nTE zEpBC%cAi9|Hceu+HbWw!&5~%*;Ecqrv}tfN;#S%6?dL7r*wDuO)I;MN0q zromwc@=V)DBCf$N3i3=lLZVlL^AqHm=Bk1i)!>N(d8P$P?A9)mZjW}6#9r+X1-oCH zATh4_>EQvbi^M@~io_wUoW!K&CzE4Z6^Y|ogv2SWhQyTCK;oZ>R-Xz`vUw z`^3$PyQmX)9DYNPKIA``IGwE0A?hOu+$n`67`!;jF4X&~_N@;jONAQOqz*(!Vmpq}(+cBhJP{r3 z8Ce(Y>+XpUeT{SrglT94Q6f>)$!6ro7|9O4{MBD47nv6IYvYMjUwk9(2#XJmq~gOT zqbsi`gOUMXc05Cm7fO%iS^jU6vP@DMn~t9&&3s9NNwy8q-uPL1UL`%}JHa={lPMJL z*x#kA;aw&L-_!BU@jkr$T~e1zZ{IhR8i})6zwf8NxoI>$G{&45B%-nS4@iBp^k#EB z(LWSt_ek<8^#)bqO0+5fX}>mX8_ zq4`JloF|SduwFXDkAD8<-6*>IaDid}qwwh+>-LFlb@ap2+CS8b#|cj-{S|)ftE(v0 zY|Wb<)YCjFTd4oS?lsE+#M>$dLfz;ZN%i1I(ud@C_M^Vdv@ZAp!oY;-8ahY|5Wf9!10vMU}N9f|)07KsHEa9iKNC=w<5+V=W#Em_8*l%`qf z{^$RayvgPjJz7H>Ry>7xXF}HNVGhF})?EyPdwTjG<#T8vPs}Hg(2K!Dd8hPXU?3jF z70|JG@#&foJ-bZx(qEm3@nCs|m>NA^hsF*pOD>^!Wf-71BL?~wvU`)09eOJ2$m?Mg z>(0269my!CH#7EtKl{hGtH}zMof*2%C4%>&9PM7yqh9ybbx$Tk_7;e{UQHLyVa0b& zX|Rgzs4z=<<0Hwnx2;@xSN-;Z9{R2*$#4^CyV*B4zRS*S2s3+=)hxqj2s7GgHKH`6 z)u)zSP4xYcx&T^&7-(o<9ZwVMbp~!*DOxJdg&WN@CC;~}9lu?=lZCw{m#~q4QqabV zjzft33^L|-bhm2#$8}mZeYkn3~o;lm| zLcQ^P>Buu2bR0c%Mn0!1gU?Prna%QgLoTu9{kl{gc}uWy)4?#?a>wNH%?>x131{{a z|8}j^CTA?c-be$rse@TC-_Sak9!@?rCB=&MU2~KJGK7QX+9J2*3V7og@y^_X$f+I9 zRVi+y3EDIlOJU{N`qs{oWDb{0!&_uU5<_%qt^7l_oG%yNLD4ln%eJ3VR)LmU@oWv7 zbW2+3ysa?1F$iP!w`On@ra^~#8z2G_m9O^r4MfZG`7lStoT%H#e&Yv+}Y%D zxtIRw-5*`@(`CUlPSCO|0_Erb+oylEwB)arJYMqBiqiCwptqm<<+q<&_Ty!IyqPiF zB8cC7{po$RCF|e(c*%<^*oZa5if}3~egCc%Kf23ZfBRWgx%GqE9cnE+5dec3Qmm3hc~0H{vY~ zU4j2E!0&X<7ZLXgg=P5xfxpZyU!>Zif8r3p3<7xQl~-F#(=gS<+|`fd3i5yY>`Vk@aSjP)c75>k06MecMO+ znCpOLiWUmv<~erehV{Nnm3gHI_>2gcwXux$pWc9*J-_%LA3y_MAsXTPB^jLK`Y z=N1I;S=3vH0Mgn;aRGI7$R}2Bv*L?Jy%qsHjYjPdfLV80qpr?10JCMcB7l=<*$x4u zrJzm(;7|@m4q2P`JqYAG&eXO;UBM9XMv~f8p_HDdfgs?o9 z5JW?70{%;A=r;Hn4Skyk!J#T;w)QnZf0bIh41a^Iy;p=@B+t{J)zL@%^>>FqhOhW1 z+_jc58MO2-=q?TWNPT@>ovXCUt%T|y4tux6``~%ai)EXzmwySp%FX)Ck;^W*Ti@dg zyA@xh5>~6-^*>sRdm~F*JNhi69Yt9(U4TnLSk#u4+!|;#XW?+$h)cztAiAzTm@zs( zsovD$#+?xdg~-h75$KOziDjaqL6uw;}hjtUF9RzuGWHWE0gE{&7Hq%bfc^p<&2UAC7jjtPr0 z143$AC)L^mWOdxIvg-&>sw=uEMJIHt22IL&w|@1*fr0}CD1O~X`YB;rl3t4LCEVTq zc)_@2e@3_G9++2LbGPpBEk}*G2{obyHRA3pHDZdryTZ0coYi&qHR1}T>YOlfs1e%= zkU{5#kzwHOtxb*SrPrs0fmxhpji@GzOTxmYMii65Wno}Km^Gq~ zEUpL(ry8-EtY!==hZ-?UDY~j#+17}&1!tuaz9vi^Ys6H+)c-2(dP3u7j>GBJ@xpU=BS9 zDppifv=~uQ5m8ZT4jw#s$iagL4-tRgo7v24_M6G3*n0Zy?Dx(4H}B2+-uM09ypaB; zukU?<+&jcB^aXOgv)fr@mEN`x4ZqFIf_X^}Dg8fror^N3u>Gli`ODcqv^O*~VVPHz zanAAX+Sze=R$&|ct`qkAT1?W6*EuK0l)fWg=hO08g-<>-R}Js&=y&y)8qA)M;|d#* zca!REwM(b8752OCE}xyeT}rx5b{THe#x%>O&`L9Iv<4fqw_#>AsfIp^w-qbi5JiPe z?@hEoc>0V?Ze5&L`tEz3*Tg*AGE^tpm^5#z53Y(A**>^EA8+u4 z?1Gq{qL;->3ZFM^c&vP)O^nDTv842!^*Yasiwd9YX|l}T>MW)WW?gY<=T5Q9Avh*3 zv%{sXU7H_$S+T72f8urS5m%Lt^E#gr*OcyV+UwjcR%k~^!^3EN*Ble8!QPPu{cyuP zAg(t|_Ovt$>-2VtH)z9=*{$ zub^fFeg;Dq@Dm8SfFHoe27C|tFyK3|kpbU=Gz|C}+C7773ovp4pMw|;_ze7D zz)jG?Wn#}KVB-Ql1{oaiAvnQ+4?s-@yaxt2;9U^X0q-Cqz}tqd`=-a%O^PnV);;bf ztSenzS%F30lDt81QLYkPl05{MQHGCOaRAaA|9v^lt!wH1$StW zbXqAx?*Iq7Oh0W`v|Xau3s;69>cdGx0UlP2v}#j;m&?&cu)#7V(z(}TL; zMikqRnN$|}T7`m7T;i#*h0$rZh{Gp2X*vg{2TuJiMTq;HYKacp;Kj*-=Zk%1gq_)> zgAf-dPMT6hRC#aCEzL*BTF$ryG<9_{LY^K5BNq{-2yt?-U{^=_`7*bdKps72ULFeK zadip;hO87m^zuXn>|0J+i#u|%ls6ki)F_3>;y__4LW&4v2jqb1Q=Z4K2i_~J8Gu@AGk(#rv+3t}BCvzsIW0IH{ zZ+unLlyHo=IJZzN>5=n= zQC%E~c#6rv+-ScOF{s*}(RpyHiJ~9TOT+;GDwvj)s>f$^rsV~v_Om5#3XD{ZZ`+yP zo1X|2_d+p0;Y+w#e~TmeaLC#%&rIcsK^e)EWR>eDe_ES(WRGK9$~9%O9Rk%8tSVM1 zzFk4{8OB$^J7$ck<@9s}ra;X)!m+JUyo>ZUZbLhW4BL-avaADjWDYVf4mv%JHpihl zH8MKx14qNoUzp14vSr;5-UMBM6g**0th1~mPEWm+@gV+y&NL@HkWCN)drxbv9Rm#|)OP9^MpT?cxZCi6ohR;FEm-%w|~`J&80Bid%g`NBg+ zh=>Yjj{1R>qph#~(@ReUOPFBs64#r=4O;Fny0!k{S(2uQXz@OMI3PxOt24RcBl_q8 zr^>X9N!=EoDxLPdudWtrO1F~bYR(sQUGb&TY_r>=)jGM2Jc2ie=gV0+o2iyZ`_I literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/TaskDialogPkgD2007.dcu b/TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/TaskDialogPkgD2007.dcu new file mode 100644 index 0000000000000000000000000000000000000000..c85646f674830d64c877afbe4e0f0f665376746c GIT binary patch literal 3998 zcmeHJ|BD+%6yMMGE_s*cdgocnQi>E62_i=+rUof;Uvg<8mo{y3Z4r@fb|=a7HoI}N zcg-ClhZGSJsb44}a;Ov$ks=~eL=N#AA|fIpB1J@0S`iVEBL1MxZ0>r!b|-&;bbm-@ z-sin}Z{EClpSeZTMwW*(E!|wnY+qX5q3Jh{R?PNnmYa@OFU{7oyLaun>vT-p>uWpWGQ7v{+(2=4c1QC2j?CKAZI1 zz~nCTHO*qlb*t=@6b!8k4zYSyc7@VZM=Hg~?fHG#LMhtOphO+-#Kc?>c&^mnEG51- z*P8G`dpXZ@Hz>F@PvXO3exO$47VFxyr7$6c8kx-_ z+_k+E3Y0{yX9Di1V6k=&I9^$3bt8}TJn5M2Hd8Gv&Me0rB`k8z+kw9jy(`-1o2>@7 z6pP1aI+X@%GKFz*&Ix!?o=8;OG;Rg%v~V5`$Fe7y<1HQylB_A;Q{^)jMx_Y4zsTG< z1vZdpj!1P-Q{YtcMHMk$0mpKV8I&iYV;%@|DUUfCr>Rab8ThI_#k*}o;W<9(@K)8g zqnGZ_d45x6dHDuJ9a3Bbm38V0+rFZyJRxBy4_IL-4zSr{voQf5s2-2rO}ylL9j>bA z&4uh#k+s{Rn<;$XFln}A8)SCYvt}zkQ`B!?#jGlpNQ9PVwagUNJ5pl4#YEq$v))eP zGD$^KaYqJ1R9&ybM@wPHl4?EDNfTx}j3YXslx6MN9)&4kSwSjmk;NWxv)ySrwx_U; z^#bEZi_`KpDjZil(E-Lwg=lzCgw5;jl+6QAbz!Oepi|+^vf>nDxngC)Qe3LdN4U+( zfoKS->!D|(TR~%!ABZL(KC7{5-dY8aM7+&PU(3$M1~o~~+l4RFp0C@yrD;2?^q`yw zI71 zNB2%`q}67DfDMwlRE2{}TZaIb-B!u~u; zghPZ1;jn?Dg!>5h6CNNOBUA}Cp=O{#I8JZ~u7MW8Cj^A~4myNI!b60IGgu-#LO4ly z)WBne$MblC@Fd|B;c3FNgwurQ2+tEygf|Fp z65b-bO*lt*Cy#dtD;c~;c;CQ>gpX7Bgz%|>&j_Cz_=4~y;VZ(|DSSitmT;c%9pQVz z4}>2HKNBtxeo0{m;id+DCHzMCo$!Z&KM9uze-Zv}B#XK(GMY#p?EdSCL~>?zm`o&f TUEe~3`YG)xU9V}+2-f%yh!*Y$ literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/TaskDialogRegDE.dcu b/TAdvTaskDialog/internal/1.5.0.2/1/Lib/D11/TaskDialogRegDE.dcu new file mode 100644 index 0000000000000000000000000000000000000000..794b759d48d8cdf9c9e91f75246fcd1b0fccb0e8 GIT binary patch literal 693 zcmY#pU=Z5M#K2&hyU#+ZVV(>F6MslzakfilVorW~P-?o1>of*7n*#0--(VM4w_rU_ zKWEpheHKgw!f49$3KEOoWbdbMQ#aOUX%f%gjs6$*FvqP;fLk zg&ipEnU`6@zyM@B=Oh*vrxt_QTnGah7}EGc98<~=B0YPw8`JsqPzCcRa9&PM;X$Z! zaRurW3_%FErev1n7hSuw%Pn0<4?}$CvKcdg_PV4NXQtF)Vcl4cSN;ZXu0!y+f!pj^$4&2XN$)+ft z=1De1^NbKs1+w!bl1Hm9#!6htos5idZ* z;n40k#s@+(RDtZ2{{|_Y3jbL_;>HJ}A|q2e1u}F%ie7?*UjK+a+^h>?F&@s9VBj%e zVHD$H6yRc#;^HylV>FUr)RST~;$dPF;9+86)Z^i0n!qrTjY)@r=_3=9o(02X28Kic Dqma{s literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Source/AdvGroupBox.pas b/TAdvTaskDialog/internal/1.5.0.2/1/Source/AdvGroupBox.pas new file mode 100644 index 0000000..22174d8 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.0.2/1/Source/AdvGroupBox.pas @@ -0,0 +1,661 @@ +{***************************************************************************} +{ TAdvGroupBox component } +{ for Delphi & C++Builder } +{ version 1.0 } +{ } +{ written by TMS Software } +{ copyright © 2007 } +{ Email : info@tmssoftware.com } +{ Web : http://www.tmssoftware.com } +{ } +{ The source code is given as is. The author is not responsible } +{ for any possible damage done due to the use of this code. } +{ The component can be freely used in any application. The complete } +{ source code remains property of the author and may not be distributed, } +{ published, given or sold in any form as such. No parts of the source } +{ code can be included in any other component or application without } +{ written authorization of the author. } +{***************************************************************************} + +unit AdvGroupBox; + +{$I TMSDEFS.INC} + +interface + +uses + Classes, Windows, Forms, Dialogs, Controls, Graphics, Messages, ExtCtrls, + SysUtils, Math, StdCtrls, ImgList; + +const + + MAJ_VER = 1; // Major version nr. + MIN_VER = 0; // Minor version nr. + REL_VER = 0; // Release nr. + BLD_VER = 0; // Build nr. + + +type + TCaptionPosition = (cpTopLeft, cpTopRight, cpTopCenter, cpBottomLeft, cpBottomRight, cpBottomCenter); + TBorderStyle = (bsNone, bsSingle, bsDouble); + + TWinCtrl = class(TWinControl) + public + procedure PaintCtrls(DC: HDC; First: TControl); + end; + + TAdvCustomGroupBox = class(TCustomGroupBox) + private + FTransparent: Boolean; + FBorderColor: TColor; + FImageIndex: Integer; + FImages: TCustomImageList; + FBorderStyle: TBorderStyle; + FCaptionPosition: TCaptionPosition; + FRoundEdges: Boolean; + Procedure WMEraseBkGnd( Var msg: TWMEraseBkGnd ); message WM_ERASEBKGND; + procedure CMCtl3DChanged(var Message: TMessage); message CM_CTL3DCHANGED; + procedure SetTransparent(const Value: Boolean); + procedure SetBorderColor(const Value: TColor); + procedure SetImageIndex(const Value: Integer); + procedure SetImages(const Value: TCustomImageList); + function GetVersion: string; + procedure SetVersion(const Value: string); + procedure SetBorderStyle(const Value: TBorderStyle); + procedure SetCaptionPosition(const Value: TCaptionPosition); + procedure SetRoundEdges(const Value: Boolean); + protected + procedure Loaded; override; + procedure Paint; override; + procedure Notification(AComponent: TComponent; AOperation: TOperation); override; + procedure AdjustClientRect(var Rect: TRect); override; + procedure CreateParams(var Params: TCreateParams); override; + function GetCaptionHeight: Integer; + function GetCaptionRect: TRect; + function GetBorderWidth: Integer; + function GetBorderRect: TRect; + + property CaptionPosition: TCaptionPosition read FCaptionPosition write SetCaptionPosition default cpTopLeft; + property BorderStyle: TBorderStyle read FBorderStyle write SetBorderStyle default bsSingle; + property Transparent: Boolean read FTransparent write SetTransparent default true; + property BorderColor: TColor read FBorderColor write SetBorderColor default clSilver; + property Images: TCustomImageList read FImages write SetImages; + property ImageIndex: Integer read FImageIndex write SetImageIndex default -1; + property Version: string read GetVersion write SetVersion stored false; + property RoundEdges: Boolean read FRoundEdges write SetRoundEdges default False; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + function GetVersionNr: integer; + end; + + TAdvGroupBox = class(TAdvCustomGroupBox) + published + property BorderColor; + property BorderStyle; + property CaptionPosition; + property Images; + property ImageIndex; + property Transparent; + property RoundEdges; + property Version; + + property Align; + property Anchors; + property BiDiMode; + property Caption; + property Color; + property Constraints; + property Ctl3D default False; + property DockSite; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + {$IFDEF DELPHI7_LVL} + property ParentBackground default True; + {$ENDIF} + property ParentBiDiMode; + property ParentColor; + property ParentCtl3D default False; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowHint; + property TabOrder; + property TabStop; + property Visible; + property OnClick; + property OnContextPopup; + property OnDblClick; + property OnDragDrop; + property OnDockDrop; + property OnDockOver; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnGetSiteInfo; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnStartDock; + property OnStartDrag; + property OnUnDock; + end; + +implementation + +//------------------------------------------------------------------------------ + +{TWinCtrl} + +procedure TWinCtrl.PaintCtrls(DC: HDC; First: TControl); +begin + PaintControls(DC, First); +end; + +//------------------------------------------------------------------------------ + +{ TAdvCustomGroupBox } + +constructor TAdvCustomGroupBox.Create(AOwner: TComponent); +begin + inherited; + ControlStyle := ControlStyle - [csOpaque]; + FTransparent := True; + FImages := nil; + FImageIndex := -1; + FBorderStyle := bsSingle; + FCaptionPosition := cpTopLeft; + FRoundEdges := false; + Ctl3D := false; + ParentCtl3D := false; + FBorderColor := clSilver; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGroupBox.CreateParams(var Params: TCreateParams); +begin + inherited CreateParams( params ); + //params.ExStyle := params.ExStyle or WS_EX_TRANSPARENT; +end; + +//------------------------------------------------------------------------------ + +destructor TAdvCustomGroupBox.Destroy; +begin + + inherited; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGroupBox.Loaded; +begin + inherited; + +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGroupBox.Notification(AComponent: TComponent; + AOperation: TOperation); +begin + inherited; + if not (csDestroying in ComponentState) and (AOperation = opRemove) then + begin + if (AComponent = Images) then + begin + Images := nil; + end; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGroupBox.AdjustClientRect(var Rect: TRect); +var + R: TRect; +begin + R := Rect; + inherited AdjustClientRect(Rect); + Rect := R; + if CaptionPosition in [cpTopLeft, cpTopCenter, cpTopRight] then + begin + Inc(Rect.Top, Max(GetBorderWidth,GetCaptionHeight)); + Rect := Classes.Rect(Rect.Left +GetBorderWidth, Rect.Top, Rect.Right -GetBorderWidth, Rect.Bottom-GetBorderWidth); + end + else if CaptionPosition in [cpBottomLeft, cpBottomCenter, cpBottomRight] then + begin + Dec(Rect.Bottom, Max(GetBorderWidth,GetCaptionHeight)); + Rect := Classes.Rect(Rect.Left +GetBorderWidth, Rect.Top + GetBorderWidth, Rect.Right -GetBorderWidth, Rect.Bottom); + end; + + InflateRect(Rect, -1, -1); +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGroupBox.Paint; +var + R, CapR: TRect; + i, rt: Integer; + P: TPoint; + bmp: TBitmap; +begin + if Transparent then + begin + i := SaveDC(Canvas.Handle); + p := ClientOrigin; + Windows.ScreenToClient(Parent.Handle, p); + p.x := -p.x; + p.y := -p.y; + MoveWindowOrg(Canvas.Handle, p.x, p.y); + + SendMessage(Parent.Handle, WM_ERASEBKGND, Canvas.Handle, 0); + // transparency ? + SendMessage(Parent.Handle, WM_PAINT, Canvas.Handle, 0); + + if (Parent is TWinCtrl) then + (Parent as TWinCtrl).PaintCtrls(Canvas.Handle, nil); + + RestoreDC(Canvas.Handle, i); + end; + + R := ClientRect; + CapR := GetCaptionRect; + bmp := TBitmap.Create; + bmp.Height := (CapR.Bottom - CapR.Top); + bmp.Width := (CapR.Right - CapR.Left) + 2; + i := CapR.Left; + rt := 6; + + //--- Draw Image + if Assigned(Images) and (ImageIndex >= 0) then + begin + Images.Draw(Canvas, CapR.Left, CapR.Top, ImageIndex, Enabled); + i := CapR.Left + Images.Width + 3; + end; + + Canvas.Brush.Style := bsClear; + //--- Draw Caption + if (Caption <> '') then + begin + Canvas.Font.Assign(Self.Font); + R := Rect(i, CapR.Top, CapR.Right, CapR.Bottom); + DrawText(Canvas.Handle,PChar(Caption),Length(Caption), R, DT_SINGLELINE or DT_LEFT or DT_VCENTER); + end; + + bmp.Canvas.CopyRect(Rect(0, 0, bmp.Width, bmp.Height), Canvas, Rect(CapR.Left-1, CapR.Top, CapR.Right+1, CapR.Bottom)); + R := GetBorderRect; + //--- Draw Borders + case BorderStyle of + bsSingle: + begin + if Ctl3D then + begin + Canvas.Brush.Style := bsClear; + Canvas.Pen.Color := clWhite; + R.Left := R.Left + 1; + R.Top := R.Top + 1; + if FRoundEdges then + Canvas.RoundRect(R.Left, R.Top, R.Right, R.Bottom, rt, rt) + else + Canvas.Rectangle(R); + Canvas.Pen.Color := clGray; + R.Bottom := R.Bottom -1; + R.Right := R.Right - 1; + R.Left := R.Left - 1; + R.Top := R.Top - 1; + if FRoundEdges then + Canvas.RoundRect(R.Left, R.Top, R.Right, R.Bottom, rt, rt) + else + Canvas.Rectangle(R); + end + else + begin + Canvas.Brush.Style := bsClear; + Canvas.Pen.Color := BorderColor; + if FRoundEdges then + Canvas.RoundRect(R.Left, R.Top, R.Right, R.Bottom, rt, rt) + else + Canvas.Rectangle(R); + end; + end; + bsDouble: + begin + if Ctl3D then + begin + Canvas.Brush.Style := bsClear; + Canvas.Pen.Color := clWhite; + R.Left := R.Left + 1; + R.Top := R.Top + 1; + if FRoundEdges then + Canvas.RoundRect(R.Left, R.Top, R.Right, R.Bottom, rt, rt) + else + Canvas.Rectangle(R); + Canvas.Pen.Color := clGray; + R.Bottom := R.Bottom -1; + R.Right := R.Right - 1; + R.Left := R.Left - 1; + R.Top := R.Top - 1; + if FRoundEdges then + Canvas.RoundRect(R.Left, R.Top, R.Right, R.Bottom, rt, rt) + else + Canvas.Rectangle(R); + + R.Bottom := R.Bottom +1; + R.Right := R.Right + 1; + + R := Rect(R.Left+2, R.Top+2, R.Right-2, R.Bottom-2); + + Canvas.Pen.Color := clWhite; + R.Left := R.Left + 1; + R.Top := R.Top + 1; + if FRoundEdges then + Canvas.RoundRect(R.Left, R.Top, R.Right, R.Bottom, rt, rt) + else + Canvas.Rectangle(R); + Canvas.Pen.Color := clGray; + R.Bottom := R.Bottom -1; + R.Right := R.Right - 1; + R.Left := R.Left - 1; + R.Top := R.Top - 1; + if FRoundEdges then + Canvas.RoundRect(R.Left, R.Top, R.Right, R.Bottom, rt, rt) + else + Canvas.Rectangle(R); + end + else + begin + Canvas.Brush.Style := bsClear; + Canvas.Pen.Color := BorderColor; + if FRoundEdges then + Canvas.RoundRect(R.Left, R.Top, R.Right, R.Bottom, rt, rt) + else + Canvas.Rectangle(R); + R := Rect(R.Left+2, R.Top+2, R.Right-2, R.Bottom-2); + if FRoundEdges then + Canvas.RoundRect(R.Left, R.Top, R.Right, R.Bottom, rt, rt) + else + Canvas.Rectangle(R); + end; + end; + end; + + if ((Caption <> '') or (Assigned(Images) and (ImageIndex >= 0))) then + begin + Canvas.CopyRect(Rect(CapR.Left-1, CapR.Top, CapR.Right+1, CapR.Bottom), bmp.Canvas, Rect(0, 0, bmp.Width, bmp.Height)); + end; + bmp.Free; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGroupBox.SetBorderColor(const Value: TColor); +begin + if (FBorderColor <> Value) then + begin + FBorderColor := Value; + Invalidate; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGroupBox.SetImageIndex(const Value: Integer); +begin + if (FImageIndex <> Value) then + begin + FImageIndex := Value; + Invalidate; + Realign; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGroupBox.SetImages(const Value: TCustomImageList); +begin + if (FImages <> Value) then + begin + FImages := Value; + if not Assigned(FImages) then + begin + ImageIndex := -1; + end; + Invalidate; + Realign; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGroupBox.SetTransparent(const Value: Boolean); +begin + if (FTransparent <> Value) then + begin + FTransparent := Value; + Invalidate; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGroupBox.WMEraseBkGnd(var msg: TWMEraseBkGnd); +begin + inherited; + //SetBkMode( msg.DC, TRANSPARENT ); + //msg.result := 1; +end; + +//------------------------------------------------------------------------------ + +function TAdvCustomGroupBox.GetVersion: string; +var + vn: Integer; +begin + vn := GetVersionNr; + Result := IntToStr(Hi(Hiword(vn)))+'.'+IntToStr(Lo(Hiword(vn)))+'.'+IntToStr(Hi(Loword(vn)))+'.'+IntToStr(Lo(Loword(vn))); +end; + +//------------------------------------------------------------------------------ + +function TAdvCustomGroupBox.GetVersionNr: integer; +begin + Result := MakeLong(MakeWord(BLD_VER,REL_VER),MakeWord(MIN_VER,MAJ_VER)); +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGroupBox.SetVersion(const Value: string); +begin + +end; + +//------------------------------------------------------------------------------ + +function TAdvCustomGroupBox.GetCaptionHeight: Integer; +var + R: TRect; +begin + R := GetCaptionRect; + Result := Max(GetBorderWidth, R.Bottom - R.Top); +end; + +//------------------------------------------------------------------------------ + +function TAdvCustomGroupBox.GetBorderWidth: Integer; +begin + Result := 0; + case BorderStyle of + bsNone: Result := 1; + bsSingle: + begin + Result := 1; + if Ctl3D then + Result := Result + 1; + end; + bsDouble: + begin + Result := 2; + if Ctl3D then + Result := Result + 2; + end; + end; +end; + +//------------------------------------------------------------------------------ + +function TAdvCustomGroupBox.GetBorderRect: TRect; +begin + Result := ClientRect; + if CaptionPosition in [cpTopLeft, cpTopCenter, cpTopRight] then + begin + Result.Top := Result.Top + (GetCaptionHeight div 2); + end + else if CaptionPosition in [cpBottomLeft, cpBottomCenter, cpBottomRight] then + begin + if ((Caption <> '') or (Assigned(Images) and (ImageIndex >= 0))) then + begin + Result.Bottom := Result.Bottom - (GetCaptionHeight div 2); + if (BorderStyle = bsDouble) then + Result.Bottom := Result.Bottom + 1; + end; + end; +end; + +//------------------------------------------------------------------------------ + +function TAdvCustomGroupBox.GetCaptionRect: TRect; +var + ImgH, ImgW, CapH, CapW, sp, st, w, h: Integer; + R: TRect; +begin + Result := Rect(0, 0, 0, 0); + ImgH := 0; + ImgW := 0; + CapH := 0; + CapW := 0; + st := 8; + sp := 0; + if (Caption <> '') then + begin + Canvas.Font.Assign(Self.Font); + R := Rect(0, 0, 1000, 100); + DrawText(Canvas.Handle,PChar(Caption),Length(Caption), R, DT_CALCRECT or DT_LEFT or DT_SINGLELINE); + CapH := R.Bottom - R.Top; + CapW := R.Right - R.Left; + end; + + if Assigned(Images) and (ImageIndex >= 0) then + begin + ImgH := Images.Height; + ImgW := Images.Width; + end; + + if (CapW > 0) and (ImgW > 0) then + begin + sp := 3; + end; + + w := ImgW + sp + CapW; + h := Max(ImgH, CapH) + 2; + case CaptionPosition of + cpTopLeft: + begin + Result.Left := st; + Result.Right := Result.Left + w; + Result.Bottom := Result.Top + h; + end; + cpTopRight: + begin + Result.Right := Width - st; + Result.Left := Result.Right - w; + Result.Bottom := Result.Top + h; + end; + cpTopCenter: + begin + Result.Left := (Width - w) div 2; + Result.Right := Result.Left + w; + Result.Bottom := Result.Top + h; + end; + cpBottomLeft: + begin + Result.Left := st; + Result.Right := Result.Left + w; + Result.Top := Height - h; + Result.Bottom := Result.Top + h; + end; + cpBottomRight: + begin + Result.Right := Width - st; + Result.Left := Result.Right - w; + Result.Top := Height - h; + Result.Bottom := Result.Top + h; + end; + cpBottomCenter: + begin + Result.Left := (Width - w) div 2; + Result.Right := Result.Left + w; + Result.Top := Height - h; + Result.Bottom := Result.Top + h; + end; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGroupBox.CMCtl3DChanged(var Message: TMessage); +begin + inherited; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGroupBox.SetBorderStyle(const Value: TBorderStyle); +begin + if (FBorderStyle <> Value) then + begin + FBorderStyle := Value; + Invalidate; + Realign; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGroupBox.SetCaptionPosition( + const Value: TCaptionPosition); +begin + if (FCaptionPosition <> Value) then + begin + FCaptionPosition := Value; + Invalidate; + Realign; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGroupBox.SetRoundEdges(const Value: Boolean); +begin + if (FRoundEdges <> Value) then + begin + FRoundEdges := Value; + Invalidate; + end; +end; + +//------------------------------------------------------------------------------ + +{$IFDEF FREEWARE} +{$I TRIAL.INC} +{$ENDIF} + + +end. diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Source/AdvOfficeButtons.pas b/TAdvTaskDialog/internal/1.5.0.2/1/Source/AdvOfficeButtons.pas new file mode 100644 index 0000000..4736673 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.0.2/1/Source/AdvOfficeButtons.pas @@ -0,0 +1,2698 @@ +{*************************************************************************} +{ TAdvOfficeButtons components } +{ for Delphi & C++Builder } +{ } +{ written by } +{ TMS Software } +{ copyright © 2007 - 2008 } +{ Email : info@tmssoftware.com } +{ Web : http://www.tmssoftware.com } +{ } +{ The source code is given as is. The author is not responsible } +{ for any possible damage done due to the use of this code. } +{ The component can be freely used in any application. The complete } +{ source code remains property of the author and may not be distributed, } +{ published, given or sold in any form as such. No parts of the source } +{ code can be included in any other component or application without } +{ written authorization of the author. } +{*************************************************************************} + +unit AdvOfficeButtons; + +{$I TMSDEFS.INC} +{$R AdvOfficeButtons.res} +{$DEFINE REMOVESTRIP} +{$DEFINE REMOVEDRAW} + +interface + +uses + SysUtils, Windows, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, + Forms, Dialogs, StdCtrls, Menus, Buttons, ComObj, ActiveX, + PictureContainer, AdvGroupBox; + +const + MAJ_VER = 1; // Major version nr. + MIN_VER = 1; // Minor version nr. + REL_VER = 0; // Release nr. + BLD_VER = 8; // Build nr. + + // version history + // 1.0.0.1 : Fixed compatibility issue with TRadioGroup of TAdvOfficeRadioGroup + // 1.0.1.0 : Improved : exposed Visible property in TAdvOfficeRadioButton + // 1.0.2.0 : New : Added OnEnter, OnExit events in TAdvOfficeRadioButton, TAdvOfficeCheckBox + // 1.0.3.0 : Improved : painting hot state of controls + // 1.1.0.0 : New property Value added in AdvOfficeCheckGroup + // : New component TDBAdvOfficeCheckGroup added + // 1.1.0.1 : Improved : painting of focus rectangle + // 1.1.0.2 : Fixed : issue with ImageIndex for caption + // 1.1.0.3 : Fixed : issue with arrow keys & TAdvOfficeRadioGroup + // 1.1.0.4 : Fixed : issue with dbl click & mouseup handling + // 1.1.0.5 : Fixed : small painting issue with ClearType fonts + // 1.1.0.6 : Fixed : issue with runtime creating controls + // 1.1.0.7 : Fixed : issue with setting separate radiobuttons in group as disabled + // 1.1.0.8 : Fixed : issue with OnClick event for TAdvOfficeRadioGroup + +type + TAnchorClick = procedure (Sender:TObject; Anchor:string) of object; + + TCustomAdvOfficeCheckBox = class(TCustomControl) + private + FDown:Boolean; + FState:TCheckBoxState; + FFocused:Boolean; + FReturnIsTab:Boolean; + FImages:TImageList; + FAnchor: string; + FAnchorClick: TAnchorClick; + FAnchorEnter: TAnchorClick; + FAnchorExit: TAnchorClick; + FURLColor: TColor; + FImageCache: THTMLPictureCache; + FBtnVAlign: TTextLayout; + FAlignment: TLeftRight; + FEllipsis: Boolean; + FCaption: string; + FContainer: TPictureContainer; + FShadowOffset: Integer; + FShadowColor: TColor; + FIsWinXP: Boolean; + FHot: Boolean; + FClicksDisabled: Boolean; + FOldCursor: TCursor; + FReadOnly: Boolean; + {$IFNDEF TMSDOTNET} + FBkgBmp: TBitmap; + FBkgCache: boolean; + FTransparentCaching: boolean; + {$ENDIF} + FDrawBkg: boolean; + FGotClick: boolean; + procedure WMEraseBkGnd(var Message:TMessage); message WM_ERASEBKGND; + procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED; + procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; + procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; + procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; + procedure SetState(Value:TCheckBoxState); + procedure SetChecked(Value:Boolean); + function GetChecked:Boolean; + procedure SetCaption(Value: string); + procedure SetImages(const Value: TImageList); + procedure SetURLColor(const Value:TColor); + function IsAnchor(x,y:integer):string; + procedure SetButtonVertAlign(const Value: TTextLayout); + procedure SetAlignment(const Value: TLeftRight); + procedure SetEllipsis(const Value: Boolean); + procedure SetContainer(const Value: TPictureContainer); + procedure SetShadowColor(const Value: TColor); + procedure SetShadowOffset(const Value: Integer); + function GetVersion: string; + procedure SetVersion(const Value: string); + {$IFNDEF TMSDOTNET} + procedure DrawParentImage (Control: TControl; Dest: TCanvas); + {$ENDIF} + protected + function GetVersionNr: Integer; virtual; + procedure Notification(AComponent: TComponent; AOperation: TOperation); override; + procedure DrawCheck; + procedure Paint; override; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; + procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; + procedure MouseMove(Shift: TShiftState;X, Y: Integer); override; + procedure KeyDown(var Key:Word;Shift:TShiftSTate); override; + procedure KeyUp(var Key:Word;Shift:TShiftSTate); override; + procedure SetDown(Value:Boolean); + procedure DoEnter; override; + procedure DoExit; override; + procedure Loaded; override; + property Checked: Boolean read GetChecked write SetChecked default False; + property ClicksDisabled: Boolean read FClicksDisabled write FClicksDisabled; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Toggle; virtual; + {$IFNDEF TMSDOTNET} + procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override; + property TransparentChaching: boolean read FTransparentCaching write FTransparentCaching; + {$ENDIF} + property DrawBkg: Boolean read FDrawBkg write FDrawBkg; + published + property Action; + property Anchors; + property Constraints; + property Color; + property Alignment: TLeftRight read FAlignment write SetAlignment; + property ButtonVertAlign: TTextLayout read FBtnVAlign write setButtonVertAlign default tlTop; + property Caption: string read FCaption write SetCaption; + property Down: Boolean read FDown write SetDown default False; + property DragCursor; + property DragKind; + property DragMode; + property Ellipsis: Boolean read FEllipsis write SetEllipsis default False; + property Enabled; + property Font; + property Images: TImageList read FImages write SetImages; + property ParentFont; + property ParentColor; + property PictureContainer: TPictureContainer read FContainer write SetContainer; + property PopupMenu; + property ReadOnly: Boolean read FReadOnly write FReadOnly default False; + property ReturnIsTab: Boolean read FReturnIsTab write FReturnIsTab; + property ShadowColor: TColor read FShadowColor write SetShadowColor default clGray; + property ShadowOffset: Integer read FShadowOffset write SetShadowOffset default 1; + property ShowHint; + property State: TCheckBoxState read FState write SetState default cbUnchecked; + property TabOrder; + property TabStop; + property URLColor: TColor read FURLColor write SetURLColor default clBlue; + property Visible; + property OnClick; + property OnDragDrop; + property OnDragOver; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnKeyDown; + property OnKeyPress; + property OnKeyUp; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnAnchorClick: TAnchorClick read fAnchorClick write fAnchorClick; + property OnAnchorEnter: TAnchorClick read fAnchorEnter write fAnchorEnter; + property OnAnchorExit: TAnchorClick read fAnchorExit write fAnchorExit; + property Version: string read GetVersion write SetVersion; + end; + + TAdvOfficeCheckBox = class(TCustomAdvOfficeCheckBox) + published + property Checked; + end; + + TAdvOfficeRadioButton = class(TCustomControl) + private + FDown: Boolean; + FChecked: Boolean; + FFocused: Boolean; + FGroupIndex: Byte; + FReturnIsTab: Boolean; + FImages: TImageList; + FAnchor: string; + FAnchorClick: TAnchorClick; + FAnchorEnter: TAnchorClick; + FAnchorExit: TAnchorClick; + FURLColor: TColor; + FImageCache: THTMLPictureCache; + FBtnVAlign: TTextLayout; + FAlignment: TLeftRight; + FEllipsis: Boolean; + FCaption: string; + FContainer: TPictureContainer; + FShadowOffset: Integer; + FShadowColor: TColor; + FIsWinXP: Boolean; + FHot: Boolean; + FClicksDisabled: Boolean; + FOldCursor: TCursor; + {$IFNDEF TMSDOTNET} + FBkgBmp: TBitmap; + FBkgCache: boolean; + FTransparentCaching: boolean; + {$ENDIF} + FDrawBkg: Boolean; + FGotClick: boolean; + procedure TurnSiblingsOff; + procedure SetDown(Value:Boolean); + procedure SetChecked(Value:Boolean); + procedure SetImages(const Value: TImageList); + procedure SetURLColor(const Value:TColor); + function IsAnchor(x,y:integer):string; + procedure WMLButtonDown(var Message:TWMLButtonDown); message WM_LBUTTONDOWN; + procedure WMEraseBkGnd(var Message:TMessage); message WM_ERASEBKGND; + procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED; + procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; + procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; + procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; + procedure SetButtonVertAlign(const Value: TTextLayout); + procedure SetAlignment(const Value: TLeftRight); + procedure SetEllipsis(const Value: Boolean); + procedure SetCaption(const Value: string); + procedure SetContainer(const Value: TPictureContainer); + procedure SetShadowColor(const Value: TColor); + procedure SetShadowOffset(const Value: Integer); + function GetVersion: string; + procedure SetVersion(const Value: string); + function GetVersionNr: Integer; + {$IFNDEF TMSDOTNET} + procedure DrawParentImage (Control: TControl; Dest: TCanvas); + {$ENDIF} + protected + procedure DrawRadio; + procedure Paint; override; + procedure Notification(AComponent: TComponent; AOperation: TOperation); override; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; + procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; + procedure MouseMove(Shift: TShiftState;X, Y: Integer); override; + procedure KeyDown(var Key:Word;Shift:TShiftSTate); override; + procedure KeyUp(var Key:Word;Shift:TShiftSTate); override; + procedure DoEnter; override; + procedure DoExit; override; + procedure Loaded; override; + procedure Click; override; + procedure DoClick; virtual; + property ClicksDisabled: Boolean read FClicksDisabled write FClicksDisabled; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + {$IFNDEF TMSDOTNET} + procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override; + property TransparentChaching: boolean read FTransparentCaching write FTransparentCaching; + {$ENDIF} + property DrawBkg: Boolean read FDrawBkg write FDrawBkg; + published + {$IFDEF DELPHI4_LVL} + property Action; + property Anchors; + property Constraints; + {$ENDIF} + property Color; + property Alignment: TLeftRight read fAlignment write SetAlignment; + property URLColor:TColor read FURLColor write SetURLColor default clBlue; + property ButtonVertAlign: TTextLayout read fBtnVAlign write SetButtonVertAlign default tlTop; + property Caption: string read FCaption write SetCaption; + property Checked:Boolean read FChecked write SetChecked default False; + property Down:Boolean read FDown write SetDown default False; + property DragCursor; + {$IFDEF DELPHI4_LVL} + property DragKind; + {$ENDIF} + property DragMode; + property Ellipsis: Boolean read FEllipsis write SetEllipsis default False; + property Enabled; + property Font; + property GroupIndex:Byte read FGroupIndex write FGroupIndex + default 0; + property Images:TImageList read fImages write SetImages; + property ParentFont; + property ParentColor; + property PictureContainer: TPictureContainer read FContainer write SetContainer; + property PopupMenu; + property ReturnIsTab:Boolean read FReturnIsTab write FReturnIsTab; + property ShadowColor: TColor read FShadowColor write SetShadowColor default clGray; + property ShadowOffset: Integer read FShadowOffset write SetShadowOffset default 1; + property ShowHint; + property TabOrder; + property TabStop; + property OnClick; + property OnDragDrop; + property OnDragOver; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnKeyDown; + property OnKeyPress; + property OnKeyUp; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnAnchorClick:TAnchorClick read fAnchorClick write fAnchorClick; + property OnAnchorEnter:TAnchorClick read fAnchorEnter write fAnchorEnter; + property OnAnchorExit:TAnchorClick read fAnchorExit write fAnchorExit; + property Version: string read GetVersion write SetVersion; + property Visible; + end; + + TEnabledEvent = procedure (Sender:TObject; ItemIndex: Integer; var Enabled: Boolean) of object; + + + TCustomAdvOfficeRadioGroup = class(TAdvGroupbox) + private + FButtons: TList; + FItems: TStrings; + FItemIndex: Integer; + FColumns: Integer; + FReading: Boolean; + FUpdating: Boolean; + FAlignment: TAlignment; + FBtnVAlign: TTextLayout; + FImages: TImageList; + FContainer: TPictureContainer; + FEllipsis: Boolean; + FShadowOffset: Integer; + FShadowColor: TColor; + FOnIsEnabled: TEnabledEvent; + FIsReadOnly: boolean; + procedure ArrangeButtons; + procedure ButtonClick(Sender: TObject); + procedure ItemsChange(Sender: TObject); + procedure SetButtonCount(Value: Integer); + procedure SetColumns(Value: Integer); + procedure SetItemIndex(Value: Integer); + procedure SetItems(Value: TStrings); + procedure UpdateButtons; + procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED; + procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED; + procedure WMSize(var Message: TWMSize); message WM_SIZE; + procedure SetAlignment(const Value: TAlignment); + procedure SetButtonVertAlign(const Value: TTextLayout); + procedure SetContainer(const Value: TPictureContainer); + procedure SetImages(const Value: TImageList); + procedure SetEllipsis(const Value: Boolean); + procedure SetShadowColor(const Value: TColor); + procedure SetShadowOffset(const Value: Integer); + function GetVersion: string; + procedure SetVersion(const Value: string); + protected + function GetVersionNr: Integer; virtual; + procedure Loaded; override; + procedure ReadState(Reader: TReader); override; + function CanModify: Boolean; virtual; + procedure Notification(AComponent: TComponent; AOperation: TOperation); override; + property Columns: Integer read FColumns write SetColumns default 1; + property ItemIndex: Integer read FItemIndex write SetItemIndex default -1; + property Items: TStrings read FItems write SetItems; + property IsReadOnly: boolean read FIsReadOnly write FIsReadOnly; + public + procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override; + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + {$IFDEF DELPHI4_LVL} + procedure FlipChildren(AllLevels: Boolean); override; + {$ENDIF} + procedure PushKey(var Key: Char); + procedure PushKeyDown(var Key: Word; Shift: TShiftState); + published + property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify; + property ButtonVertAlign: TTextLayout read fBtnVAlign write SetButtonVertAlign default tlTop; + property Ellipsis: Boolean read FEllipsis write SetEllipsis; + property Images: TImageList read FImages write SetImages; + property PictureContainer: TPictureContainer read FContainer write SetContainer; + property ShadowColor: TColor read FShadowColor write SetShadowColor default clSilver; + property ShadowOffset: Integer read FShadowOffset write SetShadowOffset default 1; + property OnIsEnabled: TEnabledEvent read FOnIsEnabled write FOnIsEnabled; + property Version: string read GetVersion write SetVersion; + end; + + TAdvOfficeRadioGroup = class(TCustomAdvOfficeRadioGroup) + private + protected + public + published + property Align; + {$IFDEF DELPHI4_LVL} + property Anchors; + property BiDiMode; + property Constraints; + property DragKind; + property ParentBiDiMode; + {$ENDIF} + property Caption; + property Color; + property Columns; + property Ctl3D; + property DragCursor; + property DragMode; + property Enabled; + property Font; + property ItemIndex; + property Items; + property ParentColor; + property ParentCtl3D; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowHint; + property TabOrder; + property TabStop; + property Visible; + property OnClick; + {$IFDEF DELPHI5_LVL} + property OnContextPopup; + {$ENDIF} + property OnDragDrop; + property OnDragOver; + property OnEndDrag; + property OnEnter; + property OnExit; + {$IFDEF DELPHI4_LVL} + property OnEndDock; + property OnStartDock; + {$ENDIF} + property OnStartDrag; + end; + + TCustomAdvOfficeCheckGroup = class(TAdvGroupBox) + private + FButtons: TList; + FItems: TStrings; + FColumns: Integer; + FReading: Boolean; + FUpdating: Boolean; + FAlignment: TAlignment; + FBtnVAlign: TTextLayout; + FImages: TImageList; + FContainer: TPictureContainer; + FEllipsis: Boolean; + FShadowOffset: Integer; + FShadowColor: TColor; + FOnIsEnabled: TEnabledEvent; + FValue: DWord; + procedure ArrangeButtons; + procedure ButtonClick(Sender: TObject); + procedure ItemsChange(Sender: TObject); + procedure SetButtonCount(Value: Integer); + procedure SetColumns(Value: Integer); + procedure SetItems(Value: TStrings); + procedure UpdateButtons; + procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED; + procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED; + procedure WMSize(var Message: TWMSize); message WM_SIZE; + procedure SetAlignment(const Value: TAlignment); + procedure SetButtonVertAlign(const Value: TTextLayout); + procedure SetContainer(const Value: TPictureContainer); + procedure SetImages(const Value: TImageList); + procedure SetEllipsis(const Value: Boolean); + procedure SetShadowColor(const Value: TColor); + procedure SetShadowOffset(const Value: Integer); + function GetChecked(Index: Integer): Boolean; + procedure SetChecked(Index: Integer; const Value: Boolean); + function GetReadOnly(Index: Integer): Boolean; + procedure SetReadOnly(Index: Integer; const Value: Boolean); + function GetVersion: string; + procedure SetVersion(const Value: string); + function GetVersionNr: Integer; + procedure SetValue(const Value: DWord); + function GetValue: DWord; + protected + procedure Loaded; override; + procedure ReadState(Reader: TReader); override; + function CanModify: Boolean; virtual; + procedure Notification(AComponent: TComponent; AOperation: TOperation); override; + procedure UpdateValue; + property Columns: Integer read FColumns write SetColumns default 1; + property Items: TStrings read FItems write SetItems; + property Value: DWord read GetValue write SetValue; + public + procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override; + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + {$IFDEF DELPHI4_LVL} + procedure FlipChildren(AllLevels: Boolean); override; + {$ENDIF} + procedure PushKey(var Key: Char); + procedure PushKeyDown(var Key: Word; Shift: TShiftState); + property Checked[Index: Integer]: Boolean read GetChecked write SetChecked; + property ReadOnly[Index: Integer]: Boolean read GetReadOnly write SetReadOnly; + published + property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify; + property ButtonVertAlign: TTextLayout read fBtnVAlign write SetButtonVertAlign default tlTop; + property Ellipsis: Boolean read FEllipsis write SetEllipsis; + property Images: TImageList read FImages write SetImages; + property PictureContainer: TPictureContainer read FContainer write SetContainer; + property ShadowColor: TColor read FShadowColor write SetShadowColor default clSilver; + property ShadowOffset: Integer read FShadowOffset write SetShadowOffset default 1; + property OnIsEnabled: TEnabledEvent read FOnIsEnabled write FOnIsEnabled; + property Version: string read GetVersion write SetVersion; + end; + + TAdvOfficeCheckGroup = class(TCustomAdvOfficeCheckGroup) + private + protected + public + property Value; + published + property Align; + {$IFDEF DELPHI4_LVL} + property Anchors; + property BiDiMode; + property Constraints; + property DragKind; + property ParentBiDiMode; + {$ENDIF} + property Caption; + property Color; + property Columns; + property Ctl3D; + property DragCursor; + property DragMode; + property Enabled; + property Font; + property Items; + property ParentColor; + property ParentCtl3D; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowHint; + property TabOrder; + property TabStop; + property Visible; + property OnClick; + {$IFDEF DELPHI5_LVL} + property OnContextPopup; + {$ENDIF} + property OnDragDrop; + property OnDragOver; + property OnEndDrag; + property OnEnter; + property OnExit; + {$IFDEF DELPHI4_LVL} + property OnEndDock; + property OnStartDock; + {$ENDIF} + property OnStartDrag; + end; + + + + +implementation +uses + ShellApi, CommCtrl, Math +{$IFDEF DELPHI4_LVL} + ,Imglist +{$ENDIF} + ; + +{$I HTMLENGO.PAS} + + +const + BW = 12; + +procedure PaintFocusRect(ACanvas: TCanvas; R: TRect; Clr: TColor); +var + LB: TLogBrush; + HPen, HOldPen: THandle; +begin + ACanvas.Pen.Color := Clr; + + lb.lbColor := ColorToRGB(Clr); + lb.lbStyle := bs_Solid; + + HPen := ExtCreatePen(PS_COSMETIC or PS_ALTERNATE,1, lb, 0, nil); + HOldPen := SelectObject(ACanvas.Handle, HPen); + + MoveToEx(ACanvas.Handle, R.Left, R.Top, nil); + LineTo(ACanvas.Handle, R.Right, R.Top); + + MoveToEx(ACanvas.Handle, R.Right, R.Top, nil); + LineTo(ACanvas.Handle, R.Right, R.Bottom); + + MoveToEx(ACanvas.Handle, R.Right, R.Bottom, nil); + LineTo(ACanvas.Handle, R.Left, R.Bottom); + + MoveToEx(ACanvas.Handle, R.Left, R.Top, nil); + LineTo(ACanvas.Handle, R.Left, R.Bottom); + + DeleteObject(SelectObject(ACanvas.Handle,HOldPen)); +end; + + +{$IFNDEF DELPHI4_LVL} +function Min(a,b: Integer): Integer; +begin + if a < b then + Result := a + else + Result := b; +end; +{$ENDIF} + +{$IFDEF DELPHI4_LVL} +{$IFNDEF TMSDOTNET} +function GetFileVersion(FileName:string): Integer; +var + FileHandle:dword; + l: Integer; + pvs: PVSFixedFileInfo; + lptr: uint; + querybuf: array[0..255] of char; + buf: PChar; +begin + Result := -1; + + StrPCopy(querybuf,FileName); + l := GetFileVersionInfoSize(querybuf,FileHandle); + if (l>0) then + begin + GetMem(buf,l); + GetFileVersionInfo(querybuf,FileHandle,l,buf); + if VerQueryValue(buf,'\',Pointer(pvs),lptr) then + begin + if (pvs^.dwSignature = $FEEF04BD) then + begin + Result := pvs^.dwFileVersionMS; + end; + end; + FreeMem(buf); + end; +end; +{$ENDIF} +{$ENDIF} + + +function DoThemeDrawing: Boolean; +var + VerInfo: TOSVersioninfo; + FIsWinXP,FIsComCtl6: boolean; + i: integer; +begin + {$IFDEF TMSDOTNET} + VerInfo.dwOSVersionInfoSize := Marshal.SizeOf(TypeOf(TOSVersionInfo)); + {$ENDIF} + {$IFNDEF TMSDOTNET} + VerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); + {$ENDIF} + + GetVersionEx(verinfo); + + FIsWinXP := (verinfo.dwMajorVersion > 5) OR + ((verinfo.dwMajorVersion = 5) AND (verinfo.dwMinorVersion >= 1)); + + i := GetFileVersion('COMCTL32.DLL'); + i := (i shr 16) and $FF; + + FIsComCtl6 := (i > 5); + + Result := FIsComCtl6 and FIsWinXP; +end; + +{ TCustomHTMLCheckBox } + +constructor TCustomAdvOfficeCheckBox.Create(AOwner: TComponent); +var + VerInfo: TOSVersioninfo; + +begin + inherited Create(AOwner); + Width := 120; + Height := 20; + FUrlColor := clBlue; + FBtnVAlign := tlTop; + FImageCache := THTMLPictureCache.Create; + FCaption := self.ClassName; + FShadowOffset := 1; + FShadowColor := clGray; + + {$IFNDEF TMSDOTNET} + VerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); + {$ENDIF} + {$IFDEF TMSDOTNET} + VerInfo.dwOSVersionInfoSize := Marshal.SizeOf(TypeOf(TOSVersionInfo)); + {$ENDIF} + + GetVersionEx(verinfo); + + FIsWinXP := (verinfo.dwMajorVersion > 5) OR + ((verinfo.dwMajorVersion = 5) AND (verinfo.dwMinorVersion >= 1)); + + ControlStyle := ControlStyle - [csClickEvents]; + FReadOnly := False; + + {$IFNDEF TMSDOTNET} + FBkgBmp := TBitmap.Create; + FBkgCache := false; + FTransparentCaching := false; + {$ENDIF} + FDrawBkg := true; +end; + +function TCustomAdvOfficeCheckBox.IsAnchor(x,y:integer):string; +var + r,hr: TRect; + XSize,YSize,HyperLinks,MouseLink: Integer; + s:string; + Anchor, Stripped, FocusAnchor:string; +begin + r := Clientrect; + s := Caption; + Anchor:=''; + + r.left := r.left + BW + 5; + r.top := r.top + 4; + + Result := ''; + + if HTMLDrawEx(Canvas,s,r,FImages,x,y,-1,-1,FShadowOffset,True,False,False,False,False,False,not FEllipsis,1.0,FURLColor, + clNone,clNone,FShadowColor,Anchor,Stripped,FocusAnchor,XSize,YSize,HyperLinks,MouseLink,hr,FImageCache,FContainer,0) then + Result := Anchor; +end; + +{$IFNDEF TMSDOTNET} + +procedure TCustomAdvOfficeCheckBox.DrawParentImage(Control: TControl; Dest: TCanvas); +var + SaveIndex: Integer; + DC: HDC; + Position: TPoint; +begin + with Control do + begin + if Parent = nil then + Exit; + + DC := Dest.Handle; + SaveIndex := SaveDC(DC); + GetViewportOrgEx(DC, Position); + SetViewportOrgEx(DC, Position.X - Left, Position.Y - Top, nil); + IntersectClipRect(DC, 0, 0, Parent.ClientWidth, Parent.ClientHeight); + + Parent.Perform(WM_ERASEBKGND, Integer(DC), Integer(0)); + Parent.Perform(WM_PAINT, Integer(DC), Integer(0)); + RestoreDC(DC, SaveIndex); + end; +end; + +procedure TCustomAdvOfficeCheckBox.SetBounds(ALeft, ATop, AWidth, AHeight: Integer); +begin + inherited; + FBkgCache := false; + Repaint; +end; +{$ENDIF} + +procedure TCustomAdvOfficeCheckBox.DrawCheck; +var + bmp: TBitmap; + BL,BT:Integer; +begin + BT := 4; + //ExtraBW := 4; + bmp := TBitmap.Create; + if state = cbChecked then + begin + if Down then + bmp.LoadFromResourceName(hinstance,'TMSOFCCD') + else + if FHot then + bmp.LoadFromResourceName(hinstance,'TMSOFCCH') + else + bmp.LoadFromResourceName(hinstance,'TMSOFCC'); + + end + else + begin + if Down then + bmp.LoadFromResourceName(hinstance,'TMSOFCUD') + else + if FHot then + bmp.LoadFromResourceName(hinstance,'TMSOFCUH') + else + bmp.LoadFromResourceName(hinstance,'TMSOFCU'); + end; + + bmp.Transparent := true; + bmp.TransparentMode := tmAuto; + + case fBtnVAlign of + tlTop: BT := 4; + tlCenter: BT := (ClientRect.Bottom - ClientRect.Top) div 2 - (bmp.Height div 2); + tlBottom: BT := ClientRect.Bottom - bmp.Height; + end; + + if fAlignment = taRightJustify then + BL := ClientRect.Right - bmp.Width - 1 + else + BL := 0; + Canvas.Draw(BL,BT,bmp); + bmp.free; +end; + +procedure TCustomAdvOfficeCheckBox.Paint; +var + R, hr: TRect; + a,s,fa,text: string; + xsize,ysize: Integer; + ExtraBW,HyperLinks,MouseLink: Integer; + +begin + Canvas.Font := Font; + + if FTransparentCaching then + begin + if FBkgCache then + begin + Canvas.Draw(0,0,FBkgBmp) + end + else + begin + FBkgBmp.Width := self.Width; + FBkgBmp.Height := self.Height; + DrawParentImage(Self, FBkgBmp.Canvas); + Canvas.Draw(0,0,FBkgBmp); + FBkgCache := true; + end; + end + else + begin + if FDrawBkg then + DrawParentImage(Self, Canvas); + end; + + with Canvas do + begin + Text := Caption; + + DrawCheck; + + ExtraBW := 4; + + R := GetClientRect; + + if FAlignment = taRightJustify then + begin + r.Left := 0; + r.Right := r.Right - BW - ExtraBW; + end + else + r.left := r.left + BW + ExtraBW; + + r.top := r.top + 4; + + if not Enabled then + begin + OffsetRect(r,1,1); + Canvas.Font.Color := clWhite; + HTMLDrawEx(Canvas,Text,R,FImages,0,0,-1,-1,FShadowOffset,False,False,False,False,False,False,not FEllipsis,1.0,clWhite, + clNone,clNone,FShadowColor,a,s,fa,XSize,YSize,HyperLinks,MouseLink,hr,FImageCache,FContainer,0); + + Canvas.Font.Color := clGray; + Offsetrect(r,-1,-1); + + HTMLDrawEx(Canvas,Text,R,FImages,0,0,-1,-1,FShadowOffset,False,False,False,False,False,False,not FEllipsis,1.0,clGray, + clNone,clNone,FShadowColor,a,s,fa,XSize,YSize,HyperLinks,MouseLink,hr,FImageCache,FContainer,0); + end + else + HTMLDrawEx(Canvas,Text,R,FImages,0,0,-1,-1,FShadowOffset,False,False,False,False,False,False,not FEllipsis,1.0,FURLColor, + clNone,clNone,FShadowColor,a,s,fa,XSize,YSize,HyperLinks,MouseLink,hr,FImageCache,FContainer,0); + + if FFocused then + begin + r.right := r.left + xsize + 3; + r.bottom := r.top + ysize ; + //WinProcs.DrawFocusRect(Canvas.Handle,R); + PaintFocusRect(Canvas,R,clBlack); + end; + end; +end; + +procedure TCustomAdvOfficeCheckBox.SetDown(Value:Boolean); +begin + if FDown <> Value then + begin + FDown := Value; + end; +end; + +procedure TCustomAdvOfficeCheckBox.SetState(Value:TCheckBoxState); +var + r: TRect; +begin + if FState <> Value then + begin + FState := Value; + + if HandleAllocated and HasParent then + begin + r := GetClientRect; + case Alignment of + taLeftJustify: r.Right := 20; + taRightJustify: r.Left := r.Right - 20; + end; + {$IFNDEF TMSDOTNET} + InvalidateRect(self.Handle,@r,True); + {$ENDIF} + {$IFDEF TMSDOTNET} + InvalidateRect(self.Handle,r,True); + {$ENDIF} + end; + end; +end; + +function TCustomAdvOfficeCheckBox.GetChecked: Boolean; +begin + Result := (State = cbChecked); +end; + +procedure TCustomAdvOfficeCheckBox.SetChecked(Value:Boolean); +begin + if Value then + State := cbChecked + else + State := cbUnchecked; + + Invalidate; +end; + +procedure TCustomAdvOfficeCheckBox.DoEnter; +{$IFNDEF DELPHI9_LVL} +var + R: TRect; +{$ENDIF} +begin + inherited DoEnter; + FFocused := True; + {$IFDEF DELPHI9_LVL} + Repaint; + {$ELSE} + R := ClientRect; + R.Right := 16; + InvalidateRect(self.Handle, @R, true); + {$ENDIF} +end; + + +procedure TCustomAdvOfficeCheckBox.DoExit; +var + db: boolean; +begin + inherited DoExit; + FFocused := False; + db := FDrawBkg; + FDrawBkg := true; + Repaint; + FDrawBkg := db; +end; + +procedure TCustomAdvOfficeCheckBox.MouseDown(Button: TMouseButton; Shift: TShiftState;X, Y: Integer); +var + Anchor:string; + R: TRect; +begin + Anchor := ''; + FGotClick := true; + + if FFocused then + begin + Anchor := IsAnchor(X,Y); + + if Anchor <> '' then + begin + if (Pos('://',Anchor) > 0) or (Pos('mailto:',anchor) > 0) then + {$IFNDEF TMSDOTNET} + Shellexecute(0,'open',pchar(anchor),nil,nil,SW_NORMAL) + {$ENDIF} + {$IFDEF TMSDOTNET} + Shellexecute(0,'open',anchor,'','',SW_NORMAL) + {$ENDIF} + else + begin + if Assigned(FAnchorClick) then + FAnchorClick(self,anchor); + end; + end; + end + else + begin + if (self.CanFocus and not (csDesigning in ComponentState)) then + begin + SetFocus; + FFocused := True; + end; + end; + + if Anchor = '' then + begin + inherited MouseDown(Button, Shift, X, Y); + MouseCapture := True; + Down := True; + end; + + R := ClientRect; + R.Right := 16; + InvalidateRect(Self.Handle,@R, true); +end; + +procedure TCustomAdvOfficeCheckBox.MouseUp(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); +var + R: TRect; +begin + MouseCapture := False; + + Down := False; + + if (X >= 0) and (X<=Width) and (Y>=0) and (Y<=Height) and FFocused and FGotClick then + begin + ClicksDisabled := True; + Toggle; + ClicksDisabled := False; + Click; + end; + + inherited MouseUp(Button, Shift, X, Y); + + R := ClientRect; + R.Right := 16; + InvalidateRect(Self.Handle,@R, true); + + FGotClick := false; +end; + +procedure TCustomAdvOfficeCheckBox.MouseMove(Shift: TShiftState;X, Y: Integer); +var + Anchor:string; +begin + if MouseCapture then + Down := (X >= 0) and (X <= Width) and (Y >= 0) and (Y <= Height); + + if fFocused then + Anchor := IsAnchor(x,y) + else + Anchor := ''; + + if Anchor <> '' then + begin + if (self.Cursor = crDefault) or (FAnchor <> Anchor) then + begin + FAnchor := Anchor; + self.Cursor := crHandPoint; + if Assigned(FAnchorEnter) then + FAnchorEnter(self,Anchor); + end; + end + else + begin + if self.Cursor = crHandPoint then + begin + self.Cursor := FOldCursor; + if Assigned(FAnchorExit) then + FAnchorExit(self,Anchor); + end; + end; + + inherited MouseMove(Shift,X,Y); +end; + +procedure TCustomAdvOfficeCheckBox.KeyDown(var Key:Word;Shift:TShiftSTate); +begin + if (Key=vk_return) and (fReturnIsTab) then + begin + Key := vk_tab; + PostMessage(self.Handle,wm_keydown,VK_TAB,0); + end; + + if Key = vk_Space then + Down := True; + + inherited KeyDown(Key,Shift); +end; + +procedure TCustomAdvOfficeCheckBox.KeyUp(var Key:Word;Shift:TShiftSTate); +begin + if Key = vk_Space then + begin + Down := False; + Toggle; + Click; + end; +end; + + +procedure TCustomAdvOfficeCheckBox.SetImages(const Value: TImageList); +begin + FImages := Value; + Invalidate; +end; + +procedure TCustomAdvOfficeCheckBox.SetURLColor(const Value: TColor); +begin + if FURLColor <> Value then + begin + FURLColor := Value; + Invalidate; + end; +end; + +procedure TCustomAdvOfficeCheckBox.Notification(AComponent: TComponent; + AOperation: TOperation); +begin + inherited; + + if (AOperation = opRemove) and (AComponent = FImages) then + FImages:=nil; + + if (AOperation = opRemove) and (AComponent = FContainer) then + FContainer := nil; +end; + +procedure TCustomAdvOfficeCheckBox.CMEnabledChanged(var Message: TMessage); +begin + inherited; + Invalidate; +end; + +procedure TCustomAdvOfficeCheckBox.SetButtonVertAlign(const Value: TTextLayout); +begin + if Value <> FBtnVAlign then + begin + FBtnVAlign := Value; + Invalidate; + end; +end; + +procedure TCustomAdvOfficeCheckBox.SetAlignment(const Value: TLeftRight); +begin + if FAlignment <> Value then + begin + FAlignment := Value; + Invalidate; + end; +end; + +destructor TCustomAdvOfficeCheckBox.Destroy; +begin + {$IFNDEF TMSDOTNET} + FBkgBmp.Free; + {$ENDIF} + FImageCache.Free; + inherited; +end; + +procedure TCustomAdvOfficeCheckBox.SetEllipsis(const Value: Boolean); +begin + if FEllipsis <> Value then + begin + FEllipsis := Value; + Invalidate + end; +end; + +procedure TCustomAdvOfficeCheckBox.SetCaption(Value: string); +begin + {$IFNDEF TMSDOTNET} + SetWindowText(Handle,pchar(Value)); + {$ENDIF} + {$IFDEF TMSDOTNET} + SetWindowText(Handle,Value); + {$ENDIF} + FCaption := Value; + Invalidate; +end; + + +procedure TCustomAdvOfficeCheckBox.Toggle; +begin + if not FReadOnly then + Checked := not Checked; +end; + +procedure TCustomAdvOfficeCheckBox.WMEraseBkGnd(var Message: TMessage); +begin + Message.Result := 1 +end; + +procedure TCustomAdvOfficeCheckBox.CMDialogChar(var Message: TCMDialogChar); +begin + with Message do + begin + if IsAccel(CharCode, FCaption) and CanFocus then + begin + Toggle; + if Assigned(OnClick) then + OnClick(Self); + if TabStop then + if (self.CanFocus and not (csDesigning in ComponentState)) then + SetFocus; + Result := 1; + end + else + inherited; + end; +end; + +procedure TCustomAdvOfficeCheckBox.SetContainer(const Value: TPictureContainer); +begin + FContainer := Value; + Invalidate; +end; + +procedure TCustomAdvOfficeCheckBox.SetShadowColor(const Value: TColor); +begin + if FShadowColor <> Value then + begin + FShadowColor := Value; + Invalidate; + end; +end; + +procedure TCustomAdvOfficeCheckBox.SetShadowOffset(const Value: Integer); +begin + if FShadowOffset <> Value then + begin + FShadowOffset := Value; + Invalidate; + end; +end; + +procedure TCustomAdvOfficeCheckBox.CMMouseEnter(var Message: TMessage); +begin + FHot := True; + DrawCheck; + inherited; +end; + +procedure TCustomAdvOfficeCheckBox.CMMouseLeave(var Message: TMessage); +begin + FHot := False; + DrawCheck; + inherited; +end; + +procedure TCustomAdvOfficeCheckBox.Loaded; +begin + inherited; + FOldCursor := Cursor; +end; + +function TCustomAdvOfficeCheckBox.GetVersion: string; +var + vn: Integer; +begin + vn := GetVersionNr; + Result := IntToStr(Hi(Hiword(vn)))+'.'+IntToStr(Lo(Hiword(vn)))+'.'+IntToStr(Hi(Loword(vn)))+'.'+IntToStr(Lo(Loword(vn))); +end; + +function TCustomAdvOfficeCheckBox.GetVersionNr: Integer; +begin + Result := MakeLong(MakeWord(BLD_VER,REL_VER),MakeWord(MIN_VER,MAJ_VER)); +end; + +procedure TCustomAdvOfficeCheckBox.SetVersion(const Value: string); +begin + +end; + +{ THTMLRadioButton } + +constructor TAdvOfficeRadioButton.Create(AOwner: TComponent); +var + VerInfo: TOSVersionInfo; + +begin + inherited Create(AOwner); + Width := 135; + Height := 20; + FURLColor := clBlue; + FBtnVAlign := tlTop; + FImageCache := THTMLPictureCache.Create; + FCaption := self.ClassName; + FShadowOffset := 1; + FShadowColor := clGray; + {$IFNDEF TMSDOTNET} + VerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); + {$ENDIF} + {$IFDEF TMSDOTNET} + VerInfo.dwOSVersionInfoSize := Marshal.SizeOf(TypeOf(TOSVersionInfo)); + {$ENDIF} + GetVersionEx(verinfo); + + FIsWinXP := (verinfo.dwMajorVersion > 5) OR + ((verinfo.dwMajorVersion = 5) AND (verinfo.dwMinorVersion >= 1)); + + {$IFNDEF TMSDOTNET} + FBkgBmp := TBitmap.Create; + FBkgCache := false; + FTransparentCaching := false; + {$ENDIF} + FDrawBkg := true; +end; + +function TAdvOfficeRadioButton.IsAnchor(x,y:integer):string; +var + r,hr: TRect; + XSize,YSize,HyperLinks,MouseLink: Integer; + s: string; + Anchor,Stripped,FocusAnchor: string; +begin + r := Clientrect; + s := Caption; + Anchor := ''; + + r.left := r.left + BW + 5; + r.top := r.top + 4; + + Result := ''; + + if HTMLDrawEx(Canvas,s,r,FImages,x,y,-1,-1,FShadowOffset,True,False,False,False,False,False,not FEllipsis,1.0,FURLColor, + clNone,clNone,FShadowColor,Anchor,Stripped,FocusAnchor,XSize,YSize,HyperLinks,MouseLink,hr,FImageCache,FContainer,0) then + Result := Anchor; +end; + +procedure TAdvOfficeRadioButton.DrawParentImage(Control: TControl; Dest: TCanvas); +var + SaveIndex: Integer; + DC: HDC; + Position: TPoint; +begin + with Control do + begin + if Parent = nil then + Exit; + DC := Dest.Handle; + SaveIndex := SaveDC(DC); + GetViewportOrgEx(DC, Position); + SetViewportOrgEx(DC, Position.X - Left, Position.Y - Top, nil); + IntersectClipRect(DC, 0, 0, Parent.ClientWidth, Parent.ClientHeight); + Parent.Perform(WM_ERASEBKGND, Integer(DC), Integer(0)); + Parent.Perform(WM_PAINT, Integer(DC), Integer(0)); + RestoreDC(DC, SaveIndex); + end; +end; + + +procedure TAdvOfficeRadioButton.SetBounds(ALeft, ATop, AWidth, AHeight: Integer); +begin + inherited; + begin + FBkgCache := false; + Repaint; + end; +end; + +procedure TAdvOfficeRadioButton.DrawRadio; +var + bmp: TBitmap; + BT, BL: integer; +begin + BT := 4; + bmp := TBitmap.Create; + if (Checked) then + begin + if Down then + bmp.LoadFromResourceName(hinstance,'TMSOFRCD') + else + if FHot then + bmp.LoadFromResourceName(hinstance,'TMSOFRCH') + else + bmp.LoadFromResourceName(hinstance,'TMSOFRC'); + + end + else + begin + if Down then + bmp.LoadFromResourceName(hinstance,'TMSOFRUD') + else + if FHot then + bmp.LoadFromResourceName(hinstance,'TMSOFRUH') + else + bmp.LoadFromResourceName(hinstance,'TMSOFRU'); + end; + + bmp.Transparent:=true; + bmp.TransparentMode :=tmAuto; + + case FBtnVAlign of + tlTop: BT := 4; + tlCenter: BT := (ClientRect.Bottom-ClientRect.Top) div 2 - (bmp.Height div 2); + tlBottom: BT := ClientRect.Bottom - bmp.Height - 2; + end; + + if fAlignment = taRightJustify then + BL := ClientRect.Right - bmp.Width - 1 + else + BL := 0; + Canvas.Draw(BL,BT,bmp); + bmp.Free; +end; + +procedure TAdvOfficeRadioButton.Paint; +var + BR:Integer; + R,hr: TRect; + a,s,fa,text: string; + XSize,YSize,HyperLinks,MouseLink: Integer; + +begin + Canvas.Font := Font; + Text := Caption; + + if FTransparentCaching then + begin + if FBkgCache then + begin + Self.Canvas.Draw(0,0,FBkgBmp) + end + else + begin + FBkgBmp.Width := self.Width; + FBkgBmp.Height := self.Height; + //FBkgBmp.PixelFormat := pf32bit; + DrawParentImage(Self, FBkgBmp.Canvas); + Self.Canvas.Draw(0,0,FBkgBmp); + FBkgCache := true; + end; + end + else + begin + if DrawBkg then + DrawParentImage(Self, self.Canvas); + end; + + with Canvas do + begin + BR := 13; + DrawRadio; + + r := GetClientRect; + if FAlignment = taRightJustify then + begin + r.Left := 0; + r.Right := r.Right - BR - 5; + end + else + r.Left := r.Left + BR + 5; + + r.Top := r.Top + 4; + + if not Enabled then + begin + OffsetRect(R,1,1); + Canvas.Font.Color := clWhite; + HTMLDrawEx(Canvas,Text,R,FImages,0,0,-1,-1,FShadowOffset,False,False,False,False,False,False,not FEllipsis,1.0,clGray, + clNone,clNone,FShadowColor,a,s,fa,XSize,YSize,HyperLinks,MouseLink,hr,FImageCache,FContainer,0); + Canvas.Font.Color := clGray; + Offsetrect(R,-1,-1); + HTMLDrawEx(Canvas,Text,R,FImages,0,0,-1,-1,FShadowOffset,False,False,False,False,False,False,not FEllipsis,1.0,clWhite, + clNone,clNone,FShadowColor,a,s,fa,XSize,YSize,HyperLinks,MouseLink,hr,FImageCache,FContainer,0); + end + else + begin + Canvas.Font.Color := Font.Color; + HTMLDrawEx(Canvas,Text,R,FImages,0,0,-1,-1,FShadowOffset,False,False,False,False,False,False,not FEllipsis,1.0,FURLColor, + clNone,clNone,FShadowColor,a,s,fa,XSize,YSize,HyperLinks,MouseLink,hr,FImageCache,FContainer,0); + end; + + if FFocused then + begin + r.Right := r.Left + xsize + 3; + r.Bottom := r.Top + ysize {+ 1}; + PaintFocusRect(Canvas,R,clBlack); + end; + + end; +end; + +procedure TAdvOfficeRadioButton.SetURLColor(const Value: TColor); +begin + FURLColor := Value; + Invalidate; +end; + + +procedure TAdvOfficeRadioButton.SetDown(Value:Boolean); +begin + if FDown<>Value then + begin + FDown := Value; + end; +end; + + +procedure TAdvOfficeRadioButton.TurnSiblingsOff; +var + i:Integer; + Sibling: TAdvOfficeRadioButton; + +begin + if (Parent <> nil) then + for i:=0 to Parent.ControlCount-1 do + if Parent.Controls[i] is TAdvOfficeRadioButton then + begin + Sibling := TAdvOfficeRadioButton(Parent.Controls[i]); + if (Sibling <> Self) and + (Sibling.GroupIndex = GroupIndex) then + Sibling.SetChecked(False); + end; +end; + +procedure TAdvOfficeRadioButton.SetChecked(Value: Boolean); +var + r: TRect; +begin + if FChecked <> Value then + begin + TabStop := Value; + FChecked := Value; + if Value then + begin + TurnSiblingsOff; + //if not FClicksDisabled then + //DoClick; + end; + + if HandleAllocated and HasParent then + begin + R := ClientRect; + R.Right := 16; + InvalidateRect(self.Handle, @r, true); + end; + + // Invalidate; + end; +end; + + +procedure TAdvOfficeRadioButton.DoClick; +begin + if Assigned(OnClick) then + OnClick(Self); +end; + +procedure TAdvOfficeRadioButton.DoEnter; +{$IFNDEF DELPHI9_LVL} +var + R: TRect; +{$ENDIF} +begin + inherited DoEnter; + FFocused := True; + Checked := true; + {$IFDEF DELPHI9_LVL} + Repaint; + {$ELSE} + R := ClientRect; + R.Right := 16; + InvalidateRect(self.Handle, @R, true); + {$ENDIF} +end; + +procedure TAdvOfficeRadioButton.DoExit; +var + db: boolean; +begin + inherited DoExit; + FFocused := False; + db := FDrawBkg; + FDrawBkg := true; + Repaint; + FDrawBkg := db; +end; + +procedure TAdvOfficeRadioButton.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +var + Anchor:string; + R: TRect; +begin + Anchor := ''; + FGotClick := true; + + if FFocused then + begin + Anchor := IsAnchor(X,Y); + if Anchor <> '' then + begin + if (Pos('://',Anchor)>0) or (Pos('mailto:',Anchor)>0) then + {$IFNDEF TMSDOTNET} + ShellExecute(0,'open',PChar(Anchor),nil,nil,SW_NORMAL) + {$ENDIF} + {$IFDEF TMSDOTNET} + ShellExecute(0,'open',Anchor,'','',SW_NORMAL) + {$ENDIF} + else + begin + if Assigned(FAnchorClick) then + FAnchorClick(self,anchor); + end; + end; + end + else + begin + if (self.CanFocus and not (csDesigning in ComponentState)) then + begin + SetFocus; + FFocused := True; + end; + end; + + if Anchor = '' then + begin + inherited MouseDown(Button, Shift, X, Y); + MouseCapture := True; + Down := True; + end; + + R := ClientRect; + R.Right := 16; + InvalidateRect(self.Handle, @r, true); +end; + +procedure TAdvOfficeRadioButton.MouseUp(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); +var + R: TRect; +begin + MouseCapture := False; + Down := False; + + if (X >= 0) and (X <= Width) and (Y >= 0) and (Y <= Height) and not Checked and FGotClick then + begin + Checked := true; + end; + + inherited MouseUp(Button, Shift, X, Y); + + DoClick; + + R := ClientRect; + R.Right := 16; + InvalidateRect(self.Handle, @r, true); + + FGotClick := false; +end; + +procedure TAdvOfficeRadioButton.MouseMove(Shift: TShiftState;X, Y: Integer); +var + Anchor:string; +begin + if MouseCapture then + Down := (X>=0) and (X<=Width) and (Y>=0) and (Y<=Height); + + if FFocused then + Anchor := IsAnchor(x,y) + else + Anchor := ''; + + if Anchor <> '' then + begin + if (self.Cursor = crDefault) or (fAnchor <> Anchor) then + begin + FAnchor := Anchor; + self.Cursor := crHandPoint; + if Assigned(FAnchorEnter) then + FAnchorEnter(self,anchor); + end; + end + else + begin + if self.Cursor = crHandPoint then + begin + self.Cursor := FOldCursor; + if Assigned(FAnchorExit) then + FAnchorExit(self,anchor); + end; + end; + + inherited MouseMove(Shift,X,Y); +end; + +procedure TAdvOfficeRadioButton.KeyDown(var Key:Word;Shift:TShiftSTate); +begin + if (Key = vk_return) and (FReturnIsTab) then + begin + Key := vk_tab; + PostMessage(self.Handle,wm_keydown,VK_TAB,0); + end; + + if Key = VK_SPACE then + Down := True; + + inherited KeyDown(Key,Shift); +end; + +procedure TAdvOfficeRadioButton.KeyUp(var Key:Word;Shift:TShiftSTate); +begin + if Key = VK_SPACE then + begin + Down := False; + if not Checked then Checked := True; + end; +end; + +procedure TAdvOfficeRadioButton.SetImages(const Value: TImageList); +begin + FImages := Value; + Invalidate; +end; + +procedure TAdvOfficeRadioButton.Notification(AComponent: TComponent; + AOperation: TOperation); +begin + inherited; + if (AOperation = opRemove) and (AComponent = FImages) then + FImages := nil; + + if (AOperation = opRemove) and (AComponent = FContainer) then + FContainer := nil; +end; + +procedure TAdvOfficeRadioButton.CMEnabledChanged(var Message: TMessage); +begin + inherited; + Invalidate; +end; + +procedure TAdvOfficeRadioButton.SetButtonVertAlign(const Value: TTextLayout); +begin + if Value <> FBtnVAlign then + begin + FBtnVAlign := Value; + Invalidate; + end; +end; + +procedure TAdvOfficeRadioButton.SetAlignment(const Value: TLeftRight); +begin + if FAlignment <> Value then + begin + FAlignment := Value; + Invalidate; + end; +end; + +destructor TAdvOfficeRadioButton.Destroy; +begin + {$IFNDEF TMSDOTNET} + FBkgBmp.Free; + {$ENDIF} + FImageCache.Free; + inherited; +end; + +procedure TAdvOfficeRadioButton.SetEllipsis(const Value: Boolean); +begin + if FEllipsis <> Value then + begin + FEllipsis := Value; + Invalidate; + end; +end; + +procedure TAdvOfficeRadioButton.SetCaption(const Value: string); +begin + inherited Caption := Value; + FCaption := Value; + Invalidate; +end; + +procedure TAdvOfficeRadioButton.Click; +begin +// inherited; +end; + +procedure TAdvOfficeRadioButton.CMDialogChar(var Message: TCMDialogChar); +begin + with Message do + if IsAccel(CharCode, FCaption) and CanFocus then + begin + Checked := True; + if TabStop then + if (self.CanFocus and not (csDesigning in ComponentState)) then + SetFocus; + Result := 1; + end else + inherited; + +end; + +procedure TAdvOfficeRadioButton.SetContainer(const Value: TPictureContainer); +begin + FContainer := Value; + Invalidate; +end; + +procedure TAdvOfficeRadioButton.SetShadowColor(const Value: TColor); +begin + if FShadowColor <> Value then + begin + FShadowColor := Value; + Invalidate; + end; +end; + +procedure TAdvOfficeRadioButton.SetShadowOffset(const Value: Integer); +begin + if FShadowOffset <> Value then + begin + FShadowOffset := Value; + Invalidate; + end; +end; + +procedure TAdvOfficeRadioButton.CMMouseEnter(var Message: TMessage); +begin + FHot := True; + DrawRadio; + inherited; +end; + +procedure TAdvOfficeRadioButton.CMMouseLeave(var Message: TMessage); +begin + FHot := False; + DrawRadio; + inherited; +end; + + +procedure TAdvOfficeRadioButton.WMEraseBkGnd(var Message: TMessage); +begin + Message.Result := 1 +end; + +procedure TAdvOfficeRadioButton.WMLButtonDown(var Message:TWMLButtonDown); +begin + FClicksDisabled := True; + if (self.CanFocus and not (csDesigning in ComponentState)) then + SetFocus; + FClicksDisabled := False; + inherited; +end; + +procedure TAdvOfficeRadioButton.Loaded; +begin + inherited; + FOldCursor := Cursor; +end; + +function TAdvOfficeRadioButton.GetVersion: string; +var + vn: Integer; +begin + vn := GetVersionNr; + Result := IntToStr(Hi(Hiword(vn)))+'.'+IntToStr(Lo(Hiword(vn)))+'.'+IntToStr(Hi(Loword(vn)))+'.'+IntToStr(Lo(Loword(vn))); +end; + +function TAdvOfficeRadioButton.GetVersionNr: Integer; +begin + Result := MakeLong(MakeWord(BLD_VER,REL_VER),MakeWord(MIN_VER,MAJ_VER)); +end; + +procedure TAdvOfficeRadioButton.SetVersion(const Value: string); +begin + +end; + + +{ TAdvGroupButton } + +type + TAdvGroupButton = class(TAdvOfficeRadioButton) + private + FInClick: Boolean; + procedure CNCommand(var Message: TWMCommand); message CN_COMMAND; + protected + procedure KeyDown(var Key: Word; Shift: TShiftState); override; + procedure KeyPress(var Key: Char); override; + public + constructor InternalCreate(RadioGroup: TCustomAdvOfficeRadioGroup); + destructor Destroy; override; + end; + +constructor TAdvGroupButton.InternalCreate(RadioGroup: TCustomAdvOfficeRadioGroup); +begin + inherited Create(RadioGroup); + RadioGroup.FButtons.Add(Self); + Visible := False; + Enabled := RadioGroup.Enabled; + ParentShowHint := False; + OnClick := RadioGroup.ButtonClick; + Parent := RadioGroup; +end; + +destructor TAdvGroupButton.Destroy; +begin + TCustomAdvOfficeRadioGroup(Owner).FButtons.Remove(Self); + inherited Destroy; +end; + +procedure TAdvGroupButton.CNCommand(var Message: TWMCommand); +begin + if not FInClick then + begin + FInClick := True; + try + if ((Message.NotifyCode = BN_CLICKED) or + (Message.NotifyCode = BN_DOUBLECLICKED)) and + TCustomAdvOfficeRadioGroup(Parent).CanModify then + inherited; + except + Application.HandleException(Self); + end; + + FInClick := False; + end; +end; + +procedure TAdvGroupButton.KeyPress(var Key: Char); +begin + inherited KeyPress(Key); + TCustomAdvOfficeRadioGroup(Parent).PushKey(Key); + if (Key = #8) or (Key = ' ') then + begin + if not TCustomAdvOfficeRadioGroup(Parent).CanModify then Key := #0; + end; +end; + +procedure TAdvGroupButton.KeyDown(var Key: Word; Shift: TShiftState); +begin + inherited KeyDown(Key, Shift); + TCustomAdvOfficeRadioGroup(Parent).PushKeyDown(Key, Shift); +end; + +{ TCustomAdvOfficeRadioGroup } + +constructor TCustomAdvOfficeRadioGroup.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + ControlStyle := [csSetCaption, csDoubleClicks]; + FButtons := TList.Create; + FItems := TStringList.Create; + TStringList(FItems).OnChange := ItemsChange; + FItemIndex := -1; + FColumns := 1; + FAlignment := taLeftJustify; + FBtnVAlign := tlTop; + ShadowOffset := 1; + ShadowColor := clSilver; + FIsReadOnly := false; +end; + +destructor TCustomAdvOfficeRadioGroup.Destroy; +begin + SetButtonCount(0); + TStringList(FItems).OnChange := nil; + FItems.Free; + FButtons.Free; + inherited Destroy; +end; + +procedure TCustomAdvOfficeRadioGroup.PushKey(var Key: Char); +begin + KeyPress(Key); +end; + +procedure TCustomAdvOfficeRadioGroup.PushKeyDown(var Key: Word; Shift: TShiftState); +begin + KeyDown(Key,Shift); +end; + +procedure TCustomAdvOfficeRadioGroup.FlipChildren(AllLevels: Boolean); +begin + { The radio buttons are flipped using BiDiMode } +end; + + +procedure TCustomAdvOfficeRadioGroup.ArrangeButtons; +var + ButtonsPerCol, ButtonWidth, ButtonHeight, TopMargin, I: Integer; + DC: HDC; + SaveFont: HFont; + Metrics: TTextMetric; + DeferHandle: THandle; + ALeft: Integer; + RadioEnable: Boolean; + +begin + + if (csLoading in ComponentState) then + Exit; + + if not HandleAllocated then + Exit; + + + if (FButtons.Count <> 0) and not FReading then + begin + DC := GetDC(0); + SaveFont := SelectObject(DC, Font.Handle); + GetTextMetrics(DC, Metrics); + SelectObject(DC, SaveFont); + ReleaseDC(0, DC); + ButtonsPerCol := (FButtons.Count + FColumns - 1) div FColumns; + ButtonWidth := (Width - 10) div FColumns; + I := Height - Metrics.tmHeight - 5; + ButtonHeight := I div ButtonsPerCol; + TopMargin := Metrics.tmHeight + 1 + (I mod ButtonsPerCol) div 2; + + DeferHandle := BeginDeferWindowPos(FButtons.Count); + try + for I := 0 to FButtons.Count - 1 do + with TAdvGroupButton(FButtons[I]) do + begin + {$IFDEF DELPHI4_LVL} + BiDiMode := Self.BiDiMode; + {$ENDIF} + + DrawBkg := false; + Alignment := Self.Alignment; + ButtonVertAlign := Self.ButtonVertAlign; + Images := Self.Images; + PictureContainer := Self.PictureContainer; + Ellipsis := Self.Ellipsis; + ShadowOffset := Self.ShadowOffset; + ShadowColor := Self.ShadowColor; + + RadioEnable := Self.Enabled and Enabled and not FIsReadOnly; + if Assigned(FOnIsEnabled) then + FOnIsEnabled(Self,I,RadioEnable); + + Enabled := RadioEnable; + + ALeft := (I div ButtonsPerCol) * ButtonWidth + 8; + {$IFDEF DELPHI4_LVL} + if UseRightToLeftAlignment then + ALeft := Self.ClientWidth - ALeft - ButtonWidth; + {$ENDIF} + + DeferHandle := DeferWindowPos(DeferHandle, Handle, 0, + ALeft, + (I mod ButtonsPerCol) * ButtonHeight + TopMargin, + ButtonWidth, ButtonHeight, + SWP_NOZORDER or SWP_NOACTIVATE); + + // Left := ALeft; + // Top := (I mod ButtonsPerCol) * ButtonHeight + TopMargin; + Visible := True; + + end; + finally + EndDeferWindowPos(DeferHandle); + end; + end; +end; + +procedure TCustomAdvOfficeRadioGroup.ButtonClick(Sender: TObject); +begin + if not FUpdating then + begin + FItemIndex := FButtons.IndexOf(Sender); + Changed; + Click; + end; +end; + +procedure TCustomAdvOfficeRadioGroup.ItemsChange(Sender: TObject); +begin + if not FReading then + begin + if FItemIndex >= FItems.Count then + FItemIndex := FItems.Count - 1; + UpdateButtons; + end; +end; + +procedure TCustomAdvOfficeRadioGroup.Loaded; +begin + inherited Loaded; + ArrangeButtons; +end; + +procedure TCustomAdvOfficeRadioGroup.ReadState(Reader: TReader); +begin + FReading := True; + inherited ReadState(Reader); + FReading := False; + UpdateButtons; +end; + +procedure TCustomAdvOfficeRadioGroup.SetButtonCount(Value: Integer); +begin + while FButtons.Count < Value do TAdvGroupButton.InternalCreate(Self); + while FButtons.Count > Value do TAdvGroupButton(FButtons.Last).Free; +end; + +procedure TCustomAdvOfficeRadioGroup.SetColumns(Value: Integer); +begin + if Value < 1 then Value := 1; + if Value > 16 then Value := 16; + if FColumns <> Value then + begin + FColumns := Value; + ArrangeButtons; + Invalidate; + end; +end; + +procedure TCustomAdvOfficeRadioGroup.SetItemIndex(Value: Integer); +begin + if FReading then FItemIndex := Value else + begin + if Value < -1 then Value := -1; + if Value >= FButtons.Count then Value := FButtons.Count - 1; + if FItemIndex <> Value then + begin + if FItemIndex >= 0 then + TAdvGroupButton(FButtons[FItemIndex]).Checked := False; + FItemIndex := Value; + if FItemIndex >= 0 then + TAdvGroupButton(FButtons[FItemIndex]).Checked := True; + end; + end; +end; + +procedure TCustomAdvOfficeRadioGroup.SetItems(Value: TStrings); +begin + FItems.Assign(Value); +end; + +procedure TCustomAdvOfficeRadioGroup.UpdateButtons; +var + I: Integer; +begin + SetButtonCount(FItems.Count); + for I := 0 to FButtons.Count - 1 do + TAdvGroupButton(FButtons[I]).Caption := FItems[I]; + if FItemIndex >= 0 then + begin + FUpdating := True; + TAdvGroupButton(FButtons[FItemIndex]).Checked := True; + FUpdating := False; + end; + ArrangeButtons; + Invalidate; +end; + +procedure TCustomAdvOfficeRadioGroup.CMEnabledChanged(var Message: TMessage); +var + I: Integer; +begin + inherited; + for I := 0 to FButtons.Count - 1 do + TAdvGroupButton(FButtons[I]).Enabled := Enabled; +end; + +procedure TCustomAdvOfficeRadioGroup.CMFontChanged(var Message: TMessage); +begin + inherited; + ArrangeButtons; +end; + +procedure TCustomAdvOfficeRadioGroup.WMSize(var Message: TWMSize); +begin + inherited; + ArrangeButtons; +end; + +function TCustomAdvOfficeRadioGroup.CanModify: Boolean; +begin + Result := True; +end; + +procedure TCustomAdvOfficeRadioGroup.GetChildren(Proc: TGetChildProc; Root: TComponent); +begin +end; + +procedure TCustomAdvOfficeRadioGroup.SetAlignment(const Value: TAlignment); +begin + FAlignment := Value; + ArrangeButtons; +end; + +procedure TCustomAdvOfficeRadioGroup.SetButtonVertAlign( + const Value: TTextLayout); +begin + fBtnVAlign := Value; + ArrangeButtons; +end; + +procedure TCustomAdvOfficeRadioGroup.SetContainer( + const Value: TPictureContainer); +begin + FContainer := Value; + ArrangeButtons; +end; + +procedure TCustomAdvOfficeRadioGroup.SetImages(const Value: TImageList); +begin + inherited Images := Value; + FImages := Value; + ArrangeButtons; +end; + +procedure TCustomAdvOfficeRadioGroup.Notification(AComponent: TComponent; + AOperation: TOperation); +begin + inherited; + + if (AOperation = opRemove) and (AComponent = FImages) then + FImages:=nil; + + if (AOperation = opRemove) and (AComponent = FContainer) then + FContainer := nil; +end; + +procedure TCustomAdvOfficeRadioGroup.SetEllipsis(const Value: Boolean); +begin + FEllipsis := Value; + ArrangeButtons; +end; + +procedure TCustomAdvOfficeRadioGroup.SetShadowColor(const Value: TColor); +begin + FShadowColor := Value; + ArrangeButtons; +end; + +procedure TCustomAdvOfficeRadioGroup.SetShadowOffset(const Value: Integer); +begin + FShadowOffset := Value; + ArrangeButtons; +end; + +function TCustomAdvOfficeRadioGroup.GetVersion: string; +var + vn: Integer; +begin + vn := GetVersionNr; + Result := IntToStr(Hi(Hiword(vn)))+'.'+IntToStr(Lo(Hiword(vn)))+'.'+IntToStr(Hi(Loword(vn)))+'.'+IntToStr(Lo(Loword(vn))); +end; + +function TCustomAdvOfficeRadioGroup.GetVersionNr: Integer; +begin + Result := MakeLong(MakeWord(BLD_VER,REL_VER),MakeWord(MIN_VER,MAJ_VER)); +end; + +procedure TCustomAdvOfficeRadioGroup.SetVersion(const Value: string); +begin + +end; + + +{ TGroupCheck } + +type + TGroupCheck = class(TAdvOfficeCheckBox) + private + FInClick: Boolean; + procedure CNCommand(var Message: TWMCommand); message CN_COMMAND; + protected + procedure KeyDown(var Key: Word; Shift: TShiftState); override; + procedure KeyPress(var Key: Char); override; + public + constructor InternalCreate(CheckGroup: TCustomAdvOfficeCheckGroup); + destructor Destroy; override; + end; + +constructor TGroupCheck.InternalCreate(CheckGroup: TCustomAdvOfficeCheckGroup); +begin + inherited Create(CheckGroup); + CheckGroup.FButtons.Add(Self); + Visible := False; + Enabled := CheckGroup.Enabled; + ParentShowHint := False; + OnClick := CheckGroup.ButtonClick; + Parent := CheckGroup; +end; + +destructor TGroupCheck.Destroy; +begin + TCustomAdvOfficeCheckGroup(Owner).FButtons.Remove(Self); + inherited Destroy; +end; + +procedure TGroupCheck.CNCommand(var Message: TWMCommand); +begin + if not FInClick then + begin + FInClick := True; + try + if ((Message.NotifyCode = BN_CLICKED) or + (Message.NotifyCode = BN_DOUBLECLICKED)) and + TCustomAdvOfficeCheckGroup(Parent).CanModify then + inherited; + except + Application.HandleException(Self); + end; + FInClick := False; + end; +end; + +procedure TGroupCheck.KeyPress(var Key: Char); +begin + inherited KeyPress(Key); + TCustomAdvOfficeCheckGroup(Parent).PushKey(Key); + if (Key = #8) or (Key = ' ') then + begin + if not TCustomAdvOfficeCheckGroup(Parent).CanModify then Key := #0; + end; +end; + +procedure TGroupCheck.KeyDown(var Key: Word; Shift: TShiftState); +begin + inherited KeyDown(Key, Shift); + TCustomAdvOfficeCheckGroup(Parent).PushKeyDown(Key, Shift); +end; + + +{ TCustomAdvOfficeCheckGroup } + +constructor TCustomAdvOfficeCheckGroup.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + ControlStyle := [csSetCaption, csDoubleClicks]; + FButtons := TList.Create; + FItems := TStringList.Create; + TStringList(FItems).OnChange := ItemsChange; + FColumns := 1; + FAlignment := taLeftJustify; + FBtnVAlign := tlTop; + ShadowOffset := 1; + ShadowColor := clSilver; + FValue := 0; +end; + +destructor TCustomAdvOfficeCheckGroup.Destroy; +begin + SetButtonCount(0); + TStringList(FItems).OnChange := nil; + FItems.Free; + FButtons.Free; + inherited Destroy; +end; + +procedure TCustomAdvOfficeCheckGroup.PushKey(var Key: Char); +begin + KeyPress(Key); +end; + +procedure TCustomAdvOfficeCheckGroup.PushKeyDown(var Key: Word; Shift: TShiftState); +begin + KeyDown(Key,Shift); +end; + +{$IFDEF DELPHI4_LVL} +procedure TCustomAdvOfficeCheckGroup.FlipChildren(AllLevels: Boolean); +begin + { The radio buttons are flipped using BiDiMode } +end; +{$ENDIF} + +procedure TCustomAdvOfficeCheckGroup.ArrangeButtons; +var + ButtonsPerCol, ButtonWidth, ButtonHeight, TopMargin, I: Integer; + DC: HDC; + SaveFont: HFont; + Metrics: TTextMetric; + DeferHandle: THandle; + ALeft: Integer; + RadioEnable: Boolean; + +begin + if (FButtons.Count <> 0) and not FReading then + begin + DC := GetDC(0); + SaveFont := SelectObject(DC, Font.Handle); + GetTextMetrics(DC, Metrics); + SelectObject(DC, SaveFont); + ReleaseDC(0, DC); + ButtonsPerCol := (FButtons.Count + FColumns - 1) div FColumns; + ButtonWidth := (Width - 10) div FColumns; + I := Height - Metrics.tmHeight - 5; + ButtonHeight := I div ButtonsPerCol; + TopMargin := Metrics.tmHeight + 1 + (I mod ButtonsPerCol) div 2; + DeferHandle := BeginDeferWindowPos(FButtons.Count); + try + for I := 0 to FButtons.Count - 1 do + with TGroupCheck(FButtons[I]) do + begin + {$IFDEF DELPHI4_LVL} + BiDiMode := Self.BiDiMode; + {$ENDIF} + + DrawBkg := false; + Alignment := Self.Alignment; + ButtonVertAlign := Self.ButtonVertAlign; + Images := Self.Images; + PictureContainer := Self.PictureContainer; + Ellipsis := Self.Ellipsis; + ShadowOffset := Self.ShadowOffset; + ShadowColor := Self.ShadowColor; + + RadioEnable := self.Enabled; + if Assigned(FOnIsEnabled) then + FOnIsEnabled(Self,I,RadioEnable); + + Enabled := RadioEnable; + + ALeft := (I div ButtonsPerCol) * ButtonWidth + 8; + {$IFDEF DELPHI4_LVL} + if UseRightToLeftAlignment then + ALeft := Self.ClientWidth - ALeft - ButtonWidth; + {$ENDIF} + DeferHandle := DeferWindowPos(DeferHandle, Handle, 0, + ALeft, + (I mod ButtonsPerCol) * ButtonHeight + TopMargin, + ButtonWidth, ButtonHeight, + SWP_NOZORDER or SWP_NOACTIVATE); + Visible := True; + + end; + finally + EndDeferWindowPos(DeferHandle); + end; + end; +end; + +procedure TCustomAdvOfficeCheckGroup.ButtonClick(Sender: TObject); +begin + if not FUpdating then + begin + Changed; + Click; + end; + UpdateValue; +end; + +procedure TCustomAdvOfficeCheckGroup.ItemsChange(Sender: TObject); +begin + if not FReading then + begin + UpdateButtons; + end; +end; + +procedure TCustomAdvOfficeCheckGroup.Loaded; +begin + inherited Loaded; + ArrangeButtons; + Value := Value; +end; + +procedure TCustomAdvOfficeCheckGroup.ReadState(Reader: TReader); +begin + FReading := True; + inherited ReadState(Reader); + FReading := False; + UpdateButtons; +end; + +procedure TCustomAdvOfficeCheckGroup.SetButtonCount(Value: Integer); +begin + while FButtons.Count < Value do TGroupCheck.InternalCreate(Self); + while FButtons.Count > Value do TGroupCheck(FButtons.Last).Free; +end; + +procedure TCustomAdvOfficeCheckGroup.SetColumns(Value: Integer); +begin + if Value < 1 then Value := 1; + if Value > 16 then Value := 16; + if FColumns <> Value then + begin + FColumns := Value; + ArrangeButtons; + Invalidate; + end; +end; + +procedure TCustomAdvOfficeCheckGroup.SetItems(Value: TStrings); +begin + FItems.Assign(Value); +end; + +procedure TCustomAdvOfficeCheckGroup.UpdateButtons; +var + I: Integer; +begin + SetButtonCount(FItems.Count); + for I := 0 to FButtons.Count - 1 do + TGroupCheck(FButtons[I]).Caption := FItems[I]; + + ArrangeButtons; + Invalidate; +end; + +procedure TCustomAdvOfficeCheckGroup.CMEnabledChanged(var Message: TMessage); +var + I: Integer; +begin + inherited; + for I := 0 to FButtons.Count - 1 do + TGroupCheck(FButtons[I]).Enabled := Enabled; +end; + +procedure TCustomAdvOfficeCheckGroup.CMFontChanged(var Message: TMessage); +begin + inherited; + ArrangeButtons; +end; + +procedure TCustomAdvOfficeCheckGroup.WMSize(var Message: TWMSize); +begin + inherited; + ArrangeButtons; +end; + +function TCustomAdvOfficeCheckGroup.CanModify: Boolean; +begin + Result := True; +end; + +procedure TCustomAdvOfficeCheckGroup.GetChildren(Proc: TGetChildProc; Root: TComponent); +begin +end; + +procedure TCustomAdvOfficeCheckGroup.SetAlignment(const Value: TAlignment); +begin + FAlignment := Value; + ArrangeButtons; +end; + +procedure TCustomAdvOfficeCheckGroup.SetButtonVertAlign( + const Value: TTextLayout); +begin + fBtnVAlign := Value; + ArrangeButtons; +end; + +procedure TCustomAdvOfficeCheckGroup.SetContainer( + const Value: TPictureContainer); +begin + FContainer := Value; + ArrangeButtons; +end; + +procedure TCustomAdvOfficeCheckGroup.SetImages(const Value: TImageList); +begin + inherited Images := Value; + FImages := Value; + ArrangeButtons; +end; + +procedure TCustomAdvOfficeCheckGroup.Notification(AComponent: TComponent; + AOperation: TOperation); +begin + inherited; + + if (AOperation = opRemove) and (AComponent = FImages) then + FImages:=nil; + + if (AOperation = opRemove) and (AComponent = FContainer) then + FContainer := nil; +end; + +procedure TCustomAdvOfficeCheckGroup.SetEllipsis(const Value: Boolean); +begin + FEllipsis := Value; + ArrangeButtons; +end; + +procedure TCustomAdvOfficeCheckGroup.SetShadowColor(const Value: TColor); +begin + FShadowColor := Value; + ArrangeButtons; +end; + +procedure TCustomAdvOfficeCheckGroup.SetShadowOffset(const Value: Integer); +begin + FShadowOffset := Value; + ArrangeButtons; +end; + + +function TCustomAdvOfficeCheckGroup.GetChecked(Index: Integer): Boolean; +begin + if (Index < FButtons.Count) and (Index >= 0) then + Result := TGroupCheck(FButtons[Index]).Checked + else + raise Exception.Create('Invalid checkbox index'); +end; + +procedure TCustomAdvOfficeCheckGroup.SetChecked(Index: Integer; + const Value: Boolean); +begin + if (Index < FButtons.Count) and (Index >= 0) then + TGroupCheck(FButtons[Index]).Checked := Value; +end; + +function TCustomAdvOfficeCheckGroup.GetReadOnly(Index: Integer): Boolean; +begin + if (Index < FButtons.Count) and (Index >= 0) then + Result := not TGroupCheck(FButtons[Index]).Enabled + else + raise Exception.Create('Invalid checkbox index'); +end; + +procedure TCustomAdvOfficeCheckGroup.SetReadOnly(Index: Integer; + const Value: Boolean); +begin + if (Index < FButtons.Count) and (Index >= 0) then + TGroupCheck(FButtons[Index]).Enabled := not Value; +end; + +procedure TCustomAdvOfficeCheckGroup.UpdateValue; +var + i, j: Integer; + BitMask: DWord; +begin + FValue := Value; + j := Min(FButtons.Count, sizeof(DWord) * 8); + BitMask := 1; + FValue := 0; + for i := 0 to j - 1 do + begin + if TGroupCheck(FButtons[i]).Checked then + begin + FValue := FValue or BitMask; + end; + BitMask := BitMask * 2; + end; +end; + +function TCustomAdvOfficeCheckGroup.GetValue: DWord; +begin + Result := FValue; +end; + +procedure TCustomAdvOfficeCheckGroup.SetValue(const Value: DWord); +var + i, j: Integer; + BitMask: Integer; +begin + //if (FValue <> Value) then + begin + FValue := Value; + j := Min(FButtons.Count, sizeof(DWord) * 8); + BitMask := 1; + for i := 0 to j - 1 do + begin + TGroupCheck(FButtons[i]).Checked := ((FValue And BitMask) > 0); + BitMask := BitMask * 2; + end; + end; +end; + +function TCustomAdvOfficeCheckGroup.GetVersion: string; +var + vn: Integer; +begin + vn := GetVersionNr; + Result := IntToStr(Hi(Hiword(vn)))+'.'+IntToStr(Lo(Hiword(vn)))+'.'+IntToStr(Hi(Loword(vn)))+'.'+IntToStr(Lo(Loword(vn))); +end; + +function TCustomAdvOfficeCheckGroup.GetVersionNr: Integer; +begin + Result := MakeLong(MakeWord(BLD_VER,REL_VER),MakeWord(MIN_VER,MAJ_VER)); +end; + +procedure TCustomAdvOfficeCheckGroup.SetVersion(const Value: string); +begin + +end; + +{$IFDEF FREEWARE} +{$I TRIAL.INC} +{$ENDIF} + + +end. diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Source/AdvOfficeButtons.res b/TAdvTaskDialog/internal/1.5.0.2/1/Source/AdvOfficeButtons.res new file mode 100644 index 0000000000000000000000000000000000000000..8f0cdb99a288f7700046cd885002388a4e1d306a GIT binary patch literal 6784 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 0) then + begin + Result := GetProcAddress(hKernel32, 'GetLocaleInfoEx') <> nil; + end + else + Result := false; +end; + +//------------------------------------------------------------------------------ + +procedure VistaShellOpen(HWND: THandle; Command, Param: string); +begin + if IsVista then + RunElevated(HWND, Command, Param, '') + else + ShellExecute(HWND, 'open', pchar(Param), nil, nil, SW_NORMAL); +end; + +//------------------------------------------------------------------------------ + +function GetFileVersion(const AFileName: string): Cardinal; +var + FileName: string; + InfoSize, Wnd: DWORD; + VerBuf: Pointer; + FI: PVSFixedFileInfo; + VerSize: DWORD; +begin + Result := Cardinal(-1); + // GetFileVersionInfo modifies the filename parameter data while parsing. + // Copy the string const into a local variable to create a writeable copy. + FileName := AFileName; + UniqueString(FileName); + InfoSize := GetFileVersionInfoSize(PChar(FileName), Wnd); + if InfoSize <> 0 then + begin + GetMem(VerBuf, InfoSize); + try + if GetFileVersionInfo(PChar(FileName), Wnd, InfoSize, VerBuf) then + if VerQueryValue(VerBuf, '\', Pointer(FI), VerSize) then + Result:= FI.dwFileVersionMS; + finally + FreeMem(VerBuf); + end; + end; +end; + + +function TaskDialogCallbackProc(hWnd: THandle; msg, wParam, lparam: integer; refData: pointer): integer; stdcall; +var + td: TAdvTaskDialog; + SPos: integer; + State: TTaskDialogProgressState; + Res: integer; + CanClose: boolean; + Anchor: string; + +begin + td := nil; + if Assigned(refdata) then + td := TAdvTaskDialog(refdata); + + Res := 0; + + if Assigned(td) then + td.hWnd := hWnd; + + case msg of + TDN_CREATED: + begin + if Assigned(td) and Assigned(td.OnDialogCreated) then + begin + td.OnDialogCreated(td); + + if (doProgressBar in td.Options) then + begin + SendMessage(hWnd, TDM_SET_PROGRESS_BAR_RANGE, 0, MakeLParam(td.ProgressBarMin,td.ProgressBarMax)); + end; + end; + end; + TDN_BUTTON_CLICKED: + begin + if Assigned(td) and Assigned(td.OnDialogButtonClick) then + begin + td.OnDialogButtonClick(td, wParam); + end; + + if Assigned(td) and Assigned(td.OnDialogClose) then + begin + CanClose := true; + td.OnDialogClose(td, CanClose); + if not CanClose then + Res := 1; + end; + end; + TDN_RADIO_BUTTON_CLICKED: + begin + if Assigned(td) and Assigned(td.OnDialogRadioClick) then + begin + td.OnDialogRadioClick(td, wParam); + end; + end; + TDN_HYPERLINK_CLICKED: + begin + if Assigned(td) then + begin + Anchor := WideCharToString(PWideChar(lparam)); + + if not Assigned(td.OnDialogHyperlinkClick) then + begin + if (Pos('://', Anchor) > 0) then + VistaShellOpen(0, 'iexplore.exe', Anchor); + end; + + if Assigned(td.OnDialogHyperlinkClick) then + begin + td.OnDialogHyperlinkClick(td, Anchor); + end; + end; + end; + TDN_VERIFICATION_CLICKED: + begin + if Assigned(td) and Assigned(td.OnDialogVerifyClick) then + begin + td.OnDialogVerifyClick(td, bool(wparam)); + end; + end; + TDN_TIMER: + begin + if Assigned(td) and Assigned(td.OnDialogTimer) then + begin + td.OnDialogTimer(td); + end; + + if Assigned(td) and Assigned(td.OnDialogProgress) then + begin + td.OnDialogProgress(td, SPos, State); + SendMessage(hWnd,TDM_SET_PROGRESS_BAR_POS,SPos,0); + case State of + psNormal: SendMessage(hWnd,TDM_SET_PROGRESS_BAR_STATE, PBST_NORMAL, 0); + psError: SendMessage(hWnd,TDM_SET_PROGRESS_BAR_STATE, PBST_ERROR, 0); + psPaused: SendMessage(hWnd,TDM_SET_PROGRESS_BAR_STATE, PBST_PAUSED, 0); + end; + end; + end; + end; + + Result := Res; +end; + +//------------------------------------------------------------------------------ + +function RemoveSpaces(S: String): String; +var + i: Integer; +begin + Result := S; + for i := 1 to Length(s) do + begin + if (s[i] = ' ') then + Result := copy(S, 2, Length(S)-1) + else + Break; + end; + + for i := Length(s) downto 1 do + begin + if (s[i] = ' ') then + Result := copy(S, 1, Length(S)-1) + else + Break; + end; +end; + +//------------------------------------------------------------------------------ + +procedure SplitInToLines(Text: string; sl: TStrings); +var + i, j: Integer; + s, rs: string; +begin + if (Text <> '') and Assigned(sl) then + begin + rs := #13; + if (Pos('\n', Text) > 0) or (pos(rs, Text) > 0) then + begin + Text := RemoveSpaces(Text); + while (Length(Text) > 0) do + begin + i := Pos('\n', Text); + j := 2; + if (i <= 0) then + begin + i := pos(rs, Text); + j := 2; + end; + + if (i <= 0) then + begin + i := Length(Text)+1; + j := 0; + end; + s := copy(Text, 1, i-1); + Delete(Text, 1, i-1+j); + s := RemoveSpaces(s); + sl.Add(s); + Text := RemoveSpaces(Text); + end; + end + else + sl.Add(Text); + end; +end; + +//------------------------------------------------------------------------------ + +procedure GetMultiLineTextSize(Canvas: TCanvas; Text: string; HeadingFont, ParaFont: TFont; DrawTextBiDiModeFlagsReadingOnly: Longint; var W, H: Integer; WithSpace: Boolean = True); +var + R: TRect; + i, tw, th: Integer; + s: string; + OldFont: TFont; + SL: TStringList; +begin + if Assigned(Canvas) then + begin + OldFont := TFont.Create; + OldFont.Assign(Canvas.Font); + if (Pos('\n', Text) > 0) or (pos(#13, Text) > 0) then + begin + tw := 0; + th := 0; + + SL := TStringList.Create; + SplitInToLines(Text, SL); + s := RemoveSpaces(SL[0]); + + if (s <> '') then + begin + Canvas.Font.Assign(HeadingFont); + SetRect(R, 0, 0, 0, 0); + Windows.DrawText( Canvas.handle, PChar(s), -1, R, + DT_CALCRECT or DT_LEFT or DT_SINGLELINE or DrawTextBiDiModeFlagsReadingOnly); + tw := R.Right; + th := R.Bottom; + if WithSpace then + begin + tw := tw + 8; + th := th + 10; + end; + end; + + Canvas.Font.Assign(ParaFont); + for i:= 1 to SL.Count-1 do + begin + s := SL[i]; + if (s <> '') then + begin + SetRect(R, 0, 0, 0, 0); + Windows.DrawText( Canvas.handle, PChar(s), -1, R, + DT_CALCRECT or DT_LEFT or DT_SINGLELINE or DrawTextBiDiModeFlagsReadingOnly); + if WithSpace then + begin + tw := Max(tw, R.Right + 8); + th := th + R.Bottom + 2; + end + else + begin + tw := Max(tw, R.Right); + th := th + R.Bottom; + end; + end; + end; + + W := tw; + H := th; + SL.Free; + end + else + begin + Canvas.Font.Assign(HeadingFont); + SetRect(R, 0, 0, 0, 0); + Windows.DrawText( Canvas.handle, PChar(Text), -1, R, + DT_CALCRECT or DT_LEFT or DT_SINGLELINE or DrawTextBiDiModeFlagsReadingOnly); + W := R.Right; + H := R.Bottom; + end; + + Canvas.Font.Assign(OldFont); + OldFont.Free; + end; +end; + +//------------------------------------------------------------------------------ + +{ TAdvTaskDialog } + +procedure TCustomAdvTaskDialog.Clear; +begin + CommonButtons := []; + RadioButtons.Clear; + CustomButtons.Clear; + Icon := tiBlank; + FooterIcon := tfiBlank; + Instruction := ''; + Title := ''; + Content := ''; + Footer := ''; + VerificationText := ''; + ExpandControlText := ''; + CollapsControlText := ''; + ExpandedText := ''; + DefaultRadioButton := 200; + DefaultButton := 0; + Options := []; + VerifyResult := false; +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.ClickButton(ButtonID: integer); +begin + SendMessage(hWnd, TDM_CLICK_BUTTON, ButtonID, 0); + if Assigned(FDialogForm) then + FDialogForm.ClickButton(ButtonID); +end; + +//------------------------------------------------------------------------------ + +constructor TCustomAdvTaskDialog.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FCustomButtons := TStringList.Create; + FRadioButtons := TStringList.Create; + FProgressBarMin := 0; + FProgressBarMax := 100; + FDialogForm := nil; + FApplicationIsParent := true; + FModalParent := 0; + FCustomIcon := TIcon.Create; + FDefaultRadioButton := 200; + FMinFormWidth := 350; + FNonNativeDialog := nndAuto; + FInputType := itNone; + FInputItems := TStringList.Create; +end; + +//------------------------------------------------------------------------------ + +destructor TCustomAdvTaskDialog.Destroy; +begin + FRadioButtons.Free; + FCustomButtons.Free; + FCustomIcon.Free; + FInputItems.Free; + inherited; +end; + +//------------------------------------------------------------------------------ + +function TCustomAdvTaskDialog.CreateButton(AOwner: TComponent): TWinControl; +begin + Result := TButton.Create(AOwner); +end; + +//------------------------------------------------------------------------------ + +function TCustomAdvTaskDialog.CreateRadioButton(AOwner: TComponent): TWinControl; +begin + Result := TRadioButton.Create(AOwner); +end; + +procedure TCustomAdvTaskDialog.SetRadioButtonState(Btn: TWinControl; Checked: boolean); +begin + TRadioButton(Btn).Checked := Checked; +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.InitRadioButton(AOwner: TForm; Btn: TWinControl; btnIndex: Integer; OnClickEvent : TNotifyEvent); +begin + with TRadioButton(Btn) do + begin + Name := 'Radio' + inttostr(btnIndex); + Parent := AOwner; + Font.Name := AOwner.Canvas.Font.Name; + Font.Size := 8; + BiDiMode := AOwner.BiDiMode; + OnClick := OnClickEvent; + + { + BoundsRect := TextRect; + Left := FHorzParaMargin + FHorzMargin; //ALeft + FHorzMargin; + Top := Y; + Width := Self.Width - Left - 4; + GetTextSize(Canvas, Caption, k, l); + w := Max(w, Left + k + FHorzMargin + 20); + } + end; +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.ElevateButton(ButtonID: integer; + Enabled: boolean); +begin + SendMessage(hWnd, TDM_SET_BUTTON_ELEVATION_REQUIRED_STATE, ButtonID, integer(Enabled)); +end; + +procedure TCustomAdvTaskDialog.EnableButton(ButtonID: integer; Enabled: boolean); +begin + SendMessage(hWnd, TDM_ENABLE_BUTTON, ButtonID, integer(Enabled)); + if Assigned(FDialogForm) then + FDialogForm.EnableButton(ButtonID, Enabled); +end; + +//------------------------------------------------------------------------------ + +function ConvertNL(s: string): string; +begin + if pos('\n',s) > 0 then + begin + Result := StringReplace(s,'\n',#10,[rfReplaceAll]); + end + else + Result := s; + +end; + +//------------------------------------------------------------------------------ + +function TCustomAdvTaskDialog.Execute: integer; +var + verinfo: TOSVersionInfo; + DLLHandle: THandle; + res,radiores: integer; + verify: boolean; + TaskDialogConfig : TTASKDIALOGCONFIG; + TaskDialogIndirectProc : function(AConfig: PTASKDIALOGCONFIG; Res: pinteger; ResRadio: pinteger; VerifyFLag: pboolean): integer cdecl stdcall; +{ + wTitle: TTaskDialogWideString; + wDesc: TTaskDialogWideString; + wContent: TTaskDialogWideString; + wExpanded: TTaskDialogWideString; + wExpandedControl: TTaskDialogWideString; + wCollapsedControl: TTaskDialogWideString; + wFooter: TTaskDialogWideString; + wVerifyText: TTaskDialogWideString; +} + TBA: TTaskDialogButtonArray; + TBWS: TTaskDialogWideStringArray; + i: integer; + + TRA: TTaskDialogButtonArray; + TRWS: TTaskDialogWideStringArray; + ComCtlVersion: integer; + + +begin + Result := -1; + + VerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); + GetVersionEx(verinfo); + + ComCtlVersion := GetFileVersion('COMCTL32.DLL'); + ComCtlVersion := (ComCtlVersion shr 16) and $FF; + + if (verinfo.dwMajorVersion >= 6) and (ComCtlVersion > 5) and (FNonNativeDialog = nndAuto) then + begin + // check COMCTL version ... + + DLLHandle := LoadLibrary('comctl32.dll'); + if DLLHandle >= 32 then + begin + @TaskDialogIndirectProc := GetProcAddress(DLLHandle,'TaskDialogIndirect'); + + if Assigned(TaskDialogIndirectProc) then + begin + FillChar(TaskDialogConfig, sizeof(TTASKDIALOGCONFIG),0); + TaskDialogConfig.cbSize := sizeof(TTASKDIALOGCONFIG); + + if ModalParent <> 0 then + begin + TaskDialogConfig.hwndParent := ModalParent + end + else + begin + if Assigned(Self.Owner) and not ApplicationIsParent then + TaskDialogConfig.hwndParent := (Self.Owner as TWinControl).Handle + else + TaskDialogConfig.hwndParent := Application.Handle; + end; + + if FCustomButtons.Count > 0 then + begin + SetLength(TBA, FCustomButtons.Count); + SetLength(TBWS, FCustomButtons.Count); + + for i := 0 to FCustomButtons.Count - 1 do + begin + StringToWideChar(ConvertNL(FCustomButtons.Strings[i]), TBWS[i], sizeof(TBWS[i])); + TBA[i].pszButtonText := TBWS[i]; + TBA[i].nButtonID := i + 100; + end; + + TaskDialogConfig.cButtons := FCustomButtons.Count; + TaskDialogConfig.pbuttons := @TBA[0]; + end; + + if FRadioButtons.Count > 0 then + begin + SetLength(TRA, FRadioButtons.Count); + SetLength(TRWS, FRadioButtons.Count); + + for i := 0 to FRadioButtons.Count - 1 do + begin + StringToWideChar(ConvertNL(FRadioButtons.Strings[i]), TRWS[i], sizeof(TRWS[i])); + TRA[i].pszButtonText := TRWS[i]; + TRA[i].nButtonID := i + 200; + end; + + TaskDialogConfig.cRadioButtons := FRadioButtons.Count; + TaskDialogConfig.pRadioButtons := @TRA[0]; + end; + + if FTitle <> '' then + begin + TaskDialogConfig.pszWindowTitle := PWideChar(WideString(ConvertNL(FTitle))); + end; + + if FInstruction <> '' then + begin + TaskDialogConfig.pszMainInstruction := PWideChar(WideString(ConvertNL(FInstruction))); + end; + + if FContent <> '' then + begin + TaskDialogConfig.pszContent := PWideChar(WideString(ConvertNL(FContent))); + end; + + if FFooter <> '' then + begin + TaskDialogConfig.pszFooter := PWideChar(WideString(ConvertNL(FFooter))); + end; + + if FExpandControlText <> '' then + begin + TaskDialogConfig.pszExpandedControlText := PWideChar(WideString(FExpandControlText)); + end; + + if FCollapsControlText <> '' then + begin + TaskDialogConfig.pszCollapsedControlText := PWideChar(WideString(FCollapsControlText)); + end; + + if FExpandedText <> '' then + begin + TaskDialogConfig.pszExpandedInformation := PWideChar(WideString(FExpandedText)) + end; + + if FVerifyText <> '' then + begin + TaskDialogConfig.pszVerificationText := PWideChar(WideString(FVerifyText)); + end; + + if cbOk in FCommonButtons then + TaskDialogConfig.dwCommonButtons := TaskDialogConfig.dwCommonButtons or TDCBF_OK_BUTTON; + + if cbYes in FCommonButtons then + TaskDialogConfig.dwCommonButtons := TaskDialogConfig.dwCommonButtons or TDCBF_YES_BUTTON; + + if cbNo in FCommonButtons then + TaskDialogConfig.dwCommonButtons := TaskDialogConfig.dwCommonButtons or TDCBF_NO_BUTTON; + + if cbCancel in FCommonButtons then + TaskDialogConfig.dwCommonButtons := TaskDialogConfig.dwCommonButtons or TDCBF_CANCEL_BUTTON; + + if cbClose in FCommonButtons then + TaskDialogConfig.dwCommonButtons := TaskDialogConfig.dwCommonButtons or TDCBF_CLOSE_BUTTON; + + if cbRetry in FCommonButtons then + TaskDialogConfig.dwCommonButtons := TaskDialogConfig.dwCommonButtons or TDCBF_RETRY_BUTTON; + + if doCommandLinks in FOptions then + TaskDialogConfig.dwFlags := TDF_USE_COMMAND_LINKS; + + if doCommandLinksNoIcon in FOptions then + TaskDialogConfig.dwFlags := TDF_USE_COMMAND_LINKS_NO_ICON; + + if doHyperlinks in FOptions then + TaskDialogConfig.dwFlags := TaskDialogConfig.dwFlags or TDF_ENABLE_HYPERLINKS; + + if doExpandedDefault in FOptions then + TaskDialogConfig.dwFlags := TaskDialogConfig.dwFlags or TDF_EXPANDED_BY_DEFAULT; + + if doExpandedFooter in FOptions then + TaskDialogConfig.dwFlags := TaskDialogConfig.dwFlags or TDF_EXPAND_FOOTER_AREA; + + if doAllowMinimize in FOptions then + TaskDialogConfig.dwFlags := TaskDialogConfig.dwFlags or TDF_CAN_BE_MINIMIZED; + + if doVerifyChecked in FOptions then + TaskDialogConfig.dwFlags := TaskDialogConfig.dwFlags or TDF_VERIFICATION_FLAG_CHECKED; + + if doProgressBar in FOptions then + TaskDialogConfig.dwFlags := TaskDialogConfig.dwFlags or TDF_SHOW_PROGRESS_BAR; + + if doProgressBarMarquee in FOptions then + TaskDialogConfig.dwFlags := TaskDialogConfig.dwFlags or TDF_SHOW_MARQUEE_PROGRESS_BAR; + + if (doProgressBarMarquee in FOptions) or + (doProgressBar in FOptions) or + (doTimer in FOptions) then + TaskDialogConfig.dwFlags := TaskDialogConfig.dwFlags or TDF_CALLBACK_TIMER; + + if (DialogPosition = dpOwnerFormCenter) then + TaskDialogConfig.dwFlags := TaskDialogConfig.dwFlags or TDF_POSITION_RELATIVE_TO_WINDOW; + + if doNoDefaultRadioButton in FOptions then + TaskDialogConfig.dwFlags := TaskDialogConfig.dwFlags or TDF_NO_DEFAULT_RADIO_BUTTON; + + if doAllowDialogCancel in FOptions then + TaskDialogConfig.dwFlags := TaskDialogConfig.dwFlags or TDF_ALLOW_DIALOG_CANCELLATION; + + TaskDialogConfig.hInstance := 0; + + if not CustomIcon.Empty then + begin + TaskDialogConfig.hMainIcon := CustomIcon.Handle; + TaskDialogConfig.dwFlags := TaskDialogConfig.dwFlags or TDF_USE_HICON_MAIN; + end + else + begin + case Icon of + tiWarning: TaskDialogConfig.hMainIcon := TD_ICON_WARNING; + tiQuestion: TaskDialogConfig.hMainIcon := TD_ICON_QUESTION; + tiError: TaskDialogConfig.hMainIcon := TD_ICON_ERROR; + tiShield: TaskDialogConfig.hMainIcon := TD_ICON_SHIELD; + tiBlank: TaskDialogConfig.hMainIcon := TD_ICON_BLANK; + tiInformation: TaskDialogConfig.hMainIcon := TD_ICON_INFORMATION; + end; + end; + + case FooterIcon of + tfiWarning: TaskDialogConfig.hFooterIcon := TD_ICON_WARNING; + tfiQuestion: TaskDialogConfig.hFooterIcon := TD_ICON_QUESTION; + tfiError: TaskDialogConfig.hFooterIcon := TD_ICON_ERROR; + tfiInformation: TaskDialogConfig.hFooterIcon := THandle(MAKEINTRESOURCEW(Word(-3))); + tfiShield: TaskDialogConfig.hFooterIcon := THandle(MAKEINTRESOURCEW(Word(-4))); + end; + + TaskDialogConfig.pfCallBack := @TaskDialogCallbackProc; + TaskDialogConfig.pData := Self; + + TaskDialogConfig.nDefaultButton := DefaultButton; + TaskDialogConfig.nDefaultRadioButton := DefaultRadioButton; + + + TaskDialogIndirectProc(@TaskDialogConfig, @res, @radiores, @verify); + + RadioButtonResult := radiores; + VerifyResult := verify; + Result := res; + + end; + end; + end + else + Result := AdvMessageDlgPos(Self, -1, -1); +end; + +//------------------------------------------------------------------------------ + +function TCustomAdvTaskDialog.GetVersion: string; +var + vn: Integer; +begin + vn := GetVersionNr; + Result := IntToStr(Hi(Hiword(vn))) + '.' + IntToStr(Lo(Hiword(vn))) + '.' + + IntToStr(Hi(Loword(vn))) + '.' + IntToStr(Lo(Loword(vn))); +end; + +//------------------------------------------------------------------------------ + +function TCustomAdvTaskDialog.GetVersionNr: Integer; +begin + Result := MakeLong(MakeWord(BLD_VER, REL_VER), MakeWord(MIN_VER, MAJ_VER)); +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.SetContent(const Value: string); +begin + if (FContent <> Value) then + begin + FContent := Value; + SendMessage(hWnd, TDM_UPDATE_ELEMENT_TEXT, TDE_CONTENT, Integer(PWideChar(WideString(FContent)))); + if Assigned(FDialogForm) then + FDialogForm.UpdateDialog; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.SetCustomButtons(const Value: TStringList); +begin + FCustomButtons.Assign(Value); +end; + +procedure TCustomAdvTaskDialog.SetCustomIcon(const Value: TIcon); +begin + FCustomIcon.Assign(Value); +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.SetExpandedText(const Value: string); +begin + if (FExpandedText <> Value) then + begin + FExpandedText := Value; + SendMessage(hWnd, TDM_UPDATE_ELEMENT_TEXT, TDE_EXPANDED_INFORMATION, Integer(PWideChar(WideString(FExpandedText)))); + if Assigned(FDialogForm) then + FDialogForm.UpdateDialog; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.SetFooter(const Value: string); +begin + if (FFooter <> Value) then + begin + FFooter := Value; + SendMessage(hWnd, TDM_UPDATE_ELEMENT_TEXT, TDE_FOOTER, Integer(PWideChar(WideString(FFooter)))); + if Assigned(FDialogForm) then + FDialogForm.UpdateDialog; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.SetInputItems(const Value: TStrings); +begin + FInputItems.Assign(Value); +end; + +procedure TCustomAdvTaskDialog.SetInstruction(const Value: string); +begin + if (FInstruction <> Value) then + begin + FInstruction := Value; + SendMessage(hWnd, TDM_UPDATE_ELEMENT_TEXT, TDE_MAIN_INSTRUCTION, Integer(PWideChar(WideString(FInstruction)))); + if Assigned(FDialogForm) then + FDialogForm.UpdateDialog; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.SetRadioButtonCaption(Btn: TWinControl; + Value: string); +begin + TRadioButton(Btn).Caption := Value; +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.SetRadioButtons(const Value: TStringList); +begin + FRadioButtons.Assign(Value); +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.SetVersion(const Value: string); +begin + +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.SetButtonCancel(aButton: TWinControl; Value: Boolean); +begin + if not Assigned(aButton) or not (aButton is TButton) then + Exit; + + TButton(aButton).Cancel := Value; +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.SetButtonDefault(aButton: TWinControl; Value: Boolean); +begin + if not Assigned(aButton) or not (aButton is TButton) then + Exit; + + TButton(aButton).Default := Value; +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.SetButtonModalResult(aButton: TWinControl; Value: Integer); +begin + if not Assigned(aButton) or not (aButton is TButton) then + Exit; + + TButton(aButton).ModalResult := Value; +end; + +//------------------------------------------------------------------------------ + +function TCustomAdvTaskDialog.GetButtonModalResult( + aButton: TWinControl): Integer; +begin + Result := mrNone; + if not Assigned(aButton) or not (aButton is TButton) then + Exit; + + Result := TButton(aButton).ModalResult; +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.SetButtonCaption(aButton: TWinControl; + Value: TCaption); +begin + if not Assigned(aButton) or not (aButton is TButton) then + Exit; + + TButton(aButton).Caption := Value; +end; + +//------------------------------------------------------------------------------ + +{ TTaskDialogButton } + +constructor TTaskDialogButton.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FGlyph := TBitmap.Create; + FGlyph.OnChange := OnPictureChanged; + + FGlyphHot := TBitmap.Create; + + FGlyphDown := TBitmap.Create; + + FGlyphDisabled := TBitmap.Create; + FGlyphDisabled.OnChange := OnPictureChanged; + + FHeadingFont := TFont.Create; + + SetBounds(0, 0, 23, 22); + ShowHint := False; + FBorderColorDown := clNone; + FBorderColorHot := clNone; + FBorderColor := clNone; +end; + +//------------------------------------------------------------------------------ + +destructor TTaskDialogButton.Destroy; +begin + FGlyph.Free; + FGlyphHot.Free; + FGlyphDown.Free; + FGlyphDisabled.Free; + FHeadingFont.Free; + inherited; +end; + +procedure TTaskDialogButton.DoEnter; +begin + inherited; + Invalidate; +end; + +procedure TTaskDialogButton.DoExit; +begin + inherited; + Invalidate; +end; + +procedure TTaskDialogButton.KeyPress(var Key: char); +begin + inherited; + if (Key = #32) or (Key = #13) then + begin + Click; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TTaskDialogButton.Paint; +var + Pic: TBitmap; + x, y, bw, bh, i: Integer; + R, TR: TRect; + BrClr: TColor; + SL: TStringList; +begin + inherited; + + R := ClientRect; + + BrClr := clNone; + + if FMouseDown then + BrClr := BorderColorDown + else if FMouseInControl then + BrClr := BorderColorHot; + + if not Enabled then + BrClr := clNone; + + if GetFocus = Handle then + BrClr := BorderColorDown; + + Pic := Picture; + if FMouseDown and not FGlyphDown.Empty then + Pic := FGlyphDown + else if FMouseInControl and not FGlyphHot.Empty then + Pic := FGlyphHot; + + if not Enabled and not PictureDisabled.Empty then + Pic := PictureDisabled; + + if Assigned(Pic) and not Pic.Empty then + begin + Pic.Transparent := True; + if (Caption = '') then + begin + x := (Width - Pic.Width) div 2; + y := (Height - Pic.Height) div 2; + end + else + begin + x := 4; + y := (Height - Pic.Height) div 2; + end; + + Canvas.Draw(x, y, Pic); + R.Left := x + Pic.Width + 3; + end + else + R.Left := R.Left + 2; + + if (Caption <> '') then + begin + if (Pos('\n', Caption) > 0) or (pos(#13, Caption) > 0) then + begin + TR := R; + SL := TStringList.Create; + SplitInToLines(Caption, SL); + GetMultiLineTextSize(Canvas, Caption, HeadingFont, Self.Font, DrawTextBiDiModeFlagsReadingOnly, bw, bh); + TR.Top := 2 + (Height - bh) div 2; + + Canvas.Brush.Style := bsClear; + if (SL[0] <> '') then + begin + Canvas.Font.Assign(HeadingFont); + + if not Enabled then + Canvas.Font.Color := clSilver; + + DrawText(Canvas.Handle, PChar(SL[0]),Length(SL[0]), TR, DT_LEFT or DT_TOP or DT_SINGLELINE); + TR.Top := TR.Top + Canvas.TextHeight('gh') + 4; + end; + + Canvas.Font.Assign(Self.Font); + + if not Enabled then + Canvas.Font.Color := clSilver; + + for i:= 1 to SL.Count - 1 do + begin + DrawText(Canvas.Handle, PChar(SL[i]),Length(SL[i]), TR, DT_LEFT or DT_TOP or DT_SINGLELINE); + TR.Top := TR.Top + Canvas.TextHeight('gh') + 2; + end; + SL.Free; + end + else + begin + Canvas.Brush.Style := bsClear; + Canvas.Font.Assign(HeadingFont); + if not Enabled then + Canvas.Font.Color := clSilver; + DrawText(Canvas.Handle,PChar(Caption),Length(Caption), R, DT_LEFT or DT_VCENTER or DT_SINGLELINE); + end; + end; + + if (BrClr <> clNone) then + begin + R := ClientRect; + Canvas.Pen.Color := BrClr; + Canvas.Brush.Style := bsClear; + Canvas.RoundRect(R.Left, R.Top, R.Right, R.Bottom, 2, 2); + end; +end; + +//------------------------------------------------------------------------------ + +procedure TTaskDialogButton.MouseDown(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + inherited; + + if (ssLeft in Shift) then + begin + FMouseDown := True; + Invalidate; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TTaskDialogButton.MouseMove(Shift: TShiftState; X, Y: Integer); +begin + inherited; + +end; + +//------------------------------------------------------------------------------ + +procedure TTaskDialogButton.MouseUp(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + inherited; + + FMouseDown := False; + Invalidate; +end; + +//------------------------------------------------------------------------------ + +procedure TTaskDialogButton.SetGlyph(const Value: TBitmap); +begin + FGlyph.Assign(Value); + Invalidate; +end; + +//------------------------------------------------------------------------------ + +procedure TTaskDialogButton.SetGlyphDown(const Value: TBitmap); +begin + FGlyphDown.Assign(Value); +end; + +//------------------------------------------------------------------------------ + +procedure TTaskDialogButton.SetGlyphHot(const Value: TBitmap); +begin + FGlyphHot.Assign(Value); +end; + +//------------------------------------------------------------------------------ + +procedure TTaskDialogButton.SetGlyphDisabled(const Value: TBitmap); +begin + FGlyphDisabled.Assign(Value); + Invalidate; +end; + +//------------------------------------------------------------------------------ + +procedure TTaskDialogButton.OnPictureChanged(Sender: TObject); +begin + Invalidate; +end; + +//------------------------------------------------------------------------------ + +procedure TTaskDialogButton.CMMouseEnter(var Message: TMessage); +begin + inherited; + FMouseInControl := True; + + if AutoFocus then + SetFocus; + + Invalidate; + if Assigned(FOnMouseEnter) then + FOnMouseEnter(Self); +end; + +//------------------------------------------------------------------------------ + +procedure TTaskDialogButton.CMMouseLeave(var Message: TMessage); +begin + inherited; + FMouseInControl := False; + Invalidate; + + if Assigned(FOnMouseLeave) then + FOnMouseLeave(Self); +end; + +//------------------------------------------------------------------------------ + +procedure TTaskDialogButton.SetHeadingFont(const Value: TFont); +begin + FHeadingFont.Assign(Value); +end; + +//------------------------------------------------------------------------------ + +function GetAveCharSize(Canvas: TCanvas): TPoint; +var + I: Integer; + Buffer: array[0..51] of Char; +begin + for I := 0 to 25 do Buffer[I] := Chr(I + Ord('A')); + for I := 0 to 25 do Buffer[I + 26] := Chr(I + Ord('a')); + GetTextExtentPoint(Canvas.Handle, Buffer, 52, TSize(Result)); + Result.X := Result.X div 52; +end; + +//------------------------------------------------------------------------------ + +var + ButtonWidths : array[TCommonButton] of integer; // initialized to zero + ButtonCaptions: array[TCommonButton] of Pointer; // = ( + // @SMsgDlgOK, @SMsgDlgYes, @SMsgDlgNo, @SMsgDlgCancel, @SMsgDlgRetry, @SMsgDlgAbort); + // ButtonNames: array[TCommonButton] of string = ('OK', 'Yes', 'No', 'Cancel', 'Retry', 'Abort'); + //tiBlank, tiWarning, tiQuestion, tiError, tiInformation,tiNotUsed,tiShield + IconIDs: array[TTaskDialogIcon] of PChar = (IDI_ASTERISK, IDI_EXCLAMATION, IDI_QUESTION, IDI_ERROR, IDI_INFORMATION, nil, IDI_HAND); + FooterIconIDs: array[TTaskDialogFooterIcon] of PChar = (nil, IDI_EXCLAMATION, IDI_QUESTION, IDI_HAND, IDI_INFORMATION, IDI_WINLOGO); + Captions: array[TTaskDialogIcon] of Pointer; + // = (nil, @SMsgDlgWarning, @SMsgDlgConfirm, @SMsgDlgError, @SMsgDlgInformation); + ModalResults: array[TCommonButton] of Integer = (mrOk, mrYes, mrNo, mrCancel, mrRetry, mrAbort); + //(tiBlank, tiWarning, tiQuestion, tiError, tiShield); + //(mtWarning, mtError, mtInformation, mtConfirmation, mtCustom); + +function CreateAdvMessageDlg(TaskDialog: TCustomAdvTaskDialog): TForm; +begin + Result := nil; + if not Assigned(TaskDialog) then + Exit; + + if TaskDialog.ApplicationIsParent then + Result := TAdvMessageForm.CreateNew(Application,0) + else + Result := TAdvMessageForm.CreateNew((TaskDialog.Owner) as TCustomForm,0); + + with Result do + begin + BiDiMode := Application.BiDiMode; + + if doAllowMinimize in TaskDialog.Options then + begin + BorderStyle := bsSingle; + BorderIcons := [biSystemMenu,biMinimize] + end + else + begin + BorderStyle := bsDialog; + BorderIcons := []; + end; + // FormStyle := fsStayOnTop; + Canvas.Font := Font; + KeyPreview := True; + OnKeyDown := TAdvMessageForm(Result).CustomKeyDown; + end; + TAdvMessageForm(Result).MinFormWidth := TaskDialog.NonNativeMinFormWidth; + TAdvMessageForm(Result).BuildTaskDialog(TaskDialog); +end; + +//------------------------------------------------------------------------------ + +function AdvMessageDlgPos(TaskDialog: TCustomAdvTaskDialog; X, Y: Integer): Integer; +var + DlgForm: TAdvMessageForm; +begin + Result := -1; + if not Assigned(TaskDialog) then + Exit; + + DlgForm := TAdvMessageForm(CreateAdvMessageDlg(TaskDialog)); + + TaskDialog.FDialogForm := DlgForm; + if Assigned(TaskDialog.OnDialogCreated) then + TaskDialog.OnDialogCreated(TaskDialog); + + with DlgForm do + try + Color := clWhite; + //HelpContext := HelpCtx; + //HelpFile := HelpFileName; + if X >= 0 then Left := X; + if Y >= 0 then Top := Y; + {$IFDEF DELPHI5_LVL} + if TaskDialog.DialogPosition = dpOwnerFormCenter then + begin + DefaultMonitor := dmMainForm; + if (Y < 0) and (X < 0) then Position := poOwnerFormCenter; + end + else + begin + if (Y < 0) and (X < 0) then Position := poScreenCenter; + end; + {$ELSE} + {$ENDIF} + Result := ShowModal; + {$IFDEF DELPHI5_LVL} + Close; + {$ENDIF} + finally + TaskDialog.FDialogForm := nil; + Free; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.GetTextSize(Canvas: TCanvas; Text: string;var W, H: Integer); +var + R: TRect; +begin + if (Text = '') then + begin + W := 0; + H := 0; + Exit; + end; + + if Assigned(Canvas) then + begin + if W = 0 then + SetRect(R, 0, 0, 1000, 100) + else + SetRect(R, 0, 0, W, 100); + + DrawText(Canvas.Handle, PChar(Text), Length(Text)+1, R, + DT_EXPANDTABS or DT_CALCRECT or DT_WORDBREAK or DT_NOPREFIX or + DrawTextBiDiModeFlagsReadingOnly); + + W := R.Right; + H := R.Bottom; + end; +end; + +//------------------------------------------------------------------------------ + +const + mcHorzMargin = 8; + mcVertMargin = 8; + mcHorzSpacing = 10; + mcVertSpacing = 10; + mcButtonWidth = 50; + mcButtonHeight = 14; + mcButtonSpacing = 4; + +function GetExeName: string; +var + s: string; + fe: string; +begin + s := ExtractFileName(Application.EXEName); + fe := ExtractFileExt(s); + if (Length(fe) > 0) then + delete(s, length(s) - Length(fe) + 1, length(fe)); + Result := s; +end; + +procedure TAdvMessageForm.BuildTaskDialog(TaskDialog: TCustomAdvTaskDialog); +var + DialogUnits: TPoint; + ButtonWidth, ButtonHeight, ButtonSpacing, ButtonCount, ButtonGroupWidth, + IconTextWidth, IconTextHeight, X, Y, ALeft: Integer; + B, DefaultButton, CancelButton: TCommonButton; + IconID: PChar; + TextRect, FR: TRect; + Msg: string; + DlgType: TTaskDialogIcon; + Buttons: TCommonButtons; + i, bw, bh, h, w, j, FooterIconTextWidth, FooterIconTextHeight: Integer; + CmBtnGroupWidth, CsBtnGroupWidth: Integer; + r, re: trect; + anchor, stripped: string; + HyperLinks,MouseLink, k, l, n: Integer; + Focusanchor: string; + OldFont, hf, pf: TFont; + verifTextWidth: Integer; + v: Boolean; + szContent,szExpandedText,szFooterText: string; + defIdx: integer; + +begin + if not Assigned(TaskDialog) then + Exit; + + FTaskDialog := TaskDialog; + Msg := TaskDialog.Instruction; + DlgType := TaskDialog.Icon; + Buttons := TaskDialog.CommonButtons; + + OldFont := TFont.Create; + OldFont.Assign(Canvas.Font); + + DialogUnits := GetAveCharSize(Canvas); + FHorzMargin := MulDiv(mcHorzMargin, DialogUnits.X, 4); + FVertMargin := MulDiv(mcVertMargin, DialogUnits.Y, 8); + FHorzSpacing := MulDiv(mcHorzSpacing, DialogUnits.X, 4); + FVertSpacing := MulDiv(mcVertSpacing, DialogUnits.Y, 8); + + w := 0; + + if TaskDialog.Title <> '' then + Caption := TaskDialog.Title + else + Caption := GetExeName; + + if (Caption <> '') then + begin + w := 1000; + GetTextSize(Canvas, Caption, w, l); + w := w + 50; + end; + + ButtonWidth := MulDiv(mcButtonWidth, DialogUnits.X, 4); + ButtonHeight := MulDiv(mcButtonHeight, DialogUnits.Y, 8); + ButtonSpacing := MulDiv(mcButtonSpacing, DialogUnits.X, 4); + CmBtnGroupWidth := 0; + CsBtnGroupWidth := 0; + ButtonCount := 0; + FHorzParaMargin := FHorzMargin; + Y := FVertMargin; + FcmBtnList.Clear; + + if TaskDialog.DefaultButton <> -1 then + begin + + if TaskDialog.DefaultButton = 0 then + begin + if (cbOk in Buttons) then DefaultButton := cbOk else + if cbYes in Buttons then DefaultButton := cbYes else + DefaultButton := cbRetry; + if cbCancel in Buttons then CancelButton := cbCancel else + if cbNo in Buttons then CancelButton := cbNo else + CancelButton := cbOk; + end + else + begin + case TaskDialog.DefaultButton of + 1: if (cbOk in Buttons) then DefaultButton := cbOK + else + DefaultButton := cbYes; + 2: if (cbCancel in Buttons) then DefaultButton := cbCancel + else + DefaultButton := cbNo; + 6: if (cbYes in Buttons) then DefaultButton := cbYes; + 7: if (cbNo in Buttons) then DefaultButton := cbNo; + end; + end; + end; + + + for B := Low(TCommonButton) to High(TCommonButton) do + begin + if B in Buttons then + begin + if ButtonWidths[B] = 0 then + begin + TextRect := Rect(0,0,0,0); + Windows.DrawText( Canvas.Handle, + PChar(LoadResString(ButtonCaptions[B])), -1, + TextRect, DT_CALCRECT or DT_LEFT or DT_SINGLELINE or + DrawTextBiDiModeFlagsReadingOnly); + with TextRect do + ButtonWidths[B] := Right - Left + 16; + end; + + if ButtonWidths[B] > ButtonWidth then + ButtonWidth := ButtonWidths[B]; + + i := FcmBtnList.Add(TaskDialog.CreateButton(Self)); + + with TWinControl(FcmBtnList.Items[i]) do + begin + Name := ButtonNames[B]; + Parent := Self; + TaskDialog.SetButtonCaption(TWinControl(FcmBtnList.Items[i]), LoadResString(ButtonCaptions[B])); + TaskDialog.SetButtonModalResult(TWinControl(FcmBtnList.Items[i]), ModalResults[B]); + //ModalResult := ModalResults[B]; + + if (TaskDialog.GetButtonModalResult(TWinControl(FcmBtnList.Items[i])) = mrCancel) and + (doAllowDialogCancel in TaskDialog.Options) then + TaskDialog.SetButtonCancel(TWinControl(FcmBtnList.Items[i]), True); + //Cancel := true; + + if (TaskDialog.DefaultButton <> -1) then + begin + if (B = DefaultButton) then + begin + //Default := True; + TaskDialog.SetButtonDefault(TWinControl(FcmBtnList.Items[i]), True); + TabOrder := 0; + end; + end; + + if (B = CancelButton) and (doAllowDialogCancel in TaskDialog.Options) then + TaskDialog.SetButtonCancel(TWinControl(FcmBtnList.Items[i]), True); + + Width := Max(60, ButtonWidths[B]); + Height := ButtonHeight; + cmBtnGroupWidth := cmBtnGroupWidth + Width + ButtonSpacing; + //if B = mbHelp then + //OnClick := TMessageForm(Result).HelpButtonClick; + if TaskDialog.DefaultButton = -1 then + TabStop := false; + end; + //Inc(ButtonCount); + end; + end; + + FcsBtnList.Clear; + if not (docommandLinks in TaskDialog.Options) then + begin + for i := 0 to TaskDialog.CustomButtons.Count - 1 do + begin + TextRect := Rect(0,0,0,0); + Windows.DrawText( Canvas.Handle, + PChar(TaskDialog.CustomButtons[i]), -1, + TextRect, DT_CALCRECT or DT_LEFT or DT_SINGLELINE or + DrawTextBiDiModeFlagsReadingOnly); + + with TextRect do bw := Right - Left + 16; + if bw > ButtonWidth then + ButtonWidth := bw; + + j := FcsBtnList.Add(TaskDialog.CreateButton(Self)); + with TWinControl(FcsBtnList.Items[j]) do + begin + Name := 'Button'+inttostr(i); + Parent := Self; + TaskDialog.SetButtonCaption(TWinControl(FcsBtnList.Items[j]), TaskDialog.CustomButtons[i]); + //ModalResult := i + 100; //mrAbort; + TaskDialog.SetButtonModalResult(TWinControl(FcsBtnList.Items[j]), i + 100); + v := (TaskDialog.GetButtonModalResult(TWinControl(FcsBtnList.Items[j])) = TaskDialog.DefaultButton); + TaskDialog.SetButtonDefault(TWinControl(FcsBtnList.Items[j]), V); + //Default := (ModalResult = TaskDialog.DefaultButton); + //if V then + // TabOrder := 0; + //if B = DefaultButton then Default := True; + //if B = CancelButton then Cancel := True; + Width := Max(60, bw); + Height := ButtonHeight; + TProControl(FcsBtnList.Items[j]).OnClick := OnButtonClick; + CsBtnGroupWidth := CsBtnGroupWidth + Width + ButtonSpacing; + if TaskDialog.DefaultButton = -1 then + TabStop := false; + end; + end; + end + else + begin + n := 0; + hf := TFont.Create; + pf := TFont.Create; + hf.Assign(Canvas.Font); + hf.Size := 11; + hf.Style := [fsBold]; + pf.Assign(Canvas.Font); + + + for i := 0 to TaskDialog.CustomButtons.Count-1 do + begin + Canvas.Font.Size := 10; + Canvas.Font.Style := []; + bw := 0; + bh := 0; + GetMultiLineTextSize(Canvas, TaskDialog.CustomButtons[i], Hf, Pf, DrawTextBiDiModeFlagsReadingOnly, bw, bh); + + {TextRect := Rect(0,0,0,0); + Windows.DrawText( Canvas.handle, + PChar(TaskDialog.CustomButtons[i]), -1, + TextRect, DT_CALCRECT or DT_LEFT or DT_SINGLELINE or + DrawTextBiDiModeFlagsReadingOnly); + with TextRect do bw := (Right - Left) + 8 + 18;} + bw := bw + 26; + if bw > ButtonWidth then + ButtonWidth := bw; + + if bw > n then + n := bw; + + if not (doCommandLinksNoIcon in TaskDialog.Options) then + w := Max(w, n + FHorzMargin*2 + FHorzSpacing + 32) + else + w := Max(w, n + FHorzMargin); + + j := FcsBtnList.Add(TTaskDialogButton.Create(Self)); + with TTaskDialogButton(FcsBtnList.Items[j]) do + begin + Name := 'Button'+inttostr(i); + Parent := Self; + Caption := TaskDialog.CustomButtons[i]; + Font.Assign(pf); + Font.Color := RGB(0, 83, 196); + HeadingFont.Assign(hf); + HeadingFont.Color := RGB(0, 83, 196);//RGB(21, 28, 85); + ModalResult := i + 100; //mrAbort; + //Default := (ModalResult = TaskDialog.DefaultButton); + BorderColorHot := RGB(108, 225, 255); + BorderColorDown := RGB(108, 225, 255); + Width := Max(60, n); + if TaskDialog.DefaultButton <> -1 then + AutoFocus := true; + + Height := Max(bh, Max(ButtonHeight, Canvas.TextHeight('gh') + 20)); + + if not (doCommandLinksNoIcon in TaskDialog.Options) then + begin + Picture.LoadFromResourceName(HInstance, 'TD_ARW'); + Picture.TransparentColor := clFuchsia; + + PictureHot.LoadFromResourceName(HInstance, 'TD_ARWHOT'); + PictureHot.TransparentColor := clFuchsia; + + PictureDown.LoadFromResourceName(HInstance, 'TD_ARWDOWN'); + PictureDown.TransparentColor := clFuchsia; + + PictureDisabled.LoadFromResourceName(HInstance, 'TD_ARWDIS'); + PictureDisabled.TransparentColor := clFuchsia; + end; + + if TaskDialog.DefaultButton = -1 then + TabStop := false + else + TabStop := true; + + OnClick := OnButtonClick; + //CsBtnGroupWidth := CsBtnGroupWidth + Width + ButtonSpacing; + end; + + end; + Canvas.Font.Assign(OldFont); + hf.Free; + pf.Free; + end; + + // if no button then OK button is added + if (FcmBtnList.Count = 0) and (FcsBtnList.Count = 0) then + begin + b := cbOK; + TextRect := Rect(0,0,0,0); + Windows.DrawText( canvas.handle, + PChar(LoadResString(ButtonCaptions[B])), -1, + TextRect, DT_CALCRECT or DT_LEFT or DT_SINGLELINE or + DrawTextBiDiModeFlagsReadingOnly); + with TextRect do ButtonWidths[B] := Right - Left + 8; + + //if ButtonWidths[B] > ButtonWidth then + //ButtonWidth := ButtonWidths[B]; + + i := FcmBtnList.Add(TaskDialog.CreateButton(Self)); + with TWinControl(FcmBtnList.Items[i]) do + begin + Name := ButtonNames[B]; + Parent := Self; + TaskDialog.SetButtonCaption(TWinControl(FcmBtnList.Items[i]), LoadResString(ButtonCaptions[B])); + TaskDialog.SetButtonModalResult(TWinControl(FcmBtnList.Items[i]), ModalResults[B]); + //ModalResult := ModalResults[B]; + //Default := True; + TaskDialog.SetButtonDefault(TWinControl(FcmBtnList.Items[i]), True); + //Cancel := True; // handle ESC + + if doAllowDialogCancel in TaskDialog.Options then + TaskDialog.SetButtonCancel(TWinControl(FcmBtnList.Items[i]), True); + + Width := Max(60, ButtonWidths[B]); + Height := ButtonHeight; + cmBtnGroupWidth := cmBtnGroupWidth + Width + ButtonSpacing; + //if B = mbHelp then + //OnClick := TMessageForm(Result).HelpButtonClick; + end; + end; + + // Instruction + Canvas.Font.Size := 11; + Canvas.Font.Style := [fsBold]; + + SetRect(TextRect, 0, 0, Screen.Width div 2, 0); + DrawText(Canvas.Handle, PChar(Msg), Length(Msg) + 1, TextRect, + DT_EXPANDTABS or DT_CALCRECT or DT_WORDBREAK or + DrawTextBiDiModeFlagsReadingOnly); + + Canvas.Font.Assign(OldFont); + + IconID := IconIDs[DlgType]; + + IconTextWidth := TextRect.Right; + IconTextHeight := TextRect.Bottom; + if IconID <> nil then + begin + Inc(IconTextWidth, 32 + FHorzSpacing); + if IconTextHeight < 32 then IconTextHeight := 32; + end; + + {if DlgType <> tiBlank then + Caption := LoadResString(Captions[DlgType]) else + Caption := Application.Title;} + + if ((IconID <> nil) or not (TaskDialog.CustomIcon.Empty)) {and not (doCommandLinksNoIcon in TaskDialog.Options)} then + begin + FIcon := TImage.Create(Self); + with FIcon do + begin + Name := 'Image'; + Parent := Self; + + if not TaskDialog.CustomIcon.Empty then + begin + Picture.Icon.Assign(TaskDialog.CustomIcon); + end + else + begin + + case TaskDialog.Icon of + tiShield: Picture.Bitmap.Handle := LoadBitmap(hInstance, 'TD_SHIELD'); + tiBlank: + begin + Picture.Bitmap.Height := 32; + Picture.Bitmap.Width := 32; + Picture.Bitmap.Canvas.Brush.Color := clWhite; + Picture.Bitmap.Canvas.Pen.Style := psClear; + Picture.Bitmap.Canvas.Rectangle(0,0,31,31); + end; + else + Picture.Icon.Handle := LoadIcon(0, IconID); + end; + end; + + SetBounds(FHorzMargin, Y, 32, 32); + end; + end; + + Message := TLabel.Create(Self); + with Message do + begin + Name := 'Instr'; + Parent := Self; + {$IFDEF DELPHI7_LVL} + WordWrap := True; + {$ENDIF} + Caption := Msg; + Font.Size := 11; + Font.Color := RGB(0, 83, 196); + Font.Style := [fsBold]; + BoundsRect := TextRect; + BiDiMode := Self.BiDiMode; + ShowAccelChar := false; + ALeft := IconTextWidth - TextRect.Right + FHorzMargin; + if UseRightToLeftAlignment then + ALeft := Self.ClientWidth - ALeft - Width; + SetBounds(ALeft, Y, + TextRect.Right, TextRect.Bottom); + y := Y + Height + FVertSpacing; + FHorzParaMargin := ALeft; + end; + + if (doTimer in TaskDialog.Options) then + begin + FTimer := TTimer.Create(Self); + FTimer.Interval := 100; + FTimer.OnTimer := OnTimer; + FTimer.Enabled := True; + end; + + if (doProgressBar in TaskDialog.Options) then + begin + FProgressBar := TProgressBar.Create(Self); + with FProgressBar do + begin + Name := 'ProgressBar'; + Parent := Self; + BoundsRect := Rect(FHorzMargin, Y, Width - FHorzMargin, Y + 12); + Min := TaskDialog.ProgressBarMin; + Max := TaskDialog.ProgressBarMax; + Position := 0; + end; + + if not Assigned(FTimer) then + begin + FTimer := TTimer.Create(Self); + FTimer.Interval := 100; + FTimer.OnTimer := OnTimer; + FTimer.Enabled := True; + end; + end; + + if (TaskDialog.RadioButtons.Count > 0) then + begin + if (doNodefaultRadioButton in FTaskDialog.Options) then + FTaskDialog.RadioButtonResult := 0 + else + FTaskDialog.RadioButtonResult := FTaskDialog.DefaultRadioButton; + + for i := 0 to TaskDialog.RadioButtons.Count-1 do + begin + j := FRadioList.Add(FTaskDialog.CreateRadioButton(Self)); + + TaskDialog.InitRadioButton(self, TWinControl(FRadioList.Items[j]), i, OnRadioClick); + + with TWinControl(FRadioList.Items[j]) do + begin + (* + Name := 'Radio' + inttostr(i); + Parent := Self; + Font.Name := Canvas.Font.Name; + Font.Size := 8; + {$IFDEF DELPHI7_LVL} + //WordWrap := False; + {$ENDIF} + OnClick := OnRadioClick; + BiDiMode := Self.BiDiMode; + *) + + BoundsRect := TextRect; + Left := FHorzParaMargin + FHorzMargin; //ALeft + FHorzMargin; + Top := Y; + Width := Self.Width - Left - 4; + GetTextSize(Canvas, Caption, k, l); + w := Max(w, Left + k + FHorzMargin + 20); + end; + + TaskDialog.SetRadioButtonCaption(FRadioList.Items[j],TaskDialog.RadioButtons[i]); + + if doNoDefaultRadioButton in TaskDialog.Options then + TaskDialog.SetRadioButtonState(FRadioList.Items[j], False) + else + begin + if (TaskDialog.DefaultRadioButton > 0) then + TaskDialog.SetRadioButtonState(FRadioList.Items[j], (j + 200 = TaskDialog.DefaultRadioButton)) + else + begin + TaskDialog.SetRadioButtonState(FRadioList.Items[j], (i = 0)); + end; + end; + + (* + with TRadioButton(FRadioList.Items[j]) do + begin + if doNoDefaultRadioButton in TaskDialog.Options then + Checked := False + else + begin + if (TaskDialog.DefaultRadioButton > 0) then + Checked := (j + 200 = TaskDialog.DefaultRadioButton) + else + begin + Checked := (i = 0); + end; + end; + end; + *) + end; + end; + + if (TaskDialog.ExpandedText <> '') then + begin + (*FExpandLabel := TLabel.Create(Self); + with FExpandLabel do + begin + Name := 'Expand'; + Parent := Self; + {$IFDEF DELPHI7_LVL} + WordWrap := True; + {$ENDIF} + ShowAccelChar := false; + BiDiMode := Self.BiDiMode; + FExpandLabel.Caption := TaskDialog.ExpandedText; + Left := ALeft; + Top := Y; + end; *) + + FExpTextXSize := 0; + FExpTextYSize := 0; + r := Rect(FHorzMargin, Y, 300, Y + 26); + + + if (doHyperlinks in FTaskDialog.Options) then + begin + szExpandedText := StringReplace(FTaskDialog.ExpandedText,'\n','
',[rfReplaceAll]); + szExpandedText := StringReplace(szExpandedText,#10,'
',[rfReplaceAll]); + + HTMLDrawEx(Canvas, szExpandedText, r, nil, x, y, -1, -1, 1, true, false, false, true, true, false, true, + 1.0, clBlue, clNone, clNone, clGray, anchor, stripped, focusanchor, FExpTextXSize, FExpTextYSize, hyperlinks, + mouselink, re, nil, nil, 0); + end + else + begin + szExpandedText := StringReplace(FTaskDialog.ExpandedText,'\n',#13,[rfReplaceAll]); + + FExpTextXSize := r.Right - r.Left; + //szContent := StringReplace(FTaskDialog.Content,'\n',#13,[rfReplaceAll]); + //GetTextSize(Canvas, szContent, FExpTextXSize, FExpTextYSize); + + GetTextSize(Canvas, szExpandedText, FExpTextXSize, FExpTextYSize); + end; + + FExpandButton := TTaskDialogButton.Create(Self); + with FExpandButton do + begin + Name := 'ExpandButton'; + Parent := Self; + Caption := ''; + ModalResult := mrNone; + Width := 19; + Height := 19; + OnClick := OnExpandButtonClick; + Picture.LoadFromResourceName(HInstance, 'TD_COLP'); + Picture.TransparentColor := clFuchsia; + + PictureHot.LoadFromResourceName(HInstance, 'TD_COLPHOT'); + PictureHot.TransparentColor := clFuchsia; + + PictureDown.LoadFromResourceName(HInstance, 'TD_COLPDOWN'); + PictureDown.TransparentColor := clFuchsia; + end; + end; + + verifTextWidth := 0; + if (TaskDialog.VerificationText <> '') then + begin + k := 0; + FVerificationCheck := TCheckBox.Create(Self); + with FVerificationCheck do + begin + Name := 'Verification'; + Parent := Self; + {$IFDEF DELPHI7_LVL} + WordWrap := False; + {$ENDIF} + BoundsRect := TextRect; + BiDiMode := Self.BiDiMode; + Caption := TaskDialog.VerificationText; + Left := FHorzMargin; + Top := Y; + Color := RGB(240, 240, 240); + OnClick := OnVerifyClick; + Checked := (doVerifyChecked in TaskDialog.Options); + GetTextSize(Canvas, Caption, k, l); + verifTextWidth := k + FVertSpacing *2; + w := Max(w, Left + k); + end; + end; + + FFooterXSize := 0; + FFooterYSize := 0; + if (TaskDialog.Footer <> '') then + begin + r := Rect(FHorzMargin, Y, 300, Y + 26); + + szFooterText := StringReplace(FTaskDialog.Footer,'\n','
',[rfReplaceAll]); + szFooterText := StringReplace(szFooterText,#10,'
',[rfReplaceAll]); + + HTMLDrawEx(Canvas, szFooterText, r, nil, x, y, -1, -1, 1, true, false, false, true, true, false, true, + 1.0, clBlue, clNone, clNone, clGray, anchor, stripped, focusanchor, FFooterXSize, FFooterYSize, hyperlinks, + mouselink, re, nil, nil, 0); + + IconID := FooterIconIDs[TaskDialog.FooterIcon]; + FooterIconTextWidth := TextRect.Right; + FooterIconTextHeight := TextRect.Bottom; + if IconID <> nil then + begin + Inc(FooterIconTextWidth, 24 + FHorzSpacing); + if FooterIconTextHeight < 24 then FooterIconTextHeight := 24; + end; + + if IconID <> nil then + begin + FFooterIcon := TImage.Create(Self); + FFooterIconID := IconID; + + with FFooterIcon do + begin + Name := 'FooterImage'; + Parent := Self; + Visible := False; + SetBounds(FHorzMargin, Y, 16, 16); + end; + end; + end; + + ButtonGroupWidth := CmBtnGroupWidth + CsBtnGroupWidth + verifTextWidth; + if (TaskDialog.ExpandedText <> '') and Assigned(FExpandButton) then + begin + k := 0; + l := 0; + GetTextSize(Canvas, FTaskDialog.CollapsControlText, k, l); + GetTextSize(Canvas, FTaskDialog.ExpandControlText, n, l); + k := Max(k, n); + ButtonGroupWidth := ButtonGroupWidth + FExpandButton.Width + FHorzSpacing + k + FHorzSpacing; + end; + + if TaskDialog.Content = '' then + Y := Y - 20; + + case TaskDialog.InputType of + itEdit: + begin + FInputEdit := TEdit.Create(self); + FInputEdit.Parent := Self; + FInputEdit.TabStop := true; + FInputEdit.Text := TaskDialog.InputText; + + ALeft := IconTextWidth - TextRect.Right + FHorzMargin; + if UseRightToLeftAlignment then + ALeft := Self.ClientWidth - ALeft - Width; + + FInputEdit.SetBounds(ALeft, Y + 20, ClientWidth - ALeft, 20); + end; + itComboEdit, itComboList: + begin + FInputCombo := TComboBox.Create(self); + FInputCombo.Parent := Self; + FInputCombo.TabStop := true; + FInputCombo.Text := TaskDialog.InputText; + FInputCombo.Items.Assign(TaskDialog.InputItems); + + if TaskDialog.InputType = itComboList then + begin + FInputCombo.Style := csDropDownList; + FInputCombo.ItemIndex := FInputCombo.Items.IndexOf(TaskDialog.InputText); + end; + + ALeft := IconTextWidth - TextRect.Right + FHorzMargin; + if UseRightToLeftAlignment then + ALeft := Self.ClientWidth - ALeft - Width; + + FInputCombo.SetBounds(ALeft, Y + 20, ClientWidth - ALeft, 20); + end; + itDate: + begin + FInputDate := TDateTimePicker.Create(self); + FInputDate.Parent := Self; + FInputDate.TabStop := true; + ALeft := IconTextWidth - TextRect.Right + FHorzMargin; + if UseRightToLeftAlignment then + ALeft := Self.ClientWidth - ALeft - Width; + + FInputDate.Top := Y + 20; + FInputDate.Left := ALeft; + end; + itMemo: + begin + FInputMemo := TMemo.Create(self); + FInputMemo.Parent := Self; + FInputMemo.TabStop := true; + FInputMemo.WantReturns := false; + FInputMemo.Lines.Text := TaskDialog.InputText; + ALeft := IconTextWidth - TextRect.Right + FHorzMargin; + if UseRightToLeftAlignment then + ALeft := Self.ClientWidth - ALeft - Width; + FInputMemo.SetBounds(ALeft, Y + 20, ClientWidth - ALeft, 60); + end; + itCustom: + begin + if Assigned(TaskDialog.InputControl) then + begin + FOldParent := TaskDialog.InputControl.Parent; + TaskDialog.InputControl.Parent := self; + TaskDialog.InputControl.Visible := true; + if Assigned(TaskDialog.OnDialogInputSetText) then + TaskDialog.OnDialogInputSetText(TaskDialog, TaskDialog.InputText) + else + SetWindowText(TaskDialog.InputControl.Handle, Pchar(TaskDialog.InputText)); + + ALeft := IconTextWidth - TextRect.Right + FHorzMargin; + if UseRightToLeftAlignment then + ALeft := Self.ClientWidth - ALeft - Width; + TaskDialog.InputControl.SetBounds(ALeft, Y + 20, ClientWidth - ALeft, 20); + end; + end; + end; + + //-- setting Form Width + k := Max(FFooterXSize, Max(IconTextWidth, ButtonGroupWidth)) + FHorzMargin * 2; + k := Max(FExpTextXSize + FHorzMargin * 2, k); + w := Max(w, k); + w := Max(w, FMinFormWidth); + + if w > (Screen.Width - 2 * GetSystemMetrics(SM_CYEDGE)) then + w := Screen.Width - 2 * GetSystemMetrics(SM_CYEDGE); +// if w > 800 then +// w := 800; + + ClientWidth := w; + + if (doProgressBar in TaskDialog.Options) then + begin + FProgressBar.Width := ClientWidth - FHorzMargin*2; + end; + + SetPositions; + + if (TaskDialog.ExpandedText <> '') then + begin + SetExpanded((doExpandedDefault in TaskDialog.Options)); + end; + + Left := (Screen.Width div 2) - (Width div 2); + Top := (Screen.Height div 2) - (Height div 2); + OldFont.Free; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.UpdateDialog; +var + DialogUnits: TPoint; + ButtonSpacing, ButtonGroupWidth, IconTextWidth, X, Y: Integer; + IconID: PChar; + TextRect: TRect; + Msg: string; + DlgType: TTaskDialogIcon; + Buttons: TCommonButtons; + i, w: Integer; + CmBtnGroupWidth, CsBtnGroupWidth: Integer; + r, re: trect; + anchor, stripped: string; + HyperLinks,MouseLink, k, l, n: Integer; + Focusanchor,szFooterText: string; + OldFont: TFont; +begin + if not Assigned(FTaskDialog) then + Exit; + + Msg := FTaskDialog.Instruction; + DlgType := FTaskDialog.Icon; + Buttons := FTaskDialog.CommonButtons; + + OldFont := TFont.Create; + OldFont.Assign(Canvas.Font); + + DialogUnits := GetAveCharSize(Canvas); + w := 0; + + if FTaskDialog.Title <> '' then + Caption := FTaskDialog.Title + else + Caption := GetExeName; + + + if (Caption <> '') then + begin + w := 1000; + GetTextSize(Canvas, Caption, w, l); + w := w + 50; + end; + + ButtonSpacing := MulDiv(mcButtonSpacing, DialogUnits.X, 4); + CmBtnGroupWidth := 0; + CsBtnGroupWidth := 0; + Y := FVertMargin; + //ALeft := 0; + + for i := 0 to FcmBtnList.Count-1 do + begin + CmBtnGroupWidth := CmBtnGroupWidth + TButton(FcmBtnList.Items[i]).Width + ButtonSpacing; + end; + + if not (docommandLinks in FTaskDialog.Options) then + begin + for i := 0 to FcsBtnList.Count-1 do + begin + CsBtnGroupWidth := CsBtnGroupWidth + TButton(FcsBtnList.Items[i]).Width + ButtonSpacing; + end; + end + else + begin + + end; + + // Instruction + Canvas.Font.Size := 11; + Canvas.Font.Style := [fsBold]; + + SetRect(TextRect, 0, 0, Screen.Width div 2, 0); + DrawText(Canvas.Handle, PChar(Msg), Length(Msg) + 1, TextRect, + DT_EXPANDTABS or DT_CALCRECT or DT_WORDBREAK or + DrawTextBiDiModeFlagsReadingOnly); + + Canvas.Font.Assign(OldFont); + + + IconID := IconIDs[DlgType]; + IconTextWidth := TextRect.Right; + if (IconId <> nil) then + begin + Inc(IconTextWidth, 32 + FHorzSpacing); + end; + + if Assigned(Message) then + begin + Message.Caption := Msg; + //ALeft := IconTextWidth - TextRect.Right + FHorzMargin; + //if UseRightToLeftAlignment then + //ALeft := Self.ClientWidth - ALeft - Width; + y := Y + Height + FVertSpacing; + end; + + if (FTaskDialog.RadioButtons.Count > 0) then + begin + FTaskDialog.RadioButtonResult := FTaskDialog.DefaultRadioButton; + + for i := 0 to FRadioList.Count - 1 do + begin + with TRadioButton(FRadioList.Items[i]) do + begin + BoundsRect := TextRect; + Left := FHorzParaMargin + FHorzMargin; + Top := Y; + Width := Self.Width - Left - 4; + GetTextSize(Canvas, Caption, k, l); + w := Max(w, Left + k + FHorzMargin + 20); + end; + end; + end; + + {if (FTaskDialog.ExpandedText <> '') and Assigned(FExpandLabel) then + begin + with FExpandLabel do + begin + Left := ALeft; + Top := Y; + FExpandLabel.Caption := FTaskDialog.ExpandedText; + end; + end; } + + if (FTaskDialog.VerificationText <> '') and Assigned(FVerificationCheck) then + begin + k := 0; + with FVerificationCheck do + begin + BoundsRect := TextRect; + Caption := FTaskDialog.VerificationText; + Left := FHorzMargin; + Top := Y; + GetTextSize(Canvas, Caption, k, l); + w := Max(w, Left + k); + end; + end; + + FFooterXSize := 0; + FFooterYSize := 0; + if (FTaskDialog.Footer <> '') then + begin + r := Rect(FHorzMargin, Y, 300, Y + 26); + x := 0; + szFooterText := StringReplace(FTaskDialog.Footer,'\n','
',[rfReplaceAll]); + szFooterText := StringReplace(szFooterText,#10,'
',[rfReplaceAll]); + + HTMLDrawEx(Canvas, szFooterText, r, nil, x, y, -1, -1, 1, true, false, false, true, true, false, true, + 1.0, clBlue, clNone, clNone, clGray, anchor, stripped, focusanchor, FFooterXSize, FFooterYSize, hyperlinks, + mouselink, re, nil, nil, 0); + + if Assigned(FFooterIcon) then + begin + FFooterIcon.SetBounds(FHorzMargin, Y, 16, 16); + end; + end; + + ButtonGroupWidth := CmBtnGroupWidth + CsBtnGroupWidth; + if (FTaskDialog.ExpandedText <> '') and Assigned(FExpandButton) then + begin + k := 0; + l := 0; + GetTextSize(Canvas, FTaskDialog.CollapsControlText, k, l); + GetTextSize(Canvas, FTaskDialog.ExpandControlText, n, l); + k := Max(k, n); + ButtonGroupWidth := ButtonGroupWidth + FExpandButton.Width + FHorzSpacing + k + FHorzSpacing; + end; + + + //-- setting Form Width + k := Max(FFooterXSize, Max(IconTextWidth, ButtonGroupWidth)) + FHorzMargin * 2; + w := Max(w, k); + w := Max(w, FMinFormWidth); + + + ClientWidth := w; + + if (doProgressBar in FTaskDialog.Options) and Assigned(FProgressBar) then + begin + FProgressBar.Width := ClientWidth - FHorzMargin*2; + end; + + SetPositions; + + OldFont.Free; + Invalidate; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.SetPositions; +var + DialogUnits: TPoint; + HorzMargin, VertMargin, VertSpacing, ButtonSpacing, ButtonGroupWidth, X, Y: Integer; + i, h: Integer; + CmBtnGroupWidth, CsBtnGroupWidth, BtnH: Integer; + X1, y1: Integer; + r, re, rc: trect; + anchor, stripped: string; + HyperLinks,MouseLink: Integer; + Focusanchor: string; + ExpTextTop, verifTextWidth, k, l: Integer; + szContent: string; + szExpandedText,szFooterText: string; + //lbl:TLabel; + //ExH: integer; +begin + if not Assigned(FTaskDialog) then + Exit; + + DialogUnits := GetAveCharSize(Canvas); + HorzMargin := MulDiv(mcHorzMargin, DialogUnits.X, 4); + VertMargin := MulDiv(mcVertMargin, DialogUnits.Y, 8); + VertSpacing := MulDiv(mcVertSpacing, DialogUnits.Y, 8); + ButtonSpacing := MulDiv(mcButtonSpacing, DialogUnits.X, 4); + CmBtnGroupWidth := 0; + CsBtnGroupWidth := 0; + Y := VertMargin; + + {$IFDEF DELPHI7_LVL} + Message.Transparent := true; + {$ENDIF} + + // Instruction Label + if (Message.Caption <> '') then + y := Y + Message.Height + VertSpacing + else + Message.Visible := False; + + if (FTaskDialog.Content <> '') then + begin + //FContent.Width := ClientWidth - FContent.Left - HorzMargin; + //FContent.Top := Y; + //Y := Y + FContent.Height + VertSpacing; + X1 := 0; + Y1 := 0; + r := GetContentRect; + r := Rect(r.Left, Y, R.Right, Y + 26); + + if (doHyperlinks in FTaskDialog.Options) then + begin + szContent := StringReplace(FTaskDialog.Content,'\n','
',[rfReplaceAll]); + szContent := StringReplace(szContent,#10,'
',[rfReplaceAll]); + + HTMLDrawEx(Canvas, szContent, r, nil, x1, y1, -1, -1, 1, true, true, false, true, true, false, true, + 1.0, clBlue, clNone, clNone, clGray, anchor, stripped, focusanchor, FContentXSize, FContentYSize, hyperlinks, + mouselink, re, nil, nil, 0); + end + else + begin + szContent := StringReplace(FTaskDialog.Content,'\n',#13,[rfReplaceAll]); + { + if (Message.Caption <> '') then + FContentXSize := Message.Width + else + FContentXSize := 360; + + if FContentXSize < 360 then + FContentXSize := 360; + } + FContentXSize := r.Right - r.Left; + GetTextSize(Canvas, szContent, FContentXSize, FContentYSize); + end; + + rc := GetContentRect; + if (fContentXSize > rc.Right - rc.Left) then + ClientWidth := ClientWidth + (fContentXSize - (rc.Right - rc.Left)); + + y1 := FContentYSize; + if (Message.Caption = '') and Assigned(FIcon) then + begin + y1 := Max(FIcon.Height, Y1); + end; + + Y := Y + Y1 + VertSpacing; + + case FTaskDialog.InputType of + itEdit: FInputEdit.Top := Y - 10; + itComboEdit,itComboList: FInputCombo.Top := Y - 10; + itDate: FInputDate.Top := Y - 10; + itMemo: FInputMemo.Top := Y - 10; + itCustom: if Assigned(FTaskDialog.InputControl) then + FTaskDialog.InputControl.Top := Y - 10; + end; + + end + else + begin + if (FTaskDialog.RadioButtons.Count = 0) and not (doCommandLinks in FTaskDialog.Options) then + Y := Y + VertSpacing; + + if (Message.Caption = '') and Assigned(FIcon) then + Y := Y + VertSpacing + VertMargin; + end; + + if (FTaskDialog.InputType in [itEdit, itComboEdit, itComboList, itDate, itCustom]) then + begin + Y := Y + 30; + end; + + if (FTaskDialog.InputType in [itMemo]) then + begin + Y := Y + 70; + end; + + + if (doProgressBar in FTaskDialog.Options) then + begin + if Assigned(FIcon) then + begin + Y := Max(Y, FIcon.Top + FIcon.Height+3); + end; + FProgressBar.Top := Y; + Y := Y + FProgressBar.Height + VertSpacing; + end; + + if (FTaskDialog.RadioButtons.Count > 0) then + begin + for i:= 0 to FRadioList.Count-1 do + begin + TRadioButton(FRadioList.Items[i]).Top := Y; + TRadioButton(FRadioList.Items[i]).Width := ClientWidth - TRadioButton(FRadioList.Items[i]).Left - HorzMargin; + Y := Y + TRadioButton(FRadioList.Items[i]).Height + 4; + end; + Y := Y + VertSpacing - 4; + end; + + FExpTextXSize := 0; + FExpTextYSize := 0; + ExpTextTop := 0; + if (FTaskDialog.ExpandedText <> '') then + begin + if FExpanded then + begin + (*lbl := TLabel.Create(self); + {$IFDEF DELPHI7_LVL} + lbl.WordWrap := true; + {$ENDIF} + lbl.Width := ClientWidth - FExpandLabel.Left - HorzMargin; + lbl.Caption := FTaskDialog.FExpandedText; + ExH := lbl.Height; + lbl.Free; + + FExpandLabel.Top := Y; + FExpandLabel.Width := ClientWidth - FExpandLabel.Left - HorzMargin; + FExpandLabel.Height := ExH; + + Y := Y + FExpandLabel.Height + VertSpacing; + FExpandLabel.Visible := True; + *) + + + X1 := 0; + Y1 := 0; + r := GetExpTextRect; + r := Rect(r.Left, Y, R.Right, Y + 26); + + if (doHyperlinks in FTaskDialog.Options) then + begin + szExpandedText := StringReplace(FTaskDialog.ExpandedText,'\n','
',[rfReplaceAll]); + szExpandedText := StringReplace(szExpandedText,#10,'
',[rfReplaceAll]); + + HTMLDrawEx(Canvas, szExpandedText, r, nil, x1, y1, -1, -1, 1, true, true, false, true, true, false, true, + 1.0, clBlue, clNone, clNone, clGray, anchor, stripped, focusanchor, FExpTextXSize, FExpTextYSize, hyperlinks, + mouselink, re, nil, nil, 0); + end + else + begin + szExpandedText := StringReplace(FTaskDialog.ExpandedText,'\n',#13,[rfReplaceAll]); + + FExpTextXSize := r.Right - r.Left; + GetTextSize(Canvas, szExpandedText, FExpTextXSize, FExpTextYSize); + end; + + ExpTextTop := Y; + FExpTextTop := ExpTextTop; + Y := Y + FExpTextYSize + VertSpacing; + end + else + begin + //FExpandLabel.Visible := False; + end; + end; + + if not (docommandLinks in FTaskDialog.Options) then + begin + for i:= 0 to FcsBtnList.Count-1 do + begin + CsBtnGroupWidth := CsBtnGroupWidth + TButton(FcsBtnList.Items[i]).Width{ + ButtonSpacing}; + end; + + if (FcsBtnList.Count > 0) then + CsBtnGroupWidth := CsBtnGroupWidth + (FcsBtnList.Count-1) * ButtonSpacing; + end + else + begin + for i:= 0 to FcsBtnList.Count-1 do + begin + if Assigned(FIcon) then + TTaskDialogButton(FcsBtnList.Items[i]).Left := FHorzParaMargin; // FIcon.Left + FIcon.Width + FHorzSpacing; + TTaskDialogButton(FcsBtnList.Items[i]).Top := Y; + TTaskDialogButton(FcsBtnList.Items[i]).Width := ClientWidth - TTaskDialogButton(FcsBtnList.Items[i]).Left - HorzMargin; + Y := Y + TTaskDialogButton(FcsBtnList.Items[i]).Height + 2; + end; + FWhiteWindowHeight := Y; + Y := Y + VertSpacing; + end; + + for i := 0 to FcmBtnList.Count-1 do + begin + CmBtnGroupWidth := CmBtnGroupWidth + TButton(FcmBtnList.Items[i]).Width{ + ButtonSpacing}; + end; + CmBtnGroupWidth := CmBtnGroupWidth + (FcmBtnList.Count-1) * ButtonSpacing; + + verifTextWidth := 0; + if (FTaskDialog.VerificationText <> '') then + begin + GetTextSize(Canvas, FTaskDialog.VerificationText, k, l); + verifTextWidth := k + FVertSpacing * 2; + end; + + ButtonGroupWidth := CsBtnGroupWidth + CmBtnGroupWidth; + + X := (ClientWidth - ButtonGroupWidth - FHorzSpacing - 4); //(ClientWidth - ButtonGroupWidth) div 2; + h := Y; + BtnH := 0; + + if (FTaskDialog.ExpandedText <> '') then + begin + X := (ClientWidth - ButtonGroupWidth - FHorzSpacing - 4); + { + k := 0; + l := 0; + GetTextSize(Canvas, FTaskDialog.CollapsControlText, k, l); + GetTextSize(Canvas, FTaskDialog.ExpandControlText, n, l); + k := Max(k, n); + ButtonGroupWidth := ButtonGroupWidth + FExpandButton.Width + ButtonSpacing + k + FHorzSpacing; + } + end; + + if (FTaskDialog.ExpandedText <> '') then + begin + with FExpandButton do + begin + Top := Y; + Left := FVertMargin; //X; + //Inc(X, FExpandButton.Width + ButtonSpacing); + if (FExpandButton.Height > BtnH) then + BtnH := FExpandButton.Height; + end; + end; + + if (FTaskDialog.VerificationText <> '') and Assigned(FVerificationCheck) then + begin + FVerificationCheck.Width := verifTextWidth - FVertSpacing; //ClientWidth - FVerificationCheck.Left - HorzMargin; + FVerificationCheck.Top := Y + BtnH; + FVerificationCheck.Left := FVertMargin + 3; + //X := FVerificationCheck.Left + FVerificationCheck.Width + FVertMargin; + end; + + if not (docommandLinks in FTaskDialog.Options) then + begin + for i:= 0 to FcsBtnList.Count-1 do + begin + with TButton(FcsBtnList.Items[i]) do + begin + Top := Y; + Left := X; + Inc(X, TButton(FcsBtnList.Items[i]).Width + ButtonSpacing); + //if (i = 0) then + //h := h + TButton(FcsBtnList.Items[i]).Height; + if (TButton(FcsBtnList.Items[i]).Height > BtnH) then + BtnH := TButton(FcsBtnList.Items[i]).Height; + end; + end; + if (FcsBtnList.Count > 0) then + FWhiteWindowHeight := TButton(FcsBtnList.items[0]).Top{ - (FVertSpacing div 2)}; + end; + + for i := 0 to FcmBtnList.Count-1 do + begin + with TButton(FcmBtnList.Items[i]) do + begin + Top := Y; + Left := X; + Inc(X, TButton(FcmBtnList.Items[i]).Width + ButtonSpacing); + //if (i = 0) then + //h := h + TButton(FcmBtnList.Items[i]).Height; + if (TButton(FcmBtnList.Items[i]).Height > BtnH) then + BtnH := TButton(FcmBtnList.Items[i]).Height; + end; + + if (FcmBtnList.Count > 0) then + FWhiteWindowHeight := TButton(FcmBtnList.items[0]).Top{ - (FVertSpacing div 2)}; + end; + + if (FTaskDialog.VerificationText <> '') and Assigned(FVerificationCheck) then + begin + h := h + Max(BtnH, FVerificationCheck.Height + VertSpacing); + y := y + Max(BtnH + FVertSpacing, FVerificationCheck.Height + VertSpacing); + end + else + begin + h := h + BtnH; + if (BtnH > 0) then + y := y + BtnH + FVertSpacing; + end; + + if (FTaskDialog.Footer <> '') then + begin + X1 := 0; + Y1 := 0; + if Assigned(FFooterIcon) then + r := Rect(HorzMargin + 20, Y, Width - HorzMargin, Y + 100) + else + r := Rect(HorzMargin, Y, Width - HorzMargin, Y + 100); + + szFooterText := StringReplace(FTaskDialog.Footer,'\n','
',[rfReplaceAll]); + szFooterText := StringReplace(szFooterText,#10,'
',[rfReplaceAll]); + + HTMLDrawEx(Canvas, szFooterText, r, nil, x1, y1, -1, -1, 1, true, false, false, true, true, false, true, + 1.0, clBlue, clNone, clNone, clGray, anchor, stripped, focusanchor, FFooterXSize, FFooterYSize, hyperlinks, + mouselink, re, nil, nil, 0); + + y1 := FFooterYSize; + if Assigned(FFooterIcon) then + begin + FFooterIcon.Top := Y; + y1 := Max(Y1, 20); + end; + h := h + Y1 + VertSpacing; + end; + + h := h + VertMargin; + ClientHeight := h; + if (FcmBtnList.Count = 0) and ((docommandLinks in FTaskDialog.Options) or (not (docommandLinks in FTaskDialog.Options) and (FcsBtnList.Count = 0))) then + FWhiteWindowHeight := Height; + + if (ExpTextTop > 0) and (doExpandedFooter in FTaskDialog.Options) then + FWhiteWindowHeight := ExpTextTop; +end; + +//------------------------------------------------------------------------------ + +constructor TAdvMessageForm.CreateNew(AOwner: TComponent; Dummy: Integer); +var + NonClientMetrics: TNonClientMetrics; +begin + inherited CreateNew(AOwner); + NonClientMetrics.cbSize := sizeof(NonClientMetrics); + if SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @NonClientMetrics, 0) then + Font.Handle := CreateFontIndirect(NonClientMetrics.lfMessageFont); + + FExpandButton := nil; + FExpanded := true; + //FExpandLabel := nil; + FExpandControlText := ''; + FCollapsControlText := ''; + FcmBtnList := TList.Create; + FcsBtnList := TList.Create; + FRadioList := TList.Create; + FFooterXSize := 0; + FFooterYSize := 0; + FWhiteWindowHeight := Height; + FHorzParaMargin := 0; + FMinFormWidth := 350; +end; + +//------------------------------------------------------------------------------ + +{procedure TAdvMessageForm.HelpButtonClick(Sender: TObject); +begin + Application.HelpContext(HelpContext); +end;} + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.CustomKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); +begin + if ((ssAlt in Shift) and (Key = VK_F4)) then + Key := 0; + + if (Shift = [ssCtrl]) and (Key = Word('C')) then + begin + Beep; + WriteToClipBoard(GetFormText); + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.WMActivate(var M: TWMActivate); +begin + SetWindowPos ( Handle, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE or SWP_NOSIZE ); +end; + +procedure TAdvMessageForm.WriteToClipBoard(Text: String); +var + Data: THandle; + DataPtr: Pointer; +begin + if OpenClipBoard(0) then + begin + try + Data := GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE, Length(Text) + 1); + try + DataPtr := GlobalLock(Data); + try + Move(PChar(Text)^, DataPtr^, Length(Text) + 1); + EmptyClipBoard; + SetClipboardData(CF_TEXT, Data); + finally + GlobalUnlock(Data); + end; + except + GlobalFree(Data); + raise; + end; + finally + CloseClipBoard; + end; + end + else + raise Exception.CreateRes(@SCannotOpenClipboard); +end; + +//------------------------------------------------------------------------------ + +function TAdvMessageForm.GetFormText: String; +var + DividerLine, ButtonCaptions: string; + I: integer; +begin + DividerLine := StringOfChar('-', 27) + sLineBreak; + for I := 0 to ComponentCount - 1 do + if Components[I] is TButton then + ButtonCaptions := ButtonCaptions + TButton(Components[I]).Caption + + StringOfChar(' ', 3); + ButtonCaptions := StringReplace(ButtonCaptions,'&','', [rfReplaceAll]); + Result := Format('%s%s%s%s%s%s%s%s%s%s', [DividerLine, Caption, sLineBreak, + DividerLine, Message.Caption, sLineBreak, DividerLine, ButtonCaptions, + sLineBreak, DividerLine]); +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.SetExpandButton(const Value: TTaskDialogButton); +begin + if Assigned(FExpandButton) then + FExpandButton.OnClick := nil; + + FExpandButton := Value; + + if Assigned(FExpandButton) then + FExpandButton.OnClick := OnExpandButtonClick; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.OnExpandButtonClick(Sender: TObject); +begin + if Assigned(FExpandButton) then + begin + SetExpanded(not Expanded); + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.SetExpanded(Value: Boolean); +begin + if FExpanded then + begin + if not Value then + begin + FExpandButton.Picture.LoadFromResourceName(HInstance, 'TD_EXP'); + FExpandButton.Picture.TransparentColor := clFuchsia; + FExpandButton.PictureHot.LoadFromResourceName(HInstance, 'TD_EXPHOT'); + FExpandButton.PictureHot.TransparentColor := clFuchsia; + FExpandButton.PictureDown.LoadFromResourceName(HInstance, 'TD_EXPDOWN'); + FExpandButton.PictureDown.TransparentColor := clFuchsia; + end; + end + else + begin + if Value then + begin + FExpandButton.Picture.LoadFromResourceName(HInstance, 'TD_COLP'); + FExpandButton.Picture.TransparentColor := clFuchsia; + FExpandButton.PictureHot.LoadFromResourceName(HInstance, 'TD_COLPHOT'); + FExpandButton.PictureHot.TransparentColor := clFuchsia; + FExpandButton.PictureDown.LoadFromResourceName(HInstance, 'TD_COLPDOWN'); + FExpandButton.PictureDown.TransparentColor := clFuchsia; + end; + end; + FExpanded := Value; + SetPositions; + Invalidate; +end; + +//------------------------------------------------------------------------------ + +destructor TAdvMessageForm.Destroy; +begin + FcmBtnList.Free; + FcsBtnList.Free; + FRadioList.Free; + if Assigned(FTimer) then + FTimer.Free; + inherited; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.DrawExpandedText; +var + r, re: trect; + anchor, stripped: string; + HyperLinks,MouseLink: Integer; + Focusanchor: string; + xsize, ysize: Integer; + szExpandedText: string; +begin + if not Assigned(FTaskDialog) or (not FExpanded) then + Exit; + + R := GetExpTextRect; + if (FTaskDialog.ExpandedText <> '') then + begin + + if (doHyperlinks in FTaskDialog.Options) then + begin + szExpandedText := StringReplace(FTaskDialog.ExpandedText,'\n','
',[rfReplaceAll]); + szExpandedText := StringReplace(szExpandedText,#10,'
',[rfReplaceAll]); + + HTMLDrawEx(Canvas, szExpandedText, R, nil, 0, 0, -1, -1, 1, false, false, false, false, False, false, + true, 1.0, clBlue, clNone, clNone, clGray, anchor, stripped, focusanchor, xsize, ysize, + hyperlinks, mouselink, re, nil , nil, 0); + end + else + begin + szExpandedText := StringReplace(FTaskDialog.ExpandedText,'\n',#13,[rfReplaceAll]); + + DrawText(Canvas.Handle,PChar(szExpandedText),Length(szExpandedText), R, DT_EXPANDTABS or DT_LEFT or DT_VCENTER or DT_WORDBREAK or DT_NOPREFIX); + end; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.DrawContent; +var + r, re: trect; + anchor, stripped: string; + HyperLinks,MouseLink: Integer; + Focusanchor: string; + xsize, ysize: Integer; + szContent: string; +begin + if not Assigned(FTaskDialog) then + Exit; + + R := GetContentRect; + if (FTaskDialog.Content <> '') then + begin + + if (doHyperlinks in FTaskDialog.Options) then + begin + szContent := StringReplace(FTaskDialog.Content,'\n','
',[rfReplaceAll]); + szContent := StringReplace(szContent,#10,'
',[rfReplaceAll]); + + HTMLDrawEx(Canvas, szContent, R, nil, 0, 0, -1, -1, 1, false, false, false, false, False, false, + true, 1.0, clBlue, clNone, clNone, clGray, anchor, stripped, focusanchor, xsize, ysize, + hyperlinks, mouselink, re, nil , nil, 0); + end + else + begin + szContent := StringReplace(FTaskDialog.Content,'\n',#13,[rfReplaceAll]); + DrawText(Canvas.Handle,PChar(szContent),Length(szContent), R, DT_EXPANDTABS or DT_LEFT or DT_VCENTER or DT_WORDBREAK or DT_NOPREFIX); + end; + end; +end; + +//------------------------------------------------------------------------------ + +function TAdvMessageForm.GetContentRect: TRect; +var + X, Y: Integer; +begin + Result := Rect(-1, -1, -1, -1); + if Assigned(FTaskDialog) and (FTaskDialog.Content <> '') then + begin + X := FHorzMargin; + if Assigned(FIcon) then + X := FIcon.Left + FIcon.Width + FHorzSpacing; + if (Message.Caption <> '') then + Y := Message.Top + Message.Height + FVertSpacing + else + Y := FVertMargin; + Result := Rect(X, Y, ClientWidth - FHorzMargin, Y + FContentYSize); + end; +end; + +//------------------------------------------------------------------------------ + +function TAdvMessageForm.GetExpTextRect: TRect; +var + X, Y: Integer; +begin + Result := Rect(-1, -1, -1, -1); + if Assigned(FTaskDialog) and FExpanded then + begin + X := FHorzMargin; + if Assigned(FIcon) then + X := FIcon.Left + FIcon.Width + FHorzSpacing; + {if (Message.Caption <> '') then + Y := Message.Top + Message.Height + FVertSpacing + else + Y := FVertMargin; + + if (FTaskDialog.Content <> '') then + y := Y + FContentYSize + FVertSpacing; + + if (doProgressBar in FTaskDialog.Options) then + begin + if Assigned(FIcon) then + begin + Y := Max(Y, FIcon.Top + FIcon.Height+3); + end; + + if Assigned(FProgressBar) then + Y := Y + FProgressBar.Height + FVertSpacing; + end; + + if (FTaskDialog.RadioButtons.Count > 0) then + begin + if (FRadioList.Count > 0) then + Y := Y + TRadioButton(FRadioList.Items[FRadioList.Count-1]).Height + FVertSpacing; + end;} + Y := FExpTextTop; + + Result := Rect(X, Y, ClientWidth - FHorzMargin, Y + FExpTextYSize); + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.DrawFooter; +var + r, re: trect; + anchor, stripped: string; + HyperLinks,MouseLink: Integer; + Focusanchor: string; + xsize, ysize, i: Integer; + bmp: TBitmap; + shieldbmp: TBitmap; + IconH: THandle; + szFooterText: string; + +begin + if not Assigned(FTaskDialog) then + Exit; + + if (FTaskDialog.Footer <> '') then + begin + R := GetFooterRect; + + i := R.Top - FVertSpacing; + Canvas.Pen.Color := RGB(223, 223, 223); + Canvas.MoveTo(2, i); + Canvas.LineTo(ClientWidth -3, i); + Canvas.Pen.Color := clWhite; + Canvas.MoveTo(2, i+1); + Canvas.LineTo(ClientWidth -3, i+1); + + if Assigned(FFooterIcon) then + begin + + IconH := LoadImage(0,FFooterIconID,IMAGE_ICON,16,16, LR_SHARED); + + bmp := TBitmap.Create; + bmp.Width := 16; + bmp.Height := 16; + bmp.Transparent := True; + bmp.Canvas.Brush.Color := RGB(240, 240, 240); + bmp.Canvas.Rectangle(0,0,16,16); + //DrawIcon(bmp.Canvas.Handle,0, 0, IconH); + //Canvas.StretchDraw(Rect(R.Left, R.Top-2, R.Left+16, R.Top+14), bmp); + + if FTaskDialog.FooterIcon = tfiShield then + begin + shieldbmp := TBitmap.Create; + shieldbmp.Handle := LoadBitmap(hInstance, 'TD_SHIELD'); + bmp.Canvas.StretchDraw(Rect(0,0,16,16),shieldbmp); + shieldbmp.Free; + end + else + begin + DrawIconEx(bmp.Canvas.Handle, 0, 0, IconH, 16, 16, 0, bmp.Canvas.Brush.Handle, DI_NORMAL); //Replaced DrawIcon + end; + Canvas.Draw(R.Left, R.Top, bmp); + bmp.Free; + + R.Left := R.Left + 20; + end; + szFooterText := StringReplace(FTaskDialog.Footer,'\n','
',[rfReplaceAll]); + szFooterText := StringReplace(szFooterText,#10,'
',[rfReplaceAll]); + + HTMLDrawEx(Canvas, szFooterText, R, nil, 0, 0, -1, -1, 1, false, false, false, false, False, false, + true, 1.0, clBlue, clNone, clNone, clGray, anchor, stripped, focusanchor, xsize, ysize, + hyperlinks, mouselink, re, nil , nil, 0); + end; +end; + +//------------------------------------------------------------------------------ + +function TAdvMessageForm.GetFooterRect: TRect; +begin + Result := Rect(-1, -1, -1, -1); + if Assigned(FTaskDialog) and (FTaskDialog.Footer <> '') then + begin + Result := Rect(FHorzMargin, ClientHeight - FFooterYSize-10, ClientWidth - FHorzMargin, ClientHeight); + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.Paint; +var + i: Integer; + R: TRect; + s: string; + VerInfo: TOSVersionInfo; + +begin + inherited; + i := FWhiteWindowHeight; + + {if (FcmBtnList.Count > 0) then + i := TButton(FcmBtnList.Items[0]).Top + else if (FcsBtnList.Count > 0) then + i := TButton(FcsBtnList.Items[0]).Top;} + + VerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); + GetVersionEx(verinfo); + + if (i > 0) then + begin + R := ClientRect; + R.Top := i - (FVertSpacing div 2) ; + Canvas.Brush.Color := RGB(240, 240, 240); + Canvas.FillRect(R); + Canvas.Pen.Color := RGB(223, 223, 223); + Canvas.MoveTo(R.Left, R.Top); + Canvas.LineTo(R.Right, R.Top); + R := ClientRect; + Canvas.Brush.Style := bsClear; + + if (verinfo.dwMajorVersion >= 6) then + Canvas.Pen.Style := psClear + else + Canvas.Pen.Style := psSolid; + + if DRAWBORDER and not IsVista then // only draw on non Vista + begin + Canvas.Pen.Color := clGray; + Canvas.Rectangle(R.Left+1, R.Top+1, R.Right-1, R.Bottom-1); + end; + Canvas.Pen.Style := psSolid; + end; + + DrawContent; + DrawExpandedText; + if Assigned(FTaskDialog) and (FTaskDialog.ExpandedText <> '') and Assigned(FExpandButton) then + begin + if not FExpanded then + s := FTaskDialog.CollapsControlText + else + s := FTaskDialog.ExpandControlText; + + Canvas.Brush.Style := bsClear; + R := Rect(FExpandButton.Left + FExpandButton.Width + FHorzSpacing - 5, FExpandButton.Top, ClientRect.Right, FExpandButton.Top + FExpandButton.Height); + DrawText(Canvas.Handle,PChar(s),Length(s), R, DT_SINGLELINE or DT_LEFT or DT_VCENTER); + end; + DrawFooter; +end; + +//------------------------------------------------------------------------------ + +function TAdvMessageForm.IsAnchor(x, y: integer): string; +var + r: trect; + xsize, ysize: integer; + anchor, stripped: string; + + HyperLinks,MouseLink: Integer; + Focusanchor: string; + re: TRect; + AText: String; +begin + Result := ''; + if not Assigned(FTaskDialog) then + Exit; + + AText := ''; + R := GetFooterRect; + if PtInRect(R, Point(X, Y)) then + begin + if Assigned(FFooterIcon) then + begin + R.Left := R.Left + 20; + end; + AText := FTaskDialog.Footer; + end + else + begin + R := GetContentRect; + if PtInRect(R, Point(X, y)) then + AText := FTaskDialog.Content + else + begin + R := GetExpTextRect; + if PtInRect(R, Point(X, y)) then + AText := FTaskDialog.ExpandedText; + end; + end; + + AText := StringReplace(AText,'\n','
',[rfReplaceAll,rfIgnoreCase]); + AText := StringReplace(AText,#10,'
',[rfReplaceAll,rfIgnoreCase]); + + Anchor := ''; + if (AText <> '') then + begin + if HTMLDrawEx(Canvas, AText, r, nil, x, y, -1, -1, 1, true, false, false, true, true, false, true, + 1.0, clBlue, clNone, clNone, clGray, anchor, stripped, focusanchor, xsize, ysize, hyperlinks, + mouselink, re, nil, nil, 0) then + Result := anchor; + end; +end; + +procedure TAdvMessageForm.KeyDown(var Key: Word; Shift: TShiftSTate); +var + s: string; +begin + inherited; + if (Key = ord('C')) and (ssCtrl in Shift) then + begin + // got ctrl-c + s := FTaskDialog.FTitle + #13#10; + s := s + FTaskDialog.FInstruction + #13#10; + s := s + FTaskDialog.FContent; + clipboard.Open; + clipboard.AsText := s; + clipboard.Close; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.MouseDown(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +var + Anchor: string; +begin + inherited; + Anchor := IsAnchor(X, Y); + if Anchor <> '' then + begin + if not Assigned(FTaskDialog.OnDialogHyperlinkClick) then + begin + if (Pos('://', anchor) > 0) then + VistaShellOpen(0, 'iexplore.exe', Anchor); + end; + + if Assigned(FTaskDialog.OnDialogHyperlinkClick) then + FTaskDialog.OnDialogHyperlinkClick(FTaskDialog, Anchor); + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.MouseMove(Shift: TShiftState; X, Y: Integer); +var + anchor: string; +begin + anchor := IsAnchor(x, y); + if (Anchor <> '') then + begin + if (self.Cursor = crDefault) or (fAnchor <> Anchor) then + begin + fAnchor := Anchor; + self.Cursor := crHandPoint; + //if fAnchorHint then + //Application.CancelHint; + //if Assigned(fAnchorEnter) then fAnchorEnter(self, anchor); + end; + end + else + begin + if (self.Cursor = crHandPoint) then + begin + self.Cursor := crDefault; + //if assigned(fAnchorExit) then fAnchorExit(self, anchor); + end; + end; + inherited; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.MouseUp(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); +begin + inherited; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.OnTimer(Sender: TObject); +var + State: TTaskDialogProgressState; + Pos: Integer; +begin + if Assigned(FTaskDialog) then + begin + if Assigned(FTaskDialog.OnDialogTimer) then + FTaskDialog.OnDialogTimer(FTaskDialog); + + if Assigned(FTaskDialog.OnDialogProgress) then + begin + Pos := FProgressBar.Position; + FTaskDialog.OnDialogProgress(FTaskDialog, Pos, State); + FProgressBar.Position := Pos; + end; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.ClickButton(ButtonID: integer); +var + Btn: TButton; + TaskBtn: TTaskDialogButton; +begin + TaskBtn := nil; + Btn := GetButton(ButtonID, TaskBtn); + if Assigned(Btn) then + Btn.Click + else if Assigned(TaskBtn) then + TaskBtn.Click; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.EnableButton(ButtonID: integer; + Enabled: boolean); +var + Btn: TButton; + TaskBtn: TTaskDialogButton; +begin + TaskBtn := nil; + Btn := GetButton(ButtonID, TaskBtn); + if Assigned(Btn) then + Btn.Enabled := Enabled + else if Assigned(TaskBtn) then + TaskBtn.Enabled := Enabled; +end; + +//------------------------------------------------------------------------------ + +function TAdvMessageForm.GetButton(ButtonID: Integer; var TaskButton: TTaskDialogButton): TButton; +var + i, j: Integer; +begin + j := 0; + Result := nil; + for i := 0 to FcmBtnList.Count-1 do + begin + Inc(j); + if (j >= ButtonID) then + begin + TButton(FcmBtnList.Items[i]).Enabled := Enabled; + Result := TButton(FcmBtnList.Items[i]); + break; + end; + end; + + if not Assigned(Result) then + begin + j := 99; + for i := 0 to FcsBtnList.Count-1 do + begin + Inc(j); + if (j >= ButtonID) then + begin + if (doCommandLinks in FTaskDialog.Options) then + begin + TTaskDialogButton(FcsBtnList.Items[i]).Enabled := Enabled; + TaskButton := TTaskDialogButton(FcsBtnList.Items[i]); + end + else + begin + TButton(FcsBtnList.Items[i]).Enabled := Enabled; + Result := TButton(FcsBtnList.Items[i]); + end; + break; + end; + end; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TTaskDialogButton.Click; +var + Form: TCustomForm; +begin + Form := GetParentForm(Self); + if Form <> nil then + Form.ModalResult := ModalResult; + inherited; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.OnVerifyClick(Sender: TObject); +begin + if not Assigned(FTaskDialog) or not Assigned(FVerificationCheck) then + Exit; + + FTaskDialog.VerifyResult := FVerificationCheck.Checked; + + if Assigned(FVerificationCheck) and Assigned(FTaskDialog.OnDialogVerifyClick) then + FTAskDialog.OnDialogVerifyClick(FTaskDialog, FVerificationCheck.Checked); +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.OnRadioClick(Sender: TObject); +begin + if not Assigned(FTaskDialog) or not Assigned(FRadioList) then + Exit; + + FTaskDialog.RadioButtonResult := FRadioList.IndexOf(Sender) + 200; + if Assigned(FTaskDialog) and Assigned(FTaskDialog.OnDialogRadioClick) then + FTAskDialog.OnDialogRadioClick(FTaskDialog, FTaskDialog.RadioButtonResult); +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.DoClose(var Action: TCloseAction); +var + CanClose: Boolean; + s: string; + a: array[0..255] of char; + +begin + CanClose := True; + + if Assigned(FTaskDialog) and Assigned(FTaskDialog.OnDialogClose) then + begin + FTaskDialog.OnDialogClose(FTaskDialog, CanClose); + end; + + case FTaskDialog.InputType of + itEdit: FTaskDialog.InputText := FInputEdit.Text; + itComboEdit, itComboList: FTaskDialog.InputText := FInputCombo.Text; + itDate: FTaskDialog.InputText := DateToStr(FInputDate.Date); + itMemo: FTaskDialog.InputText := FInputMemo.Lines.Text; + itCustom: + begin + if Assigned(FTaskDialog.InputControl) then + begin + GetWindowText(FTaskDialog.InputControl.Handle, a, sizeof(a)); + s := strpas(a); + if Assigned(FTaskDialog.OnDialogInputGetText) then + begin + s := ''; + FTaskDialog.OnDialogInputGetText(Self, s); + end; + FTaskDialog.InputText := s; + FTaskDialog.InputControl.Visible := false; + FTaskDialog.InputControl.Parent := FOldParent; + end; + end; + end; + + if not CanClose then + Action := caNone; + inherited; +end; + +procedure TAdvMessageForm.DoShow; +var + defBtn: integer; +begin + inherited; + + defBtn := -1; + if FTaskDialog.DefaultButton <> -1 then + begin + if (FTaskDialog.DefaultButton - 100 >= 0) and (FTaskDialog.DefaultButton - 100 < FTaskDialog.CustomButtons.Count) then + defBtn := FTaskDialog.DefaultButton - 100; + end; + + if defBtn <> -1 then + begin + if (docommandLinks in FTaskDialog.Options) then + TTaskDialogButton(FcsBtnList[defBtn]).SetFocus + else + TCustomControl(FcsBtnList[defBtn]).SetFocus; + end; + + case FTaskDialog.InputType of + itEdit: FInputEdit.SetFocus; + itComboEdit, itComboList: FInputCombo.SetFocus; + itDate: FInputDate.SetFocus; + itMemo: FInputMemo.SetFocus; + itCustom: FTaskDialog.InputControl.SetFocus; + end; + +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.OnButtonClick(Sender: TObject); +begin + if not Assigned(FTaskDialog) or not Assigned(FcsBtnList) then + Exit; + + if Assigned(FTaskDialog) and Assigned(FTaskDialog.onDialogButtonClick) then + FTaskDialog.OnDialogButtonClick(FTaskDialog, FcsBtnList.IndexOf(Sender) + 100); +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.CMDialogChar(var Message: TCMDialogChar); +var + I: Integer; +begin + if Assigned(FTaskDialog) and (docommandLinks in FTaskDialog.Options) then + begin + for I := 0 to FcsBtnList.Count-1 do + begin + if (TControl(FcsBtnList[I]) is TTaskDialogButton) and IsAccel(Message.CharCode, TTaskDialogButton(FcsBtnList[I]).Caption) and CanFocus then + begin + TTaskDialogButton(FcsBtnList[I]).Click; + Message.Result := 1; + Exit; + end; + end; + end; + + if (FTaskDialog.ExpandControlText <> '') and Expanded then + begin + if IsAccel(Message.CharCode, FTaskDialog.FExpandControlText) then + begin + OnExpandButtonClick(Self); + end; + end + else + if (FTaskDialog.CollapsControlText <> '') and not Expanded then + if IsAccel(Message.CharCode, FTaskDialog.FCollapsControlText) then + begin + OnExpandButtonClick(Self); + end; + + inherited; + + if Assigned(FTaskDialog) and (doAllowDialogCancel in FTaskDialog.Options) and (Message.CharCode = VK_ESCAPE) then + begin + Self.Close; + end; +end; + + +function CoreShowmessage( + const Title, // dialog window title + Instruction, // the part of the message shown in blue + content, // additional message if desired + verify: string; // ex Do Not Show this Again + tiIcon: tTaskDialogIcon): boolean; +var + td: TCustomAdvTaskDialog; +begin + td := TCustomAdvTaskDialog.Create(application); + td.Title := Title; + td.Instruction := instruction; + td.Content := Content; + td.VerificationText := verify; + td.icon := tiIcon; + td.execute; + result := (verify <> '') and td.VerifyResult; + td.free; +end {CoreShowmessage}; + +//===================================================================== +// This returns false unless verify is not blank AND the verify checkbox +// was not checked. +//--------------------------------------------------------------------- +function AdvShowMessage( + const Title, // dialog window title + Instruction, // the part of the message shown in blue + content, // additional message if desired + verify: string; // ex Do Not Show this Again + tiIcon: tTaskDialogIcon): boolean; overload; +begin + result := coreShowmessage(title, instruction,content,verify,tiIcon); +end { tmsShowMessage }; + +function AdvShowmessage(const Instruction: string):boolean; overload; +begin // Only instruction . tiInformation + result := CoreShowMessage('',Instruction,'','',tiInformation); +end; + +function AdvShowmessage(const Title, Instruction: string):boolean; overload; +begin // title, instruction tiInformation + result := CoreShowMessage(Title,Instruction,'','',tiInformation); +end; + +function AdvShowmessage(const Title, Instruction: string;tiIcon: TTaskDialogIcon): boolean; overload; +begin + result := CoreShowMessage(Title,Instruction,'','',tiIcon); +end; + +function AdvShowMessageFmt(const Instruction: string; Parameters: array of const): boolean; +begin + Result := AdvShowmessage(Format(Instruction,Parameters)); +end; + +function AdvMessageBox(hWnd: HWND; lpInstruction, lpTitle: PChar; flags: UINT): Integer; +const + MB_CANCELTRYCONTINUE = $00000006; // missing from windows unit so probably never be used +var + td: TCustomAdvTaskDialog; + res: integer; + def: integer; + num: integer; + task: tCommonButton; + txt: string; +begin + td := TCustomAdvTaskDialog.Create(application); + td.Title := lptitle; + td.instruction := lpInstruction; + + // extract the icon from flags + case MB_ICONMASK and flags of + MB_ICONEXCLAMATION: td.Icon := tiWarning; // Exclamation mark= MB_ICONWARNING + MB_ICONINFORMATION: td.Icon := tiInformation; // Circled I = MB_ICONASTERISK + MB_ICONQUESTION: td.Icon := tiQuestion; // Question (api says don't use any more + MB_ICONSTOP: td.Icon := tiError; //Stop sign = MB_ICONERROR & MB_ICONHAND + end; + + // extract the buttons from flags + // MessageBox() Flags from Windows help file + // MB_ABORTRETRYIGNORE + // The message box contains three push buttons: Abort, Retry, and Ignore. + // MB_CANCELTRYCONTINUE + // Microsoft Windows 2000/XP: The message box contains three push buttons: Cancel, Try Again, Continue. Use this message box type instead of MB_ABORTRETRYIGNORE. + // MB_HELP + // Windows 95/98/Me, Windows NT 4.0 and later: Adds a Help button to the message box. When the user clicks the Help button or presses F1, the system sends a WM_HELP message to the owner. + // MB_OK + // The message box contains one push button: OK. This is the default. + // MB_OKCANCEL + // The message box contains two push buttons: OK and Cancel. + // MB_RETRYCANCEL + // The message box contains two push buttons: Retry and Cancel. + // MB_YESNO + // The message box contains two push buttons: Yes and No. + // MB_YESNOCANCEL + // The message box contains three push buttons: Yes, No, and Cancel. + td.Commonbuttons := []; + txt := ''; + case MB_TYPEMASK and flags of + MB_ABORTRETRYIGNORE: txt := 'Abort'#10'Retry'#10'Ignore'; + MB_CANCELTRYCONTINUE: txt := 'Cancel'#10'Try Again'#10'Continue'; + MB_OK: td.Commonbuttons := [cbOK]; + MB_RETRYCANCEL: txt := 'Retry'#10'Cancel'; + MB_OKCANCEL: td.CommonButtons := [cbOK,cbCancel]; + MB_YESNOCANCEL: td.Commonbuttons := [cbYes, cbNO, cbCancel]; + MB_YESNO: td.CommonButtons := [cbYes, cbNO]; + end; + if MB_HELP and flags <> 0 then + begin + if length(txt) > 0 then + txt := txt + #10; + txt := txt+'Help'; + end; + if txt <> '' then + td.CustomButtons.text := txt; + + // deal with mbDefbutton1, 2, 3 & 4 + def := 0; + if mb_DefButton1 and flags <> 0 then + def := 1; + if mb_DefButton2 and flags <> 0 then + def := 2; + if mb_DefButton3 and flags <> 0 then + def := 3; + if mb_DefButton4 and flags <> 0 then + def := 4; + if def > 0 then + begin // have to set default button + num := td.CustomButtons.count; + if num <= def then + td.DefaultButton := 99 + def + else begin + // I think this compiles on supported delphi compilers + for task := cbOK to cbClose do + begin + if task in td.CommonButtons then + begin + inc(num); + if num = def then + begin + case task of + cbOK: td.Defaultbutton := idOK; + cbYes: td.Defaultbutton := idYES; + cbNo: td.Defaultbutton := idNO; + cbCancel: td.Defaultbutton := idCANCEL; + cbRetry: td.Defaultbutton := idRETRY; + cbClose: td.Defaultbutton := idCLOSE; + end; + break; + end; + end; + end; + end; + end; + + // Deal with mbAppModal, mbSystemModal and mbtaskModal + // not sure what to do with these (I personally haven't used them. + result := 0; + res := td.Execute; + case res of + 1: result := IDOK; + 2: result := IDCANCEL; + 3: result := IDABORT; + 4: result := IDRETRY; + 5: result := IDIGNORE; + 6: result := IDYES; + 7: result := IDNO; + else + begin + case MB_TYPEMASK and flags of + MB_ABORTRETRYIGNORE: + case res of + 100: result := IDABORT; + 101: result := IDRETRY; + 102: result := IDIGNORE; + end; + MB_CANCELTRYCONTINUE: + case res of + 100: result := IDCANCEL; + {$IFDEF DELPHI9_LVL} + 101: result := IDTRYAGAIN; + 102: result := IDCONTINUE; + {$ENDIF} + end; + MB_RETRYCANCEL: + case res of + 100: result := IDRETRY; + 101: result := IDCANCEL; + end; + end; + end; + end; + td.Free; +end; + +function AdvMessageDlg(const Instruction: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer; overload; +begin + // passes mbHelp as the default button since we can't deal with help anyway + Result := AdvMessageDlg(Instruction,Dlgtype,Buttons,HelpCtx,mbHelp); +end; + +function AdvMessageDlg(const Instruction: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; DefaultButton: TMsgDlgBtn): Integer; overload; +var + td: TCustomAdvTaskDialog; + ray: array[0..3] of integer; + res: integer; +begin + td := TCustomAdvTaskDialog.Create(Application); + td.Instruction := instruction; + + case DlgType of + mtWarning: + begin + td.Icon := tiWarning; + td.Title := 'Warning'; + end; + mtError: + begin + td.Icon := tiError; + td.Title := 'Error'; + end; + mtInformation: + begin + td.Icon := tiInformation; + td.Title := 'Information'; + end; + mtConfirmation: + begin + td.Icon := tiShield; + td.Title := 'Confirm'; + end; + end; + + fillchar(ray,sizeof(ray),0); + td.CommonButtons := []; + +// TMsgDlgBtn = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore, +// mbAll, mbNoToAll, mbYesToAll, mbHelp); + + if (mbYes in Buttons) then + td.CommonButtons := td.CommonButtons + [cbYes]; + + if (mbNo in Buttons) then + td.CommonButtons := td.CommonButtons + [cbNo]; + + if (mbOK in Buttons) then + td.CommonButtons := td.CommonButtons + [cbOK]; + + if (mbCancel in Buttons) then + td.CommonButtons := td.CommonButtons + [cbCancel]; + + if (mbAbort in Buttons) then + td.CommonButtons := td.CommonButtons + [cbClose]; + + if (mbRetry in Buttons) then + td.CommonButtons := td.CommonButtons + [cbRetry]; + + + if (mbIgnore in Buttons) then + begin + td.CustomButtons.Add('Ignore'); + ray[0] := mrIgnore; + end; + + if (mbAll in Buttons) then + begin + ray[td.custombuttons.Count] := mrALL; + td.CustomButtons.Add('All'); + end; + + if (mbNoToAll in buttons) then + begin + ray[td.custombuttons.Count] := mrNoToAll; + td.CustomButtons.add('No to All'); + end; + + if (mbYesToAll in buttons) then + begin + ray[td.custombuttons.Count] := mrYesToAll; + td.Custombuttons.Add('Yes to All'); + end; + + result := 0; + res := td.Execute; + case res of + 1: Result := mrOk; + 2: Result := mrCancel; + 3: Result := mrAbort; + 4: Result := mrRetry; + 6: Result := mrYes; + 7: Result := mrNo; + else + if (res > 99) and (res < 100+high(ray)) then + result := ray[res-100]; + end; +end; + +function AdvInputQueryDlg(ACaption, APrompt: string; var Value: string):boolean; +var + AID: TAdvInputTaskDialog; +begin + AID := TAdvInputTaskDialog.Create(Application); + AID.Instruction := APrompt; + AID.Title := ACaption; + AID.InputText := Value; + AID.InputType := itEdit; + AID.CommonButtons := [cbOK, cbCancel]; + Result := AID.Execute = mrOK; + Value := AID.InputText; +end; + +//------------------------------------------------------------------------------ + +procedure Register; +begin + RegisterComponents('TMS',[TAdvTaskDialog, TAdvInputTaskDialog]); +end; + +//------------------------------------------------------------------------------ + + +{ TAdvInputTaskDialog } + +constructor TAdvInputTaskDialog.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FInputType := itEdit; + Options := Options + [doAllowDialogCancel]; +end; + +function TAdvInputTaskDialog.Execute: integer; +begin + Result := AdvMessageDlgPos(Self, -1, -1); +end; + + +initialization + //cbOK, cbYes, cbNo, cbCancel, cbRetry, cbClose); + ButtonCaptions[cbOK] := @SMsgDlgOK; + ButtonCaptions[cbYes] := @SMsgDlgYes; + ButtonCaptions[cbNo] := @SMsgDlgNo; + ButtonCaptions[cbCancel] := @SMsgDlgCancel; + ButtonCaptions[cbRetry] := @SMsgDlgRetry; + ButtonCaptions[cbClose] := @SMsgDlgAbort; + + Captions[tiBlank] := nil; + Captions[tiWarning] := @SMsgDlgWarning; + Captions[tiQuestion] := @SMsgDlgConfirm; + Captions[tiError] := @SMsgDlgError; + Captions[tiShield] := @SMsgDlgInformation; + + +{$IFDEF FREEWARE} + if (FindWindow('TApplication', nil) = 0) OR + (FindWindow('TAppBuilder', nil) = 0) then + begin + MessageBox(0,'Application uses trial version of TMS components','Info',MB_OK); + end +{$ENDIF} + + +end. diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Source/TaskDialog.res b/TAdvTaskDialog/internal/1.5.0.2/1/Source/TaskDialog.res new file mode 100644 index 0000000000000000000000000000000000000000..5028366a69a8e4676e68cd089bf369f31f1b0824 GIT binary patch literal 20004 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 Sxvo8XVbzem(eHWXasLhF1RGrd literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Source/TaskDialogDE.pas b/TAdvTaskDialog/internal/1.5.0.2/1/Source/TaskDialogDE.pas new file mode 100644 index 0000000..0434010 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.0.2/1/Source/TaskDialogDE.pas @@ -0,0 +1,84 @@ +{***************************************************************************} +{ TTaskDialog component } +{ for Delphi & C++Builder } +{ version 1.2 } +{ } +{ written by TMS Software } +{ copyright © 2006 - 2007 } +{ Email : info@tmssoftware.com } +{ Web : http://www.tmssoftware.com } +{ } +{ The source code is given as is. The author is not responsible } +{ for any possible damage done due to the use of this code. } +{ The component can be freely used in any application. The complete } +{ source code remains property of the author and may not be distributed, } +{ published, given or sold in any form as such. No parts of the source } +{ code can be included in any other component or application without } +{ written authorization of the author. } +{***************************************************************************} + +unit TaskDialogDE; + +interface + +{$I TMSDEFS.INC} + +uses + Classes, Graphics, Comctrls, Windows, Forms, TypInfo, Dialogs, ExtCtrls, + Controls, ExtDlgs, TaskDialog +{$IFDEF DELPHI6_LVL} + {$IFNDEF TMSDOTNET} + , DesignIntf, DesignEditors, ContNrs + {$ENDIF} + {$IFDEF TMSDOTNET} + , Borland.Vcl.design.DesignIntf, Borland.Vcl.design.DesignEditors, ContNrs + {$ENDIF} +{$ELSE} + , DsgnIntf +{$ENDIF} + ; + +type + + TTaskDialogEditor = class(TDefaultEditor) + public + function GetVerb(Index: Integer):string; override; + function GetVerbCount: Integer; override; + procedure ExecuteVerb(Index: Integer); override; + end; + +implementation + +{ TTaskDialogEditor } + +procedure TTaskDialogEditor.ExecuteVerb(Index: Integer); +var + AppIsParent: boolean; +begin + inherited; + case Index of + 0: + begin + AppIsParent := TAdvTaskDialog(Component).ApplicationIsParent; + TAdvTaskDialog(Component).ApplicationIsParent := true; + TAdvTaskDialog(Component).Execute; + TAdvTaskDialog(Component).ApplicationIsParent := AppIsParent; + end; + end; +end; + +function TTaskDialogEditor.GetVerb(Index: Integer): string; +begin + case Index of + 0: Result := 'Preview'; + end; +end; + +function TTaskDialogEditor.GetVerbCount: Integer; +begin + Result := 1; +end; + + + +end. diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Source/TaskDialogEx.pas b/TAdvTaskDialog/internal/1.5.0.2/1/Source/TaskDialogEx.pas new file mode 100644 index 0000000..c1a40fe --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.0.2/1/Source/TaskDialogEx.pas @@ -0,0 +1,300 @@ +{***************************************************************************} +{ TTaskDialogEx component } +{ for Delphi & C++Builder } +{ } +{ written by TMS Software } +{ copyright © 2007 - 2008 } +{ Email : info@tmssoftware.com } +{ Web : http://www.tmssoftware.com } +{ } +{ The source code is given as is. The author is not responsible } +{ for any possible damage done due to the use of this code. } +{ The component can be freely used in any application. The complete } +{ source code remains property of the author and may not be distributed, } +{ published, given or sold in any form as such. No parts of the source } +{ code can be included in any other component or application without } +{ written authorization of the author. } +{***************************************************************************} + +unit TaskDialogEx; + +{$I TMSDEFS.INC} + +interface + +uses + Classes, Windows, Messages, Forms, Dialogs, SysUtils, StdCtrls, Graphics, Consts, Math, + ExtCtrls, Controls, TaskDialog, AdvGlowButton, AdvOfficeButtons; + +type + TButtonCreatedEvent = procedure(Sender: TObject; Button: TAdvGlowButton) of object; + + TAdvTaskDialogEx = class(TAdvTaskDialog) + private + FOnButtonCreated: TButtonCreatedEvent; + FAppearance: TGlowButtonAppearance; + protected + function CreateRadioButton(AOwner: TComponent): TWinControl; override; + procedure SetRadioButtonState(Btn: TWinControl; Checked: boolean); override; + procedure SetRadioButtonCaption(Btn: TWinControl; Value: string); override; + function CreateButton(AOwner: TComponent): TWinControl; override; + procedure InitRadioButton(AOwner: TForm; Btn: TWinControl; btnIndex: Integer; OnClickEvent : TNotifyEvent); override; + procedure SetButtonCaption(aButton: TWinControl; Value: TCaption); override; + procedure SetButtonCancel(aButton: TWinControl; Value: Boolean); override; + procedure SetButtonDefault(aButton: TWinControl; Value: Boolean); override; + procedure SetButtonModalResult(aButton: TWinControl; Value: Integer); override; + function GetButtonModalResult(aButton: TWinControl): Integer; override; + public + property Appearance: TGlowButtonAppearance read FAppearance write FAppearance; + property OnButtonCreated:TButtonCreatedEvent read FOnButtonCreated write FOnButtonCreated; + end; + + TAdvInputTaskDialogEx = class(TAdvInputTaskDialog) + private + FOnButtonCreated: TButtonCreatedEvent; + FAppearance: TGlowButtonAppearance; + protected + function CreateRadioButton(AOwner: TComponent): TWinControl; override; + procedure SetRadioButtonState(Btn: TWinControl; Checked: boolean); override; + procedure SetRadioButtonCaption(Btn: TWinControl; Value: string); override; + function CreateButton(AOwner: TComponent): TWinControl; override; + procedure InitRadioButton(AOwner: TForm; Btn: TWinControl; btnIndex: Integer; OnClickEvent : TNotifyEvent); override; + procedure SetButtonCaption(aButton: TWinControl; Value: TCaption); override; + procedure SetButtonCancel(aButton: TWinControl; Value: Boolean); override; + procedure SetButtonDefault(aButton: TWinControl; Value: Boolean); override; + procedure SetButtonModalResult(aButton: TWinControl; Value: Integer); override; + function GetButtonModalResult(aButton: TWinControl): Integer; override; + public + property Appearance: TGlowButtonAppearance read FAppearance write FAppearance; + property OnButtonCreated:TButtonCreatedEvent read FOnButtonCreated write FOnButtonCreated; + end; + + +procedure Register; + +implementation + +//------------------------------------------------------------------------------ + +procedure Register; +begin + RegisterComponents('TMS',[TAdvTaskDialogEx]); +end; + +//------------------------------------------------------------------------------ + +{ TAdvTaskDialogEx } + +function TAdvTaskDialogEx.CreateButton(AOwner: TComponent): TWinControl; +begin + Result := TAdvGlowButton.Create(AOwner); + if Assigned(FAppearance) then + (Result as TAdvGlowButton).Appearance := FAppearance; + (Result as TAdvGlowButton).TabStop := true; + if Assigned(FOnButtonCreated) then + FOnButtonCreated(Self,(Result as TAdvGlowButton)); +end; + +//------------------------------------------------------------------------------ + +function TAdvTaskDialogEx.CreateRadioButton(AOwner: TComponent): TWinControl; +begin + Result := TAdvOfficeRadioButton.Create(AOwner); +end; + +//------------------------------------------------------------------------------ + +function TAdvTaskDialogEx.GetButtonModalResult( + aButton: TWinControl): Integer; +begin + Result := mrNone; + if not Assigned(aButton) or not (aButton is TAdvGlowButton) then + Exit; + + Result := TAdvGlowButton(aButton).ModalResult; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvTaskDialogEx.SetButtonCancel(aButton: TWinControl; + Value: Boolean); +begin + if not Assigned(aButton) or not (aButton is TAdvGlowButton) then + Exit; + + TAdvGlowButton(aButton).Cancel := Value; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvTaskDialogEx.SetButtonCaption(aButton: TWinControl; + Value: TCaption); +begin + if not Assigned(aButton) or not (aButton is TAdvGlowButton) then + Exit; + + TAdvGlowButton(aButton).Caption := Value; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvTaskDialogEx.SetButtonDefault(aButton: TWinControl; + Value: Boolean); +begin + if not Assigned(aButton) or not (aButton is TAdvGlowButton) then + Exit; + + TAdvGlowButton(aButton).Default := Value; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvTaskDialogEx.SetButtonModalResult(aButton: TWinControl; + Value: Integer); +begin + if not Assigned(aButton) or not (aButton is TAdvGlowButton) then + Exit; + + TAdvGlowButton(aButton).ModalResult := Value; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvTaskDialogEx.SetRadioButtonCaption(Btn: TWinControl; + Value: string); +begin + TAdvOfficeRadioButton(Btn).Caption := Value; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvTaskDialogEx.SetRadioButtonState(Btn: TWinControl; + Checked: boolean); +begin + TAdvOfficeRadioButton(Btn).Checked := Checked; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvTaskDialogEx.InitRadioButton(AOwner: TForm; Btn: TWinControl; btnIndex: Integer; OnClickEvent : TNotifyEvent); +begin + with TRadioButton(Btn) do + begin + Name := 'Radio' + inttostr(btnIndex); + Parent := AOwner; + Font.Name := AOwner.Canvas.Font.Name; + Font.Size := 8; + BiDiMode := AOwner.BiDiMode; + OnClick := OnClickEvent; + + { + BoundsRect := TextRect; + Left := FHorzParaMargin + FHorzMargin; //ALeft + FHorzMargin; + Top := Y; + Width := Self.Width - Left - 4; + GetTextSize(Canvas, Caption, k, l); + w := Max(w, Left + k + FHorzMargin + 20); + } + end; +end; + +{ TAdvInputTaskDialogEx } + +//------------------------------------------------------------------------------ + +function TAdvInputTaskDialogEx.CreateButton(AOwner: TComponent): TWinControl; +begin + Result := TAdvGlowButton.Create(AOwner); + if Assigned(FAppearance) then + (Result as TAdvGlowButton).Appearance := FAppearance; + (Result as TAdvGlowButton).TabStop := true; + if Assigned(FOnButtonCreated) then + FOnButtonCreated(Self,(Result as TAdvGlowButton)); +end; + +function TAdvInputTaskDialogEx.CreateRadioButton( + AOwner: TComponent): TWinControl; +begin + Result := TAdvOfficeRadioButton.Create(AOwner); +end; + +function TAdvInputTaskDialogEx.GetButtonModalResult( + aButton: TWinControl): Integer; +begin + Result := mrNone; + if not Assigned(aButton) or not (aButton is TAdvGlowButton) then + Exit; + + Result := TAdvGlowButton(aButton).ModalResult; +end; + +procedure TAdvInputTaskDialogEx.SetButtonCancel(aButton: TWinControl; + Value: Boolean); +begin + if not Assigned(aButton) or not (aButton is TAdvGlowButton) then + Exit; + + TAdvGlowButton(aButton).Cancel := Value; +end; + +procedure TAdvInputTaskDialogEx.SetButtonCaption(aButton: TWinControl; + Value: TCaption); +begin + if not Assigned(aButton) or not (aButton is TAdvGlowButton) then + Exit; + + TAdvGlowButton(aButton).Caption := Value; +end; + +procedure TAdvInputTaskDialogEx.SetButtonDefault(aButton: TWinControl; + Value: Boolean); +begin + if not Assigned(aButton) or not (aButton is TAdvGlowButton) then + Exit; + + TAdvGlowButton(aButton).Default := Value; +end; + +procedure TAdvInputTaskDialogEx.SetButtonModalResult(aButton: TWinControl; + Value: Integer); +begin + if not Assigned(aButton) or not (aButton is TAdvGlowButton) then + Exit; + + TAdvGlowButton(aButton).ModalResult := Value; +end; + +procedure TAdvInputTaskDialogEx.SetRadioButtonCaption(Btn: TWinControl; + Value: string); +begin + TAdvOfficeRadioButton(Btn).Caption := Value; +end; + +procedure TAdvInputTaskDialogEx.SetRadioButtonState(Btn: TWinControl; + Checked: boolean); +begin + TAdvOfficeRadioButton(Btn).Checked := Checked; +end; + +procedure TAdvInputTaskDialogEx.InitRadioButton(AOwner: TForm; Btn: TWinControl; btnIndex: Integer; OnClickEvent : TNotifyEvent); +begin + with TRadioButton(Btn) do + begin + Name := 'Radio' + inttostr(btnIndex); + Parent := AOwner; + Font.Name := AOwner.Canvas.Font.Name; + Font.Size := 8; + BiDiMode := AOwner.BiDiMode; + OnClick := OnClickEvent; + { + BoundsRect := TextRect; + Left := FHorzParaMargin + FHorzMargin; //ALeft + FHorzMargin; + Top := Y; + Width := Self.Width - Left - 4; + GetTextSize(Canvas, Caption, k, l); + w := Max(w, Left + k + FHorzMargin + 20); + } + end; +end; + +end. diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Source/TaskDialogPkgD2007.dpk b/TAdvTaskDialog/internal/1.5.0.2/1/Source/TaskDialogPkgD2007.dpk new file mode 100644 index 0000000..7713990 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.0.2/1/Source/TaskDialogPkgD2007.dpk @@ -0,0 +1,50 @@ +package TaskDialogPkgD2007; + +{$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 'TMS TaskDialog'} +{$IMPLICITBUILD OFF} +{$DEFINE RELEASE} + +requires + rtl, + vcl, + designide, + dbrtl, + vcldb; + +contains + TaskDialog in 'TaskDialog.pas', + PictureContainer in 'PictureContainer.pas', + TaskDialogDE in 'TaskDialogDE.pas', + TaskDialogRegDE in 'TaskDialogRegDE.pas', + TaskDialogEx in 'TaskDialogEx.pas', + advgdip in 'advgdip.pas', + advglowbutton in 'advglowbutton.pas', + AdvGroupBox in 'AdvGroupBox.pas', + advhintinfo in 'advhintinfo.pas', + AdvOfficeButtons in 'AdvOfficeButtons.pas', + advstyleif in 'advstyleif.pas', + gdipicture in 'gdipicture.pas'; + +end. diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Source/TaskDialogPkgD2007.dproj b/TAdvTaskDialog/internal/1.5.0.2/1/Source/TaskDialogPkgD2007.dproj new file mode 100644 index 0000000..6594f6c --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.0.2/1/Source/TaskDialogPkgD2007.dproj @@ -0,0 +1,543 @@ + + + + {322e4f51-9fd5-43be-8659-42e8edcc60b1} + TaskDialogPkgD2007.dpk + Release + AnyCPU + DCC32 + ..\Lib\D11\TaskDialogPkgD2007.bpl + + + 7.0 + False + False + 0 + RELEASE + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + + + 7.0 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + ..\Lib\D11 + + + Delphi.Personality + Package + +FalseTrueFalseTMS TaskDialogFalseFalseFalseTrueFalse1000FalseFalseFalseFalseFalse206712521.0.0.01.0.0.0TaskDialogPkgD2007.dpk + + + + + MainSource + + + + + + + + + + + + + + + + + + + + + diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Source/TaskDialogPkgD2007.res b/TAdvTaskDialog/internal/1.5.0.2/1/Source/TaskDialogPkgD2007.res new file mode 100644 index 0000000000000000000000000000000000000000..5fc5c89d548a21d08982c8e99b9cf4cdef8d29e0 GIT binary patch literal 3008 zcmb7`&5qne6oqS&NMr>qh1sxSgb=c4ffA7gi?$~;AyOnDsHa`qIBLR7S0^)37)#B9 zaUP-{f)#IoG|#{jc)`jW*jQqLFyE=N$K8`;L0RSBd(S!dr%E=)m_26OhRN;L_~mB* z{W>-~{@ZADi??A!T=tmvm^)^~nQ{3wJihJh;?bl@Mw4)?r*-6F=B_`-;oQB8uVRcQ z^41I(g>`Y8G;z@#byPcN-FfBebFN$d@~E+`BOw&JM}>=f9}Rep$j{ixkT)bJ)4YwWUjn{nB>)LbdRg1rhZ8(p{upC1*G@#prB6sNw9h?RJOz z%D+|caN8z@KP@eBqYv+_8q1F7`3%A&v zs~7cnHAj_gvemqZtDozITU0`rp=7`FPPuyj(yr#ET~Axsv9#h|&0FeR@Wmy(bNO+7 zoG;vrYT7FH?5Rt6N@SBBVh=){Rf~F&XH|4i%Cm~rQ zp&wp9#|04w@7AFgPX|Ih6aRXe!(T57loWg|OJOm~me^YEsk)^@dDc-b$?gnpp+rUL z*B$p%V__zaN}xRA2{Z?v09YQwAce$y_y)H_wUq8|q4DF|=CLr3LcQcl%0wKL_h(f^ zeUWEPradz3QgyfcY7Gtks)NtGP{QoI*~$D47Z3t_uVAQxkd&=F5lT2%d#aez9;q4j zNco1LjBYB>eF;j#4zivWuA#2lW5O<{-Ev?b5Vke+cv{;BWqOz%HWmc<#nv+qSH0cN z!+_v1j;Q2Yy@ex$?P~T2TJKDvc{BI63hCJFiMBjATFtfE-=ur+?eBt)*U$a;&1-wX z{{=7pVgAkhi&-%*y7`K$=Kme9`0dcVFy^{uWz0KZzX!*Ma2@#Hnv3i0`^K2t%(i{k zd}F>a56!pCFU=#a{n-4k(cjFD+1nfWzZ(4o?U=J`ru$bKz42e@?Al$RtT{A~Ie%rQ z+&%ORk3HW5?lpe9@#nw73sY~xf7O9*88?{Wjeqo~-~Ee2b7o$eg*h=t<^k7d<|)W0 z<_B|%)vw;>w)x!LF`p6bT{KA1N1*Kx>#2EeUYIA?|3uVJczSwCu)#(ab&9 z3pf|}o?P1A<_B-*lHX$c66?X{j`4H*bI`VQMu&3b_}Xa?mTh?}b{gyH_<-)0mHaCxi%3@Op;jW-V^r{Nu)dqL8Y5 literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Source/TaskDialogRegDE.pas b/TAdvTaskDialog/internal/1.5.0.2/1/Source/TaskDialogRegDE.pas new file mode 100644 index 0000000..3a9109f --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.0.2/1/Source/TaskDialogRegDE.pas @@ -0,0 +1,49 @@ +{***************************************************************************} +{ TTaskDialog component } +{ for Delphi & C++Builder } +{ version 1.2 } +{ } +{ written by TMS Software } +{ copyright © 2006 - 2007 } +{ Email : info@tmssoftware.com } +{ Web : http://www.tmssoftware.com } +{ } +{ The source code is given as is. The author is not responsible } +{ for any possible damage done due to the use of this code. } +{ The component can be freely used in any application. The complete } +{ source code remains property of the author and may not be distributed, } +{ published, given or sold in any form as such. No parts of the source } +{ code can be included in any other component or application without } +{ written authorization of the author. } +{***************************************************************************} + +unit TaskDialogRegDE; + +interface +{$I TMSDEFS.INC} + +uses + Classes, TaskDialog, TaskDialogDE, + {$IFDEF DELPHI6_LVL} + {$IFDEF TMSDOTNET} + Borland.Vcl.Design.DesignIntf, Borland.Vcl.Design.DesignEditors + {$ENDIF} + {$IFNDEF TMSDOTNET} + DesignIntf, DesignEditors + {$ENDIF} + {$ELSE} + DsgnIntf + {$ENDIF} + ; + +procedure Register; + +implementation + +procedure Register; +begin + RegisterComponentEditor(TAdvTaskDialog,TTaskDialogEditor); +end; + +end. + diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Source/advgdip.pas b/TAdvTaskDialog/internal/1.5.0.2/1/Source/advgdip.pas new file mode 100644 index 0000000..7d617a0 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.0.2/1/Source/advgdip.pas @@ -0,0 +1,2897 @@ +{***************************************************************************} +{ GDI+ API Imports } +{ for Delphi & C++Builder } +{ version 1.0 } +{ } +{ written by TMS Software } +{ copyright © 2006 - 2007 } +{ Email : info@tmssoftware.com } +{ Web : http://www.tmssoftware.com } +{ } +{ The source code is given as is. The author is not responsible } +{ for any possible damage done due to the use of this code. } +{ The component can be freely used in any application. The complete } +{ source code remains property of the author and may not be distributed, } +{ published, given or sold in any form as such. No parts of the source } +{ code can be included in any other component or application without } +{ written authorization of the author. } +{***************************************************************************} + +unit AdvGDIP; + +{$HPPEMIT ''} +{$HPPEMIT '#pragma link "gdiplus.lib"'} +{$HPPEMIT ''} + +{$I TMSDEFS.INC} +{$ALIGN ON} +{$MINENUMSIZE 4} + +interface + +uses + Windows, ActiveX, Math, Graphics; + +type + INT16 = type Smallint; + UINT16 = type Word; + PUINT16 = ^UINT16; + UINT32 = type Cardinal; + TSingleDynArray = array of Single; + +var + GlowSpeed : integer = 30; + + +const + {$EXTERNALSYM GDIP_NOWRAP} + GDIP_NOWRAP = 4096; + WINGDIPDLL = 'gdiplus.dll'; + +//---------------------------------------------------------------------------- +// Memory Allocation APIs +//---------------------------------------------------------------------------- + +{$EXTERNALSYM GdipAlloc} +function GdipAlloc(size: ULONG): pointer; stdcall; +{$EXTERNALSYM GdipFree} +procedure GdipFree(ptr: pointer); stdcall; + +(**************************************************************************\ +* +* GDI+ base memory allocation class +* +\**************************************************************************) + +type + TAntiAlias = (aaNone, aaClearType, aaAntiAlias); + + TGdiplusBase = class + public + class function NewInstance: TObject; override; + procedure FreeInstance; override; + end; + +//-------------------------------------------------------------------------- +// Fill mode constants +//-------------------------------------------------------------------------- + + FillMode = ( + FillModeAlternate, // 0 + FillModeWinding // 1 + ); + TFillMode = FillMode; + +//-------------------------------------------------------------------------- +// Quality mode constants +//-------------------------------------------------------------------------- + +{$IFDEF DELPHI6_UP} + {$EXTERNALSYM QualityMode} + QualityMode = ( + QualityModeInvalid = -1, + QualityModeDefault = 0, + QualityModeLow = 1, // Best performance + QualityModeHigh = 2 // Best rendering quality + ); + TQualityMode = QualityMode; +{$ELSE} + {$EXTERNALSYM QualityMode} + QualityMode = Integer; + const + QualityModeInvalid = -1; + QualityModeDefault = 0; + QualityModeLow = 1; // Best performance + QualityModeHigh = 2; // Best rendering quality +{$ENDIF} + +type +{$IFDEF DELPHI6_UP} + {$EXTERNALSYM CompositingQuality} + CompositingQuality = ( + CompositingQualityInvalid = ord(QualityModeInvalid), + CompositingQualityDefault = ord(QualityModeDefault), + CompositingQualityHighSpeed = ord(QualityModeLow), + CompositingQualityHighQuality = ord(QualityModeHigh), + CompositingQualityGammaCorrected, + CompositingQualityAssumeLinear + ); + TCompositingQuality = CompositingQuality; +{$ELSE} + {$EXTERNALSYM CompositingQuality} + CompositingQuality = Integer; + const + CompositingQualityInvalid = QualityModeInvalid; + CompositingQualityDefault = QualityModeDefault; + CompositingQualityHighSpeed = QualityModeLow; + CompositingQualityHighQuality = QualityModeHigh; + CompositingQualityGammaCorrected = 3; + CompositingQualityAssumeLinear = 4; + +type + TCompositingQuality = CompositingQuality; +{$ENDIF} + +const + ImageFormatUndefined : TGUID = '{b96b3ca9-0728-11d3-9d7b-0000f81ef32e}'; + {$EXTERNALSYM ImageFormatUndefined} + ImageFormatMemoryBMP : TGUID = '{b96b3caa-0728-11d3-9d7b-0000f81ef32e}'; + {$EXTERNALSYM ImageFormatMemoryBMP} + ImageFormatBMP : TGUID = '{b96b3cab-0728-11d3-9d7b-0000f81ef32e}'; + {$EXTERNALSYM ImageFormatBMP} + ImageFormatEMF : TGUID = '{b96b3cac-0728-11d3-9d7b-0000f81ef32e}'; + {$EXTERNALSYM ImageFormatEMF} + ImageFormatWMF : TGUID = '{b96b3cad-0728-11d3-9d7b-0000f81ef32e}'; + {$EXTERNALSYM ImageFormatWMF} + ImageFormatJPEG : TGUID = '{b96b3cae-0728-11d3-9d7b-0000f81ef32e}'; + {$EXTERNALSYM ImageFormatJPEG} + ImageFormatPNG : TGUID = '{b96b3caf-0728-11d3-9d7b-0000f81ef32e}'; + {$EXTERNALSYM ImageFormatPNG} + ImageFormatGIF : TGUID = '{b96b3cb0-0728-11d3-9d7b-0000f81ef32e}'; + {$EXTERNALSYM ImageFormatGIF} + ImageFormatTIFF : TGUID = '{b96b3cb1-0728-11d3-9d7b-0000f81ef32e}'; + {$EXTERNALSYM ImageFormatTIFF} + ImageFormatEXIF : TGUID = '{b96b3cb2-0728-11d3-9d7b-0000f81ef32e}'; + {$EXTERNALSYM ImageFormatEXIF} + ImageFormatIcon : TGUID = '{b96b3cb5-0728-11d3-9d7b-0000f81ef32e}'; + {$EXTERNALSYM ImageFormatIcon} + + +type +//-------------------------------------------------------------------------- +// Unit constants +//-------------------------------------------------------------------------- + + Unit_ = ( + UnitWorld, // 0 -- World coordinate (non-physical unit) + UnitDisplay, // 1 -- Variable -- for PageTransform only + UnitPixel, // 2 -- Each unit is one device pixel. + UnitPoint, // 3 -- Each unit is a printer's point, or 1/72 inch. + UnitInch, // 4 -- Each unit is 1 inch. + UnitDocument, // 5 -- Each unit is 1/300 inch. + UnitMillimeter // 6 -- Each unit is 1 millimeter. + ); + TUnit = Unit_; + +//-------------------------------------------------------------------------- +// Dash style constants +//-------------------------------------------------------------------------- + + DashStyle = ( + DashStyleSolid, // 0 + DashStyleDash, // 1 + DashStyleDot, // 2 + DashStyleDashDot, // 3 + DashStyleDashDotDot, // 4 + DashStyleCustom // 5 + ); + TDashStyle = DashStyle; + + +//-------------------------------------------------------------------------- +// Various wrap modes for brushes +//-------------------------------------------------------------------------- + + WrapMode = ( + WrapModeTile, // 0 + WrapModeTileFlipX, // 1 + WrapModeTileFlipY, // 2 + WrapModeTileFlipXY, // 3 + WrapModeClamp // 4 + ); + TWrapMode = WrapMode; + +//-------------------------------------------------------------------------- +// LineGradient Mode +//-------------------------------------------------------------------------- + + LinearGradientMode = ( + LinearGradientModeHorizontal, // 0 + LinearGradientModeVertical, // 1 + LinearGradientModeForwardDiagonal, // 2 + LinearGradientModeBackwardDiagonal // 3 + ); + TLinearGradientMode = LinearGradientMode; + +//-------------------------------------------------------------------------- +// Line cap constants (only the lowest 8 bits are used). +//-------------------------------------------------------------------------- +{$IFDEF DELPHI6_UP} + {$EXTERNALSYM LineCap} + LineCap = ( + LineCapFlat = 0, + LineCapSquare = 1, + LineCapRound = 2, + LineCapTriangle = 3, + + LineCapNoAnchor = $10, // corresponds to flat cap + LineCapSquareAnchor = $11, // corresponds to square cap + LineCapRoundAnchor = $12, // corresponds to round cap + LineCapDiamondAnchor = $13, // corresponds to triangle cap + LineCapArrowAnchor = $14, // no correspondence + + LineCapCustom = $ff, // custom cap + + LineCapAnchorMask = $f0 // mask to check for anchor or not. + ); + TLineCap = LineCap; +{$ELSE} + {$EXTERNALSYM LineCap} + LineCap = Integer; + const + LineCapFlat = 0; + LineCapSquare = 1; + LineCapRound = 2; + LineCapTriangle = 3; + + LineCapNoAnchor = $10; // corresponds to flat cap + LineCapSquareAnchor = $11; // corresponds to square cap + LineCapRoundAnchor = $12; // corresponds to round cap + LineCapDiamondAnchor = $13; // corresponds to triangle cap + LineCapArrowAnchor = $14; // no correspondence + + LineCapCustom = $ff; // custom cap + + LineCapAnchorMask = $f0; // mask to check for anchor or not. + +type + TLineCap = LineCap; +{$ENDIF} + +//-------------------------------------------------------------------------- +// Region Comine Modes +//-------------------------------------------------------------------------- + + CombineMode = ( + CombineModeReplace, // 0 + CombineModeIntersect, // 1 + CombineModeUnion, // 2 + CombineModeXor, // 3 + CombineModeExclude, // 4 + CombineModeComplement // 5 (Exclude From) + ); + TCombineMode = CombineMode; + +//-------------------------------------------------------------------------- +// FontStyle: face types and common styles +//-------------------------------------------------------------------------- +type + {$EXTERNALSYM FontStyle} + FontStyle = Integer; + const + FontStyleRegular = Integer(0); + FontStyleBold = Integer(1); + FontStyleItalic = Integer(2); + FontStyleBoldItalic = Integer(3); + FontStyleUnderline = Integer(4); + FontStyleStrikeout = Integer(8); + Type + TFontStyle = FontStyle; + +//--------------------------------------------------------------------------- +// Smoothing Mode +//--------------------------------------------------------------------------- +{$IFDEF DELPHI6_UP} + {$EXTERNALSYM SmoothingMode} + SmoothingMode = ( + SmoothingModeInvalid = ord(QualityModeInvalid), + SmoothingModeDefault = ord(QualityModeDefault), + SmoothingModeHighSpeed = ord(QualityModeLow), + SmoothingModeHighQuality = ord(QualityModeHigh), + SmoothingModeNone, + SmoothingModeAntiAlias + ); + TSmoothingMode = SmoothingMode; +{$ELSE} + SmoothingMode = Integer; + const + SmoothingModeInvalid = QualityModeInvalid; + SmoothingModeDefault = QualityModeDefault; + SmoothingModeHighSpeed = QualityModeLow; + SmoothingModeHighQuality = QualityModeHigh; + SmoothingModeNone = 3; + SmoothingModeAntiAlias = 4; + +type + TSmoothingMode = SmoothingMode; + +{$ENDIF} + +//--------------------------------------------------------------------------- +// Text Rendering Hint +//--------------------------------------------------------------------------- + + TextRenderingHint = ( + TextRenderingHintSystemDefault, // Glyph with system default rendering hint + TextRenderingHintSingleBitPerPixelGridFit, // Glyph bitmap with hinting + TextRenderingHintSingleBitPerPixel, // Glyph bitmap without hinting + TextRenderingHintAntiAliasGridFit, // Glyph anti-alias bitmap with hinting + TextRenderingHintAntiAlias, // Glyph anti-alias bitmap without hinting + TextRenderingHintClearTypeGridFit // Glyph CT bitmap with hinting + ); + TTextRenderingHint = TextRenderingHint; + +//--------------------------------------------------------------------------- +// StringFormatFlags +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// String format flags +// +// DirectionRightToLeft - For horizontal text, the reading order is +// right to left. This value is called +// the base embedding level by the Unicode +// bidirectional engine. +// For vertical text, columns are read from +// right to left. +// By default, horizontal or vertical text is +// read from left to right. +// +// DirectionVertical - Individual lines of text are vertical. In +// each line, characters progress from top to +// bottom. +// By default, lines of text are horizontal, +// each new line below the previous line. +// +// NoFitBlackBox - Allows parts of glyphs to overhang the +// bounding rectangle. +// By default glyphs are first aligned +// inside the margines, then any glyphs which +// still overhang the bounding box are +// repositioned to avoid any overhang. +// For example when an italic +// lower case letter f in a font such as +// Garamond is aligned at the far left of a +// rectangle, the lower part of the f will +// reach slightly further left than the left +// edge of the rectangle. Setting this flag +// will ensure the character aligns visually +// with the lines above and below, but may +// cause some pixels outside the formatting +// rectangle to be clipped or painted. +// +// DisplayFormatControl - Causes control characters such as the +// left-to-right mark to be shown in the +// output with a representative glyph. +// +// NoFontFallback - Disables fallback to alternate fonts for +// characters not supported in the requested +// font. Any missing characters will be +// be displayed with the fonts missing glyph, +// usually an open square. +// +// NoWrap - Disables wrapping of text between lines +// when formatting within a rectangle. +// NoWrap is implied when a point is passed +// instead of a rectangle, or when the +// specified rectangle has a zero line length. +// +// NoClip - By default text is clipped to the +// formatting rectangle. Setting NoClip +// allows overhanging pixels to affect the +// device outside the formatting rectangle. +// Pixels at the end of the line may be +// affected if the glyphs overhang their +// cells, and either the NoFitBlackBox flag +// has been set, or the glyph extends to far +// to be fitted. +// Pixels above/before the first line or +// below/after the last line may be affected +// if the glyphs extend beyond their cell +// ascent / descent. This can occur rarely +// with unusual diacritic mark combinations. + +//--------------------------------------------------------------------------- + +Type + +//--------------------------------------------------------------------------- +// String alignment flags +//--------------------------------------------------------------------------- + + StringAlignment = ( + // Left edge for left-to-right text, + // right for right-to-left text, + // and top for vertical + StringAlignmentNear, + StringAlignmentCenter, + StringAlignmentFar + ); + TStringAlignment = StringAlignment; + + +//--------------------------------------------------------------------------- +// Trimming flags +//--------------------------------------------------------------------------- + + StringTrimming = ( + { + #define GDIPLUS_STRINGTRIMMING_None 0 && no trimming. + #define GDIPLUS_STRINGTRIMMING_Character 1 && nearest character. + #define GDIPLUS_STRINGTRIMMING_Word 2 && nearest wor + #define GDIPLUS_STRINGTRIMMING_EllipsisCharacter 3 && nearest character, ellipsis at end + #define GDIPLUS_STRINGTRIMMING_EllipsisWord 4 && nearest word, ellipsis at end + #define GDIPLUS_STRINGTRIMMING_EllipsisPath 5 && ellipsis in center, favouring last slash-delimited segment + } + StringTrimmingNone, + StringTrimmingCharacter, + StringTrimmingWord, + StringTrimmingEllipsisCharacter, + StringTrimmingEllipsisWord, + StringTrimmingEllipsisPath + ); + TStringTrimming = StringTrimming; + +//--------------------------------------------------------------------------- +// Hotkey prefix interpretation +//--------------------------------------------------------------------------- + + HotkeyPrefix = ( + HotkeyPrefixNone, + HotkeyPrefixShow, + HotkeyPrefixHide + ); + THotkeyPrefix = HotkeyPrefix; + +//--------------------------------------------------------------------------- +// Flush Intention flags +//--------------------------------------------------------------------------- + + FlushIntention = ( + FlushIntentionFlush, // Flush all batched rendering operations + FlushIntentionSync // Flush all batched rendering operations + // and wait for them to complete + ); + TFlushIntention = FlushIntention; + +//-------------------------------------------------------------------------- +// Status return values from GDI+ methods +//-------------------------------------------------------------------------- +type + Status = ( + Ok, + GenericError, + InvalidParameter, + OutOfMemory, + ObjectBusy, + InsufficientBuffer, + NotImplemented, + Win32Error, + WrongState, + Aborted, + FileNotFound, + ValueOverflow, + AccessDenied, + UnknownImageFormat, + FontFamilyNotFound, + FontStyleNotFound, + NotTrueTypeFont, + UnsupportedGdiplusVersion, + GdiplusNotInitialized, + PropertyNotFound, + PropertyNotSupported + ); + TStatus = Status; + +//-------------------------------------------------------------------------- +// Represents a location in a 2D coordinate system (floating-point coordinates) +//-------------------------------------------------------------------------- + +type + PGPPointF = ^TGPPointF; + TGPPointF = packed record + X : Single; + Y : Single; + end; + TPointFDynArray = array of TGPPointF; + + function MakePoint(X, Y: Single): TGPPointF; overload; + +//-------------------------------------------------------------------------- +// Represents a location in a 2D coordinate system (integer coordinates) +//-------------------------------------------------------------------------- + +type + PGPPoint = ^TGPPoint; + TGPPoint = packed record + X : Integer; + Y : Integer; + end; + TPointDynArray = array of TGPPoint; + + function MakePoint(X, Y: Integer): TGPPoint; overload; + +//-------------------------------------------------------------------------- +// Represents a rectangle in a 2D coordinate system (floating-point coordinates) +//-------------------------------------------------------------------------- + +type + PGPRectF = ^TGPRectF; + TGPRectF = packed record + X : Single; + Y : Single; + Width : Single; + Height: Single; + end; + TRectFDynArray = array of TGPRectF; + + function MakeRect(x, y, width, height: Single): TGPRectF; overload; + +type + PGPRect = ^TGPRect; + TGPRect = packed record + X : Integer; + Y : Integer; + Width : Integer; + Height: Integer; + end; + TRectDynArray = array of TGPRect; + + +(************************************************************************** +* +* GDI+ Startup and Shutdown APIs +* +**************************************************************************) +type + DebugEventLevel = ( + DebugEventLevelFatal, + DebugEventLevelWarning + ); + TDebugEventLevel = DebugEventLevel; + + // Callback function that GDI+ can call, on debug builds, for assertions + // and warnings. + + DebugEventProc = procedure(level: DebugEventLevel; message: PChar); stdcall; + + // Notification functions which the user must call appropriately if + // "SuppressBackgroundThread" (below) is set. + + NotificationHookProc = function(out token: ULONG): Status; stdcall; + + NotificationUnhookProc = procedure(token: ULONG); stdcall; + + // Input structure for GdiplusStartup + + GdiplusStartupInput = packed record + GdiplusVersion : Cardinal; // Must be 1 + DebugEventCallback : DebugEventProc; // Ignored on free builds + SuppressBackgroundThread: BOOL; // FALSE unless you're prepared to call + // the hook/unhook functions properly + SuppressExternalCodecs : BOOL; // FALSE unless you want GDI+ only to use + end; // its internal image codecs. + + TGdiplusStartupInput = GdiplusStartupInput; + PGdiplusStartupInput = ^TGdiplusStartupInput; + + // Output structure for GdiplusStartup() + + GdiplusStartupOutput = packed record + // The following 2 fields are NULL if SuppressBackgroundThread is FALSE. + // Otherwise, they are functions which must be called appropriately to + // replace the background thread. + // + // These should be called on the application's main message loop - i.e. + // a message loop which is active for the lifetime of GDI+. + // "NotificationHook" should be called before starting the loop, + // and "NotificationUnhook" should be called after the loop ends. + + NotificationHook : NotificationHookProc; + NotificationUnhook: NotificationUnhookProc; + end; + TGdiplusStartupOutput = GdiplusStartupOutput; + PGdiplusStartupOutput = ^TGdiplusStartupOutput; + + // GDI+ initialization. Must not be called from DllMain - can cause deadlock. + // + // Must be called before GDI+ API's or constructors are used. + // + // token - may not be NULL - accepts a token to be passed in the corresponding + // GdiplusShutdown call. + // input - may not be NULL + // output - may be NULL only if input->SuppressBackgroundThread is FALSE. + + {$EXTERNALSYM GdiplusStartup} + function GdiplusStartup(out token: ULONG; input: PGdiplusStartupInput; + output: PGdiplusStartupOutput): Status; stdcall; + + // GDI+ termination. Must be called before GDI+ is unloaded. + // Must not be called from DllMain - can cause deadlock. + // + // GDI+ API's may not be called after GdiplusShutdown. Pay careful attention + // to GDI+ object destructors. + + {$EXTERNALSYM GdiplusShutdown} + procedure GdiplusShutdown(token: ULONG); stdcall; + +type + PARGB = ^ARGB; + ARGB = DWORD; + {$EXTERNALSYM ARGB} + +type + + PGPColor = ^TGPColor; + {$EXTERNALSYM TGPCOLOR} + TGPColor = ARGB; + + function MakeColor(r, g, b: Byte): ARGB; overload; + function MakeColor(a, r, g, b: Byte): ARGB; overload; + function GetAlpha(color: ARGB): BYTE; + function GetRed(color: ARGB): BYTE; + function GetGreen(color: ARGB): BYTE; + function GetBlue(color: ARGB): BYTE; + +const + // Shift count and bit mask for A, R, G, B + AlphaShift = 24; + {$EXTERNALSYM AlphaShift} + RedShift = 16; + {$EXTERNALSYM RedShift} + GreenShift = 8; + {$EXTERNALSYM GreenShift} + BlueShift = 0; + {$EXTERNALSYM BlueShift} + + AlphaMask = $ff000000; + {$EXTERNALSYM AlphaMask} + RedMask = $00ff0000; + {$EXTERNALSYM RedMask} + GreenMask = $0000ff00; + {$EXTERNALSYM GreenMask} + BlueMask = $000000ff; + {$EXTERNALSYM BlueMask} + +type + PixelFormat = Integer; + {$EXTERNALSYM PixelFormat} + TPixelFormat = PixelFormat; + +const + PixelFormatIndexed = $00010000; // Indexes into a palette + {$EXTERNALSYM PixelFormatIndexed} + PixelFormatGDI = $00020000; // Is a GDI-supported format + {$EXTERNALSYM PixelFormatGDI} + PixelFormatAlpha = $00040000; // Has an alpha component + {$EXTERNALSYM PixelFormatAlpha} + PixelFormatPAlpha = $00080000; // Pre-multiplied alpha + {$EXTERNALSYM PixelFormatPAlpha} + PixelFormatExtended = $00100000; // Extended color 16 bits/channel + {$EXTERNALSYM PixelFormatExtended} + PixelFormatCanonical = $00200000; + {$EXTERNALSYM PixelFormatCanonical} + + PixelFormatUndefined = 0; + {$EXTERNALSYM PixelFormatUndefined} + PixelFormatDontCare = 0; + {$EXTERNALSYM PixelFormatDontCare} + + PixelFormat1bppIndexed = (1 or ( 1 shl 8) or PixelFormatIndexed or PixelFormatGDI); + {$EXTERNALSYM PixelFormat1bppIndexed} + PixelFormat4bppIndexed = (2 or ( 4 shl 8) or PixelFormatIndexed or PixelFormatGDI); + {$EXTERNALSYM PixelFormat4bppIndexed} + PixelFormat8bppIndexed = (3 or ( 8 shl 8) or PixelFormatIndexed or PixelFormatGDI); + {$EXTERNALSYM PixelFormat8bppIndexed} + PixelFormat16bppGrayScale = (4 or (16 shl 8) or PixelFormatExtended); + {$EXTERNALSYM PixelFormat16bppGrayScale} + PixelFormat16bppRGB555 = (5 or (16 shl 8) or PixelFormatGDI); + {$EXTERNALSYM PixelFormat16bppRGB555} + PixelFormat16bppRGB565 = (6 or (16 shl 8) or PixelFormatGDI); + {$EXTERNALSYM PixelFormat16bppRGB565} + PixelFormat16bppARGB1555 = (7 or (16 shl 8) or PixelFormatAlpha or PixelFormatGDI); + {$EXTERNALSYM PixelFormat16bppARGB1555} + PixelFormat24bppRGB = (8 or (24 shl 8) or PixelFormatGDI); + {$EXTERNALSYM PixelFormat24bppRGB} + PixelFormat32bppRGB = (9 or (32 shl 8) or PixelFormatGDI); + {$EXTERNALSYM PixelFormat32bppRGB} + PixelFormat32bppARGB = (10 or (32 shl 8) or PixelFormatAlpha or PixelFormatGDI or PixelFormatCanonical); + {$EXTERNALSYM PixelFormat32bppARGB} + PixelFormat32bppPARGB = (11 or (32 shl 8) or PixelFormatAlpha or PixelFormatPAlpha or PixelFormatGDI); + {$EXTERNALSYM PixelFormat32bppPARGB} + PixelFormat48bppRGB = (12 or (48 shl 8) or PixelFormatExtended); + {$EXTERNALSYM PixelFormat48bppRGB} + PixelFormat64bppARGB = (13 or (64 shl 8) or PixelFormatAlpha or PixelFormatCanonical or PixelFormatExtended); + {$EXTERNALSYM PixelFormat64bppARGB} + PixelFormat64bppPARGB = (14 or (64 shl 8) or PixelFormatAlpha or PixelFormatPAlpha or PixelFormatExtended); + {$EXTERNALSYM PixelFormat64bppPARGB} + PixelFormatMax = 15; + {$EXTERNALSYM PixelFormatMax} + +type + +{$IFDEF DELPHI6_UP} + RotateFlipType = ( + RotateNoneFlipNone = 0, + Rotate90FlipNone = 1, + Rotate180FlipNone = 2, + Rotate270FlipNone = 3, + + RotateNoneFlipX = 4, + Rotate90FlipX = 5, + Rotate180FlipX = 6, + Rotate270FlipX = 7, + + RotateNoneFlipY = Rotate180FlipX, + Rotate90FlipY = Rotate270FlipX, + Rotate180FlipY = RotateNoneFlipX, + Rotate270FlipY = Rotate90FlipX, + + RotateNoneFlipXY = Rotate180FlipNone, + Rotate90FlipXY = Rotate270FlipNone, + Rotate180FlipXY = RotateNoneFlipNone, + Rotate270FlipXY = Rotate90FlipNone + ); + TRotateFlipType = RotateFlipType; +{$ELSE} + + RotateFlipType = ( + RotateNoneFlipNone, // = 0, + Rotate90FlipNone, // = 1, + Rotate180FlipNone, // = 2, + Rotate270FlipNone, // = 3, + + RotateNoneFlipX, // = 4, + Rotate90FlipX, // = 5, + Rotate180FlipX, // = 6, + Rotate270FlipX // = 7, + ); + const + RotateNoneFlipY = Rotate180FlipX; + Rotate90FlipY = Rotate270FlipX; + Rotate180FlipY = RotateNoneFlipX; + Rotate270FlipY = Rotate90FlipX; + + RotateNoneFlipXY = Rotate180FlipNone; + Rotate90FlipXY = Rotate270FlipNone; + Rotate180FlipXY = RotateNoneFlipNone; + Rotate270FlipXY = Rotate90FlipNone; + +type + TRotateFlipType = RotateFlipType; +{$ENDIF} + +//--------------------------------------------------------------------------- +// Private GDI+ classes for internal type checking +//--------------------------------------------------------------------------- + + GpGraphics = Pointer; + + GpBrush = Pointer; + GpSolidFill = Pointer; + GpLineGradient = Pointer; + GpPathGradient = Pointer; + + GpPen = Pointer; + + GpImage = Pointer; + GpBitmap = Pointer; + + GpPath = Pointer; + GpRegion = Pointer; + + GpFontFamily = Pointer; + GpFont = Pointer; + GpStringFormat = Pointer; + GpFontCollection = Pointer; + + GpStatus = TStatus; + GpFillMode = TFillMode; + GpWrapMode = TWrapMode; + GpUnit = TUnit; + GpPointF = PGPPointF; + GpPoint = PGPPoint; + GpRectF = PGPRectF; + GpRect = PGPRect; + GpDashStyle = TDashStyle; + GpLineCap = TLineCap; + GpFlushIntention = TFlushIntention; + + function GdipCreatePath(brushMode: GPFILLMODE; + out path: GPPATH): GPSTATUS; stdcall; + {$EXTERNALSYM GdipCreatePath} + + (* function GdipClonePath(path: GPPATH; + out clonePath: GPPATH): GPSTATUS; stdcall; + {$EXTERNALSYM GdipClonePath} + *) + function GdipDeletePath(path: GPPATH): GPSTATUS; stdcall; + {$EXTERNALSYM GdipDeletePath} + (* + function GdipStartPathFigure(path: GPPATH): GPSTATUS; stdcall; + {$EXTERNALSYM GdipStartPathFigure} + *) + function GdipClosePathFigure(path: GPPATH): GPSTATUS; stdcall; + {$EXTERNALSYM GdipClosePathFigure} + + function GdipAddPathLine(path: GPPATH; + x1, y1, x2, y2: Single): GPSTATUS; stdcall; + {$EXTERNALSYM GdipAddPathLine} + + function GdipAddPathArc(path: GPPATH; x, y, width, height, startAngle, + sweepAngle: Single): GPSTATUS; stdcall; + {$EXTERNALSYM GdipAddPathArc} + + function GdipAddPathEllipse(path: GPPATH; x: Single; y: Single; + width: Single; height: Single): GPSTATUS; stdcall; + {$EXTERNALSYM GdipAddPathEllipse} + + function GdipAddPathPie(path: GPPATH; x: Single; y: Single; width: Single; + height: Single; startAngle: Single; sweepAngle: Single): GPSTATUS; stdcall; + {$EXTERNALSYM GdipAddPathPie} + +//---------------------------------------------------------------------------- +// Brush APIs +//---------------------------------------------------------------------------- + + function GdipDeleteBrush(brush: GPBRUSH): GPSTATUS; stdcall; + {$EXTERNALSYM GdipDeleteBrush} + +//---------------------------------------------------------------------------- +// SolidBrush APIs +//---------------------------------------------------------------------------- + + function GdipCreateSolidFill(color: ARGB; + out brush: GPSOLIDFILL): GPSTATUS; stdcall; + {$EXTERNALSYM GdipCreateSolidFill} + +//---------------------------------------------------------------------------- +// LineBrush APIs +//---------------------------------------------------------------------------- + + function GdipCreateLineBrushFromRect(rect: GPRECTF; color1: ARGB; + color2: ARGB; mode: LINEARGRADIENTMODE; wrapMode: GPWRAPMODE; + out lineGradient: GPLINEGRADIENT): GPSTATUS; stdcall; + {$EXTERNALSYM GdipCreateLineBrushFromRect} + + function GdipCreateLineBrushFromRectI(rect: GPRECT; color1: ARGB; + color2: ARGB; mode: LINEARGRADIENTMODE; wrapMode: GPWRAPMODE; + out lineGradient: GPLINEGRADIENT): GPSTATUS; stdcall; + {$EXTERNALSYM GdipCreateLineBrushFromRectI} + + function GdipCreateLineBrushFromRectWithAngle(rect: GPRECTF; color1: ARGB; + color2: ARGB; angle: Single; isAngleScalable: Bool; wrapMode: GPWRAPMODE; + out lineGradient: GPLINEGRADIENT): GPSTATUS; stdcall; + {$EXTERNALSYM GdipCreateLineBrushFromRectWithAngle} + +//---------------------------------------------------------------------------- +// PathGradientBrush APIs +//---------------------------------------------------------------------------- + + function GdipCreatePathGradient(points: GPPOINTF; count: Integer; + wrapMode: GPWRAPMODE; out polyGradient: GPPATHGRADIENT): GPSTATUS; stdcall; + {$EXTERNALSYM GdipCreatePathGradient} + + function GdipCreatePathGradientFromPath(path: GPPATH; + out polyGradient: GPPATHGRADIENT): GPSTATUS; stdcall; + {$EXTERNALSYM GdipCreatePathGradientFromPath} + + function GdipGetPathGradientCenterColor(brush: GPPATHGRADIENT; + out colors: ARGB): GPSTATUS; stdcall; + {$EXTERNALSYM GdipGetPathGradientCenterColor} + + function GdipSetPathGradientCenterColor(brush: GPPATHGRADIENT; + colors: ARGB): GPSTATUS; stdcall; + {$EXTERNALSYM GdipSetPathGradientCenterColor} + + function GdipGetPathGradientSurroundColorsWithCount(brush: GPPATHGRADIENT; + color: PARGB; var count: Integer): GPSTATUS; stdcall; + {$EXTERNALSYM GdipGetPathGradientSurroundColorsWithCount} + + function GdipSetPathGradientSurroundColorsWithCount(brush: GPPATHGRADIENT; + color: PARGB; var count: Integer): GPSTATUS; stdcall; + {$EXTERNALSYM GdipSetPathGradientSurroundColorsWithCount} + + function GdipGetPathGradientCenterPoint(brush: GPPATHGRADIENT; + points: GPPOINTF): GPSTATUS; stdcall; + {$EXTERNALSYM GdipGetPathGradientCenterPoint} + + function GdipGetPathGradientCenterPointI(brush: GPPATHGRADIENT; + points: GPPOINT): GPSTATUS; stdcall; + {$EXTERNALSYM GdipGetPathGradientCenterPointI} + + function GdipSetPathGradientCenterPoint(brush: GPPATHGRADIENT; + points: GPPOINTF): GPSTATUS; stdcall; + {$EXTERNALSYM GdipSetPathGradientCenterPoint} + + function GdipSetPathGradientCenterPointI(brush: GPPATHGRADIENT; + points: GPPOINT): GPSTATUS; stdcall; + {$EXTERNALSYM GdipSetPathGradientCenterPointI} + + function GdipGetPathGradientPointCount(brush: GPPATHGRADIENT; + var count: Integer): GPSTATUS; stdcall; + {$EXTERNALSYM GdipGetPathGradientPointCount} + + function GdipGetPathGradientSurroundColorCount(brush: GPPATHGRADIENT; + var count: Integer): GPSTATUS; stdcall; + {$EXTERNALSYM GdipGetPathGradientSurroundColorCount} + +//---------------------------------------------------------------------------- +// Pen APIs +//---------------------------------------------------------------------------- + + function GdipCreatePen1(color: ARGB; width: Single; unit_: GPUNIT; + out pen: GPPEN): GPSTATUS; stdcall; + {$EXTERNALSYM GdipCreatePen1} + + function GdipDeletePen(pen: GPPEN): GPSTATUS; stdcall; + {$EXTERNALSYM GdipDeletePen} + +//---------------------------------------------------------------------------- +// Graphics APIs +//---------------------------------------------------------------------------- + + function GdipFlush(graphics: GPGRAPHICS; + intention: GPFLUSHINTENTION): GPSTATUS; stdcall; + {$EXTERNALSYM GdipFlush} + + function GdipCreateFromHDC(hdc: HDC; + out graphics: GPGRAPHICS): GPSTATUS; stdcall; + {$EXTERNALSYM GdipCreateFromHDC} + + function GdipDeleteGraphics(graphics: GPGRAPHICS): GPSTATUS; stdcall; + {$EXTERNALSYM GdipDeleteGraphics} + + function GdipGetDC(graphics: GPGRAPHICS; var hdc: HDC): GPSTATUS; stdcall; + {$EXTERNALSYM GdipGetDC} + + function GdipReleaseDC(graphics: GPGRAPHICS; hdc: HDC): GPSTATUS; stdcall; + {$EXTERNALSYM GdipReleaseDC} + + function GdipSetSmoothingMode(graphics: GPGRAPHICS; + smoothingMode: SMOOTHINGMODE): GPSTATUS; stdcall; + {$EXTERNALSYM GdipSetSmoothingMode} + + function GdipGetSmoothingMode(graphics: GPGRAPHICS; + var smoothingMode: SMOOTHINGMODE): GPSTATUS; stdcall; + {$EXTERNALSYM GdipGetSmoothingMode} + + function GdipSetTextRenderingHint(graphics: GPGRAPHICS; + mode: TEXTRENDERINGHINT): GPSTATUS; stdcall; + {$EXTERNALSYM GdipSetTextRenderingHint} + + function GdipGetTextRenderingHint(graphics: GPGRAPHICS; + var mode: TEXTRENDERINGHINT): GPSTATUS; stdcall; + {$EXTERNALSYM GdipGetTextRenderingHint} + + function GdipDrawRectangle(graphics: GPGRAPHICS; pen: GPPEN; x: Single; + y: Single; width: Single; height: Single): GPSTATUS; stdcall; + {$EXTERNALSYM GdipDrawRectangle} + + function GdipDrawRectangleI(graphics: GPGRAPHICS; pen: GPPEN; x: Integer; + y: Integer; width: Integer; height: Integer): GPSTATUS; stdcall; + {$EXTERNALSYM GdipDrawRectangleI} + + + function GdipDrawPath(graphics: GPGRAPHICS; pen: GPPEN; + path: GPPATH): GPSTATUS; stdcall; + {$EXTERNALSYM GdipDrawPath} + + function GdipFillRectangle(graphics: GPGRAPHICS; brush: GPBRUSH; x: Single; + y: Single; width: Single; height: Single): GPSTATUS; stdcall; + {$EXTERNALSYM GdipFillRectangle} + + function GdipFillPath(graphics: GPGRAPHICS; brush: GPBRUSH; + path: GPPATH): GPSTATUS; stdcall; + {$EXTERNALSYM GdipFillPath} + + function GdipDrawImageI(graphics: GPGRAPHICS; image: GPIMAGE; x: Integer; + y: Integer): GPSTATUS; stdcall; + {$EXTERNALSYM GdipDrawImageI} + + function GdipDrawImage(graphics: GPGRAPHICS; image: GPIMAGE; x: Single; + y: Single): GPSTATUS; stdcall; + {$EXTERNALSYM GdipDrawImage} + + function GdipDrawImageRect(graphics: GPGRAPHICS; image: GPIMAGE; x: Single; + y: Single; width: Single; height: Single): GPSTATUS; stdcall; + {$EXTERNALSYM GdipDrawImageRect} + + function GdipDrawImageRectI(graphics: GPGRAPHICS; image: GPIMAGE; x: Integer; + y: Integer; width: Integer; height: Integer): GPSTATUS; stdcall; + {$EXTERNALSYM GdipDrawImageRectI} + + function GdipGetImageRawFormat(image: GPIMAGE; + format: PGUID): GPSTATUS; stdcall; + {$EXTERNALSYM GdipGetImageRawFormat} + + function GdipGetPenDashStyle(pen: GPPEN; + out dashstyle: GPDASHSTYLE): GPSTATUS; stdcall; + {$EXTERNALSYM GdipGetPenDashStyle} + + function GdipSetPenDashStyle(pen: GPPEN; + dashstyle: GPDASHSTYLE): GPSTATUS; stdcall; + {$EXTERNALSYM GdipSetPenDashStyle} + + function GdipSetClipRect(graphics: GPGRAPHICS; x: Single; y: Single; + width: Single; height: Single; combineMode: COMBINEMODE): GPSTATUS; stdcall; + {$EXTERNALSYM GdipSetClipRect} + + function GdipSetClipRegion(graphics: GPGRAPHICS; region: GPREGION; + combineMode: COMBINEMODE): GPSTATUS; stdcall; + {$EXTERNALSYM GdipSetClipRegion} + + function GdipCreateRegionRect(rect: GPRECTF; + out region: GPREGION): GPSTATUS; stdcall; + {$EXTERNALSYM GdipCreateRegionRect} + + function GdipCreateRegionPath(path: GPPATH; + out region: GPREGION): GPSTATUS; stdcall; + {$EXTERNALSYM GdipCreateRegionPath} + + function GdipDeleteRegion(region: GPREGION): GPSTATUS; stdcall; + {$EXTERNALSYM GdipDeleteRegion} + + function GdipCombineRegionPath(region: GPREGION; path: GPPATH; + combineMode: COMBINEMODE): GPSTATUS; stdcall; + {$EXTERNALSYM GdipCombineRegionPath} + + function GdipCombineRegionRegion(region: GPREGION; region2: GPREGION; + combineMode: COMBINEMODE): GPSTATUS; stdcall; + {$EXTERNALSYM GdipCombineRegionRegion} + +//---------------------------------------------------------------------------- +// FontFamily APIs +//---------------------------------------------------------------------------- + + function GdipCreateFontFamilyFromName(name: PWCHAR; + fontCollection: GPFONTCOLLECTION; + out FontFamily: GPFONTFAMILY): GPSTATUS; stdcall; + {$EXTERNALSYM GdipCreateFontFamilyFromName} + + function GdipDeleteFontFamily(FontFamily: GPFONTFAMILY): GPSTATUS; stdcall; + {$EXTERNALSYM GdipDeleteFontFamily} + +//---------------------------------------------------------------------------- +// Font APIs +//---------------------------------------------------------------------------- + + function GdipCreateFont(fontFamily: GPFONTFAMILY; emSize: Single; + style: Integer; unit_: Integer; out font: GPFONT): GPSTATUS; stdcall; + {$EXTERNALSYM GdipCreateFont} + + function GdipDeleteFont(font: GPFONT): GPSTATUS; stdcall; + {$EXTERNALSYM GdipDeleteFont} + +//---------------------------------------------------------------------------- +// Image APIs +//---------------------------------------------------------------------------- + + function GdipLoadImageFromStream(stream: ISTREAM; + out image: GPIMAGE): GPSTATUS; stdcall; + {$EXTERNALSYM GdipLoadImageFromStream} + + function GdipLoadImageFromFileICM(filename: PWCHAR; + out image: GPIMAGE): GPSTATUS; stdcall; + {$EXTERNALSYM GdipLoadImageFromFileICM} + + function GdipLoadImageFromFile(filename: PWCHAR; + out image: GPIMAGE): GPSTATUS; stdcall; + {$EXTERNALSYM GdipLoadImageFromFile} + + function GdipLoadImageFromStreamICM(stream: ISTREAM; + out image: GPIMAGE): GPSTATUS; stdcall; + {$EXTERNALSYM GdipLoadImageFromStreamICM} + + function GdipDisposeImage(image: GPIMAGE): GPSTATUS; stdcall; + {$EXTERNALSYM GdipDisposeImage} + + function GdipGetImageWidth(image: GPIMAGE; var width: UINT): GPSTATUS; stdcall; + {$EXTERNALSYM GdipGetImageWidth} + + function GdipGetImageHeight(image: GPIMAGE; var height: UINT): GPSTATUS; stdcall; + {$EXTERNALSYM GdipGetImageHeight} + + +//---------------------------------------------------------------------------- +// Text APIs +//---------------------------------------------------------------------------- + + function GdipDrawString(graphics: GPGRAPHICS; string_: PWCHAR; + length: Integer; font: GPFONT; layoutRect: PGPRectF; + stringFormat: GPSTRINGFORMAT; brush: GPBRUSH): GPSTATUS; stdcall; + {$EXTERNALSYM GdipDrawString} + + function GdipMeasureString(graphics: GPGRAPHICS; string_: PWCHAR; + length: Integer; font: GPFONT; layoutRect: PGPRectF; + stringFormat: GPSTRINGFORMAT; boundingBox: PGPRectF; + codepointsFitted: PInteger; linesFilled: PInteger): GPSTATUS; stdcall; + {$EXTERNALSYM GdipMeasureString} + + function GdipSetStringFormatHotkeyPrefix(format: GPSTRINGFORMAT; + hotkeyPrefix: Integer): GPSTATUS; stdcall; + {$EXTERNALSYM GdipSetStringFormatHotkeyPrefix} + + function GdipGetStringFormatHotkeyPrefix(format: GPSTRINGFORMAT; + out hotkeyPrefix: Integer): GPSTATUS; stdcall; + {$EXTERNALSYM GdipGetStringFormatHotkeyPrefix} + +//---------------------------------------------------------------------------- +// String format APIs +//---------------------------------------------------------------------------- + + function GdipCreateStringFormat(formatAttributes: Integer; language: LANGID; + out format: GPSTRINGFORMAT): GPSTATUS; stdcall; + {$EXTERNALSYM GdipCreateStringFormat} + + function GdipDeleteStringFormat(format: GPSTRINGFORMAT): GPSTATUS; stdcall; + {$EXTERNALSYM GdipDeleteStringFormat} + + function GdipCloneStringFormat(format: GPSTRINGFORMAT; + out newFormat: GPSTRINGFORMAT): GPSTATUS; stdcall; + {$EXTERNALSYM GdipCloneStringFormat} + + function GdipSetStringFormatAlign(format: GPSTRINGFORMAT; + align: STRINGALIGNMENT): GPSTATUS; stdcall; + {$EXTERNALSYM GdipSetStringFormatAlign} + + function GdipGetStringFormatAlign(format: GPSTRINGFORMAT; + out align: STRINGALIGNMENT): GPSTATUS; stdcall; + {$EXTERNALSYM GdipGetStringFormatAlign} + + function GdipSetStringFormatLineAlign(format: GPSTRINGFORMAT; + align: STRINGALIGNMENT): GPSTATUS; stdcall; + {$EXTERNALSYM GdipSetStringFormatLineAlign} + + function GdipGetStringFormatLineAlign(format: GPSTRINGFORMAT; + out align: STRINGALIGNMENT): GPSTATUS; stdcall; + {$EXTERNALSYM GdipGetStringFormatLineAlign} + + + function GdipSetStringFormatTrimming(format: GPSTRINGFORMAT; + trimming: STRINGTRIMMING): GPSTATUS; stdcall; + {$EXTERNALSYM GdipSetStringFormatTrimming} + + function GdipGetStringFormatTrimming(format: GPSTRINGFORMAT; + out trimming: STRINGTRIMMING): GPSTATUS; stdcall; + {$EXTERNALSYM GdipGetStringFormatTrimming} + + function GdipSetCompositingQuality(graphics: GPGRAPHICS; + compositingQuality: COMPOSITINGQUALITY): GPSTATUS; stdcall; + {$EXTERNALSYM GdipSetCompositingQuality} + + function GdipGetCompositingQuality(graphics: GPGRAPHICS; + var compositingQuality: COMPOSITINGQUALITY): GPSTATUS; stdcall; + {$EXTERNALSYM GdipGetCompositingQuality} + + function GdipImageRotateFlip(image: GPIMAGE; rfType: ROTATEFLIPTYPE): GPSTATUS; stdcall; + {$EXTERNALSYM GdipImageRotateFlip} + + function GdipCreateBitmapFromStreamICM(stream: ISTREAM; + out bitmap: GPBITMAP): GPSTATUS; stdcall; + {$EXTERNALSYM GdipCreateBitmapFromStreamICM} + + function GdipCreateBitmapFromStream(stream: ISTREAM; + out bitmap: GPBITMAP): GPSTATUS; stdcall; + {$EXTERNALSYM GdipCreateBitmapFromStream} + + function GdipCreateBitmapFromScan0(width: Integer; height: Integer; + stride: Integer; format: PIXELFORMAT; scan0: PBYTE; + out bitmap: GPBITMAP): GPSTATUS; stdcall; + {$EXTERNALSYM GdipCreateBitmapFromScan0} + + function GdipBitmapGetPixel(bitmap: GPBITMAP; x: Integer; y: Integer; + var color: ARGB): GPSTATUS; stdcall; + {$EXTERNALSYM GdipBitmapGetPixel} + + function GdipBitmapSetPixel(bitmap: GPBITMAP; x: Integer; y: Integer; + color: ARGB): GPSTATUS; stdcall; + {$EXTERNALSYM GdipBitmapSetPixel} + + function GdipSetPenEndCap(pen: GPPEN; endCap: GPLINECAP): GPSTATUS; stdcall; + {$EXTERNALSYM GdipSetPenEndCap} + + function GdipAddPathLine2I(path: GPPATH; points: GPPOINT; + count: Integer): GPSTATUS; stdcall; + {$EXTERNALSYM GdipAddPathLine2I} + + + function GdipAddPathPolygon(path: GPPATH; points: GPPOINTF; + count: Integer): GPSTATUS; stdcall; + {$EXTERNALSYM GdipAddPathPolygon} + + function GdipAddPathPolygonI(path: GPPATH; points: GPPOINT; + count: Integer): GPSTATUS; stdcall; + {$EXTERNALSYM GdipAddPathPolygonI} + + function GdipAddPathCurveI(path: GPPATH; points: GPPOINT; + count: Integer): GPSTATUS; stdcall; + {$EXTERNALSYM GdipAddPathCurveI} + + function GdipAddPathCurve(path: GPPATH; points: GPPOINTF; + count: Integer): GPSTATUS; stdcall; + {$EXTERNALSYM GdipAddPathCurve} + + function GdipAddPathCurve2I(path: GPPATH; points: GPPOINT; count: Integer; + tension: Single): GPSTATUS; stdcall; + {$EXTERNALSYM GdipAddPathCurve2I} + + function GdipResetClip(graphics: GPGRAPHICS): GPSTATUS; stdcall; + {$EXTERNALSYM GdipResetClip} + + function GdipAddPathBezier(path: GPPATH; + x1, y1, x2, y2, x3, y3, x4, y4: Single): GPSTATUS; stdcall; + {$EXTERNALSYM GdipAddPathBezier} + +//*************************************************************************** +//--------------------------------------------------------------------------- +// GDI+ classes for forward reference +//--------------------------------------------------------------------------- + +type + TGPGraphics = class; + TGPPen = class; + TGPBrush = class; + TGPFontFamily = class; + TGPGraphicsPath = class; + TGPSolidBrush = class; + TGPLinearGradientBrush = class; + TGPPathGradientBrush = class; + TGPFont = class; + TGPFontCollection = class; + +//------------------------------------------------------------------------------ +// GPRegion +//------------------------------------------------------------------------------ + TGPRegion = class(TGdiplusBase) + protected + nativeRegion: GpRegion; + lastResult: TStatus; + function SetStatus(status: TStatus): TStatus; + procedure SetNativeRegion(nativeRegion: GpRegion); + public + constructor Create(rect: TGPRectF); reintroduce; overload; + constructor Create(path: TGPGraphicsPath); reintroduce; overload; + destructor Destroy; override; + function Exclude(path: TGPGraphicsPath): TStatus; overload; + function Union(region: TGPRegion): TStatus; overload; + end; + +//-------------------------------------------------------------------------- +// FontFamily +//-------------------------------------------------------------------------- + + TGPFontFamily = class(TGdiplusBase) + protected + nativeFamily: GpFontFamily; + lastResult: TStatus; + function SetStatus(status: TStatus): TStatus; + public + constructor Create(nativeOrig: GpFontFamily; status: TStatus); reintroduce; overload; + constructor Create(name: WideString; fontCollection: TGPFontCollection = nil); reintroduce; overload; + destructor Destroy; override; + property Status: TStatus read lastResult; + end; + +//-------------------------------------------------------------------------- +// Font Collection +//-------------------------------------------------------------------------- + + TGPFontCollection = class(TGdiplusBase) + protected + nativeFontCollection: GpFontCollection; + lastResult: TStatus; + function SetStatus(status: TStatus): TStatus; + public + constructor Create; + destructor Destroy; override; + end; + +//-------------------------------------------------------------------------- +// TFont +//-------------------------------------------------------------------------- + + TGPFont = class(TGdiplusBase) + protected + nativeFont: GpFont; + lastResult: TStatus; + procedure SetNativeFont(Font: GpFont); + function SetStatus(status: TStatus): TStatus; + public + constructor Create(font: GpFont; status: TStatus); reintroduce; overload; + constructor Create(family: TGPFontFamily; emSize: Single; + style: TFontStyle = FontStyleRegular; + unit_: TUnit = UnitPoint); reintroduce; overload; + destructor Destroy; override; + property Status: TStatus read lastResult; + end; + +(**************************************************************************\ +* +* GDI+ Brush class +* +\**************************************************************************) + + //-------------------------------------------------------------------------- + // Abstract base class for various brush types + //-------------------------------------------------------------------------- + + TGPBrush = class(TGdiplusBase) + protected + nativeBrush: GpBrush; + lastResult: TStatus; + procedure SetNativeBrush(nativeBrush: GpBrush); + function SetStatus(status: TStatus): TStatus; + public + constructor Create(nativeBrush: GpBrush; status: TStatus); reintroduce; overload; + constructor Create; overload; + destructor Destroy; override; + end; + + //-------------------------------------------------------------------------- + // Solid Fill Brush Object + //-------------------------------------------------------------------------- + + TGPSolidBrush = class(TGPBrush) + public + constructor Create(color: TGPColor); reintroduce; overload; + constructor Create; reintroduce; overload; + end; + + //-------------------------------------------------------------------------- + // Linear Gradient Brush Object + //-------------------------------------------------------------------------- + + TGPLinearGradientBrush = class(TGPBrush) + public + constructor Create; reintroduce; overload; + constructor Create(rect: TGPRectF; color1, color2: TGPColor; + mode: TLinearGradientMode); reintroduce; overload; + constructor Create(rect: TGPRect; color1, color2: TGPColor; + mode: TLinearGradientMode); reintroduce; overload; + end; + +(**************************************************************************\ +* +* GDI+ Pen class +* +\**************************************************************************) + +//-------------------------------------------------------------------------- +// Pen class +//-------------------------------------------------------------------------- + + TGPPen = class(TGdiplusBase) + protected + nativePen: GpPen; + lastResult: TStatus; + procedure SetNativePen(nativePen: GpPen); + function SetStatus(status: TStatus): TStatus; + public + constructor Create(nativePen: GpPen; status: TStatus); reintroduce; overload; + constructor Create(color: TGPColor; width: Single = 1.0); reintroduce; overload; + destructor Destroy; override; + function GetDashStyle: TDashStyle; + function SetDashStyle(dashStyle: TDashStyle): TStatus; + function SetEndCap(endCap: TLineCap): TStatus; + end; + +(**************************************************************************\ +* +* GDI+ StringFormat class +* +\**************************************************************************) + + TGPStringFormat = class(TGdiplusBase) + protected + nativeFormat: GpStringFormat; + lastError: TStatus; + function SetStatus(newStatus: GpStatus): TStatus; + procedure Assign(source: TGPStringFormat); + public + constructor Create(clonedStringFormat: GpStringFormat; status: TStatus); reintroduce; overload; + constructor Create(formatFlags: Integer = 0; language: LANGID = LANG_NEUTRAL); reintroduce; overload; + destructor Destroy; override; + function SetAlignment(align: TStringAlignment): TStatus; + function GetAlignment: TStringAlignment; + function SetLineAlignment(align: TStringAlignment): TStatus; + function GetLineAlignment: TStringAlignment; + function SetTrimming(trimming: TStringTrimming): TStatus; + function GetTrimming: TStringTrimming; + function SetHotkeyPrefix(hotkeyPrefix: THotkeyPrefix): TStatus; + function GetHotkeyPrefix: THotkeyPrefix; + + end; + +(**************************************************************************\ +* +* GDI+ Graphics Path class +* +\**************************************************************************) + + TGPGraphicsPath = class(TGdiplusBase) + protected + nativePath: GpPath; + lastResult: TStatus; + procedure SetNativePath(nativePath: GpPath); + function SetStatus(status: TStatus): TStatus; + public + constructor Create(nativePath: GpPath); reintroduce; overload; + constructor Create(fillMode: TFillMode = FillModeAlternate); reintroduce; overload; + destructor Destroy; override; + + function CloseFigure: TStatus; + + function AddLine(const pt1, pt2: TGPPointF): TStatus; overload; + function AddLine(x1, y1, x2, y2: Single): TStatus; overload; + function AddLines(points: PGPPoint; count: Integer): TStatus; overload; + + function AddArc(rect: TGPRectF; startAngle, sweepAngle: Single): TStatus; overload; + function AddArc(x, y, width, height, startAngle, sweepAngle: Single): TStatus; overload; + + function AddEllipse(rect: TGPRectF): TStatus; overload; + function AddEllipse(x, y, width, height: Single): TStatus; overload; + + function AddPie(rect: TGPRectF; startAngle, sweepAngle: Single): TStatus; overload; + function AddPie(x, y, width, height, startAngle, sweepAngle: Single): TStatus; overload; + + function AddPolygon(points: PGPPointF; count: Integer): TStatus; overload; + function AddPolygon(points: PGPPoint; count: Integer): TStatus; overload; + + + function AddCurve(points: PGPPointF; count: Integer): TStatus; overload; + function AddCurve(points: PGPPoint; count: Integer): TStatus; overload; + function AddCurve(points: PGPPoint; count: Integer; tension: Single): TStatus; overload; + + function AddBezier(pt1, pt2, pt3, pt4: TGPPoint): TStatus; overload; + function AddBezier(pt1, pt2, pt3, pt4: TGPPointF): TStatus; overload; + function AddBezier(x1, y1, x2, y2, x3, y3, x4, y4: Single): TStatus; overload; + end; + +//-------------------------------------------------------------------------- +// Path Gradient Brush +//-------------------------------------------------------------------------- + + TGPPathGradientBrush = class(TGPBrush) + public + {constructor Create(points: PGPPointF; count: Integer; + wrapMode: TWrapMode = WrapModeClamp); reintroduce; overload; } + constructor Create(path: TGPGraphicsPath); reintroduce; //overload; + function GetCenterColor(out Color: TGPColor): TStatus; + function SetCenterColor(color: TGPColor): TStatus; + function GetPointCount: Integer; + function GetSurroundColors(colors: PARGB; var count: Integer): TStatus; + function SetSurroundColors(colors: PARGB; var count: Integer): TStatus; + function GetCenterPoint(out point: TGPPointF): TStatus; overload; + function GetCenterPoint(out point: TGPPoint): TStatus; overload; + function SetCenterPoint(point: TGPPointF): TStatus; overload; + function SetCenterPoint(point: TGPPoint): TStatus; overload; + end; + +(**************************************************************************\ +* TGPImage +***************************************************************************) + TGPImageFormat = (ifUndefined, ifMemoryBMP, ifBMP, ifEMF, ifWMF, ifJPEG, + ifPNG, ifGIF, ifTIFF, ifEXIF, ifIcon); + + TGPImage = class(TGdiplusBase) + protected + nativeImage: GpImage; + lastResult: TStatus; + loadStatus: TStatus; + procedure SetNativeImage(nativeImage: GpImage); + function SetStatus(status: TStatus): TStatus; + public + constructor Create(nativeImage: GpImage; status: TStatus); reintroduce; overload; + constructor Create(filename: WideString; useEmbeddedColorManagement: BOOL = FALSE); reintroduce; overload; + constructor Create(stream: IStream; useEmbeddedColorManagement: BOOL = FALSE); reintroduce; overload; + destructor Destroy; override; + function GetFormat: TGPImageFormat; + function GetWidth: UINT; + function GetHeight: UINT; + function RotateFlip(rotateFlipType: TRotateFlipType): TStatus; + end; + + TGPBitmap = class(TGPImage) + protected + constructor Create(nativeBitmap: GpBitmap); reintroduce; overload; + public + constructor Create(stream: IStream; useEmbeddedColorManagement: BOOL = FALSE); reintroduce; overload; + constructor Create(width, height: Integer; format: TPixelFormat = PixelFormat32bppARGB); reintroduce; overload; + function FromStream(stream: IStream; useEmbeddedColorManagement: BOOL = FALSE): TGPBitmap; + function GetPixel(x, y: Integer; out color: TGPColor): TStatus; + function SetPixel(x, y: Integer; color: TGPColor): TStatus; + end; + +(**************************************************************************\ +* +* GDI+ Graphics Object +* +\**************************************************************************) + + TGPGraphics = class(TGdiplusBase) + protected + nativeGraphics: GpGraphics; + lastResult: TStatus; + procedure SetNativeGraphics(graphics: GpGraphics); + function SetStatus(status: TStatus): TStatus; + function GetNativeGraphics: GpGraphics; + public + //constructor Create(graphics: GpGraphics); reintroduce; overload; + constructor Create(hdc: HDC); reintroduce; overload; + destructor Destroy; override; + procedure Flush(intention: TFlushIntention = FlushIntentionFlush); + //------------------------------------------------------------------------ + // GDI Interop methods + //------------------------------------------------------------------------ + // Locks the graphics until ReleaseDC is called + function GetHDC: HDC; + procedure ReleaseHDC(hdc: HDC); + //------------------------------------------------------------------------ + // Rendering modes + //------------------------------------------------------------------------ + function SetCompositingQuality(compositingQuality: TCompositingQuality): TStatus; + function GetCompositingQuality: TCompositingQuality; + + function SetTextRenderingHint(newMode: TTextRenderingHint): TStatus; + function GetTextRenderingHint: TTextRenderingHint; + function GetSmoothingMode: TSmoothingMode; + function SetSmoothingMode(smoothingMode: TSmoothingMode): TStatus; + // DrawPath + function DrawPath(pen: TGPPen; path: TGPGraphicsPath): TStatus; + // FillRectangle(s) + function FillRectangle(brush: TGPBrush; const rect: TGPRectF): TStatus; overload; + function FillRectangle(brush: TGPBrush; x, y, width, height: Single): TStatus; overload; + // DrawString + function DrawString(string_: String; length: Integer; font: TGPFont; + const layoutRect: TGPRectF; stringFormat: TGPStringFormat; brush: TGPBrush): TStatus; overload; + {$IFDEF DELPHI6_LVL} + function DrawString(string_: widestring; length: Integer; font: TGPFont; + const layoutRect: TGPRectF; stringFormat: TGPStringFormat; brush: TGPBrush): TStatus; overload; + {$ENDIF} + // MeasureString + function MeasureString(string_: WideString; length: Integer; font: TGPFont; + const layoutRect: TGPRectF; stringFormat: TGPStringFormat; out boundingBox: TGPRectF; + codepointsFitted: PInteger = nil; linesFilled: PInteger = nil): TStatus; overload; + function GetLastStatus: TStatus; + // DrawRectangle + function DrawRectangle(pen: TGPPen; const rect: TGPRectF): TStatus; overload; + function DrawRectangle(pen: TGPPen; x, y, width, height: Single): TStatus; overload; + // DrawImage + function DrawImage(image: TGPImage; x, y: Integer): TStatus; overload; + function DrawImageRect(image: TGPImage; x, y, w, h: Integer): TStatus; overload; + // FillPath + function FillPath(brush: TGPBrush; path: TGPGraphicsPath): TStatus; + // Clip + function ExcludeClip(const rect: TGPRectF): TStatus; overload; + function ExcludeClip(region: TGPRegion): TStatus; overload; + function SetClip(region: TGPRegion; combineMode: TCombineMode = CombineModeReplace): TStatus; + function ResetClip: TStatus; + end; + + function ColorToARGB(Color: TColor): ARGB; + +//////////////////////////////////////////////////////////////////////////////// + +var + StartupInput: TGDIPlusStartupInput; + StartupOutput: TGdiplusStartupOutput; + gdiplusToken: ULONG; + + + +implementation + +function ColorToARGB(Color: TColor): ARGB; +var + c: TColor; +begin + c := ColorToRGB(Color); + Result := ARGB( $FF000000 or ((DWORD(c) and $FF) shl 16) or ((DWORD(c) and $FF00) or ((DWORD(c) and $ff0000) shr 16))); +end; + + + function GdipAlloc; external WINGDIPDLL name 'GdipAlloc'; + procedure GdipFree; external WINGDIPDLL name 'GdipFree'; + function GdiplusStartup; external WINGDIPDLL name 'GdiplusStartup'; + procedure GdiplusShutdown; external WINGDIPDLL name 'GdiplusShutdown'; + + function GdipCreatePath; external WINGDIPDLL name 'GdipCreatePath'; + function GdipDeletePath; external WINGDIPDLL name 'GdipDeletePath'; + //function GdipStartPathFigure; external WINGDIPDLL name 'GdipStartPathFigure'; + function GdipClosePathFigure; external WINGDIPDLL name 'GdipClosePathFigure'; + function GdipAddPathLine; external WINGDIPDLL name 'GdipAddPathLine'; + function GdipAddPathArc; external WINGDIPDLL name 'GdipAddPathArc'; + function GdipAddPathEllipse; external WINGDIPDLL name 'GdipAddPathEllipse'; + function GdipAddPathPie; external WINGDIPDLL name 'GdipAddPathPie'; + function GdipDeleteBrush; external WINGDIPDLL name 'GdipDeleteBrush'; + function GdipCreateSolidFill; external WINGDIPDLL name 'GdipCreateSolidFill'; + function GdipCreateLineBrushFromRect; external WINGDIPDLL name 'GdipCreateLineBrushFromRect'; + function GdipCreateLineBrushFromRectI; external WINGDIPDLL name 'GdipCreateLineBrushFromRectI'; + function GdipCreateLineBrushFromRectWithAngle; external WINGDIPDLL name 'GdipCreateLineBrushFromRectWithAngle'; + function GdipCreatePathGradient; external WINGDIPDLL name 'GdipCreatePathGradient'; + function GdipCreatePathGradientFromPath; external WINGDIPDLL name 'GdipCreatePathGradientFromPath'; + function GdipGetPathGradientCenterColor; external WINGDIPDLL name 'GdipGetPathGradientCenterColor'; + function GdipSetPathGradientCenterColor; external WINGDIPDLL name 'GdipSetPathGradientCenterColor'; + function GdipGetPathGradientSurroundColorsWithCount; external WINGDIPDLL name 'GdipGetPathGradientSurroundColorsWithCount'; + function GdipSetPathGradientSurroundColorsWithCount; external WINGDIPDLL name 'GdipSetPathGradientSurroundColorsWithCount'; + function GdipGetPathGradientCenterPoint; external WINGDIPDLL name 'GdipGetPathGradientCenterPoint'; + function GdipGetPathGradientCenterPointI; external WINGDIPDLL name 'GdipGetPathGradientCenterPointI'; + function GdipSetPathGradientCenterPoint; external WINGDIPDLL name 'GdipSetPathGradientCenterPoint'; + function GdipSetPathGradientCenterPointI; external WINGDIPDLL name 'GdipSetPathGradientCenterPointI'; + function GdipGetPathGradientPointCount; external WINGDIPDLL name 'GdipGetPathGradientPointCount'; + function GdipGetPathGradientSurroundColorCount; external WINGDIPDLL name 'GdipGetPathGradientSurroundColorCount'; + function GdipCreatePen1; external WINGDIPDLL name 'GdipCreatePen1'; + function GdipDeletePen; external WINGDIPDLL name 'GdipDeletePen'; + function GdipFlush; external WINGDIPDLL name 'GdipFlush'; + function GdipCreateFromHDC; external WINGDIPDLL name 'GdipCreateFromHDC'; + function GdipDeleteGraphics; external WINGDIPDLL name 'GdipDeleteGraphics'; + function GdipGetDC; external WINGDIPDLL name 'GdipGetDC'; + function GdipReleaseDC; external WINGDIPDLL name 'GdipReleaseDC'; + function GdipSetSmoothingMode; external WINGDIPDLL name 'GdipSetSmoothingMode'; + function GdipGetSmoothingMode; external WINGDIPDLL name 'GdipGetSmoothingMode'; + function GdipSetTextRenderingHint; external WINGDIPDLL name 'GdipSetTextRenderingHint'; + function GdipGetTextRenderingHint; external WINGDIPDLL name 'GdipGetTextRenderingHint'; + function GdipDrawPath; external WINGDIPDLL name 'GdipDrawPath'; + function GdipFillRectangle; external WINGDIPDLL name 'GdipFillRectangle'; + function GdipCreateFontFamilyFromName; external WINGDIPDLL name 'GdipCreateFontFamilyFromName'; + function GdipDeleteFontFamily; external WINGDIPDLL name 'GdipDeleteFontFamily'; + function GdipCreateFont; external WINGDIPDLL name 'GdipCreateFont'; + function GdipDeleteFont; external WINGDIPDLL name 'GdipDeleteFont'; + function GdipDrawString; external WINGDIPDLL name 'GdipDrawString'; + function GdipMeasureString; external WINGDIPDLL name 'GdipMeasureString'; + function GdipCreateStringFormat; external WINGDIPDLL name 'GdipCreateStringFormat'; + function GdipDeleteStringFormat; external WINGDIPDLL name 'GdipDeleteStringFormat'; + function GdipCloneStringFormat; external WINGDIPDLL name 'GdipCloneStringFormat'; + function GdipSetStringFormatAlign; external WINGDIPDLL name 'GdipSetStringFormatAlign'; + function GdipGetStringFormatAlign; external WINGDIPDLL name 'GdipGetStringFormatAlign'; + function GdipSetStringFormatLineAlign; external WINGDIPDLL name 'GdipSetStringFormatLineAlign'; + function GdipGetStringFormatLineAlign; external WINGDIPDLL name 'GdipGetStringFormatLineAlign'; + function GdipSetStringFormatTrimming; external WINGDIPDLL name 'GdipSetStringFormatTrimming'; + function GdipGetStringFormatTrimming; external WINGDIPDLL name 'GdipGetStringFormatTrimming'; + function GdipGetImageRawFormat; external WINGDIPDLL name 'GdipGetImageRawFormat'; + function GdipDrawImage; external WINGDIPDLL name 'GdipDrawImage'; + function GdipDrawImageI; external WINGDIPDLL name 'GdipDrawImageI'; + function GdipDrawImageRect; external WINGDIPDLL name 'GdipDrawImageRect'; + function GdipDrawImageRectI; external WINGDIPDLL name 'GdipDrawImageRectI'; + function GdipDrawRectangle; external WINGDIPDLL name 'GdipDrawRectangle'; + function GdipDrawRectangleI; external WINGDIPDLL name 'GdipDrawRectangleI'; + function GdipFillPath; external WINGDIPDLL name 'GdipFillPath'; + function GdipLoadImageFromFileICM; external WINGDIPDLL name 'GdipLoadImageFromFileICM'; + function GdipLoadImageFromFile; external WINGDIPDLL name 'GdipLoadImageFromFile'; + function GdipLoadImageFromStream; external WINGDIPDLL name 'GdipLoadImageFromStream'; + function GdipLoadImageFromStreamICM; external WINGDIPDLL name 'GdipLoadImageFromStreamICM'; + function GdipDisposeImage; external WINGDIPDLL name 'GdipDisposeImage'; + function GdipGetImageWidth; external WINGDIPDLL name 'GdipGetImageWidth'; + function GdipGetImageHeight; external WINGDIPDLL name 'GdipGetImageHeight'; + function GdipGetPenDashStyle; external WINGDIPDLL name 'GdipGetPenDashStyle'; + function GdipSetPenDashStyle; external WINGDIPDLL name 'GdipSetPenDashStyle'; + function GdipSetStringFormatHotkeyPrefix; external WINGDIPDLL name 'GdipSetStringFormatHotkeyPrefix'; + function GdipGetStringFormatHotkeyPrefix; external WINGDIPDLL name 'GdipGetStringFormatHotkeyPrefix'; + function GdipSetClipRect; external WINGDIPDLL name 'GdipSetClipRect'; + function GdipSetClipRegion; external WINGDIPDLL name 'GdipSetClipRegion'; + function GdipCreateRegionRect; external WINGDIPDLL name 'GdipCreateRegionRect'; + function GdipCreateRegionPath; external WINGDIPDLL name 'GdipCreateRegionPath'; + function GdipDeleteRegion; external WINGDIPDLL name 'GdipDeleteRegion'; + function GdipCombineRegionPath; external WINGDIPDLL name 'GdipCombineRegionPath'; + function GdipCombineRegionRegion; external WINGDIPDLL name 'GdipCombineRegionRegion'; + function GdipSetCompositingQuality; external WINGDIPDLL name 'GdipSetCompositingQuality'; + function GdipGetCompositingQuality; external WINGDIPDLL name 'GdipGetCompositingQuality'; + function GdipImageRotateFlip; external WINGDIPDLL name 'GdipImageRotateFlip'; + function GdipCreateBitmapFromStreamICM; external WINGDIPDLL name 'GdipCreateBitmapFromStreamICM'; + function GdipCreateBitmapFromStream; external WINGDIPDLL name 'GdipCreateBitmapFromStream'; + function GdipCreateBitmapFromScan0; external WINGDIPDLL name 'GdipCreateBitmapFromScan0'; + function GdipBitmapGetPixel; external WINGDIPDLL name 'GdipBitmapGetPixel'; + function GdipBitmapSetPixel; external WINGDIPDLL name 'GdipBitmapSetPixel'; + function GdipSetPenEndCap; external WINGDIPDLL name 'GdipSetPenEndCap'; + function GdipAddPathLine2I; external WINGDIPDLL name 'GdipAddPathLine2I'; + + function GdipAddPathPolygon; external WINGDIPDLL name 'GdipAddPathPolygon'; + function GdipAddPathPolygonI; external WINGDIPDLL name 'GdipAddPathPolygonI'; + function GdipAddPathCurveI; external WINGDIPDLL name 'GdipAddPathCurveI'; + function GdipAddPathCurve; external WINGDIPDLL name 'GdipAddPathCurve'; + function GdipAddPathCurve2I; external WINGDIPDLL name 'GdipAddPathCurve2I'; + function GdipResetClip; external WINGDIPDLL name 'GdipResetClip'; + function GdipAddPathBezier; external WINGDIPDLL name 'GdipAddPathBezier'; +// ----------------------------------------------------------------------------- +// TGdiplusBase class +// ----------------------------------------------------------------------------- + + +class function TGdiplusBase.NewInstance: TObject; +var + p : pointer; + sz : ULONG; +begin + { Note: GidpAlloc may fail on Windows XP if application is started from + Delphi 2007 in debug mode. + The reason for this fix is to workaround the following problem: + After an application with a TAdvOfficeToolBar executes a standard TOpenDialog, + an exception is raised while drawing the officetoolbar. } + sz := ULONG(InstanceSize); + p := GdipAlloc(sz); + if not Assigned(p) then + begin + //GdipAlloc failed --> restart GDI+ and try again + GdiplusStartup(gdiplusToken, @StartupInput, @StartupOutput); + p := GdipAlloc(sz); + end; + Result := InitInstance(p); +end; + +procedure TGdiplusBase.FreeInstance; +begin + CleanupInstance; + GdipFree(Self); +end; + + +//-------------------------------------------------------------------------- +// TGPPoint Util +//-------------------------------------------------------------------------- + +function MakePoint(X, Y: Integer): TGPPoint; +begin + result.X := X; + result.Y := Y; +end; + +function MakePoint(X, Y: Single): TGPPointF; +begin + Result.X := X; + result.Y := Y; +end; + +// ----------------------------------------------------------------------------- +// RectF class +// ----------------------------------------------------------------------------- + +function MakeRect(x, y, width, height: Single): TGPRectF; overload; +begin + Result.X := x; + Result.Y := y; + Result.Width := width; + Result.Height := height; +end; + + +//****************************************************************************** +(**************************************************************************\ +* +* GDI+ StringFormat class +* +\**************************************************************************) + +constructor TGPStringFormat.Create(formatFlags: Integer = 0; language: LANGID = LANG_NEUTRAL); +begin + nativeFormat := nil; + lastError := GdipCreateStringFormat(formatFlags, language, nativeFormat); +end; + +destructor TGPStringFormat.Destroy; +begin + GdipDeleteStringFormat(nativeFormat); +end; + +function TGPStringFormat.SetAlignment(align: TStringAlignment): TStatus; +begin + result := SetStatus(GdipSetStringFormatAlign(nativeFormat, align)); +end; + +function TGPStringFormat.GetAlignment: TStringAlignment; +begin + SetStatus(GdipGetStringFormatAlign(nativeFormat, result)); +end; + +function TGPStringFormat.SetLineAlignment(align: TStringAlignment): TStatus; +begin + result := SetStatus(GdipSetStringFormatLineAlign(nativeFormat, align)); +end; + +function TGPStringFormat.GetLineAlignment: TStringAlignment; +begin + SetStatus(GdipGetStringFormatLineAlign(nativeFormat, result)); +end; + + +function TGPStringFormat.SetTrimming(trimming: TStringTrimming): TStatus; +begin + result := SetStatus(GdipSetStringFormatTrimming(nativeFormat, trimming)); +end; + +function TGPStringFormat.GetTrimming: TStringTrimming; +begin + SetStatus(GdipGetStringFormatTrimming(nativeFormat, result)); +end; + +function TGPStringFormat.SetHotkeyPrefix(hotkeyPrefix: THotkeyPrefix): TStatus; +begin + result := SetStatus(GdipSetStringFormatHotkeyPrefix(nativeFormat, Integer(hotkeyPrefix))); +end; + +function TGPStringFormat.GetHotkeyPrefix: THotkeyPrefix; +var HotkeyPrefix: Integer; +begin + SetStatus(GdipGetStringFormatHotkeyPrefix(nativeFormat, HotkeyPrefix)); + result := THotkeyPrefix(HotkeyPrefix); +end; + + +function TGPStringFormat.SetStatus(newStatus: GpStatus): TStatus; +begin + if (newStatus <> Ok) then lastError := newStatus; + result := newStatus; +end; + +// operator = +procedure TGPStringFormat.Assign(source: TGPStringFormat); +begin + assert(assigned(source)); + GdipDeleteStringFormat(nativeFormat); + lastError := GdipCloneStringFormat(source.nativeFormat, nativeFormat); +end; + +constructor TGPStringFormat.Create(clonedStringFormat: GpStringFormat; status: TStatus); +begin + lastError := status; + nativeFormat := clonedStringFormat; +end; + +(**************************************************************************\ +* +* GDI+ Pen class +* +\**************************************************************************) + +//-------------------------------------------------------------------------- +// Pen class +//-------------------------------------------------------------------------- + +constructor TGPPen.Create(color: TGPColor; width: Single = 1.0); +var unit_: TUnit; +begin + unit_ := UnitWorld; + nativePen := nil; + lastResult := GdipCreatePen1(color, width, unit_, nativePen); +end; + +destructor TGPPen.Destroy; +begin + GdipDeletePen(nativePen); +end; + +constructor TGPPen.Create(nativePen: GpPen; status: TStatus); +begin + lastResult := status; + SetNativePen(nativePen); +end; + +procedure TGPPen.SetNativePen(nativePen: GpPen); +begin + self.nativePen := nativePen; +end; + +function TGPPen.SetStatus(status: TStatus): TStatus; +begin + if (status <> Ok) then lastResult := status; + result := status; +end; + +function TGPPen.GetDashStyle: TDashStyle; +begin + SetStatus(GdipGetPenDashStyle(nativePen, result)); +end; + +function TGPPen.SetDashStyle(dashStyle: TDashStyle): TStatus; +begin + result := SetStatus(GdipSetPenDashStyle(nativePen, dashStyle)); +end; + +function TGPPen.SetEndCap(endCap: TLineCap): TStatus; +begin + result := SetStatus(GdipSetPenEndCap(nativePen, endCap)); +end; + + +(**************************************************************************\ +* +* GDI+ Brush class +* +\**************************************************************************) + +//-------------------------------------------------------------------------- +// Abstract base class for various brush types +//-------------------------------------------------------------------------- + +destructor TGPBrush.Destroy; +begin + GdipDeleteBrush(nativeBrush); +end; + +constructor TGPBrush.Create; +begin + SetStatus(NotImplemented); +end; + +constructor TGPBrush.Create(nativeBrush: GpBrush; status: TStatus); +begin + lastResult := status; + SetNativeBrush(nativeBrush); +end; + +procedure TGPBrush.SetNativeBrush(nativeBrush: GpBrush); +begin + self.nativeBrush := nativeBrush; +end; + +function TGPBrush.SetStatus(status: TStatus): TStatus; +begin + if (status <> Ok) then lastResult := status; + result := status; +end; + +//-------------------------------------------------------------------------- +// Solid Fill Brush Object +//-------------------------------------------------------------------------- + +constructor TGPSolidBrush.Create(color: TGPColor); +var + brush: GpSolidFill; +begin + brush := nil; + lastResult := GdipCreateSolidFill(color, brush); + SetNativeBrush(brush); +end; + +constructor TGPSolidBrush.Create; +begin + // hide parent function +end; + +//-------------------------------------------------------------------------- +// Linear Gradient Brush Object +//-------------------------------------------------------------------------- + +constructor TGPLinearGradientBrush.Create(rect: TGPRectF; color1, color2: TGPColor; mode: TLinearGradientMode); +var brush: GpLineGradient; +begin + brush := nil; + lastResult := GdipCreateLineBrushFromRect(@rect, color1, + color2, mode, WrapModeTile, brush); + SetNativeBrush(brush); +end; + +constructor TGPLinearGradientBrush.Create(rect: TGPRect; color1, color2: TGPColor; mode: TLinearGradientMode); +var brush: GpLineGradient; +begin + brush := nil; + lastResult := GdipCreateLineBrushFromRectI(@rect, color1, + color2, mode, WrapModeTile, brush); + SetNativeBrush(brush); +end; + +constructor TGPLinearGradientBrush.Create; +begin + // hide parent function +end; + +(**************************************************************************\ +* +* GDI+ Graphics Object +* +\**************************************************************************) + +constructor TGPGraphics.Create(hdc: HDC); +var + graphics: GpGraphics; +begin + graphics:= nil; + lastResult := GdipCreateFromHDC(hdc, graphics); + SetNativeGraphics(graphics); +end; + +destructor TGPGraphics.Destroy; +begin + GdipDeleteGraphics(nativeGraphics); +end; + +procedure TGPGraphics.Flush(intention: TFlushIntention = FlushIntentionFlush); +begin + GdipFlush(nativeGraphics, intention); +end; + +//------------------------------------------------------------------------ +// GDI Interop methods +//------------------------------------------------------------------------ + +// Locks the graphics until ReleaseDC is called + +function TGPGraphics.GetHDC: HDC; +begin + SetStatus(GdipGetDC(nativeGraphics, result)); +end; + +procedure TGPGraphics.ReleaseHDC(hdc: HDC); +begin + SetStatus(GdipReleaseDC(nativeGraphics, hdc)); +end; + +function TGPGraphics.SetTextRenderingHint(newMode: TTextRenderingHint): TStatus; +begin + result := SetStatus(GdipSetTextRenderingHint(nativeGraphics, newMode)); +end; + +function TGPGraphics.GetTextRenderingHint: TTextRenderingHint; +begin + SetStatus(GdipGetTextRenderingHint(nativeGraphics, result)); +end; + +function TGPGraphics.GetSmoothingMode: TSmoothingMode; +var + smoothingMode: TSmoothingMode; +begin + smoothingMode := SmoothingModeInvalid; + SetStatus(GdipGetSmoothingMode(nativeGraphics, smoothingMode)); + result := smoothingMode; +end; + +function TGPGraphics.SetSmoothingMode(smoothingMode: TSmoothingMode): TStatus; +begin + result := SetStatus(GdipSetSmoothingMode(nativeGraphics, smoothingMode)); +end; + +function TGPGraphics.DrawPath(pen: TGPPen; path: TGPGraphicsPath): TStatus; +var + nPen: GpPen; + nPath: GpPath; +begin + if Assigned(pen) then + nPen := pen.nativePen + else + nPen := nil; + if Assigned(path) then + nPath := path.nativePath + else + nPath := nil; + Result := SetStatus(GdipDrawPath(nativeGraphics, nPen, nPath)); +end; + +function TGPGraphics.FillRectangle(brush: TGPBrush; const rect: TGPRectF): TStatus; +begin + Result := FillRectangle(brush, rect.X, rect.Y, rect.Width, rect.Height); +end; + +function TGPGraphics.FillRectangle(brush: TGPBrush; x, y, width, height: Single): TStatus; +begin + result := SetStatus(GdipFillRectangle(nativeGraphics, brush.nativeBrush, x, y, + width, height)); +end; + +function TGPGraphics.DrawString( string_: string; length: Integer; font: TGPFont; + const layoutRect: TGPRectF; stringFormat: TGPStringFormat; brush: TGPBrush): TStatus; +var + nFont: GpFont; + nStringFormat: GpStringFormat; + nBrush: GpBrush; + wCh: PWidechar; + i: integer; +begin + if Assigned(font) then + nfont := font.nativeFont + else + nfont := nil; + if Assigned(stringFormat) then + nstringFormat := stringFormat.nativeFormat + else + nstringFormat := nil; + + {charset issue} + i := System.Length(string_); + GetMem(wCh, i * 2 + 2); + FillChar(wCh^, i * 2 + 2,0); + StringToWidechar(string_, wCh, i * 2 + 2); + {/charset issue} + + if Assigned(brush) then + nbrush := brush.nativeBrush + else + nbrush := nil; +// Result := SetStatus(GdipDrawString(nativeGraphics, PWideChar(string_), +// length, nfont, @layoutRect, nstringFormat, nbrush)); + + {charset issue} + Result := SetStatus(GdipDrawString(nativeGraphics, wCh, + length, nfont, @layoutRect, nstringFormat, nbrush)); + + FreeMem(wCh); + {/charset issue} +end; + +{$IFDEF DELPHI6_LVL} +function TGPGraphics.DrawString( string_: widestring; length: Integer; font: TGPFont; + const layoutRect: TGPRectF; stringFormat: TGPStringFormat; brush: TGPBrush): TStatus; +var + nFont: GpFont; + nStringFormat: GpStringFormat; + nBrush: GpBrush; +begin + if Assigned(font) then + nfont := font.nativeFont + else + nfont := nil; + if Assigned(stringFormat) then + nstringFormat := stringFormat.nativeFormat + else + nstringFormat := nil; + + if Assigned(brush) then + nbrush := brush.nativeBrush + else + nbrush := nil; + + Result := SetStatus(GdipDrawString(nativeGraphics, PWideChar(string_), + length, nfont, @layoutRect, nstringFormat, nbrush)); +end; +{$ENDIF} + +function TGPGraphics.MeasureString(string_: WideString; length: Integer; font: TGPFont; + const layoutRect: TGPRectF; stringFormat: TGPStringFormat; out boundingBox: TGPRectF; + codepointsFitted: PInteger = nil; linesFilled: PInteger = nil): TStatus; +var + nFont: GpFont; + nStringFormat: GpStringFormat; +begin + if Assigned(font) then + nfont := font.nativeFont + else + nfont := nil; + if Assigned(stringFormat) then + nstringFormat := stringFormat.nativeFormat + else + nstringFormat := nil; + + Result := SetStatus(GdipMeasureString(nativeGraphics, PWideChar(string_), + length, nfont, @layoutRect, nstringFormat, @boundingBox, codepointsFitted, + linesFilled)); +end; + +function TGPGraphics.GetLastStatus: TStatus; +begin + result := lastResult; + lastResult := Ok; +end; + +{ +constructor TGPGraphics.Create(graphics: GpGraphics); +begin + lastResult := Ok; + SetNativeGraphics(graphics); +end; +} + +procedure TGPGraphics.SetNativeGraphics(graphics: GpGraphics); +begin + self.nativeGraphics := graphics; +end; + +function TGPGraphics.SetStatus(status: TStatus): TStatus; +begin + if (status <> Ok) then + lastResult := status; + result := status; +end; + +function TGPGraphics.GetNativeGraphics: GpGraphics; +begin + result := self.nativeGraphics; +end; + +//------------------------------------------------------------------------------ + + constructor TGPRegion.Create(rect: TGPRectF); + var + region: GpRegion; + begin + region := nil; + lastResult := GdipCreateRegionRect(@rect, region); + SetNativeRegion(region); + end; + + constructor TGPRegion.Create(path: TGPGraphicsPath); + var + region: GpRegion; + begin + region := nil; + lastResult := GdipCreateRegionPath(path.nativePath, region); + SetNativeRegion(region); + end; + + destructor TGPRegion.Destroy; + begin + GdipDeleteRegion(nativeRegion); + end; + + function TGPRegion.Exclude(path: TGPGraphicsPath): TStatus; + begin + result := SetStatus(GdipCombineRegionPath(nativeRegion, path.nativePath, CombineModeExclude)); + end; + + function TGPRegion.SetStatus(status: TStatus): TStatus; + begin + if (status <> Ok) then lastResult := status; + result := status; + end; + + procedure TGPRegion.SetNativeRegion(nativeRegion: GpRegion); + begin + self.nativeRegion := nativeRegion; + end; + + function TGPRegion.Union(region: TGPRegion): TStatus; + begin + result := SetStatus(GdipCombineRegionRegion(nativeRegion, region.nativeRegion, + CombineModeUnion)); + end; + +(**************************************************************************\ +* +* GDI+ Font Family class +* +\**************************************************************************) + + constructor TGPFontFamily.Create(name: WideString; fontCollection: TGPFontCollection = nil); + var nfontCollection: GpfontCollection; + begin + nativeFamily := nil; + if assigned(fontCollection) then nfontCollection := fontCollection.nativeFontCollection else nfontCollection := nil; + lastResult := GdipCreateFontFamilyFromName(PWideChar(name), nfontCollection, nativeFamily); + end; + + destructor TGPFontFamily.Destroy; + begin + GdipDeleteFontFamily (nativeFamily); + end; + + function TGPFontFamily.SetStatus(status: TStatus): TStatus; + begin + if (status <> Ok) then lastResult := status; + result := status; + end; + + constructor TGPFontFamily.Create(nativeOrig: GpFontFamily; status: TStatus); + begin + lastResult := status; + nativeFamily := nativeOrig; + end; + +(**************************************************************************\ +* +* GDI+ Font class +* +\**************************************************************************) + + constructor TGPFont.Create(family: TGPFontFamily; emSize: Single; + style: TFontStyle = FontStyleRegular; unit_: TUnit = UnitPoint); + var + font: GpFont; + nFontFamily: GpFontFamily; + begin + font := nil; + if Assigned(Family) then + nFontFamily := Family.nativeFamily + else + nFontFamily := nil; + + lastResult := GdipCreateFont(nFontFamily, emSize, Integer(style), Integer(unit_), font); + + SetNativeFont(font); + end; + + destructor TGPFont.Destroy; + begin + GdipDeleteFont(nativeFont); + end; + + constructor TGPFont.Create(font: GpFont; status: TStatus); + begin + lastResult := status; + SetNativeFont(font); + end; + + procedure TGPFont.SetNativeFont(Font: GpFont); + begin + nativeFont := Font; + end; + + function TGPFont.SetStatus(status: TStatus): TStatus; + begin + if (status <> Ok) then lastResult := status; + result := status; + end; + +(**************************************************************************\ +* +* Font collections (Installed and Private) +* +\**************************************************************************) + + constructor TGPFontCollection.Create; + begin + nativeFontCollection := nil; + end; + + destructor TGPFontCollection.Destroy; + begin + inherited Destroy; + end; + + function TGPFontCollection.SetStatus(status: TStatus): TStatus; + begin + lastResult := status; + result := lastResult; + end; + +(**************************************************************************\ +* +* GDI+ Graphics Path class +* +\**************************************************************************) + + constructor TGPGraphicsPath.Create(fillMode: TFillMode = FillModeAlternate); + begin + nativePath := nil; + lastResult := GdipCreatePath(fillMode, nativePath); + end; + + destructor TGPGraphicsPath.Destroy; + begin + GdipDeletePath(nativePath); + end; + + function TGPGraphicsPath.CloseFigure: TStatus; + begin + result := SetStatus(GdipClosePathFigure(nativePath)); + end; + + function TGPGraphicsPath.AddLine(const pt1, pt2: TGPPointF): TStatus; + begin + result := AddLine(pt1.X, pt1.Y, pt2.X, pt2.Y); + end; + + function TGPGraphicsPath.AddLine(x1, y1, x2, y2: Single): TStatus; + begin + result := SetStatus(GdipAddPathLine(nativePath, x1, y1, + x2, y2)); + end; + + function TGPGraphicsPath.AddArc(rect: TGPRectF; startAngle, sweepAngle: Single): TStatus; + begin + result := AddArc(rect.X, rect.Y, rect.Width, rect.Height, + startAngle, sweepAngle); + end; + + function TGPGraphicsPath.AddArc(x, y, width, height, startAngle, sweepAngle: Single): TStatus; + begin + result := SetStatus(GdipAddPathArc(nativePath, x, y, width, height, startAngle, sweepAngle)); + end; + + function TGPGraphicsPath.AddEllipse(rect: TGPRectF): TStatus; + begin + result := AddEllipse(rect.X, rect.Y, rect.Width, rect.Height); + end; + + function TGPGraphicsPath.AddEllipse(x, y, width, height: Single): TStatus; + begin + result := SetStatus(GdipAddPathEllipse(nativePath, + x, + y, + width, + height)); + end; + + { + constructor TGPGraphicsPath.Create(path: TGPGraphicsPath); + var clonepath: GpPath; + begin + clonepath := nil; + SetStatus(GdipClonePath(path.nativePath, clonepath)); + SetNativePath(clonepath); + end; + } + constructor TGPGraphicsPath.Create(nativePath: GpPath); + begin + lastResult := Ok; + SetNativePath(nativePath); + end; + + procedure TGPGraphicsPath.SetNativePath(nativePath: GpPath); + begin + self.nativePath := nativePath; + end; + + function TGPGraphicsPath.SetStatus(status: TStatus): TStatus; + begin + if (status <> Ok) then LastResult := status; + result := status; + end; + +//-------------------------------------------------------------------------- +// Path Gradient Brush +//-------------------------------------------------------------------------- + { + constructor TGPPathGradientBrush.Create(points: PGPPointF; count: Integer; wrapMode: TWrapMode = WrapModeClamp); + var brush: GpPathGradient; + begin + brush := nil; + lastResult := GdipCreatePathGradient(points, count, wrapMode, brush); + SetNativeBrush(brush); + end; + } + constructor TGPPathGradientBrush.Create(path: TGPGraphicsPath); + var brush: GpPathGradient; + begin + brush := nil; + lastResult := GdipCreatePathGradientFromPath(path.nativePath, brush); + SetNativeBrush(brush); + end; + + function TGPPathGradientBrush.GetCenterColor(out Color: TGPColor): TStatus; + begin + SetStatus(GdipGetPathGradientCenterColor(GpPathGradient(nativeBrush), Color)); + result := lastResult; + end; + + function TGPPathGradientBrush.SetCenterColor(color: TGPColor): TStatus; + begin + SetStatus(GdipSetPathGradientCenterColor(GpPathGradient(nativeBrush),color)); + result := lastResult; + end; + + function TGPPathGradientBrush.GetPointCount: Integer; + begin + SetStatus(GdipGetPathGradientPointCount(GpPathGradient(nativeBrush), result)); + end; + + function TGPPathGradientBrush.GetSurroundColors(colors: PARGB; var count: Integer): TStatus; + var + count1: Integer; + begin + if not assigned(colors) then + begin + result := SetStatus(InvalidParameter); + exit; + end; + + SetStatus(GdipGetPathGradientSurroundColorCount(GpPathGradient(nativeBrush), count1)); + + if(lastResult <> Ok) then + begin + result := lastResult; + exit; + end; + + if((count < count1) or (count1 <= 0)) then + begin + result := SetStatus(InsufficientBuffer); + exit; + end; + + SetStatus(GdipGetPathGradientSurroundColorsWithCount(GpPathGradient(nativeBrush), colors, count1)); + if(lastResult = Ok) then + count := count1; + + result := lastResult; + end; + + function TGPPathGradientBrush.SetSurroundColors(colors: PARGB; var count: Integer): TStatus; + var + count1: Integer; + type + TDynArrDWORD = array of DWORD; + begin + if (colors = nil) then + begin + result := SetStatus(InvalidParameter); + exit; + end; + + count1 := GetPointCount; + + if((count > count1) or (count1 <= 0)) then + begin + result := SetStatus(InvalidParameter); + exit; + end; + + count1 := count; + + SetStatus(GdipSetPathGradientSurroundColorsWithCount( + GpPathGradient(nativeBrush), colors, count1)); + + if(lastResult = Ok) then count := count1; + result := lastResult; + end; + + function TGPPathGradientBrush.GetCenterPoint(out point: TGPPointF): TStatus; + begin + result := SetStatus(GdipGetPathGradientCenterPoint(GpPathGradient(nativeBrush), @point)); + end; + + function TGPPathGradientBrush.GetCenterPoint(out point: TGPPoint): TStatus; + begin + result := SetStatus(GdipGetPathGradientCenterPointI(GpPathGradient(nativeBrush), @point)); + end; + + function TGPPathGradientBrush.SetCenterPoint(point: TGPPointF): TStatus; + begin + result := SetStatus(GdipSetPathGradientCenterPoint(GpPathGradient(nativeBrush), @point)); + end; + + function TGPPathGradientBrush.SetCenterPoint(point: TGPPoint): TStatus; + begin + result := SetStatus(GdipSetPathGradientCenterPointI(GpPathGradient(nativeBrush), @point)); + end; + +function TGPGraphics.DrawRectangle(pen: TGPPen; const rect: TGPRectF): TStatus; +begin + Result := DrawRectangle(pen, rect.X, rect.Y, rect.Width, rect.Height); +end; + +function TGPGraphics.DrawRectangle(pen: TGPPen; x, y, width, height: Single): TStatus; +begin + Result := SetStatus(GdipDrawRectangle(nativeGraphics, pen.nativePen, x, y, width, height)); +end; + +function TGPGraphics.DrawImage(image: TGPImage; x, y: Integer): TStatus; +var + nImage: GpImage; +begin + if Assigned(Image) then + nImage := Image.nativeImage + else + nImage := nil; + + Result := SetStatus(GdipDrawImageI(nativeGraphics, nimage, x, y)); +end; + +function TGPGraphics.DrawImageRect(image: TGPImage; x, y, w, h: Integer): TStatus; +var + nImage: GpImage; +begin + if Assigned(Image) then + nImage := Image.nativeImage + else + nImage := nil; + + Result := SetStatus(GdipDrawImageRect(nativeGraphics, nimage, x, y, w, h)); +end; + + +constructor TGPImage.Create(filename: WideString; + useEmbeddedColorManagement: BOOL = FALSE); +begin + nativeImage := nil; + if(useEmbeddedColorManagement) then + begin + lastResult := GdipLoadImageFromFileICM(PWideChar(filename), nativeImage); + end + else + begin + lastResult := GdipLoadImageFromFile(PWideChar(filename), nativeImage); + end; +end; + +constructor TGPImage.Create(stream: IStream; + useEmbeddedColorManagement: BOOL = FALSE); +begin + nativeImage := nil; + if (useEmbeddedColorManagement) then + lastResult := GdipLoadImageFromStreamICM(stream, nativeImage) + else + lastResult := GdipLoadImageFromStream(stream, nativeImage); +end; + +destructor TGPImage.Destroy; +begin + GdipDisposeImage(nativeImage); +end; + +function TGPImage.GetFormat: TGPImageFormat; +var + format: TGUID; +begin + GdipGetImageRawFormat(nativeImage, @format); + + Result := ifUndefined; + + if IsEqualGUID(format, ImageFormatMemoryBMP) then + Result := ifMemoryBMP; + + if IsEqualGUID(format, ImageFormatBMP) then + Result := ifBMP; + + if IsEqualGUID(format, ImageFormatEMF) then + Result := ifEMF; + + if IsEqualGUID(format, ImageFormatWMF) then + Result := ifWMF; + + if IsEqualGUID(format, ImageFormatJPEG) then + Result := ifJPEG; + + if IsEqualGUID(format, ImageFormatGIF) then + Result := ifGIF; + + if IsEqualGUID(format, ImageFormatPNG) then + Result := ifPNG; + + if IsEqualGUID(format, ImageFormatTIFF) then + Result := ifTIFF; + + if IsEqualGUID(format, ImageFormatEXIF) then + Result := ifEXIF; + + if IsEqualGUID(format, ImageFormatIcon) then + Result := ifIcon; +end; + +function TGPImage.GetHeight: UINT; +var + height: UINT; + +begin + height := 0; + SetStatus(GdipGetImageHeight(nativeImage, height)); + result := height; +end; + +function TGPImage.GetWidth: UINT; +var + width: UINT; +begin + width := 0; + SetStatus(GdipGetImageWidth(nativeImage, width)); + result := width; +end; + +constructor TGPImage.Create(nativeImage: GpImage; status: TStatus); +begin + SetNativeImage(nativeImage); + lastResult := status; +end; + +procedure TGPImage.SetNativeImage(nativeImage: GpImage); +begin + self.nativeImage := nativeImage; +end; + +function TGPImage.SetStatus(status: TStatus): TStatus; +begin + if (status <> Ok) then lastResult := status; + result := status; +end; + + +function TGPGraphicsPath.AddLines(points: PGPPoint; count: Integer): TStatus; +begin + result := SetStatus(GdipAddPathLine2I(nativePath, points, count)); +end; + +function TGPGraphicsPath.AddPie(rect: TGPRectF; startAngle, + sweepAngle: Single): TStatus; +begin + result := AddPie(rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle); +end; + +function TGPGraphicsPath.AddPie(x, y, width, height, startAngle, + sweepAngle: Single): TStatus; +begin + result := SetStatus(GdipAddPathPie(nativePath, x, y, width, height, startAngle, sweepAngle)); +end; + +function TGPGraphicsPath.AddPolygon(points: PGPPointF; + count: Integer): TStatus; +begin + result := SetStatus(GdipAddPathPolygon(nativePath, points, count)); +end; + +function TGPGraphicsPath.AddPolygon(points: PGPPoint; + count: Integer): TStatus; +begin + result := SetStatus(GdipAddPathPolygonI(nativePath, points, count)); +end; + +function TGPGraphicsPath.AddCurve(points: PGPPointF; + count: Integer): TStatus; +begin + result := SetStatus(GdipAddPathCurve(nativePath, points, count)); +end; + +function TGPGraphicsPath.AddCurve(points: PGPPoint; + count: Integer): TStatus; +begin + result := SetStatus(GdipAddPathCurveI(nativePath, points, count)); +end; + +function TGPGraphicsPath.AddCurve(points: PGPPoint; count: Integer; tension: Single): TStatus; +begin + result := SetStatus(GdipAddPathCurve2I(nativePath, points, count, tension)); +end; + +function TGPGraphicsPath.AddBezier(pt1, pt2, pt3, pt4: TGPPoint): TStatus; +begin + result := AddBezier(pt1.X, pt1.Y, pt2.X, pt2.Y, pt3.X, pt3.Y, pt4.X, pt4.Y); +end; + +function TGPGraphicsPath.AddBezier(pt1, pt2, pt3, pt4: TGPPointF): TStatus; +begin + result := AddBezier(pt1.X, pt1.Y, pt2.X, pt2.Y, pt3.X, pt3.Y, pt4.X, pt4.Y); +end; + +function TGPGraphicsPath.AddBezier(x1, y1, x2, y2, x3, y3, x4, + y4: Single): TStatus; +begin + result := SetStatus(GdipAddPathBezier(nativePath, x1, y1, x2, y2, x3, y3, x4, y4)); +end; + +//------------------------------------------------------------------------------ + +function TGPGraphics.FillPath(brush: TGPBrush; + path: TGPGraphicsPath): TStatus; +begin + result := SetStatus(GdipFillPath(nativeGraphics, brush.nativeBrush, path.nativePath)); +end; + +function TGPGraphics.ExcludeClip(const rect: TGPRectF): TStatus; +begin + result := SetStatus(GdipSetClipRect(nativeGraphics, rect.X, rect.Y, rect.Width, rect.Height, CombineModeExclude)); +end; + +function TGPGraphics.ExcludeClip(region: TGPRegion): TStatus; +begin + result := SetStatus(GdipSetClipRegion(nativeGraphics, region.nativeRegion, CombineModeExclude)); +end; + +function TGPGraphics.SetClip(region: TGPRegion; + combineMode: TCombineMode): TStatus; +begin + result := SetStatus(GdipSetClipRegion(nativeGraphics, region.nativeRegion, combineMode)); +end; + +function TGPGraphics.ResetClip: TStatus; +begin + result := SetStatus(GdipResetClip(nativeGraphics)); +end; + +function MakeColor(a, r, g, b: Byte): ARGB; overload; +begin + result := ((DWORD(b) shl BlueShift) or + (DWORD(g) shl GreenShift) or + (DWORD(r) shl RedShift) or + (DWORD(a) shl AlphaShift)); +end; + +function MakeColor(r, g, b: Byte): ARGB; overload; +begin + result := MakeColor(255, r, g, b); +end; + +function GetAlpha(color: ARGB): BYTE; +begin + result := BYTE(color shr AlphaShift); +end; + +function GetRed(color: ARGB): BYTE; +begin + result := BYTE(color shr RedShift); +end; + +function GetGreen(color: ARGB): BYTE; +begin + result := BYTE(color shr GreenShift); +end; + +function GetBlue(color: ARGB): BYTE; +begin + result := BYTE(color shr BlueShift); +end; + +function TGPGraphics.GetCompositingQuality: TCompositingQuality; +begin + SetStatus(GdipGetCompositingQuality(nativeGraphics, result)); +end; + +function TGPGraphics.SetCompositingQuality( + compositingQuality: TCompositingQuality): TStatus; +begin + result := SetStatus(GdipSetCompositingQuality( nativeGraphics, compositingQuality)); +end; + +function TGPImage.RotateFlip(rotateFlipType: TRotateFlipType): TStatus; +begin + Result := SetStatus(GdipImageRotateFlip(nativeImage, rotateFlipType)); +end; + + +{ TGPBitmap } + +constructor TGPBitmap.Create(stream: IStream; useEmbeddedColorManagement: BOOL); +var + bitmap: GpBitmap; +begin + bitmap := nil; + if(useEmbeddedColorManagement) then + lastResult := GdipCreateBitmapFromStreamICM(stream, bitmap) + else + lastResult := GdipCreateBitmapFromStream(stream, bitmap); + SetNativeImage(bitmap); +end; + +constructor TGPBitmap.Create(nativeBitmap: GpBitmap); +begin + lastResult := Ok; + SetNativeImage(nativeBitmap); +end; + +constructor TGPBitmap.Create(width, height: Integer; format: TPixelFormat); +var + bitmap: GpBitmap; +begin + bitmap := nil; + lastResult := GdipCreateBitmapFromScan0(width, height, 0, format, nil, bitmap); + SetNativeImage(bitmap); +end; + +function TGPBitmap.FromStream(stream: IStream; + useEmbeddedColorManagement: BOOL): TGPBitmap; +begin + Result := TGPBitmap.Create(stream, useEmbeddedColorManagement); +end; + +function TGPBitmap.GetPixel(x, y: Integer; out color: TGPColor): TStatus; +begin + Result := SetStatus(GdipBitmapGetPixel(GpBitmap(nativeImage), x, y, color)); +end; + +function TGPBitmap.SetPixel(x, y: Integer; color: TGPColor): TStatus; +begin + Result := SetStatus(GdipBitmapSetPixel(GpBitmap(nativeImage), x, y, color)); +end; + + + +initialization +begin + // Initialize StartupInput structure + StartupInput.DebugEventCallback := nil; + + //StartupInput.SuppressBackgroundThread := False; + StartupInput.SuppressBackgroundThread := True; + StartupInput.SuppressExternalCodecs := False; + StartupInput.GdiplusVersion := 1; + + StartupOutput.NotificationHook := nil; + StartupOutput.NotificationUnhook := nil; + + // Initialize GDI+ + GdiplusStartup(gdiplusToken, @StartupInput, @StartupOutput); +end; + +finalization +begin + // Close GDI + + if not IsLibrary then + GdiplusShutdown(gdiplusToken); +end; + +end. diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Source/advglowbutton.pas b/TAdvTaskDialog/internal/1.5.0.2/1/Source/advglowbutton.pas new file mode 100644 index 0000000..85564a0 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.0.2/1/Source/advglowbutton.pas @@ -0,0 +1,5298 @@ +{***************************************************************************} +{ TAdvGlowButton component } +{ for Delphi & C++Builder } +{ } +{ written by TMS Software } +{ copyright © 2006 - 2008 } +{ Email : info@tmssoftware.com } +{ Web : http://www.tmssoftware.com } +{ } +{ The source code is given as is. The author is not responsible } +{ for any possible damage done due to the use of this code. } +{ The component can be freely used in any application. The complete } +{ source code remains property of the author and may not be distributed, } +{ published, given or sold in any form as such. No parts of the source } +{ code can be included in any other component or application without } +{ written authorization of the author. } +{***************************************************************************} + +unit AdvGlowButton; + +{$R ADVGLOWBUTTONDB.RES} + +{$I TMSDEFS.INC} + +{$T-} + +interface + +uses + Classes, Windows, Forms, Dialogs, Controls, Graphics, Messages, ExtCtrls, + SysUtils, Math, Menus, ImgList, AdvGDIP, GDIPicture, ActnList, + AdvHintInfo, AdvStyleIF, ActiveX + {$IFNDEF TMS_STD} + , DB + {$ENDIF} + ; + +const + DropDownSectWidth = 13; + + MAJ_VER = 1; // Major version nr. + MIN_VER = 8; // Minor version nr. + REL_VER = 1; // Release nr. + BLD_VER = 5; // Build nr. + + // version history + // 1.0.5.1 : Fixed issue with width & height initialization + // 1.0.5.2 : Improved fade painting + // 1.1.0.0 : New separate dropdown button hot & down effect + // : Silver, Blue, Black styles added + // 1.2.0.0 : New DropDownSplit property added + // 1.2.0.1 : Fixed issue with ModalResult <> mrNone + // 1.2.0.2 : Fixed issue with Action handling Checked state + // 1.2.0.3 : Fixed issue with disabled painting + // 1.2.0.4 : Fixed issue with key handling + // 1.3.0.0 : Added new property FocusType + // : Added new ShortCutHint, ShortCutHintPos & methods ShowShortCutHint, HideShortCutHint + // 1.3.0.1 : Fixed issue with font and aaNone + // 1.3.0.2 : Fixed issue with hot & down border painting + // 1.3.1.0 : New : exposed OnMouseEnter, OnMouseLeave + // : Fixed issue with Down property for bsCheck style + // 1.3.1.1 : Fixed issue with Down property for buttons with GroupIndex > 0 + // 1.3.1.2 : Improved transitioning from transparent to hot + // 1.3.1.3 : Fixed issue with actionlinks & bsCheck type + // 1.3.2.0 : New styler interface added + // 1.3.3.0 : New public property DroppedDown added + // 1.3.4.0 : New TAdvCustomGlowButton.ParentFont added + // : TButtonLayout blGlyphLeftAdjusted and blGlyphRightAdjusted added + // 1.3.5.0 : New borderless display possible by setting BorderStyle = bsNone + // 1.4.0.0 : Improved : seamlessly works with TrueType & non TrueType fonts + // : New : Spacing property added + // : New : WordWrap property added + // : New : AutoSize property added + // : New : MarginVert property added + // : New : MarginHorz property added + // : New : Rounded property added + // : New : DropDownDirection property added + // : New : HotImages, HotPicture property added + // 1.4.5.0 : New : PopupMenu property added + // : New : OnDrawButton event added + // : New : TButtonLayout blGlyphTopAdjusted and blGlyphBottomAdjusted added + // 1.4.6.0 : New : support for Office 2007 silver style added + // 1.4.6.1 : Fixed : issue with Win98 resource leak + // 1.5.0.0 : New : support for Unicode text via public property WideCaption + // : Improved : text drawing in aaNone AntiAlias mode + // 1.5.0.1 : Fix for use with fonts that are not installed + // 1.6.0.0 : New : support for Trimming added + // 1.6.0.1 : Fixed : issue with Action images + // 1.7.0.0 : New : Repeat functionality added with repeat initial delay & frequency setting + // : Improved wordwrap drawing with no text aliasing + // : New : support for using \n newline specifier in property inspector + // 1.7.0.1 : Fixed : drawing issue with Delphi 2007 + // 1.7.1.0 : New : F4 key to open attached dropdown menu + // 1.7.1.1 : Fixed : issue with DropDownSplit and OnClick event handler + // 1.7.2.0 : New : events OnEnter, OnExit added + // 1.7.2.1 : Improved : painting on MDI child windows + // 1.7.2.2 : Fixed : drawing issue with Delphi 2007 + // 1.8.0.0 : New : Notes & NotesFont + // : New : C++Builder 2007 support + // : Improved : drawing down state for Transparent button + // : Improved : drawing speed + // 1.8.0.1 : Fixed : runtime WideCaption assigning causes repaint + // 1.8.1.0 : Fixed : issue with inherited forms + // 1.8.1.1 : Fixed : issue with dbl click event + // : Fixed : issue with actions & groupindex + // : Fixed : border painting issue on checked buttons in bpMiddle, bpRight position + // 1.8.1.2 : Fixed : issue with ShowCaption & WideCaption + // 1.8.1.3 : Fixed : issue with using font not installed on the system + // 1.8.1.4 : Fixed : issue with WideCaption & aaNone AntiAlias type + // 1.8.1.5 : Fixed : issue with DblClick & OnClick event + + +type + TAdvCustomGlowButton = class; + TAdvGlowButton = class; + + TGlowState = (gsHover, gsPush, gsNone); + TAdvButtonStyle = (bsButton, bsCheck); + TAdvButtonState = (absUp, absDisabled, absDown, absDropDown, absExclusive); + TButtonLayout = (blGlyphLeft, blGlyphTop, blGlyphRight, blGlyphBottom, + blGlyphLeftAdjusted, blGlyphRightAdjusted, + blGlyphTopAdjusted, blGlyphBottomAdjusted); + + TDropDownPosition = (dpRight, dpBottom); + TDropDownDirection = (ddDown, ddRight); + TGDIPGradient = (ggRadial, ggVertical, ggDiagonalForward, ggDiagonalBackward); + + TFocusType = (ftBorder, ftHot, ftHotBorder, ftNone); + + TShortCutHintPos = (shpLeft, shpTop, shpRight, shpBottom, shpCenter); + + TButtonPosition = (bpStandalone, bpLeft, bpMiddle, bpRight); + + TGlowButtonState = (gsNormal, gsHot, gsDown); + + TButtonSizeState = (bsGlyph, bsLabel, bsLarge); + + TGlowButtonDrawEvent = procedure(Sender: TObject; Canvas: TCanvas; Rect: TRect; State: TGlowButtonState) of object; + TSetButtonSizeEvent = procedure(Sender: TObject; var W, H: Integer) of object; + + TWinCtrl = class(TWinControl) + public + procedure PaintCtrls(DC: HDC; First: TControl); + end; + +{$IFDEF DELPHI6_LVL} + TAdvGlowButtonActionLink = class(TControlActionLink) + protected + FImageIndex: Integer; + FClient: TAdvCustomGlowButton; //TAdvGlowButton; + procedure AssignClient(AClient: TObject); override; + function IsCheckedLinked: Boolean; override; + function IsGroupIndexLinked: Boolean; override; + procedure SetGroupIndex(Value: Integer); override; + procedure SetChecked(Value: Boolean); override; + function IsImageIndexLinked: Boolean; override; + procedure SetImageIndex(Value: Integer); override; + end; +{$ENDIF} + + TShortCutHintWindow = class(THintWindow) + private + FColor: TColor; + FColorTo: TColor; + procedure WMEraseBkGnd(var Message: TWMEraseBkGnd); message WM_ERASEBKGND; + protected + procedure Resize; override; + procedure Paint; override; + procedure CreateParams(var Params:TCreateParams);override; + published + property Color: TColor read FColor write FColor; + property ColorTo: TColor read FColorTo write FColorTo; + end; + + TGlowButtonAppearance = class(TPersistent) + private + FOnChange: TNotifyEvent; + FBorderColor: TColor; + FBorderColorHot: TColor; + FBorderColorDown: TColor; + FColor: TColor; + FColorTo: TColor; + FColorDown: TColor; + FColorDownTo: TColor; + FColorHot: TColor; + FColorHotTo: TColor; + FColorCheckedTo: TColor; + FBorderColorDisabled: TColor; + FBorderColorChecked: TColor; + FColorDisabled: TColor; + FColorDisabledTo: TColor; + FColorChecked: TColor; + FColorMirror: TColor; + FColorMirrorTo: TColor; + FColorMirrorHot: TColor; + FColorMirrorHotTo: TColor; + FColorMirrorDown: TColor; + FColorMirrorDownTo: TColor; + FGradientDown: TGDIPGradient; + FGradientMirror: TGDIPGradient; + FGradientMirrorHot: TGDIPGradient; + FGradient: TGDIPGradient; + FGradientMirrorDown: TGDIPGradient; + FGradientHot: TGDIPGradient; + FColorMirrorDisabledTo: TColor; + FColorMirrorDisabled: TColor; + FColorMirrorCheckedTo: TColor; + FColorMirrorChecked: TColor; + FGradientChecked: TGDIPGradient; + FGradientDisabled: TGDIPGradient; + FGradientMirrorChecked: TGDIPGradient; + FGradientMirrorDisabled: TGDIPGradient; + FSystemFont: boolean; + procedure SetSystemFont(const Value: boolean); + protected + procedure Changed; + public + constructor Create; + procedure Assign(Source: TPersistent); override; + property OnChange: TNotifyEvent read FOnChange write FOnChange; + published + property BorderColor: TColor read FBorderColor write FBorderColor default clSilver; + property BorderColorHot: TColor read FBorderColorHot write FBorderColorHot default clBlue; + property BorderColorDown: TColor read FBorderColorDown write FBorderColorDown default clNavy; + property BorderColorChecked: TColor read FBorderColorChecked write FBorderColorChecked default clBlue; + property BorderColorDisabled: TColor read FBorderColorDisabled write FBorderColorDisabled default clGray; + property Color: TColor read FColor write FColor default clWhite; + property ColorTo: TColor read FColorTo write FColorTo default clWhite; + property ColorChecked: TColor read FColorChecked write FColorChecked; + property ColorCheckedTo: TColor read FColorCheckedTo write FColorCheckedTo; + property ColorDisabled: TColor read FColorDisabled write FColorDisabled; + property ColorDisabledTo: TColor read FColorDisabledTo write FColorDisabledTo; + property ColorDown: TColor read FColorDown write FColorDown; + property ColorDownTo: TColor read FColorDownTo write FColorDownTo; + property ColorHot: TColor read FColorHot write FColorHot; + property ColorHotTo: TColor read FColorHotTo write FColorHotTo; + property ColorMirror: TColor read FColorMirror write FColorMirror default clSilver; + property ColorMirrorTo: TColor read FColorMirrorTo write FColorMirrorTo default clWhite; + property ColorMirrorHot: TColor read FColorMirrorHot write FColorMirrorHot; + property ColorMirrorHotTo: TColor read FColorMirrorHotTo write FColorMirrorHotTo; + property ColorMirrorDown: TColor read FColorMirrorDown write FColorMirrorDown; + property ColorMirrorDownTo: TColor read FColorMirrorDownTo write FColorMirrorDownTo; + property ColorMirrorChecked: TColor read FColorMirrorChecked write FColorMirrorChecked; + property ColorMirrorCheckedTo: TColor read FColorMirrorCheckedTo write FColorMirrorCheckedTo; + property ColorMirrorDisabled: TColor read FColorMirrorDisabled write FColorMirrorDisabled; + property ColorMirrorDisabledTo: TColor read FColorMirrorDisabledTo write FColorMirrorDisabledTo; + property Gradient: TGDIPGradient read FGradient write FGradient default ggVertical; + property GradientMirror: TGDIPGradient read FGradientMirror write FGradientMirror default ggVertical; + property GradientHot: TGDIPGradient read FGradientHot write FGradientHot default ggRadial; + property GradientMirrorHot: TGDIPGradient read FGradientMirrorHot write FGradientMirrorHot default ggRadial; + property GradientDown: TGDIPGradient read FGradientDown write FGradientDown default ggRadial; + property GradientMirrorDown: TGDIPGradient read FGradientMirrorDown write FGradientMirrorDown default ggRadial; + property GradientChecked: TGDIPGradient read FGradientChecked write FGradientChecked default ggRadial; + property GradientMirrorChecked: TGDIPGradient read FGradientMirrorChecked write FGradientMirrorChecked default ggVertical; + property GradientDisabled: TGDIPGradient read FGradientDisabled write FGradientDisabled default ggRadial; + property GradientMirrorDisabled: TGDIPGradient read FGradientMirrorDisabled write FGradientMirrorDisabled default ggRadial; + property SystemFont: boolean read FSystemFont write SetSystemFont default true; + end; + + ///

Button with glow hover & down effect + TAdvCustomGlowButton = class(TCustomControl, ITMSStyle) + private + FActive: Boolean; + FDown: Boolean; + FLeftDown: Boolean; + FMouseDown: Boolean; + FTimer: TTimer; + FStepHover: Integer; + FStepPush: Integer; + FTimeInc: Integer; + FGlowState: TGlowState; + FImages: TImageList; + FImageIndex: TImageIndex; + FState: TAdvButtonState; + FMouseInControl: Boolean; + FMouseEnter: Boolean; + FDownChecked: Boolean; + FInitialDown: Boolean; + FDragging: Boolean; + FStyle: TAdvButtonStyle; + FGroupIndex: Integer; + FAllowAllUp: Boolean; + FTransparent: Boolean; + FLayout: TButtonLayout; + FDropDownButton: Boolean; + FDropDownSplit: Boolean; + FDropDownDirection: TDropDownDirection; + FDropDownMenu: TPopupMenu; + FOnDropDown: TNotifyEvent; + FDropDownPosition: TDropDownPosition; + FAppearance: TGlowButtonAppearance; + FDisabledImages: TImageList; + FInternalImages: TImageList; + FHotImages: TImageList; + FIPicture: TGDIPPicture; + FIDisabledPicture: TGDIPPicture; + FIHotPicture: TGDIPPicture; + FShowCaption: Boolean; + FAntiAlias: TAntiAlias; + FModalResult: TModalResult; + FDefault: boolean; + FCancel: Boolean; + FInButton: Boolean; + FBorderStyle: TBorderStyle; + FButtonPosition: TButtonPosition; + FOfficeHint: TAdvHintInfo; + FCheckLinked: Boolean; + FGroupIndexLinked: Boolean; + FFocusType: TFocusType; + FShortCutHint: TShortCutHintWindow; + FShortCutHintPos: TShortCutHintPos; + FShortCutHintText: string; + FShowDisabled: Boolean; + FOnInternalKeyDown: TKeyEvent; + FOnMouseLeave: TNotifyEvent; + FOnMouseEnter: TNotifyEvent; + FDroppedDown: Boolean; + FOverlappedText: Boolean; + FSpacing: Integer; + FAutoSize: Boolean; + FWordWrap: Boolean; + FDoAutoSize: Boolean; + FFirstPaint: Boolean; + FMarginVert: integer; + FMarginHorz: integer; + FRounded: Boolean; + FOnDrawButton: TGlowButtonDrawEvent; + FWideCaption: widestring; + FTrimming: TStringTrimming; + FRepeatTimer: TTimer; + FInitRepeatPause: Integer; + FRepeatPause: Integer; + FRepeatClick: Boolean; + FOnInternalClick: TNotifyEvent; + FButtonSizeState: TButtonSizeState; + FMaxButtonSizeState: TButtonSizeState; + FOnSetButtonSize: TSetButtonSizeEvent; + FOldLayout: TButtonLayout; + FOldDropDownPosition: TDropDownPosition; + FMinButtonSizeState: TButtonSizeState; + FParentForm: TCustomForm; + FIsVista: boolean; + FNotes: TStringList; + FNotesFont: TFont; + procedure SetOfficeHint(const Value: TAdvHintInfo); + procedure SetButtonPosition(const Value: TButtonPosition); + procedure SetBorderStyle(const Value: TBorderStyle); + function GetVersion: string; + procedure SetVersion(const Value: string); + procedure SetDefault(const Value: boolean); + procedure SetAntiAlias(const Value: TAntiAlias); + procedure SetShowCaption(const Value: Boolean); + procedure SetDisabledPicture(const Value: TGDIPPicture); + procedure SetHotPicture(const Value: TGDIPPicture); + procedure SetPicture(const Value: TGDIPPicture); + procedure SetTransparent(const Value: Boolean); + procedure UpdateExclusive; + procedure UpdateTracking; + procedure SetImageIndex(const Value: TImageIndex); + procedure SetImages(const Value: TImageList); + procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY; + procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; + procedure CMFocusChanged(var Message: TCMFocusChanged); message CM_FOCUSCHANGED; + procedure WMGetDlgCode(var Message: TMessage); message WM_GETDLGCODE; + procedure CNCommand(var Message: TWMCommand); message CN_COMMAND; + procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED; + procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE; + procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER; + procedure WMSetText(var Message: TWMSetText); message WM_SETTEXT; + procedure WMEraseBkGnd(var Message: TWMEraseBkGnd); message WM_ERASEBKGND; + procedure WMPaint(var Msg: TWMPaint); message WM_PAINT; + procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED; +{$IFNDEF TMSDOTNET} + procedure CMButtonPressed(var Message: TMessage); message CM_BUTTONPRESSED; +{$ENDIF} + procedure WMLButtonUp(var Msg:TWMLButtonDown); message WM_LBUTTONUP; + procedure WMLDblClk(var Msg: TWMLButtonDblClk); message WM_LBUTTONDBLCLK; + procedure TimerProc(Sender: TObject); + procedure OnAppearanceChanged(Sender: TObject); + procedure SetDown(Value: Boolean); + procedure SetStyle(const Value: TAdvButtonStyle); + procedure SetGroupIndex(const Value: Integer); + procedure SetAllowAllUp(const Value: Boolean); + procedure SetLayout(const Value: TButtonLayout); + procedure SetDropDownButton(const Value: Boolean); + procedure PopupBtnDown; + procedure SetDropDownPosition(const Value: TDropDownPosition); + procedure SetDropDownDirection(const Value: TDropDownDirection); + procedure SetAppearance(const Value: TGlowButtonAppearance); + procedure SetDisabledImages(const Value: TImageList); + procedure PictureChanged(Sender: TObject); + procedure DoDropDown; + procedure SetSpacing(const Value: integer); + procedure SetAutoSizeEx(const Value: boolean); + procedure SetShowDisabled(const Value: boolean); + procedure SetWordWrap(const Value: boolean); + procedure SetMarginVert(const Value: integer); + procedure SetMarginHorz(const Value: integer); + procedure SetRounded(const Value: boolean); + procedure SetTrimming(const Value: TStringTrimming); + procedure PerformResize; + function IsFontStored: Boolean; + procedure SetButtonSizeState(const Value: TButtonSizeState); + procedure SetMaxButtonSizeState(const Value: TButtonSizeState); + procedure SetMinButtonSizeState(const Value: TButtonSizeState); + procedure SetNotes(const Value: TStrings); + function GetNotes: TStrings; + procedure SetNotesFont(const Value: TFont); + procedure SetWideCaption(const Value: widestring); +// procedure SetCaption(const Value: string); +// function GetCaption: string; + protected + FHot: Boolean; + FDefaultPicDrawing: Boolean; + FDefaultCaptionDrawing: Boolean; + FCustomizerCreated: Boolean; + FCommandID: Integer; + procedure TimerExpired(Sender: TObject); virtual; + procedure DrawGlyphCaption; virtual; + procedure GetToolImage(bmp: TBitmap); virtual; + procedure SetDroppedDown(Value: Boolean); + procedure CreateParams(var Params:TCreateParams); override; + procedure Paint; override; + procedure Loaded; override; + procedure DoEnter; override; + procedure DoExit; override; + procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; + procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; + procedure KeyDown(var Key: Word; Shift: TShiftState); override; + procedure KeyUp(var Key: Word; Shift: TShiftState); override; + procedure KeyPress(var Key: Char); override; +{$IFDEF DELPHI6_LVL} + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; +{$ENDIF} + procedure Notification(AComponent: TComponent; AOperation: TOperation); override; + property GlowState: TGlowState read FGlowState write FGlowState; +{$IFDEF TMSDOTNET} + procedure ButtonPressed(Group: Integer; Button: TAdvGlowButton); +{$ENDIF} + property Down: Boolean read FDownChecked write SetDown default False; + property Style: TAdvButtonStyle read FStyle write SetStyle default bsButton; + property State: TAdvButtonState read FState write FState; + property GroupIndex: Integer read FGroupIndex write SetGroupIndex default 0; + property AllowAllUp: Boolean read FAllowAllUp write SetAllowAllUp default False; + property Layout: TButtonLayout read FLayout write SetLayout default blGlyphLeft; + property DroppedDown: Boolean read FDroppedDown; + property DropDownButton: Boolean read FDropDownButton write SetDropDownButton default False; + property DropDownDirection: TDropDownDirection read FDropDownDirection write SetDropDownDirection default ddDown; + property DropDownPosition: TDropDownPosition read FDropDownPosition write SetDropDownPosition default dpRight; + property DropDownSplit: Boolean read FDropDownSplit write FDropDownSplit default true; + property DropDownMenu: TPopupMenu read FDropDownMenu write FDropDownMenu; + property OnDropDown: TNotifyEvent read FOnDropDown write FOnDropDown; + function GetVersionNr: Integer; virtual; + function IsMenuButton: Boolean; virtual; + function CanDrawBorder: Boolean; virtual; + function CanDrawFocused: Boolean; virtual; + procedure InternalClick; + property CheckLinked: Boolean read FCheckLinked write FCheckLinked; + property GroupIndexLinked: Boolean read FGroupIndexLinked write FGroupIndexLinked; + property OnInternalKeyDown: TKeyEvent read FOnInternalKeyDown write FOnInternalKeyDown; // Used by AdvToolBar + property OnInternalClick: TNotifyEvent read FOnInternalClick write FOnInternalClick; // Used by AdvToolBar + property OverlappedText: boolean read FOverlappedText write FOverlappedText; + property DoAutoSize: boolean read FDoAutoSize write FDoAutoSize; + property ButtonSizeState: TButtonSizeState read FButtonSizeState write SetButtonSizeState; // Used by AdvToolBar + property MaxButtonSizeState: TButtonSizeState read FMaxButtonSizeState write SetMaxButtonSizeState default bsLarge; + property MinButtonSizeState: TButtonSizeState read FMinButtonSizeState write SetMinButtonSizeState default bsGlyph; + property OnSetButtonSize: TSetButtonSizeEvent read FOnSetButtonSize write FOnSetButtonSize; // Used by AdvToolBar + function GetButtonSize(BtnSizeState: TButtonSizeState): TSize; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Assign(Source: TPersistent); override; + procedure CreateWnd; override; + procedure Click; override; + property Appearance: TGlowButtonAppearance read FAppearance write SetAppearance; + procedure ShowShortCutHint; + procedure HideShortCutHint; + /// Sets the style of the component, make sure to include AdvStyleIF unit + procedure SetComponentStyle(AStyle: TTMSStyle); + property WideCaption: widestring read FWideCaption write SetWideCaption; + published + property Align; + property Action; + property Anchors; + property AntiAlias: TAntiAlias read FAntiAlias write SetAntiAlias default aaClearType; + property AutoSize: boolean read FAutoSize write SetAutoSizeEx default false; + property BorderStyle: TBorderStyle read FBorderStyle write SetBorderStyle default bsSingle; + property Cancel: Boolean read FCancel write FCancel default False; + //property Caption: string read GetCaption write SetCaption; + property Caption; + property Constraints; + property Default: boolean read FDefault write SetDefault default False; + property Font stored IsFontStored; + property ImageIndex: TImageIndex read FImageIndex write SetImageIndex default -1; + property Images: TImageList read FImages write SetImages; + property DisabledImages: TImageList read FDisabledImages write SetDisabledImages; + property DisabledPicture: TGDIPPicture read FIDisabledPicture write SetDisabledPicture; + property DragMode; + property DragKind; + property FocusType: TFocusType read FFocusType write FFocusType default ftBorder; + property HotImages: TImageList read FHotImages write FHotImages; + property HotPicture: TGDIPPicture read FIHotPicture write SetHotPicture; + property MarginVert: integer read FMarginVert write SetMarginVert default 2; + property MarginHorz: integer read FMarginHorz write SetMarginHorz default 2; + property ModalResult: TModalResult read FModalResult write FModalResult default 0; + property Notes: TStrings read GetNotes write SetNotes; + property NotesFont: TFont read FNotesFont write SetNotesFont; + property OfficeHint: TAdvHintInfo read FOfficeHint write SetOfficeHint; + property ParentFont default true; + property Picture: TGDIPPicture read FIPicture write SetPicture; + property PopupMenu; + property Position: TButtonPosition read FButtonPosition write SetButtonPosition default bpStandalone; + property InitRepeatPause: Integer read FInitRepeatPause write FInitRepeatPause default 400; + property RepeatPause: Integer read FRepeatPause write FRepeatPause default 100; + property RepeatClick: boolean read FRepeatClick write FRepeatClick default false; + property Rounded: Boolean read FRounded write SetRounded default true; + property ShortCutHint: string read FShortCutHintText write FShortCutHintText; + property ShortCutHintPos: TShortCutHintPos read FShortCutHintPos write FShortCutHintPos default shpTop; + property ShowCaption: Boolean read FShowCaption write SetShowCaption default true; + property ShowDisabled: Boolean read FShowDisabled write SetShowDisabled default true; + property Spacing: Integer read FSpacing write SetSpacing default 2; + property Transparent: Boolean read FTransparent write SetTransparent default false; + property Trimming: TStringTrimming read FTrimming write SetTrimming default StringTrimmingNone; + property Version: string read GetVersion write SetVersion stored False; + property WordWrap: boolean read FWordWrap write SetWordWrap default true; + property ShowHint; + property TabOrder; + property TabStop; + property Visible; + property OnClick; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnExit; + property OnEnter; + + property OnStartDock; + property OnStartDrag; + + property OnMouseDown; + property OnMouseUp; + property OnMouseMove; + property OnKeyDown; + property OnKeyUp; + property OnKeyPress; + property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter; + property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave; + property OnDrawButton: TGlowButtonDrawEvent read FOnDrawButton write FOnDrawButton; + end; + + TAdvGlowButton = class(TAdvCustomGlowButton) + private + protected + public + property State; + property DroppedDown; + published + property AllowAllUp; + property Appearance; + property Down; + property Enabled; + property GroupIndex; + property Layout; + property Style; + property MaxButtonSizeState; + property MinButtonSizeState; + property DropDownButton; + property DropDownPosition; + property DropDownDirection; + property DropDownSplit; + property DropDownMenu; + property OnDropDown; + end; + + {$IFNDEF TMS_STD} + + //---- DB aware version + TDBGlowButtonType = (dbCustom, dbFirst, dbPrior, dbNext, dbLast, dbInsert, dbAppend, + dbDelete, dbEdit, dbPost, dbCancel, dbRefresh); + + TDBBDisableControl = (drBOF, drEOF, drReadonly, drNotEditing, drEditing, drEmpty, drEvent); + TDBBDisableControls = set of TDBBDisableControl; + + TBeforeActionEvent = procedure (Sender: TObject; var DoAction: Boolean) of object; + TAfterActionEvent = procedure (Sender: TObject; var ShowException: Boolean) of object; + TGetConfirmEvent = procedure (Sender: TObject; var Question: string; var Buttons: TMsgDlgButtons; var HelpCtx: Longint) of object; + TGetEnabledEvent = procedure (Sender: TObject; var Enabled: Boolean) of object; + + TDBGlowButtonDataLink = class(TDataLink) + private + FOnEditingChanged: TNotifyEvent; + FOnDataSetChanged: TNotifyEvent; + FOnActiveChanged: TNotifyEvent; + protected + procedure EditingChanged; override; + procedure DataSetChanged; override; + procedure ActiveChanged; override; + public + constructor Create; + property OnEditingChanged: TNotifyEvent + read FOnEditingChanged write FOnEditingChanged; + property OnDataSetChanged: TNotifyEvent + read FOnDataSetChanged write FOnDataSetChanged; + property OnActiveChanged: TNotifyEvent + read FOnActiveChanged write FOnActiveChanged; + end; + + TDBAdvGlowButton = class(TAdvCustomGlowButton) + private + FDataLink: TDBGlowButtonDataLink; + FAutoDisable: Boolean; + FDisableControls: TDBBDisableControls; + FOnAfterAction: TAfterActionEvent; + FOnBeforeAction: TBeforeActionEvent; + FDBButtonType: TDBGlowButtonType; + FOnGetConfirm: TGetConfirmEvent; + FOnGetEnabled: TGetEnabledEvent; + FOnEnabledChanged: TNotifyEvent; + FConfirmAction: Boolean; + FConfirmActionString: String; + FInProcUpdateEnabled: Boolean; + procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED; + procedure OnDataSetEvents(Sender: TObject); + + function GetDataSource: TDataSource; + procedure SetDataSource(const Value: TDataSource); + procedure SetDBButtonType(const Value: TDBGlowButtonType); + procedure SetConfirmActionString(const Value: String); + protected + procedure Notification(AComponent: TComponent; AOperation: TOperation); override; + procedure Loaded; override; + procedure CalcDisableReasons; + procedure DoBeforeAction(var DoAction: Boolean); virtual; + procedure DoGetQuestion(var Question: string; var Buttons: TMsgDlgButtons; var HelpCtx: Longint); virtual; + function DoConfirmAction: Boolean; virtual; + procedure DoAction; virtual; + procedure UpdateEnabled; virtual; + procedure LoadGlyph; virtual; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Click; override; + published + property Action; + property Appearance; + property Layout; + property Constraints; + property AutoDisable: Boolean read FAutoDisable write FAutoDisable; + property ConfirmAction: Boolean read FConfirmAction write FConfirmAction; + property ConfirmActionString: String read FConfirmActionString write SetConfirmActionString; + property DataSource: TDataSource read GetDataSource write SetDataSource; + property DBButtonType: TDBGlowButtonType read FDBButtonType write SetDBButtonType; + property DisableControl: TDBBDisableControls read FDisableControls write FDisableControls; + property Enabled; + + property OnBeforeAction: TBeforeActionEvent read FOnBeforeAction write FOnBeforeAction; + property OnAfterAction: TAfterActionEvent read FOnAfterAction write FOnAfterAction; + property OnGetConfirm: TGetConfirmEvent read FOnGetConfirm write FOnGetConfirm; + property OnGetEnabled: TGetEnabledEvent read FOnGetEnabled write FOnGetEnabled; + property OnEnabledChanged: TNotifyEvent read FOnEnabledChanged write FOnEnabledChanged; + end; + + {$ENDIF} + +implementation + +{$IFNDEF TMS_STD} +uses + {$IFDEF DELPHI6_LVL} + VDBConsts + {$ELSE} + DBConsts + {$ENDIF} + ; +{$ENDIF} + +type + TButtonDisplay = (bdNone, bdButton, bdDropDown); + +//------------------------------------------------------------------------------ + +procedure DrawGradient(Canvas: TCanvas; FromColor, ToColor: TColor; Steps: Integer; R: TRect; Direction: Boolean); +var + diffr, startr, endr: Integer; + diffg, startg, endg: Integer; + diffb, startb, endb: Integer; + rstepr, rstepg, rstepb, rstepw: Real; + i, stepw: Word; + +begin + if Steps = 0 then + Steps := 1; + + FromColor := ColorToRGB(FromColor); + ToColor := ColorToRGB(ToColor); + + startr := (FromColor and $0000FF); + startg := (FromColor and $00FF00) shr 8; + startb := (FromColor and $FF0000) shr 16; + endr := (ToColor and $0000FF); + endg := (ToColor and $00FF00) shr 8; + endb := (ToColor and $FF0000) shr 16; + + diffr := endr - startr; + diffg := endg - startg; + diffb := endb - startb; + + rstepr := diffr / steps; + rstepg := diffg / steps; + rstepb := diffb / steps; + + if Direction then + rstepw := (R.Right - R.Left) / Steps + else + rstepw := (R.Bottom - R.Top) / Steps; + + with Canvas do + begin + for i := 0 to steps - 1 do + begin + endr := startr + Round(rstepr * i); + endg := startg + Round(rstepg * i); + endb := startb + Round(rstepb * i); + stepw := Round(i * rstepw); + Pen.Color := endr + (endg shl 8) + (endb shl 16); + Brush.Color := Pen.Color; + if Direction then + Rectangle(R.Left + stepw, R.Top, R.Left + stepw + Round(rstepw) + 1, R.Bottom) + else + Rectangle(R.Left, R.Top + stepw, R.Right, R.Top + stepw + Round(rstepw) + 1); + end; + end; +end; + +//------------------------------------------------------------------------------ + +function BrightnessColor(Col: TColor; Brightness: integer): TColor; overload; +var + r1,g1,b1: Integer; +begin + Col := ColorToRGB(Col); + r1 := GetRValue(Col); + g1 := GetGValue(Col); + b1 := GetBValue(Col); + + if r1 = 0 then + r1 := Max(0,Brightness) + else + r1 := Round( Min(100,(100 + Brightness))/100 * r1 ); + + if g1 = 0 then + g1 := Max(0,Brightness) + else + g1 := Round( Min(100,(100 + Brightness))/100 * g1 ); + + if b1 = 0 then + b1 := Max(0,Brightness) + else + b1 := Round( Min(100,(100 + Brightness))/100 * b1 ); + + Result := RGB(r1,g1,b1); +end; + +//------------------------------------------------------------------------------ + +function BrightnessColor(Col: TColor; BR,BG,BB: integer): TColor; overload; +var + r1,g1,b1: Integer; +begin + Col := Longint(ColorToRGB(Col)); + r1 := GetRValue(Col); + g1 := GetGValue(Col); + b1 := GetBValue(Col); + + if r1 = 0 then + r1 := Max(0,BR) + else + r1 := Round( Min(100,(100 + BR))/100 * r1 ); + + if g1 = 0 then + g1 := Max(0,BG) + else + g1 := Round( Min(100,(100 + BG))/100 * g1 ); + + if b1 = 0 then + b1 := Max(0,BB) + else + b1 := Round( Min(100,(100 + BB))/100 * b1 ); + + Result := RGB(r1,g1,b1); +end; + +//------------------------------------------------------------------------------ + +function BlendColor(Col1,Col2:TColor; BlendFactor:Integer): TColor; +var + r1,g1,b1: Integer; + r2,g2,b2: Integer; + +begin + if BlendFactor >= 100 then + begin + Result := Col1; + Exit; + end; + if BlendFactor <= 0 then + begin + Result := Col2; + Exit; + end; + + Col1 := Longint(ColorToRGB(Col1)); + r1 := GetRValue(Col1); + g1 := GetGValue(Col1); + b1 := GetBValue(Col1); + + Col2 := Longint(ColorToRGB(Col2)); + r2 := GetRValue(Col2); + g2 := GetGValue(Col2); + b2 := GetBValue(Col2); + + r1 := Round( BlendFactor/100 * r1 + (1 - BlendFactor/100) * r2); + g1 := Round( BlendFactor/100 * g1 + (1 - BlendFactor/100) * g2); + b1 := Round( BlendFactor/100 * b1 + (1 - BlendFactor/100) * b2); + + Result := RGB(r1,g1,b1); +end; + + +//------------------------------------------------------------------------------ + +procedure DrawOpenRoundRectMiddle(graphics: TGPGraphics; PC: TColor; X,Y,Width,Height,Radius: integer;Hot:boolean); +var + path:TGPGraphicsPath; + gppen:TGPPen; + +begin + path := TGPGraphicsPath.Create; + + gppen := tgppen.Create(ColorToARGB(PC),1); + path.AddLine(X-1, Y + height, X + width, Y + height); + graphics.DrawPath(gppen, path); + path.Free; + + path := TGPGraphicsPath.Create; + path.AddLine(X-1, Y, X + width, Y); + graphics.DrawPath(gppen, path); + gppen.Free; + path.Free; + + path := TGPGraphicsPath.Create; + gppen := tgppen.Create(ColorToARGB(BrightnessColor(PC,-5)),1); + path.AddLine(X + Width, Y, X + width, Y + Height); + graphics.DrawPath(gppen, path); + gppen.Free; + path.Free; + + if hot then + begin + path := TGPGraphicsPath.Create; + gppen := tgppen.Create(ColorToARGB(BrightnessColor(PC,-5)),1); + path.AddLine(X , Y, X , Y + Height); + graphics.DrawPath(gppen, path); + gppen.Free; + path.Free; + end + else + begin + path := TGPGraphicsPath.Create; + // 3D color effect + gppen := tgppen.Create(ColorToARGB(BrightnessColor(clwhite,-10)),1); + path.AddLine(X, Y + 2, X, Y + Height - 2); + graphics.DrawPath(gppen, path); + gppen.Free; + path.Free; + end; +end; + + +//------------------------------------------------------------------------------ + +procedure DrawOpenRoundRectLeft(graphics: TGPGraphics; PC:TColor; X,Y,Width,Height,Radius: integer); +var + path:TGPGraphicsPath; + gppen:TGPPen; +begin + path := TGPGraphicsPath.Create; + gppen := tgppen.Create(ColorToARGB(PC),1); + path.AddLine(X + width , Y + height, X + radius, Y + height); + path.AddArc(X, Y + height - (radius*2), radius*2, radius*2, 90, 90); + path.AddLine(X, Y + height - (radius*2), X, Y + radius); + path.AddArc(X, Y, radius*2, radius*2, 180, 90); + path.AddLine(X + radius, Y, X + width, Y); + graphics.DrawPath(gppen, path); + gppen.Free; + path.Free; + + path := TGPGraphicsPath.Create; + gppen := tgppen.Create(ColorToARGB(BrightnessColor(PC,-5)),1); + path.AddLine(X + Width , Y, X + width , Y + Height); + graphics.DrawPath(gppen, path); + gppen.Free; + path.Free; + +end; + +procedure DrawOpenRoundRectRight(graphics: TGPGraphics; PC: TColor; X,Y,Width,Height,Radius: integer;Hot: boolean); +var + path:TGPGraphicsPath; + gppen:TGPPen; +begin + path := TGPGraphicsPath.Create; + gppen := tgppen.Create(ColorToARGB(PC),1); + path.AddLine(X, Y, X + width - (radius *2), Y); + path.AddArc(X + width - (radius*2), Y, radius*2, radius*2, 270, 90); + path.AddLine(X + width, Y + radius, X + width, Y + height - (radius*2)); + path.AddArc(X + width - (radius*2), Y + height - (radius*2), radius*2, radius*2,0,90); + path.AddLine(X + width , Y + height, X, Y + height); + graphics.DrawPath(gppen, path); + gppen.Free; + + path.Free; + + + if hot then + begin + path := TGPGraphicsPath.Create; + gppen := tgppen.Create(ColorToARGB(BrightnessColor(PC,-5)),1); + path.AddLine(X , Y, X , Y + Height); + graphics.DrawPath(gppen, path); + gppen.Free; + path.Free; + end + else + begin + path := TGPGraphicsPath.Create; + // 3D color effect + gppen := tgppen.Create(ColorToARGB(BrightnessColor(clwhite,-10)),1); + path.AddLine(X, Y + 2, X, Y + Height - 2); + graphics.DrawPath(gppen, path); + gppen.Free; + path.Free; + end; +end; + +//------------------------------------------------------------------------------ + +procedure DrawDottedRoundRect(graphics: TGPGraphics; PC: TColor; X,Y,Width,Height,Radius: integer); +var + path:TGPGraphicsPath; + gppen:TGPPen; +begin + path := TGPGraphicsPath.Create; + gppen := tgppen.Create(ColorToARGB(PC),1); + gppen.SetDashStyle(DashStyleDot); + path.AddLine(X + radius, Y, X + width - (radius*2), Y); + path.AddArc(X + width - (radius*2), Y, radius*2, radius*2, 270, 90); + path.AddLine(X + width, Y + radius, X + width, Y + height - (radius*2)); + path.AddArc(X + width - (radius*2), Y + height - (radius*2), radius*2, radius*2,0,90); + path.AddLine(X + width - (radius*2), Y + height, X + radius, Y + height); + path.AddArc(X, Y + height - (radius*2), radius*2, radius*2, 90, 90); + path.AddLine(X, Y + height - (radius*2), X, Y + radius); + path.AddArc(X, Y, radius*2, radius*2, 180, 90); + path.CloseFigure; + graphics.DrawPath(gppen, path); + gppen.Free; + path.Free; +end; + + +//------------------------------------------------------------------------------ + +procedure DrawRoundRect(graphics: TGPGraphics; PC: TColor; X,Y,Width,Height,Radius: integer); +var + path:TGPGraphicsPath; + gppen:TGPPen; + r: integer; +begin + gppen := tgppen.Create(ColorToARGB(PC),1); + + if radius = 0 then + begin + graphics.DrawRectangle(gppen, X, Y, Width, Height); + end + else + begin + r := radius * 2; + path := TGPGraphicsPath.Create; + //gppen := tgppen.Create(ColorToARGB(PC),1); + path.AddLine(X + radius, Y, X + width - r, Y); + path.AddArc(X + width - r, Y, r, r, 270, 90); + path.AddLine(X + width, Y + radius, X + width, Y + height - r); + path.AddArc(X + width - r, Y + height - r, r, r,0,90); + path.AddLine(X + width - r, Y + height, X + radius, Y + height); + path.AddArc(X, Y + height - r, r, r, 90, 90); + path.AddLine(X, Y + height - r, X, Y + radius); + path.AddArc(X, Y, r, r, 180, 90); + path.CloseFigure; + graphics.DrawPath(gppen, path); + path.Free; + end; + gppen.Free; +end; + +procedure DrawArrow(Canvas: TCanvas; ArP: TPoint; ArClr, ArShad: TColor; Down:boolean); +begin + if Down then + begin + Canvas.Pen.Color := ArClr; + Canvas.MoveTo(ArP.X, ArP.Y); + Canvas.LineTo(ArP.X + 5, ArP.Y); + Canvas.MoveTo(ArP.X + 1, ArP.Y + 1); + Canvas.LineTo(ArP.X + 4, ArP.Y + 1); + Canvas.Pixels[ArP.X + 2, ArP.Y + 2] := ArClr; + Canvas.Pixels[ArP.X, ArP.Y + 1] := ArShad; + Canvas.Pixels[ArP.X + 4, ArP.Y + 1] := ArShad; + Canvas.Pixels[ArP.X + 1, ArP.Y + 2] := ArShad; + Canvas.Pixels[ArP.X + 3, ArP.Y + 2] := ArShad; + Canvas.Pixels[ArP.X + 2, ArP.Y + 3] := ArShad; + end + else + begin + Canvas.Pen.Color := ArClr; + Canvas.MoveTo(ArP.X, ArP.Y); + Canvas.LineTo(ArP.X, ArP.Y + 5); + Canvas.MoveTo(ArP.X + 1, ArP.Y + 1); + Canvas.LineTo(ArP.X + 1, ArP.Y + 4); + Canvas.Pixels[ArP.X + 2, ArP.Y + 2] := ArClr; + Canvas.Pixels[ArP.X + 2, ArP.Y + 1] := ArShad; + Canvas.Pixels[ArP.X + 1, ArP.Y + 4] := ArShad; + Canvas.Pixels[ArP.X + 2, ArP.Y + 1] := ArShad; + Canvas.Pixels[ArP.X + 3, ArP.Y + 2] := ArShad; + Canvas.Pixels[ArP.X + 3, ArP.Y + 2] := ArShad; + end; +end; + +procedure DrawButtonBackground(Canvas: TCanvas; Graphics: TGPGraphics; R: TRect; CF,CT: TColor; Gradient: TGDIPGradient; Upper: boolean); +var + path: TGPGraphicsPath; + pthGrBrush: TGPPathGradientBrush; + linGrBrush: TGPLinearGradientBrush; + solGrBrush: TGPSolidBrush; + + w,h,w2,h2: Integer; + colors : array[0..0] of TGPColor; + count: Integer; + +begin + w := r.Right - r.Left; + h := r.Bottom - r.Top; + + h2 := h div 2; + w2 := w div 2; + + { + // draw background + if Upper then + Canvas.Brush.Color := CF + else + Canvas.Brush.Color := CT; + Canvas.FillRect(rect(r.Left , r.Top, r.Right , r.Bottom)); + } + + if Upper then + solGrBrush := TGPSolidBrush.Create(ColorToARGB(CF)) + else + solGrBrush := TGPSolidBrush.Create(ColorToARGB(CT)); + + Graphics.FillRectangle(solGrBrush, MakeRect(r.Left , r.Top, r.Right , r.Bottom)); + + solGrBrush.Free; + + // Create a path that consists of a single ellipse. + path := TGPGraphicsPath.Create; + + if Upper then // take borders in account + path.AddEllipse(r.Left, r.Top - h2 + 2, r.Right , r.Bottom) + else + path.AddEllipse(r.Left, r.Top, r.Right , r.Bottom); + + pthGrBrush := nil; + linGrBrush := nil; + + case Gradient of + ggRadial: pthGrBrush := TGPPathGradientBrush.Create(path); + ggVertical: linGrBrush := TGPLinearGradientBrush.Create(MakeRect(r.Left,r.Top,w,h),ColorToARGB(CF),ColorToARGB(CT), LinearGradientModeVertical); + ggDiagonalForward: linGrBrush := TGPLinearGradientBrush.Create(MakeRect(r.Left,r.Top,w,h),ColorToARGB(CF),ColorToARGB(CT), LinearGradientModeForwardDiagonal); + ggDiagonalBackward: linGrBrush := TGPLinearGradientBrush.Create(MakeRect(r.Left,r.Top,w,h),ColorToARGB(CF),ColorToARGB(CT), LinearGradientModeBackwardDiagonal); + end; + + if Gradient = ggRadial then + begin + if Upper then + pthGrBrush.SetCenterPoint(MakePoint(r.Left + w2, r.Top)) + else + pthGrBrush.SetCenterPoint(MakePoint(r.Left + w2, r.Bottom)); + + // Set the color at the center point to blue. + if Upper then + begin + pthGrBrush.SetCenterColor(ColorToARGB(CT)); + colors[0] := ColorToARGB(CF); + end + else + begin + pthGrBrush.SetCenterColor(ColorToARGB(CF)); + colors[0] := ColorToARGB(CT); + end; + + count := 1; + pthGrBrush.SetSurroundColors(@colors, count); + graphics.FillRectangle(pthGrBrush, r.Left, r.Top, r.Right, r.Bottom); + pthGrBrush.Free; + end + else + begin + graphics.FillRectangle(linGrBrush, r.Left, r.Top, r.Right, r.Bottom); + linGrBrush.Free; + end; + + path.Free; +end; + +//------------------------------------------------------------------------------ + +procedure DrawStretchPicture(graphics : TGPGraphics; Canvas: TCanvas; R: TRect; Pic: TGDIPPicture); +var + Img: TGPImage; + pstm: IStream; + hGlobal: THandle; + pcbWrite: Longint; + ms: TMemoryStream; + bmp: TBitmap; +begin + ms := TMemoryStream.Create; + Pic.SaveToStream(ms); + hGlobal := GlobalAlloc(GMEM_MOVEABLE, ms.Size); + if (hGlobal = 0) then + begin + ms.Free; + raise Exception.Create('Could not allocate memory for image'); + end; + + try + pstm := nil; + + // Create IStream* from global memory + CreateStreamOnHGlobal(hGlobal, TRUE, pstm); + pstm.Write(ms.Memory, ms.Size,@pcbWrite); + + Img := TGPImage.Create(pstm); + if Img.GetFormat = ifBMP then + begin // use this alternative for easy bitmap auto transparent drawing + bmp := TBitmap.Create; + ms.Position := 0; + bmp.LoadFromStream(ms); + bmp.TransparentMode := tmAuto; + bmp.Transparent := true; + Canvas.StretchDraw(R, bmp); + bmp.Free; + end + else + begin + graphics.DrawImageRect(Img, R.Left, R.Top, R.Right - R.Left, R.Bottom - R.Top); + end; + + Img.Free; + ms.Free; + finally + GlobalFree(hGlobal); + end; +end; + +//------------------------------------------------------------------------------ + +function DrawVistaButton(Canvas: TCanvas; r: TRect; CFU, CTU, CFB, CTB, PC: TColor; + GradientU, GradientB: TGDIPGradient; Caption:string; WideCaption: widestring; DrawCaption: Boolean; AFont: TFont; + Images: TImageList; ImageIndex: Integer; EnabledImage: Boolean; Layout: TButtonLayout; + DropDownButton: Boolean; DrawDwLine: Boolean; Enabled: Boolean; Focus: Boolean; DropDownPos: TDropDownPosition; + Picture: TGDIPPicture; ForcePicSize: TSize; AntiAlias: TAntiAlias; DrawPic: Boolean; Glyph: TBitmap; ButtonDisplay: TButtonDisplay; Transparent, Hot: boolean; + ButtonPosition: TButtonPosition; DropDownSplit, DrawBorder, OverlapText, WordWrap, AutoSize, Rounded, DropDir: Boolean; Spacing: integer; + Trimming: TStringTrimming;Notes: TStringList; NotesFont: TFont;Checked: boolean): TSize; +var + graphics : TGPGraphics; + path: TGPGraphicsPath; + pthGrBrush: TGPPathGradientBrush; + linGrBrush: TGPLinearGradientBrush; + count: Integer; + w,h,h2,h2d: Integer; + colors : array[0..0] of TGPColor; + fontFamily,nfontFamily: TGPFontFamily; + font,nfont: TGPFont; + rectf: TGPRectF; + stringFormat: TGPStringFormat; + solidBrush,nsolidBrush: TGPSolidBrush; + x1,y1,x2,y2: single; + fs,nfs: integer; + sizerect: TGPRectF; + noterect: TGPRectF; + ImgX, ImgY, ImgW, ImgH: Integer; + BtnR, DwR: TRect; + BR1,BR2: TRect; + DR1,DR2: TRect; + AP: TPoint; + szRect: TRect; + tm: TTextMetric; + ttf: boolean; + Radius: integer; + uformat,wwformat: Cardinal; + tdrect: TRect; + th, px, py: integer; + notesrect: TRect; + +begin + BtnR := R; + + if Rounded then + Radius := 3 + else + Radius := 0; + + if DropDownPos = dpRight then + begin + DwR := Rect(BtnR.Right - DropDownSectWidth, BtnR.Top, BtnR.Right, BtnR.Bottom); + if DropDownButton then + BtnR.Right := DwR.Left; + end + else // DropDownPos = doBottom + begin + DwR := Rect(BtnR.Left, BtnR.Bottom - DropDownSectWidth, BtnR.Right, BtnR.Bottom); + if DropDownButton then + BtnR.Bottom := DwR.Top; + end; + + if (Notes.Text <> '') then + Layout := blGlyphLeftAdjusted; + + w := r.Right - r.Left; + h := r.Bottom - r.Top; + + h2 := h div 2; + + // Create GDI+ canvas + graphics := TGPGraphics.Create(Canvas.Handle); + + if not Transparent then + begin + + if DropDownButton and (DrawDwLine) and DropDownSplit then + begin + if DropDownPos = dpRight then + begin + DR1 := Rect(r.Right - 12, r.Top + h2 - 1, r.Right, r.Bottom); + DR2 := Rect(r.Right - 12, r.Top, r.Right, r.Bottom - h2); + BR1 := Rect(r.Left, r.Top + h2 - 1, r.Right - 12, r.Bottom); + BR2 := Rect(r.Left, r.Top, r.Right - 12, r.Bottom - h2); + end + else + begin + DR1 := Rect(r.Left, r.Bottom - 6, r.Right, r.Bottom); + DR2 := Rect(r.Left, r.Bottom - 12, r.Right, r.Bottom - 6); + + DR2 := Rect(r.Left, r.Bottom - 12, r.Right, r.Bottom); + + h2d := (r.Bottom - r.Top - 12) div 2; + BR1 := Rect(r.Left, r.Top + h2d - 1, r.Right, r.Bottom - 12); + BR2 := Rect(r.Left, r.Top, r.Right, r.Bottom - 12 - h2d); + end; + + if ButtonDisplay = bdDropDown then + begin + DrawButtonBackground(Canvas, Graphics, BR1, CTB, CFB, GradientB, False); + DrawButtonBackground(Canvas, Graphics, BR2, CFU, CTU, GradientU, True); + + DrawButtonBackground(Canvas, Graphics, DR2, BrightnessColor(CFU,-10), BrightnessColor(CTU,-10), GradientU, True); + if (DropDownPos = dpRight) then + DrawButtonBackground(Canvas, Graphics, DR1, BrightnessColor(CTB,-10), BrightnessColor(CFB,-10), GradientB, False); + end + else + begin + DrawButtonBackground(Canvas, Graphics, BR1, BrightnessColor(CTB,-10), BrightnessColor(CFB,-10), GradientB, False); + DrawButtonBackground(Canvas, Graphics, BR2, BrightnessColor(CFU,-10), BrightnessColor(CTU,-10), GradientU, True); + + DrawButtonBackground(Canvas, Graphics, DR2, CFU, CTU, ggRadial, True); + if DropDownPos = dpRight then + DrawButtonBackground(Canvas, Graphics, DR1, CTB, CFB, GradientB, False); + end; + end + else + begin + DrawButtonBackground(Canvas, Graphics, Rect(r.Left, r.Top + h2 - 1, r.Right, r.Bottom), CTB, CFB, GradientB, False); + DrawButtonBackground(Canvas, Graphics, Rect(r.Left, r.Top, r.Right, r.Bottom - h2), CFU, CTU, GradientU, True); + end; + end; + + graphics.SetSmoothingMode(SmoothingModeAntiAlias); + + if not Transparent and DrawBorder then + begin + case ButtonPosition of + bpStandalone: DrawRoundRect(Graphics, PC, r.Left, r.Top, r.Right - 1, r.Bottom - 1, Radius); + bpLeft: DrawOpenRoundRectLeft(Graphics, PC, r.Left, r.Top, r.Right - 1, r.Bottom - 1, Radius); + bpRight: DrawOpenRoundRectRight(Graphics, PC, r.Left, r.Top, r.Right - 1, r.Bottom - 1, Radius, Hot or Checked); + bpMiddle: DrawOpenRoundRectMiddle(Graphics, PC, r.Left, r.Top, r.Right - 1, r.Bottom - 1, Radius, Hot or Checked); + end; + end; + + if Focus then // Draw focus line + begin + graphics.SetSmoothingMode(SmoothingModeAntiAlias); + DrawRoundRect(graphics, $E4AD89,r.Left + 1,r.Top + 1, r.Right - 3, r.Bottom - 3, Radius); + graphics.SetSmoothingMode(SmoothingModeAntiAlias); + DrawDottedRoundRect(graphics, clGray,r.Left + 2,r.Top + 2, r.Right - 5, r.Bottom - 5, Radius); + end; + + ImgX := 0; + ImgY := 0; + ImgH := 0; + ImgW := 0; + + fontFamily := TGPFontFamily.Create(AFont.Name); + + if (fontFamily.Status in [FontFamilyNotFound, FontStyleNotFound]) then + begin + fontFamily.Free; + fontFamily := TGPFontFamily.Create('Arial'); + end; + + nfontFamily := TGPFontFamily.Create(NotesFont.Name); + + if (nfontFamily.Status in [FontFamilyNotFound, FontStyleNotFound]) then + begin + nfontFamily.Free; + nfontFamily := TGPFontFamily.Create('Arial'); + end; + + + fs := 0; + if (fsBold in AFont.Style) then + fs := fs + 1; + if (fsItalic in AFont.Style) then + fs := fs + 2; + if (fsUnderline in AFont.Style) then + fs := fs + 4; + + nfs := 0; + if (fsBold in NotesFont.Style) then + nfs := nfs + 1; + if (fsItalic in NotesFont.Style) then + nfs := nfs + 2; + if (fsUnderline in NotesFont.Style) then + nfs := nfs + 4; + + if Assigned(Glyph) and not Glyph.Empty and (Glyph.Width > 1) and (Glyph.Height > 1) then + begin + ImgW := Glyph.Width; + ImgH := Glyph.Height; + + if (ForcePicSize.CX > 0) and (ForcePicSize.CY > 0) then + begin + ImgW := ForcePicSize.CX; + ImgH := ForcePicSize.CY; + end; + end + else if Assigned(Picture) and not Picture.Empty then + begin + Picture.GetImageSizes; + ImgW := Picture.Width; + ImgH := Picture.Height; + if (ForcePicSize.CX > 0) and (ForcePicSize.CY > 0) then + begin + ImgW := ForcePicSize.CX; + ImgH := ForcePicSize.CY; + end; + end + else + begin + if (ImageIndex > -1) and Assigned(Images) then + begin + ImgW := Images.Width; + ImgH := Images.Height; + {end + else if Assigned(ToolImage) and not (ToolImage.Empty) and (ToolImage.Width > 1) then + begin + ImgW := ToolImage.Width; + ImgH := ToolImage.Height; } + end; + end; + + if DrawCaption and ((Caption <> '') or (WideCaption <> '')) then + if (ImgW > 0) then + ImgW := ImgW + Spacing; + + Result.cx := ImgW; + Result.cy := ImgH; + + if (Caption <> '') or (WideCaption <> '') then + begin + if pos('\n',caption) > 0 then + begin + if (ForcePicSize.cx > 0) and (ForcePicSize.cy > 0) then + Caption := StringReplace(caption, '\n', ' ', [rfReplaceAll, rfIgnoreCase]) + else + Caption := StringReplace(caption, '\n', #10#13, [rfReplaceAll, rfIgnoreCase]); + end; + + Canvas.Font.Name := AFont.Name; + + ttf := false; + + GetTextMetrics(Canvas.Handle, tm); + + if ((tm.tmPitchAndFamily AND TMPF_VECTOR) = TMPF_VECTOR) then + begin + if not ((tm.tmPitchAndFamily AND TMPF_DEVICE) = TMPF_DEVICE) then + begin + ttf := true; + end + end; + + if Screen.Fonts.IndexOf(AFont.Name) = -1 then + ttf := false; + + font := TGPFont.Create(fontFamily, AFont.Size , fs, UnitPoint); + + w := BtnR.Right - BtnR.Left; + h := BtnR.Bottom - BtnR.Top; + + x1 := r.Left; + y1 := r.Top; + x2 := w; + y2 := h; + + if AutoSize then + begin + x2 := 4096; + y2 := 4096; + end; + + rectf := MakeRect(x1,y1,x2,y2); + + if WordWrap then + stringFormat := TGPStringFormat.Create(0) + else + stringFormat := TGPStringFormat.Create(GDIP_NOWRAP); + + if Enabled then + solidBrush := TGPSolidBrush.Create(ColorToARGB(AFont.Color)) + else + solidBrush := TGPSolidBrush.Create(ColorToARGB(clGray)); + + // Center-justify each line of text. + // stringFormat.SetAlignment(StringAlignmentCenter); + case Layout of + blGlyphLeftAdjusted: stringFormat.SetAlignment(StringAlignmentNear); + blGlyphRightAdjusted: stringFormat.SetAlignment(StringAlignmentFar); + else stringFormat.SetAlignment(StringAlignmentCenter); + end; + + // Center the block of text (top to bottom) in the rectangle. + + case Layout of + blGlyphTopAdjusted: stringFormat.SetLineAlignment(StringAlignmentNear); + blGlyphBottomAdjusted: stringFormat.SetLineAlignment(StringAlignmentFar); + else stringFormat.SetLineAlignment(StringAlignmentCenter); + end; + + stringFormat.SetHotkeyPrefix(HotkeyPrefixShow); + stringFormat.SetTrimming(Trimming); + + case AntiAlias of + aaClearType:graphics.SetTextRenderingHint(TextRenderingHintClearTypeGridFit); + aaAntiAlias:graphics.SetTextRenderingHint(TextRenderingHintAntiAlias); + end; + + if (AntiAlias = aaNone) or not ttf then + begin + Canvas.Font.Assign(AFont); + szRect.Left := round(rectf.X); + szRect.Top := round(rectf.Y); + + szRect.Right := szRect.Left + 2; + + if Caption <> '' then + szRect.Bottom := DrawText(Canvas.Handle,PChar(Caption),Length(Caption), szrect, DT_CALCRECT or DT_LEFT or DT_SINGLELINE{ or DT_VCENTER}) + else + szRect.Bottom := DrawTextW(Canvas.Handle,PWideChar(WideCaption),Length(WideCaption), szrect, DT_CALCRECT or DT_LEFT or DT_SINGLELINE{ or DT_VCENTER}); + + sizeRect.Width := szRect.Right - szRect.Left; + sizeRect.Height := szRect.Bottom - szRect.Top; + + notesRect := Rect(0,0,0,0); + + if Notes.Text <> '' then + begin + Canvas.Font.Assign(NotesFont); + notesRect.Left := round(rectf.X); + notesRect.Top := round(rectf.Y); + notesRect.Right := notesRect.Left + 2; + notesRect.Bottom := DrawText(Canvas.Handle,PChar(Notes.Text),Length(Notes.Text), notesRect, DT_CALCRECT or DT_LEFT or DT_WORDBREAK); + + noteRect.Width := notesRect.Right - notesRect.Left; + noteRect.Height := notesRect.Bottom - notesRect.Top; + end; + + case Layout of + blGlyphLeft: + begin + sizeRect.X := (w - (szRect.Right - szRect.Left) - ImgW) div 2; + sizeRect.Y := szRect.Top; + Result.cx := ImgW + Spacing + round(sizerect.Width); + Result.cy := Max(ImgH + Spacing, Spacing + round(sizerect.Height)); + end; + blGlyphLeftAdjusted: + begin + sizeRect.X := szRect.Left; + sizeRect.Y := szRect.Top; + Result.cx := ImgW + Spacing + Max(round(sizerect.Width),round(noteRect.Width)); + Result.cy := Max(ImgH + Spacing, Spacing + round(sizerect.Height)+round(noteRect.Height)); + end; + blGlyphTop: + begin + sizeRect.X := szRect.Left; + sizeRect.Y := (h - (szRect.Bottom - szRect.Top) - ImgH - 2) div 2; + Result.cx := Max(ImgW + Spacing, Spacing + round(sizerect.Width)); + Result.cy := ImgH + Spacing + round(sizerect.Height); + end; + blGlyphTopAdjusted: + begin + sizeRect.X := szRect.Left; + sizeRect.Y := szRect.Top; + Result.cx := Max(ImgW + Spacing, Spacing + round(sizerect.Width)); + Result.cy := ImgH + Spacing + round(sizerect.Height); + end; + blGlyphRight: + begin + sizeRect.X := szRect.Left; + sizeRect.Y := szRect.Top; + Result.cx := ImgW + Spacing + round(sizerect.Width); + Result.cy := Max(ImgH + Spacing, Spacing + round(sizerect.Height)); + end; + blGlyphRightAdjusted: + begin + sizeRect.X := szRect.Left; + sizeRect.Y := szRect.Top; + Result.cx := ImgW + Spacing + round(sizerect.Width); + Result.cy := Max(ImgH + Spacing, Spacing + round(sizerect.Height)); + end; + blGlyphBottom: + begin + sizeRect.X := szRect.Left; + sizeRect.Y := szRect.Top; + Result.cx := Max(ImgW + Spacing, Spacing + round(sizerect.Width)); + Result.cy := ImgH + Spacing + round(sizerect.Height); + end; + blGlyphBottomAdjusted: + begin + sizeRect.X := szRect.Left; + sizeRect.Y := szRect.Top; + Result.cx := Max(ImgW + Spacing, Spacing + round(sizerect.Width)); + Result.cy := ImgH + Spacing + round(sizerect.Height); + end; + end; + //Result.cx := ImgW + Spacing + round(sizerect.Width); + //Result.cy := Max(ImgH + Spacing, Spacing + round(sizerect.Height)); + end + else + begin + if Caption <> '' then + graphics.MeasureString(Caption, Length(Caption), font, rectf, stringFormat, sizeRect) + else + graphics.MeasureString(WideCaption, Length(WideCaption), font, rectf, stringFormat, sizeRect); + + noteRect := MakeRect(0,0,0,0); + + if Notes.Text <> '' then + begin + nfont := TGPFont.Create(nfontFamily, NotesFont.Size , nfs, UnitPoint); + graphics.MeasureString(Notes.Text, Length(Notes.Text), nfont, rectf, stringFormat, noteRect); + nfont.Free; + end; + + case Layout of + blGlyphLeft, blGlyphLeftAdjusted, blGlyphRight, blGlyphRightAdjusted: + begin + Result.cx := ImgW + Spacing + Max(round(sizerect.Width), round(noteRect.Width)); + Result.cy := Max(ImgH + Spacing, Spacing + round(sizerect.Height)+round(noteRect.Height)); + end; + blGlyphTop, blGlyphTopAdjusted, blGlyphBottom, blGlyphBottomAdjusted: + begin + Result.cx := Max(ImgW + Spacing, Spacing + round(sizerect.Width)); + Result.cy := ImgH + Spacing + round(sizerect.Height); + end; + end; + end; + + if not AutoSize then + begin + if not WordWrap then + begin + x2 := w; + y2 := h; + rectf := MakeRect(x1,y1,x2,y2); + end; + + +// if (ImgW > 0) then + begin + case Layout of + blGlyphLeft: + begin + if (AntiAlias = aaNone) or not ttf then + begin + x1 := sizeRect.X + ImgW; + x2 := w - 2 - ImgW; + ImgX := round(sizeRect.X); + end + else + begin + x1 := r.Left + 2 + ImgW; + x2 := w - 2 - ImgW; + ImgX := round(sizerect.X - ImgW div 2); + end; + if ImgX < 2 then ImgX := 2; + ImgY := r.Top + Max(0, (h - ImgH) div 2); + end; + blGlyphLeftAdjusted: + begin + x1 := r.Left + 2 + ImgW; + x2 := w - 2 - ImgW; + + ImgX := round(sizerect.X - ImgW div 2); + if ImgX < 2 then ImgX := 2; + ImgY := r.Top + Max(0, (h - ImgH) div 2); + end; + blGlyphTop: + begin + if (AntiAlias = aaNone) or not ttf then + begin + y1 := r.Top + ImgH; + // y1 := sizeRect.Y + ImgH; + y2 := h - 2 - ImgH; + + ImgX := r.Left + Max(0, (w - ImgW) div 2); +// ImgY := round(sizeRect.Y); + ImgY := round(y2 - sizerect.Height); + ImgY := Max(0, ImgY div 2); + ImgY := round(y1) - ImgH + ImgY - 4; + end + else + begin + y1 := r.Top + ImgH; + y2 := h - 2 - ImgH; + ImgX := r.Left + Max(0, (w - ImgW) div 2); + ImgY := round(y2 - sizerect.Height); + ImgY := Max(0, ImgY div 2); + ImgY := round(y1) - ImgH + ImgY; + end; + if ImgY < 2 then ImgY := 2; + end; + blGlyphTopAdjusted: + begin + y1 := r.Top{ + 2} + ImgH; + y2 := h - 2 - ImgH; + + ImgX := r.Left + Max(0, (w - ImgW) div 2); + if Layout = blGlyphTopAdjusted then + ImgY := 0 //force to top margin + else + ImgY := round(y2 - sizerect.Height); + ImgY := Max(0, ImgY div 2); + ImgY := round(y1) - ImgH + ImgY; //round(sizerect.Height) - ImgY - 4; + if ImgY < 2 then ImgY := 2; + end; + blGlyphRight, blGlyphRightAdjusted: + begin + x1 := 2; + x2 := w - 4 - ImgW; + if Layout = blGlyphRightAdjusted then + ImgX := w - ImgW - 2 + else + begin + + ImgX := round(X2 - sizerect.width); + ImgX := Max(0, ImgX div 2); + ImgX := ImgX + round(sizerect.width) + 4; + if ImgX > (w - ImgW) then + ImgX := w - ImgW - 2; + end; + ImgY := r.Top + Max(0, (h - ImgH) div 2); + end; + blGlyphBottom: + begin + if (AntiAlias = aaNone) or not ttf then + begin + y1 := 2; + y2 := h - 2 - ImgH; + + ImgX := r.Left + Max(0, (w - ImgW) div 2); + ImgY := round(y2 - sizerect.Height); + ImgY := Max(0, ImgY div 2); + ImgY := round(sizerect.Height + 5) + ImgY; + if ImgY > (h - ImgH) then ImgY := h - ImgH - 2; + end + else + begin + y1 := 2; + y2 := h - 2 - ImgH; + + ImgX := r.Left + Max(0, (w - ImgW) div 2); + ImgY := round(y2 - sizerect.Height); + ImgY := Max(0, ImgY div 2); + ImgY := round(sizerect.Height + 2) + ImgY; + if ImgY > (h - ImgH) then ImgY := h - ImgH - 2; + end; + end; + blGlyphBottomAdjusted: + begin + if (AntiAlias = aaNone) or not ttf then + begin + y1 := 2; + y2 := h - 4 - ImgH; + + ImgX := r.Left + Max(0, (w - ImgW) div 2); + ImgY := (h - ImgH - 2); + end + else + begin + y1 := 2; + y2 := h - 2 - ImgH; + + ImgX := r.Left + Max(0, (w - ImgW) div 2); + if Layout = blGlyphBottomAdjusted then + ImgY := h; //force to bottom margin + + ImgY := Max(0, ImgY div 2); + ImgY := round(sizerect.Height + 2) + ImgY; + if ImgY > (h - ImgH) then ImgY := h - ImgH - 2; + end; + end; + end; + end; + + if OverlapText then + rectf := MakeRect(r.Left, r.Top, r.Right, r.Bottom) + else + rectf := MakeRect(x1, y1, x2, y2); + + if DrawPic and OverlapText then + begin + if Assigned(Glyph) and not Glyph.Empty and (Glyph.Width > 1) and (Glyph.Height > 1) then + Canvas.Draw(ImgX, ImgY, Glyph); + end; + + if DrawCaption then + begin + if (AntiAlias = aaNone) or not ttf then + begin + szRect.Left := round(rectf.X); + szRect.Top := round(rectf.Y); + szRect.Right := szRect.Left + round(rectf.Width); + szRect.Bottom := szRect.Top + round(rectf.Height); + + Canvas.Brush.Style := bsClear; + if WordWrap then + wwformat := 0 + else + wwformat := DT_SINGLELINE; + + uformat := DT_VCENTER or wwformat; + + case Layout of + blGlyphLeft: + begin + uformat := DT_VCENTER or wwformat or DT_LEFT; + szrect.Left := szrect.Left; + end; + blGlyphLeftAdjusted: + begin + uformat := DT_VCENTER or wwformat or DT_LEFT; + szrect.Left := szrect.Left + 2; + + if Notes.Text <> '' then + begin + uformat := uformat AND NOT DT_VCENTER; + szrect.Top := ((szRect.Bottom - szRect.Top) - round(sizeRect.Height) - round(noteRect.Height)) div 2; + end; + + end; + blGlyphTop: + begin + uformat := DT_TOP or wwformat or DT_CENTER or DT_VCENTER; + end; + blGlyphTopAdjusted: uformat := DT_TOP or wwformat or DT_CENTER; + blGlyphRight: uformat := DT_VCENTER or wwformat or DT_CENTER; + blGlyphRightAdjusted: uformat := DT_VCENTER or wwformat or DT_RIGHT; + blGlyphBottom: uformat := DT_VCENTER or wwformat or DT_CENTER; + blGlyphBottomAdjusted: uformat := DT_BOTTOM or wwformat or DT_CENTER; + end; + + tdrect := szrect; + + Canvas.Font.Assign(AFont); + + if not Enabled then + Canvas.Font.Color := clGray; + + if WordWrap then + begin + if Caption <> '' then + th := DrawText(Canvas.Handle,PChar(Caption),Length(Caption), szrect, uformat or DT_CALCRECT) + else + th := DrawTextW(Canvas.Handle,PWideChar(WideCaption),Length(WideCaption), szrect, uformat or DT_CALCRECT); + + case Layout of + blGlyphTopAdjusted: + begin + // do nothing + end; + blGlyphTop: + begin + tdrect.Top := ImgY + ImgH; + tdrect.Top := tdrect.Top + (tdrect.Bottom - tdrect.Top - th) div 2; + end; + blGlyphBottomAdjusted: + begin + tdrect.Top := tdrect.Bottom - th; + end; + else + begin + tdrect.Top := (tdrect.Bottom - tdrect.Top - th) div 2; + end; + end; + end; + + if Caption <> '' then + DrawText(Canvas.Handle,PChar(Caption),Length(Caption), tdrect, uformat) + else + DrawTextW(Canvas.Handle,PWideChar(WideCaption),Length(WideCaption), tdrect, uformat); + + if (Notes.Text <> '') then + begin + tdRect.Top := tdRect.Top + round(sizeRect.Height); + tdRect.Bottom := tdRect.Top + round(noteRect.Height); + Canvas.Font.Assign(NotesFont); + DrawText(Canvas.Handle,PChar(Notes.Text),Length(Notes.Text), tdrect, uformat); + end; + end + else + begin + if (Notes.Text <> '') then + begin + stringFormat.SetLineAlignment(StringAlignmentNear); + rectf.Y := rectf.Y + ((rectf.Height) - round(sizeRect.Height) - round(noteRect.Height)) / 2; + end; + + if (Caption <> '') then + graphics.DrawString(Caption, Length(Caption), font, rectf, stringFormat, solidBrush) + else + graphics.DrawString(WideCaption, Length(WideCaption), font, rectf, stringFormat, solidBrush); + + if (Notes.Text <> '') then + begin + rectf.Y := rectf.Y + round(sizeRect.Height); + nfont := TGPFont.Create(nfontFamily, NotesFont.Size , nfs, UnitPoint); + nsolidBrush := TGPSolidBrush.Create(ColorToARGB(NotesFont.Color)); + graphics.DrawString(Notes.Text, Length(Notes.Text), nfont, rectf, stringFormat, nsolidBrush); + nsolidBrush.Free; + nfont.Free; + end + end; + end; + end; + + stringformat.Free; + solidBrush.Free; + font.Free; + end; + + + fontFamily.Free; + nfontFamily.Free; + + if not AutoSize then + begin + if DropDownButton then + begin + if DropDownPos = dpRight then + w := w - 8 + else + h := h - 8; + end; + + if DrawPic and not OverlapText then + begin + if Assigned(Glyph) and not Glyph.Empty and (Glyph.Width > 1) and (Glyph.Height > 1) then + begin + if (ForcePicSize.CX > 0) and (ForcePicSize.CY > 0) then + begin + Glyph.Transparent := True; + if (Caption = '') and (WideCaption = '') then + begin + px := r.Left + Max(0, (w - ImgW) div 2); + py := r.Top + Max(0, (h - ImgH) div 2); + Canvas.StretchDraw(Rect(px, py, px + ForcePicSize.CX, py + ForcePicSize.CY), Glyph); + end + else + Canvas.StretchDraw(Rect(ImgX, ImgY, ImgX + ForcePicSize.CX, ImgY + ForcePicSize.CY), Glyph); + end + else + begin + if (Caption = '') and (WideCaption = '') then + Canvas.Draw(r.Left + Max(0, (w - ImgW) div 2), r.Top + Max(0, (h - ImgH) div 2), Glyph) + else + Canvas.Draw(ImgX, ImgY, Glyph); + end; + end + else + if Assigned(Picture) and not Picture.Empty then + begin + if (ForcePicSize.CX > 0) and (ForcePicSize.CY > 0) then + begin + if (Caption = '') and (WideCaption = '') then + begin + px := r.Left + Max(0, (w - ImgW) div 2); + py := r.Top + Max(0, (h - ImgH) div 2); + //Canvas.StretchDraw(Rect(px, py, px + ForcePicSize.CX, py + ForcePicSize.CY), Picture); + DrawStretchPicture(graphics, Canvas, Rect(px, py, px + ForcePicSize.CX, py + ForcePicSize.CY), Picture); + end + else + begin + //Canvas.StretchDraw(Rect(ImgX, ImgY, ImgX + ForcePicSize.CX, ImgY + ForcePicSize.CY), Picture); + DrawStretchPicture(graphics, Canvas, Rect(ImgX, ImgY, ImgX + ForcePicSize.CX, ImgY + ForcePicSize.CY), Picture); + end; + end + else + begin + if (Caption = '') and (WideCaption = '') then + Canvas.Draw(r.Left + Max(0, (w - ImgW) div 2), r.Top + Max(0, (h - ImgH) div 2), Picture) + else + Canvas.Draw(ImgX, ImgY, Picture); + end; + end + else + if (ImageIndex <> -1) and Assigned(Images) then + begin + if (Caption = '') and (WideCaption = '') then + Images.Draw(Canvas, r.Left + Max(0, (w - Images.Width) div 2), r.Top + Max(0, (h - Images.Height) div 2), ImageIndex, EnabledImage) + else + begin + Images.Draw(Canvas, ImgX, ImgY, ImageIndex, EnabledImage); + end; + {end + else if Assigned(ToolImage) and not (ToolImage.Empty) and (ToolImage.Width > 1) then + begin + if Caption = '' then + Canvas.Draw(r.Left + Max(0, (w - ImgW) div 2), r.Top + Max(0, (h - ImgH) div 2), ToolImage) + else + Canvas.Draw(ImgX, ImgY, ToolImage); } + end; + end; + + + Canvas.Brush.Style := bsClear; + + if DropDownButton then + begin + if DrawDwLine and DropDownSplit then + begin + Canvas.Pen.Color := ColorToRGB(PC); + if (DropDownPos = dpRight) then + begin + Canvas.MoveTo(DwR.Left, DwR.Top); + Canvas.LineTo(DwR.Left, DwR.Bottom); + end + else + begin + Canvas.MoveTo(DwR.Left, DwR.Top); + Canvas.LineTo(DwR.Right, DwR.Top); + end; + end; + + AP.X := DwR.Left + ((DwR.Right - DwR.Left - 5) div 2); + AP.Y := DwR.Top + ((DwR.Bottom - DwR.Top - 3) div 2) + 1; + + if not Enabled then + DrawArrow(Canvas, AP, clGray, clWhite, DropDir) + else + DrawArrow(Canvas, AP, clBlack, clWhite, DropDir); + end; + end; + + graphics.Free; +end; + +//------------------------------------------------------------------------------ + +{TWinCtrl} + +procedure TWinCtrl.PaintCtrls(DC: HDC; First: TControl); +begin + PaintControls(DC, First); +end; + +//------------------------------------------------------------------------------ + +{ TAdvGlowButton } + + +//------------------------------------------------------------------------------ + + +procedure TAdvCustomGlowButton.CMMouseEnter(var Msg: TMessage); +begin + inherited; + + if Assigned(FOnMouseEnter) then + FOnMouseEnter(Self); + + if (csDesigning in ComponentState) then + Exit; + + if FMouseEnter then + Exit; + + FHot := true; + + if FLeftDown then + FDown := true; + + if not Assigned(FTimer) then + begin + FTimer := TTimer.Create(self); + FTimer.OnTimer := TimerProc; + FTimer.Interval := GlowSpeed; + FTimer.Enabled := true; + end; + + if not FDown and (GlowState <> gsPush) then + begin + FTimeInc := 20; + GlowState := gsHover; + end; + Invalidate; + + FMouseInControl := true; + FMouseEnter := true; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.CMMouseLeave(var Msg: TMessage); +begin + inherited; + + if Assigned(FOnMouseLeave) then + FOnMouseLeave(Self); + + if (csDesigning in ComponentState) then + Exit; + + if not FMouseEnter then + Exit; + + FMouseEnter := false; + FMouseInControl := false; + + FHot := false; + FInButton := false; + +// Repaint; + + // down process busy + if FDown and FMouseDown then + begin + FDown := False; + FTimeInc := -20; + GlowState := gsHover; + Invalidate; + FLeftDown := true; + end + else + //if not (Style = bsCheck) then + begin + FDown := false; + FStepHover := 100; + FTimeInc := -20; + GlowState := gsHover; + Invalidate; + end; + + if not Assigned(FTimer) then + begin + FTimer := TTimer.Create(self); + FTimer.OnTimer := TimerProc; + FTimer.Interval := GlowSpeed; + FTimer.Enabled := true; + end; + +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.CMTextChanged(var Message: TMessage); +begin + Invalidate; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.CNCommand(var Message: TWMCommand); +begin + if Message.NotifyCode = BN_CLICKED then + Click; +end; + +//------------------------------------------------------------------------------ + +constructor TAdvCustomGlowButton.Create(AOwner: TComponent); +begin + inherited; + FTimer := nil; + FImageIndex := -1; + DoubleBuffered := true; + FGroupIndex := 0; + FState := absUp; + FStyle := bsButton; + FTransparent := False; + FLayout := blGlyphLeft; + FDropDownButton := False; + FDropDownPosition := dpRight; + FDropDownDirection := ddDown; + FDropDownSplit := true; + FShowCaption := true; + FFocusType := ftBorder; + FShortCutHint := nil; + FShortCutHintPos := shpTop; + FShowDisabled := true; + FOverlappedText := false; + FSpacing := 2; + FWordWrap := true; + FFirstPaint := true; + FMarginVert := 2; + FMarginHorz := 2; + FRounded := true; + FInitRepeatPause := 400; + FRepeatPause := 100; + FRepeatClick := false; + + FIPicture := TGDIPPicture.Create; + FIPicture.OnChange := PictureChanged; + + FIDisabledPicture := TGDIPPicture.Create; + FIDisabledPicture.OnChange := PictureChanged; + FIHotPicture := TGDIPPicture.Create; + + ParentFont := true; + FAppearance := TGlowButtonAppearance.Create; + FAppearance.OnChange := OnAppearanceChanged; + FInternalImages := nil; + FAntiAlias := aaClearType; + FBorderStyle := bsSingle; + + FOfficeHint := TAdvHintInfo.Create; + + Width := 100; + Height := 41; + + FDefaultPicDrawing := True; + FDefaultCaptionDrawing := True; + FTrimming := StringTrimmingNone; + + FCommandID := -1; + + FButtonSizeState := bsLarge; + FMaxButtonSizeState := bsLarge; + FMinButtonSizeState := bsGlyph; + FOldLayout := Layout; + FOldDropDownPosition := DropDownPosition; + + FNotes := TStringList.Create; + FNotesFont := TFont.Create; + FNotesFont.Name := 'Tahoma'; + FNotesFont.Size := 8; +end; + + +procedure TAdvCustomGlowButton.CreateParams(var Params: TCreateParams); +begin + inherited; +// if FTransparent then +// Params.ExStyle := Params.ExStyle or WS_EX_TRANSPARENT; +end; + +procedure TAdvCustomGlowButton.CreateWnd; +begin + inherited; + FActive := FDefault; + FParentForm := GetParentForm(Self); +end; + +//------------------------------------------------------------------------------ + +destructor TAdvCustomGlowButton.Destroy; +begin + if Assigned(FShortCutHint) then + FShortCutHint.Free; + FOfficeHint.Free; + FAppearance.Free; + FIPicture.Free; + FIDisabledPicture.Free; + FIHotPicture.Free; + FNotes.Free; + FNotesFont.Free; + inherited; +end; + +procedure TAdvCustomGlowButton.DoEnter; +begin + inherited; + Invalidate; +end; + +procedure TAdvCustomGlowButton.DoExit; +begin + inherited; + FDown := false; + FState := absUp; + Invalidate; +end; + +procedure TAdvCustomGlowButton.ShowShortCutHint; +var + pt: TPoint; +begin + if not Assigned(FShortCutHint) then + begin + FShortCutHint := TShortCutHintWindow.Create(Self); + FShortCutHint.Parent := Self; + FShortCutHint.Visible := False; + FShortCutHint.Color := clWhite; + FShortCutHint.ColorTo := Appearance.Color; + end; + + FShortCutHint.Caption := FShortCutHintText; + + pt := ClientToScreen(Point(0,0)); + + case ShortCutHintPos of + shpLeft: + begin + FShortCutHint.Left := pt.X - (FShortCutHint.Width div 2); + FShortCutHint.Top := pt.Y + (self.Height - FShortCutHint.Height) div 2; + end; + shpTop: + begin + FShortCutHint.Left := pt.X + (self.Width - FShortCutHint.Width) div 2; + FShortCutHint.Top := pt.Y - (FShortCutHint.Height div 2); + end; + shpRight: + begin + FShortCutHint.Left := pt.X + self.Width - (FShortCutHint.Width div 2); + FShortCutHint.Top := pt.Y + (self.Height - FShortCutHint.Height) div 2; + end; + shpBottom: + begin + FShortCutHint.Left := pt.X + (self.Width - FShortCutHint.Width) div 2; + FShortCutHint.Top := pt.Y + self.Height - (FShortCutHint.Height div 2); + end; + shpCenter: + begin + FShortCutHint.Left := pt.X + (self.Width - FShortCutHint.Width) div 2; + FShortCutHint.Top := pt.Y + (self.Height - FShortCutHint.Height) div 2; + end; + end; + + FShortCutHint.Visible := true; +end; + +procedure TAdvCustomGlowButton.HideShortCutHint; +begin + if Assigned(FShortCutHint) then + begin + FShortCutHint.Visible := false; + //FShortCutHint.Free; + //FShortCutHint := nil; + end; +end; + +function TAdvCustomGlowButton.GetVersion: string; +var + vn: Integer; +begin + vn := GetVersionNr; + Result := IntToStr(Hi(Hiword(vn))) + '.' + IntToStr(Lo(Hiword(vn))) + + '.' + IntToStr(Hi(Loword(vn))) + '.' + IntToStr(Lo(Loword(vn))); +end; + +function TAdvCustomGlowButton.GetVersionNr: Integer; +begin + Result := MakeLong(MakeWord(BLD_VER, REL_VER), MakeWord(MIN_VER, MAJ_VER)); +end; + +procedure TAdvCustomGlowButton.KeyDown(var Key: Word; Shift: TShiftState); +begin + inherited; + if (Key in [VK_SPACE, VK_RETURN]) then + begin + FDown := True; + FState := absDown; + Repaint; + end; + + if (Key = VK_F4) then + DoDropDown; + + if Assigned(FOnInternalKeyDown) then + FOnInternalKeyDown(Self, Key, Shift); +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.WMGetDlgCode(var Message: TMessage); +begin + if Assigned(FOnInternalKeyDown) then + Message.Result := DLGC_WANTARROWS + else + inherited; +end; + + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.KeyPress(var Key: Char); +var + Form: TCustomForm; +begin + inherited; + + if (Key in [#32, #13]) then + begin + Form := GetParentForm(Self); + if Form <> nil then + Form.ModalResult := ModalResult; + + if Assigned(OnClick) then + OnClick(Self); + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.KeyUp(var Key: Word; Shift: TShiftState); +begin + inherited; + FDown := False; + FState := absUp; + Repaint; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.Assign(Source: TPersistent); +begin + if (Source is TAdvCustomGlowButton) then + begin + Align := (Source as TAdvCustomGlowButton).Align; + Action := (Source as TAdvCustomGlowButton).Action; + Anchors := (Source as TAdvCustomGlowButton).Anchors; + AntiAlias := (Source as TAdvCustomGlowButton).AntiAlias; + AutoSize := (Source as TAdvCustomGlowButton).AutoSize; + BorderStyle := (Source as TAdvCustomGlowButton).BorderStyle; + Cancel := (Source as TAdvCustomGlowButton).Cancel; + Caption := (Source as TAdvCustomGlowButton).Caption; + Constraints := (Source as TAdvCustomGlowButton).Constraints; + Default := (Source as TAdvCustomGlowButton).Default; + Font.Assign((Source as TAdvCustomGlowButton).Font); + ImageIndex := (Source as TAdvCustomGlowButton).ImageIndex; + Images.Assign((Source as TAdvCustomGlowButton).Images); + DisabledImages.Assign((Source as TAdvCustomGlowButton).DisabledImages); + DisabledPicture.Assign((Source as TAdvCustomGlowButton).DisabledPicture); + DragMode := (Source as TAdvCustomGlowButton).DragMode; + DragKind := (Source as TAdvCustomGlowButton).DragKind; + FocusType := (Source as TAdvCustomGlowButton).FocusType; + HotImages.Assign((Source as TAdvCustomGlowButton).HotImages); + HotPicture.Assign((Source as TAdvCustomGlowButton).HotPicture); + MarginVert := (Source as TAdvCustomGlowButton).MarginVert; + MarginHorz := (Source as TAdvCustomGlowButton).MarginHorz; + ModalResult := (Source as TAdvCustomGlowButton).ModalResult; + Notes.Assign((Source as TAdvCustomGlowButton).Notes); + NotesFont.Assign((Source as TAdvCustomGlowButton).NotesFont); + OfficeHint.Assign((Source as TAdvCustomGlowButton).OfficeHint); + ParentFont := (Source as TAdvCustomGlowButton).ParentFont;; + Picture.Assign((Source as TAdvCustomGlowButton).Picture); + PopupMenu := (Source as TAdvCustomGlowButton).PopupMenu; + Position := (Source as TAdvCustomGlowButton).Position; + InitRepeatPause := (Source as TAdvCustomGlowButton).InitRepeatPause; + RepeatPause := (Source as TAdvCustomGlowButton).RepeatPause; + RepeatClick := (Source as TAdvCustomGlowButton).RepeatClick; + Rounded := (Source as TAdvCustomGlowButton).Rounded; + ShortCutHint := (Source as TAdvCustomGlowButton).ShortCutHint; + ShortCutHintPos := (Source as TAdvCustomGlowButton).ShortCutHintPos; + ShowCaption := (Source as TAdvCustomGlowButton).ShowCaption; + ShowDisabled := (Source as TAdvCustomGlowButton).ShowDisabled; + Spacing := (Source as TAdvCustomGlowButton).Spacing; + Transparent := (Source as TAdvCustomGlowButton).Transparent; + Trimming := (Source as TAdvCustomGlowButton).Trimming; + Version := (Source as TAdvCustomGlowButton).Version; + WordWrap := (Source as TAdvCustomGlowButton).WordWrap; + ShowHint := (Source as TAdvCustomGlowButton).ShowHint; + TabOrder := (Source as TAdvCustomGlowButton).TabOrder; + TabStop := (Source as TAdvCustomGlowButton).TabStop; + Visible := (Source as TAdvCustomGlowButton).Visible; + end; + +end; + +procedure TAdvCustomGlowButton.Click; +var + Form: TCustomForm; +begin + Form := GetParentForm(Self); + if Form <> nil then Form.ModalResult := ModalResult; + if Assigned(FOnInternalClick) then + FOnInternalClick(Self); + inherited; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.Loaded; +begin + inherited; + if (Down <> FInitialDown) then + Down := FInitialDown; + FIsVista := IsVista; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.DoDropDown; +var + pt: TPoint; +begin + if IsMenuButton or Assigned(FDropDownMenu) then + begin + {State := absDropDown; + Invalidate; + CheckMenuDropdown; } + + if Assigned(FDropDownMenu) then + begin + //FDown := false; + //FHot := false; + FState := absDown; + PopupBtnDown; + Invalidate; + + if DropDownDirection = ddDown then + pt := Point(Left, Top + Height) + else + pt := Point(Left + Width, Top); + + pt := Parent.ClientToScreen(pt); + FDropDownMenu.Popup(pt.X,pt.Y); + + FState := absUp; + Repaint; + end; + Invalidate; + end; +end; + +//------------------------------------------------------------------------------ + +function TAdvCustomGlowButton.IsFontStored: Boolean; +begin + Result := not ParentFont; +end; + +function TAdvCustomGlowButton.IsMenuButton: Boolean; +begin + Result := False; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.TimerExpired(Sender: TObject); +begin + FRepeatTimer.Interval := RepeatPause; + if (FDown) and MouseCapture then + begin + try + Click; + except + FRepeatTimer.Enabled := False; + raise; + end; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.MouseUp(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + inherited MouseUp(Button, Shift, X, Y); + if FRepeatTimer <> nil then + FRepeatTimer.Enabled := False; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.MouseDown(Button: TMouseButton; Shift: TShiftState; X, + Y: Integer); +var + pt:TPoint; + InBottomDrop,InRightDrop: boolean; + InSepBtn: boolean; + +begin + inherited; + + if Button <> mbLeft then + Exit; + + if FRepeatClick then + begin + if FRepeatTimer = nil then + FRepeatTimer := TTimer.Create(Self); + + FRepeatTimer.OnTimer := TimerExpired; + FRepeatTimer.Interval := InitRepeatPause; + FRepeatTimer.Enabled := True; + end; + + + FDown := true; + FMouseDown := true; + + if TabStop then + SetFocus; + + if not Assigned(FTimer) then + begin + FTimer := TTimer.Create(self); + FTimer.OnTimer := TimerProc; + FTimer.Interval := GlowSpeed; + FTimer.Enabled := true; + end; + + //FStepPush := 0; + FTimeInc := +20; + GlowState := gsPush; + + if not DropDownButton and IsMenuButton and false then + begin + Invalidate; + DoDropDown; + end; + + InBottomDrop := (DropDownPosition = dpRight) and (X > (Width - DropDownSectWidth)); + InRightDrop := (DropDownPosition = dpBottom) and (Y > (Height - DropDownSectWidth)); + + InSepBtn := (InBottomDrop or InRightDrop); + + + if (not FDropDownButton and IsMenuButton) or + (FDropDownButton and InSepBtn and DropDownSplit) or + (FDropDownButton and not DropDownSplit and (not ((Style = bsCheck) or (GroupIndex > 0)))) + then + begin + // FState := absUp; + FMouseInControl := False; + // FMouseDownInControl := False; + PopupBtnDown; + + if Assigned(FDropDownMenu) then + begin + FDown := false; + FHot := false; + SetDroppedDown(True); + FMouseEnter := true; + //FMenuSel := true; + Repaint; + + if DropDownDirection = ddDown then + pt := Point(Left, Top + Height) + else + pt := Point(Left + Width, Top); + + pt := Parent.ClientToScreen(pt); + //if Assigned(AdvToolBar) then + //FDropDownMenu.MenuStyler := AdvToolBar.FCurrentToolBarStyler.CurrentAdvMenuStyler; + FDropDownMenu.Popup(pt.X,pt.Y); + SetDroppedDown(False); + //FMenuSel := false; + + GetCursorPos(pt); + pt := ScreenToClient(pt); + if not PtInRect(ClientRect, pt) then + begin + FMouseEnter := false; + FMouseInControl := false; + FHot := false; + FInButton := false; + end; + Repaint; + end; + + Invalidate; + + Exit; + end + else + begin + if (Style = bsCheck) then + SetDown(not FDownChecked); + + if not FDownChecked then + begin + FState := absDown; + Invalidate; + end; + + if (Style = bsCheck) then + begin + FState := absDown; + Repaint; + end; + + FDragging := True; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.InternalClick; +begin + if (not FDropDownButton and IsMenuButton) or (FDropDownButton and not ((Style = bsCheck) or (GroupIndex > 0)) and + (not DropDownSplit)) then + begin + + end + else + begin + if Style = bsCheck then + SetDown(not FDownChecked); + + if not FDownChecked then + begin + FState := absDown; + Invalidate; + end; + + if (Style = bsCheck) then + begin + FState := absDown; + Repaint; + end; + end; + + Click; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.WMLDblClk(var Msg: TWMLButtonDblClk); +begin + inherited; +end; + +procedure TAdvCustomGlowButton.WMPaint(var Msg: TWMPaint); +var + DC, MemDC: HDC; + MemBitmap, OldBitmap: HBITMAP; + PS: TPaintStruct; +begin + if not FDoubleBuffered or (Msg.DC <> 0) then + begin + if not (csCustomPaint in ControlState) and (ControlCount = 0) then + inherited + else + PaintHandler(Msg); + end + else + begin + DC := GetDC(0); + MemBitmap := CreateCompatibleBitmap(DC, ClientRect.Right, ClientRect.Bottom); + ReleaseDC(0, DC); + MemDC := CreateCompatibleDC(0); + OldBitmap := SelectObject(MemDC, MemBitmap); + try + DC := BeginPaint(Handle, PS); + Perform(WM_ERASEBKGND, MemDC, MemDC); + Msg.DC := MemDC; + WMPaint(Msg); + Msg.DC := 0; + BitBlt(DC, 0, 0, ClientRect.Right, ClientRect.Bottom, MemDC, 0, 0, SRCCOPY); + EndPaint(Handle, PS); + finally + SelectObject(MemDC, OldBitmap); + DeleteDC(MemDC); + DeleteObject(MemBitmap); + end; + end; +end; + +(* +begin + {$IFDEF VER185} + if TForm(FParentForm).FormStyle = fsMDIChild then + begin + DoubleBuffered := (Application.MainForm.ActiveMDIChild = FParentForm); + end + else + DoubleBuffered := (FParentForm.Handle = GetActiveWindow); + {$ENDIF} + inherited; +*) + + +//------------------------------------------------------------------------------ +procedure TAdvCustomGlowButton.WMLButtonUp(var Msg:TWMLButtonDown); +var + DoClick: Boolean; + +begin + FTimeInc := -20; + GlowState := gsPush; + + FMouseDown := false; + FLeftDown := false; + + if not Assigned(FTimer) then + begin + FTimer := TTimer.Create(self); + FTimer.OnTimer := TimerProc; + FTimer.Interval := GlowSpeed; + FTimer.Enabled := true; + end; + + if not DropDownButton and IsMenuButton then + begin + // do nothing + end + else + if FDragging then + begin + FDragging := False; + + DoClick := (Msg.XPos >= 0) and (Msg.XPos < ClientWidth) and (Msg.YPos >= 0) and (Msg.YPos <= ClientHeight); + + if (FGroupIndex = 0) then + begin + // Redraw face in-case mouse is captured + FState := absUp; + FMouseInControl := False; + //FHot := false; + + if (Style = bsCheck) then + begin + if Assigned(Action) then + begin + inherited; + if (FCheckLinked or FGroupIndexLinked) then + Exit; + end; + + // ***** extension for toolbar compactbutton handling + if not DoClick and Self.Down then + begin + Self.Down := not Self.Down; + end; + + if (Style <> bsCheck) then + SetDown(not FDownChecked); + + //FState := absUp; + Repaint; + end; + if DoClick and not (FState in [absExclusive, absDown]) then + Invalidate; + end + else + begin + if Assigned(Action) then + if FCheckLinked or FGroupIndexLinked then + begin + inherited; + Exit; + end; + + if DoClick then + begin + SetDown(not FDownChecked); + if FDownChecked then + Repaint; + end + else + begin + if FDownChecked then + FState := absExclusive; + Repaint; + end; + + end; + + //if DoClick then + // Click; + + UpdateTracking; + end; + + ControlState := ControlState + [csClicked]; + + inherited; + + if (Style = bsCheck) or (GroupIndex > 0) then + begin + //FState := absUp; + Repaint; + //FHot := true; + //FMouseInControl := true; + end; + + Invalidate; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.Notification(AComponent: TComponent; + AOperation: TOperation); +begin + inherited; + if (AOperation = opRemove) and (AComponent = FImages) then + FImages := nil; + + if (AOperation = opRemove) and (AComponent = FDisabledImages) then + FDisabledImages := nil; + + if (AOperation = opRemove) and (AComponent = FHotImages) then + begin + FHotImages := nil; + end; + + if (AOperation = opRemove) and (AComponent = DropdownMenu) then + DropdownMenu := nil; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.DrawGlyphCaption; +begin + +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.GetToolImage(bmp: TBitmap); +begin + +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.SetDroppedDown(Value: Boolean); +begin + FDroppedDown := Value; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.Paint; +var + GradColor: TColor; + GradColorTo: TColor; + GradColorMirror: TColor; + GradColorMirrorTo: TColor; + PenColor: TColor; + GradB, GradU: TGDIPGradient; + DrawDwLn: Boolean; + ImgList: TImageList; + Pic: TGDIPPicture; + EnabledImg: Boolean; + Rgn1, Rgn2: HRGN; + R: TRect; + i, w, h: Integer; + p: TPoint; + DCaption: string; + DWideCaption: widestring; + BD: TButtonDisplay; + DrawFocused, DrawFocusedHot: boolean; + bmp: TBitmap; + sz: TSize; + gs: TGlowButtonState; + PicSize: TSize; + AFont: TFont; + +begin + if FTransparent and not FMouseEnter then + begin + // TRANSPARENCY CODE + + R := ClientRect; + rgn1 := CreateRectRgn(R.Left, R.Top, R.Right, R.Bottom); + SelectClipRgn(Canvas.Handle, rgn1); + + i := SaveDC(Canvas.Handle); + p := ClientOrigin; + Windows.ScreenToClient(Parent.Handle, p); + p.x := -p.x; + p.y := -p.y; + MoveWindowOrg(Canvas.Handle, p.x, p.y); + + SendMessage(Parent.Handle, WM_ERASEBKGND, Canvas.Handle, 0); + // transparency ? + SendMessage(Parent.Handle, WM_PAINT, Canvas.Handle, 0); + + if (Parent is TWinCtrl) then + (Parent as TWinCtrl).PaintCtrls(Canvas.Handle, nil); + + RestoreDC(Canvas.Handle, i); + + SelectClipRgn(Canvas.Handle, 0); + DeleteObject(rgn1); + end; + + if not Enabled then + begin + FState := absDisabled; + FDragging := False; + end + else + begin + if (FState = absDisabled) then + if FDownChecked and (GroupIndex <> 0) then + FState := absExclusive + else + FState := absUp; + end; + + + if (Style = bsCheck) and (Down) then + begin + FState := absDown; + end; + + with Appearance do + begin + DrawDwLn := False; + if ((State = absDisabled) or not Enabled) and FShowDisabled then + begin + if (1>0) {Transparent} then + begin + GradColor := FColorDisabled; + GradColorTo := FColorDisabledTo; + GradColorMirror := FColorMirrorDisabled; + GradColorMirrorTo := FColorMirrorDisabledTo; + PenColor := BorderColorDisabled; + GradU := GradientDisabled; + GradB := GradientMirrorDisabled; + end + else + begin + end; + end + else if ((State = absDown) {or (FHot and (State = absExclusive))}{ or FDown}) and not ((Style = bsCheck) and (State = absDown)) then + begin + GradColor := FColorDown; + GradColorTo := FColorDownTo; + GradColorMirror := FColorMirrorDown; + GradColorMirrorTo := FColorMirrorDownTo; + PenColor := BorderColorDown; + GradU := GradientDown; + GradB := GradientMirrorDown; + DrawDwLn := True; + end + else + if (State = absExclusive) or ((Style = bsCheck) and (State = absDown)) then + begin + GradColor := FColorChecked; + GradColorTo := FColorCheckedTo; + GradColorMirror := FColorMirrorChecked; + GradColorMirrorTo := FColorMirrorCheckedTo; + PenColor := BorderColorChecked; + GradU := GradientChecked; + GradB := GradientMirrorChecked; + + if Assigned(FTimer) and not (not FMouseInControl and ((Style = bsCheck) or ((GroupIndex > 0) and (State <> absDown)))) then + begin + GradColor := BlendColor(FColorChecked, FColorDown, FStepPush); + GradColorTo := BlendColor(FColorCheckedTo, FColorDownTo, FStepPush); + GradColorMirror := BlendColor(FColorMirrorChecked, FColorMirrorDown, FStepPush); + GradColorMirrorTo := BlendColor(FColorMirrorCheckedTo, FColorMirrorDownTo, FStepPush); + //PenColor := BlendColor(BorderColorChecked, BorderColorDown, FStepPush); + end; + + end + else //if State = absUp then + begin + if FHot then + begin + GradColor := FColorHot; + GradColorTo := FColorHotTo; + GradColorMirror := FColorMirrorHot; + GradColorMirrorTo := FColorMirrorHotTo; + PenColor := BorderColorHot; + GradU := GradientHot; + GradB := GradientMirrorHot; + DrawDwLn := True; + end + else // Normal draw + begin + if (1>0) {Transparent} then + begin + GradColor := FColor; + GradColorTo := FColorTo; + GradColorMirror := FColorMirror; + GradColorMirrorTo := FColorMirrorTo; + PenColor := BorderColor; + GradU := Gradient; + GradB := GradientMirror; + end + else + begin + end; + end; + end; + + { if FHot then + begin + GradColor := FColorHot; + GradColorTo := FColorHotTo; + GradColorMirror := FColorMirrorHot; + GradColorMirrorTo := FColorMirrorHotTo; + PenColor := BorderColorHot; + GradU := GradientHot; + GradB := GradientMirrorHot; + end + else + begin + GradColor := FColor; + GradColorTo := FColorTo; + GradColorMirror := FColorMirror; + GradColorMirrorTo := FColorMirrorTo; + PenColor := BorderColor; + GradU := Gradient; + GradB := GradientMirror; + end; + + if FDown then + begin + PenColor := BorderColorDown; + GradU := GradientDown; + GradB := GradientMirrorDown; + end; + } + + if Assigned(FTimer) then + begin + if not FDown and not Transparent and not ((State = absExclusive) or ((Style = bsCheck) and (State = absDown))) then + begin + GradColor := BlendColor(FColorHot, FColor, FStepHover); + GradColorTo := BlendColor(FColorHotTo, FColorTo, FStepHover); + GradColorMirror := BlendColor(FColorMirrorHot, FColorMirror, FStepHover); + GradColorMirrorTo := BlendColor(FColorMirrorHotTo, FColorMirrorTo, FStepHover); + PenColor := BlendColor(BorderColorHot, BorderColor, FStepHover); + end + else + begin + if (Style = bsCheck) then + begin + if FDown then + begin + GradColor := BlendColor(FColorDown, FColorChecked, FStepPush); + GradColorTo := BlendColor(FColorDownTo, FColorCheckedTo, FStepPush); + GradColorMirror := BlendColor(FColorMirrorDown, FColorMirrorChecked, FStepPush); + GradColorMirrorTo := BlendColor(FColorMirrorDownTo, FColorMirrorCheckedTo, FStepPush); +// PenColor := BlendColor(BorderColorDown, BorderColorChecked, FStepPush); + end + end + else + if FDown and (State <> absExclusive) then + begin + + GradColor := BlendColor(FColorDown, FColorHot, FStepPush); + GradColorTo := BlendColor(FColorDownTo, FColorHotTo, FStepPush); + GradColorMirror := BlendColor(FColorMirrorDown, FColorMirrorHot, FStepPush); + GradColorMirrorTo := BlendColor(FColorMirrorDownTo, FColorMirrorHotTo, FStepPush); + PenColor := BlendColor(BorderColorDown, BorderColorHot, FStepPush); + end; + + end; + end; + + if Enabled or (DisabledImages = nil) then + begin + if FHot and (HotImages <> nil) then + ImgList := HotImages + else + ImgList := Images; + + EnabledImg := Enabled; + end + else + begin + ImgList := DisabledImages; + EnabledImg := True; + end; + + if Enabled or DisabledPicture.Empty then + begin + if FHot and not HotPicture.Empty then + Pic := HotPicture + else + Pic := Picture; + end + else + Pic := DisabledPicture; + + + if (ImgList = nil) then + begin + ImgList := FInternalImages; + EnabledImg := True; + end; + + if ShowCaption then + begin + DCaption := Caption; + DWideCaption := WideCaption; + end + else + begin + DCaption := ''; + DWideCaption := ''; + end; + + if (FMouseInControl or FMouseDown) and DropDownButton then + begin + if FInButton then + BD := bdDropDown + else + BD := bdButton; + end + else + BD := bdNone; + + // do not use special border color for non standalone buttons in mouse hover/down state or checked buttons + if ((Position <> bpStandalone) and FMouseDown) {or ((Style = bsCheck) and (FState = absDown))} then + begin + PenColor := BorderColor; + end; + + if ((State = absDisabled) or not Enabled) and FShowDisabled then + begin + GradColor := FColorDisabled; + GradColorTo := FColorDisabledTo; + GradColorMirror := FColorMirrorDisabled; + GradColorMirrorTo := FColorMirrorDisabledTo; + PenColor := BorderColorDisabled; + GradU := GradientDisabled; + GradB := GradientMirrorDisabled; + end; + + if ((GetFocus = self.Handle) and (FocusType in [ftHot, ftHotBorder])) and not FDown then + begin + GradColor := FColorHot; + GradColorTo := FColorHotTo; + GradColorMirror := FColorMirrorHot; + GradColorMirrorTo := FColorMirrorHotTo; + PenColor := BorderColorHot; + GradU := GradientHot; + GradB := GradientMirrorHot; + DrawDwLn := True; + end; + + DrawFocused := (GetFocus = self.Handle) and (FocusType in [ftBorder, ftHotBorder]); + DrawFocusedHot := (GetFocus = self.Handle) and (FocusType in [ftHot, ftHotBorder]); + + AFont := TFont.Create; + AFont.Assign(Font); + + if (not ParentFont) and Appearance.SystemFont then + begin + if IsVista then + AFont.Name := 'Segoe UI' + else + AFont.Name := 'Tahoma'; + end; + + bmp := TBitmap.Create; + bmp.Width := 1; + bmp.Height := 1; + + GetToolImage(bmp); + + if Assigned(Action) then + begin + begin + if (Action as TCustomAction).ImageIndex >= 0 then + if Assigned((Action as TCustomAction).ActionList) then + if Assigned(TImageList((Action as TCustomAction).ActionList.Images)) then + begin + ImgList := TImageList((Action as TCustomAction).ActionList.Images); + EnabledImg := Enabled; + end; + end; + end; + + PicSize.cx := 0; // no stretch pic + PicSize.cy := 0; + if AutoSize then + begin + if (ButtonSizeState in [bsLabel, bsGlyph]) then + begin + PicSize.cx := 16; + PicSize.cy := 16; + + {if (bmp.Width = 1) then + begin + bmp.Height := Pic.Height; + bmp.Width := Pic.Width; + bmp.Canvas.Draw(0, 0, Pic); + Pic := nil; + end;} + + if Assigned(ImgList) and (ImageIndex >= 0) then + begin + Pic := nil; + end; + end; + + if (ButtonSizeState = bsGlyph) then + begin + DCaption := ''; + DWideCaption := ''; + end; + end; + + if DoAutoSize or (FFirstPaint and AutoSize) then + begin + + sz := DrawVistaButton(Canvas,ClientRect,GradColor, GradColorTo, GradColorMirror, GradColorMirrorTo, + PenColor, GradU, GradB, DCaption, DWideCaption, FDefaultCaptionDrawing, AFont, ImgList, ImageIndex, EnabledImg, Layout, FDropDownButton {and (Style <> bsCheck)}, + DrawDwLn, Enabled, DrawFocused, DropDownPosition, Pic, PicSize, AntiAlias, FDefaultPicDrawing, bmp, BD, Transparent and not (FMouseEnter or DrawFocusedHot or (State = absDown)), FMouseEnter, Position, DropDownSplit, CanDrawBorder, + FOverlappedText, FWordWrap, True, FRounded, FDropDownDirection = ddDown, FSpacing, FTrimming, FNotes, FNotesFont, FDownChecked); + + if AutoSize then + begin + W := sz.cx + Spacing * 3 + 2 + 2 * MarginHorz; + H := sz.cy + Spacing * 2 + 2 * MarginVert; + + if DropDownButton then + begin + if (DropDownPosition = dpBottom) then + H := H + DropDownSectWidth + else + W := W + DropDownSectWidth; + end; + + if Assigned(FOnSetButtonSize) then + FOnSetButtonSize(Self, w, h); + + if (W <> Width) then + Width := W; + if (H <> Height) then + Height := H; + end; + + FFirstPaint := false; + end; + + // transparent border pixels + + sz := DrawVistaButton(Canvas,ClientRect,GradColor, GradColorTo, GradColorMirror, GradColorMirrorTo, + PenColor, GradU, GradB, DCaption, DWideCaption, FDefaultCaptionDrawing, AFont, ImgList, ImageIndex, EnabledImg, Layout, FDropDownButton {and (Style <> bsCheck)}, + DrawDwLn, Enabled, DrawFocused, DropDownPosition, Pic, PicSize, AntiAlias, FDefaultPicDrawing, bmp, BD, Transparent and not (FMouseEnter or DrawFocusedHot or (State = absDown)), FMouseEnter, Position, DropDownSplit, CanDrawBorder, FOverlappedText, FWordWrap, + False, FRounded, FDropDownDirection = ddDown, FSpacing, FTrimming, FNotes, FNotesFont, FDownChecked); + + DrawGlyphCaption; + + gs := gsNormal; + + if FMouseEnter then + gs := gsHot; + + if State = absDown then + gs := gsDown; + + if Assigned(OnDrawButton) then + OnDrawButton(Self, Canvas, ClientRect, gs); + + AFont.Free; + bmp.Free; + + if not Assigned(Parent) then + Exit; + + if not FTransparent or FMouseEnter or (State = absDown) or (FHot) then + begin + R := ClientRect; + + if Position <> bpMiddle then + begin + if (Position in [bpStandalone, bpLeft]) then + begin + rgn1 := CreateRectRgn(0, 0, 1, 1); + end + else + begin + rgn1 := CreateRectRgn(R.Right - 1, 0, R.Right, 1); + end; + + if (Position in [bpStandalone]) then + begin + rgn2 := CreateRectRgn(R.Right - 1, 0, R.Right, 1); + CombineRgn(rgn1, rgn1, rgn2, RGN_OR); + DeleteObject(rgn2); + end; + + if (Position in [bpStandalone, bpLeft]) then + begin + rgn2 := CreateRectRgn(0, R.Bottom - 1, 1, R.Bottom); + CombineRgn(rgn1, rgn1, rgn2, RGN_OR); + DeleteObject(rgn2); + end; + + if (Position in [bpStandalone, bpRight]) then + begin + rgn2 := CreateRectRgn(R.Right - 1, R.Bottom - 1, R.Right, R.Bottom); + CombineRgn(rgn1, rgn1, rgn2, RGN_OR); + DeleteObject(rgn2); + end; + + SelectClipRgn(Canvas.Handle, rgn1); + + i := SaveDC(Canvas.Handle); + p := ClientOrigin; + Windows.ScreenToClient(Parent.Handle, p); + p.x := -p.x; + p.y := -p.y; + MoveWindowOrg(Canvas.Handle, p.x, p.y); + + SendMessage(Parent.Handle, WM_ERASEBKGND, Canvas.Handle, 0); + + // transparency ? + SendMessage(Parent.Handle, WM_PAINT, Canvas.Handle, 0); + if (Parent is TWinCtrl) then + (Parent as TWinCtrl).PaintCtrls(Canvas.Handle, nil); + RestoreDC(Canvas.Handle, i); + + SelectClipRgn(Canvas.Handle, 0); + DeleteObject(rgn1); + end; + end; + end; +end; + +procedure TAdvCustomGlowButton.PictureChanged(Sender: TObject); +begin + PerformResize; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.SetDown(Value: Boolean); +begin + + if (csLoading in ComponentState) then + FInitialDown := Value; + + if (FGroupIndex = 0) and (Style = bsButton) then + Value := False; + + if (Style = bsCheck) then + begin + FDownChecked := Value; + if FDownChecked then + FState := absDown + else + FState := absUp; + Repaint; + Exit; + end; + + if (Value <> FDownChecked) then + begin + if FDownChecked and (not FAllowAllUp) then + Exit; + + FDownChecked := Value; + if Value then + begin + if FState = absUp then Invalidate; + FState := absExclusive + end + else + begin + FState := absUp; + Repaint; + end; + + if Value and not FCheckLinked then UpdateExclusive; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.SetGroupIndex(const Value: Integer); +begin + if FGroupIndex <> Value then + begin + FGroupIndex := Value; + UpdateExclusive; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.SetImageIndex(const Value: TImageIndex); +begin + FImageIndex := Value; + PerformResize; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.SetImages(const Value: TImageList); +begin + FImages := Value; + Invalidate; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.SetDefault(const Value: boolean); +begin + FDefault := Value; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.SetDisabledImages(const Value: TImageList); +begin + FDisabledImages := Value; + Invalidate; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.SetSpacing(const Value: Integer); +begin + if FSpacing <> Value then + begin + FSpacing := value; + Invalidate; + end; +end; + +//------------------------------------------------------------------------------ + + +procedure TAdvCustomGlowButton.SetWideCaption(const Value: widestring); +begin + if (FWideCaption <> Value) then + begin + FWideCaption := Value; + + if AutoSize then + begin + DoAutoSize := true; + Repaint; + DoAutoSize := false; + end + else + Invalidate; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.SetWordWrap(const Value: Boolean); +begin + if FWordWrap <> Value then + begin + FWordWrap := Value; + Invalidate; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.PerformResize; +begin + if AutoSize then + begin + DoAutoSize := true; + Repaint; + DoAutoSize := false; + end + else + Invalidate; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.SetRounded(const Value: Boolean); +begin + if (FRounded <> Value) then + begin + FRounded := Value; + Invalidate; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.SetMarginVert(const Value: Integer); +begin + if FMarginVert <> Value then + begin + FMarginVert := Value; + PerformResize; + end; +end; + +procedure TAdvCustomGlowButton.SetMarginHorz(const Value: Integer); +begin + if FMarginHorz <> Value then + begin + FMarginHorz := Value; + PerformResize; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.SetAutoSizeEx(const Value: Boolean); +begin + if FAutoSize <> Value then + begin + FAutoSize := Value; + PerformResize; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.SetDisabledPicture(const Value: TGDIPPicture); +begin + FIDisabledPicture.Assign(Value); + Invalidate; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.SetHotPicture(const Value: TGDIPPicture); +begin + FIHotPicture.Assign(Value); +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.SetShowCaption(const Value: Boolean); +begin + FShowCaption := Value; + PerformResize; + Invalidate; +end; + +procedure TAdvCustomGlowButton.SetShowDisabled(const Value: boolean); +begin + FShowDisabled := Value; + Invalidate; +end; + +procedure TAdvCustomGlowButton.SetStyle(const Value: TAdvButtonStyle); +begin + if FStyle <> Value then + begin + FStyle := Value; + //if (Value = bsCheck) and DropDownButton then + // DropDownButton := false; + end; +end; + +procedure TAdvCustomGlowButton.SetVersion(const Value: string); +begin + +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.TimerProc(Sender: TObject); +begin + case GlowState of + gsHover: + begin + FStepHover := FStepHover + FTimeInc; + if ((FStepHover > 100) and (FTimeInc > 0)) + or ((FStepHover < 0) and (FTimeInc < 0)) then + begin + // outputdebugstring(pchar('hover step:'+inttostr(fstephover)+':'+inttostr(ftimeinc))); + if FStepHover > 100 then + FStepHover := 100; + + if FStepHover < 0then + FStepHover := 0; + + GlowState := gsNone; + + FreeAndNil(FTimer); + end + else + Invalidate; + end; + gsPush: + begin + // outputdebugstring(pchar('push step:'+inttostr(fsteppush)+':'+inttostr(ftimeinc))); + + FStepPush := FStepPush + FTimeInc; + + if ((FStepPush > 100) and (FTimeInc > 0)) + or ((FStepPush < 0) and (FTimeInc < 0)) then + begin + if FStepPush > 100 then + FStepPush := 100; + + if FStepPush < 0 then + FStepPush := 0; + + if FTimeInc < 0 then + begin + FDown := false; + FLeftDown := false; + end; + + GlowState := gsNone; + FreeAndNil(FTimer); + end + else + Invalidate; + end; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.WMSetText(var Message: TWMSetText); +begin + inherited; + + if AutoSize then + begin + PerformResize; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.WMEraseBkGnd(var Message: TWMEraseBkGnd); +const + delta = 3; +{ +var + DC: HDC; + i: THandle; +// rgn1,rgn2: THandle; + p,op: TPoint; + PDC : HDC; +} + +begin + // SetBkMode(Message.DC, Windows.TRANSPARENT ); + Message.Result := 1; + Exit; + + if FTransparent then + begin + if Assigned(Parent) and not (FMouseDown or FMouseInControl) then + begin + { + rgn1 := CreateRectRgn(0, 0, delta, delta); + rgn2 := CreateRectRgn(ClientRect.Right-delta, 0, ClientRect.Right, delta); + CombineRgn(rgn1, rgn1, rgn2, RGN_OR); + rgn2 := CreateRectRgn(0, ClientRect.Bottom - delta, delta, ClientRect.Bottom); + CombineRgn(rgn1, rgn1, rgn2, RGN_OR); + rgn2 := CreateRectRgn(ClientRect.Right - delta, ClientRect.Bottom - delta, ClientRect.Right, ClientRect.Bottom); + CombineRgn(rgn1, rgn1, rgn2, RGN_OR); + SelectClipRgn(Message.DC, rgn1); + } + + (* + DC := Message.DC; + i := SaveDC(DC); + + p := ClientOrigin; + Windows.ScreenToClient(Parent.Handle, p); + p.x := -p.x; + p.y := -p.y; + +// MoveWindowOrg(DC, p.x, p.y); + +// SetMapMode(FBmp.Canvas.Handle,mm_isotropic); + + SetMapMode(FBmp.Canvas.Handle,mm_isotropic); + SetViewPortOrgEx(FBmp.Canvas.Handle,p.x,p.y,@op); + + SendMessage(Parent.Handle, WM_ERASEBKGND, FBmp.Canvas.Handle, 0); + SendMessage(Parent.Handle, WM_PAINT, FBmp.Canvas.Handle, 0); + +// if (Parent is TWinCtrl) then +// (Parent as TWinCtrl).PaintCtrls(FBmp.Canvas.Handle, nil); + + SetViewPortOrgEx(FBmp.Canvas.Handle,op.x,op.y,nil); + RestoreDC(DC, i); + + // SelectClipRgn(Message.DC, 0); + // DeleteObject(rgn1); + *) + end; + end + else + inherited; +end; + + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.CMDialogChar(var Message: TCMDialogChar); +begin + with Message do + if IsAccel(CharCode, Caption) and CanFocus then + begin + if IsMenuButton or (Assigned(DropDownMenu)) then + DoDropDown + else + Click; + Result := 1; + end + else + inherited; +end; + +procedure TAdvCustomGlowButton.CMDialogKey(var Message: TCMDialogKey); +begin + with Message do + if + (((CharCode = VK_RETURN) and FActive) or + ((CharCode = VK_ESCAPE) and FCancel)) and + (KeyDataToShiftState(Message.KeyData) = []) and CanFocus then + begin + //Click; + InternalClick; + Result := 1; + end + else + inherited; +end; + +procedure TAdvCustomGlowButton.CMEnabledChanged(var Message: TMessage); +begin + inherited; + Invalidate; +end; + +procedure TAdvCustomGlowButton.CMFocusChanged(var Message: TCMFocusChanged); +begin + with Message do + if Sender is TAdvCustomGlowButton then + FActive := Sender = Self + else + FActive := FDefault; + //SetButtonStyle(FActive); + inherited; +end; + +//------------------------------------------------------------------------------ + +{$IFNDEF TMSDOTNET} + +procedure TAdvCustomGlowButton.CMButtonPressed(var Message: TMessage); +var + Sender: TAdvGlowButton; +begin + if Message.WParam = FGroupIndex then + begin + Sender := TAdvGlowButton(Message.LParam); + if Sender <> Self then + begin + if Sender.Down and FDownChecked then + begin + FDownChecked := False; + FState := absUp; + { if (Action is TCustomAction) then + TCustomAction(Action).Checked := False; } + Invalidate; + end; + //FAllowAllUp := Sender.AllowAllUp; + end; + end; +end; +{$ENDIF} + +//------------------------------------------------------------------------------ + +{$IFNDEF TMSDOTNET} + +procedure TAdvCustomGlowButton.UpdateExclusive; +var + Msg: TMessage; +begin + if (FGroupIndex <> 0) and (Parent <> nil) then + begin + Msg.Msg := CM_BUTTONPRESSED; + Msg.WParam := FGroupIndex; + Msg.LParam := Longint(Self); + Msg.Result := 0; + Parent.Broadcast(Msg); + {if Assigned(FAdvToolBar) and not (Parent is TAdvCustomToolBar) then + FAdvToolBar.Broadcast(Msg) + else if Assigned(AdvToolBar) and (Parent is TAdvCustomToolBar) and Assigned(AdvToolBar.FOptionWindowPanel) then + FAdvToolBar.FOptionWindowPanel.Broadcast(Msg); } + end; +end; +{$ENDIF} + +//------------------------------------------------------------------------------ + +{$IFDEF TMSDOTNET} +procedure TAdvCustomGlowButton.ButtonPressed(Group: Integer; Button: TAdvGlowButton); +begin + if (Group = FGroupIndex) and (Button <> Self) then + begin + if Button.Down and FDownChecked then + begin + FDownChecked := False; + FState := absUp; + if (Action is TCustomAction) then + TCustomAction(Action).Checked := False; + Invalidate; + end; + //FAllowAllUp := Button.AllowAllUp; + end; +end; + +procedure TAdvCustomGlowButton.UpdateExclusive; +var + I: Integer; +begin + if (FGroupIndex <> 0) and (Parent <> nil) then + begin + for I := 0 to Parent.ControlCount - 1 do + if Parent.Controls[I] is TSpeedButton then + TAdvToolButton(Parent.Controls[I]).ButtonPressed(FGroupIndex, Self); + end; +end; +{$ENDIF} + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.UpdateTracking; +var + P: TPoint; + FNewMouseInControl: boolean; +begin + //if FFlat then + begin + if Enabled then + begin + GetCursorPos(P); + + FNewMouseInControl := not (FindDragTarget(P, True) = Self); + + if FNewMouseInControl <> FMouseInControl then + begin + FMouseInControl := FNewMouseInControl; + if FMouseInControl then + Perform(CM_MOUSELEAVE, 0, 0) + else + Perform(CM_MOUSEENTER, 0, 0); + end; + end; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.SetAllowAllUp(const Value: Boolean); +begin + if FAllowAllUp <> Value then + begin + FAllowAllUp := Value; + UpdateExclusive; + end; +end; + +procedure TAdvCustomGlowButton.SetAntiAlias(const Value: TAntiAlias); +begin + if (FAntiAlias <> Value) then + begin + FAntiAlias := Value; + Invalidate; + end; +end; + +procedure TAdvCustomGlowButton.SetTrimming(const Value: TStringTrimming); +begin + if (FTrimming <> Value) then + begin + FTrimming := Value; + Invalidate; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.MouseMove(Shift: TShiftState; X, Y: Integer); +var + NewState: TAdvButtonState; + FOldInButton: Boolean; +begin + inherited; + + if (csDesigning in ComponentState) then + Exit; + + {$IFNDEF DELPHI2006_LVL} + UpdateTracking; + {$ENDIF} + + FOldInButton := FInButton; + FInButton := false; + + if DropDownButton then + begin + case DropDownPosition of + dpRight: if X > Width - 12 then FInButton := true; + dpBottom: if Y > Height - 12 then FInButton := true; + end; + end; + + if (FInButton <> FOldInButton) then + begin + Invalidate; + end; + + if FDragging then + begin + if (not FDownChecked) then NewState := absUp + else NewState := absExclusive; + + if (X >= 0) and (X < ClientWidth) and (Y >= 0) and (Y <= ClientHeight) then + if FDownChecked then NewState := absExclusive else NewState := absDown; + + if (Style = bsCheck) and FDownChecked then + begin + NewState := absDown; + end; + + if (NewState <> FState) then + begin + FState := NewState; + Invalidate; + end; + end + else + if not FMouseInControl then + UpdateTracking; + +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.SetLayout(const Value: TButtonLayout); +begin + FLayout := Value; + Invalidate; +end; + +procedure TAdvCustomGlowButton.SetOfficeHint(const Value: TAdvHintInfo); +begin + FOfficeHint.Assign(Value); +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.SetPicture(const Value: TGDIPPicture); +begin + FIPicture.Assign(Value); +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.SetTransparent(const Value: Boolean); +begin + FTransparent := Value; +// ReCreateWnd; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.SetDropDownButton(const Value: Boolean); +begin + if FDropDownButton <> Value then + begin + //if (Value and not (Style = bsCheck)) or not Value then + FDropDownButton := Value; + AdjustSize; + Invalidate; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.SetDropDownDirection(const Value: TDropDownDirection); +begin + if FDropDownDirection <> Value then + begin + //if (Value and not (Style = bsCheck)) or not Value then + FDropDownDirection := Value; + Invalidate; + end; +end; + + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.PopupBtnDown; +begin + if Assigned(FOnDropDown) then + FOnDropDown(self); +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.SetDropDownPosition( + const Value: TDropDownPosition); +begin + if FDropDownPosition <> Value then + begin + FDropDownPosition := Value; + if FDropDownButton then + AdjustSize; + Invalidate; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.OnAppearanceChanged(Sender: TObject); +begin + Invalidate; + if Assigned(FShortCutHint) then + begin + FShortCutHint.Color := clWhite; + FShortCutHint.ColorTo := Appearance.Color; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.SetAppearance( + const Value: TGlowButtonAppearance); +begin + FAppearance.Assign(Value); + if Assigned(FShortCutHint) then + begin + FShortCutHint.Color := clWhite; + FShortCutHint.ColorTo := Appearance.Color; + end; +end; + +procedure TAdvCustomGlowButton.SetBorderStyle(const Value: TBorderStyle); +begin + FBorderStyle := Value; + Invalidate; +end; + +procedure TAdvCustomGlowButton.SetButtonPosition(const Value: TButtonPosition); +begin + FButtonPosition := Value; + Invalidate; +end; + +procedure TAdvCustomGlowButton.SetComponentStyle(AStyle: TTMSStyle); +begin + if (Astyle in [tsOffice2003Blue, tsOffice2003Silver, tsOffice2003Olive, tsWhidbey]) then + begin + Appearance.ColorHot := $EBFDFF; + Appearance.ColorHotTo := $ACECFF; + Appearance.ColorMirrorHot := $59DAFF; + Appearance.ColorMirrorHotTo := $A4E9FF; + Appearance.BorderColorHot := $99CEDB; + Appearance.GradientHot := ggVertical; + Appearance.GradientMirrorHot := ggVertical; + + Appearance.ColorDown := $76AFF1; + Appearance.ColorDownTo := $4190F3; + Appearance.ColorMirrorDown := $0E72F1; + Appearance.ColorMirrorDownTo := $4C9FFD; + Appearance.BorderColorDown := $45667B; + Appearance.GradientDown := ggVertical; + Appearance.GradientMirrorDown := ggVertical; + + Appearance.ColorChecked := $B5DBFB; + Appearance.ColorCheckedTo := $78C7FE; + Appearance.ColorMirrorChecked := $9FEBFD; + Appearance.ColorMirrorCheckedTo := $56B4FE; + Appearance.GradientChecked := ggVertical; + Appearance.GradientMirrorChecked := ggVertical; + + end; + + case AStyle of + tsOffice2003Blue: + begin + Appearance.Color := $EEDBC8; + Appearance.ColorTo := $F6DDC9; + Appearance.ColorMirror := $EDD4C0; + Appearance.ColorMirrorTo := $F7E1D0; + Appearance.BorderColor := $E0B99B; + Appearance.Gradient := ggVertical; + Appearance.GradientMirror := ggVertical; + end; + tsOffice2003Olive: + begin + Appearance.Color := $CFF0EA; + Appearance.ColorTo := $CFF0EA; + Appearance.ColorMirror := $CFF0EA; + Appearance.ColorMirrorTo := $8CC0B1; + Appearance.BorderColor := $8CC0B1; + Appearance.Gradient := ggVertical; + Appearance.GradientMirror := ggVertical; + end; + tsOffice2003Silver: + begin + Appearance.Color := $EDD4C0; + Appearance.ColorTo := $00E6D8D8; + Appearance.ColorMirror := $EDD4C0; + Appearance.ColorMirrorTo := $C8B2B3; + Appearance.BorderColor := $927476; + Appearance.Gradient := ggVertical; + Appearance.GradientMirror := ggVertical; + end; + tsOffice2003Classic: + begin + Appearance.Color := clWhite; + Appearance.ColorTo := $C9D1D5; + Appearance.ColorMirror := clWhite; + Appearance.ColorMirrorTo := $C9D1D5; + Appearance.BorderColor := clBlack; + Appearance.Gradient := ggVertical; + Appearance.GradientMirror := ggVertical; + + Appearance.ColorHot := $EBFDFF; + Appearance.ColorHotTo := $ACECFF; + Appearance.ColorMirrorHot := $59DAFF; + Appearance.ColorMirrorHotTo := $A4E9FF; + Appearance.BorderColorHot := $99CEDB; + Appearance.GradientHot := ggVertical; + Appearance.GradientMirrorHot := ggVertical; + + Appearance.ColorDown := $76AFF1; + Appearance.ColorDownTo := $4190F3; + Appearance.ColorMirrorDown := $0E72F1; + Appearance.ColorMirrorDownTo := $4C9FFD; + Appearance.BorderColorDown := $45667B; + Appearance.GradientDown := ggVertical; + Appearance.GradientMirrorDown := ggVertical; + + Appearance.ColorChecked := $B5DBFB; + Appearance.ColorCheckedTo := $78C7FE; + Appearance.ColorMirrorChecked := $9FEBFD; + Appearance.ColorMirrorCheckedTo := $56B4FE; + Appearance.GradientChecked := ggVertical; + Appearance.GradientMirrorChecked := ggVertical; + + end; + tsOffice2007Luna: + begin + Appearance.Color := $EEDBC8; + Appearance.ColorTo := $F6DDC9; + Appearance.ColorMirror := $EDD4C0; + Appearance.ColorMirrorTo := $F7E1D0; + Appearance.BorderColor := $E0B99B; + Appearance.Gradient := ggVertical; + Appearance.GradientMirror := ggVertical; + + Appearance.ColorHot := $EBFDFF; + Appearance.ColorHotTo := $ACECFF; + Appearance.ColorMirrorHot := $59DAFF; + Appearance.ColorMirrorHotTo := $A4E9FF; + Appearance.BorderColorHot := $99CEDB; + Appearance.GradientHot := ggVertical; + Appearance.GradientMirrorHot := ggVertical; + + Appearance.ColorDown := $76AFF1; + Appearance.ColorDownTo := $4190F3; + Appearance.ColorMirrorDown := $0E72F1; + Appearance.ColorMirrorDownTo := $4C9FFD; + Appearance.BorderColorDown := $45667B; + Appearance.GradientDown := ggVertical; + Appearance.GradientMirrorDown := ggVertical; + + Appearance.ColorChecked := $B5DBFB; + Appearance.ColorCheckedTo := $78C7FE; + Appearance.ColorMirrorChecked := $9FEBFD; + Appearance.ColorMirrorCheckedTo := $56B4FE; + Appearance.BorderColorChecked := $45667B; + Appearance.GradientChecked := ggVertical; + Appearance.GradientMirrorChecked := ggVertical; + end; + tsOffice2007Obsidian: + begin + Appearance.Color := $DFDED6; + Appearance.ColorTo := $E4E2DB; + Appearance.ColorMirror := $D7D5CE; + Appearance.ColorMirrorTo := $E7E5E0; + Appearance.BorderColor := $C0BCB2; + Appearance.Gradient := ggVertical; + Appearance.GradientMirror := ggVertical; + + Appearance.ColorHot := $EBFDFF; + Appearance.ColorHotTo := $ACECFF; + Appearance.ColorMirrorHot := $59DAFF; + Appearance.ColorMirrorHotTo := $A4E9FF; + Appearance.BorderColorHot := $99CEDB; + Appearance.GradientHot := ggVertical; + Appearance.GradientMirrorHot := ggVertical; + + Appearance.ColorDown := $76AFF1; + Appearance.ColorDownTo := $4190F3; + Appearance.ColorMirrorDown := $0E72F1; + Appearance.ColorMirrorDownTo := $4C9FFD; + Appearance.BorderColorDown := $45667B; + Appearance.GradientDown := ggVertical; + Appearance.GradientMirrorDown := ggVertical; + + Appearance.ColorChecked := $B5DBFB; + Appearance.ColorCheckedTo := $78C7FE; + Appearance.ColorMirrorChecked := $9FEBFD; + Appearance.ColorMirrorCheckedTo := $56B4FE; + Appearance.BorderColorChecked := $45667B; + Appearance.GradientChecked := ggVertical; + Appearance.GradientMirrorChecked := ggVertical; + + end; + tsOffice2007Silver: + begin + Appearance.Color := $F3F3F1; + Appearance.ColorTo := $F5F5F3; + Appearance.ColorMirror := $EEEAE7; + Appearance.ColorMirrorTo := $F8F7F6; + Appearance.BorderColor := $CCCAC9; + Appearance.Gradient := ggVertical; + Appearance.GradientMirror := ggVertical; + + Appearance.ColorHot := $EBFDFF; + Appearance.ColorHotTo := $ACECFF; + Appearance.ColorMirrorHot := $59DAFF; + Appearance.ColorMirrorHotTo := $A4E9FF; + Appearance.BorderColorHot := $99CEDB; + Appearance.GradientHot := ggVertical; + Appearance.GradientMirrorHot := ggVertical; + + Appearance.ColorDown := $76AFF1; + Appearance.ColorDownTo := $4190F3; + Appearance.ColorMirrorDown := $0E72F1; + Appearance.ColorMirrorDownTo := $4C9FFD; + Appearance.BorderColorDown := $45667B; + Appearance.GradientDown := ggVertical; + Appearance.GradientMirrorDown := ggVertical; + + Appearance.ColorChecked := $B5DBFB; + Appearance.ColorCheckedTo := $78C7FE; + Appearance.ColorMirrorChecked := $9FEBFD; + Appearance.ColorMirrorCheckedTo := $56B4FE; + Appearance.BorderColorChecked := $45667B; + Appearance.GradientChecked := ggVertical; + Appearance.GradientMirrorChecked := ggVertical; + end; + tsWindowsXP: + begin + Appearance.Color := clWhite; + Appearance.ColorTo := $B9D8DC; + Appearance.ColorMirror := $B9D8DC; + Appearance.ColorMirrorTo := $B9D8DC; + Appearance.BorderColor := $B9D8DC; + Appearance.Gradient := ggVertical; + Appearance.GradientMirror := ggVertical; + + Appearance.ColorHot := $EFD3C6; + Appearance.ColorHotTo := $EFD3C6; + Appearance.ColorMirrorHot := $EFD3C6; + Appearance.ColorMirrorHotTo := $EFD3C6; + Appearance.BorderColorHot := clHighlight; + Appearance.GradientHot := ggVertical; + Appearance.GradientMirrorHot := ggVertical; + + Appearance.ColorDown := $B59284; + Appearance.ColorDownTo := $B59284; + Appearance.ColorMirrorDown := $B59284; + Appearance.ColorMirrorDownTo := $B59284; + Appearance.BorderColorDown := clHighlight; + Appearance.GradientDown := ggVertical; + Appearance.GradientMirrorDown := ggVertical; + + + Appearance.ColorChecked := $B9D8DC; + Appearance.ColorCheckedTo := $B9D8DC; + Appearance.ColorMirrorChecked := $B9D8DC; + Appearance.ColorMirrorCheckedTo := $B9D8DC; + Appearance.BorderColorChecked := clBlack; + Appearance.GradientChecked := ggVertical; + Appearance.GradientMirrorChecked := ggVertical; + + end; + tsWhidbey: + begin + Appearance.Color := clWhite; + Appearance.ColorTo := $DFEDF0; + Appearance.ColorMirror := $DFEDF0; + Appearance.ColorMirrorTo := $DFEDF0; + Appearance.BorderColor := $99A8AC; + Appearance.Gradient := ggVertical; + Appearance.GradientMirror := ggVertical; + + end; + tsCustom: + begin + end; + end; + Invalidate; + + if Assigned(FShortCutHint) then + begin + FShortCutHint.Color := clWhite; + FShortCutHint.ColorTo := Appearance.Color; + end; + +end; + + +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ + +{$IFDEF DELPHI6_LVL} + +procedure TAdvCustomGlowButton.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + inherited ActionChange(Sender, CheckDefaults); + if Sender is TCustomAction then + with TCustomAction(Sender) do + begin + if CheckDefaults or (Self.GroupIndex = 0) then + Self.GroupIndex := GroupIndex; + Self.ImageIndex := ImageIndex; + end; +end; + +//------------------------------------------------------------------------------ + +function TAdvCustomGlowButton.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TAdvGlowButtonActionLink; +end; +{$ENDIF} + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.SetButtonSizeState( + const Value: TButtonSizeState); +begin + if (FButtonSizeState <> Value) {and AutoSize} then + begin + if (FButtonSizeState = bsLarge) then + begin + FOldLayout := Layout; + FOldDropDownPosition := DropDownPosition; + end; + + FButtonSizeState := Value; + + if (FButtonSizeState = bsLarge) and AutoSize then + begin + Layout := FOldLayout; + DropDownPosition := FOldDropDownPosition; + end + else if AutoSize then + begin + Layout := blGlyphLeft; + DropDownPosition := dpRight; + end; + FFirstPaint := True; + Paint; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.SetMaxButtonSizeState( + const Value: TButtonSizeState); +begin + if (FMaxButtonSizeState <> Value) {and AutoSize} then + begin + FMaxButtonSizeState := Value; + ButtonSizeState := FMaxButtonSizeState + end; +end; + +//------------------------------------------------------------------------------ + +function TAdvCustomGlowButton.GetNotes: TStrings; +begin + Result := TStrings(FNotes); +end; + + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.SetNotes(const Value: TStrings); +begin + FNotes.Assign(Value); + Invalidate; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.SetNotesFont(const Value: TFont); +begin + FNotesFont.Assign(Value); + Invalidate; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvCustomGlowButton.SetMinButtonSizeState( + const Value: TButtonSizeState); +begin + if (FMinButtonSizeState <> Value) then + begin + FMinButtonSizeState := Value; + if (FMinButtonSizeState > ButtonSizeState) then + ButtonSizeState := FMinButtonSizeState; + end; +end; + +//------------------------------------------------------------------------------ + +function TAdvCustomGlowButton.GetButtonSize(BtnSizeState: TButtonSizeState): TSize; +var + DCaption: string; + DWideCaption: widestring; + ImgList: TImageList; + Pic: TGDIPPicture; + EnabledImg: Boolean; + BD: TButtonDisplay; + bmp: TBitmap; + DrawFocused, DrawFocusedHot, DrawDwLn: boolean; + PicSize: TSize; + LayOt: TButtonLayout; + DpDwPosition: TDropDownPosition; +begin + if Enabled or (DisabledImages = nil) then + begin + if FHot and (HotImages <> nil) then + ImgList := HotImages + else + ImgList := Images; + + EnabledImg := Enabled; + end + else + begin + ImgList := DisabledImages; + EnabledImg := True; + end; + + if Enabled or DisabledPicture.Empty then + begin + if FHot and not HotPicture.Empty then + Pic := HotPicture + else + Pic := Picture; + end + else + Pic := DisabledPicture; + + + if (ImgList = nil) then + begin + ImgList := FInternalImages; + EnabledImg := True; + end; + + if ShowCaption then + begin + DCaption := Caption; + DWideCaption := WideCaption; + end + else + begin + DCaption := ''; + DWideCaption := ''; + end; + + if (FMouseInControl or FMouseDown) and DropDownButton then + begin + if FInButton then + BD := bdDropDown + else + BD := bdButton; + end + else + BD := bdNone; + + DrawFocused := (GetFocus = self.Handle) and (FocusType in [ftBorder, ftHotBorder]); + DrawFocusedHot := (GetFocus = self.Handle) and (FocusType in [ftHot, ftHotBorder]); + + bmp := TBitmap.Create; + bmp.Width := 1; + bmp.Height := 1; + + GetToolImage(bmp); + + if Assigned(Action) then + begin + begin + if (Action as TCustomAction).ImageIndex >= 0 then + if Assigned((Action as TCustomAction).ActionList) then + if Assigned(TImageList((Action as TCustomAction).ActionList.Images)) then + begin + ImgList := TImageList((Action as TCustomAction).ActionList.Images); + EnabledImg := Enabled; + end; + end; + end; + + LayOt := Layout; + DpDwPosition := DropDownPosition; + + PicSize.cx := 0; // no stretch pic + PicSize.cy := 0; + if AutoSize then + begin + if (BtnSizeState in [bsLabel, bsGlyph]) then + begin + PicSize.cx := 16; + PicSize.cy := 16; + + if (bmp.Width = 1) then + begin + bmp.Height := Pic.Height; + bmp.Width := Pic.Width; + bmp.Canvas.Draw(0, 0, Pic); + Pic := nil; + end; + + if Assigned(ImgList) and (ImageIndex >= 0) then + begin + Pic := nil; + end; + end; + + if (BtnSizeState = bsGlyph) then + begin + DCaption := ''; + DWideCaption := ''; + end; + + if (BtnSizeState = bsLarge) then + begin + LayOt := FOldLayout; + DpDwPosition := FOldDropDownPosition; + end + else + begin + LayOt := blGlyphLeft; + DpDwPosition := dpRight; + end; + end; + + DrawDwLn := False; + + with Appearance do + Result := DrawVistaButton(Canvas,ClientRect,FColor, FColorTo, FColorMirror, FColorMirrorTo, + BorderColor, Gradient, GradientMirror, DCaption, DWideCaption, FDefaultCaptionDrawing, Font, ImgList, ImageIndex, EnabledImg, LayOt, FDropDownButton, + DrawDwLn, Enabled, DrawFocused, DpDwPosition, Pic, PicSize, AntiAlias, FDefaultPicDrawing, bmp, BD, Transparent and not (FMouseEnter or DrawFocusedHot or (State = absDown)), FMouseEnter, Position, DropDownSplit, CanDrawBorder, + FOverlappedText, FWordWrap, True, FRounded, FDropDownDirection = ddDown, FSpacing, FTrimming, FNotes, FNotesFont, FDownChecked); + + Result.cx := Result.cx + Spacing * 3 + 2 + 2 * MarginHorz; + Result.cy := Result.cy + Spacing * 2 + 2 * MarginVert; + if DropDownButton then + begin + if (DpDwPosition = dpBottom) then + Result.cy := Result.cy + DropDownSectWidth + else + Result.cx := Result.cx + DropDownSectWidth; + end; + //if Assigned(FOnSetButtonSize) then + //FOnSetButtonSize(Self, w, h); + + bmp.Free; +end; + +//------------------------------------------------------------------------------ + +{ TGlowButtonAppearance } + +constructor TGlowButtonAppearance.Create; +begin + inherited; + Color := clWhite; + ColorTo := clWhite; + ColorMirror := clSilver; + ColorMirrorTo := clWhite; + + ColorHot := $F5F0E1; + ColorHotTo := $F9D2B2; + ColorMirrorHot := $F5C8AD; + ColorMirrorHotTo := $FFF8F4; + + ColorDown := BrightnessColor($F5F0E1,-10,-10,0); + ColorDownTo := BrightnessColor($F9D2B2, -10,-10,0); + ColorMirrorDown := BrightnessColor($F5C8AD, -10,-10,0); + ColorMirrorDownTo := BrightnessColor($FFF8F4, -10,-10,0); + + ColorChecked := BrightnessColor($F5F0E1,-10,-10,0); + ColorCheckedTo := BrightnessColor($F9D2B2, -10,-10,0); + ColorMirrorChecked := BrightnessColor($F5C8AD, -10,-10,0); + ColorMirrorCheckedTo := BrightnessColor($FFF8F4, -10,-10,0); + + ColorDisabled := BrightnessColor(clWhite,-5,-5,-5); + ColorDisabledTo := BrightnessColor(clWhite, -5,-5,-5); + ColorMirrorDisabled := BrightnessColor(clSilver, -5,-5,-5); + ColorMirrorDisabledTo := BrightnessColor(clWhite, -5,-5,-5); + + BorderColor := clSilver; + BorderColorHot := clBlue; + BorderColorDown := clNavy; + BorderColorChecked := clBlue; + BorderColorDisabled := clGray; + + Gradient := ggVertical; + GradientMirror := ggVertical; + + GradientHot := ggRadial; + GradientMirrorHot := ggRadial; + + GradientDown := ggRadial; + GradientMirrorDown := ggRadial; + + GradientChecked := ggRadial; + GradientMirrorChecked := ggVertical; + + GradientDisabled := ggRadial; + GradientMirrorDisabled := ggRadial; + + FSystemFont := true; +end; + +procedure TGlowButtonAppearance.SetSystemFont(const Value: boolean); +begin + if (FSystemFont <> Value) then + begin + FSystemFont := Value; + Changed; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TGlowButtonAppearance.Assign(Source: TPersistent); +begin + if (Source is TGlowButtonAppearance) then + begin + Color := (Source as TGlowButtonAppearance).Color; + ColorTo := (Source as TGlowButtonAppearance).ColorTo; + ColorMirror := (Source as TGlowButtonAppearance).ColorMirror; + ColorMirrorTo := (Source as TGlowButtonAppearance).ColorMirrorTo; + + ColorHot := (Source as TGlowButtonAppearance).ColorHot; + ColorHotTo := (Source as TGlowButtonAppearance).ColorHotTo; + ColorMirrorHot := (Source as TGlowButtonAppearance).ColorMirrorHot; + ColorMirrorHotTo := (Source as TGlowButtonAppearance).ColorMirrorHotTo; + + ColorDown := (Source as TGlowButtonAppearance).ColorDown; + ColorDownTo := (Source as TGlowButtonAppearance).ColorDownTo; + ColorMirrorDown := (Source as TGlowButtonAppearance).ColorMirrorDown; + ColorMirrorDownTo := (Source as TGlowButtonAppearance).ColorMirrorDownTo; + + ColorChecked := (Source as TGlowButtonAppearance).ColorChecked; + ColorCheckedTo := (Source as TGlowButtonAppearance).ColorCheckedTo; + ColorMirrorChecked := (Source as TGlowButtonAppearance).ColorMirrorChecked; + ColorMirrorCheckedTo := (Source as TGlowButtonAppearance).ColorMirrorCheckedTo; + + ColorDisabled := (Source as TGlowButtonAppearance).ColorDisabled; + ColorDisabledTo := (Source as TGlowButtonAppearance).ColorDisabledTo; + ColorMirrorDisabled := (Source as TGlowButtonAppearance).ColorMirrorDisabled; + ColorMirrorDisabledTo := (Source as TGlowButtonAppearance).ColorMirrorDisabledTo; + + BorderColor := (Source as TGlowButtonAppearance).BorderColor; + BorderColorHot := (Source as TGlowButtonAppearance).BorderColorHot; + BorderColorDown := (Source as TGlowButtonAppearance).BorderColorDown; + BorderColorChecked := (Source as TGlowButtonAppearance).BorderColorChecked; + BorderColorDisabled := (Source as TGlowButtonAppearance).BorderColorDisabled; + + Gradient := (Source as TGlowButtonAppearance).Gradient; + GradientMirror := (Source as TGlowButtonAppearance).GradientMirror; + + GradientHot := (Source as TGlowButtonAppearance).GradientHot; + GradientMirrorHot := (Source as TGlowButtonAppearance).GradientMirrorHot; + + GradientDown := (Source as TGlowButtonAppearance).GradientDown; + GradientMirrorDown := (Source as TGlowButtonAppearance).GradientMirrorDown; + + GradientChecked := (Source as TGlowButtonAppearance).GradientChecked; + GradientMirrorChecked := (Source as TGlowButtonAppearance).GradientMirrorChecked; + + GradientDisabled := (Source as TGlowButtonAppearance).GradientDisabled; + GradientMirrorDisabled := (Source as TGlowButtonAppearance).GradientMirrorDisabled; + + SystemFont := (Source as TGlowButtonAppearance).SystemFont; + end + else + inherited Assign(Source); +end; + +//------------------------------------------------------------------------------ + +procedure TGlowButtonAppearance.Changed; +begin + if Assigned(FOnChange) then + FOnChange(Self); +end; + +//------------------------------------------------------------------------------ + +{$IFNDEF TMS_STD} + +{ TDBATBButtonDataLink } + +constructor TDBGlowButtonDataLink.Create; +begin + inherited Create; + FOnEditingChanged := nil; + FOnDataSetChanged := nil; + FOnActiveChanged := nil; +end; + +//------------------------------------------------------------------------------ + +procedure TDBGlowButtonDataLink.ActiveChanged; +begin + if Assigned(FOnActiveChanged) then FOnActiveChanged(Self); +end; + +//------------------------------------------------------------------------------ + +procedure TDBGlowButtonDataLink.DataSetChanged; +begin + if Assigned(FOnDataSetChanged) then FOnDataSetChanged(Self); +end; + +//------------------------------------------------------------------------------ + +procedure TDBGlowButtonDataLink.EditingChanged; +begin + if Assigned(FOnEditingChanged) then FOnEditingChanged(Self); +end; + +//------------------------------------------------------------------------------ + +{ TDBAdvToolBarButton } + +constructor TDBAdvGlowButton.Create(AOwner: TComponent); +begin + inherited; + FAutoDisable := True; + FDBButtonType := dbCustom; + FDisableControls := []; + FDataLink := TDBGlowButtonDataLink.Create; + with FDataLink do + begin + OnEditingChanged := OnDataSetEvents; + OnDataSetChanged := OnDataSetEvents; + OnActiveChanged := OnDataSetEvents; + end; + FConfirmActionString := ''; +end; + +//------------------------------------------------------------------------------ + +destructor TDBAdvGlowButton.Destroy; +begin + FDataLink.Free; + FDataLink := nil; + if (FInternalImages <> nil) then + FInternalImages.Free; + inherited; +end; + +//------------------------------------------------------------------------------ + +procedure TDBAdvGlowButton.CalcDisableReasons; +begin + case FDBButtonType of + dbPrior: FDisableControls := [drBOF, drEditing, drEmpty]; + dbNext: FDisableControls := [drEOF, drEditing, drEmpty]; + dbFirst: FDisableControls := [drBOF, drEditing, drEmpty]; + dbLast: FDisableControls := [drEOF, drEditing, drEmpty]; + dbInsert, + dbAppend: FDisableControls := [drReadonly, drEditing]; + dbEdit: FDisableControls := [drReadonly, drEditing, drEmpty]; + dbCancel: FDisableControls := [drNotEditing]; + dbPost: FDisableControls := [drNotEditing]; + dbRefresh: FDisableControls := [drEditing]; + dbDelete: FDisableControls := [drReadonly, drEditing, drEmpty]; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TDBAdvGlowButton.Click; +begin + inherited; + DoAction; +end; + +//------------------------------------------------------------------------------ + +procedure TDBAdvGlowButton.CMEnabledChanged(var Message: TMessage); +begin + inherited; + if (not FInProcUpdateEnabled) and + (not (csLoading in ComponentState)) and + (not (csDestroying in ComponentState)) then + begin + UpdateEnabled; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TDBAdvGlowButton.DoAction; +var + DoAction: Boolean; + ShowException: Boolean; +begin + if not DoConfirmAction then + Exit; + + DoAction := (FDBButtonType <> dbCustom); + try + DoBeforeAction(DoAction); + if DoAction and (DataSource <> nil) and (DataSource.State <> dsInactive) then + begin + with DataSource.DataSet do + begin + case FDBButtonType of + dbPrior: Prior; + dbNext: Next; + dbFirst: First; + dbLast: Last; + dbInsert: Insert; + dbAppend: Append; + dbEdit: Edit; + dbCancel: Cancel; + dbPost: Post; + dbRefresh:Refresh; + dbDelete: Delete; + end; + end; + end; + ShowException := false; + except + ShowException := true; + if Assigned(FOnAfterAction) then + FOnAfterAction(self, ShowException); + if ShowException then + raise; + ShowException := true; + end; + if not ShowException and DoAction and Assigned(FOnAfterAction) then + FOnAfterAction(self, ShowException); +end; + +//------------------------------------------------------------------------------ + +procedure TDBAdvGlowButton.DoBeforeAction(var DoAction: Boolean); +begin + if (not (csDesigning in ComponentState)) and Assigned(FOnBeforeAction) then + FOnBeforeAction(self, DoAction); +end; + +//------------------------------------------------------------------------------ + +function TDBAdvGlowButton.DoConfirmAction: Boolean; +var + Question: string; + QuestionButtons: TMsgDlgButtons; + QuestionHelpCtx: Longint; + QuestionResult: Longint; +begin + DoGetQuestion(Question, QuestionButtons, QuestionHelpCtx); + if (Question <> '') then + begin + QuestionResult := MessageDlg(Question, mtConfirmation, QuestionButtons, QuestionHelpCtx); + Result := (QuestionResult = idOk) or (QuestionResult = idYes); + end + else + Result := true; +end; + +//------------------------------------------------------------------------------ + +procedure TDBAdvGlowButton.DoGetQuestion(var Question: string; + var Buttons: TMsgDlgButtons; var HelpCtx: Integer); +begin + Question := ''; + if FConfirmAction then + begin + Question := FConfirmActionString; + Buttons := mbOKCancel; + HelpCtx := 0; + if Assigned(FOnGetConfirm) then + FOnGetConfirm(self, Question, Buttons, HelpCtx); + end; +end; + +//------------------------------------------------------------------------------ + +function TDBAdvGlowButton.GetDataSource: TDataSource; +begin + Result := FDataLink.DataSource; +end; + +//------------------------------------------------------------------------------ + +procedure TDBAdvGlowButton.Notification(AComponent: TComponent; + AOperation: TOperation); +begin + inherited; + if (AOperation = opRemove) and (FDataLink <> nil) and (AComponent = DataSource) then + DataSource := nil; +end; + +//------------------------------------------------------------------------------ + +procedure TDBAdvGlowButton.SetDataSource(const Value: TDataSource); +begin + FDataLink.DataSource := Value; + if not (csLoading in ComponentState) then + UpdateEnabled; +end; + +//------------------------------------------------------------------------------ + +procedure TDBAdvGlowButton.SetDBButtonType(const Value: TDBGlowButtonType); +begin + if (Value = FDBButtonType) then + Exit; + + if (Value = dbDelete) and (FConfirmActionString = ''){and ConfirmAction} then + FConfirmActionString := SDeleteRecordQuestion; //'Delete Record?'; + + if (csReading in ComponentState) or (csLoading in ComponentState) then + begin + FDBButtonType := Value; + CalcDisableReasons; + exit; + end; + + FDBButtonType := Value; + LoadGlyph; + CalcDisableReasons; +end; + +//------------------------------------------------------------------------------ + +procedure TDBAdvGlowButton.UpdateEnabled; +var + PossibleDisableReasons: TDBBDisableControls; + GetEnable: Boolean; + WasEnabled: Boolean; +begin + if (csDesigning in ComponentState) or (csDestroying in ComponentState) or not FAutoDisable then + Exit; + + FInProcUpdateEnabled := true; + try + WasEnabled := Enabled; + if FDataLink.Active then + begin + PossibleDisableReasons := []; + if FDataLink.DataSet.BOF then + Include(PossibleDisableReasons, drBOF); + if FDataLink.DataSet.EOF then + Include(PossibleDisableReasons, drEOF); + if not FDataLink.DataSet.CanModify then + Include(PossibleDisableReasons, drReadonly); + if FDataLink.DataSet.BOF and FDataLink.DataSet.EOF then + Include(PossibleDisableReasons, drEmpty); + if FDataLink.Editing then + Include(PossibleDisableReasons, drEditing) + else + Include(PossibleDisableReasons, drNotEditing); + + GetEnable := ((FDisableControls - [drEvent])* PossibleDisableReasons = []); + if (drEvent in FDisableControls) and (Assigned(FOnGetEnabled)) then + FOnGetEnabled(Self, GetEnable); + Enabled := GetEnable; + end + else + Enabled := false; + + if (WasEnabled <> Enabled) and Assigned(FOnEnabledChanged) then + FOnEnabledChanged(self); + finally + FInProcUpdateEnabled := false; + end; + LoadGlyph; +end; + +//------------------------------------------------------------------------------ + +procedure TDBAdvGlowButton.Loaded; +begin + inherited; + //if not Assigned(Images) then + LoadGlyph; + + UpdateEnabled; +end; + +//------------------------------------------------------------------------------ + +procedure TDBAdvGlowButton.OnDataSetEvents(Sender: TObject); +begin + UpdateEnabled; +end; + +//------------------------------------------------------------------------------ + +procedure TDBAdvGlowButton.LoadGlyph; +var + Glyph: TBitMap; +begin + if (csLoading in ComponentState) or Assigned(Images) or (not Enabled and Assigned(DisabledImages)) then + Exit; + + if (FDBButtonType = dbCustom) then + Exit; + + if (FInternalImages = nil) then + FInternalImages := TImageList.Create(self); + + FInternalImages.Clear; + Glyph := TBitMap.Create; + Glyph.Width := 16; + Glyph.Height := 16; + Glyph.Transparent := True; + + case FDBButtonType of + dbPrior: + begin + if Enabled then + Glyph.LoadFromResourceName(HInstance, 'DBIMGPRIOR') + else + Glyph.LoadFromResourceName(HInstance, 'DBIMGPRIORD'); + end; + dbNext: + begin + if Enabled then + Glyph.LoadFromResourceName(HInstance, 'DBIMGNEXT') + else + Glyph.LoadFromResourceName(HInstance, 'DBIMGNEXTD'); + end; + dbFirst: + begin + if Enabled then + Glyph.LoadFromResourceName(HInstance, 'DBIMGFIRST') + else + Glyph.LoadFromResourceName(HInstance, 'DBIMGFIRSTD'); + end; + dbLast: + begin + if Enabled then + Glyph.LoadFromResourceName(HInstance, 'DBIMGLAST') + else + Glyph.LoadFromResourceName(HInstance, 'DBIMGLASTD'); + end; + dbInsert: + begin + if Enabled then + Glyph.LoadFromResourceName(HInstance, 'DBIMGINSERT') + else + Glyph.LoadFromResourceName(HInstance, 'DBIMGINSERTD'); + end; + dbAppend: + begin + if Enabled then + Glyph.LoadFromResourceName(HInstance, 'DBIMGINSERT') + else + Glyph.LoadFromResourceName(HInstance, 'DBIMGINSERTD'); + end; + dbEdit: + begin + if Enabled then + Glyph.LoadFromResourceName(HInstance, 'DBIMGEDIT') + else + Glyph.LoadFromResourceName(HInstance, 'DBIMGEDITD'); + end; + dbCancel: + begin + if Enabled then + Glyph.LoadFromResourceName(HInstance, 'DBIMGCANCEL') + else + Glyph.LoadFromResourceName(HInstance, 'DBIMGCANCELD'); + end; + dbPost: + begin + if Enabled then + Glyph.LoadFromResourceName(HInstance, 'DBIMGPOST') + else + Glyph.LoadFromResourceName(HInstance, 'DBIMGPOSTD'); + end; + dbRefresh: + begin + if Enabled then + Glyph.LoadFromResourceName(HInstance, 'DBIMGREFRESH') + else + Glyph.LoadFromResourceName(HInstance, 'DBIMGREFRESHD'); + end; + dbDelete: + begin + if Enabled then + Glyph.LoadFromResourceName(HInstance, 'DBIMGDELETE') + else + Glyph.LoadFromResourceName(HInstance, 'DBIMGDELETED'); + end; + end; + + FInternalImages.DrawingStyle := dsTransparent; + FInternalImages.Masked := true; + FInternalImages.AddMasked(Glyph, clFuchsia); + FImageIndex := 0; + Glyph.Free; + Invalidate; +end; + +//------------------------------------------------------------------------------ + + +procedure TDBAdvGlowButton.SetConfirmActionString(const Value: String); +begin + if FConfirmActionString <> Value then + begin + FConfirmActionString := Value; + end; +end; + +{$ENDIF} + +//------------------------------------------------------------------------------ + +{$IFDEF DELPHI6_LVL} + +{ TAdvGlowButtonActionLink } + +procedure TAdvGlowButtonActionLink.AssignClient(AClient: TObject); +begin + inherited AssignClient(AClient); + FClient := AClient as TAdvCustomGlowButton; +end; + +//------------------------------------------------------------------------------ + +function TAdvGlowButtonActionLink.IsCheckedLinked: Boolean; +begin + Result := inherited IsCheckedLinked {and (FClient.GroupIndex <> 0) and + FClient.AllowAllUp} and (FClient.Down = (Action as TCustomAction).Checked); + + FClient.CheckLinked := Result; +end; + +//------------------------------------------------------------------------------ + +function TAdvGlowButtonActionLink.IsGroupIndexLinked: Boolean; +begin + Result := (FClient is TAdvCustomGlowButton) and + (TAdvCustomGlowButton(FClient).GroupIndex = (Action as TCustomAction).GroupIndex); + + FClient.GroupIndexLinked := Result; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvGlowButtonActionLink.SetImageIndex(Value: Integer); +begin + if IsGroupIndexLinked then + begin + FImageIndex := Value; + TAdvCustomGlowButton(FClient).ImageIndex := Value; + end; +end; + +//------------------------------------------------------------------------------ + +function TAdvGlowButtonActionLink.IsImageIndexLinked: boolean; +begin + Result := inherited IsImageIndexLinked and + (FImageIndex = (Action as TCustomAction).ImageIndex); +end; + +//------------------------------------------------------------------------------ + +procedure TAdvGlowButtonActionLink.SetChecked(Value: Boolean); +begin + if IsCheckedLinked then + TAdvCustomGlowButton(FClient).Down := Value; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvGlowButtonActionLink.SetGroupIndex(Value: Integer); +begin + if IsGroupIndexLinked then + TAdvCustomGlowButton(FClient).GroupIndex := Value; +end; + +{$ENDIF} + +{ TShortCutHintWindow } + +procedure TShortCutHintWindow.CreateParams(var Params: TCreateParams); +begin + inherited; + Params.Style := Params.Style and not WS_BORDER; +end; + +procedure TShortCutHintWindow.Paint; +var + r: TRect; +begin + r := ClientRect; + DrawGradient(Canvas, Color, ColorTo, 16, r, false); + Canvas.Brush.Style := bsClear; + Canvas.Font.Assign(self.Font); + + DrawText(Canvas.Handle,PChar(Caption),Length(Caption),r, DT_CENTER or DT_SINGLELINE or DT_VCENTER); + + Canvas.Pen.Color := clGray; + RoundRect(Canvas.Handle, R.Left, R.Top, R.Right, R.Bottom, 3,3); +end; + + +procedure TShortCutHintWindow.Resize; +var + ow: integer; +begin + inherited; + ow := Canvas.TextWidth('O') + 8; + if Width < ow then + Width := ow; +end; + +procedure TShortCutHintWindow.WMEraseBkGnd(var Message: TWMEraseBkGnd); +begin + Message.Result := 1; +end; + + + +function TAdvCustomGlowButton.CanDrawBorder: Boolean; +begin + Result := (BorderStyle = bsSingle); +end; + +function TAdvCustomGlowButton.CanDrawFocused: Boolean; +begin + Result := (GetFocus = self.Handle) and (FocusType in [ftBorder, ftHotBorder]); +end; + +{$IFDEF FREEWARE} +{$I TRIAL.INC} +{$ENDIF} + + + + +end. diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Source/advglowbuttondb.res b/TAdvTaskDialog/internal/1.5.0.2/1/Source/advglowbuttondb.res new file mode 100644 index 0000000000000000000000000000000000000000..5a25528296f4590dd8050e55dafba629fb016ba0 GIT binary patch literal 5716 zcmdT|y^_-~5MCIHP-G^LKuJkKK?}qOnK_P|90hOU$}{eg#_yCzaA!B_c?8DVSDv^iNzfK(0WJmJ#E67}kGRmM=ak`+EoUmGv_Oe2PzXU5K~7B! ze8h!5jm_3qngXmT^5o4zM*6b8{>l^j6&!C4Rf7hv;}X zob0hVFuwyg!H3dIh>7l8@MDn1V{A=hbC2_s?uiYV%;%I&DeU*K(QAS%8|uKu+f5Jt z5I+VYF;3TE!{!F&Q(U`Ibp0BR>KmjS*IJ%U4}RdH{wpnwO98g*Ze)E53F>kb_rq#~ zf$4{G!_)c|IHEf}mkgI1nM;-pmZ9@rSdB1L-WkdbPwL+C4_z9Y9lqK;VPCV)oi}y> zpUE+QlsKlxs#bErb{rpF`sEdGD+*@HKCU`_!BeOKUp z%WMs=QBl$A6*J>5*!4m6-vZ&$?>PQ!wc;78m!`J5v{GL6vT`g;e9p8_^Jj{WF(@;9 fW+f%4krfpa?eHx}U9fkQ)wwol3~G~8nQngpYeVT% literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Source/advhintinfo.pas b/TAdvTaskDialog/internal/1.5.0.2/1/Source/advhintinfo.pas new file mode 100644 index 0000000..864f1f7 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.0.2/1/Source/advhintinfo.pas @@ -0,0 +1,92 @@ +{***************************************************************************} +{ TAdvHintInfo component } +{ for Delphi & C++Builder } +{ version 1.0 } +{ } +{ written by TMS Software } +{ copyright © 2006 } +{ Email : info@tmssoftware.com } +{ Web : http://www.tmssoftware.com } +{ } +{ The source code is given as is. The author is not responsible } +{ for any possible damage done due to the use of this code. } +{ The component can be freely used in any application. The complete } +{ source code remains property of the author and may not be distributed, } +{ published, given or sold in any form as such. No parts of the source } +{ code can be included in any other component or application without } +{ written authorization of the author. } +{***************************************************************************} + +unit AdvHintInfo; + +interface + +uses + Classes, GDIPicture; + +type + TAdvHintInfo = class(TPersistent) + private + FPicture: TGDIPPicture; + FShowHelp: boolean; + FNotes: TStrings; + FTitle: string; + FWideTitle: widestring; + FWideNotes: widestring; + procedure SetNotes(const Value: TStrings); + procedure SetPicture(const Value: TGDIPPicture); + public + constructor Create; + destructor Destroy; override; + procedure Assign(Source: TPersistent); override; + property WideTitle: widestring read FWideTitle write FWideTitle; + property WideNotes: widestring read FWideNotes write FWideNotes; + published + property Title: string read FTitle write FTitle; + property Notes: TStrings read FNotes write SetNotes; + property Picture: TGDIPPicture read FPicture write SetPicture; + property ShowHelp: boolean read FShowHelp write FShowHelp default false; + end; + +implementation + +{ TAdvHintInfo } + +procedure TAdvHintInfo.Assign(Source: TPersistent); +begin + if (Source is TAdvHintInfo) then + begin + Title := (Source as TAdvHintInfo).Title; + Notes.Assign((Source as TAdvHintInfo).Notes); + ShowHelp := (Source as TAdvHintInfo).ShowHelp; + Picture.Assign((Source as TAdvHintInfo).Picture); + WideTitle := (Source as TAdvHintInfo).WideTitle; + WideNotes := (Source as TAdvHintInfo).WideNotes; + end; +end; + +constructor TAdvHintInfo.Create; +begin + inherited; + FNotes := TStringList.Create; + FPicture := TGDIPPicture.Create; +end; + +destructor TAdvHintInfo.Destroy; +begin + FNotes.Free; + FPicture.Free; + inherited; +end; + +procedure TAdvHintInfo.SetNotes(const Value: TStrings); +begin + FNotes.Assign(Value); +end; + +procedure TAdvHintInfo.SetPicture(const Value: TGDIPPicture); +begin + FPicture.Assign(Value); +end; + +end. diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Source/advstyleif.pas b/TAdvTaskDialog/internal/1.5.0.2/1/Source/advstyleif.pas new file mode 100644 index 0000000..8a5fbad --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.0.2/1/Source/advstyleif.pas @@ -0,0 +1,62 @@ +{***************************************************************************} +{ TAdvStyleIF interface } +{ for Delphi & C++Builder } +{ } +{ written by TMS Software } +{ copyright © 2006 - 2007 } +{ Email : info@tmssoftware.com } +{ Web : http://www.tmssoftware.com } +{ } +{ The source code is given as is. The author is not responsible } +{ for any possible damage done due to the use of this code. } +{ The component can be freely used in any application. The complete } +{ source code remains property of the author and may not be distributed, } +{ published, given or sold in any form as such. No parts of the source } +{ code can be included in any other component or application without } +{ written authorization of the author. } +{***************************************************************************} + +unit AdvStyleIF; + +interface + +uses + Classes; + +type + TTMSStyle = (tsOffice2003Blue, tsOffice2003Silver, tsOffice2003Olive, tsOffice2003Classic, + tsOffice2007Luna, tsOffice2007Obsidian, tsWindowsXP, tsWhidbey, tsCustom, tsOffice2007Silver); + + // + // ['{E1199D64-5AF9-4DB7-B363-FABE5D1EEE0F}'] + // function GetComponentStyle: TTMSStyle; + + ITMSStyle = interface + ['{11AC2DDC-C087-4298-AB6E-EA1B5017511B}'] + procedure SetComponentStyle(AStyle: TTMSStyle); + end; + +function IsVista: boolean; + +implementation + +uses + Windows; + +//------------------------------------------------------------------------------ + +function IsVista: boolean; +var + hKernel32: HMODULE; +begin + hKernel32 := GetModuleHandle('kernel32'); + if (hKernel32 > 0) then + begin + Result := GetProcAddress(hKernel32, 'GetLocaleInfoEx') <> nil; + end + else + Result := false; +end; + + +end. diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Source/gdipicture.pas b/TAdvTaskDialog/internal/1.5.0.2/1/Source/gdipicture.pas new file mode 100644 index 0000000..7f33d59 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.0.2/1/Source/gdipicture.pas @@ -0,0 +1,384 @@ +{***************************************************************************} +{ TGDIPPicture class } +{ for Delphi & C++Builder } +{ version 1.0 } +{ } +{ written by TMS Software } +{ copyright © 2006 - 2007 } +{ Email : info@tmssoftware.com } +{ Web : http://www.tmssoftware.com } +{ } +{ The source code is given as is. The author is not responsible } +{ for any possible damage done due to the use of this code. } +{ The component can be freely used in any application. The complete } +{ source code remains property of the author and may not be distributed, } +{ published, given or sold in any form as such. No parts of the source } +{ code can be included in any other component or application without } +{ written authorization of the author. } +{***************************************************************************} + +unit GDIPicture; + +interface + +uses + Windows, Classes, Graphics, Controls , SysUtils, AdvGDIP, ComObj, ActiveX; + +{$I TMSDEFS.INC} + +type + + TGDIPPicture = class(TGraphic) + private + { Private declarations } + FDatastream: TMemoryStream; + FIsEmpty: Boolean; + FWidth, FHeight: Integer; + FDoubleBuffered: Boolean; + FBackgroundColor: TColor; + FOnClear: TNotifyEvent; + protected + { Protected declarations } + function GetEmpty: Boolean; override; + function GetHeight: Integer; override; + function GetWidth: Integer; override; + procedure SetHeight(Value: Integer); override; + procedure SetWidth(Value: Integer); override; + procedure ReadData(Stream: TStream); override; + procedure WriteData(Stream: TStream); override; + public + { Public declarations } + constructor Create; override; + destructor Destroy; override; + procedure Assign(Source: TPersistent); override; + procedure Draw(ACanvas: TCanvas; const Rect: TRect); override; + procedure LoadFromFile(const FileName: string); override; + procedure LoadFromStream(Stream: TStream); override; + procedure SaveToStream(Stream: TStream); override; + procedure LoadFromResourceName(Instance: THandle; const ResName: String); + procedure LoadFromResourceID(Instance: THandle; ResID: Integer); + procedure LoadFromURL(url:string); + procedure LoadFromClipboardFormat(AFormat: Word; AData: THandle; + APalette: HPALETTE); override; + procedure SaveToClipboardFormat(var AFormat: Word; var AData: THandle; + var APalette: HPALETTE); override; + property DoubleBuffered: Boolean read FDoubleBuffered write FDoubleBuffered; + property BackgroundColor: TColor read FBackgroundColor write FBackgroundColor; + function GetImageSizes: boolean; + published + { Published declarations } + property OnClear: TNotifyEvent read FOnClear write FOnClear; + end; + + +implementation + + +{ TGDIPPicture } + +procedure TGDIPPicture.Assign(Source: TPersistent); +var + st: TMemoryStream; +begin + FIsEmpty := True; + if Source = nil then + begin + FDataStream.Clear; + FIsEmpty := true; + if Assigned(OnChange) then + OnChange(Self); + if Assigned(OnClear) then + OnClear(self); + end + else + begin + if Source is TGDIPPicture then + begin + FDataStream.LoadFromStream(TGDIPPicture(Source).FDataStream); + FIsEmpty := False; + if Assigned(OnChange) then + OnChange(self); + end + else + if Source is TBitmap then + begin + st := TMemoryStream.Create; + (Source as TBitmap).SaveToStream(st); + st.Position := 0; + FDataStream.LoadFromStream(st); + st.Free; + FIsEmpty := false; + if Assigned(OnChange) then + OnChange(self); + end + else + if (Source is TPicture) then + begin + st := TMemoryStream.Create; + (Source as TPicture).Graphic.SaveToStream(st); + st.Position := 0; + FDataStream.LoadFromStream(st); + st.Free; + FIsEmpty := false; + if Assigned(OnChange) then + OnChange(self); + end; + + GetImageSizes; + end; +end; + +constructor TGDIPPicture.Create; +begin + inherited; + FDataStream := TMemoryStream.Create; + FIsEmpty := True; +end; + +destructor TGDIPPicture.Destroy; +begin + FDataStream.Free; + inherited; +end; + +procedure TGDIPPicture.Draw(ACanvas: TCanvas; const Rect: TRect); +var + dc: HDC; + multi: TGPImage; + graphic: TGPgraphics; + pstm: IStream; + hGlobal: THandle; + pcbWrite: Longint; + bmp: tbitmap; + +begin + if Empty then + Exit; + + if FDataStream.Size = 0 then + Exit; + + hGlobal := GlobalAlloc(GMEM_MOVEABLE, FDataStream.Size); + if (hGlobal = 0) then + raise Exception.Create('Could not allocate memory for image'); + + try + pstm := nil; + + // Create IStream* from global memory + CreateStreamOnHGlobal(hGlobal, TRUE, pstm); + pstm.Write(FDataStream.Memory, FDataStream.Size,@pcbWrite); + + dc := ACanvas.Handle; + graphic:= TGPgraphics.Create(dc); + multi := TGPImage.Create(pstm); + + if multi.GetFormat = ifBMP then + begin // use this alternative for easy bitmap auto transparent drawing + bmp := TBitmap.Create; + FDataStream.Position := 0; + bmp.LoadFromStream(FDataStream); + bmp.TransparentMode := tmAuto; + bmp.Transparent := true; + ACanvas.Draw(Rect.Left,Rect.Top, bmp); + bmp.Free; + end + else + begin + FWidth := multi.GetWidth; + FHeight := multi.GetHeight; + graphic.DrawImageRect(multi, Rect.Left, Rect.Top, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top); + end; + + multi.Free; + graphic.Free; + finally + GlobalFree(hGlobal); + end; + +end; + +function TGDIPPicture.GetImageSizes: boolean; +var + multi: TGPImage; + pstm: IStream; + hGlobal: THandle; + pcbWrite: Longint; + +begin + Result := false; + + if Empty then + Exit; + + if FDataStream.Size = 0 then + Exit; + + hGlobal := GlobalAlloc(GMEM_MOVEABLE, FDataStream.Size); + if (hGlobal = 0) then + raise Exception.Create('Could not allocate memory for image'); + + try + pstm := nil; + // Create IStream* from global memory + CreateStreamOnHGlobal(hGlobal, TRUE, pstm); + pstm.Write(FDataStream.Memory, FDataStream.Size,@pcbWrite); + multi := TGPImage.Create(pstm); + + FWidth := multi.GetWidth; + FHeight := multi.GetHeight; + + Result := true; + + multi.Free; + finally + GlobalFree(hGlobal); + end; + +end; + +function TGDIPPicture.GetEmpty: Boolean; +begin + Result := FIsEmpty; +end; + +function TGDIPPicture.GetHeight: Integer; +begin + Result := FHeight; +end; + +function TGDIPPicture.GetWidth: Integer; +begin + Result := FWidth; +end; + +procedure TGDIPPicture.LoadFromFile(const FileName: string); +begin + try + FDataStream.LoadFromFile(Filename); + + FIsEmpty := False; + + if Assigned(OnClear) then + OnClear(self); + + GetImageSizes; + + if Assigned(OnChange) then + OnChange(self); + + + except + FIsEmpty:=true; + end; +end; + +procedure TGDIPPicture.LoadFromStream(Stream: TStream); +begin + if Assigned(Stream) then + begin + FDataStream.LoadFromStream(Stream); + FIsEmpty := False; + + GetImageSizes; + + if Assigned(OnChange) then + OnChange(self); + end; +end; + +procedure TGDIPPicture.ReadData(Stream: TStream); +begin + if Assigned(Stream) then + begin + FDataStream.LoadFromStream(stream); + FIsEmpty := False; + end; +end; + +procedure TGDIPPicture.SaveToStream(Stream: TStream); +begin + if Assigned(Stream) then + FDataStream.SaveToStream(Stream); +end; + + +procedure TGDIPPicture.SetHeight(Value: Integer); +begin + {$IFDEF DELPHI6_LVL} + inherited; + {$ENDIF} +end; + +procedure TGDIPPicture.SetWidth(Value: Integer); +begin + {$IFDEF DELPHI6_LVL} + inherited; + {$ENDIF} +end; + +procedure TGDIPPicture.LoadFromResourceName(Instance: THandle; const ResName: string); +var + Stream: TCustomMemoryStream; +begin + if FindResource(Instance,PChar(ResName),RT_RCDATA) <> 0 then + begin + Stream := TResourceStream.Create(Instance, ResName, RT_RCDATA); + try + LoadFromStream(Stream); + finally + Stream.Free; + end; + end; +end; + +procedure TGDIPPicture.LoadFromResourceID(Instance: THandle; ResID: Integer); +var + Stream: TCustomMemoryStream; +begin + Stream := TResourceStream.CreateFromID(Instance, ResID, RT_RCDATA); + try + LoadFromStream(Stream); + finally + Stream.Free; + end; +end; + +procedure TGDIPPicture.WriteData(Stream: TStream); +begin + if Assigned(Stream) then + begin + FDataStream.SaveToStream(stream); + end; +end; + +procedure TGDIPPicture.LoadFromURL(url: string); +begin + if (pos('RES://',UpperCase(url))=1) then + begin + Delete(url,1,6); + if (url<>'') then + LoadFromResourceName(hinstance,url); + Exit; + end; + + if (pos('FILE://',uppercase(url))=1) then + begin + Delete(url,1,7); + if (url<>'') + then LoadFromFile(url); + end; +end; + +procedure TGDIPPicture.LoadFromClipboardFormat(AFormat: Word; + AData: THandle; APalette: HPALETTE); +begin +end; + +procedure TGDIPPicture.SaveToClipboardFormat(var AFormat: Word; + var AData: THandle; var APalette: HPALETTE); +begin +end; + + +end. diff --git a/TAdvTaskDialog/internal/1.5.0.2/1/Source/htmlengo.pas b/TAdvTaskDialog/internal/1.5.0.2/1/Source/htmlengo.pas new file mode 100644 index 0000000..5968bf5 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.0.2/1/Source/htmlengo.pas @@ -0,0 +1,2357 @@ +{**************************************************************************} +{ Mini HTML rendering engine } +{ for Delphi & C++Builder } +{ version 1.9 } +{ } +{ written by TMS Software } +{ copyright © 1999-2006 } +{ Email : info@tmssoftware.com } +{ Website : http://www.tmssoftware.com/ } +{ } +{ The source code is given as is. The author is not responsible } +{ for any possible damage done due to the use of this code. } +{ The component can be freely used in any application. The complete } +{ source code remains property of the author and may not be distributed, } +{ published, given or sold in any form as such. No parts of the source } +{ code can be included in any other component or application without } +{ written authorization of the author. } +{**************************************************************************} + +{$I TMSDEFS.INC} + +{$IFNDEF TMSDOTNET} +procedure PrintBitmap(Canvas: TCanvas; DestRect: TRect; Bitmap: TBitmap); +var + BitmapHeader: pBitmapInfo; + BitmapImage : POINTER; + HeaderSize : DWORD; + ImageSize : DWORD; +begin + GetDIBSizes(Bitmap.Handle, HeaderSize, ImageSize); + GetMem(BitmapHeader, HeaderSize); + GetMem(BitmapImage, ImageSize); + try + GetDIB(Bitmap.Handle, Bitmap.Palette, BitmapHeader^, BitmapImage^); + StretchDIBits(Canvas.Handle, + DestRect.Left, DestRect.Top, // Destination Origin + DestRect.Right - DestRect.Left, // Destination Width + DestRect.Bottom - DestRect.Top, // Destination Height + 0, 0, // Source Origin + Bitmap.Width, Bitmap.Height, // Source Width & Height + BitmapImage, + TBitmapInfo(BitmapHeader^), + DIB_RGB_COLORS, + SRCCOPY) + finally + FreeMem(BitmapHeader); + FreeMem(BitmapImage) + end; +end; +{$ENDIF} + +{$IFDEF TMSDOTNET} +procedure PrintBitmap(Canvas: TCanvas; DestRect: TRect; Bitmap: TBitmap); +var + BitmapHeader: TBitmapInfo; + HeaderSize : DWORD; + ImageSize : DWORD; + Bits: HBITMAP; + Image: TBytes; + Info: IntPtr; + +begin + Bits := Bitmap.Handle; + + GetDIBSizes(Bits, HeaderSize, ImageSize); + + + Info := System.Runtime.InteropServices.Marshal.AllocHGlobal(HeaderSize); + + try + SetLength(Image, ImageSize); + GetDIB(Bits, 0, Info, Image); + + BitmapHeader := TBitmapInfo(System.Runtime.InteropServices.Marshal.PtrToStructure(Info, TypeOf(TBitmapInfo))); + + StretchDIBits(Canvas.Handle, + DestRect.Left, DestRect.Top, // Destination Origin + DestRect.Right - DestRect.Left, // Destination Width + DestRect.Bottom - DestRect.Top, // Destination Height + 0, 0, // Source Origin + Bitmap.Width, Bitmap.Height, // Source Width & Height + Image, + Info, + DIB_RGB_COLORS, + SRCCOPY) + finally + System.Runtime.InteropServices.Marshal.FreeHGlobal(Info); + end; +end; +{$ENDIF} + +function DirExists(const Name: string): Boolean; +var + Code: Integer; +begin + {$IFNDEF TMSDOTNET} + Code := GetFileAttributes(PChar(Name)); + {$ENDIF} + {$IFDEF TMSDOTNET} + Code := GetFileAttributes(Name); + {$ENDIF} + Result := (Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0); +end; + +function SysImage(Canvas: TCanvas;x,y:Integer;APath:string;large,draw,print:boolean;resfactor:double):TPoint; +var + SFI: TSHFileInfo; + i,Err: Integer; + imglsthandle: THandle; + rx,ry: Integer; + bmp: TBitmap; + r: TRect; +begin + Val(APath,i,Err); + + {$IFNDEF TMSDOTNET} + FillChar(SFI,Sizeof(SFI),0); + {$ENDIF} + + {$IFNDEF TMSDOTNET} + if (APath <> '') and (Err <> 0) then + begin + if FileExists(APath) or DirExists(APath) then + // If the file or directory exists, just let Windows figure out it's attrs. + SHGetFileInfo(PChar(APath), 0, SFI, SizeOf(TSHFileInfo), + SHGFI_SYSICONINDEX {or OPEN_FLAG[Open] or SELECTED_FLAG[Selected]}) + else + // File doesn't exist, so Windows doesn't know what to do with it. We have + // to tell it by passing the attributes we want, and specifying the + // SHGFI_USEFILEATTRIBUTES flag so that the function knows to use them. + SHGetFileInfo(PChar(APath), 0, SFI, SizeOf(TSHFileInfo), + SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES {or OPEN_FLAG[Open] or SELECTED_FLAG[Selected]}); + i := SFI.iIcon; + end; + + if Large then + imglsthandle := SHGetFileInfo('', 0, SFI, SizeOf(SFI), + SHGFI_SYSICONINDEX or SHGFI_LARGEICON) + else + imglsthandle := SHGetFileInfo('', 0, SFI, SizeOf(SFI), + SHGFI_SYSICONINDEX or SHGFI_SMALLICON); + {$ENDIF} + {$IFDEF TMSDOTNET} + if (APath <> '') and (Err <> 0) then + begin + if FileExists(APath) or DirExists(APath) then + // If the file or directory exists, just let Windows figure out it's attrs. + SHGetFileInfo(APath, 0, SFI, System.Runtime.interopservices.marshal.SizeOf(TypeOf(TSHFileInfo)), + SHGFI_SYSICONINDEX {or OPEN_FLAG[Open] or SELECTED_FLAG[Selected]}) + else + // File doesn't exist, so Windows doesn't know what to do with it. We have + // to tell it by passing the attributes we want, and specifying the + // SHGFI_USEFILEATTRIBUTES flag so that the function knows to use them. + SHGetFileInfo(APath, 0, SFI, System.Runtime.interopservices.Marshal.SizeOf(TypeOf(TSHFileInfo)), + SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES {or OPEN_FLAG[Open] or SELECTED_FLAG[Selected]}); + i := SFI.iIcon; + end; + + if Large then + imglsthandle := SHGetFileInfo('', 0, SFI, System.Runtime.interopservices.Marshal.SizeOf(TypeOf(SFI)), + SHGFI_SYSICONINDEX or SHGFI_LARGEICON) + else + imglsthandle := SHGetFileInfo('', 0, SFI, System.Runtime.interopservices.Marshal.SizeOf(TypeOf(SFI)), + SHGFI_SYSICONINDEX or SHGFI_SMALLICON); + {$ENDIF} + + + ImageList_GetIconSize(imglsthandle,rx,ry); + + {$IFNDEF TMSDOTNET} + Result := Point(rx,ry); + {$ENDIF} + {$IFDEF TMSDOTNET} + Result := Borland.Vcl.Types.Point(rx,ry); + {$ENDIF} + + if Draw and not Print then + ImageList_Draw(imglsthandle,i,Canvas.Handle,x,y, ILD_TRANSPARENT); + + if Draw and Print then + begin + bmp := TBitmap.Create; + bmp.Width := rx; + bmp.Height := ry; + ImageList_Draw(imglsthandle,i,bmp.Canvas.handle,0,0,ILD_NORMAL); + r.left := x; + r.top := y; + r.right := x + Round(rx * ResFactor); + r.bottom := y + Round(ry * ResFactor); + PrintBitmap(Canvas,r,bmp); + bmp.Free; + end; +end; + +procedure DrawHTMLGradient(Canvas: TCanvas; FromColor,ToColor,BorderColor: TColor; Steps: Integer;R:TRect; Direction: Boolean); +var + diffr,startr,endr: Integer; + diffg,startg,endg: Integer; + diffb,startb,endb: Integer; + iend: Integer; + rstepr,rstepg,rstepb,rstepw: Real; + i,stepw: Word; +begin + if Steps = 0 then + Steps := 1; + + FromColor := ColorToRGB(FromColor); + ToColor := ColorToRGB(ToColor); + + startr := (FromColor and $0000FF); + startg := (FromColor and $00FF00) shr 8; + startb := (FromColor and $FF0000) shr 16; + endr := (ToColor and $0000FF); + endg := (ToColor and $00FF00) shr 8; + endb := (ToColor and $FF0000) shr 16; + + diffr := endr - startr; + diffg := endg - startg; + diffb := endb - startb; + + rstepr := diffr / steps; + rstepg := diffg / steps; + rstepb := diffb / steps; + + if Direction then + rstepw := (R.Right - R.Left) / Steps + else + rstepw := (R.Bottom - R.Top) / Steps; + + with Canvas do + begin + for i := 0 to Steps - 1 do + begin + endr := startr + Round(rstepr*i); + endg := startg + Round(rstepg*i); + endb := startb + Round(rstepb*i); + stepw := Round(i*rstepw); + Pen.Color := endr + (endg shl 8) + (endb shl 16); + Brush.Color := Pen.Color; + if Direction then + begin + iend := R.Left + stepw + Trunc(rstepw) + 1; + if iend > R.Right then + iend := R.Right; + Rectangle(R.Left + stepw,R.Top,iend,R.Bottom) + end + else + begin + iend := R.Top + stepw + Trunc(rstepw)+1; + if iend > r.Bottom then + iend := r.Bottom; + Rectangle(R.Left,R.Top + stepw,R.Right,iend); + end; + end; + + if BorderColor <> clNone then + begin + Brush.Style := bsClear; + Pen.Color := BorderColor; + Rectangle(R.Left,R.Top,R.Right,R.Bottom); + end; + end; +end; + +{ +procedure DrawHTMLGradient(Canvas: TCanvas; FromColor,ToColor: TColor; Steps: Integer;R:TRect; Direction: Boolean); +var + diffr,startr,endr: Integer; + diffg,startg,endg: Integer; + diffb,startb,endb: Integer; + iend: Integer; + rstepr,rstepg,rstepb,rstepw: Real; + i,stepw: Word; + +begin + if Steps = 0 then + Steps := 1; + + FromColor := ColorToRGB(FromColor); + ToColor := ColorToRGB(ToColor); + + startr := (FromColor and $0000FF); + startg := (FromColor and $00FF00) shr 8; + startb := (FromColor and $FF0000) shr 16; + endr := (ToColor and $0000FF); + endg := (ToColor and $00FF00) shr 8; + endb := (ToColor and $FF0000) shr 16; + + diffr := endr - startr; + diffg := endg - startg; + diffb := endb - startb; + + rstepr := diffr / steps; + rstepg := diffg / steps; + rstepb := diffb / steps; + + if Direction then + rstepw := (R.Right - R.Left) / Steps + else + rstepw := (R.Bottom - R.Top) / Steps; + + with Canvas do + begin + for i := 0 to Steps - 1 do + begin + endr := startr + Round(rstepr*i); + endg := startg + Round(rstepg*i); + endb := startb + Round(rstepb*i); + stepw := Round(i*rstepw); + Pen.Color := endr + (endg shl 8) + (endb shl 16); + Brush.Color := Pen.Color; + if Direction then + begin + iend := R.Left + stepw + Trunc(rstepw) + 1; + if iend > R.Right then + iend := R.Right; + Rectangle(R.Left + stepw,R.Top,iend,R.Bottom) + end + else + begin + iend := R.Top + stepw + Trunc(rstepw)+1; + if iend > r.Bottom then + iend := r.Bottom; + Rectangle(R.Left,R.Top + stepw,R.Right,iend); + end; + end; + end; +end; +} + +function Text2Color(s:string):tcolor; +begin + Result := clBlack; + + if (s='clred') then result:=clred else + if (s='clblack') then result:=clblack else + if (s='clblue') then result:=clblue else + if (s='clgreen') then result:=clgreen else + if (s='claqua') then result:=claqua else + if (s='clyellow') then result:=clyellow else + if (s='clfuchsia') then result:=clfuchsia else + if (s='clwhite') then result:=clwhite else + if (s='cllime') then result:=cllime else + if (s='clsilver') then result:=clsilver else + if (s='clgray') then result:=clgray else + if (s='clolive') then result:=clolive else + if (s='clnavy') then result:=clnavy else + if (s='clpurple') then result:=clpurple else + if (s='clteal') then result:=clteal else + if (s='clmaroon') then result:=clmaroon; + + if Result <> clBlack then Exit; + + if (s='clbackground') then result:=clbackground else + if (s='clactivecaption') then result:=clactivecaption else + if (s='clinactivecaption') then result:=clinactivecaption else + if (s='clmenu') then result:=clmenu else + if (s='clwindow') then result:=clwindow else + if (s='clwindowframe') then result:=clwindowframe else + if (s='clmenutext') then result:=clmenutext else + if (s='clwindowtext') then result:=clwindowtext else + if (s='clcaptiontext') then result:=clcaptiontext else + if (s='clactiveborder') then result:=clactiveborder else + if (s='clinactiveborder') then result:=clinactiveborder else + if (s='clappworkspace') then result:=clappworkspace else + if (s='clhighlight') then result:=clhighlight else + if (s='clhighlighttext') then result:=clhighlighttext else + if (s='clbtnface') then result:=clbtnface else + if (s='clbtnshadow') then result:=clbtnshadow else + if (s='clgraytext') then result:=clgraytext else + if (s='clbtntext') then result:=clbtntext else + if (s='clinactivecaptiontext') then result:=clinactivecaptiontext else + if (s='clbtnhighlight') then result:=clbtnhighlight else + if (s='cl3ddkshadow') then result:=clgraytext else + if (s='cl3dlight') then result:=cl3dlight else + if (s='clinfotext') then result:=clinfotext else + if (s='clinfobk') then result:=clinfobk; +end; + +function HexVal(s:string): Integer; +var + i,j: Integer; +begin + if Length(s) < 2 then + begin + Result := 0; + Exit; + end; + + if s[1] >= 'A' then + i := ord(s[1]) - ord('A') + 10 + else + i := ord(s[1]) - ord('0'); + + if s[2] >= 'A' then + j := ord(s[2]) - ord('A') + 10 + else + j := ord(s[2]) - ord('0'); + + Result := i shl 4 + j; +end; + +function Hex2Color(s:string): TColor; +var + r,g,b: Integer; +begin + r := Hexval(Copy(s,2,2)); + g := Hexval(Copy(s,4,2)) shl 8; + b := Hexval(Copy(s,6,2)) shl 16; + Result := TColor(b + g + r); +end; + +function IPos(su,s:string):Integer; +begin + Result := Pos(UpperCase(su),UpperCase(s)); +end; + +function IStrToInt(s:string):Integer; +var + Err,Res: Integer; +begin + Val(s,Res,Err); + Result := Res; +end; + +function DBTagStrip(s:string):string; +var + i,j: Integer; +begin + i := Pos('<#',s); + if i > 0 then + begin + Result := Copy(s,1,i - 1); + Delete(s,1,i); + j := Pos('>',s); + if j > 0 then + Delete(s,j,1); + Result := Result + s; + end + else + Result := s; +end; + +function CRLFStrip(s:string;break:boolean):string; +var + i: Integer; +begin + Result := ''; + for i := 1 to Length(s) do + begin + if not (s[i] in [#13,#10]) then + Result := Result + s[i] + else + if (s[i] = #13) and break then + Result := Result + '
'; + end; +end; + +function VarPos(su,s:string;var Res:Integer):Integer; +begin + Res := Pos(su,s); + Result := Res; +end; + +function TagReplaceString(const Srch,Repl:string;var Dest:string):Boolean; +var + i: Integer; +begin + i := IPos(srch,dest); + if i > 0 then + begin + Result := True; + Delete(Dest,i,Length(Srch)); + Dest := Copy(Dest,1,i-1) + Repl + Copy(Dest,i,Length(Dest)); + end + else + Result := False; +end; + +{$WARNINGS OFF} +function HTMLDrawEx(Canvas:TCanvas; s:string; fr:TRect; + FImages: TImageList; + XPos,YPos,FocusLink,HoverLink,ShadowOffset: Integer; + CheckHotSpot,CheckHeight,Print,Selected,Blink,HoverStyle,WordWrap: Boolean; + ResFactor:Double; + URLColor,HoverColor,HoverFontColor,ShadowColor:TColor; + var AnchorVal,StripVal,FocusAnchor: string; + var XSize,YSize,HyperLinks,MouseLink: Integer; + var HoverRect:TRect;ic: THTMLPictureCache; pc: TPictureContainer;LineSpacing: Integer): Boolean; +var + su: string; + r,dr,hr,rr,er: TRect; + htmlwidth,htmlheight,txtheight: Integer; + Align: TAlignment; + PIndent: Integer; + OldFont: TFont; + CalcFont: TFont; + DrawFont: TFont; + OldCalcFont: TFont; + OldDrawFont: TFont; + Hotspot, ImageHotspot: Boolean; + Anchor,OldAnchor,MouseInAnchor,Error: Boolean; + bgcolor,paracolor,hvrcolor,hvrfntcolor,pencolor,blnkcolor,hifcol,hibcol: TColor; + LastAnchor,OldAnchorVal: string; + IMGSize: TPoint; + isSup,isSub,isPara,isShad: Boolean; + subh,suph,imgali,srchpos,hlcount,licount: Integer; + hrgn,holdfont: THandle; + ListIndex: Integer; + dtp: TDrawTextParams; + Invisible: Boolean; + FoundTag: Boolean; + {new for editing} + nnFit: Integer; + nnSize: TSize; + inspoint: Integer; + {$IFNDEF TMSDOTNET} + nndx: Pointer; + {$ENDIF} + AltImg,ImgIdx,OldImgIdx: Integer; + DrawStyle: DWord; + Col1,Col2: TColor; + ofsx,newofsx: integer; + + procedure StartRotated(Canvas:TCanvas;Angle: Integer); + var + LFont:TLogFont; + begin + {$IFNDEF TMSDOTNET} + GetObject(Canvas.Font.Handle,SizeOf(LFont),Addr(LFont)); + {$ENDIF} + + {$IFDEF TMSDOTNET} + GetObject(Canvas.Font.Handle,System.Runtime.InteropServices.Marshal.SizeOf(TypeOf(LFont)),LFont); + {$ENDIF} + + LFont.lfEscapement := Angle * 10; + LFont.lfOrientation := Angle * 10; + hOldFont:=SelectObject(Canvas.Handle,CreateFontIndirect(LFont)); + end; + + procedure EndRotated(Canvas:TCanvas); + begin + DeleteObject(SelectObject(Canvas.Handle,hOldFont)); + end; + + function HTMLDrawLine(Canvas: TCanvas;var s:string;r: TRect;Calc:Boolean; + var w,h,subh,suph,imgali:Integer;var Align:TAlignment; var PIndent: Integer; + XPos,YPos:Integer;var Hotspot,ImageHotSpot:Boolean;OffsetX: integer; var NewOffsetX: integer):string; + var + su,Res,TagProp,Prop,AltProp,Tagp,LineText:string; + cr: TRect; + linebreak,imgbreak,linkbreak: Boolean; + th,sw,indent,err,bmpx,bmpy,oldh: Integer; + TagPos,SpacePos,o,l: Integer; + bmp: THTMLPicture; + ABitmap: TBitmap; + NewColor,NewColorTo: TColor; + TagWidth,TagHeight,WordLen,WordLenEx,WordWidth: Integer; + TagChar: Char; + LengthFits, SpaceBreak: Boolean; + + begin + Result := ''; + LineText := ''; + r.Bottom := r.Bottom - Subh; + + w := 0; + sw := 0; + + LineBreak := False; + ImgBreak := False; + LinkBreak := False; + HotSpot := False; + ImageHotSpot := False; + +// r.Left := r.Left + offsetX; + + cr := r; + res := ''; + + if not Calc then + cr.Left := cr.Left + OffsetX; + + if isPara and not Calc then + begin + Pencolor := Canvas.Pen.Color; + Canvas.Pen.color := Canvas.Brush.Color; + Canvas.Rectangle(fr.Left,r.Top,fr.Right,r.Top + h); + end; + + while (Length(s) > 0) and not LineBreak and not ImgBreak do + begin + // get next word or till next HTML tag + TagPos := Pos('<',s); + + if WordWrap then + SpacePos := Pos(' ',s) + else + SpacePos := 0; + + if (Tagpos > 0) and ((SpacePos > TagPos) or (SpacePos = 0)) then + begin + su := Copy(s,1,TagPos - 1); + end + else + begin + if SpacePos > 0 then + su := Copy(s,1,SpacePos) + else + su := s; + end; + + {$IFDEF TMSDEBUG} + DbgMsg(su+ '.'); + {$ENDIF} + + WordLen := Length(su); + + while Pos(' ',su) > 0 do + begin + TagReplacestring(' ',' ',su); + end; + + while Pos('<',su) > 0 do + begin + TagReplacestring('<','<',su); + end; + + while Pos('>',su) > 0 do + begin + TagReplacestring('>','>',su); + end; + + WordLenEx := Length(su); + + if WordLen > 0 then + begin + th := Canvas.TextHeight(su); + + if isSub and (subh < (th shr 2)) then subh := th shr 2; + if isSup and (suph < (th shr 2)) then suph := th shr 2; + + if th > h then + h := th; + + StripVal := StripVal + su; + + if Invisible then + Delete(s,1,WordLen); + + if not Invisible then + begin + // draw mode + if not Calc then + begin + if isSup then + cr.Bottom := cr.Bottom - suph; + if isSub then + cr.Bottom := cr.Bottom + subh; + + cr.Bottom := cr.Bottom - imgali; + + if isShad then + begin + OffsetRect(cr,ShadowOffset,ShadowOffset); + NewColor := Canvas.Font.Color; + Canvas.Font.Color := ShadowColor; + {$IFNDEF TMSDOTNET} + DrawTextEx(Canvas.Handle,PChar(su),WordLenEx,cr,DrawStyle and not DT_EXTERNALLEADING,nil); + {$ENDIF} + {$IFDEF TMSDOTNET} + DrawTextEx(Canvas.Handle,su,WordLenEx,cr,DrawStyle and not DT_EXTERNALLEADING,nil); + {$ENDIF} + Offsetrect(cr,-ShadowOffset,-ShadowOffset); + Canvas.Font.Color := NewColor; + end; + + {$IFNDEF TMSDOTNET} + DrawTextEx(Canvas.Handle,PChar(su),WordLenEx,cr,DrawStyle and not DT_EXTERNALLEADING,nil); + DrawTextEx(Canvas.Handle,PChar(su),WordLenEx,cr,DrawStyle or DT_CALCRECT,nil); + {$ENDIF} + + {$IFDEF TMSDOTNET} + DrawTextEx(Canvas.Handle,su,WordLenEx,cr,DrawStyle and not DT_EXTERNALLEADING,nil); + DrawTextEx(Canvas.Handle,su,WordLenEx,cr,DrawStyle or DT_CALCRECT,nil); + {$ENDIF} + + if Anchor and (Hyperlinks - 1 = FocusLink) then + FocusAnchor := LastAnchor; + + {$IFDEF TMSDEBUG} + if Anchor then + OutputDebugString(pchar('drawrect for '+anchorval+' = ['+inttostr(cr.Left)+':'+inttostr(cr.Top)+'] ['+inttostr(cr.right)+':'+inttostr(cr.bottom)+'] @ ['+inttostr(xpos)+':'+inttostr(ypos))); + {$ENDIF} + + if Error then + begin + Canvas.Pen.Color := clRed; + Canvas.Pen.Width := 1; + + l := (cr.Left div 2) * 2; + if (l mod 4)=0 then o := 2 else o := 0; + + Canvas.MoveTo(l,r.Bottom + o - 1); + while l < cr.Right do + begin + if o = 2 then o := 0 else o := 2; + Canvas.LineTo(l + 2,r.bottom + o - 1); + Inc(l,2); + end; + // if o = 2 then o := 0 else o := 2; + // Canvas.LineTo(l + 2,r.Bottom + o - 1); + end; + + cr.Left := cr.Right; + cr.Right := r.Right; + cr.Bottom := r.Bottom; + cr.Top := r.Top; + end + else + begin + cr := r; //reinitialized each time ! + {$IFNDEF TMSDOTNET} + DrawTextEx(Canvas.Handle,PChar(su),WordLenEx,cr,DrawStyle or DT_CALCRECT,nil); + {$ENDIF} + + {$IFDEF TMSDOTNET} + DrawTextEx(Canvas.Handle,su,WordLenEx,cr,DrawStyle or DT_CALCRECT,nil); + {$ENDIF} + + // preparations for editing purposes + if (ypos > cr.Top) and (ypos < cr.bottom) and (xpos > w) then {scan charpos here} + begin + {$IFNDEF TMSDOTNET} + er := rect(w,cr.top,xpos,cr.bottom); + Fillchar(dtp,sizeof(dtp),0); + {$ENDIF} + + {$IFDEF TMSDOTNET} + er := Borland.Vcl.Types.rect(w,cr.top,xpos,cr.bottom); + {$ENDIF} + dtp.cbSize:=sizeof(dtp); + + {$IFDEF DELPHI4_LVL} + {$IFNDEF TMSDOTNET} + GetTextExtentExPoint(Canvas.Handle,pChar(su),WordLenEx,xpos-w,@nnfit,nil,nnSize); + {$ENDIF} + {$IFDEF TMSDOTNET} + GetTextExtentExPoint(Canvas.Handle,su,WordLenEx,xpos-w,nnfit,nil,nnSize); + {$ENDIF} + {$ELSE} + {$IFNDEF TMSDOTNET} + nndx := nil; {fix for declaration error in Delphi 3 WINDOWS.PAS} + GetTextExtentExPoint(Canvas.Handle,pChar(su),WordLenEx,xpos - w,nnfit,integer(nndx^),nnSize); + {$ENDIF} + {$IFDEF TMSDOTNET} + GetTextExtentExPoint(Canvas.Handle,su,WordLenEx,xpos - w,nnfit,nil,nnSize); + {$ENDIF} + {$ENDIF} + + {this will get the character pos of the insertion point} + if nnfit = WordLen then + InsPoint := InsPoint + WordLen + else + InsPoint := InsPoint + nnfit; + end; + {end of preparations for editing purposes} + + { Calculated text width } + WordWidth := cr.Right - cr.Left; + w := w + WordWidth; + + if (XPos - cr.Left >= w - WordWidth) and (XPos - cr.Left <= w) and Anchor then + begin + HotSpot := True; + if (YPos > cr.Top){ and (YPos < cr.Bottom)} then + begin + Anchorval := LastAnchor; + MouseInAnchor := True; + end; + end; + end; + + LengthFits := (w < r.Right - r.Left - OfsX) or (r.Right - r.Left - OfsX <= WordWidth); + + if not LengthFits and + ((Length(LineText) > 0) and (LineText[Length(LineText)] <> ' ')) then + LengthFits := True; + + LineText := LineText + su; + + if LengthFits or not WordWrap then + begin + Res := Res + Copy(s,1,WordLen); + + //if not LengthFits and Calc and (LineText <> su) then + // s := ''; + + Delete(s,1,WordLen); + + if Length(su) >= WordLen then + begin + {$IFNDEF TMSDOTNET} + if System.Copy(su, WordLen, 1) = ' ' then + {$ENDIF} + {$IFDEF TMSDOTNET} + if Copy(su, WordLen, 1) = ' ' then + {$ENDIF} + sw := Canvas.TextWidth(' ') + else + sw := 0; + end + else + sw := 0; + end + else + begin + LineBreak := True; + w := w - WordWidth; + end; + end; + end; + + TagPos := Pos('<',s); + + if (TagPos = 1) and (Length(s) <= 2) then + s := ''; + + if not LineBreak and (TagPos = 1) and (Length(s) > 2) then + begin + if (s[2] = '/') and (Length(s) > 3) then + begin + case UpCase(s[3]) of + 'A':begin + if (not HoverStyle or (Hoverlink = Hyperlinks)) and not Calc then + begin + Canvas.Font.Style := Canvas.Font.Style - [fsUnderline]; + if Hovercolor <> clNone then + begin + Canvas.Brush.Color := HvrColor; + if HvrColor = clNone then + Canvas.Brush.Style := bsClear; + end; + if HoverFontColor <> clNone then + Canvas.Font.Color := HoverFontColor; + end; + + if not Selected then + Canvas.Font.Color := Oldfont.Color; + + Anchor := False; + + if MouseInAnchor then + begin + hr.Bottom := r.Bottom; + hr.Right := r.Left + w; + if r.Top <> hr.Top then + begin + hr.Left := r.Left; + hr.Top := r.Top; + end; + + HoverRect := hr; + MouseLink := HyperLinks; + {$IFDEF TMSDEBUG} + DbgRect('hotspot anchor '+lastanchor,hr); + {$ENDIF} + MouseInAnchor := False; + end; + + if Focuslink = Hyperlinks - 1 then + begin + rr.Right := cr.Left; + rr.Bottom := cr.Bottom - ImgAli; + rr.Top := rr.Bottom - Canvas.TextHeight('gh'); + InflateRect(rr,1,0); + if not Calc then Canvas.DrawFocusRect(rr); + end; + end; + 'E':begin + if not Calc then + Error := False; + end; + 'B':begin + if s[4] <> '>' then + Canvas.Font.Color := OldFont.Color + else + Canvas.Font.Style := Canvas.Font.Style - [fsBold]; + end; + 'S':begin + TagChar := UpCase(s[4]); + + if (TagChar = 'U') then + begin + isSup := False; + isSub := False; + end + else + if (TagChar = 'H') then + isShad := False + else + Canvas.Font.Style := Canvas.Font.Style - [fsStrikeOut]; + end; + 'F':begin + Canvas.Font.Name := OldFont.Name; + Canvas.Font.Size := OldFont.Size; + if not Calc and not Selected then + begin + Canvas.Font.Color := OldFont.Color; + Canvas.Brush.Color := BGColor; + if BGColor = clNone then + begin + Canvas.Brush.Style := bsClear; + end; + end; + end; + 'H':begin + if not Calc then + begin + Canvas.Font.Color := hifCol; + Canvas.Brush.Color := hibCol; + if hibCol = clNone then + Canvas.Brush.Style := bsClear; + end; + end; + 'I':begin + Canvas.Font.Style := Canvas.Font.Style - [fsItalic]; + end; + 'L':begin + LineBreak := True; + end; + 'O':begin + NewOffsetX := 0; + end; + 'P':begin + LineBreak := True; + if not Calc then + begin + Canvas.Brush.Color := ParaColor; + if ParaColor = clNone then Canvas.Brush.Style := bsClear; + isPara := false; + end; + end; + 'U':begin + if (s[4] <> '>') and (ListIndex > 0) then + Dec(Listindex) + else + Canvas.Font.Style := Canvas.Font.Style - [fsUnderline]; + end; + 'R':begin + EndRotated(Canvas); + end; + 'Z':Invisible := False; + end; + end + else + begin + case Upcase(s[2]) of + 'A':begin + { only do this when at hover position in xpos,ypos } + if (FocusLink = HyperLinks) and not Calc then + begin + rr.Left := cr.Left; + rr.Top := cr.Top; + end; + + Inc(HyperLinks); + if (not HoverStyle or (Hoverlink = HyperLinks)) and not Calc then + begin + Canvas.Font.Style := Canvas.Font.Style + [fsUnderline]; + if (Hovercolor <> clNone) and not Calc then + begin + HvrColor := Canvas.Brush.Color; + + if Canvas.Brush.Style = bsClear then + HvrColor := clNone; + Canvas.Brush.Color := HoverColor; + end; + + if HoverFontColor <> clNone then + begin + hvrfntcolor := Canvas.Font.Color; + Canvas.Font.Color := HoverFontColor; + end; + end; + + if not Selected and ((HoverFontColor = clNone) or (HoverLink <> HyperLinks) or not HoverStyle) then + Canvas.Font.Color := URLColor; + + TagProp := Copy(s,3,Pos('>',s) - 1); //
+ Prop := Copy(TagProp,Pos('"',TagProp) + 1,Length(TagProp)); + Prop := Copy(Prop,1,Pos('"',Prop) - 1); + LastAnchor := Prop; + Anchor := True; + + hr.Left := w; + hr.Top := r.Top; + end; + 'B':begin + TagChar := Upcase(s[3]); + case TagChar of + '>': Canvas.Font.Style := Canvas.Font.Style + [fsBold]; // tag + 'R': //
tag + begin + LineBreak := true; + StripVal := StripVal + #13; + end; + 'L': if not Blink then + Canvas.Font.Color := BlnkColor; // tag + 'O': + begin + Res := Res + Copy(s,1,pos('>',s)); + if not Calc and not Selected then + begin + TagProp := Uppercase(Copy(s,6,pos('>',s)-1)); + + if (Pos('BACKGROUND',TagProp) > 0) then + begin + Prop := Copy(TagProp,Pos('BACKGROUND',TagProp)+10,Length(TagProp)); + Prop := Copy(Prop,Pos('"',Prop)+1,Length(prop)); + Prop := Copy(Prop,1,Pos('"',Prop)-1); + bmp := nil; + + if Pos('IDX:', UpperCase(Prop)) > 0 then + begin + Delete(Prop, 1, 4); + if Assigned(FImages) and (IStrToInt(Prop) < FImages.Count) then + begin + IMGSize.X := MulDiv(FImages.Width, GetDeviceCaps(Canvas.Handle, LOGPIXELSX), 96); + IMGSize.Y := MulDiv(FImages.Height, GetDeviceCaps(Canvas.Handle, LOGPIXELSY), 96); + + if not Calc and not Print then +{$IFDEF DELPHI4_LVL} + FImages.Draw(Canvas, CR.Left, CR.Top, IStrToInt(Prop), True); +{$ELSE} + FImages.Draw(Canvas, CR.Left, CR.Top, IStrToInt(Prop)); +{$ENDIF} + + if not Calc and Print then + begin + CR.Right := CR.Left + Round(resfactor * FImages.Width); + CR.Bottom := CR.Top + Round(resfactor * FImages.Height); + + ABitmap := TBitmap.Create; + FImages.GetBitmap(IStrToInt(Prop), ABitmap); + PrintBitmap(Canvas, CR, ABitmap); + ABitmap.Free; + CR := r; + end; + end; + end; + + if Pos('SSYS:', UpperCase(Prop)) > 0 then + begin + Delete(Prop, 1, 5); + IMGSize := SysImage(Canvas, CR.Left, CR.Top, Prop, False, not Calc, Print, resfactor); + + IMGSize.X := MulDiv(IMGSize.X, GetDeviceCaps(Canvas.Handle, LOGPIXELSX), 96); + IMGSize.Y := MulDiv(IMGSize.Y, GetDeviceCaps(Canvas.Handle, LOGPIXELSY), 96); + end; + + if Pos('LSYS:', UpperCase(Prop)) > 0 then + begin + Delete(Prop, 1, 5); + IMGSize := SysImage(Canvas, CR.Left, CR.Top, Prop, True, not Calc, Print, resfactor); + + IMGSize.X := MulDiv(IMGSize.X, GetDeviceCaps(Canvas.Handle, LOGPIXELSX), 96); + IMGSize.Y := MulDiv(IMGSize.Y, GetDeviceCaps(Canvas.Handle, LOGPIXELSY), 96); + end; + + bmp := nil; + + if (Pos(':',Prop) = 0) and Assigned(pc) then + begin + bmp := pc.FindPicture(Prop); + end; + + if (Pos('://',Prop) > 0) and Assigned(ic) then + begin + if ic.FindPicture(Prop) = nil then + with ic.AddPicture do + begin + Asynch := False; + LoadFromURL(Prop); + end; + bmp := ic.FindPicture(Prop); + end; + + if bmp <> nil then + begin + if not bmp.Empty and (bmp.Width > 0) and (bmp.Height > 0) then + begin + // do the tiling here + bmpy := 0; + hrgn := CreateRectRgn(fr.left, fr.top, fr.right,fr.bottom); + SelectClipRgn(Canvas.Handle, hrgn); + while (bmpy < fr.bottom-fr.top) do + begin + bmpx := 0; + while (bmpx < fr.right - fr.left) do + begin + Canvas.Draw(fr.left+bmpx,fr.top+bmpy,bmp); + bmpx := bmpx + bmp.width; + end; + bmpy := bmpy + bmp.height; + end; + SelectClipRgn(Canvas.handle, 0); + DeleteObject(hrgn); + end; + end; //end of bmp <> nil + end; //end of background + + if (Pos('BGTOPLEFT', TagProp) > 0) then + begin + Prop := Copy(TagProp, Pos('BGTOPLEFT', TagProp) + 10, Length(TagProp)); + Prop := Copy(Prop, Pos('"', Prop) + 1, Length(Prop)); + Prop := Copy(Prop, 1, Pos('"', Prop) - 1); + bmp := nil; + + if Pos('IDX:', UpperCase(Prop)) > 0 then + begin + Delete(Prop, 1, 4); + if Assigned(FImages) and (IStrToInt(Prop) < FImages.Count) then + begin + IMGSize.X := MulDiv(FImages.Width, GetDeviceCaps(Canvas.Handle, LOGPIXELSX), 96); + IMGSize.Y := MulDiv(FImages.Height, GetDeviceCaps(Canvas.Handle, LOGPIXELSY), 96); + + if not Calc and not Print then +{$IFDEF DELPHI4_LVL} + FImages.Draw(Canvas, CR.Left, CR.Top, IStrToInt(Prop), True); +{$ELSE} + FImages.Draw(Canvas, CR.Left, CR.Top, IStrToInt(Prop)); +{$ENDIF} + + if not Calc and Print then + begin + CR.Right := CR.Left + Round(resfactor * FImages.Width); + CR.Bottom := CR.Top + Round(resfactor * FImages.Height); + + ABitmap := TBitmap.Create; + FImages.GetBitmap(IStrToInt(Prop), ABitmap); + PrintBitmap(Canvas, CR, ABitmap); + ABitmap.Free; + CR := r; + end; + end; + end; + + if Pos('SSYS:', UpperCase(Prop)) > 0 then + begin + Delete(Prop, 1, 5); + IMGSize := SysImage(Canvas, CR.Left, CR.Top, Prop, False, not Calc, Print, resfactor); + + IMGSize.X := MulDiv(IMGSize.X, GetDeviceCaps(Canvas.Handle, LOGPIXELSX), 96); + IMGSize.Y := MulDiv(IMGSize.Y, GetDeviceCaps(Canvas.Handle, LOGPIXELSY), 96); + end; + + if Pos('LSYS:', UpperCase(Prop)) > 0 then + begin + Delete(Prop, 1, 5); + IMGSize := SysImage(Canvas, CR.Left, CR.Top, Prop, True, not Calc, Print, resfactor); + + IMGSize.X := MulDiv(IMGSize.X, GetDeviceCaps(Canvas.Handle, LOGPIXELSX), 96); + IMGSize.Y := MulDiv(IMGSize.Y, GetDeviceCaps(Canvas.Handle, LOGPIXELSY), 96); + end; + + bmp := nil; + + if (Pos(':', Prop) = 0) and Assigned(pc) then + begin + bmp := pc.FindPicture(Prop); + end; + + if (Pos('://', Prop) > 0) and Assigned(iC) then + begin + if iC.FindPicture(Prop) = nil then + with iC.AddPicture do + begin + ASYNCH := False; + LoadFromURL(Prop); + end; + bmp := iC.FindPicture(Prop); + end; + + if bmp <> nil then + begin + if not bmp.Empty and (bmp.Width > 0) and (bmp.Height > 0) then + begin + // do the tiling here + bmpy := 0; + HRgn := CreateRectRgn(fr.Left, fr.Top, fr.Right, fr.Bottom); + SelectClipRgn(Canvas.Handle, HRgn); + if (bmpy < fr.Bottom - fr.Top) then + begin + bmpx := 0; + if (bmpx < fr.Right - fr.Left) then + begin + Canvas.Draw(fr.Left + bmpx, fr.Top + bmpy, bmp); + bmpx := bmpx + bmp.Width; + end; + bmpy := bmpy + bmp.Height; + end; + SelectClipRgn(Canvas.Handle, 0); + DeleteObject(HRgn); + end; + end; //end of bmp <> nil + end; //end of bgtopleft + + if (Pos('BGTOPRIGHT', TagProp) > 0) then + begin + Prop := Copy(TagProp, Pos('BGTOPRIGHT', TagProp) + 10, Length(TagProp)); + Prop := Copy(Prop, Pos('"', Prop) + 1, Length(Prop)); + Prop := Copy(Prop, 1, Pos('"', Prop) - 1); + bmp := nil; + + if Pos('IDX:', UpperCase(Prop)) > 0 then + begin + Delete(Prop, 1, 4); + if Assigned(FImages) and (IStrToInt(Prop) < FImages.Count) then + begin + IMGSize.X := MulDiv(FImages.Width, GetDeviceCaps(Canvas.Handle, LOGPIXELSX), 96); + IMGSize.Y := MulDiv(FImages.Height, GetDeviceCaps(Canvas.Handle, LOGPIXELSY), 96); + + if not Calc and not Print then +{$IFDEF DELPHI4_LVL} + FImages.Draw(Canvas, CR.Right - FImages.Width, CR.Top, IStrToInt(Prop), True); +{$ELSE} + FImages.Draw(Canvas, CR.Right - FImages.Width, CR.Top, IStrToInt(Prop)); +{$ENDIF} + + if not Calc and Print then + begin + CR.Right := CR.Left + Round(resfactor * FImages.Width); + CR.Bottom := CR.Top + Round(resfactor * FImages.Height); + + ABitmap := TBitmap.Create; + FImages.GetBitmap(IStrToInt(Prop), ABitmap); + PrintBitmap(Canvas, CR, ABitmap); + ABitmap.Free; + CR := r; + end; + end; + end; + + if Pos('SSYS:', UpperCase(Prop)) > 0 then + begin + Delete(Prop, 1, 5); + IMGSize := SysImage(Canvas, CR.Right - FImages.Width, CR.Top, Prop, False, not Calc, Print, resfactor); + + IMGSize.X := MulDiv(IMGSize.X, GetDeviceCaps(Canvas.Handle, LOGPIXELSX), 96); + IMGSize.Y := MulDiv(IMGSize.Y, GetDeviceCaps(Canvas.Handle, LOGPIXELSY), 96); + end; + + if Pos('LSYS:', UpperCase(Prop)) > 0 then + begin + Delete(Prop, 1, 5); + IMGSize := SysImage(Canvas, CR.Right - FImages.Width, CR.Top, Prop, True, not Calc, Print, resfactor); + + IMGSize.X := MulDiv(IMGSize.X, GetDeviceCaps(Canvas.Handle, LOGPIXELSX), 96); + IMGSize.Y := MulDiv(IMGSize.Y, GetDeviceCaps(Canvas.Handle, LOGPIXELSY), 96); + end; + + bmp := nil; + + if (Pos(':', Prop) = 0) and Assigned(pc) then + begin + bmp := pc.FindPicture(Prop); + end; + + if (Pos('://', Prop) > 0) and Assigned(iC) then + begin + if iC.FindPicture(Prop) = nil then + with iC.AddPicture do + begin + ASYNCH := False; + LoadFromURL(Prop); + end; + bmp := iC.FindPicture(Prop); + end; + + if bmp <> nil then + begin + if not bmp.Empty and (bmp.Width > 0) and (bmp.Height > 0) then + begin + // do the printing here + bmpy := 0; + HRgn := CreateRectRgn(fr.Left, fr.Top, fr.Right, fr.Bottom); + SelectClipRgn(Canvas.Handle, HRgn); + if (bmpy < fr.Bottom - fr.Top) then + begin + bmpx := 0; + if (bmpx < fr.Right - fr.Left) then + begin + Canvas.Draw(fr.Right - bmp.Width, fr.Top + bmpy, bmp); + bmpx := bmpx + bmp.Width; + end; + bmpy := bmpy + bmp.Height; + end; + SelectClipRgn(Canvas.Handle, 0); + DeleteObject(HRgn); + end; + end; //end of bmp <> nil + end; //end of bgtopright + + if VarPos('BGCOLOR',TagProp,TagPos) > 0 then + begin + Prop := Copy(TagProp,TagPos + 5,Length(TagProp)); + Prop := Copy(Prop,Pos('"',Prop) + 1,Length(Prop)); + Prop := Copy(Prop,1,Pos('"',Prop) - 1); + + NewColor := clNone; + + if Length(Prop) > 0 then + begin + if Prop[1] = '#' then + NewColor := Hex2Color(Prop) + else + NewColor := Text2Color(AnsiLowerCase(prop)); + end; + + if VarPos('BGCOLORTO',TagProp,TagPos) > 0 then + begin + Prop := Copy(TagProp,TagPos + 5,Length(TagProp)); + Prop := Copy(Prop,Pos('"',Prop) + 1,Length(Prop)); + Prop := Copy(Prop,1,Pos('"',Prop) - 1); + NewColorTo := clNone; + + if Length(Prop) > 0 then + begin + if Prop[1] = '#' then + NewColorTo := Hex2Color(Prop) + else + NewColorTo := Text2Color(AnsiLowerCase(prop)); + end; + + Prop := 'H'; + if VarPos('DIR',TagProp,TagPos) > 0 then + begin + Prop := Copy(TagProp,TagPos + 3,Length(TagProp)); + Prop := Copy(Prop,Pos('"',Prop) + 1,Length(Prop)); + Prop := Copy(Prop,1,Pos('"',Prop) - 1); + end; + + Canvas.Pen.Color := Newcolor; + {$IFNDEF TMSDOTNET} + DrawHTMLGradient(Canvas,NewColor,NewColorTo,clNone,64,Rect(fr.left,fr.top,fr.right,fr.bottom),Prop = 'H'); + {$ENDIF} + {$IFDEF TMSDOTNET} + DrawHTMLGradient(Canvas,NewColor,NewColorTo,clNone,64,Borland.Vcl.Types.Rect(fr.left,fr.top,fr.right,fr.bottom),Prop = 'H'); + {$ENDIF} + Canvas.Brush.Style := bsClear + end + else + begin + BGColor := Canvas.Brush.Color; + Canvas.Brush.color := NewColor; + PenColor:=Canvas.Pen.Color; + Canvas.Pen.Color := Newcolor; + Canvas.Rectangle(fr.left - 2,fr.top,fr.right,fr.bottom); + Canvas.Pen.Color := PenColor; + end; + end; + end; + end; + end; + end; + 'E':begin + if not Calc then + Error := True; + end; + 'H':begin + case Upcase(s[3]) of + 'R': + begin + LineBreak := True; + if not Calc then + begin + Pencolor := Canvas.Pen.color; + Canvas.Pen.color:=clblack; + Canvas.MoveTo(r.left,cr.bottom+1); + Canvas.Lineto(r.right,cr.bottom+1); + Canvas.pen.color:=pencolor; + end; + end; + 'I': + begin + if not Calc then + begin + hifCol := Canvas.Font.Color; + hibCol := Canvas.Brush.Color; + if Canvas.Brush.Style = bsClear then + hibCol := clNone; + + Canvas.Brush.Color := clHighLight; + Canvas.Font.Color := clHighLightText; + end; + end; + end; + end; + 'I':begin + TagChar := Upcase(s[3]); + + if TagChar = '>' then // tag + Canvas.Font.Style := Canvas.Font.Style + [fsItalic] + else + if TagChar = 'N' then // tag + begin + TagProp := Copy(s,3,pos('>',s) - 1); + + Prop := Copy(TagProp,ipos('x',TagProp) + 2,Length(TagProp)); + Prop := Copy(Prop,Pos('"',Prop) + 1,Length(prop)); + Prop := Copy(Prop,1,Pos('"',Prop) - 1); + + val(Prop,indent,err); + if err = 0 then + begin + if indent > w then + begin + w := Indent; + cr.left := fr.left + Indent; + end; + end; + end + else + if TagChar = 'M' then + begin + inc(ImgIdx); + + TagProp := Copy(s,3,Pos('>',s) - 1); + Prop := Copy(TagProp,Pos('SRC',Uppercase(TagProp)) + 4,Length(TagProp)); + Prop := Copy(Prop,Pos('"',Prop) + 1,Length(Prop)); + Prop := Copy(Prop,1,Pos('"',Prop) - 1); + + TagProp := Uppercase(TagProp); + + if (Pos('ALT',TagProp) > 0) and (AltImg = ImgIdx) then + begin + Prop := Copy(TagProp,Pos('ALT',TagProp) + 4,Length(TagProp)); + Prop := Copy(Prop,Pos('"',Prop) + 1,Length(Prop)); + Prop := Copy(Prop,1,Pos('"',Prop) - 1); + end; + + TagWidth := 0; + TagHeight := 0; + + if Pos('WIDTH',TagProp) > 0 then + begin + Tagp := Copy(TagProp,Pos('WIDTH',TagProp) + 6,Length(TagProp)); + Tagp := Copy(Tagp,Pos('"',tagp) + 1,Length(Tagp)); + Tagp := Copy(Tagp,1,Pos('"',tagp) - 1); + Val(Tagp,TagWidth,Err); + end; + + if Pos('HEIGHT',TagProp) > 0 then + begin + Tagp := Copy(TagProp,ipos('HEIGHT',TagProp) + 7,Length(TagProp)); + Tagp := Copy(Tagp,pos('"',Tagp) + 1,Length(Tagp)); + Tagp := Copy(Tagp,1,pos('"',Tagp) - 1); + Val(Tagp,TagHeight,Err); + end; + + IMGSize.x := 0; + IMGSize.y := 0; + + if Pos('IDX:',Uppercase(Prop)) > 0 then + begin + Delete(Prop,1,4); + if Assigned(FImages) and (IStrToInt(Prop) < FImages.Count) then + begin + IMGSize.x := MulDiv(FImages.Width,GetDeviceCaps(Canvas.Handle,LOGPIXELSX),96); + IMGSize.y := MulDiv(FImages.Height,GetDeviceCaps(Canvas.Handle,LOGPIXELSY),96); + + if not Calc and not Print then + {$IFDEF DELPHI4_LVL} + FImages.Draw(Canvas,cr.Left,cr.Top,IStrToInt(Prop),True); + {$ELSE} + FImages.Draw(Canvas,cr.Left,cr.Top,IStrToInt(Prop)); + {$ENDIF} + + if not Calc and Print then + begin + cr.Right := cr.Left + Round(ResFactor * FImages.Width); + cr.Bottom := cr.Top + Round(ResFactor * FImages.Height); + + ABitmap := TBitmap.Create; + FImages.GetBitmap(IStrToInt(Prop),ABitmap); + PrintBitmap(Canvas,cr,ABitmap); + ABitmap.Free; + cr := r; + end; + end; + end; + + if Pos('SSYS:',Uppercase(Prop)) > 0 then + begin + Delete(Prop,1,5); + IMGSize := SysImage(Canvas,cr.Left,cr.Top,Prop,False,not Calc,Print,ResFactor); + + IMGSize.x := MulDiv(IMGSize.X,GetDeviceCaps(Canvas.Handle,LOGPIXELSX),96); + IMGSize.y := MulDiv(IMGSize.Y,GetDeviceCaps(Canvas.Handle,LOGPIXELSY),96); + end; + + if Pos('LSYS:',Uppercase(Prop)) > 0 then + begin + Delete(Prop,1,5); + IMGsize := SysImage(Canvas,cr.Left,cr.Top,Prop,True,not Calc,Print,ResFactor); + + IMGSize.x := MulDiv(IMGSize.X,GetDeviceCaps(Canvas.Handle,LOGPIXELSX),96); + IMGSize.y := MulDiv(IMGSize.Y,GetDeviceCaps(Canvas.Handle,LOGPIXELSY),96); + end; + + bmp := nil; + + if (Pos(':',Prop) = 0) and Assigned(pc) then + begin + bmp := pc.FindPicture(Prop); + end; + + if (Pos('://',Prop) > 0) and Assigned(ic) then + begin + if ic.FindPicture(Prop) = nil then + with ic.AddPicture do + begin + Asynch := False; + LoadFromURL(Prop); + end; + + bmp := ic.FindPicture(Prop); + end; + + if bmp <> nil then + begin + if not bmp.Empty then + begin + if not Calc {and not Print} then + begin + if (TagWidth > 0) and (TagHeight > 0) then + begin + bmp.Stretch := True; + {$IFNDEF TMSDOTNET} + Canvas.StretchDraw(Rect(cr.Left,cr.Top,cr.Left + TagWidth,cr.Top + TagHeight),bmp) + {$ENDIF} + {$IFDEF TMSDOTNET} + Canvas.StretchDraw(Borland.Vcl.Types.Rect(cr.Left,cr.Top,cr.Left + TagWidth,cr.Top + TagHeight),bmp) + {$ENDIF} + end + else + begin + + // need for animation - redraw background + if bmp.FrameCount > 1 then + begin + //Canvas.Pen.Color := BlnkColor; + //Canvas.Brush.Color := BlnkColor; + //Canvas.Rectangle(cr.Left,cr.Top,cr.Left + bmp.MaxWidth,cr.Top+bmp.MaxHeight); + end; + + Canvas.Draw(cr.Left + bmp.FrameXPos,cr.Top + bmp.FrameYPos,bmp); + end; + end; + + if (TagWidth > 0) and (TagHeight > 0) then + begin + IMGSize.x := MulDiv(TagWidth,GetDeviceCaps(Canvas.Handle,LOGPIXELSX),96); + IMGSize.y := MulDiv(TagHeight,GetDeviceCaps(Canvas.Handle,LOGPIXELSY),96); + end + else + begin + IMGSize.x := MulDiv(bmp.MaxWidth,GetDeviceCaps(Canvas.Handle,LOGPIXELSX),96); + IMGSize.y := MulDiv(bmp.MaxHeight,GetDeviceCaps(Canvas.Handle,LOGPIXELSY),96); + end; + end; + end; + + if (XPos - r.Left > w) and (XPos - r.Left < w + IMGSize.x) and + (YPos > cr.Top) and (YPos < cr.Top + IMGSize.Y) and Anchor then + begin + ImageHotSpot := True; + AnchorVal := LastAnchor; + AltImg := ImgIdx; + end; + + if Print then + begin + //IMGSize.x := Round(IMGSize.x * ResFactor); + //IMGSize.y := Round(IMGSize.y * ResFactor); + {$IFDEF TMSDEBUG} + DbgPoint('bmp : ',point(IMGSize.x,IMGSize.y)); + {$ENDIF} + end; + + oldh := h; + + if (w + IMGSize.x > r.Right-r.Left) and + (IMGSize.x < r.Right - r.Left) then + begin + ImgBreak := True; + end + else + begin + w := w + IMGSize.x; + cr.left := cr.left + IMGSize.x; + if IMGSize.y > h then + h := IMGSize.y; + end; + + if Pos('ALIGN',TagProp) > 0 then + begin + if Pos('"TOP',TagProp) > 0 then + begin + ImgAli := h - Canvas.TextHeight('gh'); + end + else + begin + if Pos('"MIDDLE',TagProp) > 0 then + ImgAli := (h - Canvas.TextHeight('gh')) shr 1; + end; + end; + + if (Pos('WRAP',TagProp) > 0) then + begin + h := Canvas.TextHeight('gh'); + ImgAli := 0; + end; + end; + end; + 'L':begin + w := w + 12 * ListIndex; + if Linkbreak then + Imgbreak := True else Linkbreak := True; + + cr.left := cr.left + 12 * (ListIndex - 1); + if not calc and not Invisible then + begin + Prop := Canvas.Font.Name; + Canvas.Font.Name := 'Symbol'; + + if Odd(ListIndex) then + DrawText(Canvas.Handle,'·',1,cr,0) + else + DrawText(Canvas.Handle,'o',1,cr,0); + + Canvas.Font.Name := prop; + end; + cr.Left := cr.Left + 12; + end; + 'U':begin + if s[3] <> '>' then + begin + Inc(ListIndex); + LineBreak := true; + end + else + Canvas.Font.Style := Canvas.Font.Style + [fsUnderline]; + end; + 'O':begin + TagChar := Upcase(s[3]); + if TagChar = 'F' then // tag + begin + TagProp := Copy(s,3,pos('>',s) - 1); + Prop := Copy(TagProp,ipos('x',TagProp) + 2,Length(TagProp)); + Prop := Copy(Prop,Pos('"',Prop) + 1,Length(prop)); + Prop := Copy(Prop,1,Pos('"',Prop) - 1); + val(Prop,NewOffsetX,err); + cr.Left := NewOffsetX; + w := NewOffsetX; + end + end; + 'P':begin + if (VarPos('>',s,TagPos)>0) then + begin + TagProp := Uppercase(Copy(s,3,TagPos-1)); + + if VarPos('ALIGN',TagProp,TagPos) > 0 then + begin + Prop := Copy(TagProp,TagPos+5,Length(TagProp)); + Prop := Copy(Prop,Pos('"',prop)+1,Length(Prop)); + Prop := Copy(Prop,1,Pos('"',prop)-1); + + if Pos('RIGHT',Prop) > 0 then Align := taRightJustify; + if Pos('LEFT',Prop) > 0 then Align := taLeftJustify; + if Pos('CENTER',Prop) > 0 then Align := taCenter; + end; + + if VarPos('INDENT',TagProp,TagPos) > 0 then + begin + Prop := Copy(TagProp,TagPos+6,Length(TagProp)); + Prop := Copy(Prop,Pos('"',prop)+1,Length(Prop)); + Prop := Copy(Prop,1,Pos('"',prop)-1); + PIndent := IStrToInt(Prop); + end; + + if VarPos('BGCOLOR',TagProp,TagPos) > 0 then + begin + Prop := Copy(TagProp,TagPos + 5,Length(TagProp)); + Prop := Copy(Prop,Pos('"',Prop) + 1,Length(Prop)); + Prop := Copy(Prop,1,Pos('"',Prop) - 1); + + NewColor := clNone; + + if Length(Prop) > 0 then + begin + if Prop[1] = '#' then + NewColor := Hex2Color(Prop) + else + NewColor := Text2Color(AnsiLowerCase(prop)); + end; + + if VarPos('BGCOLORTO',TagProp,TagPos) > 0 then + begin + Prop := Copy(TagProp,TagPos + 5,Length(TagProp)); + Prop := Copy(Prop,Pos('"',Prop) + 1,Length(Prop)); + Prop := Copy(Prop,1,Pos('"',Prop) - 1); + NewColorTo := clNone; + + if Length(Prop) > 0 then + begin + if Prop[1] = '#' then + NewColorTo := Hex2Color(Prop) + else + NewColorTo := Text2Color(AnsiLowerCase(prop)); + end; + if not Calc then + begin + isPara := True; + Canvas.Pen.Color := Newcolor; + {$IFNDEF TMSDOTNET} + DrawHTMLGradient(Canvas,NewColor,NewColorTo,clNone,64,Rect(fr.left,r.top,fr.right,r.bottom+2),true); + {$ENDIF} + {$IFDEF TMSDOTNET} + DrawHTMLGradient(Canvas,NewColor,NewColorTo,clNone,64,Borland.Vcl.Types.Rect(fr.left,r.top,fr.right,r.bottom+2),true); + {$ENDIF} + Canvas.Brush.Style := bsClear + end; + end + else + begin + if not Calc then + begin + isPara := True; + paracolor := Canvas.Brush.Color; + if Canvas.Brush.Style = bsClear then ParaColor := clNone; + Canvas.Brush.color := NewColor; + PenColor:=Canvas.Pen.Color; + Canvas.Pen.Color := Newcolor; + Canvas.Rectangle(fr.left,r.top,fr.right,r.bottom); + end; + end; + end; + end; + end; + 'F':begin + if (VarPos('>',s,TagPos)>0) then + begin + TagProp := UpperCase(Copy(s,6,TagPos-6)); + + if (VarPos('FACE',TagProp,TagPos) > 0) then + begin + Prop := Copy(TagProp,TagPos+4,Length(TagProp)); + Prop := Copy(prop,pos('"',prop)+1,Length(prop)); + Prop := Copy(prop,1,pos('"',prop)-1); + Canvas.Font.Name := Prop; + end; + + if (VarPos(' COLOR',TagProp,TagPos) > 0) and not Selected then + begin + Prop := Copy(TagProp,TagPos+6,Length(TagProp)); + Prop := Copy(Prop,Pos('"',prop)+1,Length(prop)); + Prop := Copy(Prop,1,Pos('"',prop)-1); + //oldfont.color:=Canvas.font.color; + + if Length(Prop) > 0 then + begin + if Prop[1] = '#' then + Canvas.font.color := Hex2Color(Prop) + else + Canvas.Font.Color := Text2Color(AnsiLowerCase(prop)); + end; + + end; + + if (VarPos('BGCOLOR',TagProp,TagPos)>0) and not Calc and not Selected then + begin + Prop := Copy(TagProp,TagPos+7,Length(TagProp)); + Prop := Copy(prop,pos('"',prop)+1,Length(prop)); + Prop := Copy(prop,1,pos('"',prop)-1); + BGColor := Canvas.Brush.Color; + + if Canvas.Brush.Style = bsClear then + bgcolor := clNone; + + if Length(Prop) > 0 then + begin + if Prop[1] = '#' then + Canvas.Brush.Color := Hex2Color(Prop) + else + Canvas.Brush.Color := Text2Color(AnsiLowerCase(prop)); + end; + + end; + + if (VarPos('SIZE',TagProp,TagPos)>0) then + begin + Prop := Copy(TagProp,TagPos+4,Length(TagProp)); + Prop := Copy(Prop,Pos('=',Prop)+1,Length(Prop)); + Prop := Copy(Prop,Pos('"',Prop)+1,Length(Prop)); + + case IStrToInt(Prop) of + 1:Canvas.Font.Size := 8; + 2:Canvas.Font.Size := 10; + 3:Canvas.Font.Size := 12; + 4:Canvas.Font.Size := 14; + 5:Canvas.Font.Size := 16; + else + Canvas.Font.Size := IStrToInt(Prop); + end; + + end; + end; + end; + 'S':begin + TagChar := Upcase(s[3]); + + if TagChar = '>' then + Canvas.Font.Style := Canvas.font.Style + [fsStrikeOut] + else + begin + if TagChar = 'H' then + isShad := True + else + begin + if ipos('',s)=1 then + isSub := True + else + if ipos('',s)=1 then + isSup := True; + end; + end; + end; + 'R':begin + TagProp := Copy(s,3,pos('>',s)-1); + prop := Copy(TagProp,ipos('a',TagProp)+2,Length(TagProp)); + prop := Copy(prop,pos('"',prop)+1,Length(prop)); + prop := Copy(prop,1,pos('"',prop)-1); + Val(prop,Indent,err); + StartRotated(Canvas,indent); + end; + 'Z':Invisible := True; + end; + end; + + if (VarPos('>',s,TagPos)>0) and not ImgBreak then + begin + Res := Res + Copy(s,1,TagPos); + Delete(s,1,TagPos); + end + else + if not Imgbreak then + Delete(s,1,Length(s)); + end; + end; + + w := w - sw; + + if w > xsize then + xsize := w + 2; + + if (FocusLink = Hyperlinks - 1) and Anchor and not Calc then + begin + rr.Right := cr.Left; + rr.Bottom := cr.Bottom; + InflateRect(rr,1,0); + if not Calc then + Canvas.DrawFocusRect(rr); + rr.Left := r.Left + 1; + rr.Top := rr.Bottom; + end; + + Result := Res; + end; + + +begin + Anchor := False; + Error := False; + OldFont := TFont.Create; + OldFont.Assign(Canvas.Font); + DrawFont := TFont.Create; + DrawFont.Assign(Canvas.Font); + CalcFont := TFont.Create; + CalcFont.Assign(Canvas.Font); + OldDrawfont := TFont.Create; + OldDrawFont.Assign(Canvas.Font); + OldCalcFont := TFont.Create; + OldCalcFont.Assign(Canvas.Font); + BlnkColor := Canvas.Brush.color; + Canvas.Brush.Color := clNone; + BGColor := clNone; + ParaColor := clNone; + isPara := False; + isShad := False; + Invisible := False; + + OfsX := 0; + NewOfsX := 0; + + Result := False; + + r := fr; + r.Left := r.Left + 1; {required to add offset for DrawText problem with first capital W letter} + + Align := taLeftJustify; + PIndent := 0; + + XSize := 0; + YSize := 0; + HyperLinks := 0; + HlCount := 0; + ListIndex := 0; + LiCount := 0; + StripVal := ''; + FocusAnchor := ''; + MouseLink := -1; + MouseInAnchor := False; + + ImgIdx := 0; + AltImg := -1; + + SetBKMode(Canvas.Handle,TRANSPARENT); + + DrawStyle := DT_LEFT or DT_SINGLELINE or DT_EXTERNALLEADING or DT_BOTTOM or DT_EXPANDTABS; // or DT_NOPREFIX; + + if Pos(' & ',s) > 0 then + DrawStyle := DrawStyle or DT_NOPREFIX; + + + if not WordWrap then + DrawStyle := DrawStyle or DT_END_ELLIPSIS; + + if Pos('&',s) > 0 then + begin + repeat + Foundtag := False; + //if TagReplacestring('<','<',s) then Foundtag := True; + //if TagReplacestring('>','>',s) then Foundtag := True; + + if TagReplacestring('&','&&',s) then Foundtag := True; + if TagReplacestring('"','"',s) then Foundtag := True; + + if TagReplacestring('§','§',s) then Foundtag := True; + if TagReplacestring('‰','®‰',s) then Foundtag := True; + if TagReplacestring('®','®',s) then Foundtag := True; + + if TagReplacestring('©','©',s) then Foundtag := True; + if TagReplacestring('¶','¶',s) then Foundtag := True; + + if TagReplacestring('™','™',s) then Foundtag := True; + if TagReplacestring('€','€',s) then Foundtag := True; + + until not Foundtag; + end; + + s := DBTagStrip(s); + s := CRLFStrip(s,True); + + InsPoint := 0; + + while Length(s) > 0 do + begin + {calculate part of the HTML text fitting on the next line} + Oldfont.Assign(OldCalcFont); + Canvas.Font.Assign(CalcFont); + Oldanchor := Anchor; + OldAnchorVal := LastAnchor; + suph := 0; + subh := 0; + imgali := 0; + isSup := False; + isSub := False; + + HtmlHeight := Canvas.TextHeight('gh'); + txtHeight := HtmlHeight; + + OldImgIdx := ImgIdx; + + su := HTMLDrawLine(Canvas,s,r,True,HtmlWidth,HtmlHeight,subh,suph,imgali,Align,PIndent,XPos,YPos,HotSpot,ImageHotSpot,ofsx,newofsx); + + Anchor := OldAnchor; + LastAnchor := OldAnchorVal; + + CalcFont.Assign(Canvas.Font); + OldCalcFont.Assign(OldFont); + + HTMLHeight := HTMLHeight + LineSpacing; + + dr := r; + + case Align of + taCenter:if (r.right - r.left - htmlwidth > 0) then + dr.left := r.left+((r.right - r.left - htmlwidth) shr 1); + taRightJustify:if r.right - htmlwidth > r.left then + dr.left := r.right - htmlwidth; + end; + + dr.Left := dr.Left + PIndent; + + dr.Bottom := dr.Top + HtmlHeight + Subh + Suph; + + if not CheckHeight then + begin + OldFont.Assign(OldDrawFont); + Canvas.Font.Assign(DrawFont); + + HyperLinks := HlCount; + ListIndex := LiCount; + ImgIdx := OldImgIdx; + + HTMLDrawLine(Canvas,su,dr,CheckHotSpot,HtmlWidth,HtmlHeight,subh,suph,ImgAli,Align,PIndent,XPos,YPos,HotSpot,ImageHotspot,ofsx,newofsx); + + HlCount := HyperLinks; + LiCount := ListIndex; + + if (HotSpot and + (YPos > dr.Bottom - ImgAli - Canvas.TextHeight('gh')) and + (YPos < dr.Bottom - ImgAli)) or ImageHotSpot then + begin + Result := True; + end; + + ofsx := newofsx; + + DrawFont.Assign(Canvas.Font); + OldDrawFont.Assign(OldFont); + end; + + r.top := r.top + HtmlHeight + subh + suph; + ysize := ysize + HtmlHeight + subh + suph; + + {do not draw below bottom} + if (r.top + TxtHeight > r.bottom) and not CheckHeight then + s := ''; + end; + + if (ysize = 0) then + ysize := Canvas.TextHeight('gh'); + + //ysize := ysize + 2; + + InsPoint := InsPoint shr 1; + + Canvas.Brush.Color := BlnkColor; + Canvas.Font.Assign(OldFont); + OldFont.Free; + DrawFont.Free; + CalcFont.Free; + OldDrawfont.Free; + OldCalcfont.Free; +end; +{$WARNINGS ON} + +{$IFNDEF REMOVEDRAW} +function HTMLDraw(Canvas:TCanvas;s:string;fr:trect; + FImages:TImageList; + xpos,ypos:integer; + checkhotspot,checkheight,print,selected,blink:boolean; + resfactor:double; + URLColor:tcolor; + var Anchorval,StripVal:string; + var XSize,YSize:integer):boolean; +var + HyperLinks,MouseLink: Integer; + Focusanchor: string; + r: TRect; +begin + Result := HTMLDrawEx(Canvas,s,fr,FImages,xpos,ypos,-1,-1,1,checkhotspot,checkheight,print,selected,blink,false, + False,resfactor,URLColor,clNone,clNone,clGray,anchorval,stripval,focusanchor,xsize,ysize,HyperLinks,MouseLink,r,nil,nil,0); +end; + +{$IFNDEF REMOVEIPOSFROM} +function IPosFrom(su,s:string;frm:integer):Integer; +var + i:Integer; +begin + i := Pos(UpperCase(su),UpperCase(s)); + if i > frm then + Result := i + else + Result := 0; +end; +{$ENDIF} + +{$ENDIF} + + +{$IFNDEF DELPHI4_LVL} +function StringReplace(const S, OldPattern, NewPattern: string): string; +var + SearchStr, Patt, NewStr: string; + Offset: Integer; +begin + SearchStr := S; + Patt := OldPattern; + + NewStr := S; + Result := ''; + while SearchStr <> '' do + begin + {$IFDEF DELPHI3_LVL} + Offset := AnsiPos(Patt, SearchStr); + {$ELSE} + Offset := Pos(Patt, SearchStr); + {$ENDIF} + + if Offset = 0 then + begin + Result := Result + NewStr; + Break; + end; + Result := Result + Copy(NewStr, 1, Offset - 1) + NewPattern; + NewStr := Copy(NewStr, Offset + Length(OldPattern), MaxInt); + Result := Result + NewStr; + Break; + end; +end; +{$ENDIF} + +{$IFNDEF REMOVESTRIP} + +function HTMLStrip(s:string):string; +var + TagPos: integer; +begin + Result := ''; + // replace line breaks by linefeeds + {$IFNDEF DELPHI4_LVL} + while (pos('
',uppercase(s))>0) do s := StringReplace(s,'
',chr(13)+chr(10)); + while (pos('
',uppercase(s))>0) do s := StringReplace(s,'
',chr(13)+chr(10)); + while (pos('
',uppercase(s))>0) do s := StringReplace(s,'
',chr(13)+chr(10)); + while (pos('
',uppercase(s))>0) do s := StringReplace(s,'
',chr(13)+chr(10)); + {$ELSE} + while (pos('
',uppercase(s))>0) do s := StringReplace(s,'
',chr(13)+chr(10),[rfIgnoreCase]); + while (pos('
',uppercase(s))>0) do s := StringReplace(s,'
',chr(13)+chr(10),[rfIgnoreCase]); + {$ENDIF} + + while (VarPos('',s,TagPos) > 0) do + begin + Result := Result + Copy(s,1,TagPos - 1); // copy till Z tag + if (VarPos('',s,TagPos) > 0) then + Delete(s,1,TagPos + 3) + else + Break; + end; + + while (VarPos('',s,TagPos) > 0) do + begin + Result := Result + Copy(s,1,TagPos - 1); // copy till Z tag + if (VarPos('',s,TagPos) > 0) then + Delete(s,1,TagPos + 3) + else + Break; + end; + + + // remove all other tags + while (VarPos('<',s,TagPos) > 0) do + begin + Result := Result + Copy(s,1,TagPos - 1); + if (VarPos('>',s,TagPos)>0) then + Delete(s,1,TagPos) + else + Break; + end; + Result := Result + s; +end; +{$ENDIF} + +{$IFDEF HILIGHT} + +function HTMLStripAll(s:string):string; +var + TagPos: integer; +begin + Result := ''; + + // remove all tags + while (VarPos('<',s,TagPos)>0) do + begin + Result := Result + Copy(s,1,TagPos-1); + if (VarPos('>',s,TagPos)>0) then + Delete(s,1,TagPos); + end; + Result := Result + s; +end; + +function StripPos2HTMLPos(s:string; i: Integer): Integer; +var + j,k: Integer; + Skip: Boolean; +begin + Result := 0; + k := 1; + Skip := False; + + for j := 1 to Length(s) do + begin + if s[j] = '<' then + Skip := True; + + if k = i then + begin + Result := j; + Exit; + end; + + if not Skip then + Inc(k); + + if s[j] = '>' then + Skip := False; + + end; + + if k = i then + begin + Result := Length(s) + 1; + end; +end; + + +function PosFrom(su,s:string; h: Integer;DoCase: boolean; var Res: Integer): Integer; +var + r: Integer; +begin + Result := 0; + Res := 0; + + if h > 0 then + Delete(s,1,h); + + if DoCase then + r := Pos(su,s) + else + r := Pos(UpperCase(su),UpperCase(s)); + + if r > 0 then + begin + Res := h + r; + Result := Res; + end; +end; + +function HiLight(s,h,tag:string;DoCase:boolean):string; +var + hs: string; + l,k: Integer; +begin + hs := HTMLStripAll(s); + + l := 0; + + while PosFrom(h,hs,l,DoCase,k) > 0 do + begin + l := k + Length(h); + Insert('<'+tag+'>',s,StripPos2HTMLPos(s,k)); + Insert('',s,StripPos2HTMLPos(s,l)); + end; + + Result := s; +end; + +function UnHiLight(s,tag:string):string; +begin + Result := ''; + // replace line breaks by linefeeds + {$IFNDEF DELPHI4_LVL} + while Pos('<'+tag+'>',s) > 0 do s := StringReplace(s,'<'+tag+'>',''); + while Pos('',s) > 0 do s := StringReplace(s,'',''); + tag := Uppercase(tag); + while Pos('<'+tag+'>',s) > 0 do s := StringReplace(s,'<'+tag+'>',''); + while Pos('',s) > 0 do s := StringReplace(s,'',''); + {$ELSE} + tag := Uppercase(tag); + while Pos('<'+tag+'>',Uppercase(s)) > 0 do s := StringReplace(s,'<'+tag+'>','',[rfIgnoreCase]); + while Pos('',Uppercase(s)) > 0 do s := StringReplace(s,'','',[rfIgnoreCase]); + {$ENDIF} + Result := s; +end; + +{$ENDIF} + +{$IFDEF PARAMS} + +function IPosv(su,s:string;var vp:integer):integer; +begin + vp := pos(UpperCase(su),UpperCase(s)); + Result := vp; +end; + + +function GetHREFValue(html,href:string;var value:string):boolean; +var + lp: Integer; +begin + Result := False; + while IPosv('href="',html,lp) > 0 do + begin + Delete(html,1,lp+5); {delete all before} + if IPosv('"',html,lp) > 0 then + begin + if CompareText(href,copy(html,1,lp-1))=0 then + begin + {href match - get the value now} + Delete(html,1,lp); + if (iposv('>',html,lp)>0) then + begin + Delete(html,1,lp); + if (iposv('<',html,lp)>0) then + begin + Value := Copy(html,1,lp-1); + Result := True; + Break; + end; + end; + end; + end; + end; +end; + + +function SetHREFValue(var html:string;href,value:string):boolean; +var + h:string; + p:string; +begin + {get current value and do a stringreplace} + + Result := False; + if GetHREFValue(html,href,h) then + begin + p := Copy(html,pos('href="' + href,html),Length(html)); + + {$IFNDEF DELPHI4_LVL} + p := StringReplace(p,'>' + h + '' + value + '' + h + '' + value + ' 0) then + begin + //manipulate the stream here for animated GIF ? + Gifstream := TMemoryStream.Create; + + ImgIdx := 1; + SkipImg := False; + + FDataStream.Position := 6; + FDataStream.Read(FAnimMaxX,2); + FDataStream.Read(FAnimMaxY,2); + + for i := 1 to FDataStream.Size do + begin + FDataStream.Position := i - 1; + FDataStream.Read(b,1); + + if (b = $21) and (i + 8 < FDataStream.Size) then + begin + FDataStream.Read(c,1); + FDataStream.Read(d,1); + FDataStream.Position := FDataStream.Position + 5; + + FDataStream.Read(e,1); + if (c = $F9) and (d = $4) and (e = $2C) then + begin + if imgidx = FFrame then + begin + FDataStream.Read(FFrameXPos,2); + FDataStream.Read(FFrameYPos,2); + FDataStream.Read(FFrameXSize,2); + FDataStream.Read(FFrameYSize,2); + end; + + Inc(ImgIdx); + if ImgIdx <= FFrame then + SkipImg := True + else + SkipImg := False; + end; + end; + if not SkipImg then GifStream.Write(b,1); + end; + GifStream.Position := 0; + GifStream.ReadBuffer(pvData^,GifStream.Size); + GifStream.Free; + end + else + begin + FDataStream.ReadBuffer(pvData^,fDataStream.Size); + end; + + GlobalUnlock(hGlobal); + + pstm := nil; + + // Create IStream* from global memory + hr := CreateStreamOnHGlobal(hGlobal, TRUE, pstm); + + if (not hr=S_OK) then + raise Exception.Create('Could not create image stream') + else + if (pstm = nil) then + raise Exception.Create('Empty image stream created'); + + // Create IPicture from image file + hr := OleLoadPicture(pstm, FDataStream.Size,FALSE,IID_IPicture,gpPicture); + + if not (hr = S_OK) then + raise Exception.Create('Could not load image. Invalid format') + else + if gpPicture = nil then + raise Exception.Create('Could not load image'); + + finally + GlobalFree(hGlobal); + end; + {$ENDIF} +end; + +procedure THTMLPicture.Draw(ACanvas: TCanvas; const Rect: TRect); +var + hmWidth:integer; + hmHeight:integer; + nPixX,nPixY:integer; + pnWidth,pnHeight:integer; + +begin + if Empty then Exit; + + if gpPicture = nil then Exit; + + hmWidth := 0; + hmHeight := 0; + gpPicture.get_Width(hmWidth); + gpPicture.get_Height(hmHeight); + + + if FStretched then + begin + gpPicture.Render(ACanvas.Handle,Rect.Left,Rect.Bottom,Rect.Right - Rect.Left,-(Rect.Bottom - Rect.Top),0,0, + hmWidth,hmHeight, Rect); + end + else + begin + nPixX := GetDeviceCaps(ACanvas.Handle,LOGPIXELSX); + nPixY := GetDeviceCaps(ACanvas.Handle,LOGPIXELSY); + //Convert to device units + pnWidth := MulDiv(hmWidth, nPixX, HIMETRIC_INCH); + pnHeight := MulDiv(hmHeight, nPixY, HIMETRIC_INCH); + + //gpPicture.Render(ACanvas.Handle,Rect.Left,Rect.Top + pnHeight,pnWidth,-pnHeight,0,0, + // hmWidth,hmHeight, Rect); + gpPicture.Render(ACanvas.Handle,Rect.Left,Rect.Top, + pnWidth,pnHeight,0,hmHeight, hmWidth,-hmHeight, Rect); + end; + +end; + +function THTMLPicture.GetEmpty: Boolean; +begin + Result := FIsEmpty; +end; + +function THTMLPicture.GetHeight: integer; +var + hmHeight:integer; +begin + if gpPicture = nil then + Result := 0 + else + begin + gpPicture.get_Height(hmHeight); + Result := MulDiv(hmHeight, FLogPixY, HIMETRIC_INCH); + end; +end; + +function THTMLPicture.GetWidth: Integer; +var + hmWidth: Integer; +begin + if gpPicture = nil then + Result := 0 + else + begin + gpPicture.get_Width(hmWidth); + Result := MulDiv(hmWidth, FLogPixX, HIMETRIC_INCH); + end; +end; + +procedure THTMLPicture.LoadFromFile(const FileName: string); +begin + try + FDataStream.LoadFromFile(Filename); + FIsEmpty:=false; + LoadPicture; + if Assigned(OnChange) then + OnChange(self); + except + FIsEmpty:=true; + end; +end; + +procedure THTMLPicture.LoadFromStream(Stream: TStream); +begin + if Assigned(Stream) then + begin + FDataStream.LoadFromStream(Stream); + FIsEmpty := False; + LoadPicture; + if Assigned(OnChange) then + OnChange(self); + end; +end; + +procedure THTMLPicture.ReadData(Stream: TStream); +begin + + if assigned(Stream) then + begin + fDataStream.LoadFromStream(stream); + fIsEmpty:=false; + LoadPicture; + end; +end; + +procedure THTMLPicture.SaveToStream(Stream: TStream); +begin + if Assigned(Stream) then fDataStream.SaveToStream(Stream); +end; + +procedure THTMLPicture.LoadFromResourceName(Instance: THandle; const ResName: string); +var + Stream: TCustomMemoryStream; +begin + {$IFNDEF TMSDOTNET} + if FindResource(Instance,pchar(ResName),RT_RCDATA)<>0 then + {$ENDIF} + {$IFDEF TMSDOTNET} + if FindResource(Instance,ResName,RT_RCDATA)<>0 then + {$ENDIF} + begin + Stream := TResourceStream.Create(Instance, ResName, RT_RCDATA); + try + LoadFromStream(Stream); + finally + Stream.Free; + end; + end; +end; + +procedure THTMLPicture.LoadFromResourceID(Instance: THandle; ResID: Integer); +var + Stream: TCustomMemoryStream; +begin + Stream := TResourceStream.CreateFromID(Instance, ResID, RT_RCDATA); + try + LoadFromStream(Stream); + finally + Stream.Free; + end; +end; + + +procedure THTMLPicture.SetHeight(Value: integer); +begin + +end; + +procedure THTMLPicture.SetWidth(Value: integer); +begin + +end; + +procedure THTMLPicture.WriteData(Stream: TStream); +begin + if Assigned(Stream) then + begin + FDataStream.savetostream(stream); + end; +end; + +procedure THTMLPicture.LoadFromURL(url: string); +var + UUrl: string; +begin + UUrl := UpperCase(url); + + if Pos('RES://',UUrl) = 1 then + begin + ID := url; + Delete(url,1,6); + if url <> '' then + LoadFromResourceName(hinstance,url); + Exit; + end; + + if Pos('FILE://',Uurl) = 1 then + begin + ID := url; + Delete(url,1,7); + if url <> '' then + LoadFromFile(url); + Exit; + end; + + if FAsynch then + begin + if FThreadBusy then + Exit; + FURL := url; + FThreadBusy := True; + TDownLoadThread.Create(self); + end + else + begin + FURL := url; + ID := url; + {$IFDEF USEWININET} + DownLoad; + {$ENDIF} + end; +end; + +{$IFDEF USEWININET} +procedure THTMLPicture.DownLoad; +var + RBSIZE:dword; + httpstatus,httpsize,err:integer; + dwIdx:dword; + dwBufSize:dword; + ms:TMemoryStream; + len:dword; + cbuf:array[0..255] of char; + rb:array[0..4095] of byte; + + FISession:hinternet; + FIHttp:hinternet; + Cancel:boolean; + +begin + fISession:=InternetOpen('HTMLImage',INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0); + if (fISession=nil) then + begin + DownLoadError('Cannot open internet session'); + fThreadBusy:=false; + Exit; + end; + + fIHttp:=InternetOpenURL(fISession,pchar(furl),nil,0, + INTERNET_FLAG_PRAGMA_NOCACHE or INTERNET_FLAG_NO_CACHE_WRITE or INTERNET_FLAG_RELOAD,0); + + if (fIHttp=nil) then + begin + InternetCloseHandle(fISession); + DownLoadError('Cannot open http connection'); + fThreadBusy:=false; + Exit; + end; + + dwBufSize := SizeOf(cbuf); + dwidx := 0; + HttpQueryInfo(fIHttp,HTTP_QUERY_STATUS_CODE,@cbuf,dwBufSize,dwIdx); + + val(cbuf,httpstatus,err); + if (httpstatus <> 200) or (err <> 0) then + begin + InternetCloseHandle(fISession); + InternetCloseHandle(fIHttp); + DownLoadError('Cannot open URL '+furl); + FThreadBusy:=false; + Exit; + end; + + dwBufSize := SizeOf(cbuf); + dwidx := 0; + HttpQueryInfo(fIHttp,HTTP_QUERY_CONTENT_TYPE,@cbuf,dwBufSize,dwIdx); + + if Pos('IMAGE',UpperCase(StrPas(cbuf))) = 0 then + begin + InternetCloseHandle(fISession); + InternetCloseHandle(fIHttp); + DownLoadError('Resource is not of image type : ' + FUrl); + fThreadBusy := false; + Exit; + end; + + dwBufSize := SizeOf(cbuf); + dwidx := 0; + HttpQueryInfo(fIHttp,HTTP_QUERY_CONTENT_LENGTH,@cbuf,dwBufSize,dwIdx); + + val(cbuf,httpsize,err); + if (httpsize = 0) or (err <> 0) then + begin + InternetCloseHandle(fISession); + InternetCloseHandle(fIHttp); + DownLoadError('Image size is 0'); + fThreadBusy:=false; + Exit; + end; + + DownLoadProgress(0,httpsize); + + len := 4096; + RBSIZE := 4096; + + ms := TMemoryStream.Create; + + cancel:=false; + + while (len=RBSIZE) and not Cancel do + begin + InternetReadFile(fIHttp,@rb,RBSIZE,len); + if len>0 then ms.WriteBuffer(rb,len); + DownLoadProgress(ms.Size,httpsize); + DownLoadCancel(cancel); + end; + + if not cancel then + begin + ms.Position := 0; + LoadFromStream(ms); + end; + + ms.Free; + + InternetCloseHandle(fIHttp); + InternetCloseHandle(fISession); + FThreadBusy:=false; +end; +{$ENDIF} + +procedure THTMLPicture.DownLoadCancel(var cancel: boolean); +begin + if assigned(FOnDownLoadCancel) then + FOnDownLoadCancel(self,cancel); +end; + +procedure THTMLPicture.DownLoadComplete; +begin + if Assigned(FOnDownLoadComplete) then + FOnDownLoadComplete(self); +end; + +procedure THTMLPicture.DownLoadError(err: string); +begin + if Assigned(fOnDownloadError) then + FOnDownLoadError(self,err); +end; + +procedure THTMLPicture.DownLoadProgress(dwSize, dwTotSize: dword); +begin + if Assigned(FOnDownLoadProgress) then + FOnDownLoadProgress(self,dwSize,dwTotSize); +end; + + +procedure THTMLPicture.LoadFromClipboardFormat(AFormat: Word; + AData: THandle; APalette: HPALETTE); +begin +end; + +procedure THTMLPicture.SaveToClipboardFormat(var AFormat: Word; + var AData: THandle; var APalette: HPALETTE); +begin +end; + +function THTMLPicture.GetFrameCount: Integer; +var + i: Integer; + b,c,d,e: Byte; + Res: Integer; +begin + Result := -1; + + if FFrameCount <> -1 then + Result := FFrameCount + else + if IsGIFFile then + begin + Res := 0; + for i := 1 to FDataStream.Size do + begin + FDataStream.Position := i - 1; + FDataStream.Read(b,1); + if (b = $21) and (i + 8 < FDataStream.Size) then + begin + FDataStream.Read(c,1); + FDataStream.Read(d,1); + FDataStream.Position := FDataStream.Position+5; + FDataStream.Read(e,1); + if (c = $F9) and (d = $4) and (e = $2C) then Inc(res); + end; + end; + FFrameCount := Res; + Result := Res; + FDataStream.Position := 0; + end; +end; + +function THTMLPicture.IsGIFFile: Boolean; +var + buf: array[0..4] of char; +begin + Result := False; + if FDataStream.Size>4 then + begin + FDataStream.Position := 0; + {$IFNDEF TMSDOTNET} + FDataStream.Read(buf,4); + buf[4] := #0; + Result := Strpas(buf) = 'GIF8'; + {$ENDIF} + FDataStream.Position := 0; + + end; +end; + +function THTMLPicture.GetFrameTime(i: Integer): Integer; +var + j: Integer; + b,c,d,e: Byte; + res: Integer; + ft: Word; + +begin + Result := -1; + + if IsGIFFile then + begin + Res := 0; + for j := 1 to FDataStream.Size do + begin + FDataStream.Position := j-1; + FDataStream.Read(b,1); + if (b = $21) and (i + 8 < FDataStream.Size) then + begin + FDataStream.Read(c,1); + FDataStream.Read(d,1); + FDataStream.Read(b,1); + {transp. flag here} + + FDataStream.Read(ft,2); + FDataStream.Position := FDataStream.Position + 2; + + FDataStream.Read(e,1); + if (c = $F9) and (d = $4) and (e = $2C) then + begin + Inc(res); + if res = i then + begin + Result := ft; + FFrameTransp := b and $01=$01; + FFrameDisposal := (b shr 3) and $7; + end; + end; + end; + end; + end; + FDataStream.Position := 0; +end; + +function THTMLPicture.GetMaxHeight: Integer; +var + hmHeight: Integer; +begin + {$IFNDEF TMSDOTNET} + if gpPicture = nil then + Result := 0 + else + begin + if FAnimMaxY>0 then Result:=FAnimMaxY + else + begin + gpPicture.get_Height(hmHeight); + Result := MulDiv(hmHeight, fLogPixY, HIMETRIC_INCH); + end; + end; + {$ENDIF} +end; + +function THTMLPicture.GetMaxWidth: Integer; +var + hmWidth: Integer; +begin + if gpPicture = nil then + Result := 0 + else + begin + if FAnimMaxX > 0 then + Result := FAnimMaxX + else + begin + gpPicture.get_Width(hmWidth); + Result := MulDiv(hmWidth, fLogPixX, HIMETRIC_INCH); + end; + end; +end; + + +procedure THTMLPicture.SetFrame(const Value: Integer); +begin + FFrame := Value; + if FDataStream.Size > 0 then + begin + LoadPicture; + if Assigned(OnFrameChange) then + OnFrameChange(self); + end; +end; + +procedure THTMLPicture.FrameNext; +begin + if FFrame < FFrameCount then + Inc(FFrame) + else + FFrame := 1; +end; + +function THTMLPicture.Step: Boolean; +begin + Result := False; + if (FFrameCount <= 1) or FIsEmpty then + Exit; + + if FNextCount = -1 then + FrameTime[FFrame]; + + if FTimerCount*10 >= FNextCount then + begin + FrameNext; + LoadPicture; + FNextCount := FNextCount + FrameTime[FFrame]; + Result := True; + end; + + Inc(FTimerCount); +end; + +procedure THTMLPicture.FramePrev; +begin + if FFrame > 1 then + Dec(FFrame) + else + FFrame := FFrameCount; +end; + + +{ THTMLImage } + +constructor THTMLImage.Create(aOwner: TComponent); +begin + inherited; + fHTMLPicture:=THTMLPicture.Create; + fHTMLPicture.OnChange:=PictureChanged; + Width:=100; + Height:=100; + fHTMLPicture.OnDownLoadError:=DownLoadError; + fHTMLPicture.OnDownLoadCancel:=DownLoadCancel; + fHTMLPicture.OnDownLoadProgress:=DownLoadProgress; + fHTMLPicture.OnDownLoadComplete:=DownLoadComplete; +end; + +destructor THTMLImage.Destroy; +begin + fHTMLPicture.Free; + inherited; +end; + +procedure THTMLImage.Loaded; +begin + inherited; + fHTMLPicture.fLogPixX := GetDeviceCaps(canvas.handle,LOGPIXELSX); + fHTMLPicture.fLogPixY := GetDeviceCaps(canvas.handle,LOGPIXELSY); +end; + +procedure THTMLImage.Paint; +var + xo,yo:integer; + + function Max(a,b:integer):integer; + begin + if (a>b) then result:=a else result:=b; + end; + +begin + inherited; + if assigned(fHTMLPicture) then + begin + if not fHTMLPicture.Empty then + case fPicturePosition of + bpTopLeft:Canvas.Draw(0,0,fHTMLPicture); + bpTopRight:Canvas.Draw(Max(0,width-fHTMLPicture.Width),0,fHTMLPicture); + bpBottomLeft:Canvas.Draw(0,Max(0,height-fHTMLPicture.Height),fHTMLPicture); + bpBottomRight:Canvas.Draw(Max(0,width-fHTMLPicture.Width),Max(0,height-fHTMLPicture.Height),fHTMLPicture); + bpCenter:Canvas.Draw(Max(0,width-fHTMLPicture.Width) shr 1,Max(0,height-fHTMLPicture.Height) shr 1,fHTMLPicture); + bpTiled:begin + yo:=0; + while (yo Value) then + begin + fPicturePosition := Value; + Invalidate; + end; +end; + +procedure THTMLImage.DownLoadCancel(Sender: TObject; var cancel: boolean); +begin + if assigned(fOnDownLoadCancel) then fOnDownLoadCancel(self,cancel); +end; + +procedure THTMLImage.DownLoadComplete(Sender: TObject); +begin + if assigned(fOnDownLoadComplete) then fOnDownLoadComplete(self); +end; + +procedure THTMLImage.DownLoadError(Sender: TObject; err: string); +begin + if Assigned(FOnDownloadError) then + FOnDownLoadError(self,err); +end; + +procedure THTMLImage.DownLoadProgress(Sender: TObject; dwSize, + dwTotSize: dword); +begin + if Assigned(FOnDownLoadProgress) then + FOnDownLoadProgress(self,dwSize,dwTotSize); +end; + +{ TDownLoadThread } + +constructor TDownLoadThread.Create(aHTMLPicture: THTMLPicture); +begin + inherited Create(false); + HTMLPicture := aHTMLPicture; + FreeOnTerminate := True; +end; + +procedure TDownLoadThread.Execute; +begin + {$IFDEF USEWININET} + HTMLPicture.DownLoad; + {$ENDIF} +end; + +{ THTMLPictureCache } + +destructor THTMLPictureCache.Destroy; +begin + ClearPictures; + inherited; +end; + +function THTMLPictureCache.AddPicture: THTMLPicture; +begin + Result := THTMLPicture.Create; + {$IFNDEF TMSDOTNET} + Add(pointer(result)); + {$ENDIF} + {$IFDEF TMSDOTNET} + Add(TObject(Result)); + {$ENDIF} +end; + +procedure THTMLPictureCache.ClearPictures; +var + i: Integer; +begin + for i := 1 to Count do + Items[i - 1].Free; + + Clear; + //inherited; +end; + +function THTMLPictureCache.FindPicture(ID: string): THTMLPicture; +var + i: Integer; +begin + Result := nil; + for i := 1 to Count do + begin + if (Items[i - 1].ID = ID) then + begin + Result := Items[i - 1]; + Break; + end; + end; +end; + +function THTMLPictureCache.GetPicture(Index: Integer): THTMLPicture; +begin + Result := THTMLPicture(inherited Items[Index]); +end; + +procedure THTMLPictureCache.SetPicture(Index: Integer; Value: THTMLPicture); +begin + {$IFNDEF TMSDOTNET} + inherited Items[index] := Pointer(Value); + {$ENDIF} + {$IFDEF TMSDOTNET} + inherited Items[index] := Value; + {$ENDIF} +end; + +function THTMLPictureCache.Animate: Boolean; +var + i: Integer; +begin + Result := False; + for i := 1 to Count do + begin + if Items[i - 1].Step then + Result := True; + end; +end;