From 2e21f1b77aca778f23186f1b7dce5e678f61925e Mon Sep 17 00:00:00 2001 From: david Date: Tue, 19 Jan 2010 16:34:22 +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.TntUnicodeControls@3 efe25200-c253-4202-ad9d-beff95d3544d --- internal/1/CBuilder/TntLibD.bpk | 158 + internal/1/CBuilder/TntLibD.cpp | 19 + internal/1/CBuilder/TntLibD.res | Bin 0 -> 1508 bytes internal/1/CBuilder/TntLibR.bpk | 165 + internal/1/CBuilder/TntLibR.cpp | 18 + internal/1/CBuilder/TntLibR.res | Bin 0 -> 1508 bytes internal/1/Delphi/bds4/TntUnicodeVcl.bdsproj | 183 + internal/1/Delphi/bds4/TntUnicodeVcl.cfg | 33 + internal/1/Delphi/bds4/TntUnicodeVcl.dpk | 71 + internal/1/Delphi/bds4/TntUnicodeVcl.res | Bin 0 -> 1508 bytes .../Delphi/bds4/TntUnicodeVcl_Design.bdsproj | 183 + .../1/Delphi/bds4/TntUnicodeVcl_Design.cfg | 36 + .../1/Delphi/bds4/TntUnicodeVcl_Design.dpk | 56 + .../1/Delphi/bds4/TntUnicodeVcl_Design.res | Bin 0 -> 1508 bytes internal/1/Delphi/d11/TntUnicodeVcl.bpi | Bin 0 -> 246644 bytes internal/1/Delphi/d11/TntUnicodeVcl.dpk | 72 + internal/1/Delphi/d11/TntUnicodeVcl.dproj | 619 ++ internal/1/Delphi/d11/TntUnicodeVcl.res | Bin 0 -> 1508 bytes .../1/Delphi/d11/TntUnicodeVcl_Design.bpi | Bin 0 -> 13844 bytes .../1/Delphi/d11/TntUnicodeVcl_Design.dpk | 57 + .../1/Delphi/d11/TntUnicodeVcl_Design.dproj | 614 ++ .../1/Delphi/d11/TntUnicodeVcl_Design.res | Bin 0 -> 1508 bytes .../1/Delphi/d11/TntUnicode_D11.groupproj | 44 + internal/1/Delphi/d6/TntUnicodeVcl_D60.cfg | 32 + internal/1/Delphi/d6/TntUnicodeVcl_D60.dof | 87 + internal/1/Delphi/d6/TntUnicodeVcl_D60.dpk | 57 + internal/1/Delphi/d6/TntUnicodeVcl_D60.res | Bin 0 -> 1536 bytes internal/1/Delphi/d6/TntUnicodeVcl_R60.cfg | 32 + internal/1/Delphi/d6/TntUnicodeVcl_R60.dof | 87 + internal/1/Delphi/d6/TntUnicodeVcl_R60.dpk | 71 + internal/1/Delphi/d6/TntUnicodeVcl_R60.res | Bin 0 -> 1536 bytes internal/1/Delphi/d6/TntUnicode_6.bpg | 23 + internal/1/Delphi/d7/TntUnicodeVcl_D70.cfg | 32 + internal/1/Delphi/d7/TntUnicodeVcl_D70.dof | 136 + internal/1/Delphi/d7/TntUnicodeVcl_D70.dpk | 56 + internal/1/Delphi/d7/TntUnicodeVcl_D70.res | Bin 0 -> 1536 bytes .../Delphi/d7/TntUnicodeVcl_D70_DATASNAP.cfg | 35 + .../Delphi/d7/TntUnicodeVcl_D70_DATASNAP.dof | 136 + .../Delphi/d7/TntUnicodeVcl_D70_DATASNAP.dpk | 37 + .../Delphi/d7/TntUnicodeVcl_D70_DATASNAP.res | Bin 0 -> 1536 bytes internal/1/Delphi/d7/TntUnicodeVcl_R70.cfg | 32 + internal/1/Delphi/d7/TntUnicodeVcl_R70.dof | 87 + internal/1/Delphi/d7/TntUnicodeVcl_R70.dpk | 72 + internal/1/Delphi/d7/TntUnicodeVcl_R70.res | Bin 0 -> 1536 bytes internal/1/Delphi/d7/TntUnicode_7.bpg | 23 + .../1/Delphi/d9/TntUnicodeVcl_D90.bdsproj | 172 + internal/1/Delphi/d9/TntUnicodeVcl_D90.cfg | 35 + internal/1/Delphi/d9/TntUnicodeVcl_D90.dpk | 55 + internal/1/Delphi/d9/TntUnicodeVcl_D90.res | Bin 0 -> 1508 bytes .../1/Delphi/d9/TntUnicodeVcl_R90.bdsproj | 172 + internal/1/Delphi/d9/TntUnicodeVcl_R90.cfg | 32 + internal/1/Delphi/d9/TntUnicodeVcl_R90.dpk | 72 + internal/1/Delphi/d9/TntUnicodeVcl_R90.res | Bin 0 -> 1508 bytes internal/1/Design/TntActions_Design.pas | 183 + internal/1/Design/TntComCtrls_Design.pas | 228 + internal/1/Design/TntDBClientActns_Design.pas | 36 + internal/1/Design/TntDBGrids_Design.pas | 58 + internal/1/Design/TntDesignEditors_Design.pas | 196 + internal/1/Design/TntForms_Design.pas | 422 ++ internal/1/Design/TntMenus_Design.pas | 391 ++ internal/1/Design/TntStrEdit_Design.dfm | 135 + internal/1/Design/TntStrEdit_Design.pas | 419 ++ internal/1/Design/TntUnicodeVcl_Register.pas | 132 + .../1/Design/TntWideStringProperty_Design.pas | 400 ++ internal/1/Example/ExampleUnicode.cfg | 35 + internal/1/Example/ExampleUnicode.dof | 87 + internal/1/Example/ExampleUnicode.dpr | 13 + internal/1/Example/ExampleUnicode.res | Bin 0 -> 1536 bytes internal/1/Example/MainFrm.dfm | 143 + internal/1/Example/MainFrm.pas | 72 + internal/1/Lib/D11/ActiveIMM_TLB.dcu | Bin 0 -> 47666 bytes internal/1/Lib/D11/TntActions_Design.dcu | Bin 0 -> 8751 bytes internal/1/Lib/D11/TntActnList.dcu | Bin 0 -> 30903 bytes internal/1/Lib/D11/TntAxCtrls.dcu | Bin 0 -> 7237 bytes internal/1/Lib/D11/TntBandActn.dcu | Bin 0 -> 3433 bytes internal/1/Lib/D11/TntButtons.dcu | Bin 0 -> 26836 bytes internal/1/Lib/D11/TntCheckLst.dcu | Bin 0 -> 9649 bytes internal/1/Lib/D11/TntClasses.dcu | Bin 0 -> 44356 bytes internal/1/Lib/D11/TntClipbrd.dcu | Bin 0 -> 2523 bytes internal/1/Lib/D11/TntComCtrls.dcu | Bin 0 -> 183981 bytes internal/1/Lib/D11/TntComCtrls_Design.dcu | Bin 0 -> 10647 bytes internal/1/Lib/D11/TntCompilers.inc | 356 ++ internal/1/Lib/D11/TntControls.dcu | Bin 0 -> 30054 bytes internal/1/Lib/D11/TntDB.dcu | Bin 0 -> 28932 bytes internal/1/Lib/D11/TntDBActns.dcu | Bin 0 -> 19582 bytes internal/1/Lib/D11/TntDBCtrls.dcu | Bin 0 -> 82340 bytes internal/1/Lib/D11/TntDBGrids.dcu | Bin 0 -> 48435 bytes internal/1/Lib/D11/TntDBGrids_Design.dcu | Bin 0 -> 2064 bytes internal/1/Lib/D11/TntDBLogDlg.dcu | Bin 0 -> 6767 bytes internal/1/Lib/D11/TntDBLogDlg.dfm | 108 + .../1/Lib/D11/TntDesignEditors_Design.dcu | Bin 0 -> 5255 bytes internal/1/Lib/D11/TntDialogs.dcu | Bin 0 -> 29694 bytes internal/1/Lib/D11/TntExtActns.dcu | Bin 0 -> 46503 bytes internal/1/Lib/D11/TntExtCtrls.dcu | Bin 0 -> 47559 bytes internal/1/Lib/D11/TntExtDlgs.dcu | Bin 0 -> 13587 bytes internal/1/Lib/D11/TntFileCtrl.dcu | Bin 0 -> 2720 bytes internal/1/Lib/D11/TntFormatStrUtils.dcu | Bin 0 -> 10131 bytes internal/1/Lib/D11/TntForms.dcu | Bin 0 -> 34263 bytes internal/1/Lib/D11/TntForms_Design.dcu | Bin 0 -> 14749 bytes internal/1/Lib/D11/TntGraphics.dcu | Bin 0 -> 4642 bytes internal/1/Lib/D11/TntGrids.dcu | Bin 0 -> 36645 bytes internal/1/Lib/D11/TntListActns.dcu | Bin 0 -> 7757 bytes internal/1/Lib/D11/TntMenus.dcu | Bin 0 -> 28136 bytes internal/1/Lib/D11/TntMenus_Design.dcu | Bin 0 -> 15418 bytes internal/1/Lib/D11/TntRegistry.dcu | Bin 0 -> 4441 bytes internal/1/Lib/D11/TntStdActns.dcu | Bin 0 -> 62148 bytes internal/1/Lib/D11/TntStdCtrls.dcu | Bin 0 -> 128670 bytes internal/1/Lib/D11/TntStrEdit_Design.dcu | Bin 0 -> 17294 bytes internal/1/Lib/D11/TntStrEdit_Design.dfm | 135 + internal/1/Lib/D11/TntSysUtils.dcu | Bin 0 -> 28541 bytes internal/1/Lib/D11/TntSystem.dcu | Bin 0 -> 14147 bytes internal/1/Lib/D11/TntUnicodeVcl.dcp | Bin 0 -> 997889 bytes internal/1/Lib/D11/TntUnicodeVcl.dcu | Bin 0 -> 4469 bytes internal/1/Lib/D11/TntUnicodeVcl110.bpl | Bin 0 -> 754176 bytes internal/1/Lib/D11/TntUnicodeVcl_Design.dcp | Bin 0 -> 69300 bytes internal/1/Lib/D11/TntUnicodeVcl_Design.dcu | Bin 0 -> 5809 bytes .../1/Lib/D11/TntUnicodeVcl_Design110.bpl | Bin 0 -> 103936 bytes internal/1/Lib/D11/TntUnicodeVcl_Register.dcu | Bin 0 -> 5295 bytes internal/1/Lib/D11/TntWideStrUtils.dcu | Bin 0 -> 2123 bytes internal/1/Lib/D11/TntWindows.dcu | Bin 0 -> 25935 bytes internal/1/License.rtf | 52 + internal/1/Readme.txt | 53 + internal/1/Reset Tnt Palette.reg | Bin 0 -> 1669 bytes internal/1/Source/ActiveIMM_TLB.pas | 1374 +++++ internal/1/Source/TntActnList.pas | 835 +++ internal/1/Source/TntAxCtrls.pas | 191 + internal/1/Source/TntBandActn.pas | 92 + internal/1/Source/TntButtons.pas | 982 ++++ internal/1/Source/TntCheckLst.pas | 184 + internal/1/Source/TntClasses.pas | 1780 ++++++ internal/1/Source/TntClipBrd.pas | 86 + internal/1/Source/TntComCtrls.pas | 5058 +++++++++++++++++ internal/1/Source/TntCompilers.inc | 356 ++ internal/1/Source/TntControls.pas | 1099 ++++ internal/1/Source/TntDB.pas | 900 +++ internal/1/Source/TntDBActns.pas | 594 ++ internal/1/Source/TntDBClientActns.pas | 197 + internal/1/Source/TntDBCtrls.pas | 2195 +++++++ internal/1/Source/TntDBGrids.pas | 1175 ++++ internal/1/Source/TntDBLogDlg.dfm | 108 + internal/1/Source/TntDBLogDlg.pas | 133 + internal/1/Source/TntDialogs.pas | 981 ++++ internal/1/Source/TntExtActns.pas | 1400 +++++ internal/1/Source/TntExtCtrls.pas | 1062 ++++ internal/1/Source/TntExtDlgs.pas | 317 ++ internal/1/Source/TntFileCtrl.pas | 118 + internal/1/Source/TntFormatStrUtils.pas | 503 ++ internal/1/Source/TntForms.pas | 873 +++ internal/1/Source/TntGraphics.pas | 142 + internal/1/Source/TntGrids.pas | 675 +++ internal/1/Source/TntListActns.pas | 207 + internal/1/Source/TntMenus.pas | 1146 ++++ internal/1/Source/TntRegistry.pas | 148 + internal/1/Source/TntStdActns.pas | 1922 +++++++ internal/1/Source/TntStdCtrls.pas | 3215 +++++++++++ internal/1/Source/TntSysUtils.pas | 1699 ++++++ internal/1/Source/TntSystem.pas | 1384 +++++ internal/1/Source/TntWideStrUtils.pas | 451 ++ internal/1/Source/TntWideStrings.pas | 831 +++ internal/1/Source/TntWindows.pas | 1452 +++++ 160 files changed, 43420 insertions(+) create mode 100644 internal/1/CBuilder/TntLibD.bpk create mode 100644 internal/1/CBuilder/TntLibD.cpp create mode 100644 internal/1/CBuilder/TntLibD.res create mode 100644 internal/1/CBuilder/TntLibR.bpk create mode 100644 internal/1/CBuilder/TntLibR.cpp create mode 100644 internal/1/CBuilder/TntLibR.res create mode 100644 internal/1/Delphi/bds4/TntUnicodeVcl.bdsproj create mode 100644 internal/1/Delphi/bds4/TntUnicodeVcl.cfg create mode 100644 internal/1/Delphi/bds4/TntUnicodeVcl.dpk create mode 100644 internal/1/Delphi/bds4/TntUnicodeVcl.res create mode 100644 internal/1/Delphi/bds4/TntUnicodeVcl_Design.bdsproj create mode 100644 internal/1/Delphi/bds4/TntUnicodeVcl_Design.cfg create mode 100644 internal/1/Delphi/bds4/TntUnicodeVcl_Design.dpk create mode 100644 internal/1/Delphi/bds4/TntUnicodeVcl_Design.res create mode 100644 internal/1/Delphi/d11/TntUnicodeVcl.bpi create mode 100644 internal/1/Delphi/d11/TntUnicodeVcl.dpk create mode 100644 internal/1/Delphi/d11/TntUnicodeVcl.dproj create mode 100644 internal/1/Delphi/d11/TntUnicodeVcl.res create mode 100644 internal/1/Delphi/d11/TntUnicodeVcl_Design.bpi create mode 100644 internal/1/Delphi/d11/TntUnicodeVcl_Design.dpk create mode 100644 internal/1/Delphi/d11/TntUnicodeVcl_Design.dproj create mode 100644 internal/1/Delphi/d11/TntUnicodeVcl_Design.res create mode 100644 internal/1/Delphi/d11/TntUnicode_D11.groupproj create mode 100644 internal/1/Delphi/d6/TntUnicodeVcl_D60.cfg create mode 100644 internal/1/Delphi/d6/TntUnicodeVcl_D60.dof create mode 100644 internal/1/Delphi/d6/TntUnicodeVcl_D60.dpk create mode 100644 internal/1/Delphi/d6/TntUnicodeVcl_D60.res create mode 100644 internal/1/Delphi/d6/TntUnicodeVcl_R60.cfg create mode 100644 internal/1/Delphi/d6/TntUnicodeVcl_R60.dof create mode 100644 internal/1/Delphi/d6/TntUnicodeVcl_R60.dpk create mode 100644 internal/1/Delphi/d6/TntUnicodeVcl_R60.res create mode 100644 internal/1/Delphi/d6/TntUnicode_6.bpg create mode 100644 internal/1/Delphi/d7/TntUnicodeVcl_D70.cfg create mode 100644 internal/1/Delphi/d7/TntUnicodeVcl_D70.dof create mode 100644 internal/1/Delphi/d7/TntUnicodeVcl_D70.dpk create mode 100644 internal/1/Delphi/d7/TntUnicodeVcl_D70.res create mode 100644 internal/1/Delphi/d7/TntUnicodeVcl_D70_DATASNAP.cfg create mode 100644 internal/1/Delphi/d7/TntUnicodeVcl_D70_DATASNAP.dof create mode 100644 internal/1/Delphi/d7/TntUnicodeVcl_D70_DATASNAP.dpk create mode 100644 internal/1/Delphi/d7/TntUnicodeVcl_D70_DATASNAP.res create mode 100644 internal/1/Delphi/d7/TntUnicodeVcl_R70.cfg create mode 100644 internal/1/Delphi/d7/TntUnicodeVcl_R70.dof create mode 100644 internal/1/Delphi/d7/TntUnicodeVcl_R70.dpk create mode 100644 internal/1/Delphi/d7/TntUnicodeVcl_R70.res create mode 100644 internal/1/Delphi/d7/TntUnicode_7.bpg create mode 100644 internal/1/Delphi/d9/TntUnicodeVcl_D90.bdsproj create mode 100644 internal/1/Delphi/d9/TntUnicodeVcl_D90.cfg create mode 100644 internal/1/Delphi/d9/TntUnicodeVcl_D90.dpk create mode 100644 internal/1/Delphi/d9/TntUnicodeVcl_D90.res create mode 100644 internal/1/Delphi/d9/TntUnicodeVcl_R90.bdsproj create mode 100644 internal/1/Delphi/d9/TntUnicodeVcl_R90.cfg create mode 100644 internal/1/Delphi/d9/TntUnicodeVcl_R90.dpk create mode 100644 internal/1/Delphi/d9/TntUnicodeVcl_R90.res create mode 100644 internal/1/Design/TntActions_Design.pas create mode 100644 internal/1/Design/TntComCtrls_Design.pas create mode 100644 internal/1/Design/TntDBClientActns_Design.pas create mode 100644 internal/1/Design/TntDBGrids_Design.pas create mode 100644 internal/1/Design/TntDesignEditors_Design.pas create mode 100644 internal/1/Design/TntForms_Design.pas create mode 100644 internal/1/Design/TntMenus_Design.pas create mode 100644 internal/1/Design/TntStrEdit_Design.dfm create mode 100644 internal/1/Design/TntStrEdit_Design.pas create mode 100644 internal/1/Design/TntUnicodeVcl_Register.pas create mode 100644 internal/1/Design/TntWideStringProperty_Design.pas create mode 100644 internal/1/Example/ExampleUnicode.cfg create mode 100644 internal/1/Example/ExampleUnicode.dof create mode 100644 internal/1/Example/ExampleUnicode.dpr create mode 100644 internal/1/Example/ExampleUnicode.res create mode 100644 internal/1/Example/MainFrm.dfm create mode 100644 internal/1/Example/MainFrm.pas create mode 100644 internal/1/Lib/D11/ActiveIMM_TLB.dcu create mode 100644 internal/1/Lib/D11/TntActions_Design.dcu create mode 100644 internal/1/Lib/D11/TntActnList.dcu create mode 100644 internal/1/Lib/D11/TntAxCtrls.dcu create mode 100644 internal/1/Lib/D11/TntBandActn.dcu create mode 100644 internal/1/Lib/D11/TntButtons.dcu create mode 100644 internal/1/Lib/D11/TntCheckLst.dcu create mode 100644 internal/1/Lib/D11/TntClasses.dcu create mode 100644 internal/1/Lib/D11/TntClipbrd.dcu create mode 100644 internal/1/Lib/D11/TntComCtrls.dcu create mode 100644 internal/1/Lib/D11/TntComCtrls_Design.dcu create mode 100644 internal/1/Lib/D11/TntCompilers.inc create mode 100644 internal/1/Lib/D11/TntControls.dcu create mode 100644 internal/1/Lib/D11/TntDB.dcu create mode 100644 internal/1/Lib/D11/TntDBActns.dcu create mode 100644 internal/1/Lib/D11/TntDBCtrls.dcu create mode 100644 internal/1/Lib/D11/TntDBGrids.dcu create mode 100644 internal/1/Lib/D11/TntDBGrids_Design.dcu create mode 100644 internal/1/Lib/D11/TntDBLogDlg.dcu create mode 100644 internal/1/Lib/D11/TntDBLogDlg.dfm create mode 100644 internal/1/Lib/D11/TntDesignEditors_Design.dcu create mode 100644 internal/1/Lib/D11/TntDialogs.dcu create mode 100644 internal/1/Lib/D11/TntExtActns.dcu create mode 100644 internal/1/Lib/D11/TntExtCtrls.dcu create mode 100644 internal/1/Lib/D11/TntExtDlgs.dcu create mode 100644 internal/1/Lib/D11/TntFileCtrl.dcu create mode 100644 internal/1/Lib/D11/TntFormatStrUtils.dcu create mode 100644 internal/1/Lib/D11/TntForms.dcu create mode 100644 internal/1/Lib/D11/TntForms_Design.dcu create mode 100644 internal/1/Lib/D11/TntGraphics.dcu create mode 100644 internal/1/Lib/D11/TntGrids.dcu create mode 100644 internal/1/Lib/D11/TntListActns.dcu create mode 100644 internal/1/Lib/D11/TntMenus.dcu create mode 100644 internal/1/Lib/D11/TntMenus_Design.dcu create mode 100644 internal/1/Lib/D11/TntRegistry.dcu create mode 100644 internal/1/Lib/D11/TntStdActns.dcu create mode 100644 internal/1/Lib/D11/TntStdCtrls.dcu create mode 100644 internal/1/Lib/D11/TntStrEdit_Design.dcu create mode 100644 internal/1/Lib/D11/TntStrEdit_Design.dfm create mode 100644 internal/1/Lib/D11/TntSysUtils.dcu create mode 100644 internal/1/Lib/D11/TntSystem.dcu create mode 100644 internal/1/Lib/D11/TntUnicodeVcl.dcp create mode 100644 internal/1/Lib/D11/TntUnicodeVcl.dcu create mode 100644 internal/1/Lib/D11/TntUnicodeVcl110.bpl create mode 100644 internal/1/Lib/D11/TntUnicodeVcl_Design.dcp create mode 100644 internal/1/Lib/D11/TntUnicodeVcl_Design.dcu create mode 100644 internal/1/Lib/D11/TntUnicodeVcl_Design110.bpl create mode 100644 internal/1/Lib/D11/TntUnicodeVcl_Register.dcu create mode 100644 internal/1/Lib/D11/TntWideStrUtils.dcu create mode 100644 internal/1/Lib/D11/TntWindows.dcu create mode 100644 internal/1/License.rtf create mode 100644 internal/1/Readme.txt create mode 100644 internal/1/Reset Tnt Palette.reg create mode 100644 internal/1/Source/ActiveIMM_TLB.pas create mode 100644 internal/1/Source/TntActnList.pas create mode 100644 internal/1/Source/TntAxCtrls.pas create mode 100644 internal/1/Source/TntBandActn.pas create mode 100644 internal/1/Source/TntButtons.pas create mode 100644 internal/1/Source/TntCheckLst.pas create mode 100644 internal/1/Source/TntClasses.pas create mode 100644 internal/1/Source/TntClipBrd.pas create mode 100644 internal/1/Source/TntComCtrls.pas create mode 100644 internal/1/Source/TntCompilers.inc create mode 100644 internal/1/Source/TntControls.pas create mode 100644 internal/1/Source/TntDB.pas create mode 100644 internal/1/Source/TntDBActns.pas create mode 100644 internal/1/Source/TntDBClientActns.pas create mode 100644 internal/1/Source/TntDBCtrls.pas create mode 100644 internal/1/Source/TntDBGrids.pas create mode 100644 internal/1/Source/TntDBLogDlg.dfm create mode 100644 internal/1/Source/TntDBLogDlg.pas create mode 100644 internal/1/Source/TntDialogs.pas create mode 100644 internal/1/Source/TntExtActns.pas create mode 100644 internal/1/Source/TntExtCtrls.pas create mode 100644 internal/1/Source/TntExtDlgs.pas create mode 100644 internal/1/Source/TntFileCtrl.pas create mode 100644 internal/1/Source/TntFormatStrUtils.pas create mode 100644 internal/1/Source/TntForms.pas create mode 100644 internal/1/Source/TntGraphics.pas create mode 100644 internal/1/Source/TntGrids.pas create mode 100644 internal/1/Source/TntListActns.pas create mode 100644 internal/1/Source/TntMenus.pas create mode 100644 internal/1/Source/TntRegistry.pas create mode 100644 internal/1/Source/TntStdActns.pas create mode 100644 internal/1/Source/TntStdCtrls.pas create mode 100644 internal/1/Source/TntSysUtils.pas create mode 100644 internal/1/Source/TntSystem.pas create mode 100644 internal/1/Source/TntWideStrUtils.pas create mode 100644 internal/1/Source/TntWideStrings.pas create mode 100644 internal/1/Source/TntWindows.pas diff --git a/internal/1/CBuilder/TntLibD.bpk b/internal/1/CBuilder/TntLibD.bpk new file mode 100644 index 0000000..b04ea53 --- /dev/null +++ b/internal/1/CBuilder/TntLibD.bpk @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + +[Linker] +LibPrefix= +LibSuffix= +LibVersion= + + \ No newline at end of file diff --git a/internal/1/CBuilder/TntLibD.cpp b/internal/1/CBuilder/TntLibD.cpp new file mode 100644 index 0000000..5a6e53d --- /dev/null +++ b/internal/1/CBuilder/TntLibD.cpp @@ -0,0 +1,19 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +USEFORMNS("..\Design\TntStrEdit_Design.pas", Tntstredit_design, TntStrEditDlg); /* TTntForm: File Type */ +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +// Package source. +//--------------------------------------------------------------------------- + +#pragma argsused +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- + \ No newline at end of file diff --git a/internal/1/CBuilder/TntLibD.res b/internal/1/CBuilder/TntLibD.res new file mode 100644 index 0000000000000000000000000000000000000000..27b0b6eb9ca618372c19c7b5f99f7a315e4d5132 GIT binary patch literal 1508 zcmb_bO=}ZT6g^XCp&QARC^6h!cn``$h8p8NGC4*=@aG_^|eg8W!>{ww5o>Z{dm z`i^vuMxENCddQ9$bGgg_{xF-_jVn#+42#8r4rxNR)NWjDUvl_=Br z;4tSKGmTCSCF4iLNrq)hR&W?4>tFTckzPD@q*`OZrV|$zRBzV6gejrF6(^v)bQ*v1R$CU&?xDZdLT?V(=x^;O6#^01e`rP`%$X>YB`R2}SMpX*b+ zqP49R_O;#?ZIN&OuiwRJa$?`*hL{weYEKmE@>LIZF~Jx|7@&tO?tL6E^8kk!lJ!M7 z4Kz9FBWja9NJqDs&Eu>?9Akto`JXs-m*^lba9=qtXF$&fywO@C);wbDAm=u4m2AiD zkUJ*3;5@_wR(I;^OP>?v4p_Ti>EN!`e@1^#z0&Q7eaf^wykn#l+h@UhO-2`Q8F$Qm zjQ8xsiRJEOIpo%)uIpP+aRc^_UXnXxwvU{BQt1%9OPTv3r#gLg_CTBIXm74^@x_2U T`nBy81NPo0vwYvz{B!>g2B&$5 literal 0 HcmV?d00001 diff --git a/internal/1/CBuilder/TntLibR.bpk b/internal/1/CBuilder/TntLibR.bpk new file mode 100644 index 0000000..7c5ea9e --- /dev/null +++ b/internal/1/CBuilder/TntLibR.bpk @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + +[Linker] +LibPrefix= +LibSuffix= +LibVersion= + + \ No newline at end of file diff --git a/internal/1/CBuilder/TntLibR.cpp b/internal/1/CBuilder/TntLibR.cpp new file mode 100644 index 0000000..4e4d7bc --- /dev/null +++ b/internal/1/CBuilder/TntLibR.cpp @@ -0,0 +1,18 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +USEFORMNS("..\Source\TntDBLogDlg.pas", Tntdblogdlg, TntLoginDialog); +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +// Package source. +//--------------------------------------------------------------------------- + +#pragma argsused +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//--------------------------------------------------------------------------- diff --git a/internal/1/CBuilder/TntLibR.res b/internal/1/CBuilder/TntLibR.res new file mode 100644 index 0000000000000000000000000000000000000000..27b0b6eb9ca618372c19c7b5f99f7a315e4d5132 GIT binary patch literal 1508 zcmb_bO=}ZT6g^XCp&QARC^6h!cn``$h8p8NGC4*=@aG_^|eg8W!>{ww5o>Z{dm z`i^vuMxENCddQ9$bGgg_{xF-_jVn#+42#8r4rxNR)NWjDUvl_=Br z;4tSKGmTCSCF4iLNrq)hR&W?4>tFTckzPD@q*`OZrV|$zRBzV6gejrF6(^v)bQ*v1R$CU&?xDZdLT?V(=x^;O6#^01e`rP`%$X>YB`R2}SMpX*b+ zqP49R_O;#?ZIN&OuiwRJa$?`*hL{weYEKmE@>LIZF~Jx|7@&tO?tL6E^8kk!lJ!M7 z4Kz9FBWja9NJqDs&Eu>?9Akto`JXs-m*^lba9=qtXF$&fywO@C);wbDAm=u4m2AiD zkUJ*3;5@_wR(I;^OP>?v4p_Ti>EN!`e@1^#z0&Q7eaf^wykn#l+h@UhO-2`Q8F$Qm zjQ8xsiRJEOIpo%)uIpP+aRc^_UXnXxwvU{BQt1%9OPTv3r#gLg_CTBIXm74^@x_2U T`nBy81NPo0vwYvz{B!>g2B&$5 literal 0 HcmV?d00001 diff --git a/internal/1/Delphi/bds4/TntUnicodeVcl.bdsproj b/internal/1/Delphi/bds4/TntUnicodeVcl.bdsproj new file mode 100644 index 0000000..d36baae --- /dev/null +++ b/internal/1/Delphi/bds4/TntUnicodeVcl.bdsproj @@ -0,0 +1,183 @@ + + + + + + + + + + + + TntUnicodeVcl.dpk + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + + 0 + 44 + 1 + False + False + False + 16384 + 1048576 + 4194304 + TntWare Unicode Controls - Runtime + False + + + + + + + + + + + False + + + + + + False + + + + + + False + + True + + False + False + + + + $00000000 + + + + True + False + 2 + 3 + 0 + 1 + False + False + False + False + False + 1033 + 1252 + + + + + 2.3.0.1 + + + + + + 2.3.0.1 + + + + + diff --git a/internal/1/Delphi/bds4/TntUnicodeVcl.cfg b/internal/1/Delphi/bds4/TntUnicodeVcl.cfg new file mode 100644 index 0000000..e1ad800 --- /dev/null +++ b/internal/1/Delphi/bds4/TntUnicodeVcl.cfg @@ -0,0 +1,33 @@ +-$A8 +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L+ +-$M- +-$N+ +-$O+ +-$P+ +-$Q+ +-$R+ +-$S- +-$T+ +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-JL +-cg +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 diff --git a/internal/1/Delphi/bds4/TntUnicodeVcl.dpk b/internal/1/Delphi/bds4/TntUnicodeVcl.dpk new file mode 100644 index 0000000..49617e2 --- /dev/null +++ b/internal/1/Delphi/bds4/TntUnicodeVcl.dpk @@ -0,0 +1,71 @@ +package TntUnicodeVcl; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS ON} +{$RANGECHECKS ON} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS ON} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'TntWare Unicode Controls - Runtime'} +{$LIBSUFFIX '100'} +{$RUNONLY} +{$IMPLICITBUILD ON} + +requires + vcl, + vclx, + vcldb, + vclactnband; + +contains + ActiveIMM_TLB in '..\..\Source\ActiveIMM_TLB.pas', + TntSystem in '..\..\Source\TntSystem.pas', + TntAxCtrls in '..\..\Source\TntAxCtrls.pas', + TntClipbrd in '..\..\Source\TntClipbrd.pas', + TntWindows in '..\..\Source\TntWindows.pas', + TntSysUtils in '..\..\Source\TntSysUtils.pas', + TntClasses in '..\..\Source\TntClasses.pas', + TntDialogs in '..\..\Source\TntDialogs.pas', + TntFileCtrl in '..\..\Source\TntFileCtrl.pas', + TntExtDlgs in '..\..\Source\TntExtDlgs.pas', + TntRegistry in '..\..\Source\TntRegistry.pas', + TntGraphics in '..\..\Source\TntGraphics.pas', + TntControls in '..\..\Source\TntControls.pas', + TntActnList in '..\..\Source\TntActnList.pas', + TntMenus in '..\..\Source\TntMenus.pas', + TntForms in '..\..\Source\TntForms.pas', + TntStdCtrls in '..\..\Source\TntStdCtrls.pas', + TntExtCtrls in '..\..\Source\TntExtCtrls.pas', + TntButtons in '..\..\Source\TntButtons.pas', + TntCheckLst in '..\..\Source\TntCheckLst.pas', + TntGrids in '..\..\Source\TntGrids.pas', + TntComCtrls in '..\..\Source\TntComCtrls.pas', + TntDB in '..\..\Source\TntDB.pas', + TntDBCtrls in '..\..\Source\TntDBCtrls.pas', + TntDBGrids in '..\..\Source\TntDBGrids.pas', + TntStdActns in '..\..\Source\TntStdActns.pas', + TntExtActns in '..\..\Source\TntExtActns.pas', + TntListActns in '..\..\Source\TntListActns.pas', + TntDBActns in '..\..\Source\TntDBActns.pas', + TntBandActn in '..\..\Source\TntBandActn.pas', + TntDBLogDlg in '..\..\Source\TntDBLogDlg.pas', + TntFormatStrUtils in '..\..\Source\TntFormatStrUtils.pas', + TntWideStrUtils in '..\..\Source\TntWideStrUtils.pas'; + +end. diff --git a/internal/1/Delphi/bds4/TntUnicodeVcl.res b/internal/1/Delphi/bds4/TntUnicodeVcl.res new file mode 100644 index 0000000000000000000000000000000000000000..b69d77e0cc8f3c300c14942fe1dd1bb09669ab6a GIT binary patch literal 1508 zcma)5O-~d-5Pbt{X1&M|jd+t7V~hubLb4hUYFvpVer!a6!~-Gfj7D4rcA=W=VJA^D zV>n=fhNC}YFdO6k6b~M}iHYDEjqU3m284L9pr-qEzpi>!y$t~UbgeVzbeDbZ%J;j; zaqOPw?Jwk{lbrO^FVP)j%Ms7~+aiGfh@x!Zms5I#cDv0DBf<CRmUToOcyBuVnMCybQCB}rmM zT$J_jg>vBvajfh(lPO@L-C%6 zUPtLoiVb_&v+0h5*a)kgl{*4n1(LvPCYI^ z>uW4Zi`WqKo3|SigYUvsb7P7N_a=X=Eseu97>P=LzD-tNnub_Y$vpdtR|GnO{tYxc zz{Pdo=trQZ&7kz|D06e|+0}FMzZUU~@%EN~iLN1r8p9|i`MrwUoQ>EFlQ!Ql z=f>U_zOWSzy3xfii{BbA+FdZ8+1+hxc3~8C%;7Pr2r$fX8V?z{3Li71zqXtK46)Ml z^dV|6ijFaw!&+zXly7Z{{6$thMf7kx$tlapW0tv7!+o18WX{JtTixakph$Mk9V2&+ z>>bWooW>x1fPQ8>ztLH@+$wWV?@@5V=D*JU!0sBgA$6K+13co%%rc!jygOt};Q`M* zfX)STm9bJ%T~;o)s|=8 YxiR3lz3r@uDz#6O`FFqf7d{pK0Qvl1;Q#;t literal 0 HcmV?d00001 diff --git a/internal/1/Delphi/bds4/TntUnicodeVcl_Design.bdsproj b/internal/1/Delphi/bds4/TntUnicodeVcl_Design.bdsproj new file mode 100644 index 0000000..f41f6b0 --- /dev/null +++ b/internal/1/Delphi/bds4/TntUnicodeVcl_Design.bdsproj @@ -0,0 +1,183 @@ + + + + + + + + + + + + TntUnicodeVcl_Design.dpk + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + + + + 0 + 44 + 1 + False + False + False + 16384 + 1048576 + 4194304 + TntWare Unicode Controls + False + + + + + + + + + + + False + + + + + + False + + + + + + False + + True + + False + False + + + + $00000000 + + + + True + False + 2 + 3 + 0 + 1 + False + False + False + False + False + 1033 + 1252 + + + + + 2.3.0.1 + + + + + + 2.3.0.1 + + + + + diff --git a/internal/1/Delphi/bds4/TntUnicodeVcl_Design.cfg b/internal/1/Delphi/bds4/TntUnicodeVcl_Design.cfg new file mode 100644 index 0000000..dc552d3 --- /dev/null +++ b/internal/1/Delphi/bds4/TntUnicodeVcl_Design.cfg @@ -0,0 +1,36 @@ +-$A8 +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L+ +-$M- +-$N+ +-$O+ +-$P+ +-$Q+ +-$R+ +-$S- +-$T+ +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-JL +-cg +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/internal/1/Delphi/bds4/TntUnicodeVcl_Design.dpk b/internal/1/Delphi/bds4/TntUnicodeVcl_Design.dpk new file mode 100644 index 0000000..8d5c8a0 --- /dev/null +++ b/internal/1/Delphi/bds4/TntUnicodeVcl_Design.dpk @@ -0,0 +1,56 @@ +package TntUnicodeVcl_Design; + +{$R *.res} +{$R '..\..\Design\TntComCtrls.dcr'} +{$R '..\..\Design\TntDBCtrls.dcr'} +{$R '..\..\Design\TntStdCtrls.dcr'} +{$R '..\..\Design\TntActnList.dcr'} +{$R '..\..\Design\TntMenus.dcr'} +{$R '..\..\Design\TntExtCtrls.dcr'} +{$R '..\..\Design\TntForms.dcr'} +{$R '..\..\Design\TntGrids.dcr'} +{$R '..\..\Design\TntButtons.dcr'} +{$R '..\..\Design\TntDialogs.dcr'} +{$R '..\..\Design\TntExtDlgs.dcr'} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS ON} +{$RANGECHECKS ON} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS ON} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'TntWare Unicode Controls'} +{$LIBSUFFIX '100'} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + TntUnicodeVcl, + designide, + dcldb; + +contains + TntForms_Design in '..\..\Design\TntForms_Design.pas', + TntComCtrls_Design in '..\..\Design\TntComCtrls_Design.pas', + TntDBGrids_Design in '..\..\Design\TntDBGrids_Design.pas', + TntDesignEditors_Design in '..\..\Design\TntDesignEditors_Design.pas', + TntStrEdit_Design in '..\..\Design\TntStrEdit_Design.pas', + TntUnicodeVcl_Register in '..\..\Design\TntUnicodeVcl_Register.pas', + TntActions_Design in '..\..\Design\TntActions_Design.pas', + TntMenus_Design in '..\..\Design\TntMenus_Design.pas'; + +end. diff --git a/internal/1/Delphi/bds4/TntUnicodeVcl_Design.res b/internal/1/Delphi/bds4/TntUnicodeVcl_Design.res new file mode 100644 index 0000000000000000000000000000000000000000..b69d77e0cc8f3c300c14942fe1dd1bb09669ab6a GIT binary patch literal 1508 zcma)5O-~d-5Pbt{X1&M|jd+t7V~hubLb4hUYFvpVer!a6!~-Gfj7D4rcA=W=VJA^D zV>n=fhNC}YFdO6k6b~M}iHYDEjqU3m284L9pr-qEzpi>!y$t~UbgeVzbeDbZ%J;j; zaqOPw?Jwk{lbrO^FVP)j%Ms7~+aiGfh@x!Zms5I#cDv0DBf<CRmUToOcyBuVnMCybQCB}rmM zT$J_jg>vBvajfh(lPO@L-C%6 zUPtLoiVb_&v+0h5*a)kgl{*4n1(LvPCYI^ z>uW4Zi`WqKo3|SigYUvsb7P7N_a=X=Eseu97>P=LzD-tNnub_Y$vpdtR|GnO{tYxc zz{Pdo=trQZ&7kz|D06e|+0}FMzZUU~@%EN~iLN1r8p9|i`MrwUoQ>EFlQ!Ql z=f>U_zOWSzy3xfii{BbA+FdZ8+1+hxc3~8C%;7Pr2r$fX8V?z{3Li71zqXtK46)Ml z^dV|6ijFaw!&+zXly7Z{{6$thMf7kx$tlapW0tv7!+o18WX{JtTixakph$Mk9V2&+ z>>bWooW>x1fPQ8>ztLH@+$wWV?@@5V=D*JU!0sBgA$6K+13co%%rc!jygOt};Q`M* zfX)STm9bJ%T~;o)s|=8 YxiR3lz3r@uDz#6O`FFqf7d{pK0Qvl1;Q#;t literal 0 HcmV?d00001 diff --git a/internal/1/Delphi/d11/TntUnicodeVcl.bpi b/internal/1/Delphi/d11/TntUnicodeVcl.bpi new file mode 100644 index 0000000000000000000000000000000000000000..06f28cb677f7c192ec087df3e26818b1d1fb942a GIT binary patch literal 246644 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 + + + {cc2b511c-6d3e-4bec-8a86-33665c7643e7} + TntUnicodeVcl.dpk + Release + AnyCPU + DCC32 + ..\..\Lib\D11\TntUnicodeVcl110.bpl + + + 7.0 + False + False + True + True + True + 0 + RELEASE + True + True + True + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + + + 7.0 + True + True + True + All + DEBUG + True + True + True + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + + + Delphi.Personality + Package + + + False + True + False + + + TntWare Unicode Controls - Runtime + True + False + True + 110 + + + True + False + 2 + 3 + 0 + 1 + False + False + False + False + False + 1033 + 1252 + + + + + 2.3.0.1 + + + + + + 2.3.0.1 + + + TntUnicodeVcl.dpk + + + + + + + MainSource + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/internal/1/Delphi/d11/TntUnicodeVcl.res b/internal/1/Delphi/d11/TntUnicodeVcl.res new file mode 100644 index 0000000000000000000000000000000000000000..b69d77e0cc8f3c300c14942fe1dd1bb09669ab6a GIT binary patch literal 1508 zcma)5O-~d-5Pbt{X1&M|jd+t7V~hubLb4hUYFvpVer!a6!~-Gfj7D4rcA=W=VJA^D zV>n=fhNC}YFdO6k6b~M}iHYDEjqU3m284L9pr-qEzpi>!y$t~UbgeVzbeDbZ%J;j; zaqOPw?Jwk{lbrO^FVP)j%Ms7~+aiGfh@x!Zms5I#cDv0DBf<CRmUToOcyBuVnMCybQCB}rmM zT$J_jg>vBvajfh(lPO@L-C%6 zUPtLoiVb_&v+0h5*a)kgl{*4n1(LvPCYI^ z>uW4Zi`WqKo3|SigYUvsb7P7N_a=X=Eseu97>P=LzD-tNnub_Y$vpdtR|GnO{tYxc zz{Pdo=trQZ&7kz|D06e|+0}FMzZUU~@%EN~iLN1r8p9|i`MrwUoQ>EFlQ!Ql z=f>U_zOWSzy3xfii{BbA+FdZ8+1+hxc3~8C%;7Pr2r$fX8V?z{3Li71zqXtK46)Ml z^dV|6ijFaw!&+zXly7Z{{6$thMf7kx$tlapW0tv7!+o18WX{JtTixakph$Mk9V2&+ z>>bWooW>x1fPQ8>ztLH@+$wWV?@@5V=D*JU!0sBgA$6K+13co%%rc!jygOt};Q`M* zfX)STm9bJ%T~;o)s|=8 YxiR3lz3r@uDz#6O`FFqf7d{pK0Qvl1;Q#;t literal 0 HcmV?d00001 diff --git a/internal/1/Delphi/d11/TntUnicodeVcl_Design.bpi b/internal/1/Delphi/d11/TntUnicodeVcl_Design.bpi new file mode 100644 index 0000000000000000000000000000000000000000..1285a9ff2934ada683a55f86120359ce2610f60f GIT binary patch literal 13844 zcmdU0&2!tv6<;Z>;&GEEPBMwxbW%5^nm8YhXv?#dZ~__sSY`H(wQE5&9#41|A6+KOW%9gB^O_d1;_0~I#5~=`0d-b@8kF0LjQh| z#eUANu$MY+xas*vLAS{R`@m(BH`p0_waJ~~p?z)F3i_6FZLhj^<2IXIV(hyY7Fd(9 z$&cCDcb5izXVAOR8`^N;6}mtW_JE6vuj56S;IV7>y#e3rJJA<^eVehRZfmF2>0ZLm zX1!Bi>TZ0BWBkN1`{sG}?Gjsjj)}j1@I#p9Du{47A@U8c_a%JwB2Lym4IYQK6TtWd zn*4Owa-Vqe>-|RP;A&w^0!M4!7}%lb<1>UI;iqHIbAtMA3&t-YX7o_Y4WGajnq}X1 z2j0na(uQLN0iO;*rj~1maPyCZh#^M_HW~ZJ0;|+uz9+N;15#hjhMR56vHxU+w&zx! zKJ|~^j44rURkgYT>U7uyHUxm)P62J&ZW)+Q3Fb};rUR4j@DtSAJ_zLxYFj+q<$mBH ze0XXg;U5Y5*JjXLmg8{$v|)w(!1GPu9~1m7Gx%uxxNji#?+N!K1Kf=aU05#Vt+L?7=B50ddUo~5OeH0#g&vySo z(jDu_MAAKybk#u8&Y>Nk(?RqM4b)m5*ihmcN&Hqy;z#_z4niYG`j{ZztyRXu%B@?; zfR_p|`f#^FV82YslY*&fan9c{i@h-0Wwro$^DWAqe_vw%T3lLKVCTywA(x(BOgz1~ z$o_)Y&VIt)0A<9o(8b8Z*F+x95;O)G)j5kd=IZRubh^ z9%cD%G%BBEw+ZmQT)>jq_MZgzbuJu|l3m{$az8xXx5L9GPy&wlH@ zhU4m8AR53dYIQfTqqH$zT@%-qBSHtHh5JveKCgr~SE9YMfqm3k(cj!(*1F6@i7}Z< zg)sQA_a*O#EjJj#FVDxVGYDRPCT)C?s}1yRDPx;E01ebAs6FCC2Uat^f-?=rnfeK< z`lSJx0}|CND*>!Hk}Fy_3SjFe>e58NonxYgH*!rf!RIu?+8i?&i2pYNKPd~o@pNQ4 z0pgEu=Nsj%OrxA`Z%|;K3eC(k&m1eN^ah~`9he)wZv;Oi&F+-dY<)1$n7!T>_i4)8 zl$TfUS#lOOd0Bid!Qct1shfcdAORM^$vU0J z%KcPP&ysv5ZJ=qQxch*+BNQx$N#qsZP|ZWQe+Qkd?;U}I!gfW5TAmqf5!P}RR!LIu z86n-xLP96(Kqq3|@*}Nd6~4#)o@rL-5cbVd*arDP=^7*znHE`;$tbn~w35fNps|P@ z1v7n=16Qbw3Aj+Ufz*E>J>SdIb5iP(yQt)#EU~d%7TzkXq?}g1CgI&Y;nVQDJ|9{> zZvpWn-Hcc7O|em5ixFsdigX&0(UnKr5En}J!3)wc92bN-(_YzgaC?I?b)mB3ap{I zzUAA43qogqDmzm#p#_^QV6T#@HrE?ORf$v16p+a>Gx;fT*gWc~#DhWafHXTV^Hh$I z5>O?Hr^1F3Kxo8~0nC+0)H*P}*c7mN5|L#qh*l(R$&9^D0rnck>I8C$1o8=iT#usk zY8ooJa(#fw-{T}sL3Fv!CBO16L9h-$@o1*cAXq1$ zQXZs_2uiR{0Co1^62ga2wB(aXM=44#zid!n6J8 z{f8RHC-JR*K}u0;I4^{CW!{21N$I$o!`DMtR}aqgX=Md7lwSbu$m~d`03Kd%fo9eH ztbK`8OlZzQ4Yp(3b|aDJ-3&?MGmIcU8SKGyvVsM0T0o z7G*4N!S6-1AQWX>#_5#4q9u0x8I-CCsFXeGT}>eh37`^QCK6r(pp1iw##I6#wU#2^ z68|qjvGQVg(^Zk^RFQ=*$w)6Fe}**{w98}NBZ5ozVCo6WR(djYKjaVj?;1* + + {380b243e-5c94-43aa-a35e-d6f56064d675} + TntUnicodeVcl_Design.dpk + Release + AnyCPU + DCC32 + ..\..\Lib\D11\TntUnicodeVcl_Design110.bpl + + + 7.0 + False + False + True + True + True + 0 + RELEASE + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + + + 7.0 + True + True + True + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + ..\..\Lib\D11 + + + Delphi.Personality + Package + + + False + True + False + + + TntWare Unicode Controls + True + True + False + 110 + + + True + False + 2 + 3 + 0 + 1 + False + False + False + False + False + 1033 + 1252 + + + + + 2.3.0.1 + + + + + + 2.3.0.1 + + + TntUnicodeVcl_Design.dpk + + + + + + + MainSource + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/internal/1/Delphi/d11/TntUnicodeVcl_Design.res b/internal/1/Delphi/d11/TntUnicodeVcl_Design.res new file mode 100644 index 0000000000000000000000000000000000000000..b69d77e0cc8f3c300c14942fe1dd1bb09669ab6a GIT binary patch literal 1508 zcma)5O-~d-5Pbt{X1&M|jd+t7V~hubLb4hUYFvpVer!a6!~-Gfj7D4rcA=W=VJA^D zV>n=fhNC}YFdO6k6b~M}iHYDEjqU3m284L9pr-qEzpi>!y$t~UbgeVzbeDbZ%J;j; zaqOPw?Jwk{lbrO^FVP)j%Ms7~+aiGfh@x!Zms5I#cDv0DBf<CRmUToOcyBuVnMCybQCB}rmM zT$J_jg>vBvajfh(lPO@L-C%6 zUPtLoiVb_&v+0h5*a)kgl{*4n1(LvPCYI^ z>uW4Zi`WqKo3|SigYUvsb7P7N_a=X=Eseu97>P=LzD-tNnub_Y$vpdtR|GnO{tYxc zz{Pdo=trQZ&7kz|D06e|+0}FMzZUU~@%EN~iLN1r8p9|i`MrwUoQ>EFlQ!Ql z=f>U_zOWSzy3xfii{BbA+FdZ8+1+hxc3~8C%;7Pr2r$fX8V?z{3Li71zqXtK46)Ml z^dV|6ijFaw!&+zXly7Z{{6$thMf7kx$tlapW0tv7!+o18WX{JtTixakph$Mk9V2&+ z>>bWooW>x1fPQ8>ztLH@+$wWV?@@5V=D*JU!0sBgA$6K+13co%%rc!jygOt};Q`M* zfX)STm9bJ%T~;o)s|=8 YxiR3lz3r@uDz#6O`FFqf7d{pK0Qvl1;Q#;t literal 0 HcmV?d00001 diff --git a/internal/1/Delphi/d11/TntUnicode_D11.groupproj b/internal/1/Delphi/d11/TntUnicode_D11.groupproj new file mode 100644 index 0000000..f803775 --- /dev/null +++ b/internal/1/Delphi/d11/TntUnicode_D11.groupproj @@ -0,0 +1,44 @@ + + + {af130047-c49d-4ee5-bbac-ae3c3b8ebfa4} + + + + + + + + Default.Personality + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/internal/1/Delphi/d6/TntUnicodeVcl_D60.cfg b/internal/1/Delphi/d6/TntUnicodeVcl_D60.cfg new file mode 100644 index 0000000..66fb3af --- /dev/null +++ b/internal/1/Delphi/d6/TntUnicodeVcl_D60.cfg @@ -0,0 +1,32 @@ +-$A8 +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L+ +-$M- +-$N+ +-$O+ +-$P+ +-$Q+ +-$R+ +-$S- +-$T+ +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-cg +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 diff --git a/internal/1/Delphi/d6/TntUnicodeVcl_D60.dof b/internal/1/Delphi/d6/TntUnicodeVcl_D60.dof new file mode 100644 index 0000000..f74c4af --- /dev/null +++ b/internal/1/Delphi/d6/TntUnicodeVcl_D60.dof @@ -0,0 +1,87 @@ +[FileVersion] +Version=6.0 +[Compiler] +A=8 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=0 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=1 +R=1 +S=0 +T=1 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases= +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=Tnt Unicode Controls +[Directories] +OutputDir= +UnitOutputDir= +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages= +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +ProjectLang=$00000409 +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=2 +MinorVer=3 +Release=0 +Build=1 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=2.3.0.1 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=2.3.0.1 +Comments= diff --git a/internal/1/Delphi/d6/TntUnicodeVcl_D60.dpk b/internal/1/Delphi/d6/TntUnicodeVcl_D60.dpk new file mode 100644 index 0000000..300208c --- /dev/null +++ b/internal/1/Delphi/d6/TntUnicodeVcl_D60.dpk @@ -0,0 +1,57 @@ +package TntUnicodeVcl_D60; + +{$R *.res} +{$R '..\..\Design\TntComCtrls.dcr'} +{$R '..\..\Design\TntDBCtrls.dcr'} +{$R '..\..\Design\TntStdCtrls.dcr'} +{$R '..\..\Design\TntActnList.dcr'} +{$R '..\..\Design\TntMenus.dcr'} +{$R '..\..\Design\TntExtCtrls.dcr'} +{$R '..\..\Design\TntForms.dcr'} +{$R '..\..\Design\TntGrids.dcr'} +{$R '..\..\Design\TntButtons.dcr'} +{$R '..\..\Design\TntDialogs.dcr'} +{$R '..\..\Design\TntExtDlgs.dcr'} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS ON} +{$RANGECHECKS ON} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS ON} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Tnt Unicode Controls'} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + dclact, + dcldb, + designide, + TntUnicodeVcl_R60; + +contains + TntForms_Design in '..\..\Design\TntForms_Design.pas', + TntComCtrls_Design in '..\..\Design\TntComCtrls_Design.pas', + TntDBGrids_Design in '..\..\Design\TntDBGrids_Design.pas', + TntDesignEditors_Design in '..\..\Design\TntDesignEditors_Design.pas', + TntWideStringProperty_Design in '..\..\Design\TntWideStringProperty_Design.pas', + TntMenus_Design in '..\..\Design\TntMenus_Design.pas', + TntStrEdit_Design in '..\..\Design\TntStrEdit_Design.pas', + TntUnicodeVcl_Register in '..\..\Design\TntUnicodeVcl_Register.pas', + TntActions_Design in '..\..\Design\TntActions_Design.pas'; + +end. diff --git a/internal/1/Delphi/d6/TntUnicodeVcl_D60.res b/internal/1/Delphi/d6/TntUnicodeVcl_D60.res new file mode 100644 index 0000000000000000000000000000000000000000..1694512495aca6f109f47a8bba113e17ee2382be GIT binary patch literal 1536 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 + + + + + + + + + + + TntUnicodeVcl_D90.dpk + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + + + 0 + 0 + 1 + False + False + False + 16384 + 1048576 + 4194304 + Tnt Unicode Controls + + + + + + + + + + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + True + False + 2 + 3 + 0 + 1 + False + False + False + False + False + 1033 + 1252 + + + + + 2.3.0.1 + + + + + + 2.3.0.1 + + + diff --git a/internal/1/Delphi/d9/TntUnicodeVcl_D90.cfg b/internal/1/Delphi/d9/TntUnicodeVcl_D90.cfg new file mode 100644 index 0000000..9adbd44 --- /dev/null +++ b/internal/1/Delphi/d9/TntUnicodeVcl_D90.cfg @@ -0,0 +1,35 @@ +-$A8 +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L+ +-$M- +-$N+ +-$O+ +-$P+ +-$Q+ +-$R+ +-$S- +-$T+ +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-cg +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/internal/1/Delphi/d9/TntUnicodeVcl_D90.dpk b/internal/1/Delphi/d9/TntUnicodeVcl_D90.dpk new file mode 100644 index 0000000..5c97e9b --- /dev/null +++ b/internal/1/Delphi/d9/TntUnicodeVcl_D90.dpk @@ -0,0 +1,55 @@ +package TntUnicodeVcl_D90; + +{$R *.res} +{$R '..\..\Design\TntComCtrls.dcr'} +{$R '..\..\Design\TntDBCtrls.dcr'} +{$R '..\..\Design\TntStdCtrls.dcr'} +{$R '..\..\Design\TntActnList.dcr'} +{$R '..\..\Design\TntMenus.dcr'} +{$R '..\..\Design\TntExtCtrls.dcr'} +{$R '..\..\Design\TntForms.dcr'} +{$R '..\..\Design\TntGrids.dcr'} +{$R '..\..\Design\TntButtons.dcr'} +{$R '..\..\Design\TntDialogs.dcr'} +{$R '..\..\Design\TntExtDlgs.dcr'} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS ON} +{$RANGECHECKS ON} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS ON} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Tnt Unicode Controls'} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + dcldb, + designide, + TntUnicodeVcl_R90; + +contains + TntForms_Design in '..\..\Design\TntForms_Design.pas', + TntComCtrls_Design in '..\..\Design\TntComCtrls_Design.pas', + TntDBGrids_Design in '..\..\Design\TntDBGrids_Design.pas', + TntDesignEditors_Design in '..\..\Design\TntDesignEditors_Design.pas', + TntStrEdit_Design in '..\..\Design\TntStrEdit_Design.pas', + TntUnicodeVcl_Register in '..\..\Design\TntUnicodeVcl_Register.pas', + TntActions_Design in '..\..\Design\TntActions_Design.pas', + TntMenus_Design in '..\..\Design\TntMenus_Design.pas'; + +end. diff --git a/internal/1/Delphi/d9/TntUnicodeVcl_D90.res b/internal/1/Delphi/d9/TntUnicodeVcl_D90.res new file mode 100644 index 0000000000000000000000000000000000000000..b69d77e0cc8f3c300c14942fe1dd1bb09669ab6a GIT binary patch literal 1508 zcma)5O-~d-5Pbt{X1&M|jd+t7V~hubLb4hUYFvpVer!a6!~-Gfj7D4rcA=W=VJA^D zV>n=fhNC}YFdO6k6b~M}iHYDEjqU3m284L9pr-qEzpi>!y$t~UbgeVzbeDbZ%J;j; zaqOPw?Jwk{lbrO^FVP)j%Ms7~+aiGfh@x!Zms5I#cDv0DBf<CRmUToOcyBuVnMCybQCB}rmM zT$J_jg>vBvajfh(lPO@L-C%6 zUPtLoiVb_&v+0h5*a)kgl{*4n1(LvPCYI^ z>uW4Zi`WqKo3|SigYUvsb7P7N_a=X=Eseu97>P=LzD-tNnub_Y$vpdtR|GnO{tYxc zz{Pdo=trQZ&7kz|D06e|+0}FMzZUU~@%EN~iLN1r8p9|i`MrwUoQ>EFlQ!Ql z=f>U_zOWSzy3xfii{BbA+FdZ8+1+hxc3~8C%;7Pr2r$fX8V?z{3Li71zqXtK46)Ml z^dV|6ijFaw!&+zXly7Z{{6$thMf7kx$tlapW0tv7!+o18WX{JtTixakph$Mk9V2&+ z>>bWooW>x1fPQ8>ztLH@+$wWV?@@5V=D*JU!0sBgA$6K+13co%%rc!jygOt};Q`M* zfX)STm9bJ%T~;o)s|=8 YxiR3lz3r@uDz#6O`FFqf7d{pK0Qvl1;Q#;t literal 0 HcmV?d00001 diff --git a/internal/1/Delphi/d9/TntUnicodeVcl_R90.bdsproj b/internal/1/Delphi/d9/TntUnicodeVcl_R90.bdsproj new file mode 100644 index 0000000..9dee604 --- /dev/null +++ b/internal/1/Delphi/d9/TntUnicodeVcl_R90.bdsproj @@ -0,0 +1,172 @@ + + + + + + + + + + + + TntUnicodeVcl_R90.dpk + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + + 0 + 0 + 1 + False + False + False + 16384 + 1048576 + 4194304 + Tnt Unicode Controls - Runtime + + + + + + + + + + + False + + + + + + False + + + + + + False + + + + $00000000 + + + + True + False + 2 + 3 + 0 + 1 + False + False + False + False + False + 1033 + 1252 + + + + + 2.3.0.1 + + + + + + 2.3.0.1 + + + diff --git a/internal/1/Delphi/d9/TntUnicodeVcl_R90.cfg b/internal/1/Delphi/d9/TntUnicodeVcl_R90.cfg new file mode 100644 index 0000000..66fb3af --- /dev/null +++ b/internal/1/Delphi/d9/TntUnicodeVcl_R90.cfg @@ -0,0 +1,32 @@ +-$A8 +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L+ +-$M- +-$N+ +-$O+ +-$P+ +-$Q+ +-$R+ +-$S- +-$T+ +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-cg +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 diff --git a/internal/1/Delphi/d9/TntUnicodeVcl_R90.dpk b/internal/1/Delphi/d9/TntUnicodeVcl_R90.dpk new file mode 100644 index 0000000..a2be8c9 --- /dev/null +++ b/internal/1/Delphi/d9/TntUnicodeVcl_R90.dpk @@ -0,0 +1,72 @@ +package TntUnicodeVcl_R90; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS ON} +{$RANGECHECKS ON} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS ON} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'Tnt Unicode Controls - Runtime'} +{$RUNONLY} +{$IMPLICITBUILD ON} + +requires + vcl, + vclx, + vcldb, + dsnap, + vclactnband; + +contains + ActiveIMM_TLB in '..\..\Source\ActiveIMM_TLB.pas', + TntSystem in '..\..\Source\TntSystem.pas', + TntAxCtrls in '..\..\Source\TntAxCtrls.pas', + TntClipbrd in '..\..\Source\TntClipbrd.pas', + TntWindows in '..\..\Source\TntWindows.pas', + TntSysUtils in '..\..\Source\TntSysUtils.pas', + TntClasses in '..\..\Source\TntClasses.pas', + TntDialogs in '..\..\Source\TntDialogs.pas', + TntFileCtrl in '..\..\Source\TntFileCtrl.pas', + TntExtDlgs in '..\..\Source\TntExtDlgs.pas', + TntRegistry in '..\..\Source\TntRegistry.pas', + TntGraphics in '..\..\Source\TntGraphics.pas', + TntControls in '..\..\Source\TntControls.pas', + TntActnList in '..\..\Source\TntActnList.pas', + TntMenus in '..\..\Source\TntMenus.pas', + TntForms in '..\..\Source\TntForms.pas', + TntStdCtrls in '..\..\Source\TntStdCtrls.pas', + TntExtCtrls in '..\..\Source\TntExtCtrls.pas', + TntButtons in '..\..\Source\TntButtons.pas', + TntCheckLst in '..\..\Source\TntCheckLst.pas', + TntGrids in '..\..\Source\TntGrids.pas', + TntComCtrls in '..\..\Source\TntComCtrls.pas', + TntDB in '..\..\Source\TntDB.pas', + TntDBCtrls in '..\..\Source\TntDBCtrls.pas', + TntDBGrids in '..\..\Source\TntDBGrids.pas', + TntStdActns in '..\..\Source\TntStdActns.pas', + TntExtActns in '..\..\Source\TntExtActns.pas', + TntListActns in '..\..\Source\TntListActns.pas', + TntDBActns in '..\..\Source\TntDBActns.pas', + TntBandActn in '..\..\Source\TntBandActn.pas', + TntDBLogDlg in '..\..\Source\TntDBLogDlg.pas', + TntFormatStrUtils in '..\..\Source\TntFormatStrUtils.pas', + TntWideStrings in '..\..\Source\TntWideStrings.pas', + TntWideStrUtils in '..\..\Source\TntWideStrUtils.pas'; + +end. diff --git a/internal/1/Delphi/d9/TntUnicodeVcl_R90.res b/internal/1/Delphi/d9/TntUnicodeVcl_R90.res new file mode 100644 index 0000000000000000000000000000000000000000..b69d77e0cc8f3c300c14942fe1dd1bb09669ab6a GIT binary patch literal 1508 zcma)5O-~d-5Pbt{X1&M|jd+t7V~hubLb4hUYFvpVer!a6!~-Gfj7D4rcA=W=VJA^D zV>n=fhNC}YFdO6k6b~M}iHYDEjqU3m284L9pr-qEzpi>!y$t~UbgeVzbeDbZ%J;j; zaqOPw?Jwk{lbrO^FVP)j%Ms7~+aiGfh@x!Zms5I#cDv0DBf<CRmUToOcyBuVnMCybQCB}rmM zT$J_jg>vBvajfh(lPO@L-C%6 zUPtLoiVb_&v+0h5*a)kgl{*4n1(LvPCYI^ z>uW4Zi`WqKo3|SigYUvsb7P7N_a=X=Eseu97>P=LzD-tNnub_Y$vpdtR|GnO{tYxc zz{Pdo=trQZ&7kz|D06e|+0}FMzZUU~@%EN~iLN1r8p9|i`MrwUoQ>EFlQ!Ql z=f>U_zOWSzy3xfii{BbA+FdZ8+1+hxc3~8C%;7Pr2r$fX8V?z{3Li71zqXtK46)Ml z^dV|6ijFaw!&+zXly7Z{{6$thMf7kx$tlapW0tv7!+o18WX{JtTixakph$Mk9V2&+ z>>bWooW>x1fPQ8>ztLH@+$wWV?@@5V=D*JU!0sBgA$6K+13co%%rc!jygOt};Q`M* zfX)STm9bJ%T~;o)s|=8 YxiR3lz3r@uDz#6O`FFqf7d{pK0Qvl1;Q#;t literal 0 HcmV?d00001 diff --git a/internal/1/Design/TntActions_Design.pas b/internal/1/Design/TntActions_Design.pas new file mode 100644 index 0000000..7a17388 --- /dev/null +++ b/internal/1/Design/TntActions_Design.pas @@ -0,0 +1,183 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntActions_Design; + +{$INCLUDE ..\Source\TntCompilers.inc} + +interface + +procedure Register; + +implementation + +uses + Classes, ActnList, TntActnList, StdActns, TntStdActns, + ExtActns, TntExtActns, ListActns, TntListActns, BandActn, TntBandActn, + DBActns, TntDBActns, TntDesignEditors_Design; + +procedure Register; +begin + RegisterClass(TTntAction); + // StdActns + RegisterClass(TTntEditAction); + RegisterClass(TTntEditCut); + RegisterClass(TTntEditCopy); + RegisterClass(TTntEditPaste); + RegisterClass(TTntEditSelectAll); + RegisterClass(TTntEditUndo); + RegisterClass(TTntEditDelete); + RegisterClass(TTntWindowAction); + RegisterClass(TTntWindowClose); + RegisterClass(TTntWindowCascade); + RegisterClass(TTntWindowTileHorizontal); + RegisterClass(TTntWindowTileVertical); + RegisterClass(TTntWindowMinimizeAll); + RegisterClass(TTntWindowArrange); + RegisterClass(TTntHelpAction); + RegisterClass(TTntHelpContents); + RegisterClass(TTntHelpTopicSearch); + RegisterClass(TTntHelpOnHelp); + RegisterClass(TTntHelpContextAction); + RegisterClass(TTntFileOpen); + RegisterClass(TTntFileOpenWith); + RegisterClass(TTntFileSaveAs); + RegisterClass(TTntFilePrintSetup); + RegisterClass(TTntFileExit); + RegisterClass(TTntSearchFind); + RegisterClass(TTntSearchReplace); + RegisterClass(TTntSearchFindFirst); + RegisterClass(TTntSearchFindNext); + RegisterClass(TTntFontEdit); + RegisterClass(TTntColorSelect); + RegisterClass(TTntPrintDlg); + // ExtActns + RegisterClass(TTntFileRun); + RegisterClass(TTntRichEditAction); + RegisterClass(TTntRichEditBold); + RegisterClass(TTntRichEditItalic); + RegisterClass(TTntRichEditUnderline); + RegisterClass(TTntRichEditStrikeOut); + RegisterClass(TTntRichEditBullets); + RegisterClass(TTntRichEditAlignLeft); + RegisterClass(TTntRichEditAlignRight); + RegisterClass(TTntRichEditAlignCenter); + RegisterClass(TTntPreviousTab); + RegisterClass(TTntNextTab); + RegisterClass(TTntOpenPicture); + RegisterClass(TTntSavePicture); + RegisterClass(TTntURLAction); + RegisterClass(TTntBrowseURL); + RegisterClass(TTntDownLoadURL); + RegisterClass(TTntSendMail); + RegisterClass(TTntListControlCopySelection); + RegisterClass(TTntListControlDeleteSelection); + RegisterClass(TTntListControlSelectAll); + RegisterClass(TTntListControlClearSelection); + RegisterClass(TTntListControlMoveSelection); + // ListActns + RegisterClass(TTntStaticListAction); + RegisterClass(TTntVirtualListAction); + {$IFDEF COMPILER_7_UP} + RegisterClass(TTntFilePageSetup); + {$ENDIF} + // DBActns + RegisterClass(TTntDataSetAction); + RegisterClass(TTntDataSetFirst); + RegisterClass(TTntDataSetPrior); + RegisterClass(TTntDataSetNext); + RegisterClass(TTntDataSetLast); + RegisterClass(TTntDataSetInsert); + RegisterClass(TTntDataSetDelete); + RegisterClass(TTntDataSetEdit); + RegisterClass(TTntDataSetPost); + RegisterClass(TTntDataSetCancel); + RegisterClass(TTntDataSetRefresh); + // BandActn + RegisterClass(TTntCustomizeActionBars); +end; + +//------------------------ + +function GetTntActionClass(OldActionClass: TContainedActionClass): TContainedActionClass; +begin + Result := TContainedActionClass(GetClass('TTnt' + Copy(OldActionClass.ClassName, 2, Length(OldActionClass.ClassName)))); +end; + +type + TAccessContainedAction = class(TContainedAction); + +function UpgradeAction(ActionList: TTntActionList; OldAction: TContainedAction): TContainedAction; +var + Name: TComponentName; + i: integer; + NewActionClass: TContainedActionClass; +begin + Result := nil; + if (OldAction = nil) or (OldAction.Owner = nil) or (OldAction.Name = '') then + Exit; + + NewActionClass := GetTntActionClass(TContainedActionClass(OldAction.ClassType)); + if NewActionClass <> nil then begin + // create new action + Result := NewActionClass.Create(OldAction.Owner) as TContainedAction; + Include(TAccessContainedAction(Result).FComponentStyle, csTransient); + // copy base class info + Result.ActionComponent := OldAction.ActionComponent; + Result.Category := OldAction.Category; { Assign Category before ActionList/Index to avoid flicker. } + Result.ActionList := ActionList; + Result.Index := OldAction.Index; + // assign props + Result.Assign(OldAction); + // point all links to this new action + for i := TAccessContainedAction(OldAction).FClients.Count - 1 downto 0 do + TBasicActionLink(TAccessContainedAction(OldAction).FClients[i]).Action := Result; + // free old object, preserve name... + Name := OldAction.Name; + OldAction.Free; + Result.Name := Name; { link up to old name } + Exclude(TAccessContainedAction(Result).FComponentStyle, csTransient); + end; +end; + +procedure TntActionList_UpgradeActionListItems(ActionList: TTntActionList); +var + DesignerNotify: IDesignerNotify; + Designer: ITntDesigner; + TntSelections: TTntDesignerSelections; + i: integer; + OldAction, NewAction: TContainedAction; +begin + DesignerNotify := FindRootDesigner(ActionList); + if (DesignerNotify <> nil) then begin + DesignerNotify.QueryInterface(ITntDesigner, Designer); + if (Designer <> nil) then begin + TntSelections := TTntDesignerSelections.Create; + try + Designer.GetSelections(TntSelections); + for i := ActionList.ActionCount - 1 downto 0 do begin + OldAction := ActionList.Actions[i]; + NewAction := UpgradeAction(ActionList, OldAction); + if (NewAction <> nil) then + TntSelections.ReplaceSelection(OldAction, NewAction); + end; + Designer.SetSelections(TntSelections); + finally + TntSelections.Free; + end; + end; + end; +end; + +initialization + UpgradeActionListItemsProc := TntActionList_UpgradeActionListItems; + +end. diff --git a/internal/1/Design/TntComCtrls_Design.pas b/internal/1/Design/TntComCtrls_Design.pas new file mode 100644 index 0000000..aada482 --- /dev/null +++ b/internal/1/Design/TntComCtrls_Design.pas @@ -0,0 +1,228 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntComCtrls_Design; + +{$INCLUDE ..\Source\TntCompilers.inc} + +interface + +uses + DesignIntf, DesignMenus, DesignEditors, Classes, ComCtrls; + +type + IPrepareMenuItem = IMenuItem; + + TTntListViewEditor = class(TComponentEditor) + public + procedure ExecuteVerb(Index: Integer); override; + function GetVerb(Index: Integer): string{TNT-ALLOW string}; override; + function GetVerbCount: Integer; override; + end; + + TTntPageControlEditor = class(TDefaultEditor) + private + function PageControl: TPageControl{TNT-ALLOW TPageControl}; + public + procedure ExecuteVerb(Index: Integer); override; + function GetVerb(Index: Integer): string{TNT-ALLOW string}; override; + function GetVerbCount: Integer; override; + procedure PrepareItem(Index: Integer; const AItem: IPrepareMenuItem); override; + end; + + TTntStatusBarEditor = class(TComponentEditor) + public + procedure ExecuteVerb(Index: Integer); override; + function GetVerb(Index: Integer): string{TNT-ALLOW string}; override; + function GetVerbCount: Integer; override; + end; + + TTntToolBarEditor = class(TComponentEditor) + public + procedure ExecuteVerb(Index: Integer); override; + function GetVerb(Index: Integer): string{TNT-ALLOW string}; override; + function GetVerbCount: Integer; override; + end; + +procedure Register; + +implementation + +uses + SysUtils, DsnConst, TntComCtrls, TntDesignEditors_Design; + +procedure Register; +begin + RegisterComponentEditor(TTntListView, TTntListViewEditor); + RegisterComponentEditor(TTntPageControl, TTntPageControlEditor); + RegisterComponentEditor(TTntTabSheet, TTntPageControlEditor); + RegisterComponentEditor(TTntStatusBar, TTntStatusBarEditor); + RegisterComponentEditor(TTntToolBar, TTntToolBarEditor); + RegisterComponentEditor(TTntToolButton, TTntToolBarEditor); +end; + +{ TTntListViewEditor } + +function TTntListViewEditor.GetVerbCount: Integer; +begin + Result := 2; +end; + +function TTntListViewEditor.GetVerb(Index: Integer): string{TNT-ALLOW string}; +begin + case Index of + 0: Result := SListColumnsEditor; + 1: Result := SListItemsEditor; + end; +end; + +procedure TTntListViewEditor.ExecuteVerb(Index: Integer); +begin + case Index of + 0: EditPropertyWithDialog(Component, 'Columns', Designer); + 1: EditPropertyWithDialog(Component, 'Items', Designer); + end; +end; + +{ TTntPageControlEditor } + +function TTntPageControlEditor.PageControl: TPageControl{TNT-ALLOW TPageControl}; +begin + if Component is TTabSheet{TNT-ALLOW TTabSheet} then + Result := TTabSheet{TNT-ALLOW TTabSheet}(Component).PageControl + else + Result := Component as TPageControl{TNT-ALLOW TPageControl}; +end; + +function TTntPageControlEditor.GetVerbCount: Integer; +begin + Result := 4; +end; + +function TTntPageControlEditor.GetVerb(Index: Integer): string{TNT-ALLOW string}; +begin + case Index of + 0: Result := SNewPage; + 1: Result := SNextPage; + 2: Result := SPrevPage; + 3: Result := SDeletePage; + end; +end; + +procedure TTntPageControlEditor.PrepareItem(Index: Integer; const AItem: IPrepareMenuItem); +begin + AItem.Enabled := (Index <> 3) or (PageControl.PageCount > 0); +end; + +type TAccessPageControl = class(TPageControl{TNT-ALLOW TPageControl}); + +procedure TTntPageControlEditor.ExecuteVerb(Index: Integer); + + procedure CreateNewTabSheet; + var + NewTabsheet: TTntTabSheet; + begin + NewTabSheet := TTntTabSheet.Create(PageControl.Owner); + NewTabSheet.PageControl := Self.PageControl; + with NewTabSheet do begin + Name := Designer.UniqueName(ClassName); + Caption := Name; + Visible := True; + end; + PageControl.ActivePage := NewTabSheet; + end; + +begin + case Index of + 0: CreateNewTabSheet; + 1: PageControl.SelectNextPage(True, False); + 2: PageControl.SelectNextPage(False, False); + 3: if PageControl.ActivePage <> nil then + PageControl.ActivePage.Free; + end; +end; + +{ TTntStatusBarEditor } + +function TTntStatusBarEditor.GetVerbCount: Integer; +begin + Result := 1; +end; + +function TTntStatusBarEditor.GetVerb(Index: Integer): string{TNT-ALLOW string}; +begin + case Index of + 0: Result := SStatusBarPanelEdit; + end; +end; + +procedure TTntStatusBarEditor.ExecuteVerb(Index: Integer); +begin + case Index of + 0: EditPropertyWithDialog(Component, 'Panels', Designer); + end; +end; + +{ TTntToolBarEditor } + +procedure TTntToolBarEditor.ExecuteVerb(Index: Integer); +var + ToolBar: TTntToolBar; + ToolButton: TTntToolButton; + I, J: Integer; + NewName: WideString; +begin + Assert(Index in [0, 1]); + + if Component is TTntToolBar then + ToolBar := TTntToolBar(Component) + else if (Component is TTntToolButton) and (TTntToolButton(Component).Parent is TTntToolBar) then + ToolBar := TTntToolBar(TTntToolButton(Component).Parent) + else + Exit; + + ToolButton := TTntToolButton.Create(Component.Owner); + + I := 1; + repeat + NewName := 'TntToolButton' + IntToStr(I); + for J := 0 to ToolBar.ControlCount - 1 do + if WideSameText(ToolBar.Controls[J].Name, NewName) then + NewName := ''; + Inc(I); + until NewName <> ''; + ToolButton.Name := NewName; + + if Index = 1 then begin + ToolButton.Style := tbsSeparator; + ToolButton.Width := 8; + end; + + for I := 0 to ToolBar.ControlCount - 1 do + ToolButton.Left := ToolButton.Left + ToolBar.Controls[I].Width; + + ToolButton.Parent := ToolBar; +end; + +function TTntToolBarEditor.GetVerb(Index: Integer): string{TNT-ALLOW string}; +begin + case Index of + 0: Result := SNewToolButton; + 1: Result := SNewToolSeparator; + end; +end; + +function TTntToolBarEditor.GetVerbCount: Integer; +begin + Result := 2; +end; + +end. diff --git a/internal/1/Design/TntDBClientActns_Design.pas b/internal/1/Design/TntDBClientActns_Design.pas new file mode 100644 index 0000000..784c4f0 --- /dev/null +++ b/internal/1/Design/TntDBClientActns_Design.pas @@ -0,0 +1,36 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntDBClientActns_Design; + +{$INCLUDE ..\Source\TntCompilers.inc} + +interface + +uses + Classes; + +procedure Register; + +implementation + +uses + TntDBClientActns; + +procedure Register; +begin + // DBClientActns + RegisterClass(TTntClientDataSetApply); + RegisterClass(TTntClientDataSetRevert); + RegisterClass(TTntClientDataSetUndo); +end; + +end. diff --git a/internal/1/Design/TntDBGrids_Design.pas b/internal/1/Design/TntDBGrids_Design.pas new file mode 100644 index 0000000..7be008d --- /dev/null +++ b/internal/1/Design/TntDBGrids_Design.pas @@ -0,0 +1,58 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntDBGrids_Design; + +{$INCLUDE ..\Source\TntCompilers.inc} + +interface + +uses + DesignEditors, DesignIntf; + +type + TTntDBGridEditor = class(TComponentEditor) + public + procedure ExecuteVerb(Index: Integer); override; + function GetVerb(Index: Integer): string{TNT-ALLOW string}; override; + function GetVerbCount: Integer; override; + end; + +procedure Register; + +implementation + +uses + TntDBGrids, DsnDBCst, TntDesignEditors_Design; + +procedure Register; +begin + RegisterComponentEditor(TTntDBGrid, TTntDBGridEditor); +end; + +{ TTntDBGridEditor } + +function TTntDBGridEditor.GetVerbCount: Integer; +begin + Result := 1; +end; + +function TTntDBGridEditor.GetVerb(Index: Integer): string{TNT-ALLOW string}; +begin + Result := DsnDBCst.SDBGridColEditor; +end; + +procedure TTntDBGridEditor.ExecuteVerb(Index: Integer); +begin + EditPropertyWithDialog(Component, 'Columns', Designer); +end; + +end. diff --git a/internal/1/Design/TntDesignEditors_Design.pas b/internal/1/Design/TntDesignEditors_Design.pas new file mode 100644 index 0000000..c305f04 --- /dev/null +++ b/internal/1/Design/TntDesignEditors_Design.pas @@ -0,0 +1,196 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntDesignEditors_Design; + +{$INCLUDE ..\Source\TntCompilers.inc} + +interface + +uses + Classes, Forms, TypInfo, DesignIntf, DesignEditors; + +type + ITntDesigner = IDesigner; + + TTntDesignerSelections = class(TInterfacedObject, IDesignerSelections) + private + FList: TList; + {$IFDEF COMPILER_9_UP} + function GetDesignObject(Index: Integer): IDesignObject; + {$ENDIF} + protected + function Add(const Item: TPersistent): Integer; + function Equals(const List: IDesignerSelections): Boolean; + function Get(Index: Integer): TPersistent; + function GetCount: Integer; + property Count: Integer read GetCount; + property Items[Index: Integer]: TPersistent read Get; default; + public + constructor Create; virtual; + destructor Destroy; override; + procedure ReplaceSelection(const OldInst, NewInst: TPersistent); + end; + +function GetObjectInspectorForm: TCustomForm; +procedure EditPropertyWithDialog(Component: TPersistent; const PropName: AnsiString; const Designer: ITntDesigner); + +implementation + +uses + SysUtils; + +{ TTntDesignerSelections } + +function TTntDesignerSelections.Add(const Item: TPersistent): Integer; +begin + Result := FList.Add(Item); +end; + +constructor TTntDesignerSelections.Create; +begin + inherited; + FList := TList.Create; +end; + +destructor TTntDesignerSelections.Destroy; +begin + FList.Free; + inherited; +end; + +function TTntDesignerSelections.Equals(const List: IDesignerSelections): Boolean; +var + I: Integer; +begin + Result := False; + if List.Count <> Count then Exit; + for I := 0 to Count - 1 do + begin + if Items[I] <> List[I] then Exit; + end; + Result := True; +end; + +function TTntDesignerSelections.Get(Index: Integer): TPersistent; +begin + Result := TPersistent(FList[Index]); +end; + +function TTntDesignerSelections.GetCount: Integer; +begin + Result := FList.Count; +end; + +{$IFDEF COMPILER_9_UP} +function TTntDesignerSelections.GetDesignObject(Index: Integer): IDesignObject; +begin + Result := nil; {TODO: Figure out what IDesignerSelections.GetDesignObject is all about. Must wait for more documentation!} +end; +{$ENDIF} + +procedure TTntDesignerSelections.ReplaceSelection(const OldInst, NewInst: TPersistent); +var + Idx: Integer; +begin + Idx := FList.IndexOf(OldInst); + if Idx <> -1 then + FList[Idx] := NewInst; +end; + +{//------------------------------ +// Helpful discovery routines to explore the components and classes inside the IDE... +// +procedure EnumerateComponents(Comp: TComponent); +var + i: integer; +begin + for i := Comp.ComponentCount - 1 downto 0 do + MessageBoxW(0, PWideChar(WideString(Comp.Components[i].Name + ': ' + Comp.Components[i].ClassName)), + PWideChar(WideString(Comp.Name)), 0); +end; + +procedure EnumerateClasses(Comp: TComponent); +var + AClass: TClass; +begin + AClass := Comp.ClassType; + repeat + MessageBoxW(0, PWideChar(WideString(AClass.ClassName)), + PWideChar(WideString(Comp.Name)), 0); + AClass := Aclass.ClassParent; + until AClass = nil; +end; +//------------------------------} + +//------------------------------ +function GetIdeMainForm: TCustomForm; +var + Comp: TComponent; +begin + Result := nil; + if Application <> nil then begin + Comp := Application.FindComponent('AppBuilder'); + if Comp is TCustomForm then + Result := TCustomForm(Comp); + end; +end; + +function GetObjectInspectorForm: TCustomForm; +var + Comp: TComponent; + IdeMainForm: TCustomForm; +begin + Result := nil; + IdeMainForm := GetIdeMainForm; + if IdeMainForm <> nil then begin + Comp := IdeMainForm.FindComponent('PropertyInspector'); + if Comp is TCustomForm then + Result := TCustomForm(Comp); + end; +end; + +{ TPropertyEditorWithDialog } +type + TPropertyEditorWithDialog = class + private + FPropName: AnsiString; + procedure CheckEditProperty(const Prop: IProperty); + procedure EditProperty(Component: TPersistent; const PropName: AnsiString; const Designer: ITntDesigner); + end; + +procedure TPropertyEditorWithDialog.CheckEditProperty(const Prop: IProperty); +begin + if Prop.GetName = FPropName then + Prop.Edit; +end; + +procedure TPropertyEditorWithDialog.EditProperty(Component: TPersistent; const PropName: AnsiString; const Designer: ITntDesigner); +var + Components: IDesignerSelections; +begin + FPropName := PropName; + Components := TDesignerSelections.Create; + Components.Add(Component); + GetComponentProperties(Components, [tkClass], Designer, CheckEditProperty); +end; + +procedure EditPropertyWithDialog(Component: TPersistent; const PropName: AnsiString; const Designer: ITntDesigner); +begin + with TPropertyEditorWithDialog.Create do + try + EditProperty(Component, PropName, Designer); + finally + Free; + end; +end; + +end. diff --git a/internal/1/Design/TntForms_Design.pas b/internal/1/Design/TntForms_Design.pas new file mode 100644 index 0000000..4810f04 --- /dev/null +++ b/internal/1/Design/TntForms_Design.pas @@ -0,0 +1,422 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntForms_Design; + +{$INCLUDE ..\Source\TntCompilers.inc} + +interface + +uses + Classes, Windows, DesignIntf, ToolsApi; + +type HICON = LongWord; + +type + TTntNewFormWizard = class(TNotifierObject, IOTAWizard, IOTARepositoryWizard, + IOTAFormWizard + {$IFDEF COMPILER_6_UP}, IOTARepositoryWizard60{$ENDIF} + {$IFDEF COMPILER_9_UP}, IOTARepositoryWizard80{$ENDIF}) + protected + function ThisFormName: WideString; + function ThisFormClass: TComponentClass; virtual; abstract; + function ThisFormUnit: WideString; + public + // IOTAWizard + function GetIDString: AnsiString; + function GetName: AnsiString; virtual; + function GetState: TWizardState; + procedure Execute; + // IOTARepositoryWizard + function GetAuthor: AnsiString; + function GetComment: AnsiString; virtual; abstract; + function GetPage: AnsiString; + function GetGlyph: HICON; + {$IFDEF COMPILER_6_UP} + // IOTARepositoryWizard60 + function GetDesigner: AnsiString; + {$ENDIF} + {$IFDEF COMPILER_9_UP} + // IOTARepositoryWizard80 + function GetGalleryCategory: IOTAGalleryCategory; + function GetPersonality: AnsiString; + {$ENDIF} + end; + +procedure Register; + +implementation + +uses + TntForms, DesignEditors, WCtlForm, TypInfo, SysUtils; + +type + TTntNewTntFormWizard = class(TTntNewFormWizard) + protected + function ThisFormClass: TComponentClass; override; + public + function GetName: AnsiString; override; + function GetComment: AnsiString; override; + end; + + TTntNewTntFrameWizard = class(TTntNewFormWizard) + protected + function ThisFormClass: TComponentClass; override; + public + function GetName: AnsiString; override; + function GetComment: AnsiString; override; + end; + + TTntFrameCustomModule = class(TWinControlCustomModule) + public + function Nestable: Boolean; override; + end; + + TTntFormCustomModule = class(TCustomModule) + public + class function DesignClass: TComponentClass; override; + end; + +procedure Register; +begin + RegisterCustomModule(TTntFrame, TTntFrameCustomModule); + RegisterPackageWizard(TTntNewTntFrameWizard.Create); + //-- + RegisterCustomModule(TTntForm, TTntFormCustomModule); + //-- + RegisterPackageWizard(TTntNewTntFormWizard.Create); +end; + +function GetFirstModuleSupporting(const IID: TGUID): IOTAModule; +var + ModuleServices: IOTAModuleServices; + i: integer; +begin + Result := nil; + if Assigned(BorlandIDEServices) then + begin + // look for the first project + ModuleServices := BorlandIDEServices as IOTAModuleServices; + for i := 0 to ModuleServices.ModuleCount - 1 do + if Supports(ModuleServices.Modules[i], IID, Result) then + Break; + end; +end; + +function MyGetActiveProject: IOTAProject; +{$IFDEF COMPILER_7_UP} +begin + Result := ToolsAPI.GetActiveProject; +{$ELSE} +var + ProjectGroup: IOTAProjectGroup; +begin + ProjectGroup := GetFirstModuleSupporting(IOTAProjectGroup) as IOTAProjectGroup; + if ProjectGroup = nil then + Result := nil + else + Result := ProjectGroup.ActiveProject; +{$ENDIF} + if (Result = nil) then + Result := GetFirstModuleSupporting(IOTAProject) as IOTAProject; +end; + +{ TTntNewFormCreator } +type + TTntNewFormCreator = class(TInterfacedObject, IOTACreator, IOTAModuleCreator) + private + FAncestorName: WideString; + FUnitName: WideString; + public + // IOTACreator + function GetCreatorType: AnsiString; + function GetExisting: Boolean; + function GetFileSystem: AnsiString; + function GetOwner: IOTAModule; + function GetUnnamed: Boolean; + // IOTAModuleCreator + function GetAncestorName: AnsiString; + function GetImplFileName: AnsiString; + function GetIntfFileName: AnsiString; + function GetFormName: AnsiString; + function GetMainForm: Boolean; + function GetShowForm: Boolean; + function GetShowSource: Boolean; + function NewFormFile(const FormIdent, AncestorIdent: AnsiString): IOTAFile; + function NewImplSource(const ModuleIdent, FormIdent, AncestorIdent: AnsiString): IOTAFile; + function NewIntfSource(const ModuleIdent, FormIdent, AncestorIdent: AnsiString): IOTAFile; + procedure FormCreated(const FormEditor: IOTAFormEditor); + public + constructor Create(const UnitName, AncestorName: WideString); + end; + + TTntSourceFile = class(TInterfacedObject, IOTAFile) + private + FSource: AnsiString; + public + function GetSource: AnsiString; + function GetAge: TDateTime; + constructor Create(const Source: AnsiString); + end; + +constructor TTntNewFormCreator.Create(const UnitName, AncestorName: WideString); +begin + inherited Create; + FUnitName := UnitName; + FAncestorName := AncestorName; +end; + +procedure TTntNewFormCreator.FormCreated(const FormEditor: IOTAFormEditor); +begin +end; + +function TTntNewFormCreator.GetAncestorName: AnsiString; +begin + Result := FAncestorName; +end; + +function TTntNewFormCreator.GetCreatorType: AnsiString; +begin + Result := sForm; +end; + +function TTntNewFormCreator.GetExisting: Boolean; +begin + Result := False; +end; + +function TTntNewFormCreator.GetFileSystem: AnsiString; +begin + Result := ''; +end; + +function TTntNewFormCreator.GetFormName: AnsiString; +begin + Result := ''; +end; + +function TTntNewFormCreator.GetImplFileName: AnsiString; +begin + Result := ''; +end; + +function TTntNewFormCreator.GetIntfFileName: AnsiString; +begin + Result := ''; +end; + +function TTntNewFormCreator.GetMainForm: Boolean; +begin + Result := False; +end; + +function TTntNewFormCreator.GetOwner: IOTAModule; +begin + Result := MyGetActiveProject; +end; + +function TTntNewFormCreator.GetShowForm: Boolean; +begin + Result := True; +end; + +function TTntNewFormCreator.GetShowSource: Boolean; +begin + Result := True; +end; + +function TTntNewFormCreator.GetUnnamed: Boolean; +begin + Result := True; +end; + +function TTntNewFormCreator.NewFormFile(const FormIdent, AncestorIdent: AnsiString): IOTAFile; +begin + Result := nil; +end; + +function TTntNewFormCreator.NewImplSource(const ModuleIdent, FormIdent, AncestorIdent: AnsiString): IOTAFile; +const + cSource = + 'unit %s;' + #13#10 + + '' + #13#10 + + 'interface' + #13#10 + + '' + #13#10 + + 'uses' + #13#10 + + ' Windows, Messages, SysUtils' + {$IFDEF COMPILER_6_UP}', Variants' + {$ENDIF} + ', Classes, Graphics, Controls, Forms,' + #13#10 + ' Dialogs, %s;' + #13#10 + + '' + #13#10 + + 'type' + #13#10 + + ' T%s = class(T%s)' + #13#10 + + ' private' + #13#10 + + ' { Private declarations }' + #13#10 + + ' public' + #13#10 + + ' { Public declarations }' + #13#10 + + ' end;' + #13#10 + + '' + #13#10 + + 'var' + #13#10 + + ' %s: T%s;' + #13#10 + + '' + #13#10 + + 'implementation' + #13#10 + + '' + #13#10 + + '{$R *.DFM}' + #13#10 + + '' + #13#10 + + 'end.'; +begin + Result := TTntSourceFile.Create(Format{TNT-ALLOW Format}(cSource, + [ModuleIdent, FUnitName, FormIdent, AncestorIdent, FormIdent, FormIdent])); +end; + +function TTntNewFormCreator.NewIntfSource(const ModuleIdent, FormIdent, AncestorIdent: AnsiString): IOTAFile; +begin + Result := nil; +end; + +{ TTntNewFormWizard } + +function TTntNewFormWizard.ThisFormName: WideString; +begin + Result := ThisFormClass.ClassName; + Delete(Result, 1, 1); // drop the 'T' +end; + +function TTntNewFormWizard.ThisFormUnit: WideString; +begin + Result := GetTypeData(ThisFormClass.ClassInfo).UnitName; +end; + +function TTntNewFormWizard.GetName: AnsiString; +begin + Result := ThisFormName; +end; + +function TTntNewFormWizard.GetAuthor: AnsiString; +begin + Result := 'Troy Wolbrink'; +end; + +function TTntNewFormWizard.GetPage: AnsiString; +begin + Result := 'New'; +end; + +function TTntNewFormWizard.GetGlyph: HICON; +begin + Result := 0; +end; + +function TTntNewFormWizard.GetState: TWizardState; +begin + Result := [wsEnabled]; +end; + +function TTntNewFormWizard.GetIDString: AnsiString; +begin + Result := 'Tnt.Create_'+ThisFormName+'.Wizard'; +end; + +procedure TTntNewFormWizard.Execute; +var + Module: IOTAModule; +begin + Module := (BorlandIDEServices as IOTAModuleServices).CreateModule(TTntNewFormCreator.Create(ThisFormUnit, ThisFormName)); +end; + +{$IFDEF COMPILER_6_UP} +function TTntNewFormWizard.GetDesigner: AnsiString; +begin + Result := dVCL; +end; +{$ENDIF} + +{$IFDEF COMPILER_9_UP} +function TTntNewFormWizard.GetGalleryCategory: IOTAGalleryCategory; +var + Manager: IOTAGalleryCategoryManager; +begin + Result := nil; + Manager := BorlandIDEServices as IOTAGalleryCategoryManager; + if Assigned(Manager) then + Result := Manager.FindCategory(sCategoryDelphiNew); +end; + +function TTntNewFormWizard.GetPersonality: AnsiString; +begin + Result := sDelphiPersonality; +end; +{$ENDIF} + +{ TTntSourceFile } + +constructor TTntSourceFile.Create(const Source: AnsiString); +begin + FSource := Source; +end; + +function TTntSourceFile.GetAge: TDateTime; +begin + Result := -1; +end; + +function TTntSourceFile.GetSource: AnsiString; +begin + Result := FSource; +end; + +{ TTntNewTntFormWizard } + +function TTntNewTntFormWizard.ThisFormClass: TComponentClass; +begin + Result := TTntForm; +end; + +function TTntNewTntFormWizard.GetName: AnsiString; +begin + Result := ThisFormName + ' (Unicode)' +end; + +function TTntNewTntFormWizard.GetComment: AnsiString; +begin + Result := 'Creates a new Unicode enabled TntForm'; +end; + +{ TTntNewTntFrameWizard } + +function TTntNewTntFrameWizard.ThisFormClass: TComponentClass; +begin + Result := TTntFrame; +end; + +function TTntNewTntFrameWizard.GetName: AnsiString; +begin + Result := ThisFormName + ' (Unicode)' +end; + +function TTntNewTntFrameWizard.GetComment: AnsiString; +begin + Result := 'Creates a new Unicode enabled TntFrame'; +end; + +{ TTntFrameCustomModule } + +function TTntFrameCustomModule.Nestable: Boolean; +begin + Result := True; +end; + +{ TTntFormCustomModule } + +class function TTntFormCustomModule.DesignClass: TComponentClass; +begin + Result := TTntForm; +end; + +end. diff --git a/internal/1/Design/TntMenus_Design.pas b/internal/1/Design/TntMenus_Design.pas new file mode 100644 index 0000000..5018df6 --- /dev/null +++ b/internal/1/Design/TntMenus_Design.pas @@ -0,0 +1,391 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntMenus_Design; + +{$INCLUDE ..\Source\TntCompilers.inc} + +{*******************************************************} +{ Special Thanks to Francisco Leong for getting these } +{ menu designer enhancements to work w/o MnuBuild. } +{*******************************************************} + +interface + +{$IFDEF COMPILER_6} // Delphi 6 and BCB 6 have MnuBuild available + {$DEFINE MNUBUILD_AVAILABLE} +{$ENDIF} + +{$IFDEF COMPILER_7} // Delphi 7 has MnuBuild available + {$DEFINE MNUBUILD_AVAILABLE} +{$ENDIF} + +uses + Windows, Classes, Menus, Messages, + {$IFDEF MNUBUILD_AVAILABLE} MnuBuild, {$ENDIF} + DesignEditors, DesignIntf; + +type + TTntMenuEditor = class(TComponentEditor) + public + procedure ExecuteVerb(Index: Integer); override; + function GetVerb(Index: Integer): string{TNT-ALLOW string}; override; + function GetVerbCount: Integer; override; + end; + +procedure Register; + +implementation + +uses + {$IFDEF MNUBUILD_AVAILABLE} MnuConst, {$ELSE} DesignWindows, {$ENDIF} SysUtils, Graphics, ActnList, + Controls, Forms, TntDesignEditors_Design, TntActnList, TntMenus; + +procedure Register; +begin + RegisterComponentEditor(TTntMainMenu, TTntMenuEditor); + RegisterComponentEditor(TTntPopupMenu, TTntMenuEditor); +end; + +function GetMenuBuilder: TForm{TNT-ALLOW TForm}; +{$IFDEF MNUBUILD_AVAILABLE} +begin + Result := MenuEditor; +{$ELSE} +var + Comp: TComponent; +begin + Result := nil; + if Application <> nil then + begin + Comp := Application.FindComponent('MenuBuilder'); + if Comp is TForm{TNT-ALLOW TForm} then + Result := TForm{TNT-ALLOW TForm}(Comp); + end; +{$ENDIF} +end; + +{$IFDEF DELPHI_9} // verified against Delphi 9 +type + THackMenuBuilder = class(TDesignWindow) + protected + Fields: array[1..26] of TObject; + FWorkMenu: TMenuItem{TNT-ALLOW TMenuItem}; + end; +{$ENDIF} + +{$IFDEF COMPILER_10_UP} +{$IFDEF DELPHI_10} // NOT verified against Delphi 10 +type + THackMenuBuilder = class(TDesignWindow) + protected + Fields: array[1..26] of TObject; + FWorkMenu: TMenuItem{TNT-ALLOW TMenuItem}; + end; +{$ENDIF} +{$ENDIF} + +function GetMenuBuilder_WorkMenu(MenuBuilder: TForm{TNT-ALLOW TForm}): TMenuItem{TNT-ALLOW TMenuItem}; +begin + if MenuBuilder = nil then + Result := nil + else begin + {$IFDEF MNUBUILD_AVAILABLE} + Result := MenuEditor.WorkMenu; + {$ELSE} + Result := THackMenuBuilder(MenuBuilder).FWorkMenu; + Assert((Result = nil) or (Result is TMenuItem{TNT-ALLOW TMenuItem}), + 'TNT Internal Error: THackMenuBuilder has incorrect internal layout.'); + {$ENDIF} + end; +end; + +{$IFDEF DELPHI_9} // verified against Delphi 9 +type + THackMenuItemWin = class(TCustomControl) + protected + FxxxxCaptionExtent: Integer; + FMenuItem: TMenuItem{TNT-ALLOW TMenuItem}; + end; +{$ENDIF} + +{$IFDEF DELPHI_10} // beta: NOT verified against Delphi 10 +type + THackMenuItemWin = class(TCustomControl) + protected + FxxxxCaptionExtent: Integer; + FMenuItem: TMenuItem{TNT-ALLOW TMenuItem}; + end; +{$ENDIF} + +function GetMenuItem(Control: TWinControl; DoVerify: Boolean = True): TMenuItem{TNT-ALLOW TMenuItem}; +begin + {$IFDEF MNUBUILD_AVAILABLE} + if Control is TMenuItemWin then + Result := TMenuItemWin(Control).MenuItem + {$ELSE} + if Control.ClassName = 'TMenuItemWin' then begin + Result := THackMenuItemWin(Control).FMenuItem; + Assert((Result = nil) or (Result is TMenuItem{TNT-ALLOW TMenuItem}), 'TNT Internal Error: Unexpected TMenuItem field layout.'); + end + {$ENDIF} + else if DoVerify then + raise Exception.Create('TNT Internal Error: Control is not a TMenuItemWin.') + else + Result := nil; +end; + +procedure SetMenuItem(Control: TWinControl; Item: TMenuItem{TNT-ALLOW TMenuItem}); +begin + {$IFDEF MNUBUILD_AVAILABLE} + if Control is TMenuItemWin then + TMenuItemWin(Control).MenuItem := Item + {$ELSE} + if Control.ClassName = 'TMenuItemWin' then begin + THackMenuItemWin(Control).FMenuItem := Item; + Item.FreeNotification(Control); + end + {$ENDIF} + else + raise Exception.Create('TNT Internal Error: Control is not a TMenuItemWin.'); +end; + +procedure ReplaceMenuItem(Control: TWinControl; ANewItem: TMenuItem{TNT-ALLOW TMenuItem}); +var + OldItem: TMenuItem{TNT-ALLOW TMenuItem}; + OldName: string{TNT-ALLOW string}; +begin + OldItem := GetMenuItem(Control, True); + Assert(OldItem <> nil); + OldName := OldItem.Name; + FreeAndNil(OldItem); + ANewItem.Name := OldName; { assume old name } + SetMenuItem(Control, ANewItem); +end; + +{ TTntMenuBuilderChecker } + +type + TMenuBuilderChecker = class(TComponent) + private + FMenuBuilder: TForm{TNT-ALLOW TForm}; + FCheckMenuAction: TTntAction; + FLastCaption: string{TNT-ALLOW string}; + FLastActiveControl: TControl; + FLastMenuItem: TMenuItem{TNT-ALLOW TMenuItem}; + procedure CheckMenuItems(Sender: TObject); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + end; + +var MenuBuilderChecker: TMenuBuilderChecker = nil; + +constructor TMenuBuilderChecker.Create(AOwner: TComponent); +begin + inherited; + MenuBuilderChecker := Self; + FCheckMenuAction := TTntAction.Create(Self); + FCheckMenuAction.OnUpdate := CheckMenuItems; + FCheckMenuAction.OnExecute := CheckMenuItems; + FMenuBuilder := AOwner as TForm{TNT-ALLOW TForm}; + FMenuBuilder.Action := FCheckMenuAction; +end; + +destructor TMenuBuilderChecker.Destroy; +begin + FMenuBuilder := nil; + MenuBuilderChecker := nil; + inherited; +end; + +type TAccessTntMenuItem = class(TTntMenuItem); + +function CreateTntMenuItem(OldItem: TMenuItem{TNT-ALLOW TMenuItem}): TTntMenuItem; +var + OldName: AnsiString; + OldParent: TMenuItem{TNT-ALLOW TMenuItem}; + OldIndex: Integer; + OldItemsList: TList; + j: integer; +begin + // item should be converted. + OldItemsList := TList.Create; + try + // clone properties + Result := TTntMenuItem.Create(OldItem.Owner); + TAccessTntMenuItem(Result).FComponentStyle := OldItem.ComponentStyle; {csTransient hides item from object inspector} + Result.Action := OldItem.Action; + Result.AutoCheck := OldItem.AutoCheck; + Result.AutoHotkeys := OldItem.AutoHotkeys; + Result.AutoLineReduction := OldItem.AutoLineReduction; + Result.Bitmap := OldItem.Bitmap; + Result.Break := OldItem.Break; + Result.Caption := OldItem.Caption; + Result.Checked := OldItem.Checked; + Result.Default := OldItem.Default; + Result.Enabled := OldItem.Enabled; + Result.GroupIndex := OldItem.GroupIndex; + Result.HelpContext := OldItem.HelpContext; + Result.Hint := OldItem.Hint; + Result.ImageIndex := OldItem.ImageIndex; + Result.MenuIndex := OldItem.MenuIndex; + Result.RadioItem := OldItem.RadioItem; + Result.ShortCut := OldItem.ShortCut; + Result.SubMenuImages := OldItem.SubMenuImages; + Result.Visible := OldItem.Visible; + Result.Tag := OldItem.Tag; + + // clone events + Result.OnAdvancedDrawItem := OldItem.OnAdvancedDrawItem; + Result.OnClick := OldItem.OnClick; + Result.OnDrawItem := OldItem.OnDrawItem; + Result.OnMeasureItem := OldItem.OnMeasureItem; + + // remember name, parent, index, children + OldName := OldItem.Name; + OldParent := OldItem.Parent; + OldIndex := OldItem.MenuIndex; + for j := OldItem.Count - 1 downto 0 do begin + OldItemsList.Insert(0, OldItem.Items[j]); + OldItem.Remove(OldItem.Items[j]); + end; + + // clone final parts of old item + for j := 0 to OldItemsList.Count - 1 do + Result.Add(TMenuItem{TNT-ALLOW TMenuItem}(OldItemsList[j])); { add children } + if OldParent <> nil then + OldParent.Insert(OldIndex, Result); { insert into parent } + finally + OldItemsList.Free; + end; +end; + +procedure CheckMenuItemWin(MenuItemWin: TWinControl; PartOfATntMenu: Boolean); +var + OldItem: TMenuItem{TNT-ALLOW TMenuItem}; +begin + OldItem := GetMenuItem(MenuItemWin); + if OldItem = nil then + exit; + if (OldItem.ClassType = TMenuItem{TNT-ALLOW TMenuItem}) + and (PartOfATntMenu or (OldItem.Parent is TTntMenuItem)) then + begin + if MenuItemWin.Focused then + MenuItemWin.Parent.SetFocus; {Lose focus and regain later to ensure object inspector gets updated.} + ReplaceMenuItem(MenuItemWin, CreateTntMenuItem(OldItem)); + end else if (OldItem.ClassType = TTntMenuItem) + and (OldItem.Parent = nil) and (OldItem.Caption = '') and (OldItem.Name = '') + and not (PartOfATntMenu or (OldItem.Parent is TTntMenuItem)) then begin + if MenuItemWin.Focused then + MenuItemWin.Parent.SetFocus; {Lose focus and regain later to ensure object inspector gets updated.} + ReplaceMenuItem(MenuItemWin, TMenuItem{TNT-ALLOW TMenuItem}.Create(OldItem.Owner)); + end; +end; + +procedure TMenuBuilderChecker.CheckMenuItems(Sender: TObject); +var + a, i: integer; + MenuWin: TWinControl; + MenuItemWin: TWinControl; + SaveFocus: HWND; + PartOfATntMenu: Boolean; + WorkMenu: TMenuItem{TNT-ALLOW TMenuItem}; +begin + if (FMenuBuilder <> nil) + and (FMenuBuilder.Action = FCheckMenuAction) then begin + if (FLastCaption <> FMenuBuilder.Caption) + or (FLastActiveControl <> FMenuBuilder.ActiveControl) + or (FLastMenuItem <> GetMenuItem(FMenuBuilder.ActiveControl, False)) + then begin + try + try + with FMenuBuilder do begin + WorkMenu := GetMenuBuilder_WorkMenu(FMenuBuilder); + PartOfATntMenu := (WorkMenu <> nil) + and ((WorkMenu.Owner is TTntMainMenu) or (WorkMenu.Owner is TTntPopupMenu)); + SaveFocus := Windows.GetFocus; + for a := ComponentCount - 1 downto 0 do begin + {$IFDEF MNUBUILD_AVAILABLE} + if Components[a] is TMenuWin then begin + {$ELSE} + if Components[a].ClassName = 'TMenuWin' then begin + {$ENDIF} + MenuWin := Components[a] as TWinControl; + with MenuWin do begin + for i := ComponentCount - 1 downto 0 do begin + {$IFDEF MNUBUILD_AVAILABLE} + if Components[i] is TMenuItemWin then begin + {$ELSE} + if Components[i].ClassName = 'TMenuItemWin' then begin + {$ENDIF} + MenuItemWin := Components[i] as TWinControl; + CheckMenuItemWin(MenuItemWin, PartOfATntMenu); + end; + end; + end; + end; + end; + if SaveFocus <> Windows.GetFocus then + Windows.SetFocus(SaveFocus); + end; + except + on E: Exception do begin + FMenuBuilder.Action := nil; + end; + end; + finally + FLastCaption := FMenuBuilder.Caption; + FLastActiveControl := FMenuBuilder.ActiveControl; + FLastMenuItem := GetMenuItem(FMenuBuilder.ActiveControl, False); + end; + end; + end; +end; + +{ TTntMenuEditor } + +function TTntMenuEditor.GetVerbCount: Integer; +begin + Result := 1; +end; + +{$IFNDEF MNUBUILD_AVAILABLE} +resourcestring + SMenuDesigner = 'Menu Designer...'; +{$ENDIF} + +function TTntMenuEditor.GetVerb(Index: Integer): string{TNT-ALLOW string}; +begin + Result := SMenuDesigner; +end; + +procedure TTntMenuEditor.ExecuteVerb(Index: Integer); +var + MenuBuilder: TForm{TNT-ALLOW TForm}; +begin + EditPropertyWithDialog(Component, 'Items', Designer); + MenuBuilder := GetMenuBuilder; + if Assigned(MenuBuilder) then begin + if (MenuBuilderChecker = nil) or (MenuBuilderChecker.FMenuBuilder <> MenuBuilder) then begin + MenuBuilderChecker.Free; + MenuBuilderChecker := TMenuBuilderChecker.Create(MenuBuilder); + end; + EditPropertyWithDialog(Component, 'Items', Designer); // update menu builder caption + end; +end; + +initialization + +finalization + MenuBuilderChecker.Free; // design package might be recompiled + +end. diff --git a/internal/1/Design/TntStrEdit_Design.dfm b/internal/1/Design/TntStrEdit_Design.dfm new file mode 100644 index 0000000..283cf15 --- /dev/null +++ b/internal/1/Design/TntStrEdit_Design.dfm @@ -0,0 +1,135 @@ +object TntStrEditDlg: TTntStrEditDlg + Left = 267 + Top = 258 + BorderStyle = bsDialog + Caption = 'Wide String List Editor' + ClientHeight = 279 + ClientWidth = 430 + Color = clBtnFace + ParentFont = True + OldCreateOrder = True + PopupMenu = StringEditorMenu + Position = poScreenCenter + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object TntGroupBox1: TTntGroupBox + Left = 8 + Top = 3 + Width = 413 + Height = 234 + TabOrder = 4 + object LineCount: TTntLabel + Left = 9 + Top = 9 + Width = 169 + Height = 17 + AutoSize = False + Caption = '0 lines' + end + object UnicodeEnabledLbl: TTntLabel + Left = 325 + Top = 9 + Width = 79 + Height = 13 + Alignment = taRightJustify + Caption = 'Unicode Enabled' + Font.Charset = DEFAULT_CHARSET + Font.Color = clGreen + Font.Height = -11 + Font.Name = 'MS Shell Dlg 2' + Font.Style = [] + ParentFont = False + Visible = False + end + object Memo: TTntMemo + Left = 8 + Top = 28 + Width = 397 + Height = 197 + ScrollBars = ssBoth + TabOrder = 0 + WordWrap = False + OnChange = UpdateStatus + OnKeyDown = Memo1KeyDown + end + end + object CodeWndBtn: TTntButton + Left = 8 + Top = 248 + Width = 75 + Height = 25 + Caption = '&Code Editor...' + Enabled = False + TabOrder = 0 + OnClick = CodeWndBtnClick + end + object HelpButton: TTntButton + Left = 345 + Top = 248 + Width = 75 + Height = 25 + Caption = '&Help' + TabOrder = 3 + OnClick = HelpButtonClick + end + object OKButton: TTntButton + Left = 185 + Top = 248 + Width = 75 + Height = 25 + Caption = '&OK' + Default = True + ModalResult = 1 + TabOrder = 1 + end + object CancelButton: TTntButton + Left = 265 + Top = 248 + Width = 75 + Height = 25 + Cancel = True + Caption = 'Cancel' + ModalResult = 2 + TabOrder = 2 + end + object OpenDialog: TTntOpenDialog + HelpContext = 26040 + DefaultExt = 'TXT' + Filter = + 'Text files (*.TXT)|*.TXT|Config files (*.SYS;*.INI)|*.SYS;*.INI|' + + 'Batch files (*.BAT)|*.BAT|All files (*.*)|*.*' + Options = [ofHideReadOnly, ofShowHelp, ofPathMustExist, ofFileMustExist, ofEnableSizing] + Title = 'Load string list' + Left = 200 + Top = 88 + end + object SaveDialog: TTntSaveDialog + HelpContext = 26050 + Filter = + 'Text files (*.TXT)|*.TXT|Config files (*.SYS;*.INI)|*.SYS;*.INI|' + + 'Batch files (*.BAT)|*.BAT|All files (*.*)|*.*' + Options = [ofOverwritePrompt, ofHideReadOnly, ofShowHelp, ofPathMustExist, ofEnableSizing] + Title = 'Save string list' + Left = 228 + Top = 88 + end + object StringEditorMenu: TTntPopupMenu + Left = 168 + Top = 88 + object LoadItem: TTntMenuItem + Caption = '&Load...' + OnClick = FileOpenClick + end + object SaveItem: TTntMenuItem + Caption = '&Save...' + OnClick = FileSaveClick + end + object CodeEditorItem: TTntMenuItem + Caption = '&Code Editor...' + Enabled = False + Visible = False + OnClick = CodeWndBtnClick + end + end +end diff --git a/internal/1/Design/TntStrEdit_Design.pas b/internal/1/Design/TntStrEdit_Design.pas new file mode 100644 index 0000000..5e17b44 --- /dev/null +++ b/internal/1/Design/TntStrEdit_Design.pas @@ -0,0 +1,419 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntStrEdit_Design; + +{$INCLUDE ..\Source\TntCompilers.inc} + +// The following unit is adapted from StrEdit.pas. + +interface + +uses + Windows, Classes, Graphics, Controls, Buttons, Menus, StdCtrls, + TntStdCtrls, ExtCtrls, DesignEditors, DesignIntf, + TntForms, TntMenus, TntClasses, TntDialogs; + +type + TTntStrEditDlg = class(TTntForm) + CodeWndBtn: TTntButton; + OpenDialog: TTntOpenDialog; + SaveDialog: TTntSaveDialog; + HelpButton: TTntButton; + OKButton: TTntButton; + CancelButton: TTntButton; + StringEditorMenu: TTntPopupMenu; + LoadItem: TTntMenuItem; + SaveItem: TTntMenuItem; + CodeEditorItem: TTntMenuItem; + TntGroupBox1: TTntGroupBox; + UnicodeEnabledLbl: TTntLabel; + Memo: TTntMemo; + LineCount: TTntLabel; + procedure FileOpenClick(Sender: TObject); + procedure FileSaveClick(Sender: TObject); + procedure HelpButtonClick(Sender: TObject); + procedure CodeWndBtnClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); + procedure UpdateStatus(Sender: TObject); + private + SingleLine: WideString; + MultipleLines: WideString; + protected + FModified: Boolean; + function GetLines: TTntStrings; + procedure SetLines(const Value: TTntStrings); + function GetLinesControl: TWinControl; + public + property Lines: TTntStrings read GetLines write SetLines; + procedure PrepareForWideStringEdit; + end; + +type + TWideStringListProperty = class(TClassProperty) + protected + function EditDialog: TTntStrEditDlg; virtual; + function GetStrings: TTntStrings; virtual; + procedure SetStrings(const Value: TTntStrings); virtual; + public + function GetAttributes: TPropertyAttributes; override; + procedure Edit; override; + end; + +procedure Register; + +implementation + +{$R *.dfm} + +uses + ActiveX, Forms, SysUtils, DesignConst, ToolsAPI, IStreams, LibHelp, + StFilSys, TypInfo, TntSystem, TntDesignEditors_Design; + +procedure Register; +begin + RegisterPropertyEditor(TypeInfo(TTntStrings), nil, '', TWideStringListProperty); +end; + +{$IFDEF COMPILER_10_UP} +type + TStringsModuleCreator = class(TInterfacedObject, IOTACreator, IOTAModuleCreator) + private + FFileName: AnsiString; + FStream: TStringStream{TNT-ALLOW TStringStream}; + FAge: TDateTime; + public + constructor Create(const FileName: AnsiString; Stream: TStringStream{TNT-ALLOW TStringStream}; Age: TDateTime); + destructor Destroy; override; + { IOTACreator } + function GetCreatorType: AnsiString; + function GetExisting: Boolean; + function GetFileSystem: AnsiString; + function GetOwner: IOTAModule; + function GetUnnamed: Boolean; + { IOTAModuleCreator } + function GetAncestorName: AnsiString; + function GetImplFileName: AnsiString; + function GetIntfFileName: AnsiString; + function GetFormName: AnsiString; + function GetMainForm: Boolean; + function GetShowForm: Boolean; + function GetShowSource: Boolean; + function NewFormFile(const FormIdent, AncestorIdent: AnsiString): IOTAFile; + function NewImplSource(const ModuleIdent, FormIdent, AncestorIdent: AnsiString): IOTAFile; + function NewIntfSource(const ModuleIdent, FormIdent, AncestorIdent: AnsiString): IOTAFile; + procedure FormCreated(const FormEditor: IOTAFormEditor); + end; + + TOTAFile = class(TInterfacedObject, IOTAFile) + private + FSource: AnsiString; + FAge: TDateTime; + public + constructor Create(const ASource: AnsiString; AAge: TDateTime); + { IOTAFile } + function GetSource: AnsiString; + function GetAge: TDateTime; + end; + +{ TOTAFile } + +constructor TOTAFile.Create(const ASource: AnsiString; AAge: TDateTime); +begin + inherited Create; + FSource := ASource; + FAge := AAge; +end; + +function TOTAFile.GetAge: TDateTime; +begin + Result := FAge; +end; + +function TOTAFile.GetSource: AnsiString; +begin + Result := FSource; +end; + +{ TStringsModuleCreator } + +constructor TStringsModuleCreator.Create(const FileName: AnsiString; Stream: TStringStream{TNT-ALLOW TStringStream}; + Age: TDateTime); +begin + inherited Create; + FFileName := FileName; + FStream := Stream; + FAge := Age; +end; + +destructor TStringsModuleCreator.Destroy; +begin + FStream.Free; + inherited; +end; + +procedure TStringsModuleCreator.FormCreated(const FormEditor: IOTAFormEditor); +begin + { Nothing to do } +end; + +function TStringsModuleCreator.GetAncestorName: AnsiString; +begin + Result := ''; +end; + +function TStringsModuleCreator.GetCreatorType: AnsiString; +begin + Result := sText; +end; + +function TStringsModuleCreator.GetExisting: Boolean; +begin + Result := True; +end; + +function TStringsModuleCreator.GetFileSystem: AnsiString; +begin + Result := sTStringsFileSystem; +end; + +function TStringsModuleCreator.GetFormName: AnsiString; +begin + Result := ''; +end; + +function TStringsModuleCreator.GetImplFileName: AnsiString; +begin + Result := FFileName; +end; + +function TStringsModuleCreator.GetIntfFileName: AnsiString; +begin + Result := ''; +end; + +function TStringsModuleCreator.GetMainForm: Boolean; +begin + Result := False; +end; + +function TStringsModuleCreator.GetOwner: IOTAModule; +begin + Result := nil; +end; + +function TStringsModuleCreator.GetShowForm: Boolean; +begin + Result := False; +end; + +function TStringsModuleCreator.GetShowSource: Boolean; +begin + Result := True; +end; + +function TStringsModuleCreator.GetUnnamed: Boolean; +begin + Result := False; +end; + +function TStringsModuleCreator.NewFormFile(const FormIdent, + AncestorIdent: AnsiString): IOTAFile; +begin + Result := nil; +end; + +function TStringsModuleCreator.NewImplSource(const ModuleIdent, FormIdent, + AncestorIdent: AnsiString): IOTAFile; +begin + Result := TOTAFile.Create(FStream.DataString, FAge); +end; + +function TStringsModuleCreator.NewIntfSource(const ModuleIdent, FormIdent, + AncestorIdent: AnsiString): IOTAFile; +begin + Result := nil; +end; +{$ENDIF} + +{ TTntStrEditDlg } + +procedure TTntStrEditDlg.FormCreate(Sender: TObject); +begin + HelpContext := hcDStringListEditor; + OpenDialog.HelpContext := hcDStringListLoad; + SaveDialog.HelpContext := hcDStringListSave; + SingleLine := srLine; + MultipleLines := srLines; + UnicodeEnabledLbl.Visible := IsWindowUnicode(Memo.Handle); +end; + +procedure TTntStrEditDlg.PrepareForWideStringEdit; +begin + Caption := 'WideString Editor'; + CodeWndBtn.Visible := False; + CodeEditorItem.Visible := False; +end; + +procedure TTntStrEditDlg.FileOpenClick(Sender: TObject); +begin + with OpenDialog do + if Execute then Lines.LoadFromFile(FileName); +end; + +procedure TTntStrEditDlg.FileSaveClick(Sender: TObject); +begin + SaveDialog.FileName := OpenDialog.FileName; + with SaveDialog do + if Execute then Lines.SaveToFile(FileName); +end; + +procedure TTntStrEditDlg.HelpButtonClick(Sender: TObject); +begin + Application.HelpContext(HelpContext); +end; + +procedure TTntStrEditDlg.CodeWndBtnClick(Sender: TObject); +begin + ModalResult := mrYes; +end; + +function TTntStrEditDlg.GetLinesControl: TWinControl; +begin + Result := Memo; +end; + +procedure TTntStrEditDlg.Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); +begin + if Key = VK_ESCAPE then CancelButton.Click; +end; + +procedure TTntStrEditDlg.UpdateStatus(Sender: TObject); +var + Count: Integer; + LineText: WideString; +begin + if Sender = Memo then FModified := True; + Count := Lines.Count; + if Count = 1 then LineText := SingleLine + else LineText := MultipleLines; + LineCount.Caption := WideFormat('%d %s', [Count, LineText]); +end; + +function TTntStrEditDlg.GetLines: TTntStrings; +begin + Result := Memo.Lines; +end; + +procedure TTntStrEditDlg.SetLines(const Value: TTntStrings); +begin + Memo.Lines.Assign(Value); +end; + +{ TWideStringListProperty } + +function TWideStringListProperty.EditDialog: TTntStrEditDlg; +begin + Result := TTntStrEditDlg.Create(Application); +end; + +function TWideStringListProperty.GetAttributes: TPropertyAttributes; +begin + Result := inherited GetAttributes + [paDialog] - [paSubProperties]; +end; + +function TWideStringListProperty.GetStrings: TTntStrings; +begin + Result := TTntStrings(GetOrdValue); +end; + +procedure TWideStringListProperty.SetStrings(const Value: TTntStrings); +begin + SetOrdValue(Longint(Value)); +end; + +procedure TWideStringListProperty.Edit; +{$IFDEF COMPILER_10_UP} +const + DotSep = '.'; // Temp fix for opening the strings in the editor. +var + Ident: AnsiString; + Component: TComponent; + Module: IOTAModule; + Editor: IOTAEditor; + ModuleServices: IOTAModuleServices; + Stream: TStringStream{TNT-ALLOW TStringStream}; + Age: TDateTime; +{$ENDIF} +begin + {$IFDEF COMPILER_10_UP} + Component := TComponent(GetComponent(0)); + ModuleServices := BorlandIDEServices as IOTAModuleServices; + if (TObject(Component) is TComponent) + and (Component.Owner = Self.Designer.GetRoot) + and (Self.Designer.GetRoot.Name <> '') + then begin + Ident := Self.Designer.GetRoot.Name + DotSep + + Component.Name + DotSep + GetName; + Ident := Self.Designer.GetDesignerExtension + DotSep + Ident; + Module := ModuleServices.FindModule(Ident); + end else begin + Ident := ''; + Module := nil; + end; + if (Module <> nil) and (Module.GetModuleFileCount > 0) then + Module.GetModuleFileEditor(0).Show + else + {$ENDIF} + with EditDialog do + try + if GetObjectInspectorForm <> nil then + Font.Assign(GetObjectInspectorForm.Font); + Lines := GetStrings; + UpdateStatus(nil); + FModified := False; + ActiveControl := GetLinesControl; + {$IFDEF COMPILER_10_UP} + CodeEditorItem.Enabled := Ident <> ''; + CodeWndBtn.Enabled := Ident <> ''; + {$ENDIF} + case ShowModal of + mrOk: SetStrings(Lines); + {$IFDEF COMPILER_10_UP} + mrYes: + begin + // this used to be done in LibMain's TLibrary.Create but now its done here + // the unregister is done over in ComponentDesigner's finalization + //StFilSys.Register; + Stream := TStringStream{TNT-ALLOW TStringStream}.Create(WideStringToUTF8(Lines.Text)); + Stream.Position := 0; + Age := Now; + Module := ModuleServices.CreateModule( + TStringsModuleCreator.Create(Ident, Stream, Age)); + if Module <> nil then + begin + with StringsFileSystem.GetTStringsProperty(Ident, Component, GetName) do + DiskAge := DateTimeToFileDate(Age); + Editor := Module.GetModuleFileEditor(0); + if FModified then + Editor.MarkModified; + Editor.Show; + end; + end; + {$ENDIF} + end; + finally + Free; + end; +end; + +end. diff --git a/internal/1/Design/TntUnicodeVcl_Register.pas b/internal/1/Design/TntUnicodeVcl_Register.pas new file mode 100644 index 0000000..210a172 --- /dev/null +++ b/internal/1/Design/TntUnicodeVcl_Register.pas @@ -0,0 +1,132 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntUnicodeVcl_Register; + +{$INCLUDE ..\Source\TntCompilers.inc} + +interface + +{ TODO: Install program (handle Std, Prof, Ent versions) (ie. no database stuff for personal edition) } +{ TODO: $IFDEF DelphiPersonalEdition } + +procedure Register; + +implementation + +uses + Classes, DB, TntForms, TntMenus, TntStdCtrls, TntCheckLst, TntGrids, TntExtCtrls, TntComCtrls, + TntButtons, TntDB, TntDBCtrls, TntDBGrids, TntActnList, TntDialogs, TntExtDlgs, DesignIntf; + +const + TNT_STANDARD = 'Tnt Standard'; + TNT_ADDITIONAL = 'Tnt Additional'; + TNT_WIN32 = 'Tnt Win32'; + TNT_DATA_CONTROLS = 'Tnt Data Controls'; + TNT_DIALOGS = 'Tnt Dialogs'; + +procedure Register; +begin + {$IFDEF COMPILER_9_UP} + // ForceDemandLoadState(dlDisable); + {$ENDIF} + + // ------- Standard ------- + RegisterComponents(TNT_STANDARD, [TTntMainMenu]); + RegisterComponents(TNT_STANDARD, [TTntPopupMenu]); + RegisterComponents(TNT_STANDARD, [TTntLabel]); + RegisterComponents(TNT_STANDARD, [TTntEdit]); + RegisterComponents(TNT_STANDARD, [TTntMemo]); + RegisterComponents(TNT_STANDARD, [TTntButton]); + RegisterComponents(TNT_STANDARD, [TTntCheckBox]); + RegisterComponents(TNT_STANDARD, [TTntRadioButton]); + RegisterComponents(TNT_STANDARD, [TTntListBox]); + RegisterComponents(TNT_STANDARD, [TTntComboBox]); + RegisterComponents(TNT_STANDARD, [TTntScrollBar]); + RegisterComponents(TNT_STANDARD, [TTntGroupBox]); + RegisterComponents(TNT_STANDARD, [TTntRadioGroup]); + RegisterComponents(TNT_STANDARD, [TTntPanel]); + RegisterComponents(TNT_STANDARD, [TTntActionList]); + + // ------- Additional ------- + RegisterComponents(TNT_ADDITIONAL, [TTntBitBtn]); + RegisterComponents(TNT_ADDITIONAL, [TTntSpeedButton]); + { -- TTntMaskEdit goes here -- } + RegisterComponents(TNT_ADDITIONAL, [TTntStringGrid]); + RegisterComponents(TNT_ADDITIONAL, [TTntDrawGrid]); + RegisterComponents(TNT_ADDITIONAL, [TTntImage]); + RegisterComponents(TNT_ADDITIONAL, [TTntShape]); + RegisterComponents(TNT_ADDITIONAL, [TTntBevel]); + RegisterComponents(TNT_ADDITIONAL, [TTntScrollBox]); + RegisterComponents(TNT_ADDITIONAL, [TTntCheckListBox]); + RegisterComponents(TNT_ADDITIONAL, [TTntSplitter]); + RegisterComponents(TNT_ADDITIONAL, [TTntStaticText]); + RegisterComponents(TNT_ADDITIONAL, [TTntControlBar]); + + // ------- Win32 ------- + RegisterComponents(TNT_WIN32, [TTntTabControl]); + RegisterComponents(TNT_WIN32, [TTntPageControl]); + RegisterComponents(TNT_WIN32, [TTntRichEdit]); + RegisterComponents(TNT_WIN32, [TTntTrackBar]); + RegisterComponents(TNT_WIN32, [TTntProgressBar]); + RegisterComponents(TNT_WIN32, [TTntUpDown]); + { -- TTntHotKey goes here -- } + { -- TTntAnimate goes here -- } + RegisterComponents(TNT_WIN32, [TTntDateTimePicker]); + RegisterComponents(TNT_WIN32, [TTntMonthCalendar]); + RegisterComponents(TNT_WIN32, [TTntTreeView]); + RegisterComponents(TNT_WIN32, [TTntListView]); + { -- TTntHeader goes here -- } + RegisterComponents(TNT_WIN32, [TTntStatusBar]); + RegisterComponents(TNT_WIN32, [TTntToolBar]); + { -- TTntCoolBar goes here -- } + RegisterComponents(TNT_WIN32, [TTntPageScroller]); + { -- TTntComboBoxEx goes here -- } + + // ------- System ------- + RegisterComponents(TNT_ADDITIONAL, [TTntPaintBox]); + { -- TTntMediaPlayer goes here -- } + { -- TTntOleContainer goes here -- } + + // ------- Data Controls ------- + RegisterComponents(TNT_DATA_CONTROLS, [TTntDBGrid]); + { -- TTntDBNavigator goes here -- } + RegisterComponents(TNT_DATA_CONTROLS, [TTntDBText]); + RegisterComponents(TNT_DATA_CONTROLS, [TTntDBEdit]); + RegisterComponents(TNT_DATA_CONTROLS, [TTntDBMemo]); + { -- TTntDBImage goes here -- } + { -- TTntDBListBox goes here -- } + RegisterComponents(TNT_DATA_CONTROLS, [TTntDBComboBox]); + RegisterComponents(TNT_DATA_CONTROLS, [TTntDBCheckBox]); + RegisterComponents(TNT_DATA_CONTROLS, [TTntDBRadioGroup]); + { -- TTntDBLookupListBox goes here -- } + { -- TTntDBLookupComboBox goes here -- } + RegisterComponents(TNT_DATA_CONTROLS, [TTntDBRichEdit]); + { -- TTntDBCtrlGrid here -- } + { -- TTntDBLookupListBox goes here -- } + { -- TTntDBChart goes here -- } + + // ------- Dialogs ------- + RegisterComponents(TNT_DIALOGS, [TTntOpenDialog]); + RegisterComponents(TNT_DIALOGS, [TTntSaveDialog]); + RegisterComponents(TNT_DIALOGS, [TTntOpenPictureDialog]); + RegisterComponents(TNT_DIALOGS, [TTntSavePictureDialog]); + + // --------- Fields -------------- + RegisterTntFields; + + // --------- Classes -------------- + RegisterClass(TTntMenuItem); + RegisterClass(TTntTabSheet); + RegisterClass(TTntToolButton); +end; + +end. diff --git a/internal/1/Design/TntWideStringProperty_Design.pas b/internal/1/Design/TntWideStringProperty_Design.pas new file mode 100644 index 0000000..79ca022 --- /dev/null +++ b/internal/1/Design/TntWideStringProperty_Design.pas @@ -0,0 +1,400 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntWideStringProperty_Design; + +{$INCLUDE ..\Source\TntCompilers.inc} + +interface + +{*****************************************************} +{ TWideCharProperty-editor implemented by Maël Hörz } +{*****************************************************} + +{$IFDEF COMPILER_9_UP} + {$MESSAGE FATAL 'The Object Inspector in Delphi 9 is already Unicode enabled.'} +{$ENDIF} + +uses + Classes, Messages, Windows, Graphics, TypInfo, TntDesignEditors_Design, + DesignIntf, DesignEditors, VCLEditors; + +type + TWideStringProperty = class(TPropertyEditor, ICustomPropertyDrawing) + private + FActivateWithoutGetValue: Boolean; + FPropList: PInstPropList; + protected + procedure SetPropEntry(Index: Integer; AInstance: TPersistent; APropInfo: PPropInfo); override; + function GetWideStrValueAt(Index: Integer): WideString; dynamic; + function GetWideStrValue: WideString; + procedure SetWideStrValue(const Value: WideString); dynamic; + function GetWideVisualValue: WideString; + public + constructor Create(const ADesigner: ITntDesigner; APropCount: Integer); override; + destructor Destroy; override; + procedure Activate; override; + procedure PropDrawName(ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean); + procedure PropDrawValue(ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean); + function AllEqual: Boolean; override; + function GetEditLimit: Integer; override; + function GetValue: AnsiString; override; + procedure SetValue(const Value: AnsiString); override; + {$IFDEF MULTI_LINE_STRING_EDITOR} + function GetAttributes: TPropertyAttributes; override; + procedure Edit; override; + {$ENDIF} + end; + + TWideCaptionProperty = class(TWideStringProperty) + public + function GetAttributes: TPropertyAttributes; override; + end; + + TWideCharProperty = class(TWideStringProperty) + protected + {$IFDEF COMPILER_7_UP} + function GetIsDefault: Boolean; override; + {$ENDIF} + function GetWideStrValueAt(Index: Integer): WideString; override; + procedure SetWideStrValue(const Value: WideString); override; + public + function GetAttributes: TPropertyAttributes; override; + function GetEditLimit: Integer; override; + end; + +procedure Register; + +implementation + +uses + Controls, Forms, SysUtils, StdCtrls, TntGraphics, TntControls, + TntSysUtils, TntSystem, Consts, + RTLConsts; + +procedure Register; +begin + RegisterPropertyEditor(TypeInfo(WideString), nil, '', TWideStringProperty); + RegisterPropertyEditor(TypeInfo(TWideCaption), nil, '', TWideCaptionProperty); + RegisterPropertyEditor(TypeInfo(WideChar), nil, '', TWideCharProperty); +end; + +function GetOIInspListBox: TWinControl; +var + ObjectInspectorForm: TCustomForm; + Comp: TComponent; +begin + Result := nil; + ObjectInspectorForm := GetObjectInspectorForm; + if ObjectInspectorForm <> nil then begin + Comp := ObjectInspectorForm.FindComponent('PropList'); + if Comp is TWinControl then + Result := TWinControl(Comp); + end; +end; + +function GetOIPropInspEdit: TCustomEdit{TNT-ALLOW TCustomEdit}; +var + OIInspListBox: TWinControl; + Comp: TComponent; +begin + Result := nil; + OIInspListBox := GetOIInspListBox; + if OIInspListBox <> nil then begin + Comp := OIInspListBox.FindComponent('EditControl'); + if Comp is TCustomEdit{TNT-ALLOW TCustomEdit} then + Result := TCustomEdit{TNT-ALLOW TCustomEdit}(Comp); + end; +end; +//------------------------------ + +type TAccessWinControl = class(TWinControl); + +{ TWideStringProperty } + +var + WideStringPropertyCount: Integer = 0; + +constructor TWideStringProperty.Create(const ADesigner: ITntDesigner; APropCount: Integer); +begin + inherited; + Inc(WideStringPropertyCount); + GetMem(FPropList, APropCount * SizeOf(TInstProp)); +end; + +procedure ConvertObjectInspectorBackToANSI; +var + Edit: TCustomEdit{TNT-ALLOW TCustomEdit}; +begin + if (Win32PlatformIsUnicode) then begin + Edit := GetOIPropInspEdit; + if Assigned(Edit) + and IsWindowUnicode(Edit.Handle) then + TAccessWinControl(Edit).RecreateWnd; + end; +end; + +destructor TWideStringProperty.Destroy; +begin + Dec(WideStringPropertyCount); + if (WideStringPropertyCount = 0) then + ConvertObjectInspectorBackToANSI; + if FPropList <> nil then + FreeMem(FPropList, PropCount * SizeOf(TInstProp)); + inherited; +end; + +{$IFDEF DELPHI_7} // verified against VCL source in Delphi 7 +type + THackPropertyEditor = class + FDesigner: IDesigner; + FPropList: PInstPropList; + end; +{$ENDIF} + +procedure TWideStringProperty.Activate; +var + Edit: TCustomEdit{TNT-ALLOW TCustomEdit}; +begin + FActivateWithoutGetValue := True; + if (Win32PlatformIsUnicode) then begin + Edit := GetOIPropInspEdit; + if Assigned(Edit) + and (not IsWindowUnicode(Edit.Handle)) then + ReCreateUnicodeWnd(Edit, 'EDIT', True); + end; +end; + +procedure TWideStringProperty.SetPropEntry(Index: Integer; + AInstance: TPersistent; APropInfo: PPropInfo); +begin + inherited; + with FPropList^[Index] do + begin + Instance := AInstance; + PropInfo := APropInfo; + end; +end; + +function TWideStringProperty.GetWideStrValueAt(Index: Integer): WideString; +begin + with FPropList^[Index] do Result := GetWideStrProp(Instance, PropInfo); +end; + +function TWideStringProperty.GetWideStrValue: WideString; +begin + Result := GetWideStrValueAt(0); +end; + +procedure TWideStringProperty.SetWideStrValue(const Value: WideString); +var + I: Integer; +begin + for I := 0 to PropCount - 1 do + with FPropList^[I] do SetWideStrProp(Instance, PropInfo, Value); + Modified; +end; + +function TWideStringProperty.GetWideVisualValue: WideString; +begin + if AllEqual then + Result := GetWideStrValue + else + Result := ''; +end; + +procedure TWideStringProperty.PropDrawName(ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean); +begin + DefaultPropertyDrawName(Self, ACanvas, ARect); +end; + +procedure TWideStringProperty.PropDrawValue(ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean); +begin + WideCanvasTextRect(ACanvas, ARect, ARect.Left + 1, ARect.Top + 1, GetWideVisualValue); +end; + +function TWideStringProperty.AllEqual: Boolean; +var + I: Integer; + V: WideString; +begin + Result := False; + if PropCount > 1 then + begin + V := GetWideStrValue; + for I := 1 to PropCount - 1 do + if GetWideStrValueAt(I) <> V then Exit; + end; + Result := True; +end; + +function TWideStringProperty.GetEditLimit: Integer; +var + Edit: TCustomEdit{TNT-ALLOW TCustomEdit}; +begin + Result := MaxInt; + // GetEditLimit is called right before the inplace editor text has been set + if Win32PlatformIsUnicode then begin + Edit := GetOIPropInspEdit; + if Assigned(Edit) then begin + TntControl_SetText(Edit, GetWideStrValue); + TntControl_SetHint(Edit, GetWideStrValue); + end; + end; +end; + +function TWideStringProperty.GetValue: AnsiString; +begin + FActivateWithoutGetValue := False; + Result := WideStringToStringEx(GetWideStrValue, CP_ACP{TNT-ALLOW CP_ACP}); // use the same code page as the inplace editor +end; + +procedure TWideStringProperty.SetValue(const Value: AnsiString); +var + Edit: TCustomEdit{TNT-ALLOW TCustomEdit}; +begin + if (not FActivateWithoutGetValue) then begin + Edit := GetOIPropInspEdit; + if Assigned(Edit) and Win32PlatformIsUnicode then + SetWideStrValue(TntControl_GetText(Edit)) + else + SetWideStrValue(StringToWideStringEx(Value, CP_ACP{TNT-ALLOW CP_ACP})); // use the same code page as the inplace editor + end; +end; + +{$IFDEF MULTI_LINE_STRING_EDITOR} +function TWideStringProperty.GetAttributes: TPropertyAttributes; +begin + Result := inherited GetAttributes + [paDialog]; +end; + +procedure TWideStringProperty.Edit; +var + Temp: WideString; +begin + with TTntStrEditDlg.Create(Application) do + try + PrepareForWideStringEdit; + Memo.Text := GetWideStrValue; + UpdateStatus(nil); + if ShowModal = mrOk then begin + Temp := Memo.Text; + while (Length(Temp) > 0) and (Temp[Length(Temp)] < ' ') do + System.Delete(Temp, Length(Temp), 1); { trim control characters from end } + SetWideStrValue(Temp); + end; + finally + Free; + end; +end; +{$ENDIF} + +{ TWideCaptionProperty } + +function TWideCaptionProperty.GetAttributes: TPropertyAttributes; +begin + Result := inherited GetAttributes + [paAutoUpdate]; +end; + +{ TWideCharProperty } + +function TWideCharProperty.GetAttributes: TPropertyAttributes; +begin + Result := [paMultiSelect, paRevertable]; +end; + +function TWideCharProperty.GetEditLimit: Integer; +begin + inherited GetEditLimit; + Result := 63; +end; + +{$IFDEF COMPILER_7_UP} +function TWideCharProperty.GetIsDefault: Boolean; +var + i: Integer; + OldPropList: PInstPropList; +begin + Result := True; + if PropCount > 0 then + begin + OldPropList := THackPropertyEditor(Self).FPropList; + // The memory FPropList points to is write-protected. + // In the constructor we dynamically allocated our own PropList, + // which can be written, so point there instead. + THackPropertyEditor(Self).FPropList := FPropList; + + // Delphi can't handle WideChar-type, but does well with Word-type, + // which has exactly the same size as WideChar (i.e. 2 Bytes) + for i := 0 to PropCount - 1 do + FPropList^[i].PropInfo^.PropType^ := TypeInfo(Word); + + Result := inherited GetIsDefault; + + for i := 0 to PropCount - 1 do + FPropList^[i].PropInfo^.PropType^ := TypeInfo(WideChar); + + THackPropertyEditor(Self).FPropList := OldPropList; + end; +end; +{$ENDIF} + +function IsCharGraphic(C: WideChar): Boolean; +begin + if Win32PlatformIsUnicode then + Result := not IsWideCharCntrl(C) and not IsWideCharSpace(C) + else // representation as charcode avoids corruption on ANSI-systems + Result := (C >= #33) and (C <= #127); +end; + +function TWideCharProperty.GetWideStrValueAt(Index: Integer): WideString; +var + C: WideChar; +begin + with FPropList^[Index] do + C := WideChar(GetOrdProp(Instance, PropInfo)); + + if IsCharGraphic(C) then + Result := C + else + Result := WideFormat('#%d', [Ord(C)]); +end; + +procedure TWideCharProperty.SetWideStrValue(const Value: WideString); +var + C: Longint; + I: Integer; +begin + if Length(Value) = 0 then + C := 0 + else if Length(Value) = 1 then + C := Ord(Value[1]) + else if Value[1] = '#' then + C := StrToInt(Copy(Value, 2, Maxint)) + else + raise EPropertyError.Create(SInvalidPropertyValue); + + with GetTypeData(GetPropType)^ do + if (C < MinValue) or (C > MaxValue) then + raise EPropertyError.CreateFmt(SOutOfRange, [MinValue, MaxValue]); + + for I := 0 to PropCount - 1 do + with FPropList^[I] do SetOrdProp(Instance, PropInfo, C); + + Modified; +end; + +initialization + +finalization + ConvertObjectInspectorBackToANSI; + +end. diff --git a/internal/1/Example/ExampleUnicode.cfg b/internal/1/Example/ExampleUnicode.cfg new file mode 100644 index 0000000..d6273bf --- /dev/null +++ b/internal/1/Example/ExampleUnicode.cfg @@ -0,0 +1,35 @@ +-$A8 +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J+ +-$K- +-$L+ +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-cg +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/internal/1/Example/ExampleUnicode.dof b/internal/1/Example/ExampleUnicode.dof new file mode 100644 index 0000000..b5d1d6b --- /dev/null +++ b/internal/1/Example/ExampleUnicode.dof @@ -0,0 +1,87 @@ +[FileVersion] +Version=6.0 +[Compiler] +A=8 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=1 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases= +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription= +[Directories] +OutputDir= +UnitOutputDir= +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages= +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +ProjectLang=$00000409 +RootDir= +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=2 +MinorVer=3 +Release=0 +Build=1 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=2.3.0.1 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=2.3.0.1 +Comments= diff --git a/internal/1/Example/ExampleUnicode.dpr b/internal/1/Example/ExampleUnicode.dpr new file mode 100644 index 0000000..00ec3c6 --- /dev/null +++ b/internal/1/Example/ExampleUnicode.dpr @@ -0,0 +1,13 @@ +program ExampleUnicode; + +uses + Forms, + MainFrm in 'MainFrm.pas' {MainForm}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TMainForm, MainForm); + Application.Run; +end. diff --git a/internal/1/Example/ExampleUnicode.res b/internal/1/Example/ExampleUnicode.res new file mode 100644 index 0000000000000000000000000000000000000000..1694512495aca6f109f47a8bba113e17ee2382be GIT binary patch literal 1536 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 +CV4onmx&$!pkeMkK`sgW)#z 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 literal 0 HcmV?d00001 diff --git a/internal/1/Lib/D11/TntBandActn.dcu b/internal/1/Lib/D11/TntBandActn.dcu new file mode 100644 index 0000000000000000000000000000000000000000..291867fc825a1a5d85805130abb3888af266d0fd GIT binary patch literal 3433 zcmc&$eQXp(6rY*gU58^i&a)h)5TO-GLA(@7D8h-W|mvT9)0p>zeD{xw{Qi zYdt?gs8@{E#PpAPVp0vMA0dc{#+YK&7-J&Z1i{2a6OAH7#KicKNPV-rcelN^_D?t6 zxtaHS@9mrSes8ANA{0>OA#@~NxAD;Fn|C2HH>MhmqAG8e4E1^B*_if&Ae`zl={liFWG->qIE--KoedYG{g@`2O$< zejxWTk=O4SXmOEQ#{`lk28ClmfW+@$Df(U3ac;?iJ2%Hm>I(%1q~ zLQE$(c6A=x#`d*;AG7ZWWUXcN$@;*vZB@yue|-Q&S8mKPa3jwY?;m0aacC8 zcuHeUtiX?NOEscmoQ0uGx9yi$n(z1$*9bUD5!$TlNXu##^dy1L5i`v0> zLF9HTF@clE7ek+zKES5^c4mY{GnL;QlK*fbz&jf`H9r0U@WyGgMNtjYz##?$F6P>h z*YN~e z@p+S?f9i(=35j_jhlSH5aRaQ1XGm$eN(s9me&nK5?>w+GsQu*ApA)IRaP+#Q`r^q| z0gJ-NDy4b{*Kf5P6-#u7)PUeQx}qW!<1tR;^lNoZ{| zDo6E`_L`Jxs=#l)+e-IpF#-a}pdhO9Sji3|pQp-WT{%HSsZ?{#44<}pK7$(C`ffoD z2ZMnsSCl2=K@^zmVF>q^A>${>FGqTN-`1d)^@HIvEC35xtxlw((JM-={< z`HnQ7!!(1a7o8%#tG-^ff(Yo!OC;nirW~PP28V|5G3$dNZ!vp-gVCG~ z;rDGNml=hZ1WozyNKs?d(vX_??#oSh{=~$@qlY(v4oddT`RuW#<*s``l!f0cn%Gm5 z7o6uBlNJ~R0eF|f%jY+~ak@=>?93g{lJa9u?-Vbr2H6pK`Lh+?_2$ePT#h-P9)|Zd zKKY-XnGPi$XW2|3-xPlqAScm?CA3GL78gr3ZyJ+jq>~Gn#*)!R( zpSV_bEPIRj`<1zTa@1Iq{Wx1#2-yR}0QWt?$M*a09gDV3HqZN+1{%+PZ2FuEfy6{g zy%pp;vKQ+{cXV6_AC)I+<-TPTZXRUa=&rUlxzFFh>py1F=E9%%jXiM#2k}^E4hcOC zWLYJtrntxYtHnJPLNCI-u<DWw_Um8!28-F{QYHVlTx4#XgGt6w4IvqIiJfeu`I9 zTtji3;@uR7D6XY=Eye37ZlZWO#VaV@Lh&k!nhmTg^$1Cwsfdu^mapA{>dE^=NtcO%0a>z}V97fLx!XP5(vO5Rk@9tq3 U|8kGO_>X%4Mz^OQ#(5s`U(=;9z5oCK literal 0 HcmV?d00001 diff --git a/internal/1/Lib/D11/TntButtons.dcu b/internal/1/Lib/D11/TntButtons.dcu new file mode 100644 index 0000000000000000000000000000000000000000..b6f0e7e0e87569bf21dc69b641c08c5548876639 GIT binary patch literal 26836 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 literal 0 HcmV?d00001 diff --git a/internal/1/Lib/D11/TntCheckLst.dcu b/internal/1/Lib/D11/TntCheckLst.dcu new file mode 100644 index 0000000000000000000000000000000000000000..37d9ac525049b75a2ba040a14085f4f2f80c4834 GIT binary patch literal 9649 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 literal 0 HcmV?d00001 diff --git a/internal/1/Lib/D11/TntClasses.dcu b/internal/1/Lib/D11/TntClasses.dcu new file mode 100644 index 0000000000000000000000000000000000000000..f8ed14696293f0f8027b00fd0f648a6ddc2ae619 GIT binary patch literal 44356 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 z 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 literal 0 HcmV?d00001 diff --git a/internal/1/Lib/D11/TntClipbrd.dcu b/internal/1/Lib/D11/TntClipbrd.dcu new file mode 100644 index 0000000000000000000000000000000000000000..2b85fc6395ac3058e39b8ac5a4f4caf642725827 GIT binary patch literal 2523 zcmbVMe{2&~9Dnc8c1LNuqm~B8LOLMJGNl0~NEFSsu7$~D4ec1iA>6L-ZU^1nalMrv zhB6(Ijj{)Od*Hka%7 zeLmms=lkQmcZ&h={xTbY57e491LIF_0mvDb^-xk$>$Sw|0IgA3x>mYWDT%dIP?Gug zckHi0>Vjafojft6TjOziE~Z0E1XV6&pR;-uNH}79Q#$SfKybE72^`ZkNfxi3eDkjO zaJ;!=2j=x)j1zE(OD4m6c&zG@BA;n0SdHNGd zvzB;+lu|jJ?>t9Qe;&mG*PYbYadLt*G(x$DEN%nd-AIygGLJu{gwG-(8palLo-o4f zC~Ya!$!Xi8pZ_U1NC~95kw;#5TX5FNDamY>uEo;YR{X%28^7zbW3CmFqG8V zhd+E;^wgT=L?oFEWAF9t>P5?=OEp&RyhsxfOZ@s`nmAC?l5jL(S=2iL`Q<_hu(@>X z3(*mi_TgrMG6G{&{TsWeLUbDnv@%-ZHzVV%B(zc1o6}e;$QoD7!sooF91=a&NJ1Ls zbbN}A$z@@5Oz#kcPn3|oZDQQ`Ok{%u;bqa2i;3r2PQd@4Q2>E|ro*Ij$V~@%Tm2TR^nRiKwRV{WEdn zxG8%FC_cBq-xM08Fk1kJl9)`@p52uAcQi zj)E&9zz3=p6tO|0d3t8)0D8d9J9pLtJZlJfD{L{G6a?U%TeG%YS0U5` zZcwpWpBDsjMfrgj@KrA3UQ7Ep`U&d+^lAaUg7pLbEmT!BZhA=pTftE3{#wA0kMqq) zoY4T|0Rh!>7a$OH7Yzk~Tj`-8c*HC+=q_rHkeR+AIB1f~opmXzae&bMQj)7Dogr_- z8iGf2eh%}%J<#V>(}!=M#rcfD(y6Jb11D>V4oJ2*o9KVR&sJbllYXMu8QA|>7M~-U zrKA{|E~H?@0JLOp_FkB%`MUqviT;+!{_wq;(U#6{NqAyvS)xCX4d2VMQyb^+a9^WU z^@nd${!pIp-G3YC^RnUFQG?HpXTy_*b%U|2n$az7ZHa!ibC5(C{ z#f{N+j^)t-lKFBj)nq>Fn1S?;!d-U5+Bu4HRy1pJ*{_7p+`tOR*Y*Yx&P~v2aUxHi zGYU7mu?l~#t!?XA?^A>UpnL8ac#0ZE&UdM0ENN%7>g5D5dzrFRvfDZBolmlw5IONl zqP&zk!m+MF;8Fop15gVx2B206RR%s&=}K3_bTz8=(|3apmHW`bGMHY7BIPJhg%*{ec0XD|5EfOsP{8NP zRKv`pFcUz_{OEZPs`jB3t;c2Ogde ubq}%8>N0qkXtFM3gSyL&j)G$jR0hz19hJWZj@xW$@`3o>scI literal 0 HcmV?d00001 diff --git a/internal/1/Lib/D11/TntComCtrls.dcu b/internal/1/Lib/D11/TntComCtrls.dcu new file mode 100644 index 0000000000000000000000000000000000000000..68241a69d9df5bf5dce0e7d42e824c98af7db0d5 GIT binary patch literal 183981 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 literal 0 HcmV?d00001 diff --git a/internal/1/Lib/D11/TntDB.dcu b/internal/1/Lib/D11/TntDB.dcu new file mode 100644 index 0000000000000000000000000000000000000000..86523f664c84ca4429e605ccad2a628b01364430 GIT binary patch literal 28932 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%0DjDEiQDE3$2AX(4@!%IF~NH<_4IAY)tInaJcJt` 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

xhj>`{K+^eD%Q_G5XJ=|*C=Mr|7c48uS> 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 literal 0 HcmV?d00001 diff --git a/internal/1/Lib/D11/TntDBGrids.dcu b/internal/1/Lib/D11/TntDBGrids.dcu new file mode 100644 index 0000000000000000000000000000000000000000..9077bc9ae29d0e73e89ebc25cd6ab68d43c3e210 GIT binary patch literal 48435 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 literal 0 HcmV?d00001 diff --git a/internal/1/Lib/D11/TntDBLogDlg.dcu b/internal/1/Lib/D11/TntDBLogDlg.dcu new file mode 100644 index 0000000000000000000000000000000000000000..54aa91e844394d202ad0f6067c9a552384054583 GIT binary patch literal 6767 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 Q8q*lOH<&KK`#MwLf4W{njQ{`u literal 0 HcmV?d00001 diff --git a/internal/1/Lib/D11/TntDialogs.dcu b/internal/1/Lib/D11/TntDialogs.dcu new file mode 100644 index 0000000000000000000000000000000000000000..2926d4b828ba834fd83256f9edb682c33325e689 GIT binary patch literal 29694 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 G_x}Mba_sN` literal 0 HcmV?d00001 diff --git a/internal/1/Lib/D11/TntExtCtrls.dcu b/internal/1/Lib/D11/TntExtCtrls.dcu new file mode 100644 index 0000000000000000000000000000000000000000..50666811552e211dd18a64e70d2f31c18d317baf GIT binary patch literal 47559 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 literal 0 HcmV?d00001 diff --git a/internal/1/Lib/D11/TntExtDlgs.dcu b/internal/1/Lib/D11/TntExtDlgs.dcu new file mode 100644 index 0000000000000000000000000000000000000000..751a5ee3b36380d8a7938239453e482c2a9ca0ca GIT binary patch literal 13587 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 literal 0 HcmV?d00001 diff --git a/internal/1/Lib/D11/TntFileCtrl.dcu b/internal/1/Lib/D11/TntFileCtrl.dcu new file mode 100644 index 0000000000000000000000000000000000000000..e8a430334688a9582695c0167e48c4f1c6d6682b GIT binary patch literal 2720 zcmZWp4@?|s760~QcUfS8Eg}*^>e53(Do5JxQR{h8mgU=H(p{MBpKi;+Ez{YV*`dSC zIx|#z9u=iMZ=GOzxwMImJ=>_4#>3d`DQV2btVeC{qKTwE4QkV?injGsNUaIEki$1K z%R-d^^ZtFm@4er9-+Ka~hKtn*UCsrbnO*$cFv2wnSr3a67t&Sf9CAOC^MN6xOyt0( zYTcsD{$PA6fODD&ZDe0569aB*D~WnuZ^ zg%A14K1Go@M*i@V7dXC>l66kt)T(duZwt{Y>_xu`PNh=~a)C()kXZb4HLIj>u1i~p<)DZ$XBrzJ)YRM^4&M033nRgDP z2Kz0ZoJndhVM*=?9gGE|7XRKjCugFZrZEDS`uXq45y2Tx4;`GFy0=&GM1zOZbTBdS z+5bG;D?p@9R8>)f&+EjJFvdxHY^_Xy_L;=BUIa80}bz zsh%Ib`bA*}k^jeh>HUXGELUlx90ocosVHkZ!PL=>hkJQ%qECfhag@v}DdS)T&)3it zJR_<K2=Gh;$cd;qGmb5XvR9ugWXLqDe-)0LbZIN~b2 z&wJBHEp%}cU1;p1!s!@EBx8d^gOMZQct2(LOz@hXWSk6=RFeA6N$4W9!@M|1Q!rMX zxhl4`r^#v$EipO|{8Cy{7Fie#&r9>1@G0l+din1X7sH2-fT)zC;r`YjP2RJxTaD1>bHJ_*`D$Wazq#lyU-3vpw4eHNt)dckd0OPSmq)4r6T3=ENO>v*lqJGp{T4oCh46s+@?>i*|Nf zT%BZl9;^El+gV$F6QRCz3Kr3z(~V}@DpGQ$12y^DoRd*a=s?ZQZElHXRA!m+)m%IQRHl_4f)zLN%oJ#EgIqUa#G zcU6^}#3Oun6O%{IJAPQ=<`yxhkVl?HfA!X!^2q;-kNobwNuK9a9#y~N_YO&!@^;{n zx9G1k@7Nk-9__m7uYOFw;;*qdv&Wc6t!w@|>ah{#QTwXjMHrovc~p1V?+Qzdpn-VN zUu&-YZOQxYvz=aRp^7h93t<|Wdlikeo!O1p*Kp_K^I~p(Vz23yTs2AK9|mchnesX&KYqHX@1VyWS;2{rK|J(*GbT_RecOj1Z06cr{7~SJ z`O&%j=z4y1EkF7wA6+&6V5|m;$!r88l-bym$@?#vr=|~}$>1z`WF%LO1`DTt-Zcg> z^f;O&bH?v1n?dGgqmPVRmhv)LG03Wsd}L`4E;|sqPF5h1RRdY3Q^iRSXqG%nt_0rw znICQ{sq1#Or;GKcWjHxAwT|jfWkAY$;8ugI(+1k0y?L^1X8Vb9wt-@v+%^^hH!U1J zFiX~Kq*<~^&yw5l_a1F5SYF88D$YPg?;hHKNDH%MvqJLZia~DY$xjTjoF`X}>m}=3 zH%JkZvCq#OaJ}f9i539@YTLZJ@dmjD5!(vRlXn8e62Sd&M@hPC7H|!~Y`TGol4B`Q z96oX+llNtR1zv;PwF@!GeJfz$fr*`@0KSlsO;n@R zie<}QhTUl~xx5urg8ZNy5r+t9uXPN%U;3_c zXmS)<@k@S3p#cy0@bg~Wy&u242k&Wd6gqJCPDjCq_gTMB`S4TV?e^ZRbKGopoNIC1 e1l8xoPRBWKEk1)@apM+*XI;4UJ@hI<%zpu{vz9CX literal 0 HcmV?d00001 diff --git a/internal/1/Lib/D11/TntFormatStrUtils.dcu b/internal/1/Lib/D11/TntFormatStrUtils.dcu new file mode 100644 index 0000000000000000000000000000000000000000..3dc4aafdeaf9cc6e7f80a7f7e553ddb95973c6e1 GIT binary patch literal 10131 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 Z+8s_@X4+5F)8+OFbg8n>q>J0`{ht$P?c@Le literal 0 HcmV?d00001 diff --git a/internal/1/Lib/D11/TntForms_Design.dcu b/internal/1/Lib/D11/TntForms_Design.dcu new file mode 100644 index 0000000000000000000000000000000000000000..ac463e07ab10ec8b5b70a961813a8cb08dcb1243 GIT binary patch literal 14749 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 literal 0 HcmV?d00001 diff --git a/internal/1/Lib/D11/TntGrids.dcu b/internal/1/Lib/D11/TntGrids.dcu new file mode 100644 index 0000000000000000000000000000000000000000..6d2157ec758e6299a0ec48dc01819f332e0e9246 GIT binary patch literal 36645 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 XKiVbum?vnLRKOqmr5ye^B+35<;Yw-5 literal 0 HcmV?d00001 diff --git a/internal/1/Lib/D11/TntMenus.dcu b/internal/1/Lib/D11/TntMenus.dcu new file mode 100644 index 0000000000000000000000000000000000000000..3ffb386151cb2acf000e45d5a365d4981555f7dc GIT binary patch literal 28136 zcmch93w%`7wfCMg?_rV|Vu&FEoy3?1fs}W7sLg8vktBpX2v`xu$;=Q;GBKG!pachp zSmH5WsnRPJtZB7xylOAcY8&MtTD9P-sA#cOFBqz!TEvRv`>(yvIddkUxA(ih-ssLb zd#$zCT6^ua*Is+?6E0^g?L-S>KWm$ERnOts*D=Xf*BYq|v_?C=&)8LMZq!P`Ep1KB zf%cAqrdI#MD>|o0Z6gZ`uE+ni;b^-*aJ|~1pv~7|9yVh-YqZp^?uZ1yH)t&mhnoYw z)_;6$TOjCYXle}9M%tTNL+?Jg?H@r$QENw&sP7#2ogW5G4dM32s*Rrw4_eDxBY{w$ z-M%IGbkJHi|Hc&oe`M_kkDLmPR4N5U!APLJB;48&X^;9NP2tvGJN9n~xm9#&Q%9RG z;$Oalpcxu85cEZxBXfPNjp)%%!d;@`ssgu^gPX6_AJ|2RbQMw79tfzI-GtF}sPzQ{ zCBEin?<#+wjdXZC30)irhT8+B0ZqmKB($+2d<(-*$TYVpw4C087Er(_WQ35tus9rT zZS=OcpIp{wodfYeFtwD{Bw8G!(VB`&R#U`nWqn#`*1yToF_8>PTS6rSA+6 z*$OcP^H&DA7NL}iu&=Qu&;dr!^VH-=I)MiqcIzP)~BC{+VBkj90J_MZnIF1@9V zdZX5Sk!$k{u0f5Os+y%1ieV{hYK2Kxb9!TSxZ}XE6_14IW$ZH@*M}^nf#yIYzitz?ukBGqsXcYS97Zkdno+fkds>mAR@|5fA*P>sU+OC znv1s!i=z6|H2JEK1+J;Ogy@C<{AA$A4}djUn2$D|&+k0kpc-8n5NBbHuc;#-9GIJ2 zG)d~Y4W7n(=6$>FrI5MI*W3~4AX|z7gaI~b2B`hyM`}P#Xa3x5pE3uOLJbqRcN*?Yie#LTPPM#s}JNl?+=>m=G2#$Mo0Fo zgWb5EB^csJ;J-#L+!snKydY5gTSj~y;1|r!y{6hQQy zli1&AMTjeJCHKL5LsM&G_?8aLWaHd<73GKDnFpn65VE3!PmKw>>gM0l8fY(V_uWz( zfnLk5z4h@>YNfAjVN-h~>T8}CSlw{f(-V3_t~r4SDpkIgKwV%}q+!QHnlEw1)X`1{``g{-_@Uix_Fe@)_I)h5K~QNt5up_Iz9x~20Qs=PI&HAM})(Jcr^(Zuq294A&_OHYD=6g-;nqNFq@X6?YvkU4$T#tPC{2ffgOJC+K=6?| zczs(VCQD5q)YK7aU;WZh^g>^AlOSkC>z4^VLf5*Xy(xlR0~}r(+HyfO(7u`yjP{_< zANV7oN9kH#5EqUQrMO_(|A;8k>Z*|>L0Rgqi2nWAWjBW|)A7bIG_?k*+rw=L*-e3t zK5CeLVZ*xcf1zp6k!Tt(x-1xU*3Atxx6xXH@bJ6o3pQiQX(lEk@-)g`SGzpi9w~`N zrl!7dKN?kqBTd28-jz^n_=#Vi2|4O2pk~3G_V6t~9Q$2w$SLZAtd}4u0-{90hX^!G zfJ%_fwf{s1K%x?E{}}+mVUXJtjBumh*X2JIvUd16WI_!loTbBG5@~Oq@HpPh9sZ)` z$b`QQP6`?erc66T^Th7&ARobGEF~v(`a2ZqfLsd*A}VRU(%!y3G^`-e?cj*dc7=u~ z>IIal1R4*JWiQo%dGDJ1K1$OL5>nqrME1AEFlrVpP&D`x!AI8>`#PHZMLgH6XllJl z8RL@XCfN1wTc*1qZYT+stkzKA3?XwaK$dsRZ}qMU_@j{k@e4G5N_1Hl&|!iIsb>j) zp&r0%j6VAkJ@|t74?<>Mz+dU*=NHE+8lJm2V=+m;AS4F33Ui%DM!Rqp#EA#s8U98y z#R>`!c5TU;^tF4oU`z?|=YLx=Ett+<6XxY1<=y#j%?~*Wv_|P4xAkM9Q6pORlp&}K zZ~oTLCh6f6wu#_Af@dV?^-l0G;oJ$F@PQo!9iD(H#@R_=R|1St_uupz0I5g5rdHDE z!ASp)xUxz;KKI#A5R+7N0nrGDXngiwHXAz+4FyAqHSRe=IJq3fkuQI={RO3K1$yU5_x^6$D@uP0 zH082MfUu3eGr2k;G)3F0N6MNI0@UVydQ4GFj9O#kA+o0!at?wIds}@sHU}DiNf=m7 z9b#bAaQ4`RjY^gW{FpgEBaBU@D=cJ3LaA!4E=gsmH;Z+0w z`RfUK=RiNpTYMo*#*RoIF~k6=S^!tv6lw9b#efK=V3BKWB*o|9`N1E?tqs|OHz97c zU}NcDJ=TSsk(w5$WCdh7o!^2TPtJZoVszd{DuC-Y5|RKHMI+&|W?yLDu`jL*3MWj= zlT>+p35J-&@tsY<^Y2;_L^REZE;-*Pk(miRC9zFdCI!b`giRio5+C2%{**Af=_11H zLj=7v!3`a#_O&A*lKiI$sT)dyDHGtwKm`S=GT`fowg;%+e2Mye>gv29rWbSLern?q zzFO3b%~cEJ?D|W1Y{()a!~y^8?}jXGzKTFFGO?%S3B9`I9f+}k-;zc;;}kWnr2T%Q z8ZYi8ycqU^@{Stp&m(nVVmFBfP-mCYFf}2^`gdxQ)Jd&7KO&Sa`Un#X3*19E#Y;-V z0ybLAuf${&^Lh@=MLUO*Yp&ZlS%%MOb);4;;gx~=+X^lR!vq++*)0T1n%#635ner) zIJ$MSp0_F|s4aMtuy&B#SZPaQ3mRG*k+}H(9X$PwwmI#-w&hKJis{z65?|{|U&o_q z(`TR}=84ZZZU#gYw?{jc7hnzxXm!!vMWM8!=H{@!+803v)+*rJp4&7Z89;M!q_qq= z*+;T(dMK4w>5K$py*zTBV6Ftil5lgly@vP=^EYc$Cwa@dGNec(wKlT4IWYa0X)|UB z!Fc`URcE$^EWwWAaC2it&LI0Lk><+7p|F8ykOyvGN}vbdhK!_wvm5B7hvGZ zKt~6H5gFJ~*HDQ)U}^Z4)(r=O>w`ATH;#Pk>S-AvcSGe;FKs($Usy4Je)Y1m$mvr6 zB|xpW0%`so*z_T4HB{0R6x)%tC)f4*1Lm@DdkbWQE+GNFh_5c3NaBv&{@_Y~z=oY} zeWag_8VSiE<+WpgzlON|Po7LU@Yc}EpV0A}D*zao&j99z-$Dv^=0XA72KO7t7 zDU&OGE5hvyDOV1+p8a;+`ymC~)S3*wL_1b15EG%SCGuR>pZA1tjtDk9^qa3Se;s|L zdUdleg7dZ(&eB#JZEHgk+_7TY@gHDiP--vSc?a?dI?yX>ZLDf)rXw+bz`~Ca$qM$` zmYYP*+SC**L_1U|Yvna7)sVMR1!lo)Zl#HV0UB19h{r#_$1o}6EYLyj4E^ag>;e)b z2rWub6?xx_zs`8}0s^tH34%Xdgg{v?1;Jq=7?Ugl>3y`VytOf~O3)l3ny)3(=(ZDr z=p`b`ypTv>U%nU?M>Ycc%0-mm3#v|uSBYj+GJkcU7F=E(`bBZV&~ID}r`Y&S!i^llGhyCigw7g*)>-zgFT-QX-Gce_ zHsLS5Nc+0gZGk@#@{*xQ*!(ylhANdX_d6G3s#^NbgdA!l#mIjF4xyqX+7Su22%o*< zz1u^fRP4EQu$DcId;9@wc}qx{18xParBL#?hrdM|dfrHbQXu51&!KsH|A>i`(3sBs z{DEQo#-SCf6a}1+i$VyR(AnTz^!kU>UwcguB^IF2B}63REI&7EYK$zu>`lkxf>1Y4 z)9RGFio{%;`mwz>bVN6j~!o)$FR_F&G!Ao-_h_f97Nw8R1JL#Sx% ze}alO9tN~gx28|xU6<7yF`}ASgR@QkycEq#C|8X!$JqXLtJsxJ)prQGk$t^BWx^Vj zR@n*0*s!~w~RiGPL{@yuXtjoj9LYH|8M$2=I`F{1}?_%uAlqB#*w(jVkT5i)* z)69#pwR3+yX@j1cz#G|?$nXDjyT_?=CgA(*r*FLbr`w~}Z%PHz%GgFWO=%SE2!1wdl>|*aG ziA!T9TeiJO4YV0-x`T8PYfO+y=aYm?L~VX6KTF7EGdx1iJT^H~(KCll)$3vL=MPt0 zlF~GB#usDr-H&Zy*O{iXY-43dD9DzvgznRs$B{_rGT1EeNK;~JZCk+Kmak8yIeDa$>OomHAD$!Kdiw#R;*vtILPk$>{EX}kHQF6fbtW3>}lw_ z#$YtLp&6hV%w|bw=5~0T6^Kc#RnZnA&0ubuqMItej_=%K?6KeU&SOQ^|4u)f$0XD- z4ft2&JLwn?TTxtowMLkm1x*smG12;vL1Sd*a156tp^{|r-z2OtT{U5~Nzh>*QqpVLV~G+C+0GfiC~Et+CSZ{!$R638v}bd8GF=TSnR=A`4sw zD@^J^!u?bVTF_$bpJ}=xe>jPo>+9fm3Opl$!z?gTuT6v^X^D}NFuyoaM+R%Q!DTY5 z!rBdAUAV0xurkn0%{pT2(N(T7?1+Wk4Njz4kd@u%k>*wgS?=8)LlXuXUP~8OL6-L* z-c(_B1iG0ss+*&bA;A~YXr;$+VjAHl949v6R#j=$~&2v&=TRo=yQv5+nYR8GmdDA{t1EhYvN^$ZebHIZ45s0>CX zb*8+76i|oyI^yz`L;aS@=8_~f;siFv{KR0!P)|FlHp)zDL}M#X8{uU)P|F+j9k66u zYXUb$o0=ODcc=@e6*epKGpev!uM7|a%Err;kAV!5o9#@en5gDUcz3EUBtl#MgC0w9 zG#JE9WLO-%1n9wR;{5kV&fMkk&LY99|an(tV?O6FFQX{UvW zpD-i1dnl$DigH;UvcFqne z8!gC+`#i%)c_p4=+zxr11W*&zAe;UK47o`$WPWlKP23g4*fP>?fnC#%FGi|%8Eg^X zEeQ9(&SfCSM5^X7k0)ERP#%-8KcM>{HY4WWdsz%vKo}{~Sp~lF& zBFkfJA?fz$osNVfAsQ%#gK9P{?bM~r*ajGCFudePudBj_MjY)z1Y28@;Y%8wvzic$ z&Oij^yU+}k<}fB;M1z$;Yq!u%eNS7B#ASPcNQkP zr86?On-aN#tZ+cd!NJsS7t=ETYe`IL5^A3S@PmXHyPiZix0WU(=w@IknP#-gEO{Xi zoJ2T|u_eT2lTq&*4kUL09N}Vjl_9QuZp52xe49cOYz>sg807RT7J;jdv$lSk&AT38SQ6IZWW^ zRr&GNQ#;;JG>fr^&VFKMj}AB9eVeM%Z8q%0GuVS*Tf`IU3^tKC)pJg_xkS=5lvARQ z4--f9F~M+X9|I~U-p2$d<+?n^enKqno@Bm=Qc&b(wRr}aNY`Asz>BdTQ~U87brt=kV(fSK9>0ZcF>k#4 zcGb?e+j6YRIYN-#cvd;x5W5ddyaA7vY-38C@YrY~(M5NVRlE<0+qlHrUHMKRe9cX3 z_{n07(N~--lI^~m`5%z-b*FRKTrjpU+eV1HCGtRdJVQ7GqV-qgrM7;`^LmP zHa@MaJcLUio?|FU3S-h!(pJNhT;>|rcw3ngg&8v)0pckYVJ@Sj3ea}|J)lBeW$JN+ z_@I!nF{golR>2q0r)(O-4|}a!w;Enhadf~sG?!-V!_C%>$m~=i2Z$03wiE7E73b3K zc|@*<#@!_0b(O$9G_L@~OdD9drBaNz=%Np@1vW5xM6gX(qLom&m>sZ>@l z6Gr-Q59x7IMbJl@T2B><1JsqjsuWgGD2OA3IISX_`eYUo-y+6;SF!G)yRkl#)I#k) zQz_Ce45;fR)3MQZu=zqIa_R#m&~J~mgNMN(B6NXBs+QBIR*ik8F{ep@Sw*^srU-qe z%uQrtyGr3mEYQsK;SR#3s5r3JRT<5ZP3|q`OZ+M1q?If;~c%$1~->?X-eNslfeYkO}VVZ)t zn79Cmo2d{?v?_tQPdb0IeUf>r;cB(1nTJT2yoW>;DPW=B?Z=?r!%**9HnG?2I1giv zPo?~!kvF37$k?^{SfY5d+g$}#<>Q7vlWiOED_0QyQi@g^xuIQygM+s|Si!)~c;^}* z{%*z*`guSMpfUW&T?jdhoBiHRWS}KhW}C>KGAy=czHLHubC#{bk2=aG%d)M8N-pPK z*Z5%^CpHSql)D^Rxr$Pni6dlYlG?B!CgYS-Yv9_q8WtzxlxzXG$X3G=73b#S=+aai z5q21`wX!uXl`dbL4=(rfeRUsRC)D?j(*X;LeAK7#TDN*~JqSDVtTFWyd~vTIjqu8G&;``u`;59+Pof9{LH!CLu^V7K=?w@GXUi>B}S56IrT0l#)r+z~8< zvMZQtr}um{2R(J%-PN~R7^|xzuv?}jwk4AYQ`6^fT8p9QC%mV z1Z*#o6}J0V_{B9|A-Q(#Q&c-E?~C^x4#rP7I`Un+K8}Al@n+GL_(An8IQ!Fxb0Kdz zYhP57&&$t{;lS-*p+ClB4|(+p{8t|R46Y;pjmBk4U;Xl5!+wo}6C1ldY6l}3G!Uk< zSKWGx!?m-|^<#4%XgV(IssF^a%X?mo8969_J81&awR6dNd7tU9g@!?W0Ve zE1{qyZq@VE)dLlVJ^{2S< zifX5NyaUSXK!UE2=-$=Sz1!nGq0pU3(8Y-En4a!fkN3DjcU+;v?5tP1V^u&?`mS5N zxUt*4d@l^r<2}Y(s4aWE?<#d6vB!H#sS8beyq_p_!FAtB^pW-N<`aJ3<;*tdBLMxt zLC7C5@8t~n8QyBH>)w4E-i(Y;s`4TEASt0vFJ($jd3J&FgZ7A4J>GM?HF-fj$b}b7 z8JuzkBi&1)I2y4?9Xj+`ZM2~;Vhyf;k$L)G0%&hD+H-0ZUf93)D@J7~m%{!#zhZ23 z)DDsvJNa!GK}Nh49uXNI{EdzE)F0R4*Kr^#EGVW0QgN`mV@UnoV7YU6Z0bpHPs zpS_e~aOTP&{f5t75q&65u^Uimhz6z%{suBsU!A>gZR0%So9*_lGZFLb8_uWE+^bgENc`&g;{9U zEJlCCtm)A$;OD9lxKvm4p1qE64RLo+f}i zS9@BUn$ZSh6W_ldlWWRL-Szvsz0Z>$`~>|Ieh}|`9u6Nuy%)qRKErftrur6jC~xdm z)0Dn`=~2UmKG%lXpq0JP%jn+JZttOIyoV>Eq3k`RCKK_GR1fYNblvF$`J5?dp7FjS z;jPDexO&B4*BK>MTBtSa0_S(Y=ZyDtgKNVdh-3Znu9p^*wL;Q7J9_#xKq)zYI#5pu^Qhnm<^zh50h z?|v?}+lw{jOH}XAl}m)neHB&Nd{@_}5Uxe@?c5xKy%LxQ5X2}fQ~G0r-b(tTL`E98 zI}omw3G6*9za~uLJzI_CSiV%$>OT?w?Aq`KmvBl$B+?A;09w4Owy#g*72XqK_R~QB zfSO~CvMPL!E74elRV%O;kI7SXDHL_p8n-|55(Ex(dhl8I^$DpGolDTVZ!@ zhD5kcys2>jf%gN9Fj6Vivfg8`^HFU8j*5|ql=gV{Yb2PHhYot5AJ*gTQwhC&-QL3o zy{`avsCtEA&(9!Tzft3wXpXcASTs(AXNc5Sj&t&VBB9ea64{92m%WN#LJ-SCp*S`Z z&!MsC!jH>5W!RGh8a??rS9IifuDZrU&#?t)t2ni5mzkne@ba=zu3aPA=ymqt=v>95 z^3lZj#6M?iGvt?5%pZBL=EXlBjDCQipEQB(7&DPZP*%Y36{PqfnaaFhmBJz`yWWhn z%Oz7er>?$rLG@ietB+x8s}R4i#wdibRoAe{Hxu<_(K#1IC<#fwsce392kBIyXhe^- zD74wp|KMLuVq}be#ZU5C76otmS%i}OF&*h-O$MoIOZsDl_^Jx#+T5pRU)o+?9jYPS zC1FE<_5<+0IS(1i?_W{B@Z&vhpbNpOk&@0{YUQIVLq}Pw{)`i6Lk@YjKsb#(dblDk_zcjeKtgU(aOm%*uN61vg zmb`X3fK2Eh&zq=BaZT_-E;uQ04bWkb>X=Y?H%R1KeZGhNLQlyeB^bj~tA&h>oU(Ay zcc0rNtPWczkIjtavBCJNDT8``kQi6_XzVwSlJ3#Vzl2Bub6Lu9)INRZXo0Dw zF@*KK4}stAWBA2Ypv2=#IV)Q;5n%g^v738Fw}uMv3f7=(M}$%r>ZjYMAt2I0*uUx| zY5jgO8wTiqXU(~aHKX5B1`7kBylF>&-CmqGe8r%M@m0n__PS?#ZLWL!mOSmIG+mq3 z4e}dcMCso5kYtH@tppDoXmsC3@dGnhZfop16SYo3vT&|{w7jmlYcS$eax?-tlnH`& zb+la@hJhp6##c2W?Wb!SN~g~VhVY?L!OP7Lf&^>vLwH~a`RAhENB9>4|NSfU-HDZacYi1E_%aSBTT=DPB zK5Ct~)wRpyrFMLJ$M-*hX-HeLC%WtVXk%7?Xrp&fj@se}PsyFO_%j1E{wuM>i1Alu z6Z`^`{7j+K;M%;em)QL`JGPD9k5saC>UK_21Hwk{hq5)^r_SDP@7wXtvn(=8w!~Kz z4z6>-oT7snvx^IF{km+4t%CI~Q*=Q9OjllMvBF+Assx&i-cMtlpHj3FM-t>ITcB$) zwX3TOu!G(+1|r5`Ao^A~)#!a&Nxi$h@Atc9=+x&jGg89a9Qgul6qRKKtA9zUXoGR&AFGY=mspKz05IIJ$QH@s=G2>r ztuP1^aebi0eoc%0Nm|Gj5%g99%AKi&>oxHiD@Bl=`aapBg*O>B-e=xZqgC|^jPD3} zj*a&NcQOfZL+uKwr~U~&i^?aG#B1@a6Bg_7KCu@MVaOrz47L=}a_5RQSP7WHc^IoYlCyu~qj}4#@Q<)K(|$5RCJ6wT>ql4L3k+7sn;DTAOl)7WQtur{4!lMi*D36N!owK&SFi!}}QgNwS2SK2BkMo-(sU=ApQIncf2TzBPJ+_@aZl0vrm zCKfI+l)W$)!^DpaQ?eJt@jT=rG!V|}g|sbDZi-|Kih3b?atC!mq_#+W;+>zc$Ygch zB@Uk+B)(X`-XDy=C?Rkkj31ZcXQikm{{9#77a6WWuw>#WM&*tMaL!0TcP&z}8$xjK zckU|=)bpZKcGDvK)l@8+0#SP_K*^0L&q;sWz~5runZ+WRhz$aM*fF9SL~1?uotZd7 zq_ry6>15G{6^0cCvW>#T$=4ZC0aSmEDfS)JO8!-?o+QbK7cJ)Wh_bi=QaBOw$k^S9 z;Cys95`3|C%|04+L7jx8{uHWecw+KD5v;k-HRz{$(Wu@~DQ4jzgXx;xmc~alcyrgLWiO_wM6Nxk?O6T(`&f zzfwzK=Vt1pkAt>=(0zCFPXfVWMF-5dnvP%*7s^!X0;7%&^QPXq* z-B^_l@?5(XEej$`T!foi#c*=vv1IxL-}+a06D13l>tDf%o^ZO#qseVF8QLg!DmFk6 z=RK6`Pj&N7DntDjutqrk5e&m3qcMZwsxah|b28!udJ`v;4c_x0err6BfM<{Q6|Mpu zE)HE({=&cVFePtdy1`7ledVhOSc(CqEz4QHZBR^1H@3>FxFD7X;vcF>Mc0|Ng=JIT z#L=I?;hI*Nfv2!v5U;dv&|D)`BZZiLQ%O~HpVpQAP$DVMR|O}`b5=?DdqK+7yDf3Q z)gZr)xxlw(2ejS{J$-E6`wDQ%<_n?mdSr7Mbl;|QO}hq;rqjKf*f7(u3cR5HM5F#h zxiltf_3Ho`Zwj~HW2%W)t&h(`JSO@D!=&zI*f$?Jyx6z?wQDy?>5t#l;OmzU=}(vU z>CQ4HPg-mTnH>o7dy*tNsXa&iotK&PS7g+Y4d+5p{whx#&%(Pw_Co!mN@pt{`}6@fyOsk+Nn0z z37=toc=C6^9Q1xnQSVHl#T_xBVz{6^eSd=XvCfYT(QzP+W0w;di5Fy5CR(cGLYr9P zXu@2A<0TxJ4B`MmPyncjcI~YE7{1CiQ1gJV_fYC4w&1e&gf>5wk6dK2Wb}LH%yV_E z0%K*w6u+jRBj$i+<)yFOSD>WX4B2?3 z+YA{tL#EA;Wiz~k`Vo{CtIaSL&y#q*j;9?Z1!XwO2$Yd1qfy>M*<`aBUd8h?o~J>- z9_2l0l)>gU*hb;6zQDX+19Z%Igcs+vhmNn103Dld+ z9>Zp+y$R}Xg4%zDj4x5!Y_u6B0X+eQ)cy?R3zRQY+W>km6#F}9PD^h5*;kGee;@#H zxm?^yDaW}5^(|0g8&uc=6}CWy6tw#i6>bK*|A`9qpzlN(0hS|ChNJY@-G+cY*NML> zfY>}P)^5yk_M+ZvE<|w~vOzbBkKLH$p<95yl%rIl)T1m$*#>6#8vw(@VAhL1j0UrJ z%mo+(hxC>-Rm#hft}u?0wp*u5V~t~+W=o!e$^a})nqVxGCK)q;o9G;C$(OD+jgqDr zGn_LmImUAH7{g49gNighRhpbBJ(4Nqjh7zHm8SmIS!r={ib_zRNaHi4N2W@%(xq7$ z(&H~Wmsn;PmRK@CG8xZN(oAEzbWN31X-Ss~(~};+0a%u0Wx}`F=H2K2cPHFB8XNx6Msu&~HjFRfoot>5f>3X-J(~_&n$dFoK zj83SIrzVU;jjA-NO_Yi~61pOln+idGp};KZ1_+$$++=~Y0d&J^pF1{7nxDV>+art78MnbNFcDKB06?N#)9f$=)& z3ri`6J4=Wg1#xbvHJ6Zw(xo>3@*MGj0b#Bz=UD4h!&s|FS~E&olP0aj3kDwV_?;%b zYRN@c)1}5)dP7~Qnia;KF3rl6A}~~@w2GV#yd3-u6<94-<(nz3$(Pn#33RGq0SvJO zj;omX4a4Od$;P%@=@Bf2|ET5L>}uC|U+4LZ}7>#VdoF^;*M zf>Y&y%7fxm?SNN4gD zwxDc7=|y=MWjo4aD4WoDGs+f}Z797c52O4XWjo4aC_7O0pgf846v_dVXHi~2IfC*k z%Ihd^p}d3go@u-jf4^bqv=%@?EFh*F=X$GCdVZqRVstvYt%c6bR!O?q=y3L0^Rdog zj5DOQaBvK~;z47`oyfx`nX^D4MjEpQ@d5*!>D+D|gT=`MM|I*~2JuMKK(<|R&kW}t zYc3k5IuBs@Z%=g|v6}D?W#oX!;d~3yPePd}++j7WIn(BJp0R)RYu_=fWf zYfO4+x--R=hPg4ukYaOCk;c!Gj#9*vW~E7Yq)V+6rK1_r9evJ`w%etb@}<^v3JiIL z(jkZBGo?Al+C0vgw(y1_Bze^X?*Rm_S(6bc#w&s18a&4!U{p!7a-~@af_c(AmQ|sDMnB7TE5De24UR<5ctw0nm08kFAKA9_a(t;+KVA6 z&Xlsv=@^1h(jHO00@Wi3X+OsZjU{eib(M3b-J#?-4yV`dl(r-FxEfRUYD~v^d%ARg zmh_m>Vcdb4y9crP=jL=2hx88fh(6zqVZjl}!tf1JVw0aVw`4p%hOm%i@{GHAo zdn%X;hCTKS=>W9q0k@x<(*TFFq&v6Sry^r3MHN#dU)qCtT4}|Exn4S7j9Mnv(R}GN zY-BdOjaQqo7MsW5nTBV&^aA*8Q+k=@++$BQ?6GGWwwqJA`Zt@hP=^8BPRRslI?_Rh z^dk~aeRbpMPLb|rn=DcmlX}e3s6E5kJ+o%@TIs6LvY8%c%XWI$E%JvR=l;>N9iXj2;ABm3#eFM#Ya)IULMRI>@?{j9(nMA*SxA)$E z?wv1d&e{97_S$Q&wf5SN$;E<@KVz04JlI}2tLK%OR|`^3b11ez3B{w=)hW?{KlEck zn$=$9bS`&=;}MUt9B^&8tvwJ_B2i}`Cd6YD;cRzDtwX0@CV10b z9nqN5CJ4SEjiH$0S0WkPe82IfM`Mvd$iL^(TYl=xtPVv3u0+{?aWip7d~T28U9@tQ z;)yw{eW<7nhtMkSi3P%;`V|YG7>uz-@r5G_l+qa+h;j5li3^pR8X?Xd@+fnNWn{C~ zmCNl@YTdzL{Th$bPF+2gd2oY2SBL8Y(RO#t)4H2#?TK2&=Z*(sbKM~?th9%)0v&6J zD2m?IUP5wogsB+N4)Uqe>(u z;Nu@s#S5R!zOpDem;rWs9PNBVYQo{5;tqXz(RRgeX^zB|)rapn=g-soVR|fdw<$m8 znpML&wQcPuuWvu(w^cQ{15t%rht*_M%?CceI_lp%^0i(Jgo?Gn$nu9DneET6;x=gr zgkaMSO$6(pHlny=%AZCqIe<3ReDL+}G#~NjR}E16hxX2Ss2||n{TA0F{;Vn{PqXIv zL+{<;&rS@5b+Us-ow+pNRiGNe?!)`Gf9bdBJmjGJX{1?IOMy2;!fiAJ?>o1xCbxuQ zi&iTUra5P*jzruY7~uKsKOO0})UOF}517r@+|jN)z=cvY)pdm26a-9+wZR>XDp9hz zW-ZOQ`I@yBg%Z)n8Vs$f3x|w0=goAJXUz}0y-iA#5AK?!_LY7a(SWI}cv)~{S26ns zZdRD?J;f8B@OXz{W;TXMd4I-SJwTUU_P2R}mIgxJ@J&(7TFcy}3+ozRd4HZ?o}G%5Z-G#2SNLhx_{yfhMs!GU0TgP>vqG+@$xLLB+ci;=P*45~P}K~9x6+-T}^ zi8~nJy@n9*ucoSWWn77LB+}9EQ~Mndkna)4D1&AcTnodofG^;2Q#LtH3`3ns4&U%E zo;0+H>z5#(B zX{x`-TMRH*bNEkWGGqUI;=YqANSlA}qTXk1o)5FH&WP;vr#spEvbPuYW6Dvr6Tya| zJv!kB_5KWAgV4H{ibkKJE)g2F;dm(a81-lzv5{jJK#$kT79j*-Ml-!NV&$29(Uxug zOlP88@LBsQ7(j=$xM&V<{qBR4jrDaA_f6FPZmPE@`Hg0NfUw*o#x1j(YV(q{nql@( zbxyLnHW={S@UK)kELjO}RI>%{wiEzk<-qp{C^WZ-$HH^Nu^W_*=$(X?3_#~2qM8&h zUpwzg5sf};0>jg;427i7`1hXOa9<_-^;#?M!o3+ zXYUSp6wM&X1uv_aGw_*@}2 zndHT5sDa5gjiJ@rF7teI<)>Cv?QMFEpf6N ziP6MkiY|>Oed088#Q-QVy_XPVnrg^RI8}MBC7{S?Fl}ebRgHX)a8vSzOm^_Sha-9bVhH*q zd4WPRClQ+bg!T$m(gBvoYmY+J4S#NN7 z&s$F;B^a9XNwA#6CTA2BY(@^Or&^oSAZ_9&-{0m@tPSBv8?BVqW_l}K|M)cj(CYSf zoJ-hI^-qP@-9yJW0xiv(e?aGE7T{FjG==D}TWcr4fd-fd7!T1Agq93MjUie{Jo@Bf z9V9|@Bth6GCi_ke(NV-<(#{m3#ROku7QnV$Mg>L_lb#ot0(D`o!bOCbRI3YX@*M*@ zHpTTgf|0S3nj2!~5(44GB*?>NBGsF0X`Bp~4iL$57az$a0`&~W#$dj`_!i-&ktAkP z#eiOo@j98%(MDYp^Gwgql>=laSf&wVat~j@c+f^KBiN+1`BG*&;aIeihSFy83<69p zV>=-%S~CeT4V1eQH>h!fOhXxP+j!FemI3!XYluZp_&i)`kIT$`GhwFjm=nw`gqzgX z6U@c|9qWjKYcrNcx{1X!GTN(Pd2|O=f=q$4)QzkA)w7X>1A^-TnS!t`vL}-inlf?TqViUZLp(O$3roCYGC?oJw0cKC~5UTy^fE}}) zjx^fESI5#othFxS4u<{LZnkgoC_~W>0i$idam&cd*o@8#eifxFwM2!p>KHnbQKmCF zWjGsw3$VyjMcMv2U-`2bzg{);j&X~8S;VwB+#YWyu3L}3+eRlpW1agKPyL%FOS@gV zq$O*TE=#M*oN($^1en%49dMkf`RbbZm_zWCk%hX{&RW+JY8FuKT}{7Kc=b!E>jo3x zj>h@1*-hvulX&xHX(cfXGcoYo;~`*#2|xtay4epQO#~LCf^)HRS_Z^3E%kS#^}=;~ z?|51AOiTO*WbsT(-a30x;AsmUYDFP&h1~9$reEa!%rnh!fAOJbTIvPHzk8;cPXC{K z#$(5)S(cys*9$%Gl}~jF6SK|r8-<5$i$19Mw&a}BAWRW-(FvW-qwnN-@^TEsa2Q-b z#bi8QNkwfwVK~cB)R))BG|#lJ5BlRk&7u7fY7DXaMVhBf)^9Y{3-o({P?I}V@RVg^ zF`=-jiDQN<5#03OS1?v^q$3I9p3N?dl^qtk07Mbp(wU1BkEy|B!o=KxwbRQ+ zm?dAgG#p_K(Z&0cr9dbhY7m2t44oF3yQ1)iK?Pxkv8zPwtg@k6S5yV@pIS)#5Y3Wy z!6BE*b>SsSB;f0?3z_NTL}#WjTM(q=FbmS}dD`-n#ZxvEp-OsbqBcvyRFkOmQVT(L zp+NSO|LxWvu0~*NH^qZU3$T4J5&`SlMP;iD7=)B?+($9Iu7w`*a%@zC-6dtJ( zCi2VORG{XPe1i!!exFbiA5+FJ7R?Q`O9mLITFOhCT2pGl1&z-x)TEb+PM0++%pa`2p)8Ltv?gw06Gr)gIWCApH|oZN=gyU;yA&u27s!%BbVIF7hZw*E(n&Agz3fQQM{s1g z+^ZFK!0-v#XB;W&`Gm}m9kMr;B8alqdNgiot5m@ll8*y z%Dp!WwqB`1kDdy{yp>2$2NP70Q<>!=jrlT7nI&Do#KS|H(vMFr22Z#{XK*^5LYaN= z&esdCP`_g~r5pM!wKAW=IMT(5e3edt*Q2R`X}vNUbu)TGRG zgG_E?E$S%|LhyE7uuc0dl$~+3gc>WQjC!wBHgFBYSTU7KWx_Aa5oAHA__*PEd4)xg z?Lx&eOZEliKj%<`dVP{*yLDr)xJ&ENIYjeApOoHX-P9}Y)&ZN*L4A_kVeRb|_i3o7 zjyju?gYMVo!0O+-uZmP*Domf2-r$wDLx&>a>6~qr$zsoiSH=tF=?wuT=#2`Nxng#& z_!N^gJ*PaQL60B7Qm`YZSA1GSJWSfG;}%HU1!*P1Z5cZ)p{FktL0Epn8ho_HpWnC% z7RjB_D;{FaXOUoi#zF9nKn`n&r&^E%Bx>oaG}c8;x74so{s>*<3VGs5OW`{f^k8Gn zH9rZ$*z0@67ny*Xobud;#DwGL1VI?z+AID}$88Ps-MB>ITN8w4d$0Jqj^#6qnyqFR zf!Oj2!k9I^;+r~07UM`LFBFJkulTlxI0B^&ZZ|I9j>SyXR*Ish~9F%N^;z@qeqa>*e0DMSc<7X{w zc{(O=AzbJHqjpQ_#l*aqN>Cc4Y{=>oI-* zuYZ!kpl!KQLPV?8&6zb=h%CA7Ao)&xOFg5$rl#{?IJlnzBWI6X&C2ny>b=WhZv@bE z1klud-9Yzm!q?vC@Wpsem25zG?UUh}$3&KSST)C_%46yQbOaE|#>RGhnsR9WkA~f4 zkTF=;wS<&4?FcZ%>qzwIz;B;HuS1VC*7uaJX|ElO9D%4K6plIENh#P~Vu$9^ZTA=T zC~TL;#;P9Ne--2mIN45pRegpV!@jQ_3IQ_O-NbK>yzU3U9aLF;P9hwCb)u*SYSTfaLHm0QdLeYwuBfF|eopyxMY3ZIZRp zIrdar&a2O;a{rZu>KmGr%D$_YE%SEgwyJ1~R*dh!Nfd-rXRf_w*|HS}@cNJXI}bAW zKVZ_Yqds>ah`Sin>2Z!%VJ#>%ZQOynIs*R(KG{qr;+uUaw+?m|W%F||Kv!KFWQvkR zxbaHYlBFAt#N^I{XSn&l*x1sKzYA!Wsd`}jx_%*+!@BbR&`QlZ58BiN*TIb|u+iW;AZt|ibvIO0 z_Wd&x{ObA-5EKmCaO~D0+AHR~K0xB4PpWTzgt|Tg{ue)koT{0F2C3K8FC4@_Y>J(L zcPfu`x18v1Io*wk!RFa+%zJ&FB~xN|J#5y}swO~np2g@gOvRi%wPP{kHr9;QT&upK z*7I4Hv#0Yx*oe^E=_O~6Yi1I2&C=foY3Q1(gFW@9RaXUfVasW~7NVvb-e(xzFE_k@ zSASP)o1sQ`O>a3ni-VJL#K28(ERQ)h(OYJAE_gPFAFEbqhsX_nq|3p!-;nzSS*1 zWAF4$S5$^!<4MoW~rVUF?Mc*g`F4r z6yJ&6E+US`! z0saagoUV;3>%2m|xpQ5G5MS82 zP8Q;G(M4Tq7x5|I(8U7N3`%sh0)sn%`FY#H6BqjXX^I~1?xEN21*f~~&(k#Anw*C4 z_f-{L$8t8zCYv6h961Y%+{~J(IbD~MC26XhSE~#Y2c_w3%<)PF5x?40G4u9T@W(IW z?CN?dRUToCOkh>chPSX*R32$*Z3E=(pW^KvL#0np%S*f|as_X76nn36YSe-immLB% zL&t}wR#+-<}PeAlAR z{{Ebs)Hzr8dV z+BXR<^-cBFz4XR}u+Uy5tinc=uQv|?;pIET|xq}`v+bd$D*&Anh$+#x5)x8IMKwaoLlhDL)ABCVEgdB6?K8&4fst;G+0@4nU zvWa%%L)#mgi<42s^=GIM=bABn5?#>VN|SeP#evRAC<@|%wiQDJ+cJwFF0)jDa>YN( zV!kZeWHDP73uMtQi@CB`D2qk1cv==emT^ZZ;{sI1J*+IAk;T7^x8a&mTwy6gb6Gr5 zVe7V7@R})#mQ3lKjlE{jYo@Kol9_g8S^+3q#JdzLu(qUSO2zYS+aO|_#UXA7ZG#q~ zB#Sr8;=VLldKo9 zb&wTp@<78uBSE7sPPVc2pQRu(T**mhWEh&$jPkTkYlvh4)C z6L#MP+6mjgj%Kj^cv-xiS$;ISoE?L6_6Vg z06he{4U_@iZajB_c7evByc^F+cpB|K9OcQN!@x%3`68aFc0Y-_k3empPeErvUx01| z#X%z4SwS6m*X{l`-g`isL0dtkz~6+8aIp*nl*0h9u~cE(Z5bn#XN$Wn`I2)g9+^ba zSUVosVzrbh)q^V9(rkx0<6&YPBW=hQ4;vYtu)S`XD86nfk#<|gq{8;8MYf%VO4G+mKeCCRTJpuSn1wA;34Wxpfl5T0l`~4D z@1zw;v&wB&Yq~Vs0mee<$9AbI+m>e)#5}7*91hB}=8AdH*BCJgB_ET;hY_QIDO~XQ z55|M4~0^1zVwHD>78=viZRl?1=4#Hr4NeGXRg!$UzLy^ z(tPeXhwX9{C}I}d#0N{Pq*QT<)Ko5wwB}2%BQj8*XQ@d5Q^W_MHiK-9)>$z5DycfH zSX$BqDP<@YgUX~GmN8aJqQ!+)N}$DKrJ!B95BiOl?k|$c?O;OC6-xKp#CmdAJ_C!5 zpxppoZk;Fvi=|MBbX6`wSVr?AxHwa~x(Kghpurev`4!NhkjB?&wM$d^_?m4UR-3I0 z&hW{$9)w7jHB-9QX4{TP*=}`6f6c`sS2_t%J&4{<5w)LM3P71sLq38oQ#y;lM^%!u z2rcr(FAJoVFy<`VPHVQf(^@FHF?U$AA{2q-+9V4qZCTQt!sc|TNRWE0Qt?MtVM}`Y Vb}Ke16Yygd9+T2L=rK9n{hz3ahsFQ^ literal 0 HcmV?d00001 diff --git a/internal/1/Lib/D11/TntRegistry.dcu b/internal/1/Lib/D11/TntRegistry.dcu new file mode 100644 index 0000000000000000000000000000000000000000..04755c48b06e287a846ae1d599cf97528a98fb64 GIT binary patch literal 4441 zcmbtX4@?`^8GrY{<}fBWgt>`Bsi7pI$>ya{GL~f(0gi;0fP?KgNukNbzB`;4+x4FW zvazy}wDB&UvcJ+0NsHE?X`9q4BP_`l2|<@^(Z-k*El8az+Ax)*2+-paI`~LpE@4btkL@0m%YJ`3ss@R^G_}T%4bDV)_3n%y@(QwyKkbZl}1cKUN zN66>r!V#M<;JI+5y8?#_ZMIhUID)aThilas*+OhYms7PBdG(I2NR;b9h&Q->Ud|B> z`vSuB>*wwZ>zvJpk8qx-&B5|qE$jC)ogOX}^#ubL4R4=J!8`aU7p@HkAeoqlz`ss| zYdAg_=IXd4JVaoV>b%Yu39(U6`z0bZC#4+E#{AJ;Y`_Z@4HImQiZyY^8z2}P@NmB& zK!FO>hdE9~E(5}6H3XuZz=gAa%8v@!4ldfr1%zljfkqg7;+M}t26B1zz5tNhMI7^VEgSZdeZ$0i&+~>Ifrt+* z)Fg5ngRHlOi^!rE+~&iA-r+mJHS?q-o>sGe-&9g89pNzB1(`0Ldu^Sd-w}y$;i$x0R<*qO=d*h(f?h+YTpS4Y z<&9l~Qb`D{ziS6Jb2GE7+P$Sr6h!|xPqzi?Ms=7x4_`fY-5{*7tpp06d!tpGoIC7`Do5-o5@mfV1qot0Loo4j zuuY%<#JPO|Z}4~oxYE_Rn_KG0UNN7FIi82hFNuqij73SDH5^hH&X(4@bjnxuQNl z@wX<~6I*SVW20PsNA#xU{VN`hT$vh0Gw@nbZuhfMxScv0BCdeX6ZCTQE5n?pQhUAj zpo5pc_ZRG`OkR|kp32lX@A6b?=J`2*k`42ED$}?);n|pLBXmG@(#_q2-U+_n@NR4zEHNGEbKj z6=ym)KW|1w`r<65H$1Y;TQlJF^2j`6r5emA(_qacXN5=kZ&@h^kMN?WpBl_U$W)Y9 zW_dV{Gz3bdCrBjb|BN)GM0zYOQtB}FAS(&;p6(3R7L-YH$Vb@lq#kZcc!!t~rmZv? z8Zux!GAvrNYGOROH(@gmHI4q)nlxvX>Fhy|lVAh-boTV#lw-3zy(fu%LH$einpRPQdZm@J*edK`J~eao@eUGc~G?pyKQOL5ntI9V~`YF|$wbgY|rkD3r z?QDvjtr$75f4?_wYA=CWRUI|KvAd+m4`&X(_=5P4wy{SOmGPNGU3er>B0*f!y`w4< zYIHF+l|~OI(KDT5^nW4cvj{n#B*gGJ37I03^G>{ND&967Z(E4B&5Iw2_vHaPvXYmL z31(irt+Zl3v3o(88PT;MUYEpoKLAE5M&is;f?2d5fvzmUD&CMlyQaNSqiS(UVs~j* z?+gyx;@vaXnc2JqGeeAB(*pn^IpFT;i&SbW$$GmNsaVzxW)Tw~uEoFJQ=F3EqFxUA z=oB7~HkEQO?w(o^O>rnrC_$2JzXVJrn5nBI3n?bhl-ekR_-<+t)kC0uLlfZSiXV%U zVmD3BZVfn;&#rh~;-%n9H~7BV3i8W8f<=ll03zvJJ9{5cv8SMBwKq^b95B(P998Jf z*nY|6?l~~gG?AGH#o3hNtg86oaiwRei9NdVK-<;E?u8z!r&-(Nr$HKLrmr(I(9&tC zrJq4^lGFw$6G&C~oV`l!L}{b&c}M1Rl*r*$Uj8zC*KTWd)|4OJ>}+ywc7&WY`x@L%sBWAHE7N_Q;MB7ymu3}7GSFhTP)aGCOzll5*scpz$FE^eJy#|SVaw* za2b4zc$39A^b9p5neUU$leQW|zezD1(io1`P@`a2gtuDofdX8$jp&5TxU4>-$AGsK zP%j$rX#?I?jxAvaRYpCwISn78QuyZ z%=i$j(!=3=Tn9D62Qq}jq@p^jGEQneTc~jpu9tn@G*0H@af5M6T4z>KGi#~y7HS5< znT$A-I&aLyXVLfd*n)6EhYO1_`k~P{jxhR2Hwf#$bwjXzq8o*k(oe#w(@(*gt!MuO D)Y6)X literal 0 HcmV?d00001 diff --git a/internal/1/Lib/D11/TntStdActns.dcu b/internal/1/Lib/D11/TntStdActns.dcu new file mode 100644 index 0000000000000000000000000000000000000000..0d9bc7106a88adfe9d039a3389298d3edae164eb GIT binary patch literal 62148 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%0A;%d=MtFDB$KbLO>EVvgIN)2<-uOxgn z%d*rU;x$j$Cz{1((QIiqn8lL@t7tS@#T=AtcrV7Y2E~rjfzpYx3*}W{@1vYYxr|Z? zTC*`vtjH6q^2F*ap&fnv&y?wqGY6%>f{S6HgUhwzS%G2|Y-8B(fT2hznPQ<)WpQGN{ZMy@A+D+)Ig3CZb=9m@F3Y4+Cn~vV5T5yXf_|P%6LT{ah zB5~Ff@vb~^woRO4v+OWbTlx(J;_NKTQweA;K?e*babAHqw?LepFV4@hylN0FCk+;{ z)?#_zU=iMj-m~wroHv*(mr=b;)m4^j3WL$eMdlbed$G}Esl;o8#ZrS;J4!Q3hcQcR zuv$8eRnX2Xb{eLNi*hZy6zV=>5uCY9e5*dqnPwKhS|m1E(`5B6Uwqpl`pd<|`QpzC z!B!}?Sj1)dmgkKU{>wv_xI-)iApUBd<$$peYh;1=l9(?Ro67NS727!PQR5U^IY5fU zL*nc>$5BXI4vqrLDWf6n-n1goo@Tb3HRf9`8nY}{jaA~xTuX+j8cS>rM9vb|l!$BU zQ8SB6!8}-qS4F~nOR=fYQfaET)R;(8E>@da?1o$0O<7`%n1%I1#b#+XS;V_Vi>1RP ziuVGSO?P2EO%d&4ep-K87T(R`2CK2hEV{R%g1JY(o@zWwM9*}w)+#n^LnU84nU;$( zU#v9ci5aFc@gn@+kya(1*#uRq$pYfhv^?Q2%;L@|;@8b$d)jpPp;>&&uqy2bX$9he zv_i2XEku2Yb76!j{0;Kkth^T(8hvU1YQeGGvKNEcYbp??84B?P$!ZY|s97?_$Jic| zSjfbFqgb@o#2zmxIbg(1#|+a^deoRs(c^B@S$f=S+D8w&=_)-OrVJAvjizFHIO$82 o$Yj$+!hELZ=@B*65V7CXOpiUL4tnf0+3B&*gndM0`%TXO1VG11?f?J) literal 0 HcmV?d00001 diff --git a/internal/1/Lib/D11/TntStrEdit_Design.dfm b/internal/1/Lib/D11/TntStrEdit_Design.dfm new file mode 100644 index 0000000..283cf15 --- /dev/null +++ b/internal/1/Lib/D11/TntStrEdit_Design.dfm @@ -0,0 +1,135 @@ +object TntStrEditDlg: TTntStrEditDlg + Left = 267 + Top = 258 + BorderStyle = bsDialog + Caption = 'Wide String List Editor' + ClientHeight = 279 + ClientWidth = 430 + Color = clBtnFace + ParentFont = True + OldCreateOrder = True + PopupMenu = StringEditorMenu + Position = poScreenCenter + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object TntGroupBox1: TTntGroupBox + Left = 8 + Top = 3 + Width = 413 + Height = 234 + TabOrder = 4 + object LineCount: TTntLabel + Left = 9 + Top = 9 + Width = 169 + Height = 17 + AutoSize = False + Caption = '0 lines' + end + object UnicodeEnabledLbl: TTntLabel + Left = 325 + Top = 9 + Width = 79 + Height = 13 + Alignment = taRightJustify + Caption = 'Unicode Enabled' + Font.Charset = DEFAULT_CHARSET + Font.Color = clGreen + Font.Height = -11 + Font.Name = 'MS Shell Dlg 2' + Font.Style = [] + ParentFont = False + Visible = False + end + object Memo: TTntMemo + Left = 8 + Top = 28 + Width = 397 + Height = 197 + ScrollBars = ssBoth + TabOrder = 0 + WordWrap = False + OnChange = UpdateStatus + OnKeyDown = Memo1KeyDown + end + end + object CodeWndBtn: TTntButton + Left = 8 + Top = 248 + Width = 75 + Height = 25 + Caption = '&Code Editor...' + Enabled = False + TabOrder = 0 + OnClick = CodeWndBtnClick + end + object HelpButton: TTntButton + Left = 345 + Top = 248 + Width = 75 + Height = 25 + Caption = '&Help' + TabOrder = 3 + OnClick = HelpButtonClick + end + object OKButton: TTntButton + Left = 185 + Top = 248 + Width = 75 + Height = 25 + Caption = '&OK' + Default = True + ModalResult = 1 + TabOrder = 1 + end + object CancelButton: TTntButton + Left = 265 + Top = 248 + Width = 75 + Height = 25 + Cancel = True + Caption = 'Cancel' + ModalResult = 2 + TabOrder = 2 + end + object OpenDialog: TTntOpenDialog + HelpContext = 26040 + DefaultExt = 'TXT' + Filter = + 'Text files (*.TXT)|*.TXT|Config files (*.SYS;*.INI)|*.SYS;*.INI|' + + 'Batch files (*.BAT)|*.BAT|All files (*.*)|*.*' + Options = [ofHideReadOnly, ofShowHelp, ofPathMustExist, ofFileMustExist, ofEnableSizing] + Title = 'Load string list' + Left = 200 + Top = 88 + end + object SaveDialog: TTntSaveDialog + HelpContext = 26050 + Filter = + 'Text files (*.TXT)|*.TXT|Config files (*.SYS;*.INI)|*.SYS;*.INI|' + + 'Batch files (*.BAT)|*.BAT|All files (*.*)|*.*' + Options = [ofOverwritePrompt, ofHideReadOnly, ofShowHelp, ofPathMustExist, ofEnableSizing] + Title = 'Save string list' + Left = 228 + Top = 88 + end + object StringEditorMenu: TTntPopupMenu + Left = 168 + Top = 88 + object LoadItem: TTntMenuItem + Caption = '&Load...' + OnClick = FileOpenClick + end + object SaveItem: TTntMenuItem + Caption = '&Save...' + OnClick = FileSaveClick + end + object CodeEditorItem: TTntMenuItem + Caption = '&Code Editor...' + Enabled = False + Visible = False + OnClick = CodeWndBtnClick + end + end +end diff --git a/internal/1/Lib/D11/TntSysUtils.dcu b/internal/1/Lib/D11/TntSysUtils.dcu new file mode 100644 index 0000000000000000000000000000000000000000..7277397fbcd83e9a70aaf1bc0b60a41e145dce61 GIT binary patch literal 28541 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 rzy;Up15)O literal 0 HcmV?d00001 diff --git a/internal/1/Lib/D11/TntUnicodeVcl.dcp b/internal/1/Lib/D11/TntUnicodeVcl.dcp new file mode 100644 index 0000000000000000000000000000000000000000..07822608aee6432cefc1ea1caeb3caf0cee2c245 GIT binary patch literal 997889 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

bP8 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

^Lj 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

*bbF}Cd) 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 KJWpcn+y4vpPzPrK literal 0 HcmV?d00001 diff --git a/internal/1/Lib/D11/TntUnicodeVcl.dcu b/internal/1/Lib/D11/TntUnicodeVcl.dcu new file mode 100644 index 0000000000000000000000000000000000000000..fad0ae5296eb6bfc3c1ee84af05816fe667bf1cc GIT binary patch literal 4469 zcmeHJfr}Jn6rbO8xBG70vr|l_u#l2iA|%QcF_Ck3JI~nF%iGgKqMZBoyS?#dXSUh7 z^OO(?i--!dkcf~J5s8S12#JWSjEoG4hzN;@2#tu4h={PhZ)bMqTxaGV$c4H4-h1DB z-}~P8-tWCT6lL+uB1Jjbyl>re=kMR4s0&wCEqBZ^m|f%Bn0Yv*taBD!#adZ&CjS+` zo^HOwTStW*wb{MDIekp<6`mU1({g!3QR>+t!_rM-ukISQb!lhw4C84b++-Q9ln##Q zY+A4LvaQ#SU)X%KzOcg?v&;^U2IcmV>H2}??n8|CZ(y!5%Qsajk5ZY$h76NSw>w@xFz1#`sld1tZ{>BP^K*t1rbWCENn;% zB^gjO*G~=-w1()8+8+jgCONFvs7Y`$8 zSrRf#x;yGReu6N5qu_2gYJ5JAw&{+cTW(B1(}@{KBHt6zPuflpr>lFKo2*GYI(O4W zGa+$PMZ2+OVpp^(Rc1`rsMsPjQNbrs$TFv6u1sMpWYu{KtWVD>Z3X60r z5n#kK8_kJ04D3y)_1+|yNCut0EhZo3&MbGLZ?wR#62pqa#dLrokyj2NGD_N0(c?lb zL+KZJlqQL+PrxH823QuUJ^GkgH5#Mso_B3WObu141s2ncREcwuMnl+%5~oXrk?n0z zijgK9(VlI4YN$7wD_^99AZvVKK`~WDmxIr5+vBgyzu!2rpy# zcIyaWcX>y_$I2BR9h6+oQwUr5-QI>EL05VkLd?6zV}vMoug3^0YL&;3(f5FE4a?7K z+iN|_uiW+C=Fy-j7d%FY870r7prD5Q^MYI+_6+*%^g&-7R6?2MJB@h6zkR0@Z|%^& zZZ&X5IxnzrJaEQm>|pt>-urOJhQH$xPbKWWJ3U5N2NNtG)qiU&e{BPvWUFOXVIa3; za3gp9K~#3dsy<=z{feAcmF$43u-sL1sxMjEmUPXl^JPcWT-S`fzn#WP=E#*nxiZLy z0)9?ajEo#|#Xu;^=BywiojRi`=92^agf2+~*MHX|a6JP5y9k_;H~zT&_hR?*l4LY4 zE7{X3;k2ruhmg`>60Bh~2@b&}%o3&uyEM!Z_7WZ^?9;HH@Pvi~gr^8k6P_VFOL$(x zLBgS7yhJ!mc$x5uhF1wk2(J;2X*fJ&8;j)H52!H1A z7vXQhKZGj;h-meyIaCSTPNGjx{o-3BzMI5%v-oaRhqGr?Rm3!tJ?s5fGnwo;f0@l> URaIR`{pvyG1ywzyyr?Mpf0rS5uK)l5 literal 0 HcmV?d00001 diff --git a/internal/1/Lib/D11/TntUnicodeVcl110.bpl b/internal/1/Lib/D11/TntUnicodeVcl110.bpl new file mode 100644 index 0000000000000000000000000000000000000000..7364c1a1604e1f6539329469049412b994e6b325 GIT binary patch literal 754176 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°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 z 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 JrkF+F{{@-a+o1pe literal 0 HcmV?d00001 diff --git a/internal/1/Lib/D11/TntUnicodeVcl_Design.dcu b/internal/1/Lib/D11/TntUnicodeVcl_Design.dcu new file mode 100644 index 0000000000000000000000000000000000000000..1ce835afaf3b024a1dee06edd5393ef376bf930a GIT binary patch literal 5809 zcmeHKeQXp}5Z~F9ySd{)Xi8ZS41VS`aDL#Cs%YA~YiUgn4(?hIQQ7W2u1oiJkG(Bi z5e*tJXvBaY#7`m$28|juVu&%u_!TwA5Mzun#HcZb5;0=L7-P_Rd)LzT_U->B-E{i) z-fw2!yqS6PW-pec#@CxA>2PWB(%r{ySS!i1VmZ_4F?G$#vtG@(BgM*k!Q2;+mfDIJ z63g2g{-tNGeSR#qj{d3w>xj3#;-rj1IhNP#$j)1@RO&fWx@uTe4(rZCvF3V?#GvC? zrmJJ0zH(8MJ!j%7%WOUG;?M6~yr{7r@38Emiy!MxESh1@n24^-7Xfag?R2 z>(f|+AS5;`AEbcFB|*eW1BVEfSRgx8c34r83Xu-oR1JNr>gbj^yuS32#)1TPnYzQ# z){LqRs0G$-sriG)mmerhADQVfjgdKQd*}#oE|hBJ#CrZy0Pj{dq@B;v(-|+u8GzjIV9fFp-yJdzMKsr@rHT*m2_{(kh^0ZD{mY}N{crftW`e&nl$uMpPlzcr?@9e zfVuhWjbYL<9orJ+-qfyCdzzKYbkqe7nVD2e{1mZ#%F+gMHWPR?SS#G#W&~?jgE!ic zRz)u7F6D_Nu#UD@t&jr6Ikit98Fsg$_GOt{@aoH9V}{upGaYh`|IPzs!-~F*-WCM8 z@o80X!a^>}FB@;^8EZ0GXUJfj&AkY`*)XA&T_XiB71aTstmQCIFOf9G-3Km~D@7x3 z38VvlU~o;ko0kB=!a0lbwk^};4Tq_4`cc{>0Ck++zoO{a1UZC(QOr|CHJ;Em`Y?;`=LHT zbF;46!FemkWIxjey32wMMUsPM$13VunaF_tX_U9;nmdU3|Z2m<9hlU((ED= zdi$~1emUy>eYoBAxD?)hww1r>Si3;k8ClZ9{JVg@^eDQg>8Gb{r)0@svyYH0as`vm zqz5KFFzJCw5Bx7YaFkp5f&2f&#MfayQ9L3`kzpBOSXQ6`A)r7M;ffYmh!8`#3gH@r zOAszo;97(w3bY_xkFXTsrYN)`BoI;v9SU?J+}sJ>2+I*N2&)vxA@m}wL0GH6I)vL1 z)+6*GV(ye2DNd!Y2ryMd5RVFA$C)e2MTC!q*7jAbg8(9N{|!zDM{G;U|Qj5l$eS zRNxncU!(9F!tV%wApEJoUkHCI@DIXS1wclaLVgX=IE`o~(JZ1lMDyheTu9@kauhD7 zaS_qgL~)|)h;AfmBWfr4E*jHBD~WpKPPm1}+h|^;k&zyq#v;)sqCuJ;qVX;o@1b!g z(fvfbiS`mbM(aI6<1?h^0F8&_UGO4}uh8##2p1@@0O2Afa!QsdC&H1_)lm+IBWG%_ Xk#Izo<>@$0-XramWk-5MlGOhINE5^X literal 0 HcmV?d00001 diff --git a/internal/1/Lib/D11/TntUnicodeVcl_Design110.bpl b/internal/1/Lib/D11/TntUnicodeVcl_Design110.bpl new file mode 100644 index 0000000000000000000000000000000000000000..c2717c8278eb8852a4c399f1dc3ee3ad0a93339e GIT binary patch literal 103936 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 literal 0 HcmV?d00001 diff --git a/internal/1/Lib/D11/TntUnicodeVcl_Register.dcu b/internal/1/Lib/D11/TntUnicodeVcl_Register.dcu new file mode 100644 index 0000000000000000000000000000000000000000..50e3a083233bd260594d48ade1e52a09537de261 GIT binary patch literal 5295 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 literal 0 HcmV?d00001 diff --git a/internal/1/Lib/D11/TntWindows.dcu b/internal/1/Lib/D11/TntWindows.dcu new file mode 100644 index 0000000000000000000000000000000000000000..bdf255ccf8607d1679e63cadaa1df802f032b969 GIT binary patch literal 25935 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 CeOptions" for both the C++ Builder and the Delphi. + + +---A note on fonts---------------------- + +The default TFont uses "MS Sans Serif" which doesn't work well with most non-ANSI characters. I'd recommend using a TrueType font such as "Tahoma" if it is installed on the machine. To make TFont use a different font like "Tahoma" add this to the first line in the project: + + Graphics.DefFontData.Name := 'Tahoma'; + +You might have to include "Graphics" in the file's uses clauses. Furthermore, adding this line of code to the project will cause the changed setting to only be applied at runtime, not at design time. To make a designtime change, you'd have to add this line to the initialization section of a unit in a design package. + +Regarding the IDE, I use GExperts to change the font of the Object Inspector. The Wide String List editor uses the font used by the object inspector. + +Also keep in mind that the font used by certain message boxes come from that set by Windows' Display properties. + + +---Background---------------------------- + +Designing software for an international audience, I've always wanted to write a full UNICODE application. My approach so far, has been to write Unicode on the inside, and MBCS on the outside. This has always been frustrating, because (even on Windows NT/2000/XP which provide native Unicode window controls) the WideStrings inside my application and databases were always confined to an ANSI VCL. And, since the VCL was designed to wrap the low-level Windows details, why shouldn't the VCL hide the fact that sometimes native Unicode controls are not possible on the given version of Windows. I believe the VCL should be written with a Unicode interface, even if it must (at times) deal with an ANSI operating system. For example, TEdit should expose Text as a WideString, even if it has to convert the WideString to an AnsiString on the Windows 9X platform. + +In the past, the ANSI VCL may have made a little sense, considering that there were many more users of Windows 9X, than Windows NT. There would have been some performance penalty to use WideStrings on the Windows 9X platform. But with the faster computers of today, and with more people using platforms such as Windows 2000 and Windows XP, the ANSI VCL just doesn't make sense anymore. In fact, having to use the the ANSI VCL on Windows NT/2000/XP is slower because of the constant conversion to and from UNICODE inside Windows. + +My coding signature is Tnt. I will use this to denote my classes from others. + +For more information about me: +Some of my software projects (all written in Delphi). + TntMPD (contact manager for missionaries) + + Jesus Film Screen Saver + + ActiveX SCR control + + +---Design Goals---------------------------- + +I want the controls to work on Windows 95, 98, ME, NT, 2000, XP, etc. I want a single EXE for all platforms. Of course, full UNICODE support is only truly available on NT/2000/XP. In other words, the controls should automatically scale to take advantage of native Unicode support when possible. + +I want the controls to inherit from the Delphi VCL. I want to reuse as much code as possible. For the most part this makes sense. The only sticky part is where text messages get passed around. But I believe I've gotten past this through strategic subclassing at various points in the message flow chain. To give a rough comparison of why this is so important, check out the following chart which compares the lines of code in the VCL for a given control (4,397 in all), and the lines of code required in my descendent controls (655 in all). Besides saving lines of code, I get the advantage of automatically inheriting new features as new versions of Delphi come out. One such example is the AlphaBlending feature in the Delphi 6 TForm. Even though I use Delphi 5 now, I won't have to add any code to get this new feature. + +---More Interesting Information---------------------------- +Case Study: Porting an MFC Application to Unicode: It looks like the FrontPage 2002 team did the roughly the same thing to MFC as what I'm doing to the VCL. They did this with the same goal in mind: to support Unicode as much as possible depending on the support offered by Windows. Another goal was "Don’t abandon MFC; don’t rewrite app". Because they still want to support Windows 9X using the same worldwide EXE used everywhere. They couldn't just compile with the _UNICODE directive. They had to start with the ANSI MFC, strategically subclassing window procedures at just the right places. Hmmm... sounds familiar. \ No newline at end of file diff --git a/internal/1/Reset Tnt Palette.reg b/internal/1/Reset Tnt Palette.reg new file mode 100644 index 0000000000000000000000000000000000000000..649c0f7a39ac42144b4c8fead218cd83dfbc00d8 GIT binary patch literal 1669 zcmeH{%}T>S7)8%o@Et<-N@=WJbzx1Y(jq0XRH;&gq%{x{Ne6s;^` nil then + begin + FIntf := nil; + end; +end; + +function TCActiveIMM.GetDefaultInterface: IActiveIMMApp; +begin + if FIntf = nil then + Connect; + Assert(FIntf <> nil, 'DefaultInterface is NULL. Component is not connected to Server. You must call ''Connect'' or ''ConnectTo'' before this operation'); + Result := FIntf; +end; + +constructor TCActiveIMM.Create(AOwner: TComponent); +begin + inherited Create(AOwner); +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + FProps := TCActiveIMMProperties.Create(Self); +{$ENDIF} +end; + +destructor TCActiveIMM.Destroy; +begin +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + FProps.Free; +{$ENDIF} + inherited Destroy; +end; + +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} +function TCActiveIMM.GetServerProperties: TCActiveIMMProperties; +begin + Result := FProps; +end; +{$ENDIF} + +function TCActiveIMM.AssociateContext(var hWnd: _RemotableHandle; hIME: LongWord; + out phPrev: LongWord): HResult; +begin + Result := DefaultInterface.AssociateContext(hWnd, hIME, phPrev); +end; + +function TCActiveIMM.ConfigureIMEA(var hKL: Pointer; var hWnd: _RemotableHandle; dwMode: LongWord; + var pData: REGISTERWORDA): HResult; +begin + Result := DefaultInterface.ConfigureIMEA(hKL, hWnd, dwMode, pData); +end; + +function TCActiveIMM.ConfigureIMEW(var hKL: Pointer; var hWnd: _RemotableHandle; dwMode: LongWord; + var pData: REGISTERWORDW): HResult; +begin + Result := DefaultInterface.ConfigureIMEW(hKL, hWnd, dwMode, pData); +end; + +function TCActiveIMM.CreateContext(out phIMC: LongWord): HResult; +begin + Result := DefaultInterface.CreateContext(phIMC); +end; + +function TCActiveIMM.DestroyContext(hIME: LongWord): HResult; +begin + Result := DefaultInterface.DestroyContext(hIME); +end; + +function TCActiveIMM.EnumRegisterWordA(var hKL: Pointer; szReading: PAnsiChar; dwStyle: LongWord; + szRegister: PAnsiChar; var pData: Pointer; + out pEnum: IEnumRegisterWordA): HResult; +begin + Result := DefaultInterface.EnumRegisterWordA(hKL, szReading, dwStyle, szRegister, pData, pEnum); +end; + +function TCActiveIMM.EnumRegisterWordW(var hKL: Pointer; szReading: PWideChar; dwStyle: LongWord; + szRegister: PWideChar; var pData: Pointer; + out pEnum: IEnumRegisterWordW): HResult; +begin + Result := DefaultInterface.EnumRegisterWordW(hKL, szReading, dwStyle, szRegister, pData, pEnum); +end; + +function TCActiveIMM.EscapeA(var hKL: Pointer; hIMC: LongWord; uEscape: SYSUINT; + var pData: Pointer; out plResult: LONG_PTR): HResult; +begin + Result := DefaultInterface.EscapeA(hKL, hIMC, uEscape, pData, plResult); +end; + +function TCActiveIMM.EscapeW(var hKL: Pointer; hIMC: LongWord; uEscape: SYSUINT; + var pData: Pointer; out plResult: LONG_PTR): HResult; +begin + Result := DefaultInterface.EscapeW(hKL, hIMC, uEscape, pData, plResult); +end; + +function TCActiveIMM.GetCandidateListA(hIMC: LongWord; dwIndex: LongWord; uBufLen: SYSUINT; + out pCandList: CANDIDATELIST; out puCopied: SYSUINT): HResult; +begin + Result := DefaultInterface.GetCandidateListA(hIMC, dwIndex, uBufLen, pCandList, puCopied); +end; + +function TCActiveIMM.GetCandidateListW(hIMC: LongWord; dwIndex: LongWord; uBufLen: SYSUINT; + out pCandList: CANDIDATELIST; out puCopied: SYSUINT): HResult; +begin + Result := DefaultInterface.GetCandidateListW(hIMC, dwIndex, uBufLen, pCandList, puCopied); +end; + +function TCActiveIMM.GetCandidateListCountA(hIMC: LongWord; out pdwListSize: LongWord; + out pdwBufLen: LongWord): HResult; +begin + Result := DefaultInterface.GetCandidateListCountA(hIMC, pdwListSize, pdwBufLen); +end; + +function TCActiveIMM.GetCandidateListCountW(hIMC: LongWord; out pdwListSize: LongWord; + out pdwBufLen: LongWord): HResult; +begin + Result := DefaultInterface.GetCandidateListCountW(hIMC, pdwListSize, pdwBufLen); +end; + +function TCActiveIMM.GetCandidateWindow(hIMC: LongWord; dwIndex: LongWord; + out pCandidate: CANDIDATEFORM): HResult; +begin + Result := DefaultInterface.GetCandidateWindow(hIMC, dwIndex, pCandidate); +end; + +function TCActiveIMM.GetCompositionFontA(hIMC: LongWord; out plf: LOGFONTA): HResult; +begin + Result := DefaultInterface.GetCompositionFontA(hIMC, plf); +end; + +function TCActiveIMM.GetCompositionFontW(hIMC: LongWord; out plf: LOGFONTW): HResult; +begin + Result := DefaultInterface.GetCompositionFontW(hIMC, plf); +end; + +function TCActiveIMM.GetCompositionStringA(hIMC: LongWord; dwIndex: LongWord; dwBufLen: LongWord; + out plCopied: Integer; out pBuf: Pointer): HResult; +begin + Result := DefaultInterface.GetCompositionStringA(hIMC, dwIndex, dwBufLen, plCopied, pBuf); +end; + +function TCActiveIMM.GetCompositionStringW(hIMC: LongWord; dwIndex: LongWord; dwBufLen: LongWord; + out plCopied: Integer; out pBuf: Pointer): HResult; +begin + Result := DefaultInterface.GetCompositionStringW(hIMC, dwIndex, dwBufLen, plCopied, pBuf); +end; + +function TCActiveIMM.GetCompositionWindow(hIMC: LongWord; out pCompForm: COMPOSITIONFORM): HResult; +begin + Result := DefaultInterface.GetCompositionWindow(hIMC, pCompForm); +end; + +function TCActiveIMM.GetContext(var hWnd: _RemotableHandle; out phIMC: LongWord): HResult; +begin + Result := DefaultInterface.GetContext(hWnd, phIMC); +end; + +function TCActiveIMM.GetConversionListA(var hKL: Pointer; hIMC: LongWord; pSrc: PAnsiChar; + uBufLen: SYSUINT; uFlag: SYSUINT; out pDst: CANDIDATELIST; + out puCopied: SYSUINT): HResult; +begin + Result := DefaultInterface.GetConversionListA(hKL, hIMC, pSrc, uBufLen, uFlag, pDst, puCopied); +end; + +function TCActiveIMM.GetConversionListW(var hKL: Pointer; hIMC: LongWord; pSrc: PWideChar; + uBufLen: SYSUINT; uFlag: SYSUINT; out pDst: CANDIDATELIST; + out puCopied: SYSUINT): HResult; +begin + Result := DefaultInterface.GetConversionListW(hKL, hIMC, pSrc, uBufLen, uFlag, pDst, puCopied); +end; + +function TCActiveIMM.GetConversionStatus(hIMC: LongWord; out pfdwConversion: LongWord; + out pfdwSentence: LongWord): HResult; +begin + Result := DefaultInterface.GetConversionStatus(hIMC, pfdwConversion, pfdwSentence); +end; + +function TCActiveIMM.GetDefaultIMEWnd(var hWnd: _RemotableHandle; out phDefWnd: wireHWND): HResult; +begin + Result := DefaultInterface.GetDefaultIMEWnd(hWnd, phDefWnd); +end; + +function TCActiveIMM.GetDescriptionA(var hKL: Pointer; uBufLen: SYSUINT; szDescription: PAnsiChar; + out puCopied: SYSUINT): HResult; +begin + Result := DefaultInterface.GetDescriptionA(hKL, uBufLen, szDescription, puCopied); +end; + +function TCActiveIMM.GetDescriptionW(var hKL: Pointer; uBufLen: SYSUINT; szDescription: PWideChar; + out puCopied: SYSUINT): HResult; +begin + Result := DefaultInterface.GetDescriptionW(hKL, uBufLen, szDescription, puCopied); +end; + +function TCActiveIMM.GetGuideLineA(hIMC: LongWord; dwIndex: LongWord; dwBufLen: LongWord; + pBuf: PAnsiChar; out pdwResult: LongWord): HResult; +begin + Result := DefaultInterface.GetGuideLineA(hIMC, dwIndex, dwBufLen, pBuf, pdwResult); +end; + +function TCActiveIMM.GetGuideLineW(hIMC: LongWord; dwIndex: LongWord; dwBufLen: LongWord; + pBuf: PWideChar; out pdwResult: LongWord): HResult; +begin + Result := DefaultInterface.GetGuideLineW(hIMC, dwIndex, dwBufLen, pBuf, pdwResult); +end; + +function TCActiveIMM.GetIMEFileNameA(var hKL: Pointer; uBufLen: SYSUINT; szFileName: PAnsiChar; + out puCopied: SYSUINT): HResult; +begin + Result := DefaultInterface.GetIMEFileNameA(hKL, uBufLen, szFileName, puCopied); +end; + +function TCActiveIMM.GetIMEFileNameW(var hKL: Pointer; uBufLen: SYSUINT; szFileName: PWideChar; + out puCopied: SYSUINT): HResult; +begin + Result := DefaultInterface.GetIMEFileNameW(hKL, uBufLen, szFileName, puCopied); +end; + +function TCActiveIMM.GetOpenStatus(hIMC: LongWord): HResult; +begin + Result := DefaultInterface.GetOpenStatus(hIMC); +end; + +function TCActiveIMM.GetProperty(var hKL: Pointer; fdwIndex: LongWord; out pdwProperty: LongWord): HResult; +begin + Result := DefaultInterface.GetProperty(hKL, fdwIndex, pdwProperty); +end; + +function TCActiveIMM.GetRegisterWordStyleA(var hKL: Pointer; nItem: SYSUINT; + out pStyleBuf: STYLEBUFA; out puCopied: SYSUINT): HResult; +begin + Result := DefaultInterface.GetRegisterWordStyleA(hKL, nItem, pStyleBuf, puCopied); +end; + +function TCActiveIMM.GetRegisterWordStyleW(var hKL: Pointer; nItem: SYSUINT; + out pStyleBuf: STYLEBUFW; out puCopied: SYSUINT): HResult; +begin + Result := DefaultInterface.GetRegisterWordStyleW(hKL, nItem, pStyleBuf, puCopied); +end; + +function TCActiveIMM.GetStatusWindowPos(hIMC: LongWord; out pptPos: tagPOINT): HResult; +begin + Result := DefaultInterface.GetStatusWindowPos(hIMC, pptPos); +end; + +function TCActiveIMM.GetVirtualKey(var hWnd: _RemotableHandle; out puVirtualKey: SYSUINT): HResult; +begin + Result := DefaultInterface.GetVirtualKey(hWnd, puVirtualKey); +end; + +function TCActiveIMM.InstallIMEA(szIMEFileName: PAnsiChar; szLayoutText: PAnsiChar; out phKL: Pointer): HResult; +begin + Result := DefaultInterface.InstallIMEA(szIMEFileName, szLayoutText, phKL); +end; + +function TCActiveIMM.InstallIMEW(szIMEFileName: PWideChar; szLayoutText: PWideChar; + out phKL: Pointer): HResult; +begin + Result := DefaultInterface.InstallIMEW(szIMEFileName, szLayoutText, phKL); +end; + +function TCActiveIMM.IsIME(var hKL: Pointer): HResult; +begin + Result := DefaultInterface.IsIME(hKL); +end; + +function TCActiveIMM.IsUIMessageA(var hWndIME: _RemotableHandle; msg: SYSUINT; wParam: UINT_PTR; + lParam: LONG_PTR): HResult; +begin + Result := DefaultInterface.IsUIMessageA(hWndIME, msg, wParam, lParam); +end; + +function TCActiveIMM.IsUIMessageW(var hWndIME: _RemotableHandle; msg: SYSUINT; wParam: UINT_PTR; + lParam: LONG_PTR): HResult; +begin + Result := DefaultInterface.IsUIMessageW(hWndIME, msg, wParam, lParam); +end; + +function TCActiveIMM.NotifyIME(hIMC: LongWord; dwAction: LongWord; dwIndex: LongWord; + dwValue: LongWord): HResult; +begin + Result := DefaultInterface.NotifyIME(hIMC, dwAction, dwIndex, dwValue); +end; + +function TCActiveIMM.REGISTERWORDA(var hKL: Pointer; szReading: PAnsiChar; dwStyle: LongWord; + szRegister: PAnsiChar): HResult; +begin + Result := DefaultInterface.REGISTERWORDA(hKL, szReading, dwStyle, szRegister); +end; + +function TCActiveIMM.REGISTERWORDW(var hKL: Pointer; szReading: PWideChar; dwStyle: LongWord; + szRegister: PWideChar): HResult; +begin + Result := DefaultInterface.REGISTERWORDW(hKL, szReading, dwStyle, szRegister); +end; + +function TCActiveIMM.ReleaseContext(var hWnd: _RemotableHandle; hIMC: LongWord): HResult; +begin + Result := DefaultInterface.ReleaseContext(hWnd, hIMC); +end; + +function TCActiveIMM.SetCandidateWindow(hIMC: LongWord; var pCandidate: CANDIDATEFORM): HResult; +begin + Result := DefaultInterface.SetCandidateWindow(hIMC, pCandidate); +end; + +function TCActiveIMM.SetCompositionFontA(hIMC: LongWord; var plf: LOGFONTA): HResult; +begin + Result := DefaultInterface.SetCompositionFontA(hIMC, plf); +end; + +function TCActiveIMM.SetCompositionFontW(hIMC: LongWord; var plf: LOGFONTW): HResult; +begin + Result := DefaultInterface.SetCompositionFontW(hIMC, plf); +end; + +function TCActiveIMM.SetCompositionStringA(hIMC: LongWord; dwIndex: LongWord; var pComp: Pointer; + dwCompLen: LongWord; var pRead: Pointer; + dwReadLen: LongWord): HResult; +begin + Result := DefaultInterface.SetCompositionStringA(hIMC, dwIndex, pComp, dwCompLen, pRead, dwReadLen); +end; + +function TCActiveIMM.SetCompositionStringW(hIMC: LongWord; dwIndex: LongWord; var pComp: Pointer; + dwCompLen: LongWord; var pRead: Pointer; + dwReadLen: LongWord): HResult; +begin + Result := DefaultInterface.SetCompositionStringW(hIMC, dwIndex, pComp, dwCompLen, pRead, dwReadLen); +end; + +function TCActiveIMM.SetCompositionWindow(hIMC: LongWord; var pCompForm: COMPOSITIONFORM): HResult; +begin + Result := DefaultInterface.SetCompositionWindow(hIMC, pCompForm); +end; + +function TCActiveIMM.SetConversionStatus(hIMC: LongWord; fdwConversion: LongWord; + fdwSentence: LongWord): HResult; +begin + Result := DefaultInterface.SetConversionStatus(hIMC, fdwConversion, fdwSentence); +end; + +function TCActiveIMM.SetOpenStatus(hIMC: LongWord; fOpen: Integer): HResult; +begin + Result := DefaultInterface.SetOpenStatus(hIMC, fOpen); +end; + +function TCActiveIMM.SetStatusWindowPos(hIMC: LongWord; var pptPos: tagPOINT): HResult; +begin + Result := DefaultInterface.SetStatusWindowPos(hIMC, pptPos); +end; + +function TCActiveIMM.SimulateHotKey(var hWnd: _RemotableHandle; dwHotKeyID: LongWord): HResult; +begin + Result := DefaultInterface.SimulateHotKey(hWnd, dwHotKeyID); +end; + +function TCActiveIMM.UnregisterWordA(var hKL: Pointer; szReading: PAnsiChar; dwStyle: LongWord; + szUnregister: PAnsiChar): HResult; +begin + Result := DefaultInterface.UnregisterWordA(hKL, szReading, dwStyle, szUnregister); +end; + +function TCActiveIMM.UnregisterWordW(var hKL: Pointer; szReading: PWideChar; dwStyle: LongWord; + szUnregister: PWideChar): HResult; +begin + Result := DefaultInterface.UnregisterWordW(hKL, szReading, dwStyle, szUnregister); +end; + +function TCActiveIMM.Activate(fRestoreLayout: Integer): HResult; +begin + Result := DefaultInterface.Activate(fRestoreLayout); +end; + +function TCActiveIMM.Deactivate: HResult; +begin + Result := DefaultInterface.Deactivate; +end; + +function TCActiveIMM.OnDefWindowProc(var hWnd: _RemotableHandle; msg: SYSUINT; wParam: UINT_PTR; + lParam: LONG_PTR; out plResult: LONG_PTR): HResult; +begin + Result := DefaultInterface.OnDefWindowProc(hWnd, msg, wParam, lParam, plResult); +end; + +function TCActiveIMM.FilterClientWindows(var aaClassList: Word; uSize: SYSUINT): HResult; +begin + Result := DefaultInterface.FilterClientWindows(aaClassList, uSize); +end; + +function TCActiveIMM.GetCodePageA(var hKL: Pointer; out uCodePage: SYSUINT): HResult; +begin + Result := DefaultInterface.GetCodePageA(hKL, uCodePage); +end; + +function TCActiveIMM.GetLangId(var hKL: Pointer; out plid: Word): HResult; +begin + Result := DefaultInterface.GetLangId(hKL, plid); +end; + +function TCActiveIMM.AssociateContextEx(var hWnd: _RemotableHandle; hIMC: LongWord; + dwFlags: LongWord): HResult; +begin + Result := DefaultInterface.AssociateContextEx(hWnd, hIMC, dwFlags); +end; + +function TCActiveIMM.DisableIME(idThread: LongWord): HResult; +begin + Result := DefaultInterface.DisableIME(idThread); +end; + +function TCActiveIMM.GetImeMenuItemsA(hIMC: LongWord; dwFlags: LongWord; dwType: LongWord; + var pImeParentMenu: IMEMENUITEMINFOA; + out pImeMenu: IMEMENUITEMINFOA; dwSize: LongWord; + out pdwResult: LongWord): HResult; +begin + Result := DefaultInterface.GetImeMenuItemsA(hIMC, dwFlags, dwType, pImeParentMenu, pImeMenu, + dwSize, pdwResult); +end; + +function TCActiveIMM.GetImeMenuItemsW(hIMC: LongWord; dwFlags: LongWord; dwType: LongWord; + var pImeParentMenu: IMEMENUITEMINFOW; + out pImeMenu: IMEMENUITEMINFOW; dwSize: LongWord; + out pdwResult: LongWord): HResult; +begin + Result := DefaultInterface.GetImeMenuItemsW(hIMC, dwFlags, dwType, pImeParentMenu, pImeMenu, + dwSize, pdwResult); +end; + +function TCActiveIMM.EnumInputContext(idThread: LongWord; out ppEnum: IEnumInputContext): HResult; +begin + Result := DefaultInterface.EnumInputContext(idThread, ppEnum); +end; + +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} +constructor TCActiveIMMProperties.Create(AServer: TCActiveIMM); +begin + inherited Create; + FServer := AServer; +end; + +function TCActiveIMMProperties.GetDefaultInterface: IActiveIMMApp; +begin + Result := FServer.DefaultInterface; +end; + +{$ENDIF} + +end. diff --git a/internal/1/Source/TntActnList.pas b/internal/1/Source/TntActnList.pas new file mode 100644 index 0000000..0f3e698 --- /dev/null +++ b/internal/1/Source/TntActnList.pas @@ -0,0 +1,835 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntActnList; + +{$INCLUDE TntCompilers.inc} + +interface + +uses + Classes, Controls, ActnList, Buttons, ExtCtrls, ComCtrls, StdCtrls, Menus; + +type +{TNT-WARN TActionList} + TTntActionList = class(TActionList{TNT-ALLOW TActionList}) + private + FCheckActionsTimer: TTimer; + procedure CheckActions(Sender: TObject); + public + constructor Create(AOwner: TComponent); override; + end; + + ITntAction = interface + ['{59D0AE37-8161-4AD6-9102-14B28E5761EB}'] + end; + +//--------------------------------------------------------------------------------------------- +// ACTIONS +//--------------------------------------------------------------------------------------------- + +{TNT-WARN TCustomAction} + TTntCustomAction = class(TCustomAction{TNT-ALLOW TCustomAction}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + public + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TAction} + TTntAction = class(TAction{TNT-ALLOW TAction}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +//--------------------------------------------------------------------------------------------- + +// MENU ACTION LINK +//--------------------------------------------------------------------------------------------- + +{TNT-WARN TMenuActionLink} + TTntMenuActionLink = class(TMenuActionLink{TNT-ALLOW TMenuActionLink}) + protected + function IsCaptionLinked: Boolean; override; + function IsHintLinked: Boolean; override; + procedure SetCaption(const Value: string{TNT-ALLOW string}); override; + procedure SetHint(const Value: string{TNT-ALLOW string}); override; + end; + +//--------------------------------------------------------------------------------------------- +// CONTROL ACTION LINKS +//--------------------------------------------------------------------------------------------- + +{TNT-WARN TListViewActionLink} + TTntListViewActionLink = class(TListViewActionLink{TNT-ALLOW TListViewActionLink}) + protected + function IsCaptionLinked: Boolean; override; + function IsHintLinked: Boolean; override; + procedure SetCaption(const Value: string{TNT-ALLOW string}); override; + procedure SetHint(const Value: string{TNT-ALLOW string}); override; + end; + +{TNT-WARN TComboBoxExActionLink} + TTntComboBoxExActionLink = class(TComboBoxExActionLink{TNT-ALLOW TComboBoxExActionLink}) + protected + function IsCaptionLinked: Boolean; override; + function IsHintLinked: Boolean; override; + procedure SetCaption(const Value: string{TNT-ALLOW string}); override; + procedure SetHint(const Value: string{TNT-ALLOW string}); override; + end; + +{TNT-WARN TSpeedButtonActionLink} + TTntSpeedButtonActionLink = class(TSpeedButtonActionLink{TNT-ALLOW TSpeedButtonActionLink}) + protected + function IsCaptionLinked: Boolean; override; + function IsHintLinked: Boolean; override; + procedure SetCaption(const Value: string{TNT-ALLOW string}); override; + procedure SetHint(const Value: string{TNT-ALLOW string}); override; + {$IFDEF COMPILER_10_UP} + function IsImageIndexLinked: Boolean; override; + procedure SetImageIndex(Value: Integer); override; + {$ENDIF} + end; + +{$IFDEF COMPILER_10_UP} +{TNT-WARN TBitBtnActionLink} + TTntBitBtnActionLink = class(TBitBtnActionLink{TNT-ALLOW TBitBtnActionLink}) + protected + function IsCaptionLinked: Boolean; override; + function IsHintLinked: Boolean; override; + procedure SetCaption(const Value: string{TNT-ALLOW string}); override; + procedure SetHint(const Value: string{TNT-ALLOW string}); override; + {$IFDEF COMPILER_10_UP} + function IsImageIndexLinked: Boolean; override; + procedure SetImageIndex(Value: Integer); override; + {$ENDIF} + end; +{$ENDIF} + +{TNT-WARN TToolButtonActionLink} + TTntToolButtonActionLink = class(TToolButtonActionLink{TNT-ALLOW TToolButtonActionLink}) + protected + function IsCaptionLinked: Boolean; override; + function IsHintLinked: Boolean; override; + procedure SetCaption(const Value: string{TNT-ALLOW string}); override; + procedure SetHint(const Value: string{TNT-ALLOW string}); override; + end; + +{TNT-WARN TButtonActionLink} + TTntButtonActionLink = class(TButtonActionLink{TNT-ALLOW TButtonActionLink}) + protected + function IsCaptionLinked: Boolean; override; + function IsHintLinked: Boolean; override; + procedure SetCaption(const Value: string{TNT-ALLOW string}); override; + procedure SetHint(const Value: string{TNT-ALLOW string}); override; + end; + +{TNT-WARN TWinControlActionLink} + TTntWinControlActionLink = class(TWinControlActionLink{TNT-ALLOW TWinControlActionLink}) + protected + function IsCaptionLinked: Boolean; override; + function IsHintLinked: Boolean; override; + procedure SetCaption(const Value: string{TNT-ALLOW string}); override; + procedure SetHint(const Value: string{TNT-ALLOW string}); override; + end; + +{TNT-WARN TControlActionLink} + TTntControlActionLink = class(TControlActionLink{TNT-ALLOW TControlActionLink}) + protected + function IsCaptionLinked: Boolean; override; + function IsHintLinked: Boolean; override; + procedure SetCaption(const Value: string{TNT-ALLOW string}); override; + procedure SetHint(const Value: string{TNT-ALLOW string}); override; + end; + +//--------------------------------------------------------------------------------------------- +// helper procs +//--------------------------------------------------------------------------------------------- + +//-- TCustomAction helper routines +procedure TntAction_SetCaption(Action: TCustomAction{TNT-ALLOW TCustomAction}; const Value: WideString); +function TntAction_GetCaption(Action: TCustomAction{TNT-ALLOW TCustomAction}): WideString; +function TntAction_GetNewCaption(Action: TCustomAction{TNT-ALLOW TCustomAction}; const Default: WideString): WideString; +procedure TntAction_SetHint(Action: TCustomAction{TNT-ALLOW TCustomAction}; const Value: WideString); +function TntAction_GetHint(Action: TCustomAction{TNT-ALLOW TCustomAction}): WideString; +function TntAction_GetNewHint(Action: TCustomAction{TNT-ALLOW TCustomAction}; const Default: WideString): WideString; +procedure TntAction_AfterInherited_Assign(Action: TCustomAction{TNT-ALLOW TCustomAction}; Source: TPersistent); + +// -- TControl helper routines +function TntControl_GetActionLinkClass(Control: TControl; InheritedLinkClass: TControlActionLinkClass): TControlActionLinkClass; +procedure TntControl_BeforeInherited_ActionChange(Control: TControl; Sender: TObject; CheckDefaults: Boolean); + +// -- TControlActionLink helper routines +function TntActionLink_IsCaptionLinked(InheritedIsCaptionLinked: Boolean; Action: TBasicAction; FClient: TControl): Boolean; +function TntActionLink_IsHintLinked(InheritedIsHintLinked: Boolean; Action: TBasicAction; FClient: TControl): Boolean; +procedure TntActionLink_SetCaption(IsCaptionLinked: Boolean; Action: TBasicAction; FClient: TControl; const Value: string{TNT-ALLOW string}); +procedure TntActionLink_SetHint(IsHintLinked: Boolean; Action: TBasicAction; FClient: TControl; const Value: string{TNT-ALLOW string}); + +type + TUpgradeActionListItemsProc = procedure (ActionList: TTntActionList); + +var + UpgradeActionListItemsProc: TUpgradeActionListItemsProc; + +implementation + +uses + SysUtils, TntMenus, TntClasses, TntControls; + +{ TActionListList } + +type + TActionListList = class(TList) + private + FActionList: TTntActionList; + protected + procedure Notify(Ptr: Pointer; Action: TListNotification); override; + end; + +procedure TActionListList.Notify(Ptr: Pointer; Action: TListNotification); +begin + inherited; + if (Action = lnAdded) and (FActionList <> nil) and (Ptr <> nil) + and (not Supports(TObject(Ptr), ITntAction)) then + begin + FActionList.FCheckActionsTimer.Enabled := False; + FActionList.FCheckActionsTimer.Enabled := True; + end; +end; + +{ THackActionList } + +type +{$IFDEF COMPILER_6} // verified against VCL source in Delphi 6 and BCB 6 + THackCustomActionList = class(TComponent) + private + FActions: TList; + end; +{$ENDIF} +{$IFDEF DELPHI_7} // verified against VCL source in Delphi 7 + THackCustomActionList = class(TComponent) + private + FActions: TList; + end; +{$ENDIF} +{$IFDEF DELPHI_9} // verified against VCL source in Delphi 9 + THackCustomActionList = class(TComponent) + private + FActions: TList; + end; +{$ENDIF} +{$IFDEF DELPHI_10} // verified against VCL source in Delphi 10 + THackCustomActionList = class(TComponent) + private + FActions: TList; + end; +{$ENDIF} + +{ TTntActionList } + +constructor TTntActionList.Create(AOwner: TComponent); +begin + inherited; + if (csDesigning in ComponentState) then begin + FCheckActionsTimer := TTimer.Create(Self); + FCheckActionsTimer.Enabled := False; + FCheckActionsTimer.Interval := 50; + FCheckActionsTimer.OnTimer := CheckActions; + // + THackCustomActionList(Self).FActions.Free; + THackCustomActionList(Self).FActions := TActionListList.Create; + TActionListList(THackCustomActionList(Self).FActions).FActionList := Self; + end; +end; + +procedure TTntActionList.CheckActions(Sender: TObject); +begin + if FCheckActionsTimer <> nil then begin + FCheckActionsTimer.Enabled := False; + end; + Assert(csDesigning in ComponentState); + Assert(Assigned(UpgradeActionListItemsProc)); + UpgradeActionListItemsProc(Self); +end; + +{ TCustomActionHelper } + +type + TCustomActionHelper = class(TComponent) + private + FAction: TCustomAction{TNT-ALLOW TCustomAction}; + private + FCaption: WideString; + FSettingNewCaption: Boolean; + FOldWideCaption: WideString; + FNewAnsiCaption: AnsiString; + procedure SetAnsiCaption(const Value: AnsiString); + function SettingNewCaption: Boolean; + procedure SetCaption(const Value: WideString); + function GetCaption: WideString; + private + FHint: WideString; + FSettingNewHint: Boolean; + FOldWideHint: WideString; + FNewAnsiHint: AnsiString; + procedure SetAnsiHint(const Value: AnsiString); + function SettingNewHint: Boolean; + procedure SetHint(const Value: WideString); + function GetHint: WideString; + end; + +procedure TCustomActionHelper.SetAnsiCaption(const Value: AnsiString); +begin + FAction.Caption := Value; + if (Value = '') and (FNewAnsiCaption <> '') then + FOldWideCaption := ''; +end; + +function TCustomActionHelper.SettingNewCaption: Boolean; +begin + Result := FSettingNewCaption and (FAction.Caption <> FNewAnsiCaption); +end; + +function TCustomActionHelper.GetCaption: WideString; +begin + if SettingNewCaption then + Result := FOldWideCaption + else + Result := GetSyncedWideString(FCaption, FAction.Caption) +end; + +procedure TCustomActionHelper.SetCaption(const Value: WideString); +begin + FOldWideCaption := GetCaption; + FNewAnsiCaption := Value; + FSettingNewCaption := True; + try + SetSyncedWideString(Value, FCaption, FAction.Caption, SetAnsiCaption) + finally + FSettingNewCaption := False; + end; +end; + +procedure TCustomActionHelper.SetAnsiHint(const Value: AnsiString); +begin + FAction.Hint := Value; + if (Value = '') and (FNewAnsiHint <> '') then + FOldWideHint := ''; +end; + +function TCustomActionHelper.SettingNewHint: Boolean; +begin + Result := FSettingNewHint and (FAction.Hint <> FNewAnsiHint); +end; + +function TCustomActionHelper.GetHint: WideString; +begin + if SettingNewHint then + Result := FOldWideHint + else + Result := GetSyncedWideString(FHint, FAction.Hint) +end; + +procedure TCustomActionHelper.SetHint(const Value: WideString); +begin + FOldWideHint := GetHint; + FNewAnsiHint := Value; + FSettingNewHint := True; + try + SetSyncedWideString(Value, FHint, FAction.Hint, SetAnsiHint) + finally + FSettingNewHint := False; + end; +end; + +function FindActionHelper(Action: TCustomAction{TNT-ALLOW TCustomAction}): TCustomActionHelper; +var + i: integer; +begin + Assert(Action <> nil); + Result := nil; + if Supports(Action, ITntAction) then begin + for i := 0 to Action.ComponentCount - 1 do begin + if Action.Components[i] is TCustomActionHelper then begin + Result := TCustomActionHelper(Action.Components[i]); + break; + end; + end; + if Result = nil then begin + Result := TCustomActionHelper.Create(Action); + Result.FAction := Action; + end; + end; +end; + +//-- TCustomAction helper routines + +procedure TntAction_SetCaption(Action: TCustomAction{TNT-ALLOW TCustomAction}; const Value: WideString); +begin + if Supports(Action, ITntAction) then + with FindActionHelper(Action) do + SetCaption(Value) + else + Action.Caption := Value; +end; + +function TntAction_GetCaption(Action: TCustomAction{TNT-ALLOW TCustomAction}): WideString; +begin + if Supports(Action, ITntAction) then + with FindActionHelper(Action) do + Result := GetCaption + else + Result := Action.Caption; +end; + +function TntAction_GetNewCaption(Action: TCustomAction{TNT-ALLOW TCustomAction}; const Default: WideString): WideString; +begin + Result := Default; + if Supports(Action, ITntAction) then + with FindActionHelper(Action) do + if SettingNewCaption then + Result := FCaption; +end; + +procedure TntAction_SetHint(Action: TCustomAction{TNT-ALLOW TCustomAction}; const Value: WideString); +begin + if Supports(Action, ITntAction) then + with FindActionHelper(Action) do + SetHint(Value) + else + Action.Hint := Value; +end; + +function TntAction_GetHint(Action: TCustomAction{TNT-ALLOW TCustomAction}): WideString; +begin + if Supports(Action, ITntAction) then + with FindActionHelper(Action) do + Result := GetHint + else + Result := Action.Hint; +end; + +function TntAction_GetNewHint(Action: TCustomAction{TNT-ALLOW TCustomAction}; const Default: WideString): WideString; +begin + Result := Default; + if Supports(Action, ITntAction) then + with FindActionHelper(Action) do + if SettingNewHint then + Result := FHint; +end; + +procedure TntAction_AfterInherited_Assign(Action: TCustomAction{TNT-ALLOW TCustomAction}; Source: TPersistent); +begin + with Action do begin + if (Source is TCustomAction{TNT-ALLOW TCustomAction}) then begin + Caption := TntAction_GetCaption(Source as TCustomAction{TNT-ALLOW TCustomAction}); + Hint := TntAction_GetHint(Source as TCustomAction{TNT-ALLOW TCustomAction}); + end else if (Source is TControl) then begin + Caption := TntControl_GetText(Source as TControl); + Hint := TntControl_GetHint(Source as TControl); + end; + end; +end; + +// -- TControl helper routines + +function TntControl_GetActionLinkClass(Control: TControl; InheritedLinkClass: TControlActionLinkClass): TControlActionLinkClass; +begin + if Control is TCustomListView{TNT-ALLOW TCustomListView} then + Result := TTntListViewActionLink + else if Control is TComboBoxEx then + Result := TTntComboBoxExActionLink + else if Control is TSpeedButton{TNT-ALLOW TSpeedButton} then + Result := TTntSpeedButtonActionLink + {$IFDEF COMPILER_10_UP} + else if Control is TBitBtn{TNT-ALLOW TBitBtn} then + Result := TTntBitBtnActionLink + {$ENDIF} + else if Control is TToolButton{TNT-ALLOW TToolButton} then + Result := TTntToolButtonActionLink + else if Control is TButtonControl then + Result := TTntButtonActionLink + else if Control is TWinControl then + Result := TTntWinControlActionLink + else + Result := TTntControlActionLink; + + Assert(Result.ClassParent = InheritedLinkClass); +end; + +procedure TntControl_BeforeInherited_ActionChange(Control: TControl; Sender: TObject; CheckDefaults: Boolean); +begin + if (Sender is TCustomAction{TNT-ALLOW TCustomAction}) and Supports(Sender, ITntAction) then begin + if not CheckDefaults or (TntControl_GetText(Control) = '') or (TntControl_GetText(Control) = Control.Name) then + TntControl_SetText(Control, TntAction_GetCaption(TCustomAction{TNT-ALLOW TCustomAction}(Sender))); + if not CheckDefaults or (TntControl_GetHint(Control) = '') then + TntControl_SetHint(Control, TntAction_GetHint(TCustomAction{TNT-ALLOW TCustomAction}(Sender))); + end; +end; + +// -- TControlActionLink helper routines + +function TntActionLink_IsCaptionLinked(InheritedIsCaptionLinked: Boolean; Action: TBasicAction; FClient: TControl): Boolean; +begin + Result := InheritedIsCaptionLinked + and (TntAction_GetCaption(Action as TCustomAction{TNT-ALLOW TCustomAction}) = TntControl_GetText(FClient)); +end; + +function TntActionLink_IsHintLinked(InheritedIsHintLinked: Boolean; Action: TBasicAction; FClient: TControl): Boolean; +begin + Result := InheritedIsHintLinked + and (TntAction_GetHint(Action as TCustomAction{TNT-ALLOW TCustomAction}) = TntControl_GetHint(FClient)); +end; + +procedure TntActionLink_SetCaption(IsCaptionLinked: Boolean; Action: TBasicAction; FClient: TControl; const Value: string{TNT-ALLOW string}); +begin + if IsCaptionLinked then + TntControl_SetText(FClient, TntAction_GetNewCaption(Action as TCustomAction{TNT-ALLOW TCustomAction}, Value)); +end; + +procedure TntActionLink_SetHint(IsHintLinked: Boolean; Action: TBasicAction; FClient: TControl; const Value: string{TNT-ALLOW string}); +begin + if IsHintLinked then + TntControl_SetHint(FClient, TntAction_GetNewHint(Action as TCustomAction{TNT-ALLOW TCustomAction}, Value)); +end; + +//--------------------------------------------------------------------------------------------- +// ACTIONS +//--------------------------------------------------------------------------------------------- + +{ TTntCustomAction } + +procedure TTntCustomAction.Assign(Source: TPersistent); +begin + inherited; + TntAction_AfterInherited_Assign(Self, Source); +end; + +procedure TTntCustomAction.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntCustomAction.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntCustomAction.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntCustomAction.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntCustomAction.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntAction } + +procedure TTntAction.Assign(Source: TPersistent); +begin + inherited; + TntAction_AfterInherited_Assign(Self, Source); +end; + +procedure TTntAction.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntAction.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntAction.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntAction.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntAction.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +//--------------------------------------------------------------------------------------------- +// MENU ACTION LINK +//--------------------------------------------------------------------------------------------- + +{ TTntMenuActionLink } + +function TTntMenuActionLink.IsCaptionLinked: Boolean; +begin + Result := inherited IsCaptionLinked + and WideSameCaption(TntAction_GetCaption(Action as TCustomAction{TNT-ALLOW TCustomAction}), (FClient as TTntMenuItem).Caption); +end; + +function TTntMenuActionLink.IsHintLinked: Boolean; +begin + Result := inherited IsHintLinked + and (TntAction_GetHint(Action as TCustomAction{TNT-ALLOW TCustomAction}) = (FClient as TTntMenuItem).Hint); +end; + +procedure TTntMenuActionLink.SetCaption(const Value: string{TNT-ALLOW string}); +begin + if IsCaptionLinked then + (FClient as TTntMenuItem).Caption := TntAction_GetNewCaption(Action as TCustomAction{TNT-ALLOW TCustomAction}, Value); +end; + +procedure TTntMenuActionLink.SetHint(const Value: string{TNT-ALLOW string}); +begin + if IsHintLinked then + (FClient as TTntMenuItem).Hint := TntAction_GetNewHint(Action as TCustomAction{TNT-ALLOW TCustomAction}, Value); +end; + +//--------------------------------------------------------------------------------------------- +// CONTROL ACTION LINKS +//--------------------------------------------------------------------------------------------- + +{ TTntListViewActionLink } + +function TTntListViewActionLink.IsCaptionLinked: Boolean; +begin + Result := TntActionLink_IsCaptionLinked(inherited IsCaptionLinked, Action, FClient); +end; + +function TTntListViewActionLink.IsHintLinked: Boolean; +begin + Result := TntActionLink_IsHintLinked(inherited IsHintLinked, Action, FClient); +end; + +procedure TTntListViewActionLink.SetCaption(const Value: string{TNT-ALLOW string}); +begin + TntActionLink_SetCaption(IsCaptionLinked, Action, FClient, Value); +end; + +procedure TTntListViewActionLink.SetHint(const Value: string{TNT-ALLOW string}); +begin + TntActionLink_SetHint(IsHintLinked, Action, FClient, Value); +end; + +{ TTntComboBoxExActionLink } + +function TTntComboBoxExActionLink.IsCaptionLinked: Boolean; +begin + Result := TntActionLink_IsCaptionLinked(inherited IsCaptionLinked, Action, FClient); +end; + +function TTntComboBoxExActionLink.IsHintLinked: Boolean; +begin + Result := TntActionLink_IsHintLinked(inherited IsHintLinked, Action, FClient); +end; + +procedure TTntComboBoxExActionLink.SetCaption(const Value: string{TNT-ALLOW string}); +begin + TntActionLink_SetCaption(IsCaptionLinked, Action, FClient, Value); +end; + +procedure TTntComboBoxExActionLink.SetHint(const Value: string{TNT-ALLOW string}); +begin + TntActionLink_SetHint(IsHintLinked, Action, FClient, Value); +end; + +{ TTntSpeedButtonActionLink } + +function TTntSpeedButtonActionLink.IsCaptionLinked: Boolean; +begin + Result := TntActionLink_IsCaptionLinked(inherited IsCaptionLinked, Action, FClient); +end; + +function TTntSpeedButtonActionLink.IsHintLinked: Boolean; +begin + Result := TntActionLink_IsHintLinked(inherited IsHintLinked, Action, FClient); +end; + +procedure TTntSpeedButtonActionLink.SetCaption(const Value: string{TNT-ALLOW string}); +begin + TntActionLink_SetCaption(IsCaptionLinked, Action, FClient, Value); +end; + +procedure TTntSpeedButtonActionLink.SetHint(const Value: string{TNT-ALLOW string}); +begin + TntActionLink_SetHint(IsHintLinked, Action, FClient, Value); +end; + +{$IFDEF COMPILER_10_UP} +// bug fix for VCL where ImageIndex on Action ALWAYS overrides the Glyph. + +function TTntSpeedButtonActionLink.IsImageIndexLinked: Boolean; +begin + Result := Action is TCustomAction{TNT-ALLOW TCustomAction}; // taken from TActionLink.IsImageIndexLinked +end; + +procedure TTntSpeedButtonActionLink.SetImageIndex(Value: Integer); +begin + ; // taken from TActionLink.IsImageIndexLinked +end; +{$ENDIF} + +{$IFDEF COMPILER_10_UP} +{ TTntBitBtnActionLink } + +function TTntBitBtnActionLink.IsCaptionLinked: Boolean; +begin + Result := TntActionLink_IsCaptionLinked(inherited IsCaptionLinked, Action, FClient); +end; + +function TTntBitBtnActionLink.IsHintLinked: Boolean; +begin + Result := TntActionLink_IsHintLinked(inherited IsHintLinked, Action, FClient); +end; + +procedure TTntBitBtnActionLink.SetCaption(const Value: string{TNT-ALLOW string}); +begin + TntActionLink_SetCaption(IsCaptionLinked, Action, FClient, Value); +end; + +procedure TTntBitBtnActionLink.SetHint(const Value: string{TNT-ALLOW string}); +begin + TntActionLink_SetHint(IsHintLinked, Action, FClient, Value); +end; + +{$IFDEF COMPILER_10_UP} +// bug fix for VCL where ImageIndex on Action ALWAYS overrides the Glyph. + +function TTntBitBtnActionLink.IsImageIndexLinked: Boolean; +begin + Result := Action is TCustomAction{TNT-ALLOW TCustomAction}; // taken from TActionLink.IsImageIndexLinked +end; + +procedure TTntBitBtnActionLink.SetImageIndex(Value: Integer); +begin + ; // taken from TActionLink.IsImageIndexLinked +end; +{$ENDIF} + +{$ENDIF} + +{ TTntToolButtonActionLink } + +function TTntToolButtonActionLink.IsCaptionLinked: Boolean; +begin + Result := TntActionLink_IsCaptionLinked(inherited IsCaptionLinked, Action, FClient); +end; + +function TTntToolButtonActionLink.IsHintLinked: Boolean; +begin + Result := TntActionLink_IsHintLinked(inherited IsHintLinked, Action, FClient); +end; + +procedure TTntToolButtonActionLink.SetCaption(const Value: string{TNT-ALLOW string}); +begin + TntActionLink_SetCaption(IsCaptionLinked, Action, FClient, Value); +end; + +procedure TTntToolButtonActionLink.SetHint(const Value: string{TNT-ALLOW string}); +begin + TntActionLink_SetHint(IsHintLinked, Action, FClient, Value); +end; + +{ TTntButtonActionLink } + +function TTntButtonActionLink.IsCaptionLinked: Boolean; +begin + Result := TntActionLink_IsCaptionLinked(inherited IsCaptionLinked, Action, FClient); +end; + +function TTntButtonActionLink.IsHintLinked: Boolean; +begin + Result := TntActionLink_IsHintLinked(inherited IsHintLinked, Action, FClient); +end; + +procedure TTntButtonActionLink.SetCaption(const Value: string{TNT-ALLOW string}); +begin + TntActionLink_SetCaption(IsCaptionLinked, Action, FClient, Value); +end; + +procedure TTntButtonActionLink.SetHint(const Value: string{TNT-ALLOW string}); +begin + TntActionLink_SetHint(IsHintLinked, Action, FClient, Value); +end; + +{ TTntWinControlActionLink } + +function TTntWinControlActionLink.IsCaptionLinked: Boolean; +begin + Result := TntActionLink_IsCaptionLinked(inherited IsCaptionLinked, Action, FClient); +end; + +function TTntWinControlActionLink.IsHintLinked: Boolean; +begin + Result := TntActionLink_IsHintLinked(inherited IsHintLinked, Action, FClient); +end; + +procedure TTntWinControlActionLink.SetCaption(const Value: string{TNT-ALLOW string}); +begin + TntActionLink_SetCaption(IsCaptionLinked, Action, FClient, Value); +end; + +procedure TTntWinControlActionLink.SetHint(const Value: string{TNT-ALLOW string}); +begin + TntActionLink_SetHint(IsHintLinked, Action, FClient, Value); +end; + +{ TTntControlActionLink } + +function TTntControlActionLink.IsCaptionLinked: Boolean; +begin + Result := TntActionLink_IsCaptionLinked(inherited IsCaptionLinked, Action, FClient); +end; + +function TTntControlActionLink.IsHintLinked: Boolean; +begin + Result := TntActionLink_IsHintLinked(inherited IsHintLinked, Action, FClient); +end; + +procedure TTntControlActionLink.SetCaption(const Value: string{TNT-ALLOW string}); +begin + TntActionLink_SetCaption(IsCaptionLinked, Action, FClient, Value); +end; + +procedure TTntControlActionLink.SetHint(const Value: string{TNT-ALLOW string}); +begin + TntActionLink_SetHint(IsHintLinked, Action, FClient, Value); +end; + +end. diff --git a/internal/1/Source/TntAxCtrls.pas b/internal/1/Source/TntAxCtrls.pas new file mode 100644 index 0000000..bc4b03c --- /dev/null +++ b/internal/1/Source/TntAxCtrls.pas @@ -0,0 +1,191 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntAxCtrls; + +{$INCLUDE TntCompilers.inc} + +interface + +uses + ComObj, StdVcl, + {$IFNDEF COMPILER_10_UP} + TntWideStrings, + {$ELSE} + WideStrings, + {$ENDIF} + TntClasses; + +type + TWideStringsAdapter = class(TAutoIntfObject, IStrings, IWideStringsAdapter) + private + FStrings: TWideStrings; + protected + { IWideStringsAdapter } + procedure ReferenceStrings(S: TWideStrings); + procedure ReleaseStrings; + { IStrings } + function Get_ControlDefault(Index: Integer): OleVariant; safecall; + procedure Set_ControlDefault(Index: Integer; Value: OleVariant); safecall; + function Count: Integer; safecall; + function Get_Item(Index: Integer): OleVariant; safecall; + procedure Set_Item(Index: Integer; Value: OleVariant); safecall; + procedure Remove(Index: Integer); safecall; + procedure Clear; safecall; + function Add(Item: OleVariant): Integer; safecall; + function _NewEnum: IUnknown; safecall; + public + constructor Create(Strings: TTntStrings); + end; + +implementation + +uses + Classes, ActiveX, Variants; + +{ TStringsEnumerator } + +type + TStringsEnumerator = class(TContainedObject, IEnumString) + private + FIndex: Integer; // index of next unread string + FStrings: IStrings; + public + constructor Create(const Strings: IStrings); + function Next(celt: Longint; out elt; + pceltFetched: PLongint): HResult; stdcall; + function Skip(celt: Longint): HResult; stdcall; + function Reset: HResult; stdcall; + function Clone(out enm: IEnumString): HResult; stdcall; + end; + +constructor TStringsEnumerator.Create(const Strings: IStrings); +begin + inherited Create(Strings); + FStrings := Strings; +end; + +function TStringsEnumerator.Next(celt: Longint; out elt; pceltFetched: PLongint): HResult; +var + I: Integer; +begin + I := 0; + while (I < celt) and (FIndex < FStrings.Count) do + begin + TPointerList(elt)[I] := PWideChar(WideString(FStrings.Item[FIndex])); + Inc(I); + Inc(FIndex); + end; + if pceltFetched <> nil then pceltFetched^ := I; + if I = celt then Result := S_OK else Result := S_FALSE; +end; + +function TStringsEnumerator.Skip(celt: Longint): HResult; +begin + if (FIndex + celt) <= FStrings.Count then + begin + Inc(FIndex, celt); + Result := S_OK; + end + else + begin + FIndex := FStrings.Count; + Result := S_FALSE; + end; +end; + +function TStringsEnumerator.Reset: HResult; +begin + FIndex := 0; + Result := S_OK; +end; + +function TStringsEnumerator.Clone(out enm: IEnumString): HResult; +begin + try + enm := TStringsEnumerator.Create(FStrings); + TStringsEnumerator(enm).FIndex := FIndex; + Result := S_OK; + except + Result := E_UNEXPECTED; + end; +end; + +{ TWideStringsAdapter } + +constructor TWideStringsAdapter.Create(Strings: TTntStrings); +var + StdVcl: ITypeLib; +begin + OleCheck(LoadRegTypeLib(LIBID_STDVCL, 4, 0, 0, StdVcl)); + inherited Create(StdVcl, IStrings); + FStrings := Strings; +end; + +procedure TWideStringsAdapter.ReferenceStrings(S: TWideStrings); +begin + FStrings := S; +end; + +procedure TWideStringsAdapter.ReleaseStrings; +begin + FStrings := nil; +end; + +function TWideStringsAdapter.Get_ControlDefault(Index: Integer): OleVariant; +begin + Result := Get_Item(Index); +end; + +procedure TWideStringsAdapter.Set_ControlDefault(Index: Integer; Value: OleVariant); +begin + Set_Item(Index, Value); +end; + +function TWideStringsAdapter.Count: Integer; +begin + Result := 0; + if FStrings <> nil then Result := FStrings.Count; +end; + +function TWideStringsAdapter.Get_Item(Index: Integer): OleVariant; +begin + Result := NULL; + if (FStrings <> nil) then Result := WideString(FStrings[Index]); +end; + +procedure TWideStringsAdapter.Set_Item(Index: Integer; Value: OleVariant); +begin + if (FStrings <> nil) then FStrings[Index] := Value; +end; + +procedure TWideStringsAdapter.Remove(Index: Integer); +begin + if FStrings <> nil then FStrings.Delete(Index); +end; + +procedure TWideStringsAdapter.Clear; +begin + if FStrings <> nil then FStrings.Clear; +end; + +function TWideStringsAdapter.Add(Item: OleVariant): Integer; +begin + Result := -1; + if FStrings <> nil then Result := FStrings.Add(Item); +end; + +function TWideStringsAdapter._NewEnum: IUnknown; +begin + Result := TStringsEnumerator.Create(Self); +end; + +end. diff --git a/internal/1/Source/TntBandActn.pas b/internal/1/Source/TntBandActn.pas new file mode 100644 index 0000000..2528c42 --- /dev/null +++ b/internal/1/Source/TntBandActn.pas @@ -0,0 +1,92 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntBandActn; + +{$INCLUDE TntCompilers.inc} + +interface + +uses + Classes, BandActn, TntActnList; + +type +{TNT-WARN TCustomizeActionBars} + TTntCustomizeActionBars = class(TCustomizeActionBars{TNT-ALLOW TCustomizeActionBars}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +implementation + +uses + ActnList, TntClasses; + +{TNT-IGNORE-UNIT} + +procedure TntBandActn_AfterInherited_Assign(Action: TCustomAction{TNT-ALLOW TCustomAction}; Source: TPersistent); +begin + TntAction_AfterInherited_Assign(Action, Source); + // TCustomizeActionBars + if (Action is TCustomizeActionBars) and (Source is TCustomizeActionBars) then begin + TCustomizeActionBars(Action).ActionManager := TCustomizeActionBars(Source).ActionManager; + end; +end; + +//------------------------- +// TNT BAND ACTN +//------------------------- + +{ TTntCustomizeActionBars } + +procedure TTntCustomizeActionBars.Assign(Source: TPersistent); +begin + inherited; + TntBandActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntCustomizeActionBars.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntCustomizeActionBars.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntCustomizeActionBars.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntCustomizeActionBars.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntCustomizeActionBars.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +end. diff --git a/internal/1/Source/TntButtons.pas b/internal/1/Source/TntButtons.pas new file mode 100644 index 0000000..dd2ab60 --- /dev/null +++ b/internal/1/Source/TntButtons.pas @@ -0,0 +1,982 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntButtons; + +{$INCLUDE TntCompilers.inc} + +interface + +uses + Windows, Messages, Classes, Controls, Graphics, StdCtrls, + ExtCtrls, CommCtrl, Buttons, + TntControls; + +type + ITntGlyphButton = interface + ['{15D7E501-1E33-4293-8B45-716FB3B14504}'] + function GetButtonGlyph: Pointer; + procedure UpdateInternalGlyphList; + end; + +{TNT-WARN TSpeedButton} + TTntSpeedButton = class(TSpeedButton {TNT-ALLOW TSpeedButton}, ITntGlyphButton) + private + FPaintInherited: Boolean; + function GetCaption: TWideCaption; + procedure SetCaption(const Value: TWideCaption); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsCaptionStored: Boolean; + function IsHintStored: Boolean; + procedure CMHintShow(var Message: TMessage); message CM_HINTSHOW; + procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; + protected + function GetButtonGlyph: Pointer; + procedure UpdateInternalGlyphList; dynamic; + procedure PaintButton; dynamic; + procedure Paint; override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + published + property Caption: TWideCaption read GetCaption write SetCaption stored IsCaptionStored; + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TBitBtn} + TTntBitBtn = class(TBitBtn {TNT-ALLOW TBitBtn}, ITntGlyphButton) + private + FPaintInherited: Boolean; + FMouseInControl: Boolean; + function IsCaptionStored: Boolean; + function GetCaption: TWideCaption; + procedure SetCaption(const Value: TWideCaption); + function IsHintStored: Boolean; + function GetHint: WideString; + procedure SetHint(const Value: WideString); + procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; + procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM; + procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; + procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; + protected + function GetButtonGlyph: Pointer; + procedure UpdateInternalGlyphList; dynamic; + procedure DrawItem(const DrawItemStruct: TDrawItemStruct); dynamic; + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + published + property Caption: TWideCaption read GetCaption write SetCaption stored IsCaptionStored; + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +procedure TButtonGlyph_CalcButtonLayout(Control: TControl; DC: HDC; const Client: TRect; + const Offset: TPoint; const Caption: WideString; Layout: TButtonLayout; + Margin, Spacing: Integer; var GlyphPos: TPoint; var TextBounds: TRect; + BiDiFlags: Integer {$IFDEF COMPILER_7_UP}; WordWrap: Boolean {$ENDIF}); + +function TButtonGlyph_Draw(Control: TControl; Canvas: TCanvas; const Client: TRect; + const Offset: TPoint; const Caption: WideString; Layout: TButtonLayout; Margin: Integer; + Spacing: Integer; State: TButtonState; Transparent: Boolean; + BiDiFlags: Longint {$IFDEF COMPILER_7_UP}; WordWrap: Boolean {$ENDIF}): TRect; + +implementation + +uses + SysUtils, ActnList, TntForms, TntStdCtrls, TypInfo, RTLConsts, TntWindows, + {$IFDEF THEME_7_UP} Themes, {$ENDIF} TntClasses, TntActnList, TntSysUtils; + +type + EAbortPaint = class(EAbort); + +// Many routines in this unit are nearly the same as those found in Buttons.pas. They are +// included here because the VCL implementation of TButtonGlyph is completetly inaccessible. + +type + THackButtonGlyph_D6_D7_D9 = class + protected + FOriginal: TBitmap; + FGlyphList: TImageList; + FIndexs: array[TButtonState] of Integer; + FxxxxTransparentColor: TColor; + FNumGlyphs: TNumGlyphs; + end; + + THackBitBtn_D6_D7_D9 = class(TButton{TNT-ALLOW TButton}) + protected + FCanvas: TCanvas; + FGlyph: Pointer; + FxxxxStyle: TButtonStyle; + FxxxxKind: TBitBtnKind; + FxxxxLayout: TButtonLayout; + FxxxxSpacing: Integer; + FxxxxMargin: Integer; + IsFocused: Boolean; + end; + + THackSpeedButton_D6_D7_D9 = class(TGraphicControl) + protected + FxxxxGroupIndex: Integer; + FGlyph: Pointer; + FxxxxDown: Boolean; + FDragging: Boolean; + end; + + {$IFDEF COMPILER_6} // verified against VCL source in Delphi 6 and BCB 6 + THackButtonGlyph = THackButtonGlyph_D6_D7_D9; + THackBitBtn = THackBitBtn_D6_D7_D9; + THackSpeedButton = THackSpeedButton_D6_D7_D9; + {$ENDIF} + {$IFDEF DELPHI_7} // verified against VCL source in Delphi 7 + THackButtonGlyph = THackButtonGlyph_D6_D7_D9; + THackBitBtn = THackBitBtn_D6_D7_D9; + THackSpeedButton = THackSpeedButton_D6_D7_D9; + {$ENDIF} + {$IFDEF DELPHI_9} // verified against VCL source in Delphi 9 + THackButtonGlyph = THackButtonGlyph_D6_D7_D9; + THackBitBtn = THackBitBtn_D6_D7_D9; + THackSpeedButton = THackSpeedButton_D6_D7_D9; + {$ENDIF} + {$IFDEF DELPHI_10} // verified against VCL source in Delphi 10 + THackButtonGlyph = THackButtonGlyph_D6_D7_D9; + THackBitBtn = THackBitBtn_D6_D7_D9; + THackSpeedButton = THackSpeedButton_D6_D7_D9; + {$ENDIF} + +function GetButtonGlyph(Control: TControl): THackButtonGlyph; +var + GlyphButton: ITntGlyphButton; +begin + if Control.GetInterface(ITntGlyphButton, GlyphButton) then + Result := GlyphButton.GetButtonGlyph + else + raise ETntInternalError.Create('Internal Error: Control does not support ITntGlyphButton.'); +end; + +procedure UpdateInternalGlyphList(Control: TControl); +var + GlyphButton: ITntGlyphButton; +begin + if Control.GetInterface(ITntGlyphButton, GlyphButton) then + GlyphButton.UpdateInternalGlyphList + else + raise ETntInternalError.Create('Internal Error: Control does not support ITntGlyphButton.'); +end; + +function TButtonGlyph_CreateButtonGlyph(Control: TControl; State: TButtonState): Integer; +var + ButtonGlyph: THackButtonGlyph; + NumGlyphs: Integer; +begin + ButtonGlyph := GetButtonGlyph(Control); + NumGlyphs := ButtonGlyph.FNumGlyphs; + + if (State = bsDown) and (NumGlyphs < 3) then State := bsUp; + Result := ButtonGlyph.FIndexs[State]; + if (Result = -1) then begin + UpdateInternalGlyphList(Control); + Result := ButtonGlyph.FIndexs[State]; + end; +end; + +procedure TButtonGlyph_DrawButtonGlyph(Control: TControl; Canvas: TCanvas; const GlyphPos: TPoint; + State: TButtonState; Transparent: Boolean); +var + ButtonGlyph: THackButtonGlyph; + Glyph: TBitmap; + GlyphList: TImageList; + Index: Integer; + {$IFDEF THEME_7_UP} + Details: TThemedElementDetails; + R: TRect; + Button: TThemedButton; + {$ENDIF} +begin + ButtonGlyph := GetButtonGlyph(Control); + Glyph := ButtonGlyph.FOriginal; + GlyphList := ButtonGlyph.FGlyphList; + if Glyph = nil then Exit; + if (Glyph.Width = 0) or (Glyph.Height = 0) then Exit; + Index := TButtonGlyph_CreateButtonGlyph(Control, State); + with GlyphPos do + {$IFDEF THEME_7_UP} + if ThemeServices.ThemesEnabled then begin + R.TopLeft := GlyphPos; + R.Right := R.Left + Glyph.Width div ButtonGlyph.FNumGlyphs; + R.Bottom := R.Top + Glyph.Height; + case State of + bsDisabled: + Button := tbPushButtonDisabled; + bsDown, + bsExclusive: + Button := tbPushButtonPressed; + else + // bsUp + Button := tbPushButtonNormal; + end; + Details := ThemeServices.GetElementDetails(Button); + ThemeServices.DrawIcon(Canvas.Handle, Details, R, GlyphList.Handle, Index); + end else + {$ENDIF} + if Transparent or (State = bsExclusive) then + ImageList_DrawEx(GlyphList.Handle, Index, Canvas.Handle, X, Y, 0, 0, + clNone, clNone, ILD_Transparent) + else + ImageList_DrawEx(GlyphList.Handle, Index, Canvas.Handle, X, Y, 0, 0, + ColorToRGB(clBtnFace), clNone, ILD_Normal); +end; + +procedure TButtonGlyph_DrawButtonText(Canvas: TCanvas; const Caption: WideString; + TextBounds: TRect; State: TButtonState; + BiDiFlags: LongInt {$IFDEF COMPILER_7_UP}; WordWrap: Boolean {$ENDIF}); +begin + with Canvas do + begin + Brush.Style := bsClear; + if State = bsDisabled then + begin + OffsetRect(TextBounds, 1, 1); + Font.Color := clBtnHighlight; + + {$IFDEF COMPILER_7_UP} + if WordWrap then + Tnt_DrawTextW(Handle, PWideChar(Caption), Length(Caption), TextBounds, + DT_CENTER or DT_VCENTER or BiDiFlags or DT_WORDBREAK) + else + {$ENDIF} + Tnt_DrawTextW(Handle, PWideChar(Caption), Length(Caption), TextBounds, + DT_CENTER or DT_VCENTER or BiDiFlags); + + OffsetRect(TextBounds, -1, -1); + Font.Color := clBtnShadow; + + {$IFDEF COMPILER_7_UP} + if WordWrap then + Tnt_DrawTextW(Handle, PWideChar(Caption), Length(Caption), TextBounds, + DT_CENTER or DT_WORDBREAK or BiDiFlags) { TODO: Figure out why DT_VCENTER is not used } + else + {$ENDIF} + Tnt_DrawTextW(Handle, PWideChar(Caption), Length(Caption), TextBounds, + DT_CENTER or DT_VCENTER or BiDiFlags); + + end else + begin + {$IFDEF COMPILER_7_UP} + if WordWrap then + Tnt_DrawTextW(Handle, PWideChar(Caption), Length(Caption), TextBounds, + DT_CENTER or DT_WORDBREAK or BiDiFlags) { TODO: Figure out why DT_VCENTER is not used } + else + {$ENDIF} + Tnt_DrawTextW(Handle, PWideChar(Caption), Length(Caption), TextBounds, + DT_CENTER or DT_VCENTER or BiDiFlags); + end; + end; +end; + +procedure TButtonGlyph_CalcButtonLayout(Control: TControl; DC: HDC; const Client: TRect; + const Offset: TPoint; const Caption: WideString; Layout: TButtonLayout; + Margin, Spacing: Integer; var GlyphPos: TPoint; var TextBounds: TRect; + BiDiFlags: Integer {$IFDEF COMPILER_7_UP}; WordWrap: Boolean {$ENDIF}); +var + TextPos: TPoint; + ClientSize, + GlyphSize, + TextSize: TPoint; + TotalSize: TPoint; + Glyph: TBitmap; + NumGlyphs: Integer; + ButtonGlyph: THackButtonGlyph; +begin + ButtonGlyph := GetButtonGlyph(Control); + Glyph := ButtonGlyph.FOriginal; + NumGlyphs := ButtonGlyph.FNumGlyphs; + + if (BiDiFlags and DT_RIGHT) = DT_RIGHT then + if Layout = blGlyphLeft then + Layout := blGlyphRight + else + if Layout = blGlyphRight then + Layout := blGlyphLeft; + + // Calculate the item sizes. + ClientSize := Point(Client.Right - Client.Left, Client.Bottom - Client.Top); + + if Assigned(Glyph) then + GlyphSize := Point(Glyph.Width div NumGlyphs, Glyph.Height) + else + GlyphSize := Point(0, 0); + + if Length(Caption) > 0 then + begin + {$IFDEF COMPILER_7_UP} + TextBounds := Rect(0, 0, Client.Right - Client.Left - GlyphSize.X - 3, 0); { TODO: Figure out why GlyphSize.X is in here. } + {$ELSE} + TextBounds := Rect(0, 0, Client.Right - Client.Left, 0); + {$ENDIF} + + {$IFDEF COMPILER_7_UP} + if WordWrap then + Tnt_DrawTextW(DC, PWideChar(Caption), Length(Caption), TextBounds, DT_WORDBREAK + or DT_CALCRECT or BiDiFlags) + else + {$ENDIF} + Tnt_DrawTextW(DC, PWideChar(Caption), Length(Caption), TextBounds, DT_CALCRECT or BiDiFlags); + + TextSize := Point(TextBounds.Right - TextBounds.Left, TextBounds.Bottom - TextBounds.Top); + end + else + begin + TextBounds := Rect(0, 0, 0, 0); + TextSize := Point(0, 0); + end; + + // If the layout has the glyph on the right or the left, then both the text and the glyph are centered vertically. + // If the glyph is on the top or the bottom, then both the text and the glyph are centered horizontally. + if Layout in [blGlyphLeft, blGlyphRight] then + begin + GlyphPos.Y := (ClientSize.Y - GlyphSize.Y + 1) div 2; + TextPos.Y := (ClientSize.Y - TextSize.Y + 1) div 2; + end + else + begin + GlyphPos.X := (ClientSize.X - GlyphSize.X + 1) div 2; + TextPos.X := (ClientSize.X - TextSize.X + 1) div 2; + end; + + // If there is no text or no bitmap, then Spacing is irrelevant. + if (TextSize.X = 0) or (GlyphSize.X = 0) then + Spacing := 0; + + // Adjust Margin and Spacing. + if Margin = -1 then + begin + if Spacing = -1 then + begin + TotalSize := Point(GlyphSize.X + TextSize.X, GlyphSize.Y + TextSize.Y); + if Layout in [blGlyphLeft, blGlyphRight] then + Margin := (ClientSize.X - TotalSize.X) div 3 + else + Margin := (ClientSize.Y - TotalSize.Y) div 3; + Spacing := Margin; + end + else + begin + TotalSize := Point(GlyphSize.X + Spacing + TextSize.X, GlyphSize.Y + Spacing + TextSize.Y); + if Layout in [blGlyphLeft, blGlyphRight] then + Margin := (ClientSize.X - TotalSize.X + 1) div 2 + else + Margin := (ClientSize.Y - TotalSize.Y + 1) div 2; + end; + end + else + begin + if Spacing = -1 then + begin + TotalSize := Point(ClientSize.X - (Margin + GlyphSize.X), ClientSize.Y - (Margin + GlyphSize.Y)); + if Layout in [blGlyphLeft, blGlyphRight] then + Spacing := (TotalSize.X - TextSize.X) div 2 + else + Spacing := (TotalSize.Y - TextSize.Y) div 2; + end; + end; + + case Layout of + blGlyphLeft: + begin + GlyphPos.X := Margin; + TextPos.X := GlyphPos.X + GlyphSize.X + Spacing; + end; + blGlyphRight: + begin + GlyphPos.X := ClientSize.X - Margin - GlyphSize.X; + TextPos.X := GlyphPos.X - Spacing - TextSize.X; + end; + blGlyphTop: + begin + GlyphPos.Y := Margin; + TextPos.Y := GlyphPos.Y + GlyphSize.Y + Spacing; + end; + blGlyphBottom: + begin + GlyphPos.Y := ClientSize.Y - Margin - GlyphSize.Y; + TextPos.Y := GlyphPos.Y - Spacing - TextSize.Y; + end; + end; + + // Fixup the Result variables. + with GlyphPos do + begin + Inc(X, Client.Left + Offset.X); + Inc(Y, Client.Top + Offset.Y); + end; + + {$IFDEF THEME_7_UP} + { Themed text is not shifted, but gets a different color. } + if ThemeServices.ThemesEnabled then + OffsetRect(TextBounds, TextPos.X + Client.Left, TextPos.Y + Client.Top) + else + {$ENDIF} + OffsetRect(TextBounds, TextPos.X + Client.Left + Offset.X, TextPos.Y + Client.Top + Offset.Y); +end; + +function TButtonGlyph_Draw(Control: TControl; Canvas: TCanvas; const Client: TRect; + const Offset: TPoint; const Caption: WideString; Layout: TButtonLayout; Margin: Integer; + Spacing: Integer; State: TButtonState; Transparent: Boolean; + BiDiFlags: Longint {$IFDEF COMPILER_7_UP}; WordWrap: Boolean {$ENDIF}): TRect; +var + GlyphPos: TPoint; +begin + TButtonGlyph_CalcButtonLayout(Control, Canvas.Handle, Client, Offset, Caption, Layout, Margin, + Spacing, GlyphPos, Result, BiDiFlags {$IFDEF COMPILER_7_UP}, WordWrap {$ENDIF}); + TButtonGlyph_DrawButtonGlyph(Control, Canvas, GlyphPos, State, Transparent); + TButtonGlyph_DrawButtonText(Canvas, Caption, Result, State, + BiDiFlags {$IFDEF COMPILER_7_UP}, WordWrap {$ENDIF}); +end; + +{ TTntSpeedButton } + +procedure TTntSpeedButton.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntSpeedButton.IsCaptionStored: Boolean; +begin + Result := TntControl_IsCaptionStored(Self) +end; + +function TTntSpeedButton.GetCaption: TWideCaption; +begin + Result := TntControl_GetText(Self); +end; + +procedure TTntSpeedButton.SetCaption(const Value: TWideCaption); +begin + TntControl_SetText(Self, Value); +end; + +function TTntSpeedButton.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self) +end; + +function TTntSpeedButton.GetHint: WideString; +begin + Result := TntControl_GetHint(Self) +end; + +procedure TTntSpeedButton.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntSpeedButton.CMHintShow(var Message: TMessage); +begin + ProcessCMHintShowMsg(Message); + inherited; +end; + +procedure TTntSpeedButton.CMDialogChar(var Message: TCMDialogChar); +begin + with Message do + if IsWideCharAccel(CharCode, Caption) and Enabled and Visible and + (Parent <> nil) and Parent.Showing then + begin + Click; + Result := 1; + end else + inherited; +end; + +function TTntSpeedButton.GetButtonGlyph: Pointer; +begin + Result := THackSpeedButton(Self).FGlyph; +end; + +procedure TTntSpeedButton.UpdateInternalGlyphList; +begin + FPaintInherited := True; + try + Repaint; + finally + FPaintInherited := False; + end; + Invalidate; + raise EAbortPaint.Create(''); +end; + +procedure TTntSpeedButton.Paint; +begin + if FPaintInherited then + inherited + else + PaintButton; +end; + +procedure TTntSpeedButton.PaintButton; +const + DownStyles: array[Boolean] of Integer = (BDR_RAISEDINNER, BDR_SUNKENOUTER); + FillStyles: array[Boolean] of Integer = (BF_MIDDLE, 0); +var + PaintRect: TRect; + DrawFlags: Integer; + Offset: TPoint; + {$IFDEF THEME_7_UP} + Button: TThemedButton; + ToolButton: TThemedToolBar; + Details: TThemedElementDetails; + {$ENDIF} +begin + try + if not Enabled then + begin + FState := bsDisabled; + THackSpeedButton(Self).FDragging := False; + end + else if FState = bsDisabled then + if Down and (GroupIndex <> 0) then + FState := bsExclusive + else + FState := bsUp; + Canvas.Font := Self.Font; + + {$IFDEF THEME_7_UP} + if ThemeServices.ThemesEnabled then + begin + {$IFDEF COMPILER_7_UP} + PerformEraseBackground(Self, Canvas.Handle); + {$ENDIF} + SelectObject(Canvas.Handle, Canvas.Font.Handle); { For some reason, PerformEraseBackground sometimes messes the font up. } + + if not Enabled then + Button := tbPushButtonDisabled + else + if FState in [bsDown, bsExclusive] then + Button := tbPushButtonPressed + else + if MouseInControl then + Button := tbPushButtonHot + else + Button := tbPushButtonNormal; + + ToolButton := ttbToolbarDontCare; + if Flat then + begin + case Button of + tbPushButtonDisabled: + Toolbutton := ttbButtonDisabled; + tbPushButtonPressed: + Toolbutton := ttbButtonPressed; + tbPushButtonHot: + Toolbutton := ttbButtonHot; + tbPushButtonNormal: + Toolbutton := ttbButtonNormal; + end; + end; + + PaintRect := ClientRect; + if ToolButton = ttbToolbarDontCare then + begin + Details := ThemeServices.GetElementDetails(Button); + ThemeServices.DrawElement(Canvas.Handle, Details, PaintRect); + PaintRect := ThemeServices.ContentRect(Canvas.Handle, Details, PaintRect); + end + else + begin + Details := ThemeServices.GetElementDetails(ToolButton); + ThemeServices.DrawElement(Canvas.Handle, Details, PaintRect); + PaintRect := ThemeServices.ContentRect(Canvas.Handle, Details, PaintRect); + end; + + if Button = tbPushButtonPressed then + begin + // A pressed speed button has a white text. This applies however only to flat buttons. + if ToolButton <> ttbToolbarDontCare then + Canvas.Font.Color := clHighlightText; + Offset := Point(1, 0); + end + else + Offset := Point(0, 0); + TButtonGlyph_Draw(Self, Canvas, PaintRect, Offset, Caption, Layout, Margin, Spacing, FState, + Transparent, DrawTextBiDiModeFlags(0) {$IFDEF COMPILER_7_UP}, False {$ENDIF}); + end + else + {$ENDIF} + begin + PaintRect := Rect(0, 0, Width, Height); + if not Flat then + begin + DrawFlags := DFCS_BUTTONPUSH or DFCS_ADJUSTRECT; + if FState in [bsDown, bsExclusive] then + DrawFlags := DrawFlags or DFCS_PUSHED; + DrawFrameControl(Canvas.Handle, PaintRect, DFC_BUTTON, DrawFlags); + end + else + begin + if (FState in [bsDown, bsExclusive]) or + (MouseInControl and (FState <> bsDisabled)) or + (csDesigning in ComponentState) then + DrawEdge(Canvas.Handle, PaintRect, DownStyles[FState in [bsDown, bsExclusive]], + FillStyles[Transparent] or BF_RECT) + else if not Transparent then + begin + Canvas.Brush.Color := Color; + Canvas.FillRect(PaintRect); + end; + InflateRect(PaintRect, -1, -1); + end; + if FState in [bsDown, bsExclusive] then + begin + if (FState = bsExclusive) and (not Flat or not MouseInControl) then + begin + Canvas.Brush.Bitmap := AllocPatternBitmap(clBtnFace, clBtnHighlight); + Canvas.FillRect(PaintRect); + end; + Offset.X := 1; + Offset.Y := 1; + end + else + begin + Offset.X := 0; + Offset.Y := 0; + end; + TButtonGlyph_Draw(Self, Canvas, PaintRect, Offset, Caption, + Layout, Margin, Spacing, FState, Transparent, + DrawTextBiDiModeFlags(0) {$IFDEF COMPILER_7_UP}, False {$ENDIF}); + end; + except + on E: EAbortPaint do + ; + else + raise; + end; +end; + +function TTntSpeedButton.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +{$IFDEF COMPILER_10_UP} +type + TAccessGraphicControl = class(TGraphicControl); +{$ENDIF} + +procedure TTntSpeedButton.ActionChange(Sender: TObject; CheckDefaults: Boolean); +{$IFDEF COMPILER_10_UP} +// bug fix for VCL where ImageIndex on Action ALWAYS overrides the Glyph. +type + CallActionChange = procedure(Sender: TObject; CheckDefaults: Boolean) of object; +var + M: TMethod; +{$ENDIF} +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + {$IFNDEF COMPILER_10_UP} + inherited; + {$ELSE} + // call TGraphicControl.ActionChange (bypass TSpeedButton.ActionChange) + M.Code := @TAccessGraphicControl.ActionChange; + M.Data := Self; + CallActionChange(M)(Sender, CheckDefaults); + // call Delphi2005's TSpeedButton.ActionChange + if Sender is TCustomAction{TNT-ALLOW TCustomAction} then + with TCustomAction{TNT-ALLOW TCustomAction}(Sender) do + begin + if CheckDefaults or (Self.GroupIndex = 0) then + Self.GroupIndex := GroupIndex; + { Copy image from action's imagelist } + if (Glyph.Empty) and (ActionList <> nil) and (ActionList.Images <> nil) and + (ImageIndex >= 0) and (ImageIndex < ActionList.Images.Count) then + CopyImage(ActionList.Images, ImageIndex); + end; + {$ENDIF} +end; + +{ TTntBitBtn } + +procedure TTntBitBtn.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle(Self, Params, 'BUTTON'); +end; + +procedure TTntBitBtn.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntBitBtn.IsCaptionStored: Boolean; +var + BaseClass: TClass; + PropInfo: PPropInfo; +begin + Assert(Self is TButton{TNT-ALLOW TButton}); + Assert(Self is TBitBtn{TNT-ALLOW TBitBtn}); + if Kind = bkCustom then + // don't use TBitBtn, it's broken for Kind <> bkCustom + BaseClass := TButton{TNT-ALLOW TButton} + else begin + //TBitBtn has it's own storage specifier, based upon the button kind + BaseClass := TBitBtn{TNT-ALLOW TBitBtn}; + end; + PropInfo := GetPropInfo(BaseClass, 'Caption'); + if PropInfo = nil then + raise EPropertyError.CreateResFmt(PResStringRec(@SUnknownProperty), ['Caption']); + Result := IsStoredProp(Self, PropInfo); +end; + +function TTntBitBtn.GetCaption: TWideCaption; +begin + Result := TntControl_GetText(Self) +end; + +procedure TTntBitBtn.SetCaption(const Value: TWideCaption); +begin + TntControl_SetText(Self, Value); +end; + +function TTntBitBtn.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self) +end; + +function TTntBitBtn.GetHint: WideString; +begin + Result := TntControl_GetHint(Self) +end; + +procedure TTntBitBtn.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntBitBtn.CMDialogChar(var Message: TCMDialogChar); +begin + TntButton_CMDialogChar(Self, Message); +end; + +function TTntBitBtn.GetButtonGlyph: Pointer; +begin + Result := THackBitBtn(Self).FGlyph; +end; + +procedure TTntBitBtn.UpdateInternalGlyphList; +begin + FPaintInherited := True; + try + Repaint; + finally + FPaintInherited := False; + end; + Invalidate; + raise EAbortPaint.Create(''); +end; + +procedure TTntBitBtn.CNDrawItem(var Message: TWMDrawItem); +begin + if FPaintInherited then + inherited + else + DrawItem(Message.DrawItemStruct^); +end; + +procedure TTntBitBtn.DrawItem(const DrawItemStruct: TDrawItemStruct); +var + IsDown, IsDefault: Boolean; + State: TButtonState; + R: TRect; + Flags: Longint; + FCanvas: TCanvas; + IsFocused: Boolean; + {$IFDEF THEME_7_UP} + Details: TThemedElementDetails; + Button: TThemedButton; + Offset: TPoint; + {$ENDIF} +begin + try + FCanvas := THackBitBtn(Self).FCanvas; + IsFocused := THackBitBtn(Self).IsFocused; + FCanvas.Handle := DrawItemStruct.hDC; + R := ClientRect; + + with DrawItemStruct do + begin + FCanvas.Handle := hDC; + FCanvas.Font := Self.Font; + IsDown := itemState and ODS_SELECTED <> 0; + IsDefault := itemState and ODS_FOCUS <> 0; + + if not Enabled then State := bsDisabled + else if IsDown then State := bsDown + else State := bsUp; + end; + + {$IFDEF THEME_7_UP} + if ThemeServices.ThemesEnabled then + begin + if not Enabled then + Button := tbPushButtonDisabled + else + if IsDown then + Button := tbPushButtonPressed + else + if FMouseInControl then + Button := tbPushButtonHot + else + if IsFocused or IsDefault then + Button := tbPushButtonDefaulted + else + Button := tbPushButtonNormal; + + Details := ThemeServices.GetElementDetails(Button); + // Parent background. + ThemeServices.DrawParentBackground(Handle, DrawItemStruct.hDC, @Details, True); + // Button shape. + ThemeServices.DrawElement(DrawItemStruct.hDC, Details, DrawItemStruct.rcItem); + R := ThemeServices.ContentRect(FCanvas.Handle, Details, DrawItemStruct.rcItem); + + if Button = tbPushButtonPressed then + Offset := Point(1, 0) + else + Offset := Point(0, 0); + TButtonGlyph_Draw(Self, FCanvas, R, Offset, Caption, Layout, Margin, Spacing, State, False, + DrawTextBiDiModeFlags(0) {$IFDEF COMPILER_7_UP}, Self.WordWrap {$ENDIF}); + + if IsFocused and IsDefault then + begin + FCanvas.Pen.Color := clWindowFrame; + FCanvas.Brush.Color := clBtnFace; + DrawFocusRect(FCanvas.Handle, R); + end; + end + else + {$ENDIF} + begin + R := ClientRect; + + Flags := DFCS_BUTTONPUSH or DFCS_ADJUSTRECT; + if IsDown then Flags := Flags or DFCS_PUSHED; + if DrawItemStruct.itemState and ODS_DISABLED <> 0 then + Flags := Flags or DFCS_INACTIVE; + + { DrawFrameControl doesn't allow for drawing a button as the + default button, so it must be done here. } + if IsFocused or IsDefault then + begin + FCanvas.Pen.Color := clWindowFrame; + FCanvas.Pen.Width := 1; + FCanvas.Brush.Style := bsClear; + FCanvas.Rectangle(R.Left, R.Top, R.Right, R.Bottom); + + { DrawFrameControl must draw within this border } + InflateRect(R, -1, -1); + end; + + { DrawFrameControl does not draw a pressed button correctly } + if IsDown then + begin + FCanvas.Pen.Color := clBtnShadow; + FCanvas.Pen.Width := 1; + FCanvas.Brush.Color := clBtnFace; + FCanvas.Rectangle(R.Left, R.Top, R.Right, R.Bottom); + InflateRect(R, -1, -1); + end + else + DrawFrameControl(DrawItemStruct.hDC, R, DFC_BUTTON, Flags); + + if IsFocused then + begin + R := ClientRect; + InflateRect(R, -1, -1); + end; + + FCanvas.Font := Self.Font; + if IsDown then + OffsetRect(R, 1, 1); + + TButtonGlyph_Draw(Self, FCanvas, R, Point(0, 0), Caption, Layout, Margin, Spacing, State, + False, DrawTextBiDiModeFlags(0) {$IFDEF COMPILER_7_UP}, Self.WordWrap {$ENDIF}); + + if IsFocused and IsDefault then + begin + R := ClientRect; + InflateRect(R, -4, -4); + FCanvas.Pen.Color := clWindowFrame; + FCanvas.Brush.Color := clBtnFace; + DrawFocusRect(FCanvas.Handle, R); + end; + end; + FCanvas.Handle := 0; + except + on E: EAbortPaint do + ; + else + raise; + end; +end; + +procedure TTntBitBtn.CMMouseEnter(var Message: TMessage); +begin + FMouseInControl := True; + inherited; +end; + +procedure TTntBitBtn.CMMouseLeave(var Message: TMessage); +begin + FMouseInControl := False; + inherited; +end; + +{$IFDEF COMPILER_10_UP} +type + TAccessButton = class(TButton{TNT-ALLOW TButton}); +{$ENDIF} + +procedure TTntBitBtn.ActionChange(Sender: TObject; CheckDefaults: Boolean); +{$IFDEF COMPILER_10_UP} +// bug fix for VCL where ImageIndex on Action ALWAYS overrides the Glyph. +type + CallActionChange = procedure(Sender: TObject; CheckDefaults: Boolean) of object; +var + M: TMethod; +{$ENDIF} +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + {$IFNDEF COMPILER_10_UP} + inherited; + {$ELSE} + // call TButton.ActionChange (bypass TBitBtn.ActionChange) + M.Code := @TAccessButton.ActionChange; + M.Data := Self; + CallActionChange(M)(Sender, CheckDefaults); + // call Delphi2005's TBitBtn.ActionChange + if Sender is TCustomAction{TNT-ALLOW TCustomAction} then + with TCustomAction{TNT-ALLOW TCustomAction}(Sender) do + begin + { Copy image from action's imagelist } + if (Glyph.Empty) and (ActionList <> nil) and (ActionList.Images <> nil) and + (ImageIndex >= 0) and (ImageIndex < ActionList.Images.Count) then + CopyImage(ActionList.Images, ImageIndex); + end; + {$ENDIF} +end; + +function TTntBitBtn.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +end. diff --git a/internal/1/Source/TntCheckLst.pas b/internal/1/Source/TntCheckLst.pas new file mode 100644 index 0000000..9d1ae95 --- /dev/null +++ b/internal/1/Source/TntCheckLst.pas @@ -0,0 +1,184 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntCheckLst; + +{$INCLUDE TntCompilers.inc} + +interface + +uses + Classes, Messages, Windows, Controls, StdCtrls, CheckLst, + TntClasses, TntControls, TntStdCtrls; + +type +{TNT-WARN TCheckListBox} + TTntCheckListBox = class(TCheckListBox{TNT-ALLOW TCheckListBox}, IWideCustomListControl) + private + FItems: TTntStrings; + FSaveItems: TTntStrings; + FSaveTopIndex: Integer; + FSaveItemIndex: Integer; + FSaved_ItemEnabled: array of Boolean; + FSaved_State: array of TCheckBoxState; + FSaved_Header: array of Boolean; + FOnData: TLBGetWideDataEvent; + procedure SetItems(const Value: TTntStrings); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsHintStored: Boolean; + procedure LBGetText(var Message: TMessage); message LB_GETTEXT; + procedure LBGetTextLen(var Message: TMessage); message LB_GETTEXTLEN; + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + procedure CreateWnd; override; + procedure DestroyWnd; override; + procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure CopySelection(Destination: TCustomListControl); override; + procedure AddItem(const Item: WideString; AObject: TObject); reintroduce; virtual; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + property Items: TTntStrings read FItems write SetItems; + property OnData: TLBGetWideDataEvent read FOnData write FOnData; + end; + +implementation + +uses + SysUtils, Math, TntActnList; + +{ TTntCheckListBox } + +constructor TTntCheckListBox.Create(AOwner: TComponent); +begin + inherited; + FItems := TTntListBoxStrings.Create; + TTntListBoxStrings(FItems).ListBox := Self; +end; + +destructor TTntCheckListBox.Destroy; +begin + FreeAndNil(FItems); + inherited; +end; + +procedure TTntCheckListBox.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle(Self, Params, 'LISTBOX'); +end; + +procedure TTntCheckListBox.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +procedure TTntCheckListBox.CreateWnd; +var + i: integer; +begin + inherited; + TntListBox_AfterInherited_CreateWnd(Self, FSaveItems, FItems, FSaveTopIndex, FSaveItemIndex); + if Length(FSaved_ItemEnabled) > 0 then begin + for i := 0 to Min(Items.Count - 1, High(FSaved_ItemEnabled)) do begin + ItemEnabled[i] := FSaved_ItemEnabled[i]; + State[i] := FSaved_State[i]; + Header[i] := FSaved_Header[i]; + end; + SetLength(FSaved_ItemEnabled, 0); + SetLength(FSaved_State, 0); + SetLength(FSaved_Header, 0); + end; +end; + +procedure TTntCheckListBox.DestroyWnd; +var + i: integer; +begin + SetLength(FSaved_ItemEnabled, Items.Count); + SetLength(FSaved_State, Items.Count); + SetLength(FSaved_Header, Items.Count); + for i := 0 to Items.Count - 1 do begin + FSaved_ItemEnabled[i] := ItemEnabled[i]; + FSaved_State[i] := State[i]; + FSaved_Header[i] := Header[i]; + end; + TntListBox_BeforeInherited_DestroyWnd(Self, FSaveItems, FItems, FSaveTopIndex, FSaveItemIndex); + inherited; +end; + +procedure TTntCheckListBox.SetItems(const Value: TTntStrings); +begin + FItems.Assign(Value); +end; + +procedure TTntCheckListBox.DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); +begin + inherited; + if not Assigned(OnDrawItem) then + TntListBox_DrawItem_Text(Self, Items, Index, Rect); +end; + +function TTntCheckListBox.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self) +end; + +function TTntCheckListBox.GetHint: WideString; +begin + Result := TntControl_GetHint(Self) +end; + +procedure TTntCheckListBox.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntCheckListBox.AddItem(const Item: WideString; AObject: TObject); +begin + TntListBox_AddItem(Items, Item, AObject); +end; + +procedure TTntCheckListBox.CopySelection(Destination: TCustomListControl); +begin + TntListBox_CopySelection(Self, Items, Destination); +end; + +procedure TTntCheckListBox.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntCheckListBox.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +procedure TTntCheckListBox.LBGetText(var Message: TMessage); +begin + if not TntCustomListBox_LBGetText(Self, OnData, Message) then + inherited; +end; + +procedure TTntCheckListBox.LBGetTextLen(var Message: TMessage); +begin + if not TntCustomListBox_LBGetTextLen(Self, OnData, Message) then + inherited; +end; + +end. diff --git a/internal/1/Source/TntClasses.pas b/internal/1/Source/TntClasses.pas new file mode 100644 index 0000000..e99c0fa --- /dev/null +++ b/internal/1/Source/TntClasses.pas @@ -0,0 +1,1780 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntClasses; + +{$INCLUDE TntCompilers.inc} + +interface + +{ TODO: Consider: TTntRegIniFile, TTntMemIniFile (consider if UTF8 fits into this solution). } + +{***********************************************} +{ WideChar-streaming implemented by Maël Hörz } +{***********************************************} + +uses + Classes, SysUtils, Windows, + {$IFNDEF COMPILER_10_UP} + TntWideStrings, + {$ELSE} + WideStrings, + {$ENDIF} + ActiveX, Contnrs; + +// ......... introduced ......... +type + TTntStreamCharSet = (csAnsi, csUnicode, csUnicodeSwapped, csUtf8); + +function AutoDetectCharacterSet(Stream: TStream): TTntStreamCharSet; + +//--------------------------------------------------------------------------------------------- +// Tnt - Classes +//--------------------------------------------------------------------------------------------- + +{TNT-WARN ExtractStrings} +{TNT-WARN LineStart} +{TNT-WARN TStringStream} // TODO: Implement a TWideStringStream + +// A potential implementation of TWideStringStream can be found at: +// http://kdsxml.cvs.sourceforge.net/kdsxml/Global/KDSClasses.pas?revision=1.10&view=markup + +procedure TntPersistent_AfterInherited_DefineProperties(Filer: TFiler; Instance: TPersistent); + +type +{TNT-WARN TFileStream} + TTntFileStream = class(THandleStream) + public + constructor Create(const FileName: WideString; Mode: Word); + destructor Destroy; override; + end; + +{TNT-WARN TMemoryStream} + TTntMemoryStream = class(TMemoryStream{TNT-ALLOW TMemoryStream}) + public + procedure LoadFromFile(const FileName: WideString); + procedure SaveToFile(const FileName: WideString); + end; + +{TNT-WARN TResourceStream} + TTntResourceStream = class(TCustomMemoryStream) + private + HResInfo: HRSRC; + HGlobal: THandle; + procedure Initialize(Instance: THandle; Name, ResType: PWideChar); + public + constructor Create(Instance: THandle; const ResName: WideString; ResType: PWideChar); + constructor CreateFromID(Instance: THandle; ResID: Word; ResType: PWideChar); + destructor Destroy; override; + function Write(const Buffer; Count: Longint): Longint; override; + procedure SaveToFile(const FileName: WideString); + end; + + TTntStrings = class; + +{TNT-WARN TAnsiStrings} + TAnsiStrings{TNT-ALLOW TAnsiStrings} = class(TStrings{TNT-ALLOW TStrings}) + public + procedure LoadFromFile(const FileName: WideString); reintroduce; + procedure SaveToFile(const FileName: WideString); reintroduce; + procedure LoadFromFileEx(const FileName: WideString; CodePage: Cardinal); + procedure SaveToFileEx(const FileName: WideString; CodePage: Cardinal); + procedure LoadFromStreamEx(Stream: TStream; CodePage: Cardinal); virtual; abstract; + procedure SaveToStreamEx(Stream: TStream; CodePage: Cardinal); virtual; abstract; + end; + + TAnsiStringsForWideStringsAdapter = class(TAnsiStrings{TNT-ALLOW TAnsiStrings}) + private + FWideStrings: TTntStrings; + FAdapterCodePage: Cardinal; + protected + function Get(Index: Integer): AnsiString; override; + procedure Put(Index: Integer; const S: AnsiString); override; + function GetCount: Integer; override; + function GetObject(Index: Integer): TObject; override; + procedure PutObject(Index: Integer; AObject: TObject); override; + procedure SetUpdateState(Updating: Boolean); override; + function AdapterCodePage: Cardinal; dynamic; + public + constructor Create(AWideStrings: TTntStrings; _AdapterCodePage: Cardinal = 0); + procedure Clear; override; + procedure Delete(Index: Integer); override; + procedure Insert(Index: Integer; const S: AnsiString); override; + procedure LoadFromStreamEx(Stream: TStream; CodePage: Cardinal); override; + procedure SaveToStreamEx(Stream: TStream; CodePage: Cardinal); override; + end; + +{TNT-WARN TStrings} + TTntStrings = class(TWideStrings) + private + FLastFileCharSet: TTntStreamCharSet; + FAnsiStrings: TAnsiStrings{TNT-ALLOW TAnsiStrings}; + procedure SetAnsiStrings(const Value: TAnsiStrings{TNT-ALLOW TAnsiStrings}); + procedure ReadData(Reader: TReader); + procedure ReadDataUTF7(Reader: TReader); + procedure ReadDataUTF8(Reader: TReader); + procedure WriteDataUTF7(Writer: TWriter); + protected + procedure DefineProperties(Filer: TFiler); override; + public + constructor Create; + destructor Destroy; override; + + procedure LoadFromFile(const FileName: WideString); override; + procedure LoadFromStream(Stream: TStream); override; + procedure LoadFromStream_BOM(Stream: TStream; WithBOM: Boolean); virtual; + + procedure SaveToFile(const FileName: WideString); override; + procedure SaveToStream(Stream: TStream); override; + procedure SaveToStream_BOM(Stream: TStream; WithBOM: Boolean); virtual; + + property LastFileCharSet: TTntStreamCharSet read FLastFileCharSet; + published + property AnsiStrings: TAnsiStrings{TNT-ALLOW TAnsiStrings} read FAnsiStrings write SetAnsiStrings stored False; + end; + +{ TTntStringList class } + + TTntStringList = class; + TWideStringListSortCompare = function(List: TTntStringList; Index1, Index2: Integer): Integer; + +{TNT-WARN TStringList} + TTntStringList = class(TTntStrings) + private + FUpdating: Boolean; + FList: PWideStringItemList; + FCount: Integer; + FCapacity: Integer; + FSorted: Boolean; + FDuplicates: TDuplicates; + FCaseSensitive: Boolean; + FOnChange: TNotifyEvent; + FOnChanging: TNotifyEvent; + procedure ExchangeItems(Index1, Index2: Integer); + procedure Grow; + procedure QuickSort(L, R: Integer; SCompare: TWideStringListSortCompare); + procedure SetSorted(Value: Boolean); + procedure SetCaseSensitive(const Value: Boolean); + protected + procedure Changed; virtual; + procedure Changing; virtual; + function Get(Index: Integer): WideString; override; + function GetCapacity: Integer; override; + function GetCount: Integer; override; + function GetObject(Index: Integer): TObject; override; + procedure Put(Index: Integer; const S: WideString); override; + procedure PutObject(Index: Integer; AObject: TObject); override; + procedure SetCapacity(NewCapacity: Integer); override; + procedure SetUpdateState(Updating: Boolean); override; + function CompareStrings(const S1, S2: WideString): Integer; override; + procedure InsertItem(Index: Integer; const S: WideString; AObject: TObject); virtual; + public + destructor Destroy; override; + function Add(const S: WideString): Integer; override; + function AddObject(const S: WideString; AObject: TObject): Integer; override; + procedure Clear; override; + procedure Delete(Index: Integer); override; + procedure Exchange(Index1, Index2: Integer); override; + function Find(const S: WideString; var Index: Integer): Boolean; virtual; + function IndexOf(const S: WideString): Integer; override; + function IndexOfName(const Name: WideString): Integer; override; + procedure Insert(Index: Integer; const S: WideString); override; + procedure InsertObject(Index: Integer; const S: WideString; + AObject: TObject); override; + procedure Sort; virtual; + procedure CustomSort(Compare: TWideStringListSortCompare); virtual; + property Duplicates: TDuplicates read FDuplicates write FDuplicates; + property Sorted: Boolean read FSorted write SetSorted; + property CaseSensitive: Boolean read FCaseSensitive write SetCaseSensitive; + property OnChange: TNotifyEvent read FOnChange write FOnChange; + property OnChanging: TNotifyEvent read FOnChanging write FOnChanging; + end; + +// ......... introduced ......... +type + TListTargetCompare = function (Item, Target: Pointer): Integer; + +function FindSortedListByTarget(List: TList; TargetCompare: TListTargetCompare; + Target: Pointer; var Index: Integer): Boolean; + +function ClassIsRegistered(const clsid: TCLSID): Boolean; + +var + RuntimeUTFStreaming: Boolean; + +type + TBufferedAnsiString = class(TObject) + private + FStringBuffer: AnsiString; + LastWriteIndex: Integer; + public + procedure Clear; + procedure AddChar(const wc: AnsiChar); + procedure AddString(const s: AnsiString); + procedure AddBuffer(Buff: PAnsiChar; Chars: Integer); + function Value: AnsiString; + function BuffPtr: PAnsiChar; + end; + + TBufferedWideString = class(TObject) + private + FStringBuffer: WideString; + LastWriteIndex: Integer; + public + procedure Clear; + procedure AddChar(const wc: WideChar); + procedure AddString(const s: WideString); + procedure AddBuffer(Buff: PWideChar; Chars: Integer); + function Value: WideString; + function BuffPtr: PWideChar; + end; + + TBufferedStreamReader = class(TStream) + private + FStream: TStream; + FStreamSize: Integer; + FBuffer: array of Byte; + FBufferSize: Integer; + FBufferStartPosition: Integer; + FVirtualPosition: Integer; + procedure UpdateBufferFromPosition(StartPos: Integer); + public + constructor Create(Stream: TStream; BufferSize: Integer = 1024); + function Read(var Buffer; Count: Longint): Longint; override; + function Write(const Buffer; Count: Longint): Longint; override; + function Seek(Offset: Longint; Origin: Word): Longint; override; + end; + +// "synced" wide string +type TSetAnsiStrEvent = procedure(const Value: AnsiString) of object; +function GetSyncedWideString(var WideStr: WideString; const AnsiStr: AnsiString): WideString; +procedure SetSyncedWideString(const Value: WideString; var WideStr: WideString; + const AnsiStr: AnsiString; SetAnsiStr: TSetAnsiStrEvent); + +type + TWideComponentHelper = class(TComponent) + private + FComponent: TComponent; + protected + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + public + constructor Create(AOwner: TComponent); override; + constructor CreateHelper(AOwner: TComponent; ComponentHelperList: TComponentList); + end; + +function FindWideComponentHelper(ComponentHelperList: TComponentList; Component: TComponent): TWideComponentHelper; + +implementation + +uses + RTLConsts, ComObj, Math, + Registry, TypInfo, TntSystem, TntSysUtils; + +{ TntPersistent } + +//=========================================================================== +// The Delphi 5 Classes.pas never supported the streaming of WideStrings. +// The Delphi 6 Classes.pas supports WideString streaming. But it's too bad that +// the Delphi 6 IDE doesn't use the updated Classes.pas. Switching between Form/Text +// mode corrupts extended characters in WideStrings even under Delphi 6. +// Delphi 7 seems to finally get right. But let's keep the UTF7 support at design time +// to enable sharing source code with previous versions of Delphi. +// +// The purpose of this solution is to store WideString properties which contain +// non-ASCII chars in the form of UTF7 under the old property name + '_UTF7'. +// +// Special thanks go to Francisco Leong for helping to develop this solution. +// + +{ TTntWideStringPropertyFiler } +type + TTntWideStringPropertyFiler = class + private + FInstance: TPersistent; + FPropInfo: PPropInfo; + procedure ReadDataUTF8(Reader: TReader); + procedure ReadDataUTF7(Reader: TReader); + procedure WriteDataUTF7(Writer: TWriter); + public + procedure DefineProperties(Filer: TFiler; Instance: TPersistent; PropName: AnsiString); + end; + +function ReaderNeedsUtfHelp(Reader: TReader): Boolean; +begin + if Reader.Owner = nil then + Result := False { designtime - visual form inheritance ancestor } + else if csDesigning in Reader.Owner.ComponentState then + {$IFDEF COMPILER_7_UP} + Result := False { Delphi 7+: designtime - doesn't need UTF help. } + {$ELSE} + Result := True { Delphi 6: designtime - always needs UTF help. } + {$ENDIF} + else + Result := RuntimeUTFStreaming; { runtime } +end; + +procedure TTntWideStringPropertyFiler.ReadDataUTF8(Reader: TReader); +begin + if ReaderNeedsUtfHelp(Reader) then + SetWideStrProp(FInstance, FPropInfo, UTF8ToWideString(Reader.ReadString)) + else + Reader.ReadString; { do nothing with Result } +end; + +procedure TTntWideStringPropertyFiler.ReadDataUTF7(Reader: TReader); +begin + if ReaderNeedsUtfHelp(Reader) then + SetWideStrProp(FInstance, FPropInfo, UTF7ToWideString(Reader.ReadString)) + else + Reader.ReadString; { do nothing with Result } +end; + +procedure TTntWideStringPropertyFiler.WriteDataUTF7(Writer: TWriter); +begin + Writer.WriteString(WideStringToUTF7(GetWideStrProp(FInstance, FPropInfo))); +end; + +procedure TTntWideStringPropertyFiler.DefineProperties(Filer: TFiler; Instance: TPersistent; + PropName: AnsiString); + + {$IFNDEF COMPILER_7_UP} + function HasData: Boolean; + var + CurrPropValue: WideString; + begin + // must be stored + Result := IsStoredProp(Instance, FPropInfo); + if Result + and (Filer.Ancestor <> nil) + and (GetPropInfo(Filer.Ancestor, PropName, [tkWString]) <> nil) then + begin + // must be different than ancestor + CurrPropValue := GetWideStrProp(Instance, FPropInfo); + Result := CurrPropValue <> GetWideStrProp(Filer.Ancestor, GetPropInfo(Filer.Ancestor, PropName)); + end; + if Result then begin + // must be non-blank and different than UTF8 (implies all ASCII <= 127) + CurrPropValue := GetWideStrProp(Instance, FPropInfo); + Result := (CurrPropValue <> '') and (WideStringToUTF8(CurrPropValue) <> CurrPropValue); + end; + end; + {$ENDIF} + +begin + FInstance := Instance; + FPropInfo := GetPropInfo(Instance, PropName, [tkWString]); + if FPropInfo <> nil then begin + // must be published (and of type WideString) + Filer.DefineProperty(PropName + 'W', ReadDataUTF8, nil, False); + {$IFDEF COMPILER_7_UP} + Filer.DefineProperty(PropName + '_UTF7', ReadDataUTF7, WriteDataUTF7, False); + {$ELSE} + Filer.DefineProperty(PropName + '_UTF7', ReadDataUTF7, WriteDataUTF7, HasData); + {$ENDIF} + end; + FInstance := nil; + FPropInfo := nil; +end; + +{ TTntWideCharPropertyFiler } +type + TTntWideCharPropertyFiler = class + private + FInstance: TPersistent; + FPropInfo: PPropInfo; + {$IFNDEF COMPILER_9_UP} + FWriter: TWriter; + procedure GetLookupInfo(var Ancestor: TPersistent; + var Root, LookupRoot, RootAncestor: TComponent); + {$ENDIF} + procedure ReadData_W(Reader: TReader); + procedure ReadDataUTF7(Reader: TReader); + procedure WriteData_W(Writer: TWriter); + function ReadChar(Reader: TReader): WideChar; + public + procedure DefineProperties(Filer: TFiler; Instance: TPersistent; PropName: AnsiString); + end; + +{$IFNDEF COMPILER_9_UP} +type + TGetLookupInfoEvent = procedure(var Ancestor: TPersistent; + var Root, LookupRoot, RootAncestor: TComponent) of object; + +function AncestorIsValid(Ancestor: TPersistent; Root, RootAncestor: TComponent): Boolean; +begin + Result := (Ancestor <> nil) and (RootAncestor <> nil) and + Root.InheritsFrom(RootAncestor.ClassType); +end; + +function IsDefaultOrdPropertyValue(Instance: TObject; PropInfo: PPropInfo; + OnGetLookupInfo: TGetLookupInfoEvent): Boolean; +var + Ancestor: TPersistent; + LookupRoot: TComponent; + RootAncestor: TComponent; + Root: TComponent; + AncestorValid: Boolean; + Value: Longint; + Default: LongInt; +begin + Ancestor := nil; + Root := nil; + LookupRoot := nil; + RootAncestor := nil; + + if Assigned(OnGetLookupInfo) then + OnGetLookupInfo(Ancestor, Root, LookupRoot, RootAncestor); + + AncestorValid := AncestorIsValid(Ancestor, Root, RootAncestor); + + Result := True; + if (PropInfo^.GetProc <> nil) and (PropInfo^.SetProc <> nil) then + begin + Value := GetOrdProp(Instance, PropInfo); + if AncestorValid then + Result := Value = GetOrdProp(Ancestor, PropInfo) + else + begin + Default := PPropInfo(PropInfo)^.Default; + Result := (Default <> LongInt($80000000)) and (Value = Default); + end; + end; +end; + +procedure TTntWideCharPropertyFiler.GetLookupInfo(var Ancestor: TPersistent; + var Root, LookupRoot, RootAncestor: TComponent); +begin + Ancestor := FWriter.Ancestor; + Root := FWriter.Root; + LookupRoot := FWriter.LookupRoot; + RootAncestor := FWriter.RootAncestor; +end; +{$ENDIF} + +function TTntWideCharPropertyFiler.ReadChar(Reader: TReader): WideChar; +var + Temp: WideString; +begin + case Reader.NextValue of + vaWString: + Temp := Reader.ReadWideString; + vaString: + Temp := Reader.ReadString; + else + raise EReadError.Create(SInvalidPropertyValue); + end; + + if Length(Temp) > 1 then + raise EReadError.Create(SInvalidPropertyValue); + Result := Temp[1]; +end; + +procedure TTntWideCharPropertyFiler.ReadData_W(Reader: TReader); +begin + SetOrdProp(FInstance, FPropInfo, Ord(ReadChar(Reader))); +end; + +procedure TTntWideCharPropertyFiler.ReadDataUTF7(Reader: TReader); +var + S: WideString; +begin + S := UTF7ToWideString(Reader.ReadString); + if S = '' then + SetOrdProp(FInstance, FPropInfo, 0) + else + SetOrdProp(FInstance, FPropInfo, Ord(S[1])) +end; + +type TAccessWriter = class(TWriter); + +procedure TTntWideCharPropertyFiler.WriteData_W(Writer: TWriter); +var + L: Integer; + Temp: WideString; +begin + Temp := WideChar(GetOrdProp(FInstance, FPropInfo)); + + TAccessWriter(Writer).WriteValue(vaWString); + L := Length(Temp); + Writer.Write(L, SizeOf(Integer)); + Writer.Write(Pointer(@Temp[1])^, L * 2); +end; + +procedure TTntWideCharPropertyFiler.DefineProperties(Filer: TFiler; + Instance: TPersistent; PropName: AnsiString); + + {$IFNDEF COMPILER_9_UP} + function HasData: Boolean; + var + CurrPropValue: Integer; + begin + // must be stored + Result := IsStoredProp(Instance, FPropInfo); + if Result and (Filer.Ancestor <> nil) and + (GetPropInfo(Filer.Ancestor, PropName, [tkWChar]) <> nil) then + begin + // must be different than ancestor + CurrPropValue := GetOrdProp(Instance, FPropInfo); + Result := CurrPropValue <> GetOrdProp(Filer.Ancestor, GetPropInfo(Filer.Ancestor, PropName)); + end; + if Result and (Filer is TWriter) then + begin + FWriter := TWriter(Filer); + Result := not IsDefaultOrdPropertyValue(Instance, FPropInfo, GetLookupInfo); + end; + end; + {$ENDIF} + +begin + FInstance := Instance; + FPropInfo := GetPropInfo(Instance, PropName, [tkWChar]); + if FPropInfo <> nil then + begin + // must be published (and of type WideChar) + {$IFDEF COMPILER_9_UP} + Filer.DefineProperty(PropName + 'W', ReadData_W, WriteData_W, False); + {$ELSE} + Filer.DefineProperty(PropName + 'W', ReadData_W, WriteData_W, HasData); + {$ENDIF} + Filer.DefineProperty(PropName + '_UTF7', ReadDataUTF7, nil, False); + end; + FInstance := nil; + FPropInfo := nil; +end; + +procedure TntPersistent_AfterInherited_DefineProperties(Filer: TFiler; Instance: TPersistent); +var + I, Count: Integer; + PropInfo: PPropInfo; + PropList: PPropList; + WideStringFiler: TTntWideStringPropertyFiler; + WideCharFiler: TTntWideCharPropertyFiler; +begin + Count := GetTypeData(Instance.ClassInfo)^.PropCount; + if Count > 0 then + begin + WideStringFiler := TTntWideStringPropertyFiler.Create; + try + WideCharFiler := TTntWideCharPropertyFiler.Create; + try + GetMem(PropList, Count * SizeOf(Pointer)); + try + GetPropInfos(Instance.ClassInfo, PropList); + for I := 0 to Count - 1 do + begin + PropInfo := PropList^[I]; + if (PropInfo = nil) then + break; + if (PropInfo.PropType^.Kind = tkWString) then + WideStringFiler.DefineProperties(Filer, Instance, PropInfo.Name) + else if (PropInfo.PropType^.Kind = tkWChar) then + WideCharFiler.DefineProperties(Filer, Instance, PropInfo.Name) + end; + finally + FreeMem(PropList, Count * SizeOf(Pointer)); + end; + finally + WideCharFiler.Free; + end; + finally + WideStringFiler.Free; + end; + end; +end; + +{ TTntFileStream } + +constructor TTntFileStream.Create(const FileName: WideString; Mode: Word); +var + CreateHandle: Integer; + {$IFDEF DELPHI_7_UP} + ErrorMessage: WideString; + {$ENDIF} +begin + if Mode = fmCreate then + begin + CreateHandle := WideFileCreate(FileName); + if CreateHandle < 0 then begin + {$IFDEF DELPHI_7_UP} + ErrorMessage := WideSysErrorMessage(GetLastError); + raise EFCreateError.CreateFmt(SFCreateErrorEx, [WideExpandFileName(FileName), ErrorMessage]); + {$ELSE} + raise EFCreateError.CreateFmt(SFCreateError, [WideExpandFileName(FileName)]); + {$ENDIF} + end; + end else + begin + CreateHandle := WideFileOpen(FileName, Mode); + if CreateHandle < 0 then begin + {$IFDEF DELPHI_7_UP} + ErrorMessage := WideSysErrorMessage(GetLastError); + raise EFOpenError.CreateFmt(SFOpenErrorEx, [WideExpandFileName(FileName), ErrorMessage]); + {$ELSE} + raise EFOpenError.CreateFmt(SFOpenError, [WideExpandFileName(FileName)]); + {$ENDIF} + end; + end; + inherited Create(CreateHandle); +end; + +destructor TTntFileStream.Destroy; +begin + if Handle >= 0 then FileClose(Handle); +end; + +{ TTntMemoryStream } + +procedure TTntMemoryStream.LoadFromFile(const FileName: WideString); +var + Stream: TStream; +begin + Stream := TTntFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); + try + LoadFromStream(Stream); + finally + Stream.Free; + end; +end; + +procedure TTntMemoryStream.SaveToFile(const FileName: WideString); +var + Stream: TStream; +begin + Stream := TTntFileStream.Create(FileName, fmCreate); + try + SaveToStream(Stream); + finally + Stream.Free; + end; +end; + +{ TTntResourceStream } + +constructor TTntResourceStream.Create(Instance: THandle; const ResName: WideString; + ResType: PWideChar); +begin + inherited Create; + Initialize(Instance, PWideChar(ResName), ResType); +end; + +constructor TTntResourceStream.CreateFromID(Instance: THandle; ResID: Word; + ResType: PWideChar); +begin + inherited Create; + Initialize(Instance, PWideChar(ResID), ResType); +end; + +procedure TTntResourceStream.Initialize(Instance: THandle; Name, ResType: PWideChar); + + procedure Error; + begin + raise EResNotFound.CreateFmt(SResNotFound, [Name]); + end; + +begin + HResInfo := FindResourceW(Instance, Name, ResType); + if HResInfo = 0 then Error; + HGlobal := LoadResource(Instance, HResInfo); + if HGlobal = 0 then Error; + SetPointer(LockResource(HGlobal), SizeOfResource(Instance, HResInfo)); +end; + +destructor TTntResourceStream.Destroy; +begin + UnlockResource(HGlobal); + FreeResource(HGlobal); { Technically this is not necessary (MS KB #193678) } + inherited Destroy; +end; + +function TTntResourceStream.Write(const Buffer; Count: Longint): Longint; +begin + raise EStreamError.CreateRes(PResStringRec(@SCantWriteResourceStreamError)); +end; + +procedure TTntResourceStream.SaveToFile(const FileName: WideString); +var + Stream: TStream; +begin + Stream := TTntFileStream.Create(FileName, fmCreate); + try + SaveToStream(Stream); + finally + Stream.Free; + end; +end; + +{ TAnsiStrings } + +procedure TAnsiStrings{TNT-ALLOW TAnsiStrings}.LoadFromFile(const FileName: WideString); +var + Stream: TStream; +begin + Stream := TTntFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); + try + LoadFromStream(Stream); + finally + Stream.Free; + end; +end; + +procedure TAnsiStrings{TNT-ALLOW TAnsiStrings}.SaveToFile(const FileName: WideString); +var + Stream: TStream; +begin + Stream := TTntFileStream.Create(FileName, fmCreate); + try + SaveToStream(Stream); + finally + Stream.Free; + end; +end; + +procedure TAnsiStrings{TNT-ALLOW TAnsiStrings}.LoadFromFileEx(const FileName: WideString; CodePage: Cardinal); +var + Stream: TStream; +begin + Stream := TTntFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); + try + LoadFromStreamEx(Stream, CodePage); + finally + Stream.Free; + end; +end; + +procedure TAnsiStrings{TNT-ALLOW TAnsiStrings}.SaveToFileEx(const FileName: WideString; CodePage: Cardinal); +var + Stream: TStream; +begin + Stream := TTntFileStream.Create(FileName, fmCreate); + try + if (CodePage = CP_UTF8) then + Stream.WriteBuffer(PAnsiChar(UTF8_BOM)^, Length(UTF8_BOM)); + SaveToStreamEx(Stream, CodePage); + finally + Stream.Free; + end; +end; + +{ TAnsiStringsForWideStringsAdapter } + +constructor TAnsiStringsForWideStringsAdapter.Create(AWideStrings: TTntStrings; _AdapterCodePage: Cardinal); +begin + inherited Create; + FWideStrings := AWideStrings; + FAdapterCodePage := _AdapterCodePage; +end; + +function TAnsiStringsForWideStringsAdapter.AdapterCodePage: Cardinal; +begin + if FAdapterCodePage = 0 then + Result := TntSystem.DefaultSystemCodePage + else + Result := FAdapterCodePage; +end; + +procedure TAnsiStringsForWideStringsAdapter.Clear; +begin + FWideStrings.Clear; +end; + +procedure TAnsiStringsForWideStringsAdapter.Delete(Index: Integer); +begin + FWideStrings.Delete(Index); +end; + +function TAnsiStringsForWideStringsAdapter.Get(Index: Integer): AnsiString; +begin + Result := WideStringToStringEx(FWideStrings.Get(Index), AdapterCodePage); +end; + +procedure TAnsiStringsForWideStringsAdapter.Put(Index: Integer; const S: AnsiString); +begin + FWideStrings.Put(Index, StringToWideStringEx(S, AdapterCodePage)); +end; + +function TAnsiStringsForWideStringsAdapter.GetCount: Integer; +begin + Result := FWideStrings.GetCount; +end; + +procedure TAnsiStringsForWideStringsAdapter.Insert(Index: Integer; const S: AnsiString); +begin + FWideStrings.Insert(Index, StringToWideStringEx(S, AdapterCodePage)); +end; + +function TAnsiStringsForWideStringsAdapter.GetObject(Index: Integer): TObject; +begin + Result := FWideStrings.GetObject(Index); +end; + +procedure TAnsiStringsForWideStringsAdapter.PutObject(Index: Integer; AObject: TObject); +begin + FWideStrings.PutObject(Index, AObject); +end; + +procedure TAnsiStringsForWideStringsAdapter.SetUpdateState(Updating: Boolean); +begin + FWideStrings.SetUpdateState(Updating); +end; + +procedure TAnsiStringsForWideStringsAdapter.LoadFromStreamEx(Stream: TStream; CodePage: Cardinal); +var + Size: Integer; + S: AnsiString; +begin + BeginUpdate; + try + Size := Stream.Size - Stream.Position; + SetString(S, nil, Size); + Stream.Read(Pointer(S)^, Size); + FWideStrings.SetTextStr(StringToWideStringEx(S, CodePage)); + finally + EndUpdate; + end; +end; + +procedure TAnsiStringsForWideStringsAdapter.SaveToStreamEx(Stream: TStream; CodePage: Cardinal); +var + S: AnsiString; +begin + S := WideStringToStringEx(FWideStrings.GetTextStr, CodePage); + Stream.WriteBuffer(Pointer(S)^, Length(S)); +end; + +{ TTntStrings } + +constructor TTntStrings.Create; +begin + inherited; + FAnsiStrings := TAnsiStringsForWideStringsAdapter.Create(Self); + FLastFileCharSet := csUnicode; +end; + +destructor TTntStrings.Destroy; +begin + FreeAndNil(FAnsiStrings); + inherited; +end; + +procedure TTntStrings.SetAnsiStrings(const Value: TAnsiStrings{TNT-ALLOW TAnsiStrings}); +begin + FAnsiStrings.Assign(Value); +end; + +procedure TTntStrings.DefineProperties(Filer: TFiler); + + {$IFNDEF COMPILER_7_UP} + function DoWrite: Boolean; + begin + if Filer.Ancestor <> nil then + begin + Result := True; + if Filer.Ancestor is TWideStrings then + Result := not Equals(TWideStrings(Filer.Ancestor)) + end + else Result := Count > 0; + end; + + function DoWriteAsUTF7: Boolean; + var + i: integer; + begin + Result := False; + for i := 0 to Count - 1 do begin + if (Strings[i] <> '') and (WideStringToUTF8(Strings[i]) <> Strings[i]) then begin + Result := True; + break; { found a string with non-ASCII chars (> 127) } + end; + end; + end; + {$ENDIF} + +begin + inherited DefineProperties(Filer); { Handles main 'Strings' property.' } + Filer.DefineProperty('WideStrings', ReadData, nil, False); + Filer.DefineProperty('WideStringsW', ReadDataUTF8, nil, False); + {$IFDEF COMPILER_7_UP} + Filer.DefineProperty('WideStrings_UTF7', ReadDataUTF7, WriteDataUTF7, False); + {$ELSE} + Filer.DefineProperty('WideStrings_UTF7', ReadDataUTF7, WriteDataUTF7, DoWrite and DoWriteAsUTF7); + {$ENDIF} +end; + +procedure TTntStrings.LoadFromFile(const FileName: WideString); +var + Stream: TStream; +begin + Stream := TTntFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); + try + FLastFileCharSet := AutoDetectCharacterSet(Stream); + Stream.Position := 0; + LoadFromStream(Stream); + finally + Stream.Free; + end; +end; + +procedure TTntStrings.LoadFromStream(Stream: TStream); +begin + LoadFromStream_BOM(Stream, True); +end; + +procedure TTntStrings.LoadFromStream_BOM(Stream: TStream; WithBOM: Boolean); +var + DataLeft: Integer; + StreamCharSet: TTntStreamCharSet; + SW: WideString; + SA: AnsiString; +begin + BeginUpdate; + try + if WithBOM then + StreamCharSet := AutoDetectCharacterSet(Stream) + else + StreamCharSet := csUnicode; + DataLeft := Stream.Size - Stream.Position; + if (StreamCharSet in [csUnicode, csUnicodeSwapped]) then + begin + // BOM indicates Unicode text stream + if DataLeft < SizeOf(WideChar) then + SW := '' + else begin + SetLength(SW, DataLeft div SizeOf(WideChar)); + Stream.Read(PWideChar(SW)^, DataLeft); + if StreamCharSet = csUnicodeSwapped then + StrSwapByteOrder(PWideChar(SW)); + end; + SetTextStr(SW); + end + else if StreamCharSet = csUtf8 then + begin + // BOM indicates UTF-8 text stream + SetLength(SA, DataLeft div SizeOf(AnsiChar)); + Stream.Read(PAnsiChar(SA)^, DataLeft); + SetTextStr(UTF8ToWideString(SA)); + end + else + begin + // without byte order mark it is assumed that we are loading ANSI text + SetLength(SA, DataLeft div SizeOf(AnsiChar)); + Stream.Read(PAnsiChar(SA)^, DataLeft); + SetTextStr(SA); + end; + finally + EndUpdate; + end; +end; + +procedure TTntStrings.ReadData(Reader: TReader); +begin + if Reader.NextValue in [vaString, vaLString] then + SetTextStr(Reader.ReadString) {JCL compatiblity} + else if Reader.NextValue = vaWString then + SetTextStr(Reader.ReadWideString) {JCL compatiblity} + else begin + BeginUpdate; + try + Clear; + Reader.ReadListBegin; + while not Reader.EndOfList do + if Reader.NextValue in [vaString, vaLString] then + Add(Reader.ReadString) {TStrings compatiblity} + else + Add(Reader.ReadWideString); + Reader.ReadListEnd; + finally + EndUpdate; + end; + end; +end; + +procedure TTntStrings.ReadDataUTF7(Reader: TReader); +begin + Reader.ReadListBegin; + if ReaderNeedsUtfHelp(Reader) then + begin + BeginUpdate; + try + Clear; + while not Reader.EndOfList do + Add(UTF7ToWideString(Reader.ReadString)) + finally + EndUpdate; + end; + end else begin + while not Reader.EndOfList do + Reader.ReadString; { do nothing with Result } + end; + Reader.ReadListEnd; +end; + +procedure TTntStrings.ReadDataUTF8(Reader: TReader); +begin + Reader.ReadListBegin; + if ReaderNeedsUtfHelp(Reader) + or (Count = 0){ Legacy support where 'WideStrings' was never written in lieu of WideStringsW } + then begin + BeginUpdate; + try + Clear; + while not Reader.EndOfList do + Add(UTF8ToWideString(Reader.ReadString)) + finally + EndUpdate; + end; + end else begin + while not Reader.EndOfList do + Reader.ReadString; { do nothing with Result } + end; + Reader.ReadListEnd; +end; + +procedure TTntStrings.SaveToFile(const FileName: WideString); +var + Stream: TStream; +begin + Stream := TTntFileStream.Create(FileName, fmCreate); + try + SaveToStream(Stream); + finally + Stream.Free; + end; +end; + +procedure TTntStrings.SaveToStream(Stream: TStream); +begin + SaveToStream_BOM(Stream, True); +end; + +procedure TTntStrings.SaveToStream_BOM(Stream: TStream; WithBOM: Boolean); +// Saves the currently loaded text into the given stream. +// WithBOM determines whether to write a byte order mark or not. +var + SW: WideString; + BOM: WideChar; +begin + if WithBOM then begin + BOM := UNICODE_BOM; + Stream.WriteBuffer(BOM, SizeOf(WideChar)); + end; + SW := GetTextStr; + Stream.WriteBuffer(PWideChar(SW)^, Length(SW) * SizeOf(WideChar)); +end; + +procedure TTntStrings.WriteDataUTF7(Writer: TWriter); +var + I: Integer; +begin + Writer.WriteListBegin; + for I := 0 to Count-1 do + Writer.WriteString(WideStringToUTF7(Get(I))); + Writer.WriteListEnd; +end; + +{ TTntStringList } + +destructor TTntStringList.Destroy; +begin + FOnChange := nil; + FOnChanging := nil; + inherited Destroy; + if FCount <> 0 then Finalize(FList^[0], FCount); + FCount := 0; + SetCapacity(0); +end; + +function TTntStringList.Add(const S: WideString): Integer; +begin + Result := AddObject(S, nil); +end; + +function TTntStringList.AddObject(const S: WideString; AObject: TObject): Integer; +begin + if not Sorted then + Result := FCount + else + if Find(S, Result) then + case Duplicates of + dupIgnore: Exit; + dupError: Error(PResStringRec(@SDuplicateString), 0); + end; + InsertItem(Result, S, AObject); +end; + +procedure TTntStringList.Changed; +begin + if (not FUpdating) and Assigned(FOnChange) then + FOnChange(Self); +end; + +procedure TTntStringList.Changing; +begin + if (not FUpdating) and Assigned(FOnChanging) then + FOnChanging(Self); +end; + +procedure TTntStringList.Clear; +begin + if FCount <> 0 then + begin + Changing; + Finalize(FList^[0], FCount); + FCount := 0; + SetCapacity(0); + Changed; + end; +end; + +procedure TTntStringList.Delete(Index: Integer); +begin + if (Index < 0) or (Index >= FCount) then Error(PResStringRec(@SListIndexError), Index); + Changing; + Finalize(FList^[Index]); + Dec(FCount); + if Index < FCount then + System.Move(FList^[Index + 1], FList^[Index], + (FCount - Index) * SizeOf(TWideStringItem)); + Changed; +end; + +procedure TTntStringList.Exchange(Index1, Index2: Integer); +begin + if (Index1 < 0) or (Index1 >= FCount) then Error(PResStringRec(@SListIndexError), Index1); + if (Index2 < 0) or (Index2 >= FCount) then Error(PResStringRec(@SListIndexError), Index2); + Changing; + ExchangeItems(Index1, Index2); + Changed; +end; + +procedure TTntStringList.ExchangeItems(Index1, Index2: Integer); +var + Temp: Integer; + Item1, Item2: PWideStringItem; +begin + Item1 := @FList^[Index1]; + Item2 := @FList^[Index2]; + Temp := Integer(Item1^.FString); + Integer(Item1^.FString) := Integer(Item2^.FString); + Integer(Item2^.FString) := Temp; + Temp := Integer(Item1^.FObject); + Integer(Item1^.FObject) := Integer(Item2^.FObject); + Integer(Item2^.FObject) := Temp; +end; + +function TTntStringList.Find(const S: WideString; var Index: Integer): Boolean; +var + L, H, I, C: Integer; +begin + Result := False; + L := 0; + H := FCount - 1; + while L <= H do + begin + I := (L + H) shr 1; + C := CompareStrings(FList^[I].FString, S); + if C < 0 then L := I + 1 else + begin + H := I - 1; + if C = 0 then + begin + Result := True; + if Duplicates <> dupAccept then L := I; + end; + end; + end; + Index := L; +end; + +function TTntStringList.Get(Index: Integer): WideString; +begin + if (Index < 0) or (Index >= FCount) then Error(PResStringRec(@SListIndexError), Index); + Result := FList^[Index].FString; +end; + +function TTntStringList.GetCapacity: Integer; +begin + Result := FCapacity; +end; + +function TTntStringList.GetCount: Integer; +begin + Result := FCount; +end; + +function TTntStringList.GetObject(Index: Integer): TObject; +begin + if (Index < 0) or (Index >= FCount) then Error(PResStringRec(@SListIndexError), Index); + Result := FList^[Index].FObject; +end; + +procedure TTntStringList.Grow; +var + Delta: Integer; +begin + if FCapacity > 64 then Delta := FCapacity div 4 else + if FCapacity > 8 then Delta := 16 else + Delta := 4; + SetCapacity(FCapacity + Delta); +end; + +function TTntStringList.IndexOf(const S: WideString): Integer; +begin + if not Sorted then Result := inherited IndexOf(S) else + if not Find(S, Result) then Result := -1; +end; + +function TTntStringList.IndexOfName(const Name: WideString): Integer; +var + NameKey: WideString; +begin + if not Sorted then + Result := inherited IndexOfName(Name) + else begin + // use sort to find index more quickly + NameKey := Name + NameValueSeparator; + Find(NameKey, Result); + if (Result < 0) or (Result > Count - 1) then + Result := -1 + else if CompareStrings(NameKey, Copy(Strings[Result], 1, Length(NameKey))) <> 0 then + Result := -1 + end; +end; + +procedure TTntStringList.Insert(Index: Integer; const S: WideString); +begin + InsertObject(Index, S, nil); +end; + +procedure TTntStringList.InsertObject(Index: Integer; const S: WideString; + AObject: TObject); +begin + if Sorted then Error(PResStringRec(@SSortedListError), 0); + if (Index < 0) or (Index > FCount) then Error(PResStringRec(@SListIndexError), Index); + InsertItem(Index, S, AObject); +end; + +procedure TTntStringList.InsertItem(Index: Integer; const S: WideString; AObject: TObject); +begin + Changing; + if FCount = FCapacity then Grow; + if Index < FCount then + System.Move(FList^[Index], FList^[Index + 1], + (FCount - Index) * SizeOf(TWideStringItem)); + with FList^[Index] do + begin + Pointer(FString) := nil; + FObject := AObject; + FString := S; + end; + Inc(FCount); + Changed; +end; + +procedure TTntStringList.Put(Index: Integer; const S: WideString); +begin + if Sorted then Error(PResStringRec(@SSortedListError), 0); + if (Index < 0) or (Index >= FCount) then Error(PResStringRec(@SListIndexError), Index); + Changing; + FList^[Index].FString := S; + Changed; +end; + +procedure TTntStringList.PutObject(Index: Integer; AObject: TObject); +begin + if (Index < 0) or (Index >= FCount) then Error(PResStringRec(@SListIndexError), Index); + Changing; + FList^[Index].FObject := AObject; + Changed; +end; + +procedure TTntStringList.QuickSort(L, R: Integer; SCompare: TWideStringListSortCompare); +var + I, J, P: Integer; +begin + repeat + I := L; + J := R; + P := (L + R) shr 1; + repeat + while SCompare(Self, I, P) < 0 do Inc(I); + while SCompare(Self, J, P) > 0 do Dec(J); + if I <= J then + begin + ExchangeItems(I, J); + if P = I then + P := J + else if P = J then + P := I; + Inc(I); + Dec(J); + end; + until I > J; + if L < J then QuickSort(L, J, SCompare); + L := I; + until I >= R; +end; + +procedure TTntStringList.SetCapacity(NewCapacity: Integer); +begin + ReallocMem(FList, NewCapacity * SizeOf(TWideStringItem)); + FCapacity := NewCapacity; +end; + +procedure TTntStringList.SetSorted(Value: Boolean); +begin + if FSorted <> Value then + begin + if Value then Sort; + FSorted := Value; + end; +end; + +procedure TTntStringList.SetUpdateState(Updating: Boolean); +begin + FUpdating := Updating; + if Updating then Changing else Changed; +end; + +function WideStringListCompareStrings(List: TTntStringList; Index1, Index2: Integer): Integer; +begin + Result := List.CompareStrings(List.FList^[Index1].FString, + List.FList^[Index2].FString); +end; + +procedure TTntStringList.Sort; +begin + CustomSort(WideStringListCompareStrings); +end; + +procedure TTntStringList.CustomSort(Compare: TWideStringListSortCompare); +begin + if not Sorted and (FCount > 1) then + begin + Changing; + QuickSort(0, FCount - 1, Compare); + Changed; + end; +end; + +function TTntStringList.CompareStrings(const S1, S2: WideString): Integer; +begin + if CaseSensitive then + Result := WideCompareStr(S1, S2) + else + Result := WideCompareText(S1, S2); +end; + +procedure TTntStringList.SetCaseSensitive(const Value: Boolean); +begin + if Value <> FCaseSensitive then + begin + FCaseSensitive := Value; + if Sorted then Sort; + end; +end; + +//------------------------- TntClasses introduced procs ---------------------------------- + +function AutoDetectCharacterSet(Stream: TStream): TTntStreamCharSet; +var + ByteOrderMark: WideChar; + BytesRead: Integer; + Utf8Test: array[0..2] of AnsiChar; +begin + // Byte Order Mark + ByteOrderMark := #0; + if (Stream.Size - Stream.Position) >= SizeOf(ByteOrderMark) then begin + BytesRead := Stream.Read(ByteOrderMark, SizeOf(ByteOrderMark)); + if (ByteOrderMark <> UNICODE_BOM) and (ByteOrderMark <> UNICODE_BOM_SWAPPED) then begin + ByteOrderMark := #0; + Stream.Seek(-BytesRead, soFromCurrent); + if (Stream.Size - Stream.Position) >= Length(Utf8Test) * SizeOf(AnsiChar) then begin + BytesRead := Stream.Read(Utf8Test[0], Length(Utf8Test) * SizeOf(AnsiChar)); + if Utf8Test <> UTF8_BOM then + Stream.Seek(-BytesRead, soFromCurrent); + end; + end; + end; + // Test Byte Order Mark + if ByteOrderMark = UNICODE_BOM then + Result := csUnicode + else if ByteOrderMark = UNICODE_BOM_SWAPPED then + Result := csUnicodeSwapped + else if Utf8Test = UTF8_BOM then + Result := csUtf8 + else + Result := csAnsi; +end; + +function FindSortedListByTarget(List: TList; TargetCompare: TListTargetCompare; + Target: Pointer; var Index: Integer): Boolean; +var + L, H, I, C: Integer; +begin + Result := False; + L := 0; + H := List.Count - 1; + while L <= H do + begin + I := (L + H) shr 1; + C := TargetCompare(List[i], Target); + if C < 0 then L := I + 1 else + begin + H := I - 1; + if C = 0 then + begin + Result := True; + L := I; + end; + end; + end; + Index := L; +end; + +function ClassIsRegistered(const clsid: TCLSID): Boolean; +var + OleStr: POleStr; + Reg: TRegIniFile; + Key, Filename: WideString; +begin + // First, check to see if there is a ProgID. This will tell if the + // control is registered on the machine. No ProgID, control won't run + Result := ProgIDFromCLSID(clsid, OleStr) = S_OK; + if not Result then Exit; //Bail as soon as anything goes wrong. + + // Next, make sure that the file is actually there by rooting it out + // of the registry + Key := WideFormat('\SOFTWARE\Classes\CLSID\%s', [GUIDToString(clsid)]); + Reg := TRegIniFile.Create; + try + Reg.RootKey := HKEY_LOCAL_MACHINE; + Result := Reg.OpenKeyReadOnly(Key); + if not Result then Exit; // Bail as soon as anything goes wrong. + + FileName := Reg.ReadString('InProcServer32', '', EmptyStr); + if (Filename = EmptyStr) then // try another key for the file name + begin + FileName := Reg.ReadString('InProcServer', '', EmptyStr); + end; + Result := Filename <> EmptyStr; + if not Result then Exit; + Result := WideFileExists(Filename); + finally + Reg.Free; + end; +end; + +{ TBufferedAnsiString } + +procedure TBufferedAnsiString.Clear; +begin + LastWriteIndex := 0; + if Length(FStringBuffer) > 0 then + FillChar(FStringBuffer[1], Length(FStringBuffer) * SizeOf(AnsiChar), 0); +end; + +procedure TBufferedAnsiString.AddChar(const wc: AnsiChar); +const + MIN_GROW_SIZE = 32; + MAX_GROW_SIZE = 256; +var + GrowSize: Integer; +begin + Inc(LastWriteIndex); + if LastWriteIndex > Length(FStringBuffer) then begin + GrowSize := Max(MIN_GROW_SIZE, Length(FStringBuffer)); + GrowSize := Min(GrowSize, MAX_GROW_SIZE); + SetLength(FStringBuffer, Length(FStringBuffer) + GrowSize); + FillChar(FStringBuffer[LastWriteIndex], GrowSize * SizeOf(AnsiChar), 0); + end; + FStringBuffer[LastWriteIndex] := wc; +end; + +procedure TBufferedAnsiString.AddString(const s: AnsiString); +var + LenS: Integer; + BlockSize: Integer; + AllocSize: Integer; +begin + LenS := Length(s); + if LenS > 0 then begin + Inc(LastWriteIndex); + if LastWriteIndex + LenS - 1 > Length(FStringBuffer) then begin + // determine optimum new allocation size + BlockSize := Length(FStringBuffer) div 2; + if BlockSize < 8 then + BlockSize := 8; + AllocSize := ((LenS div BlockSize) + 1) * BlockSize; + // realloc buffer + SetLength(FStringBuffer, Length(FStringBuffer) + AllocSize); + FillChar(FStringBuffer[Length(FStringBuffer) - AllocSize + 1], AllocSize * SizeOf(AnsiChar), 0); + end; + CopyMemory(@FStringBuffer[LastWriteIndex], @s[1], LenS * SizeOf(AnsiChar)); + Inc(LastWriteIndex, LenS - 1); + end; +end; + +procedure TBufferedAnsiString.AddBuffer(Buff: PAnsiChar; Chars: Integer); +var + i: integer; +begin + for i := 1 to Chars do begin + if Buff^ = #0 then + break; + AddChar(Buff^); + Inc(Buff); + end; +end; + +function TBufferedAnsiString.Value: AnsiString; +begin + Result := PAnsiChar(FStringBuffer); +end; + +function TBufferedAnsiString.BuffPtr: PAnsiChar; +begin + Result := PAnsiChar(FStringBuffer); +end; + +{ TBufferedWideString } + +procedure TBufferedWideString.Clear; +begin + LastWriteIndex := 0; + if Length(FStringBuffer) > 0 then + FillChar(FStringBuffer[1], Length(FStringBuffer) * SizeOf(WideChar), 0); +end; + +procedure TBufferedWideString.AddChar(const wc: WideChar); +const + MIN_GROW_SIZE = 32; + MAX_GROW_SIZE = 256; +var + GrowSize: Integer; +begin + Inc(LastWriteIndex); + if LastWriteIndex > Length(FStringBuffer) then begin + GrowSize := Max(MIN_GROW_SIZE, Length(FStringBuffer)); + GrowSize := Min(GrowSize, MAX_GROW_SIZE); + SetLength(FStringBuffer, Length(FStringBuffer) + GrowSize); + FillChar(FStringBuffer[LastWriteIndex], GrowSize * SizeOf(WideChar), 0); + end; + FStringBuffer[LastWriteIndex] := wc; +end; + +procedure TBufferedWideString.AddString(const s: WideString); +var + i: integer; +begin + for i := 1 to Length(s) do + AddChar(s[i]); +end; + +procedure TBufferedWideString.AddBuffer(Buff: PWideChar; Chars: Integer); +var + i: integer; +begin + for i := 1 to Chars do begin + if Buff^ = #0 then + break; + AddChar(Buff^); + Inc(Buff); + end; +end; + +function TBufferedWideString.Value: WideString; +begin + Result := PWideChar(FStringBuffer); +end; + +function TBufferedWideString.BuffPtr: PWideChar; +begin + Result := PWideChar(FStringBuffer); +end; + +{ TBufferedStreamReader } + +constructor TBufferedStreamReader.Create(Stream: TStream; BufferSize: Integer = 1024); +begin + // init stream + FStream := Stream; + FStreamSize := Stream.Size; + // init buffer + FBufferSize := BufferSize; + SetLength(FBuffer, BufferSize); + FBufferStartPosition := -FBufferSize; { out of any useful range } + // init virtual position + FVirtualPosition := 0; +end; + +function TBufferedStreamReader.Seek(Offset: Integer; Origin: Word): Longint; +begin + case Origin of + soFromBeginning: FVirtualPosition := Offset; + soFromCurrent: Inc(FVirtualPosition, Offset); + soFromEnd: FVirtualPosition := FStreamSize + Offset; + end; + Result := FVirtualPosition; +end; + +procedure TBufferedStreamReader.UpdateBufferFromPosition(StartPos: Integer); +begin + try + FStream.Position := StartPos; + FStream.Read(FBuffer[0], FBufferSize); + FBufferStartPosition := StartPos; + except + FBufferStartPosition := -FBufferSize; { out of any useful range } + raise; + end; +end; + +function TBufferedStreamReader.Read(var Buffer; Count: Integer): Longint; +var + BytesLeft: Integer; + FirstBufferRead: Integer; + StreamDirectRead: Integer; + Buf: PAnsiChar; +begin + if (FVirtualPosition >= 0) and (Count >= 0) then + begin + Result := FStreamSize - FVirtualPosition; + if Result > 0 then + begin + if Result > Count then + Result := Count; + + Buf := @Buffer; + BytesLeft := Result; + + // try to read what is left in buffer + FirstBufferRead := FBufferStartPosition + FBufferSize - FVirtualPosition; + if (FirstBufferRead < 0) or (FirstBufferRead > FBufferSize) then + FirstBufferRead := 0; + FirstBufferRead := Min(FirstBufferRead, Result); + if FirstBufferRead > 0 then begin + Move(FBuffer[FVirtualPosition - FBufferStartPosition], Buf[0], FirstBufferRead); + Dec(BytesLeft, FirstBufferRead); + end; + + if BytesLeft > 0 then begin + // The first read in buffer was not enough + StreamDirectRead := (BytesLeft div FBufferSize) * FBufferSize; + FStream.Position := FVirtualPosition + FirstBufferRead; + FStream.Read(Buf[FirstBufferRead], StreamDirectRead); + Dec(BytesLeft, StreamDirectRead); + + if BytesLeft > 0 then begin + // update buffer, and read what is left + UpdateBufferFromPosition(FStream.Position); + Move(FBuffer[0], Buf[FirstBufferRead + StreamDirectRead], BytesLeft); + end; + end; + + Inc(FVirtualPosition, Result); + Exit; + end; + end; + Result := 0; +end; + +function TBufferedStreamReader.Write(const Buffer; Count: Integer): Longint; +begin + raise ETntInternalError.Create('Internal Error: class can not write.'); + Result := 0; +end; + +//-------- synced wide string ----------------- + +function GetSyncedWideString(var WideStr: WideString; const AnsiStr: AnsiString): WideString; +begin + if AnsiString(WideStr) <> (AnsiStr) then begin + WideStr := AnsiStr; {AnsiStr changed. Keep WideStr in sync.} + end; + Result := WideStr; +end; + +procedure SetSyncedWideString(const Value: WideString; var WideStr: WideString; + const AnsiStr: AnsiString; SetAnsiStr: TSetAnsiStrEvent); +begin + if Value <> GetSyncedWideString(WideStr, AnsiStr) then + begin + if (not WideSameStr(Value, AnsiString(Value))) {unicode chars lost in conversion} + and (AnsiStr = AnsiString(Value)) {AnsiStr is not going to change} + then begin + SetAnsiStr(''); {force the change} + end; + WideStr := Value; + SetAnsiStr(Value); + end; +end; + +{ TWideComponentHelper } + +function CompareComponentHelperToTarget(Item, Target: Pointer): Integer; +begin + if Integer(TWideComponentHelper(Item).FComponent) < Integer(Target) then + Result := -1 + else if Integer(TWideComponentHelper(Item).FComponent) > Integer(Target) then + Result := 1 + else + Result := 0; +end; + +function FindWideComponentHelperIndex(ComponentHelperList: TComponentList; Component: TComponent; var Index: Integer): Boolean; +begin + // find Component in sorted wide caption list (list is sorted by TWideComponentHelper.FComponent) + Result := FindSortedListByTarget(ComponentHelperList, CompareComponentHelperToTarget, Component, Index); +end; + +constructor TWideComponentHelper.Create(AOwner: TComponent); +begin + raise ETntInternalError.Create('TNT Internal Error: TWideComponentHelper.Create should never be encountered.'); +end; + +constructor TWideComponentHelper.CreateHelper(AOwner: TComponent; ComponentHelperList: TComponentList); +var + Index: Integer; +begin + // don't use direct ownership for memory management + inherited Create(nil); + FComponent := AOwner; + FComponent.FreeNotification(Self); + + // insert into list according to sort + FindWideComponentHelperIndex(ComponentHelperList, FComponent, Index); + ComponentHelperList.Insert(Index, Self); +end; + +procedure TWideComponentHelper.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited; + if (AComponent = FComponent) and (Operation = opRemove) then begin + FComponent := nil; + Free; + end; +end; + +function FindWideComponentHelper(ComponentHelperList: TComponentList; Component: TComponent): TWideComponentHelper; +var + Index: integer; +begin + if FindWideComponentHelperIndex(ComponentHelperList, Component, Index) then begin + Result := TWideComponentHelper(ComponentHelperList[Index]); + Assert(Result.FComponent = Component, 'TNT Internal Error: FindWideComponentHelperIndex failed.'); + end else + Result := nil; +end; + +initialization + RuntimeUTFStreaming := False; { Delphi 6 and higher don't need UTF help at runtime. } + +end. diff --git a/internal/1/Source/TntClipBrd.pas b/internal/1/Source/TntClipBrd.pas new file mode 100644 index 0000000..cf2c16e --- /dev/null +++ b/internal/1/Source/TntClipBrd.pas @@ -0,0 +1,86 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntClipBrd; + +{$INCLUDE TntCompilers.inc} + +interface + +uses + Windows, Clipbrd; + +type +{TNT-WARN TClipboard} + TTntClipboard = class(TClipboard{TNT-ALLOW TClipboard}) + private + function GetAsWideText: WideString; + procedure SetAsWideText(const Value: WideString); + public + property AsWideText: WideString read GetAsWideText write SetAsWideText; + property AsText: WideString read GetAsWideText write SetAsWideText; + end; + +{TNT-WARN Clipboard} +function TntClipboard: TTntClipboard; + +implementation + +{ TTntClipboard } + +function TTntClipboard.GetAsWideText: WideString; +var + Data: THandle; +begin + Open; + Data := GetClipboardData(CF_UNICODETEXT); + try + if Data <> 0 then + Result := PWideChar(GlobalLock(Data)) + else + Result := ''; + finally + if Data <> 0 then GlobalUnlock(Data); + Close; + end; + if (Data = 0) or (Result = '') then + Result := inherited AsText +end; + +procedure TTntClipboard.SetAsWideText(const Value: WideString); +begin + Open; + try + inherited AsText := Value; {Ensures ANSI compatiblity across platforms.} + SetBuffer(CF_UNICODETEXT, PWideChar(Value)^, (Length(Value) + 1) * SizeOf(WideChar)); + finally + Close; + end; +end; + +//------------------------------------------ + +var + GTntClipboard: TTntClipboard; + +function TntClipboard: TTntClipboard; +begin + if GTntClipboard = nil then + GTntClipboard := TTntClipboard.Create; + Result := GTntClipboard; +end; + +initialization + +finalization + GTntClipboard.Free; + +end. diff --git a/internal/1/Source/TntComCtrls.pas b/internal/1/Source/TntComCtrls.pas new file mode 100644 index 0000000..42bec4c --- /dev/null +++ b/internal/1/Source/TntComCtrls.pas @@ -0,0 +1,5058 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntComCtrls; + +{$INCLUDE TntCompilers.inc} + +interface + +{ TODO: TTntCustomListView events - reintroduce ones that refer to ansi classes (ie. TListItem) } +{ TODO: Handle RichEdit CRLF emulation at the WndProc level. } +{ TODO: TTntCustomTreeView events - reintroduce ones that refer to ansi classes (ie. TTreeNode) } +{ TODO: THotKey, Tanimate, TCoolBar (TCoolBand) } +{ TODO: TToolBar: Unicode-enable TBN_GETBUTTONINFO/DoGetButton } +{ TODO: TToolBar: Unicode-enable handling of CN_DIALOGCHAR, WM_SYSCOMMAND, FindButtonFromAccel } + +uses + Classes, Controls, ListActns, Menus, ComCtrls, Messages, + Windows, CommCtrl, Contnrs, TntControls, TntClasses, Graphics, TntSysUtils; + +type + TTntCustomListView = class; + TTntListItems = class; + +{TNT-WARN TListColumn} + TTntListColumn = class(TListColumn{TNT-ALLOW TListColumn}) + private + FCaption: WideString; + procedure SetInheritedCaption(const Value: AnsiString); + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + end; + +{TNT-WARN TListColumns} + TTntListColumns = class(TListColumns{TNT-ALLOW TListColumns}) + private + function GetItem(Index: Integer): TTntListColumn; + procedure SetItem(Index: Integer; Value: TTntListColumn); + public + constructor Create(AOwner: TTntCustomListView); + function Add: TTntListColumn; + function Owner: TTntCustomListView; + property Items[Index: Integer]: TTntListColumn read GetItem write SetItem; default; + end; + +{TNT-WARN TListItem} + TTntListItem = class(TListItem{TNT-ALLOW TListItem}) + private + FCaption: WideString; + FSubItems: TTntStrings; + procedure SetInheritedCaption(const Value: AnsiString); + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + procedure SetSubItems(const Value: TTntStrings); + function GetListView: TTntCustomListView; + function GetTntOwner: TTntListItems; + public + constructor Create(AOwner: TListItems{TNT-ALLOW TListItems}); virtual; + destructor Destroy; override; + property Owner: TTntListItems read GetTntOwner; + property ListView: TTntCustomListView read GetListView; + procedure Assign(Source: TPersistent); override; + property Caption: WideString read GetCaption write SetCaption; + property SubItems: TTntStrings read FSubItems write SetSubItems; + end; + + TTntListItemsEnumerator = class + private + FIndex: Integer; + FListItems: TTntListItems; + public + constructor Create(AListItems: TTntListItems); + function GetCurrent: TTntListItem; + function MoveNext: Boolean; + property Current: TTntListItem read GetCurrent; + end; + +{TNT-WARN TListItems} + TTntListItems = class(TListItems{TNT-ALLOW TListItems}) + private + function GetItem(Index: Integer): TTntListItem; + procedure SetItem(Index: Integer; const Value: TTntListItem); + public + function Owner: TTntCustomListView; + property Item[Index: Integer]: TTntListItem read GetItem write SetItem; default; + function Add: TTntListItem; + function AddItem(Item: TTntListItem; Index: Integer = -1): TTntListItem; + function GetEnumerator: TTntListItemsEnumerator; + function Insert(Index: Integer): TTntListItem; + end; + + TTntLVEditedEvent = procedure(Sender: TObject; Item: TTntListItem; var S: WideString) of object; + TTntLVOwnerDataFindEvent = procedure(Sender: TObject; Find: TItemFind; + const FindString: WideString; const FindPosition: TPoint; FindData: Pointer; + StartIndex: Integer; Direction: TSearchDirection; Wrap: Boolean; + var Index: Integer) of object; + +{TNT-WARN TCustomListView} + _TntInternalCustomListView = class(TCustomListView{TNT-ALLOW TCustomListView}) + private + PWideFindString: PWideChar; + CurrentDispInfo: PLVDispInfoW; + OriginalDispInfoMask: Cardinal; + function OwnerDataFindW(Find: TItemFind; const FindString: WideString; + const FindPosition: TPoint; FindData: Pointer; StartIndex: Integer; + Direction: TSearchDirection; Wrap: Boolean): Integer; virtual; abstract; + function OwnerDataFetchW(Item: TListItem{TNT-ALLOW TListItem}; Request: TItemRequest): Boolean; virtual; abstract; + protected + function OwnerDataFind(Find: TItemFind; const FindString: AnsiString; + const FindPosition: TPoint; FindData: Pointer; StartIndex: Integer; + Direction: TSearchDirection; Wrap: Boolean): Integer; override; + function OwnerDataFetch(Item: TListItem{TNT-ALLOW TListItem}; Request: TItemRequest): Boolean; override; + end; + + TTntCustomListView = class(_TntInternalCustomListView, IWideCustomListControl) + private + FEditHandle: THandle; + FEditInstance: Pointer; + FDefEditProc: Pointer; + FOnEdited: TTntLVEditedEvent; + FOnDataFind: TTntLVOwnerDataFindEvent; + procedure EditWndProcW(var Message: TMessage); + procedure BeginChangingWideItem; + procedure EndChangingWideItem; + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsHintStored: Boolean; + function GetListColumns: TTntListColumns; + procedure SetListColumns(const Value: TTntListColumns); + function ColumnFromIndex(Index: Integer): TTntListColumn; + function GetColumnFromTag(Tag: Integer): TTntListColumn; + function OwnerDataFindW(Find: TItemFind; const FindString: WideString; + const FindPosition: TPoint; FindData: Pointer; StartIndex: Integer; + Direction: TSearchDirection; Wrap: Boolean): Integer; override; + function OwnerDataFetchW(Item: TListItem{TNT-ALLOW TListItem}; Request: TItemRequest): Boolean; override; + function GetDropTarget: TTntListItem; + procedure SetDropTarget(const Value: TTntListItem); + function GetItemFocused: TTntListItem; + procedure SetItemFocused(const Value: TTntListItem); + function GetSelected: TTntListItem; + procedure SetSelected(const Value: TTntListItem); + function GetTopItem: TTntListItem; + private + FSavedItems: TObjectList; + FTestingForSortProc: Boolean; + FChangingWideItemCount: Integer; + FTempItem: TTntListItem; + function AreItemsStored: Boolean; + function GetItems: TTntListItems; + procedure SetItems(Value: TTntListItems); + procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY; + function GetItemW(Value: TLVItemW): TTntListItem; + procedure WMNotify(var Message: TWMNotify); message WM_NOTIFY; + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + procedure CreateWnd; override; + procedure DestroyWnd; override; + procedure WndProc(var Message: TMessage); override; + function OwnerDataFetch(Item: TListItem{TNT-ALLOW TListItem}; Request: TItemRequest): Boolean; reintroduce; virtual; + function CreateListItem: TListItem{TNT-ALLOW TListItem}; override; + function CreateListItems: TListItems{TNT-ALLOW TListItems}; override; + property Items: TTntListItems read GetItems write SetItems stored AreItemsStored; + procedure Edit(const Item: TLVItem); override; + function OwnerDataFind(Find: TItemFind; const FindString: WideString; + const FindPosition: TPoint; FindData: Pointer; StartIndex: Integer; + Direction: TSearchDirection; Wrap: Boolean): Integer; reintroduce; virtual; + property Columns: TTntListColumns read GetListColumns write SetListColumns; + procedure DrawItem(Item: TListItem{TNT-ALLOW TListItem}; Rect: TRect; State: TOwnerDrawState); override; + property OnEdited: TTntLVEditedEvent read FOnEdited write FOnEdited; + property OnDataFind: TTntLVOwnerDataFindEvent read FOnDataFind write FOnDataFind; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + property Column[Index: Integer]: TTntListColumn read ColumnFromIndex; + procedure CopySelection(Destination: TCustomListControl); override; + procedure AddItem(const Item: WideString; AObject: TObject); reintroduce; virtual; + function FindCaption(StartIndex: Integer; Value: WideString; Partial, + Inclusive, Wrap: Boolean): TTntListItem; + function GetSearchString: WideString; + function StringWidth(S: WideString): Integer; + public + property DropTarget: TTntListItem read GetDropTarget write SetDropTarget; + property ItemFocused: TTntListItem read GetItemFocused write SetItemFocused; + property Selected: TTntListItem read GetSelected write SetSelected; + property TopItem: TTntListItem read GetTopItem; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TListView} + TTntListView = class(TTntCustomListView) + published + property Action; + property Align; + property AllocBy; + property Anchors; + property BevelEdges; + property BevelInner; + property BevelOuter; + property BevelKind default bkNone; + property BevelWidth; + property BiDiMode; + property BorderStyle; + property BorderWidth; + property Checkboxes; + property Color; + property Columns; + property ColumnClick; + property Constraints; + property Ctl3D; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property FlatScrollBars; + property FullDrag; + property GridLines; + property HideSelection; + property HotTrack; + property HotTrackStyles; + property HoverTime; + property IconOptions; + property Items; + property LargeImages; + property MultiSelect; + property OwnerData; + property OwnerDraw; + property ReadOnly default False; + property RowSelect; + property ParentBiDiMode; + property ParentColor default False; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowColumnHeaders; + property ShowWorkAreas; + property ShowHint; + property SmallImages; + property SortType; + property StateImages; + property TabOrder; + property TabStop default True; + property ViewStyle; + property Visible; + property OnAdvancedCustomDraw; + property OnAdvancedCustomDrawItem; + property OnAdvancedCustomDrawSubItem; + property OnChange; + property OnChanging; + property OnClick; + property OnColumnClick; + property OnColumnDragged; + property OnColumnRightClick; + property OnCompare; + property OnContextPopup; + property OnCustomDraw; + property OnCustomDrawItem; + property OnCustomDrawSubItem; + property OnData; + property OnDataFind; + property OnDataHint; + property OnDataStateChange; + property OnDblClick; + property OnDeletion; + property OnDrawItem; + property OnEdited; + property OnEditing; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnGetImageIndex; + property OnGetSubItemImage; + property OnDragDrop; + property OnDragOver; + property OnInfoTip; + property OnInsert; + property OnKeyDown; + property OnKeyPress; + property OnKeyUp; + {$IFDEF COMPILER_9_UP} + property OnMouseActivate; + {$ENDIF} + property OnMouseDown; + {$IFDEF COMPILER_10_UP} + property OnMouseEnter; + property OnMouseLeave; + {$ENDIF} + property OnMouseMove; + property OnMouseUp; + property OnResize; + property OnSelectItem; + property OnStartDock; + property OnStartDrag; + end; + +type +{TNT-WARN TToolButton} + TTntToolButton = class(TToolButton{TNT-ALLOW TToolButton}) + private + procedure CMVisibleChanged(var Message: TMessage); message CM_VISIBLECHANGED; + function GetCaption: TWideCaption; + procedure SetCaption(const Value: TWideCaption); + function IsCaptionStored: Boolean; + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsHintStored: Boolean; + procedure CMHintShow(var Message: TMessage); message CM_HINTSHOW; + function GetMenuItem: TMenuItem{TNT-ALLOW TMenuItem}; + procedure SetMenuItem(const Value: TMenuItem{TNT-ALLOW TMenuItem}); + protected + procedure DefineProperties(Filer: TFiler); override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + function GetActionLinkClass: TControlActionLinkClass; override; + published + property Caption: TWideCaption read GetCaption write SetCaption stored IsCaptionStored; + property Hint: WideString read GetHint write SetHint stored IsHintStored; + property MenuItem: TMenuItem{TNT-ALLOW TMenuItem} read GetMenuItem write SetMenuItem; + end; + +type +{TNT-WARN TToolBar} + TTntToolBar = class(TToolBar{TNT-ALLOW TToolBar}) + private + FCaption: WideString; + procedure TBInsertButtonA(var Message: TMessage); message TB_INSERTBUTTONA; + procedure WMGetText(var Message: TWMGetText); message WM_GETTEXT; + procedure WMGetTextLength(var Message: TWMGetTextLength); message WM_GETTEXTLENGTH; + procedure WMSetText(var Message: TWMSetText); message WM_SETTEXT; + function GetMenu: TMainMenu{TNT-ALLOW TMainMenu}; + procedure SetMenu(const Value: TMainMenu{TNT-ALLOW TMainMenu}); + private + function GetCaption: WideString; + function GetHint: WideString; + function IsCaptionStored: Boolean; + function IsHintStored: Boolean; + procedure SetCaption(const Value: WideString); + procedure SetHint(const Value: WideString); + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + function GetActionLinkClass: TControlActionLinkClass; override; + published + property Caption: WideString read GetCaption write SetCaption stored IsCaptionStored; + property Hint: WideString read GetHint write SetHint stored IsHintStored; + property Menu: TMainMenu{TNT-ALLOW TMainMenu} read GetMenu write SetMenu; + end; + +type +{TNT-WARN TCustomRichEdit} + TTntCustomRichEdit = class(TCustomRichEdit{TNT-ALLOW TCustomRichEdit}) + private + FRichEditStrings: TTntStrings; + FPrintingTextLength: Integer; + procedure WMGetTextLength(var Message: TWMGetTextLength); message WM_GETTEXTLENGTH; + procedure SetRichEditStrings(const Value: TTntStrings); + function GetWideSelText: WideString; + function GetText: WideString; + procedure SetWideSelText(const Value: WideString); + procedure SetText(const Value: WideString); + function GetHint: WideString; + function IsHintStored: Boolean; + procedure SetHint(const Value: WideString); + procedure SetRTFText(Flags: DWORD; const Value: AnsiString); + protected + procedure CreateParams(var Params: TCreateParams); override; + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure CreateWnd; override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + procedure KeyDown(var Key: Word; Shift: TShiftState); override; + function GetSelText: string{TNT-ALLOW string}; override; + function CharPosToGet(RawWin32CharPos: Integer): Integer; deprecated; // use EmulatedCharPos() + function CharPosToSet(EmulatedCharPos: Integer): Integer; deprecated; // use RawWin32CharPos() + function GetSelStart: Integer; reintroduce; virtual; + procedure SetSelStart(const Value: Integer); reintroduce; virtual; + function GetSelLength: Integer; reintroduce; virtual; + procedure SetSelLength(const Value: Integer); reintroduce; virtual; + function LineBreakStyle: TTntTextLineBreakStyle; + property Lines: TTntStrings read FRichEditStrings write SetRichEditStrings; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + // + function EmulatedCharPos(RawWin32CharPos: Integer): Integer; + function RawWin32CharPos(EmulatedCharPos: Integer): Integer; + // + procedure Print(const Caption: string{TNT-ALLOW string}); override; + property SelText: WideString read GetWideSelText write SetWideSelText; + property SelStart: Integer read GetSelStart write SetSelStart; + property SelLength: Integer read GetSelLength write SetSelLength; + property Text: WideString read GetText write SetText; + function FindText(const SearchStr: WideString; StartPos, + Length: Integer; Options: TSearchTypes): Integer; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TRichEdit} + TTntRichEdit = class(TTntCustomRichEdit) + published + property Align; + property Alignment; + property Anchors; + property BevelEdges; + property BevelInner; + property BevelOuter; + property BevelKind default bkNone; + property BevelWidth; + property BiDiMode; + property BorderStyle; + property BorderWidth; + property Color; + property Ctl3D; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property HideSelection; + property HideScrollBars; + property ImeMode; + property ImeName; + property Constraints; + property Lines; + property MaxLength; + property ParentBiDiMode; + property ParentColor; + property ParentCtl3D; + property ParentFont; + property ParentShowHint; + property PlainText; + property PopupMenu; + property ReadOnly; + property ScrollBars; + property ShowHint; + property TabOrder; + property TabStop default True; + property Visible; + property WantTabs; + property WantReturns; + property WordWrap; + property OnChange; + property OnClick; + property OnContextPopup; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnKeyDown; + property OnKeyPress; + property OnKeyUp; + {$IFDEF COMPILER_9_UP} + property OnMouseActivate; + {$ENDIF} + property OnMouseDown; + {$IFDEF COMPILER_10_UP} + property OnMouseEnter; + property OnMouseLeave; + {$ENDIF} + property OnMouseMove; + property OnMouseUp; + property OnMouseWheel; + property OnMouseWheelDown; + property OnMouseWheelUp; + property OnProtectChange; + property OnResizeRequest; + property OnSaveClipboard; + property OnSelectionChange; + property OnStartDock; + property OnStartDrag; + end; + +type +{TNT-WARN TCustomTabControl} + TTntCustomTabControl = class(TCustomTabControl{TNT-ALLOW TCustomTabControl}) + private + FTabs: TTntStrings; + FSaveTabIndex: Integer; + FSaveTabs: TTntStrings; + function GetTabs: TTntStrings; + procedure SetTabs(const Value: TTntStrings); + procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; + function GetHint: WideString; + function IsHintStored: Boolean; + procedure SetHint(const Value: WideString); + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + procedure CreateWnd; override; + procedure DestroyWnd; override; + property Tabs: TTntStrings read GetTabs write SetTabs; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TTabControl} + TTntTabControl = class(TTntCustomTabControl) + public + property DisplayRect; + published + property Align; + property Anchors; + property BiDiMode; + property Constraints; + property DockSite; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property HotTrack; + property Images; + property MultiLine; + property MultiSelect; + property OwnerDraw; + property ParentBiDiMode; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property RaggedRight; + property ScrollOpposite; + property ShowHint; + property Style; + property TabHeight; + property TabOrder; + property TabPosition; + property Tabs; + property TabIndex; // must be after Tabs + property TabStop; + property TabWidth; + property Visible; + property OnChange; + property OnChanging; + property OnContextPopup; + property OnDockDrop; + property OnDockOver; + property OnDragDrop; + property OnDragOver; + property OnDrawTab; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnGetImageIndex; + property OnGetSiteInfo; + {$IFDEF COMPILER_9_UP} + property OnMouseActivate; + {$ENDIF} + property OnMouseDown; + {$IFDEF COMPILER_10_UP} + property OnMouseEnter; + property OnMouseLeave; + {$ENDIF} + property OnMouseMove; + property OnMouseUp; + property OnResize; + property OnStartDock; + property OnStartDrag; + property OnUnDock; + end; + +type +{TNT-WARN TTabSheet} + TTntTabSheet = class(TTabSheet{TNT-ALLOW TTabSheet}) + private + Force_Inherited_WMSETTEXT: Boolean; + function IsCaptionStored: Boolean; + function GetCaption: TWideCaption; + procedure SetCaption(const Value: TWideCaption); + procedure WMSetText(var Message: TWMSetText); message WM_SETTEXT; + function GetHint: WideString; + function IsHintStored: Boolean; + procedure SetHint(const Value: WideString); + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + published + property Caption: TWideCaption read GetCaption write SetCaption stored IsCaptionStored; + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TPageControl} + TTntPageControl = class(TPageControl{TNT-ALLOW TPageControl}) + private + FNewDockSheet: TTntTabSheet; + function IsHintStored: Boolean; + function GetHint: WideString; + procedure SetHint(const Value: WideString); + procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; + procedure CMDockNotification(var Message: TCMDockNotification); message CM_DOCKNOTIFICATION; + procedure CMDockClient(var Message: TCMDockClient); message CM_DOCKCLIENT; + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + procedure WndProc(var Message: TMessage); override; + procedure DoAddDockClient(Client: TControl; const ARect: TRect); override; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TTrackBar} + TTntTrackBar = class(TTrackBar{TNT-ALLOW TTrackBar}) + private + function IsHintStored: Boolean; + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TProgressBar} + TTntProgressBar = class(TProgressBar{TNT-ALLOW TProgressBar}) + private + function IsHintStored: Boolean; + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TCustomUpDown} + TTntCustomUpDown = class(TCustomUpDown{TNT-ALLOW TCustomUpDown}) + private + function IsHintStored: Boolean; + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TUpDown} + TTntUpDown = class(TTntCustomUpDown) + published + property AlignButton; + property Anchors; + property Associate; + property ArrowKeys; + property Enabled; + property Hint; + property Min; + property Max; + property Increment; + property Constraints; + property Orientation; + property ParentShowHint; + property PopupMenu; + property Position; + property ShowHint; + property TabOrder; + property TabStop; + property Thousands; + property Visible; + property Wrap; + property OnChanging; + property OnChangingEx; + property OnContextPopup; + property OnClick; + property OnEnter; + property OnExit; + {$IFDEF COMPILER_9_UP} + property OnMouseActivate; + {$ENDIF} + property OnMouseDown; + {$IFDEF COMPILER_10_UP} + property OnMouseEnter; + property OnMouseLeave; + {$ENDIF} + property OnMouseMove; + property OnMouseUp; + end; + +{TNT-WARN TDateTimePicker} + TTntDateTimePicker = class(TDateTimePicker{TNT-ALLOW TDateTimePicker}) + private + FHadFirstMouseClick: Boolean; + function IsHintStored: Boolean; + function GetHint: WideString; + procedure SetHint(const Value: WideString); + procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN; + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure CreateWnd; override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TMonthCalendar} + TTntMonthCalendar = class(TMonthCalendar{TNT-ALLOW TMonthCalendar}) + private + function IsHintStored: Boolean; + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function GetDate: TDate; + procedure SetDate(const Value: TDate); + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + public + procedure ForceGetMonthInfo; + published + property Date: TDate read GetDate write SetDate; + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TPageScroller} + TTntPageScroller = class(TPageScroller{TNT-ALLOW TPageScroller}) + private + function IsHintStored: Boolean; + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +type +{TNT-WARN TStatusPanel} + TTntStatusPanel = class(TStatusPanel{TNT-ALLOW TStatusPanel}) + private + FText: WideString; + function GetText: Widestring; + procedure SetText(const Value: Widestring); + procedure SetInheritedText(const Value: AnsiString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Text: Widestring read GetText write SetText; + end; + +{TNT-WARN TStatusPanels} + TTntStatusPanels = class(TStatusPanels{TNT-ALLOW TStatusPanels}) + private + function GetItem(Index: Integer): TTntStatusPanel; + procedure SetItem(Index: Integer; Value: TTntStatusPanel); + public + function Add: TTntStatusPanel; + function AddItem(Item: TTntStatusPanel; Index: Integer): TTntStatusPanel; + function Insert(Index: Integer): TTntStatusPanel; + property Items[Index: Integer]: TTntStatusPanel read GetItem write SetItem; default; + end; + +{TNT-WARN TCustomStatusBar} + TTntCustomStatusBar = class(TCustomStatusBar{TNT-ALLOW TCustomStatusBar}) + private + FSimpleText: WideString; + function GetSimpleText: WideString; + procedure SetSimpleText(const Value: WideString); + procedure SetInheritedSimpleText(const Value: AnsiString); + function SyncLeadingTabs(const WideVal: WideString; const AnsiVal: AnsiString): WideString; + function GetHint: WideString; + function IsHintStored: Boolean; + procedure SetHint(const Value: WideString); + procedure WMGetTextLength(var Message: TWMGetTextLength); message WM_GETTEXTLENGTH; + function GetPanels: TTntStatusPanels; + procedure SetPanels(const Value: TTntStatusPanels); + protected + procedure DefineProperties(Filer: TFiler); override; + function CreatePanels: TStatusPanels{TNT-ALLOW TStatusPanels}; override; + function GetPanelClass: TStatusPanelClass; override; + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure WndProc(var Msg: TMessage); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + public + function ExecuteAction(Action: TBasicAction): Boolean; override; + property Panels: TTntStatusPanels read GetPanels write SetPanels; + property SimpleText: WideString read GetSimpleText write SetSimpleText; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TStatusBar} + TTntStatusBar = class(TTntCustomStatusBar) + private + function GetOnDrawPanel: TDrawPanelEvent; + procedure SetOnDrawPanel(const Value: TDrawPanelEvent); + published + property Action; + property AutoHint default False; + property Align default alBottom; + property Anchors; + property BiDiMode; + property BorderWidth; + property Color default clBtnFace; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font stored IsFontStored; + property Constraints; + property Panels; + property ParentBiDiMode; + property ParentColor default False; + property ParentFont default False; + property ParentShowHint; + property PopupMenu; + property ShowHint; + property SimplePanel {$IFDEF COMPILER_7_UP} default False {$ENDIF}; + property SimpleText; + property SizeGrip default True; + property UseSystemFont default True; + property Visible; + property OnClick; + property OnContextPopup; + property OnCreatePanelClass; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnHint; + {$IFDEF COMPILER_9_UP} + property OnMouseActivate; + {$ENDIF} + property OnMouseDown; + {$IFDEF COMPILER_10_UP} + property OnMouseEnter; + property OnMouseLeave; + {$ENDIF} + property OnMouseMove; + property OnMouseUp; + // Required for backwards compatibility with the old event signature + property OnDrawPanel: TDrawPanelEvent read GetOnDrawPanel write SetOnDrawPanel; + property OnResize; + property OnStartDock; + property OnStartDrag; + end; + +type + TTntTreeNodes = class; + TTntCustomTreeView = class; + +{TNT-WARN TTreeNode} + TTntTreeNode = class(TTreeNode{TNT-ALLOW TTreeNode}) + private + FText: WideString; + procedure SetText(const Value: WideString); + procedure SetInheritedText(const Value: AnsiString); + function GetText: WideString; + function GetItem(Index: Integer): TTntTreeNode; + function GetNodeOwner: TTntTreeNodes; + function GetParent: TTntTreeNode; + function GetTreeView: TTntCustomTreeView; + procedure SetItem(Index: Integer; const Value: TTntTreeNode); + function IsEqual(Node: TTntTreeNode): Boolean; + procedure ReadData(Stream: TStream; Info: PNodeInfo); + procedure WriteData(Stream: TStream; Info: PNodeInfo); + public + procedure Assign(Source: TPersistent); override; + function getFirstChild: TTntTreeNode; {GetFirstChild conflicts with C++ macro} + function GetLastChild: TTntTreeNode; + function GetNext: TTntTreeNode; + function GetNextChild(Value: TTntTreeNode): TTntTreeNode; + function getNextSibling: TTntTreeNode; {GetNextSibling conflicts with C++ macro} + function GetNextVisible: TTntTreeNode; + function GetPrev: TTntTreeNode; + function GetPrevChild(Value: TTntTreeNode): TTntTreeNode; + function getPrevSibling: TTntTreeNode; {GetPrevSibling conflicts with a C++ macro} + function GetPrevVisible: TTntTreeNode; + property Item[Index: Integer]: TTntTreeNode read GetItem write SetItem; default; + property Owner: TTntTreeNodes read GetNodeOwner; + property Parent: TTntTreeNode read GetParent; + property Text: WideString read GetText write SetText; + property TreeView: TTntCustomTreeView read GetTreeView; + end; + + TTntTreeNodeClass = class of TTntTreeNode; + + TTntTreeNodesEnumerator = class + private + FIndex: Integer; + FTreeNodes: TTntTreeNodes; + public + constructor Create(ATreeNodes: TTntTreeNodes); + function GetCurrent: TTntTreeNode; + function MoveNext: Boolean; + property Current: TTntTreeNode read GetCurrent; + end; + +{TNT-WARN TTreeNodes} + TTntTreeNodes = class(TTreeNodes{TNT-ALLOW TTreeNodes}) + private + function GetNodeFromIndex(Index: Integer): TTntTreeNode; + function GetNodesOwner: TTntCustomTreeView; + procedure ClearCache; + procedure ReadData(Stream: TStream); + procedure WriteData(Stream: TStream); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + function Add(Sibling: TTntTreeNode; const S: WideString): TTntTreeNode; + function AddChild(Parent: TTntTreeNode; const S: WideString): TTntTreeNode; + function AddChildFirst(Parent: TTntTreeNode; const S: WideString): TTntTreeNode; + function AddChildObject(Parent: TTntTreeNode; const S: WideString; + Ptr: Pointer): TTntTreeNode; + function AddChildObjectFirst(Parent: TTntTreeNode; const S: WideString; + Ptr: Pointer): TTntTreeNode; + function AddFirst(Sibling: TTntTreeNode; const S: WideString): TTntTreeNode; + function AddObject(Sibling: TTntTreeNode; const S: WideString; + Ptr: Pointer): TTntTreeNode; + function AddObjectFirst(Sibling: TTntTreeNode; const S: WideString; + Ptr: Pointer): TTntTreeNode; + function Insert(Sibling: TTntTreeNode; const S: WideString): TTntTreeNode; + function InsertObject(Sibling: TTntTreeNode; const S: WideString; + Ptr: Pointer): TTntTreeNode; + function InsertNode(Node, Sibling: TTntTreeNode; const S: WideString; + Ptr: Pointer): TTntTreeNode; + function AddNode(Node, Relative: TTntTreeNode; const S: WideString; + Ptr: Pointer; Method: TNodeAttachMode): TTntTreeNode; + public + function GetFirstNode: TTntTreeNode; + function GetEnumerator: TTntTreeNodesEnumerator; + function GetNode(ItemId: HTreeItem): TTntTreeNode; + property Item[Index: Integer]: TTntTreeNode read GetNodeFromIndex; default; + property Owner: TTntCustomTreeView read GetNodesOwner; + end; + + TTntTVEditedEvent = procedure(Sender: TObject; Node: TTntTreeNode; var S: WideString) of object; + +{TNT-WARN TCustomTreeView} + _TntInternalCustomTreeView = class(TCustomTreeView{TNT-ALLOW TCustomTreeView}) + private + function Wide_FindNextToSelect: TTntTreeNode; virtual; abstract; + function Inherited_FindNextToSelect: TTreeNode{TNT-ALLOW TTreeNode}; + public + function FindNextToSelect: TTreeNode{TNT-ALLOW TTreeNode}; override; + end; + + TTntCustomTreeView = class(_TntInternalCustomTreeView) + private + FSavedNodeText: TTntStrings; + FSavedSortType: TSortType; + FOnEdited: TTntTVEditedEvent; + FTestingForSortProc: Boolean; + FEditHandle: THandle; + FEditInstance: Pointer; + FDefEditProc: Pointer; + function GetTreeNodes: TTntTreeNodes; + procedure SetTreeNodes(const Value: TTntTreeNodes); + procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY; + procedure WMNotify(var Message: TWMNotify); message WM_NOTIFY; + function GetNodeFromItem(const Item: TTVItem): TTntTreeNode; + procedure EditWndProcW(var Message: TMessage); + function Wide_FindNextToSelect: TTntTreeNode; override; + function GetDropTarget: TTntTreeNode; + function GetSelected: TTntTreeNode; + function GetSelection(Index: Integer): TTntTreeNode; + function GetTopItem: TTntTreeNode; + procedure SetDropTarget(const Value: TTntTreeNode); + procedure SetSelected(const Value: TTntTreeNode); + procedure SetTopItem(const Value: TTntTreeNode); + function GetHint: WideString; + function IsHintStored: Boolean; + procedure SetHint(const Value: WideString); + protected + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure CreateWnd; override; + procedure DestroyWnd; override; + procedure DefineProperties(Filer: TFiler); override; + procedure WndProc(var Message: TMessage); override; + procedure Edit(const Item: TTVItem); override; + function CreateNode: TTreeNode{TNT-ALLOW TTreeNode}; override; + function CreateNodes: TTreeNodes{TNT-ALLOW TTreeNodes}; override; + property Items: TTntTreeNodes read GetTreeNodes write SetTreeNodes; + property OnEdited: TTntTVEditedEvent read FOnEdited write FOnEdited; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure LoadFromFile(const FileName: WideString); + procedure LoadFromStream(Stream: TStream); + procedure SaveToFile(const FileName: WideString); + procedure SaveToStream(Stream: TStream); + function GetNodeAt(X, Y: Integer): TTntTreeNode; + property DropTarget: TTntTreeNode read GetDropTarget write SetDropTarget; + property Selected: TTntTreeNode read GetSelected write SetSelected; + property TopItem: TTntTreeNode read GetTopItem write SetTopItem; + property Selections[Index: Integer]: TTntTreeNode read GetSelection; + function GetSelections(AList: TList): TTntTreeNode; + function FindNextToSelect: TTntTreeNode; reintroduce; virtual; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TTreeView} + TTntTreeView = class(TTntCustomTreeView) + published + property Align; + property Anchors; + property AutoExpand; + property BevelEdges; + property BevelInner; + property BevelOuter; + property BevelKind default bkNone; + property BevelWidth; + property BiDiMode; + property BorderStyle; + property BorderWidth; + property ChangeDelay; + property Color; + property Ctl3D; + property Constraints; + property DragKind; + property DragCursor; + property DragMode; + property Enabled; + property Font; + property HideSelection; + property HotTrack; + property Images; + property Indent; + property MultiSelect; + property MultiSelectStyle; + property ParentBiDiMode; + property ParentColor default False; + property ParentCtl3D; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ReadOnly; + property RightClickSelect; + property RowSelect; + property ShowButtons; + property ShowHint; + property ShowLines; + property ShowRoot; + property SortType; + property StateImages; + property TabOrder; + property TabStop default True; + property ToolTips; + property Visible; + property OnAddition; + property OnAdvancedCustomDraw; + property OnAdvancedCustomDrawItem; + property OnChange; + property OnChanging; + property OnClick; + property OnCollapsed; + property OnCollapsing; + property OnCompare; + property OnContextPopup; + property OnCreateNodeClass; + property OnCustomDraw; + property OnCustomDrawItem; + property OnDblClick; + property OnDeletion; + property OnDragDrop; + property OnDragOver; + property OnEdited; + property OnEditing; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnExpanding; + property OnExpanded; + property OnGetImageIndex; + property OnGetSelectedIndex; + property OnKeyDown; + property OnKeyPress; + property OnKeyUp; + {$IFDEF COMPILER_9_UP} + property OnMouseActivate; + {$ENDIF} + property OnMouseDown; + {$IFDEF COMPILER_10_UP} + property OnMouseEnter; + property OnMouseLeave; + {$ENDIF} + property OnMouseMove; + property OnMouseUp; + property OnStartDock; + property OnStartDrag; + { Items must be published after OnGetImageIndex and OnGetSelectedIndex } + property Items; + end; + +implementation + +uses + Forms, SysUtils, TntGraphics, ImgList, TntSystem, TntStdCtrls, StdCtrls, + RichEdit, ActiveIMM_TLB, TntForms, ComStrs, TntMenus, + TntActnList, TntStdActns, TntWindows, + {$IFNDEF COMPILER_10_UP} + TntWideStrings, + {$ELSE} + WideStrings, + {$ENDIF} + {$IFDEF COMPILER_9_UP} WideStrUtils {$ELSE} TntWideStrUtils {$ENDIF}; + +procedure CreateUnicodeHandle_ComCtl(Control: TWinControl; const Params: TCreateParams; + const SubClass: WideString); +begin + Assert(SubClass <> '', 'TNT Internal Error: Only call CreateUnicodeHandle_ComCtl for Common Controls.'); + CreateUnicodeHandle(Control, Params, SubClass); + if Win32PlatformIsUnicode then + SendMessageW(Control.Handle, CCM_SETUNICODEFORMAT, Integer(True), 0); +end; + +{ TTntListColumn } + +procedure TTntListColumn.Assign(Source: TPersistent); +begin + inherited; + if Source is TTntListColumn then + Caption := TTntListColumn(Source).Caption + else if Source is TListColumn{TNT-ALLOW TListColumn} then + FCaption := TListColumn{TNT-ALLOW TListColumn}(Source).Caption; +end; + +procedure TTntListColumn.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +procedure TTntListColumn.SetInheritedCaption(const Value: AnsiString); +begin + inherited Caption := Value; +end; + +function TTntListColumn.GetCaption: WideString; +begin + Result := GetSyncedWideString(FCaption, inherited Caption); +end; + +procedure TTntListColumn.SetCaption(const Value: WideString); +begin + SetSyncedWideString(Value, FCaption, inherited Caption, SetInheritedCaption); +end; + +{ TTntListColumns } + +{$IFDEF COMPILER_6} // verified against VCL source in Delphi 6 and BCB 6 +type + THackCollection = class(TPersistent) + protected + FItemClass: TCollectionItemClass; + end; +{$ENDIF} +{$IFDEF DELPHI_7} // verified against VCL source in Delphi 7 +type + THackCollection = class(TPersistent) + protected + FItemClass: TCollectionItemClass; + end; +{$ENDIF} +{$IFDEF DELPHI_9} // verified against VCL source in Delphi 9 +type + THackCollection = class(TPersistent) + protected + FItemClass: TCollectionItemClass; + end; +{$ENDIF} +{$IFDEF DELPHI_10} // verified against VCL source in Delphi 10 +type + THackCollection = class(TPersistent) + protected + FItemClass: TCollectionItemClass; + end; +{$ENDIF} + +constructor TTntListColumns.Create(AOwner: TTntCustomListView); +begin + inherited Create(AOwner); + Assert(THackCollection(Self).FItemClass = Self.ItemClass, 'Internal Error in TTntListColumns.Create().'); + THackCollection(Self).FItemClass := TTntListColumn +end; + +function TTntListColumns.Owner: TTntCustomListView; +begin + Result := inherited Owner as TTntCustomListView; +end; + +function TTntListColumns.Add: TTntListColumn; +begin + Result := (inherited Add) as TTntListColumn; +end; + +function TTntListColumns.GetItem(Index: Integer): TTntListColumn; +begin + Result := inherited Items[Index] as TTntListColumn; +end; + +procedure TTntListColumns.SetItem(Index: Integer; Value: TTntListColumn); +begin + inherited SetItem(Index, Value); +end; + +{ TWideSubItems } +type + TWideSubItems = class(TTntStringList) + private + FIgnoreInherited: Boolean; + FInheritedOwner: TListItem{TNT-ALLOW TListItem}; + FOwner: TTntListItem; + protected + procedure Put(Index: Integer; const S: WideString); override; + function GetObject(Index: Integer): TObject; override; + procedure PutObject(Index: Integer; AObject: TObject); override; + procedure SetUpdateState(Updating: Boolean); override; + public + procedure Insert(Index: Integer; const S: WideString); override; + function AddObject(const S: WideString; AObject: TObject): Integer; override; + procedure Clear; override; + procedure Delete(Index: Integer); override; + public + constructor Create(AOwner: TTntListItem); + end; + +constructor TWideSubItems.Create(AOwner: TTntListItem); +begin + inherited Create; + FInheritedOwner := AOwner; + FOwner := AOwner; +end; + +function TWideSubItems.AddObject(const S: WideString; AObject: TObject): Integer; +begin + FOwner.ListView.BeginChangingWideItem; + try + Result := inherited AddObject(S, AObject); + if (not FIgnoreInherited) then + FInheritedOwner.SubItems.AddObject(S, AObject); + finally + FOwner.ListView.EndChangingWideItem; + end; +end; + +procedure TWideSubItems.Clear; +begin + FOwner.ListView.BeginChangingWideItem; + try + inherited; + if (not FIgnoreInherited) then + FInheritedOwner.SubItems.Clear; + finally + FOwner.ListView.EndChangingWideItem; + end; +end; + +procedure TWideSubItems.Delete(Index: Integer); +begin + FOwner.ListView.BeginChangingWideItem; + try + inherited; + if (not FIgnoreInherited) then + FInheritedOwner.SubItems.Delete(Index); + finally + FOwner.ListView.EndChangingWideItem; + end; +end; + +procedure TWideSubItems.Insert(Index: Integer; const S: WideString); +begin + FOwner.ListView.BeginChangingWideItem; + try + inherited; + if (not FIgnoreInherited) then + FInheritedOwner.SubItems.Insert(Index, S); + finally + FOwner.ListView.EndChangingWideItem; + end; +end; + +procedure TWideSubItems.Put(Index: Integer; const S: WideString); +begin + FOwner.ListView.BeginChangingWideItem; + try + inherited; + if (not FIgnoreInherited) then + FInheritedOwner.SubItems[Index] := S; + finally + FOwner.ListView.EndChangingWideItem; + end; +end; + +function TWideSubItems.GetObject(Index: Integer): TObject; +begin + Result := FInheritedOwner.SubItems.Objects[Index]; +end; + +procedure TWideSubItems.PutObject(Index: Integer; AObject: TObject); +begin + FInheritedOwner.SubItems.Objects[Index] := AObject; +end; + +type TAccessStrings = class(TStrings{TNT-ALLOW TStrings}); + +procedure TWideSubItems.SetUpdateState(Updating: Boolean); +begin + inherited; + TAccessStrings(FInheritedOwner.SubItems).SetUpdateState(Updating); +end; + +{ TTntListItem } + +constructor TTntListItem.Create(AOwner: TListItems{TNT-ALLOW TListItems}); +begin + inherited Create(AOwner); + FSubItems := TWideSubItems.Create(Self); +end; + +destructor TTntListItem.Destroy; +begin + inherited; + FreeAndNil(FSubItems); +end; + +function TTntListItem.GetCaption: WideString; +begin + Result := GetSyncedWideString(FCaption, inherited Caption); +end; + +procedure TTntListItem.SetInheritedCaption(const Value: AnsiString); +begin + inherited Caption := Value; +end; + +procedure TTntListItem.SetCaption(const Value: WideString); +begin + ListView.BeginChangingWideItem; + try + SetSyncedWideString(Value, FCaption, inherited Caption, SetInheritedCaption); + finally + ListView.EndChangingWideItem; + end; +end; + +procedure TTntListItem.Assign(Source: TPersistent); +begin + if Source is TTntListItem then + with Source as TTntListItem do + begin + Self.Caption := Caption; + Self.Data := Data; + Self.ImageIndex := ImageIndex; + Self.Indent := Indent; + Self.OverlayIndex := OverlayIndex; + Self.StateIndex := StateIndex; + Self.SubItems := SubItems; + Self.Checked := Checked; + end + else inherited Assign(Source); +end; + +procedure TTntListItem.SetSubItems(const Value: TTntStrings); +begin + if Value <> nil then + FSubItems.Assign(Value); +end; + +function TTntListItem.GetTntOwner: TTntListItems; +begin + Result := ListView.Items; +end; + +function TTntListItem.GetListView: TTntCustomListView; +begin + Result := ((inherited Owner).Owner as TTntCustomListView); +end; + +{ TTntListItemsEnumerator } + +constructor TTntListItemsEnumerator.Create(AListItems: TTntListItems); +begin + inherited Create; + FIndex := -1; + FListItems := AListItems; +end; + +function TTntListItemsEnumerator.GetCurrent: TTntListItem; +begin + Result := FListItems[FIndex]; +end; + +function TTntListItemsEnumerator.MoveNext: Boolean; +begin + Result := FIndex < FListItems.Count - 1; + if Result then + Inc(FIndex); +end; + +{ TTntListItems } + +function TTntListItems.Add: TTntListItem; +begin + Result := (inherited Add) as TTntListItem; +end; + +function TTntListItems.AddItem(Item: TTntListItem; Index: Integer): TTntListItem; +begin + Result := (inherited AddItem(Item, Index)) as TTntListItem; +end; + +function TTntListItems.Insert(Index: Integer): TTntListItem; +begin + Result := (inherited Insert(Index)) as TTntListItem; +end; + +function TTntListItems.GetItem(Index: Integer): TTntListItem; +begin + Result := (inherited Item[Index]) as TTntListItem; +end; + +function TTntListItems.Owner: TTntCustomListView; +begin + Result := (inherited Owner) as TTntCustomListView; +end; + +procedure TTntListItems.SetItem(Index: Integer; const Value: TTntListItem); +begin + inherited Item[Index] := Value; +end; + +function TTntListItems.GetEnumerator: TTntListItemsEnumerator; +begin + Result := TTntListItemsEnumerator.Create(Self); +end; + +{ TSavedListItem } +type + TSavedListItem = class + FCaption: WideString; + FSubItems: TTntStrings; + constructor Create; + destructor Destroy; override; + end; + +constructor TSavedListItem.Create; +begin + inherited; + FSubItems := TTntStringList.Create; +end; + +destructor TSavedListItem.Destroy; +begin + FSubItems.Free; + inherited; +end; + +{ _TntInternalCustomListView } + +function _TntInternalCustomListView.OwnerDataFind(Find: TItemFind; + const FindString: AnsiString; const FindPosition: TPoint; + FindData: Pointer; StartIndex: Integer; Direction: TSearchDirection; + Wrap: Boolean): Integer; +var + WideFindString: WideString; +begin + if Assigned(PWideFindString) then + WideFindString := PWideFindString + else + WideFindString := FindString; + Result := OwnerDataFindW(Find, WideFindString, FindPosition, FindData, StartIndex, Direction, Wrap); +end; + +function _TntInternalCustomListView.OwnerDataFetch(Item: TListItem{TNT-ALLOW TListItem}; + Request: TItemRequest): Boolean; +begin + if (CurrentDispInfo <> nil) + and (OriginalDispInfoMask and LVIF_TEXT <> 0) then begin + (Item as TTntListItem).FCaption := CurrentDispInfo.item.pszText + end; + (Item as TTntListItem).FSubItems.Clear; + Result := OwnerDataFetchW(Item, Request); +end; + +{ TTntCustomListView } + +{$IFDEF COMPILER_6} // verified against VCL source in Delphi 6 and BCB 6 +type + THackCustomListView = class(TCustomMultiSelectListControl) + protected + FxxxCanvas: TCanvas; + FxxxBorderStyle: TBorderStyle; + FxxxViewStyle: TViewStyle; + FxxxReadOnly: Boolean; + FxxxLargeImages: TCustomImageList; + FxxxSmallImages: TCustomImageList; + FxxxStateImages: TCustomImageList; + FxxxDragImage: TDragImageList; + FxxxMultiSelect: Boolean; + FxxxSortType: TSortType; + FxxxColumnClick: Boolean; + FxxxShowColumnHeaders: Boolean; + FxxxListItems: TListItems{TNT-ALLOW TListItems}; + FxxxClicked: Boolean; + FxxxRClicked: Boolean; + FxxxIconOptions: TIconOptions; + FxxxHideSelection: Boolean; + FListColumns: TListColumns{TNT-ALLOW TListColumns}; + end; +{$ENDIF} +{$IFDEF DELPHI_7} // verified against VCL source in Delphi 7 +type + THackCustomListView = class(TCustomMultiSelectListControl) + protected + FxxxCanvas: TCanvas; + FxxxBorderStyle: TBorderStyle; + FxxxViewStyle: TViewStyle; + FxxxReadOnly: Boolean; + FxxxLargeImages: TCustomImageList; + FxxxSmallImages: TCustomImageList; + FxxxStateImages: TCustomImageList; + FxxxDragImage: TDragImageList; + FxxxMultiSelect: Boolean; + FxxxSortType: TSortType; + FxxxColumnClick: Boolean; + FxxxShowColumnHeaders: Boolean; + FxxxListItems: TListItems{TNT-ALLOW TListItems}; + FxxxClicked: Boolean; + FxxxRClicked: Boolean; + FxxxIconOptions: TIconOptions; + FxxxHideSelection: Boolean; + FListColumns: TListColumns{TNT-ALLOW TListColumns}; + end; +{$ENDIF} +{$IFDEF DELPHI_9} // verified against VCL source in Delphi 9 +type + THackCustomListView = class(TCustomMultiSelectListControl) + protected + FxxxCanvas: TCanvas; + FxxxBorderStyle: TBorderStyle; + FxxxViewStyle: TViewStyle; + FxxxReadOnly: Boolean; + FxxxLargeImages: TCustomImageList; + FxxxSmallImages: TCustomImageList; + FxxxStateImages: TCustomImageList; + FxxxDragImage: TDragImageList; + FxxxMultiSelect: Boolean; + FxxxSortType: TSortType; + FxxxColumnClick: Boolean; + FxxxShowColumnHeaders: Boolean; + FxxxListItems: TListItems{TNT-ALLOW TListItems}; + FxxxClicked: Boolean; + FxxxRClicked: Boolean; + FxxxIconOptions: TIconOptions; + FxxxHideSelection: Boolean; + FListColumns: TListColumns{TNT-ALLOW TListColumns}; + end; +{$ENDIF} +{$IFDEF DELPHI_10} // verified against VCL source in Delphi 10 +type + THackCustomListView = class(TCustomMultiSelectListControl) + protected + FxxxCanvas: TCanvas; + FxxxBorderStyle: TBorderStyle; + FxxxViewStyle: TViewStyle; + FxxxReadOnly: Boolean; + FxxxLargeImages: TCustomImageList; + FxxxSaveSelectedIndex: Integer; + FxxxSmallImages: TCustomImageList; + FxxxStateImages: TCustomImageList; + FxxxDragImage: TDragImageList; + FxxxMultiSelect: Boolean; + FxxxSortType: TSortType; + FxxxColumnClick: Boolean; + FxxxShowColumnHeaders: Boolean; + FxxxListItems: TListItems{TNT-ALLOW TListItems}; + FxxxClicked: Boolean; + FxxxRClicked: Boolean; + FxxxIconOptions: TIconOptions; + FxxxHideSelection: Boolean; + FListColumns: TListColumns{TNT-ALLOW TListColumns}; + end; +{$ENDIF} + +var + ComCtrls_DefaultListViewSort: TLVCompare = nil; + +constructor TTntCustomListView.Create(AOwner: TComponent); +begin + inherited; + FEditInstance := Classes.MakeObjectInstance(EditWndProcW); + // create list columns + Assert(THackCustomListView(Self).FListColumns = inherited Columns, 'Internal Error in TTntCustomListView.Create().'); + FreeAndNil(THackCustomListView(Self).FListColumns); + THackCustomListView(Self).FListColumns := TTntListColumns.Create(Self); +end; + +destructor TTntCustomListView.Destroy; +begin + inherited; + Classes.FreeObjectInstance(FEditInstance); + FreeAndNil(FSavedItems); +end; + +procedure TTntCustomListView.CreateWindowHandle(const Params: TCreateParams); + + procedure Capture_ComCtrls_DefaultListViewSort; + begin + FTestingForSortProc := True; + try + AlphaSort; + finally + FTestingForSortProc := False; + end; + end; + +var + Column: TLVColumn; +begin + CreateUnicodeHandle_ComCtl(Self, Params, WC_LISTVIEW); + if (Win32PlatformIsUnicode) then begin + if not Assigned(ComCtrls_DefaultListViewSort) then + Capture_ComCtrls_DefaultListViewSort; + // the only way I could get editing to work is after a column had been inserted + Column.mask := 0; + ListView_InsertColumn(Handle, 0, Column); + ListView_DeleteColumn(Handle, 0); + end; +end; + +procedure TTntCustomListView.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +procedure TTntCustomListView.CreateWnd; +begin + inherited; + FreeAndNil(FSavedItems); +end; + +procedure TTntCustomListView.DestroyWnd; +var + i: integer; + FSavedItem: TSavedListItem; + Item: TTntListItem; +begin + if (not (csDestroying in ComponentState)) and (not OwnerData) then begin + FreeAndNil(FSavedItems); // fixes a bug on Windows 95. + FSavedItems := TObjectList.Create(True); + for i := 0 to Items.Count - 1 do begin + FSavedItem := TSavedListItem.Create; + Item := Items[i]; + FSavedItem.FCaption := Item.FCaption; + FSavedItem.FSubItems.Assign(Item.FSubItems); + FSavedItems.Add(FSavedItem) + end; + end; + inherited; +end; + +function TTntCustomListView.GetDropTarget: TTntListItem; +begin + Result := inherited DropTarget as TTntListItem; +end; + +procedure TTntCustomListView.SetDropTarget(const Value: TTntListItem); +begin + inherited DropTarget := Value; +end; + +function TTntCustomListView.GetItemFocused: TTntListItem; +begin + Result := inherited ItemFocused as TTntListItem; +end; + +procedure TTntCustomListView.SetItemFocused(const Value: TTntListItem); +begin + inherited ItemFocused := Value; +end; + +function TTntCustomListView.GetSelected: TTntListItem; +begin + Result := inherited Selected as TTntListItem; +end; + +procedure TTntCustomListView.SetSelected(const Value: TTntListItem); +begin + inherited Selected := Value; +end; + +function TTntCustomListView.GetTopItem: TTntListItem; +begin + Result := inherited TopItem as TTntListItem; +end; + +function TTntCustomListView.GetListColumns: TTntListColumns; +begin + Result := inherited Columns as TTntListColumns; +end; + +procedure TTntCustomListView.SetListColumns(const Value: TTntListColumns); +begin + inherited Columns := Value; +end; + +{$IFDEF COMPILER_6} // verified against VCL source in Delphi 6 and BCB 6 +type + THackListColumn = class(TCollectionItem) + protected + FxxxAlignment: TAlignment; + FxxxAutoSize: Boolean; + FxxxCaption: AnsiString; + FxxxMaxWidth: TWidth; + FxxxMinWidth: TWidth; + FxxxImageIndex: TImageIndex; + FxxxPrivateWidth: TWidth; + FxxxWidth: TWidth; + FOrderTag: Integer; + end; +{$ENDIF} +{$IFDEF DELPHI_7} // verified against VCL source in Delphi 7 +type + THackListColumn = class(TCollectionItem) + protected + FxxxAlignment: TAlignment; + FxxxAutoSize: Boolean; + FxxxCaption: AnsiString; + FxxxMaxWidth: TWidth; + FxxxMinWidth: TWidth; + FxxxImageIndex: TImageIndex; + FxxxPrivateWidth: TWidth; + FxxxWidth: TWidth; + FOrderTag: Integer; + end; +{$ENDIF} +{$IFDEF DELPHI_9} // verified against VCL source in Delphi 9 +type + THackListColumn = class(TCollectionItem) + protected + FxxxxxxxxAlignment: TAlignment; + FxxxxAutoSize: Boolean; + FxxxxCaption: AnsiString; + FxxxxMaxWidth: TWidth; + FxxxxMinWidth: TWidth; + FxxxxImageIndex: TImageIndex; + FxxxxPrivateWidth: TWidth; + FxxxxWidth: TWidth; + FOrderTag: Integer; + end; +{$ENDIF} +{$IFDEF DELPHI_10} // verified against VCL source in Delphi 10 +type + THackListColumn = class(TCollectionItem) + protected + FxxxxxxxxAlignment: TAlignment; + FxxxxAutoSize: Boolean; + FxxxxCaption: AnsiString; + FxxxxMaxWidth: TWidth; + FxxxxMinWidth: TWidth; + FxxxxImageIndex: TImageIndex; + FxxxxPrivateWidth: TWidth; + FxxxxWidth: TWidth; + FOrderTag: Integer; + end; +{$ENDIF} + +function TTntCustomListView.GetColumnFromTag(Tag: Integer): TTntListColumn; +var + I: Integer; +begin + for I := 0 to Columns.Count - 1 do + begin + Result := Columns[I]; + if THackListColumn(Result).FOrderTag = Tag then Exit; + end; + Result := nil; +end; + +function TTntCustomListView.ColumnFromIndex(Index: Integer): TTntListColumn; +begin + Result := inherited Column[Index] as TTntListColumn; +end; + +function TTntCustomListView.AreItemsStored: Boolean; +begin + if Assigned(Action) then + begin + if Action is TCustomListAction{TNT-ALLOW TCustomListAction} then + Result := False + else + Result := True; + end + else + Result := not OwnerData; +end; + +function TTntCustomListView.GetItems: TTntListItems; +begin + Result := inherited Items as TTntListItems; +end; + +procedure TTntCustomListView.SetItems(Value: TTntListItems); +begin + inherited Items := Value; +end; + +type TTntListItemClass = class of TTntListItem; + +function TTntCustomListView.CreateListItem: TListItem{TNT-ALLOW TListItem}; +var + LClass: TClass; + TntLClass: TTntListItemClass; +begin + LClass := TTntListItem; + if Assigned(OnCreateItemClass) then + OnCreateItemClass(Self, TListItemClass(LClass)); + if not LClass.InheritsFrom(TTntListItem) then + raise ETntInternalError.Create('Internal Error: OnCreateItemClass.ItemClass must inherit from TTntListItem.'); + TntLClass := TTntListItemClass(LClass); + Result := TntLClass.Create(inherited Items); + if FTempItem = nil then + FTempItem := Result as TTntListItem; { In Delphi 5/6/7/9/10, the first item created is the temp item } + { TODO: Verify that D11 creates a temp item in its constructor. } +end; + +function TTntCustomListView.CreateListItems: TListItems{TNT-ALLOW TListItems}; +begin + Result := TTntListItems.Create(Self); +end; + +function TTntCustomListView.GetItemW(Value: TLVItemW): TTntListItem; +begin + with Value do begin + if (mask and LVIF_PARAM) <> 0 then + Result := TListItem{TNT-ALLOW TListItem}(lParam) as TTntListItem + else if iItem >= 0 then + Result := Items[IItem] + else if OwnerData then + Result := FTempItem + else + Result := nil + end; +end; + +function TTntCustomListView.OwnerDataFetchW(Item: TListItem{TNT-ALLOW TListItem}; Request: TItemRequest): Boolean; +begin + Result := OwnerDataFetch(Item, Request); +end; + +function TTntCustomListView.OwnerDataFetch(Item: TListItem{TNT-ALLOW TListItem}; Request: TItemRequest): Boolean; +begin + if Assigned(OnData) then + begin + OnData(Self, Item); + Result := True; + end + else Result := False; +end; + +function TntDefaultListViewSort(Item1, Item2: TTntListItem; lParam: Integer): Integer; stdcall; +begin + Assert(Win32PlatformIsUnicode); + with Item1 do + if Assigned(ListView.OnCompare) then + ListView.OnCompare(ListView, Item1, Item2, lParam, Result) + else Result := lstrcmpw(PWideChar(Item1.Caption), PWideChar(Item2.Caption)); +end; + +procedure TTntCustomListView.WndProc(var Message: TMessage); +var + Item: TTntListItem; + InheritedItem: TListItem{TNT-ALLOW TListItem}; + SubItem: Integer; + SavedItem: TSavedListItem; + PCol: PLVColumn; + Col: TTntListColumn; +begin + with Message do begin + // restore previous values (during CreateWnd) + if (FSavedItems <> nil) and (FChangingWideItemCount = 0) and (Msg = LVM_SETITEMTEXTA) then begin + Item := Items[wParam]; + SavedItem := TSavedListItem(FSavedItems[wParam]); + if (Msg = LVM_SETITEMTEXTA) and (PLVItem(lParam).iSubItem = 0) then + Item.FCaption := SavedItem.FCaption + else begin + SubItem := PLVItem(lParam).iSubItem - 1; + TWideSubItems(Item.SubItems).FIgnoreInherited := True; + try + if SubItem < Item.SubItems.Count then begin + Item.SubItems[SubItem] := SavedItem.FSubItems[SubItem]; + Item.SubItems.Objects[SubItem] := SavedItem.FSubItems.Objects[SubItem] + end else if SubItem = Item.SubItems.Count then + Item.SubItems.AddObject(SavedItem.FSubItems[SubItem], SavedItem.FSubItems.Objects[SubItem]) + else + Item.SubItems.Assign(SavedItem.FSubItems) + finally + TWideSubItems(Item.SubItems).FIgnoreInherited := False; + end; + end; + end; + + // sync wide with ansi + if (FSavedItems = nil) and (FChangingWideItemCount = 0) and (Msg = LVM_UPDATE) then begin + Item := Items[wParam]; + InheritedItem := Item; + TWideSubItems(Item.SubItems).FIgnoreInherited := True; + try + Item.SubItems.Assign(InheritedItem.SubItems) + finally + TWideSubItems(Item.SubItems).FIgnoreInherited := False; + end; + end; + + if (FSavedItems = nil) and (FChangingWideItemCount = 0) and (Msg = LVM_SETITEMTEXTA) then begin + if OwnerData then + Item := FTempItem + else + Item := Items[wParam]; + InheritedItem := Item; + if (Msg = LVM_SETITEMTEXTA) and (PLVItem(lParam).iSubItem = 0) then + Item.FCaption := InheritedItem.Caption + else begin + SubItem := PLVItem(lParam).iSubItem - 1; + TWideSubItems(Item.SubItems).FIgnoreInherited := True; + try + if SubItem < Item.SubItems.Count then begin + Item.SubItems[SubItem] := InheritedItem.SubItems[SubItem]; + Item.SubItems.Objects[SubItem] := InheritedItem.SubItems.Objects[SubItem] + end else if SubItem = Item.SubItems.Count then + Item.SubItems.AddObject(InheritedItem.SubItems[SubItem], InheritedItem.SubItems.Objects[SubItem]) + else + Item.SubItems.Assign(InheritedItem.SubItems) + finally + TWideSubItems(Item.SubItems).FIgnoreInherited := False; + end; + end; + end; + + // capture ANSI version of DefaultListViewSort from ComCtrls + if (FTestingForSortProc) + and (Msg = LVM_SORTITEMS) then begin + ComCtrls_DefaultListViewSort := Pointer(lParam); + exit; + end; + + if (Msg = LVM_SETCOLUMNA) then begin + // make sure that wide column caption stays in sync with ANSI + PCol := PLVColumn(lParam); + if (PCol.mask and LVCF_TEXT) <> 0 then begin + Col := GetColumnFromTag(wParam); + if (Col <> nil) and (AnsiString(Col.Caption) <> PCol.pszText) then begin + Col.FCaption := PCol.pszText; + end; + end; + end; + + if (Win32PlatformIsUnicode) + and (Msg = LVM_SETITEMTEXTA) and (PLVItem(lParam).pszText = LPSTR_TEXTCALLBACK) then + // Unicode:: call wide version of text call back instead + Result := SendMessageW(Handle, LVM_SETITEMTEXTW, WParam, LParam) + else if (Win32PlatformIsUnicode) + and (Msg = LVM_SORTITEMS) and (Pointer(lParam) = @ComCtrls_DefaultListViewSort) then + // Unicode:: call wide version of sort proc instead + Result := SendMessageW(Handle, LVM_SORTITEMS, wParam, Integer(@TntDefaultListViewSort)) + else if (Win32PlatformIsUnicode) + and (Msg = LVM_SETCOLUMNA) and ((PLVColumn(lParam).mask and LVCF_TEXT) <> 0) + and (GetColumnFromTag(wParam) <> nil) then begin + PLVColumn(lParam).pszText := PAnsiChar(PWideChar(GetColumnFromTag(wParam).FCaption)); + Result := SendMessageW(Handle, LVM_SETCOLUMNW, wParam, lParam); + end else begin + if (Msg = LVM_SETEXTENDEDLISTVIEWSTYLE) and CheckBoxes then begin + { fix a bug in TCustomListView.ResetExStyles } + lParam := lParam or LVS_EX_SUBITEMIMAGES or LVS_EX_INFOTIP; + end; + inherited; + end; + end; +end; + +procedure TTntCustomListView.WMNotify(var Message: TWMNotify); +begin + inherited; + // capture updated info after inherited + with Message.NMHdr^ do + case code of + HDN_ENDTRACKW: + begin + Message.NMHdr^.code := HDN_ENDTRACKA; + try + inherited + finally + Message.NMHdr^.code := HDN_ENDTRACKW; + end; + end; + HDN_DIVIDERDBLCLICKW: + begin + Message.NMHdr^.code := HDN_DIVIDERDBLCLICKA; + try + inherited + finally + Message.NMHdr^.code := HDN_DIVIDERDBLCLICKW; + end; + end; + end; +end; + +procedure TTntCustomListView.CNNotify(var Message: TWMNotify); +var + Item: TTntListItem; +begin + if (not Win32PlatformIsUnicode) then + inherited + else begin + with Message do + begin + case NMHdr^.code of + HDN_TRACKW: + begin + NMHdr^.code := HDN_TRACKA; + try + inherited; + finally + NMHdr^.code := HDN_TRACKW; + end; + end; + LVN_GETDISPINFOW: + begin + // call inherited without the LVIF_TEXT flag + CurrentDispInfo := PLVDispInfoW(NMHdr); + try + OriginalDispInfoMask := PLVDispInfoW(NMHdr)^.item.mask; + + PLVDispInfoW(NMHdr)^.item.mask := PLVDispInfoW(NMHdr)^.item.mask and (not LVIF_TEXT); + try + NMHdr^.code := LVN_GETDISPINFOA; + try + inherited; + finally + NMHdr^.code := LVN_GETDISPINFOW; + end; + finally + if (OriginalDispInfoMask and LVIF_TEXT <> 0) then + PLVDispInfoW(NMHdr)^.item.mask := PLVDispInfoW(NMHdr)^.item.mask or LVIF_TEXT; + end; + finally + CurrentDispInfo := nil; + end; + + // handle any text info + with PLVDispInfoW(NMHdr)^.item do + begin + if (mask and LVIF_TEXT) <> 0 then + begin + Item := GetItemW(PLVDispInfoW(NMHdr)^.item); + if iSubItem = 0 then + WStrLCopy(pszText, PWideChar(Item.Caption), cchTextMax - 1) + else begin + with Item.SubItems do begin + if iSubItem <= Count then + WStrLCopy(pszText, PWideChar(Strings[iSubItem - 1]), cchTextMax - 1) + else pszText[0] := #0; + end; + end; + end; + end; + end; + LVN_ODFINDITEMW: + with PNMLVFindItem(NMHdr)^ do + begin + if ((lvfi.flags and LVFI_PARTIAL) <> 0) or ((lvfi.flags and LVFI_STRING) <> 0) then + PWideFindString := TLVFindInfoW(lvfi).psz + else + PWideFindString := nil; + lvfi.psz := nil; + NMHdr^.code := LVN_ODFINDITEMA; + try + inherited; {will Result in call to OwnerDataFind} + finally + TLVFindInfoW(lvfi).psz := PWideFindString; + NMHdr^.code := LVN_ODFINDITEMW; + PWideFindString := nil; + end; + end; + LVN_BEGINLABELEDITW: + begin + Item := GetItemW(PLVDispInfoW(NMHdr)^.item); + if not CanEdit(Item) then Result := 1; + if Result = 0 then + begin + FEditHandle := ListView_GetEditControl(Handle); + FDefEditProc := Pointer(GetWindowLongW(FEditHandle, GWL_WNDPROC)); + SetWindowLongW(FEditHandle, GWL_WNDPROC, LongInt(FEditInstance)); + end; + end; + LVN_ENDLABELEDITW: + with PLVDispInfoW(NMHdr)^ do + if (item.pszText <> nil) and (item.IItem <> -1) then + Edit(TLVItemA(item)); + LVN_GETINFOTIPW: + begin + NMHdr^.code := LVN_GETINFOTIPA; + try + inherited; + finally + NMHdr^.code := LVN_GETINFOTIPW; + end; + end; + else + inherited; + end; + end; + end; +end; + +function TTntCustomListView.OwnerDataFindW(Find: TItemFind; + const FindString: WideString; const FindPosition: TPoint; + FindData: Pointer; StartIndex: Integer; Direction: TSearchDirection; + Wrap: Boolean): Integer; +begin + Result := OwnerDataFind(Find, FindString, FindPosition, FindData, StartIndex, Direction, Wrap); +end; + +function TTntCustomListView.OwnerDataFind(Find: TItemFind; const FindString: WideString; + const FindPosition: TPoint; FindData: Pointer; StartIndex: Integer; + Direction: TSearchDirection; Wrap: Boolean): Integer; +var + AnsiEvent: TLVOwnerDataFindEvent; +begin + Result := -1; + if Assigned(OnDataFind) then + OnDataFind(Self, Find, FindString, FindPosition, FindData, StartIndex, Direction, Wrap, Result) + else if Assigned(inherited OnDataFind) then begin + AnsiEvent := inherited OnDataFind; + AnsiEvent(Self, Find, FindString, FindPosition, FindData, StartIndex, Direction, + Wrap, Result); + end; +end; + +procedure TTntCustomListView.Edit(const Item: TLVItem); +var + S: WideString; + AnsiS: AnsiString; + EditItem: TTntListItem; + AnsiEvent: TLVEditedEvent; +begin + if (not Win32PlatformIsUnicode) then + S := Item.pszText + else + S := TLVItemW(Item).pszText; + EditItem := GetItemW(TLVItemW(Item)); + if Assigned(OnEdited) then + OnEdited(Self, EditItem, S) + else if Assigned(inherited OnEdited) then + begin + AnsiEvent := inherited OnEdited; + AnsiS := S; + AnsiEvent(Self, EditItem, AnsiS); + S := AnsiS; + end; + if EditItem <> nil then + EditItem.Caption := S; +end; + +procedure TTntCustomListView.EditWndProcW(var Message: TMessage); +begin + Assert(Win32PlatformIsUnicode); + try + with Message do + begin + case Msg of + WM_KEYDOWN, + WM_SYSKEYDOWN: if DoKeyDown(TWMKey(Message)) then Exit; + WM_CHAR: + begin + MakeWMCharMsgSafeForAnsi(Message); + try + if DoKeyPress(TWMKey(Message)) then Exit; + finally + RestoreWMCharMsg(Message); + end; + end; + WM_KEYUP, + WM_SYSKEYUP: if DoKeyUp(TWMKey(Message)) then Exit; + CN_KEYDOWN, + CN_CHAR, CN_SYSKEYDOWN, + CN_SYSCHAR: + begin + WndProc(Message); + Exit; + end; + end; + Result := CallWindowProcW(FDefEditProc, FEditHandle, Msg, WParam, LParam); + end; + except + Application.HandleException(Self); + end; +end; + +procedure TTntCustomListView.BeginChangingWideItem; +begin + Inc(FChangingWideItemCount); +end; + +procedure TTntCustomListView.EndChangingWideItem; +begin + if FChangingWideItemCount > 0 then + Dec(FChangingWideItemCount); +end; + +procedure TTntCustomListView.DrawItem(Item: TListItem{TNT-ALLOW TListItem}; Rect: TRect; + State: TOwnerDrawState); +begin + TControlCanvas(Canvas).UpdateTextFlags; + if Assigned(OnDrawItem) then OnDrawItem(Self, Item, Rect, State) + else + begin + Canvas.FillRect(Rect); + WideCanvasTextOut(Canvas, Rect.Left + 2, Rect.Top, Item.Caption); + end; +end; + +procedure TTntCustomListView.CopySelection(Destination: TCustomListControl); +var + I: Integer; +begin + for I := 0 to Items.Count - 1 do + if Items[I].Selected then + WideListControl_AddItem(Destination, Items[I].Caption, Items[I].Data); +end; + +procedure TTntCustomListView.AddItem(const Item: WideString; AObject: TObject); +begin + with Items.Add do + begin + Caption := Item; + Data := AObject; + end; +end; + +//------------- + +function TTntCustomListView.FindCaption(StartIndex: Integer; Value: WideString; + Partial, Inclusive, Wrap: Boolean): TTntListItem; +const + FullString: array[Boolean] of Integer = (0, LVFI_PARTIAL); + Wraps: array[Boolean] of Integer = (0, LVFI_WRAP); +var + Info: TLVFindInfoW; + Index: Integer; +begin + if (not Win32PlatformIsUnicode) then + Result := inherited FindCaption(StartIndex, Value, Partial, Inclusive, Wrap) as TTntListItem + else begin + with Info do + begin + flags := LVFI_STRING or FullString[Partial] or Wraps[Wrap]; + psz := PWideChar(Value); + end; + if Inclusive then Dec(StartIndex); + Index := SendMessageW(Handle, LVM_FINDITEMW, StartIndex, Longint(@Info)); + if Index <> -1 then Result := Items[Index] + else Result := nil; + end; +end; + +function TTntCustomListView.StringWidth(S: WideString): Integer; +begin + if (not Win32PlatformIsUnicode) then + Result := inherited StringWidth(S) + else + Result := SendMessageW(Handle, LVM_GETSTRINGWIDTHW, 0, Longint(PWideChar(S))) +end; + +function TTntCustomListView.GetSearchString: WideString; +var + Buffer: array[0..1023] of WideChar; +begin + if (not Win32PlatformIsUnicode) then + Result := inherited GetSearchString + else begin + Result := ''; + if HandleAllocated + and Bool(SendMessageW(Handle, LVM_GETISEARCHSTRINGW, 0, Longint(PWideChar(@Buffer[0])))) then + Result := Buffer; + end; +end; + +function TTntCustomListView.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TTntCustomListView.GetHint: WideString; +begin + Result := TntControl_GetHint(Self) +end; + +procedure TTntCustomListView.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntCustomListView.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntCustomListView.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +{ TTntToolButton } + +procedure TTntToolButton.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +procedure TTntToolButton.CMVisibleChanged(var Message: TMessage); +begin + inherited; + RefreshControl; +end; + +function TTntToolButton.GetCaption: TWideCaption; +begin + Result := TntControl_GetText(Self); +end; + +procedure TTntToolButton.SetCaption(const Value: TWideCaption); +begin + TntControl_SetText(Self, Value); + RefreshControl; { causes button to be removed and reinserted with TB_INSERTBUTTON } +end; + +function TTntToolButton.IsCaptionStored: Boolean; +begin + Result := TntControl_IsCaptionStored(Self) +end; + +function TTntToolButton.GetHint: WideString; +begin + Result := TntControl_GetHint(Self) +end; + +procedure TTntToolButton.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +function TTntToolButton.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self) +end; + +procedure TTntToolButton.CMHintShow(var Message: TMessage); +begin + ProcessCMHintShowMsg(Message); + inherited; +end; + +procedure TTntToolButton.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntToolButton.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +function TTntToolButton.GetMenuItem: TMenuItem{TNT-ALLOW TMenuItem}; +begin + Result := inherited MenuItem; +end; + +procedure TTntToolButton.SetMenuItem(const Value: TMenuItem{TNT-ALLOW TMenuItem}); +begin + inherited MenuItem := Value; + if Value is TTntMenuItem then begin + Caption := TTntMenuItem(Value).Caption; + Hint := TTntMenuItem(Value).Hint; + end; +end; + +{ TTntToolBar } + +procedure TTntToolBar.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle_ComCtl(Self, Params, TOOLBARCLASSNAME); +end; + +procedure TTntToolBar.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +procedure TTntToolBar.TBInsertButtonA(var Message: TMessage); +var + Button: TTntToolButton; + Buffer: WideString; +begin + if Win32PlatformIsUnicode + and (PTBButton(Message.LParam).iString <> -1) + and (Buttons[Message.WParam] is TTntToolButton) then + begin + Button := TTntToolButton(Buttons[Message.WParam]); + Buffer := Button.Caption + WideChar(#0); + PTBButton(Message.LParam).iString := + SendMessage(Handle, TB_ADDSTRINGW, 0, Integer(PWideChar(Buffer))); + end; + inherited; +end; + +{ Need to read/write caption ourselves - default wndproc seems to discard it. } + +procedure TTntToolBar.WMGetText(var Message: TWMGetText); +begin + if (not Win32PlatformIsUnicode) or (WindowHandle = 0) then + inherited + else + with Message do + Result := WStrLen(WStrLCopy(PWideChar(Text), PWideChar(FCaption), TextMax - 1)); +end; + +procedure TTntToolBar.WMGetTextLength(var Message: TWMGetTextLength); +begin + if (not Win32PlatformIsUnicode) or (WindowHandle = 0) then + inherited + else + Message.Result := Length(FCaption); +end; + +procedure TTntToolBar.WMSetText(var Message: TWMSetText); +begin + if (not Win32PlatformIsUnicode) or (WindowHandle = 0) then + inherited + else + with Message do + SetString(FCaption, PWideChar(Text), WStrLen(PWideChar(Text))); +end; + +function TTntToolBar.GetCaption: WideString; +begin + Result := TntControl_GetText(Self); +end; + +procedure TTntToolBar.SetCaption(const Value: WideString); +begin + TntControl_SetText(Self, Value); +end; + +function TTntToolBar.IsCaptionStored: Boolean; +begin + Result := TntControl_IsCaptionStored(Self); +end; + +function TTntToolBar.GetHint: WideString; +begin + Result := TntControl_GetHint(Self); +end; + +procedure TTntToolBar.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +function TTntToolBar.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +procedure TTntToolBar.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntToolBar.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +function TTntToolBar.GetMenu: TMainMenu{TNT-ALLOW TMainMenu}; +begin + Result := inherited Menu; +end; + +procedure TTntToolBar.SetMenu(const Value: TMainMenu{TNT-ALLOW TMainMenu}); +var + I: Integer; +begin + if (Menu <> Value) then begin + inherited Menu := Value; + if Assigned(Menu) then begin + // get rid of TToolButton(s) + for I := ButtonCount - 1 downto 0 do + Buttons[I].Free; + // add TTntToolButton(s) + for I := Menu.Items.Count - 1 downto 0 do + begin + with TTntToolButton.Create(Self) do + try + AutoSize := True; + Grouped := True; + Parent := Self; + MenuItem := Menu.Items[I]; + except + Free; + raise; + end; + end; + end; + end; +end; + +{ TTntRichEditStrings } +type + TTntRichEditStrings = class(TTntMemoStrings) + private + RichEdit: TCustomRichEdit{TNT-ALLOW TCustomRichEdit}; + procedure EnableChange(const Value: Boolean); + protected + procedure SetTextStr(const Value: WideString); override; + public + constructor Create; + procedure AddStrings(Strings: TWideStrings); overload; override; + //-- + procedure LoadFromStream_BOM(Stream: TStream; WithBOM: Boolean); override; + procedure SaveToStream_BOM(Stream: TStream; WithBOM: Boolean); override; + procedure LoadFromFile(const FileName: WideString); override; + procedure SaveToFile(const FileName: WideString); override; + end; + +constructor TTntRichEditStrings.Create; +begin + inherited Create; + FRichEditMode := True; +end; + +procedure TTntRichEditStrings.AddStrings(Strings: TWideStrings); +var + SelChange: TNotifyEvent; +begin + SelChange := TTntCustomRichEdit(RichEdit).OnSelectionChange; + TTntCustomRichEdit(RichEdit).OnSelectionChange := nil; + try + inherited; + finally + TTntCustomRichEdit(RichEdit).OnSelectionChange := SelChange; + end; +end; + +procedure TTntRichEditStrings.EnableChange(const Value: Boolean); +var + EventMask: Longint; +begin + with RichEdit do + begin + if Value then + EventMask := SendMessage(Handle, EM_GETEVENTMASK, 0, 0) or ENM_CHANGE + else + EventMask := SendMessage(Handle, EM_GETEVENTMASK, 0, 0) and not ENM_CHANGE; + SendMessage(Handle, EM_SETEVENTMASK, 0, EventMask); + end; +end; + +procedure TTntRichEditStrings.SetTextStr(const Value: WideString); +begin + EnableChange(False); + try + inherited; + finally + EnableChange(True); + end; +end; + +type TAccessCustomRichEdit = class(TCustomRichEdit{TNT-ALLOW TCustomRichEdit}); + +procedure TTntRichEditStrings.LoadFromStream_BOM(Stream: TStream; WithBOM: Boolean); +begin + if TAccessCustomRichEdit(RichEdit).PlainText then + inherited LoadFromStream_BOM(Stream, WithBOM) + else + TAccessCustomRichEdit(RichEdit).Lines.LoadFromStream(Stream); +end; + +procedure TTntRichEditStrings.SaveToStream_BOM(Stream: TStream; WithBOM: Boolean); +begin + if TAccessCustomRichEdit(RichEdit).PlainText then + inherited SaveToStream_BOM(Stream, WithBOM) + else + TAccessCustomRichEdit(RichEdit).Lines.SaveToStream(Stream); +end; + +procedure TTntRichEditStrings.LoadFromFile(const FileName: WideString); +begin + if TAccessCustomRichEdit(RichEdit).PlainText then + inherited LoadFromFile(FileName) + else + TAccessCustomRichEdit(RichEdit).Lines.LoadFromFile(FileName); +end; + +procedure TTntRichEditStrings.SaveToFile(const FileName: WideString); +begin + if TAccessCustomRichEdit(RichEdit).PlainText then + inherited SaveToFile(FileName) + else + TAccessCustomRichEdit(RichEdit).Lines.SaveToFile(FileName); +end; + +{ TTntCustomRichEdit } + +constructor TTntCustomRichEdit.Create(AOwner: TComponent); +begin + inherited; + FRichEditStrings := TTntRichEditStrings.Create; + TTntRichEditStrings(FRichEditStrings).FMemo := Self; + TTntRichEditStrings(FRichEditStrings).FMemoLines := TAccessCustomRichEdit(Self).Lines; + TTntRichEditStrings(FRichEditStrings).FLineBreakStyle := Self.LineBreakStyle; + TTntRichEditStrings(FRichEditStrings).RichEdit := Self; +end; + +var + FRichEdit20Module: THandle = 0; + +function IsRichEdit20Available: Boolean; +const + RICHED20_DLL = 'RICHED20.DLL'; +begin + if FRichEdit20Module = 0 then + FRichEdit20Module := Tnt_LoadLibraryW(RICHED20_DLL); + Result := FRichEdit20Module <> 0; +end; + +{function IsRichEdit30Available: Boolean; +begin + Result := False; + exit; + Result := IsRichEdit20Available and (Win32MajorVersion >= 5); +end;} + +procedure TTntCustomRichEdit.CreateParams(var Params: TCreateParams); +begin + inherited CreateParams(Params); + if WordWrap then + Params.Style := Params.Style and not WS_HSCROLL; // more compatible with RichEdit 1.0 +end; + +procedure TTntCustomRichEdit.CreateWindowHandle(const Params: TCreateParams); +begin + if Win32PlatformIsUnicode and IsRichEdit20Available then + CreateUnicodeHandle(Self, Params, RICHEDIT_CLASSW) + else + inherited +end; + +var + AIMM: IActiveIMMApp = nil; + +function EnableActiveIMM: Boolean; +begin + if AIMM <> nil then + Result := True + else begin + Result := False; + try + if ClassIsRegistered(CLASS_CActiveIMM) then begin + AIMM := CoCActiveIMM.Create; + AIMM.Activate(1); + Result := True; + end; + except + AIMM := nil; + end; + end; +end; + +procedure TTntCustomRichEdit.CreateWnd; +const + EM_SETEDITSTYLE = WM_USER + 204; + SES_USEAIMM = 64; +begin + inherited; + // Only supported in RichEdit 3.0, but this flag is harmless to RichEdit1.0 or RichEdit 2.0 + if EnableActiveIMM then + SendMessage(Handle, EM_SETEDITSTYLE, SES_USEAIMM, SES_USEAIMM); +end; + +procedure TTntCustomRichEdit.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +destructor TTntCustomRichEdit.Destroy; +begin + FreeAndNil(FRichEditStrings); + inherited; +end; + +procedure TTntCustomRichEdit.KeyDown(var Key: Word; Shift: TShiftState); +begin + inherited; + if (not WantReturns) and (Key = VK_RETURN) and (Shift <> [ssCtrl]) then + Key := 0; +end; + +function TTntCustomRichEdit.LineBreakStyle: TTntTextLineBreakStyle; +begin + if Win32PlatformIsUnicode and IsRichEdit20Available then + Result := tlbsCR + else + Result := tlbsCRLF; +end; + +procedure TTntCustomRichEdit.SetRichEditStrings(const Value: TTntStrings); +begin + FRichEditStrings.Assign(Value); +end; + +function TTntCustomRichEdit.GetSelText: string{TNT-ALLOW string}; +begin + Result := GetWideSelText; +end; + +function TTntCustomRichEdit.GetWideSelText: WideString; +var + CharRange: TCharRange; + Length: Integer; +begin + if (not IsWindowUnicode(Handle)) then + Result := inherited GetSelText + else begin + SendMessageW(Handle, EM_EXGETSEL, 0, Longint(@CharRange)); + SetLength(Result, CharRange.cpMax - CharRange.cpMin + 1); + Length := SendMessageW(Handle, EM_GETSELTEXT, 0, Longint(PWideChar(Result))); + SetLength(Result, Length); + end; + if LineBreakStyle <> tlbsCRLF then + Result := TntAdjustLineBreaks(Result, tlbsCRLF) +end; + +type + TSetTextEx = record + flags:dword; + codepage:uint; + end; + +procedure TTntCustomRichEdit.SetRTFText(Flags: DWORD; const Value: AnsiString); +const + EM_SETTEXTEX = (WM_USER + 97); +var + Info: TSetTextEx; +begin + Info.flags := Flags; + Info.codepage := CP_ACP{TNT-ALLOW CP_ACP}; + SendMessage(Handle, EM_SETTEXTEX, Integer(@Info), Integer(PAnsiChar(Value))); +end; + +procedure TTntCustomRichEdit.SetWideSelText(const Value: WideString); +const + ST_SELECTION = 2; +begin + if Win32PlatformIsUnicode and IsRichEdit20Available and IsRTF(Value) then begin + // emulate RichEdit 1.0 so that RTF code is inserted as RTF (not plain text) + SetRTFText(ST_SELECTION, Value) + end else + TntCustomEdit_SetSelText(Self, TntAdjustLineBreaks(Value, LineBreakStyle)); +end; + +function TTntCustomRichEdit.GetText: WideString; +begin + Result := TntControl_GetText(Self); + if (LineBreakStyle <> tlbsCRLF) then + Result := TntAdjustLineBreaks(Result, tlbsCRLF); +end; + +procedure TTntCustomRichEdit.SetText(const Value: WideString); +const + ST_DEFAULT = 0; +begin + if Win32PlatformIsUnicode and IsRichEdit20Available and IsRTF(Value) then begin + // emulate RichEdit 1.0 so that RTF code is inserted as RTF (not plain text) + SetRTFText(ST_DEFAULT, Value) + end else if Value <> Text then + TntControl_SetText(Self, TntAdjustLineBreaks(Value, LineBreakStyle)); +end; + +function TTntCustomRichEdit.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TTntCustomRichEdit.GetHint: WideString; +begin + Result := TntControl_GetHint(Self); +end; + +procedure TTntCustomRichEdit.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntCustomRichEdit.WMGetTextLength(var Message: TWMGetTextLength); +begin + if FPrintingTextLength <> 0 then + Message.Result := FPrintingTextLength + else + inherited; +end; + +procedure TTntCustomRichEdit.Print(const Caption: string{TNT-ALLOW string}); +begin + if (LineBreakStyle <> tlbsCRLF) then + FPrintingTextLength := TntAdjustLineBreaksLength(Text, LineBreakStyle) + else + FPrintingTextLength := 0; + try + inherited + finally + FPrintingTextLength := 0; + end; +end; + +{$WARN SYMBOL_DEPRECATED OFF} + +function TTntCustomRichEdit.CharPosToGet(RawWin32CharPos: Integer): Integer; +begin + Result := EmulatedCharPos(RawWin32CharPos); +end; + +function TTntCustomRichEdit.CharPosToSet(EmulatedCharPos: Integer): Integer; +begin + Result := RawWin32CharPos(EmulatedCharPos); +end; +{$WARN SYMBOL_DEPRECATED ON} + +function TTntCustomRichEdit.EmulatedCharPos(RawWin32CharPos: Integer): Integer; +var + i: Integer; + ThisLine: Integer; + CharCount: Integer; + Line_Start: Integer; + NumLineBreaks: Integer; +begin + if (LineBreakStyle = tlbsCRLF) or (RawWin32CharPos <= 0) then + Result := RawWin32CharPos + else begin + Assert(Win32PlatformIsUnicode); + ThisLine := SendMessageW(Handle, EM_EXLINEFROMCHAR, 0, RawWin32CharPos); + if (not WordWrap) then + NumLineBreaks := ThisLine + else begin + CharCount := 0; + for i := 0 to ThisLine - 1 do + Inc(CharCount, TntMemo_LineLength(Handle, i)); + Line_Start := TntMemo_LineStart(Handle, ThisLine); + NumLineBreaks := Line_Start - CharCount; + end; + Result := RawWin32CharPos + NumLineBreaks; {inflate CR -> CR/LF} + end; +end; + +function TTntCustomRichEdit.RawWin32CharPos(EmulatedCharPos: Integer): Integer; +var + Line: Integer; + NumLineBreaks: Integer; + CharCount: Integer; + Line_Start: Integer; + LineLength: Integer; +begin + if (LineBreakStyle = tlbsCRLF) or (EmulatedCharPos <= 0) then + Result := EmulatedCharPos + else begin + Assert(Win32PlatformIsUnicode); + NumLineBreaks := 0; + CharCount := 0; + for Line := 0 to Lines.Count do begin + Line_Start := TntMemo_LineStart(Handle, Line); + if EmulatedCharPos < (Line_Start + NumLineBreaks) then + break; {found it (it must have been the line separator)} + if Line_Start > CharCount then begin + Inc(NumLineBreaks); + Inc(CharCount); + end; + LineLength := TntMemo_LineLength(Handle, Line, Line_Start); + Inc(CharCount, LineLength); + if (EmulatedCharPos >= (Line_Start + NumLineBreaks)) + and (EmulatedCharPos < (Line_Start + LineLength + NumLineBreaks)) then + break; {found it} + end; + Result := EmulatedCharPos - NumLineBreaks; {deflate CR/LF -> CR} + end; +end; + +function TTntCustomRichEdit.FindText(const SearchStr: WideString; + StartPos, Length: Integer; Options: TSearchTypes): Integer; +const + EM_FINDTEXTEXW = WM_USER + 124; +const + FR_DOWN = $00000001; + FR_WHOLEWORD = $00000002; + FR_MATCHCASE = $00000004; +var + Find: TFindTextW; + Flags: Integer; +begin + if (not Win32PlatformIsUnicode) then + Result := inherited FindText(SearchStr, StartPos, Length, Options) + else begin + with Find.chrg do + begin + cpMin := RawWin32CharPos(StartPos); + cpMax := RawWin32CharPos(StartPos + Length); + end; + Flags := FR_DOWN; { RichEdit 2.0 and later needs this } + if stWholeWord in Options then Flags := Flags or FR_WHOLEWORD; + if stMatchCase in Options then Flags := Flags or FR_MATCHCASE; + Find.lpstrText := PWideChar(SearchStr); + Result := SendMessageW(Handle, EM_FINDTEXT, Flags, LongInt(@Find)); + Result := EmulatedCharPos(Result); + end; +end; + +function TTntCustomRichEdit.GetSelStart: Integer; +begin + Result := TntCustomEdit_GetSelStart(Self); + Result := EmulatedCharPos(Result); +end; + +procedure TTntCustomRichEdit.SetSelStart(const Value: Integer); +begin + TntCustomEdit_SetSelStart(Self, RawWin32CharPos(Value)); +end; + +function TTntCustomRichEdit.GetSelLength: Integer; +var + CharRange: TCharRange; +begin + if (LineBreakStyle = tlbsCRLF) then + Result := TntCustomEdit_GetSelLength(Self) + else begin + Assert(Win32PlatformIsUnicode); + SendMessageW(Handle, EM_EXGETSEL, 0, Longint(@CharRange)); + Result := EmulatedCharPos(CharRange.cpMax) - EmulatedCharPos(CharRange.cpMin); + end; +end; + +procedure TTntCustomRichEdit.SetSelLength(const Value: Integer); +var + StartPos: Integer; + SelEnd: Integer; +begin + if (LineBreakStyle = tlbsCRLF) then + TntCustomEdit_SetSelLength(Self, Value) + else begin + StartPos := Self.SelStart; + SelEnd := StartPos + Value; + inherited SetSelLength(RawWin32CharPos(SelEnd) - RawWin32CharPos(StartPos)); + end; +end; + +procedure TTntCustomRichEdit.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntCustomRichEdit.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +{ TTntTabStrings } + +type TAccessCustomTabControl = class(TCustomTabControl{TNT-ALLOW TCustomTabControl}); + +type + TTntTabStrings = class(TTntStrings) + private + FTabControl: TCustomTabControl{TNT-ALLOW TCustomTabControl}; + FAnsiTabs: TStrings{TNT-ALLOW TStrings}; + protected + function Get(Index: Integer): WideString; override; + function GetCount: Integer; override; + function GetObject(Index: Integer): TObject; override; + procedure Put(Index: Integer; const S: WideString); override; + procedure PutObject(Index: Integer; AObject: TObject); override; + procedure SetUpdateState(Updating: Boolean); override; + public + procedure Clear; override; + procedure Delete(Index: Integer); override; + procedure Insert(Index: Integer; const S: WideString); override; + end; + +procedure TabControlError(const S: WideString); +begin + raise EListError.Create(S); +end; + +procedure TTntTabStrings.Clear; +begin + FAnsiTabs.Clear; +end; + +procedure TTntTabStrings.Delete(Index: Integer); +begin + FAnsiTabs.Delete(Index); +end; + +function TTntTabStrings.GetCount: Integer; +begin + Result := FAnsiTabs.Count; +end; + +function TTntTabStrings.GetObject(Index: Integer): TObject; +begin + Result := FAnsiTabs.Objects[Index]; +end; + +procedure TTntTabStrings.PutObject(Index: Integer; AObject: TObject); +begin + FAnsiTabs.Objects[Index] := AObject; +end; + +procedure TTntTabStrings.SetUpdateState(Updating: Boolean); +begin + inherited; + TAccessStrings(FAnsiTabs).SetUpdateState(Updating); +end; + +function TTntTabStrings.Get(Index: Integer): WideString; +const + RTL: array[Boolean] of LongInt = (0, TCIF_RTLREADING); +var + TCItem: TTCItemW; + Buffer: array[0..4095] of WideChar; +begin + if (not Win32PlatformIsUnicode) then + Result := FAnsiTabs[Index] + else begin + TCItem.mask := TCIF_TEXT or RTL[FTabControl.UseRightToLeftReading]; + TCItem.pszText := Buffer; + TCItem.cchTextMax := SizeOf(Buffer); + if SendMessageW(FTabControl.Handle, TCM_GETITEMW, Index, Longint(@TCItem)) = 0 then + TabControlError(WideFormat(sTabFailRetrieve, [Index])); + Result := Buffer; + end; +end; + +function GetTabControlImageIndex(Self: TCustomTabControl{TNT-ALLOW TCustomTabControl}; TabIndex: Integer): Integer; +begin + Result := TabIndex; + with TAccessCustomTabControl(Self) do + if Assigned(OnGetImageIndex) then OnGetImageIndex(Self, TabIndex, Result); +end; + +procedure TTntTabStrings.Put(Index: Integer; const S: WideString); +const + RTL: array[Boolean] of LongInt = (0, TCIF_RTLREADING); +var + TCItem: TTCItemW; +begin + if (not Win32PlatformIsUnicode) then + FAnsiTabs[Index] := S + else begin + TCItem.mask := TCIF_TEXT or RTL[FTabControl.UseRightToLeftReading] or TCIF_IMAGE; + TCItem.pszText := PWideChar(S); + TCItem.iImage := GetTabControlImageIndex(FTabControl, Index); + if SendMessageW(FTabControl.Handle, TCM_SETITEMW, Index, Longint(@TCItem)) = 0 then + TabControlError(WideFormat(sTabFailSet, [S, Index])); + TAccessCustomTabControl(FTabControl).UpdateTabImages; + end; +end; + +procedure TTntTabStrings.Insert(Index: Integer; const S: WideString); +const + RTL: array[Boolean] of LongInt = (0, TCIF_RTLREADING); +var + TCItem: TTCItemW; +begin + if (not Win32PlatformIsUnicode) then + FAnsiTabs.Insert(Index, S) + else begin + TCItem.mask := TCIF_TEXT or RTL[FTabControl.UseRightToLeftReading] or TCIF_IMAGE; + TCItem.pszText := PWideChar(S); + TCItem.iImage := GetTabControlImageIndex(FTabControl, Index); + if SendMessageW(FTabControl.Handle, TCM_INSERTITEMW, Index, Longint(@TCItem)) < 0 then + TabControlError(WideFormat(sTabFailSet, [S, Index])); + TAccessCustomTabControl(FTabControl).UpdateTabImages; + end; +end; + +{ TTntCustomTabControl } + +constructor TTntCustomTabControl.Create(AOwner: TComponent); +begin + inherited; + FTabs := TTntTabStrings.Create; + TTntTabStrings(FTabs).FTabControl := Self; + TTntTabStrings(FTabs).FAnsiTabs := inherited Tabs; +end; + +destructor TTntCustomTabControl.Destroy; +begin + TTntTabStrings(FTabs).FTabControl := nil; + TTntTabStrings(FTabs).FAnsiTabs := nil; + FreeAndNil(FTabs); + FreeAndNil(FSaveTabs); + inherited; +end; + +procedure TTntCustomTabControl.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle_ComCtl(Self, Params, WC_TABCONTROL); +end; + +procedure TTntCustomTabControl.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +procedure TTntCustomTabControl.CreateWnd; +begin + inherited; + if FSaveTabs <> nil then + begin + FTabs.Assign(FSaveTabs); + FreeAndNil(FSaveTabs); + TabIndex := FSaveTabIndex; + end; +end; + +procedure TTntCustomTabControl.DestroyWnd; +begin + if (FTabs <> nil) and (FTabs.Count > 0) then + begin + FSaveTabs := TTntStringList.Create; + FSaveTabs.Assign(FTabs); + FSaveTabIndex := TabIndex; + end; + inherited; +end; + +function TTntCustomTabControl.GetTabs: TTntStrings; +begin + if FSaveTabs <> nil then + Result := FSaveTabs // Use FSaveTabs while the window is deallocated + else + Result := FTabs; +end; + +procedure TTntCustomTabControl.SetTabs(const Value: TTntStrings); +begin + FTabs.Assign(Value); +end; + +function TTntCustomTabControl.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TTntCustomTabControl.GetHint: WideString; +begin + Result := TntControl_GetHint(Self); +end; + +procedure TTntCustomTabControl.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntCustomTabControl.CMDialogChar(var Message: TCMDialogChar); +var + I: Integer; +begin + for I := 0 to Tabs.Count - 1 do + if IsWideCharAccel(Message.CharCode, Tabs[I]) and CanShowTab(I) and CanFocus then + begin + Message.Result := 1; + if CanChange then + begin + TabIndex := I; + Change; + end; + Exit; + end; + Broadcast(Message); +end; + +procedure TTntCustomTabControl.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntCustomTabControl.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +{ TTntTabSheet } + +procedure TTntTabSheet.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle(Self, Params, ''); +end; + +function TTntTabSheet.IsCaptionStored: Boolean; +begin + Result := TntControl_IsCaptionStored(Self); +end; + +function TTntTabSheet.GetCaption: TWideCaption; +begin + Result := TntControl_GetText(Self); +end; + +procedure TTntTabSheet.SetCaption(const Value: TWideCaption); +begin + TntControl_SetText(Self, Value); +end; + +procedure TTntTabSheet.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntTabSheet.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TTntTabSheet.GetHint: WideString; +begin + Result := TntControl_GetHint(Self); +end; + +procedure TTntTabSheet.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntTabSheet.WMSetText(var Message: TWMSetText); +begin + if (not Win32PlatformIsUnicode) + or (HandleAllocated) + or (Message.Text = AnsiString(TntControl_GetText(Self))) + or (Force_Inherited_WMSETTEXT) then + inherited + else begin + // NT, handle not allocated and text is different + Force_Inherited_WMSETTEXT := True; + try + TntControl_SetText(Self, Message.Text) { sync WideCaption with ANSI Caption } + finally + Force_Inherited_WMSETTEXT := FALSE; + end; + end; +end; + +procedure TTntTabSheet.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntTabSheet.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +{ TTntPageControl } + +procedure TTntPageControl.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle_ComCtl(Self, Params, WC_TABCONTROL); +end; + +procedure TTntPageControl.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntPageControl.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TTntPageControl.GetHint: WideString; +begin + Result := TntControl_GetHint(Self); +end; + +procedure TTntPageControl.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntPageControl.WndProc(var Message: TMessage); +const + RTL: array[Boolean] of Cardinal = (0, TCIF_RTLREADING); +var + TCItemA: PTCItemA; + TabSheet: TTabSheet{TNT-ALLOW TTabSheet}; + Text: WideString; +begin + if (not Win32PlatformIsUnicode) then + inherited + else begin + case Message.Msg of + TCM_SETITEMA: + begin + TCItemA := PTCItemA(Message.lParam); + if ((TCItemA.mask and TCIF_PARAM) = TCIF_PARAM) then + TabSheet := TObject(TCItemA.lParam) as TTabSheet{TNT-ALLOW TTabSheet} + else if ((TCItemA.mask and TCIF_TEXT) = TCIF_TEXT) + and (Message.wParam >= 0) and (Message.wParam <= Tabs.Count - 1) then + TabSheet := Tabs.Objects[Message.wParam] as TTabSheet{TNT-ALLOW TTabSheet} + else + TabSheet := nil; + + if TabSheet = nil then begin + // will always be followed by TCM_SETITEMA(TCIF_PARAM) if TCIF_TEXT is present + TCItemA.mask := TCItemA.mask and (not TCIF_TEXT); + end else begin + // convert message to unicode, add text + Message.Msg := TCM_SETITEMW; + TCItemA.mask := TCItemA.mask or TCIF_TEXT or RTL[UseRightToLeftReading]; + if TabSheet is TTntTabSheet then + Text := TTntTabSheet(TabSheet).Caption + else + Text := TabSheet.Caption; + TCItemA.pszText := PAnsiChar(PWideChar(Text)); + end; + end; + TCM_INSERTITEMA: + begin + TCItemA := PTCItemA(Message.lParam); + // will always be followed by TCM_SETITEMA(TCIF_PARAM) if TCIF_TEXT is present + TCItemA.mask := TCItemA.mask and (not TCIF_TEXT); + end; + end; + inherited; + end; +end; + +procedure TTntPageControl.CMDialogChar(var Message: TCMDialogChar); +var + I: Integer; + TabText: WideString; +begin + for I := 0 to PageCount - 1 do begin + if Pages[i] is TTntTabSheet then + TabText := TTntTabSheet(Pages[i]).Caption + else + TabText := Pages[i].Caption; + if IsWideCharAccel(Message.CharCode, TabText) and CanShowTab(Pages[i].TabIndex) and CanFocus then + begin + Message.Result := 1; + if CanChange then + begin + TabIndex := Pages[i].TabIndex; + Change; + end; + Exit; + end; + end; + Broadcast(Message); +end; + +procedure TTntPageControl.CMDockClient(var Message: TCMDockClient); +var + IsVisible: Boolean; + DockCtl: TControl; +begin + Message.Result := 0; + FNewDockSheet := TTntTabSheet.Create(Self); + try + try + DockCtl := Message.DockSource.Control; + if DockCtl is TCustomForm then + FNewDockSheet.Caption := TntControl_GetText(DockCtl); + FNewDockSheet.PageControl := Self; + DockCtl.Dock(Self, Message.DockSource.DockRect); + except + FNewDockSheet.Free; + raise; + end; + IsVisible := DockCtl.Visible; + FNewDockSheet.TabVisible := IsVisible; + if IsVisible then ActivePage := FNewDockSheet; + DockCtl.Align := alClient; + finally + FNewDockSheet := nil; + end; +end; + +procedure TTntPageControl.DoAddDockClient(Client: TControl; const ARect: TRect); +begin + if FNewDockSheet <> nil then + Client.Parent := FNewDockSheet; +end; + +procedure TTntPageControl.CMDockNotification(var Message: TCMDockNotification); +var + I: Integer; + S: WideString; + Page: TTabSheet{TNT-ALLOW TTabSheet}; +begin + Page := GetPageFromDockClient(Message.Client); + if (Message.NotifyRec.ClientMsg <> WM_SETTEXT) + or (Page = nil) or (not (Page is TTntTabSheet)) then + inherited + else begin + if (Message.Client is TWinControl) + and (TWinControl(Message.Client).HandleAllocated) + and IsWindowUnicode(TWinControl(Message.Client).Handle) then + S := PWideChar(Message.NotifyRec.MsgLParam) + else + S := PAnsiChar(Message.NotifyRec.MsgLParam); + { Search for first CR/LF and end string there } + for I := 1 to Length(S) do + if S[I] in [CR, LF] then + begin + SetLength(S, I - 1); + Break; + end; + TTntTabSheet(Page).Caption := S; + end; +end; + +procedure TTntPageControl.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntPageControl.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +{ TTntTrackBar } + +procedure TTntTrackBar.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle_ComCtl(Self, Params, TRACKBAR_CLASS); +end; + +procedure TTntTrackBar.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntTrackBar.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TTntTrackBar.GetHint: WideString; +begin + Result := TntControl_GetHint(Self); +end; + +procedure TTntTrackBar.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntTrackBar.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntTrackBar.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +{ TTntProgressBar } + +procedure TTntProgressBar.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle_ComCtl(Self, Params, PROGRESS_CLASS); +end; + +procedure TTntProgressBar.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntProgressBar.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TTntProgressBar.GetHint: WideString; +begin + Result := TntControl_GetHint(Self); +end; + +procedure TTntProgressBar.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntProgressBar.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntProgressBar.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +{ TTntCustomUpDown } + +procedure TTntCustomUpDown.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle_ComCtl(Self, Params, UPDOWN_CLASS); +end; + +procedure TTntCustomUpDown.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntCustomUpDown.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TTntCustomUpDown.GetHint: WideString; +begin + Result := TntControl_GetHint(Self); +end; + +procedure TTntCustomUpDown.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntCustomUpDown.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntCustomUpDown.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +{ TTntDateTimePicker } + +procedure TTntDateTimePicker.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle_ComCtl(Self, Params, DATETIMEPICK_CLASS); +end; + +procedure TTntDateTimePicker.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntDateTimePicker.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TTntDateTimePicker.GetHint: WideString; +begin + Result := TntControl_GetHint(Self); +end; + +procedure TTntDateTimePicker.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntDateTimePicker.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntDateTimePicker.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +procedure TTntDateTimePicker.CreateWnd; +var + SaveChecked: Boolean; +begin + FHadFirstMouseClick := False; + SaveChecked := Checked; + inherited; + // This fixes an issue where TDateTimePicker.CNNotify causes "FChecked := True" to occur + // during window creation. This issue results in .Checked to read True even though + // it is not visually checked. + Checked := SaveChecked; +end; + +procedure TTntDateTimePicker.WMLButtonDown(var Message: TWMLButtonDown); + + procedure UpdateValues; + var + Hdr: TNMDateTimeChange; + begin + Hdr.nmhdr.hwndFrom := Handle; + Hdr.nmhdr.idFrom := 0; + Hdr.nmhdr.code := DTN_DATETIMECHANGE; + Hdr.dwFlags := DateTime_GetSystemTime(Handle, Hdr.st); + if (Hdr.dwFlags <> Cardinal(GDT_ERROR)) then begin + if Hdr.dwFlags = GDT_NONE then + ZeroMemory(@Hdr.st, SizeOf(Hdr.st)); + Perform(CN_NOTIFY, Integer(Handle), Integer(@Hdr)); + end; + end; + +begin + inherited; + if ShowCheckBox and (not FHadFirstMouseClick) then begin + FHadFirstMouseClick := True; + UpdateValues; // Sometimes the first mouse click doesn't result in WM_NOTIFY. + end; +end; + +{ TTntMonthCalendar } + +procedure TTntMonthCalendar.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle_ComCtl(Self, Params, MONTHCAL_CLASS); + if Win32PlatformIsUnicode then begin + { For some reason WM_NOTIFY:MCN_GETDAYSTATE never gets called. } + ForceGetMonthInfo; + end; +end; + +procedure TTntMonthCalendar.ForceGetMonthInfo; +var + Hdr: TNMDayState; + Days: array of TMonthDayState; + Range: array[1..2] of TSystemTime; +begin + // populate Days array + Hdr.nmhdr.hwndFrom := Handle; + Hdr.nmhdr.idFrom := 0; + Hdr.nmhdr.code := MCN_GETDAYSTATE; + Hdr.cDayState := MonthCal_GetMonthRange(Handle, GMR_DAYSTATE, @Range[1]); + Hdr.stStart := Range[1]; + SetLength(Days, Hdr.cDayState); + Hdr.prgDayState := @Days[0]; + SendMessage(Handle, CN_NOTIFY, Integer(Handle), Integer(@Hdr)); + // update day state + SendMessage(Handle, MCM_SETDAYSTATE, Hdr.cDayState, Longint(Hdr.prgDayState)) +end; + +procedure TTntMonthCalendar.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntMonthCalendar.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TTntMonthCalendar.GetHint: WideString; +begin + Result := TntControl_GetHint(Self); +end; + +procedure TTntMonthCalendar.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +function TTntMonthCalendar.GetDate: TDate; +begin + Result := Trunc(inherited Date); { Fixes issue where Date always reflects time of saving dfm. } +end; + +procedure TTntMonthCalendar.SetDate(const Value: TDate); +begin + inherited Date := Trunc(Value); +end; + +procedure TTntMonthCalendar.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntMonthCalendar.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +{ TTntPageScroller } + +procedure TTntPageScroller.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle_ComCtl(Self, Params, WC_PAGESCROLLER); +end; + +procedure TTntPageScroller.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntPageScroller.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TTntPageScroller.GetHint: WideString; +begin + Result := TntControl_GetHint(Self); +end; + +procedure TTntPageScroller.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntPageScroller.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntPageScroller.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +{ TTntStatusPanel } + +procedure TTntStatusPanel.Assign(Source: TPersistent); +begin + inherited; + if Source is TTntStatusPanel then + Text := TTntStatusPanel(Source).Text; +end; + +procedure TTntStatusPanel.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntStatusPanel.GetText: Widestring; +begin + Result := GetSyncedWideString(FText, inherited Text); +end; + +procedure TTntStatusPanel.SetInheritedText(const Value: AnsiString); +begin + inherited Text := Value; +end; + +procedure TTntStatusPanel.SetText(const Value: Widestring); +begin + SetSyncedWideString(Value, FText, inherited Text, SetInheritedText); +end; + +{ TTntStatusPanels } + +function TTntStatusPanels.GetItem(Index: Integer): TTntStatusPanel; +begin + Result := (inherited GetItem(Index)) as TTntStatusPanel; +end; + +procedure TTntStatusPanels.SetItem(Index: Integer; Value: TTntStatusPanel); +begin + inherited SetItem(Index, Value); +end; + +function TTntStatusPanels.Add: TTntStatusPanel; +begin + Result := (inherited Add) as TTntStatusPanel; +end; + +function TTntStatusPanels.AddItem(Item: TTntStatusPanel; Index: Integer): TTntStatusPanel; +begin + Result := (inherited AddItem(Item, Index)) as TTntStatusPanel; +end; + +function TTntStatusPanels.Insert(Index: Integer): TTntStatusPanel; +begin + Result := (inherited Insert(Index)) as TTntStatusPanel; +end; + +{ TTntCustomStatusBar } + +function TTntCustomStatusBar.GetHint: WideString; +begin + Result := TntControl_GetHint(Self); +end; + +procedure TTntCustomStatusBar.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +function TTntCustomStatusBar.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TTntCustomStatusBar.CreatePanels: TStatusPanels{TNT-ALLOW TStatusPanels}; +begin + Result := TTntStatusPanels.Create(Self); +end; + +function TTntCustomStatusBar.GetPanelClass: TStatusPanelClass; +begin + Result := TTntStatusPanel; +end; + +function TTntCustomStatusBar.SyncLeadingTabs(const WideVal: WideString; const AnsiVal: AnsiString): WideString; + + function CountLeadingTabs(const Val: WideString): Integer; + var + i: integer; + begin + Result := 0; + for i := 1 to Length(Val) do begin + if Val[i] <> #9 then break; + Inc(Result); + end; + end; + +var + AnsiTabCount: Integer; + WideTabCount: Integer; +begin + AnsiTabCount := CountLeadingTabs(AnsiVal); + WideTabCount := CountLeadingTabs(WideVal); + Result := WideVal; + while WideTabCount < AnsiTabCount do begin + Insert(#9, Result, 1); + Inc(WideTabCount); + end; + while WideTabCount > AnsiTabCount do begin + Delete(Result, 1, 1); + Dec(WideTabCount); + end; +end; + +function TTntCustomStatusBar.GetSimpleText: WideString; +begin + FSimpleText := SyncLeadingTabs(FSimpleText, inherited SimpleText); + Result := GetSyncedWideString(FSimpleText, inherited SimpleText); +end; + +procedure TTntCustomStatusBar.SetInheritedSimpleText(const Value: AnsiString); +begin + inherited SimpleText := Value; +end; + +procedure TTntCustomStatusBar.SetSimpleText(const Value: WideString); +begin + SetSyncedWideString(Value, FSimpleText, inherited SimpleText, SetInheritedSimpleText); +end; + +procedure TTntCustomStatusBar.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +procedure TTntCustomStatusBar.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle_ComCtl(Self, Params, STATUSCLASSNAME); +end; + +procedure TTntCustomStatusBar.WndProc(var Msg: TMessage); +const + SB_SIMPLEID = Integer($FF); +var + iPart: Integer; + szText: PAnsiChar; + WideText: WideString; +begin + if Win32PlatformIsUnicode and (Msg.Msg = SB_SETTEXTA) and ((Msg.WParam and SBT_OWNERDRAW) = 0) + then begin + // convert SB_SETTEXTA message to Unicode + iPart := (Msg.WParam and SB_SIMPLEID); + szText := PAnsiChar(Msg.LParam); + if iPart = SB_SIMPLEID then + WideText := SimpleText + else if Panels.Count > 0 then + WideText := Panels[iPart].Text + else begin + WideText := szText; + end; + WideText := SyncLeadingTabs(WideText, szText); + Msg.Result := SendMessageW(Handle, SB_SETTEXTW, Msg.wParam, Integer(PWideChar(WideText))); + end else + inherited; +end; + +procedure TTntCustomStatusBar.WMGetTextLength(var Message: TWMGetTextLength); +begin + Message.Result := Length(SimpleText); +end; + +procedure TTntCustomStatusBar.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntCustomStatusBar.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +function TTntCustomStatusBar.GetPanels: TTntStatusPanels; +begin + Result := inherited Panels as TTntStatusPanels; +end; + +procedure TTntCustomStatusBar.SetPanels(const Value: TTntStatusPanels); +begin + inherited Panels := Value; +end; + +function TTntCustomStatusBar.ExecuteAction(Action: TBasicAction): Boolean; +begin + if AutoHint and (Action is TTntHintAction) and not DoHint then + begin + if SimplePanel or (Panels.Count = 0) then + SimpleText := TTntHintAction(Action).Hint else + Panels[0].Text := TTntHintAction(Action).Hint; + Result := True; + end + else Result := inherited ExecuteAction(Action); +end; + +{ TTntStatusBar } + +function TTntStatusBar.GetOnDrawPanel: TDrawPanelEvent; +begin + Result := TDrawPanelEvent(inherited OnDrawPanel); +end; + +procedure TTntStatusBar.SetOnDrawPanel(const Value: TDrawPanelEvent); +begin + inherited OnDrawPanel := TCustomDrawPanelEvent(Value); +end; + +{ TTntTreeNode } + +function TTntTreeNode.IsEqual(Node: TTntTreeNode): Boolean; +begin + Result := (Text = Node.Text) and (Data = Node.Data); +end; + +procedure TTntTreeNode.ReadData(Stream: TStream; Info: PNodeInfo); +var + I, Size, ItemCount: Integer; + LNode: TTntTreeNode; + Utf8Text: AnsiString; +begin + Owner.ClearCache; + Stream.ReadBuffer(Size, SizeOf(Size)); + Stream.ReadBuffer(Info^, Size); + + if Pos(UTF8_BOM, Info^.Text) = 1 then begin + Utf8Text := Copy(Info^.Text, Length(UTF8_BOM) + 1, MaxInt); + try + Text := UTF8ToWideString(Utf8Text); + except + Text := Utf8Text; + end; + end else + Text := Info^.Text; + + ImageIndex := Info^.ImageIndex; + SelectedIndex := Info^.SelectedIndex; + StateIndex := Info^.StateIndex; + OverlayIndex := Info^.OverlayIndex; + Data := Info^.Data; + ItemCount := Info^.Count; + for I := 0 to ItemCount - 1 do + begin + LNode := Owner.AddChild(Self, ''); + LNode.ReadData(Stream, Info); + Owner.Owner.Added(LNode); + end; +end; + +procedure TTntTreeNode.WriteData(Stream: TStream; Info: PNodeInfo); +var + I, Size, L, ItemCount: Integer; + WideLen: Integer; Utf8Text: AnsiString; +begin + WideLen := 255; + repeat + Utf8Text := UTF8_BOM + WideStringToUTF8(Copy(Text, 1, WideLen)); + L := Length(Utf8Text); + Dec(WideLen); + until + L <= 255; + + Size := SizeOf(TNodeInfo) + L - 255; + Info^.Text := Utf8Text; + Info^.ImageIndex := ImageIndex; + Info^.SelectedIndex := SelectedIndex; + Info^.OverlayIndex := OverlayIndex; + Info^.StateIndex := StateIndex; + Info^.Data := Data; + ItemCount := Count; + Info^.Count := ItemCount; + Stream.WriteBuffer(Size, SizeOf(Size)); + Stream.WriteBuffer(Info^, Size); + for I := 0 to ItemCount - 1 do + Item[I].WriteData(Stream, Info); +end; + +procedure TTntTreeNode.Assign(Source: TPersistent); +var + Node: TTntTreeNode; +begin + inherited; + if (not Deleting) and (Source is TTntTreeNode) then + begin + Node := TTntTreeNode(Source); + Text := Node.Text; + end; +end; + +function TTntTreeNode.GetText: WideString; +begin + Result := GetSyncedWideString(FText, inherited Text); +end; + +procedure TTntTreeNode.SetInheritedText(const Value: AnsiString); +begin + inherited Text := Value; +end; + +procedure TTntTreeNode.SetText(const Value: WideString); +begin + SetSyncedWideString(Value, FText, inherited Text, SetInheritedText); +end; + +function TTntTreeNode.getFirstChild: TTntTreeNode; +begin + Result := inherited getFirstChild as TTntTreeNode; +end; + +function TTntTreeNode.GetItem(Index: Integer): TTntTreeNode; +begin + Result := inherited Item[Index] as TTntTreeNode; +end; + +procedure TTntTreeNode.SetItem(Index: Integer; const Value: TTntTreeNode); +begin + inherited Item[Index] := Value; +end; + +function TTntTreeNode.GetLastChild: TTntTreeNode; +begin + Result := inherited GetLastChild as TTntTreeNode; +end; + +function TTntTreeNode.GetNext: TTntTreeNode; +begin + Result := inherited GetNext as TTntTreeNode; +end; + +function TTntTreeNode.GetNextChild(Value: TTntTreeNode): TTntTreeNode; +begin + Result := inherited GetNextChild(Value) as TTntTreeNode; +end; + +function TTntTreeNode.getNextSibling: TTntTreeNode; +begin + Result := inherited getNextSibling as TTntTreeNode; +end; + +function TTntTreeNode.GetNextVisible: TTntTreeNode; +begin + Result := inherited GetNextVisible as TTntTreeNode; +end; + +function TTntTreeNode.GetNodeOwner: TTntTreeNodes; +begin + Result := inherited Owner as TTntTreeNodes; +end; + +function TTntTreeNode.GetParent: TTntTreeNode; +begin + Result := inherited Parent as TTntTreeNode; +end; + +function TTntTreeNode.GetPrev: TTntTreeNode; +begin + Result := inherited GetPrev as TTntTreeNode; +end; + +function TTntTreeNode.GetPrevChild(Value: TTntTreeNode): TTntTreeNode; +begin + Result := inherited GetPrevChild(Value) as TTntTreeNode; +end; + +function TTntTreeNode.getPrevSibling: TTntTreeNode; +begin + Result := inherited getPrevSibling as TTntTreeNode; +end; + +function TTntTreeNode.GetPrevVisible: TTntTreeNode; +begin + Result := inherited GetPrevVisible as TTntTreeNode; +end; + +function TTntTreeNode.GetTreeView: TTntCustomTreeView; +begin + Result := inherited TreeView as TTntCustomTreeView; +end; + +{ TTntTreeNodesEnumerator } + +constructor TTntTreeNodesEnumerator.Create(ATreeNodes: TTntTreeNodes); +begin + inherited Create; + FIndex := -1; + FTreeNodes := ATreeNodes; +end; + +function TTntTreeNodesEnumerator.GetCurrent: TTntTreeNode; +begin + Result := FTreeNodes[FIndex]; +end; + +function TTntTreeNodesEnumerator.MoveNext: Boolean; +begin + Result := FIndex < FTreeNodes.Count - 1; + if Result then + Inc(FIndex); +end; + +{ TTntTreeNodes } + +{$IFDEF COMPILER_6} // verified against VCL source in Delphi 6 and BCB 6 +type + THackTreeNodes = class(TPersistent) + protected + FxxxOwner: TCustomTreeView{TNT-ALLOW TCustomTreeView}; + FxxxUpdateCount: Integer; + FNodeCache: TNodeCache; + FReading: Boolean; + end; +{$ENDIF} +{$IFDEF DELPHI_7} // verified against VCL source in Delphi 7 +type + THackTreeNodes = class(TPersistent) + protected + FxxxOwner: TCustomTreeView{TNT-ALLOW TCustomTreeView}; + FxxxUpdateCount: Integer; + FNodeCache: TNodeCache; + FReading: Boolean; + end; +{$ENDIF} +{$IFDEF DELPHI_9} // verified against VCL source in Delphi 9 +type + THackTreeNodes = class(TPersistent) + protected + FxxxOwner: TCustomTreeView{TNT-ALLOW TCustomTreeView}; + FxxxUpdateCount: Integer; + FNodeCache: TNodeCache; + FReading: Boolean; + end; +{$ENDIF} +{$IFDEF DELPHI_10} // verified against VCL source in Delphi 10 +type + THackTreeNodes = class(TPersistent) + protected + FxxxOwner: TCustomTreeView{TNT-ALLOW TCustomTreeView}; + FxxxUpdateCount: Integer; + FNodeCache: TNodeCache; + FReading: Boolean; + end; +{$ENDIF} + +procedure SaveNodeTextToStrings(Nodes: TTntTreeNodes; sList: TTntStrings); +var + ANode: TTntTreeNode; +begin + sList.Clear; + if Nodes.Count > 0 then + begin + ANode := Nodes[0]; + while ANode <> nil do + begin + sList.Add(ANode.Text); + ANode := ANode.GetNext; + end; + end; +end; + +procedure TTntTreeNodes.Assign(Source: TPersistent); +var + TreeNodes: TTntTreeNodes; + MemStream: TTntMemoryStream; +begin + ClearCache; + if Source is TTntTreeNodes then + begin + TreeNodes := TTntTreeNodes(Source); + Clear; + MemStream := TTntMemoryStream.Create; + try + TreeNodes.WriteData(MemStream); + MemStream.Position := 0; + ReadData(MemStream); + finally + MemStream.Free; + end; + end else + inherited Assign(Source); +end; + +function TTntTreeNodes.GetNodeFromIndex(Index: Integer): TTntTreeNode; +begin + Result := inherited Item[Index] as TTntTreeNode; +end; + +function TTntTreeNodes.AddChildFirst(Parent: TTntTreeNode; const S: WideString): TTntTreeNode; +begin + Result := AddNode(nil, Parent, S, nil, naAddChildFirst); +end; + +function TTntTreeNodes.AddChildObjectFirst(Parent: TTntTreeNode; const S: WideString; + Ptr: Pointer): TTntTreeNode; +begin + Result := AddNode(nil, Parent, S, Ptr, naAddChildFirst); +end; + +function TTntTreeNodes.AddChild(Parent: TTntTreeNode; const S: WideString): TTntTreeNode; +begin + Result := AddNode(nil, Parent, S, nil, naAddChild); +end; + +function TTntTreeNodes.AddChildObject(Parent: TTntTreeNode; const S: WideString; + Ptr: Pointer): TTntTreeNode; +begin + Result := AddNode(nil, Parent, S, Ptr, naAddChild); +end; + +function TTntTreeNodes.AddFirst(Sibling: TTntTreeNode; const S: WideString): TTntTreeNode; +begin + Result := AddNode(nil, Sibling, S, nil, naAddFirst); +end; + +function TTntTreeNodes.AddObjectFirst(Sibling: TTntTreeNode; const S: WideString; + Ptr: Pointer): TTntTreeNode; +begin + Result := AddNode(nil, Sibling, S, Ptr, naAddFirst); +end; + +function TTntTreeNodes.Add(Sibling: TTntTreeNode; const S: WideString): TTntTreeNode; +begin + Result := AddNode(nil, Sibling, S, nil, naAdd); +end; + +function TTntTreeNodes.AddObject(Sibling: TTntTreeNode; const S: WideString; + Ptr: Pointer): TTntTreeNode; +begin + Result := AddNode(nil, Sibling, S, Ptr, naAdd); +end; + +function TTntTreeNodes.Insert(Sibling: TTntTreeNode; const S: WideString): TTntTreeNode; +begin + Result := AddNode(nil, Sibling, S, nil, naInsert); +end; + +function TTntTreeNodes.InsertObject(Sibling: TTntTreeNode; const S: WideString; + Ptr: Pointer): TTntTreeNode; +begin + Result := AddNode(nil, Sibling, S, Ptr, naInsert); +end; + +function TTntTreeNodes.InsertNode(Node, Sibling: TTntTreeNode; const S: WideString; + Ptr: Pointer): TTntTreeNode; +begin + Result := AddNode(Node, Sibling, S, Ptr, naInsert); +end; + +function TTntTreeNodes.AddNode(Node, Relative: TTntTreeNode; const S: WideString; + Ptr: Pointer; Method: TNodeAttachMode): TTntTreeNode; +begin + Result := inherited AddNode(Node, Relative, '', Ptr, Method) as TTntTreeNode; + Result.Text := S; +end; + +function TTntTreeNodes.GetNode(ItemId: HTreeItem): TTntTreeNode; +begin + Result := inherited GetNode(ItemID) as TTntTreeNode; +end; + +function TTntTreeNodes.GetFirstNode: TTntTreeNode; +begin + Result := inherited GetFirstNode as TTntTreeNode; +end; + +function TTntTreeNodes.GetEnumerator: TTntTreeNodesEnumerator; +begin + Result := TTntTreeNodesEnumerator.Create(Self); +end; + +function TTntTreeNodes.GetNodesOwner: TTntCustomTreeView; +begin + Result := inherited Owner as TTntCustomTreeView; +end; + +procedure TTntTreeNodes.ClearCache; +begin + THackTreeNodes(Self).FNodeCache.CacheNode := nil; +end; + +procedure TTntTreeNodes.DefineProperties(Filer: TFiler); + + function WriteNodes: Boolean; + var + I: Integer; + Nodes: TTntTreeNodes; + begin + Nodes := TTntTreeNodes(Filer.Ancestor); + if Nodes = nil then + Result := Count > 0 + else if Nodes.Count <> Count then + Result := True + else + begin + Result := False; + for I := 0 to Count - 1 do + begin + Result := not Item[I].IsEqual(Nodes[I]); + if Result then + Break; + end + end; + end; + +begin + inherited DefineProperties(Filer); + Filer.DefineBinaryProperty('Utf8Data', ReadData, WriteData, WriteNodes); +end; + +procedure TTntTreeNodes.ReadData(Stream: TStream); +var + I, Count: Integer; + NodeInfo: TNodeInfo; + LNode: TTntTreeNode; + LHandleAllocated: Boolean; +begin + LHandleAllocated := Owner.HandleAllocated; + if LHandleAllocated then + BeginUpdate; + THackTreeNodes(Self).FReading := True; + try + Clear; + Stream.ReadBuffer(Count, SizeOf(Count)); + for I := 0 to Count - 1 do + begin + LNode := Add(nil, ''); + LNode.ReadData(Stream, @NodeInfo); + Owner.Added(LNode); + end; + finally + THackTreeNodes(Self).FReading := False; + if LHandleAllocated then + EndUpdate; + end; +end; + +procedure TTntTreeNodes.WriteData(Stream: TStream); +var + I: Integer; + Node: TTntTreeNode; + NodeInfo: TNodeInfo; +begin + I := 0; + Node := GetFirstNode; + while Node <> nil do + begin + Inc(I); + Node := Node.GetNextSibling; + end; + Stream.WriteBuffer(I, SizeOf(I)); + Node := GetFirstNode; + while Node <> nil do + begin + Node.WriteData(Stream, @NodeInfo); + Node := Node.GetNextSibling; + end; +end; + +{ TTntTreeStrings } + +type + TTntTreeStrings = class(TTntStringList) + protected + function GetBufStart(Buffer: PWideChar; var Level: Integer): PWideChar; + public + procedure SaveToTree(Tree: TTntCustomTreeView); + procedure LoadFromTree(Tree: TTntCustomTreeView); + end; + +function TTntTreeStrings.GetBufStart(Buffer: PWideChar; var Level: Integer): PWideChar; +begin + Level := 0; + while Buffer^ in [WideChar(' '), WideChar(#9)] do + begin + Inc(Buffer); + Inc(Level); + end; + Result := Buffer; +end; + +procedure TTntTreeStrings.SaveToTree(Tree: TTntCustomTreeView); +var + ANode, NextNode: TTntTreeNode; + ALevel, i: Integer; + CurrStr: WideString; + Owner: TTntTreeNodes; +begin + Owner := Tree.Items; + Owner.BeginUpdate; + try + try + Owner.Clear; + ANode := nil; + for i := 0 to Count - 1 do + begin + CurrStr := GetBufStart(PWideChar(Strings[i]), ALevel); + if ANode = nil then + ANode := Owner.AddChild(nil, CurrStr) + else if ANode.Level = ALevel then + ANode := Owner.AddChild(ANode.Parent, CurrStr) + else if ANode.Level = (ALevel - 1) then + ANode := Owner.AddChild(ANode, CurrStr) + else if ANode.Level > ALevel then + begin + NextNode := ANode.Parent; + while NextNode.Level > ALevel do + NextNode := NextNode.Parent; + ANode := Owner.AddChild(NextNode.Parent, CurrStr); + end + else + raise ETreeViewError.CreateFmt(sInvalidLevelEx, [ALevel, CurrStr]); + end; + finally + Owner.EndUpdate; + end; + except + Owner.Owner.Invalidate; // force repaint on exception + raise; + end; +end; + +procedure TTntTreeStrings.LoadFromTree(Tree: TTntCustomTreeView); +const + TabChar = #9; +var + i: Integer; + ANode: TTntTreeNode; + NodeStr: WideString; + Owner: TTntTreeNodes; +begin + Clear; + Owner := Tree.Items; + if Owner.Count > 0 then + begin + ANode := Owner[0]; + while ANode <> nil do + begin + NodeStr := ''; + for i := 0 to ANode.Level - 1 do NodeStr := NodeStr + TabChar; + NodeStr := NodeStr + ANode.Text; + Add(NodeStr); + ANode := ANode.GetNext; + end; + end; +end; + +{ _TntInternalCustomTreeView } + +function _TntInternalCustomTreeView.FindNextToSelect: TTreeNode{TNT-ALLOW TTreeNode}; +begin + Result := Wide_FindNextToSelect; +end; + +function _TntInternalCustomTreeView.Inherited_FindNextToSelect: TTreeNode{TNT-ALLOW TTreeNode}; +begin + Result := inherited FindNextToSelect; +end; + +{ TTntCustomTreeView } + +function TntDefaultTreeViewSort(Node1, Node2: TTntTreeNode; lParam: Integer): Integer; stdcall; +begin + with Node1 do + if Assigned(TreeView.OnCompare) then + TreeView.OnCompare(TreeView, Node1, Node2, lParam, Result) + else Result := lstrcmpw(PWideChar(Node1.Text), PWideChar(Node2.Text)); +end; + +constructor TTntCustomTreeView.Create(AOwner: TComponent); +begin + inherited; + FEditInstance := Classes.MakeObjectInstance(EditWndProcW); +end; + +destructor TTntCustomTreeView.Destroy; +begin + Destroying; + Classes.FreeObjectInstance(FEditInstance); + FreeAndNil(FSavedNodeText); + inherited; +end; + +var + ComCtrls_DefaultTreeViewSort: TTVCompare = nil; + +procedure TTntCustomTreeView.CreateWindowHandle(const Params: TCreateParams); + + procedure Capture_ComCtrls_DefaultTreeViewSort; + begin + FTestingForSortProc := True; + try + AlphaSort; + finally + FTestingForSortProc := False; + end; + end; + +begin + CreateUnicodeHandle_ComCtl(Self, Params, WC_TREEVIEW); + if (Win32PlatformIsUnicode) then begin + if not Assigned(ComCtrls_DefaultTreeViewSort) then + Capture_ComCtrls_DefaultTreeViewSort; + end; +end; + +procedure TTntCustomTreeView.CreateWnd; +begin + inherited; + if FSavedNodeText <> nil then begin + FreeAndNil(FSavedNodeText); + SortType := FSavedSortType; + end; +end; + +procedure TTntCustomTreeView.DestroyWnd; +begin + if (not (csDestroying in ComponentState)) then begin + FSavedNodeText := TTntStringList.Create; + FSavedSortType := SortType; + SortType := stNone; // when recreating window, we are expecting items to come back in same order + SaveNodeTextToStrings(Items, FSavedNodeText); + end; + inherited; +end; + +procedure TTntCustomTreeView.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntCustomTreeView.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TTntCustomTreeView.GetHint: WideString; +begin + Result := TntControl_GetHint(Self) +end; + +procedure TTntCustomTreeView.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntCustomTreeView.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntCustomTreeView.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +function TTntCustomTreeView.CreateNode: TTreeNode{TNT-ALLOW TTreeNode}; +var + LClass: TClass; + TntLClass: TTntTreeNodeClass; +begin + LClass := TTntTreeNode; + if Assigned(OnCreateNodeClass) then + OnCreateNodeClass(Self, TTreeNodeClass(LClass)); + if not LClass.InheritsFrom(TTntTreeNode) then + raise ETntInternalError.Create('Internal Error: OnCreateNodeClass.ItemClass must inherit from TTntTreeNode.'); + TntLClass := TTntTreeNodeClass(LClass); + Result := TntLClass.Create(inherited Items); +end; + +function TTntCustomTreeView.CreateNodes: TTreeNodes{TNT-ALLOW TTreeNodes}; +begin + Result := TTntTreeNodes.Create(Self); +end; + +function TTntCustomTreeView.GetTreeNodes: TTntTreeNodes; +begin + Result := inherited Items as TTntTreeNodes; +end; + +procedure TTntCustomTreeView.SetTreeNodes(const Value: TTntTreeNodes); +begin + Items.Assign(Value); +end; + +function TTntCustomTreeView.GetNodeFromItem(const Item: TTVItem): TTntTreeNode; +begin + Result := nil; + if Items <> nil then + with Item do + if (state and TVIF_PARAM) <> 0 then + Result := Pointer(lParam) + else + Result := Items.GetNode(hItem); +end; + +function TTntCustomTreeView.Wide_FindNextToSelect: TTntTreeNode; +begin + Result := FindNextToSelect; +end; + +function TTntCustomTreeView.FindNextToSelect: TTntTreeNode; +begin + Result := Inherited_FindNextToSelect as TTntTreeNode; +end; + +function TTntCustomTreeView.GetDropTarget: TTntTreeNode; +begin + Result := inherited DropTarget as TTntTreeNode; +end; + +function TTntCustomTreeView.GetNodeAt(X, Y: Integer): TTntTreeNode; +begin + Result := inherited GetNodeAt(X, Y) as TTntTreeNode; +end; + +function TTntCustomTreeView.GetSelected: TTntTreeNode; +begin + Result := inherited Selected as TTntTreeNode; +end; + +function TTntCustomTreeView.GetSelection(Index: Integer): TTntTreeNode; +begin + Result := inherited Selections[Index] as TTntTreeNode; +end; + +function TTntCustomTreeView.GetSelections(AList: TList): TTntTreeNode; +begin + Result := inherited GetSelections(AList) as TTntTreeNode; +end; + +function TTntCustomTreeView.GetTopItem: TTntTreeNode; +begin + Result := inherited TopItem as TTntTreeNode; +end; + +procedure TTntCustomTreeView.SetDropTarget(const Value: TTntTreeNode); +begin + inherited DropTarget := Value; +end; + +procedure TTntCustomTreeView.SetSelected(const Value: TTntTreeNode); +begin + inherited Selected := Value; +end; + +procedure TTntCustomTreeView.SetTopItem(const Value: TTntTreeNode); +begin + inherited TopItem := Value; +end; + +procedure TTntCustomTreeView.WndProc(var Message: TMessage); +type + PTVSortCB = ^TTVSortCB; +begin + with Message do begin + // capture ANSI version of DefaultTreeViewSort from ComCtrls + if (FTestingForSortProc) + and (Msg = TVM_SORTCHILDRENCB) then begin + ComCtrls_DefaultTreeViewSort := PTVSortCB(lParam).lpfnCompare; + exit; + end; + + if (Win32PlatformIsUnicode) + and (Msg = TVM_SORTCHILDRENCB) + and (@PTVSortCB(lParam).lpfnCompare = @ComCtrls_DefaultTreeViewSort) then + begin + // Unicode:: call wide version of sort proc instead + PTVSortCB(lParam)^.lpfnCompare := TTVCompare(@TntDefaultTreeViewSort); + Result := SendMessageW(Handle, TVM_SORTCHILDRENCB, wParam, lParam); + end else + inherited; + end; +end; + +procedure TTntCustomTreeView.CNNotify(var Message: TWMNotify); +var + Node: TTntTreeNode; +begin + if (not Win32PlatformIsUnicode) then + inherited + else begin + with Message do begin + case NMHdr^.code of + TVN_BEGINDRAGW: + begin + NMHdr^.code := TVN_BEGINDRAGA; + try + inherited; + finally + NMHdr^.code := TVN_BEGINDRAGW; + end; + end; + TVN_BEGINLABELEDITW: + begin + with PTVDispInfo(NMHdr)^ do + if Dragging or not CanEdit(GetNodeFromItem(item)) then + Result := 1; + if Result = 0 then + begin + FEditHandle := TreeView_GetEditControl(Handle); + FDefEditProc := Pointer(GetWindowLongW(FEditHandle, GWL_WNDPROC)); + SetWindowLongW(FEditHandle, GWL_WNDPROC, LongInt(FEditInstance)); + end; + end; + TVN_ENDLABELEDITW: + Edit(PTVDispInfo(NMHdr)^.item); + TVN_ITEMEXPANDINGW: + begin + NMHdr^.code := TVN_ITEMEXPANDINGA; + try + inherited; + finally + NMHdr^.code := TVN_ITEMEXPANDINGW; + end; + end; + TVN_ITEMEXPANDEDW: + begin + NMHdr^.code := TVN_ITEMEXPANDEDA; + try + inherited; + finally + NMHdr^.code := TVN_ITEMEXPANDEDW; + end; + end; + TVN_DELETEITEMW: + begin + NMHdr^.code := TVN_DELETEITEMA; + try + inherited; + finally + NMHdr^.code := TVN_DELETEITEMW; + end; + end; + TVN_SETDISPINFOW: + with PTVDispInfo(NMHdr)^ do + begin + Node := GetNodeFromItem(item); + if (Node <> nil) and ((item.mask and TVIF_TEXT) <> 0) then + Node.Text := TTVItemW(item).pszText; + end; + TVN_GETDISPINFOW: + with PTVDispInfo(NMHdr)^ do + begin + Node := GetNodeFromItem(item); + if Node <> nil then + begin + if (item.mask and TVIF_TEXT) <> 0 then begin + if (FSavedNodeText <> nil) + and (FSavedNodeText.Count > 0) + and (AnsiString(FSavedNodeText[0]) = AnsiString(Node.Text)) then + begin + Node.FText := FSavedNodeText[0]; // recover saved text + FSavedNodeText.Delete(0); + end; + WStrLCopy(TTVItemW(item).pszText, PWideChar(Node.Text), item.cchTextMax - 1); + end; + + if (item.mask and TVIF_IMAGE) <> 0 then + begin + GetImageIndex(Node); + item.iImage := Node.ImageIndex; + end; + if (item.mask and TVIF_SELECTEDIMAGE) <> 0 then + begin + GetSelectedIndex(Node); + item.iSelectedImage := Node.SelectedIndex; + end; + end; + end; + else + inherited; + end; + end; + end; +end; + +procedure TTntCustomTreeView.WMNotify(var Message: TWMNotify); +var + Node: TTntTreeNode; + FWideText: WideString; + MaxTextLen: Integer; + Pt: TPoint; +begin + with Message do + if NMHdr^.code = TTN_NEEDTEXTW then + begin + // Work around NT COMCTL32 problem with tool tips >= 80 characters + GetCursorPos(Pt); + Pt := ScreenToClient(Pt); + Node := GetNodeAt(Pt.X, Pt.Y); + if (Node = nil) or (Node.Text = '') or + (PToolTipTextW(NMHdr)^.uFlags and TTF_IDISHWND = 0) then Exit; + if (GetComCtlVersion >= ComCtlVersionIE4) + or {Borland's VCL wrongly uses "and"} (Length(Node.Text) < 80) then + begin + DefaultHandler(Message); + Exit; + end; + FWideText := Node.Text; + MaxTextLen := SizeOf(PToolTipTextW(NMHdr)^.szText) div SizeOf(WideChar); + if Length(FWideText) >= MaxTextLen then + SetLength(FWideText, MaxTextLen - 1); + PToolTipTextW(NMHdr)^.lpszText := PWideChar(FWideText); + FillChar(PToolTipTextW(NMHdr)^.szText, MaxTextLen, 0); + Move(Pointer(FWideText)^, PToolTipTextW(NMHdr)^.szText, Length(FWideText) * SizeOf(WideChar)); + PToolTipTextW(NMHdr)^.hInst := 0; + SetWindowPos(NMHdr^.hwndFrom, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE or + SWP_NOSIZE or SWP_NOMOVE or SWP_NOOWNERZORDER); + Result := 1; + end + else inherited; +end; + +procedure TTntCustomTreeView.Edit(const Item: TTVItem); +var + S: WideString; + AnsiS: AnsiString; + Node: TTntTreeNode; + AnsiEvent: TTVEditedEvent; +begin + with Item do + begin + Node := GetNodeFromItem(Item); + if pszText <> nil then + begin + if Win32PlatformIsUnicode then + S := TTVItemW(Item).pszText + else + S := pszText; + + if Assigned(FOnEdited) then + FOnEdited(Self, Node, S) + else if Assigned(inherited OnEdited) then + begin + AnsiEvent := inherited OnEdited; + AnsiS := S; + AnsiEvent(Self, Node, AnsiS); + S := AnsiS; + end; + + if Node <> nil then Node.Text := S; + end + else if Assigned(OnCancelEdit) then + OnCancelEdit(Self, Node); + end; +end; + +procedure TTntCustomTreeView.EditWndProcW(var Message: TMessage); +begin + Assert(Win32PlatformIsUnicode); + try + with Message do + begin + case Msg of + WM_KEYDOWN, + WM_SYSKEYDOWN: if DoKeyDown(TWMKey(Message)) then Exit; + WM_CHAR: + begin + MakeWMCharMsgSafeForAnsi(Message); + try + if DoKeyPress(TWMKey(Message)) then Exit; + finally + RestoreWMCharMsg(Message); + end; + end; + WM_KEYUP, + WM_SYSKEYUP: if DoKeyUp(TWMKey(Message)) then Exit; + CN_KEYDOWN, + CN_CHAR, CN_SYSKEYDOWN, + CN_SYSCHAR: + begin + WndProc(Message); + Exit; + end; + end; + Result := CallWindowProcW(FDefEditProc, FEditHandle, Msg, WParam, LParam); + end; + except + Application.HandleException(Self); + end; +end; + +procedure TTntCustomTreeView.LoadFromFile(const FileName: WideString); +var + TreeStrings: TTntTreeStrings; +begin + TreeStrings := TTntTreeStrings.Create; + try + TreeStrings.LoadFromFile(FileName); + TreeStrings.SaveToTree(Self); + finally + TreeStrings.Free; + end; +end; + +procedure TTntCustomTreeView.LoadFromStream(Stream: TStream); +var + TreeStrings: TTntTreeStrings; +begin + TreeStrings := TTntTreeStrings.Create; + try + TreeStrings.LoadFromStream(Stream); + TreeStrings.SaveToTree(Self); + finally + TreeStrings.Free; + end; +end; + +procedure TTntCustomTreeView.SaveToFile(const FileName: WideString); +var + TreeStrings: TTntTreeStrings; +begin + TreeStrings := TTntTreeStrings.Create; + try + TreeStrings.LoadFromTree(Self); + TreeStrings.SaveToFile(FileName); + finally + TreeStrings.Free; + end; +end; + +procedure TTntCustomTreeView.SaveToStream(Stream: TStream); +var + TreeStrings: TTntTreeStrings; +begin + TreeStrings := TTntTreeStrings.Create; + try + TreeStrings.LoadFromTree(Self); + TreeStrings.SaveToStream(Stream); + finally + TreeStrings.Free; + end; +end; + +initialization + +finalization + if Assigned(AIMM) then + AIMM.Deactivate; + if FRichEdit20Module <> 0 then + FreeLibrary(FRichEdit20Module); + +end. diff --git a/internal/1/Source/TntCompilers.inc b/internal/1/Source/TntCompilers.inc new file mode 100644 index 0000000..5ab1390 --- /dev/null +++ b/internal/1/Source/TntCompilers.inc @@ -0,0 +1,356 @@ +//---------------------------------------------------------------------------------------------------------------------- +// Include file to determine which compiler is currently being used to build the project/component. +// This file uses ideas from Brad Stowers DFS.inc file (www.delphifreestuff.com). +// +// Portions created by Mike Lischke are Copyright +// (C) 1999-2002 Dipl. Ing. Mike Lischke. All Rights Reserved. +//---------------------------------------------------------------------------------------------------------------------- +// The following symbols are defined: +// +// COMPILER_1 : Kylix/Delphi/BCB 1.x is the compiler. +// COMPILER_1_UP : Kylix/Delphi/BCB 1.x or higher is the compiler. +// COMPILER_2 : Kylix/Delphi 2.x or BCB 1.x is the compiler. +// COMPILER_2_UP : Kylix/Delphi 2.x or higher, or BCB 1.x or higher is the compiler. +// COMPILER_3 : Kylix/Delphi/BCB 3.x is the compiler. +// COMPILER_3_UP : Kylix/Delphi/BCB 3.x or higher is the compiler. +// COMPILER_4 : Kylix/Delphi/BCB 4.x is the compiler. +// COMPILER_4_UP : Kylix/Delphi/BCB 4.x or higher is the compiler. +// COMPILER_5 : Kylix/Delphi/BCB 5.x is the compiler. +// COMPILER_5_UP : Kylix/Delphi/BCB 5.x or higher is the compiler. +// COMPILER_6 : Kylix/Delphi/BCB 6.x is the compiler. +// COMPILER_6_UP : Kylix/Delphi/BCB 6.x or higher is the compiler. +// COMPILER_7 : Kylix/Delphi/BCB 7.x is the compiler. +// COMPILER_7_UP : Kylix/Delphi/BCB 7.x or higher is the compiler. +// +// Only defined if Windows is the target: +// CPPB : Any version of BCB is being used. +// CPPB_1 : BCB v1.x is being used. +// CPPB_3 : BCB v3.x is being used. +// CPPB_3_UP : BCB v3.x or higher is being used. +// CPPB_4 : BCB v4.x is being used. +// CPPB_4_UP : BCB v4.x or higher is being used. +// CPPB_5 : BCB v5.x is being used. +// CPPB_5_UP : BCB v5.x or higher is being used. +// CPPB_6 : BCB v6.x is being used. +// CPPB_6_UP : BCB v6.x or higher is being used. +// +// Only defined if Windows is the target: +// DELPHI : Any version of Delphi is being used. +// DELPHI_1 : Delphi v1.x is being used. +// DELPHI_2 : Delphi v2.x is being used. +// DELPHI_2_UP : Delphi v2.x or higher is being used. +// DELPHI_3 : Delphi v3.x is being used. +// DELPHI_3_UP : Delphi v3.x or higher is being used. +// DELPHI_4 : Delphi v4.x is being used. +// DELPHI_4_UP : Delphi v4.x or higher is being used. +// DELPHI_5 : Delphi v5.x is being used. +// DELPHI_5_UP : Delphi v5.x or higher is being used. +// DELPHI_6 : Delphi v6.x is being used. +// DELPHI_6_UP : Delphi v6.x or higher is being used. +// DELPHI_7 : Delphi v7.x is being used. +// DELPHI_7_UP : Delphi v7.x or higher is being used. +// +// Only defined if Linux is the target: +// KYLIX : Any version of Kylix is being used. +// KYLIX_1 : Kylix 1.x is being used. +// KYLIX_1_UP : Kylix 1.x or higher is being used. +// KYLIX_2 : Kylix 2.x is being used. +// KYLIX_2_UP : Kylix 2.x or higher is being used. +// KYLIX_3 : Kylix 3.x is being used. +// KYLIX_3_UP : Kylix 3.x or higher is being used. +// +// Only defined if Linux is the target: +// QT_CLX : Trolltech's QT library is being used. +//---------------------------------------------------------------------------------------------------------------------- + +{$ifdef Win32} + + {$ifdef VER180} + {$define COMPILER_10} + {$define DELPHI} + {$define DELPHI_10} + {$endif} + + {$ifdef VER170} + {$define COMPILER_9} + {$define DELPHI} + {$define DELPHI_9} + {$endif} + + {$ifdef VER150} + {$define COMPILER_7} + {$define DELPHI} + {$define DELPHI_7} + {$endif} + + {$ifdef VER140} + {$define COMPILER_6} + {$ifdef BCB} + {$define CPPB} + {$define CPPB_6} + {$else} + {$define DELPHI} + {$define DELPHI_6} + {$endif} + {$endif} + + {$ifdef VER130} + {$define COMPILER_5} + {$ifdef BCB} + {$define CPPB} + {$define CPPB_5} + {$else} + {$define DELPHI} + {$define DELPHI_5} + {$endif} + {$endif} + + {$ifdef VER125} + {$define COMPILER_4} + {$define CPPB} + {$define CPPB_4} + {$endif} + + {$ifdef VER120} + {$define COMPILER_4} + {$define DELPHI} + {$define DELPHI_4} + {$endif} + + {$ifdef VER110} + {$define COMPILER_3} + {$define CPPB} + {$define CPPB_3} + {$endif} + + {$ifdef VER100} + {$define COMPILER_3} + {$define DELPHI} + {$define DELPHI_3} + {$endif} + + {$ifdef VER93} + {$define COMPILER_2} // C++ Builder v1 compiler is really v2 + {$define CPPB} + {$define CPPB_1} + {$endif} + + {$ifdef VER90} + {$define COMPILER_2} + {$define DELPHI} + {$define DELPHI_2} + {$endif} + + {$ifdef VER80} + {$define COMPILER_1} + {$define DELPHI} + {$define DELPHI_1} + {$endif} + + {$ifdef DELPHI_2} + {$define DELPHI_2_UP} + {$endif} + + {$ifdef DELPHI_3} + {$define DELPHI_2_UP} + {$define DELPHI_3_UP} + {$endif} + + {$ifdef DELPHI_4} + {$define DELPHI_2_UP} + {$define DELPHI_3_UP} + {$define DELPHI_4_UP} + {$endif} + + {$ifdef DELPHI_5} + {$define DELPHI_2_UP} + {$define DELPHI_3_UP} + {$define DELPHI_4_UP} + {$define DELPHI_5_UP} + {$endif} + + {$ifdef DELPHI_6} + {$define DELPHI_2_UP} + {$define DELPHI_3_UP} + {$define DELPHI_4_UP} + {$define DELPHI_5_UP} + {$define DELPHI_6_UP} + {$endif} + + {$ifdef DELPHI_7} + {$define DELPHI_2_UP} + {$define DELPHI_3_UP} + {$define DELPHI_4_UP} + {$define DELPHI_5_UP} + {$define DELPHI_6_UP} + {$define DELPHI_7_UP} + {$endif} + + {$ifdef DELPHI_9} + {$define DELPHI_2_UP} + {$define DELPHI_3_UP} + {$define DELPHI_4_UP} + {$define DELPHI_5_UP} + {$define DELPHI_6_UP} + {$define DELPHI_7_UP} + {$define DELPHI_9_UP} + {$endif} + + {$ifdef DELPHI_10} + {$define DELPHI_2_UP} + {$define DELPHI_3_UP} + {$define DELPHI_4_UP} + {$define DELPHI_5_UP} + {$define DELPHI_6_UP} + {$define DELPHI_7_UP} + {$define DELPHI_9_UP} + {$define DELPHI_10_UP} + {$endif} + + {$ifdef CPPB_3} + {$define CPPB_3_UP} + {$endif} + + {$ifdef CPPB_4} + {$define CPPB_3_UP} + {$define CPPB_4_UP} + {$endif} + + {$ifdef CPPB_5} + {$define CPPB_3_UP} + {$define CPPB_4_UP} + {$define CPPB_5_UP} + {$endif} + + {$ifdef CPPB_6} + {$define CPPB_3_UP} + {$define CPPB_4_UP} + {$define CPPB_5_UP} + {$define CPPB_6_UP} + {$endif} + + {$ifdef CPPB_3_UP} + // C++ Builder requires this if you use Delphi components in run-time packages. + {$ObjExportAll On} + {$endif} + +{$else (not Windows)} + // Linux is the target + {$define QT_CLX} + + {$define KYLIX} + {$define KYLIX_1} + {$define KYLIX_1_UP} + + {$ifdef VER150} + {$define COMPILER_7} + {$define KYLIX_3} + {$endif} + + {$ifdef VER140} + {$define COMPILER_6} + {$define KYLIX_2} + {$endif} + + {$ifdef KYLIX_2} + {$define KYLIX_2_UP} + {$endif} + + {$ifdef KYLIX_3} + {$define KYLIX_2_UP} + {$define KYLIX_3_UP} + {$endif} + +{$endif} + +// Compiler defines common to all platforms. +{$ifdef COMPILER_1} + {$define COMPILER_1_UP} +{$endif} + +{$ifdef COMPILER_2} + {$define COMPILER_1_UP} + {$define COMPILER_2_UP} +{$endif} + +{$ifdef COMPILER_3} + {$define COMPILER_1_UP} + {$define COMPILER_2_UP} + {$define COMPILER_3_UP} +{$endif} + +{$ifdef COMPILER_4} + {$define COMPILER_1_UP} + {$define COMPILER_2_UP} + {$define COMPILER_3_UP} + {$define COMPILER_4_UP} +{$endif} + +{$ifdef COMPILER_5} + {$define COMPILER_1_UP} + {$define COMPILER_2_UP} + {$define COMPILER_3_UP} + {$define COMPILER_4_UP} + {$define COMPILER_5_UP} +{$endif} + +{$ifdef COMPILER_6} + {$define COMPILER_1_UP} + {$define COMPILER_2_UP} + {$define COMPILER_3_UP} + {$define COMPILER_4_UP} + {$define COMPILER_5_UP} + {$define COMPILER_6_UP} +{$endif} + +{$ifdef COMPILER_7} + {$define COMPILER_1_UP} + {$define COMPILER_2_UP} + {$define COMPILER_3_UP} + {$define COMPILER_4_UP} + {$define COMPILER_5_UP} + {$define COMPILER_6_UP} + {$define COMPILER_7_UP} +{$endif} + +{$ifdef COMPILER_9} + {$define COMPILER_1_UP} + {$define COMPILER_2_UP} + {$define COMPILER_3_UP} + {$define COMPILER_4_UP} + {$define COMPILER_5_UP} + {$define COMPILER_6_UP} + {$define COMPILER_7_UP} + {$define COMPILER_9_UP} +{$endif} + +{$ifdef COMPILER_10} + {$define COMPILER_1_UP} + {$define COMPILER_2_UP} + {$define COMPILER_3_UP} + {$define COMPILER_4_UP} + {$define COMPILER_5_UP} + {$define COMPILER_6_UP} + {$define COMPILER_7_UP} + {$define COMPILER_9_UP} + {$define COMPILER_10_UP} +{$endif} + +//---------------------------------------------------------------------------------------------------------------------- + +{$ALIGN ON} +{$BOOLEVAL OFF} + +{$ifdef COMPILER_7_UP} + {$define THEME_7_UP} { Allows experimental theme support on pre-Delphi 7. } +{$endif} + +{$IFDEF COMPILER_6_UP} +{$WARN SYMBOL_PLATFORM OFF} { We are going to use Win32 specific symbols! } +{$ENDIF} + +{$IFDEF COMPILER_7_UP} +{$WARN UNSAFE_CODE OFF} { We are not going to be "safe"! } +{$WARN UNSAFE_TYPE OFF} +{$WARN UNSAFE_CAST OFF} +{$ENDIF} \ No newline at end of file diff --git a/internal/1/Source/TntControls.pas b/internal/1/Source/TntControls.pas new file mode 100644 index 0000000..55025ec --- /dev/null +++ b/internal/1/Source/TntControls.pas @@ -0,0 +1,1099 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntControls; + +{$INCLUDE TntCompilers.inc} + +{ + Windows NT provides support for native Unicode windows. To add Unicode support to a + TWinControl descendant, override CreateWindowHandle() and call CreateUnicodeHandle(). + + One major reason this works is because the VCL only uses the ANSI version of + SendMessage() -- SendMessageA(). If you call SendMessageA() on a UNICODE + window, Windows deals with the ANSI/UNICODE conversion automatically. So + for example, if the VCL sends WM_SETTEXT to a window using SendMessageA, + Windows actually *expects* a PAnsiChar even if the target window is a UNICODE + window. So caling SendMessageA with PChars causes no problems. + + A problem in the VCL has to do with the TControl.Perform() method. Perform() + calls the window procedure directly and assumes an ANSI window. This is a + problem if, for example, the VCL calls Perform(WM_SETTEXT, ...) passing in a + PAnsiChar which eventually gets passed downto DefWindowProcW() which expects a PWideChar. + + This is the reason for SubClassUnicodeControl(). This procedure will subclass the + Windows WndProc, and the TWinControl.WindowProc pointer. It will determine if the + message came from Windows or if the WindowProc was called directly. It will then + call SendMessageA() for Windows to perform proper conversion on certain text messages. + + Another problem has to do with TWinControl.DoKeyPress(). It is called from the WM_CHAR + message. It casts the WideChar to an AnsiChar, and sends the resulting character to + DefWindowProc. In order to avoid this, the DefWindowProc is subclassed as well. WindowProc + will make a WM_CHAR message safe for ANSI handling code by converting the char code to + #FF before passing it on. It stores the original WideChar in the .Unused field of TWMChar. + The code #FF is converted back to the WideChar before passing onto DefWindowProc. +} + +{ + Things to consider when designing new controls: + 1) Check that a WideString Hint property is published. + 2) If descending from TWinControl, override CreateWindowHandle(). + 3) If not descending from TWinControl, handle CM_HINTSHOW message. + 4) Check to make sure that CN_CHAR, CN_SYSCHAR and CM_DIALOGCHAR are handled properly. + 5) If descending from TWinControl, verify Unicode chars are preserved after RecreateWnd. + 6) Consider using storage specifiers for Hint and Caption properties. + 7) If any class could possibly have published WideString properties, + override DefineProperties and call TntPersistent_AfterInherited_DefineProperties. + 8) Check if TTntThemeManager needs to be updated. + 9) Override GetActionLinkClass() and ActionChange(). + 10) If class updates Application.Hint then update TntApplication.Hint instead. +} + +interface + +{ TODO: Unicode enable .OnKeyPress event } + +uses + Classes, Windows, Messages, Controls, Menus; + + +{TNT-WARN TCaption} +type TWideCaption = type WideString; + +// caption/text management +function TntControl_IsCaptionStored(Control: TControl): Boolean; +function TntControl_GetStoredText(Control: TControl; const Default: WideString): WideString; +procedure TntControl_SetStoredText(Control: TControl; const Value: WideString); +function TntControl_GetText(Control: TControl): WideString; +procedure TntControl_SetText(Control: TControl; const Text: WideString); + +// hint management +function TntControl_IsHintStored(Control: TControl): Boolean; +function TntControl_GetHint(Control: TControl): WideString; +procedure TntControl_SetHint(Control: TControl; const Value: WideString); + +function WideGetHint(Control: TControl): WideString; +function WideGetShortHint(const Hint: WideString): WideString; +function WideGetLongHint(const Hint: WideString): WideString; +procedure ProcessCMHintShowMsg(var Message: TMessage); + +type + TTntCustomHintWindow = class(THintWindow) + private + FActivating: Boolean; + FBlockPaint: Boolean; + function GetCaption: TWideCaption; + procedure SetCaption(const Value: TWideCaption); + procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED; + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; +{$IFNDEF COMPILER_7_UP} + procedure CreateParams(var Params: TCreateParams); override; +{$ENDIF} + procedure Paint; override; + public + procedure ActivateHint(Rect: TRect; const AHint: AnsiString); override; + procedure ActivateHintData(Rect: TRect; const AHint: AnsiString; AData: Pointer); override; + function CalcHintRect(MaxWidth: Integer; const AHint: AnsiString; AData: Pointer): TRect; override; + property Caption: TWideCaption read GetCaption write SetCaption; + end; + + TTntHintWindow = class(TTntCustomHintWindow) + public + procedure ActivateHint(Rect: TRect; const AHint: WideString); reintroduce; + procedure ActivateHintData(Rect: TRect; const AHint: WideString; AData: Pointer); reintroduce; + function CalcHintRect(MaxWidth: Integer; const AHint: WideString; AData: Pointer): TRect; reintroduce; + end; + +// text/char message +function IsTextMessage(Msg: UINT): Boolean; +procedure MakeWMCharMsgSafeForAnsi(var Message: TMessage); +procedure RestoreWMCharMsg(var Message: TMessage); +function GetWideCharFromWMCharMsg(Message: TWMChar): WideChar; +procedure SetWideCharForWMCharMsg(var Message: TWMChar; Ch: WideChar); + +// register/create window +procedure SubClassUnicodeControl(Control: TWinControl; Params_Caption: PAnsiChar; IDEWindow: Boolean = False); +procedure RegisterUnicodeClass(Params: TCreateParams; out WideWinClassName: WideString; IDEWindow: Boolean = False); +procedure CreateUnicodeHandle(Control: TWinControl; const Params: TCreateParams; + const SubClass: WideString; IDEWindow: Boolean = False); +procedure ReCreateUnicodeWnd(Control: TWinControl; Subclass: WideString; IDEWindow: Boolean = False); + +type + IWideCustomListControl = interface + ['{C1801F41-51E9-4DB5-8DB8-58AC86698C2E}'] + procedure AddItem(const Item: WideString; AObject: TObject); + end; + +procedure WideListControl_AddItem(Control: TCustomListControl; const Item: WideString; AObject: TObject); + +var + _IsShellProgramming: Boolean = False; + +var + TNT_WM_DESTROY: Cardinal; + +implementation + +uses + ActnList, Forms, SysUtils, Contnrs, + TntGraphics, TntWindows, TntClasses, TntMenus, TntSysUtils; + +type + TAccessControl = class(TControl); + TAccessWinControl = class(TWinControl); + TAccessControlActionLink = class(TControlActionLink{TNT-ALLOW TControlActionLink}); + +//----------------------------------------------- WIDE CAPTION HOLDERS -------- + +{ TWideControlHelper } + +var + WideControlHelpers: TComponentList = nil; + +type + TWideControlHelper = class(TWideComponentHelper) + private + FControl: TControl; + FWideCaption: WideString; + FWideHint: WideString; + procedure SetAnsiText(const Value: AnsiString); + procedure SetAnsiHint(const Value: AnsiString); + public + constructor Create(AOwner: TControl); reintroduce; + property WideCaption: WideString read FWideCaption; + property WideHint: WideString read FWideHint; + end; + +constructor TWideControlHelper.Create(AOwner: TControl); +begin + inherited CreateHelper(AOwner, WideControlHelpers); + FControl := AOwner; +end; + +procedure TWideControlHelper.SetAnsiText(const Value: AnsiString); +begin + TAccessControl(FControl).Text := Value; +end; + +procedure TWideControlHelper.SetAnsiHint(const Value: AnsiString); +begin + FControl.Hint := Value; +end; + +function FindWideControlHelper(Control: TControl; CreateIfNotFound: Boolean = True): TWideControlHelper; +begin + Result := TWideControlHelper(FindWideComponentHelper(WideControlHelpers, Control)); + if (Result = nil) and CreateIfNotFound then + Result := TWideControlHelper.Create(Control); +end; + +//----------------------------------------------- GET/SET WINDOW CAPTION/HINT ------------- + +function TntControl_IsCaptionStored(Control: TControl): Boolean; +begin + with TAccessControl(Control) do + Result := (ActionLink = nil) or not TAccessControlActionLink(ActionLink).IsCaptionLinked; +end; + +function TntControl_GetStoredText(Control: TControl; const Default: WideString): WideString; +var + WideControlHelper: TWideControlHelper; +begin + WideControlHelper := FindWideControlHelper(Control, False); + if WideControlHelper <> nil then + Result := WideControlHelper.WideCaption + else + Result := Default; +end; + +procedure TntControl_SetStoredText(Control: TControl; const Value: WideString); +begin + FindWideControlHelper(Control).FWideCaption := Value; + TAccessControl(Control).Text := Value; +end; + +function TntControl_GetText(Control: TControl): WideString; +var + WideControlHelper: TWideControlHelper; +begin + if (not Win32PlatformIsUnicode) + or ((Control is TWinControl) and TWinControl(Control).HandleAllocated and (not IsWindowUnicode(TWinControl(Control).Handle))) then + // Win9x / non-unicode handle + Result := TAccessControl(Control).Text + else if (not (Control is TWinControl)) then begin + // non-windowed TControl + WideControlHelper := FindWideControlHelper(Control, False); + if WideControlHelper = nil then + Result := TAccessControl(Control).Text + else + Result := GetSyncedWideString(WideControlHelper.FWideCaption, TAccessControl(Control).Text); + end else if (not TWinControl(Control).HandleAllocated) then begin + // NO HANDLE + Result := TntControl_GetStoredText(Control, TAccessControl(Control).Text) + end else begin + // UNICODE & HANDLE + SetLength(Result, GetWindowTextLengthW(TWinControl(Control).Handle) + 1); + GetWindowTextW(TWinControl(Control).Handle, PWideChar(Result), Length(Result)); + SetLength(Result, Length(Result) - 1); + end; +end; + +procedure TntControl_SetText(Control: TControl; const Text: WideString); +begin + if (not Win32PlatformIsUnicode) + or ((Control is TWinControl) and TWinControl(Control).HandleAllocated and (not IsWindowUnicode(TWinControl(Control).Handle))) then + // Win9x / non-unicode handle + TAccessControl(Control).Text := Text + else if (not (Control is TWinControl)) then begin + // non-windowed TControl + with FindWideControlHelper(Control) do + SetSyncedWideString(Text, FWideCaption, TAccessControl(Control).Text, SetAnsiText) + end else if (not TWinControl(Control).HandleAllocated) then begin + // NO HANDLE + TntControl_SetStoredText(Control, Text); + end else if TntControl_GetText(Control) <> Text then begin + // UNICODE & HANDLE + Tnt_SetWindowTextW(TWinControl(Control).Handle, PWideChar(Text)); + Control.Perform(CM_TEXTCHANGED, 0, 0); + end; +end; + +// hint management ----------------------------------------------------------------------- + +function TntControl_IsHintStored(Control: TControl): Boolean; +begin + with TAccessControl(Control) do + Result := (ActionLink = nil) or not TAccessControlActionLink(ActionLink).IsHintLinked; +end; + +function TntControl_GetHint(Control: TControl): WideString; +var + WideControlHelper: TWideControlHelper; +begin + if (not Win32PlatformIsUnicode) then + Result := Control.Hint + else begin + WideControlHelper := FindWideControlHelper(Control, False); + if WideControlHelper <> nil then + Result := GetSyncedWideString(WideControlHelper.FWideHint, Control.Hint) + else + Result := Control.Hint; + end; +end; + +procedure TntControl_SetHint(Control: TControl; const Value: WideString); +begin + if (not Win32PlatformIsUnicode) then + Control.Hint := Value + else + with FindWideControlHelper(Control) do + SetSyncedWideString(Value, FWideHint, Control.Hint, SetAnsiHint); +end; + +function WideGetHint(Control: TControl): WideString; +begin + while Control <> nil do + if TntControl_GetHint(Control) = '' then + Control := Control.Parent + else + begin + Result := TntControl_GetHint(Control); + Exit; + end; + Result := ''; +end; + +function WideGetShortHint(const Hint: WideString): WideString; +var + I: Integer; +begin + I := Pos('|', Hint); + if I = 0 then + Result := Hint else + Result := Copy(Hint, 1, I - 1); +end; + +function WideGetLongHint(const Hint: WideString): WideString; +var + I: Integer; +begin + I := Pos('|', Hint); + if I = 0 then + Result := Hint else + Result := Copy(Hint, I + 1, Maxint); +end; + +//---------------------------------------------------------------------------------------- + +var UnicodeCreationControl: TWinControl = nil; + +function IsUnicodeCreationControl(Handle: HWND): Boolean; +begin + Result := (UnicodeCreationControl <> nil) + and (UnicodeCreationControl.HandleAllocated) + and (UnicodeCreationControl.Handle = Handle); +end; + +function WMNotifyFormatResult(FromHandle: HWND): Integer; +begin + if Win32PlatformIsUnicode + and (IsWindowUnicode(FromHandle) or IsUnicodeCreationControl(FromHandle)) then + Result := NFR_UNICODE + else + Result := NFR_ANSI; +end; + +function IsTextMessage(Msg: UINT): Boolean; +begin + // WM_CHAR is omitted because of the special handling it receives + Result := (Msg = WM_SETTEXT) + or (Msg = WM_GETTEXT) + or (Msg = WM_GETTEXTLENGTH); +end; + +const + ANSI_UNICODE_HOLDER = $FF; + +procedure MakeWMCharMsgSafeForAnsi(var Message: TMessage); +begin + with TWMChar(Message) do begin + Assert(Msg = WM_CHAR); + if not _IsShellProgramming then + Assert(Unused = 0) + else begin + Assert((Unused = 0) or (CharCode <= Word(High(AnsiChar)))); + // When a Unicode control is embedded under non-Delphi Unicode + // window something strange happens + if (Unused <> 0) then begin + CharCode := (Unused shl 8) or CharCode; + end; + end; + if (CharCode > Word(High(AnsiChar))) then begin + Unused := CharCode; + CharCode := ANSI_UNICODE_HOLDER; + end; + end; +end; + +procedure RestoreWMCharMsg(var Message: TMessage); +begin + with TWMChar(Message) do begin + Assert(Message.Msg = WM_CHAR); + if (Unused > 0) + and (CharCode = ANSI_UNICODE_HOLDER) then + CharCode := Unused; + Unused := 0; + end; +end; + +function GetWideCharFromWMCharMsg(Message: TWMChar): WideChar; +begin + if (Message.CharCode = ANSI_UNICODE_HOLDER) + and (Message.Unused <> 0) then + Result := WideChar(Message.Unused) + else + Result := WideChar(Message.CharCode); +end; + +procedure SetWideCharForWMCharMsg(var Message: TWMChar; Ch: WideChar); +begin + Message.CharCode := Word(Ch); + Message.Unused := 0; + MakeWMCharMsgSafeForAnsi(TMessage(Message)); +end; + +//----------------------------------------------------------------------------------- +type + TWinControlTrap = class(TComponent) + private + WinControl_ObjectInstance: Pointer; + ObjectInstance: Pointer; + DefObjectInstance: Pointer; + function IsInSubclassChain(Control: TWinControl): Boolean; + procedure SubClassWindowProc; + private + FControl: TAccessWinControl; + Handle: THandle; + PrevWin32Proc: Pointer; + PrevDefWin32Proc: Pointer; + PrevWindowProc: TWndMethod; + private + LastWin32Msg: UINT; + Win32ProcLevel: Integer; + IDEWindow: Boolean; + DestroyTrap: Boolean; + TestForNull: Boolean; + FoundNull: Boolean; + {$IFDEF TNT_VERIFY_WINDOWPROC} + LastVerifiedWindowProc: TWndMethod; + {$ENDIF} + procedure Win32Proc(var Message: TMessage); + procedure DefWin32Proc(var Message: TMessage); + procedure WindowProc(var Message: TMessage); + private + procedure SubClassControl(Params_Caption: PAnsiChar); + procedure UnSubClassUnicodeControl; + protected + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + end; + +constructor TWinControlTrap.Create(AOwner: TComponent); +begin + FControl := TAccessWinControl(AOwner as TWinControl); + inherited Create(nil); + FControl.FreeNotification(Self); + + WinControl_ObjectInstance := Classes.MakeObjectInstance(FControl.MainWndProc); + ObjectInstance := Classes.MakeObjectInstance(Win32Proc); + DefObjectInstance := Classes.MakeObjectInstance(DefWin32Proc); +end; + +destructor TWinControlTrap.Destroy; +begin + Classes.FreeObjectInstance(ObjectInstance); + Classes.FreeObjectInstance(DefObjectInstance); + Classes.FreeObjectInstance(WinControl_ObjectInstance); + inherited; +end; + +procedure TWinControlTrap.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited; + if (AComponent = FControl) and (Operation = opRemove) then begin + FControl := nil; + if Win32ProcLevel = 0 then + Free + else + DestroyTrap := True; + end; +end; + +procedure TWinControlTrap.SubClassWindowProc; +begin + if not IsInSubclassChain(FControl) then begin + PrevWindowProc := FControl.WindowProc; + FControl.WindowProc := Self.WindowProc; + end; + {$IFDEF TNT_VERIFY_WINDOWPROC} + LastVerifiedWindowProc := FControl.WindowProc; + {$ENDIF} +end; + +procedure TWinControlTrap.SubClassControl(Params_Caption: PAnsiChar); +begin + // initialize trap object + Handle := FControl.Handle; + PrevWin32Proc := Pointer(GetWindowLongW(FControl.Handle, GWL_WNDPROC)); + PrevDefWin32Proc := FControl.DefWndProc; + + // subclass Window Procedures + SetWindowLongW(FControl.Handle, GWL_WNDPROC, Integer(ObjectInstance)); + FControl.DefWndProc := DefObjectInstance; + SubClassWindowProc; + + // For some reason, caption gets garbled after calling SetWindowLongW(.., GWL_WNDPROC). + TntControl_SetText(FControl, TntControl_GetStoredText(FControl, Params_Caption)); +end; + +function SameWndMethod(A, B: TWndMethod): Boolean; +begin + Result := @A = @B; +end; + +var + PendingRecreateWndTrapList: TComponentList = nil; + +procedure TWinControlTrap.UnSubClassUnicodeControl; +begin + // remember caption for future window creation + if not (csDestroying in FControl.ComponentState) then + TntControl_SetStoredText(FControl, TntControl_GetText(FControl)); + + // restore window procs (restore WindowProc only if we are still the direct subclass) + if SameWndMethod(FControl.WindowProc, Self.WindowProc) then + FControl.WindowProc := PrevWindowProc; + TAccessWinControl(FControl).DefWndProc := PrevDefWin32Proc; + SetWindowLongW(FControl.Handle, GWL_WNDPROC, Integer(PrevWin32Proc)); + + if IDEWindow then + DestroyTrap := True + else if not (csDestroying in FControl.ComponentState) then + // control not being destroyed, probably recreating window + PendingRecreateWndTrapList.Add(Self); +end; + +var + Finalized: Boolean; { If any tnt controls are still around after finalization it must be due to a memory leak. + Windows will still try to send a WM_DESTROY, but we will just ignore it if we're finalized. } + +procedure TWinControlTrap.Win32Proc(var Message: TMessage); +begin + if (not Finalized) then begin + Inc(Win32ProcLevel); + try + with Message do begin + {$IFDEF TNT_VERIFY_WINDOWPROC} + if not SameWndMethod(FControl.WindowProc, LastVerifiedWindowProc) then begin + SubClassWindowProc; + LastVerifiedWindowProc := FControl.WindowProc; + end; + {$ENDIF} + LastWin32Msg := Msg; + Result := CallWindowProcW(PrevWin32Proc, Handle, Msg, wParam, lParam); + end; + finally + Dec(Win32ProcLevel); + end; + if (Win32ProcLevel = 0) and (DestroyTrap) then + Free; + end else if (Message.Msg = WM_DESTROY) or (Message.Msg = TNT_WM_DESTROY) then + FControl.WindowHandle := 0 +end; + +procedure TWinControlTrap.DefWin32Proc(var Message: TMessage); + + function IsChildEdit(AHandle: HWND): Boolean; + var + AHandleClass: WideString; + begin + Result := False; + if (FControl.Handle = GetParent(Handle)) then begin + // child control + SetLength(AHandleClass, 255); + SetLength(AHandleClass, GetClassNameW(AHandle, PWideChar(AHandleClass), Length(AHandleClass))); + Result := WideSameText(AHandleClass, 'EDIT'); + end; + end; + +begin + with Message do begin + if Msg = WM_NOTIFYFORMAT then + Result := WMNotifyFormatResult(HWND(Message.wParam)) + else begin + if (Msg = WM_CHAR) then begin + RestoreWMCharMsg(Message) + end; + if (Msg = WM_IME_CHAR) and (not _IsShellProgramming) and (not Win32PlatformIsXP) then + begin + { In Windows XP, DefWindowProc handles WM_IME_CHAR fine for VCL windows. } + { Before XP, DefWindowProc will sometimes produce incorrect, non-Unicode WM_CHAR. } + { Also, using PostMessageW on Windows 2000 didn't always produce the correct results. } + Message.Result := SendMessageW(Handle, WM_CHAR, wParam, lParam) + end else if (Msg = WM_IME_CHAR) and (_IsShellProgramming) then begin + { When a Tnt control is hosted by a non-delphi control, DefWindowProc doesn't always work even on XP. } + if IsChildEdit(Handle) then + Message.Result := Integer(PostMessageW(Handle, WM_CHAR, wParam, lParam)) // native edit child control + else + Message.Result := SendMessageW(Handle, WM_CHAR, wParam, lParam); + end else begin + if (Msg = WM_DESTROY) then begin + UnSubClassUnicodeControl; {The reason for doing this in DefWin32Proc is because in D9, TWinControl.WMDestroy() does a perform(WM_TEXT) operation. } + end; + { Normal DefWindowProc } + Result := CallWindowProcW(PrevDefWin32Proc, Handle, Msg, wParam, lParam); + end; + end; + end; +end; + +procedure ProcessCMHintShowMsg(var Message: TMessage); +begin + if Win32PlatformIsUnicode then begin + with TCMHintShow(Message) do begin + if (HintInfo.HintWindowClass = THintWindow) + or (HintInfo.HintWindowClass.InheritsFrom(TTntCustomHintWindow)) then begin + if (HintInfo.HintWindowClass = THintWindow) then + HintInfo.HintWindowClass := TTntCustomHintWindow; + HintInfo.HintData := HintInfo; + HintInfo.HintStr := WideGetShortHint(WideGetHint(HintInfo.HintControl)); + end; + end; + end; +end; + +function TWinControlTrap.IsInSubclassChain(Control: TWinControl): Boolean; +var + Message: TMessage; +begin + if SameWndMethod(Control.WindowProc, TAccessWinControl(Control).WndProc) then + Result := False { no subclassing } + else if SameWndMethod(Control.WindowProc, Self.WindowProc) then + Result := True { directly subclassed } + else begin + TestForNull := True; + FoundNull := False; + ZeroMemory(@Message, SizeOf(Message)); + Message.Msg := WM_NULL; + Control.WindowProc(Message); + Result := FoundNull; { indirectly subclassed } + end; +end; + +procedure TWinControlTrap.WindowProc(var Message: TMessage); +var + CameFromWindows: Boolean; +begin + if TestForNull and (Message.Msg = WM_NULL) then + FoundNull := True; + + if (not FControl.HandleAllocated) then + FControl.WndProc(Message) + else begin + CameFromWindows := LastWin32Msg <> WM_NULL; + LastWin32Msg := WM_NULL; + with Message do begin + if Msg = CM_HINTSHOW then + ProcessCMHintShowMsg(Message); + if (not CameFromWindows) + and (IsTextMessage(Msg)) then + Result := SendMessageA(Handle, Msg, wParam, lParam) + else begin + if (Msg = WM_CHAR) then begin + MakeWMCharMsgSafeForAnsi(Message); + end; + PrevWindowProc(Message) + end; + if (Msg = TNT_WM_DESTROY) then + UnSubClassUnicodeControl; {The reason for doing this in DefWin32Proc is because in D9, TWinControl.WMDestroy() does a perform(WM_TEXT) operation. } + end; + end; +end; + +//---------------------------------------------------------------------------------- + +function FindOrCreateWinControlTrap(Control: TWinControl): TWinControlTrap; +var + i: integer; +begin + // find or create trap object + Result := nil; + for i := PendingRecreateWndTrapList.Count - 1 downto 0 do begin + if TWinControlTrap(PendingRecreateWndTrapList[i]).FControl = Control then begin + Result := TWinControlTrap(PendingRecreateWndTrapList[i]); + PendingRecreateWndTrapList.Delete(i); + break; { found it } + end; + end; + if Result = nil then + Result := TWinControlTrap.Create(Control); +end; + +procedure SubClassUnicodeControl(Control: TWinControl; Params_Caption: PAnsiChar; IDEWindow: Boolean = False); +var + WinControlTrap: TWinControlTrap; +begin + if not IsWindowUnicode(Control.Handle) then + raise ETntInternalError.Create('Internal Error: SubClassUnicodeControl.Control is not Unicode.'); + + WinControlTrap := FindOrCreateWinControlTrap(Control); + WinControlTrap.SubClassControl(Params_Caption); + WinControlTrap.IDEWindow := IDEWindow; +end; + + +//----------------------------------------------- CREATE/DESTROY UNICODE HANDLE + +var + WindowAtom: TAtom; + ControlAtom: TAtom; + WindowAtomString: AnsiString; + ControlAtomString: AnsiString; + +type + TWndProc = function(HWindow: HWnd; Message, WParam, LParam: Longint): Longint; stdcall; + +function InitWndProcW(HWindow: HWnd; Message, WParam, LParam: Longint): Longint; stdcall; + + function GetObjectInstance(Control: TWinControl): Pointer; + var + WinControlTrap: TWinControlTrap; + begin + WinControlTrap := FindOrCreateWinControlTrap(Control); + PendingRecreateWndTrapList.Add(WinControlTrap); + Result := WinControlTrap.WinControl_ObjectInstance; + end; + +var + ObjectInstance: Pointer; +begin + TAccessWinControl(CreationControl).WindowHandle := HWindow; + ObjectInstance := GetObjectInstance(CreationControl); + {Controls.InitWndProc converts control to ANSI here by calling SetWindowLongA()!} + SetWindowLongW(HWindow, GWL_WNDPROC, Integer(ObjectInstance)); + if (GetWindowLongW(HWindow, GWL_STYLE) and WS_CHILD <> 0) + and (GetWindowLongW(HWindow, GWL_ID) = 0) then + SetWindowLongW(HWindow, GWL_ID, Integer(HWindow)); + SetProp(HWindow, MakeIntAtom(ControlAtom), THandle(CreationControl)); + SetProp(HWindow, MakeIntAtom(WindowAtom), THandle(CreationControl)); + CreationControl := nil; + Result := TWndProc(ObjectInstance)(HWindow, Message, WParam, lParam); +end; + +procedure RegisterUnicodeClass(Params: TCreateParams; out WideWinClassName: WideString; IDEWindow: Boolean = False); +const + UNICODE_CLASS_EXT = '.UnicodeClass'; +var + TempClass: TWndClassW; + WideClass: TWndClassW; + ClassRegistered: Boolean; + InitialProc: TFNWndProc; +begin + if IDEWindow then + InitialProc := @InitWndProc + else + InitialProc := @InitWndProcW; + + with Params do begin + WideWinClassName := WinClassName + UNICODE_CLASS_EXT; + ClassRegistered := GetClassInfoW(hInstance, PWideChar(WideWinClassName), TempClass); + if (not ClassRegistered) or (TempClass.lpfnWndProc <> InitialProc) + then begin + if ClassRegistered then Win32Check(Windows.UnregisterClassW(PWideChar(WideWinClassName), hInstance)); + // Prepare a TWndClassW record + WideClass := TWndClassW(WindowClass); + WideClass.hInstance := hInstance; + WideClass.lpfnWndProc := InitialProc; + if not Tnt_Is_IntResource(PWideChar(WindowClass.lpszMenuName)) then begin + WideClass.lpszMenuName := PWideChar(WideString(WindowClass.lpszMenuName)); + end; + WideClass.lpszClassName := PWideChar(WideWinClassName); + + // Register the UNICODE class + if RegisterClassW(WideClass) = 0 then RaiseLastOSError; + end; + end; +end; + +procedure CreateUnicodeHandle(Control: TWinControl; const Params: TCreateParams; + const SubClass: WideString; IDEWindow: Boolean = False); +var + TempSubClass: TWndClassW; + WideWinClassName: WideString; + Handle: THandle; +begin + if (not Win32PlatformIsUnicode) then begin + with Params do + TAccessWinControl(Control).WindowHandle := CreateWindowEx(ExStyle, WinClassName, + Caption, Style, X, Y, Width, Height, WndParent, 0, WindowClass.hInstance, Param); + end else begin + // SubClass the unicode version of this control by getting the correct DefWndProc + if (SubClass <> '') + and GetClassInfoW(Params.WindowClass.hInstance, PWideChar(SubClass), TempSubClass) then + TAccessWinControl(Control).DefWndProc := TempSubClass.lpfnWndProc + else + TAccessWinControl(Control).DefWndProc := @DefWindowProcW; + + // make sure Unicode window class is registered + RegisterUnicodeClass(Params, WideWinClassName, IDEWindow); + + // Create UNICODE window handle + UnicodeCreationControl := Control; + try + with Params do + Handle := CreateWindowExW(ExStyle, PWideChar(WideWinClassName), nil, + Style, X, Y, Width, Height, WndParent, 0, hInstance, Param); + if Handle = 0 then + RaiseLastOSError; + TAccessWinControl(Control).WindowHandle := Handle; + if IDEWindow then + SetWindowLongW(Handle, GWL_WNDPROC, GetWindowLong(Handle, GWL_WNDPROC)); + finally + UnicodeCreationControl := nil; + end; + + SubClassUnicodeControl(Control, Params.Caption, IDEWindow); + end; +end; + +procedure ReCreateUnicodeWnd(Control: TWinControl; Subclass: WideString; IDEWindow: Boolean = False); +var + WasFocused: Boolean; + Params: TCreateParams; +begin + with TAccessWinControl(Control) do begin + WasFocused := Focused; + DestroyHandle; + CreateParams(Params); + CreationControl := Control; + CreateUnicodeHandle(Control, Params, SubClass, IDEWindow); + StrDispose{TNT-ALLOW StrDispose}(WindowText); + WindowText := nil; + Perform(WM_SETFONT, Integer(Font.Handle), 1); + if AutoSize then AdjustSize; + UpdateControlState; + if WasFocused and (WindowHandle <> 0) then Windows.SetFocus(WindowHandle); + end; +end; + +{ TTntCustomHintWindow procs } + +function DataPointsToHintInfoForTnt(AData: Pointer): Boolean; +begin + try + Result := (AData <> nil) + and (PHintInfo(AData).HintData = AData) {points to self} + and (PHintInfo(AData).HintWindowClass.InheritsFrom(TTntCustomHintWindow)); + except + Result := False; + end; +end; + +function ExtractTntHintCaption(AData: Pointer): WideString; +var + Control: TControl; + WideHint: WideString; + AnsiHintWithShortCut: AnsiString; + ShortCut: TShortCut; +begin + Result := PHintInfo(AData).HintStr; + if Result <> '' then begin + Control := PHintInfo(AData).HintControl; + WideHint := WideGetShortHint(WideGetHint(Control)); + if (AnsiString(WideHint) = PHintInfo(AData).HintStr) then + Result := WideHint + else if Application.HintShortCuts and (Control <> nil) + and (Control.Action is TCustomAction{TNT-ALLOW TCustomAction}) then begin + ShortCut := TCustomAction{TNT-ALLOW TCustomAction}(Control.Action).ShortCut; + if (ShortCut <> scNone) then + begin + AnsiHintWithShortCut := Format{TNT-ALLOW Format}('%s (%s)', [WideHint, ShortCutToText{TNT-ALLOW ShortCutToText}(ShortCut)]); + if AnsiHintWithShortCut = PHintInfo(AData).HintStr then + Result := WideFormat('%s (%s)', [WideHint, WideShortCutToText(ShortCut)]); + end; + end; + end; +end; + +{ TTntCustomHintWindow } + +procedure TTntCustomHintWindow.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle(Self, Params, ''); +end; + +{$IFNDEF COMPILER_7_UP} +procedure TTntCustomHintWindow.CreateParams(var Params: TCreateParams); +const + CS_DROPSHADOW = $00020000; +begin + inherited; + if Win32PlatformIsXP then { Enable drop shadow effect on Windows XP and later. } + Params.WindowClass.Style := Params.WindowClass.Style or CS_DROPSHADOW; +end; +{$ENDIF} + +function TTntCustomHintWindow.GetCaption: TWideCaption; +begin + Result := TntControl_GetText(Self) +end; + +procedure TTntCustomHintWindow.SetCaption(const Value: TWideCaption); +begin + TntControl_SetText(Self, Value); +end; + +procedure TTntCustomHintWindow.Paint; +var + R: TRect; +begin + if FBlockPaint then + exit; + if (not Win32PlatformIsUnicode) then + inherited + else begin + R := ClientRect; + Inc(R.Left, 2); + Inc(R.Top, 2); + Canvas.Font.Color := Screen.HintFont.Color; + Tnt_DrawTextW(Canvas.Handle, PWideChar(Caption), -1, R, DT_LEFT or DT_NOPREFIX or + DT_WORDBREAK or DrawTextBiDiModeFlagsReadingOnly); + end; +end; + +procedure TTntCustomHintWindow.CMTextChanged(var Message: TMessage); +begin + { Avoid flicker when calling ActivateHint } + if FActivating then Exit; + Width := WideCanvasTextWidth(Canvas, Caption) + 6; + Height := WideCanvasTextHeight(Canvas, Caption) + 6; +end; + +procedure TTntCustomHintWindow.ActivateHint(Rect: TRect; const AHint: AnsiString); +var + SaveActivating: Boolean; +begin + SaveActivating := FActivating; + try + FActivating := True; + inherited; + finally + FActivating := SaveActivating; + end; +end; + +procedure TTntCustomHintWindow.ActivateHintData(Rect: TRect; const AHint: AnsiString; AData: Pointer); +var + SaveActivating: Boolean; +begin + if (not Win32PlatformIsUnicode) + or (not DataPointsToHintInfoForTnt(AData)) then + inherited + else begin + FBlockPaint := True; + try + SaveActivating := FActivating; + try + FActivating := True; + inherited; + Caption := ExtractTntHintCaption(AData); + finally + FActivating := SaveActivating; + end; + finally + FBlockPaint := False; + end; + Invalidate; + end; +end; + +function TntHintWindow_CalcHintRect(HintWindow: TTntCustomHintWindow; MaxWidth: Integer; const AHint: WideString): TRect; +begin + Result := Rect(0, 0, MaxWidth, 0); + Tnt_DrawTextW(HintWindow.Canvas.Handle, PWideChar(AHint), -1, Result, DT_CALCRECT or DT_LEFT or + DT_WORDBREAK or DT_NOPREFIX or HintWindow.DrawTextBiDiModeFlagsReadingOnly); + Inc(Result.Right, 6); + Inc(Result.Bottom, 2); +end; + +function TTntCustomHintWindow.CalcHintRect(MaxWidth: Integer; const AHint: AnsiString; AData: Pointer): TRect; +var + WideHintStr: WideString; +begin + if (not Win32PlatformIsUnicode) + or (not DataPointsToHintInfoForTnt(AData)) then + Result := inherited CalcHintRect(MaxWidth, AHint, AData) + else begin + WideHintStr := ExtractTntHintCaption(AData); + Result := TntHintWindow_CalcHintRect(Self, MaxWidth, WideHintStr); + end; +end; + +{ TTntHintWindow } + +procedure TTntHintWindow.ActivateHint(Rect: TRect; const AHint: WideString); +var + SaveActivating: Boolean; +begin + SaveActivating := FActivating; + try + FActivating := True; + Caption := AHint; + inherited ActivateHint(Rect, AHint); + finally + FActivating := SaveActivating; + end; +end; + +procedure TTntHintWindow.ActivateHintData(Rect: TRect; const AHint: WideString; AData: Pointer); +var + SaveActivating: Boolean; +begin + FBlockPaint := True; + try + SaveActivating := FActivating; + try + FActivating := True; + Caption := AHint; + inherited ActivateHintData(Rect, AHint, AData); + finally + FActivating := SaveActivating; + end; + finally + FBlockPaint := False; + end; + Invalidate; +end; + +function TTntHintWindow.CalcHintRect(MaxWidth: Integer; const AHint: WideString; AData: Pointer): TRect; +begin + Result := TntHintWindow_CalcHintRect(Self, MaxWidth, AHint); +end; + +procedure WideListControl_AddItem(Control: TCustomListControl; const Item: WideString; AObject: TObject); +var + WideControl: IWideCustomListControl; +begin + if Control.GetInterface(IWideCustomListControl, WideControl) then + WideControl.AddItem(Item, AObject) + else + Control.AddItem(Item, AObject); +end; + +procedure InitControls; + + procedure InitAtomStrings_D6_D7_D9; + var + Controls_HInstance: Cardinal; + begin + Controls_HInstance := FindClassHInstance(TWinControl); + WindowAtomString := Format{TNT-ALLOW Format}('Delphi%.8X',[GetCurrentProcessID]); + ControlAtomString := Format{TNT-ALLOW Format}('ControlOfs%.8X%.8X', [Controls_HInstance, GetCurrentThreadID]); + end; + + {$IFDEF COMPILER_6} // verified against VCL source in Delphi 6 and BCB 6 + procedure InitAtomStrings; + begin + InitAtomStrings_D6_D7_D9; + end; + {$ENDIF} + {$IFDEF DELPHI_7} // verified against VCL source in Delphi 7 + procedure InitAtomStrings; + begin + InitAtomStrings_D6_D7_D9; + end; + {$ENDIF} + {$IFDEF DELPHI_9} // verified against VCL source in Delphi 9 + procedure InitAtomStrings; + begin + InitAtomStrings_D6_D7_D9; + end; + {$ENDIF} + {$IFDEF DELPHI_10} // verified against VCL source in Delphi 10 + procedure InitAtomStrings; + begin + InitAtomStrings_D6_D7_D9; + end; + {$ENDIF} + +begin + InitAtomStrings; + WindowAtom := WinCheckH(GlobalAddAtom(PAnsiChar(WindowAtomString))); + ControlAtom := WinCheckH(GlobalAddAtom(PAnsiChar(ControlAtomString))); +end; + +initialization + TNT_WM_DESTROY := RegisterWindowMessage('TntUnicodeVcl.DestroyWindow'); + WideControlHelpers := TComponentList.Create(True); + PendingRecreateWndTrapList := TComponentList.Create(False); + InitControls; + +finalization + GlobalDeleteAtom(ControlAtom); + GlobalDeleteAtom(WindowAtom); + FreeAndNil(WideControlHelpers); + FreeAndNil(PendingRecreateWndTrapList); + Finalized := True; + +end. diff --git a/internal/1/Source/TntDB.pas b/internal/1/Source/TntDB.pas new file mode 100644 index 0000000..4490bd1 --- /dev/null +++ b/internal/1/Source/TntDB.pas @@ -0,0 +1,900 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntDB; + +{$INCLUDE TntCompilers.inc} + +interface + +uses + Classes, DB; + +type +{TNT-WARN TDateTimeField} + TTntDateTimeField = class(TDateTimeField{TNT-ALLOW TDateTimeField}) + protected + procedure SetAsString(const Value: AnsiString); override; + end; + +{TNT-WARN TDateField} + TTntDateField = class(TDateField{TNT-ALLOW TDateField}) + protected + procedure SetAsString(const Value: AnsiString); override; + end; + +{TNT-WARN TTimeField} + TTntTimeField = class(TTimeField{TNT-ALLOW TTimeField}) + protected + procedure SetAsString(const Value: AnsiString); override; + end; + + TFieldGetWideTextEvent = procedure(Sender: TField; var Text: WideString; + DoDisplayText: Boolean) of object; + TFieldSetWideTextEvent = procedure(Sender: TField; const Text: WideString) of object; + + IWideStringField = interface + ['{679C5F1A-4356-4696-A8F3-9C7C6970A9F6}'] + {$IFNDEF COMPILER_10_UP} + function GetAsWideString: WideString; + procedure SetAsWideString(const Value: WideString); + {$ENDIF} + function GetWideDisplayText: WideString; + function GetWideEditText: WideString; + procedure SetWideEditText(const Value: WideString); + //-- + {$IFNDEF COMPILER_10_UP} + property AsWideString: WideString read GetAsWideString write SetAsWideString{inherited}; + {$ENDIF} + property WideDisplayText: WideString read GetWideDisplayText; + property WideText: WideString read GetWideEditText write SetWideEditText; + end; + +{TNT-WARN TWideStringField} + TTntWideStringField = class(TWideStringField{TNT-ALLOW TWideStringField}, IWideStringField) + private + FOnGetText: TFieldGetWideTextEvent; + FOnSetText: TFieldSetWideTextEvent; + procedure SetOnGetText(const Value: TFieldGetWideTextEvent); + procedure SetOnSetText(const Value: TFieldSetWideTextEvent); + procedure LegacyGetText(Sender: TField; var AnsiText: AnsiString; DoDisplayText: Boolean); + procedure LegacySetText(Sender: TField; const AnsiText: AnsiString); + function GetWideDisplayText: WideString; + function GetWideEditText: WideString; + procedure SetWideEditText(const Value: WideString); + protected + {$IFNDEF COMPILER_10_UP} + function GetAsWideString: WideString; + {$ENDIF} + public + property Value: WideString read GetAsWideString write SetAsWideString; + property DisplayText{TNT-ALLOW DisplayText}: WideString read GetWideDisplayText; + property Text: WideString read GetWideEditText write SetWideEditText; + {$IFNDEF COMPILER_10_UP} + property AsWideString: WideString read GetAsWideString write SetAsWideString; + {$ENDIF} + property WideDisplayText: WideString read GetWideDisplayText; + property WideText: WideString read GetWideEditText write SetWideEditText; + published + property OnGetText: TFieldGetWideTextEvent read FOnGetText write SetOnGetText; + property OnSetText: TFieldSetWideTextEvent read FOnSetText write SetOnSetText; + end; + + TTntStringFieldEncodingMode = (emNone, emUTF8, emUTF7, emFixedCodePage, emFixedCodePage_Safe); + + //------------------------------------------------------------------------------------------- + // Comments on TTntStringFieldEncodingMode: + // + // emNone - Works like TStringField. + // emUTF8 - Should work well most databases. + // emUTF7 - Almost guaranteed to work with any database. Wasteful in database space. + // emFixedCodePage - Only tested it with Access 97, which doesn't support Unicode. + // emFixedCodePage_Safe - Like emFixedCodePage but uses char<=#128. Wasteful in database space. + // + // Only emUTF8 and emUTF7 fully support Unicode. + //------------------------------------------------------------------------------------------- + + TTntStringFieldCodePageEnum = (fcpOther, + fcpThai, fcpJapanese, fcpSimplifiedChinese, fcpTraditionalChinese, fcpKorean, + fcpCentralEuropean, fcpCyrillic, fcpLatinWestern, fcpGreek, fcpTurkish, + fcpHebrew, fcpArabic, fcpBaltic, fcpVietnamese); + +const + TntStringFieldCodePageEnumMap: array[TTntStringFieldCodePageEnum] of Word = (0, + 874, 932, 936, 950, 949, + 1250, 1251, 1252, 1253, 1254, + 1255, 1256, 1257, 1258); + +type +{TNT-WARN TStringField} + TTntStringField = class(TStringField{TNT-ALLOW TStringField},IWideStringField) + private + FOnGetText: TFieldGetWideTextEvent; + FOnSetText: TFieldSetWideTextEvent; + FEncodingMode: TTntStringFieldEncodingMode; + FFixedCodePage: Word; + FRawVariantAccess: Boolean; + procedure SetOnGetText(const Value: TFieldGetWideTextEvent); + procedure SetOnSetText(const Value: TFieldSetWideTextEvent); + procedure LegacyGetText(Sender: TField; var AnsiText: AnsiString; DoDisplayText: Boolean); + procedure LegacySetText(Sender: TField; const AnsiText: AnsiString); + function GetWideDisplayText: WideString; + function GetWideEditText: WideString; + procedure SetWideEditText(const Value: WideString); + function GetFixedCodePageEnum: TTntStringFieldCodePageEnum; + procedure SetFixedCodePageEnum(const Value: TTntStringFieldCodePageEnum); + function IsFixedCodePageStored: Boolean; + protected + {$IFDEF COMPILER_10_UP} + function GetAsWideString: WideString; override; + procedure SetAsWideString(const Value: WideString); override; + {$ELSE} + function GetAsWideString: WideString; virtual; + procedure SetAsWideString(const Value: WideString); virtual; + {$ENDIF} + function GetAsVariant: Variant; override; + procedure SetVarValue(const Value: Variant); override; + function GetAsString: string{TNT-ALLOW string}; override; + procedure SetAsString(const Value: string{TNT-ALLOW string}); override; + public + constructor Create(AOwner: TComponent); override; + property Value: WideString read GetAsWideString write SetAsWideString; + property DisplayText{TNT-ALLOW DisplayText}: WideString read GetWideDisplayText; + property Text: WideString read GetWideEditText write SetWideEditText; + {$IFNDEF COMPILER_10_UP} + property AsWideString: WideString read GetAsWideString write SetAsWideString; + {$ENDIF} + property WideDisplayText: WideString read GetWideDisplayText; + property WideText: WideString read GetWideEditText write SetWideEditText; + published + property EncodingMode: TTntStringFieldEncodingMode read FEncodingMode write FEncodingMode default emUTF8; + property FixedCodePageEnum: TTntStringFieldCodePageEnum read GetFixedCodePageEnum write SetFixedCodePageEnum stored False; + property FixedCodePage: Word read FFixedCodePage write FFixedCodePage stored IsFixedCodePageStored; + property RawVariantAccess: Boolean read FRawVariantAccess write FRawVariantAccess default False; + property OnGetText: TFieldGetWideTextEvent read FOnGetText write SetOnGetText; + property OnSetText: TFieldSetWideTextEvent read FOnSetText write SetOnSetText; + end; + +//====================== +type +{TNT-WARN TMemoField} + TTntMemoField = class(TMemoField{TNT-ALLOW TMemoField}, IWideStringField) + private + FOnGetText: TFieldGetWideTextEvent; + FOnSetText: TFieldSetWideTextEvent; + FEncodingMode: TTntStringFieldEncodingMode; + FFixedCodePage: Word; + FRawVariantAccess: Boolean; + procedure SetOnGetText(const Value: TFieldGetWideTextEvent); + procedure SetOnSetText(const Value: TFieldSetWideTextEvent); + procedure LegacyGetText(Sender: TField; var AnsiText: AnsiString; DoDisplayText: Boolean); + procedure LegacySetText(Sender: TField; const AnsiText: AnsiString); + function GetWideDisplayText: WideString; + function GetWideEditText: WideString; + procedure SetWideEditText(const Value: WideString); + function GetFixedCodePageEnum: TTntStringFieldCodePageEnum; + procedure SetFixedCodePageEnum(const Value: TTntStringFieldCodePageEnum); + function IsFixedCodePageStored: Boolean; + protected + {$IFDEF COMPILER_10_UP} + function GetAsWideString: WideString; override; + procedure SetAsWideString(const Value: WideString); override; + {$ELSE} + function GetAsWideString: WideString; virtual; + procedure SetAsWideString(const Value: WideString); virtual; + {$ENDIF} + function GetAsVariant: Variant; override; + procedure SetVarValue(const Value: Variant); override; + function GetAsString: string{TNT-ALLOW string}; override; + procedure SetAsString(const Value: string{TNT-ALLOW string}); override; + public + constructor Create(AOwner: TComponent); override; + property Value: WideString read GetAsWideString write SetAsWideString; + property DisplayText{TNT-ALLOW DisplayText}: WideString read GetWideDisplayText; + property Text: WideString read GetWideEditText write SetWideEditText; + {$IFNDEF COMPILER_10_UP} + property AsWideString: WideString read GetAsWideString write SetAsWideString; + {$ENDIF} + property WideDisplayText: WideString read GetWideDisplayText; + property WideText: WideString read GetWideEditText write SetWideEditText; + published + property EncodingMode: TTntStringFieldEncodingMode read FEncodingMode write FEncodingMode default emUTF8; + property FixedCodePageEnum: TTntStringFieldCodePageEnum read GetFixedCodePageEnum write SetFixedCodePageEnum stored False; + property FixedCodePage: Word read FFixedCodePage write FFixedCodePage stored IsFixedCodePageStored; + property RawVariantAccess: Boolean read FRawVariantAccess write FRawVariantAccess default False; + property OnGetText: TFieldGetWideTextEvent read FOnGetText write SetOnGetText; + property OnSetText: TFieldSetWideTextEvent read FOnSetText write SetOnSetText; + end; + +//====================== +function GetTntFieldClass(FieldClass: TFieldClass): TFieldClass; + +function GetWideDisplayName(Field: TField): WideString; deprecated; // for Unicode-enabled functionality, use Delphi 2006 or newer +function GetWideDisplayLabel(Field: TField): WideString; deprecated; // for Unicode-enabled functionality, use Delphi 2006 or newer +procedure SetWideDisplayLabel(Field: TField; const Value: WideString); deprecated; // for Unicode-enabled functionality, use Delphi 2006 or newer + +{TNT-WARN AsString} +{TNT-WARN DisplayText} + +function GetAsWideString(Field: TField): WideString; +procedure SetAsWideString(Field: TField; const Value: WideString); + +function GetWideDisplayText(Field: TField): WideString; + +function GetWideText(Field: TField): WideString; +procedure SetWideText(Field: TField; const Value: WideString); + +procedure RegisterTntFields; + +{ TTntWideStringField / TTntStringField common handlers } +procedure TntWideStringField_GetWideText(Field: TField; + var Text: WideString; DoDisplayText: Boolean); +function TntWideStringField_GetWideDisplayText(Field: TField; + OnGetText: TFieldGetWideTextEvent): WideString; +function TntWideStringField_GetWideEditText(Field: TField; + OnGetText: TFieldGetWideTextEvent): WideString; +procedure TntWideStringField_SetWideText(Field: TField; + const Value: WideString); +procedure TntWideStringField_SetWideEditText(Field: TField; + OnSetText: TFieldSetWideTextEvent; const Value: WideString); + + +implementation + +uses + SysUtils, MaskUtils, Variants, Contnrs, TntSystem, TntSysUtils; + +function GetTntFieldClass(FieldClass: TFieldClass): TFieldClass; +begin + if FieldClass = TDateTimeField{TNT-ALLOW TDateTimeField} then + Result := TTntDateTimeField + else if FieldClass = TDateField{TNT-ALLOW TDateField} then + Result := TTntDateField + else if FieldClass = TTimeField{TNT-ALLOW TTimeField} then + Result := TTntTimeField + else if FieldClass = TWideStringField{TNT-ALLOW TWideStringField} then + Result := TTntWideStringField + else if FieldClass = TStringField{TNT-ALLOW TStringField} then + Result := TTntStringField + else + Result := FieldClass; +end; + +function GetWideDisplayName(Field: TField): WideString; +begin + Result := Field.DisplayName; +end; + +function GetWideDisplayLabel(Field: TField): WideString; +begin + Result := Field.DisplayLabel; +end; + +procedure SetWideDisplayLabel(Field: TField; const Value: WideString); +begin + Field.DisplayLabel := Value; +end; + +function GetAsWideString(Field: TField): WideString; +{$IFDEF COMPILER_10_UP} +begin + if (Field.ClassType = TMemoField{TNT-ALLOW TMemoField}) then + Result := VarToWideStr(Field.AsVariant) { works for NexusDB BLOB Wide } + else + Result := Field.AsWideString +end; +{$ELSE} +var + WideField: IWideStringField; +begin + if Field.GetInterface(IWideStringField, WideField) then + Result := WideField.AsWideString + else if (Field is TWideStringField{TNT-ALLOW TWideStringField}) then + begin + if Field.IsNull then + // This fixes a bug in TWideStringField.GetAsWideString which does not handle Null at all. + Result := '' + else + Result := TWideStringField{TNT-ALLOW TWideStringField}(Field).Value + end else if (Field is TMemoField{TNT-ALLOW TMemoField}) then + Result := VarToWideStr(Field.AsVariant) { works for NexusDB BLOB Wide } + else + Result := Field.AsString{TNT-ALLOW AsString}; +end; +{$ENDIF} + +procedure SetAsWideString(Field: TField; const Value: WideString); +{$IFDEF COMPILER_10_UP} +begin + if (Field.ClassType = TMemoField{TNT-ALLOW TMemoField}) then + Field.AsVariant := Value { works for NexusDB BLOB Wide } + else + Field.AsWideString := Value; +end; +{$ELSE} +var + WideField: IWideStringField; +begin + if Field.GetInterface(IWideStringField, WideField) then + WideField.AsWideString := Value + else if (Field is TWideStringField{TNT-ALLOW TWideStringField}) then + TWideStringField{TNT-ALLOW TWideStringField}(Field).Value := Value + else if (Field is TMemoField{TNT-ALLOW TMemoField}) then + Field.AsVariant := Value { works for NexusDB BLOB Wide } + else + Field.AsString{TNT-ALLOW AsString} := Value; +end; +{$ENDIF} + +function GetWideDisplayText(Field: TField): WideString; +var + WideField: IWideStringField; +begin + if Field.GetInterface(IWideStringField, WideField) then + Result := WideField.WideDisplayText + else if (Field is TWideStringField{TNT-ALLOW TWideStringField}) + and (not Assigned(Field.OnGetText)) then + Result := GetAsWideString(Field) + else + Result := Field.DisplayText{TNT-ALLOW DisplayText}; +end; + +function GetWideText(Field: TField): WideString; +var + WideField: IWideStringField; +begin + if Field.GetInterface(IWideStringField, WideField) then + Result := WideField.WideText + else if (Field is TWideStringField{TNT-ALLOW TWideStringField}) + and (not Assigned(Field.OnGetText)) then + Result := GetAsWideString(Field) + else + Result := Field.Text; +end; + +procedure SetWideText(Field: TField; const Value: WideString); +var + WideField: IWideStringField; +begin + if Field.GetInterface(IWideStringField, WideField) then + WideField.WideText := Value + else if (Field is TWideStringField{TNT-ALLOW TWideStringField}) + and (not Assigned(Field.OnSetText)) then + SetAsWideString(Field, Value) + else + Field.Text := Value +end; + +{ TTntDateTimeField } + +procedure TTntDateTimeField.SetAsString(const Value: AnsiString); +begin + if Value = '' then + inherited + else + SetAsDateTime(TntStrToDateTime(Value)); +end; + +{ TTntDateField } + +procedure TTntDateField.SetAsString(const Value: AnsiString); +begin + if Value = '' then + inherited + else + SetAsDateTime(TntStrToDate(Value)); +end; + +{ TTntTimeField } + +procedure TTntTimeField.SetAsString(const Value: AnsiString); +begin + if Value = '' then + inherited + else + SetAsDateTime(TntStrToTime(Value)); +end; + +{ TTntWideStringField / TTntStringField common handlers } + +procedure TntWideStringField_LegacyGetText(Sender: TField; OnGetText: TFieldGetWideTextEvent; + var AnsiText: AnsiString; DoDisplayText: Boolean); +var + WideText: WideString; +begin + if Assigned(OnGetText) then begin + WideText := AnsiText; + OnGetText(Sender, WideText, DoDisplayText); + AnsiText := WideText; + end; +end; + +procedure TntWideStringField_LegacySetText(Sender: TField; OnSetText: TFieldSetWideTextEvent; + const AnsiText: AnsiString); +begin + if Assigned(OnSetText) then + OnSetText(Sender, AnsiText); +end; + +procedure TntWideStringField_GetWideText(Field: TField; + var Text: WideString; DoDisplayText: Boolean); +var + WideStringField: IWideStringField; +begin + Field.GetInterface(IWideStringField, WideStringField); + Assert(WideStringField <> nil); + if DoDisplayText and (Field.EditMaskPtr <> '') then + { to gain the mask, we lose Unicode! } + Text := FormatMaskText(Field.EditMaskPtr, GetAsWideString(Field)) + else + Text := GetAsWideString(Field); +end; + +function TntWideStringField_GetWideDisplayText(Field: TField; + OnGetText: TFieldGetWideTextEvent): WideString; +begin + Result := ''; + if Assigned(OnGetText) then + OnGetText(Field, Result, True) + else if Assigned(Field.OnGetText) then + Result := Field.DisplayText{TNT-ALLOW DisplayText} {we lose Unicode to handle this event} + else + TntWideStringField_GetWideText(Field, Result, True); +end; + +function TntWideStringField_GetWideEditText(Field: TField; + OnGetText: TFieldGetWideTextEvent): WideString; +begin + Result := ''; + if Assigned(OnGetText) then + OnGetText(Field, Result, False) + else if Assigned(Field.OnGetText) then + Result := Field.Text {we lose Unicode to handle this event} + else + TntWideStringField_GetWideText(Field, Result, False); +end; + +procedure TntWideStringField_SetWideText(Field: TField; + const Value: WideString); +{$IFDEF COMPILER_10_UP} +begin + Field.AsWideString := Value; +end; +{$ELSE} +var + WideStringField: IWideStringField; +begin + Field.GetInterface(IWideStringField, WideStringField); + Assert(WideStringField <> nil); + WideStringField.SetAsWideString(Value); +end; +{$ENDIF} + +procedure TntWideStringField_SetWideEditText(Field: TField; + OnSetText: TFieldSetWideTextEvent; const Value: WideString); +begin + if Assigned(OnSetText) then + OnSetText(Field, Value) + else if Assigned(Field.OnSetText) then + Field.Text := Value {we lose Unicode to handle this event} + else + TntWideStringField_SetWideText(Field, Value); +end; + +{ TTntWideStringField } + +{$IFNDEF COMPILER_10_UP} +function TTntWideStringField.GetAsWideString: WideString; +begin + if not GetData(@Result, False) then + Result := ''; {fixes a bug in inherited which has unpredictable results for NULL} +end; +{$ENDIF} + +procedure TTntWideStringField.LegacyGetText(Sender: TField; var AnsiText: AnsiString; + DoDisplayText: Boolean); +begin + TntWideStringField_LegacyGetText(Sender, OnGetText, AnsiText, DoDisplayText); +end; + +procedure TTntWideStringField.LegacySetText(Sender: TField; const AnsiText: AnsiString); +begin + TntWideStringField_LegacySetText(Sender, OnSetText, AnsiText); +end; + +procedure TTntWideStringField.SetOnGetText(const Value: TFieldGetWideTextEvent); +begin + FOnGetText := Value; + if Assigned(OnGetText) then + inherited OnGetText := LegacyGetText + else + inherited OnGetText := nil; +end; + +procedure TTntWideStringField.SetOnSetText(const Value: TFieldSetWideTextEvent); +begin + FOnSetText := Value; + if Assigned(OnSetText) then + inherited OnSetText := LegacySetText + else + inherited OnSetText := nil; +end; + +function TTntWideStringField.GetWideDisplayText: WideString; +begin + Result := TntWideStringField_GetWideDisplayText(Self, OnGetText); +end; + +function TTntWideStringField.GetWideEditText: WideString; +begin + Result := TntWideStringField_GetWideEditText(Self, OnGetText); +end; + +procedure TTntWideStringField.SetWideEditText(const Value: WideString); +begin + TntWideStringField_SetWideEditText(Self, OnSetText, Value); +end; + +(* This stuffing method works with CJK codepages - intended to store accented characters in Access 97 *) + +function SafeStringToWideStringEx(const S: AnsiString; Codepage: Word): WideString; +var + R: AnsiString; + i: Integer; +begin + R := ''; + i := 1; + while i <= Length(S) do + begin + if (S[i] = #128) then + begin + Inc(i); + if S[i] = #128 then + R := R + #128 + else + R := R + Chr(Ord(S[i]) + 128); + Inc(i); + end + else + begin + R := R + S[I]; + Inc(i); + end; + end; + Result := StringToWideStringEx(R, CodePage); +end; + +function SafeWideStringToStringEx(const W: WideString; CodePage: Word): AnsiString; +var + TempS: AnsiString; + i: integer; +begin + TempS := WideStringToStringEx(W, CodePage); + Result := ''; + for i := 1 to Length(TempS) do + begin + if TempS[i] > #128 then + Result := Result + #128 + Chr(Ord(TempS[i]) - 128) + else if TempS[i] = #128 then + Result := Result + #128 + #128 + else + Result := Result + TempS[i]; + end; +end; + +{ TTntStringField } + +constructor TTntStringField.Create(AOwner: TComponent); +begin + inherited; + FEncodingMode := emUTF8; + FFixedCodePage := TntStringFieldCodePageEnumMap[fcpLatinWestern] +end; + +function TTntStringField.GetFixedCodePageEnum: TTntStringFieldCodePageEnum; +var + i: TTntStringFieldCodePageEnum; +begin + Result := fcpOther; + for i := Low(TntStringFieldCodePageEnumMap) to High(TntStringFieldCodePageEnumMap) do begin + if TntStringFieldCodePageEnumMap[i] = FixedCodePage then begin + Result := i; + Break; {found it} + end; + end; +end; + +procedure TTntStringField.SetFixedCodePageEnum(const Value: TTntStringFieldCodePageEnum); +begin + if (Value <> fcpOther) then + FixedCodePage := TntStringFieldCodePageEnumMap[Value]; +end; + +function TTntStringField.GetAsVariant: Variant; +begin + if RawVariantAccess then + Result := inherited GetAsVariant + else if IsNull then + Result := Null + else + Result := GetAsWideString; +end; + +procedure TTntStringField.SetVarValue(const Value: Variant); +begin + if RawVariantAccess then + inherited + else + SetAsWideString(Value); +end; + +function TTntStringField.GetAsWideString: WideString; +begin + case EncodingMode of + emNone: Result := (inherited GetAsString); + emUTF8: Result := UTF8ToWideString(inherited GetAsString); + emUTF7: try + Result := UTF7ToWideString(inherited GetAsString); + except + Result := inherited GetAsString; + end; + emFixedCodePage: Result := StringToWideStringEx(inherited GetAsString, FixedCodePage); + emFixedCodePage_Safe: Result := SafeStringToWideStringEx(inherited GetAsString, FixedCodePage); + else + raise ETntInternalError.Create('Internal Error: Unexpected EncodingMode'); + end; +end; + +procedure TTntStringField.SetAsWideString(const Value: WideString); +begin + case EncodingMode of + emNone: inherited SetAsString(Value); + emUTF8: inherited SetAsString(WideStringToUTF8(Value)); + emUTF7: inherited SetAsString(WideStringToUTF7(Value)); + emFixedCodePage: inherited SetAsString(WideStringToStringEx(Value, FixedCodePage)); + emFixedCodePage_Safe: inherited SetAsString(SafeWideStringToStringEx(Value, FixedCodePage)); + else + raise ETntInternalError.Create('Internal Error: Unexpected EncodingMode'); + end; +end; + +function TTntStringField.GetAsString: string{TNT-ALLOW string}; +begin + if EncodingMode = emNone then + Result := inherited GetAsString + else + Result := GetAsWideString; +end; + +procedure TTntStringField.SetAsString(const Value: string{TNT-ALLOW string}); +begin + if EncodingMode = emNone then + inherited SetAsString(Value) + else + SetAsWideString(Value); +end; + +procedure TTntStringField.LegacyGetText(Sender: TField; var AnsiText: AnsiString; + DoDisplayText: Boolean); +begin + TntWideStringField_LegacyGetText(Sender, OnGetText, AnsiText, DoDisplayText); +end; + +procedure TTntStringField.LegacySetText(Sender: TField; const AnsiText: AnsiString); +begin + TntWideStringField_LegacySetText(Sender, OnSetText, AnsiText); +end; + +procedure TTntStringField.SetOnGetText(const Value: TFieldGetWideTextEvent); +begin + FOnGetText := Value; + if Assigned(OnGetText) then + inherited OnGetText := LegacyGetText + else + inherited OnGetText := nil; +end; + +procedure TTntStringField.SetOnSetText(const Value: TFieldSetWideTextEvent); +begin + FOnSetText := Value; + if Assigned(OnSetText) then + inherited OnSetText := LegacySetText + else + inherited OnSetText := nil; +end; + +function TTntStringField.GetWideDisplayText: WideString; +begin + Result := TntWideStringField_GetWideDisplayText(Self, OnGetText) +end; + +function TTntStringField.GetWideEditText: WideString; +begin + Result := TntWideStringField_GetWideEditText(Self, OnGetText); +end; + +procedure TTntStringField.SetWideEditText(const Value: WideString); +begin + TntWideStringField_SetWideEditText(Self, OnSetText, Value); +end; + +function TTntStringField.IsFixedCodePageStored: Boolean; +begin + Result := EncodingMode = emFixedCodePage; +end; + +//--------------------------------------------------------------------------------------------- +{ TTntMemoField } + +constructor TTntMemoField.Create(AOwner: TComponent); +begin + inherited; + FEncodingMode := emUTF8; + FFixedCodePage := TntStringFieldCodePageEnumMap[fcpLatinWestern] +end; + +function TTntMemoField.GetFixedCodePageEnum: TTntStringFieldCodePageEnum; +var + i: TTntStringFieldCodePageEnum; +begin + Result := fcpOther; + for i := Low(TntStringFieldCodePageEnumMap) to High(TntStringFieldCodePageEnumMap) do begin + if TntStringFieldCodePageEnumMap[i] = FixedCodePage then begin + Result := i; + Break; {found it} + end; + end; +end; + +procedure TTntMemoField.SetFixedCodePageEnum(const Value: TTntStringFieldCodePageEnum); +begin + if (Value <> fcpOther) then + FixedCodePage := TntStringFieldCodePageEnumMap[Value]; +end; + +function TTntMemoField.GetAsVariant: Variant; +begin + if RawVariantAccess then + Result := inherited GetAsVariant + else if IsNull then + Result := Null + else + Result := GetAsWideString; +end; + +procedure TTntMemoField.SetVarValue(const Value: Variant); +begin + if RawVariantAccess then + inherited + else + SetAsWideString(Value); +end; + +function TTntMemoField.GetAsWideString: WideString; +begin + case EncodingMode of + emNone: Result := (inherited GetAsString); + emUTF8: Result := UTF8ToWideString(inherited GetAsString); + emUTF7: try + Result := UTF7ToWideString(inherited GetAsString); + except + Result := inherited GetAsString; + end; + emFixedCodePage: Result := StringToWideStringEx(inherited GetAsString, FixedCodePage); + emFixedCodePage_Safe: Result := SafeStringToWideStringEx(inherited GetAsString, FixedCodePage); + else + raise ETntInternalError.Create('Internal Error: Unexpected EncodingMode'); + end; +end; + +procedure TTntMemoField.SetAsWideString(const Value: WideString); +begin + case EncodingMode of + emNone: inherited SetAsString(Value); + emUTF8: inherited SetAsString(WideStringToUTF8(Value)); + emUTF7: inherited SetAsString(WideStringToUTF7(Value)); + emFixedCodePage: inherited SetAsString(WideStringToStringEx(Value, FixedCodePage)); + emFixedCodePage_Safe: inherited SetAsString(SafeWideStringToStringEx(Value, FixedCodePage)); + else + raise ETntInternalError.Create('Internal Error: Unexpected EncodingMode'); + end; +end; + +function TTntMemoField.GetAsString: string{TNT-ALLOW string}; +begin + if EncodingMode = emNone then + Result := inherited GetAsString + else + Result := GetAsWideString; +end; + +procedure TTntMemoField.SetAsString(const Value: string{TNT-ALLOW string}); +begin + if EncodingMode = emNone then + inherited SetAsString(Value) + else + SetAsWideString(Value); +end; + +procedure TTntMemoField.LegacyGetText(Sender: TField; var AnsiText: AnsiString; + DoDisplayText: Boolean); +begin + TntWideStringField_LegacyGetText(Sender, OnGetText, AnsiText, DoDisplayText); +end; + +procedure TTntMemoField.LegacySetText(Sender: TField; const AnsiText: AnsiString); +begin + TntWideStringField_LegacySetText(Sender, OnSetText, AnsiText); +end; + +procedure TTntMemoField.SetOnGetText(const Value: TFieldGetWideTextEvent); +begin + FOnGetText := Value; + if Assigned(OnGetText) then + inherited OnGetText := LegacyGetText + else + inherited OnGetText := nil; +end; + +procedure TTntMemoField.SetOnSetText(const Value: TFieldSetWideTextEvent); +begin + FOnSetText := Value; + if Assigned(OnSetText) then + inherited OnSetText := LegacySetText + else + inherited OnSetText := nil; +end; + +function TTntMemoField.GetWideDisplayText: WideString; +begin + Result := TntWideStringField_GetWideDisplayText(Self, OnGetText) +end; + +function TTntMemoField.GetWideEditText: WideString; +begin + Result := TntWideStringField_GetWideEditText(Self, OnGetText); +end; + +procedure TTntMemoField.SetWideEditText(const Value: WideString); +begin + TntWideStringField_SetWideEditText(Self, OnSetText, Value); +end; + +function TTntMemoField.IsFixedCodePageStored: Boolean; +begin + Result := EncodingMode = emFixedCodePage; +end; +//================================================================== +procedure RegisterTntFields; +begin + RegisterFields([TTntDateTimeField]); + RegisterFields([TTntDateField]); + RegisterFields([TTntTimeField]); + RegisterFields([TTntWideStringField]); + RegisterFields([TTntStringField]); + RegisterFields([TTntMemoField]); +end; + +type PFieldClass = ^TFieldClass; + +initialization +{$IFDEF TNT_FIELDS} + PFieldClass(@DefaultFieldClasses[ftDate])^ := TTntDateField; + PFieldClass(@DefaultFieldClasses[ftTime])^ := TTntTimeField; + PFieldClass(@DefaultFieldClasses[ftDateTime])^ := TTntDateTimeField; + PFieldClass(@DefaultFieldClasses[ftWideString])^ := TTntWideStringField; + PFieldClass(@DefaultFieldClasses[ftString])^ := TTntStringField; + PFieldClass(@DefaultFieldClasses[ftFixedChar])^ := TTntStringField; +{$ENDIF} + +finalization + +end. diff --git a/internal/1/Source/TntDBActns.pas b/internal/1/Source/TntDBActns.pas new file mode 100644 index 0000000..681257e --- /dev/null +++ b/internal/1/Source/TntDBActns.pas @@ -0,0 +1,594 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntDBActns; + +{$INCLUDE TntCompilers.inc} + +interface + +uses + Classes, ActnList, DBActns, TntActnList; + +type +{TNT-WARN TDataSetAction} + TTntDataSetAction = class(TDataSetAction{TNT-ALLOW TDataSetAction}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TDataSetFirst} + TTntDataSetFirst = class(TDataSetFirst{TNT-ALLOW TDataSetFirst}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TDataSetPrior} + TTntDataSetPrior = class(TDataSetPrior{TNT-ALLOW TDataSetPrior}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TDataSetNext} + TTntDataSetNext = class(TDataSetNext{TNT-ALLOW TDataSetNext}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TDataSetLast} + TTntDataSetLast = class(TDataSetLast{TNT-ALLOW TDataSetLast}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TDataSetInsert} + TTntDataSetInsert = class(TDataSetInsert{TNT-ALLOW TDataSetInsert}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TDataSetDelete} + TTntDataSetDelete = class(TDataSetDelete{TNT-ALLOW TDataSetDelete}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TDataSetEdit} + TTntDataSetEdit = class(TDataSetEdit{TNT-ALLOW TDataSetEdit}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TDataSetPost} + TTntDataSetPost = class(TDataSetPost{TNT-ALLOW TDataSetPost}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TDataSetCancel} + TTntDataSetCancel = class(TDataSetCancel{TNT-ALLOW TDataSetCancel}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TDataSetRefresh} + TTntDataSetRefresh = class(TDataSetRefresh{TNT-ALLOW TDataSetRefresh}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +procedure TntDBActn_AfterInherited_Assign(Action: TCustomAction{TNT-ALLOW TCustomAction}; Source: TPersistent); + +implementation + +uses + TntClasses; + +{TNT-IGNORE-UNIT} + +procedure TntDBActn_AfterInherited_Assign(Action: TCustomAction{TNT-ALLOW TCustomAction}; Source: TPersistent); +begin + TntAction_AfterInherited_Assign(Action, Source); + // TDataSetAction + if (Action is TDataSetAction) and (Source is TDataSetAction) then begin + TDataSetAction(Action).DataSource := TDataSetAction(Source).DataSource; + end; +end; + +//------------------------- +// TNT DB ACTNS +//------------------------- + +{ TTntDataSetAction } + +procedure TTntDataSetAction.Assign(Source: TPersistent); +begin + inherited; + TntDBActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntDataSetAction.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntDataSetAction.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntDataSetAction.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntDataSetAction.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntDataSetAction.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntDataSetFirst } + +procedure TTntDataSetFirst.Assign(Source: TPersistent); +begin + inherited; + TntDBActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntDataSetFirst.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntDataSetFirst.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntDataSetFirst.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntDataSetFirst.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntDataSetFirst.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntDataSetPrior } + +procedure TTntDataSetPrior.Assign(Source: TPersistent); +begin + inherited; + TntDBActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntDataSetPrior.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntDataSetPrior.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntDataSetPrior.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntDataSetPrior.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntDataSetPrior.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntDataSetNext } + +procedure TTntDataSetNext.Assign(Source: TPersistent); +begin + inherited; + TntDBActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntDataSetNext.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntDataSetNext.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntDataSetNext.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntDataSetNext.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntDataSetNext.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntDataSetLast } + +procedure TTntDataSetLast.Assign(Source: TPersistent); +begin + inherited; + TntDBActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntDataSetLast.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntDataSetLast.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntDataSetLast.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntDataSetLast.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntDataSetLast.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntDataSetInsert } + +procedure TTntDataSetInsert.Assign(Source: TPersistent); +begin + inherited; + TntDBActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntDataSetInsert.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntDataSetInsert.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntDataSetInsert.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntDataSetInsert.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntDataSetInsert.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntDataSetDelete } + +procedure TTntDataSetDelete.Assign(Source: TPersistent); +begin + inherited; + TntDBActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntDataSetDelete.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntDataSetDelete.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntDataSetDelete.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntDataSetDelete.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntDataSetDelete.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntDataSetEdit } + +procedure TTntDataSetEdit.Assign(Source: TPersistent); +begin + inherited; + TntDBActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntDataSetEdit.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntDataSetEdit.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntDataSetEdit.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntDataSetEdit.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntDataSetEdit.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntDataSetPost } + +procedure TTntDataSetPost.Assign(Source: TPersistent); +begin + inherited; + TntDBActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntDataSetPost.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntDataSetPost.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntDataSetPost.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntDataSetPost.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntDataSetPost.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntDataSetCancel } + +procedure TTntDataSetCancel.Assign(Source: TPersistent); +begin + inherited; + TntDBActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntDataSetCancel.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntDataSetCancel.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntDataSetCancel.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntDataSetCancel.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntDataSetCancel.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntDataSetRefresh } + +procedure TTntDataSetRefresh.Assign(Source: TPersistent); +begin + inherited; + TntDBActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntDataSetRefresh.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntDataSetRefresh.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntDataSetRefresh.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntDataSetRefresh.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntDataSetRefresh.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +end. diff --git a/internal/1/Source/TntDBClientActns.pas b/internal/1/Source/TntDBClientActns.pas new file mode 100644 index 0000000..98904c7 --- /dev/null +++ b/internal/1/Source/TntDBClientActns.pas @@ -0,0 +1,197 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntDBClientActns; + +{$INCLUDE TntCompilers.inc} + +interface + +uses + Classes, ActnList, DBClientActns, TntActnList; + +type +{TNT-WARN TClientDataSetApply} + TTntClientDataSetApply = class(TClientDataSetApply{TNT-ALLOW TClientDataSetApply}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TClientDataSetRevert} + TTntClientDataSetRevert = class(TClientDataSetRevert{TNT-ALLOW TClientDataSetRevert}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TClientDataSetUndo} + TTntClientDataSetUndo = class(TClientDataSetUndo{TNT-ALLOW TClientDataSetUndo}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +implementation + +uses + TntClasses, TntDBActns; + +{TNT-IGNORE-UNIT} + +procedure TntDBClientActn_AfterInherited_Assign(Action: TCustomAction{TNT-ALLOW TCustomAction}; Source: TPersistent); +begin + TntDBActn_AfterInherited_Assign(Action, Source); + // TClientDataSetApply + if (Action is TClientDataSetApply) and (Source is TClientDataSetApply) then begin + TClientDataSetApply(Action).MaxErrors := TClientDataSetApply(Source).MaxErrors; + TClientDataSetApply(Action).DisplayErrorDlg := TClientDataSetApply(Source).DisplayErrorDlg; + end; + // TClientDataSetUndo + if (Action is TClientDataSetUndo) and (Source is TClientDataSetUndo) then begin + TClientDataSetUndo(Action).FollowChange := TClientDataSetUndo(Source).FollowChange; + end; +end; + +//------------------------- +// TNT DB ACTNS +//------------------------- + +{ TTntClientDataSetApply } + +procedure TTntClientDataSetApply.Assign(Source: TPersistent); +begin + inherited; + TntDBClientActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntClientDataSetApply.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntClientDataSetApply.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntClientDataSetApply.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntClientDataSetApply.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntClientDataSetApply.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntClientDataSetRevert } + +procedure TTntClientDataSetRevert.Assign(Source: TPersistent); +begin + inherited; + TntDBClientActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntClientDataSetRevert.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntClientDataSetRevert.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntClientDataSetRevert.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntClientDataSetRevert.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntClientDataSetRevert.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntClientDataSetUndo } + +procedure TTntClientDataSetUndo.Assign(Source: TPersistent); +begin + inherited; + TntDBClientActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntClientDataSetUndo.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntClientDataSetUndo.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntClientDataSetUndo.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntClientDataSetUndo.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntClientDataSetUndo.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +end. diff --git a/internal/1/Source/TntDBCtrls.pas b/internal/1/Source/TntDBCtrls.pas new file mode 100644 index 0000000..49111d4 --- /dev/null +++ b/internal/1/Source/TntDBCtrls.pas @@ -0,0 +1,2195 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntDBCtrls; + +{$INCLUDE TntCompilers.inc} + +interface + +uses + Classes, Windows, Messages, DB, DBCtrls, Controls, StdCtrls, + TntClasses, TntStdCtrls, TntControls, TntComCtrls, TntExtCtrls; + +type +{TNT-WARN TPaintControl} + TTntPaintControl = class + private + FOwner: TWinControl; + FClassName: WideString; + FHandle: HWnd; + FObjectInstance: Pointer; + FDefWindowProc: Pointer; + FCtl3dButton: Boolean; + function GetHandle: HWnd; + procedure SetCtl3DButton(Value: Boolean); + procedure WndProc(var Message: TMessage); + public + constructor Create(AOwner: TWinControl; const ClassName: WideString); + destructor Destroy; override; + procedure DestroyHandle; + property Ctl3DButton: Boolean read FCtl3dButton write SetCtl3dButton; + property Handle: HWnd read GetHandle; + end; + +type +{TNT-WARN TDBEdit} + TTntDBEdit = class(TDBEdit{TNT-ALLOW TDBEdit}) + private + InheritedDataChange: TNotifyEvent; + FPasswordChar: WideChar; + procedure DataChange(Sender: TObject); + procedure UpdateData(Sender: TObject); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsHintStored: Boolean; + procedure WMPaint(var Message: TWMPaint); message WM_PAINT; + function GetTextMargins: TPoint; + function GetPasswordChar: WideChar; + procedure SetPasswordChar(const Value: WideChar); + procedure CMEnter(var Message: TCMEnter); message CM_ENTER; + private + function GetSelStart: Integer; reintroduce; virtual; + procedure SetSelStart(const Value: Integer); reintroduce; virtual; + function GetSelLength: Integer; reintroduce; virtual; + procedure SetSelLength(const Value: Integer); reintroduce; virtual; + function GetSelText: WideString; reintroduce; + procedure SetSelText(const Value: WideString); + function GetText: WideString; + procedure SetText(const Value: WideString); + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure CreateWnd; override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + public + constructor Create(AOwner: TComponent); override; + property SelText: WideString read GetSelText write SetSelText; + property SelStart: Integer read GetSelStart write SetSelStart; + property SelLength: Integer read GetSelLength write SetSelLength; + property Text: WideString read GetText write SetText; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + property PasswordChar: WideChar read GetPasswordChar write SetPasswordChar default #0; + end; + +{TNT-WARN TDBText} + TTntDBText = class(TDBText{TNT-ALLOW TDBText}) + private + FDataLink: TFieldDataLink; + InheritedDataChange: TNotifyEvent; + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsHintStored: Boolean; + procedure CMHintShow(var Message: TMessage); message CM_HINTSHOW; + procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; + function GetCaption: TWideCaption; + function IsCaptionStored: Boolean; + procedure SetCaption(const Value: TWideCaption); + function GetFieldText: WideString; + procedure DataChange(Sender: TObject); + protected + procedure DefineProperties(Filer: TFiler); override; + function GetLabelText: WideString; reintroduce; virtual; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + procedure DoDrawText(var Rect: TRect; Flags: Longint); override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + property Caption: TWideCaption read GetCaption write SetCaption stored IsCaptionStored; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TDBComboBox} + TTntCustomDBComboBox = class(TDBComboBox{TNT-ALLOW TDBComboBox}, + IWideCustomListControl) + private + FDataLink: TFieldDataLink; + FFilter: WideString; + FLastTime: Cardinal; + procedure UpdateData(Sender: TObject); + procedure EditingChange(Sender: TObject); + procedure CMEnter(var Message: TCMEnter); message CM_ENTER; + procedure SetReadOnly; + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsHintStored: Boolean; + procedure WMChar(var Message: TWMChar); message WM_CHAR; + private + FItems: TTntStrings; + FSaveItems: TTntStrings; + FSaveItemIndex: integer; + function GetItems: TTntStrings; + procedure SetItems(const Value: TTntStrings); reintroduce; + function GetSelStart: Integer; + procedure SetSelStart(const Value: Integer); + function GetSelLength: Integer; + procedure SetSelLength(const Value: Integer); + function GetSelText: WideString; + procedure SetSelText(const Value: WideString); + function GetText: WideString; + procedure SetText(const Value: WideString); + + procedure CNCommand(var Message: TWMCommand); message CN_COMMAND; + protected + procedure DataChange(Sender: TObject); + function GetAutoComplete_UniqueMatchOnly: Boolean; dynamic; + function GetAutoComplete_PreserveDataEntryCase: Boolean; dynamic; + procedure DoEditCharMsg(var Message: TWMChar); virtual; + function GetFieldValue: Variant; virtual; + procedure SetFieldValue(const Value: Variant); virtual; + function GetComboValue: Variant; virtual; abstract; + procedure SetComboValue(const Value: Variant); virtual; abstract; + {$IFDEF DELPHI_7} // fix for Delphi 7 only + function GetItemsClass: TCustomComboBoxStringsClass; override; + {$ENDIF} + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + procedure CreateWnd; override; + procedure DestroyWnd; override; + procedure WndProc(var Message: TMessage); override; + procedure ComboWndProc(var Message: TMessage; ComboWnd: HWnd; ComboProc: Pointer); override; + procedure KeyPress(var Key: AnsiChar); override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure CopySelection(Destination: TCustomListControl); override; + procedure AddItem(const Item: WideString; AObject: TObject); reintroduce; virtual; + public + property SelText: WideString read GetSelText write SetSelText; + property SelStart: Integer read GetSelStart write SetSelStart; + property SelLength: Integer read GetSelLength write SetSelLength; + property Text: WideString read GetText write SetText; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + property Items: TTntStrings read GetItems write SetItems; + end; + + TTntDBComboBox = class(TTntCustomDBComboBox) + protected + function GetFieldValue: Variant; override; + procedure SetFieldValue(const Value: Variant); override; + function GetComboValue: Variant; override; + procedure SetComboValue(const Value: Variant); override; + end; + +type +{TNT-WARN TDBCheckBox} + TTntDBCheckBox = class(TDBCheckBox{TNT-ALLOW TDBCheckBox}) + private + function GetCaption: TWideCaption; + procedure SetCaption(const Value: TWideCaption); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsCaptionStored: Boolean; + function IsHintStored: Boolean; + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + procedure Toggle; override; + published + property Caption: TWideCaption read GetCaption write SetCaption stored IsCaptionStored; + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TDBRichEdit} + TTntDBRichEdit = class(TTntCustomRichEdit) + private + FDataLink: TFieldDataLink; + FAutoDisplay: Boolean; + FFocused: Boolean; + FMemoLoaded: Boolean; + FDataSave: AnsiString; + procedure BeginEditing; + procedure DataChange(Sender: TObject); + procedure EditingChange(Sender: TObject); + function GetDataField: WideString; + function GetDataSource: TDataSource; + function GetField: TField; + function GetReadOnly: Boolean; + procedure SetDataField(const Value: WideString); + procedure SetDataSource(Value: TDataSource); + procedure SetReadOnly(Value: Boolean); + procedure SetAutoDisplay(Value: Boolean); + procedure SetFocused(Value: Boolean); + procedure UpdateData(Sender: TObject); + procedure WMCut(var Message: TMessage); message WM_CUT; + procedure WMPaste(var Message: TMessage); message WM_PASTE; + procedure CMEnter(var Message: TCMEnter); message CM_ENTER; + procedure CMExit(var Message: TCMExit); message CM_EXIT; + procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK; + procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK; + procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY; + protected + procedure InternalLoadMemo; dynamic; + procedure InternalSaveMemo; dynamic; + protected + procedure Change; override; + procedure KeyDown(var Key: Word; Shift: TShiftState); override; + procedure KeyPress(var Key: AnsiChar); override; + procedure Loaded; override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + function ExecuteAction(Action: TBasicAction): Boolean; override; + procedure LoadMemo; virtual; + function UpdateAction(Action: TBasicAction): Boolean; override; + function UseRightToLeftAlignment: Boolean; override; + property Field: TField read GetField; + published + property Align; + property Alignment; + property Anchors; + property AutoDisplay: Boolean read FAutoDisplay write SetAutoDisplay default True; + property BevelEdges; + property BevelInner; + property BevelOuter; + property BevelKind; + property BevelWidth; + property BiDiMode; + property BorderStyle; + property Color; + property Constraints; + property Ctl3D; + property DataField: WideString read GetDataField write SetDataField; + property DataSource: TDataSource read GetDataSource write SetDataSource; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property HideSelection; + property HideScrollBars; + property ImeMode; + property ImeName; + property MaxLength; + property ParentBiDiMode; + property ParentColor; + property ParentCtl3D; + property ParentFont; + property ParentShowHint; + property PlainText; + property PopupMenu; + property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False; + property ScrollBars; + property ShowHint; + property TabOrder; + property TabStop; + property Visible; + property WantReturns; + property WantTabs; + property WordWrap; + property OnChange; + property OnClick; + property OnContextPopup; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnKeyDown; + property OnKeyPress; + property OnKeyUp; + {$IFDEF COMPILER_9_UP} + property OnMouseActivate; + {$ENDIF} + property OnMouseDown; + {$IFDEF COMPILER_10_UP} + property OnMouseEnter; + property OnMouseLeave; + {$ENDIF} + property OnMouseMove; + property OnMouseUp; + property OnResizeRequest; + property OnSelectionChange; + property OnProtectChange; + property OnSaveClipboard; + property OnStartDock; + property OnStartDrag; + end; + +type +{TNT-WARN TDBMemo} + TTntDBMemo = class(TTntCustomMemo) + private + FDataLink: TFieldDataLink; + FAutoDisplay: Boolean; + FFocused: Boolean; + FMemoLoaded: Boolean; + FPaintControl: TTntPaintControl; + procedure DataChange(Sender: TObject); + procedure EditingChange(Sender: TObject); + function GetDataField: WideString; + function GetDataSource: TDataSource; + function GetField: TField; + function GetReadOnly: Boolean; + procedure SetDataField(const Value: WideString); + procedure SetDataSource(Value: TDataSource); + procedure SetReadOnly(Value: Boolean); + procedure SetAutoDisplay(Value: Boolean); + procedure SetFocused(Value: Boolean); + procedure UpdateData(Sender: TObject); + procedure WMCut(var Message: TMessage); message WM_CUT; + procedure WMPaste(var Message: TMessage); message WM_PASTE; + procedure WMUndo(var Message: TMessage); message WM_UNDO; + procedure CMEnter(var Message: TCMEnter); message CM_ENTER; + procedure CMExit(var Message: TCMExit); message CM_EXIT; + procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK; + procedure WMPaint(var Message: TWMPaint); message WM_PAINT; + procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK; + protected + procedure Change; override; + procedure KeyDown(var Key: Word; Shift: TShiftState); override; + procedure KeyPress(var Key: Char{TNT-ALLOW Char}); override; + procedure Loaded; override; + procedure Notification(AComponent: TComponent; + Operation: TOperation); override; + procedure WndProc(var Message: TMessage); override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + function ExecuteAction(Action: TBasicAction): Boolean; override; + procedure LoadMemo; virtual; + function UpdateAction(Action: TBasicAction): Boolean; override; + function UseRightToLeftAlignment: Boolean; override; + property Field: TField read GetField; + published + property Align; + property Alignment; + property Anchors; + property AutoDisplay: Boolean read FAutoDisplay write SetAutoDisplay default True; + property BevelEdges; + property BevelInner; + property BevelOuter; + property BevelKind; + property BevelWidth; + property BiDiMode; + property BorderStyle; + property Color; + property Constraints; + property Ctl3D; + property DataField: WideString read GetDataField write SetDataField; + property DataSource: TDataSource read GetDataSource write SetDataSource; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property HideSelection; + property ImeMode; + property ImeName; + property MaxLength; + property ParentBiDiMode; + property ParentColor; + property ParentCtl3D; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False; + property ScrollBars; + property ShowHint; + property TabOrder; + property TabStop; + property Visible; + property WantReturns; + property WantTabs; + property WordWrap; + property OnChange; + property OnClick; + property OnContextPopup; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnKeyDown; + property OnKeyPress; + property OnKeyUp; + {$IFDEF COMPILER_9_UP} + property OnMouseActivate; + {$ENDIF} + property OnMouseDown; + {$IFDEF COMPILER_10_UP} + property OnMouseEnter; + property OnMouseLeave; + {$ENDIF} + property OnMouseMove; + property OnMouseUp; + property OnStartDock; + property OnStartDrag; + end; + +{ TDBRadioGroup } +type + TTntDBRadioGroup = class(TTntCustomRadioGroup) + private + FDataLink: TFieldDataLink; + FValue: WideString; + FValues: TTntStrings; + FInSetValue: Boolean; + FOnChange: TNotifyEvent; + procedure DataChange(Sender: TObject); + procedure UpdateData(Sender: TObject); + function GetDataField: WideString; + function GetDataSource: TDataSource; + function GetField: TField; + function GetReadOnly: Boolean; + function GetButtonValue(Index: Integer): WideString; + procedure SetDataField(const Value: WideString); + procedure SetDataSource(Value: TDataSource); + procedure SetReadOnly(Value: Boolean); + procedure SetValue(const Value: WideString); + procedure SetItems(Value: TTntStrings); + procedure SetValues(Value: TTntStrings); + procedure CMExit(var Message: TCMExit); message CM_EXIT; + procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK; + protected + procedure Change; dynamic; + procedure Click; override; + procedure KeyPress(var Key: Char{TNT-ALLOW Char}); override; + function CanModify: Boolean; override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + property DataLink: TFieldDataLink read FDataLink; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + function ExecuteAction(Action: TBasicAction): Boolean; override; + function UpdateAction(Action: TBasicAction): Boolean; override; + function UseRightToLeftAlignment: Boolean; override; + property Field: TField read GetField; + property ItemIndex; + property Value: WideString read FValue write SetValue; + published + property Align; + property Anchors; + property BiDiMode; + property Caption; + property Color; + property Columns; + property Constraints; + property Ctl3D; + property DataField: WideString read GetDataField write SetDataField; + property DataSource: TDataSource read GetDataSource write SetDataSource; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property Items write SetItems; + {$IFDEF COMPILER_7_UP} + property ParentBackground; + {$ENDIF} + property ParentBiDiMode; + property ParentColor; + property ParentCtl3D; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False; + property ShowHint; + property TabOrder; + property TabStop; + property Values: TTntStrings read FValues write SetValues; + property Visible; + property OnChange: TNotifyEvent read FOnChange write FOnChange; + property OnClick; + property OnContextPopup; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + {$IFDEF COMPILER_10_UP} + property OnMouseEnter; + property OnMouseLeave; + {$ENDIF} + property OnStartDock; + property OnStartDrag; + end; + +implementation + +uses + Forms, SysUtils, Graphics, Variants, TntDB, + TntActnList, TntGraphics, TntSysUtils, RichEdit, Mask; + +function FieldIsBlobLike(Field: TField): Boolean; +begin + Result := False; + if Assigned(Field) then begin + if (Field.IsBlob) + or (Field.DataType in [Low(TBlobType).. High(TBlobType)]) then + Result := True + else if (Field is TWideStringField{TNT-ALLOW TWideStringField}) + and (Field.Size = MaxInt) then + Result := True; { wide string field filling in for a blob field } + end; +end; + +{ TTntPaintControl } + +type + TAccessWinControl = class(TWinControl); + +constructor TTntPaintControl.Create(AOwner: TWinControl; const ClassName: WideString); +begin + FOwner := AOwner; + FClassName := ClassName; +end; + +destructor TTntPaintControl.Destroy; +begin + DestroyHandle; +end; + +procedure TTntPaintControl.DestroyHandle; +begin + if FHandle <> 0 then DestroyWindow(FHandle); + Classes.FreeObjectInstance(FObjectInstance); + FHandle := 0; + FObjectInstance := nil; +end; + +function TTntPaintControl.GetHandle: HWnd; +var + Params: TCreateParams; +begin + if FHandle = 0 then + begin + FObjectInstance := Classes.MakeObjectInstance(WndProc); + TAccessWinControl(FOwner).CreateParams(Params); + Params.Style := Params.Style and not (WS_HSCROLL or WS_VSCROLL); + if (not Win32PlatformIsUnicode) then begin + with Params do + FHandle := CreateWindowEx(ExStyle, PAnsiChar(AnsiString(FClassName)), + PAnsiChar(TAccessWinControl(FOwner).Text), Style or WS_VISIBLE, + X, Y, Width, Height, Application.Handle, 0, HInstance, nil); + FDefWindowProc := Pointer(GetWindowLong(FHandle, GWL_WNDPROC)); + SetWindowLong(FHandle, GWL_WNDPROC, Integer(FObjectInstance)); + end else begin + with Params do + FHandle := CreateWindowExW(ExStyle, PWideChar(FClassName), + PWideChar(TntControl_GetText(FOwner)), Style or WS_VISIBLE, + X, Y, Width, Height, Application.Handle, 0, HInstance, nil); + FDefWindowProc := Pointer(GetWindowLongW(FHandle, GWL_WNDPROC)); + SetWindowLongW(FHandle, GWL_WNDPROC, Integer(FObjectInstance)); + end; + SendMessage(FHandle, WM_SETFONT, Integer(TAccessWinControl(FOwner).Font.Handle), 1); + end; + Result := FHandle; +end; + +procedure TTntPaintControl.SetCtl3DButton(Value: Boolean); +begin + if FHandle <> 0 then DestroyHandle; + FCtl3DButton := Value; +end; + +procedure TTntPaintControl.WndProc(var Message: TMessage); +begin + with Message do + if (Msg >= CN_CTLCOLORMSGBOX) and (Msg <= CN_CTLCOLORSTATIC) then + Result := FOwner.Perform(Msg, WParam, LParam) + else if (not Win32PlatformIsUnicode) then + Result := CallWindowProcA(FDefWindowProc, FHandle, Msg, WParam, LParam) + else + Result := CallWindowProcW(FDefWindowProc, FHandle, Msg, WParam, LParam); +end; + +{ THackFieldDataLink } +type + THackFieldDataLink_D6_D7_D9 = class(TDataLink) + protected + FxxxField: TField; + FxxxFieldName: string{TNT-ALLOW string}; + FxxxControl: TComponent; + FxxxEditing: Boolean; + FModified: Boolean; + end; + +{$IFDEF COMPILER_6} // verified against VCL source in Delphi 6 and BCB 6 + THackFieldDataLink = THackFieldDataLink_D6_D7_D9; +{$ENDIF} +{$IFDEF DELPHI_7} // verified against VCL source in Delphi 7 + THackFieldDataLink = THackFieldDataLink_D6_D7_D9; +{$ENDIF} +{$IFDEF DELPHI_9} // verified against VCL source in Delphi 9 + THackFieldDataLink = THackFieldDataLink_D6_D7_D9; +{$ENDIF} +{$IFDEF DELPHI_10} // verified against VCL source in Delphi 10 + THackFieldDataLink = class(TDataLink) + protected + FxxxField: TField; + FxxxFieldName: WideString; + FxxxControl: TComponent; + FxxxEditing: Boolean; + FModified: Boolean; + end; +{$ENDIF} + +{ TTntDBEdit } + +type + THackDBEdit_D6_D7_D9 = class(TCustomMaskEdit) + protected + FDataLink: TFieldDataLink; + FCanvas: TControlCanvas; + FAlignment: TAlignment; + FFocused: Boolean; + end; + +{$IFDEF COMPILER_6} // verified against VCL source in Delphi 6 and BCB 6 + THackDBEdit = THackDBEdit_D6_D7_D9; +{$ENDIF} +{$IFDEF DELPHI_7} // verified against VCL source in Delphi 7 + THackDBEdit = THackDBEdit_D6_D7_D9; +{$ENDIF} +{$IFDEF DELPHI_9} // verified against VCL source in Delphi 9 + THackDBEdit = THackDBEdit_D6_D7_D9; +{$ENDIF} +{$IFDEF DELPHI_10} // verified against VCL source in Delphi 10 + THackDBEdit = THackDBEdit_D6_D7_D9; +{$ENDIF} + +constructor TTntDBEdit.Create(AOwner: TComponent); +begin + inherited; + InheritedDataChange := THackDBEdit(Self).FDataLink.OnDataChange; + THackDBEdit(Self).FDataLink.OnDataChange := DataChange; + THackDBEdit(Self).FDataLink.OnUpdateData := UpdateData; +end; + +procedure TTntDBEdit.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle(Self, Params, 'EDIT'); +end; + +procedure TTntDBEdit.CreateWnd; +begin + inherited; + TntCustomEdit_AfterInherited_CreateWnd(Self, FPasswordChar); +end; + +procedure TTntDBEdit.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntDBEdit.GetSelStart: Integer; +begin + Result := TntCustomEdit_GetSelStart(Self); +end; + +procedure TTntDBEdit.SetSelStart(const Value: Integer); +begin + TntCustomEdit_SetSelStart(Self, Value); +end; + +function TTntDBEdit.GetSelLength: Integer; +begin + Result := TntCustomEdit_GetSelLength(Self); +end; + +procedure TTntDBEdit.SetSelLength(const Value: Integer); +begin + TntCustomEdit_SetSelLength(Self, Value); +end; + +function TTntDBEdit.GetSelText: WideString; +begin + Result := TntCustomEdit_GetSelText(Self); +end; + +procedure TTntDBEdit.SetSelText(const Value: WideString); +begin + TntCustomEdit_SetSelText(Self, Value); +end; + +function TTntDBEdit.GetPasswordChar: WideChar; +begin + Result := TntCustomEdit_GetPasswordChar(Self, FPasswordChar) +end; + +procedure TTntDBEdit.SetPasswordChar(const Value: WideChar); +begin + TntCustomEdit_SetPasswordChar(Self, FPasswordChar, Value); +end; + +function TTntDBEdit.GetText: WideString; +begin + Result := TntControl_GetText(Self); +end; + +procedure TTntDBEdit.SetText(const Value: WideString); +begin + TntControl_SetText(Self, Value); +end; + +procedure TTntDBEdit.DataChange(Sender: TObject); +begin + with THackDBEdit(Self), Self do begin + if Field = nil then + InheritedDataChange(Sender) + else begin + if FAlignment <> Field.Alignment then + begin + EditText := ''; {forces update} + FAlignment := Field.Alignment; + end; + EditMask := Field.EditMask; + if not (csDesigning in ComponentState) then + begin + if (Field.DataType in [ftString, ftWideString]) and (MaxLength = 0) then + MaxLength := Field.Size; + end; + if FFocused and FDataLink.CanModify then + Text := GetWideText(Field) + else + begin + Text := GetWideDisplayText(Field); + if FDataLink.Editing and THackFieldDataLink(FDataLink).FModified then + Modified := True; + end; + end; + end; +end; + +procedure TTntDBEdit.UpdateData(Sender: TObject); +begin + ValidateEdit; + SetWideText(Field, Text); +end; + +procedure TTntDBEdit.CMEnter(var Message: TCMEnter); +var + SaveFarEast: Boolean; +begin + SaveFarEast := SysLocale.FarEast; + try + SysLocale.FarEast := False; + inherited; // inherited tries to work around Win95 FarEast bug, but introduces others + finally + SysLocale.FarEast := SaveFarEast; + end; +end; + +function TTntDBEdit.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TTntDBEdit.GetHint: WideString; +begin + Result := TntControl_GetHint(Self) +end; + +procedure TTntDBEdit.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntDBEdit.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntDBEdit.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +procedure TTntDBEdit.WMPaint(var Message: TWMPaint); +const + AlignStyle : array[Boolean, TAlignment] of DWORD = + ((WS_EX_LEFT, WS_EX_RIGHT, WS_EX_LEFT), + (WS_EX_RIGHT, WS_EX_LEFT, WS_EX_LEFT)); +var + ALeft: Integer; + _Margins: TPoint; + R: TRect; + DC: HDC; + PS: TPaintStruct; + S: WideString; + AAlignment: TAlignment; + I: Integer; +begin + with THackDBEdit(Self), Self do begin + AAlignment := FAlignment; + if UseRightToLeftAlignment then ChangeBiDiModeAlignment(AAlignment); + if ((AAlignment = taLeftJustify) or FFocused) and (not (csPaintCopy in ControlState)) + or (not Win32PlatformIsUnicode) then + begin + inherited; + Exit; + end; + { Since edit controls do not handle justification unless multi-line (and + then only poorly) we will draw right and center justify manually unless + the edit has the focus. } + if FCanvas = nil then + begin + FCanvas := TControlCanvas.Create; + FCanvas.Control := Self; + end; + DC := Message.DC; + if DC = 0 then DC := BeginPaint(Handle, PS); + FCanvas.Handle := DC; + try + FCanvas.Font := Font; + with FCanvas do + begin + R := ClientRect; + if not (NewStyleControls and Ctl3D) and (BorderStyle = bsSingle) then + begin + Brush.Color := clWindowFrame; + FrameRect(R); + InflateRect(R, -1, -1); + end; + Brush.Color := Color; + if not Enabled then + Font.Color := clGrayText; + if (csPaintCopy in ControlState) and (Field <> nil) then + begin + S := GetWideDisplayText(Field); + case CharCase of + ecUpperCase: + S := Tnt_WideUpperCase(S); + ecLowerCase: + S := Tnt_WideLowerCase(S); + end; + end else + S := Text { EditText? }; + if PasswordChar <> #0 then + for I := 1 to Length(S) do S[I] := PasswordChar; + _Margins := GetTextMargins; + case AAlignment of + taLeftJustify: ALeft := _Margins.X; + taRightJustify: ALeft := ClientWidth - WideCanvasTextWidth(FCanvas, S) - _Margins.X - 1; + else + ALeft := (ClientWidth - WideCanvasTextWidth(FCanvas, S)) div 2; + end; + if SysLocale.MiddleEast then UpdateTextFlags; + WideCanvasTextRect(FCanvas, R, ALeft, _Margins.Y, S); + end; + finally + FCanvas.Handle := 0; + if Message.DC = 0 then EndPaint(Handle, PS); + end; + end; +end; + +function TTntDBEdit.GetTextMargins: TPoint; +var + DC: HDC; + SaveFont: HFont; + I: Integer; + SysMetrics, Metrics: TTextMetric; +begin + if NewStyleControls then + begin + if BorderStyle = bsNone then I := 0 else + if Ctl3D then I := 1 else I := 2; + Result.X := SendMessage(Handle, EM_GETMARGINS, 0, 0) and $0000FFFF + I; + Result.Y := I; + end else + begin + if BorderStyle = bsNone then I := 0 else + begin + DC := GetDC(0); + GetTextMetrics(DC, SysMetrics); + SaveFont := SelectObject(DC, Font.Handle); + GetTextMetrics(DC, Metrics); + SelectObject(DC, SaveFont); + ReleaseDC(0, DC); + I := SysMetrics.tmHeight; + if I > Metrics.tmHeight then I := Metrics.tmHeight; + I := I div 4; + end; + Result.X := I; + Result.Y := I; + end; +end; + +{ TTntDBText } + +constructor TTntDBText.Create(AOwner: TComponent); +begin + inherited; + FDataLink := TDataLink(Perform(CM_GETDATALINK, 0, 0)) as TFieldDataLink; + InheritedDataChange := FDataLink.OnDataChange; + FDataLink.OnDataChange := DataChange; +end; + +destructor TTntDBText.Destroy; +begin + FDataLink := nil; + inherited; +end; + +procedure TTntDBText.CMDialogChar(var Message: TCMDialogChar); +begin + TntLabel_CMDialogChar(Self, Message, Caption); +end; + +function TTntDBText.IsCaptionStored: Boolean; +begin + Result := TntControl_IsCaptionStored(Self) +end; + +function TTntDBText.GetCaption: TWideCaption; +begin + Result := TntControl_GetText(Self); +end; + +procedure TTntDBText.SetCaption(const Value: TWideCaption); +begin + TntControl_SetText(Self, Value); +end; + +procedure TTntDBText.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntDBText.GetLabelText: WideString; +begin + if csPaintCopy in ControlState then + Result := GetFieldText + else + Result := Caption; +end; + +procedure TTntDBText.DoDrawText(var Rect: TRect; Flags: Integer); +begin + if not TntLabel_DoDrawText(Self, Rect, Flags, GetLabelText) then + inherited; +end; + +function TTntDBText.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TTntDBText.GetHint: WideString; +begin + Result := TntControl_GetHint(Self) +end; + +procedure TTntDBText.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntDBText.CMHintShow(var Message: TMessage); +begin + ProcessCMHintShowMsg(Message); + inherited; +end; + +procedure TTntDBText.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntDBText.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +function TTntDBText.GetFieldText: WideString; +begin + if Field <> nil then + Result := GetWideDisplayText(Field) + else + if csDesigning in ComponentState then Result := Name else Result := ''; +end; + +procedure TTntDBText.DataChange(Sender: TObject); +begin + Caption := GetFieldText; +end; + +{ TTntCustomDBComboBox } + +constructor TTntCustomDBComboBox.Create(AOwner: TComponent); +begin + inherited; + FItems := TTntComboBoxStrings.Create; + TTntComboBoxStrings(FItems).ComboBox := Self; + FDataLink := TDataLink(Perform(CM_GETDATALINK, 0, 0)) as TFieldDataLink; + FDataLink.OnDataChange := DataChange; + FDataLink.OnUpdateData := UpdateData; + FDataLink.OnEditingChange := EditingChange; +end; + +destructor TTntCustomDBComboBox.Destroy; +begin + FreeAndNil(FItems); + FreeAndNil(FSaveItems); + FDataLink := nil; + inherited; +end; + +procedure TTntCustomDBComboBox.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle(Self, Params, 'COMBOBOX'); +end; + +procedure TTntCustomDBComboBox.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +type + TAccessCustomComboBox = class(TCustomComboBox{TNT-ALLOW TCustomComboBox}); + +procedure TTntCustomDBComboBox.CreateWnd; +var + PreInheritedAnsiText: AnsiString; +begin + PreInheritedAnsiText := TAccessCustomComboBox(Self).Text; + inherited; + TntCombo_AfterInherited_CreateWnd(Self, Items, FSaveItems, FSaveItemIndex, PreInheritedAnsiText); +end; + +procedure TTntCustomDBComboBox.DestroyWnd; +var + SavedText: WideString; +begin + if not (csDestroyingHandle in ControlState) then begin { avoid recursion when parent is TToolBar and system font changes. } + TntCombo_BeforeInherited_DestroyWnd(Self, Items, FSaveItems, ItemIndex, FSaveItemIndex, SavedText); + inherited; + TntControl_SetStoredText(Self, SavedText); + end; +end; + +procedure TTntCustomDBComboBox.SetReadOnly; +begin + if (Style in [csDropDown, csSimple]) and HandleAllocated then + SendMessage(EditHandle, EM_SETREADONLY, Ord(not FDataLink.CanModify), 0); +end; + +procedure TTntCustomDBComboBox.EditingChange(Sender: TObject); +begin + SetReadOnly; +end; + +procedure TTntCustomDBComboBox.CMEnter(var Message: TCMEnter); +var + SaveFarEast: Boolean; +begin + SaveFarEast := SysLocale.FarEast; + try + SysLocale.FarEast := False; + inherited; // inherited tries to work around Win95 FarEast bug, but introduces others + finally + SysLocale.FarEast := SaveFarEast; + end; +end; + +procedure TTntCustomDBComboBox.WndProc(var Message: TMessage); +begin + if (not (csDesigning in ComponentState)) + and (Message.Msg = CB_SHOWDROPDOWN) + and (Message.WParam = 0) + and (not FDataLink.Editing) then begin + DataChange(Self); {Restore text} + Dispatch(Message); {Do NOT call inherited!} + end else + inherited WndProc(Message); +end; + +procedure TTntCustomDBComboBox.ComboWndProc(var Message: TMessage; ComboWnd: HWnd; ComboProc: Pointer); +begin + if not TntCombo_ComboWndProc(Self, Message, ComboWnd, ComboProc, DoEditCharMsg) then + inherited; +end; + +procedure TTntCustomDBComboBox.KeyPress(var Key: AnsiChar); +var + SaveAutoComplete: Boolean; +begin + TntCombo_BeforeKeyPress(Self, SaveAutoComplete); + try + inherited; + finally + TntCombo_AfterKeyPress(Self, SaveAutoComplete); + end; +end; + +procedure TTntCustomDBComboBox.DoEditCharMsg(var Message: TWMChar); +begin + TntCombo_AutoCompleteKeyPress(Self, Items, Message, + GetAutoComplete_UniqueMatchOnly, GetAutoComplete_PreserveDataEntryCase); +end; + +procedure TTntCustomDBComboBox.WMChar(var Message: TWMChar); +begin + TntCombo_AutoSearchKeyPress(Self, Items, Message, FFilter, FLastTime); + inherited; +end; + +function TTntCustomDBComboBox.GetItems: TTntStrings; +begin + Result := FItems; +end; + +procedure TTntCustomDBComboBox.SetItems(const Value: TTntStrings); +begin + FItems.Assign(Value); + DataChange(Self); +end; + +function TTntCustomDBComboBox.GetSelStart: Integer; +begin + Result := TntCombo_GetSelStart(Self); +end; + +procedure TTntCustomDBComboBox.SetSelStart(const Value: Integer); +begin + TntCombo_SetSelStart(Self, Value); +end; + +function TTntCustomDBComboBox.GetSelLength: Integer; +begin + Result := TntCombo_GetSelLength(Self); +end; + +procedure TTntCustomDBComboBox.SetSelLength(const Value: Integer); +begin + TntCombo_SetSelLength(Self, Value); +end; + +function TTntCustomDBComboBox.GetSelText: WideString; +begin + Result := TntCombo_GetSelText(Self); +end; + +procedure TTntCustomDBComboBox.SetSelText(const Value: WideString); +begin + TntCombo_SetSelText(Self, Value); +end; + +function TTntCustomDBComboBox.GetText: WideString; +begin + Result := TntControl_GetText(Self); +end; + +procedure TTntCustomDBComboBox.SetText(const Value: WideString); +begin + TntControl_SetText(Self, Value); +end; + +procedure TTntCustomDBComboBox.CNCommand(var Message: TWMCommand); +begin + if not TntCombo_CNCommand(Self, Items, Message) then + inherited; +end; + +function TTntCustomDBComboBox.GetFieldValue: Variant; +begin + Result := Field.Value; +end; + +procedure TTntCustomDBComboBox.SetFieldValue(const Value: Variant); +begin + Field.Value := Value; +end; + +procedure TTntCustomDBComboBox.DataChange(Sender: TObject); +begin + if not (Style = csSimple) and DroppedDown then Exit; + if Field <> nil then + SetComboValue(GetFieldValue) + else + if csDesigning in ComponentState then + SetComboValue(Name) + else + SetComboValue(Null); +end; + +procedure TTntCustomDBComboBox.UpdateData(Sender: TObject); +begin + SetFieldValue(GetComboValue); +end; + +function TTntCustomDBComboBox.GetAutoComplete_PreserveDataEntryCase: Boolean; +begin + Result := True; +end; + +function TTntCustomDBComboBox.GetAutoComplete_UniqueMatchOnly: Boolean; +begin + Result := False; +end; + +function TTntCustomDBComboBox.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TTntCustomDBComboBox.GetHint: WideString; +begin + Result := TntControl_GetHint(Self) +end; + +procedure TTntCustomDBComboBox.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntCustomDBComboBox.AddItem(const Item: WideString; AObject: TObject); +begin + TntComboBox_AddItem(Items, Item, AObject); +end; + +procedure TTntCustomDBComboBox.CopySelection(Destination: TCustomListControl); +begin + TntComboBox_CopySelection(Items, ItemIndex, Destination); +end; + +procedure TTntCustomDBComboBox.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntCustomDBComboBox.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +{$IFDEF DELPHI_7} // fix for Delphi 7 only +function TTntCustomDBComboBox.GetItemsClass: TCustomComboBoxStringsClass; +begin + Result := TD7PatchedComboBoxStrings; +end; +{$ENDIF} + +{ TTntDBComboBox } + +function TTntDBComboBox.GetFieldValue: Variant; +begin + Result := GetWideText(Field); +end; + +procedure TTntDBComboBox.SetFieldValue(const Value: Variant); +begin + SetWideText(Field, Value); +end; + +procedure TTntDBComboBox.SetComboValue(const Value: Variant); +var + I: Integer; + Redraw: Boolean; + OldValue: WideString; + NewValue: WideString; +begin + OldValue := VarToWideStr(GetComboValue); + NewValue := VarToWideStr(Value); + + if NewValue <> OldValue then + begin + if Style <> csDropDown then + begin + Redraw := (Style <> csSimple) and HandleAllocated; + if Redraw then Items.BeginUpdate; + try + if NewValue = '' then I := -1 else I := Items.IndexOf(NewValue); + ItemIndex := I; + finally + Items.EndUpdate; + end; + if I >= 0 then Exit; + end; + if Style in [csDropDown, csSimple] then Text := NewValue; + end; +end; + +function TTntDBComboBox.GetComboValue: Variant; +var + I: Integer; +begin + if Style in [csDropDown, csSimple] then Result := Text else + begin + I := ItemIndex; + if I < 0 then Result := '' else Result := Items[I]; + end; +end; + +{ TTntDBCheckBox } + +procedure TTntDBCheckBox.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle(Self, Params, 'BUTTON'); +end; + +procedure TTntDBCheckBox.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntDBCheckBox.IsCaptionStored: Boolean; +begin + Result := TntControl_IsCaptionStored(Self); +end; + +function TTntDBCheckBox.GetCaption: TWideCaption; +begin + Result := TntControl_GetText(Self) +end; + +procedure TTntDBCheckBox.SetCaption(const Value: TWideCaption); +begin + TntControl_SetText(Self, Value); +end; + +function TTntDBCheckBox.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TTntDBCheckBox.GetHint: WideString; +begin + Result := TntControl_GetHint(Self) +end; + +procedure TTntDBCheckBox.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntDBCheckBox.Toggle; +var + FDataLink: TDataLink; +begin + inherited; + FDataLink := TDataLink(Perform(CM_GETDATALINK, 0, 0)) as TFieldDataLink; + FDataLink.UpdateRecord; +end; + +procedure TTntDBCheckBox.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntDBCheckBox.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +{ TTntDBRichEdit } + +constructor TTntDBRichEdit.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + inherited ReadOnly := True; + FAutoDisplay := True; + FDataLink := TFieldDataLink.Create; + FDataLink.Control := Self; + FDataLink.OnDataChange := DataChange; + FDataLink.OnEditingChange := EditingChange; + FDataLink.OnUpdateData := UpdateData; +end; + +destructor TTntDBRichEdit.Destroy; +begin + FDataLink.Free; + FDataLink := nil; + inherited Destroy; +end; + +procedure TTntDBRichEdit.Loaded; +begin + inherited Loaded; + if (csDesigning in ComponentState) then + DataChange(Self) +end; + +procedure TTntDBRichEdit.Notification(AComponent: TComponent; Operation: TOperation); +begin + inherited; + if (Operation = opRemove) and (FDataLink <> nil) and + (AComponent = DataSource) then DataSource := nil; +end; + +function TTntDBRichEdit.UseRightToLeftAlignment: Boolean; +begin + Result := DBUseRightToLeftAlignment(Self, Field); +end; + +procedure TTntDBRichEdit.BeginEditing; +begin + if not FDataLink.Editing then + try + if FieldIsBlobLike(Field) then + FDataSave := Field.AsString{TNT-ALLOW AsString}; + FDataLink.Edit; + finally + FDataSave := ''; + end; +end; + +procedure TTntDBRichEdit.KeyDown(var Key: Word; Shift: TShiftState); +begin + inherited KeyDown(Key, Shift); + if FMemoLoaded then + begin + if (Key = VK_DELETE) or (Key = VK_BACK) or + ((Key = VK_INSERT) and (ssShift in Shift)) or + (((Key = Ord('V')) or (Key = Ord('X'))) and (ssCtrl in Shift)) then + BeginEditing; + end; +end; + +procedure TTntDBRichEdit.KeyPress(var Key: AnsiChar); +begin + inherited KeyPress(Key); + if FMemoLoaded then + begin + if (Key in [#32..#255]) and (Field <> nil) and + not Field.IsValidChar(Key) then + begin + MessageBeep(0); + Key := #0; + end; + case Key of + ^H, ^I, ^J, ^M, ^V, ^X, #32..#255: + BeginEditing; + #27: + FDataLink.Reset; + end; + end else + begin + if Key = #13 then LoadMemo; + Key := #0; + end; +end; + +procedure TTntDBRichEdit.Change; +begin + if FMemoLoaded then + FDataLink.Modified; + FMemoLoaded := True; + inherited Change; +end; + +procedure TTntDBRichEdit.CNNotify(var Message: TWMNotify); +begin + inherited; + if Message.NMHdr^.code = EN_PROTECTED then + Message.Result := 0 { allow the operation (otherwise the control might appear stuck) } +end; + +function TTntDBRichEdit.GetDataSource: TDataSource; +begin + Result := FDataLink.DataSource; +end; + +procedure TTntDBRichEdit.SetDataSource(Value: TDataSource); +begin + FDataLink.DataSource := Value; + if Value <> nil then Value.FreeNotification(Self); +end; + +function TTntDBRichEdit.GetDataField: WideString; +begin + Result := FDataLink.FieldName; +end; + +procedure TTntDBRichEdit.SetDataField(const Value: WideString); +begin + FDataLink.FieldName := Value; +end; + +function TTntDBRichEdit.GetReadOnly: Boolean; +begin + Result := FDataLink.ReadOnly; +end; + +procedure TTntDBRichEdit.SetReadOnly(Value: Boolean); +begin + FDataLink.ReadOnly := Value; +end; + +function TTntDBRichEdit.GetField: TField; +begin + Result := FDataLink.Field; +end; + +procedure TTntDBRichEdit.InternalLoadMemo; +var + Stream: TStringStream{TNT-ALLOW TStringStream}; +begin + if PlainText then + Text := GetAsWideString(Field) + else begin + Stream := TStringStream{TNT-ALLOW TStringStream}.Create(Field.AsString{TNT-ALLOW AsString}); + try + Lines.LoadFromStream(Stream); + finally + Stream.Free; + end; + end; +end; + +procedure TTntDBRichEdit.LoadMemo; +begin + if not FMemoLoaded and Assigned(Field) and FieldIsBlobLike(Field) then + begin + try + InternalLoadMemo; + FMemoLoaded := True; + except + { Rich Edit Load failure } + on E:EOutOfResources do + Lines.Text := WideFormat('(%s)', [E.Message]); + end; + EditingChange(Self); + end; +end; + +procedure TTntDBRichEdit.DataChange(Sender: TObject); +begin + if Field <> nil then + if FieldIsBlobLike(Field) then + begin + if FAutoDisplay or (FDataLink.Editing and FMemoLoaded) then + begin + { Check if the data has changed since we read it the first time } + if (FDataSave <> '') and (FDataSave = Field.AsString{TNT-ALLOW AsString}) then Exit; + FMemoLoaded := False; + LoadMemo; + end else + begin + Text := WideFormat('(%s)', [Field.DisplayName]); + FMemoLoaded := False; + end; + end else + begin + if FFocused and FDataLink.CanModify then + Text := GetWideText(Field) + else + Text := GetWideDisplayText(Field); + FMemoLoaded := True; + end + else + begin + if csDesigning in ComponentState then Text := Name else Text := ''; + FMemoLoaded := False; + end; + if HandleAllocated then + RedrawWindow(Handle, nil, 0, RDW_INVALIDATE or RDW_ERASE or RDW_FRAME); +end; + +procedure TTntDBRichEdit.EditingChange(Sender: TObject); +begin + inherited ReadOnly := not (FDataLink.Editing and FMemoLoaded); +end; + +procedure TTntDBRichEdit.InternalSaveMemo; +var + Stream: TStringStream{TNT-ALLOW TStringStream}; +begin + if PlainText then + SetAsWideString(Field, Text) + else begin + Stream := TStringStream{TNT-ALLOW TStringStream}.Create(''); + try + Lines.SaveToStream(Stream); + Field.AsString{TNT-ALLOW AsString} := Stream.DataString; + finally + Stream.Free; + end; + end; +end; + +procedure TTntDBRichEdit.UpdateData(Sender: TObject); +begin + if FieldIsBlobLike(Field) then + InternalSaveMemo + else + SetAsWideString(Field, Text); +end; + +procedure TTntDBRichEdit.SetFocused(Value: Boolean); +begin + if FFocused <> Value then + begin + FFocused := Value; + if not Assigned(Field) or not FieldIsBlobLike(Field) then + FDataLink.Reset; + end; +end; + +procedure TTntDBRichEdit.CMEnter(var Message: TCMEnter); +begin + SetFocused(True); + inherited; +end; + +procedure TTntDBRichEdit.CMExit(var Message: TCMExit); +begin + try + FDataLink.UpdateRecord; + except + SetFocus; + raise; + end; + SetFocused(False); + inherited; +end; + +procedure TTntDBRichEdit.SetAutoDisplay(Value: Boolean); +begin + if FAutoDisplay <> Value then + begin + FAutoDisplay := Value; + if Value then LoadMemo; + end; +end; + +procedure TTntDBRichEdit.WMLButtonDblClk(var Message: TWMLButtonDblClk); +begin + if not FMemoLoaded then LoadMemo else inherited; +end; + +procedure TTntDBRichEdit.WMCut(var Message: TMessage); +begin + BeginEditing; + inherited; +end; + +procedure TTntDBRichEdit.WMPaste(var Message: TMessage); +begin + BeginEditing; + inherited; +end; + +procedure TTntDBRichEdit.CMGetDataLink(var Message: TMessage); +begin + Message.Result := Integer(FDataLink); +end; + +function TTntDBRichEdit.ExecuteAction(Action: TBasicAction): Boolean; +begin + Result := inherited ExecuteAction(Action) or (FDataLink <> nil) and + FDataLink.ExecuteAction(Action); +end; + +function TTntDBRichEdit.UpdateAction(Action: TBasicAction): Boolean; +begin + Result := inherited UpdateAction(Action) or (FDataLink <> nil) and + FDataLink.UpdateAction(Action); +end; + +{ TTntDBMemo } + +constructor TTntDBMemo.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + inherited ReadOnly := True; + ControlStyle := ControlStyle + [csReplicatable]; + FAutoDisplay := True; + FDataLink := TFieldDataLink.Create; + FDataLink.Control := Self; + FDataLink.OnDataChange := DataChange; + FDataLink.OnEditingChange := EditingChange; + FDataLink.OnUpdateData := UpdateData; + FPaintControl := TTntPaintControl.Create(Self, 'EDIT'); +end; + +destructor TTntDBMemo.Destroy; +begin + FPaintControl.Free; + FDataLink.Free; + FDataLink := nil; + inherited Destroy; +end; + +procedure TTntDBMemo.Loaded; +begin + inherited Loaded; + if (csDesigning in ComponentState) then DataChange(Self); +end; + +procedure TTntDBMemo.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited Notification(AComponent, Operation); + if (Operation = opRemove) and (FDataLink <> nil) and + (AComponent = DataSource) then DataSource := nil; +end; + +function TTntDBMemo.UseRightToLeftAlignment: Boolean; +begin + Result := DBUseRightToLeftAlignment(Self, Field); +end; + +procedure TTntDBMemo.KeyDown(var Key: Word; Shift: TShiftState); +begin + inherited KeyDown(Key, Shift); + if FMemoLoaded then + begin + if (Key = VK_DELETE) or ((Key = VK_INSERT) and (ssShift in Shift)) then + FDataLink.Edit; + end; +end; + +procedure TTntDBMemo.KeyPress(var Key: Char{TNT-ALLOW Char}); +begin + inherited KeyPress(Key); + if FMemoLoaded then + begin + if (Key in [#32..#255]) and (FDataLink.Field <> nil) and + not FDataLink.Field.IsValidChar(Key) then + begin + MessageBeep(0); + Key := #0; + end; + case Key of + ^H, ^I, ^J, ^M, ^V, ^X, #32..#255: + FDataLink.Edit; + #27: + FDataLink.Reset; + end; + end else + begin + if Key = #13 then LoadMemo; + Key := #0; + end; +end; + +procedure TTntDBMemo.Change; +begin + if FMemoLoaded then FDataLink.Modified; + FMemoLoaded := True; + inherited Change; +end; + +function TTntDBMemo.GetDataSource: TDataSource; +begin + Result := FDataLink.DataSource; +end; + +procedure TTntDBMemo.SetDataSource(Value: TDataSource); +begin + if not (FDataLink.DataSourceFixed and (csLoading in ComponentState)) then + FDataLink.DataSource := Value; + if Value <> nil then Value.FreeNotification(Self); +end; + +function TTntDBMemo.GetDataField: WideString; +begin + Result := FDataLink.FieldName; +end; + +procedure TTntDBMemo.SetDataField(const Value: WideString); +begin + FDataLink.FieldName := Value; +end; + +function TTntDBMemo.GetReadOnly: Boolean; +begin + Result := FDataLink.ReadOnly; +end; + +procedure TTntDBMemo.SetReadOnly(Value: Boolean); +begin + FDataLink.ReadOnly := Value; +end; + +function TTntDBMemo.GetField: TField; +begin + Result := FDataLink.Field; +end; + +procedure TTntDBMemo.LoadMemo; +begin + if not FMemoLoaded and Assigned(FDataLink.Field) and FieldIsBlobLike(FDataLink.Field) then + begin + try + Lines.Text := GetAsWideString(FDataLink.Field); + FMemoLoaded := True; + except + { Memo too large } + on E:EInvalidOperation do + Lines.Text := WideFormat('(%s)', [E.Message]); + end; + EditingChange(Self); + end; +end; + +procedure TTntDBMemo.DataChange(Sender: TObject); +begin + if FDataLink.Field <> nil then + if FieldIsBlobLike(FDataLink.Field) then + begin + if FAutoDisplay or (FDataLink.Editing and FMemoLoaded) then + begin + FMemoLoaded := False; + LoadMemo; + end else + begin + Text := WideFormat('(%s)', [FDataLink.Field.DisplayName]); + FMemoLoaded := False; + EditingChange(Self); + end; + end else + begin + if FFocused and FDataLink.CanModify then + Text := GetWideText(FDataLink.Field) + else + Text := GetWideDisplayText(FDataLink.Field); + FMemoLoaded := True; + end + else + begin + if csDesigning in ComponentState then Text := Name else Text := ''; + FMemoLoaded := False; + end; + if HandleAllocated then + RedrawWindow(Handle, nil, 0, RDW_INVALIDATE or RDW_ERASE or RDW_FRAME); +end; + +procedure TTntDBMemo.EditingChange(Sender: TObject); +begin + inherited ReadOnly := not (FDataLink.Editing and FMemoLoaded); +end; + +procedure TTntDBMemo.UpdateData(Sender: TObject); +begin + SetAsWideString(FDataLink.Field, Text); +end; + +procedure TTntDBMemo.SetFocused(Value: Boolean); +begin + if FFocused <> Value then + begin + FFocused := Value; + if not Assigned(FDataLink.Field) or not FieldIsBlobLike(FDataLink.Field) then + FDataLink.Reset; + end; +end; + +procedure TTntDBMemo.WndProc(var Message: TMessage); +begin + with Message do + if (Msg = WM_CREATE) or (Msg = WM_WINDOWPOSCHANGED) or + (Msg = CM_FONTCHANGED) then FPaintControl.DestroyHandle; + inherited; +end; + +procedure TTntDBMemo.CMEnter(var Message: TCMEnter); +begin + SetFocused(True); + inherited; +end; + +procedure TTntDBMemo.CMExit(var Message: TCMExit); +begin + try + FDataLink.UpdateRecord; + except + SetFocus; + raise; + end; + SetFocused(False); + inherited; +end; + +procedure TTntDBMemo.SetAutoDisplay(Value: Boolean); +begin + if FAutoDisplay <> Value then + begin + FAutoDisplay := Value; + if Value then LoadMemo; + end; +end; + +procedure TTntDBMemo.WMLButtonDblClk(var Message: TWMLButtonDblClk); +begin + if not FMemoLoaded then LoadMemo else inherited; +end; + +procedure TTntDBMemo.WMCut(var Message: TMessage); +begin + FDataLink.Edit; + inherited; +end; + +procedure TTntDBMemo.WMUndo(var Message: TMessage); +begin + FDataLink.Edit; + inherited; +end; + +procedure TTntDBMemo.WMPaste(var Message: TMessage); +begin + FDataLink.Edit; + inherited; +end; + +procedure TTntDBMemo.CMGetDataLink(var Message: TMessage); +begin + Message.Result := Integer(FDataLink); +end; + +procedure TTntDBMemo.WMPaint(var Message: TWMPaint); +var + S: WideString; +begin + if not (csPaintCopy in ControlState) then + inherited + else begin + if FDataLink.Field <> nil then + if FieldIsBlobLike(FDataLink.Field) then + begin + if FAutoDisplay then + S := TntAdjustLineBreaks(GetAsWideString(FDataLink.Field)) else + S := WideFormat('(%s)', [FDataLink.Field.DisplayName]); + end else + S := GetWideDisplayText(FDataLink.Field); + if (not Win32PlatformIsUnicode) then + SendMessageA(FPaintControl.Handle, WM_SETTEXT, 0, Integer(PAnsiChar(AnsiString(S)))) + else begin + SendMessageW(FPaintControl.Handle, WM_SETTEXT, 0, Integer(PWideChar(S))); + end; + SendMessage(FPaintControl.Handle, WM_ERASEBKGND, Integer(Message.DC), 0); + SendMessage(FPaintControl.Handle, WM_PAINT, Integer(Message.DC), 0); + end; +end; + +function TTntDBMemo.ExecuteAction(Action: TBasicAction): Boolean; +begin + Result := inherited ExecuteAction(Action) or (FDataLink <> nil) and + FDataLink.ExecuteAction(Action); +end; + +function TTntDBMemo.UpdateAction(Action: TBasicAction): Boolean; +begin + Result := inherited UpdateAction(Action) or (FDataLink <> nil) and + FDataLink.UpdateAction(Action); +end; + +{ TTntDBRadioGroup } + +constructor TTntDBRadioGroup.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FDataLink := TFieldDataLink.Create; + FDataLink.Control := Self; + FDataLink.OnDataChange := DataChange; + FDataLink.OnUpdateData := UpdateData; + FValues := TTntStringList.Create; +end; + +destructor TTntDBRadioGroup.Destroy; +begin + FDataLink.Free; + FDataLink := nil; + FValues.Free; + inherited Destroy; +end; + +procedure TTntDBRadioGroup.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited Notification(AComponent, Operation); + if (Operation = opRemove) and (FDataLink <> nil) and + (AComponent = DataSource) then DataSource := nil; +end; + +function TTntDBRadioGroup.UseRightToLeftAlignment: Boolean; +begin + Result := inherited UseRightToLeftAlignment; +end; + +procedure TTntDBRadioGroup.DataChange(Sender: TObject); +begin + if FDataLink.Field <> nil then + Value := GetWideText(FDataLink.Field) else + Value := ''; +end; + +procedure TTntDBRadioGroup.UpdateData(Sender: TObject); +begin + if FDataLink.Field <> nil then + SetWideText(FDataLink.Field, Value); +end; + +function TTntDBRadioGroup.GetDataSource: TDataSource; +begin + Result := FDataLink.DataSource; +end; + +procedure TTntDBRadioGroup.SetDataSource(Value: TDataSource); +begin + FDataLink.DataSource := Value; + if Value <> nil then Value.FreeNotification(Self); +end; + +function TTntDBRadioGroup.GetDataField: WideString; +begin + Result := FDataLink.FieldName; +end; + +procedure TTntDBRadioGroup.SetDataField(const Value: WideString); +begin + FDataLink.FieldName := Value; +end; + +function TTntDBRadioGroup.GetReadOnly: Boolean; +begin + Result := FDataLink.ReadOnly; +end; + +procedure TTntDBRadioGroup.SetReadOnly(Value: Boolean); +begin + FDataLink.ReadOnly := Value; +end; + +function TTntDBRadioGroup.GetField: TField; +begin + Result := FDataLink.Field; +end; + +function TTntDBRadioGroup.GetButtonValue(Index: Integer): WideString; +begin + if (Index < FValues.Count) and (FValues[Index] <> '') then + Result := FValues[Index] + else if Index < Items.Count then + Result := Items[Index] + else + Result := ''; +end; + +procedure TTntDBRadioGroup.SetValue(const Value: WideString); +var + WasFocused: Boolean; + I, Index: Integer; +begin + if FValue <> Value then + begin + FInSetValue := True; + try + WasFocused := (ItemIndex > -1) and (Buttons[ItemIndex].Focused); + Index := -1; + for I := 0 to Items.Count - 1 do + if Value = GetButtonValue(I) then + begin + Index := I; + Break; + end; + ItemIndex := Index; + // Move the focus rect along with the selected index + if WasFocused then + Buttons[ItemIndex].SetFocus; + finally + FInSetValue := False; + end; + FValue := Value; + Change; + end; +end; + +procedure TTntDBRadioGroup.CMExit(var Message: TCMExit); +begin + try + FDataLink.UpdateRecord; + except + if ItemIndex >= 0 then + (Controls[ItemIndex] as TTntRadioButton).SetFocus else + (Controls[0] as TTntRadioButton).SetFocus; + raise; + end; + inherited; +end; + +procedure TTntDBRadioGroup.CMGetDataLink(var Message: TMessage); +begin + Message.Result := Integer(FDataLink); +end; + +procedure TTntDBRadioGroup.Click; +begin + if not FInSetValue then + begin + inherited Click; + if ItemIndex >= 0 then Value := GetButtonValue(ItemIndex); + if FDataLink.Editing then FDataLink.Modified; + end; +end; + +procedure TTntDBRadioGroup.SetItems(Value: TTntStrings); +begin + Items.Assign(Value); + DataChange(Self); +end; + +procedure TTntDBRadioGroup.SetValues(Value: TTntStrings); +begin + FValues.Assign(Value); + DataChange(Self); +end; + +procedure TTntDBRadioGroup.Change; +begin + if Assigned(FOnChange) then FOnChange(Self); +end; + +procedure TTntDBRadioGroup.KeyPress(var Key: Char{TNT-ALLOW Char}); +begin + inherited KeyPress(Key); + case Key of + #8, ' ': FDataLink.Edit; + #27: FDataLink.Reset; + end; +end; + +function TTntDBRadioGroup.CanModify: Boolean; +begin + Result := FDataLink.Edit; +end; + +function TTntDBRadioGroup.ExecuteAction(Action: TBasicAction): Boolean; +begin + Result := inherited ExecuteAction(Action) or (DataLink <> nil) and + DataLink.ExecuteAction(Action); +end; + +function TTntDBRadioGroup.UpdateAction(Action: TBasicAction): Boolean; +begin + Result := inherited UpdateAction(Action) or (DataLink <> nil) and + DataLink.UpdateAction(Action); +end; + +end. diff --git a/internal/1/Source/TntDBGrids.pas b/internal/1/Source/TntDBGrids.pas new file mode 100644 index 0000000..2664bf7 --- /dev/null +++ b/internal/1/Source/TntDBGrids.pas @@ -0,0 +1,1175 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntDBGrids; + +{$INCLUDE TntCompilers.inc} + +interface + +uses + Classes, TntClasses, Controls, Windows, Grids, DBGrids, Messages, DBCtrls, DB, TntStdCtrls; + +type +{TNT-WARN TColumnTitle} + TTntColumnTitle = class(TColumnTitle{TNT-ALLOW TColumnTitle}) + private + FCaption: WideString; + procedure SetInheritedCaption(const Value: AnsiString); + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function IsCaptionStored: Boolean; + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + procedure RestoreDefaults; override; + function DefaultCaption: WideString; + published + property Caption: WideString read GetCaption write SetCaption stored IsCaptionStored; + end; + +{TNT-WARN TColumn} +type + TTntColumn = class(TColumn{TNT-ALLOW TColumn}) + private + FWidePickList: TTntStrings; + function GetWidePickList: TTntStrings; + procedure SetWidePickList(const Value: TTntStrings); + procedure HandlePickListChange(Sender: TObject); + function GetTitle: TTntColumnTitle; + procedure SetTitle(const Value: TTntColumnTitle); + protected + procedure DefineProperties(Filer: TFiler); override; + function CreateTitle: TColumnTitle{TNT-ALLOW TColumnTitle}; override; + public + destructor Destroy; override; + property WidePickList: TTntStrings read GetWidePickList write SetWidePickList; + published +{TNT-WARN PickList} + property PickList{TNT-ALLOW PickList}: TTntStrings read GetWidePickList write SetWidePickList; + property Title: TTntColumnTitle read GetTitle write SetTitle; + end; + + { TDBGridInplaceEdit adds support for a button on the in-place editor, + which can be used to drop down a table-based lookup list, a stringlist-based + pick list, or (if button style is esEllipsis) fire the grid event + OnEditButtonClick. } + +type + TDBGridInplaceEdit{TNT-ALLOW TDBGridInplaceEdit} = class(TInplaceEditList) + private + {$IFDEF COMPILER_6} // verified against VCL source in Delphi 6 and BCB 6 + FDataList: TDBLookupListBox; // 1st field - Delphi/BCB 6 TCustomDBGrid assumes this + FUseDataList: Boolean; // 2nd field - Delphi/BCB 6 TCustomDBGrid assumes this + {$ENDIF} + {$IFDEF DELPHI_7} // verified against VCL source in Delphi 7 + FDataList: TDBLookupListBox; // 1st field - Delphi 7 TCustomDBGrid assumes this + FUseDataList: Boolean; // 2nd field - Delphi 7 TCustomDBGrid assumes this + {$ENDIF} + {$IFDEF DELPHI_9} // verified against VCL source in Delphi 9 + FDataList: TDBLookupListBox; // 1st field - Delphi 9 TCustomDBGrid assumes this + FUseDataList: Boolean; // 2nd field - Delphi 9 TCustomDBGrid assumes this + {$ENDIF} + {$IFDEF DELPHI_10} // verified against VCL source in Delphi 10 + FDataList: TDBLookupListBox; // 1st field - Delphi 10 TCustomDBGrid assumes this + FUseDataList: Boolean; // 2nd field - Delphi 10 TCustomDBGrid assumes this + {$ENDIF} + FLookupSource: TDatasource; + FWidePickListBox: TTntCustomListbox; + function GetWidePickListBox: TTntCustomListbox; + protected + procedure CloseUp(Accept: Boolean); override; + procedure DoEditButtonClick; override; + procedure DropDown; override; + procedure UpdateContents; override; + property UseDataList: Boolean read FUseDataList; + public + constructor Create(Owner: TComponent); override; + property DataList: TDBLookupListBox read FDataList; + property WidePickListBox: TTntCustomListbox read GetWidePickListBox; + end; + +type +{TNT-WARN TDBGridInplaceEdit} + TTntDBGridInplaceEdit = class(TDBGridInplaceEdit{TNT-ALLOW TDBGridInplaceEdit}) + private + FInDblClick: Boolean; + FBlockSetText: Boolean; + procedure WMSetText(var Message: TWMSetText); message WM_SETTEXT; + protected + function GetText: WideString; virtual; + procedure SetText(const Value: WideString); virtual; + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure UpdateContents; override; + procedure DblClick; override; + public + property Text: WideString read GetText write SetText; + end; + +{TNT-WARN TDBGridColumns} + TTntDBGridColumns = class(TDBGridColumns{TNT-ALLOW TDBGridColumns}) + private + function GetColumn(Index: Integer): TTntColumn; + procedure SetColumn(Index: Integer; const Value: TTntColumn); + public + function Add: TTntColumn; + property Items[Index: Integer]: TTntColumn read GetColumn write SetColumn; default; + end; + + TTntGridDataLink = class(TGridDataLink) + private + OriginalSetText: TFieldSetTextEvent; + procedure GridUpdateFieldText(Sender: TField; const Text: AnsiString); + protected + procedure UpdateData; override; + procedure RecordChanged(Field: TField); override; + end; + +{TNT-WARN TCustomDBGrid} + TTntCustomDBGrid = class(TCustomDBGrid{TNT-ALLOW TCustomDBGrid}) + private + FEditText: WideString; + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsHintStored: Boolean; + procedure WMChar(var Msg: TWMChar); message WM_CHAR; + function GetColumns: TTntDBGridColumns; + procedure SetColumns(const Value: TTntDBGridColumns); + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure ShowEditorChar(Ch: WideChar); dynamic; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + function CreateColumns: TDBGridColumns{TNT-ALLOW TDBGridColumns}; override; + property Columns: TTntDBGridColumns read GetColumns write SetColumns; + function CreateEditor: TInplaceEdit{TNT-ALLOW TInplaceEdit}; override; + function CreateDataLink: TGridDataLink; override; + function GetEditText(ACol, ARow: Longint): WideString; reintroduce; + procedure DrawCell(ACol, ARow: Integer; ARect: TRect; AState: TGridDrawState); override; + procedure SetEditText(ACol, ARow: Longint; const Value: AnsiString); override; + public + procedure DefaultDrawColumnCell(const Rect: TRect; DataCol: Integer; + Column: TTntColumn; State: TGridDrawState); dynamic; + procedure DefaultDrawDataCell(const Rect: TRect; Field: TField; + State: TGridDrawState); + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TDBGrid} + TTntDBGrid = class(TTntCustomDBGrid) + public + property Canvas; + property SelectedRows; + published + property Align; + property Anchors; + property BiDiMode; + property BorderStyle; + property Color; + property Columns stored False; //StoreColumns; + property Constraints; + property Ctl3D; + property DataSource; + property DefaultDrawing; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property FixedColor; + property Font; + property ImeMode; + property ImeName; + property Options; + property ParentBiDiMode; + property ParentColor; + property ParentCtl3D; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ReadOnly; + property ShowHint; + property TabOrder; + property TabStop; + property TitleFont; + property Visible; + property OnCellClick; + property OnColEnter; + property OnColExit; + property OnColumnMoved; + property OnDrawDataCell; { obsolete } + property OnDrawColumnCell; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEditButtonClick; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnKeyDown; + property OnKeyPress; + property OnKeyUp; + {$IFDEF COMPILER_9_UP} + property OnMouseActivate; + {$ENDIF} + property OnMouseDown; + {$IFDEF COMPILER_10_UP} + property OnMouseEnter; + property OnMouseLeave; + {$ENDIF} + property OnMouseMove; + property OnMouseUp; + property OnMouseWheel; + property OnMouseWheelDown; + property OnMouseWheelUp; + property OnStartDock; + property OnStartDrag; + property OnTitleClick; + end; + +implementation + +uses + SysUtils, TntControls, Math, Variants, Forms, + TntGraphics, Graphics, TntDB, TntActnList, TntSysUtils, TntWindows; + +{ TTntColumnTitle } + +procedure TTntColumnTitle.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntColumnTitle.DefaultCaption: WideString; +var + Field: TField; +begin + Field := Column.Field; + if Assigned(Field) then + Result := Field.DisplayName + else + Result := Column.FieldName; +end; + +function TTntColumnTitle.IsCaptionStored: Boolean; +begin + Result := (cvTitleCaption in Column.AssignedValues) and + (FCaption <> DefaultCaption); +end; + +procedure TTntColumnTitle.SetInheritedCaption(const Value: AnsiString); +begin + inherited Caption := Value; +end; + +function TTntColumnTitle.GetCaption: WideString; +begin + if cvTitleCaption in Column.AssignedValues then + Result := GetSyncedWideString(FCaption, inherited Caption) + else + Result := DefaultCaption; +end; + +procedure TTntColumnTitle.SetCaption(const Value: WideString); +begin + if not (Column as TTntColumn).IsStored then + inherited Caption := Value + else begin + if (cvTitleCaption in Column.AssignedValues) and (Value = FCaption) then Exit; + SetSyncedWideString(Value, FCaption, inherited Caption, SetInheritedCaption); + end; +end; + +procedure TTntColumnTitle.Assign(Source: TPersistent); +begin + inherited Assign(Source); + if Source is TTntColumnTitle then + begin + if cvTitleCaption in TTntColumnTitle(Source).Column.AssignedValues then + Caption := TTntColumnTitle(Source).Caption; + end; +end; + +procedure TTntColumnTitle.RestoreDefaults; +begin + FCaption := ''; + inherited; +end; + +{ TTntColumn } + +procedure TTntColumn.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntColumn.CreateTitle: TColumnTitle{TNT-ALLOW TColumnTitle}; +begin + Result := TTntColumnTitle.Create(Self); +end; + +function TTntColumn.GetTitle: TTntColumnTitle; +begin + Result := (inherited Title) as TTntColumnTitle; +end; + +procedure TTntColumn.SetTitle(const Value: TTntColumnTitle); +begin + inherited Title := Value; +end; + +function TTntColumn.GetWidePickList: TTntStrings; +begin + if FWidePickList = nil then begin + FWidePickList := TTntStringList.Create; + TTntStringList(FWidePickList).OnChange := HandlePickListChange; + end; + Result := FWidePickList; +end; + +procedure TTntColumn.SetWidePickList(const Value: TTntStrings); +begin + if Value = nil then + begin + FWidePickList.Free; + FWidePickList := nil; + (inherited PickList{TNT-ALLOW PickList}).Clear; + Exit; + end; + WidePickList.Assign(Value); +end; + +procedure TTntColumn.HandlePickListChange(Sender: TObject); +begin + inherited PickList{TNT-ALLOW PickList}.Assign(WidePickList); +end; + +destructor TTntColumn.Destroy; +begin + inherited; + FWidePickList.Free; +end; + +{ TTntPopupListbox } +type + TTntPopupListbox = class(TTntCustomListbox) + private + FSearchText: WideString; + FSearchTickCount: Longint; + protected + procedure CreateParams(var Params: TCreateParams); override; + procedure CreateWnd; override; + procedure WMChar(var Message: TWMChar); message WM_CHAR; + procedure KeyPressW(var Key: WideChar); + procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; + end; + +procedure TTntPopupListbox.CreateParams(var Params: TCreateParams); +begin + inherited CreateParams(Params); + with Params do + begin + Style := Style or WS_BORDER; + ExStyle := WS_EX_TOOLWINDOW or WS_EX_TOPMOST; + AddBiDiModeExStyle(ExStyle); + WindowClass.Style := CS_SAVEBITS; + end; +end; + +procedure TTntPopupListbox.CreateWnd; +begin + inherited CreateWnd; + Windows.SetParent(Handle, 0); + CallWindowProc(DefWndProc, Handle, wm_SetFocus, 0, 0); +end; + +procedure TTntPopupListbox.WMChar(var Message: TWMChar); +var + Key: WideChar; +begin + Key := GetWideCharFromWMCharMsg(Message); + KeyPressW(Key); + SetWideCharForWMCharMsg(Message, Key); + inherited; +end; + +procedure TTntPopupListbox.KeypressW(var Key: WideChar); +var + TickCount: Integer; +begin + case Key of + #8, #27: FSearchText := ''; + #32..High(WideChar): + begin + TickCount := GetTickCount; + if TickCount - FSearchTickCount > 2000 then FSearchText := ''; + FSearchTickCount := TickCount; + if Length(FSearchText) < 32 then FSearchText := FSearchText + Key; + if IsWindowUnicode(Handle) then + SendMessageW(Handle, LB_SelectString, WORD(-1), Longint(PWideChar(FSearchText))) + else + SendMessageA(Handle, LB_SelectString, WORD(-1), Longint(PAnsiChar(AnsiString(FSearchText)))); + Key := #0; + end; + end; +end; + +procedure TTntPopupListbox.MouseUp(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); +begin + inherited MouseUp(Button, Shift, X, Y); + (Owner as TDBGridInplaceEdit{TNT-ALLOW TDBGridInplaceEdit}).CloseUp((X >= 0) and (Y >= 0) and + (X < Width) and (Y < Height)); +end; + +{ TTntPopupDataList } +type + TTntPopupDataList = class(TPopupDataList) + protected + procedure Paint; override; + end; + +procedure TTntPopupDataList.Paint; +var + FRecordIndex: Integer; + FRecordCount: Integer; + FKeySelected: Boolean; + FKeyField: TField; + + procedure UpdateListVars; + begin + if ListActive then + begin + FRecordIndex := ListLink.ActiveRecord; + FRecordCount := ListLink.RecordCount; + FKeySelected := not VarIsNull(KeyValue) or + not ListLink.DataSet.BOF; + end else + begin + FRecordIndex := 0; + FRecordCount := 0; + FKeySelected := False; + end; + + FKeyField := nil; + if ListLink.Active and (KeyField <> '') then + FKeyField := GetFieldProperty(ListLink.DataSet, Self, KeyField); + end; + + function VarEquals(const V1, V2: Variant): Boolean; + begin + Result := False; + try + Result := V1 = V2; + except + end; + end; + +var + I, J, W, X, TxtWidth, TxtHeight, LastFieldIndex: Integer; + S: WideString; + R: TRect; + Selected: Boolean; + Field: TField; + AAlignment: TAlignment; +begin + UpdateListVars; + Canvas.Font := Font; + TxtWidth := WideCanvasTextWidth(Canvas, '0'); + TxtHeight := WideCanvasTextHeight(Canvas, '0'); + LastFieldIndex := ListFields.Count - 1; + if ColorToRGB(Color) <> ColorToRGB(clBtnFace) then + Canvas.Pen.Color := clBtnFace else + Canvas.Pen.Color := clBtnShadow; + for I := 0 to RowCount - 1 do + begin + if Enabled then + Canvas.Font.Color := Font.Color else + Canvas.Font.Color := clGrayText; + Canvas.Brush.Color := Color; + Selected := not FKeySelected and (I = 0); + R.Top := I * TxtHeight; + R.Bottom := R.Top + TxtHeight; + if I < FRecordCount then + begin + ListLink.ActiveRecord := I; + if not VarIsNull(KeyValue) and + VarEquals(FKeyField.Value, KeyValue) then + begin + Canvas.Font.Color := clHighlightText; + Canvas.Brush.Color := clHighlight; + Selected := True; + end; + R.Right := 0; + for J := 0 to LastFieldIndex do + begin + Field := ListFields[J]; + if J < LastFieldIndex then + W := Field.DisplayWidth * TxtWidth + 4 else + W := ClientWidth - R.Right; + S := GetWideDisplayText(Field); + X := 2; + AAlignment := Field.Alignment; + if UseRightToLeftAlignment then ChangeBiDiModeAlignment(AAlignment); + case AAlignment of + taRightJustify: X := W - WideCanvasTextWidth(Canvas, S) - 3; + taCenter: X := (W - WideCanvasTextWidth(Canvas, S)) div 2; + end; + R.Left := R.Right; + R.Right := R.Right + W; + if SysLocale.MiddleEast then TControlCanvas(Canvas).UpdateTextFlags; + WideCanvasTextRect(Canvas, R, R.Left + X, R.Top, S); + if J < LastFieldIndex then + begin + Canvas.MoveTo(R.Right, R.Top); + Canvas.LineTo(R.Right, R.Bottom); + Inc(R.Right); + if R.Right >= ClientWidth then Break; + end; + end; + end; + R.Left := 0; + R.Right := ClientWidth; + if I >= FRecordCount then Canvas.FillRect(R); + if Selected then + Canvas.DrawFocusRect(R); + end; + if FRecordCount <> 0 then ListLink.ActiveRecord := FRecordIndex; +end; + +//----------------------------------------------------------------------------------------- +// TDBGridInplaceEdit - Delphi 6 and higher +//----------------------------------------------------------------------------------------- + +constructor TDBGridInplaceEdit{TNT-ALLOW TDBGridInplaceEdit}.Create(Owner: TComponent); +begin + inherited Create(Owner); + FLookupSource := TDataSource.Create(Self); +end; + +function TDBGridInplaceEdit{TNT-ALLOW TDBGridInplaceEdit}.GetWidePickListBox: TTntCustomListBox; +var + PopupListbox: TTntPopupListbox; +begin + if not Assigned(FWidePickListBox) then + begin + PopupListbox := TTntPopupListbox.Create(Self); + PopupListbox.Visible := False; + PopupListbox.Parent := Self; + PopupListbox.OnMouseUp := ListMouseUp; + PopupListbox.IntegralHeight := True; + PopupListbox.ItemHeight := 11; + FWidePickListBox := PopupListBox; + end; + Result := FWidePickListBox; +end; + +procedure TDBGridInplaceEdit{TNT-ALLOW TDBGridInplaceEdit}.CloseUp(Accept: Boolean); +var + MasterField: TField; + ListValue: Variant; +begin + if ListVisible then + begin + if GetCapture <> 0 then SendMessage(GetCapture, WM_CANCELMODE, 0, 0); + if ActiveList = DataList then + ListValue := DataList.KeyValue + else + if WidePickListBox.ItemIndex <> -1 then + ListValue := WidePickListBox.Items[WidePickListBox.ItemIndex]; + SetWindowPos(ActiveList.Handle, 0, 0, 0, 0, 0, SWP_NOZORDER or + SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE or SWP_HIDEWINDOW); + ListVisible := False; + if Assigned(FDataList) then + FDataList.ListSource := nil; + FLookupSource.Dataset := nil; + Invalidate; + if Accept then + if ActiveList = DataList then + with Grid as TTntCustomDBGrid, Columns[SelectedIndex].Field do + begin + MasterField := DataSet.FieldByName(KeyFields); + if MasterField.CanModify and DataLink.Edit then + MasterField.Value := ListValue; + end + else + if (not VarIsNull(ListValue)) and EditCanModify then + with Grid as TTntCustomDBGrid do + SetWideText(Columns[SelectedIndex].Field, ListValue) + end; +end; + +procedure TDBGridInplaceEdit{TNT-ALLOW TDBGridInplaceEdit}.DoEditButtonClick; +begin + (Grid as TTntCustomDBGrid).EditButtonClick; +end; + +type TAccessTntCustomListbox = class(TTntCustomListbox); + +procedure TDBGridInplaceEdit{TNT-ALLOW TDBGridInplaceEdit}.DropDown; +var + Column: TTntColumn; + I, J, Y: Integer; +begin + if not ListVisible then + begin + with (Grid as TTntCustomDBGrid) do + Column := Columns[SelectedIndex] as TTntColumn; + if ActiveList = FDataList then + with Column.Field do + begin + FDataList.Color := Color; + FDataList.Font := Font; + FDataList.RowCount := Column.DropDownRows; + FLookupSource.DataSet := LookupDataSet; + FDataList.KeyField := LookupKeyFields; + FDataList.ListField := LookupResultField; + FDataList.ListSource := FLookupSource; + FDataList.KeyValue := DataSet.FieldByName(KeyFields).Value; + end + else if ActiveList = WidePickListBox then + begin + WidePickListBox.Items.Assign(Column.WidePickList); + DropDownRows := Column.DropDownRows; + // this is needed as inherited doesn't know about our WidePickListBox + if (DropDownRows > 0) and (WidePickListBox.Items.Count >= DropDownRows) then + WidePickListBox.Height := DropDownRows * TAccessTntCustomListbox(WidePickListBox as TTntCustomListbox).ItemHeight + 4 + else + WidePickListBox.Height := WidePickListBox.Items.Count * TAccessTntCustomListbox(WidePickListBox as TTntCustomListbox).ItemHeight + 4; + if Text = '' then + WidePickListBox.ItemIndex := -1 + else + WidePickListBox.ItemIndex := WidePickListBox.Items.IndexOf(Text); + J := WidePickListBox.ClientWidth; + for I := 0 to WidePickListBox.Items.Count - 1 do + begin + Y := WideCanvasTextWidth(WidePickListBox.Canvas, WidePickListBox.Items[I]); + if Y > J then J := Y; + end; + WidePickListBox.ClientWidth := J; + end; + end; + inherited DropDown; +end; + +procedure TDBGridInplaceEdit{TNT-ALLOW TDBGridInplaceEdit}.UpdateContents; +var + Column: TTntColumn; +begin + inherited UpdateContents; + if EditStyle = esPickList then + ActiveList := WidePickListBox; + if FUseDataList then + begin + if FDataList = nil then + begin + FDataList := TTntPopupDataList.Create(Self); + FDataList.Visible := False; + FDataList.Parent := Self; + FDataList.OnMouseUp := ListMouseUp; + end; + ActiveList := FDataList; + end; + with (Grid as TTntCustomDBGrid) do + Column := Columns[SelectedIndex] as TTntColumn; + Self.ReadOnly := Column.ReadOnly; + Font.Assign(Column.Font); + ImeMode := Column.ImeMode; + ImeName := Column.ImeName; +end; + +//----------------------------------------------------------------------------------------- + +{ TTntDBGridInplaceEdit } + +procedure TTntDBGridInplaceEdit.CreateWindowHandle(const Params: TCreateParams); +begin + TntCustomEdit_CreateWindowHandle(Self, Params); +end; + +function TTntDBGridInplaceEdit.GetText: WideString; +begin + Result := TntControl_GetText(Self); +end; + +procedure TTntDBGridInplaceEdit.SetText(const Value: WideString); +begin + TntControl_SetText(Self, Value); +end; + +procedure TTntDBGridInplaceEdit.WMSetText(var Message: TWMSetText); +begin + if (not FBlockSetText) then + inherited; +end; + +procedure TTntDBGridInplaceEdit.UpdateContents; +var + Grid: TTntCustomDBGrid; +begin + Grid := Self.Grid as TTntCustomDBGrid; + EditMask := Grid.GetEditMask(Grid.Col, Grid.Row); + Text := Grid.GetEditText(Grid.Col, Grid.Row); + MaxLength := Grid.GetEditLimit; + + FBlockSetText := True; + try + inherited; + finally + FBlockSetText := False; + end; +end; + +procedure TTntDBGridInplaceEdit.DblClick; +begin + FInDblClick := True; + try + inherited; + finally + FInDblClick := False; + end; +end; + +{ TTntGridDataLink } + +procedure TTntGridDataLink.GridUpdateFieldText(Sender: TField; const Text: AnsiString); +begin + Sender.OnSetText := OriginalSetText; + if Assigned(Sender) then + SetWideText(Sender, (Grid as TTntCustomDBGrid).FEditText); +end; + +procedure TTntGridDataLink.RecordChanged(Field: TField); +var + CField: TField; +begin + inherited; + if Grid.HandleAllocated then begin + CField := Grid.SelectedField; + if ((Field = nil) or (CField = Field)) and + (Assigned(CField) and (GetWideText(CField) <> (Grid as TTntCustomDBGrid).FEditText)) then + begin + with (Grid as TTntCustomDBGrid) do begin + InvalidateEditor; + if InplaceEditor <> nil then InplaceEditor.Deselect; + end; + end; + end; +end; + +procedure TTntGridDataLink.UpdateData; +var + Field: TField; +begin + Field := (Grid as TTntCustomDBGrid).SelectedField; + // remember "set text" + if Field <> nil then + OriginalSetText := Field.OnSetText; + try + // redirect "set text" to self + if Field <> nil then + Field.OnSetText := GridUpdateFieldText; + inherited; // clear modified ! + finally + // redirect "set text" to field + if Field <> nil then + Field.OnSetText := OriginalSetText; + // forget original "set text" + OriginalSetText := nil; + end; +end; + +{ TTntDBGridColumns } + +function TTntDBGridColumns.Add: TTntColumn; +begin + Result := inherited Add as TTntColumn; +end; + +function TTntDBGridColumns.GetColumn(Index: Integer): TTntColumn; +begin + Result := inherited Items[Index] as TTntColumn; +end; + +procedure TTntDBGridColumns.SetColumn(Index: Integer; const Value: TTntColumn); +begin + inherited Items[Index] := Value; +end; + +{ TTntCustomDBGrid } + +procedure TTntCustomDBGrid.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle(Self, Params, ''); +end; + +type TAccessCustomGrid = class(TCustomGrid); + +procedure TTntCustomDBGrid.WMChar(var Msg: TWMChar); +begin + if (goEditing in TAccessCustomGrid(Self).Options) + and (AnsiChar(Msg.CharCode) in [^H, #32..#255]) then begin + RestoreWMCharMsg(TMessage(Msg)); + ShowEditorChar(WideChar(Msg.CharCode)); + end else + inherited; +end; + +procedure TTntCustomDBGrid.ShowEditorChar(Ch: WideChar); +begin + ShowEditor; + if InplaceEditor <> nil then begin + if Win32PlatformIsUnicode then + PostMessageW(InplaceEditor.Handle, WM_CHAR, Word(Ch), 0) + else + PostMessageA(InplaceEditor.Handle, WM_CHAR, Word(Ch), 0); + end; +end; + +procedure TTntCustomDBGrid.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntCustomDBGrid.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TTntCustomDBGrid.GetHint: WideString; +begin + Result := TntControl_GetHint(Self) +end; + +procedure TTntCustomDBGrid.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +function TTntCustomDBGrid.CreateColumns: TDBGridColumns{TNT-ALLOW TDBGridColumns}; +begin + Result := TTntDBGridColumns.Create(Self, TTntColumn); +end; + +function TTntCustomDBGrid.GetColumns: TTntDBGridColumns; +begin + Result := inherited Columns as TTntDBGridColumns; +end; + +procedure TTntCustomDBGrid.SetColumns(const Value: TTntDBGridColumns); +begin + inherited Columns := Value; +end; + +function TTntCustomDBGrid.CreateEditor: TInplaceEdit{TNT-ALLOW TInplaceEdit}; +begin + Result := TTntDBGridInplaceEdit.Create(Self); +end; + +function TTntCustomDBGrid.CreateDataLink: TGridDataLink; +begin + Result := TTntGridDataLink.Create(Self); +end; + +function TTntCustomDBGrid.GetEditText(ACol, ARow: Integer): WideString; +var + Field: TField; +begin + Field := GetColField(RawToDataColumn(ACol)); + if Field = nil then + Result := '' + else + Result := GetWideText(Field); + FEditText := Result; +end; + +procedure TTntCustomDBGrid.SetEditText(ACol, ARow: Integer; const Value: AnsiString); +begin + if (InplaceEditor as TTntDBGridInplaceEdit).FInDblClick then + FEditText := Value + else + FEditText := (InplaceEditor as TTntDBGridInplaceEdit).Text; + inherited; +end; + +//----------------- DRAW CELL PROCS -------------------------------------------------- +var + DrawBitmap: TBitmap = nil; + +procedure WriteText(ACanvas: TCanvas; ARect: TRect; DX, DY: Integer; + const Text: WideString; Alignment: TAlignment; ARightToLeft: Boolean); +const + AlignFlags : array [TAlignment] of Integer = + ( DT_LEFT or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX, + DT_RIGHT or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX, + DT_CENTER or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX ); + RTL: array [Boolean] of Integer = (0, DT_RTLREADING); +var + B, R: TRect; + Hold, Left: Integer; + I: TColorRef; +begin + I := ColorToRGB(ACanvas.Brush.Color); + if GetNearestColor(ACanvas.Handle, I) = I then + begin { Use ExtTextOutW for solid colors } + { In BiDi, because we changed the window origin, the text that does not + change alignment, actually gets its alignment changed. } + if (ACanvas.CanvasOrientation = coRightToLeft) and (not ARightToLeft) then + ChangeBiDiModeAlignment(Alignment); + case Alignment of + taLeftJustify: + Left := ARect.Left + DX; + taRightJustify: + Left := ARect.Right - WideCanvasTextWidth(ACanvas, Text) - 3; + else { taCenter } + Left := ARect.Left + (ARect.Right - ARect.Left) div 2 + - (WideCanvasTextWidth(ACanvas, Text) div 2); + end; + WideCanvasTextRect(ACanvas, ARect, Left, ARect.Top + DY, Text); + end + else begin { Use FillRect and Drawtext for dithered colors } + DrawBitmap.Canvas.Lock; + try + with DrawBitmap, ARect do { Use offscreen bitmap to eliminate flicker and } + begin { brush origin tics in painting / scrolling. } + Width := Max(Width, Right - Left); + Height := Max(Height, Bottom - Top); + R := Rect(DX, DY, Right - Left - 1, Bottom - Top - 1); + B := Rect(0, 0, Right - Left, Bottom - Top); + end; + with DrawBitmap.Canvas do + begin + Font := ACanvas.Font; + Font.Color := ACanvas.Font.Color; + Brush := ACanvas.Brush; + Brush.Style := bsSolid; + FillRect(B); + SetBkMode(Handle, TRANSPARENT); + if (ACanvas.CanvasOrientation = coRightToLeft) then + ChangeBiDiModeAlignment(Alignment); + Tnt_DrawTextW(Handle, PWideChar(Text), Length(Text), R, + AlignFlags[Alignment] or RTL[ARightToLeft]); + end; + if (ACanvas.CanvasOrientation = coRightToLeft) then + begin + Hold := ARect.Left; + ARect.Left := ARect.Right; + ARect.Right := Hold; + end; + ACanvas.CopyRect(ARect, DrawBitmap.Canvas, B); + finally + DrawBitmap.Canvas.Unlock; + end; + end; +end; + +procedure TTntCustomDBGrid.DefaultDrawDataCell(const Rect: TRect; Field: TField; + State: TGridDrawState); +var + Alignment: TAlignment; + Value: WideString; +begin + Alignment := taLeftJustify; + Value := ''; + if Assigned(Field) then + begin + Alignment := Field.Alignment; + Value := GetWideDisplayText(Field); + end; + WriteText(Canvas, Rect, 2, 2, Value, Alignment, + UseRightToLeftAlignmentForField(Field, Alignment)); +end; + +procedure TTntCustomDBGrid.DefaultDrawColumnCell(const Rect: TRect; + DataCol: Integer; Column: TTntColumn; State: TGridDrawState); +var + Value: WideString; +begin + Value := ''; + if Assigned(Column.Field) then + Value := GetWideDisplayText(Column.Field); + WriteText(Canvas, Rect, 2, 2, Value, Column.Alignment, + UseRightToLeftAlignmentForField(Column.Field, Column.Alignment)); +end; + +procedure TTntCustomDBGrid.DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); +var + FrameOffs: Byte; + + procedure DrawTitleCell(ACol, ARow: Integer; Column: TTntColumn; var AState: TGridDrawState); + const + ScrollArrows: array [Boolean, Boolean] of Integer = + ((DFCS_SCROLLRIGHT, DFCS_SCROLLLEFT), (DFCS_SCROLLLEFT, DFCS_SCROLLRIGHT)); + var + MasterCol: TColumn{TNT-ALLOW TColumn}; + TitleRect, TxtRect, ButtonRect: TRect; + I: Integer; + InBiDiMode: Boolean; + begin + TitleRect := CalcTitleRect(Column, ARow, MasterCol); + + if MasterCol = nil then + begin + Canvas.FillRect(ARect); + Exit; + end; + + Canvas.Font := MasterCol.Title.Font; + Canvas.Brush.Color := MasterCol.Title.Color; + if [dgRowLines, dgColLines] * Options = [dgRowLines, dgColLines] then + InflateRect(TitleRect, -1, -1); + TxtRect := TitleRect; + I := GetSystemMetrics(SM_CXHSCROLL); + if ((TxtRect.Right - TxtRect.Left) > I) and MasterCol.Expandable then + begin + Dec(TxtRect.Right, I); + ButtonRect := TitleRect; + ButtonRect.Left := TxtRect.Right; + I := SaveDC(Canvas.Handle); + try + Canvas.FillRect(ButtonRect); + InflateRect(ButtonRect, -1, -1); + IntersectClipRect(Canvas.Handle, ButtonRect.Left, + ButtonRect.Top, ButtonRect.Right, ButtonRect.Bottom); + InflateRect(ButtonRect, 1, 1); + { DrawFrameControl doesn't draw properly when orienatation has changed. + It draws as ExtTextOutW does. } + InBiDiMode := Canvas.CanvasOrientation = coRightToLeft; + if InBiDiMode then { stretch the arrows box } + Inc(ButtonRect.Right, GetSystemMetrics(SM_CXHSCROLL) + 4); + DrawFrameControl(Canvas.Handle, ButtonRect, DFC_SCROLL, + ScrollArrows[InBiDiMode, MasterCol.Expanded] or DFCS_FLAT); + finally + RestoreDC(Canvas.Handle, I); + end; + end; + with (MasterCol.Title as TTntColumnTitle) do + WriteText(Canvas, TxtRect, FrameOffs, FrameOffs, Caption, Alignment, IsRightToLeft); + if [dgRowLines, dgColLines] * Options = [dgRowLines, dgColLines] then + begin + InflateRect(TitleRect, 1, 1); + DrawEdge(Canvas.Handle, TitleRect, BDR_RAISEDINNER, BF_BOTTOMRIGHT); + DrawEdge(Canvas.Handle, TitleRect, BDR_RAISEDINNER, BF_TOPLEFT); + end; + AState := AState - [gdFixed]; // prevent box drawing later + end; + +var + OldActive: Integer; + Highlight: Boolean; + Value: WideString; + DrawColumn: TTntColumn; +begin + if csLoading in ComponentState then + begin + Canvas.Brush.Color := Color; + Canvas.FillRect(ARect); + Exit; + end; + + if (gdFixed in AState) and (RawToDataColumn(ACol) < 0) then + begin + inherited; + exit; + end; + + Dec(ARow, FixedRows); + ACol := RawToDataColumn(ACol); + + if (gdFixed in AState) and ([dgRowLines, dgColLines] * Options = + [dgRowLines, dgColLines]) then + begin + InflateRect(ARect, -1, -1); + FrameOffs := 1; + end + else + FrameOffs := 2; + + with Canvas do + begin + DrawColumn := Columns[ACol] as TTntColumn; + if not DrawColumn.Showing then Exit; + if not (gdFixed in AState) then + begin + Font := DrawColumn.Font; + Brush.Color := DrawColumn.Color; + end; + if ARow < 0 then + DrawTitleCell(ACol, ARow + FixedRows, DrawColumn, AState) + else if (DataLink = nil) or not DataLink.Active then + FillRect(ARect) + else + begin + Value := ''; + OldActive := DataLink.ActiveRecord; + try + DataLink.ActiveRecord := ARow; + if Assigned(DrawColumn.Field) then + Value := GetWideDisplayText(DrawColumn.Field); + Highlight := HighlightCell(ACol, ARow, Value, AState); + if Highlight then + begin + Brush.Color := clHighlight; + Font.Color := clHighlightText; + end; + if not Enabled then + Font.Color := clGrayText; + if DefaultDrawing then + DefaultDrawColumnCell(ARect, ACol, DrawColumn, AState); + if Columns.State = csDefault then + DrawDataCell(ARect, DrawColumn.Field, AState); + DrawColumnCell(ARect, ACol, DrawColumn, AState); + finally + DataLink.ActiveRecord := OldActive; + end; + if DefaultDrawing and (gdSelected in AState) + and ((dgAlwaysShowSelection in Options) or Focused) + and not (csDesigning in ComponentState) + and not (dgRowSelect in Options) + and (UpdateLock = 0) + and (ValidParentForm(Self).ActiveControl = Self) then + Windows.DrawFocusRect(Handle, ARect); + end; + end; + if (gdFixed in AState) and ([dgRowLines, dgColLines] * Options = + [dgRowLines, dgColLines]) then + begin + InflateRect(ARect, 1, 1); + DrawEdge(Canvas.Handle, ARect, BDR_RAISEDINNER, BF_BOTTOMRIGHT); + DrawEdge(Canvas.Handle, ARect, BDR_RAISEDINNER, BF_TOPLEFT); + end; +end; + +procedure TTntCustomDBGrid.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntCustomDBGrid.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +initialization + DrawBitmap := TBitmap.Create; + +finalization + DrawBitmap.Free; + +end. diff --git a/internal/1/Source/TntDBLogDlg.dfm b/internal/1/Source/TntDBLogDlg.dfm new file mode 100644 index 0000000..fd0a071 --- /dev/null +++ b/internal/1/Source/TntDBLogDlg.dfm @@ -0,0 +1,108 @@ +object TntLoginDialog: TTntLoginDialog + Left = 307 + Top = 131 + ActiveControl = Password + BorderStyle = bsDialog + Caption = 'Database Login' + ClientHeight = 147 + ClientWidth = 273 + Color = clBtnFace + ParentFont = True + + Position = poScreenCenter + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object OKButton: TTntButton + Left = 109 + Top = 114 + Width = 75 + Height = 25 + Caption = '&OK' + Default = True + ModalResult = 1 + TabOrder = 0 + end + object CancelButton: TTntButton + Left = 190 + Top = 114 + Width = 75 + Height = 25 + Cancel = True + Caption = 'Cancel' + ModalResult = 2 + TabOrder = 1 + end + object Panel: TTntPanel + Left = 8 + Top = 7 + Width = 257 + Height = 98 + BevelInner = bvRaised + BevelOuter = bvLowered + TabOrder = 2 + object Label3: TTntLabel + Left = 10 + Top = 6 + Width = 50 + Height = 13 + Caption = 'Database:' + end + object DatabaseName: TTntLabel + Left = 91 + Top = 6 + Width = 3 + Height = 13 + end + object Bevel: TTntBevel + Left = 1 + Top = 24 + Width = 254 + Height = 9 + Shape = bsTopLine + end + object Panel1: TTntPanel + Left = 2 + Top = 31 + Width = 253 + Height = 65 + Align = alBottom + BevelOuter = bvNone + TabOrder = 0 + object Label1: TTntLabel + Left = 8 + Top = 8 + Width = 56 + Height = 13 + Caption = '&User Name:' + FocusControl = UserName + end + object Label2: TTntLabel + Left = 8 + Top = 36 + Width = 50 + Height = 13 + Caption = '&Password:' + FocusControl = Password + end + object UserName: TTntEdit + Left = 86 + Top = 5 + Width = 153 + Height = 21 + MaxLength = 31 + TabOrder = 0 + end + object Password: TTntEdit + Left = 86 + Top = 33 + Width = 153 + Height = 21 + MaxLength = 31 + PasswordCharW = #9679 + TabOrder = 1 + PasswordChar_UTF7 = '+Jc8' + end + end + end +end diff --git a/internal/1/Source/TntDBLogDlg.pas b/internal/1/Source/TntDBLogDlg.pas new file mode 100644 index 0000000..c8747e2 --- /dev/null +++ b/internal/1/Source/TntDBLogDlg.pas @@ -0,0 +1,133 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntDBLogDlg; + +{$INCLUDE TntCompilers.inc} + +interface + +uses + SysUtils, Windows, Messages, Classes, Graphics, + TntForms, TntStdCtrls, TntExtCtrls, StdCtrls, ExtCtrls, Controls; + +type + TTntLoginDialog = class(TTntForm) + Panel: TTntPanel; + Bevel: TTntBevel; + DatabaseName: TTntLabel; + OKButton: TTntButton; + CancelButton: TTntButton; + Panel1: TTntPanel; + Label1: TTntLabel; + Label2: TTntLabel; + Label3: TTntLabel; + Password: TTntEdit; + UserName: TTntEdit; + procedure FormShow(Sender: TObject); + end; + +{TNT-WARN LoginDialog} +function TntLoginDialog(const ADatabaseName: WideString; + var AUserName, APassword: WideString): Boolean; + +{TNT-WARN LoginDialogEx} +function TntLoginDialogEx(const ADatabaseName: WideString; + var AUserName, APassword: WideString; NameReadOnly: Boolean): Boolean; + +{TNT-WARN RemoteLoginDialog} +function TntRemoteLoginDialog(var AUserName, APassword: WideString): Boolean; + +implementation + +{$R *.dfm} + +uses + Forms, VDBConsts; + +function TntLoginDialog(const ADatabaseName: WideString; + var AUserName, APassword: WideString): Boolean; +begin + with TTntLoginDialog.Create(Application) do + try + DatabaseName.Caption := ADatabaseName; + UserName.Text := AUserName; + Result := False; + if AUserName = '' then ActiveControl := UserName; + if ShowModal = mrOk then + begin + AUserName := UserName.Text; + APassword := Password.Text; + Result := True; + end; + finally + Free; + end; +end; + +function TntLoginDialogEx(const ADatabaseName: WideString; + var AUserName, APassword: WideString; NameReadOnly: Boolean): Boolean; +begin + with TTntLoginDialog.Create(Application) do + try + DatabaseName.Caption := ADatabaseName; + UserName.Text := AUserName; + Result := False; + if NameReadOnly then + UserName.Enabled := False + else + if AUserName = '' then ActiveControl := UserName; + if ShowModal = mrOk then + begin + AUserName := UserName.Text; + APassword := Password.Text; + Result := True; + end; + finally + Free; + end; +end; + +function TntRemoteLoginDialog(var AUserName, APassword: WideString): Boolean; +begin + with TTntLoginDialog.Create(Application) do + try + Caption := SRemoteLogin; + Bevel.Visible := False; + DatabaseName.Visible := False; + Label3.Visible := False; + Panel.Height := Panel.Height - Bevel.Top; + OKButton.Top := OKButton.Top - Bevel.Top; + CancelButton.Top := CancelButton.Top - Bevel.Top; + Height := Height - Bevel.Top; + UserName.Text := AUserName; + Result := False; + if AUserName = '' then ActiveControl := UserName; + if ShowModal = mrOk then + begin + AUserName := UserName.Text; + APassword := Password.Text; + Result := True; + end; + finally + Free; + end; +end; + +{ TTntLoginDialog } + +procedure TTntLoginDialog.FormShow(Sender: TObject); +begin + if (DatabaseName.Width + DatabaseName.Left) >= Panel.ClientWidth then + DatabaseName.Width := (Panel.ClientWidth - DatabaseName.Left) - 5; +end; + +end. diff --git a/internal/1/Source/TntDialogs.pas b/internal/1/Source/TntDialogs.pas new file mode 100644 index 0000000..0c06d07 --- /dev/null +++ b/internal/1/Source/TntDialogs.pas @@ -0,0 +1,981 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntDialogs; + +{$INCLUDE TntCompilers.inc} + +interface + +{ TODO: TFindDialog and TReplaceDialog. } +{ TODO: Property editor for TTntOpenDialog.Filter } + +uses + Classes, Messages, CommDlg, Windows, Dialogs, + TntClasses, TntForms, TntSysUtils; + +type +{TNT-WARN TIncludeItemEvent} + TIncludeItemEventW = procedure (const OFN: TOFNotifyExW; var Include: Boolean) of object; + +{TNT-WARN TOpenDialog} + TTntOpenDialog = class(TOpenDialog{TNT-ALLOW TOpenDialog}) + private + FDefaultExt: WideString; + FFileName: TWideFileName; + FFilter: WideString; + FInitialDir: WideString; + FTitle: WideString; + FFiles: TTntStrings; + FOnIncludeItem: TIncludeItemEventW; + function GetDefaultExt: WideString; + procedure SetInheritedDefaultExt(const Value: AnsiString); + procedure SetDefaultExt(const Value: WideString); + function GetFileName: TWideFileName; + procedure SetFileName(const Value: TWideFileName); + function GetFilter: WideString; + procedure SetInheritedFilter(const Value: AnsiString); + procedure SetFilter(const Value: WideString); + function GetInitialDir: WideString; + procedure SetInheritedInitialDir(const Value: AnsiString); + procedure SetInitialDir(const Value: WideString); + function GetTitle: WideString; + procedure SetInheritedTitle(const Value: AnsiString); + procedure SetTitle(const Value: WideString); + function GetFiles: TTntStrings; + private + FProxiedOpenFilenameA: TOpenFilenameA; + protected + FAllowDoCanClose: Boolean; + procedure DefineProperties(Filer: TFiler); override; + function CanCloseW(var OpenFileName: TOpenFileNameW): Boolean; + function DoCanClose: Boolean; override; + procedure GetFileNamesW(var OpenFileName: TOpenFileNameW); + procedure DoIncludeItem(const OFN: TOFNotifyEx; var Include: Boolean); override; + procedure WndProc(var Message: TMessage); override; + function DoExecuteW(Func: Pointer; ParentWnd: HWND): Bool; overload; + function DoExecuteW(Func: Pointer): Bool; overload; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + function Execute: Boolean; override; + {$IFDEF COMPILER_9_UP} + function Execute(ParentWnd: HWND): Boolean; override; + {$ENDIF} + property Files: TTntStrings read GetFiles; + published + property DefaultExt: WideString read GetDefaultExt write SetDefaultExt; + property FileName: TWideFileName read GetFileName write SetFileName; + property Filter: WideString read GetFilter write SetFilter; + property InitialDir: WideString read GetInitialDir write SetInitialDir; + property Title: WideString read GetTitle write SetTitle; + property OnIncludeItem: TIncludeItemEventW read FOnIncludeItem write FOnIncludeItem; + end; + +{TNT-WARN TSaveDialog} + TTntSaveDialog = class(TTntOpenDialog) + public + function Execute: Boolean; override; + {$IFDEF COMPILER_9_UP} + function Execute(ParentWnd: HWND): Boolean; override; + {$ENDIF} + end; + +{ Message dialog } + +{TNT-WARN CreateMessageDialog} +function WideCreateMessageDialog(const Msg: WideString; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons): TTntForm;overload; +function WideCreateMessageDialog(const Msg: WideString; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; DefaultButton: TMsgDlgBtn): TTntForm; overload; + +{TNT-WARN MessageDlg} +function WideMessageDlg(const Msg: WideString; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer; overload; +function WideMessageDlg(const Msg: WideString; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; DefaultButton: TMsgDlgBtn): Integer; overload; + +{TNT-WARN MessageDlgPos} +function WideMessageDlgPos(const Msg: WideString; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer): Integer; overload; +function WideMessageDlgPos(const Msg: WideString; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer; DefaultButton: TMsgDlgBtn): Integer; overload; + +{TNT-WARN MessageDlgPosHelp} +function WideMessageDlgPosHelp(const Msg: WideString; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer; + const HelpFileName: WideString): Integer; overload; +function WideMessageDlgPosHelp(const Msg: WideString; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer; + const HelpFileName: WideString; DefaultButton: TMsgDlgBtn): Integer; overload; + +{TNT-WARN ShowMessage} +procedure WideShowMessage(const Msg: WideString); +{TNT-WARN ShowMessageFmt} +procedure WideShowMessageFmt(const Msg: WideString; Params: array of const); +{TNT-WARN ShowMessagePos} +procedure WideShowMessagePos(const Msg: WideString; X, Y: Integer); + +{ Input dialog } + +{TNT-WARN InputQuery} +function WideInputQuery(const ACaption, APrompt: WideString; + var Value: WideString): Boolean; +{TNT-WARN InputBox} +function WideInputBox(const ACaption, APrompt, ADefault: WideString): WideString; + +{TNT-WARN PromptForFileName} +function WidePromptForFileName(var AFileName: WideString; const AFilter: WideString = ''; + const ADefaultExt: WideString = ''; const ATitle: WideString = ''; + const AInitialDir: WideString = ''; SaveDialog: Boolean = False): Boolean; + +function GetModalParentWnd: HWND; + +implementation + +uses + Controls, Forms, Types, SysUtils, Graphics, Consts, Math, + TntWindows, TntStdCtrls, TntClipBrd, TntExtCtrls, + {$IFDEF COMPILER_9_UP} WideStrUtils, {$ENDIF} TntWideStrUtils; + +function GetModalParentWnd: HWND; +begin + {$IFDEF COMPILER_9} + Result := Application.ActiveFormHandle; + {$ELSE} + Result := 0; + {$ENDIF} + {$IFDEF COMPILER_10_UP} + if Application.ModalPopupMode <> pmNone then + begin + Result := Application.ActiveFormHandle; + end; + {$ENDIF} + if Result = 0 then begin + Result := Application.Handle; + end; +end; + +var + ProxyExecuteDialog: TTntOpenDialog; + +function ProxyGetOpenFileNameA(var OpenFile: TOpenFilename): Bool; stdcall; +begin + ProxyExecuteDialog.FProxiedOpenFilenameA := OpenFile; + Result := False; { as if user hit "Cancel". } +end; + +{ TTntOpenDialog } + +constructor TTntOpenDialog.Create(AOwner: TComponent); +begin + inherited; + FFiles := TTntStringList.Create; +end; + +destructor TTntOpenDialog.Destroy; +begin + FreeAndNil(FFiles); + inherited; +end; + +procedure TTntOpenDialog.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntOpenDialog.GetDefaultExt: WideString; +begin + Result := GetSyncedWideString(FDefaultExt, inherited DefaultExt); +end; + +procedure TTntOpenDialog.SetInheritedDefaultExt(const Value: AnsiString); +begin + inherited DefaultExt := Value; +end; + +procedure TTntOpenDialog.SetDefaultExt(const Value: WideString); +begin + SetSyncedWideString(Value, FDefaultExt, inherited DefaultExt, SetInheritedDefaultExt); +end; + +function TTntOpenDialog.GetFileName: TWideFileName; +var + Path: array[0..MAX_PATH] of WideChar; +begin + if Win32PlatformIsUnicode and NewStyleControls and (Handle <> 0) then begin + // get filename from handle + SendMessageW(GetParent(Handle), CDM_GETFILEPATH, SizeOf(Path), Integer(@Path)); + Result := Path; + end else + Result := GetSyncedWideString(WideString(FFileName), inherited FileName); +end; + +procedure TTntOpenDialog.SetFileName(const Value: TWideFileName); +begin + FFileName := Value; + inherited FileName := Value; +end; + +function TTntOpenDialog.GetFilter: WideString; +begin + Result := GetSyncedWideString(FFilter, inherited Filter); +end; + +procedure TTntOpenDialog.SetInheritedFilter(const Value: AnsiString); +begin + inherited Filter := Value; +end; + +procedure TTntOpenDialog.SetFilter(const Value: WideString); +begin + SetSyncedWideString(Value, FFilter, inherited Filter, SetInheritedFilter); +end; + +function TTntOpenDialog.GetInitialDir: WideString; +begin + Result := GetSyncedWideString(FInitialDir, inherited InitialDir); +end; + +procedure TTntOpenDialog.SetInheritedInitialDir(const Value: AnsiString); +begin + inherited InitialDir := Value; +end; + +procedure TTntOpenDialog.SetInitialDir(const Value: WideString); + + function RemoveTrailingPathDelimiter(const Value: WideString): WideString; + var + L: Integer; + begin + // remove trailing path delimiter (except 'C:\') + L := Length(Value); + if (L > 1) and WideIsPathDelimiter(Value, L) and not WideIsDelimiter(':', Value, L - 1) then + Dec(L); + Result := Copy(Value, 1, L); + end; + +begin + SetSyncedWideString(RemoveTrailingPathDelimiter(Value), FInitialDir, + inherited InitialDir, SetInheritedInitialDir); +end; + +function TTntOpenDialog.GetTitle: WideString; +begin + Result := GetSyncedWideString(FTitle, inherited Title) +end; + +procedure TTntOpenDialog.SetInheritedTitle(const Value: AnsiString); +begin + inherited Title := Value; +end; + +procedure TTntOpenDialog.SetTitle(const Value: WideString); +begin + SetSyncedWideString(Value, FTitle, inherited Title, SetInheritedTitle); +end; + +function TTntOpenDialog.GetFiles: TTntStrings; +begin + if (not Win32PlatformIsUnicode) then + FFiles.Assign(inherited Files); + Result := FFiles; +end; + +function TTntOpenDialog.DoCanClose: Boolean; +begin + if FAllowDoCanClose then + Result := inherited DoCanClose + else + Result := True; +end; + +function TTntOpenDialog.CanCloseW(var OpenFileName: TOpenFileNameW): Boolean; +begin + GetFileNamesW(OpenFileName); + FAllowDoCanClose := True; + try + Result := DoCanClose; + finally + FAllowDoCanClose := False; + end; + FFiles.Clear; + inherited Files.Clear; +end; + +procedure TTntOpenDialog.DoIncludeItem(const OFN: TOFNotifyEx; var Include: Boolean); +begin + // CDN_INCLUDEITEM -> DoIncludeItem() is only be available on Windows 2000 + + // Therefore, just cast OFN as a TOFNotifyExW, since that's what it really is. + if Win32PlatformIsUnicode and Assigned(FOnIncludeItem) then + FOnIncludeItem(TOFNotifyExW(OFN), Include) +end; + +procedure TTntOpenDialog.WndProc(var Message: TMessage); +begin + Message.Result := 0; + if (Message.Msg = WM_INITDIALOG) and not (ofOldStyleDialog in Options) then begin + { If not ofOldStyleDialog then DoShow on CDN_INITDONE, not WM_INITDIALOG } + Exit; + end; + if Win32PlatformIsUnicode + and (Message.Msg = WM_NOTIFY) then begin + case (POFNotify(Message.LParam)^.hdr.code) of + CDN_FILEOK: + if not CanCloseW(POFNotifyW(Message.LParam)^.lpOFN^) then + begin + Message.Result := 1; + SetWindowLong(Handle, DWL_MSGRESULT, Message.Result); + Exit; + end; + end; + end; + inherited WndProc(Message); +end; + +function TTntOpenDialog.DoExecuteW(Func: Pointer): Bool; +begin + Result := DoExecuteW(Func, GetModalParentWnd); +end; + +function TTntOpenDialog.DoExecuteW(Func: Pointer; ParentWnd: HWND): Bool; +var + OpenFilename: TOpenFilenameW; + + function GetResNamePtr(var ScopedStringStorage: WideString; lpszName: PAnsiChar): PWideChar; + // duplicated from TntTrxResourceUtils.pas + begin + if Tnt_Is_IntResource(PWideChar(lpszName)) then + Result := PWideChar(lpszName) + else begin + ScopedStringStorage := lpszName; + Result := PWideChar(ScopedStringStorage); + end; + end; + + function AllocFilterStr(const S: WideString): WideString; + var + P: PWideChar; + begin + Result := ''; + if S <> '' then + begin + Result := S + #0#0; // double null terminators (an additional zero added in case Description/Filter pair not even.) + P := WStrScan(PWideChar(Result), '|'); + while P <> nil do + begin + P^ := #0; + Inc(P); + P := WStrScan(P, '|'); + end; + end; + end; + +var + TempTemplate, TempFilter, TempFilename, TempExt: WideString; +begin + FFiles.Clear; + + // 1. Init inherited dialog defaults. + // 2. Populate OpenFileName record with ansi defaults + ProxyExecuteDialog := Self; + try + DoExecute(@ProxyGetOpenFileNameA); + finally + ProxyExecuteDialog := nil; + end; + OpenFileName := TOpenFilenameW(FProxiedOpenFilenameA); + + with OpenFilename do + begin + if not IsWindow(hWndOwner) then begin + hWndOwner := ParentWnd; + end; + // Filter (PChar -> PWideChar) + TempFilter := AllocFilterStr(Filter); + lpstrFilter := PWideChar(TempFilter); + // FileName (PChar -> PWideChar) + SetLength(TempFilename, nMaxFile + 2); + lpstrFile := PWideChar(TempFilename); + FillChar(lpstrFile^, (nMaxFile + 2) * SizeOf(WideChar), 0); + WStrLCopy(lpstrFile, PWideChar(FileName), nMaxFile); + // InitialDir (PChar -> PWideChar) + if (InitialDir = '') and ForceCurrentDirectory then + lpstrInitialDir := '.' + else + lpstrInitialDir := PWideChar(InitialDir); + // Title (PChar -> PWideChar) + lpstrTitle := PWideChar(Title); + // DefaultExt (PChar -> PWideChar) + TempExt := DefaultExt; + if (TempExt = '') and (Flags and OFN_EXPLORER = 0) then + begin + TempExt := WideExtractFileExt(Filename); + Delete(TempExt, 1, 1); + end; + if TempExt <> '' then + lpstrDefExt := PWideChar(TempExt); + // resource template (PChar -> PWideChar) + lpTemplateName := GetResNamePtr(TempTemplate, Template); + // start modal dialog + Result := TaskModalDialog(Func, OpenFileName); + if Result then + begin + GetFileNamesW(OpenFilename); + if (Flags and OFN_EXTENSIONDIFFERENT) <> 0 then + Options := Options + [ofExtensionDifferent] + else + Options := Options - [ofExtensionDifferent]; + if (Flags and OFN_READONLY) <> 0 then + Options := Options + [ofReadOnly] + else + Options := Options - [ofReadOnly]; + FilterIndex := nFilterIndex; + end; + end; +end; + +procedure TTntOpenDialog.GetFileNamesW(var OpenFileName: TOpenFileNameW); +var + Separator: WideChar; + + procedure ExtractFileNamesW(P: PWideChar); + var + DirName, FileName: TWideFileName; + FileList: TWideStringDynArray; + i: integer; + begin + FileList := ExtractStringsFromStringArray(P, Separator); + if Length(FileList) = 0 then + FFiles.Add('') + else begin + DirName := FileList[0]; + if Length(FileList) = 1 then + FFiles.Add(DirName) + else begin + // prepare DirName + if WideLastChar(DirName) <> WideString(PathDelim) then + DirName := DirName + PathDelim; + // add files + for i := 1 {second item} to High(FileList) do begin + FileName := FileList[i]; + // prepare FileName + if (FileName[1] <> PathDelim) + and ((Length(FileName) <= 3) or (FileName[2] <> DriveDelim) or (FileName[3] <> PathDelim)) + then + FileName := DirName + FileName; + // add to list + FFiles.Add(FileName); + end; + end; + end; + end; + +var + P: PWideChar; +begin + Separator := #0; + if (ofAllowMultiSelect in Options) and + ((ofOldStyleDialog in Options) or not NewStyleControls) then + Separator := ' '; + with OpenFileName do + begin + if ofAllowMultiSelect in Options then + begin + ExtractFileNamesW(lpstrFile); + FileName := FFiles[0]; + end else + begin + P := lpstrFile; + FileName := ExtractStringFromStringArray(P, Separator); + FFiles.Add(FileName); + end; + end; + + // Sync inherited Files + inherited Files.Assign(FFiles); +end; + +function TTntOpenDialog.Execute: Boolean; +begin + if (not Win32PlatformIsUnicode) then + Result := DoExecute(@GetOpenFileNameA) + else + Result := DoExecuteW(@GetOpenFileNameW); +end; + +{$IFDEF COMPILER_9_UP} +function TTntOpenDialog.Execute(ParentWnd: HWND): Boolean; +begin + if (not Win32PlatformIsUnicode) then + Result := DoExecute(@GetOpenFileNameA, ParentWnd) + else + Result := DoExecuteW(@GetOpenFileNameW, ParentWnd); +end; +{$ENDIF} + +{ TTntSaveDialog } + +function TTntSaveDialog.Execute: Boolean; +begin + if (not Win32PlatformIsUnicode) then + Result := DoExecute(@GetSaveFileNameA) + else + Result := DoExecuteW(@GetSaveFileNameW); +end; + +{$IFDEF COMPILER_9_UP} +function TTntSaveDialog.Execute(ParentWnd: HWND): Boolean; +begin + if (not Win32PlatformIsUnicode) then + Result := DoExecute(@GetSaveFileNameA, ParentWnd) + else + Result := DoExecuteW(@GetSaveFileNameW, ParentWnd); +end; +{$ENDIF} + +{ Message dialog } + +function GetAveCharSize(Canvas: TCanvas): TPoint; +var + I: Integer; + Buffer: array[0..51] of WideChar; + tm: TTextMetric; +begin + for I := 0 to 25 do Buffer[I] := WideChar(I + Ord('A')); + for I := 0 to 25 do Buffer[I + 26] := WideChar(I + Ord('a')); + GetTextMetrics(Canvas.Handle, tm); + GetTextExtentPointW(Canvas.Handle, Buffer, 52, TSize(Result)); + Result.X := (Result.X div 26 + 1) div 2; + Result.Y := tm.tmHeight; +end; + +type + TTntMessageForm = class(TTntForm) + private + Message: TTntLabel; + procedure HelpButtonClick(Sender: TObject); + protected + procedure CustomKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); + function GetFormText: WideString; + public + constructor CreateNew(AOwner: TComponent); reintroduce; + end; + +constructor TTntMessageForm.CreateNew(AOwner: TComponent); +var + NonClientMetrics: TNonClientMetrics; +begin + inherited CreateNew(AOwner); + NonClientMetrics.cbSize := sizeof(NonClientMetrics); + if SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @NonClientMetrics, 0) then + Font.Handle := CreateFontIndirect(NonClientMetrics.lfMessageFont); +end; + +procedure TTntMessageForm.HelpButtonClick(Sender: TObject); +begin + Application.HelpContext(HelpContext); +end; + +procedure TTntMessageForm.CustomKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); +begin + if (Shift = [ssCtrl]) and (Key = Word('C')) then + begin + Beep; + TntClipboard.AsWideText := GetFormText; + end; +end; + +function TTntMessageForm.GetFormText: WideString; +var + DividerLine, ButtonCaptions: WideString; + I: integer; +begin + DividerLine := StringOfChar('-', 27) + sLineBreak; + for I := 0 to ComponentCount - 1 do + if Components[I] is TTntButton then + ButtonCaptions := ButtonCaptions + TTntButton(Components[I]).Caption + + StringOfChar(' ', 3); + ButtonCaptions := Tnt_WideStringReplace(ButtonCaptions,'&','', [rfReplaceAll]); + Result := DividerLine + Caption + sLineBreak + DividerLine + Message.Caption + sLineBreak + + DividerLine + ButtonCaptions + sLineBreak + DividerLine; +end; + +function GetMessageCaption(MsgType: TMsgDlgType): WideString; +begin + case MsgType of + mtWarning: Result := SMsgDlgWarning; + mtError: Result := SMsgDlgError; + mtInformation: Result := SMsgDlgInformation; + mtConfirmation: Result := SMsgDlgConfirm; + mtCustom: Result := ''; + else + raise ETntInternalError.Create('Unexpected MsgType in GetMessageCaption.'); + end; +end; + +function GetButtonCaption(MsgDlgBtn: TMsgDlgBtn): WideString; +begin + case MsgDlgBtn of + mbYes: Result := SMsgDlgYes; + mbNo: Result := SMsgDlgNo; + mbOK: Result := SMsgDlgOK; + mbCancel: Result := SMsgDlgCancel; + mbAbort: Result := SMsgDlgAbort; + mbRetry: Result := SMsgDlgRetry; + mbIgnore: Result := SMsgDlgIgnore; + mbAll: Result := SMsgDlgAll; + mbNoToAll: Result := SMsgDlgNoToAll; + mbYesToAll: Result := SMsgDlgYesToAll; + mbHelp: Result := SMsgDlgHelp; + else + raise ETntInternalError.Create('Unexpected MsgDlgBtn in GetButtonCaption.'); + end; +end; + +var + IconIDs: array[TMsgDlgType] of PAnsiChar = (IDI_EXCLAMATION, IDI_HAND, + IDI_ASTERISK, IDI_QUESTION, nil); + ButtonNames: array[TMsgDlgBtn] of WideString = ( + 'Yes', 'No', 'OK', 'Cancel', 'Abort', 'Retry', 'Ignore', 'All', 'NoToAll', + 'YesToAll', 'Help'); + ModalResults: array[TMsgDlgBtn] of Integer = ( + mrYes, mrNo, mrOk, mrCancel, mrAbort, mrRetry, mrIgnore, mrAll, mrNoToAll, + mrYesToAll, 0); + +function WideCreateMessageDialog(const Msg: WideString; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; DefaultButton: TMsgDlgBtn): TTntForm; +const + mcHorzMargin = 8; + mcVertMargin = 8; + mcHorzSpacing = 10; + mcVertSpacing = 10; + mcButtonWidth = 50; + mcButtonHeight = 14; + mcButtonSpacing = 4; +var + DialogUnits: TPoint; + HorzMargin, VertMargin, HorzSpacing, VertSpacing, ButtonWidth, + ButtonHeight, ButtonSpacing, ButtonCount, ButtonGroupWidth, + IconTextWidth, IconTextHeight, X, ALeft: Integer; + B, CancelButton: TMsgDlgBtn; + IconID: PAnsiChar; + ATextRect: TRect; + ThisButtonWidth: integer; + LButton: TTntButton; +begin + Result := TTntMessageForm.CreateNew(Application); + with Result do + begin + BorderStyle := bsDialog; // By doing this first, it will work on WINE. + BiDiMode := Application.BiDiMode; + Canvas.Font := Font; + KeyPreview := True; + Position := poDesigned; + OnKeyDown := TTntMessageForm(Result).CustomKeyDown; + DialogUnits := GetAveCharSize(Canvas); + HorzMargin := MulDiv(mcHorzMargin, DialogUnits.X, 4); + VertMargin := MulDiv(mcVertMargin, DialogUnits.Y, 8); + HorzSpacing := MulDiv(mcHorzSpacing, DialogUnits.X, 4); + VertSpacing := MulDiv(mcVertSpacing, DialogUnits.Y, 8); + ButtonWidth := MulDiv(mcButtonWidth, DialogUnits.X, 4); + for B := Low(TMsgDlgBtn) to High(TMsgDlgBtn) do + begin + if B in Buttons then + begin + ATextRect := Rect(0,0,0,0); + Tnt_DrawTextW(Canvas.Handle, + PWideChar(GetButtonCaption(B)), -1, + ATextRect, DT_CALCRECT or DT_LEFT or DT_SINGLELINE or + DrawTextBiDiModeFlagsReadingOnly); + with ATextRect do ThisButtonWidth := Right - Left + 8; + if ThisButtonWidth > ButtonWidth then + ButtonWidth := ThisButtonWidth; + end; + end; + ButtonHeight := MulDiv(mcButtonHeight, DialogUnits.Y, 8); + ButtonSpacing := MulDiv(mcButtonSpacing, DialogUnits.X, 4); + SetRect(ATextRect, 0, 0, Screen.Width div 2, 0); + Tnt_DrawTextW(Canvas.Handle, PWideChar(Msg), Length(Msg) + 1, ATextRect, + DT_EXPANDTABS or DT_CALCRECT or DT_WORDBREAK or + DrawTextBiDiModeFlagsReadingOnly); + IconID := IconIDs[DlgType]; + IconTextWidth := ATextRect.Right; + IconTextHeight := ATextRect.Bottom; + if IconID <> nil then + begin + Inc(IconTextWidth, 32 + HorzSpacing); + if IconTextHeight < 32 then IconTextHeight := 32; + end; + ButtonCount := 0; + for B := Low(TMsgDlgBtn) to High(TMsgDlgBtn) do + if B in Buttons then Inc(ButtonCount); + ButtonGroupWidth := 0; + if ButtonCount <> 0 then + ButtonGroupWidth := ButtonWidth * ButtonCount + + ButtonSpacing * (ButtonCount - 1); + ClientWidth := Max(IconTextWidth, ButtonGroupWidth) + HorzMargin * 2; + ClientHeight := IconTextHeight + ButtonHeight + VertSpacing + + VertMargin * 2; + Left := (Screen.Width div 2) - (Width div 2); + Top := (Screen.Height div 2) - (Height div 2); + if DlgType <> mtCustom then + Caption := GetMessageCaption(DlgType) + else + Caption := TntApplication.Title; + if IconID <> nil then + with TTntImage.Create(Result) do + begin + Name := 'Image'; + Parent := Result; + Picture.Icon.Handle := LoadIcon(0, IconID); + SetBounds(HorzMargin, VertMargin, 32, 32); + end; + TTntMessageForm(Result).Message := TTntLabel.Create(Result); + with TTntMessageForm(Result).Message do + begin + Name := 'Message'; + Parent := Result; + WordWrap := True; + Caption := Msg; + BoundsRect := ATextRect; + BiDiMode := Result.BiDiMode; + ALeft := IconTextWidth - ATextRect.Right + HorzMargin; + if UseRightToLeftAlignment then + ALeft := Result.ClientWidth - ALeft - Width; + SetBounds(ALeft, VertMargin, + ATextRect.Right, ATextRect.Bottom); + end; + if mbCancel in Buttons then CancelButton := mbCancel else + if mbNo in Buttons then CancelButton := mbNo else + CancelButton := mbOk; + X := (ClientWidth - ButtonGroupWidth) div 2; + for B := Low(TMsgDlgBtn) to High(TMsgDlgBtn) do + if B in Buttons then + begin + LButton := TTntButton.Create(Result); + with LButton do + begin + Name := ButtonNames[B]; + Parent := Result; + Caption := GetButtonCaption(B); + ModalResult := ModalResults[B]; + if B = DefaultButton then + begin + Default := True; + ActiveControl := LButton; + end; + if B = CancelButton then + Cancel := True; + SetBounds(X, IconTextHeight + VertMargin + VertSpacing, + ButtonWidth, ButtonHeight); + Inc(X, ButtonWidth + ButtonSpacing); + if B = mbHelp then + OnClick := TTntMessageForm(Result).HelpButtonClick; + end; + end; + end; +end; + +function WideCreateMessageDialog(const Msg: WideString; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons): TTntForm; +var + DefaultButton: TMsgDlgBtn; +begin + if mbOk in Buttons then DefaultButton := mbOk else + if mbYes in Buttons then DefaultButton := mbYes else + DefaultButton := mbRetry; + Result := WideCreateMessageDialog(Msg, DlgType, Buttons, DefaultButton); +end; + +function WideMessageDlg(const Msg: WideString; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; DefaultButton: TMsgDlgBtn): Integer; +begin + Result := WideMessageDlgPosHelp(Msg, DlgType, Buttons, HelpCtx, -1, -1, '', DefaultButton); +end; + +function WideMessageDlg(const Msg: WideString; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer; +begin + Result := WideMessageDlgPosHelp(Msg, DlgType, Buttons, HelpCtx, -1, -1, ''); +end; + +function WideMessageDlgPos(const Msg: WideString; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer; DefaultButton: TMsgDlgBtn): Integer; +begin + Result := WideMessageDlgPosHelp(Msg, DlgType, Buttons, HelpCtx, X, Y, '', DefaultButton); +end; + +function WideMessageDlgPos(const Msg: WideString; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer): Integer; +begin + Result := WideMessageDlgPosHelp(Msg, DlgType, Buttons, HelpCtx, X, Y, ''); +end; + +function _Internal_WideMessageDlgPosHelp(Dlg: TTntForm; HelpCtx: Longint; X, Y: Integer; + const HelpFileName: WideString): Integer; +begin + with Dlg do + try + HelpContext := HelpCtx; + HelpFile := HelpFileName; + if X >= 0 then Left := X; + if Y >= 0 then Top := Y; + if (Y < 0) and (X < 0) then Position := poScreenCenter; + Result := ShowModal; + finally + Free; + end; +end; + +function WideMessageDlgPosHelp(const Msg: WideString; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer; + const HelpFileName: WideString; DefaultButton: TMsgDlgBtn): Integer; +begin + Result := _Internal_WideMessageDlgPosHelp( + WideCreateMessageDialog(Msg, DlgType, Buttons, DefaultButton), HelpCtx, X, Y, HelpFileName); +end; + +function WideMessageDlgPosHelp(const Msg: WideString; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer; + const HelpFileName: WideString): Integer; +begin + Result := _Internal_WideMessageDlgPosHelp( + WideCreateMessageDialog(Msg, DlgType, Buttons), HelpCtx, X, Y, HelpFileName); +end; + +procedure WideShowMessage(const Msg: WideString); +begin + WideShowMessagePos(Msg, -1, -1); +end; + +procedure WideShowMessageFmt(const Msg: WideString; Params: array of const); +begin + WideShowMessage(WideFormat(Msg, Params)); +end; + +procedure WideShowMessagePos(const Msg: WideString; X, Y: Integer); +begin + WideMessageDlgPos(Msg, mtCustom, [mbOK], 0, X, Y); +end; + +{ Input dialog } + +function WideInputQuery(const ACaption, APrompt: WideString; var Value: WideString): Boolean; +var + Form: TTntForm; + Prompt: TTntLabel; + Edit: TTntEdit; + DialogUnits: TPoint; + ButtonTop, ButtonWidth, ButtonHeight: Integer; +begin + Result := False; + Form := TTntForm.Create(Application); + with Form do begin + try + BorderStyle := bsDialog; // By doing this first, it will work on WINE. + Canvas.Font := Font; + DialogUnits := GetAveCharSize(Canvas); + Caption := ACaption; + ClientWidth := MulDiv(180, DialogUnits.X, 4); + Position := poScreenCenter; + Prompt := TTntLabel.Create(Form); + with Prompt do + begin + Parent := Form; + Caption := APrompt; + Left := MulDiv(8, DialogUnits.X, 4); + Top := MulDiv(8, DialogUnits.Y, 8); + Constraints.MaxWidth := MulDiv(164, DialogUnits.X, 4); + WordWrap := True; + end; + Edit := TTntEdit.Create(Form); + with Edit do + begin + Parent := Form; + Left := Prompt.Left; + Top := Prompt.Top + Prompt.Height + 5; + Width := MulDiv(164, DialogUnits.X, 4); + MaxLength := 255; + Text := Value; + SelectAll; + end; + ButtonTop := Edit.Top + Edit.Height + 15; + ButtonWidth := MulDiv(50, DialogUnits.X, 4); + ButtonHeight := MulDiv(14, DialogUnits.Y, 8); + with TTntButton.Create(Form) do + begin + Parent := Form; + Caption := SMsgDlgOK; + ModalResult := mrOk; + Default := True; + SetBounds(MulDiv(38, DialogUnits.X, 4), ButtonTop, ButtonWidth, + ButtonHeight); + end; + with TTntButton.Create(Form) do + begin + Parent := Form; + Caption := SMsgDlgCancel; + ModalResult := mrCancel; + Cancel := True; + SetBounds(MulDiv(92, DialogUnits.X, 4), Edit.Top + Edit.Height + 15, ButtonWidth, + ButtonHeight); + Form.ClientHeight := Top + Height + 13; + end; + if ShowModal = mrOk then + begin + Value := Edit.Text; + Result := True; + end; + finally + Form.Free; + end; + end; +end; + +function WideInputBox(const ACaption, APrompt, ADefault: WideString): WideString; +begin + Result := ADefault; + WideInputQuery(ACaption, APrompt, Result); +end; + +function WidePromptForFileName(var AFileName: WideString; const AFilter: WideString = ''; + const ADefaultExt: WideString = ''; const ATitle: WideString = ''; + const AInitialDir: WideString = ''; SaveDialog: Boolean = False): Boolean; +var + Dialog: TTntOpenDialog; +begin + if SaveDialog then + begin + Dialog := TTntSaveDialog.Create(nil); + Dialog.Options := Dialog.Options + [ofOverwritePrompt]; + end + else + Dialog := TTntOpenDialog.Create(nil); + with Dialog do + try + Title := ATitle; + DefaultExt := ADefaultExt; + if AFilter = '' then + Filter := SDefaultFilter else + Filter := AFilter; + InitialDir := AInitialDir; + FileName := AFileName; + Result := Execute; + if Result then + AFileName := FileName; + finally + Free; + end; +end; + +end. diff --git a/internal/1/Source/TntExtActns.pas b/internal/1/Source/TntExtActns.pas new file mode 100644 index 0000000..cf1f342 --- /dev/null +++ b/internal/1/Source/TntExtActns.pas @@ -0,0 +1,1400 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntExtActns; + +{$INCLUDE TntCompilers.inc} + +interface + +uses + Classes, TntActnList, ExtActns; + +type +{TNT-WARN TCustomFileRun} + TTntCustomFileRun = class(TCustomFileRun{TNT-ALLOW TCustomFileRun}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + public + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TFileRun} + TTntFileRun = class(TFileRun{TNT-ALLOW TFileRun}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TRichEditAction} + TTntRichEditAction = class(TRichEditAction{TNT-ALLOW TRichEditAction}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TRichEditBold} + TTntRichEditBold = class(TRichEditBold{TNT-ALLOW TRichEditBold}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TRichEditItalic} + TTntRichEditItalic = class(TRichEditItalic{TNT-ALLOW TRichEditItalic}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TRichEditUnderline} + TTntRichEditUnderline = class(TRichEditUnderline{TNT-ALLOW TRichEditUnderline}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TRichEditStrikeOut} + TTntRichEditStrikeOut = class(TRichEditStrikeOut{TNT-ALLOW TRichEditStrikeOut}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TRichEditBullets} + TTntRichEditBullets = class(TRichEditBullets{TNT-ALLOW TRichEditBullets}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TRichEditAlignLeft} + TTntRichEditAlignLeft = class(TRichEditAlignLeft{TNT-ALLOW TRichEditAlignLeft}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TRichEditAlignRight} + TTntRichEditAlignRight = class(TRichEditAlignRight{TNT-ALLOW TRichEditAlignRight}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TRichEditAlignCenter} + TTntRichEditAlignCenter = class(TRichEditAlignCenter{TNT-ALLOW TRichEditAlignCenter}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TTabAction} + TTntTabAction = class(TTabAction{TNT-ALLOW TTabAction}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + public + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TPreviousTab} + TTntPreviousTab = class(TPreviousTab{TNT-ALLOW TPreviousTab}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TNextTab} + TTntNextTab = class(TNextTab{TNT-ALLOW TNextTab}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TOpenPicture} + TTntOpenPicture = class(TOpenPicture{TNT-ALLOW TOpenPicture}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TSavePicture} + TTntSavePicture = class(TSavePicture{TNT-ALLOW TSavePicture}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TURLAction} + TTntURLAction = class(TURLAction{TNT-ALLOW TURLAction}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TBrowseURL} + TTntBrowseURL = class(TBrowseURL{TNT-ALLOW TBrowseURL}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TDownLoadURL} + TTntDownLoadURL = class(TDownLoadURL{TNT-ALLOW TDownLoadURL}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TSendMail} + TTntSendMail = class(TSendMail{TNT-ALLOW TSendMail}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TListControlAction} + TTntListControlAction = class(TListControlAction{TNT-ALLOW TListControlAction}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + public + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TListControlCopySelection} + TTntListControlCopySelection = class(TListControlCopySelection{TNT-ALLOW TListControlCopySelection}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TListControlDeleteSelection} + TTntListControlDeleteSelection = class(TListControlDeleteSelection{TNT-ALLOW TListControlDeleteSelection}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TListControlSelectAll} + TTntListControlSelectAll = class(TListControlSelectAll{TNT-ALLOW TListControlSelectAll}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TListControlClearSelection} + TTntListControlClearSelection = class(TListControlClearSelection{TNT-ALLOW TListControlClearSelection}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TListControlMoveSelection} + TTntListControlMoveSelection = class(TListControlMoveSelection{TNT-ALLOW TListControlMoveSelection}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +implementation + +uses + ActnList, TntStdActns, TntClasses; + +{TNT-IGNORE-UNIT} + +procedure TntExtActn_AfterInherited_Assign(Action: TCustomAction{TNT-ALLOW TCustomAction}; Source: TPersistent); +begin + TntStdActn_AfterInherited_Assign(Action, Source); + // TCustomFileRun + if (Action is TCustomFileRun) and (Source is TCustomFileRun) then begin + TCustomFileRun(Action).Browse := TCustomFileRun(Source).Browse; + if TCustomFileRun(Source).BrowseDlg.Owner <> Source then + TCustomFileRun(Action).BrowseDlg := TCustomFileRun(Source).BrowseDlg + else begin + { Carry over dialog properties. Currently TOpenDialog doesn't support Assign. } + { TCustomFileRun(Action).BrowseDlg.Assign(TCustomFileRun(Source).BrowseDlg); } + end; + TCustomFileRun(Action).Directory := TCustomFileRun(Source).Directory; + TCustomFileRun(Action).FileName := TCustomFileRun(Source).FileName; + TCustomFileRun(Action).Operation := TCustomFileRun(Source).Operation; + TCustomFileRun(Action).ParentControl := TCustomFileRun(Source).ParentControl; + TCustomFileRun(Action).Parameters := TCustomFileRun(Source).Parameters; + TCustomFileRun(Action).ShowCmd := TCustomFileRun(Source).ShowCmd; + end; + // TTabAction + if (Action is TTabAction) and (Source is TTabAction) then begin + TTabAction(Action).SkipHiddenTabs := TTabAction(Source).SkipHiddenTabs; + TTabAction(Action).TabControl := TTabAction(Source).TabControl; + TTabAction(Action).Wrap := TTabAction(Source).Wrap; + TTabAction(Action).BeforeTabChange := TTabAction(Source).BeforeTabChange; + TTabAction(Action).AfterTabChange := TTabAction(Source).AfterTabChange; + TTabAction(Action).OnValidateTab := TTabAction(Source).OnValidateTab; + end; + // TNextTab + if (Action is TNextTab) and (Source is TNextTab) then begin + TNextTab(Action).LastTabCaption := TNextTab(Source).LastTabCaption; + TNextTab(Action).OnFinish := TNextTab(Source).OnFinish; + end; + // TURLAction + if (Action is TURLAction) and (Source is TURLAction) then begin + TURLAction(Action).URL := TURLAction(Source).URL; + end; + // TBrowseURL + if (Action is TBrowseURL) and (Source is TBrowseURL) then begin + {$IFDEF COMPILER_7_UP} + TBrowseURL(Action).BeforeBrowse := TBrowseURL(Source).BeforeBrowse; + TBrowseURL(Action).AfterBrowse := TBrowseURL(Source).AfterBrowse; + {$ENDIF} + end; + // TDownloadURL + if (Action is TDownloadURL) and (Source is TDownloadURL) then begin + TDownloadURL(Action).FileName := TDownloadURL(Source).FileName; + {$IFDEF COMPILER_7_UP} + TDownloadURL(Action).BeforeDownload := TDownloadURL(Source).BeforeDownload; + TDownloadURL(Action).AfterDownload := TDownloadURL(Source).AfterDownload; + {$ENDIF} + TDownloadURL(Action).OnDownloadProgress := TDownloadURL(Source).OnDownloadProgress; + end; + // TSendMail + if (Action is TSendMail) and (Source is TSendMail) then begin + TSendMail(Action).Text := TSendMail(Source).Text; + end; + // TListControlAction + if (Action is TListControlAction) and (Source is TListControlAction) then begin + TListControlAction(Action).ListControl := TListControlAction(Source).ListControl; + end; + // TListControlCopySelection + if (Action is TListControlCopySelection) and (Source is TListControlCopySelection) then begin + TListControlCopySelection(Action).Destination := TListControlCopySelection(Source).Destination; + end; +end; + +//------------------------- +// TNT EXT ACTNS +//------------------------- + +{ TTntCustomFileRun } + +procedure TTntCustomFileRun.Assign(Source: TPersistent); +begin + inherited; + TntExtActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntCustomFileRun.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntCustomFileRun.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntCustomFileRun.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntCustomFileRun.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntCustomFileRun.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntFileRun } + +procedure TTntFileRun.Assign(Source: TPersistent); +begin + inherited; + TntExtActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntFileRun.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntFileRun.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntFileRun.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntFileRun.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntFileRun.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntRichEditAction } + +procedure TTntRichEditAction.Assign(Source: TPersistent); +begin + inherited; + TntExtActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntRichEditAction.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntRichEditAction.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntRichEditAction.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntRichEditAction.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntRichEditAction.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntRichEditBold } + +procedure TTntRichEditBold.Assign(Source: TPersistent); +begin + inherited; + TntExtActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntRichEditBold.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntRichEditBold.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntRichEditBold.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntRichEditBold.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntRichEditBold.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntRichEditItalic } + +procedure TTntRichEditItalic.Assign(Source: TPersistent); +begin + inherited; + TntExtActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntRichEditItalic.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntRichEditItalic.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntRichEditItalic.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntRichEditItalic.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntRichEditItalic.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntRichEditUnderline } + +procedure TTntRichEditUnderline.Assign(Source: TPersistent); +begin + inherited; + TntExtActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntRichEditUnderline.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntRichEditUnderline.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntRichEditUnderline.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntRichEditUnderline.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntRichEditUnderline.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntRichEditStrikeOut } + +procedure TTntRichEditStrikeOut.Assign(Source: TPersistent); +begin + inherited; + TntExtActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntRichEditStrikeOut.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntRichEditStrikeOut.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntRichEditStrikeOut.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntRichEditStrikeOut.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntRichEditStrikeOut.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntRichEditBullets } + +procedure TTntRichEditBullets.Assign(Source: TPersistent); +begin + inherited; + TntExtActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntRichEditBullets.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntRichEditBullets.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntRichEditBullets.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntRichEditBullets.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntRichEditBullets.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntRichEditAlignLeft } + +procedure TTntRichEditAlignLeft.Assign(Source: TPersistent); +begin + inherited; + TntExtActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntRichEditAlignLeft.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntRichEditAlignLeft.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntRichEditAlignLeft.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntRichEditAlignLeft.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntRichEditAlignLeft.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntRichEditAlignRight } + +procedure TTntRichEditAlignRight.Assign(Source: TPersistent); +begin + inherited; + TntExtActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntRichEditAlignRight.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntRichEditAlignRight.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntRichEditAlignRight.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntRichEditAlignRight.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntRichEditAlignRight.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntRichEditAlignCenter } + +procedure TTntRichEditAlignCenter.Assign(Source: TPersistent); +begin + inherited; + TntExtActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntRichEditAlignCenter.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntRichEditAlignCenter.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntRichEditAlignCenter.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntRichEditAlignCenter.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntRichEditAlignCenter.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntTabAction } + +procedure TTntTabAction.Assign(Source: TPersistent); +begin + inherited; + TntExtActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntTabAction.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntTabAction.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntTabAction.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntTabAction.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntTabAction.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntPreviousTab } + +procedure TTntPreviousTab.Assign(Source: TPersistent); +begin + inherited; + TntExtActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntPreviousTab.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntPreviousTab.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntPreviousTab.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntPreviousTab.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntPreviousTab.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntNextTab } + +procedure TTntNextTab.Assign(Source: TPersistent); +begin + inherited; + TntExtActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntNextTab.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntNextTab.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntNextTab.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntNextTab.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntNextTab.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntOpenPicture } + +procedure TTntOpenPicture.Assign(Source: TPersistent); +begin + inherited; + TntExtActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntOpenPicture.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntOpenPicture.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntOpenPicture.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntOpenPicture.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntOpenPicture.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntSavePicture } + +procedure TTntSavePicture.Assign(Source: TPersistent); +begin + inherited; + TntExtActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntSavePicture.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntSavePicture.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntSavePicture.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntSavePicture.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntSavePicture.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntURLAction } + +procedure TTntURLAction.Assign(Source: TPersistent); +begin + inherited; + TntExtActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntURLAction.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntURLAction.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntURLAction.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntURLAction.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntURLAction.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntBrowseURL } + +procedure TTntBrowseURL.Assign(Source: TPersistent); +begin + inherited; + TntExtActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntBrowseURL.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntBrowseURL.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntBrowseURL.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntBrowseURL.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntBrowseURL.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntDownLoadURL } + +procedure TTntDownLoadURL.Assign(Source: TPersistent); +begin + inherited; + TntExtActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntDownLoadURL.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntDownLoadURL.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntDownLoadURL.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntDownLoadURL.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntDownLoadURL.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntSendMail } + +procedure TTntSendMail.Assign(Source: TPersistent); +begin + inherited; + TntExtActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntSendMail.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntSendMail.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntSendMail.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntSendMail.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntSendMail.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntListControlAction } + +procedure TTntListControlAction.Assign(Source: TPersistent); +begin + inherited; + TntExtActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntListControlAction.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntListControlAction.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntListControlAction.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntListControlAction.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntListControlAction.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntListControlCopySelection } + +procedure TTntListControlCopySelection.Assign(Source: TPersistent); +begin + inherited; + TntExtActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntListControlCopySelection.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntListControlCopySelection.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntListControlCopySelection.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntListControlCopySelection.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntListControlCopySelection.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntListControlDeleteSelection } + +procedure TTntListControlDeleteSelection.Assign(Source: TPersistent); +begin + inherited; + TntExtActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntListControlDeleteSelection.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntListControlDeleteSelection.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntListControlDeleteSelection.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntListControlDeleteSelection.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntListControlDeleteSelection.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntListControlSelectAll } + +procedure TTntListControlSelectAll.Assign(Source: TPersistent); +begin + inherited; + TntExtActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntListControlSelectAll.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntListControlSelectAll.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntListControlSelectAll.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntListControlSelectAll.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntListControlSelectAll.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntListControlClearSelection } + +procedure TTntListControlClearSelection.Assign(Source: TPersistent); +begin + inherited; + TntExtActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntListControlClearSelection.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntListControlClearSelection.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntListControlClearSelection.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntListControlClearSelection.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntListControlClearSelection.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntListControlMoveSelection } + +procedure TTntListControlMoveSelection.Assign(Source: TPersistent); +begin + inherited; + TntExtActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntListControlMoveSelection.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntListControlMoveSelection.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntListControlMoveSelection.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntListControlMoveSelection.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntListControlMoveSelection.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +end. diff --git a/internal/1/Source/TntExtCtrls.pas b/internal/1/Source/TntExtCtrls.pas new file mode 100644 index 0000000..4789fa7 --- /dev/null +++ b/internal/1/Source/TntExtCtrls.pas @@ -0,0 +1,1062 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntExtCtrls; + +{$INCLUDE TntCompilers.inc} + +interface + +uses + Classes, Messages, Controls, ExtCtrls, TntClasses, TntControls, TntStdCtrls, TntGraphics; + +type +{TNT-WARN TShape} + TTntShape = class(TShape{TNT-ALLOW TShape}) + private + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsHintStored: Boolean; + procedure CMHintShow(var Message: TMessage); message CM_HINTSHOW; + protected + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TPaintBox} + TTntPaintBox = class(TPaintBox{TNT-ALLOW TPaintBox}) + private + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsHintStored: Boolean; + procedure CMHintShow(var Message: TMessage); message CM_HINTSHOW; + protected + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TImage} + TTntImage = class(TImage{TNT-ALLOW TImage}) + private + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsHintStored: Boolean; + procedure CMHintShow(var Message: TMessage); message CM_HINTSHOW; + function GetPicture: TTntPicture; + procedure SetPicture(const Value: TTntPicture); + protected + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + public + constructor Create(AOwner: TComponent); override; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + property Picture: TTntPicture read GetPicture write SetPicture; + end; + +{TNT-WARN TBevel} + TTntBevel = class(TBevel{TNT-ALLOW TBevel}) + private + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsHintStored: Boolean; + procedure CMHintShow(var Message: TMessage); message CM_HINTSHOW; + protected + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TCustomPanel} + TTntCustomPanel = class(TCustomPanel{TNT-ALLOW TCustomPanel}) + private + function GetCaption: TWideCaption; + procedure SetCaption(const Value: TWideCaption); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsCaptionStored: Boolean; + function IsHintStored: Boolean; + protected + procedure Paint; override; + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + property Caption: TWideCaption read GetCaption write SetCaption stored IsCaptionStored; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TPanel} + TTntPanel = class(TTntCustomPanel) + public + property DockManager; + published + property Align; + property Alignment; + property Anchors; + property AutoSize; + property BevelEdges; + property BevelInner; + property BevelKind; + property BevelOuter; + property BevelWidth; + property BiDiMode; + property BorderWidth; + property BorderStyle; + property Caption; + property Color; + property Constraints; + property Ctl3D; + property UseDockManager default True; + property DockSite; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property FullRepaint; + property Font; + property Locked; + {$IFDEF COMPILER_10_UP} + property Padding; + {$ENDIF} + property ParentBiDiMode; + {$IFDEF COMPILER_7_UP} + property ParentBackground; + {$ENDIF} + property ParentColor; + property ParentCtl3D; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowHint; + property TabOrder; + property TabStop; + {$IFDEF COMPILER_9_UP} + property VerticalAlignment; + {$ENDIF} + property Visible; + {$IFDEF COMPILER_9_UP} + property OnAlignInsertBefore; + property OnAlignPosition; + {$ENDIF} + property OnCanResize; + property OnClick; + property OnConstrainedResize; + property OnContextPopup; + property OnDockDrop; + property OnDockOver; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnGetSiteInfo; + {$IFDEF COMPILER_9_UP} + property OnMouseActivate; + {$ENDIF} + property OnMouseDown; + {$IFDEF COMPILER_10_UP} + property OnMouseEnter; + property OnMouseLeave; + {$ENDIF} + property OnMouseMove; + property OnMouseUp; + property OnResize; + property OnStartDock; + property OnStartDrag; + property OnUnDock; + end; + +{TNT-WARN TCustomControlBar} + TTntCustomControlBar = class(TCustomControlBar{TNT-ALLOW TCustomControlBar}) + private + function IsHintStored: Boolean; + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TControlBar} + TTntControlBar = class(TTntCustomControlBar) + public + property Canvas; + published + property Align; + property Anchors; + property AutoDock; + property AutoDrag; + property AutoSize; + property BevelEdges; + property BevelInner; + property BevelOuter; + property BevelKind; + property BevelWidth; + property BorderWidth; + property Color {$IFDEF COMPILER_7_UP} nodefault {$ENDIF}; + property Constraints; + {$IFDEF COMPILER_10_UP} + property CornerEdge; + {$ENDIF} + property DockSite; + property DragCursor; + property DragKind; + property DragMode; + {$IFDEF COMPILER_10_UP} + property DrawingStyle; + {$ENDIF} + property Enabled; + {$IFDEF COMPILER_10_UP} + property GradientDirection; + property GradientEndColor; + property GradientStartColor; + {$ENDIF} + {$IFDEF COMPILER_7_UP} + property ParentBackground default True; + {$ENDIF} + property ParentColor; + property ParentCtl3D; + property ParentFont; + property ParentShowHint; + property Picture; + property PopupMenu; + property RowSize; + property RowSnap; + property ShowHint; + property TabOrder; + property TabStop; + property Visible; + {$IFDEF COMPILER_9_UP} + property OnAlignInsertBefore; + property OnAlignPosition; + {$ENDIF} + property OnBandDrag; + property OnBandInfo; + property OnBandMove; + property OnBandPaint; + {$IFDEF COMPILER_9_UP} + property OnBeginBandMove; + property OnEndBandMove; + {$ENDIF} + property OnCanResize; + property OnClick; + property OnConstrainedResize; + property OnContextPopup; + property OnDockDrop; + property OnDockOver; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnGetSiteInfo; + {$IFDEF COMPILER_9_UP} + property OnMouseActivate; + {$ENDIF} + property OnMouseDown; + {$IFDEF COMPILER_10_UP} + property OnMouseEnter; + property OnMouseLeave; + {$ENDIF} + property OnMouseMove; + property OnMouseUp; + property OnPaint; + property OnResize; + property OnStartDock; + property OnStartDrag; + property OnUnDock; + end; + +{TNT-WARN TCustomRadioGroup} + TTntCustomRadioGroup = class(TTntCustomGroupBox) + private + FButtons: TList; + FItems: TTntStrings; + FItemIndex: Integer; + FColumns: Integer; + FReading: Boolean; + FUpdating: Boolean; + function GetButtons(Index: Integer): TTntRadioButton; + procedure ArrangeButtons; + procedure ButtonClick(Sender: TObject); + procedure ItemsChange(Sender: TObject); + procedure SetButtonCount(Value: Integer); + procedure SetColumns(Value: Integer); + procedure SetItemIndex(Value: Integer); + procedure SetItems(Value: TTntStrings); + procedure UpdateButtons; + procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED; + procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED; + procedure WMSize(var Message: TWMSize); message WM_SIZE; + protected + procedure Loaded; override; + procedure ReadState(Reader: TReader); override; + function CanModify: Boolean; virtual; + procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override; + property Columns: Integer read FColumns write SetColumns default 1; + property ItemIndex: Integer read FItemIndex write SetItemIndex default -1; + property Items: TTntStrings read FItems write SetItems; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure FlipChildren(AllLevels: Boolean); override; + property Buttons[Index: Integer]: TTntRadioButton read GetButtons; + end; + +{TNT-WARN TRadioGroup} + TTntRadioGroup = class(TTntCustomRadioGroup) + published + property Align; + property Anchors; + property BiDiMode; + property Caption; + property Color; + property Columns; + property Ctl3D; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property ItemIndex; + property Items; + property Constraints; + property ParentBiDiMode; + {$IFDEF COMPILER_7_UP} + property ParentBackground default True; + {$ENDIF} + property ParentColor; + property ParentCtl3D; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowHint; + property TabOrder; + property TabStop; + property Visible; + property OnClick; + property OnContextPopup; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnStartDock; + property OnStartDrag; + end; + +{TNT-WARN TSplitter} + TTntSplitter = class(TSplitter{TNT-ALLOW TSplitter}) + private + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsHintStored: Boolean; + procedure CMHintShow(var Message: TMessage); message CM_HINTSHOW; + protected + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +implementation + +uses + Windows, Graphics, Forms, {$IFDEF THEME_7_UP} Themes, {$ENDIF} + TntSysUtils, TntWindows, TntActnList; + +{ TTntShape } + +procedure TTntShape.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntShape.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self) +end; + +function TTntShape.GetHint: WideString; +begin + Result := TntControl_GetHint(Self) +end; + +procedure TTntShape.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntShape.CMHintShow(var Message: TMessage); +begin + ProcessCMHintShowMsg(Message); + inherited; +end; + +procedure TTntShape.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntShape.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +{ TTntPaintBox } + +procedure TTntPaintBox.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntPaintBox.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self) +end; + +function TTntPaintBox.GetHint: WideString; +begin + Result := TntControl_GetHint(Self) +end; + +procedure TTntPaintBox.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntPaintBox.CMHintShow(var Message: TMessage); +begin + ProcessCMHintShowMsg(Message); + inherited; +end; + +procedure TTntPaintBox.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntPaintBox.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +type +{$IFDEF COMPILER_6} // verified against VCL source in Delphi 6 and BCB 6 + THackImage = class(TGraphicControl) + protected + FPicture: TPicture{TNT-ALLOW TPicture}; + end; +{$ENDIF} +{$IFDEF DELPHI_7} // verified against VCL source in Delphi 7 + THackImage = class(TGraphicControl) + protected + FPicture: TPicture{TNT-ALLOW TPicture}; + end; +{$ENDIF} +{$IFDEF DELPHI_9} // verified against VCL source in Delphi 9 + THackImage = class(TGraphicControl) + private + FPicture: TPicture{TNT-ALLOW TPicture}; + end; +{$ENDIF} +{$IFDEF DELPHI_10} // verified against VCL source in Delphi 10 + THackImage = class(TGraphicControl) + private + FPicture: TPicture{TNT-ALLOW TPicture}; + end; +{$ENDIF} + +{ TTntImage } + +constructor TTntImage.Create(AOwner: TComponent); +var + OldPicture: TPicture{TNT-ALLOW TPicture}; +begin + inherited; + OldPicture := THackImage(Self).FPicture; + THackImage(Self).FPicture := TTntPicture.Create; + Picture.OnChange := OldPicture.OnChange; + Picture.OnProgress := OldPicture.OnProgress; + OldPicture.Free; +end; + +function TTntImage.GetPicture: TTntPicture; +begin + Result := inherited Picture as TTntPicture; +end; + +procedure TTntImage.SetPicture(const Value: TTntPicture); +begin + inherited Picture := Value; +end; + +procedure TTntImage.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntImage.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self) +end; + +function TTntImage.GetHint: WideString; +begin + Result := TntControl_GetHint(Self) +end; + +procedure TTntImage.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntImage.CMHintShow(var Message: TMessage); +begin + ProcessCMHintShowMsg(Message); + inherited; +end; + +procedure TTntImage.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntImage.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +{ TTntBevel } + +procedure TTntBevel.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntBevel.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self) +end; + +function TTntBevel.GetHint: WideString; +begin + Result := TntControl_GetHint(Self) +end; + +procedure TTntBevel.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntBevel.CMHintShow(var Message: TMessage); +begin + ProcessCMHintShowMsg(Message); + inherited; +end; + +procedure TTntBevel.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntBevel.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +{ TTntCustomPanel } + +procedure TTntCustomPanel.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle(Self, Params, ''); +end; + +procedure TTntCustomPanel.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntCustomPanel.IsCaptionStored: Boolean; +begin + Result := TntControl_IsCaptionStored(Self); +end; + +function TTntCustomPanel.GetCaption: TWideCaption; +begin + Result := TntControl_GetText(Self) +end; + +procedure TTntCustomPanel.SetCaption(const Value: TWideCaption); +begin + TntControl_SetText(Self, Value); +end; + +procedure TTntCustomPanel.Paint; +const + Alignments: array[TAlignment] of Longint = (DT_LEFT, DT_RIGHT, DT_CENTER); +var + Rect: TRect; + TopColor, BottomColor: TColor; + FontHeight: Integer; + Flags: Longint; + + procedure AdjustColors(Bevel: TPanelBevel); + begin + TopColor := clBtnHighlight; + if Bevel = bvLowered then TopColor := clBtnShadow; + BottomColor := clBtnShadow; + if Bevel = bvLowered then BottomColor := clBtnHighlight; + end; + +begin + if (not Win32PlatformIsUnicode) then + inherited + else begin + Rect := GetClientRect; + if BevelOuter <> bvNone then + begin + AdjustColors(BevelOuter); + Frame3D(Canvas, Rect, TopColor, BottomColor, BevelWidth); + end; + {$IFDEF THEME_7_UP} + if ThemeServices.ThemesEnabled {$IFDEF COMPILER_7_UP} and ParentBackground {$ENDIF} then + InflateRect(Rect, -BorderWidth, -BorderWidth) + else + {$ENDIF} + begin + Frame3D(Canvas, Rect, Color, Color, BorderWidth); + end; + if BevelInner <> bvNone then + begin + AdjustColors(BevelInner); + Frame3D(Canvas, Rect, TopColor, BottomColor, BevelWidth); + end; + with Canvas do + begin + {$IFDEF THEME_7_UP} + if not ThemeServices.ThemesEnabled {$IFDEF COMPILER_7_UP} or not ParentBackground {$ENDIF} then + {$ENDIF} + begin + Brush.Color := Color; + FillRect(Rect); + end; + Brush.Style := bsClear; + Font := Self.Font; + FontHeight := WideCanvasTextHeight(Canvas, 'W'); + with Rect do + begin + Top := ((Bottom + Top) - FontHeight) div 2; + Bottom := Top + FontHeight; + end; + Flags := DT_EXPANDTABS or DT_VCENTER or Alignments[Alignment]; + Flags := DrawTextBiDiModeFlags(Flags); + Tnt_DrawTextW(Handle, PWideChar(Caption), -1, Rect, Flags); + end; + end; +end; + +function TTntCustomPanel.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self) +end; + +function TTntCustomPanel.GetHint: WideString; +begin + Result := TntControl_GetHint(Self); +end; + +procedure TTntCustomPanel.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntCustomPanel.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntCustomPanel.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +{ TTntCustomControlBar } + +procedure TTntCustomControlBar.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle(Self, Params, ''); +end; + +procedure TTntCustomControlBar.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntCustomControlBar.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TTntCustomControlBar.GetHint: WideString; +begin + Result := TntControl_GetHint(Self); +end; + +procedure TTntCustomControlBar.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntCustomControlBar.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntCustomControlBar.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +{ TTntGroupButton } + +type + TTntGroupButton = class(TTntRadioButton) + 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{TNT-ALLOW Char}); override; + public + constructor InternalCreate(RadioGroup: TTntCustomRadioGroup); + destructor Destroy; override; + end; + +constructor TTntGroupButton.InternalCreate(RadioGroup: TTntCustomRadioGroup); +begin + inherited Create(RadioGroup); + RadioGroup.FButtons.Add(Self); + Visible := False; + Enabled := RadioGroup.Enabled; + ParentShowHint := False; + OnClick := RadioGroup.ButtonClick; + Parent := RadioGroup; +end; + +destructor TTntGroupButton.Destroy; +begin + TTntCustomRadioGroup(Owner).FButtons.Remove(Self); + inherited Destroy; +end; + +procedure TTntGroupButton.CNCommand(var Message: TWMCommand); +begin + if not FInClick then + begin + FInClick := True; + try + if ((Message.NotifyCode = BN_CLICKED) or + (Message.NotifyCode = BN_DOUBLECLICKED)) and + TTntCustomRadioGroup(Parent).CanModify then + inherited; + except + Application.HandleException(Self); + end; + FInClick := False; + end; +end; + +procedure TTntGroupButton.KeyPress(var Key: Char{TNT-ALLOW Char}); +begin + inherited KeyPress(Key); + TTntCustomRadioGroup(Parent).KeyPress(Key); + if (Key = #8) or (Key = ' ') then + begin + if not TTntCustomRadioGroup(Parent).CanModify then Key := #0; + end; +end; + +procedure TTntGroupButton.KeyDown(var Key: Word; Shift: TShiftState); +begin + inherited KeyDown(Key, Shift); + TTntCustomRadioGroup(Parent).KeyDown(Key, Shift); +end; + +{ TTntCustomRadioGroup } + +constructor TTntCustomRadioGroup.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + ControlStyle := [csSetCaption, csDoubleClicks {$IFDEF COMPILER_7_UP}, csParentBackground {$ENDIF}]; + FButtons := TList.Create; + FItems := TTntStringList.Create; + TTntStringList(FItems).OnChange := ItemsChange; + FItemIndex := -1; + FColumns := 1; +end; + +destructor TTntCustomRadioGroup.Destroy; +begin + SetButtonCount(0); + TTntStringList(FItems).OnChange := nil; + FItems.Free; + FButtons.Free; + inherited Destroy; +end; + +procedure TTntCustomRadioGroup.FlipChildren(AllLevels: Boolean); +begin + { The radio buttons are flipped using BiDiMode } +end; + +procedure TTntCustomRadioGroup.ArrangeButtons; +var + ButtonsPerCol, ButtonWidth, ButtonHeight, TopMargin, I: Integer; + DC: HDC; + SaveFont: HFont; + Metrics: TTextMetric; + DeferHandle: THandle; + ALeft: Integer; +begin + if (FButtons.Count <> 0) and not FReading then + begin + DC := GetDC(0); + SaveFont := SelectObject(DC, Font.Handle); + GetTextMetrics(DC, Metrics); + SelectObject(DC, SaveFont); + ReleaseDC(0, DC); + ButtonsPerCol := (FButtons.Count + FColumns - 1) div FColumns; + ButtonWidth := (Width - 10) div FColumns; + I := Height - Metrics.tmHeight - 5; + ButtonHeight := I div ButtonsPerCol; + TopMargin := Metrics.tmHeight + 1 + (I mod ButtonsPerCol) div 2; + DeferHandle := BeginDeferWindowPos(FButtons.Count); + try + for I := 0 to FButtons.Count - 1 do + with TTntGroupButton(FButtons[I]) do + begin + BiDiMode := Self.BiDiMode; + ALeft := (I div ButtonsPerCol) * ButtonWidth + 8; + if UseRightToLeftAlignment then + ALeft := Self.ClientWidth - ALeft - ButtonWidth; + DeferHandle := DeferWindowPos(DeferHandle, Handle, 0, + ALeft, + (I mod ButtonsPerCol) * ButtonHeight + TopMargin, + ButtonWidth, ButtonHeight, + SWP_NOZORDER or SWP_NOACTIVATE); + Visible := True; + end; + finally + EndDeferWindowPos(DeferHandle); + end; + end; +end; + +procedure TTntCustomRadioGroup.ButtonClick(Sender: TObject); +begin + if not FUpdating then + begin + FItemIndex := FButtons.IndexOf(Sender); + Changed; + Click; + end; +end; + +procedure TTntCustomRadioGroup.ItemsChange(Sender: TObject); +begin + if not FReading then + begin + if FItemIndex >= FItems.Count then FItemIndex := FItems.Count - 1; + UpdateButtons; + end; +end; + +procedure TTntCustomRadioGroup.Loaded; +begin + inherited Loaded; + ArrangeButtons; +end; + +procedure TTntCustomRadioGroup.ReadState(Reader: TReader); +begin + FReading := True; + inherited ReadState(Reader); + FReading := False; + UpdateButtons; +end; + +procedure TTntCustomRadioGroup.SetButtonCount(Value: Integer); +begin + while FButtons.Count < Value do TTntGroupButton.InternalCreate(Self); + while FButtons.Count > Value do TTntGroupButton(FButtons.Last).Free; +end; + +procedure TTntCustomRadioGroup.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 TTntCustomRadioGroup.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 + TTntGroupButton(FButtons[FItemIndex]).Checked := False; + FItemIndex := Value; + if FItemIndex >= 0 then + TTntGroupButton(FButtons[FItemIndex]).Checked := True; + end; + end; +end; + +procedure TTntCustomRadioGroup.SetItems(Value: TTntStrings); +begin + FItems.Assign(Value); +end; + +procedure TTntCustomRadioGroup.UpdateButtons; +var + I: Integer; +begin + SetButtonCount(FItems.Count); + for I := 0 to FButtons.Count - 1 do + TTntGroupButton(FButtons[I]).Caption := FItems[I]; + if FItemIndex >= 0 then + begin + FUpdating := True; + TTntGroupButton(FButtons[FItemIndex]).Checked := True; + FUpdating := False; + end; + ArrangeButtons; + Invalidate; +end; + +procedure TTntCustomRadioGroup.CMEnabledChanged(var Message: TMessage); +var + I: Integer; +begin + inherited; + for I := 0 to FButtons.Count - 1 do + TTntGroupButton(FButtons[I]).Enabled := Enabled; +end; + +procedure TTntCustomRadioGroup.CMFontChanged(var Message: TMessage); +begin + inherited; + ArrangeButtons; +end; + +procedure TTntCustomRadioGroup.WMSize(var Message: TWMSize); +begin + inherited; + ArrangeButtons; +end; + +function TTntCustomRadioGroup.CanModify: Boolean; +begin + Result := True; +end; + +procedure TTntCustomRadioGroup.GetChildren(Proc: TGetChildProc; Root: TComponent); +begin +end; + +function TTntCustomRadioGroup.GetButtons(Index: Integer): TTntRadioButton; +begin + Result := TTntRadioButton(FButtons[Index]); +end; + +{ TTntSplitter } + +procedure TTntSplitter.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntSplitter.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self) +end; + +function TTntSplitter.GetHint: WideString; +begin + Result := TntControl_GetHint(Self) +end; + +procedure TTntSplitter.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntSplitter.CMHintShow(var Message: TMessage); +begin + ProcessCMHintShowMsg(Message); + inherited; +end; + +procedure TTntSplitter.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntSplitter.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +end. diff --git a/internal/1/Source/TntExtDlgs.pas b/internal/1/Source/TntExtDlgs.pas new file mode 100644 index 0000000..528c4f9 --- /dev/null +++ b/internal/1/Source/TntExtDlgs.pas @@ -0,0 +1,317 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntExtDlgs; + +{$INCLUDE TntCompilers.inc} + +interface + +uses + Classes, Windows, TntDialogs, TntExtCtrls, TntStdCtrls, TntButtons; + +type +{TNT-WARN TOpenPictureDialog} + TTntOpenPictureDialog = class(TTntOpenDialog) + private + FPicturePanel: TTntPanel; + FPictureLabel: TTntLabel; + FPreviewButton: TTntSpeedButton; + FPaintPanel: TTntPanel; + FImageCtrl: TTntImage; + FSavedFilename: WideString; + function IsFilterStored: Boolean; + procedure PreviewKeyPress(Sender: TObject; var Key: Char{TNT-ALLOW Char}); + protected + procedure PreviewClick(Sender: TObject); virtual; + procedure DoClose; override; + procedure DoSelectionChange; override; + procedure DoShow; override; + property ImageCtrl: TTntImage read FImageCtrl; + property PictureLabel: TTntLabel read FPictureLabel; + published + property Filter stored IsFilterStored; + public + constructor Create(AOwner: TComponent); override; + function Execute: Boolean; override; + {$IFDEF COMPILER_9_UP} + function Execute(ParentWnd: HWND): Boolean; override; + {$ENDIF} + end; + +{TNT-WARN TSavePictureDialog} + TTntSavePictureDialog = class(TTntOpenPictureDialog) + public + function Execute: Boolean; override; + {$IFDEF COMPILER_9_UP} + function Execute(ParentWnd: HWND): Boolean; override; + {$ENDIF} + end; + +implementation + +uses + ExtDlgs, {ExtDlgs is needed for a linked resource} Dialogs, Consts, Messages, + Graphics, Math, Controls, Forms, SysUtils, CommDlg, TntSysUtils, TntForms; + +{ TTntSilentPaintPanel } + +type + TTntSilentPaintPanel = class(TTntPanel) + protected + procedure WMPaint(var Msg: TWMPaint); message WM_PAINT; + end; + +procedure TTntSilentPaintPanel.WMPaint(var Msg: TWMPaint); +begin + try + inherited; + except + Caption := SInvalidImage; + end; +end; + +{ TTntOpenPictureDialog } + +constructor TTntOpenPictureDialog.Create(AOwner: TComponent); +begin + inherited; + Filter := GraphicFilter(TGraphic); + FPicturePanel := TTntPanel.Create(Self); + with FPicturePanel do + begin + Name := 'PicturePanel'; + Caption := ''; + SetBounds(204, 5, 169, 200); + BevelOuter := bvNone; + BorderWidth := 6; + TabOrder := 1; + FPictureLabel := TTntLabel.Create(Self); + with FPictureLabel do + begin + Name := 'PictureLabel'; + Caption := ''; + SetBounds(6, 6, 157, 23); + Align := alTop; + AutoSize := False; + Parent := FPicturePanel; + end; + FPreviewButton := TTntSpeedButton.Create(Self); + with FPreviewButton do + begin + Name := 'PreviewButton'; + SetBounds(77, 1, 23, 22); + Enabled := False; + Glyph.LoadFromResourceName(FindClassHInstance(TOpenPictureDialog{TNT-ALLOW TOpenPictureDialog}), 'PREVIEWGLYPH'); + Hint := SPreviewLabel; + ParentShowHint := False; + ShowHint := True; + OnClick := PreviewClick; + Parent := FPicturePanel; + end; + FPaintPanel := TTntSilentPaintPanel.Create(Self); + with FPaintPanel do + begin + Name := 'PaintPanel'; + Caption := ''; + SetBounds(6, 29, 157, 145); + Align := alClient; + BevelInner := bvRaised; + BevelOuter := bvLowered; + TabOrder := 0; + FImageCtrl := TTntImage.Create(Self); + Parent := FPicturePanel; + with FImageCtrl do + begin + Name := 'PaintBox'; + Align := alClient; + OnDblClick := PreviewClick; + Parent := FPaintPanel; + Proportional := True; + Stretch := True; + Center := True; + IncrementalDisplay := True; + end; + end; + end; +end; + +procedure TTntOpenPictureDialog.DoClose; +begin + inherited; + { Hide any hint windows left behind } + Application.HideHint; +end; + +procedure TTntOpenPictureDialog.DoSelectionChange; +var + FullName: WideString; + ValidPicture: Boolean; + + function ValidFile(const FileName: WideString): Boolean; + begin + Result := WideFileGetAttr(FileName) <> $FFFFFFFF; + end; + +begin + FullName := FileName; + if FullName <> FSavedFilename then + begin + FSavedFilename := FullName; + ValidPicture := WideFileExists(FullName) and ValidFile(FullName); + if ValidPicture then + try + FImageCtrl.Picture.LoadFromFile(FullName); + FPictureLabel.Caption := WideFormat(SPictureDesc, + [FImageCtrl.Picture.Width, FImageCtrl.Picture.Height]); + FPreviewButton.Enabled := True; + FPaintPanel.Caption := ''; + except + ValidPicture := False; + end; + if not ValidPicture then + begin + FPictureLabel.Caption := SPictureLabel; + FPreviewButton.Enabled := False; + FImageCtrl.Picture := nil; + FPaintPanel.Caption := srNone; + end; + end; + inherited; +end; + +procedure TTntOpenPictureDialog.DoShow; +var + PreviewRect, StaticRect: TRect; +begin + { Set preview area to entire dialog } + GetClientRect(Handle, PreviewRect); + StaticRect := GetStaticRect; + { Move preview area to right of static area } + PreviewRect.Left := StaticRect.Left + (StaticRect.Right - StaticRect.Left); + Inc(PreviewRect.Top, 4); + FPicturePanel.BoundsRect := PreviewRect; + FPreviewButton.Left := FPaintPanel.BoundsRect.Right - FPreviewButton.Width - 2; + FImageCtrl.Picture := nil; + FSavedFilename := ''; + FPaintPanel.Caption := srNone; + FPicturePanel.ParentWindow := Handle; + inherited; +end; + +function TTntOpenPictureDialog.Execute: Boolean; +begin + if NewStyleControls and not (ofOldStyleDialog in Options) then + Template := 'DLGTEMPLATE' else + Template := nil; + Result := inherited Execute; +end; + +{$IFDEF COMPILER_9_UP} +function TTntOpenPictureDialog.Execute(ParentWnd: HWND): Boolean; +begin + if NewStyleControls and not (ofOldStyleDialog in Options) then + Template := 'DLGTEMPLATE' else + Template := nil; + Result := inherited Execute(ParentWnd); +end; +{$ENDIF} + +function TTntOpenPictureDialog.IsFilterStored: Boolean; +begin + Result := not (Filter = GraphicFilter(TGraphic)); +end; + +procedure TTntOpenPictureDialog.PreviewClick(Sender: TObject); +var + PreviewForm: TTntForm; + Panel: TTntPanel; +begin + PreviewForm := TTntForm.Create(Self); + with PreviewForm do + try + Name := 'PreviewForm'; + BorderStyle := bsSizeToolWin; // By doing this first, it will work on WINE. + Visible := False; + Caption := SPreviewLabel; + KeyPreview := True; + Position := poScreenCenter; + OnKeyPress := PreviewKeyPress; + Panel := TTntPanel.Create(PreviewForm); + with Panel do + begin + Name := 'Panel'; + Caption := ''; + Align := alClient; + BevelOuter := bvNone; + BorderStyle := bsSingle; + BorderWidth := 5; + Color := clWindow; + Parent := PreviewForm; + DoubleBuffered := True; + with TTntImage.Create(PreviewForm) do + begin + Name := 'Image'; + Align := alClient; + Stretch := True; + Proportional := True; + Center := True; + Picture.Assign(FImageCtrl.Picture); + Parent := Panel; + end; + end; + if FImageCtrl.Picture.Width > 0 then + begin + ClientWidth := Min(Monitor.Width * 3 div 4, + FImageCtrl.Picture.Width + (ClientWidth - Panel.ClientWidth)+ 10); + ClientHeight := Min(Monitor.Height * 3 div 4, + FImageCtrl.Picture.Height + (ClientHeight - Panel.ClientHeight) + 10); + end; + ShowModal; + finally + Free; + end; +end; + +procedure TTntOpenPictureDialog.PreviewKeyPress(Sender: TObject; var Key: Char{TNT-ALLOW Char}); +begin + if Key = Char{TNT-ALLOW Char}(VK_ESCAPE) then + (Sender as TTntForm).Close; +end; + +{ TSavePictureDialog } +function TTntSavePictureDialog.Execute: Boolean; +begin + if NewStyleControls and not (ofOldStyleDialog in Options) then + Template := 'DLGTEMPLATE' else + Template := nil; + + if (not Win32PlatformIsUnicode) then + Result := DoExecute(@GetSaveFileNameA) + else + Result := DoExecuteW(@GetSaveFileNameW); +end; + +{$IFDEF COMPILER_9_UP} +function TTntSavePictureDialog.Execute(ParentWnd: HWND): Boolean; +begin + if NewStyleControls and not (ofOldStyleDialog in Options) then + Template := 'DLGTEMPLATE' else + Template := nil; + + if (not Win32PlatformIsUnicode) then + Result := DoExecute(@GetSaveFileNameA, ParentWnd) + else + Result := DoExecuteW(@GetSaveFileNameW, ParentWnd); +end; +{$ENDIF} + +end. diff --git a/internal/1/Source/TntFileCtrl.pas b/internal/1/Source/TntFileCtrl.pas new file mode 100644 index 0000000..892bd80 --- /dev/null +++ b/internal/1/Source/TntFileCtrl.pas @@ -0,0 +1,118 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntFileCtrl; + +{$INCLUDE TntCompilers.inc} + +interface + +{$WARN UNIT_PLATFORM OFF} + +uses + Classes, Windows, FileCtrl; + +{TNT-WARN SelectDirectory} +function WideSelectDirectory(const Caption: WideString; const Root: WideString; + var Directory: WideString): Boolean; + +implementation + +uses + SysUtils, Forms, ActiveX, ShlObj, ShellApi, TntSysUtils, TntWindows; + +function SelectDirCB_W(Wnd: HWND; uMsg: UINT; lParam, lpData: LPARAM): Integer stdcall; +begin + if (uMsg = BFFM_INITIALIZED) and (lpData <> 0) then + SendMessageW(Wnd, BFFM_SETSELECTIONW, Integer(True), lpdata); + result := 0; +end; + +function WideSelectDirectory(const Caption: WideString; const Root: WideString; + var Directory: WideString): Boolean; +{$IFNDEF COMPILER_7_UP} +const + BIF_NEWDIALOGSTYLE = $0040; + BIF_USENEWUI = BIF_NEWDIALOGSTYLE or BIF_EDITBOX; +{$ENDIF} +var + WindowList: Pointer; + BrowseInfo: TBrowseInfoW; + Buffer: PWideChar; + OldErrorMode: Cardinal; + RootItemIDList, ItemIDList: PItemIDList; + ShellMalloc: IMalloc; + IDesktopFolder: IShellFolder; + Eaten, Flags: LongWord; + AnsiDirectory: AnsiString; +begin + if (not Win32PlatformIsUnicode) then begin + AnsiDirectory := Directory; + Result := SelectDirectory{TNT-ALLOW SelectDirectory}(Caption, Root, AnsiDirectory); + Directory := AnsiDirectory; + end else begin + Result := False; + if not WideDirectoryExists(Directory) then + Directory := ''; + FillChar(BrowseInfo, SizeOf(BrowseInfo), 0); + if (ShGetMalloc(ShellMalloc) = S_OK) and (ShellMalloc <> nil) then + begin + Buffer := ShellMalloc.Alloc(MAX_PATH * SizeOf(WideChar)); + try + RootItemIDList := nil; + if Root <> '' then + begin + SHGetDesktopFolder(IDesktopFolder); + IDesktopFolder.ParseDisplayName(Application.Handle, nil, + POleStr(Root), Eaten, RootItemIDList, Flags); + end; + with BrowseInfo do + begin + {$IFDEF COMPILER_9_UP} + hWndOwner := Application.ActiveFormHandle; + {$ELSE} + hWndOwner := Application.Handle; + {$ENDIF} + pidlRoot := RootItemIDList; + pszDisplayName := Buffer; + lpszTitle := PWideChar(Caption); + ulFlags := BIF_RETURNONLYFSDIRS; + if Win32MajorVersion >= 5 then + ulFlags := ulFlags or BIF_USENEWUI; + if Directory <> '' then + begin + lpfn := SelectDirCB_W; + lParam := Integer(PWideChar(Directory)); + end; + end; + WindowList := DisableTaskWindows(0); + OldErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS); + try + ItemIDList := Tnt_ShBrowseForFolderW(BrowseInfo); + finally + SetErrorMode(OldErrorMode); + EnableTaskWindows(WindowList); + end; + Result := ItemIDList <> nil; + if Result then + begin + Tnt_ShGetPathFromIDListW(ItemIDList, Buffer); + ShellMalloc.Free(ItemIDList); + Directory := Buffer; + end; + finally + ShellMalloc.Free(Buffer); + end; + end; + end; +end; + +end. diff --git a/internal/1/Source/TntFormatStrUtils.pas b/internal/1/Source/TntFormatStrUtils.pas new file mode 100644 index 0000000..1149ec8 --- /dev/null +++ b/internal/1/Source/TntFormatStrUtils.pas @@ -0,0 +1,503 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntFormatStrUtils; + +{$INCLUDE TntCompilers.inc} + +interface + +// this unit provides functions to work with format strings + +uses + TntSysUtils; + +function GetCanonicalFormatStr(const _FormatString: WideString): WideString; +{$IFNDEF COMPILER_9_UP} +function ReplaceFloatingArgumentsInFormatString(const _FormatString: WideString; + const Args: array of const + {$IFDEF COMPILER_7_UP}; FormatSettings: PFormatSettings{$ENDIF}): WideString; +{$ENDIF} +procedure CompareFormatStrings(FormatStr1, FormatStr2: WideString); +function FormatStringsAreCompatible(FormatStr1, FormatStr2: WideString): Boolean; + +type + EFormatSpecError = class(ETntGeneralError); + +implementation + +uses + SysUtils, Math, TntClasses; + +resourcestring + SInvalidFormatSpecifier = 'Invalid Format Specifier: %s'; + SMismatchedArgumentTypes = 'Argument types for index %d do not match. (%s <> %s)'; + SMismatchedArgumentCounts = 'Number of format specifiers do not match.'; + +type + TFormatSpecifierType = (fstInteger, fstFloating, fstPointer, fstString); + +function GetFormatSpecifierType(const FormatSpecifier: WideString): TFormatSpecifierType; +var + LastChar: WideChar; +begin + LastChar := TntWideLastChar(FormatSpecifier); + case LastChar of + 'd', 'D', 'u', 'U', 'x', 'X': + result := fstInteger; + 'e', 'E', 'f', 'F', 'g', 'G', 'n', 'N', 'm', 'M': + result := fstFloating; + 'p', 'P': + result := fstPointer; + 's', 'S': + result := fstString + else + raise ETntInternalError.CreateFmt('Internal Error: Unexpected format type (%s)', [LastChar]); + end; +end; + +type + TFormatStrParser = class(TObject) + private + ParsedString: TBufferedWideString; + PFormatString: PWideChar; + LastIndex: Integer; + ExplicitCount: Integer; + ImplicitCount: Integer; + procedure RaiseInvalidFormatSpecifier; + function ParseChar(c: WideChar): Boolean; + procedure ForceParseChar(c: WideChar); + function ParseDigit: Boolean; + function ParseInteger: Boolean; + procedure ForceParseType; + function PeekDigit: Boolean; + function PeekIndexSpecifier(out Index: Integer): Boolean; + public + constructor Create(const _FormatString: WideString); + destructor Destroy; override; + function ParseFormatSpecifier: Boolean; + end; + +constructor TFormatStrParser.Create(const _FormatString: WideString); +begin + inherited Create; + PFormatString := PWideChar(_FormatString); + ExplicitCount := 0; + ImplicitCount := 0; + LastIndex := -1; + ParsedString := TBufferedWideString.Create; +end; + +destructor TFormatStrParser.Destroy; +begin + FreeAndNil(ParsedString); + inherited; +end; + +procedure TFormatStrParser.RaiseInvalidFormatSpecifier; +begin + raise EFormatSpecError.CreateFmt(SInvalidFormatSpecifier, [ParsedString.Value + PFormatString]); +end; + +function TFormatStrParser.ParseChar(c: WideChar): Boolean; +begin + result := False; + if PFormatString^ = c then begin + result := True; + ParsedString.AddChar(c); + Inc(PFormatString); + end; +end; + +procedure TFormatStrParser.ForceParseChar(c: WideChar); +begin + if not ParseChar(c) then + RaiseInvalidFormatSpecifier; +end; + +function TFormatStrParser.PeekDigit: Boolean; +begin + result := False; + if (PFormatString^ <> #0) + and (PFormatString^ >= '0') + and (PFormatString^ <= '9') then + result := True; +end; + +function TFormatStrParser.ParseDigit: Boolean; +begin + result := False; + if PeekDigit then begin + result := True; + ForceParseChar(PFormatString^); + end; +end; + +function TFormatStrParser.ParseInteger: Boolean; +const + MAX_INT_DIGITS = 6; +var + digitcount: integer; +begin + digitcount := 0; + While ParseDigit do begin + inc(digitcount); + end; + result := (digitcount > 0); + if digitcount > MAX_INT_DIGITS then + RaiseInvalidFormatSpecifier; +end; + +procedure TFormatStrParser.ForceParseType; +begin + if PFormatString^ = #0 then + RaiseInvalidFormatSpecifier; + + case PFormatString^ of + 'd', 'u', 'x', 'e', 'f', 'g', 'n', 'm', 'p', 's', + 'D', 'U', 'X', 'E', 'F', 'G', 'N', 'M', 'P', 'S': + begin + // do nothing + end + else + RaiseInvalidFormatSpecifier; + end; + ForceParseChar(PFormatString^); +end; + +function TFormatStrParser.PeekIndexSpecifier(out Index: Integer): Boolean; +var + SaveParsedString: WideString; + SaveFormatString: PWideChar; +begin + SaveParsedString := ParsedString.Value; + SaveFormatString := PFormatString; + try + ParsedString.Clear; + Result := False; + Index := -1; + if ParseInteger then begin + Index := StrToInt(ParsedString.Value); + if ParseChar(':') then + Result := True; + end; + finally + ParsedString.Clear; + ParsedString.AddString(SaveParsedString); + PFormatString := SaveFormatString; + end; +end; + +function TFormatStrParser.ParseFormatSpecifier: Boolean; +var + ExplicitIndex: Integer; +begin + Result := False; + // Parse entire format specifier + ForceParseChar('%'); + if (PFormatString^ <> #0) + and (not ParseChar(' ')) + and (not ParseChar('%')) then begin + if PeekIndexSpecifier(ExplicitIndex) then begin + Inc(ExplicitCount); + LastIndex := Max(LastIndex, ExplicitIndex); + end else begin + Inc(ImplicitCount); + Inc(LastIndex); + ParsedString.AddString(IntToStr(LastIndex)); + ParsedString.AddChar(':'); + end; + if ParseChar('*') then + begin + Inc(ImplicitCount); + Inc(LastIndex); + ParseChar(':'); + end else if ParseInteger then + ParseChar(':'); + ParseChar('-'); + if ParseChar('*') then begin + Inc(ImplicitCount); + Inc(LastIndex); + end else + ParseInteger; + if ParseChar('.') then begin + if not ParseChar('*') then + ParseInteger; + end; + ForceParseType; + Result := True; + end; +end; + +//----------------------------------- + +function GetCanonicalFormatStr(const _FormatString: WideString): WideString; +var + PosSpec: Integer; +begin + with TFormatStrParser.Create(_FormatString) do + try + // loop until no more '%' + PosSpec := Pos('%', PFormatString); + While PosSpec <> 0 do begin + try + // delete everything up until '%' + ParsedString.AddBuffer(PFormatString, PosSpec - 1); + Inc(PFormatString, PosSpec - 1); + // parse format specifier + ParseFormatSpecifier; + finally + PosSpec := Pos('%', PFormatString); + end; + end; + if ((ExplicitCount = 0) and (ImplicitCount = 1)) {simple expression} + or ((ExplicitCount > 0) and (ImplicitCount = 0)) {nothing converted} then + result := _FormatString {original} + else + result := ParsedString.Value + PFormatString; + finally + Free; + end; +end; + +{$IFNDEF COMPILER_9_UP} +function ReplaceFloatingArgumentsInFormatString(const _FormatString: WideString; + const Args: array of const + {$IFDEF COMPILER_7_UP}; FormatSettings: PFormatSettings{$ENDIF}): WideString; +{ This function replaces floating point format specifiers with their actual formatted values. + It also adds index specifiers so that the other format specifiers don't lose their place. + The reason for this is that WideFormat doesn't correctly format floating point specifiers. + See QC#4254. } +var + Parser: TFormatStrParser; + PosSpec: Integer; + Output: TBufferedWideString; +begin + Output := TBufferedWideString.Create; + try + Parser := TFormatStrParser.Create(_FormatString); + with Parser do + try + // loop until no more '%' + PosSpec := Pos('%', PFormatString); + While PosSpec <> 0 do begin + try + // delete everything up until '%' + Output.AddBuffer(PFormatString, PosSpec - 1); + Inc(PFormatString, PosSpec - 1); + // parse format specifier + ParsedString.Clear; + if (not ParseFormatSpecifier) + or (GetFormatSpecifierType(ParsedString.Value) <> fstFloating) then + Output.AddBuffer(ParsedString.BuffPtr, MaxInt) + {$IFDEF COMPILER_7_UP} + else if Assigned(FormatSettings) then + Output.AddString(Format{TNT-ALLOW Format}(ParsedString.Value, Args, FormatSettings^)) + {$ENDIF} + else + Output.AddString(Format{TNT-ALLOW Format}(ParsedString.Value, Args)); + finally + PosSpec := Pos('%', PFormatString); + end; + end; + Output.AddString(PFormatString); + finally + Free; + end; + Result := Output.Value; + finally + Output.Free; + end; +end; +{$ENDIF} + +procedure GetFormatArgs(const _FormatString: WideString; FormatArgs: TTntStrings); +var + PosSpec: Integer; +begin + with TFormatStrParser.Create(_FormatString) do + try + FormatArgs.Clear; + // loop until no more '%' + PosSpec := Pos('%', PFormatString); + While PosSpec <> 0 do begin + try + // delete everything up until '%' + Inc(PFormatString, PosSpec - 1); + // add format specifier to list + ParsedString.Clear; + if ParseFormatSpecifier then + FormatArgs.Add(ParsedString.Value); + finally + PosSpec := Pos('%', PFormatString); + end; + end; + finally + Free; + end; +end; + +function GetExplicitIndex(const FormatSpecifier: WideString): Integer; +var + IndexStr: WideString; + PosColon: Integer; +begin + result := -1; + PosColon := Pos(':', FormatSpecifier); + if PosColon <> 0 then begin + IndexStr := Copy(FormatSpecifier, 2, PosColon - 2); + result := StrToInt(IndexStr); + end; +end; + +function GetMaxIndex(FormatArgs: TTntStrings): Integer; +var + i: integer; + RunningIndex: Integer; + ExplicitIndex: Integer; +begin + result := -1; + RunningIndex := -1; + for i := 0 to FormatArgs.Count - 1 do begin + ExplicitIndex := GetExplicitIndex(FormatArgs[i]); + if ExplicitIndex <> -1 then + RunningIndex := ExplicitIndex + else + inc(RunningIndex); + result := Max(result, RunningIndex); + end; +end; + +procedure UpdateTypeList(FormatArgs, TypeList: TTntStrings); +var + i: integer; + f: WideString; + SpecType: TFormatSpecifierType; + ExplicitIndex: Integer; + MaxIndex: Integer; + RunningIndex: Integer; +begin + // set count of TypeList to accomodate maximum index + MaxIndex := GetMaxIndex(FormatArgs); + TypeList.Clear; + for i := 0 to MaxIndex do + TypeList.Add(''); + + // for each arg... + RunningIndex := -1; + for i := 0 to FormatArgs.Count - 1 do begin + f := FormatArgs[i]; + ExplicitIndex := GetExplicitIndex(f); + SpecType := GetFormatSpecifierType(f); + + // determine running arg index + if ExplicitIndex <> -1 then + RunningIndex := ExplicitIndex + else + inc(RunningIndex); + + if TypeList[RunningIndex] <> '' then begin + // already exists in list, check for compatibility + if TypeList.Objects[RunningIndex] <> TObject(SpecType) then + raise EFormatSpecError.CreateFmt(SMismatchedArgumentTypes, + [RunningIndex, TypeList[RunningIndex], f]); + end else begin + // not in list so update it + TypeList[RunningIndex] := f; + TypeList.Objects[RunningIndex] := TObject(SpecType); + end; + end; +end; + +procedure CompareFormatStrings(FormatStr1, FormatStr2: WideString); +var + ArgList1: TTntStringList; + ArgList2: TTntStringList; + TypeList1: TTntStringList; + TypeList2: TTntStringList; + i: integer; +begin + ArgList1 := nil; + ArgList2 := nil; + TypeList1 := nil; + TypeList2 := nil; + try + ArgList1 := TTntStringList.Create; + ArgList2 := TTntStringList.Create; + TypeList1 := TTntStringList.Create; + TypeList2 := TTntStringList.Create; + + GetFormatArgs(FormatStr1, ArgList1); + UpdateTypeList(ArgList1, TypeList1); + + GetFormatArgs(FormatStr2, ArgList2); + UpdateTypeList(ArgList2, TypeList2); + + if TypeList1.Count <> TypeList2.Count then + raise EFormatSpecError.Create(SMismatchedArgumentCounts + CRLF + CRLF + '> ' + FormatStr1 + CRLF + '> ' + FormatStr2); + + for i := 0 to TypeList1.Count - 1 do begin + if TypeList1.Objects[i] <> TypeList2.Objects[i] then begin + raise EFormatSpecError.CreateFmt(SMismatchedArgumentTypes, + [i, TypeList1[i], TypeList2[i]]); + end; + end; + + finally + ArgList1.Free; + ArgList2.Free; + TypeList1.Free; + TypeList2.Free; + end; +end; + +function FormatStringsAreCompatible(FormatStr1, FormatStr2: WideString): Boolean; +var + ArgList1: TTntStringList; + ArgList2: TTntStringList; + TypeList1: TTntStringList; + TypeList2: TTntStringList; + i: integer; +begin + ArgList1 := nil; + ArgList2 := nil; + TypeList1 := nil; + TypeList2 := nil; + try + ArgList1 := TTntStringList.Create; + ArgList2 := TTntStringList.Create; + TypeList1 := TTntStringList.Create; + TypeList2 := TTntStringList.Create; + + GetFormatArgs(FormatStr1, ArgList1); + UpdateTypeList(ArgList1, TypeList1); + + GetFormatArgs(FormatStr2, ArgList2); + UpdateTypeList(ArgList2, TypeList2); + + Result := (TypeList1.Count = TypeList2.Count); + if Result then begin + for i := 0 to TypeList1.Count - 1 do begin + if TypeList1.Objects[i] <> TypeList2.Objects[i] then begin + Result := False; + break; + end; + end; + end; + finally + ArgList1.Free; + ArgList2.Free; + TypeList1.Free; + TypeList2.Free; + end; +end; + +end. diff --git a/internal/1/Source/TntForms.pas b/internal/1/Source/TntForms.pas new file mode 100644 index 0000000..7800057 --- /dev/null +++ b/internal/1/Source/TntForms.pas @@ -0,0 +1,873 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntForms; + +{$INCLUDE TntCompilers.inc} + +interface + +uses + Classes, Windows, Messages, Controls, Forms, TntControls; + +type +{TNT-WARN TScrollBox} + TTntScrollBox = class(TScrollBox{TNT-ALLOW TScrollBox}) + private + FWMSizeCallCount: Integer; + function IsHintStored: Boolean; + function GetHint: WideString; + procedure SetHint(const Value: WideString); + procedure WMSize(var Message: TWMSize); message WM_SIZE; + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TCustomFrame} + TTntCustomFrame = class(TCustomFrame{TNT-ALLOW TCustomFrame}) + private + function IsHintStored: Boolean; + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TFrame} + TTntFrame = class(TTntCustomFrame) + published + property Align; + property Anchors; + property AutoScroll; + property AutoSize; + property BiDiMode; + property Constraints; + property DockSite; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Color nodefault; + property Ctl3D; + property Font; + {$IFDEF COMPILER_10_UP} + property Padding; + {$ENDIF} + {$IFDEF COMPILER_7_UP} + property ParentBackground default True; + {$ENDIF} + property ParentBiDiMode; + property ParentColor; + property ParentCtl3D; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowHint; + property TabOrder; + property TabStop; + property Visible; + {$IFDEF COMPILER_9_UP} + property OnAlignInsertBefore; + property OnAlignPosition; + {$ENDIF} + property OnCanResize; + property OnClick; + property OnConstrainedResize; + property OnContextPopup; + property OnDblClick; + property OnDockDrop; + property OnDockOver; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnGetSiteInfo; + {$IFDEF COMPILER_9_UP} + property OnMouseActivate; + {$ENDIF} + property OnMouseDown; + {$IFDEF COMPILER_10_UP} + property OnMouseEnter; + property OnMouseLeave; + {$ENDIF} + property OnMouseMove; + property OnMouseUp; + property OnMouseWheel; + property OnMouseWheelDown; + property OnMouseWheelUp; + property OnResize; + property OnStartDock; + property OnStartDrag; + property OnUnDock; + end; + +{TNT-WARN TForm} + TTntForm = class(TForm{TNT-ALLOW TForm}) + private + function GetCaption: TWideCaption; + procedure SetCaption(const Value: TWideCaption); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsCaptionStored: Boolean; + function IsHintStored: Boolean; + procedure WMMenuSelect(var Message: TWMMenuSelect); message WM_MENUSELECT; + procedure CMBiDiModeChanged(var Message: TMessage); message CM_BIDIMODECHANGED; + procedure WMWindowPosChanging(var Message: TMessage); message WM_WINDOWPOSCHANGING; + protected + procedure UpdateActions; override; + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DestroyWindowHandle; override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + function CreateDockManager: IDockManager; override; + public + constructor Create(AOwner: TComponent); override; + procedure DefaultHandler(var Message); override; + published + property Caption: TWideCaption read GetCaption write SetCaption stored IsCaptionStored; + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + + TTntApplication = class(TComponent) + private + FMainFormChecked: Boolean; + FHint: WideString; + FTntAppIdleEventControl: TControl; + FSettingChangeTime: Cardinal; + FTitle: WideString; + function GetHint: WideString; + procedure SetAnsiAppHint(const Value: AnsiString); + procedure SetHint(const Value: WideString); + function GetExeName: WideString; + function IsDlgMsg(var Msg: TMsg): Boolean; + procedure DoIdle; + function GetTitle: WideString; + procedure SetTitle(const Value: WideString); + procedure SetAnsiApplicationTitle(const Value: AnsiString); + function ApplicationMouseControlHint: WideString; + protected + function WndProc(var Message: TMessage): Boolean; + function ProcessMessage(var Msg: TMsg): Boolean; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + property Hint: WideString read GetHint write SetHint; + property ExeName: WideString read GetExeName; + property SettingChangeTime: Cardinal read FSettingChangeTime; + property Title: WideString read GetTitle write SetTitle; + end; + +{TNT-WARN IsAccel} +function IsWideCharAccel(CharCode: Word; const Caption: WideString): Boolean; + +{TNT-WARN PeekMessage} +{TNT-WARN PeekMessageA} +{TNT-WARN PeekMessageW} +procedure EnableManualPeekMessageWithRemove; +procedure DisableManualPeekMessageWithRemove; + +type + TFormProc = procedure (Form: TForm{TNT-ALLOW TForm}); + +var + TntApplication: TTntApplication; + +procedure InitTntEnvironment; + +implementation + +uses + SysUtils, Consts, RTLConsts, Menus, FlatSB, StdActns, + Graphics, TntSystem, TntSysUtils, TntMenus, TntActnList, TntStdActns, TntClasses; + +function IsWideCharAccel(CharCode: Word; const Caption: WideString): Boolean; +var + W: WideChar; +begin + W := KeyUnicode(CharCode); + Result := WideSameText(W, WideGetHotKey(Caption)); +end; + +{ TTntScrollBox } + +procedure TTntScrollBox.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle(Self, Params, ''); +end; + +procedure TTntScrollBox.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntScrollBox.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TTntScrollBox.GetHint: WideString; +begin + Result := TntControl_GetHint(Self); +end; + +procedure TTntScrollBox.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntScrollBox.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntScrollBox.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +procedure TTntScrollBox.WMSize(var Message: TWMSize); +begin + Inc(FWMSizeCallCount); + try + if FWMSizeCallCount < 32 then { Infinite recursion was encountered on Win 9x. } + inherited; + finally + Dec(FWMSizeCallCount); + end; +end; + +{ TTntCustomFrame } + +procedure TTntCustomFrame.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle(Self, Params, ''); +end; + +procedure TTntCustomFrame.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntCustomFrame.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TTntCustomFrame.GetHint: WideString; +begin + Result := TntControl_GetHint(Self); +end; + +procedure TTntCustomFrame.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntCustomFrame.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntCustomFrame.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +{ TTntForm } + +constructor TTntForm.Create(AOwner: TComponent); +begin + // standard construction technique (look at TForm.Create) + GlobalNameSpace.BeginWrite; + try + CreateNew(AOwner); + if (ClassType <> TTntForm) and not (csDesigning in ComponentState) then + begin + Include(FFormState, fsCreating); + try + if not InitInheritedComponent(Self, TTntForm) then + raise EResNotFound.CreateFmt(SResNotFound, [ClassName]); + finally + Exclude(FFormState, fsCreating); + end; + if OldCreateOrder then DoCreate; + end; + finally + GlobalNameSpace.EndWrite; + end; +end; + +procedure TTntForm.CreateWindowHandle(const Params: TCreateParams); +var + NewParams: TCreateParams; + WideWinClassName: WideString; +begin + if (not Win32PlatformIsUnicode) then + inherited + else if (FormStyle = fsMDIChild) and not (csDesigning in ComponentState) then + begin + if (Application.MainForm = nil) or + (Application.MainForm.ClientHandle = 0) then + raise EInvalidOperation.Create(SNoMDIForm); + RegisterUnicodeClass(Params, WideWinClassName); + DefWndProc := @DefMDIChildProcW; + WindowHandle := CreateMDIWindowW(PWideChar(WideWinClassName), + nil, Params.style, Params.X, Params.Y, Params.Width, Params.Height, + Application.MainForm.ClientHandle, hInstance, Longint(Params.Param)); + if WindowHandle = 0 then + RaiseLastOSError; + SubClassUnicodeControl(Self, Params.Caption); + Include(FFormState, fsCreatedMDIChild); + end else + begin + NewParams := Params; + NewParams.ExStyle := NewParams.ExStyle and not WS_EX_LAYERED; + CreateUnicodeHandle(Self, NewParams, ''); + Exclude(FFormState, fsCreatedMDIChild); + end; + if AlphaBlend then begin + // toggle AlphaBlend to force update + AlphaBlend := False; + AlphaBlend := True; + end else if TransparentColor then begin + // toggle TransparentColor to force update + TransparentColor := False; + TransparentColor := True; + end; +end; + +procedure TTntForm.DestroyWindowHandle; +begin + if Win32PlatformIsUnicode then + UninitializeFlatSB(Handle); { Bug in VCL: Without this there might be a resource leak. } + inherited; +end; + +procedure TTntForm.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +procedure TTntForm.DefaultHandler(var Message); +begin + if (ClientHandle <> 0) + and (Win32PlatformIsUnicode) then begin + with TMessage(Message) do begin + if (Msg = WM_SIZE) then + Result := DefWindowProcW(Handle, Msg, wParam, lParam) + else + Result := DefFrameProcW(Handle, ClientHandle, Msg, wParam, lParam); + if (Msg = WM_DESTROY) then + Perform(TNT_WM_DESTROY, 0, 0); { This ensures that the control is Unsubclassed. } + end; + end else + inherited DefaultHandler(Message); +end; + +function TTntForm.IsCaptionStored: Boolean; +begin + Result := TntControl_IsCaptionStored(Self); +end; + +function TTntForm.GetCaption: TWideCaption; +begin + Result := TntControl_GetText(Self) +end; + +procedure TTntForm.SetCaption(const Value: TWideCaption); +begin + TntControl_SetText(Self, Value) +end; + +function TTntForm.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TTntForm.GetHint: WideString; +begin + Result := TntControl_GetHint(Self) +end; + +procedure TTntForm.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntForm.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntForm.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +procedure TTntForm.WMMenuSelect(var Message: TWMMenuSelect); +var + MenuItem: TMenuItem{TNT-ALLOW TMenuItem}; + ID: Integer; + FindKind: TFindItemKind; +begin + if Menu <> nil then + with Message do + begin + MenuItem := nil; + if (MenuFlag <> $FFFF) or (IDItem <> 0) then + begin + FindKind := fkCommand; + ID := IDItem; + if MenuFlag and MF_POPUP <> 0 then + begin + FindKind := fkHandle; + ID := Integer(GetSubMenu(Menu, ID)); + end; + MenuItem := Self.Menu.FindItem(ID, FindKind); + end; + if MenuItem <> nil then + TntApplication.Hint := WideGetLongHint(WideGetMenuItemHint(MenuItem)) + else + TntApplication.Hint := ''; + end; +end; + +procedure TTntForm.UpdateActions; +begin + inherited; + TntApplication.DoIdle; +end; + +procedure TTntForm.CMBiDiModeChanged(var Message: TMessage); +var + Loop: Integer; +begin + inherited; + for Loop := 0 to ComponentCount - 1 do + if Components[Loop] is TMenu then + FixMenuBiDiProblem(TMenu(Components[Loop])); +end; + +procedure TTntForm.WMWindowPosChanging(var Message: TMessage); +begin + inherited; + // This message *sometimes* means that the Menu.BiDiMode changed. + FixMenuBiDiProblem(Menu); +end; + +function TTntForm.CreateDockManager: IDockManager; +begin + if (DockManager = nil) and DockSite and UseDockManager then + HandleNeeded; // force TNT subclassing to occur first + Result := inherited CreateDockManager; +end; + +{ TTntApplication } + +constructor TTntApplication.Create(AOwner: TComponent); +begin + inherited; + Application.HookMainWindow(WndProc); + FSettingChangeTime := GetTickCount; + TntSysUtils._SettingChangeTime := GetTickCount; +end; + +destructor TTntApplication.Destroy; +begin + FreeAndNil(FTntAppIdleEventControl); + Application.UnhookMainWindow(WndProc); + inherited; +end; + +function TTntApplication.GetHint: WideString; +begin + // check to see if the hint has already been set on application.idle + if Application.Hint = AnsiString(ApplicationMouseControlHint) then + FHint := ApplicationMouseControlHint; + // get the synced string + Result := GetSyncedWideString(FHint, Application.Hint) +end; + +procedure TTntApplication.SetAnsiAppHint(const Value: AnsiString); +begin + Application.Hint := Value; +end; + +procedure TTntApplication.SetHint(const Value: WideString); +begin + SetSyncedWideString(Value, FHint, Application.Hint, SetAnsiAppHint); +end; + +function TTntApplication.GetExeName: WideString; +begin + Result := WideParamStr(0); +end; + +function TTntApplication.GetTitle: WideString; +begin + if (Application.Handle <> 0) and Win32PlatformIsUnicode then begin + SetLength(Result, DefWindowProcW(Application.Handle, WM_GETTEXTLENGTH, 0, 0) + 1); + DefWindowProcW(Application.Handle, WM_GETTEXT, Length(Result), Integer(PWideChar(Result))); + SetLength(Result, Length(Result) - 1); + end else + Result := GetSyncedWideString(FTitle, Application.Title); +end; + +procedure TTntApplication.SetAnsiApplicationTitle(const Value: AnsiString); +begin + Application.Title := Value; +end; + +procedure TTntApplication.SetTitle(const Value: WideString); +begin + if (Application.Handle <> 0) and Win32PlatformIsUnicode then begin + if (GetTitle <> Value) or (FTitle <> '') then begin + DefWindowProcW(Application.Handle, WM_SETTEXT, 0, lParam(PWideChar(Value))); + FTitle := ''; + end + end else + SetSyncedWideString(Value, FTitle, Application.Title, SetAnsiApplicationTitle); +end; + +{$IFDEF COMPILER_6} // verified against VCL source in Delphi 6 and BCB 6 +type + THackApplication = class(TComponent) + protected + FxxxxxxxxxHandle: HWnd; + FxxxxxxxxxBiDiMode: TBiDiMode; + FxxxxxxxxxBiDiKeyboard: AnsiString; + FxxxxxxxxxNonBiDiKeyboard: AnsiString; + FxxxxxxxxxObjectInstance: Pointer; + FxxxxxxxxxMainForm: TForm{TNT-ALLOW TForm}; + FMouseControl: TControl; + end; +{$ENDIF} +{$IFDEF DELPHI_7} // verified against VCL source in Delphi 7 +type + THackApplication = class(TComponent) + protected + FxxxxxxxxxHandle: HWnd; + FxxxxxxxxxBiDiMode: TBiDiMode; + FxxxxxxxxxBiDiKeyboard: AnsiString; + FxxxxxxxxxNonBiDiKeyboard: AnsiString; + FxxxxxxxxxObjectInstance: Pointer; + FxxxxxxxxxMainForm: TForm{TNT-ALLOW TForm}; + FMouseControl: TControl; + end; +{$ENDIF} +{$IFDEF DELPHI_9} // verified against VCL source in Delphi 9 +type + THackApplication = class(TComponent) + protected + FxxxxxxxxxHandle: HWnd; + FxxxxxxxxxBiDiMode: TBiDiMode; + FxxxxxxxxxBiDiKeyboard: AnsiString; + FxxxxxxxxxNonBiDiKeyboard: AnsiString; + FxxxxxxxxxObjectInstance: Pointer; + FxxxxxxxxxMainForm: TForm{TNT-ALLOW TForm}; + FMouseControl: TControl; + end; +{$ENDIF} +{$IFDEF DELPHI_10} // verified against VCL source in Delphi 10 +type + THackApplication = class(TComponent) + protected + FxxxxxxxxxHandle: HWnd; + FxxxxxxxxxBiDiMode: TBiDiMode; + FxxxxxxxxxBiDiKeyboard: AnsiString; + FxxxxxxxxxNonBiDiKeyboard: AnsiString; + FxxxxxxxxxObjectInstance: Pointer; + FxxxxxxxxxMainForm: TForm{TNT-ALLOW TForm}; + FMouseControl: TControl; + end; +{$ENDIF} + +function TTntApplication.ApplicationMouseControlHint: WideString; +var + MouseControl: TControl; +begin + MouseControl := THackApplication(Application).FMouseControl; + Result := WideGetLongHint(WideGetHint(MouseControl)); +end; + +procedure TTntApplication.DoIdle; +begin + // update TntApplication.Hint only when Ansi encodings are the same... (otherwise there are problems with action menus) + if Application.Hint = AnsiString(ApplicationMouseControlHint) then + Hint := ApplicationMouseControlHint; +end; + +function TTntApplication.IsDlgMsg(var Msg: TMsg): Boolean; +begin + Result := False; + if (Application.DialogHandle <> 0) then begin + if IsWindowUnicode(Application.DialogHandle) then + Result := IsDialogMessageW(Application.DialogHandle, Msg) + else + Result := IsDialogMessageA(Application.DialogHandle, Msg); + end; +end; + +type + TTntAppIdleEventControl = class(TControl) + protected + procedure OnIdle(Sender: TObject); + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + end; + +constructor TTntAppIdleEventControl.Create(AOwner: TComponent); +begin + inherited; + ParentFont := False; { This allows Parent (Application) to be in another module. } + Parent := Application.MainForm; + Visible := True; + Action := TTntAction.Create(Self); + Action.OnExecute := OnIdle; + Action.OnUpdate := OnIdle; + TntApplication.FTntAppIdleEventControl := Self; +end; + +destructor TTntAppIdleEventControl.Destroy; +begin + if TntApplication <> nil then + TntApplication.FTntAppIdleEventControl := nil; + inherited; +end; + +procedure TTntAppIdleEventControl.OnIdle(Sender: TObject); +begin + TntApplication.DoIdle; +end; + +function TTntApplication.ProcessMessage(var Msg: TMsg): Boolean; +var + Handled: Boolean; +begin + Result := False; + // Check Main Form + if (not FMainFormChecked) and (Application.MainForm <> nil) then begin + if not (Application.MainForm is TTntForm) then begin + // This control will help ensure that DoIdle is called + TTntAppIdleEventControl.Create(Application.MainForm); + end; + FMainFormChecked := True; + end; + // Check for Unicode char messages + if (Msg.message = WM_CHAR) + and (Msg.wParam > Integer(High(AnsiChar))) + and IsWindowUnicode(Msg.hwnd) + and ((Application.DialogHandle = 0) or IsWindowUnicode(Application.DialogHandle)) + then begin + Result := True; + // more than 8-bit WM_CHAR destined for Unicode window + Handled := False; + if Assigned(Application.OnMessage) then + Application.OnMessage(Msg, Handled); + Application.CancelHint; + // dispatch msg if not a dialog message + if (not Handled) and (not IsDlgMsg(Msg)) then + DispatchMessageW(Msg); + end; +end; + +function TTntApplication.WndProc(var Message: TMessage): Boolean; +var + BasicAction: TBasicAction; +begin + Result := False; { not handled } + if (Message.Msg = WM_SETTINGCHANGE) then begin + FSettingChangeTime := GetTickCount; + TntSysUtils._SettingChangeTime := FSettingChangeTime; + end; + if (Message.Msg = WM_CREATE) + and (FTitle <> '') then begin + SetTitle(FTitle); + FTitle := ''; + end; + if (Message.Msg = CM_ACTIONEXECUTE) then begin + BasicAction := TBasicAction(Message.LParam); + if (BasicAction.ClassType = THintAction{TNT-ALLOW THintAction}) + and (THintAction{TNT-ALLOW THintAction}(BasicAction).Hint = AnsiString(Hint)) + then begin + Result := True; + Message.Result := 1; + with TTntHintAction.Create(Self) do + begin + Hint := Self.Hint; + try + Execute; + finally + Free; + end; + end; + end; + end; +end; + +//=========================================================================== +// The NT GetMessage Hook is needed to support entering Unicode +// characters directly from the keyboard (bypassing the IME). +// Special thanks go to Francisco Leong for developing this solution. +// +// Example: +// 1. Install "Turkic" language support. +// 2. Add "Azeri (Latin)" as an input locale. +// 3. In an EDIT, enter Shift+I. (You should see a capital "I" with dot.) +// 4. In an EDIT, enter single quote (US Keyboard). (You should see an upturned "e".) +// +var + ManualPeekMessageWithRemove: Integer = 0; + +procedure EnableManualPeekMessageWithRemove; +begin + Inc(ManualPeekMessageWithRemove); +end; + +procedure DisableManualPeekMessageWithRemove; +begin + if (ManualPeekMessageWithRemove > 0) then + Dec(ManualPeekMessageWithRemove); +end; + +var + NTGetMessageHook: HHOOK; + +function GetMessageForNT(Code: Integer; wParam: Integer; lParam: Integer): LRESULT; stdcall; +var + ThisMsg: PMSG; +begin + if (Code >= 0) + and (wParam = PM_REMOVE) + and (ManualPeekMessageWithRemove = 0) then + begin + ThisMsg := PMSG(lParam); + if (TntApplication <> nil) + and TntApplication.ProcessMessage(ThisMsg^) then + ThisMsg.message := WM_NULL; { clear for further processing } + end; + Result := CallNextHookEx(NTGetMessageHook, Code, wParam, lParam); +end; + +procedure CreateGetMessageHookForNT; +begin + Assert(Win32Platform = VER_PLATFORM_WIN32_NT); + NTGetMessageHook := SetWindowsHookExW(WH_GETMESSAGE, GetMessageForNT, 0, GetCurrentThreadID); + if NTGetMessageHook = 0 then + RaiseLastOSError; +end; + +//--------------------------------------------------------------------------------------------- +// Tnt Environment Setup +//--------------------------------------------------------------------------------------------- + +procedure InitTntEnvironment; + + function GetDefaultFont: WideString; + + function RunningUnderIDE: Boolean; + begin + Result := ModuleIsPackage and + ( WideSameText(WideExtractFileName(WideGetModuleFileName(0)), 'bds.exe') + or WideSameText(WideExtractFileName(WideGetModuleFileName(0)), 'delphi32.exe') + or WideSameText(WideExtractFileName(WideGetModuleFileName(0)), 'bcb.exe')); + end; + + function GetProfileStr(const Section, Key, Default: AnsiString; MaxLen: Integer): AnsiString; + var + Len: Integer; + begin + SetLength(Result, MaxLen + 1); + Len := GetProfileString(PAnsiChar(Section), PAnsiChar(Key), PAnsiChar(Default), + PAnsiChar(Result), Length(Result)); + SetLength(Result, Len); + end; + + procedure SetProfileStr(const Section, Key, Value: AnsiString); + var + DummyResult: Cardinal; + begin + try + Win32Check(WriteProfileString(PAnsiChar(Section), PAnsiChar(Key), PAnsiChar(Value))); + if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then + WriteProfileString(nil, nil, nil); {this flushes the WIN.INI cache} + SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, Integer(PAnsiChar(Section)), + SMTO_NORMAL, 250, DummyResult); + except + on E: Exception do begin + E.Message := 'Couldn''t create font substitutes.' + CRLF + E.Message; + Application.HandleException(nil); + end; + end; + end; + + var + ShellDlgFontName_1: WideString; + ShellDlgFontName_2: WideString; + begin + ShellDlgFontName_1 := GetProfileStr('FontSubstitutes', 'MS Shell Dlg', '', LF_FACESIZE); + if ShellDlgFontName_1 = '' then begin + ShellDlgFontName_1 := 'MS Sans Serif'; + SetProfileStr('FontSubstitutes', 'MS Shell Dlg', ShellDlgFontName_1); + end; + ShellDlgFontName_2 := GetProfileStr('FontSubstitutes', 'MS Shell Dlg 2', '', LF_FACESIZE); + if ShellDlgFontName_2 = '' then begin + if Screen.Fonts.IndexOf('Tahoma') <> -1 then + ShellDlgFontName_2 := 'Tahoma' + else + ShellDlgFontName_2 := ShellDlgFontName_1; + SetProfileStr('FontSubstitutes', 'MS Shell Dlg 2', ShellDlgFontName_2); + end; + if RunningUnderIDE then begin + Result := 'MS Shell Dlg 2' {Delphi is running} + end else + Result := ShellDlgFontName_2; + end; + +begin + // Tnt Environment Setup + InstallTntSystemUpdates; + DefFontData.Name := GetDefaultFont; + Forms.HintWindowClass := TntControls.TTntHintWindow; +end; + +initialization + TntApplication := TTntApplication.Create(nil); + if Win32Platform = VER_PLATFORM_WIN32_NT then + CreateGetMessageHookForNT; + +finalization + if NTGetMessageHook <> 0 then begin + UnhookWindowsHookEx(NTGetMessageHook) // no Win32Check, fails in too many cases, and doesn't matter + end; + FreeAndNil(TntApplication); + +end. diff --git a/internal/1/Source/TntGraphics.pas b/internal/1/Source/TntGraphics.pas new file mode 100644 index 0000000..617b901 --- /dev/null +++ b/internal/1/Source/TntGraphics.pas @@ -0,0 +1,142 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntGraphics; + +{$INCLUDE TntCompilers.inc} + +interface + +uses + Graphics, Windows; + +{TNT-WARN TextRect} +procedure WideCanvasTextRect(Canvas: TCanvas; Rect: TRect; X, Y: Integer; const Text: WideString); +{TNT-WARN TextOut} +procedure WideCanvasTextOut(Canvas: TCanvas; X, Y: Integer; const Text: WideString); +{TNT-WARN TextExtent} +function WideCanvasTextExtent(Canvas: TCanvas; const Text: WideString): TSize; +function WideDCTextExtent(hDC: THandle; const Text: WideString): TSize; +{TNT-WARN TextWidth} +function WideCanvasTextWidth(Canvas: TCanvas; const Text: WideString): Integer; +{TNT-WARN TextHeight} +function WideCanvasTextHeight(Canvas: TCanvas; const Text: WideString): Integer; + +type +{TNT-WARN TPicture} + TTntPicture = class(TPicture{TNT-ALLOW TPicture}) + public + procedure LoadFromFile(const Filename: WideString); + procedure SaveToFile(const Filename: WideString); + end; + +implementation + +uses + SysUtils, TntSysUtils; + +type + TAccessCanvas = class(TCanvas); + +procedure WideCanvasTextRect(Canvas: TCanvas; Rect: TRect; X, Y: Integer; const Text: WideString); +var + Options: Longint; +begin + with TAccessCanvas(Canvas) do begin + Changing; + RequiredState([csHandleValid, csFontValid, csBrushValid]); + Options := ETO_CLIPPED or TextFlags; + if Brush.Style <> bsClear then + Options := Options or ETO_OPAQUE; + if ((TextFlags and ETO_RTLREADING) <> 0) and + (CanvasOrientation = coRightToLeft) then Inc(X, WideCanvasTextWidth(Canvas, Text) + 1); + Windows.ExtTextOutW(Handle, X, Y, Options, @Rect, PWideChar(Text), + Length(Text), nil); + Changed; + end; +end; + +procedure WideCanvasTextOut(Canvas: TCanvas; X, Y: Integer; const Text: WideString); +begin + with TAccessCanvas(Canvas) do begin + Changing; + RequiredState([csHandleValid, csFontValid, csBrushValid]); + if CanvasOrientation = coRightToLeft then Inc(X, WideCanvasTextWidth(Canvas, Text) + 1); + Windows.ExtTextOutW(Handle, X, Y, TextFlags, nil, PWideChar(Text), + Length(Text), nil); + MoveTo(X + WideCanvasTextWidth(Canvas, Text), Y); + Changed; + end; +end; + +function WideDCTextExtent(hDC: THandle; const Text: WideString): TSize; +begin + Result.cx := 0; + Result.cy := 0; + Windows.GetTextExtentPoint32W(hDC, PWideChar(Text), Length(Text), Result); +end; + +function WideCanvasTextExtent(Canvas: TCanvas; const Text: WideString): TSize; +begin + with TAccessCanvas(Canvas) do begin + RequiredState([csHandleValid, csFontValid]); + Result := WideDCTextExtent(Handle, Text); + end; +end; + +function WideCanvasTextWidth(Canvas: TCanvas; const Text: WideString): Integer; +begin + Result := WideCanvasTextExtent(Canvas, Text).cX; +end; + +function WideCanvasTextHeight(Canvas: TCanvas; const Text: WideString): Integer; +begin + Result := WideCanvasTextExtent(Canvas, Text).cY; +end; + +{ TTntPicture } + +procedure TTntPicture.LoadFromFile(const Filename: WideString); +var + ShortName: WideString; +begin + ShortName := WideExtractShortPathName(Filename); + if WideSameText(WideExtractFileExt(FileName), '.jpeg') // the short name ends with ".JPE"! + or (ShortName = '') then // GetShortPathName failed + inherited LoadFromFile(FileName) + else + inherited LoadFromFile(WideExtractShortPathName(Filename)); +end; + +procedure TTntPicture.SaveToFile(const Filename: WideString); +var + TempFile: WideString; +begin + if Graphic <> nil then begin + // create to temp file (ansi safe file name) + repeat + TempFile := WideExtractFilePath(Filename) + IntToStr(Random(MaxInt)) + WideExtractFileExt(Filename); + until not WideFileExists(TempFile); + CloseHandle(WideFileCreate(TempFile)); // make it a real file so that it has a temp + try + // save + Graphic.SaveToFile(WideExtractShortPathName(TempFile)); + // rename + WideDeleteFile(Filename); + if not WideRenameFile(TempFile, FileName) then + RaiseLastOSError; + finally + WideDeleteFile(TempFile); + end; + end; +end; + +end. diff --git a/internal/1/Source/TntGrids.pas b/internal/1/Source/TntGrids.pas new file mode 100644 index 0000000..8096cd4 --- /dev/null +++ b/internal/1/Source/TntGrids.pas @@ -0,0 +1,675 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntGrids; + +{$INCLUDE TntCompilers.inc} + +interface + +uses + Classes, TntClasses, Grids, Windows, Controls, Messages; + +type +{TNT-WARN TInplaceEdit} + TTntInplaceEdit = class(TInplaceEdit{TNT-ALLOW TInplaceEdit}) + private + function GetText: WideString; + procedure SetText(const Value: WideString); + protected + procedure UpdateContents; override; + procedure CreateWindowHandle(const Params: TCreateParams); override; + public + property Text: WideString read GetText write SetText; + end; + + TTntGetEditEvent = procedure (Sender: TObject; ACol, ARow: Longint; var Value: WideString) of object; + TTntSetEditEvent = procedure (Sender: TObject; ACol, ARow: Longint; const Value: WideString) of object; + +{TNT-WARN TCustomDrawGrid} + _TTntInternalCustomDrawGrid = class(TCustomDrawGrid{TNT-ALLOW TCustomDrawGrid}) + private + FSettingEditText: Boolean; + procedure InternalSetEditText(ACol, ARow: Longint; const Value: string{TNT-ALLOW string}); dynamic; abstract; + protected + procedure SetEditText(ACol, ARow: Longint; const Value: string{TNT-ALLOW string}); override; + end; + + TTntCustomDrawGrid = class(_TTntInternalCustomDrawGrid) + private + FOnGetEditText: TTntGetEditEvent; + FOnSetEditText: TTntSetEditEvent; + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsHintStored: Boolean; + procedure WMChar(var Msg: TWMChar); message WM_CHAR; + protected + function CreateEditor: TInplaceEdit{TNT-ALLOW TInplaceEdit}; override; + procedure InternalSetEditText(ACol, ARow: Longint; const Value: string{TNT-ALLOW string}); override; + function GetEditText(ACol, ARow: Longint): WideString; reintroduce; virtual; + procedure SetEditText(ACol, ARow: Longint; const Value: WideString); reintroduce; virtual; + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure ShowEditorChar(Ch: WideChar); dynamic; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + property OnGetEditText: TTntGetEditEvent read FOnGetEditText write FOnGetEditText; + property OnSetEditText: TTntSetEditEvent read FOnSetEditText write FOnSetEditText; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TDrawGrid} + TTntDrawGrid = class(TTntCustomDrawGrid) + published + property Align; + property Anchors; + property BevelEdges; + property BevelInner; + property BevelKind; + property BevelOuter; + property BevelWidth; + property BiDiMode; + property BorderStyle; + property Color; + property ColCount; + property Constraints; + property Ctl3D; + property DefaultColWidth; + property DefaultRowHeight; + property DefaultDrawing; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property FixedColor; + property FixedCols; + property RowCount; + property FixedRows; + property Font; + property GridLineWidth; + property Options; + property ParentBiDiMode; + property ParentColor; + property ParentCtl3D; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ScrollBars; + property ShowHint; + property TabOrder; + property Visible; + property VisibleColCount; + property VisibleRowCount; + property OnClick; + property OnColumnMoved; + property OnContextPopup; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnDrawCell; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnGetEditMask; + property OnGetEditText; + property OnKeyDown; + property OnKeyPress; + property OnKeyUp; + {$IFDEF COMPILER_9_UP} + property OnMouseActivate; + {$ENDIF} + property OnMouseDown; + {$IFDEF COMPILER_10_UP} + property OnMouseEnter; + property OnMouseLeave; + {$ENDIF} + property OnMouseMove; + property OnMouseUp; + property OnMouseWheelDown; + property OnMouseWheelUp; + property OnRowMoved; + property OnSelectCell; + property OnSetEditText; + property OnStartDock; + property OnStartDrag; + property OnTopLeftChanged; + end; + + TTntStringGrid = class; + +{TNT-WARN TStringGridStrings} + TTntStringGridStrings = class(TTntStrings) + private + FIsCol: Boolean; + FColRowIndex: Integer; + FGrid: TTntStringGrid; + function GridAnsiStrings: TStrings{TNT-ALLOW TStrings}; + protected + function Get(Index: Integer): WideString; override; + procedure Put(Index: Integer; const S: WideString); override; + function GetCount: Integer; override; + function GetObject(Index: Integer): TObject; override; + procedure PutObject(Index: Integer; AObject: TObject); override; + procedure SetUpdateState(Updating: Boolean); override; + public + constructor Create(AGrid: TTntStringGrid; AIndex: Longint); + function Add(const S: WideString): Integer; override; + procedure Assign(Source: TPersistent); override; + procedure Clear; override; + procedure Delete(Index: Integer); override; + procedure Insert(Index: Integer; const S: WideString); override; + end; + +{TNT-WARN TStringGrid} + _TTntInternalStringGrid = class(TStringGrid{TNT-ALLOW TStringGrid}) + private + FSettingEditText: Boolean; + procedure InternalSetEditText(ACol, ARow: Longint; const Value: string{TNT-ALLOW string}); dynamic; abstract; + protected + procedure SetEditText(ACol, ARow: Longint; const Value: string{TNT-ALLOW string}); override; + end; + + TTntStringGrid = class(_TTntInternalStringGrid) + private + FCreatedRowStrings: TStringList{TNT-ALLOW TStringList}; + FCreatedColStrings: TStringList{TNT-ALLOW TStringList}; + FOnGetEditText: TTntGetEditEvent; + FOnSetEditText: TTntSetEditEvent; + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsHintStored: Boolean; + procedure WMChar(var Msg: TWMChar); message WM_CHAR; + function GetCells(ACol, ARow: Integer): WideString; + procedure SetCells(ACol, ARow: Integer; const Value: WideString); + function FindGridStrings(const IsCol: Boolean; const ListIndex: Integer): TTntStrings; + function GetCols(Index: Integer): TTntStrings; + function GetRows(Index: Integer): TTntStrings; + procedure SetCols(Index: Integer; const Value: TTntStrings); + procedure SetRows(Index: Integer; const Value: TTntStrings); + protected + function CreateEditor: TInplaceEdit{TNT-ALLOW TInplaceEdit}; override; + procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override; + procedure InternalSetEditText(ACol, ARow: Longint; const Value: string{TNT-ALLOW string}); override; + function GetEditText(ACol, ARow: Longint): WideString; reintroduce; virtual; + procedure SetEditText(ACol, ARow: Longint; const Value: WideString); reintroduce; virtual; + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure ShowEditorChar(Ch: WideChar); dynamic; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + property Cells[ACol, ARow: Integer]: WideString read GetCells write SetCells; + property Cols[Index: Integer]: TTntStrings read GetCols write SetCols; + property Rows[Index: Integer]: TTntStrings read GetRows write SetRows; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + property OnGetEditText: TTntGetEditEvent read FOnGetEditText write FOnGetEditText; + property OnSetEditText: TTntSetEditEvent read FOnSetEditText write FOnSetEditText; + end; + +implementation + +uses + SysUtils, TntSystem, TntGraphics, TntControls, TntStdCtrls, TntActnList, TntSysUtils; + +{ TBinaryCompareAnsiStringList } +type + TBinaryCompareAnsiStringList = class(TStringList{TNT-ALLOW TStringList}) + protected + function CompareStrings(const S1, S2: string{TNT-ALLOW string}): Integer; override; + end; + +function TBinaryCompareAnsiStringList.CompareStrings(const S1, S2: string{TNT-ALLOW string}): Integer; +begin + // must compare strings via binary for speed + if S1 = S2 then + result := 0 + else if S1 < S2 then + result := -1 + else + result := 1; +end; + +{ TTntInplaceEdit } + +procedure TTntInplaceEdit.CreateWindowHandle(const Params: TCreateParams); +begin + TntCustomEdit_CreateWindowHandle(Self, Params); +end; + +function TTntInplaceEdit.GetText: WideString; +begin + if IsMasked then + Result := inherited Text + else + Result := TntControl_GetText(Self); +end; + +procedure TTntInplaceEdit.SetText(const Value: WideString); +begin + if IsMasked then + inherited Text := Value + else + TntControl_SetText(Self, Value); +end; + +type TAccessCustomGrid = class(TCustomGrid); + +procedure TTntInplaceEdit.UpdateContents; +begin + Text := ''; + with TAccessCustomGrid(Grid) do + Self.EditMask := GetEditMask(Col, Row); + if (Grid is TTntStringGrid) then + with (Grid as TTntStringGrid) do + Self.Text := GetEditText(Col, Row) + else if (Grid is TTntCustomDrawGrid) then + with (Grid as TTntCustomDrawGrid) do + Self.Text := GetEditText(Col, Row) + else + with TAccessCustomGrid(Grid) do + Self.Text := GetEditText(Col, Row); + with TAccessCustomGrid(Grid) do + Self.MaxLength := GetEditLimit; +end; + +{ _TTntInternalCustomDrawGrid } + +procedure _TTntInternalCustomDrawGrid.SetEditText(ACol, ARow: Integer; const Value: string{TNT-ALLOW string}); +begin + if FSettingEditText then + inherited + else + InternalSetEditText(ACol, ARow, Value); +end; + + +{ TTntCustomDrawGrid } + +function TTntCustomDrawGrid.CreateEditor: TInplaceEdit{TNT-ALLOW TInplaceEdit}; +begin + Result := TTntInplaceEdit.Create(Self); +end; + +procedure TTntCustomDrawGrid.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle(Self, Params, ''); +end; + +procedure TTntCustomDrawGrid.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntCustomDrawGrid.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TTntCustomDrawGrid.GetHint: WideString; +begin + Result := TntControl_GetHint(Self); +end; + +procedure TTntCustomDrawGrid.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +function TTntCustomDrawGrid.GetEditText(ACol, ARow: Integer): WideString; +begin + Result := ''; + if Assigned(FOnGetEditText) then FOnGetEditText(Self, ACol, ARow, Result); +end; + +procedure TTntCustomDrawGrid.InternalSetEditText(ACol, ARow: Integer; const Value: string{TNT-ALLOW string}); +begin + if not FSettingEditText then + SetEditText(ACol, ARow, TntControl_GetText(InplaceEditor)); +end; + +procedure TTntCustomDrawGrid.SetEditText(ACol, ARow: Integer; const Value: WideString); +begin + if Assigned(FOnSetEditText) then FOnSetEditText(Self, ACol, ARow, Value); +end; + +procedure TTntCustomDrawGrid.WMChar(var Msg: TWMChar); +begin + if (goEditing in Options) + and (AnsiChar(Msg.CharCode) in [^H, #32..#255]) then begin + RestoreWMCharMsg(TMessage(Msg)); + ShowEditorChar(WideChar(Msg.CharCode)); + end else + inherited; +end; + +procedure TTntCustomDrawGrid.ShowEditorChar(Ch: WideChar); +begin + ShowEditor; + if InplaceEditor <> nil then begin + if Win32PlatformIsUnicode then + PostMessageW(InplaceEditor.Handle, WM_CHAR, Word(Ch), 0) + else + PostMessageA(InplaceEditor.Handle, WM_CHAR, Word(Ch), 0); + end; +end; + +procedure TTntCustomDrawGrid.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntCustomDrawGrid.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +{ TTntStringGridStrings } + +procedure TTntStringGridStrings.Assign(Source: TPersistent); +var + UTF8Strings: TStringList{TNT-ALLOW TStringList}; + i: integer; +begin + UTF8Strings := TStringList{TNT-ALLOW TStringList}.Create; + try + if Source is TStrings{TNT-ALLOW TStrings} then begin + for i := 0 to TStrings{TNT-ALLOW TStrings}(Source).Count - 1 do + UTF8Strings.AddObject(WideStringToUTF8(WideString(TStrings{TNT-ALLOW TStrings}(Source).Strings[i])), + TStrings{TNT-ALLOW TStrings}(Source).Objects[i]); + GridAnsiStrings.Assign(UTF8Strings); + end else if Source is TTntStrings then begin + for i := 0 to TTntStrings(Source).Count - 1 do + UTF8Strings.AddObject(WideStringToUTF8(TTntStrings(Source).Strings[i]), + TTntStrings(Source).Objects[i]); + GridAnsiStrings.Assign(UTF8Strings); + end else + GridAnsiStrings.Assign(Source); + finally + UTF8Strings.Free; + end; +end; + +function TTntStringGridStrings.GridAnsiStrings: TStrings{TNT-ALLOW TStrings}; +begin + Assert(Assigned(FGrid)); + if FIsCol then + Result := TStringGrid{TNT-ALLOW TStringGrid}(FGrid).Cols[FColRowIndex] + else + Result := TStringGrid{TNT-ALLOW TStringGrid}(FGrid).Rows[FColRowIndex]; +end; + +procedure TTntStringGridStrings.Clear; +begin + GridAnsiStrings.Clear; +end; + +procedure TTntStringGridStrings.Delete(Index: Integer); +begin + GridAnsiStrings.Delete(Index); +end; + +function TTntStringGridStrings.GetCount: Integer; +begin + Result := GridAnsiStrings.Count; +end; + +function TTntStringGridStrings.Get(Index: Integer): WideString; +begin + Result := UTF8ToWideString(GridAnsiStrings[Index]); +end; + +procedure TTntStringGridStrings.Put(Index: Integer; const S: WideString); +begin + GridAnsiStrings[Index] := WideStringToUTF8(S); +end; + +procedure TTntStringGridStrings.Insert(Index: Integer; const S: WideString); +begin + GridAnsiStrings.Insert(Index, WideStringToUTF8(S)); +end; + +function TTntStringGridStrings.Add(const S: WideString): Integer; +begin + Result := GridAnsiStrings.Add(WideStringToUTF8(S)); +end; + +function TTntStringGridStrings.GetObject(Index: Integer): TObject; +begin + Result := GridAnsiStrings.Objects[Index]; +end; + +procedure TTntStringGridStrings.PutObject(Index: Integer; AObject: TObject); +begin + GridAnsiStrings.Objects[Index] := AObject; +end; + +type TAccessStrings = class(TStrings{TNT-ALLOW TStrings}); + +procedure TTntStringGridStrings.SetUpdateState(Updating: Boolean); +begin + TAccessStrings(GridAnsiStrings).SetUpdateState(Updating); +end; + +constructor TTntStringGridStrings.Create(AGrid: TTntStringGrid; AIndex: Integer); +begin + inherited Create; + FGrid := AGrid; + if AIndex > 0 then begin + FIsCol := False; + FColRowIndex := AIndex - 1; + end else begin + FIsCol := True; + FColRowIndex := -AIndex - 1; + end; +end; + +{ _TTntInternalStringGrid } + +procedure _TTntInternalStringGrid.SetEditText(ACol, ARow: Integer; const Value: string{TNT-ALLOW string}); +begin + if FSettingEditText then + inherited + else + InternalSetEditText(ACol, ARow, Value); +end; + +{ TTntStringGrid } + +constructor TTntStringGrid.Create(AOwner: TComponent); +begin + inherited; + FCreatedRowStrings := TBinaryCompareAnsiStringList.Create; + FCreatedRowStrings.Sorted := True; + FCreatedRowStrings.Duplicates := dupError; + FCreatedColStrings := TBinaryCompareAnsiStringList.Create; + FCreatedColStrings.Sorted := True; + FCreatedColStrings.Duplicates := dupError; +end; + +destructor TTntStringGrid.Destroy; +var + i: integer; +begin + for i := FCreatedColStrings.Count - 1 downto 0 do + FCreatedColStrings.Objects[i].Free; + for i := FCreatedRowStrings.Count - 1 downto 0 do + FCreatedRowStrings.Objects[i].Free; + FreeAndNil(FCreatedColStrings); + FreeAndNil(FCreatedRowStrings); + inherited; +end; + +function TTntStringGrid.CreateEditor: TInplaceEdit{TNT-ALLOW TInplaceEdit}; +begin + Result := TTntInplaceEdit.Create(Self); +end; + +procedure TTntStringGrid.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle(Self, Params, ''); +end; + +procedure TTntStringGrid.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntStringGrid.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TTntStringGrid.GetHint: WideString; +begin + Result := TntControl_GetHint(Self) +end; + +procedure TTntStringGrid.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +function TTntStringGrid.GetCells(ACol, ARow: Integer): WideString; +begin + Result := UTF8ToWideString(inherited Cells[ACol, ARow]) +end; + +procedure TTntStringGrid.SetCells(ACol, ARow: Integer; const Value: WideString); +var + UTF8Str: AnsiString; +begin + UTF8Str := WideStringToUTF8(Value); + if inherited Cells[ACol, ARow] <> UTF8Str then + inherited Cells[ACol, ARow] := UTF8Str; +end; + +function TTntStringGrid.FindGridStrings(const IsCol: Boolean; const ListIndex: Integer): TTntStrings; +var + idx: integer; + SrcStrings: TStrings{TNT-ALLOW TStrings}; + RCIndex: Integer; +begin + if IsCol then + SrcStrings := FCreatedColStrings + else + SrcStrings := FCreatedRowStrings; + Assert(Assigned(SrcStrings)); + idx := SrcStrings.IndexOf(IntToStr(ListIndex)); + if idx <> -1 then + Result := SrcStrings.Objects[idx] as TTntStrings + else begin + if IsCol then RCIndex := -ListIndex - 1 else RCIndex := ListIndex + 1; + Result := TTntStringGridStrings.Create(Self, RCIndex); + SrcStrings.AddObject(IntToStr(ListIndex), Result); + end; +end; + +function TTntStringGrid.GetCols(Index: Integer): TTntStrings; +begin + Result := FindGridStrings(True, Index); +end; + +function TTntStringGrid.GetRows(Index: Integer): TTntStrings; +begin + Result := FindGridStrings(False, Index); +end; + +procedure TTntStringGrid.SetCols(Index: Integer; const Value: TTntStrings); +begin + FindGridStrings(True, Index).Assign(Value); +end; + +procedure TTntStringGrid.SetRows(Index: Integer; const Value: TTntStrings); +begin + FindGridStrings(False, Index).Assign(Value); +end; + +procedure TTntStringGrid.DrawCell(ACol, ARow: Integer; ARect: TRect; AState: TGridDrawState); +var + SaveDefaultDrawing: Boolean; +begin + if DefaultDrawing then + WideCanvasTextRect(Canvas, ARect, ARect.Left+2, ARect.Top+2, Cells[ACol, ARow]); + SaveDefaultDrawing := DefaultDrawing; + try + DefaultDrawing := False; + inherited DrawCell(ACol, ARow, ARect, AState); + finally + DefaultDrawing := SaveDefaultDrawing; + end; +end; + +function TTntStringGrid.GetEditText(ACol, ARow: Integer): WideString; +begin + Result := Cells[ACol, ARow]; + if Assigned(FOnGetEditText) then FOnGetEditText(Self, ACol, ARow, Result); +end; + +procedure TTntStringGrid.InternalSetEditText(ACol, ARow: Integer; const Value: string{TNT-ALLOW string}); +begin + if not FSettingEditText then + SetEditText(ACol, ARow, TntControl_GetText(InplaceEditor)); +end; + +procedure TTntStringGrid.SetEditText(ACol, ARow: Integer; const Value: WideString); +begin + FSettingEditText := True; + try + inherited SetEditText(ACol, ARow, WideStringToUTF8(Value)); + finally + FSettingEditText := False; + end; + if Assigned(FOnSetEditText) then FOnSetEditText(Self, ACol, ARow, Value); +end; + +procedure TTntStringGrid.WMChar(var Msg: TWMChar); +begin + if (goEditing in Options) + and (AnsiChar(Msg.CharCode) in [^H, #32..#255]) then begin + RestoreWMCharMsg(TMessage(Msg)); + ShowEditorChar(WideChar(Msg.CharCode)); + end else + inherited; +end; + +procedure TTntStringGrid.ShowEditorChar(Ch: WideChar); +begin + ShowEditor; + if InplaceEditor <> nil then begin + if Win32PlatformIsUnicode then + PostMessageW(InplaceEditor.Handle, WM_CHAR, Word(Ch), 0) + else + PostMessageA(InplaceEditor.Handle, WM_CHAR, Word(Ch), 0); + end; +end; + +procedure TTntStringGrid.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntStringGrid.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +end. diff --git a/internal/1/Source/TntListActns.pas b/internal/1/Source/TntListActns.pas new file mode 100644 index 0000000..00601c0 --- /dev/null +++ b/internal/1/Source/TntListActns.pas @@ -0,0 +1,207 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntListActns; + +{$INCLUDE TntCompilers.inc} + +interface + +uses + Classes, TntActnList, ListActns; + +type +{TNT-WARN TCustomListAction} + TTntCustomListAction = class(TCustomListAction{TNT-ALLOW TCustomListAction}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + public + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TStaticListAction} + TTntStaticListAction = class(TStaticListAction{TNT-ALLOW TStaticListAction}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TVirtualListAction} + TTntVirtualListAction = class(TVirtualListAction{TNT-ALLOW TVirtualListAction}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +implementation + +uses + ActnList, TntClasses; + +{TNT-IGNORE-UNIT} + +type TAccessCustomListAction = class(TCustomListAction); + +procedure TntListActn_AfterInherited_Assign(Action: TCustomAction{TNT-ALLOW TCustomAction}; Source: TPersistent); +begin + TntAction_AfterInherited_Assign(Action, Source); + // TCustomListAction + if (Action is TCustomListAction) and (Source is TCustomListAction) then begin + TAccessCustomListAction(Action).Images := TAccessCustomListAction(Source).Images; + TAccessCustomListAction(Action).OnGetItemCount := TAccessCustomListAction(Source).OnGetItemCount; + TAccessCustomListAction(Action).OnItemSelected := TAccessCustomListAction(Source).OnItemSelected; + TAccessCustomListAction(Action).Active := TAccessCustomListAction(Source).Active; + TAccessCustomListAction(Action).ItemIndex := TAccessCustomListAction(Source).ItemIndex; + end; + // TStaticListAction + if (Action is TStaticListAction) and (Source is TStaticListAction) then begin + TStaticListAction(Action).Items := TStaticListAction(Source).Items; + TStaticListAction(Action).OnGetItem := TStaticListAction(Source).OnGetItem; + end; + // TVirtualListAction + if (Action is TVirtualListAction) and (Source is TVirtualListAction) then begin + TVirtualListAction(Action).OnGetItem := TVirtualListAction(Source).OnGetItem; + end; +end; + +//------------------------- +// TNT LIST ACTNS +//------------------------- + +{ TTntCustomListAction } + +procedure TTntCustomListAction.Assign(Source: TPersistent); +begin + inherited; + TntListActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntCustomListAction.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntCustomListAction.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntCustomListAction.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntCustomListAction.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntCustomListAction.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntStaticListAction } + +procedure TTntStaticListAction.Assign(Source: TPersistent); +begin + inherited; + TntListActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntStaticListAction.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntStaticListAction.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntStaticListAction.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntStaticListAction.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntStaticListAction.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntVirtualListAction } + +procedure TTntVirtualListAction.Assign(Source: TPersistent); +begin + inherited; + TntListActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntVirtualListAction.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntVirtualListAction.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntVirtualListAction.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntVirtualListAction.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntVirtualListAction.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +end. diff --git a/internal/1/Source/TntMenus.pas b/internal/1/Source/TntMenus.pas new file mode 100644 index 0000000..5777646 --- /dev/null +++ b/internal/1/Source/TntMenus.pas @@ -0,0 +1,1146 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntMenus; + +{$INCLUDE TntCompilers.inc} + +interface + +uses + Windows, Classes, Menus, Graphics, Messages; + +type +{TNT-WARN TMenuItem} + TTntMenuItem = class(TMenuItem{TNT-ALLOW TMenuItem}) + private + FIgnoreMenuChanged: Boolean; + FCaption: WideString; + FHint: WideString; + FKeyboardLayout: HKL; + function GetCaption: WideString; + procedure SetInheritedCaption(const Value: AnsiString); + procedure SetCaption(const Value: WideString); + function IsCaptionStored: Boolean; + procedure UpdateMenuString(ParentMenu: TMenu); + function GetAlignmentDrawStyle: Word; + function MeasureItemTextWidth(ACanvas: TCanvas; const Text: WideString): Integer; + function GetHint: WideString; + procedure SetInheritedHint(const Value: AnsiString); + procedure SetHint(const Value: WideString); + function IsHintStored: Boolean; + protected + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TMenuActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + procedure MenuChanged(Rebuild: Boolean); override; + procedure AdvancedDrawItem(ACanvas: TCanvas; ARect: TRect; + State: TOwnerDrawState; TopLevel: Boolean); override; + procedure DoDrawText(ACanvas: TCanvas; const ACaption: WideString; + var Rect: TRect; Selected: Boolean; Flags: Integer); + procedure MeasureItem(ACanvas: TCanvas; var Width, Height: Integer); override; + public + procedure InitiateAction; override; + procedure Loaded; override; + function Find(ACaption: WideString): TMenuItem{TNT-ALLOW TMenuItem}; + published + property Caption: WideString read GetCaption write SetCaption stored IsCaptionStored; + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TMainMenu} + TTntMainMenu = class(TMainMenu{TNT-ALLOW TMainMenu}) + protected + procedure DoChange(Source: TMenuItem{TNT-ALLOW TMenuItem}; Rebuild: Boolean); override; + public + {$IFDEF COMPILER_9_UP} + function CreateMenuItem: TMenuItem{TNT-ALLOW TMenuItem}; override; + {$ENDIF} + end; + +{TNT-WARN TPopupMenu} + TTntPopupMenu = class(TPopupMenu{TNT-ALLOW TPopupMenu}) + protected + procedure DoChange(Source: TMenuItem{TNT-ALLOW TMenuItem}; Rebuild: Boolean); override; + public + constructor Create(AOwner: TComponent); override; + {$IFDEF COMPILER_9_UP} + function CreateMenuItem: TMenuItem{TNT-ALLOW TMenuItem}; override; + {$ENDIF} + destructor Destroy; override; + procedure Popup(X, Y: Integer); override; + end; + +{TNT-WARN NewSubMenu} +function WideNewSubMenu(const ACaption: WideString; hCtx: THelpContext; + const AName: TComponentName; const Items: array of TTntMenuItem; + AEnabled: Boolean): TTntMenuItem; +{TNT-WARN NewItem} +function WideNewItem(const ACaption: WideString; AShortCut: TShortCut; + AChecked, AEnabled: Boolean; AOnClick: TNotifyEvent; hCtx: THelpContext; + const AName: TComponentName): TTntMenuItem; + +function MessageToShortCut(Msg: TWMKeyDown): TShortCut; + +{TNT-WARN ShortCutToText} +function WideShortCutToText(WordShortCut: Word): WideString; +{TNT-WARN TextToShortCut} +function WideTextToShortCut(Text: WideString): TShortCut; +{TNT-WARN GetHotKey} +function WideGetHotkey(const Text: WideString): WideString; +{TNT-WARN StripHotkey} +function WideStripHotkey(const Text: WideString): WideString; +{TNT-WARN AnsiSameCaption} +function WideSameCaption(const Text1, Text2: WideString): Boolean; + +function WideGetMenuItemCaption(MenuItem: TMenuItem{TNT-ALLOW TMenuItem}): WideString; +function WideGetMenuItemHint(MenuItem: TMenuItem{TNT-ALLOW TMenuItem}): WideString; + +procedure NoOwnerDrawTopLevelItems(Menu: TMainMenu{TNT-ALLOW TMainMenu}); + +procedure FixMenuBiDiProblem(Menu: TMenu); + +function MenuItemHasBitmap(MenuItem: TMenuItem{TNT-ALLOW TMenuItem}): Boolean; + +type + TTntPopupList = class(TPopupList) + private + SavedPopupList: TPopupList; + protected + procedure WndProc(var Message: TMessage); override; + end; + +var + TntPopupList: TTntPopupList; + +implementation + +uses + Forms, SysUtils, Consts, ActnList, ImgList, TntControls, TntGraphics, + TntActnList, TntClasses, TntForms, TntSysUtils, TntWindows; + +function WideNewSubMenu(const ACaption: WideString; hCtx: THelpContext; + const AName: TComponentName; const Items: array of TTntMenuItem; + AEnabled: Boolean): TTntMenuItem; +var + I: Integer; +begin + Result := TTntMenuItem.Create(nil); + for I := Low(Items) to High(Items) do + Result.Add(Items[I]); + Result.Caption := ACaption; + Result.HelpContext := hCtx; + Result.Name := AName; + Result.Enabled := AEnabled; +end; + +function WideNewItem(const ACaption: WideString; AShortCut: TShortCut; + AChecked, AEnabled: Boolean; AOnClick: TNotifyEvent; hCtx: THelpContext; + const AName: TComponentName): TTntMenuItem; +begin + Result := TTntMenuItem.Create(nil); + with Result do + begin + Caption := ACaption; + ShortCut := AShortCut; + OnClick := AOnClick; + HelpContext := hCtx; + Checked := AChecked; + Enabled := AEnabled; + Name := AName; + end; +end; + +function MessageToShortCut(Msg: TWMKeyDown): TShortCut; +var + ShiftState: TShiftState; +begin + ShiftState := Forms.KeyDataToShiftState(TWMKeyDown(Msg).KeyData); + Result := Menus.ShortCut(TWMKeyDown(Msg).CharCode, ShiftState); +end; + +function WideGetSpecialName(WordShortCut: Word): WideString; +var + ScanCode: Integer; + KeyName: array[0..255] of WideChar; +begin + Assert(Win32PlatformIsUnicode); + Result := ''; + ScanCode := MapVirtualKeyW(WordRec(WordShortCut).Lo, 0) shl 16; + if ScanCode <> 0 then + begin + GetKeyNameTextW(ScanCode, KeyName, SizeOf(KeyName)); + Result := KeyName; + end; +end; + +function WideGetKeyboardChar(Key: Word): WideChar; +var + LatinNumChar: WideChar; +begin + Assert(Win32PlatformIsUnicode); + Result := WideChar(MapVirtualKeyW(Key, 2)); + if (Key in [$30..$39]) then + begin + // Check to see if "0" - "9" can be used if all that differs is shift state + LatinNumChar := WideChar(Key - $30 + Ord('0')); + if (Result <> LatinNumChar) + and (Byte(Key) = WordRec(VkKeyScanW(LatinNumChar)).Lo) then // .Hi would be the shift state + Result := LatinNumChar; + end; +end; + +function WideShortCutToText(WordShortCut: Word): WideString; +var + Name: WideString; +begin + if (not Win32PlatformIsUnicode) + or (WordRec(WordShortCut).Lo in [$08..$09 {BKSP, TAB}, $0D {ENTER}, $1B {ESC}, $20..$28 {Misc Nav}, + $2D..$2E {INS, DEL}, $70..$87 {F1 - F24}]) + then + Result := ShortCutToText{TNT-ALLOW ShortCutToText}(WordShortCut) + else begin + case WordRec(WordShortCut).Lo of + $30..$39: Name := WideGetKeyboardChar(WordRec(WordShortCut).Lo); {1-9,0} + $41..$5A: Name := WideGetKeyboardChar(WordRec(WordShortCut).Lo); {A-Z} + $60..$69: Name := WideGetKeyboardChar(WordRec(WordShortCut).Lo); {numpad 1-9,0} + else + Name := WideGetSpecialName(WordShortCut); + end; + if Name <> '' then + begin + Result := ''; + if WordShortCut and scShift <> 0 then Result := Result + SmkcShift; + if WordShortCut and scCtrl <> 0 then Result := Result + SmkcCtrl; + if WordShortCut and scAlt <> 0 then Result := Result + SmkcAlt; + Result := Result + Name; + end + else Result := ''; + end; +end; + +{ This function is *very* slow. Use sparingly. Return 0 if no VK code was + found for the text } + +function WideTextToShortCut(Text: WideString): TShortCut; + + { If the front of Text is equal to Front then remove the matching piece + from Text and return True, otherwise return False } + + function CompareFront(var Text: WideString; const Front: WideString): Boolean; + begin + Result := (Pos(Front, Text) = 1); + if Result then + Delete(Text, 1, Length(Front)); + end; + +var + Key: TShortCut; + Shift: TShortCut; +begin + Result := 0; + Shift := 0; + while True do + begin + if CompareFront(Text, SmkcShift) then Shift := Shift or scShift + else if CompareFront(Text, '^') then Shift := Shift or scCtrl + else if CompareFront(Text, SmkcCtrl) then Shift := Shift or scCtrl + else if CompareFront(Text, SmkcAlt) then Shift := Shift or scAlt + else Break; + end; + if Text = '' then Exit; + for Key := $08 to $255 do { Copy range from table in ShortCutToText } + if WideSameText(Text, WideShortCutToText(Key)) then + begin + Result := Key or Shift; + Exit; + end; +end; + +function WideGetHotkeyPos(const Text: WideString): Integer; +var + I, L: Integer; +begin + Result := 0; + I := 1; + L := Length(Text); + while I <= L do + begin + if (Text[I] = cHotkeyPrefix) and (L - I >= 1) then + begin + Inc(I); + if Text[I] <> cHotkeyPrefix then + Result := I; // this might not be the last + end; + Inc(I); + end; +end; + +function WideGetHotkey(const Text: WideString): WideString; +var + I: Integer; +begin + I := WideGetHotkeyPos(Text); + if I = 0 then + Result := '' + else + Result := Text[I]; +end; + +function WideStripHotkey(const Text: WideString): WideString; +var + I: Integer; +begin + Result := Text; + I := 1; + while I <= Length(Result) do + begin + if Result[I] = cHotkeyPrefix then + if SysLocale.FarEast + and ((I > 1) and (Length(Result) - I >= 2) + and (Result[I - 1] = '(') and (Result[I + 2] = ')')) then begin + Delete(Result, I - 1, 4); + Dec(I, 2); + end else + Delete(Result, I, 1); + Inc(I); + end; +end; + +function WideSameCaption(const Text1, Text2: WideString): Boolean; +begin + Result := WideSameText(WideStripHotkey(Text1), WideStripHotkey(Text2)); +end; + +function WideSameCaptionStr(const Text1, Text2: WideString): Boolean; +begin + Result := WideSameStr(WideStripHotkey(Text1), WideStripHotkey(Text2)); +end; + +function WideGetMenuItemCaption(MenuItem: TMenuItem{TNT-ALLOW TMenuItem}): WideString; +begin + if MenuItem is TTntMenuItem then + Result := TTntMenuItem(MenuItem).Caption + else + Result := MenuItem.Caption; +end; + +function WideGetMenuItemHint(MenuItem: TMenuItem{TNT-ALLOW TMenuItem}): WideString; +begin + if MenuItem is TTntMenuItem then + Result := TTntMenuItem(MenuItem).Hint + else + Result := MenuItem.Hint; +end; + +procedure NoOwnerDrawTopLevelItems(Menu: TMainMenu{TNT-ALLOW TMainMenu}); +{If top-level items are created as owner-drawn, they will not appear as raised +buttons when the mouse hovers over them. The VCL will often create top-level +items as owner-drawn even when they don't need to be (owner-drawn state can be +set on an item-by-item basis). This routine turns off the owner-drawn flag for +top-level items if it appears unnecessary} + + function ItemHasValidImage(Item: TMenuItem{TNT-ALLOW TMenuItem}): boolean; + var + Images: TCustomImageList; + begin + Assert(Item <> nil, 'TNT Internal Error: ItemHasValidImage: item = nil'); + Images := Item.GetImageList; + Result := (Assigned(Images) and (Item.ImageIndex >= 0) and (Item.ImageIndex < Images.Count)) + or (MenuItemHasBitmap(Item) and (not Item.Bitmap.Empty)) + end; + +var + HM: HMenu; + i: integer; + Info: TMenuItemInfoA; + Item: TMenuItem{TNT-ALLOW TMenuItem}; + Win98Plus: boolean; +begin + if Assigned(Menu) then begin + Win98Plus:= (Win32MajorVersion > 4) + or((Win32MajorVersion = 4) and (Win32MinorVersion > 0)); + if not Win98Plus then + Exit; {exit if Windows 95 or NT 4.0} + HM:= Menu.Handle; + Info.cbSize:= sizeof(Info); + for i := 0 to GetMenuItemCount(HM) - 1 do begin + Info.fMask:= MIIM_FTYPE or MIIM_ID; + if not GetMenuItemInfo(HM, i, true, Info) then + Break; + if Info.fType and MFT_OWNERDRAW <> 0 then begin + Item:= Menu.FindItem(Info.wID, fkCommand); + if not Assigned(Item) then + continue; + if Assigned(Item.OnDrawItem) + or Assigned(Item.OnAdvancedDrawItem) + or ItemHasValidImage(Item) then + Continue; + Info.fMask:= MIIM_FTYPE or MIIM_STRING; + Info.fType:= (Info.fType and not MFT_OWNERDRAW) or MFT_STRING; + if Win32PlatformIsUnicode and (Item is TTntMenuItem) then begin + // Unicode + TMenuItemInfoW(Info).dwTypeData:= PWideChar(TTntMenuItem(Item).Caption); + SetMenuItemInfoW(HM, i, true, TMenuItemInfoW(Info)); + end else begin + // Ansi + Info.dwTypeData:= PAnsiChar(Item.Caption); + SetMenuItemInfoA(HM, i, true, Info); + end; + end; + end; + end; +end; + +{ TTntMenuItem's utility procs } + +procedure SyncHotKeyPosition(const Source: WideString; var Dest: WideString); +var + I: Integer; + FarEastHotString: WideString; +begin + if (AnsiString(Source) <> AnsiString(Dest)) + and WideSameCaptionStr(AnsiString(Source), AnsiString(Dest)) then begin + // when reduced to ansi, the only difference is hot key positions + Dest := WideStripHotkey(Dest); + I := 1; + while I <= Length(Source) do + begin + if Source[I] = cHotkeyPrefix then begin + if SysLocale.FarEast + and ((I > 1) and (Length(Source) - I >= 2) + and (Source[I - 1] = '(') and (Source[I + 2] = ')')) then begin + FarEastHotString := Copy(Source, I - 1, 4); + Dec(I); + Insert(FarEastHotString, Dest, I); + Inc(I, 3); + end else begin + Insert(cHotkeyPrefix, Dest, I); + Inc(I); + end; + end; + Inc(I); + end; + // test work + if AnsiString(Source) <> AnsiString(Dest) then + raise ETntInternalError.CreateFmt('Internal Error: SyncHotKeyPosition Failed ("%s" <> "%s").', + [AnsiString(Source), AnsiString(Dest)]); + end; +end; + +procedure UpdateMenuItems(Items: TMenuItem{TNT-ALLOW TMenuItem}; ParentMenu: TMenu); +var + i: integer; +begin + if (Items.ComponentState * [csReading, csDestroying] = []) then begin + for i := Items.Count - 1 downto 0 do + UpdateMenuItems(Items[i], ParentMenu); + if Items is TTntMenuItem then + TTntMenuItem(Items).UpdateMenuString(ParentMenu); + end; +end; + +procedure FixMenuBiDiProblem(Menu: TMenu); +var + i: integer; +begin + // TMenu sometimes sets bidi on first visible item which can convert caption to ansi + if (SysLocale.MiddleEast) + and (Menu <> nil) + and (Menu.Items.Count > 0) then + begin + for i := 0 to Menu.Items.Count - 1 do begin + if Menu.Items[i].Visible then begin + if (Menu.Items[i] is TTntMenuItem) then + (Menu.Items[i] as TTntMenuItem).UpdateMenuString(Menu); + break; // found first visible menu item! + end; + end; + end; +end; + + +{$IFDEF COMPILER_6} // verified against VCL source in Delphi 6 and BCB 6 +type + THackMenuItem = class(TComponent) + protected + FxxxxCaption: Ansistring; + FxxxxHandle: HMENU; + FxxxxChecked: Boolean; + FxxxxEnabled: Boolean; + FxxxxDefault: Boolean; + FxxxxAutoHotkeys: TMenuItemAutoFlag; + FxxxxAutoLineReduction: TMenuItemAutoFlag; + FxxxxRadioItem: Boolean; + FxxxxVisible: Boolean; + FxxxxGroupIndex: Byte; + FxxxxImageIndex: TImageIndex; + FxxxxActionLink: TMenuActionLink{TNT-ALLOW TMenuActionLink}; + FxxxxBreak: TMenuBreak; + FBitmap: TBitmap; + FxxxxCommand: Word; + FxxxxHelpContext: THelpContext; + FxxxxHint: AnsiString; + FxxxxItems: TList; + FxxxxShortCut: TShortCut; + FxxxxParent: TMenuItem{TNT-ALLOW TMenuItem}; + FMerged: TMenuItem{TNT-ALLOW TMenuItem}; + FMergedWith: TMenuItem{TNT-ALLOW TMenuItem}; + end; +{$ENDIF} +{$IFDEF DELPHI_7} // verified against VCL source in Delphi 7 +type + THackMenuItem = class(TComponent) + protected + FxxxxCaption: AnsiString; + FxxxxHandle: HMENU; + FxxxxChecked: Boolean; + FxxxxEnabled: Boolean; + FxxxxDefault: Boolean; + FxxxxAutoHotkeys: TMenuItemAutoFlag; + FxxxxAutoLineReduction: TMenuItemAutoFlag; + FxxxxRadioItem: Boolean; + FxxxxVisible: Boolean; + FxxxxGroupIndex: Byte; + FxxxxImageIndex: TImageIndex; + FxxxxActionLink: TMenuActionLink{TNT-ALLOW TMenuActionLink}; + FxxxxBreak: TMenuBreak; + FBitmap: TBitmap; + FxxxxCommand: Word; + FxxxxHelpContext: THelpContext; + FxxxxHint: AnsiString; + FxxxxItems: TList; + FxxxxShortCut: TShortCut; + FxxxxParent: TMenuItem{TNT-ALLOW TMenuItem}; + FMerged: TMenuItem{TNT-ALLOW TMenuItem}; + FMergedWith: TMenuItem{TNT-ALLOW TMenuItem}; + end; +{$ENDIF} +{$IFDEF DELPHI_9} // verified against VCL source in Delphi 9 +type + THackMenuItem = class(TComponent) + protected + FxxxxCaption: AnsiString; + FxxxxHandle: HMENU; + FxxxxChecked: Boolean; + FxxxxEnabled: Boolean; + FxxxxDefault: Boolean; + FxxxxAutoHotkeys: TMenuItemAutoFlag; + FxxxxAutoLineReduction: TMenuItemAutoFlag; + FxxxxRadioItem: Boolean; + FxxxxVisible: Boolean; + FxxxxGroupIndex: Byte; + FxxxxImageIndex: TImageIndex; + FxxxxActionLink: TMenuActionLink{TNT-ALLOW TMenuActionLink}; + FxxxxBreak: TMenuBreak; + FBitmap: TBitmap; + FxxxxCommand: Word; + FxxxxHelpContext: THelpContext; + FxxxxHint: AnsiString; + FxxxxItems: TList; + FxxxxShortCut: TShortCut; + FxxxxParent: TMenuItem{TNT-ALLOW TMenuItem}; + FMerged: TMenuItem{TNT-ALLOW TMenuItem}; + FMergedWith: TMenuItem{TNT-ALLOW TMenuItem}; + end; +{$ENDIF} +{$IFDEF DELPHI_10} // verified against VCL source in Delphi 10 +type + THackMenuItem = class(TComponent) + protected + FxxxxCaption: AnsiString; + FxxxxHandle: HMENU; + FxxxxChecked: Boolean; + FxxxxEnabled: Boolean; + FxxxxDefault: Boolean; + FxxxxAutoHotkeys: TMenuItemAutoFlag; + FxxxxAutoLineReduction: TMenuItemAutoFlag; + FxxxxRadioItem: Boolean; + FxxxxVisible: Boolean; + FxxxxGroupIndex: Byte; + FxxxxImageIndex: TImageIndex; + FxxxxActionLink: TMenuActionLink{TNT-ALLOW TMenuActionLink}; + FxxxxBreak: TMenuBreak; + FBitmap: TBitmap; + FxxxxCommand: Word; + FxxxxHelpContext: THelpContext; + FxxxxHint: AnsiString; + FxxxxItems: TList; + FxxxxShortCut: TShortCut; + FxxxxParent: TMenuItem{TNT-ALLOW TMenuItem}; + FMerged: TMenuItem{TNT-ALLOW TMenuItem}; + FMergedWith: TMenuItem{TNT-ALLOW TMenuItem}; + end; +{$ENDIF} + +function MenuItemHasBitmap(MenuItem: TMenuItem{TNT-ALLOW TMenuItem}): Boolean; +begin + Result := Assigned(THackMenuItem(MenuItem).FBitmap); +end; + +{ TTntMenuItem } + +procedure TTntMenuItem.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +type TAccessActionlink = class(TActionLink); + +procedure TTntMenuItem.InitiateAction; +begin + if GetKeyboardLayout(0) <> FKeyboardLayout then + MenuChanged(False); + inherited; +end; + +function TTntMenuItem.IsCaptionStored: Boolean; +begin + Result := (ActionLink = nil) or (not TAccessActionlink(ActionLink).IsCaptionLinked); +end; + +procedure TTntMenuItem.SetInheritedCaption(const Value: AnsiString); +begin + inherited Caption := Value; +end; + +function TTntMenuItem.GetCaption: WideString; +begin + if (AnsiString(FCaption) <> inherited Caption) + and WideSameCaptionStr(AnsiString(FCaption), inherited Caption) then + begin + // only difference is hotkey position, update caption with new hotkey position + SyncHotKeyPosition(inherited Caption, FCaption); + end; + Result := GetSyncedWideString(FCaption, (inherited Caption)); +end; + +procedure TTntMenuItem.SetCaption(const Value: WideString); +begin + GetCaption; // auto adjust for hot key changes + SetSyncedWideString(Value, FCaption, (inherited Caption), SetInheritedCaption); +end; + +function TTntMenuItem.GetHint: WideString; +begin + Result := GetSyncedWideString(FHint, inherited Hint); +end; + +procedure TTntMenuItem.SetInheritedHint(const Value: AnsiString); +begin + inherited Hint := Value; +end; + +procedure TTntMenuItem.SetHint(const Value: WideString); +begin + SetSyncedWideString(Value, FHint, inherited Hint, SetInheritedHint); +end; + +function TTntMenuItem.IsHintStored: Boolean; +begin + Result := (ActionLink = nil) or not TAccessActionlink(ActionLink).IsHintLinked; +end; + +procedure TTntMenuItem.Loaded; +begin + inherited; + UpdateMenuString(GetParentMenu); +end; + +procedure TTntMenuItem.MenuChanged(Rebuild: Boolean); +begin + if (not FIgnoreMenuChanged) then begin + inherited; + UpdateMenuItems(Self, GetParentMenu); + FixMenuBiDiProblem(GetParentMenu); + end; +end; + +procedure TTntMenuItem.UpdateMenuString(ParentMenu: TMenu); +var + ParentHandle: THandle; + + function NativeMenuTypeIsString: Boolean; + var + MenuItemInfo: TMenuItemInfoW; + Buffer: array[0..79] of WideChar; + begin + MenuItemInfo.cbSize := 44; // Required for Windows NT 4.0 + MenuItemInfo.fMask := MIIM_TYPE; + MenuItemInfo.dwTypeData := Buffer; // ?? + MenuItemInfo.cch := Length(Buffer); // ?? + Result := GetMenuItemInfoW(ParentHandle, Command, False, MenuItemInfo) + and ((MenuItemInfo.fType and (MFT_BITMAP or MFT_SEPARATOR or MFT_OWNERDRAW)) = 0) + end; + + function NativeMenuString: WideString; + var + Len: Integer; + begin + Assert(Win32PlatformIsUnicode); + Len := GetMenuStringW(ParentHandle, Command, nil, 0, MF_BYCOMMAND); + if Len = 0 then + Result := '' + else begin + SetLength(Result, Len + 1); + Len := GetMenuStringW(ParentHandle, Command, PWideChar(Result), Len + 1, MF_BYCOMMAND); + SetLength(Result, Len); + end; + end; + + procedure SetMenuString(const Value: WideString); + var + MenuItemInfo: TMenuItemInfoW; + Buffer: array[0..79] of WideChar; + begin + MenuItemInfo.cbSize := 44; // Required for Windows NT 4.0 + MenuItemInfo.fMask := MIIM_TYPE; + MenuItemInfo.dwTypeData := Buffer; // ?? + MenuItemInfo.cch := Length(Buffer); // ?? + if GetMenuItemInfoW(ParentHandle, Command, False, MenuItemInfo) + and ((MenuItemInfo.fType and (MFT_BITMAP or MFT_SEPARATOR or MFT_OWNERDRAW)) = 0) then + begin + MenuItemInfo.dwTypeData := PWideChar(Value); + MenuItemInfo.cch := Length(Value); + Win32Check(SetMenuItemInfoW(ParentHandle, Command, False, MenuItemInfo)); + end; + end; + + function SameEvent(A, B: TMenuMeasureItemEvent): Boolean; + begin + Result := @A = @B; + end; + +var + MenuCaption: WideString; +begin + FKeyboardLayout := GetKeyboardLayout(0); + if Parent = nil then + ParentHandle := 0 + else if (THackMenuItem(Self.Parent).FMergedWith <> nil) then + ParentHandle := THackMenuItem(Self.Parent).FMergedWith.Handle + else + ParentHandle := Parent.Handle; + + if (Win32PlatformIsUnicode) + and (Parent <> nil) and (ParentMenu <> nil) + and (ComponentState * [csReading, csDestroying] = []) + and (Visible) + and (NativeMenuTypeIsString) then begin + MenuCaption := Caption; + if (Count = 0) + and ((ShortCut <> scNone) + and ((Parent = nil) or (Parent.Parent <> nil) or not (Parent.Owner is TMainMenu{TNT-ALLOW TMainMenu}))) then + MenuCaption := MenuCaption + #9 + WideShortCutToText(ShortCut); + if (NativeMenuString <> MenuCaption) then + begin + SetMenuString(MenuCaption); + if ((Parent = ParentMenu.Items) or (THackMenuItem(Self.Parent).FMergedWith <> nil)) + and (ParentMenu is TMainMenu{TNT-ALLOW TMainMenu}) + and (ParentMenu.WindowHandle <> 0) then + DrawMenuBar(ParentMenu.WindowHandle) {top level menu bar items} + end; + end; +end; + +function TTntMenuItem.GetAlignmentDrawStyle: Word; +const + Alignments: array[TPopupAlignment] of Word = (DT_LEFT, DT_RIGHT, DT_CENTER); +var + ParentMenu: TMenu; + Alignment: TPopupAlignment; +begin + ParentMenu := GetParentMenu; + if ParentMenu is TMenu then + Alignment := paLeft + else if ParentMenu is TPopupMenu{TNT-ALLOW TPopupMenu} then + Alignment := TPopupMenu{TNT-ALLOW TPopupMenu}(ParentMenu).Alignment + else + Alignment := paLeft; + Result := Alignments[Alignment]; +end; + +procedure TTntMenuItem.AdvancedDrawItem(ACanvas: TCanvas; ARect: TRect; + State: TOwnerDrawState; TopLevel: Boolean); + + procedure DrawMenuText(BiDi: Boolean); + var + ImageList: TCustomImageList; + DrawImage, DrawGlyph: Boolean; + GlyphRect, SaveRect: TRect; + DrawStyle: Longint; + Selected: Boolean; + Win98Plus: Boolean; + Win2K: Boolean; + begin + ImageList := GetImageList; + Selected := odSelected in State; + Win98Plus := (Win32MajorVersion > 4) or + ((Win32MajorVersion = 4) and (Win32MinorVersion > 0)); + Win2K := (Win32MajorVersion > 4) and (Win32Platform = VER_PLATFORM_WIN32_NT); + with ACanvas do + begin + GlyphRect.Left := ARect.Left + 1; + DrawImage := (ImageList <> nil) and ((ImageIndex > -1) and + (ImageIndex < ImageList.Count) or Checked and ((not MenuItemHasBitmap(Self)) or + Bitmap.Empty)); + if DrawImage or MenuItemHasBitmap(Self) and not Bitmap.Empty then + begin + DrawGlyph := True; + if DrawImage then + GlyphRect.Right := GlyphRect.Left + ImageList.Width + else begin + { Need to add BitmapWidth/Height properties for TMenuItem if we're to + support them. Right now let's hardcode them to 16x16. } + GlyphRect.Right := GlyphRect.Left + 16; + end; + { Draw background pattern brush if selected } + if Checked then + begin + Inc(GlyphRect.Right); + if not Selected then + Brush.Bitmap := AllocPatternBitmap(clBtnFace, clBtnHighlight); + Inc(GlyphRect.Left); + end; + if Checked then + Dec(GlyphRect.Right); + end else begin + if (ImageList <> nil) and (not TopLevel) then + GlyphRect.Right := GlyphRect.Left + ImageList.Width + else + GlyphRect.Right := GlyphRect.Left; + DrawGlyph := False; + end; + if BiDi then begin + SaveRect := GlyphRect; + GlyphRect.Left := ARect.Right - (SaveRect.Right - ARect.Left); + GlyphRect.Right := ARect.Right - (SaveRect.Left - ARect.Left); + end; + with GlyphRect do begin + Dec(Left); + Inc(Right, 2); + end; + if Selected then begin + if DrawGlyph then begin + if BiDi then + ARect.Right := GlyphRect.Left - 1 + else + ARect.Left := GlyphRect.Right + 1; + end; + if not (Win98Plus and TopLevel) then + Brush.Color := clHighlight; + end; + if TopLevel and Win98Plus and (not Selected) + {$IFDEF COMPILER_7_UP} + and (not Win32PlatformIsXP) + {$ENDIF} + then + OffsetRect(ARect, 0, -1); + if not (Selected and DrawGlyph) then begin + if BiDi then + ARect.Right := GlyphRect.Left - 1 + else + ARect.Left := GlyphRect.Right + 1; + end; + Inc(ARect.Left, 2); + Dec(ARect.Right, 1); + DrawStyle := DT_EXPANDTABS or DT_SINGLELINE or GetAlignmentDrawStyle; + if Win2K and (odNoAccel in State) then + DrawStyle := DrawStyle or DT_HIDEPREFIX; + { Calculate vertical layout } + SaveRect := ARect; + if odDefault in State then + Font.Style := [fsBold]; + DoDrawText(ACanvas, Caption, ARect, Selected, DrawStyle or DT_CALCRECT or DT_NOCLIP); + if BiDi then begin + { the DT_CALCRECT does not take into account alignment } + ARect.Left := SaveRect.Left; + ARect.Right := SaveRect.Right; + end; + OffsetRect(ARect, 0, ((SaveRect.Bottom - SaveRect.Top) - (ARect.Bottom - ARect.Top)) div 2); + if TopLevel and Selected and Win98Plus + {$IFDEF COMPILER_7_UP} + and (not Win32PlatformIsXP) + {$ENDIF} + then + OffsetRect(ARect, 1, 0); + DoDrawText(ACanvas, Caption, ARect, Selected, DrawStyle); + if (ShortCut <> scNone) and not TopLevel then + begin + if BiDi then begin + ARect.Left := 10; + ARect.Right := ARect.Left + WideCanvasTextWidth(ACanvas, WideShortCutToText(ShortCut)); + end else begin + ARect.Left := ARect.Right; + ARect.Right := SaveRect.Right - 10; + end; + DoDrawText(ACanvas, WideShortCutToText(ShortCut), ARect, Selected, DT_RIGHT); + end; + end; + end; + +var + ParentMenu: TMenu; + SaveCaption: WideString; + SaveShortCut: TShortCut; +begin + ParentMenu := GetParentMenu; + if (not Win32PlatformIsUnicode) + or (Self.IsLine) + or ( (ParentMenu <> nil) and (ParentMenu.OwnerDraw or (GetImageList <> nil)) + and (Assigned(OnAdvancedDrawItem) or Assigned(OnDrawItem)) ) then + inherited + else begin + SaveCaption := Caption; + SaveShortCut := ShortCut; + try + FIgnoreMenuChanged := True; + try + Caption := ''; + ShortCut := scNone; + finally + FIgnoreMenuChanged := False; + end; + inherited; + finally + FIgnoreMenuChanged := True; + try + Caption := SaveCaption; + ShortCut := SaveShortcut; + finally + FIgnoreMenuChanged := False; + end; + end; + DrawMenuText((ParentMenu <> nil) and (ParentMenu.IsRightToLeft)) + end; +end; + +procedure TTntMenuItem.DoDrawText(ACanvas: TCanvas; const ACaption: WideString; + var Rect: TRect; Selected: Boolean; Flags: Longint); +var + Text: WideString; + ParentMenu: TMenu; +begin + if (not Win32PlatformIsUnicode) + or (IsLine) then + inherited DoDrawText(ACanvas, ACaption, Rect, Selected, Flags) + else begin + ParentMenu := GetParentMenu; + if (ParentMenu <> nil) and (ParentMenu.IsRightToLeft) then + begin + if Flags and DT_LEFT = DT_LEFT then + Flags := Flags and (not DT_LEFT) or DT_RIGHT + else if Flags and DT_RIGHT = DT_RIGHT then + Flags := Flags and (not DT_RIGHT) or DT_LEFT; + Flags := Flags or DT_RTLREADING; + end; + Text := ACaption; + if (Flags and DT_CALCRECT <> 0) and ((Text = '') or + (Text[1] = cHotkeyPrefix) and (Text[2] = #0)) then Text := Text + ' '; + with ACanvas do + begin + Brush.Style := bsClear; + if Default then + Font.Style := Font.Style + [fsBold]; + if not Enabled then + begin + if not Selected then + begin + OffsetRect(Rect, 1, 1); + Font.Color := clBtnHighlight; + Tnt_DrawTextW(Handle, PWideChar(Text), Length(Text), Rect, Flags); + OffsetRect(Rect, -1, -1); + end; + if Selected and (ColorToRGB(clHighlight) = ColorToRGB(clBtnShadow)) then + Font.Color := clBtnHighlight else + Font.Color := clBtnShadow; + end; + Tnt_DrawTextW(Handle, PWideChar(Text), Length(Text), Rect, Flags); + end; + end; +end; + +function TTntMenuItem.MeasureItemTextWidth(ACanvas: TCanvas; const Text: WideString): Integer; +var + R: TRect; +begin + FillChar(R, SizeOf(R), 0); + DoDrawText(ACanvas, Text, R, False, + GetAlignmentDrawStyle or DT_EXPANDTABS or DT_SINGLELINE or DT_NOCLIP or DT_CALCRECT); + Result := R.Right - R.Left; +end; + +procedure TTntMenuItem.MeasureItem(ACanvas: TCanvas; var Width, Height: Integer); +var + SaveMeasureItemEvent: TMenuMeasureItemEvent; +begin + if (not Win32PlatformIsUnicode) + or (Self.IsLine) then + inherited + else begin + SaveMeasureItemEvent := inherited OnMeasureItem; + try + inherited OnMeasureItem := nil; + inherited; + Inc(Width, MeasureItemTextWidth(ACanvas, Caption)); + Dec(Width, MeasureItemTextWidth(ACanvas, inherited Caption)); + if ShortCut <> scNone then begin + Inc(Width, MeasureItemTextWidth(ACanvas, WideShortCutToText(ShortCut))); + Dec(Width, MeasureItemTextWidth(ACanvas, ShortCutToText{TNT-ALLOW ShortCutToText}(ShortCut))); + end; + finally + inherited OnMeasureItem := SaveMeasureItemEvent; + end; + if Assigned(OnMeasureItem) then OnMeasureItem(Self, ACanvas, Width, Height); + end; +end; + +function TTntMenuItem.Find(ACaption: WideString): TMenuItem{TNT-ALLOW TMenuItem}; +var + I: Integer; +begin + Result := nil; + ACaption := WideStripHotkey(ACaption); + for I := 0 to Count - 1 do + if WideSameText(ACaption, WideStripHotkey(WideGetMenuItemCaption(Items[I]))) then + begin + Result := Items[I]; + System.Break; + end; +end; + +function TTntMenuItem.GetActionLinkClass: TMenuActionLinkClass; +begin + Result := TTntMenuActionLink; +end; + +procedure TTntMenuItem.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + if (Sender is TCustomAction{TNT-ALLOW TCustomAction}) and Supports(Sender, ITntAction) then begin + if not CheckDefaults or (Caption = '') then + Caption := TntAction_GetCaption(TCustomAction{TNT-ALLOW TCustomAction}(Sender)); + if not CheckDefaults or (Hint = '') then + Hint := TntAction_GetHint(TCustomAction{TNT-ALLOW TCustomAction}(Sender)); + end; + inherited; +end; + +{ TTntMainMenu } + +{$IFDEF COMPILER_9_UP} +function TTntMainMenu.CreateMenuItem: TMenuItem{TNT-ALLOW TMenuItem}; +begin + Result := TTntMenuItem.Create(Self); +end; +{$ENDIF} + +procedure TTntMainMenu.DoChange(Source: TMenuItem{TNT-ALLOW TMenuItem}; Rebuild: Boolean); +begin + inherited; + UpdateMenuItems(Items, Self); + if (THackMenuItem(Items).FMerged <> nil) then begin + UpdateMenuItems(THackMenuItem(Items).FMerged, Self); + end; +end; + +{ TTntPopupMenu } + +constructor TTntPopupMenu.Create(AOwner: TComponent); +begin + inherited; + PopupList.Remove(Self); + if TntPopupList <> nil then + TntPopupList.Add(Self); +end; + +{$IFDEF COMPILER_9_UP} +function TTntPopupMenu.CreateMenuItem: TMenuItem{TNT-ALLOW TMenuItem}; +begin + Result := TTntMenuItem.Create(Self); +end; +{$ENDIF} + +destructor TTntPopupMenu.Destroy; +begin + if TntPopupList <> nil then + TntPopupList.Remove(Self); + PopupList.Add(Self); + inherited; +end; + +procedure TTntPopupMenu.DoChange(Source: TMenuItem{TNT-ALLOW TMenuItem}; Rebuild: Boolean); +begin + inherited; + UpdateMenuItems(Items, Self); +end; + +procedure TTntPopupMenu.Popup(X, Y: Integer); +begin + Menus.PopupList := TntPopupList; + try + inherited; + finally + Menus.PopupList := TntPopupList.SavedPopupList; + end; +end; + +{ TTntPopupList } + +procedure TTntPopupList.WndProc(var Message: TMessage); +var + I, Item: Integer; + MenuItem: TMenuItem{TNT-ALLOW TMenuItem}; + FindKind: TFindItemKind; +begin + case Message.Msg of + WM_ENTERMENULOOP: + begin + Menus.PopupList := SavedPopupList; + for i := 0 to Count - 1 do + FixMenuBiDiProblem(Items[i]); + end; + WM_MENUSELECT: + with TWMMenuSelect(Message) do + begin + FindKind := fkCommand; + if MenuFlag and MF_POPUP <> 0 then FindKind := fkHandle; + for I := 0 to Count - 1 do + begin + if FindKind = fkHandle then + begin + if Menu <> 0 then + Item := Integer(GetSubMenu(Menu, IDItem)) else + Item := -1; + end + else + Item := IDItem; + MenuItem := TPopupMenu{TNT-ALLOW TPopupMenu}(Items[I]).FindItem(Item, FindKind); + if MenuItem <> nil then + begin + TntApplication.Hint := WideGetLongHint(WideGetMenuItemHint(MenuItem)); + Exit; + end; + end; + TntApplication.Hint := ''; + end; + end; + inherited; +end; + +initialization + TntPopupList := TTntPopupList.Create; + TntPopupList.SavedPopupList := Menus.PopupList; + +finalization + FreeAndNil(TntPopupList); + +end. diff --git a/internal/1/Source/TntRegistry.pas b/internal/1/Source/TntRegistry.pas new file mode 100644 index 0000000..e3f445f --- /dev/null +++ b/internal/1/Source/TntRegistry.pas @@ -0,0 +1,148 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntRegistry; + +{$INCLUDE TntCompilers.inc} + +interface + +uses + Registry, Windows, TntClasses; + +{TNT-WARN TRegistry} +type + TTntRegistry = class(TRegistry{TNT-ALLOW TRegistry}) + private + procedure WriteStringEx(dwType: DWORD; const Name, Value: WideString); + public + procedure GetKeyNames(Strings: TTntStrings); + procedure GetValueNames(Strings: TTntStrings); + function ReadString(const Name: WideString): WideString; + procedure WriteString(const Name, Value: WideString); + procedure WriteExpandString(const Name, Value: WideString); + end; + +implementation + +uses + RTLConsts, SysUtils, TntSysUtils; + +{ TTntRegistry } + +procedure TTntRegistry.GetKeyNames(Strings: TTntStrings); +var + Len: DWORD; + I: Integer; + Info: TRegKeyInfo; + S: WideString; +begin + if (not Win32PlatformIsUnicode) then + inherited GetKeyNames(Strings.AnsiStrings) + else begin + Strings.Clear; + if GetKeyInfo(Info) then + begin + SetLength(S, (Info.MaxSubKeyLen + 1) * 2); + for I := 0 to Info.NumSubKeys - 1 do + begin + Len := (Info.MaxSubKeyLen + 1) * 2; + if RegEnumKeyExW(CurrentKey, I, PWideChar(S), Len, nil, nil, nil, nil) = ERROR_SUCCESS then + Strings.Add(PWideChar(S)); + end; + end; + end; +end; + +{$IFNDEF COMPILER_9_UP} // fix declaration for RegEnumValueW (lpValueName is a PWideChar) +function RegEnumValueW(hKey: HKEY; dwIndex: DWORD; lpValueName: PWideChar; + var lpcbValueName: DWORD; lpReserved: Pointer; lpType: PDWORD; + lpData: PByte; lpcbData: PDWORD): Longint; stdcall; external advapi32 name 'RegEnumValueW'; +{$ENDIF} + +procedure TTntRegistry.GetValueNames(Strings: TTntStrings); +var + Len: DWORD; + I: Integer; + Info: TRegKeyInfo; + S: WideString; +begin + if (not Win32PlatformIsUnicode) then + inherited GetValueNames(Strings.AnsiStrings) + else begin + Strings.Clear; + if GetKeyInfo(Info) then + begin + SetLength(S, Info.MaxValueLen + 1); + for I := 0 to Info.NumValues - 1 do + begin + Len := Info.MaxValueLen + 1; + RegEnumValueW(CurrentKey, I, PWideChar(S), Len, nil, nil, nil, nil); + Strings.Add(PWideChar(S)); + end; + end; + end; +end; + +function TTntRegistry.ReadString(const Name: WideString): WideString; +var + DataType: Cardinal; + BufSize: Cardinal; +begin + if (not Win32PlatformIsUnicode) then + result := inherited ReadString(Name) + else begin + // get length and type + DataType := REG_NONE; + if RegQueryValueExW(CurrentKey, PWideChar(Name), nil, + @DataType, nil, @BufSize) <> ERROR_SUCCESS then + Result := '' + else begin + // check type + if not (DataType in [REG_SZ, REG_EXPAND_SZ]) then + raise ERegistryException.CreateFmt(SInvalidRegType, [Name]); + if BufSize = 1 then + BufSize := SizeOf(WideChar); // sometimes this occurs for single character values! + SetLength(Result, BufSize div SizeOf(WideChar)); + if RegQueryValueExW(CurrentKey, PWideChar(Name), nil, + @DataType, PByte(PWideChar(Result)), @BufSize) <> ERROR_SUCCESS then + raise ERegistryException.CreateFmt(SRegGetDataFailed, [Name]); + Result := PWideChar(Result); + end + end +end; + +procedure TTntRegistry.WriteStringEx(dwType: DWORD; const Name, Value: WideString); +begin + Assert(dwType in [REG_SZ, REG_EXPAND_SZ]); + if (not Win32PlatformIsUnicode) then begin + if dwType = REG_SZ then + inherited WriteString(Name, Value) + else + inherited WriteExpandString(Name, Value); + end else begin + if RegSetValueExW(CurrentKey, PWideChar(Name), 0, dwType, + PWideChar(Value), (Length(Value) + 1) * SizeOf(WideChar)) <> ERROR_SUCCESS then + raise ERegistryException.CreateFmt(SRegSetDataFailed, [Name]); + end; +end; + +procedure TTntRegistry.WriteString(const Name, Value: WideString); +begin + WriteStringEx(REG_SZ, Name, Value); +end; + +procedure TTntRegistry.WriteExpandString(const Name, Value: WideString); +begin + WriteStringEx(REG_EXPAND_SZ, Name, Value); +end; + +end. diff --git a/internal/1/Source/TntStdActns.pas b/internal/1/Source/TntStdActns.pas new file mode 100644 index 0000000..118e806 --- /dev/null +++ b/internal/1/Source/TntStdActns.pas @@ -0,0 +1,1922 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntStdActns; + +{$INCLUDE TntCompilers.inc} + +interface + +uses + Classes, ActnList, TntActnList, StdActns, TntDialogs; + +type +{TNT-WARN THintAction} + TTntHintAction = class(THintAction{TNT-ALLOW THintAction}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + public + property Caption: WideString read GetCaption write SetCaption; + published + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TEditAction} + TTntEditAction = class(TEditAction{TNT-ALLOW TEditAction}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TEditCut} + TTntEditCut = class(TEditCut{TNT-ALLOW TEditCut}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TEditCopy} + TTntEditCopy = class(TEditCopy{TNT-ALLOW TEditCopy}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TEditPaste} + TTntEditPaste = class(TEditPaste{TNT-ALLOW TEditPaste}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TEditSelectAll} + TTntEditSelectAll = class(TEditSelectAll{TNT-ALLOW TEditSelectAll}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TEditUndo} + TTntEditUndo = class(TEditUndo{TNT-ALLOW TEditUndo}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TEditDelete} + TTntEditDelete = class(TEditDelete{TNT-ALLOW TEditDelete}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + procedure UpdateTarget(Target: TObject); override; + procedure ExecuteTarget(Target: TObject); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TWindowAction} + TTntWindowAction = class(TWindowAction{TNT-ALLOW TWindowAction}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TWindowClose} + TTntWindowClose = class(TWindowClose{TNT-ALLOW TWindowClose}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TWindowCascade} + TTntWindowCascade = class(TWindowCascade{TNT-ALLOW TWindowCascade}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TWindowTileHorizontal} + TTntWindowTileHorizontal = class(TWindowTileHorizontal{TNT-ALLOW TWindowTileHorizontal}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TWindowTileVertical} + TTntWindowTileVertical = class(TWindowTileVertical{TNT-ALLOW TWindowTileVertical}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TWindowMinimizeAll} + TTntWindowMinimizeAll = class(TWindowMinimizeAll{TNT-ALLOW TWindowMinimizeAll}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TWindowArrange} + TTntWindowArrange = class(TWindowArrange{TNT-ALLOW TWindowArrange}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN THelpAction} + TTntHelpAction = class(THelpAction{TNT-ALLOW THelpAction}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN THelpContents} + TTntHelpContents = class(THelpContents{TNT-ALLOW THelpContents}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN THelpTopicSearch} + TTntHelpTopicSearch = class(THelpTopicSearch{TNT-ALLOW THelpTopicSearch}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN THelpOnHelp} + TTntHelpOnHelp = class(THelpOnHelp{TNT-ALLOW THelpOnHelp}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN THelpContextAction} + TTntHelpContextAction = class(THelpContextAction{TNT-ALLOW THelpContextAction}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TCommonDialogAction} + TTntCommonDialogAction = class(TCommonDialogAction{TNT-ALLOW TCommonDialogAction}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + public + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TFileAction} + TTntFileAction = class(TFileAction{TNT-ALLOW TFileAction}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + public + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TFileOpen} + TTntFileOpen = class(TFileOpen{TNT-ALLOW TFileOpen}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function GetDialog: TTntOpenDialog; + protected + procedure DefineProperties(Filer: TFiler); override; + function GetDialogClass: TCommonDialogClass; override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Dialog: TTntOpenDialog read GetDialog; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TFileOpenWith} + TTntFileOpenWith = class(TFileOpenWith{TNT-ALLOW TFileOpenWith}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function GetDialog: TTntOpenDialog; + protected + procedure DefineProperties(Filer: TFiler); override; + function GetDialogClass: TCommonDialogClass; override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Dialog: TTntOpenDialog read GetDialog; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TFileSaveAs} + TTntFileSaveAs = class(TFileSaveAs{TNT-ALLOW TFileSaveAs}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function GetDialog: TTntSaveDialog; + protected + procedure DefineProperties(Filer: TFiler); override; + function GetDialogClass: TCommonDialogClass; override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Dialog: TTntSaveDialog read GetDialog; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TFilePrintSetup} + TTntFilePrintSetup = class(TFilePrintSetup{TNT-ALLOW TFilePrintSetup}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + + {$IFDEF COMPILER_7_UP} +{TNT-WARN TFilePageSetup} + TTntFilePageSetup = class(TFilePageSetup{TNT-ALLOW TFilePageSetup}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + {$ENDIF} + +{TNT-WARN TFileExit} + TTntFileExit = class(TFileExit{TNT-ALLOW TFileExit}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TSearchAction} + TTntSearchAction = class(TSearchAction{TNT-ALLOW TSearchAction}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + public + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TSearchFind} + TTntSearchFind = class(TSearchFind{TNT-ALLOW TSearchFind}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TSearchReplace} + TTntSearchReplace = class(TSearchReplace{TNT-ALLOW TSearchReplace}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TSearchFindFirst} + TTntSearchFindFirst = class(TSearchFindFirst{TNT-ALLOW TSearchFindFirst}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TSearchFindNext} + TTntSearchFindNext = class(TSearchFindNext{TNT-ALLOW TSearchFindNext}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TFontEdit} + TTntFontEdit = class(TFontEdit{TNT-ALLOW TFontEdit}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TColorSelect} + TTntColorSelect = class(TColorSelect{TNT-ALLOW TColorSelect}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +{TNT-WARN TPrintDlg} + TTntPrintDlg = class(TPrintDlg{TNT-ALLOW TPrintDlg}, ITntAction) + private + function GetCaption: WideString; + procedure SetCaption(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + protected + procedure DefineProperties(Filer: TFiler); override; + public + procedure Assign(Source: TPersistent); override; + published + property Caption: WideString read GetCaption write SetCaption; + property Hint: WideString read GetHint write SetHint; + end; + +procedure TntStdActn_AfterInherited_Assign(Action: TCustomAction{TNT-ALLOW TCustomAction}; Source: TPersistent); + +implementation + +uses + Dialogs, TntClasses; + +{TNT-IGNORE-UNIT} + +procedure TntStdActn_AfterInherited_Assign(Action: TCustomAction{TNT-ALLOW TCustomAction}; Source: TPersistent); +begin + TntAction_AfterInherited_Assign(Action, Source); + // TCommonDialogAction + if (Action is TCommonDialogAction) and (Source is TCommonDialogAction) then begin + TCommonDialogAction(Action).BeforeExecute := TCommonDialogAction(Source).BeforeExecute; + TCommonDialogAction(Action).OnAccept := TCommonDialogAction(Source).OnAccept; + TCommonDialogAction(Action).OnCancel := TCommonDialogAction(Source).OnCancel; + end; + // TFileOpen + if (Action is TFileOpen) and (Source is TFileOpen) then begin + {$IFDEF COMPILER_7_UP} + TFileOpen(Action).UseDefaultApp := TFileOpen(Source).UseDefaultApp; + {$ENDIF} + end; + // TFileOpenWith + if (Action is TFileOpenWith) and (Source is TFileOpenWith) then begin + TFileOpenWith(Action).FileName := TFileOpenWith(Source).FileName; + {$IFDEF COMPILER_7_UP} + TFileOpenWith(Action).AfterOpen := TFileOpenWith(Source).AfterOpen; + {$ENDIF} + end; + // TSearchFindNext + if (Action is TSearchFindNext) and (Source is TSearchFindNext) then begin + TSearchFindNext(Action).SearchFind := TSearchFindNext(Source).SearchFind; + end; +end; + +//------------------------- +// TNT STD ACTNS +//------------------------- + +{ TTntHintAction } + +procedure TTntHintAction.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntHintAction.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntHintAction.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntHintAction.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntHintAction.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntHintAction.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntEditAction } + +procedure TTntEditAction.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntEditAction.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntEditAction.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntEditAction.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntEditAction.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntEditAction.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntEditCut } + +procedure TTntEditCut.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntEditCut.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntEditCut.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntEditCut.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntEditCut.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntEditCut.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntEditCopy } + +procedure TTntEditCopy.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntEditCopy.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntEditCopy.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntEditCopy.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntEditCopy.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntEditCopy.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntEditPaste } + +procedure TTntEditPaste.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntEditPaste.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntEditPaste.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntEditPaste.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntEditPaste.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntEditPaste.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntEditSelectAll } + +procedure TTntEditSelectAll.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntEditSelectAll.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntEditSelectAll.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntEditSelectAll.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntEditSelectAll.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntEditSelectAll.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntEditUndo } + +procedure TTntEditUndo.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntEditUndo.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntEditUndo.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntEditUndo.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntEditUndo.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntEditUndo.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntEditDelete } + +procedure TTntEditDelete.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntEditDelete.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntEditDelete.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntEditDelete.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntEditDelete.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntEditDelete.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +procedure TTntEditDelete.UpdateTarget(Target: TObject); +begin + Enabled := True; +end; + +procedure TTntEditDelete.ExecuteTarget(Target: TObject); +begin + if GetControl(Target).SelLength = 0 then + GetControl(Target).SelLength := 1; + GetControl(Target).ClearSelection +end; + +{ TTntWindowAction } + +procedure TTntWindowAction.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntWindowAction.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntWindowAction.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntWindowAction.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntWindowAction.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntWindowAction.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntWindowClose } + +procedure TTntWindowClose.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntWindowClose.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntWindowClose.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntWindowClose.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntWindowClose.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntWindowClose.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntWindowCascade } + +procedure TTntWindowCascade.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntWindowCascade.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntWindowCascade.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntWindowCascade.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntWindowCascade.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntWindowCascade.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntWindowTileHorizontal } + +procedure TTntWindowTileHorizontal.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntWindowTileHorizontal.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntWindowTileHorizontal.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntWindowTileHorizontal.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntWindowTileHorizontal.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntWindowTileHorizontal.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntWindowTileVertical } + +procedure TTntWindowTileVertical.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntWindowTileVertical.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntWindowTileVertical.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntWindowTileVertical.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntWindowTileVertical.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntWindowTileVertical.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntWindowMinimizeAll } + +procedure TTntWindowMinimizeAll.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntWindowMinimizeAll.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntWindowMinimizeAll.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntWindowMinimizeAll.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntWindowMinimizeAll.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntWindowMinimizeAll.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntWindowArrange } + +procedure TTntWindowArrange.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntWindowArrange.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntWindowArrange.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntWindowArrange.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntWindowArrange.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntWindowArrange.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntHelpAction } + +procedure TTntHelpAction.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntHelpAction.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntHelpAction.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntHelpAction.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntHelpAction.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntHelpAction.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntHelpContents } + +procedure TTntHelpContents.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntHelpContents.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntHelpContents.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntHelpContents.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntHelpContents.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntHelpContents.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntHelpTopicSearch } + +procedure TTntHelpTopicSearch.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntHelpTopicSearch.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntHelpTopicSearch.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntHelpTopicSearch.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntHelpTopicSearch.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntHelpTopicSearch.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntHelpOnHelp } + +procedure TTntHelpOnHelp.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntHelpOnHelp.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntHelpOnHelp.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntHelpOnHelp.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntHelpOnHelp.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntHelpOnHelp.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntHelpContextAction } + +procedure TTntHelpContextAction.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntHelpContextAction.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntHelpContextAction.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntHelpContextAction.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntHelpContextAction.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntHelpContextAction.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntCommonDialogAction } + +procedure TTntCommonDialogAction.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntCommonDialogAction.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntCommonDialogAction.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntCommonDialogAction.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntCommonDialogAction.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntCommonDialogAction.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntFileAction } + +procedure TTntFileAction.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntFileAction.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntFileAction.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntFileAction.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntFileAction.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntFileAction.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntFileOpen } + +procedure TTntFileOpen.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntFileOpen.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntFileOpen.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntFileOpen.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntFileOpen.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntFileOpen.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +function TTntFileOpen.GetDialog: TTntOpenDialog; +begin + Result := inherited Dialog as TTntOpenDialog; +end; + +function TTntFileOpen.GetDialogClass: TCommonDialogClass; +begin + Result := TTntOpenDialog; +end; + +{ TTntFileOpenWith } + +procedure TTntFileOpenWith.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntFileOpenWith.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntFileOpenWith.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntFileOpenWith.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntFileOpenWith.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntFileOpenWith.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +function TTntFileOpenWith.GetDialog: TTntOpenDialog; +begin + Result := inherited Dialog as TTntOpenDialog; +end; + +function TTntFileOpenWith.GetDialogClass: TCommonDialogClass; +begin + Result := TTntOpenDialog; +end; + +{ TTntFileSaveAs } + +procedure TTntFileSaveAs.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntFileSaveAs.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntFileSaveAs.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntFileSaveAs.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntFileSaveAs.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntFileSaveAs.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +function TTntFileSaveAs.GetDialog: TTntSaveDialog; +begin + Result := TOpenDialog(inherited Dialog) as TTntSaveDialog; +end; + +function TTntFileSaveAs.GetDialogClass: TCommonDialogClass; +begin + Result := TTntSaveDialog; +end; + +{ TTntFilePrintSetup } + +procedure TTntFilePrintSetup.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntFilePrintSetup.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntFilePrintSetup.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntFilePrintSetup.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntFilePrintSetup.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntFilePrintSetup.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + + {$IFDEF COMPILER_7_UP} + +{ TTntFilePageSetup } + +procedure TTntFilePageSetup.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntFilePageSetup.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntFilePageSetup.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntFilePageSetup.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntFilePageSetup.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntFilePageSetup.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + {$ENDIF} + +{ TTntFileExit } + +procedure TTntFileExit.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntFileExit.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntFileExit.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntFileExit.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntFileExit.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntFileExit.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntSearchAction } + +procedure TTntSearchAction.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntSearchAction.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntSearchAction.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntSearchAction.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntSearchAction.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntSearchAction.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntSearchFind } + +procedure TTntSearchFind.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntSearchFind.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntSearchFind.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntSearchFind.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntSearchFind.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntSearchFind.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntSearchReplace } + +procedure TTntSearchReplace.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntSearchReplace.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntSearchReplace.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntSearchReplace.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntSearchReplace.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntSearchReplace.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntSearchFindFirst } + +procedure TTntSearchFindFirst.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntSearchFindFirst.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntSearchFindFirst.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntSearchFindFirst.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntSearchFindFirst.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntSearchFindFirst.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntSearchFindNext } + +procedure TTntSearchFindNext.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntSearchFindNext.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntSearchFindNext.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntSearchFindNext.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntSearchFindNext.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntSearchFindNext.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntFontEdit } + +procedure TTntFontEdit.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntFontEdit.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntFontEdit.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntFontEdit.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntFontEdit.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntFontEdit.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntColorSelect } + +procedure TTntColorSelect.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntColorSelect.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntColorSelect.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntColorSelect.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntColorSelect.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntColorSelect.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +{ TTntPrintDlg } + +procedure TTntPrintDlg.Assign(Source: TPersistent); +begin + inherited; + TntStdActn_AfterInherited_Assign(Self, Source); +end; + +procedure TTntPrintDlg.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntPrintDlg.GetCaption: WideString; +begin + Result := TntAction_GetCaption(Self); +end; + +procedure TTntPrintDlg.SetCaption(const Value: WideString); +begin + TntAction_SetCaption(Self, Value); +end; + +function TTntPrintDlg.GetHint: WideString; +begin + Result := TntAction_GetHint(Self); +end; + +procedure TTntPrintDlg.SetHint(const Value: WideString); +begin + TntAction_SetHint(Self, Value); +end; + +end. diff --git a/internal/1/Source/TntStdCtrls.pas b/internal/1/Source/TntStdCtrls.pas new file mode 100644 index 0000000..09c7da4 --- /dev/null +++ b/internal/1/Source/TntStdCtrls.pas @@ -0,0 +1,3215 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntStdCtrls; + +{$INCLUDE TntCompilers.inc} + +interface + +{ TODO: Implement TCustomListBox.KeyPress, OnDataFind. } + +uses + Windows, Messages, Classes, Controls, TntControls, StdCtrls, Graphics, + TntClasses, TntSysUtils; + +{TNT-WARN TCustomEdit} +type + TTntCustomEdit = class(TCustomEdit{TNT-ALLOW TCustomEdit}) + private + FPasswordChar: WideChar; + procedure SetSelText(const Value: WideString); + function GetText: WideString; + procedure SetText(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsHintStored: Boolean; + function GetPasswordChar: WideChar; + procedure SetPasswordChar(const Value: WideChar); + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure CreateWnd; override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + function GetSelStart: Integer; reintroduce; virtual; + procedure SetSelStart(const Value: Integer); reintroduce; virtual; + function GetSelLength: Integer; reintroduce; virtual; + procedure SetSelLength(const Value: Integer); reintroduce; virtual; + function GetSelText: WideString; reintroduce; virtual; + property PasswordChar: WideChar read GetPasswordChar write SetPasswordChar default #0; + public + property SelText: WideString read GetSelText write SetSelText; + property SelStart: Integer read GetSelStart write SetSelStart; + property SelLength: Integer read GetSelLength write SetSelLength; + property Text: WideString read GetText write SetText; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TEdit} + TTntEdit = class(TTntCustomEdit) + published + property Align; + property Anchors; + property AutoSelect; + property AutoSize; + property BevelEdges; + property BevelInner; + property BevelKind default bkNone; + property BevelOuter; + property BevelWidth; + property BiDiMode; + property BorderStyle; + property CharCase; + property Color; + property Constraints; + property Ctl3D; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property HideSelection; + property ImeMode; + property ImeName; + property MaxLength; + property OEMConvert; + property ParentBiDiMode; + property ParentColor; + property ParentCtl3D; + property ParentFont; + property ParentShowHint; + property PasswordChar; + property PopupMenu; + property ReadOnly; + property ShowHint; + property TabOrder; + property TabStop; + property Text; + property Visible; + property OnChange; + property OnClick; + property OnContextPopup; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnKeyDown; + property OnKeyPress; + property OnKeyUp; + {$IFDEF COMPILER_9_UP} + property OnMouseActivate; + {$ENDIF} + property OnMouseDown; + {$IFDEF COMPILER_10_UP} + property OnMouseEnter; + property OnMouseLeave; + {$ENDIF} + property OnMouseMove; + property OnMouseUp; + property OnStartDock; + property OnStartDrag; + end; + +type + TTntCustomMemo = class; + + TTntMemoStrings = class(TTntStrings) + protected + FMemo: TCustomMemo{TNT-ALLOW TCustomMemo}; + FMemoLines: TStrings{TNT-ALLOW TStrings}; + FRichEditMode: Boolean; + FLineBreakStyle: TTntTextLineBreakStyle; + function Get(Index: Integer): WideString; override; + function GetCount: Integer; override; + function GetTextStr: WideString; override; + procedure Put(Index: Integer; const S: WideString); override; + procedure SetUpdateState(Updating: Boolean); override; + public + constructor Create; + procedure SetTextStr(const Value: WideString); override; + procedure Clear; override; + procedure Delete(Index: Integer); override; + procedure Insert(Index: Integer; const S: WideString); override; + end; + +{TNT-WARN TCustomMemo} + TTntCustomMemo = class(TCustomMemo{TNT-ALLOW TCustomMemo}) + private + FLines: TTntStrings; + procedure SetSelText(const Value: WideString); + function GetText: WideString; + procedure SetText(const Value: WideString); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsHintStored: Boolean; + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + procedure SetLines(const Value: TTntStrings); virtual; + function GetSelStart: Integer; reintroduce; virtual; + procedure SetSelStart(const Value: Integer); reintroduce; virtual; + function GetSelLength: Integer; reintroduce; virtual; + procedure SetSelLength(const Value: Integer); reintroduce; virtual; + function GetSelText: WideString; reintroduce; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + property SelText: WideString read GetSelText write SetSelText; + property SelStart: Integer read GetSelStart write SetSelStart; + property SelLength: Integer read GetSelLength write SetSelLength; + property Text: WideString read GetText write SetText; + property Lines: TTntStrings read FLines write SetLines; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TMemo} + TTntMemo = class(TTntCustomMemo) + published + property Align; + property Alignment; + property Anchors; + property BevelEdges; + property BevelInner; + property BevelKind default bkNone; + property BevelOuter; + property BiDiMode; + property BorderStyle; + property Color; + property Constraints; + property Ctl3D; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property HideSelection; + property ImeMode; + property ImeName; + property Lines; + property MaxLength; + property OEMConvert; + property ParentBiDiMode; + property ParentColor; + property ParentCtl3D; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ReadOnly; + property ScrollBars; + property ShowHint; + property TabOrder; + property TabStop; + property Visible; + property WantReturns; + property WantTabs; + property WordWrap; + property OnChange; + property OnClick; + property OnContextPopup; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnKeyDown; + property OnKeyPress; + property OnKeyUp; + {$IFDEF COMPILER_9_UP} + property OnMouseActivate; + {$ENDIF} + property OnMouseDown; + {$IFDEF COMPILER_10_UP} + property OnMouseEnter; + property OnMouseLeave; + {$ENDIF} + property OnMouseMove; + property OnMouseUp; + property OnStartDock; + property OnStartDrag; + end; + + TTntComboBoxStrings = class(TTntStrings) + protected + function Get(Index: Integer): WideString; override; + function GetCount: Integer; override; + function GetObject(Index: Integer): TObject; override; + procedure PutObject(Index: Integer; AObject: TObject); override; + procedure SetUpdateState(Updating: Boolean); override; + public + ComboBox: TCustomComboBox{TNT-ALLOW TCustomComboBox}; + function Add(const S: WideString): Integer; override; + procedure Clear; override; + procedure Delete(Index: Integer); override; + function IndexOf(const S: WideString): Integer; override; + procedure Insert(Index: Integer; const S: WideString); override; + end; + +type + TWMCharMsgHandler = procedure(var Message: TWMChar) of object; + +{$IFDEF DELPHI_7} // fix for Delphi 7 only +{ TD7PatchedComboBoxStrings } +type + TD7PatchedComboBoxStrings = class(TCustomComboBoxStrings) + protected + function Get(Index: Integer): string{TNT-ALLOW string}; override; + public + function Add(const S: string{TNT-ALLOW string}): Integer; override; + procedure Insert(Index: Integer; const S: string{TNT-ALLOW string}); override; + end; +{$ENDIF} + +type + ITntComboFindString = interface + ['{63BEBEF4-B1A2-495A-B558-7487B66F6827}'] + function FindString(const Value: WideString; StartPos: Integer): Integer; + end; + +{TNT-WARN TCustomComboBox} +type + TTntCustomComboBox = class(TCustomComboBox{TNT-ALLOW TCustomComboBox}, + IWideCustomListControl) + private + FItems: TTntStrings; + FSaveItems: TTntStrings; + FSaveItemIndex: Integer; + FFilter: WideString; + FLastTime: Cardinal; + function GetItems: TTntStrings; + function GetSelStart: Integer; + procedure SetSelStart(const Value: Integer); + function GetSelLength: Integer; + procedure SetSelLength(const Value: Integer); + function GetSelText: WideString; + procedure SetSelText(const Value: WideString); + function GetText: WideString; + procedure SetText(const Value: WideString); + procedure CNCommand(var Message: TWMCommand); message CN_COMMAND; + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsHintStored: Boolean; + procedure WMChar(var Message: TWMChar); message WM_CHAR; + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + procedure DestroyWnd; override; + function GetAutoComplete_UniqueMatchOnly: Boolean; dynamic; + function GetAutoComplete_PreserveDataEntryCase: Boolean; dynamic; + procedure DoEditCharMsg(var Message: TWMChar); virtual; + procedure CreateWnd; override; + procedure ComboWndProc(var Message: TMessage; ComboWnd: HWnd; ComboProc: Pointer); override; + procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); override; + procedure KeyPress(var Key: AnsiChar); override; + {$IFDEF DELPHI_7} // fix for Delphi 7 only + function GetItemsClass: TCustomComboBoxStringsClass; override; + {$ENDIF} + procedure SetItems(const Value: TTntStrings); reintroduce; virtual; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure CopySelection(Destination: TCustomListControl); override; + procedure AddItem(const Item: WideString; AObject: TObject); reintroduce; virtual; + public + property SelText: WideString read GetSelText write SetSelText; + property SelStart: Integer read GetSelStart write SetSelStart; + property SelLength: Integer read GetSelLength write SetSelLength; + property Text: WideString read GetText write SetText; + property Items: TTntStrings read GetItems write SetItems; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TComboBox} + TTntComboBox = class(TTntCustomComboBox) + published + property Align; + property AutoComplete default True; + {$IFDEF COMPILER_9_UP} + property AutoCompleteDelay default 500; + {$ENDIF} + property AutoDropDown default False; + {$IFDEF COMPILER_7_UP} + property AutoCloseUp default False; + {$ENDIF} + property BevelEdges; + property BevelInner; + property BevelKind default bkNone; + property BevelOuter; + property Style; {Must be published before Items} + property Anchors; + property BiDiMode; + property CharCase; + property Color; + property Constraints; + property Ctl3D; + property DragCursor; + property DragKind; + property DragMode; + property DropDownCount; + property Enabled; + property Font; + property ImeMode; + property ImeName; + property ItemHeight; + property ItemIndex default -1; + property MaxLength; + property ParentBiDiMode; + property ParentColor; + property ParentCtl3D; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowHint; + property Sorted; + property TabOrder; + property TabStop; + property Text; + property Visible; + property OnChange; + property OnClick; + property OnCloseUp; + property OnContextPopup; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnDrawItem; + property OnDropDown; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnKeyDown; + property OnKeyPress; + property OnKeyUp; + property OnMeasureItem; + {$IFDEF COMPILER_10_UP} + property OnMouseEnter; + property OnMouseLeave; + {$ENDIF} + property OnSelect; + property OnStartDock; + property OnStartDrag; + property Items; { Must be published after OnMeasureItem } + end; + + TLBGetWideDataEvent = procedure(Control: TWinControl; Index: Integer; + var Data: WideString) of object; + + TAccessCustomListBox = class(TCustomListBox{TNT-ALLOW TCustomListBox}); + + TTntListBoxStrings = class(TTntStrings) + private + FListBox: TAccessCustomListBox; + function GetListBox: TCustomListBox{TNT-ALLOW TCustomListBox}; + procedure SetListBox(const Value: TCustomListBox{TNT-ALLOW TCustomListBox}); + protected + procedure Put(Index: Integer; const S: WideString); override; + function Get(Index: Integer): WideString; override; + function GetCount: Integer; override; + function GetObject(Index: Integer): TObject; override; + procedure PutObject(Index: Integer; AObject: TObject); override; + procedure SetUpdateState(Updating: Boolean); override; + public + function Add(const S: WideString): Integer; override; + procedure Clear; override; + procedure Delete(Index: Integer); override; + procedure Exchange(Index1, Index2: Integer); override; + function IndexOf(const S: WideString): Integer; override; + procedure Insert(Index: Integer; const S: WideString); override; + procedure Move(CurIndex, NewIndex: Integer); override; + property ListBox: TCustomListBox{TNT-ALLOW TCustomListBox} read GetListBox write SetListBox; + end; + +{TNT-WARN TCustomListBox} +type + TTntCustomListBox = class(TCustomListBox{TNT-ALLOW TCustomListBox}, IWideCustomListControl) + private + FItems: TTntStrings; + FSaveItems: TTntStrings; + FSaveTopIndex: Integer; + FSaveItemIndex: Integer; + FOnData: TLBGetWideDataEvent; + procedure SetItems(const Value: TTntStrings); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsHintStored: Boolean; + procedure LBGetText(var Message: TMessage); message LB_GETTEXT; + procedure LBGetTextLen(var Message: TMessage); message LB_GETTEXTLEN; + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + procedure CreateWnd; override; + procedure DestroyWnd; override; + procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); override; + property OnData: TLBGetWideDataEvent read FOnData write FOnData; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure CopySelection(Destination: TCustomListControl); override; + procedure AddItem(const Item: WideString; AObject: TObject); reintroduce; virtual; + property Items: TTntStrings read FItems write SetItems; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TListBox} + TTntListBox = class(TTntCustomListBox) + published + property Style; + property AutoComplete; + {$IFDEF COMPILER_9_UP} + property AutoCompleteDelay; + {$ENDIF} + property Align; + property Anchors; + property BevelEdges; + property BevelInner; + property BevelKind default bkNone; + property BevelOuter; + property BevelWidth; + property BiDiMode; + property BorderStyle; + property Color; + property Columns; + property Constraints; + property Ctl3D; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property ExtendedSelect; + property Font; + property ImeMode; + property ImeName; + property IntegralHeight; + property ItemHeight; + property Items; + property MultiSelect; + property ParentBiDiMode; + property ParentColor; + property ParentCtl3D; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ScrollWidth; + property ShowHint; + property Sorted; + property TabOrder; + property TabStop; + property TabWidth; + property Visible; + property OnClick; + property OnContextPopup; + property OnData; + property OnDataFind; + property OnDataObject; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnDrawItem; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnKeyDown; + property OnKeyPress; + property OnKeyUp; + property OnMeasureItem; + {$IFDEF COMPILER_9_UP} + property OnMouseActivate; + {$ENDIF} + property OnMouseDown; + {$IFDEF COMPILER_10_UP} + property OnMouseEnter; + property OnMouseLeave; + {$ENDIF} + property OnMouseMove; + property OnMouseUp; + property OnStartDock; + property OnStartDrag; + end; + +{TNT-WARN TCustomLabel} + TTntCustomLabel = class(TCustomLabel{TNT-ALLOW TCustomLabel}) + private + function GetCaption: TWideCaption; + procedure SetCaption(const Value: TWideCaption); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsCaptionStored: Boolean; + function IsHintStored: Boolean; + procedure CMHintShow(var Message: TMessage); message CM_HINTSHOW; + procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; + protected + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + function GetLabelText: WideString; reintroduce; virtual; + procedure DoDrawText(var Rect: TRect; Flags: Longint); override; + property Caption: TWideCaption read GetCaption write SetCaption stored IsCaptionStored; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TLabel} + TTntLabel = class(TTntCustomLabel) + published + property Align; + property Alignment; + property Anchors; + property AutoSize; + property BiDiMode; + property Caption; + property Color {$IFDEF COMPILER_7_UP} nodefault {$ENDIF}; + property Constraints; + property DragCursor; + property DragKind; + property DragMode; + {$IFDEF COMPILER_9_UP} + property EllipsisPosition; + {$ENDIF} + property Enabled; + property FocusControl; + property Font; + property ParentBiDiMode; + property ParentColor; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowAccelChar; + property ShowHint; + property Transparent; + property Layout; + property Visible; + property WordWrap; + property OnClick; + property OnContextPopup; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + {$IFDEF COMPILER_9_UP} + property OnMouseActivate; + {$ENDIF} + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnMouseEnter; + property OnMouseLeave; + property OnStartDock; + property OnStartDrag; + end; + +{TNT-WARN TButton} + TTntButton = class(TButton{TNT-ALLOW TButton}) + private + function GetCaption: TWideCaption; + procedure SetCaption(const Value: TWideCaption); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsCaptionStored: Boolean; + function IsHintStored: Boolean; + procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + published + property Caption: TWideCaption read GetCaption write SetCaption stored IsCaptionStored; + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TCustomCheckBox} + TTntCustomCheckBox = class(TCustomCheckBox{TNT-ALLOW TCustomCheckBox}) + private + function GetCaption: TWideCaption; + procedure SetCaption(const Value: TWideCaption); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsCaptionStored: Boolean; + function IsHintStored: Boolean; + procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + public + property Caption: TWideCaption read GetCaption write SetCaption stored IsCaptionStored; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TCheckBox} + TTntCheckBox = class(TTntCustomCheckBox) + published + property Action; + property Align; + property Alignment; + property AllowGrayed; + property Anchors; + property BiDiMode; + property Caption; + property Checked; + property Color {$IFDEF COMPILER_7_UP} nodefault {$ENDIF}; + property Constraints; + property Ctl3D; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property ParentBiDiMode; + property ParentColor; + property ParentCtl3D; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowHint; + property State; + property TabOrder; + property TabStop; + property Visible; + {$IFDEF COMPILER_7_UP} + property WordWrap; + {$ENDIF} + property OnClick; + property OnContextPopup; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnKeyDown; + property OnKeyPress; + property OnKeyUp; + {$IFDEF COMPILER_9_UP} + property OnMouseActivate; + {$ENDIF} + property OnMouseDown; + {$IFDEF COMPILER_10_UP} + property OnMouseEnter; + property OnMouseLeave; + {$ENDIF} + property OnMouseMove; + property OnMouseUp; + property OnStartDock; + property OnStartDrag; + end; + +{TNT-WARN TRadioButton} + TTntRadioButton = class(TRadioButton{TNT-ALLOW TRadioButton}) + private + function GetCaption: TWideCaption; + procedure SetCaption(const Value: TWideCaption); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsCaptionStored: Boolean; + function IsHintStored: Boolean; + procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + published + property Caption: TWideCaption read GetCaption write SetCaption stored IsCaptionStored; + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TScrollBar} + TTntScrollBar = class(TScrollBar{TNT-ALLOW TScrollBar}) + private + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsHintStored: Boolean; + protected + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TCustomGroupBox} + TTntCustomGroupBox = class(TCustomGroupBox{TNT-ALLOW TCustomGroupBox}) + private + function GetCaption: TWideCaption; + procedure SetCaption(const Value: TWideCaption); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsCaptionStored: Boolean; + function IsHintStored: Boolean; + procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; + protected + procedure Paint; override; + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + property Caption: TWideCaption read GetCaption write SetCaption stored IsCaptionStored; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TGroupBox} + TTntGroupBox = class(TTntCustomGroupBox) + published + property Align; + property Anchors; + property BiDiMode; + property Caption; + property Color; + property Constraints; + property Ctl3D; + property DockSite; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + {$IFDEF COMPILER_10_UP} + property Padding; + {$ENDIF} + {$IFDEF COMPILER_7_UP} + property ParentBackground default True; + {$ENDIF} + property ParentBiDiMode; + property ParentColor; + property ParentCtl3D; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowHint; + property TabOrder; + property TabStop; + property Visible; + {$IFDEF COMPILER_9_UP} + property OnAlignInsertBefore; + property OnAlignPosition; + {$ENDIF} + property OnClick; + property OnContextPopup; + property OnDblClick; + property OnDragDrop; + property OnDockDrop; + property OnDockOver; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnGetSiteInfo; + {$IFDEF COMPILER_9_UP} + property OnMouseActivate; + {$ENDIF} + property OnMouseDown; + {$IFDEF COMPILER_10_UP} + property OnMouseEnter; + property OnMouseLeave; + {$ENDIF} + property OnMouseMove; + property OnMouseUp; + property OnStartDock; + property OnStartDrag; + property OnUnDock; + end; + +{TNT-WARN TCustomStaticText} + TTntCustomStaticText = class(TCustomStaticText{TNT-ALLOW TCustomStaticText}) + private + procedure AdjustBounds; + function GetCaption: TWideCaption; + procedure SetCaption(const Value: TWideCaption); + function GetHint: WideString; + procedure SetHint(const Value: WideString); + function IsCaptionStored: Boolean; + function IsHintStored: Boolean; + procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; + protected + procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED; + procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED; + procedure Loaded; override; + procedure SetAutoSize(AValue: boolean); override; + procedure CreateWindowHandle(const Params: TCreateParams); override; + procedure DefineProperties(Filer: TFiler); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + property Caption: TWideCaption read GetCaption write SetCaption stored IsCaptionStored; + public + constructor Create(AOwner: TComponent); override; + published + property Hint: WideString read GetHint write SetHint stored IsHintStored; + end; + +{TNT-WARN TStaticText} + TTntStaticText = class(TTntCustomStaticText) + published + property Align; + property Alignment; + property Anchors; + property AutoSize; + property BevelEdges; + property BevelInner; + property BevelKind default bkNone; + property BevelOuter; + property BiDiMode; + property BorderStyle; + property Caption; + property Color {$IFDEF COMPILER_7_UP} nodefault {$ENDIF}; + property Constraints; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property FocusControl; + property Font; + property ParentBiDiMode; + property ParentColor; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowAccelChar; + property ShowHint; + property TabOrder; + property TabStop; + {$IFDEF COMPILER_7_UP} + property Transparent; + {$ENDIF} + property Visible; + property OnClick; + property OnContextPopup; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + {$IFDEF COMPILER_9_UP} + property OnMouseActivate; + {$ENDIF} + property OnMouseDown; + {$IFDEF COMPILER_10_UP} + property OnMouseEnter; + property OnMouseLeave; + {$ENDIF} + property OnMouseMove; + property OnMouseUp; + property OnStartDock; + property OnStartDrag; + end; + +procedure TntCombo_AfterInherited_CreateWnd(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}; + Items: TTntStrings; var FSaveItems: TTntStrings; FSaveItemIndex: integer; PreInheritedAnsiText: AnsiString); +procedure TntCombo_BeforeInherited_DestroyWnd(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}; + Items: TTntStrings; var FSaveItems: TTntStrings; ItemIndex: integer; var FSaveItemIndex: integer; + var SavedText: WideString); +function TntCombo_ComboWndProc(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}; + var Message: TMessage; ComboWnd: HWnd; ComboProc: Pointer; DoEditCharMsg: TWMCharMsgHandler): Boolean; +function TntCombo_CNCommand(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}; Items: TTntStrings; var Message: TWMCommand): Boolean; +function TntCombo_GetSelStart(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}): Integer; +procedure TntCombo_SetSelStart(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}; const Value: Integer); +function TntCombo_GetSelLength(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}): Integer; +procedure TntCombo_SetSelLength(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}; const Value: Integer); +function TntCombo_GetSelText(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}): WideString; +procedure TntCombo_SetSelText(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}; const Value: WideString); +procedure TntCombo_BeforeKeyPress(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}; var SaveAutoComplete: Boolean); +procedure TntCombo_AfterKeyPress(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}; var SaveAutoComplete: Boolean); +procedure TntCombo_DropDown_PreserveSelection(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}); +procedure TntComboBox_AddItem(Items: TTntStrings; const Item: WideString; AObject: TObject); +procedure TntComboBox_CopySelection(Items: TTntStrings; ItemIndex: Integer; + Destination: TCustomListControl); +procedure TntCombo_AutoSearchKeyPress(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}; + Items: TTntStrings; var Message: TWMChar; var FFilter: WideString; var FLastTime: Cardinal); +procedure TntCombo_AutoCompleteKeyPress(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}; + Items: TTntStrings; var Message: TWMChar; + AutoComplete_UniqueMatchOnly, AutoComplete_PreserveDataEntryCase: Boolean); +procedure TntCombo_DefaultDrawItem(Canvas: TCanvas; Index: Integer; Rect: TRect; + State: TOwnerDrawState; Items: TTntStrings); + +procedure TntCustomEdit_CreateWindowHandle(Edit: TCustomEdit{TNT-ALLOW TCustomEdit}; const Params: TCreateParams); +procedure TntCustomEdit_AfterInherited_CreateWnd(Edit: TCustomEdit{TNT-ALLOW TCustomEdit}; var FPasswordChar: WideChar); +function TntCustomEdit_GetSelStart(Edit: TCustomEdit{TNT-ALLOW TCustomEdit}): Integer; +procedure TntCustomEdit_SetSelStart(Edit: TCustomEdit{TNT-ALLOW TCustomEdit}; const Value: Integer); +function TntCustomEdit_GetSelLength(Edit: TCustomEdit{TNT-ALLOW TCustomEdit}): Integer; +procedure TntCustomEdit_SetSelLength(Edit: TCustomEdit{TNT-ALLOW TCustomEdit}; const Value: Integer); +function TntCustomEdit_GetSelText(Edit: TCustomEdit{TNT-ALLOW TCustomEdit}): WideString; +procedure TntCustomEdit_SetSelText(Edit: TCustomEdit{TNT-ALLOW TCustomEdit}; const Value: WideString); +function TntCustomEdit_GetPasswordChar(Edit: TCustomEdit{TNT-ALLOW TCustomEdit}; var FPasswordChar: WideChar): WideChar; +procedure TntCustomEdit_SetPasswordChar(Edit: TCustomEdit{TNT-ALLOW TCustomEdit}; var FPasswordChar: WideChar; const Value: WideChar); + + +function TntMemo_LineStart(Handle: THandle; Index: Integer): Integer; +function TntMemo_LineLength(Handle: THandle; Index: Integer; StartPos: Integer = -1): Integer; + +procedure TntListBox_AfterInherited_CreateWnd(ListBox: TCustomListBox{TNT-ALLOW TCustomListBox}; + var FSaveItems: TTntStrings; FItems: TTntStrings; FSaveTopIndex, FSaveItemIndex: Integer); +procedure TntListBox_BeforeInherited_DestroyWnd(ListBox: TCustomListBox{TNT-ALLOW TCustomListBox}; + var FSaveItems: TTntStrings; const FItems: TTntStrings; var FSaveTopIndex, FSaveItemIndex: Integer); +procedure TntListBox_DrawItem_Text(ListBox: TCustomListBox{TNT-ALLOW TCustomListBox}; Items: TTntStrings; Index: Integer; Rect: TRect); +procedure TntListBox_AddItem(Items: TTntStrings; const Item: WideString; AObject: TObject); +procedure TntListBox_CopySelection(ListBox: TCustomListbox{TNT-ALLOW TCustomListbox}; + Items: TTntStrings; Destination: TCustomListControl); +function TntCustomListBox_LBGetText(ListBox: TCustomListBox{TNT-ALLOW TCustomListBox}; OnData: TLBGetWideDataEvent; var Message: TMessage): Boolean; +function TntCustomListBox_LBGetTextLen(ListBox: TCustomListBox{TNT-ALLOW TCustomListBox}; OnData: TLBGetWideDataEvent; var Message: TMessage): Boolean; + +function TntLabel_DoDrawText(Control: TCustomLabel{TNT-ALLOW TCustomLabel}; var Rect: TRect; Flags: Integer; const GetLabelText: WideString): Boolean; +procedure TntLabel_CMDialogChar(Control: TCustomLabel{TNT-ALLOW TCustomLabel}; var Message: TCMDialogChar; const Caption: WideString); + +procedure TntButton_CMDialogChar(Button: TButton{TNT-ALLOW TButton}; var Message: TCMDialogChar); + +implementation + +uses + Forms, SysUtils, Consts, RichEdit, ComStrs, + RTLConsts, {$IFDEF THEME_7_UP} Themes, {$ENDIF} + TntForms, TntGraphics, TntActnList, TntWindows, + {$IFDEF COMPILER_9_UP} WideStrUtils, {$ENDIF} TntWideStrUtils; + +{ TTntCustomEdit } + +procedure TntCustomEdit_CreateWindowHandle(Edit: TCustomEdit{TNT-ALLOW TCustomEdit}; const Params: TCreateParams); +var + P: TCreateParams; +begin + if SysLocale.FarEast + and (not Win32PlatformIsUnicode) + and ((Params.Style and ES_READONLY) <> 0) then begin + // Work around Far East Win95 API/IME bug. + P := Params; + P.Style := P.Style and (not ES_READONLY); + CreateUnicodeHandle(Edit, P, 'EDIT'); + if Edit.HandleAllocated then + SendMessage(Edit.Handle, EM_SETREADONLY, Ord(True), 0); + end else + CreateUnicodeHandle(Edit, Params, 'EDIT'); +end; + +procedure TntCustomEdit_AfterInherited_CreateWnd(Edit: TCustomEdit{TNT-ALLOW TCustomEdit}; var FPasswordChar: WideChar); +var + PasswordChar: WideChar; +begin + PasswordChar := TntCustomEdit_GetPasswordChar(Edit, FPasswordChar); + if Win32PlatformIsUnicode then + SendMessageW(Edit.Handle, EM_SETPASSWORDCHAR, Ord(PasswordChar), 0); +end; + +function TntCustomEdit_GetSelStart(Edit: TCustomEdit{TNT-ALLOW TCustomEdit}): Integer; +begin + if Win32PlatformIsUnicode then + Result := Edit.SelStart + else + Result := Length(WideString(Copy(Edit.Text, 1, Edit.SelStart))); +end; + +procedure TntCustomEdit_SetSelStart(Edit: TCustomEdit{TNT-ALLOW TCustomEdit}; const Value: Integer); +begin + if Win32PlatformIsUnicode then + Edit.SelStart := Value + else + Edit.SelStart := Length(AnsiString(Copy(TntControl_GetText(Edit), 1, Value))); +end; + +function TntCustomEdit_GetSelLength(Edit: TCustomEdit{TNT-ALLOW TCustomEdit}): Integer; +begin + if Win32PlatformIsUnicode then + Result := Edit.SelLength + else + Result := Length(TntCustomEdit_GetSelText(Edit)); +end; + +procedure TntCustomEdit_SetSelLength(Edit: TCustomEdit{TNT-ALLOW TCustomEdit}; const Value: Integer); +var + StartPos: Integer; +begin + if Win32PlatformIsUnicode then + Edit.SelLength := Value + else begin + StartPos := TntCustomEdit_GetSelStart(Edit); + Edit.SelLength := Length(AnsiString(Copy(TntControl_GetText(Edit), StartPos + 1, Value))); + end; +end; + +function TntCustomEdit_GetSelText(Edit: TCustomEdit{TNT-ALLOW TCustomEdit}): WideString; +begin + if Win32PlatformIsUnicode then + Result := Copy(TntControl_GetText(Edit), Edit.SelStart + 1, Edit.SelLength) + else + Result := Edit.SelText +end; + +procedure TntCustomEdit_SetSelText(Edit: TCustomEdit{TNT-ALLOW TCustomEdit}; const Value: WideString); +begin + if Win32PlatformIsUnicode then + SendMessageW(Edit.Handle, EM_REPLACESEL, 0, Longint(PWideChar(Value))) + else + Edit.SelText := Value; +end; + +function WideCharToAnsiChar(const C: WideChar): AnsiChar; +begin + if C <= High(AnsiChar) then + Result := AnsiChar(C) + else + Result := '*'; +end; + +type TAccessCustomEdit = class(TCustomEdit{TNT-ALLOW TCustomEdit}); + +function TntCustomEdit_GetPasswordChar(Edit: TCustomEdit{TNT-ALLOW TCustomEdit}; var FPasswordChar: WideChar): WideChar; +begin + if TAccessCustomEdit(Edit).PasswordChar <> WideCharToAnsiChar(FPasswordChar) then + FPasswordChar := WideChar(TAccessCustomEdit(Edit).PasswordChar); + Result := FPasswordChar; +end; + +procedure TntCustomEdit_SetPasswordChar(Edit: TCustomEdit{TNT-ALLOW TCustomEdit}; var FPasswordChar: WideChar; const Value: WideChar); +var + SaveWindowHandle: Integer; + PasswordCharSetHere: Boolean; +begin + if TntCustomEdit_GetPasswordChar(Edit, FPasswordChar) <> Value then + begin + FPasswordChar := Value; + PasswordCharSetHere := Win32PlatformIsUnicode and Edit.HandleAllocated; + SaveWindowHandle := TAccessCustomEdit(Edit).WindowHandle; + try + if PasswordCharSetHere then + TAccessCustomEdit(Edit).WindowHandle := 0; // this prevents TCustomEdit from actually changing it + TAccessCustomEdit(Edit).PasswordChar := WideCharToAnsiChar(FPasswordChar); + finally + TAccessCustomEdit(Edit).WindowHandle := SaveWindowHandle; + end; + if PasswordCharSetHere then + begin + Assert(Win32PlatformIsUnicode); + Assert(Edit.HandleAllocated); + SendMessageW(Edit.Handle, EM_SETPASSWORDCHAR, Ord(FPasswordChar), 0); + Edit.Invalidate; + end; + end; +end; + +procedure TTntCustomEdit.CreateWindowHandle(const Params: TCreateParams); +begin + TntCustomEdit_CreateWindowHandle(Self, Params); +end; + +procedure TTntCustomEdit.CreateWnd; +begin + inherited; + TntCustomEdit_AfterInherited_CreateWnd(Self, FPasswordChar); +end; + +procedure TTntCustomEdit.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntCustomEdit.GetSelStart: Integer; +begin + Result := TntCustomEdit_GetSelStart(Self); +end; + +procedure TTntCustomEdit.SetSelStart(const Value: Integer); +begin + TntCustomEdit_SetSelStart(Self, Value); +end; + +function TTntCustomEdit.GetSelLength: Integer; +begin + Result := TntCustomEdit_GetSelLength(Self); +end; + +procedure TTntCustomEdit.SetSelLength(const Value: Integer); +begin + TntCustomEdit_SetSelLength(Self, Value); +end; + +function TTntCustomEdit.GetSelText: WideString; +begin + Result := TntCustomEdit_GetSelText(Self); +end; + +procedure TTntCustomEdit.SetSelText(const Value: WideString); +begin + TntCustomEdit_SetSelText(Self, Value); +end; + +function TTntCustomEdit.GetPasswordChar: WideChar; +begin + Result := TntCustomEdit_GetPasswordChar(Self, FPasswordChar); +end; + +procedure TTntCustomEdit.SetPasswordChar(const Value: WideChar); +begin + TntCustomEdit_SetPasswordChar(Self, FPasswordChar, Value); +end; + +function TTntCustomEdit.GetText: WideString; +begin + Result := TntControl_GetText(Self); +end; + +procedure TTntCustomEdit.SetText(const Value: WideString); +begin + TntControl_SetText(Self, Value); +end; + +function TTntCustomEdit.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TTntCustomEdit.GetHint: WideString; +begin + Result := TntControl_GetHint(Self) +end; + +procedure TTntCustomEdit.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntCustomEdit.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntCustomEdit.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +{ TTntMemoStrings } + +constructor TTntMemoStrings.Create; +begin + inherited; + FLineBreakStyle := tlbsCRLF; +end; + +function TTntMemoStrings.GetCount: Integer; +begin + Result := FMemoLines.Count; +end; + +function TntMemo_LineStart(Handle: THandle; Index: Integer): Integer; +begin + Assert(Win32PlatformIsUnicode); + Result := SendMessageW(Handle, EM_LINEINDEX, Index, 0); +end; + +function TntMemo_LineLength(Handle: THandle; Index: Integer; StartPos: Integer = -1): Integer; +begin + Assert(Win32PlatformIsUnicode); + if StartPos = -1 then + StartPos := TntMemo_LineStart(Handle, Index); + if StartPos < 0 then + Result := 0 + else + Result := SendMessageW(Handle, EM_LINELENGTH, StartPos, 0); +end; + +function TTntMemoStrings.Get(Index: Integer): WideString; +var + Len: Integer; +begin + if (not IsWindowUnicode(FMemo.Handle)) then + Result := FMemoLines[Index] + else begin + SetLength(Result, TntMemo_LineLength(FMemo.Handle, Index)); + if Length(Result) > 0 then begin + if Length(Result) > High(Word) then + raise EOutOfResources.Create(SOutlineLongLine); + Word((PWideChar(Result))^) := Length(Result); + Len := SendMessageW(FMemo.Handle, EM_GETLINE, Index, Longint(PWideChar(Result))); + SetLength(Result, Len); + end; + end; +end; + +procedure TTntMemoStrings.Put(Index: Integer; const S: WideString); +var + StartPos: Integer; +begin + if (not IsWindowUnicode(FMemo.Handle)) then + FMemoLines[Index] := S + else begin + StartPos := TntMemo_LineStart(FMemo.Handle, Index); + if StartPos >= 0 then + begin + SendMessageW(FMemo.Handle, EM_SETSEL, StartPos, StartPos + TntMemo_LineLength(FMemo.Handle, Index)); + SendMessageW(FMemo.Handle, EM_REPLACESEL, 0, Longint(PWideChar(S))); + end; + end; +end; + +procedure TTntMemoStrings.Insert(Index: Integer; const S: Widestring); + + function RichEditSelStartW: Integer; + var + CharRange: TCharRange; + begin + SendMessageW(FMemo.Handle, EM_EXGETSEL, 0, Longint(@CharRange)); + Result := CharRange.cpMin; + end; + +var + StartPos, LineLen: Integer; + Line: WideString; +begin + if (not IsWindowUnicode(FMemo.Handle)) then + FMemoLines.Insert(Index, S) + else begin + if Index >= 0 then + begin + StartPos := TntMemo_LineStart(FMemo.Handle, Index); + if StartPos >= 0 then + Line := S + CRLF + else begin + StartPos := TntMemo_LineStart(FMemo.Handle, Index - 1); + LineLen := TntMemo_LineLength(FMemo.Handle, Index - 1); + if LineLen = 0 then + Exit; + Inc(StartPos, LineLen); + Line := CRLF + s; + end; + SendMessageW(FMemo.Handle, EM_SETSEL, StartPos, StartPos); + + if (FRichEditMode) + and (FLineBreakStyle <> tlbsCRLF) then begin + Line := TntAdjustLineBreaks(Line, FLineBreakStyle); + if Line = CR then + Line := CRLF; { This helps a ReadOnly RichEdit 4.1 control to insert a blank line. } + SendMessageW(FMemo.Handle, EM_REPLACESEL, 0, Longint(PWideChar(Line))); + if Line = CRLF then + Line := CR; + end else + SendMessageW(FMemo.Handle, EM_REPLACESEL, 0, Longint(PWideChar(Line))); + + if (FRichEditMode) + and (RichEditSelStartW <> (StartPos + Length(Line))) then + raise EOutOfResources.Create(sRichEditInsertError); + end; + end; +end; + +procedure TTntMemoStrings.Delete(Index: Integer); +begin + FMemoLines.Delete(Index); +end; + +procedure TTntMemoStrings.Clear; +begin + FMemoLines.Clear; +end; + +type TAccessStrings = class(TStrings{TNT-ALLOW TStrings}); + +procedure TTntMemoStrings.SetUpdateState(Updating: Boolean); +begin + TAccessStrings(FMemoLines).SetUpdateState(Updating); +end; + +function TTntMemoStrings.GetTextStr: WideString; +begin + if (not FRichEditMode) then + Result := TntControl_GetText(FMemo) + else + Result := inherited GetTextStr; +end; + +procedure TTntMemoStrings.SetTextStr(const Value: WideString); +var + NewText: WideString; +begin + NewText := TntAdjustLineBreaks(Value, FLineBreakStyle); + if NewText <> GetTextStr then begin + FMemo.HandleNeeded; + TntControl_SetText(FMemo, NewText); + end; +end; + +{ TTntCustomMemo } + +constructor TTntCustomMemo.Create(AOwner: TComponent); +begin + inherited; + FLines := TTntMemoStrings.Create; + TTntMemoStrings(FLines).FMemo := Self; + TTntMemoStrings(FLines).FMemoLines := TCustomMemo{TNT-ALLOW TCustomMemo}(Self).Lines; +end; + +destructor TTntCustomMemo.Destroy; +begin + FreeAndNil(FLines); + inherited; +end; + +procedure TTntCustomMemo.SetLines(const Value: TTntStrings); +begin + FLines.Assign(Value); +end; + +procedure TTntCustomMemo.CreateWindowHandle(const Params: TCreateParams); +begin + TntCustomEdit_CreateWindowHandle(Self, Params); +end; + +procedure TTntCustomMemo.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntCustomMemo.GetSelStart: Integer; +begin + Result := TntCustomEdit_GetSelStart(Self); +end; + +procedure TTntCustomMemo.SetSelStart(const Value: Integer); +begin + TntCustomEdit_SetSelStart(Self, Value); +end; + +function TTntCustomMemo.GetSelLength: Integer; +begin + Result := TntCustomEdit_GetSelLength(Self); +end; + +procedure TTntCustomMemo.SetSelLength(const Value: Integer); +begin + TntCustomEdit_SetSelLength(Self, Value); +end; + +function TTntCustomMemo.GetSelText: WideString; +begin + Result := TntCustomEdit_GetSelText(Self); +end; + +procedure TTntCustomMemo.SetSelText(const Value: WideString); +begin + TntCustomEdit_SetSelText(Self, Value); +end; + +function TTntCustomMemo.GetText: WideString; +begin + Result := TntControl_GetText(Self); +end; + +procedure TTntCustomMemo.SetText(const Value: WideString); +begin + TntControl_SetText(Self, Value); +end; + +function TTntCustomMemo.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self); +end; + +function TTntCustomMemo.GetHint: WideString; +begin + Result := TntControl_GetHint(Self) +end; + +procedure TTntCustomMemo.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntCustomMemo.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntCustomMemo.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +{$IFDEF DELPHI_7} // fix for Delphi 7 only +function TD7PatchedComboBoxStrings.Get(Index: Integer): string{TNT-ALLOW string}; +var + Len: Integer; +begin + Len := SendMessage(ComboBox.Handle, CB_GETLBTEXTLEN, Index, 0); + if Len > 0 then + begin + SetLength(Result, Len); + SendMessage(ComboBox.Handle, CB_GETLBTEXT, Index, Longint(PChar{TNT-ALLOW PChar}(Result))); + end + else + SetLength(Result, 0); +end; + +function TD7PatchedComboBoxStrings.Add(const S: string{TNT-ALLOW string}): Integer; +begin + Result := SendMessage(ComboBox.Handle, CB_ADDSTRING, 0, Longint(PChar{TNT-ALLOW PChar}(S))); + if Result < 0 then + raise EOutOfResources.Create(SInsertLineError); +end; + +procedure TD7PatchedComboBoxStrings.Insert(Index: Integer; const S: string{TNT-ALLOW string}); +begin + if SendMessage(ComboBox.Handle, CB_INSERTSTRING, Index, + Longint(PChar{TNT-ALLOW PChar}(S))) < 0 then + raise EOutOfResources.Create(SInsertLineError); +end; +{$ENDIF} + +{ TTntComboBoxStrings } + +function TTntComboBoxStrings.GetCount: Integer; +begin + Result := ComboBox.Items.Count; +end; + +function TTntComboBoxStrings.Get(Index: Integer): WideString; +var + Len: Integer; +begin + if (not IsWindowUnicode(ComboBox.Handle)) then + Result := ComboBox.Items[Index] + else begin + Len := SendMessageW(ComboBox.Handle, CB_GETLBTEXTLEN, Index, 0); + if Len = CB_ERR then + Result := '' + else begin + SetLength(Result, Len + 1); + Len := SendMessageW(ComboBox.Handle, CB_GETLBTEXT, Index, Longint(PWideChar(Result))); + if Len = CB_ERR then + Result := '' + else + Result := PWideChar(Result); + end; + end; +end; + +function TTntComboBoxStrings.GetObject(Index: Integer): TObject; +begin + Result := ComboBox.Items.Objects[Index]; +end; + +procedure TTntComboBoxStrings.PutObject(Index: Integer; AObject: TObject); +begin + ComboBox.Items.Objects[Index] := AObject; +end; + +function TTntComboBoxStrings.Add(const S: WideString): Integer; +begin + if (not IsWindowUnicode(ComboBox.Handle)) then + Result := ComboBox.Items.Add(S) + else begin + Result := SendMessageW(ComboBox.Handle, CB_ADDSTRING, 0, Longint(PWideChar(S))); + if Result < 0 then + raise EOutOfResources.Create(SInsertLineError); + end; +end; + +procedure TTntComboBoxStrings.Insert(Index: Integer; const S: WideString); +begin + if (not IsWindowUnicode(ComboBox.Handle)) then + ComboBox.Items.Insert(Index, S) + else begin + if SendMessageW(ComboBox.Handle, CB_INSERTSTRING, Index, Longint(PWideChar(S))) < 0 then + raise EOutOfResources.Create(SInsertLineError); + end; +end; + +procedure TTntComboBoxStrings.Delete(Index: Integer); +begin + ComboBox.Items.Delete(Index); +end; + +procedure TTntComboBoxStrings.Clear; +var + S: WideString; +begin + S := TntControl_GetText(ComboBox); + SendMessage(ComboBox.Handle, CB_RESETCONTENT, 0, 0); + TntControl_SetText(ComboBox, S); + ComboBox.Update; +end; + +procedure TTntComboBoxStrings.SetUpdateState(Updating: Boolean); +begin + TAccessStrings(ComboBox.Items).SetUpdateState(Updating); +end; + +function TTntComboBoxStrings.IndexOf(const S: WideString): Integer; +begin + if (not IsWindowUnicode(ComboBox.Handle)) then + Result := ComboBox.Items.IndexOf(S) + else + Result := SendMessageW(ComboBox.Handle, CB_FINDSTRINGEXACT, -1, LongInt(PWideChar(S))); +end; + +{ TTntCustomComboBox } + +type TAccessCustomComboBox = class(TCustomComboBox{TNT-ALLOW TCustomComboBox}); + +procedure TntCombo_AfterInherited_CreateWnd(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}; + Items: TTntStrings; var FSaveItems: TTntStrings; FSaveItemIndex: integer; PreInheritedAnsiText: AnsiString); +begin + if (not Win32PlatformIsUnicode) then begin + TAccessCustomComboBox(Combo).Text := PreInheritedAnsiText; + end else begin + with TAccessCustomComboBox(Combo) do + begin + if ListHandle <> 0 then begin + // re-extract FDefListProc as a Unicode proc + SetWindowLongA(ListHandle, GWL_WNDPROC, Integer(FDefListProc)); + FDefListProc := Pointer(GetWindowLongW(ListHandle, GWL_WNDPROC)); + // override with FListInstance as a Unicode proc + SetWindowLongW(ListHandle, GWL_WNDPROC, Integer(FListInstance)); + end; + SetWindowLongW(EditHandle, GWL_WNDPROC, GetWindowLong(EditHandle, GWL_WNDPROC)); + end; + if FSaveItems <> nil then + begin + Items.Assign(FSaveItems); + FreeAndNil(FSaveItems); + if FSaveItemIndex <> -1 then + begin + if Items.Count < FSaveItemIndex then FSaveItemIndex := Items.Count; + SendMessage(Combo.Handle, CB_SETCURSEL, FSaveItemIndex, 0); + end; + end; + TntControl_SetText(Combo, TntControl_GetStoredText(Combo, TAccessCustomComboBox(Combo).Text)); + end; +end; + +procedure TntCombo_BeforeInherited_DestroyWnd(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}; + Items: TTntStrings; var FSaveItems: TTntStrings; ItemIndex: integer; var FSaveItemIndex: integer; + var SavedText: WideString); +begin + Assert(not (csDestroyingHandle in Combo.ControlState)); + if (Win32PlatformIsUnicode) then begin + SavedText := TntControl_GetText(Combo); + if (Items.Count > 0) then + begin + FSaveItems := TTntStringList.Create; + FSaveItems.Assign(Items); + FSaveItemIndex:= ItemIndex; + Items.Clear; { This keeps TCustomComboBox from creating its own FSaveItems. (this kills the original ItemIndex) } + end; + end; +end; + +function TntCombo_ComboWndProc(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}; + var Message: TMessage; ComboWnd: HWnd; ComboProc: Pointer; DoEditCharMsg: TWMCharMsgHandler): Boolean; + + procedure CallDefaultWindowProc; + begin + with Message do begin { call default wnd proc } + if IsWindowUnicode(ComboWnd) then + Result := CallWindowProcW(ComboProc, ComboWnd, Msg, WParam, LParam) + else + Result := CallWindowProcA(ComboProc, ComboWnd, Msg, WParam, LParam); + end; + end; + + function DoWideKeyPress(Message: TWMChar): Boolean; + begin + DoEditCharMsg(Message); + Result := (Message.CharCode = 0); + end; + +begin + Result := False; + try + if (Message.Msg = WM_CHAR) then begin + // WM_CHAR + Result := True; + if IsWindowUnicode(ComboWnd) then + MakeWMCharMsgSafeForAnsi(Message); + try + if TAccessCustomComboBox(Combo).DoKeyPress(TWMKey(Message)) then Exit; + if DoWideKeyPress(TWMKey(Message)) then Exit; + finally + if IsWindowUnicode(ComboWnd) then + RestoreWMCharMsg(Message); + end; + with TWMKey(Message) do begin + if ((CharCode = VK_RETURN) or (CharCode = VK_ESCAPE)) and Combo.DroppedDown then begin + Combo.DroppedDown := False; + Exit; + end; + end; + CallDefaultWindowProc; + end else if (IsWindowUnicode(ComboWnd)) then begin + // UNICODE + if IsTextMessage(Message.Msg) + or (Message.Msg = EM_REPLACESEL) + or (Message.Msg = WM_IME_COMPOSITION) + then begin + // message w/ text parameter + Result := True; + CallDefaultWindowProc; + end else if (Message.Msg = WM_IME_CHAR) then begin + // WM_IME_CHAR + Result := True; + with Message do { convert to WM_CHAR } + Result := SendMessageW(ComboWnd, WM_CHAR, WParam, LParam); + end; + end; + except + Application.HandleException(Combo); + end; +end; + +function TntCombo_CNCommand(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}; Items: TTntStrings; var Message: TWMCommand): Boolean; +begin + Result := False; + if Message.NotifyCode = CBN_SELCHANGE then begin + Result := True; + TntControl_SetText(Combo, Items[Combo.ItemIndex]); + TAccessCustomComboBox(Combo).Click; + TAccessCustomComboBox(Combo).Select; + end; +end; + +function TntCombo_GetSelStart(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}): Integer; +begin + if Win32PlatformIsUnicode then + Result := Combo.SelStart + else + Result := Length(WideString(Copy(TAccessCustomComboBox(Combo).Text, 1, Combo.SelStart))); +end; + +procedure TntCombo_SetSelStart(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}; const Value: Integer); +begin + if Win32PlatformIsUnicode then + Combo.SelStart := Value + else + Combo.SelStart := Length(AnsiString(Copy(TntControl_GetText(Combo), 1, Value))); +end; + +function TntCombo_GetSelLength(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}): Integer; +begin + if Win32PlatformIsUnicode then + Result := Combo.SelLength + else + Result := Length(TntCombo_GetSelText(Combo)); +end; + +procedure TntCombo_SetSelLength(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}; const Value: Integer); +var + StartPos: Integer; +begin + if Win32PlatformIsUnicode then + Combo.SelLength := Value + else begin + StartPos := TntCombo_GetSelStart(Combo); + Combo.SelLength := Length(AnsiString(Copy(TntControl_GetText(Combo), StartPos + 1, Value))); + end; +end; + +function TntCombo_GetSelText(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}): WideString; +begin + if Win32PlatformIsUnicode then begin + Result := ''; + if TAccessCustomComboBox(Combo).Style < csDropDownList then + Result := Copy(TntControl_GetText(Combo), Combo.SelStart + 1, Combo.SelLength); + end else + Result := Combo.SelText +end; + +procedure TntCombo_SetSelText(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}; const Value: WideString); +begin + if Win32PlatformIsUnicode then begin + if TAccessCustomComboBox(Combo).Style < csDropDownList then + begin + Combo.HandleNeeded; + SendMessageW(TAccessCustomComboBox(Combo).EditHandle, EM_REPLACESEL, 0, Longint(PWideChar(Value))); + end; + end else + Combo.SelText := Value +end; + +procedure TntCombo_BeforeKeyPress(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}; var SaveAutoComplete: Boolean); +begin + SaveAutoComplete := TAccessCustomComboBox(Combo).AutoComplete; + TAccessCustomComboBox(Combo).AutoComplete := False; +end; + +procedure TntCombo_AfterKeyPress(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}; var SaveAutoComplete: Boolean); +begin + TAccessCustomComboBox(Combo).AutoComplete := SaveAutoComplete; +end; + +procedure TntCombo_DropDown_PreserveSelection(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}); +var + OldSelStart, OldSelLength: Integer; + OldText: WideString; +begin + OldText := TntControl_GetText(Combo); + OldSelStart := TntCombo_GetSelStart(Combo); + OldSelLength := TntCombo_GetSelLength(Combo); + Combo.DroppedDown := True; + TntControl_SetText(Combo, OldText); + TntCombo_SetSelStart(Combo, OldSelStart); + TntCombo_SetSelLength(Combo ,OldSelLength); +end; + +procedure TntComboBox_AddItem(Items: TTntStrings; const Item: WideString; AObject: TObject); +begin + Items.AddObject(Item, AObject); +end; + +procedure TntComboBox_CopySelection(Items: TTntStrings; ItemIndex: Integer; + Destination: TCustomListControl); +begin + if ItemIndex <> -1 then + WideListControl_AddItem(Destination, Items[ItemIndex], Items.Objects[ItemIndex]); +end; + +function TntCombo_FindString(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}; + StartPos: Integer; const Text: WideString): Integer; +var + ComboFindString: ITntComboFindString; +begin + if Combo.GetInterface(ITntComboFindString, ComboFindString) then + Result := ComboFindString.FindString(Text, StartPos) + else if IsWindowUnicode(Combo.Handle) then + Result := SendMessageW(Combo.Handle, CB_FINDSTRING, StartPos, Integer(PWideChar(Text))) + else + Result := SendMessageA(Combo.Handle, CB_FINDSTRING, StartPos, Integer(PAnsiChar(AnsiString(Text)))) +end; + +function TntCombo_FindUniqueString(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}; + StartPos: Integer; const Text: WideString): Integer; +var + Match_1, Match_2: Integer; +begin + Result := CB_ERR; + Match_1 := TntCombo_FindString(Combo, -1, Text); + if Match_1 <> CB_ERR then begin + Match_2 := TntCombo_FindString(Combo, Match_1, Text); + if Match_2 = Match_1 then + Result := Match_1; + end; +end; + +function TntCombo_AutoSelect(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}; Items: TTntStrings; + const SearchText: WideString; UniqueMatchOnly: Boolean; UseDataEntryCase: Boolean): Boolean; +var + Idx: Integer; + ValueChange: Boolean; +begin + if UniqueMatchOnly then + Idx := TntCombo_FindUniqueString(Combo, -1, SearchText) + else + Idx := TntCombo_FindString(Combo, -1, SearchText); + Result := (Idx <> CB_ERR); + if Result then begin + if TAccessCustomComboBox(Combo).Style = csDropDown then + ValueChange := not WideSameStr(TntControl_GetText(Combo), Items[Idx]) + else + ValueChange := Idx <> Combo.ItemIndex; + {$IFDEF COMPILER_7_UP} + // auto-closeup + if Combo.AutoCloseUp and (Items.IndexOf(SearchText) <> -1) then + Combo.DroppedDown := False; + {$ENDIF} + // select item + Combo.ItemIndex := Idx; + // update edit + if (TAccessCustomComboBox(Combo).Style in [csDropDown, csSimple]) then begin + if UseDataEntryCase then begin + // preserve case of characters as they are entered + TntControl_SetText(Combo, SearchText + Copy(Items[Combo.ItemIndex], Length(SearchText) + 1, MaxInt)); + end else begin + TntControl_SetText(Combo, Items[Idx]); + end; + // select the rest of the string + TntCombo_SetSelStart(Combo, Length(SearchText)); + TntCombo_SetSelLength(Combo, Length(TntControl_GetText(Combo)) - TntCombo_GetSelStart(Combo)); + end; + // notify events + if ValueChange then begin + TAccessCustomComboBox(Combo).Click; + TAccessCustomComboBox(Combo).Select; + end; + end; +end; + +procedure TntCombo_AutoSearchKeyPress(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}; + Items: TTntStrings; var Message: TWMChar; var FFilter: WideString; var FLastTime: Cardinal); +var + Key: WideChar; +begin + if TAccessCustomComboBox(Combo).Style in [csSimple, csDropDown] then + exit; + if not Combo.AutoComplete then + exit; + Key := GetWideCharFromWMCharMsg(Message); + try + case Ord(Key) of + VK_ESCAPE: + exit; + VK_TAB: + if Combo.AutoDropDown and Combo.DroppedDown then + Combo.DroppedDown := False; + VK_BACK: + Delete(FFilter, Length(FFilter), 1); + else begin + if Combo.AutoDropDown and (not Combo.DroppedDown) then + Combo.DroppedDown := True; + // reset FFilter if it's been too long (1.25 sec) { Windows XP is actually 2 seconds! } + if GetTickCount - FLastTime >= 1250 then + FFilter := ''; + FLastTime := GetTickCount; + // if AutoSelect works, remember new FFilter + if TntCombo_AutoSelect(Combo, Items, FFilter + Key, False, True) then begin + FFilter := FFilter + Key; + Key := #0; + end; + end; + end; + finally + SetWideCharForWMCharMsg(Message, Key); + end; +end; + +procedure TntCombo_AutoCompleteKeyPress(Combo: TCustomComboBox{TNT-ALLOW TCustomComboBox}; + Items: TTntStrings; var Message: TWMChar; + AutoComplete_UniqueMatchOnly, AutoComplete_PreserveDataEntryCase: Boolean); +var + Key: WideChar; + FindText: WideString; +begin + Assert(TAccessCustomComboBox(Combo).Style in [csSimple, csDropDown], 'Internal Error: TntCombo_AutoCompleteKeyPress is only for csSimple and csDropDown style combo boxes.'); + if not Combo.AutoComplete then exit; + Key := GetWideCharFromWMCharMsg(Message); + try + case Ord(Key) of + VK_ESCAPE: + exit; + VK_TAB: + if Combo.AutoDropDown and Combo.DroppedDown then + Combo.DroppedDown := False; + VK_BACK: + exit; + else begin + if Combo.AutoDropDown and (not Combo.DroppedDown) then + TntCombo_DropDown_PreserveSelection(Combo); + // AutoComplete only if the selection is at the very end + if ((TntCombo_GetSelStart(Combo) + TntCombo_GetSelLength(Combo)) + = Length(TntControl_GetText(Combo))) then + begin + FindText := Copy(TntControl_GetText(Combo), 1, TntCombo_GetSelStart(Combo)) + Key; + if TntCombo_AutoSelect(Combo, Items, FindText, AutoComplete_UniqueMatchOnly, AutoComplete_PreserveDataEntryCase) then + begin + Key := #0; + end; + end; + end; + end; + finally + SetWideCharForWMCharMsg(Message, Key); + end; +end; + +//-- +constructor TTntCustomComboBox.Create(AOwner: TComponent); +begin + inherited; + FItems := TTntComboBoxStrings.Create; + TTntComboBoxStrings(FItems).ComboBox := Self; +end; + +destructor TTntCustomComboBox.Destroy; +begin + FreeAndNil(FItems); + FreeAndNil(FSaveItems); + inherited; +end; + +procedure TTntCustomComboBox.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle(Self, Params, 'COMBOBOX'); +end; + +procedure TTntCustomComboBox.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +procedure TTntCustomComboBox.CreateWnd; +var + PreInheritedAnsiText: AnsiString; +begin + PreInheritedAnsiText := TAccessCustomComboBox(Self).Text; + inherited; + TntCombo_AfterInherited_CreateWnd(Self, Items, FSaveItems, FSaveItemIndex, PreInheritedAnsiText); +end; + +procedure TTntCustomComboBox.DestroyWnd; +var + SavedText: WideString; +begin + if not (csDestroyingHandle in ControlState) then begin { avoid recursion when parent is TToolBar and system font changes. } + TntCombo_BeforeInherited_DestroyWnd(Self, Items, FSaveItems, ItemIndex, FSaveItemIndex, SavedText); + inherited; + TntControl_SetStoredText(Self, SavedText); + end; +end; + +procedure TTntCustomComboBox.ComboWndProc(var Message: TMessage; ComboWnd: HWnd; ComboProc: Pointer); +begin + if not TntCombo_ComboWndProc(Self, Message, ComboWnd, ComboProc, DoEditCharMsg) then + inherited; +end; + +procedure TTntCustomComboBox.KeyPress(var Key: AnsiChar); +var + SaveAutoComplete: Boolean; +begin + TntCombo_BeforeKeyPress(Self, SaveAutoComplete); + try + inherited; + finally + TntCombo_AfterKeyPress(Self, SaveAutoComplete); + end; +end; + +procedure TTntCustomComboBox.DoEditCharMsg(var Message: TWMChar); +begin + TntCombo_AutoCompleteKeyPress(Self, Items, Message, + GetAutoComplete_UniqueMatchOnly, GetAutoComplete_PreserveDataEntryCase); +end; + +procedure TTntCustomComboBox.WMChar(var Message: TWMChar); +begin + TntCombo_AutoSearchKeyPress(Self, Items, Message, FFilter, FLastTime); + if Message.CharCode <> 0 then + inherited; +end; + +procedure TntCombo_DefaultDrawItem(Canvas: TCanvas; Index: Integer; Rect: TRect; + State: TOwnerDrawState; Items: TTntStrings); +begin + Canvas.FillRect(Rect); + if Index >= 0 then + WideCanvasTextOut(Canvas, Rect.Left + 2, Rect.Top, Items[Index]); +end; + +procedure TTntCustomComboBox.DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); +begin + TControlCanvas(Canvas).UpdateTextFlags; + if Assigned(OnDrawItem) then + OnDrawItem(Self, Index, Rect, State) + else + TntCombo_DefaultDrawItem(Canvas, Index, Rect, State, Items); +end; + +function TTntCustomComboBox.GetItems: TTntStrings; +begin + Result := FItems; +end; + +procedure TTntCustomComboBox.SetItems(const Value: TTntStrings); +begin + FItems.Assign(Value); +end; + +function TTntCustomComboBox.GetSelStart: Integer; +begin + Result := TntCombo_GetSelStart(Self); +end; + +procedure TTntCustomComboBox.SetSelStart(const Value: Integer); +begin + TntCombo_SetSelStart(Self, Value); +end; + +function TTntCustomComboBox.GetSelLength: Integer; +begin + Result := TntCombo_GetSelLength(Self); +end; + +procedure TTntCustomComboBox.SetSelLength(const Value: Integer); +begin + TntCombo_SetSelLength(Self, Value); +end; + +function TTntCustomComboBox.GetSelText: WideString; +begin + Result := TntCombo_GetSelText(Self); +end; + +procedure TTntCustomComboBox.SetSelText(const Value: WideString); +begin + TntCombo_SetSelText(Self, Value); +end; + +function TTntCustomComboBox.GetText: WideString; +begin + Result := TntControl_GetText(Self); +end; + +procedure TTntCustomComboBox.SetText(const Value: WideString); +begin + TntControl_SetText(Self, Value); +end; + +procedure TTntCustomComboBox.CNCommand(var Message: TWMCommand); +begin + if not TntCombo_CNCommand(Self, Items, Message) then + inherited; +end; + +function TTntCustomComboBox.GetAutoComplete_PreserveDataEntryCase: Boolean; +begin + Result := True; +end; + +function TTntCustomComboBox.GetAutoComplete_UniqueMatchOnly: Boolean; +begin + Result := False; +end; + +function TTntCustomComboBox.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self) +end; + +function TTntCustomComboBox.GetHint: WideString; +begin + Result := TntControl_GetHint(Self) +end; + +procedure TTntCustomComboBox.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntCustomComboBox.AddItem(const Item: WideString; AObject: TObject); +begin + TntComboBox_AddItem(Items, Item, AObject); +end; + +procedure TTntCustomComboBox.CopySelection(Destination: TCustomListControl); +begin + TntComboBox_CopySelection(Items, ItemIndex, Destination); +end; + +procedure TTntCustomComboBox.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntCustomComboBox.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +{$IFDEF DELPHI_7} // fix for Delphi 7 only +function TTntCustomComboBox.GetItemsClass: TCustomComboBoxStringsClass; +begin + Result := TD7PatchedComboBoxStrings; +end; +{$ENDIF} + +{ TTntListBoxStrings } + +function TTntListBoxStrings.GetListBox: TCustomListBox{TNT-ALLOW TCustomListBox}; +begin + Result := TCustomListBox{TNT-ALLOW TCustomListBox}(FListBox); +end; + +procedure TTntListBoxStrings.SetListBox(const Value: TCustomListBox{TNT-ALLOW TCustomListBox}); +begin + FListBox := TAccessCustomListBox(Value); +end; + +function TTntListBoxStrings.GetCount: Integer; +begin + Result := ListBox.Items.Count; +end; + +function TTntListBoxStrings.Get(Index: Integer): WideString; +var + Len: Integer; +begin + if (not IsWindowUnicode(ListBox.Handle)) then + Result := ListBox.Items[Index] + else begin + Len := SendMessageW(ListBox.Handle, LB_GETTEXTLEN, Index, 0); + if Len = LB_ERR then + Error(SListIndexError, Index) + else begin + SetLength(Result, Len + 1); + Len := SendMessageW(ListBox.Handle, LB_GETTEXT, Index, Longint(PWideChar(Result))); + if Len = LB_ERR then + Result := '' + else + Result := PWideChar(Result); + end; + end; +end; + +function TTntListBoxStrings.GetObject(Index: Integer): TObject; +begin + Result := ListBox.Items.Objects[Index]; +end; + +procedure TTntListBoxStrings.Put(Index: Integer; const S: WideString); +var + I: Integer; + TempData: Longint; +begin + I := ListBox.ItemIndex; + TempData := FListBox.InternalGetItemData(Index); + // Set the Item to 0 in case it is an object that gets freed during Delete + FListBox.InternalSetItemData(Index, 0); + Delete(Index); + InsertObject(Index, S, nil); + FListBox.InternalSetItemData(Index, TempData); + ListBox.ItemIndex := I; +end; + +procedure TTntListBoxStrings.PutObject(Index: Integer; AObject: TObject); +begin + ListBox.Items.Objects[Index] := AObject; +end; + +function TTntListBoxStrings.Add(const S: WideString): Integer; +begin + if (not IsWindowUnicode(ListBox.Handle)) then + Result := ListBox.Items.Add(S) + else begin + Result := SendMessageW(ListBox.Handle, LB_ADDSTRING, 0, Longint(PWideChar(S))); + if Result < 0 then + raise EOutOfResources.Create(SInsertLineError); + end; +end; + +procedure TTntListBoxStrings.Insert(Index: Integer; const S: WideString); +begin + if (not IsWindowUnicode(ListBox.Handle)) then + ListBox.Items.Insert(Index, S) + else begin + if SendMessageW(ListBox.Handle, LB_INSERTSTRING, Index, Longint(PWideChar(S))) < 0 then + raise EOutOfResources.Create(SInsertLineError); + end; +end; + +procedure TTntListBoxStrings.Delete(Index: Integer); +begin + FListBox.DeleteString(Index); +end; + +procedure TTntListBoxStrings.Exchange(Index1, Index2: Integer); +var + TempData: Longint; + TempString: WideString; +begin + BeginUpdate; + try + TempString := Strings[Index1]; + TempData := FListBox.InternalGetItemData(Index1); + Strings[Index1] := Strings[Index2]; + FListBox.InternalSetItemData(Index1, FListBox.InternalGetItemData(Index2)); + Strings[Index2] := TempString; + FListBox.InternalSetItemData(Index2, TempData); + if ListBox.ItemIndex = Index1 then + ListBox.ItemIndex := Index2 + else if ListBox.ItemIndex = Index2 then + ListBox.ItemIndex := Index1; + finally + EndUpdate; + end; +end; + +procedure TTntListBoxStrings.Clear; +begin + FListBox.ResetContent; +end; + +procedure TTntListBoxStrings.SetUpdateState(Updating: Boolean); +begin + TAccessStrings(ListBox.Items).SetUpdateState(Updating); +end; + +function TTntListBoxStrings.IndexOf(const S: WideString): Integer; +begin + if (not IsWindowUnicode(ListBox.Handle)) then + Result := ListBox.Items.IndexOf(S) + else + Result := SendMessageW(ListBox.Handle, LB_FINDSTRINGEXACT, -1, LongInt(PWideChar(S))); +end; + +procedure TTntListBoxStrings.Move(CurIndex, NewIndex: Integer); +var + TempData: Longint; + TempString: WideString; +begin + BeginUpdate; + FListBox.FMoving := True; + try + if CurIndex <> NewIndex then + begin + TempString := Get(CurIndex); + TempData := FListBox.InternalGetItemData(CurIndex); + FListBox.InternalSetItemData(CurIndex, 0); + Delete(CurIndex); + Insert(NewIndex, TempString); + FListBox.InternalSetItemData(NewIndex, TempData); + end; + finally + FListBox.FMoving := False; + EndUpdate; + end; +end; + +//-- list box helper procs + +procedure TntListBox_AfterInherited_CreateWnd(ListBox: TCustomListBox{TNT-ALLOW TCustomListBox}; + var FSaveItems: TTntStrings; FItems: TTntStrings; FSaveTopIndex, FSaveItemIndex: Integer); +begin + if FSaveItems <> nil then + begin + FItems.Assign(FSaveItems); + FreeAndNil(FSaveItems); + ListBox.TopIndex := FSaveTopIndex; + ListBox.ItemIndex := FSaveItemIndex; + end; +end; + +procedure TntListBox_BeforeInherited_DestroyWnd(ListBox: TCustomListBox{TNT-ALLOW TCustomListBox}; + var FSaveItems: TTntStrings; const FItems: TTntStrings; var FSaveTopIndex, FSaveItemIndex: Integer); +begin + if (FItems.Count > 0) + and (not (TAccessCustomListBox(ListBox).Style in [lbVirtual, lbVirtualOwnerDraw])) + then begin + FSaveItems := TTntStringList.Create; + FSaveItems.Assign(FItems); + FSaveTopIndex := ListBox.TopIndex; + FSaveItemIndex := ListBox.ItemIndex; + ListBox.Items.Clear; { This keeps TCustomListBox from creating its own FSaveItems. (this kills the original ItemIndex) } + end; +end; + +procedure TntListBox_DrawItem_Text(ListBox: TCustomListBox{TNT-ALLOW TCustomListBox}; Items: TTntStrings; Index: Integer; Rect: TRect); +var + Flags: Integer; + Canvas: TCanvas; +begin + Canvas := TAccessCustomListBox(ListBox).Canvas; + Canvas.FillRect(Rect); + if Index < Items.Count then + begin + Flags := ListBox.DrawTextBiDiModeFlags(DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX); + if not ListBox.UseRightToLeftAlignment then + Inc(Rect.Left, 2) + else + Dec(Rect.Right, 2); + Tnt_DrawTextW(Canvas.Handle, PWideChar(Items[Index]), Length(Items[Index]), Rect, Flags); + end; +end; + +procedure TntListBox_AddItem(Items: TTntStrings; const Item: WideString; AObject: TObject); +begin + Items.AddObject(PWideChar(Item), AObject); +end; + +procedure TntListBox_CopySelection(ListBox: TCustomListbox{TNT-ALLOW TCustomListbox}; + Items: TTntStrings; Destination: TCustomListControl); +var + I: Integer; +begin + if ListBox.MultiSelect then + begin + for I := 0 to Items.Count - 1 do + if ListBox.Selected[I] then + WideListControl_AddItem(Destination, PWideChar(Items[I]), Items.Objects[I]); + end + else + if Listbox.ItemIndex <> -1 then + WideListControl_AddItem(Destination, PWideChar(Items[ListBox.ItemIndex]), Items.Objects[ListBox.ItemIndex]); +end; + +function TntCustomListBox_GetOwnerData(ListBox: TCustomListBox{TNT-ALLOW TCustomListBox}; OnData: TLBGetWideDataEvent; Index: Integer; out Data: WideString): Boolean; +var + AnsiData: AnsiString; +begin + Result := False; + Data := ''; + if (Index > -1) and (Index < ListBox.Count) then begin + if Assigned(OnData) then begin + OnData(ListBox, Index, Data); + Result := True; + end else if Assigned(TAccessCustomListBox(ListBox).OnData) then begin + AnsiData := ''; + TAccessCustomListBox(ListBox).OnData(ListBox, Index, AnsiData); + Data := AnsiData; + Result := True; + end; + end; +end; + +function TntCustomListBox_LBGetText(ListBox: TCustomListBox{TNT-ALLOW TCustomListBox}; OnData: TLBGetWideDataEvent; var Message: TMessage): Boolean; +var + S: WideString; + AnsiS: AnsiString; +begin + if TAccessCustomListBox(ListBox).Style in [lbVirtual, lbVirtualOwnerDraw] then + begin + Result := True; + if TntCustomListBox_GetOwnerData(ListBox, OnData, Message.WParam, S) then begin + if Win32PlatformIsUnicode then begin + WStrCopy(PWideChar(Message.LParam), PWideChar(S)); + Message.Result := Length(S); + end else begin + AnsiS := S; + StrCopy{TNT-ALLOW StrCopy}(PAnsiChar(Message.LParam), PAnsiChar(AnsiS)); + Message.Result := Length(AnsiS); + end; + end + else + Message.Result := LB_ERR; + end + else + Result := False; +end; + +function TntCustomListBox_LBGetTextLen(ListBox: TCustomListBox{TNT-ALLOW TCustomListBox}; OnData: TLBGetWideDataEvent; var Message: TMessage): Boolean; +var + S: WideString; +begin + if TAccessCustomListBox(ListBox).Style in [lbVirtual, lbVirtualOwnerDraw] then + begin + Result := True; + if TntCustomListBox_GetOwnerData(ListBox, OnData, Message.WParam, S) then begin + if Win32PlatformIsUnicode then + Message.Result := Length(S) + else + Message.Result := Length(AnsiString(S)); + end else + Message.Result := LB_ERR; + end + else + Result := False; +end; + +{ TTntCustomListBox } + +constructor TTntCustomListBox.Create(AOwner: TComponent); +begin + inherited; + FItems := TTntListBoxStrings.Create; + TTntListBoxStrings(FItems).ListBox := Self; +end; + +destructor TTntCustomListBox.Destroy; +begin + FreeAndNil(FItems); + FreeAndNil(FSaveItems); + inherited; +end; + +procedure TTntCustomListBox.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle(Self, Params, 'LISTBOX'); +end; + +procedure TTntCustomListBox.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +procedure TTntCustomListBox.CreateWnd; +begin + inherited; + TntListBox_AfterInherited_CreateWnd(Self, FSaveItems, FItems, FSaveTopIndex, FSaveItemIndex); +end; + +procedure TTntCustomListBox.DestroyWnd; +begin + TntListBox_BeforeInherited_DestroyWnd(Self, FSaveItems, FItems, FSaveTopIndex, FSaveItemIndex); + inherited; +end; + +procedure TTntCustomListBox.SetItems(const Value: TTntStrings); +begin + FItems.Assign(Value); +end; + +procedure TTntCustomListBox.DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); +begin + if Assigned(OnDrawItem) then + OnDrawItem(Self, Index, Rect, State) + else + TntListBox_DrawItem_Text(Self, Items, Index, Rect); +end; + +function TTntCustomListBox.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self) +end; + +function TTntCustomListBox.GetHint: WideString; +begin + Result := TntControl_GetHint(Self) +end; + +procedure TTntCustomListBox.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntCustomListBox.AddItem(const Item: WideString; AObject: TObject); +begin + TntListBox_AddItem(Items, Item, AObject); +end; + +procedure TTntCustomListBox.CopySelection(Destination: TCustomListControl); +begin + TntListBox_CopySelection(Self, Items, Destination); +end; + +procedure TTntCustomListBox.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntCustomListBox.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +procedure TTntCustomListBox.LBGetText(var Message: TMessage); +begin + if not TntCustomListBox_LBGetText(Self, OnData, Message) then + inherited; +end; + +procedure TTntCustomListBox.LBGetTextLen(var Message: TMessage); +begin + if not TntCustomListBox_LBGetTextLen(Self, OnData, Message) then + inherited; +end; + +// --- label helper procs + +type TAccessCustomLabel = class(TCustomLabel{TNT-ALLOW TCustomLabel}); + +function TntLabel_DoDrawText(Control: TCustomLabel{TNT-ALLOW TCustomLabel}; var Rect: TRect; Flags: Integer; const GetLabelText: WideString): Boolean; +{$IFDEF COMPILER_9_UP} +const + EllipsisStr = '...'; + Ellipsis: array[TEllipsisPosition] of Longint = (0, DT_PATH_ELLIPSIS, + DT_END_ELLIPSIS, DT_WORD_ELLIPSIS); +{$ENDIF} +var + Text: WideString; + ShowAccelChar: Boolean; + Canvas: TCanvas; + {$IFDEF COMPILER_9_UP} + DText: WideString; + NewRect: TRect; + Height: Integer; + Delim: Integer; + {$ENDIF} +begin + Result := False; + if Win32PlatformIsUnicode then begin + Result := True; + Text := GetLabelText; + ShowAccelChar := TAccessCustomLabel(Control).ShowAccelChar; + Canvas := Control.Canvas; + if (Flags and DT_CALCRECT <> 0) and ((Text = '') or ShowAccelChar and + (Text[1] = '&') and (Text[2] = #0)) then Text := Text + ' '; + if not ShowAccelChar then Flags := Flags or DT_NOPREFIX; + Flags := Control.DrawTextBiDiModeFlags(Flags); + Canvas.Font := TAccessCustomLabel(Control).Font; + {$IFDEF COMPILER_9_UP} + if (TAccessCustomLabel(Control).EllipsisPosition <> epNone) + and (not TAccessCustomLabel(Control).AutoSize) then + begin + DText := Text; + Flags := Flags and not (DT_EXPANDTABS or DT_CALCRECT); + Flags := Flags or Ellipsis[TAccessCustomLabel(Control).EllipsisPosition]; + if TAccessCustomLabel(Control).WordWrap + and (TAccessCustomLabel(Control).EllipsisPosition in [epEndEllipsis, epWordEllipsis]) then + begin + repeat + NewRect := Rect; + Dec(NewRect.Right, WideCanvasTextWidth(Canvas, EllipsisStr)); + Tnt_DrawTextW(Canvas.Handle, PWideChar(DText), Length(DText), NewRect, Flags or DT_CALCRECT); + Height := NewRect.Bottom - NewRect.Top; + if (Height > TAccessCustomLabel(Control).ClientHeight) + and (Height > Canvas.Font.Height) then + begin + Delim := WideLastDelimiter(' '#9, Text); + if Delim = 0 then + Delim := Length(Text); + Dec(Delim); + Text := Copy(Text, 1, Delim); + DText := Text + EllipsisStr; + if Text = '' then + Break; + end else + Break; + until False; + end; + if Text <> '' then + Text := DText; + end; + {$ENDIF} + if not Control.Enabled then + begin + OffsetRect(Rect, 1, 1); + Canvas.Font.Color := clBtnHighlight; + Tnt_DrawTextW(Canvas.Handle, PWideChar(Text), Length(Text), Rect, Flags); + OffsetRect(Rect, -1, -1); + Canvas.Font.Color := clBtnShadow; + Tnt_DrawTextW(Canvas.Handle, PWideChar(Text), Length(Text), Rect, Flags); + end + else + Tnt_DrawTextW(Canvas.Handle, PWideChar(Text), Length(Text), Rect, Flags); + end; +end; + +procedure TntLabel_CMDialogChar(Control: TCustomLabel{TNT-ALLOW TCustomLabel}; var Message: TCMDialogChar; const Caption: WideString); +var + FocusControl: TWinControl; + ShowAccelChar: Boolean; +begin + FocusControl := TAccessCustomLabel(Control).FocusControl; + ShowAccelChar := TAccessCustomLabel(Control).ShowAccelChar; + if (FocusControl <> nil) and Control.Enabled and ShowAccelChar and + IsWideCharAccel(Message.CharCode, Caption) then + with FocusControl do + if CanFocus then + begin + SetFocus; + Message.Result := 1; + end; +end; + +{ TTntCustomLabel } + +procedure TTntCustomLabel.CMDialogChar(var Message: TCMDialogChar); +begin + TntLabel_CMDialogChar(Self, Message, Caption); +end; + +function TTntCustomLabel.IsCaptionStored: Boolean; +begin + Result := TntControl_IsCaptionStored(Self) +end; + +function TTntCustomLabel.GetCaption: TWideCaption; +begin + Result := TntControl_GetText(Self); +end; + +procedure TTntCustomLabel.SetCaption(const Value: TWideCaption); +begin + TntControl_SetText(Self, Value); +end; + +procedure TTntCustomLabel.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntCustomLabel.GetLabelText: WideString; +begin + Result := Caption; +end; + +procedure TTntCustomLabel.DoDrawText(var Rect: TRect; Flags: Integer); +begin + if not TntLabel_DoDrawText(Self, Rect, Flags, GetLabelText) then + inherited; +end; + +function TTntCustomLabel.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self) +end; + +function TTntCustomLabel.GetHint: WideString; +begin + Result := TntControl_GetHint(Self) +end; + +procedure TTntCustomLabel.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntCustomLabel.CMHintShow(var Message: TMessage); +begin + ProcessCMHintShowMsg(Message); + inherited; +end; + +procedure TTntCustomLabel.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntCustomLabel.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +{ TTntButton } + +procedure TntButton_CMDialogChar(Button: TButton{TNT-ALLOW TButton}; var Message: TCMDialogChar); +begin + with Message do + if IsWideCharAccel(Message.CharCode, TntControl_GetText(Button)) + and Button.CanFocus then + begin + Button.Click; + Result := 1; + end else + Button.Broadcast(Message); +end; + +procedure TTntButton.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle(Self, Params, 'BUTTON'); +end; + +procedure TTntButton.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +procedure TTntButton.CMDialogChar(var Message: TCMDialogChar); +begin + TntButton_CMDialogChar(Self, Message); +end; + +function TTntButton.IsCaptionStored: Boolean; +begin + Result := TntControl_IsCaptionStored(Self) +end; + +function TTntButton.GetCaption: TWideCaption; +begin + Result := TntControl_GetText(Self) +end; + +procedure TTntButton.SetCaption(const Value: TWideCaption); +begin + TntControl_SetText(Self, Value); +end; + +function TTntButton.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self) +end; + +function TTntButton.GetHint: WideString; +begin + Result := TntControl_GetHint(Self) +end; + +procedure TTntButton.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntButton.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntButton.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +{ TTntCustomCheckBox } + +procedure TTntCustomCheckBox.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle(Self, Params, 'BUTTON'); +end; + +procedure TTntCustomCheckBox.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +procedure TTntCustomCheckBox.CMDialogChar(var Message: TCMDialogChar); +begin + with Message do + if IsWideCharAccel(Message.CharCode, Caption) + and CanFocus then + begin + SetFocus; + if Focused then Toggle; + Result := 1; + end else + Broadcast(Message); +end; + +function TTntCustomCheckBox.IsCaptionStored: Boolean; +begin + Result := TntControl_IsCaptionStored(Self) +end; + +function TTntCustomCheckBox.GetCaption: TWideCaption; +begin + Result := TntControl_GetText(Self) +end; + +procedure TTntCustomCheckBox.SetCaption(const Value: TWideCaption); +begin + TntControl_SetText(Self, Value); +end; + +function TTntCustomCheckBox.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self) +end; + +function TTntCustomCheckBox.GetHint: WideString; +begin + Result := TntControl_GetHint(Self) +end; + +procedure TTntCustomCheckBox.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntCustomCheckBox.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntCustomCheckBox.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +{ TTntRadioButton } + +procedure TTntRadioButton.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle(Self, Params, 'BUTTON'); +end; + +procedure TTntRadioButton.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +procedure TTntRadioButton.CMDialogChar(var Message: TCMDialogChar); +begin + with Message do + if IsWideCharAccel(Message.CharCode, Caption) + and CanFocus then + begin + SetFocus; + Result := 1; + end else + Broadcast(Message); +end; + +function TTntRadioButton.IsCaptionStored: Boolean; +begin + Result := TntControl_IsCaptionStored(Self); +end; + +function TTntRadioButton.GetCaption: TWideCaption; +begin + Result := TntControl_GetText(Self) +end; + +procedure TTntRadioButton.SetCaption(const Value: TWideCaption); +begin + TntControl_SetText(Self, Value); +end; + +function TTntRadioButton.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self) +end; + +function TTntRadioButton.GetHint: WideString; +begin + Result := TntControl_GetHint(Self) +end; + +procedure TTntRadioButton.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntRadioButton.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntRadioButton.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +{ TTntScrollBar } + +procedure TTntScrollBar.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle(Self, Params, 'SCROLLBAR'); +end; + +procedure TTntScrollBar.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +function TTntScrollBar.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self) +end; + +function TTntScrollBar.GetHint: WideString; +begin + Result := TntControl_GetHint(Self) +end; + +procedure TTntScrollBar.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntScrollBar.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntScrollBar.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +{ TTntCustomGroupBox } + +procedure TTntCustomGroupBox.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle(Self, Params, ''); +end; + +procedure TTntCustomGroupBox.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +procedure TTntCustomGroupBox.CMDialogChar(var Message: TCMDialogChar); +begin + with Message do + if IsWideCharAccel(Message.CharCode, Caption) + and CanFocus then + begin + SelectFirst; + Result := 1; + end else + Broadcast(Message); +end; + +function TTntCustomGroupBox.IsCaptionStored: Boolean; +begin + Result := TntControl_IsCaptionStored(Self); +end; + +function TTntCustomGroupBox.GetCaption: TWideCaption; +begin + Result := TntControl_GetText(Self) +end; + +procedure TTntCustomGroupBox.SetCaption(const Value: TWideCaption); +begin + TntControl_SetText(Self, Value); +end; + +procedure TTntCustomGroupBox.Paint; + + {$IFDEF THEME_7_UP} + procedure PaintThemedGroupBox; + var + CaptionRect: TRect; + OuterRect: TRect; + Size: TSize; + Box: TThemedButton; + Details: TThemedElementDetails; + begin + with Canvas do begin + if Caption <> '' then + begin + GetTextExtentPoint32W(Handle, PWideChar(Caption), Length(Caption), Size); + CaptionRect := Rect(0, 0, Size.cx, Size.cy); + if not UseRightToLeftAlignment then + OffsetRect(CaptionRect, 8, 0) + else + OffsetRect(CaptionRect, Width - 8 - CaptionRect.Right, 0); + end + else + CaptionRect := Rect(0, 0, 0, 0); + + OuterRect := ClientRect; + OuterRect.Top := (CaptionRect.Bottom - CaptionRect.Top) div 2; + with CaptionRect do + ExcludeClipRect(Handle, Left, Top, Right, Bottom); + if Enabled then + Box := tbGroupBoxNormal + else + Box := tbGroupBoxDisabled; + Details := ThemeServices.GetElementDetails(Box); + ThemeServices.DrawElement(Handle, Details, OuterRect); + + SelectClipRgn(Handle, 0); + if Text <> '' then + ThemeServices.DrawText{TNT-ALLOW DrawText}(Handle, Details, Caption, CaptionRect, DT_LEFT, 0); + end; + end; + {$ENDIF} + + procedure PaintGroupBox; + var + H: Integer; + R: TRect; + Flags: Longint; + begin + with Canvas do begin + H := WideCanvasTextHeight(Canvas, '0'); + R := Rect(0, H div 2 - 1, Width, Height); + if Ctl3D then + begin + Inc(R.Left); + Inc(R.Top); + Brush.Color := clBtnHighlight; + FrameRect(R); + OffsetRect(R, -1, -1); + Brush.Color := clBtnShadow; + end else + Brush.Color := clWindowFrame; + FrameRect(R); + if Caption <> '' then + begin + if not UseRightToLeftAlignment then + R := Rect(8, 0, 0, H) + else + R := Rect(R.Right - WideCanvasTextWidth(Canvas, Caption) - 8, 0, 0, H); + Flags := DrawTextBiDiModeFlags(DT_SINGLELINE); + Tnt_DrawTextW(Handle, PWideChar(Caption), Length(Caption), R, Flags or DT_CALCRECT); + Brush.Color := Color; + Tnt_DrawTextW(Handle, PWideChar(Caption), Length(Caption), R, Flags); + end; + end; + end; + +begin + if (not Win32PlatformIsUnicode) then + inherited + else + begin + Canvas.Font := Self.Font; + {$IFDEF THEME_7_UP} + if ThemeServices.ThemesEnabled then + PaintThemedGroupBox + else + PaintGroupBox; + {$ELSE} + PaintGroupBox; + {$ENDIF} + end; +end; + +function TTntCustomGroupBox.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self) +end; + +function TTntCustomGroupBox.GetHint: WideString; +begin + Result := TntControl_GetHint(Self); +end; + +procedure TTntCustomGroupBox.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntCustomGroupBox.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntCustomGroupBox.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +{ TTntCustomStaticText } + +constructor TTntCustomStaticText.Create(AOwner: TComponent); +begin + inherited; + AdjustBounds; +end; + +procedure TTntCustomStaticText.CMFontChanged(var Message: TMessage); +begin + inherited; + AdjustBounds; +end; + +procedure TTntCustomStaticText.CMTextChanged(var Message: TMessage); +begin + inherited; + AdjustBounds; +end; + +procedure TTntCustomStaticText.Loaded; +begin + inherited; + AdjustBounds; +end; + +procedure TTntCustomStaticText.SetAutoSize(AValue: boolean); +begin + inherited; + if AValue then + AdjustBounds; +end; + +procedure TTntCustomStaticText.CreateWindowHandle(const Params: TCreateParams); +begin + CreateUnicodeHandle(Self, Params, 'STATIC'); +end; + +procedure TTntCustomStaticText.DefineProperties(Filer: TFiler); +begin + inherited; + TntPersistent_AfterInherited_DefineProperties(Filer, Self); +end; + +procedure TTntCustomStaticText.CMDialogChar(var Message: TCMDialogChar); +begin + if (FocusControl <> nil) and Enabled and ShowAccelChar and + IsWideCharAccel(Message.CharCode, Caption) then + with FocusControl do + if CanFocus then + begin + SetFocus; + Message.Result := 1; + end; +end; + +function TTntCustomStaticText.IsCaptionStored: Boolean; +begin + Result := TntControl_IsCaptionStored(Self) +end; + +procedure TTntCustomStaticText.AdjustBounds; +var + DC: HDC; + SaveFont: HFont; + TextSize: TSize; +begin + if not (csReading in ComponentState) and AutoSize then + begin + DC := GetDC(0); + SaveFont := SelectObject(DC, Font.Handle); + GetTextExtentPoint32W(DC, PWideChar(Caption), Length(Caption), TextSize); + SelectObject(DC, SaveFont); + ReleaseDC(0, DC); + SetBounds(Left, Top, + TextSize.cx + (GetSystemMetrics(SM_CXBORDER) * 4), + TextSize.cy + (GetSystemMetrics(SM_CYBORDER) * 4)); + end; +end; + +function TTntCustomStaticText.GetCaption: TWideCaption; +begin + Result := TntControl_GetText(Self) +end; + +procedure TTntCustomStaticText.SetCaption(const Value: TWideCaption); +begin + TntControl_SetText(Self, Value); +end; + +function TTntCustomStaticText.IsHintStored: Boolean; +begin + Result := TntControl_IsHintStored(Self) +end; + +function TTntCustomStaticText.GetHint: WideString; +begin + Result := TntControl_GetHint(Self) +end; + +procedure TTntCustomStaticText.SetHint(const Value: WideString); +begin + TntControl_SetHint(Self, Value); +end; + +procedure TTntCustomStaticText.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + TntControl_BeforeInherited_ActionChange(Self, Sender, CheckDefaults); + inherited; +end; + +function TTntCustomStaticText.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TntControl_GetActionLinkClass(Self, inherited GetActionLinkClass); +end; + +end. diff --git a/internal/1/Source/TntSysUtils.pas b/internal/1/Source/TntSysUtils.pas new file mode 100644 index 0000000..f6cd3e2 --- /dev/null +++ b/internal/1/Source/TntSysUtils.pas @@ -0,0 +1,1699 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntSysUtils; + +{$INCLUDE TntCompilers.inc} + +interface + +{ TODO: Consider: more filename functions from SysUtils } +{ TODO: Consider: string functions from StrUtils. } + +uses + Types, SysUtils, Windows; + +//--------------------------------------------------------------------------------------------- +// Tnt - Types +//--------------------------------------------------------------------------------------------- + +// ......... introduced ......... +type + // The user of the application did something plainly wrong. + ETntUserError = class(Exception); + // A general error occured. (ie. file didn't exist, server didn't return data, etc.) + ETntGeneralError = class(Exception); + // Like Assert(). An error occured that should never have happened, send me a bug report now! + ETntInternalError = class(Exception); + +//--------------------------------------------------------------------------------------------- +// Tnt - SysUtils +//--------------------------------------------------------------------------------------------- + +// ......... SBCS and MBCS functions with WideString replacements in SysUtils.pas ......... + +{TNT-WARN CompareStr} {TNT-WARN AnsiCompareStr} +{TNT-WARN SameStr} {TNT-WARN AnsiSameStr} +{TNT-WARN SameText} {TNT-WARN AnsiSameText} +{TNT-WARN CompareText} {TNT-WARN AnsiCompareText} +{TNT-WARN UpperCase} {TNT-WARN AnsiUpperCase} +{TNT-WARN LowerCase} {TNT-WARN AnsiLowerCase} + +{TNT-WARN AnsiPos} { --> Pos() supports WideString. } +{TNT-WARN FmtStr} +{TNT-WARN Format} +{TNT-WARN FormatBuf} + +// ......... MBCS Byte Type Procs ......... + +{TNT-WARN ByteType} +{TNT-WARN StrByteType} +{TNT-WARN ByteToCharIndex} +{TNT-WARN ByteToCharLen} +{TNT-WARN CharToByteIndex} +{TNT-WARN CharToByteLen} + +// ........ null-terminated string functions ......... + +{TNT-WARN StrEnd} +{TNT-WARN StrLen} +{TNT-WARN StrLCopy} +{TNT-WARN StrCopy} +{TNT-WARN StrECopy} +{TNT-WARN StrPLCopy} +{TNT-WARN StrPCopy} +{TNT-WARN StrLComp} +{TNT-WARN AnsiStrLComp} +{TNT-WARN StrComp} +{TNT-WARN AnsiStrComp} +{TNT-WARN StrLIComp} +{TNT-WARN AnsiStrLIComp} +{TNT-WARN StrIComp} +{TNT-WARN AnsiStrIComp} +{TNT-WARN StrLower} +{TNT-WARN AnsiStrLower} +{TNT-WARN StrUpper} +{TNT-WARN AnsiStrUpper} +{TNT-WARN StrPos} +{TNT-WARN AnsiStrPos} +{TNT-WARN StrScan} +{TNT-WARN AnsiStrScan} +{TNT-WARN StrRScan} +{TNT-WARN AnsiStrRScan} +{TNT-WARN StrLCat} +{TNT-WARN StrCat} +{TNT-WARN StrMove} +{TNT-WARN StrPas} +{TNT-WARN StrAlloc} +{TNT-WARN StrBufSize} +{TNT-WARN StrNew} +{TNT-WARN StrDispose} + +{TNT-WARN AnsiExtractQuotedStr} +{TNT-WARN AnsiLastChar} +{TNT-WARN AnsiStrLastChar} +{TNT-WARN QuotedStr} +{TNT-WARN AnsiQuotedStr} +{TNT-WARN AnsiDequotedStr} + +// ........ string functions ......... + +{$IFNDEF COMPILER_9_UP} + // + // pre-Delphi 9 issues w/ WideFormatBuf, WideFmtStr and WideFormat + // + + {$IFDEF COMPILER_7_UP} + type + PFormatSettings = ^TFormatSettings; + {$ENDIF} + + // SysUtils.WideFormatBuf doesn't correctly handle numeric specifiers. + function Tnt_WideFormatBuf(var Buffer; BufLen: Cardinal; const FormatStr; + FmtLen: Cardinal; const Args: array of const): Cardinal; {$IFDEF COMPILER_7_UP} overload; {$ENDIF} + + {$IFDEF COMPILER_7_UP} + function Tnt_WideFormatBuf(var Buffer; BufLen: Cardinal; const FormatStr; + FmtLen: Cardinal; const Args: array of const; + const FormatSettings: TFormatSettings): Cardinal; overload; + {$ENDIF} + + // SysUtils.WideFmtStr doesn't handle string lengths > 4096. + procedure Tnt_WideFmtStr(var Result: WideString; const FormatStr: WideString; + const Args: array of const); {$IFDEF COMPILER_7_UP} overload; {$ENDIF} + + {$IFDEF COMPILER_7_UP} + procedure Tnt_WideFmtStr(var Result: WideString; const FormatStr: WideString; + const Args: array of const; const FormatSettings: TFormatSettings); overload; + {$ENDIF} + + {---------------------------------------------------------------------------------------- + Without the FormatSettings parameter, Tnt_WideFormat is *NOT* necessary... + TntSystem.InstallTntSystemUpdates([tsFixWideFormat]); + will fix WideFormat as well as WideFmtStr. + ----------------------------------------------------------------------------------------} + function Tnt_WideFormat(const FormatStr: WideString; const Args: array of const): WideString; {$IFDEF COMPILER_7_UP} overload; {$ENDIF} + + {$IFDEF COMPILER_7_UP} + function Tnt_WideFormat(const FormatStr: WideString; const Args: array of const; + const FormatSettings: TFormatSettings): WideString; overload; + {$ENDIF} + +{$ENDIF} + +{TNT-WARN WideUpperCase} // SysUtils.WideUpperCase is broken on Win9x for D6, D7, D9. +function Tnt_WideUpperCase(const S: WideString): WideString; +{TNT-WARN WideLowerCase} // SysUtils.WideLowerCase is broken on Win9x for D6, D7, D9. +function Tnt_WideLowerCase(const S: WideString): WideString; + +function TntWideLastChar(const S: WideString): WideChar; + +{TNT-WARN StringReplace} +{TNT-WARN WideStringReplace} // <-- WideStrUtils.WideStringReplace uses SysUtils.WideUpperCase which is broken on Win9x. +function Tnt_WideStringReplace(const S, OldPattern, NewPattern: WideString; + Flags: TReplaceFlags; WholeWord: Boolean = False): WideString; + +{TNT-WARN AdjustLineBreaks} +type TTntTextLineBreakStyle = (tlbsLF, tlbsCRLF, tlbsCR); +function TntAdjustLineBreaksLength(const S: WideString; Style: TTntTextLineBreakStyle = tlbsCRLF): Integer; +function TntAdjustLineBreaks(const S: WideString; Style: TTntTextLineBreakStyle = tlbsCRLF): WideString; + +{TNT-WARN WrapText} +function WideWrapText(const Line, BreakStr: WideString; const BreakChars: TSysCharSet; + MaxCol: Integer): WideString; overload; +function WideWrapText(const Line: WideString; MaxCol: Integer): WideString; overload; + +// ........ filename manipulation ......... + +{TNT-WARN SameFileName} // doesn't apply to Unicode filenames, use WideSameText +{TNT-WARN AnsiCompareFileName} // doesn't apply to Unicode filenames, use WideCompareText +{TNT-WARN AnsiLowerCaseFileName} // doesn't apply to Unicode filenames, use WideLowerCase +{TNT-WARN AnsiUpperCaseFileName} // doesn't apply to Unicode filenames, use WideUpperCase + +{TNT-WARN IncludeTrailingBackslash} +function WideIncludeTrailingBackslash(const S: WideString): WideString; +{TNT-WARN IncludeTrailingPathDelimiter} +function WideIncludeTrailingPathDelimiter(const S: WideString): WideString; +{TNT-WARN ExcludeTrailingBackslash} +function WideExcludeTrailingBackslash(const S: WideString): WideString; +{TNT-WARN ExcludeTrailingPathDelimiter} +function WideExcludeTrailingPathDelimiter(const S: WideString): WideString; +{TNT-WARN IsDelimiter} +function WideIsDelimiter(const Delimiters, S: WideString; Index: Integer): Boolean; +{TNT-WARN IsPathDelimiter} +function WideIsPathDelimiter(const S: WideString; Index: Integer): Boolean; +{TNT-WARN LastDelimiter} +function WideLastDelimiter(const Delimiters, S: WideString): Integer; +{TNT-WARN ChangeFileExt} +function WideChangeFileExt(const FileName, Extension: WideString): WideString; +{TNT-WARN ExtractFilePath} +function WideExtractFilePath(const FileName: WideString): WideString; +{TNT-WARN ExtractFileDir} +function WideExtractFileDir(const FileName: WideString): WideString; +{TNT-WARN ExtractFileDrive} +function WideExtractFileDrive(const FileName: WideString): WideString; +{TNT-WARN ExtractFileName} +function WideExtractFileName(const FileName: WideString): WideString; +{TNT-WARN ExtractFileExt} +function WideExtractFileExt(const FileName: WideString): WideString; +{TNT-WARN ExtractRelativePath} +function WideExtractRelativePath(const BaseName, DestName: WideString): WideString; + +// ........ file management routines ......... + +{TNT-WARN ExpandFileName} +function WideExpandFileName(const FileName: WideString): WideString; +{TNT-WARN ExtractShortPathName} +function WideExtractShortPathName(const FileName: WideString): WideString; +{TNT-WARN FileCreate} +function WideFileCreate(const FileName: WideString): Integer; +{TNT-WARN FileOpen} +function WideFileOpen(const FileName: WideString; Mode: LongWord): Integer; +{TNT-WARN FileAge} +function WideFileAge(const FileName: WideString): Integer; overload; +function WideFileAge(const FileName: WideString; out FileDateTime: TDateTime): Boolean; overload; +{TNT-WARN DirectoryExists} +function WideDirectoryExists(const Name: WideString): Boolean; +{TNT-WARN FileExists} +function WideFileExists(const Name: WideString): Boolean; +{TNT-WARN FileGetAttr} +function WideFileGetAttr(const FileName: WideString): Cardinal; +{TNT-WARN FileSetAttr} +function WideFileSetAttr(const FileName: WideString; Attr: Integer): Boolean; +{TNT-WARN FileIsReadOnly} +function WideFileIsReadOnly(const FileName: WideString): Boolean; +{TNT-WARN FileSetReadOnly} +function WideFileSetReadOnly(const FileName: WideString; ReadOnly: Boolean): Boolean; +{TNT-WARN ForceDirectories} +function WideForceDirectories(Dir: WideString): Boolean; +{TNT-WARN FileSearch} +function WideFileSearch(const Name, DirList: WideString): WideString; +{TNT-WARN RenameFile} +function WideRenameFile(const OldName, NewName: WideString): Boolean; +{TNT-WARN DeleteFile} +function WideDeleteFile(const FileName: WideString): Boolean; +{TNT-WARN CopyFile} +function WideCopyFile(FromFile, ToFile: WideString; FailIfExists: Boolean): Boolean; + + +{TNT-WARN TFileName} +type + TWideFileName = type WideString; + +{TNT-WARN TSearchRec} // <-- FindFile - warning on TSearchRec is all that is necessary +type + TSearchRecW = record + Time: Integer; + Size: Int64; + Attr: Integer; + Name: TWideFileName; + ExcludeAttr: Integer; + FindHandle: THandle; + FindData: TWin32FindDataW; + end; +function WideFindFirst(const Path: WideString; Attr: Integer; var F: TSearchRecW): Integer; +function WideFindNext(var F: TSearchRecW): Integer; +procedure WideFindClose(var F: TSearchRecW); + +{TNT-WARN CreateDir} +function WideCreateDir(const Dir: WideString): Boolean; +{TNT-WARN RemoveDir} +function WideRemoveDir(const Dir: WideString): Boolean; +{TNT-WARN GetCurrentDir} +function WideGetCurrentDir: WideString; +{TNT-WARN SetCurrentDir} +function WideSetCurrentDir(const Dir: WideString): Boolean; + + +// ........ date/time functions ......... + +{TNT-WARN TryStrToDateTime} +function TntTryStrToDateTime(Str: WideString; out DateTime: TDateTime): Boolean; +{TNT-WARN TryStrToDate} +function TntTryStrToDate(Str: WideString; out DateTime: TDateTime): Boolean; +{TNT-WARN TryStrToTime} +function TntTryStrToTime(Str: WideString; out DateTime: TDateTime): Boolean; + +{ introduced } +function ValidDateTimeStr(Str: WideString): Boolean; +function ValidDateStr(Str: WideString): Boolean; +function ValidTimeStr(Str: WideString): Boolean; + +{TNT-WARN StrToDateTime} +function TntStrToDateTime(Str: WideString): TDateTime; +{TNT-WARN StrToDate} +function TntStrToDate(Str: WideString): TDateTime; +{TNT-WARN StrToTime} +function TntStrToTime(Str: WideString): TDateTime; +{TNT-WARN StrToDateTimeDef} +function TntStrToDateTimeDef(Str: WideString; Default: TDateTime): TDateTime; +{TNT-WARN StrToDateDef} +function TntStrToDateDef(Str: WideString; Default: TDateTime): TDateTime; +{TNT-WARN StrToTimeDef} +function TntStrToTimeDef(Str: WideString; Default: TDateTime): TDateTime; + +{TNT-WARN CurrToStr} +{TNT-WARN CurrToStrF} +function TntCurrToStr(Value: Currency; lpFormat: PCurrencyFmtW = nil): WideString; +{TNT-WARN StrToCurr} +function TntStrToCurr(const S: WideString): Currency; +{TNT-WARN StrToCurrDef} +function ValidCurrencyStr(const S: WideString): Boolean; +function TntStrToCurrDef(const S: WideString; const Default: Currency): Currency; +function GetDefaultCurrencyFmt: TCurrencyFmtW; + +// ........ misc functions ......... + +{TNT-WARN GetLocaleStr} +function WideGetLocaleStr(LocaleID: LCID; LocaleType: Integer; const Default: WideString): WideString; +{TNT-WARN SysErrorMessage} +function WideSysErrorMessage(ErrorCode: Integer): WideString; + +// ......... introduced ......... + +function WideLibraryErrorMessage(const LibName: WideString; Dll: THandle; ErrorCode: Integer): WideString; + +const + CR = WideChar(#13); + LF = WideChar(#10); + CRLF = WideString(#13#10); + WideLineSeparator = WideChar($2028); + +var + Win32PlatformIsUnicode: Boolean; + Win32PlatformIsXP: Boolean; + Win32PlatformIs2003: Boolean; + Win32PlatformIsVista: Boolean; + +{$IFNDEF COMPILER_7_UP} +function CheckWin32Version(AMajor: Integer; AMinor: Integer = 0): Boolean; +{$ENDIF} +function WinCheckH(RetVal: Cardinal): Cardinal; +function WinCheckFileH(RetVal: Cardinal): Cardinal; +function WinCheckP(RetVal: Pointer): Pointer; + +function WideGetModuleFileName(Instance: HModule): WideString; +function WideSafeLoadLibrary(const Filename: Widestring; + ErrorMode: UINT = SEM_NOOPENFILEERRORBOX): HMODULE; +function WideLoadPackage(const Name: Widestring): HMODULE; + +function IsWideCharUpper(WC: WideChar): Boolean; +function IsWideCharLower(WC: WideChar): Boolean; +function IsWideCharDigit(WC: WideChar): Boolean; +function IsWideCharSpace(WC: WideChar): Boolean; +function IsWideCharPunct(WC: WideChar): Boolean; +function IsWideCharCntrl(WC: WideChar): Boolean; +function IsWideCharBlank(WC: WideChar): Boolean; +function IsWideCharXDigit(WC: WideChar): Boolean; +function IsWideCharAlpha(WC: WideChar): Boolean; +function IsWideCharAlphaNumeric(WC: WideChar): Boolean; + +function WideTextPos(const SubStr, S: WideString): Integer; + +function ExtractStringArrayStr(P: PWideChar): WideString; +function ExtractStringFromStringArray(var P: PWideChar; Separator: WideChar = #0): WideString; +function ExtractStringsFromStringArray(P: PWideChar; Separator: WideChar = #0): TWideStringDynArray; + +function IsWideCharMappableToAnsi(const WC: WideChar): Boolean; +function IsWideStringMappableToAnsi(const WS: WideString): Boolean; +function IsRTF(const Value: WideString): Boolean; + +function ENG_US_FloatToStr(Value: Extended): WideString; +function ENG_US_StrToFloat(const S: WideString): Extended; + +//--------------------------------------------------------------------------------------------- +// Tnt - Variants +//--------------------------------------------------------------------------------------------- + +// ........ Variants.pas has WideString versions of these functions ......... +{TNT-WARN VarToStr} +{TNT-WARN VarToStrDef} + +var + _SettingChangeTime: Cardinal; + +implementation + +uses + ActiveX, ComObj, SysConst, + {$IFDEF COMPILER_9_UP} WideStrUtils, {$ENDIF} TntWideStrUtils, + TntSystem, TntWindows, TntFormatStrUtils; + +//--------------------------------------------------------------------------------------------- +// Tnt - SysUtils +//--------------------------------------------------------------------------------------------- + +{$IFNDEF COMPILER_9_UP} + + function _Tnt_WideFormatBuf(var Buffer; BufLen: Cardinal; const FormatStr; + FmtLen: Cardinal; const Args: array of const + {$IFDEF COMPILER_7_UP}; const FormatSettings: PFormatSettings {$ENDIF}): Cardinal; + var + OldFormat: WideString; + NewFormat: WideString; + begin + SetString(OldFormat, PWideChar(@FormatStr), FmtLen); + { The reason for this is that WideFormat doesn't correctly format floating point specifiers. + See QC#4254. } + NewFormat := ReplaceFloatingArgumentsInFormatString(OldFormat, Args{$IFDEF COMPILER_7_UP}, FormatSettings{$ENDIF}); + {$IFDEF COMPILER_7_UP} + if FormatSettings <> nil then + Result := WideFormatBuf(Buffer, BufLen, Pointer(NewFormat)^, + Length(NewFormat), Args, FormatSettings^) + else + {$ENDIF} + Result := WideFormatBuf(Buffer, BufLen, Pointer(NewFormat)^, + Length(NewFormat), Args); + end; + + function Tnt_WideFormatBuf(var Buffer; BufLen: Cardinal; const FormatStr; + FmtLen: Cardinal; const Args: array of const): Cardinal; + begin + Result := _Tnt_WideFormatBuf(Buffer, BufLen, FormatStr, FmtLen, Args{$IFDEF COMPILER_7_UP}, nil{$ENDIF}); + end; + + {$IFDEF COMPILER_7_UP} + function Tnt_WideFormatBuf(var Buffer; BufLen: Cardinal; const FormatStr; + FmtLen: Cardinal; const Args: array of const; const FormatSettings: TFormatSettings): Cardinal; + begin + Result := _Tnt_WideFormatBuf(Buffer, BufLen, FormatStr, FmtLen, Args, @FormatSettings); + end; + {$ENDIF} + + procedure _Tnt_WideFmtStr(var Result: WideString; const FormatStr: WideString; + const Args: array of const{$IFDEF COMPILER_7_UP}; const FormatSettings: PFormatSettings{$ENDIF}); + var + Len, BufLen: Integer; + Buffer: array[0..4095] of WideChar; + begin + BufLen := Length(Buffer); // Fixes buffer overwrite issue. (See QC #4703, #4744) + if Length(FormatStr) < (Length(Buffer) - (Length(Buffer) div 4)) then + Len := _Tnt_WideFormatBuf(Buffer, Length(Buffer) - 1, Pointer(FormatStr)^, + Length(FormatStr), Args{$IFDEF COMPILER_7_UP}, FormatSettings{$ENDIF}) + else + begin + BufLen := Length(FormatStr); + Len := BufLen; + end; + if Len >= BufLen - 1 then + begin + while Len >= BufLen - 1 do + begin + Inc(BufLen, BufLen); + Result := ''; // prevent copying of existing data, for speed + SetLength(Result, BufLen); + Len := _Tnt_WideFormatBuf(Pointer(Result)^, BufLen - 1, Pointer(FormatStr)^, + Length(FormatStr), Args{$IFDEF COMPILER_7_UP}, FormatSettings{$ENDIF}); + end; + SetLength(Result, Len); + end + else + SetString(Result, Buffer, Len); + end; + + procedure Tnt_WideFmtStr(var Result: WideString; const FormatStr: WideString; + const Args: array of const); + begin + _Tnt_WideFmtStr(Result, FormatStr, Args{$IFDEF COMPILER_7_UP}, nil{$ENDIF}); + end; + + {$IFDEF COMPILER_7_UP} + procedure Tnt_WideFmtStr(var Result: WideString; const FormatStr: WideString; + const Args: array of const; const FormatSettings: TFormatSettings); + begin + _Tnt_WideFmtStr(Result, FormatStr, Args, @FormatSettings); + end; + {$ENDIF} + + {---------------------------------------------------------------------------------------- + Without the FormatSettings parameter, Tnt_WideFormat is *NOT* necessary... + TntSystem.InstallTntSystemUpdates([tsFixWideFormat]); + will fix WideFormat as well as WideFmtStr. + ----------------------------------------------------------------------------------------} + function Tnt_WideFormat(const FormatStr: WideString; const Args: array of const): WideString; + begin + Tnt_WideFmtStr(Result, FormatStr, Args); + end; + + {$IFDEF COMPILER_7_UP} + function Tnt_WideFormat(const FormatStr: WideString; const Args: array of const; + const FormatSettings: TFormatSettings): WideString; + begin + Tnt_WideFmtStr(Result, FormatStr, Args, FormatSettings); + end; + {$ENDIF} + +{$ENDIF} + +function Tnt_WideUpperCase(const S: WideString): WideString; +begin + {$IFNDEF COMPILER_10_UP} + { SysUtils.WideUpperCase is broken for Win9x. } + Result := S; + if Length(Result) > 0 then + Tnt_CharUpperBuffW(PWideChar(Result), Length(Result)); + {$ELSE} + Result := SysUtils.WideUpperCase{TNT-ALLOW WideUpperCase}(S); + {$ENDIF} +end; + +function Tnt_WideLowerCase(const S: WideString): WideString; +begin + {$IFNDEF COMPILER_10_UP} + { SysUtils.WideLowerCase is broken for Win9x. } + Result := S; + if Length(Result) > 0 then + Tnt_CharLowerBuffW(PWideChar(Result), Length(Result)); + {$ELSE} + Result := SysUtils.WideLowerCase{TNT-ALLOW WideLowerCase}(S); + {$ENDIF} +end; + +function TntWideLastChar(const S: WideString): WideChar; +var + P: PWideChar; +begin + P := WideLastChar(S); + if P = nil then + Result := #0 + else + Result := P^; +end; + +function Tnt_WideStringReplace(const S, OldPattern, NewPattern: WideString; + Flags: TReplaceFlags; WholeWord: Boolean = False): WideString; + + function IsWordSeparator(WC: WideChar): Boolean; + begin + Result := (WC = WideChar(#0)) + or IsWideCharSpace(WC) + or IsWideCharPunct(WC); + end; + +var + SearchStr, Patt, NewStr: WideString; + Offset: Integer; + PrevChar, NextChar: WideChar; +begin + if rfIgnoreCase in Flags then + begin + SearchStr := Tnt_WideUpperCase(S); + Patt := Tnt_WideUpperCase(OldPattern); + end else + begin + SearchStr := S; + Patt := OldPattern; + end; + NewStr := S; + Result := ''; + while SearchStr <> '' do + begin + Offset := Pos(Patt, SearchStr); + if Offset = 0 then + begin + Result := Result + NewStr; + Break; + end; // done + + if (WholeWord) then + begin + if (Offset = 1) then + PrevChar := TntWideLastChar(Result) + else + PrevChar := NewStr[Offset - 1]; + + if Offset + Length(OldPattern) <= Length(NewStr) then + NextChar := NewStr[Offset + Length(OldPattern)] + else + NextChar := WideChar(#0); + + if (not IsWordSeparator(PrevChar)) + or (not IsWordSeparator(NextChar)) then + begin + Result := Result + Copy(NewStr, 1, Offset + Length(OldPattern) - 1); + NewStr := Copy(NewStr, Offset + Length(OldPattern), MaxInt); + SearchStr := Copy(SearchStr, Offset + Length(Patt), MaxInt); + continue; + end; + end; + + Result := Result + Copy(NewStr, 1, Offset - 1) + NewPattern; + NewStr := Copy(NewStr, Offset + Length(OldPattern), MaxInt); + if not (rfReplaceAll in Flags) then + begin + Result := Result + NewStr; + Break; + end; + SearchStr := Copy(SearchStr, Offset + Length(Patt), MaxInt); + end; +end; + +function TntAdjustLineBreaksLength(const S: WideString; Style: TTntTextLineBreakStyle = tlbsCRLF): Integer; +var + Source, SourceEnd: PWideChar; +begin + Source := Pointer(S); + SourceEnd := Source + Length(S); + Result := Length(S); + while Source < SourceEnd do + begin + case Source^ of + #10, WideLineSeparator: + if Style = tlbsCRLF then + Inc(Result); + #13: + if Style = tlbsCRLF then + if Source[1] = #10 then + Inc(Source) + else + Inc(Result) + else + if Source[1] = #10 then + Dec(Result); + end; + Inc(Source); + end; +end; + +function TntAdjustLineBreaks(const S: WideString; Style: TTntTextLineBreakStyle = tlbsCRLF): WideString; +var + Source, SourceEnd, Dest: PWideChar; + DestLen: Integer; +begin + Source := Pointer(S); + SourceEnd := Source + Length(S); + DestLen := TntAdjustLineBreaksLength(S, Style); + SetString(Result, nil, DestLen); + Dest := Pointer(Result); + while Source < SourceEnd do begin + case Source^ of + #10, WideLineSeparator: + begin + if Style in [tlbsCRLF, tlbsCR] then + begin + Dest^ := #13; + Inc(Dest); + end; + if Style in [tlbsCRLF, tlbsLF] then + begin + Dest^ := #10; + Inc(Dest); + end; + Inc(Source); + end; + #13: + begin + if Style in [tlbsCRLF, tlbsCR] then + begin + Dest^ := #13; + Inc(Dest); + end; + if Style in [tlbsCRLF, tlbsLF] then + begin + Dest^ := #10; + Inc(Dest); + end; + Inc(Source); + if Source^ = #10 then Inc(Source); + end; + else + Dest^ := Source^; + Inc(Dest); + Inc(Source); + end; + end; +end; + +function WideWrapText(const Line, BreakStr: WideString; const BreakChars: TSysCharSet; + MaxCol: Integer): WideString; + + function WideCharIn(C: WideChar; SysCharSet: TSysCharSet): Boolean; + begin + Result := (C <= High(AnsiChar)) and (AnsiChar(C) in SysCharSet); + end; + +const + QuoteChars = ['''', '"']; +var + Col, Pos: Integer; + LinePos, LineLen: Integer; + BreakLen, BreakPos: Integer; + QuoteChar, CurChar: WideChar; + ExistingBreak: Boolean; +begin + Col := 1; + Pos := 1; + LinePos := 1; + BreakPos := 0; + QuoteChar := ' '; + ExistingBreak := False; + LineLen := Length(Line); + BreakLen := Length(BreakStr); + Result := ''; + while Pos <= LineLen do + begin + CurChar := Line[Pos]; + if CurChar = BreakStr[1] then + begin + if QuoteChar = ' ' then + begin + ExistingBreak := WideSameText(BreakStr, Copy(Line, Pos, BreakLen)); + if ExistingBreak then + begin + Inc(Pos, BreakLen-1); + BreakPos := Pos; + end; + end + end + else if WideCharIn(CurChar, BreakChars) then + begin + if QuoteChar = ' ' then BreakPos := Pos + end + else if WideCharIn(CurChar, QuoteChars) then + begin + if CurChar = QuoteChar then + QuoteChar := ' ' + else if QuoteChar = ' ' then + QuoteChar := CurChar; + end; + Inc(Pos); + Inc(Col); + if not (WideCharIn(QuoteChar, QuoteChars)) and (ExistingBreak or + ((Col > MaxCol) and (BreakPos > LinePos))) then + begin + Col := Pos - BreakPos; + Result := Result + Copy(Line, LinePos, BreakPos - LinePos + 1); + if not (WideCharIn(CurChar, QuoteChars)) then + while Pos <= LineLen do + begin + if WideCharIn(Line[Pos], BreakChars) then + Inc(Pos) + else if Copy(Line, Pos, Length(sLineBreak)) = sLineBreak then + Inc(Pos, Length(sLineBreak)) + else + break; + end; + if not ExistingBreak and (Pos < LineLen) then + Result := Result + BreakStr; + Inc(BreakPos); + LinePos := BreakPos; + ExistingBreak := False; + end; + end; + Result := Result + Copy(Line, LinePos, MaxInt); +end; + +function WideWrapText(const Line: WideString; MaxCol: Integer): WideString; +begin + Result := WideWrapText(Line, sLineBreak, [' ', '-', #9], MaxCol); { do not localize } +end; + +function WideIncludeTrailingBackslash(const S: WideString): WideString; +begin + Result := WideIncludeTrailingPathDelimiter(S); +end; + +function WideIncludeTrailingPathDelimiter(const S: WideString): WideString; +begin + Result := S; + if not WideIsPathDelimiter(Result, Length(Result)) then Result := Result + PathDelim; +end; + +function WideExcludeTrailingBackslash(const S: WideString): WideString; +begin + Result := WideExcludeTrailingPathDelimiter(S); +end; + +function WideExcludeTrailingPathDelimiter(const S: WideString): WideString; +begin + Result := S; + if WideIsPathDelimiter(Result, Length(Result)) then + SetLength(Result, Length(Result)-1); +end; + +function WideIsDelimiter(const Delimiters, S: WideString; Index: Integer): Boolean; +begin + Result := False; + if (Index <= 0) or (Index > Length(S)) then exit; + Result := WStrScan(PWideChar(Delimiters), S[Index]) <> nil; +end; + +function WideIsPathDelimiter(const S: WideString; Index: Integer): Boolean; +begin + Result := (Index > 0) and (Index <= Length(S)) and (S[Index] = PathDelim); +end; + +function WideLastDelimiter(const Delimiters, S: WideString): Integer; +var + P: PWideChar; +begin + Result := Length(S); + P := PWideChar(Delimiters); + while Result > 0 do + begin + if (S[Result] <> #0) and (WStrScan(P, S[Result]) <> nil) then + Exit; + Dec(Result); + end; +end; + +function WideChangeFileExt(const FileName, Extension: WideString): WideString; +var + I: Integer; +begin + I := WideLastDelimiter('.\:',Filename); + if (I = 0) or (FileName[I] <> '.') then I := MaxInt; + Result := Copy(FileName, 1, I - 1) + Extension; +end; + +function WideExtractFilePath(const FileName: WideString): WideString; +var + I: Integer; +begin + I := WideLastDelimiter('\:', FileName); + Result := Copy(FileName, 1, I); +end; + +function WideExtractFileDir(const FileName: WideString): WideString; +var + I: Integer; +begin + I := WideLastDelimiter(DriveDelim + PathDelim,Filename); + if (I > 1) and (FileName[I] = PathDelim) and + (not (FileName[I - 1] in [WideChar(PathDelim), WideChar(DriveDelim)])) then Dec(I); + Result := Copy(FileName, 1, I); +end; + +function WideExtractFileDrive(const FileName: WideString): WideString; +var + I, J: Integer; +begin + if (Length(FileName) >= 2) and (FileName[2] = DriveDelim) then + Result := Copy(FileName, 1, 2) + else if (Length(FileName) >= 2) and (FileName[1] = PathDelim) and + (FileName[2] = PathDelim) then + begin + J := 0; + I := 3; + While (I < Length(FileName)) and (J < 2) do + begin + if FileName[I] = PathDelim then Inc(J); + if J < 2 then Inc(I); + end; + if FileName[I] = PathDelim then Dec(I); + Result := Copy(FileName, 1, I); + end else Result := ''; +end; + +function WideExtractFileName(const FileName: WideString): WideString; +var + I: Integer; +begin + I := WideLastDelimiter('\:', FileName); + Result := Copy(FileName, I + 1, MaxInt); +end; + +function WideExtractFileExt(const FileName: WideString): WideString; +var + I: Integer; +begin + I := WideLastDelimiter('.\:', FileName); + if (I > 0) and (FileName[I] = '.') then + Result := Copy(FileName, I, MaxInt) else + Result := ''; +end; + +function WideExtractRelativePath(const BaseName, DestName: WideString): WideString; +var + BasePath, DestPath: WideString; + BaseLead, DestLead: PWideChar; + BasePtr, DestPtr: PWideChar; + + function WideExtractFilePathNoDrive(const FileName: WideString): WideString; + begin + Result := WideExtractFilePath(FileName); + Delete(Result, 1, Length(WideExtractFileDrive(FileName))); + end; + + function Next(var Lead: PWideChar): PWideChar; + begin + Result := Lead; + if Result = nil then Exit; + Lead := WStrScan(Lead, PathDelim); + if Lead <> nil then + begin + Lead^ := #0; + Inc(Lead); + end; + end; + +begin + if WideSameText(WideExtractFileDrive(BaseName), WideExtractFileDrive(DestName)) then + begin + BasePath := WideExtractFilePathNoDrive(BaseName); + DestPath := WideExtractFilePathNoDrive(DestName); + BaseLead := Pointer(BasePath); + BasePtr := Next(BaseLead); + DestLead := Pointer(DestPath); + DestPtr := Next(DestLead); + while (BasePtr <> nil) and (DestPtr <> nil) and WideSameText(BasePtr, DestPtr) do + begin + BasePtr := Next(BaseLead); + DestPtr := Next(DestLead); + end; + Result := ''; + while BaseLead <> nil do + begin + Result := Result + '..' + PathDelim; { Do not localize } + Next(BaseLead); + end; + if (DestPtr <> nil) and (DestPtr^ <> #0) then + Result := Result + DestPtr + PathDelim; + if DestLead <> nil then + Result := Result + DestLead; // destlead already has a trailing backslash + Result := Result + WideExtractFileName(DestName); + end + else + Result := DestName; +end; + +function WideExpandFileName(const FileName: WideString): WideString; +var + FName: PWideChar; + Buffer: array[0..MAX_PATH - 1] of WideChar; +begin + SetString(Result, Buffer, Tnt_GetFullPathNameW(PWideChar(FileName), MAX_PATH, Buffer, FName)); +end; + +function WideExtractShortPathName(const FileName: WideString): WideString; +var + Buffer: array[0..MAX_PATH - 1] of WideChar; +begin + SetString(Result, Buffer, Tnt_GetShortPathNameW(PWideChar(FileName), Buffer, MAX_PATH)); +end; + +function WideFileCreate(const FileName: WideString): Integer; +begin + Result := Integer(Tnt_CreateFileW(PWideChar(FileName), GENERIC_READ or GENERIC_WRITE, + 0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)) +end; + +function WideFileOpen(const FileName: WideString; Mode: LongWord): Integer; +const + AccessMode: array[0..2] of LongWord = ( + GENERIC_READ, + GENERIC_WRITE, + GENERIC_READ or GENERIC_WRITE); + ShareMode: array[0..4] of LongWord = ( + 0, + 0, + FILE_SHARE_READ, + FILE_SHARE_WRITE, + FILE_SHARE_READ or FILE_SHARE_WRITE); +begin + Result := Integer(Tnt_CreateFileW(PWideChar(FileName), AccessMode[Mode and 3], + ShareMode[(Mode and $F0) shr 4], nil, OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, 0)); +end; + +function WideFileAge(const FileName: WideString): Integer; +var + Handle: THandle; + FindData: TWin32FindDataW; + LocalFileTime: TFileTime; +begin + Handle := Tnt_FindFirstFileW(PWideChar(FileName), FindData); + if Handle <> INVALID_HANDLE_VALUE then + begin + Windows.FindClose(Handle); + if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then + begin + FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime); + if FileTimeToDosDateTime(LocalFileTime, LongRec(Result).Hi, LongRec(Result).Lo) then + Exit + end; + end; + Result := -1; +end; + +function WideFileAge(const FileName: WideString; out FileDateTime: TDateTime): Boolean; +var + Handle: THandle; + FindData: TWin32FindDataW; + LSystemTime: TSystemTime; + LocalFileTime: TFileTime; +begin + Result := False; + Handle := Tnt_FindFirstFileW(PWideChar(FileName), FindData); + if Handle <> INVALID_HANDLE_VALUE then + begin + Windows.FindClose(Handle); + if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then + begin + Result := True; + FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime); + FileTimeToSystemTime(LocalFileTime, LSystemTime); + with LSystemTime do + FileDateTime := EncodeDate(wYear, wMonth, wDay) + + EncodeTime(wHour, wMinute, wSecond, wMilliSeconds); + end; + end; +end; + +function WideDirectoryExists(const Name: WideString): Boolean; +var + Code: Cardinal; +begin + Code := WideFileGetAttr(Name); + Result := (Code <> INVALID_FILE_ATTRIBUTES) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0); +end; + +function WideFileExists(const Name: WideString): Boolean; +var + Handle: THandle; + FindData: TWin32FindDataW; +begin + Result := False; + Handle := Tnt_FindFirstFileW(PWideChar(Name), FindData); + if Handle <> INVALID_HANDLE_VALUE then + begin + Windows.FindClose(Handle); + if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then + Result := True; + end; +end; + +function WideFileGetAttr(const FileName: WideString): Cardinal; +begin + Result := Tnt_GetFileAttributesW(PWideChar(FileName)); +end; + +function WideFileSetAttr(const FileName: WideString; Attr: Integer): Boolean; +begin + Result := Tnt_SetFileAttributesW(PWideChar(FileName), Attr) +end; + +function WideFileIsReadOnly(const FileName: WideString): Boolean; +begin + Result := (Tnt_GetFileAttributesW(PWideChar(FileName)) and faReadOnly) <> 0; +end; + +function WideFileSetReadOnly(const FileName: WideString; ReadOnly: Boolean): Boolean; +var + Flags: Integer; +begin + Result := False; + Flags := Tnt_GetFileAttributesW(PWideChar(FileName)); + if Flags = -1 then Exit; + if ReadOnly then + Flags := Flags or faReadOnly + else + Flags := Flags and not faReadOnly; + Result := Tnt_SetFileAttributesW(PWideChar(FileName), Flags); +end; + +function WideForceDirectories(Dir: WideString): Boolean; +begin + Result := True; + if Length(Dir) = 0 then + raise ETntGeneralError.Create(SCannotCreateDir); + Dir := WideExcludeTrailingBackslash(Dir); + if (Length(Dir) < 3) or WideDirectoryExists(Dir) + or (WideExtractFilePath(Dir) = Dir) then Exit; // avoid 'xyz:\' problem. + Result := WideForceDirectories(WideExtractFilePath(Dir)); + if Result then + Result := Tnt_CreateDirectoryW(PWideChar(Dir), nil) +end; + +function WideFileSearch(const Name, DirList: WideString): WideString; +var + I, P, L: Integer; + C: WideChar; +begin + Result := Name; + P := 1; + L := Length(DirList); + while True do + begin + if WideFileExists(Result) then Exit; + while (P <= L) and (DirList[P] = PathSep) do Inc(P); + if P > L then Break; + I := P; + while (P <= L) and (DirList[P] <> PathSep) do + Inc(P); + Result := Copy(DirList, I, P - I); + C := TntWideLastChar(Result); + if (C <> DriveDelim) and (C <> PathDelim) then + Result := Result + PathDelim; + Result := Result + Name; + end; + Result := ''; +end; + +function WideRenameFile(const OldName, NewName: WideString): Boolean; +begin + Result := Tnt_MoveFileW(PWideChar(OldName), PWideChar(NewName)) +end; + +function WideDeleteFile(const FileName: WideString): Boolean; +begin + Result := Tnt_DeleteFileW(PWideChar(FileName)) +end; + +function WideCopyFile(FromFile, ToFile: WideString; FailIfExists: Boolean): Boolean; +begin + Result := Tnt_CopyFileW(PWideChar(FromFile), PWideChar(ToFile), FailIfExists) +end; + +function _WideFindMatchingFile(var F: TSearchRecW): Integer; +var + LocalFileTime: TFileTime; +begin + with F do + begin + while FindData.dwFileAttributes and ExcludeAttr <> 0 do + if not Tnt_FindNextFileW(FindHandle, FindData) then + begin + Result := GetLastError; + Exit; + end; + FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime); + FileTimeToDosDateTime(LocalFileTime, LongRec(Time).Hi, LongRec(Time).Lo); + Size := (Int64(FindData.nFileSizeHigh) shl 32) + FindData.nFileSizeLow; + Attr := FindData.dwFileAttributes; + Name := FindData.cFileName; + end; + Result := 0; +end; + +function WideFindFirst(const Path: WideString; Attr: Integer; var F: TSearchRecW): Integer; +const + faSpecial = faHidden or faSysFile {$IFNDEF COMPILER_9_UP} or faVolumeID {$ENDIF} or faDirectory; +begin + F.ExcludeAttr := not Attr and faSpecial; + F.FindHandle := Tnt_FindFirstFileW(PWideChar(Path), F.FindData); + if F.FindHandle <> INVALID_HANDLE_VALUE then + begin + Result := _WideFindMatchingFile(F); + if Result <> 0 then WideFindClose(F); + end else + Result := GetLastError; +end; + +function WideFindNext(var F: TSearchRecW): Integer; +begin + if Tnt_FindNextFileW(F.FindHandle, F.FindData) then + Result := _WideFindMatchingFile(F) else + Result := GetLastError; +end; + +procedure WideFindClose(var F: TSearchRecW); +begin + if F.FindHandle <> INVALID_HANDLE_VALUE then + begin + Windows.FindClose(F.FindHandle); + F.FindHandle := INVALID_HANDLE_VALUE; + end; +end; + +function WideCreateDir(const Dir: WideString): Boolean; +begin + Result := Tnt_CreateDirectoryW(PWideChar(Dir), nil); +end; + +function WideRemoveDir(const Dir: WideString): Boolean; +begin + Result := Tnt_RemoveDirectoryW(PWideChar(Dir)); +end; + +function WideGetCurrentDir: WideString; +begin + SetLength(Result, MAX_PATH); + Tnt_GetCurrentDirectoryW(MAX_PATH, PWideChar(Result)); + Result := PWideChar(Result); +end; + +function WideSetCurrentDir(const Dir: WideString): Boolean; +begin + Result := Tnt_SetCurrentDirectoryW(PWideChar(Dir)); +end; + +//============================================================================================= +//== DATE/TIME STRING PARSING ================================================================ +//============================================================================================= + +function _IntTryStrToDateTime(Str: WideString; Flags: Integer; out DateTime: TDateTime): HResult; +begin + Result := VarDateFromStr(Str, GetThreadLocale, Flags, Double(DateTime)); + if (not Succeeded(Result)) then begin + if (Flags = VAR_TIMEVALUEONLY) + and SysUtils.TryStrToTime{TNT-ALLOW TryStrToTime}(Str, DateTime) then + Result := S_OK // SysUtils seems confident (works for date = "dd.MM.yy" and time = "H.mm.ss") + else if (Flags = VAR_DATEVALUEONLY) + and SysUtils.TryStrToDate{TNT-ALLOW TryStrToDate}(Str, DateTime) then + Result := S_OK // SysUtils seems confident + else if (Flags = 0) + and SysUtils.TryStrToDateTime{TNT-ALLOW TryStrToDateTime}(Str, DateTime) then + Result := S_OK // SysUtils seems confident + end; +end; + +function TntTryStrToDateTime(Str: WideString; out DateTime: TDateTime): Boolean; +begin + Result := Succeeded(_IntTryStrToDateTime(Str, 0, DateTime)); +end; + +function TntTryStrToDate(Str: WideString; out DateTime: TDateTime): Boolean; +begin + Result := Succeeded(_IntTryStrToDateTime(Str, VAR_DATEVALUEONLY, DateTime)); +end; + +function TntTryStrToTime(Str: WideString; out DateTime: TDateTime): Boolean; +begin + Result := Succeeded(_IntTryStrToDateTime(Str, VAR_TIMEVALUEONLY, DateTime)); +end; + +function ValidDateTimeStr(Str: WideString): Boolean; +var + Temp: TDateTime; +begin + Result := Succeeded(_IntTryStrToDateTime(Str, 0, Temp)); +end; + +function ValidDateStr(Str: WideString): Boolean; +var + Temp: TDateTime; +begin + Result := Succeeded(_IntTryStrToDateTime(Str, VAR_DATEVALUEONLY, Temp)); +end; + +function ValidTimeStr(Str: WideString): Boolean; +var + Temp: TDateTime; +begin + Result := Succeeded(_IntTryStrToDateTime(Str, VAR_TIMEVALUEONLY, Temp)); +end; + +function TntStrToDateTimeDef(Str: WideString; Default: TDateTime): TDateTime; +begin + if not TntTryStrToDateTime(Str, Result) then + Result := Default; +end; + +function TntStrToDateDef(Str: WideString; Default: TDateTime): TDateTime; +begin + if not TntTryStrToDate(Str, Result) then + Result := Default; +end; + +function TntStrToTimeDef(Str: WideString; Default: TDateTime): TDateTime; +begin + if not TntTryStrToTime(Str, Result) then + Result := Default; +end; + +function _IntStrToDateTime(Str: WideString; Flags: Integer; ErrorFormatStr: WideString): TDateTime; +begin + try + OleCheck(_IntTryStrToDateTime(Str, Flags, Result)); + except + on E: Exception do begin + E.Message := E.Message + CRLF + WideFormat(ErrorFormatStr, [Str]); + raise EConvertError.Create(E.Message); + end; + end; +end; + +function TntStrToDateTime(Str: WideString): TDateTime; +begin + Result := _IntStrToDateTime(Str, 0, SInvalidDateTime); +end; + +function TntStrToDate(Str: WideString): TDateTime; +begin + Result := _IntStrToDateTime(Str, VAR_DATEVALUEONLY, SInvalidDate); +end; + +function TntStrToTime(Str: WideString): TDateTime; +begin + Result := _IntStrToDateTime(Str, VAR_TIMEVALUEONLY, SInvalidTime); +end; + +//============================================================================================= +//== CURRENCY STRING PARSING ================================================================= +//============================================================================================= + +function TntCurrToStr(Value: Currency; lpFormat: PCurrencyFmtW = nil): WideString; +const + MAX_BUFF_SIZE = 64; // can a currency string actually be larger? +var + ValueStr: WideString; +begin + // format lpValue using ENG-US settings + ValueStr := ENG_US_FloatToStr(Value); + // get currency format + SetLength(Result, MAX_BUFF_SIZE); + if 0 = Tnt_GetCurrencyFormatW(GetThreadLocale, 0, PWideChar(ValueStr), + lpFormat, PWideChar(Result), Length(Result)) + then begin + RaiseLastOSError; + end; + Result := PWideChar(Result); +end; + +function TntStrToCurr(const S: WideString): Currency; +begin + try + OleCheck(VarCyFromStr(S, GetThreadLocale, 0, Result)); + except + on E: Exception do begin + E.Message := E.Message + CRLF + WideFormat(SInvalidCurrency, [S]); + raise EConvertError.Create(E.Message); + end; + end; +end; + +function ValidCurrencyStr(const S: WideString): Boolean; +var + Dummy: Currency; +begin + Result := Succeeded(VarCyFromStr(S, GetThreadLocale, 0, Dummy)); +end; + +function TntStrToCurrDef(const S: WideString; const Default: Currency): Currency; +begin + if not Succeeded(VarCyFromStr(S, GetThreadLocale, 0, Result)) then + Result := Default; +end; + +threadvar + Currency_DecimalSep: WideString; + Currency_ThousandSep: WideString; + Currency_CurrencySymbol: WideString; + +function GetDefaultCurrencyFmt: TCurrencyFmtW; +begin + ZeroMemory(@Result, SizeOf(Result)); + Result.NumDigits := StrToIntDef(WideGetLocaleStr(GetThreadLocale, LOCALE_ICURRDIGITS, '2'), 2); + Result.LeadingZero := StrToIntDef(WideGetLocaleStr(GetThreadLocale, LOCALE_ILZERO, '1'), 1); + Result.Grouping := StrToIntDef(Copy(WideGetLocaleStr(GetThreadLocale, LOCALE_SMONGROUPING, '3;0'), 1, 1), 3); + Currency_DecimalSep := WideGetLocaleStr(GetThreadLocale, LOCALE_SMONDECIMALSEP, '.'); + Result.lpDecimalSep := PWideChar(Currency_DecimalSep); + Currency_ThousandSep := WideGetLocaleStr(GetThreadLocale, LOCALE_SMONTHOUSANDSEP, ','); + Result.lpThousandSep := PWideChar(Currency_ThousandSep); + Result.NegativeOrder := StrToIntDef(WideGetLocaleStr(GetThreadLocale, LOCALE_INEGCURR, '0'), 0); + Result.PositiveOrder := StrToIntDef(WideGetLocaleStr(GetThreadLocale, LOCALE_ICURRENCY, '0'), 0); + Currency_CurrencySymbol := WideGetLocaleStr(GetThreadLocale, LOCALE_SCURRENCY, ''); + Result.lpCurrencySymbol := PWideChar(Currency_CurrencySymbol); +end; + +//============================================================================================= + +function WideGetLocaleStr(LocaleID: LCID; LocaleType: Integer; const Default: WideString): WideString; +var + L: Integer; +begin + if (not Win32PlatformIsUnicode) then + Result := GetLocaleStr{TNT-ALLOW GetLocaleStr}(LocaleID, LocaleType, Default) + else begin + SetLength(Result, 255); + L := GetLocaleInfoW(LocaleID, LocaleType, PWideChar(Result), Length(Result)); + if L > 0 then + SetLength(Result, L - 1) + else + Result := Default; + end; +end; + +function WideSysErrorMessage(ErrorCode: Integer): WideString; +begin + Result := WideLibraryErrorMessage('system', 0, ErrorCode); +end; + +function WideLibraryErrorMessage(const LibName: WideString; Dll: THandle; ErrorCode: Integer): WideString; +var + Len: Integer; + AnsiResult: AnsiString; + Flags: Cardinal; +begin + Flags := FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_IGNORE_INSERTS or FORMAT_MESSAGE_ARGUMENT_ARRAY; + if Dll <> 0 then + Flags := Flags or FORMAT_MESSAGE_FROM_HMODULE; + if Win32PlatformIsUnicode then begin + SetLength(Result, 256); + Len := FormatMessageW(Flags, Pointer(Dll), ErrorCode, 0, PWideChar(Result), Length(Result), nil); + SetLength(Result, Len); + end else begin + SetLength(AnsiResult, 256); + Len := FormatMessageA(Flags, Pointer(Dll), ErrorCode, 0, PAnsiChar(AnsiResult), Length(AnsiResult), nil); + SetLength(AnsiResult, Len); + Result := AnsiResult; + end; + if Trim(Result) = '' then + Result := WideFormat('Unspecified error (%d) from %s.', [ErrorCode, LibName]); +end; + +{$IFNDEF COMPILER_7_UP} +function CheckWin32Version(AMajor: Integer; AMinor: Integer = 0): Boolean; +begin + Result := (Win32MajorVersion > AMajor) or + ((Win32MajorVersion = AMajor) and + (Win32MinorVersion >= AMinor)); +end; +{$ENDIF} + +function WinCheckH(RetVal: Cardinal): Cardinal; +begin + if RetVal = 0 then RaiseLastOSError; + Result := RetVal; +end; + +function WinCheckFileH(RetVal: Cardinal): Cardinal; +begin + if RetVal = INVALID_HANDLE_VALUE then RaiseLastOSError; + Result := RetVal; +end; + +function WinCheckP(RetVal: Pointer): Pointer; +begin + if RetVal = nil then RaiseLastOSError; + Result := RetVal; +end; + +function WideGetModuleFileName(Instance: HModule): WideString; +begin + SetLength(Result, MAX_PATH); + WinCheckH(Tnt_GetModuleFileNameW(Instance, PWideChar(Result), Length(Result))); + Result := PWideChar(Result) +end; + +function WideSafeLoadLibrary(const Filename: Widestring; ErrorMode: UINT): HMODULE; +var + OldMode: UINT; + FPUControlWord: Word; +begin + OldMode := SetErrorMode(ErrorMode); + try + asm + FNSTCW FPUControlWord + end; + try + Result := Tnt_LoadLibraryW(PWideChar(Filename)); + finally + asm + FNCLEX + FLDCW FPUControlWord + end; + end; + finally + SetErrorMode(OldMode); + end; +end; + +function WideLoadPackage(const Name: Widestring): HMODULE; +begin + Result := WideSafeLoadLibrary(Name); + if Result = 0 then + begin + raise EPackageError.CreateFmt(sErrorLoadingPackage, [Name, WideSysErrorMessage(GetLastError)]); + end; + try + InitializePackage(Result); + except + FreeLibrary(Result); + raise; + end; +end; + +function _WideCharType(WC: WideChar; dwInfoType: Cardinal): Word; +begin + Win32Check(Tnt_GetStringTypeExW(GetThreadLocale, dwInfoType, PWideChar(@WC), 1, Result)) +end; + +function IsWideCharUpper(WC: WideChar): Boolean; +begin + Result := (_WideCharType(WC, CT_CTYPE1) and C1_UPPER) <> 0; +end; + +function IsWideCharLower(WC: WideChar): Boolean; +begin + Result := (_WideCharType(WC, CT_CTYPE1) and C1_LOWER) <> 0; +end; + +function IsWideCharDigit(WC: WideChar): Boolean; +begin + Result := (_WideCharType(WC, CT_CTYPE1) and C1_DIGIT) <> 0; +end; + +function IsWideCharSpace(WC: WideChar): Boolean; +begin + Result := (_WideCharType(WC, CT_CTYPE1) and C1_SPACE) <> 0; +end; + +function IsWideCharPunct(WC: WideChar): Boolean; +begin + Result := (_WideCharType(WC, CT_CTYPE1) and C1_PUNCT) <> 0; +end; + +function IsWideCharCntrl(WC: WideChar): Boolean; +begin + Result := (_WideCharType(WC, CT_CTYPE1) and C1_CNTRL) <> 0; +end; + +function IsWideCharBlank(WC: WideChar): Boolean; +begin + Result := (_WideCharType(WC, CT_CTYPE1) and C1_BLANK) <> 0; +end; + +function IsWideCharXDigit(WC: WideChar): Boolean; +begin + Result := (_WideCharType(WC, CT_CTYPE1) and C1_XDIGIT) <> 0; +end; + +function IsWideCharAlpha(WC: WideChar): Boolean; +begin + Result := (_WideCharType(WC, CT_CTYPE1) and C1_ALPHA) <> 0; +end; + +function IsWideCharAlphaNumeric(WC: WideChar): Boolean; +begin + Result := (_WideCharType(WC, CT_CTYPE1) and (C1_ALPHA + C1_DIGIT)) <> 0; +end; + +function WideTextPos(const SubStr, S: WideString): Integer; +begin + Result := Pos(Tnt_WideUpperCase(SubStr), Tnt_WideUpperCase(S)); +end; + +function FindDoubleTerminator(P: PWideChar): PWideChar; +begin + Result := P; + while True do begin + Result := WStrScan(Result, #0); + Inc(Result); + if Result^ = #0 then begin + Dec(Result); + break; + end; + end; +end; + +function ExtractStringArrayStr(P: PWideChar): WideString; +var + PEnd: PWideChar; +begin + PEnd := FindDoubleTerminator(P); + Inc(PEnd, 2); // move past #0#0 + SetString(Result, P, PEnd - P); +end; + +function ExtractStringFromStringArray(var P: PWideChar; Separator: WideChar = #0): WideString; +var + Start: PWideChar; +begin + Start := P; + P := WStrScan(Start, Separator); + if P = nil then begin + Result := Start; + P := WStrEnd(Start); + end else begin + SetString(Result, Start, P - Start); + Inc(P); + end; +end; + +function ExtractStringsFromStringArray(P: PWideChar; Separator: WideChar = #0): TWideStringDynArray; +const + GROW_COUNT = 256; +var + Count: Integer; + Item: WideString; +begin + Count := 0; + SetLength(Result, GROW_COUNT); + Item := ExtractStringFromStringArray(P, Separator); + While Item <> '' do begin + if Count > High(Result) then + SetLength(Result, Length(Result) + GROW_COUNT); + Result[Count] := Item; + Inc(Count); + Item := ExtractStringFromStringArray(P, Separator); + end; + SetLength(Result, Count); +end; + +function IsWideCharMappableToAnsi(const WC: WideChar): Boolean; +var + UsedDefaultChar: BOOL; +begin + WideCharToMultiByte(DefaultSystemCodePage, 0, PWideChar(@WC), 1, nil, 0, nil, @UsedDefaultChar); + Result := not UsedDefaultChar; +end; + +function IsWideStringMappableToAnsi(const WS: WideString): Boolean; +var + UsedDefaultChar: BOOL; +begin + WideCharToMultiByte(DefaultSystemCodePage, 0, PWideChar(WS), Length(WS), nil, 0, nil, @UsedDefaultChar); + Result := not UsedDefaultChar; +end; + +function IsRTF(const Value: WideString): Boolean; +const + RTF_BEGIN_1 = WideString('{\RTF'); + RTF_BEGIN_2 = WideString('{URTF'); +begin + Result := (WideTextPos(RTF_BEGIN_1, Value) = 1) + or (WideTextPos(RTF_BEGIN_2, Value) = 1); +end; + +{$IFDEF COMPILER_7_UP} +var + Cached_ENG_US_FormatSettings: TFormatSettings; + Cached_ENG_US_FormatSettings_Time: Cardinal; + +function ENG_US_FormatSettings: TFormatSettings; +begin + if Cached_ENG_US_FormatSettings_Time = _SettingChangeTime then + Result := Cached_ENG_US_FormatSettings + else begin + GetLocaleFormatSettings(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)), Result); + Result.DecimalSeparator := '.'; // ignore overrides + Cached_ENG_US_FormatSettings := Result; + Cached_ENG_US_FormatSettings_Time := _SettingChangeTime; + end; + end; + +function ENG_US_FloatToStr(Value: Extended): WideString; +begin + Result := FloatToStr(Value, ENG_US_FormatSettings); +end; + +function ENG_US_StrToFloat(const S: WideString): Extended; +begin + if not TextToFloat(PAnsiChar(AnsiString(S)), Result, fvExtended, ENG_US_FormatSettings) then + Result := StrToFloat(S); // try using native format +end; + +{$ELSE} + +function ENG_US_FloatToStr(Value: Extended): WideString; +var + SaveDecimalSep: AnsiChar; +begin + SaveDecimalSep := SysUtils.DecimalSeparator; + try + SysUtils.DecimalSeparator := '.'; + Result := FloatToStr(Value); + finally + SysUtils.DecimalSeparator := SaveDecimalSep; + end; +end; + +function ENG_US_StrToFloat(const S: WideString): Extended; +var + SaveDecimalSep: AnsiChar; +begin + try + SaveDecimalSep := SysUtils.DecimalSeparator; + try + SysUtils.DecimalSeparator := '.'; + Result := StrToFloat(S); + finally + SysUtils.DecimalSeparator := SaveDecimalSep; + end; + except + if SysUtils.DecimalSeparator <> '.' then + Result := StrToFloat(S) // try using native format + else + raise; + end; +end; +{$ENDIF} + +//--------------------------------------------------------------------------------------------- +// Tnt - Variants +//--------------------------------------------------------------------------------------------- + +initialization + Win32PlatformIsUnicode := (Win32Platform = VER_PLATFORM_WIN32_NT); + Win32PlatformIsXP := ((Win32MajorVersion = 5) and (Win32MinorVersion >= 1)) + or (Win32MajorVersion > 5); + Win32PlatformIs2003 := ((Win32MajorVersion = 5) and (Win32MinorVersion >= 2)) + or (Win32MajorVersion > 5); + Win32PlatformIsVista := (Win32MajorVersion >= 6); + +finalization + Currency_DecimalSep := ''; {make memory sleuth happy} + Currency_ThousandSep := ''; {make memory sleuth happy} + Currency_CurrencySymbol := ''; {make memory sleuth happy} + +end. diff --git a/internal/1/Source/TntSystem.pas b/internal/1/Source/TntSystem.pas new file mode 100644 index 0000000..cc99aa4 --- /dev/null +++ b/internal/1/Source/TntSystem.pas @@ -0,0 +1,1384 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntSystem; + +{$INCLUDE TntCompilers.inc} + +{*****************************************************************************} +{ Special thanks go to Francisco Leong for originating the design for } +{ WideString-enabled resourcestrings. } +{*****************************************************************************} + +interface + +uses + Windows; + +// These functions should not be used by Delphi code since conversions are implicit. +{TNT-WARN WideCharToString} +{TNT-WARN WideCharLenToString} +{TNT-WARN WideCharToStrVar} +{TNT-WARN WideCharLenToStrVar} +{TNT-WARN StringToWideChar} + +// ................ ANSI TYPES ................ +{TNT-WARN Char} +{TNT-WARN PChar} +{TNT-WARN String} + +{TNT-WARN CP_ACP} // <-- use DefaultSystemCodePage +function DefaultSystemCodePage: Cardinal; // implicitly used when converting AnsiString <--> WideString. + +var + WideCustomLoadResString: function(ResStringRec: PResStringRec; var Value: WideString): Boolean; + +{TNT-WARN LoadResString} +function WideLoadResString(ResStringRec: PResStringRec): WideString; +{TNT-WARN ParamCount} +function WideParamCount: Integer; +{TNT-WARN ParamStr} +function WideParamStr(Index: Integer): WideString; + +// ......... introduced ......... + +const + { Each Unicode stream should begin with the code U+FEFF, } + { which the standard defines as the *byte order mark*. } + UNICODE_BOM = WideChar($FEFF); + UNICODE_BOM_SWAPPED = WideChar($FFFE); + UTF8_BOM = AnsiString(#$EF#$BB#$BF); + +function WideStringToUTF8(const S: WideString): AnsiString; +function UTF8ToWideString(const S: AnsiString): WideString; + +function WideStringToUTF7(const W: WideString): AnsiString; +function UTF7ToWideString(const S: AnsiString): WideString; + +function StringToWideStringEx(const S: AnsiString; CodePage: Cardinal): WideString; +function WideStringToStringEx(const WS: WideString; CodePage: Cardinal): AnsiString; + +function UCS2ToWideString(const Value: AnsiString): WideString; +function WideStringToUCS2(const Value: WideString): AnsiString; + +function CharSetToCodePage(ciCharset: UINT): Cardinal; +function LCIDToCodePage(ALcid: LCID): Cardinal; +function KeyboardCodePage: Cardinal; +function KeyUnicode(CharCode: Word): WideChar; + +procedure StrSwapByteOrder(Str: PWideChar); + +type + TTntSystemUpdate = + (tsWideResourceStrings + {$IFNDEF COMPILER_9_UP}, tsFixImplicitCodePage, tsFixWideStrConcat, tsFixWideFormat {$ENDIF} + ); + TTntSystemUpdateSet = set of TTntSystemUpdate; + +const + AllTntSystemUpdates = [Low(TTntSystemUpdate)..High(TTntSystemUpdate)]; + +procedure InstallTntSystemUpdates(Updates: TTntSystemUpdateSet = AllTntSystemUpdates); + +implementation + +uses + SysUtils, Variants, TntWindows, TntSysUtils; + +var + GDefaultSystemCodePage: Cardinal; + +function DefaultSystemCodePage: Cardinal; +begin + Result := GDefaultSystemCodePage; +end; + +var + IsDebugging: Boolean; + +function WideLoadResString(ResStringRec: PResStringRec): WideString; +const + MAX_RES_STRING_SIZE = 4097; { MSDN documents this as the maximum size of a string in table. } +var + Buffer: array [0..MAX_RES_STRING_SIZE] of WideChar; { Buffer leaves room for null terminator. } + PCustom: PAnsiChar; +begin + if Assigned(WideCustomLoadResString) and WideCustomLoadResString(ResStringRec, Result) then + exit; { a custom resourcestring has been loaded. } + + if ResStringRec = nil then + Result := '' + else if ResStringRec.Identifier < 64*1024 then + SetString(Result, Buffer, + Tnt_LoadStringW(FindResourceHInstance(ResStringRec.Module^), + ResStringRec.Identifier, Buffer, MAX_RES_STRING_SIZE)) + else begin + // custom string pointer + PCustom := PAnsiChar(ResStringRec.Identifier); { I would like to use PWideChar, but this would break legacy code. } + if (StrLen{TNT-ALLOW StrLen}(PCustom) > Cardinal(Length(UTF8_BOM))) + and CompareMem(PCustom, PAnsiChar(UTF8_BOM), Length(UTF8_BOM)) then + // detected UTF8 + Result := UTF8ToWideString(PAnsiChar(PCustom + Length(UTF8_BOM))) + else + // normal + Result := PCustom; + end; +end; + +function WideGetParamStr(P: PWideChar; var Param: WideString): PWideChar; +var + i, Len: Integer; + Start, S, Q: PWideChar; +begin + while True do + begin + while (P[0] <> #0) and (P[0] <= ' ') do + Inc(P); + if (P[0] = '"') and (P[1] = '"') then Inc(P, 2) else Break; + end; + Len := 0; + Start := P; + while P[0] > ' ' do + begin + if P[0] = '"' then + begin + Inc(P); + while (P[0] <> #0) and (P[0] <> '"') do + begin + Q := P + 1; + Inc(Len, Q - P); + P := Q; + end; + if P[0] <> #0 then + Inc(P); + end + else + begin + Q := P + 1; + Inc(Len, Q - P); + P := Q; + end; + end; + + SetLength(Param, Len); + + P := Start; + S := PWideChar(Param); + i := 0; + while P[0] > ' ' do + begin + if P[0] = '"' then + begin + Inc(P); + while (P[0] <> #0) and (P[0] <> '"') do + begin + Q := P + 1; + while P < Q do + begin + S[i] := P^; + Inc(P); + Inc(i); + end; + end; + if P[0] <> #0 then Inc(P); + end + else + begin + Q := P + 1; + while P < Q do + begin + S[i] := P^; + Inc(P); + Inc(i); + end; + end; + end; + + Result := P; +end; + +function WideParamCount: Integer; +var + P: PWideChar; + S: WideString; +begin + P := WideGetParamStr(GetCommandLineW, S); + Result := 0; + while True do + begin + P := WideGetParamStr(P, S); + if S = '' then Break; + Inc(Result); + end; +end; + +function WideParamStr(Index: Integer): WideString; +var + P: PWideChar; +begin + if Index = 0 then + Result := WideGetModuleFileName(0) + else + begin + P := GetCommandLineW; + while True do + begin + P := WideGetParamStr(P, Result); + if (Index = 0) or (Result = '') then Break; + Dec(Index); + end; + end; +end; + +function WideStringToUTF8(const S: WideString): AnsiString; +begin + Result := UTF8Encode(S); +end; + +function UTF8ToWideString(const S: AnsiString): WideString; +begin + Result := UTF8Decode(S); +end; + + { ======================================================================= } + { Original File: ConvertUTF7.c } + { Author: David B. Goldsmith } + { Copyright (C) 1994, 1996 Taligent, Inc. All rights reserved. } + { } + { This code is copyrighted. Under the copyright laws, this code may not } + { be copied, in whole or part, without prior written consent of Taligent. } + { } + { Taligent grants the right to use this code as long as this ENTIRE } + { copyright notice is reproduced in the code. The code is provided } + { AS-IS, AND TALIGENT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR } + { IMPLIED, INCLUDING, BUT NOT LIMITED TO IMPLIED WARRANTIES OF } + { MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT } + { WILL TALIGENT BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING, } + { WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS } + { INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY } + { LOSS) ARISING OUT OF THE USE OR INABILITY TO USE THIS CODE, EVEN } + { IF TALIGENT HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. } + { BECAUSE SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF } + { LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES, THE ABOVE } + { LIMITATION MAY NOT APPLY TO YOU. } + { } + { RESTRICTED RIGHTS LEGEND: Use, duplication, or disclosure by the } + { government is subject to restrictions as set forth in subparagraph } + { (c)(l)(ii) of the Rights in Technical Data and Computer Software } + { clause at DFARS 252.227-7013 and FAR 52.227-19. } + { } + { This code may be protected by one or more U.S. and International } + { Patents. } + { } + { TRADEMARKS: Taligent and the Taligent Design Mark are registered } + { trademarks of Taligent, Inc. } + { ======================================================================= } + +type UCS2 = Word; + +const + _base64: AnsiString = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + _direct: AnsiString = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789''(),-./:?'; + _optional: AnsiString = '!"#$%&*;<=>@[]^_`{|}'; + _spaces: AnsiString = #9#13#10#32; + +var + base64: PAnsiChar; + invbase64: array[0..127] of SmallInt; + direct: PAnsiChar; + optional: PAnsiChar; + spaces: PAnsiChar; + mustshiftsafe: array[0..127] of AnsiChar; + mustshiftopt: array[0..127] of AnsiChar; + +var + needtables: Boolean = True; + +procedure Initialize_UTF7_Data; +begin + base64 := PAnsiChar(_base64); + direct := PAnsiChar(_direct); + optional := PAnsiChar(_optional); + spaces := PAnsiChar(_spaces); +end; + +procedure tabinit; +var + i: Integer; + limit: Integer; +begin + i := 0; + while (i < 128) do + begin + mustshiftopt[i] := #1; + mustshiftsafe[i] := #1; + invbase64[i] := -1; + Inc(i); + end { For }; + limit := Length(_Direct); + i := 0; + while (i < limit) do + begin + mustshiftopt[Integer(direct[i])] := #0; + mustshiftsafe[Integer(direct[i])] := #0; + Inc(i); + end { For }; + limit := Length(_Spaces); + i := 0; + while (i < limit) do + begin + mustshiftopt[Integer(spaces[i])] := #0; + mustshiftsafe[Integer(spaces[i])] := #0; + Inc(i); + end { For }; + limit := Length(_Optional); + i := 0; + while (i < limit) do + begin + mustshiftopt[Integer(optional[i])] := #0; + Inc(i); + end { For }; + limit := Length(_Base64); + i := 0; + while (i < limit) do + begin + invbase64[Integer(base64[i])] := i; + Inc(i); + end { For }; + needtables := False; +end; { tabinit } + +function WRITE_N_BITS(x: UCS2; n: Integer; var BITbuffer: Cardinal; var bufferbits: Integer): Integer; +begin + BITbuffer := BITbuffer or (x and (not (-1 shl n))) shl (32 - n - bufferbits); + bufferbits := bufferbits + n; + Result := bufferbits; +end; { WRITE_N_BITS } + +function READ_N_BITS(n: Integer; var BITbuffer: Cardinal; var bufferbits: Integer): UCS2; +var + buffertemp: Cardinal; +begin + buffertemp := BITbuffer shr (32 - n); + BITbuffer := BITbuffer shl n; + bufferbits := bufferbits - n; + Result := UCS2(buffertemp); +end; { READ_N_BITS } + +function ConvertUCS2toUTF7(var sourceStart: PWideChar; sourceEnd: PWideChar; + var targetStart: PAnsiChar; targetEnd: PAnsiChar; optional: Boolean; + verbose: Boolean): Integer; +var + r: UCS2; + target: PAnsiChar; + source: PWideChar; + BITbuffer: Cardinal; + bufferbits: Integer; + shifted: Boolean; + needshift: Boolean; + done: Boolean; + mustshift: PAnsiChar; +begin + Initialize_UTF7_Data; + Result := 0; + BITbuffer := 0; + bufferbits := 0; + shifted := False; + source := sourceStart; + target := targetStart; + r := 0; + if needtables then + tabinit; + if optional then + mustshift := @mustshiftopt[0] + else + mustshift := @mustshiftsafe[0]; + repeat + done := source >= sourceEnd; + if not Done then + begin + r := Word(source^); + Inc(Source); + end { If }; + needshift := (not done) and ((r > $7F) or (mustshift[r] <> #0)); + if needshift and (not shifted) then + begin + if (Target >= TargetEnd) then + begin + Result := 2; + break; + end { If }; + target^ := '+'; + Inc(target); + { Special case handling of the SHIFT_IN character } + if (r = UCS2('+')) then + begin + if (target >= targetEnd) then + begin + Result := 2; + break; + end; + target^ := '-'; + Inc(target); + end + else + shifted := True; + end { If }; + if shifted then + begin + { Either write the character to the bit buffer, or pad } + { the bit buffer out to a full base64 character. } + { } + if needshift then + WRITE_N_BITS(r, 16, BITbuffer, bufferbits) + else + WRITE_N_BITS(0, (6 - (bufferbits mod 6)) mod 6, BITbuffer, + bufferbits); + { Flush out as many full base64 characters as possible } + { from the bit buffer. } + { } + while (target < targetEnd) and (bufferbits >= 6) do + begin + Target^ := base64[READ_N_BITS(6, BITbuffer, bufferbits)]; + Inc(Target); + end { While }; + if (bufferbits >= 6) then + begin + if (target >= targetEnd) then + begin + Result := 2; + break; + end { If }; + end { If }; + if (not needshift) then + begin + { Write the explicit shift out character if } + { 1) The caller has requested we always do it, or } + { 2) The directly encoded character is in the } + { base64 set, or } + { 3) The directly encoded character is SHIFT_OUT. } + { } + if verbose or ((not done) and ((invbase64[r] >= 0) or (r = + Integer('-')))) then + begin + if (target >= targetEnd) then + begin + Result := 2; + Break; + end { If }; + Target^ := '-'; + Inc(Target); + end { If }; + shifted := False; + end { If }; + { The character can be directly encoded as ASCII. } + end { If }; + if (not needshift) and (not done) then + begin + if (target >= targetEnd) then + begin + Result := 2; + break; + end { If }; + Target^ := AnsiChar(r); + Inc(Target); + end { If }; + until (done); + sourceStart := source; + targetStart := target; +end; { ConvertUCS2toUTF7 } + +function ConvertUTF7toUCS2(var sourceStart: PAnsiChar; sourceEnd: PAnsiChar; + var targetStart: PWideChar; targetEnd: PWideChar): Integer; +var + target: PWideChar { Register }; + source: PAnsiChar { Register }; + BITbuffer: Cardinal { & "Address Of" Used }; + bufferbits: Integer { & "Address Of" Used }; + shifted: Boolean { Used In Boolean Context }; + first: Boolean { Used In Boolean Context }; + wroteone: Boolean; + base64EOF: Boolean; + base64value: Integer; + done: Boolean; + c: UCS2; + prevc: UCS2; + junk: UCS2 { Used In Boolean Context }; +begin + Initialize_UTF7_Data; + Result := 0; + BITbuffer := 0; + bufferbits := 0; + shifted := False; + first := False; + wroteone := False; + source := sourceStart; + target := targetStart; + c := 0; + if needtables then + tabinit; + repeat + { read an ASCII character c } + done := Source >= SourceEnd; + if (not done) then + begin + c := Word(Source^); + Inc(Source); + end { If }; + if shifted then + begin + { We're done with a base64 string if we hit EOF, it's not a valid } + { ASCII character, or it's not in the base64 set. } + { } + base64value := invbase64[c]; + base64EOF := (done or (c > $7F)) or (base64value < 0); + if base64EOF then + begin + shifted := False; + { If the character causing us to drop out was SHIFT_IN or } + { SHIFT_OUT, it may be a special escape for SHIFT_IN. The } + { test for SHIFT_IN is not necessary, but allows an alternate } + { form of UTF-7 where SHIFT_IN is escaped by SHIFT_IN. This } + { only works for some values of SHIFT_IN. } + { } + if ((not done) and ((c = Integer('+')) or (c = Integer('-')))) then + begin + { get another character c } + prevc := c; + Done := Source >= SourceEnd; + if (not Done) then + begin + c := Word(Source^); + Inc(Source); + { If no base64 characters were encountered, and the } + { character terminating the shift sequence was } + { SHIFT_OUT, then it's a special escape for SHIFT_IN. } + { } + end; + if first and (prevc = Integer('-')) then + begin + { write SHIFT_IN unicode } + if (target >= targetEnd) then + begin + Result := 2; + break; + end { If }; + Target^ := WideChar('+'); + Inc(Target); + end + else + begin + if (not wroteone) then + begin + Result := 1; + end { If }; + end { Else }; + ; + end { If } + else + begin + if (not wroteone) then + begin + Result := 1; + end { If }; + end { Else }; + end { If } + else + begin + { Add another 6 bits of base64 to the bit buffer. } + WRITE_N_BITS(base64value, 6, BITbuffer, + bufferbits); + first := False; + end { Else }; + { Extract as many full 16 bit characters as possible from the } + { bit buffer. } + { } + while (bufferbits >= 16) and (target < targetEnd) do + begin + { write a unicode } + Target^ := WideChar(READ_N_BITS(16, BITbuffer, bufferbits)); + Inc(Target); + wroteone := True; + end { While }; + if (bufferbits >= 16) then + begin + if (target >= targetEnd) then + begin + Result := 2; + Break; + end; + end { If }; + if (base64EOF) then + begin + junk := READ_N_BITS(bufferbits, BITbuffer, bufferbits); + if (junk <> 0) then + begin + Result := 1; + end { If }; + end { If }; + end { If }; + if (not shifted) and (not done) then + begin + if (c = Integer('+')) then + begin + shifted := True; + first := True; + wroteone := False; + end { If } + else + begin + { It must be a directly encoded character. } + if (c > $7F) then + begin + Result := 1; + end { If }; + if (target >= targetEnd) then + begin + Result := 2; + break; + end { If }; + Target^ := WideChar(c); + Inc(Target); + end { Else }; + end { If }; + until (done); + sourceStart := source; + targetStart := target; +end; { ConvertUTF7toUCS2 } + + {*****************************************************************************} + { Thanks to Francisco Leong for providing the Pascal conversion of } + { ConvertUTF7.c (by David B. Goldsmith) } + {*****************************************************************************} + +resourcestring + SBufferOverflow = 'Buffer overflow'; + SInvalidUTF7 = 'Invalid UTF7'; + +function WideStringToUTF7(const W: WideString): AnsiString; +var + SourceStart, SourceEnd: PWideChar; + TargetStart, TargetEnd: PAnsiChar; +begin + if W = '' then + Result := '' + else + begin + SetLength(Result, Length(W) * 7); // Assume worst case + SourceStart := PWideChar(@W[1]); + SourceEnd := PWideChar(@W[Length(W)]) + 1; + TargetStart := PAnsiChar(@Result[1]); + TargetEnd := PAnsiChar(@Result[Length(Result)]) + 1; + if ConvertUCS2toUTF7(SourceStart, SourceEnd, TargetStart, + TargetEnd, True, False) <> 0 + then + raise ETntInternalError.Create(SBufferOverflow); + SetLength(Result, TargetStart - PAnsiChar(@Result[1])); + end; +end; + +function UTF7ToWideString(const S: AnsiString): WideString; +var + SourceStart, SourceEnd: PAnsiChar; + TargetStart, TargetEnd: PWideChar; +begin + if (S = '') then + Result := '' + else + begin + SetLength(Result, Length(S)); // Assume Worst case + SourceStart := PAnsiChar(@S[1]); + SourceEnd := PAnsiChar(@S[Length(S)]) + 1; + TargetStart := PWideChar(@Result[1]); + TargetEnd := PWideChar(@Result[Length(Result)]) + 1; + case ConvertUTF7toUCS2(SourceStart, SourceEnd, TargetStart, + TargetEnd) of + 1: raise ETntGeneralError.Create(SInvalidUTF7); + 2: raise ETntInternalError.Create(SBufferOverflow); + end; + SetLength(Result, TargetStart - PWideChar(@Result[1])); + end; +end; + +function StringToWideStringEx(const S: AnsiString; CodePage: Cardinal): WideString; +var + InputLength, + OutputLength: Integer; +begin + if CodePage = CP_UTF7 then + Result := UTF7ToWideString(S) // CP_UTF7 not supported on Windows 95 + else if CodePage = CP_UTF8 then + Result := UTF8ToWideString(S) // CP_UTF8 not supported on Windows 95 + else begin + InputLength := Length(S); + OutputLength := MultiByteToWideChar(CodePage, 0, PAnsiChar(S), InputLength, nil, 0); + SetLength(Result, OutputLength); + MultiByteToWideChar(CodePage, 0, PAnsiChar(S), InputLength, PWideChar(Result), OutputLength); + end; +end; + +function WideStringToStringEx(const WS: WideString; CodePage: Cardinal): AnsiString; +var + InputLength, + OutputLength: Integer; +begin + if CodePage = CP_UTF7 then + Result := WideStringToUTF7(WS) // CP_UTF7 not supported on Windows 95 + else if CodePage = CP_UTF8 then + Result := WideStringToUTF8(WS) // CP_UTF8 not supported on Windows 95 + else begin + InputLength := Length(WS); + OutputLength := WideCharToMultiByte(CodePage, 0, PWideChar(WS), InputLength, nil, 0, nil, nil); + SetLength(Result, OutputLength); + WideCharToMultiByte(CodePage, 0, PWideChar(WS), InputLength, PAnsiChar(Result), OutputLength, nil, nil); + end; +end; + +function UCS2ToWideString(const Value: AnsiString): WideString; +begin + if Length(Value) = 0 then + Result := '' + else + SetString(Result, PWideChar(@Value[1]), Length(Value) div SizeOf(WideChar)) +end; + +function WideStringToUCS2(const Value: WideString): AnsiString; +begin + if Length(Value) = 0 then + Result := '' + else + SetString(Result, PAnsiChar(@Value[1]), Length(Value) * SizeOf(WideChar)) +end; + +{ Windows.pas doesn't declare TranslateCharsetInfo() correctly. } +function TranslateCharsetInfo(lpSrc: PDWORD; var lpCs: TCharsetInfo; dwFlags: DWORD): BOOL; stdcall; external gdi32 name 'TranslateCharsetInfo'; + +function CharSetToCodePage(ciCharset: UINT): Cardinal; +var + C: TCharsetInfo; +begin + Win32Check(TranslateCharsetInfo(PDWORD(ciCharset), C, TCI_SRCCHARSET)); + Result := C.ciACP +end; + +function LCIDToCodePage(ALcid: LCID): Cardinal; +var + Buf: array[0..6] of AnsiChar; +begin + GetLocaleInfo(ALcid, LOCALE_IDefaultAnsiCodePage, Buf, 6); + Result := StrToIntDef(Buf, GetACP); +end; + +function KeyboardCodePage: Cardinal; +begin + Result := LCIDToCodePage(GetKeyboardLayout(0) and $FFFF); +end; + +function KeyUnicode(CharCode: Word): WideChar; +var + AChar: AnsiChar; +begin + // converts the given character (as it comes with a WM_CHAR message) into its + // corresponding Unicode character depending on the active keyboard layout + if CharCode <= Word(High(AnsiChar)) then begin + AChar := AnsiChar(CharCode); + MultiByteToWideChar(KeyboardCodePage, MB_USEGLYPHCHARS, @AChar, 1, @Result, 1); + end else + Result := WideChar(CharCode); +end; + +procedure StrSwapByteOrder(Str: PWideChar); +var + P: PWord; +begin + P := PWord(Str); + While (P^ <> 0) do begin + P^ := MakeWord(HiByte(P^), LoByte(P^)); + Inc(P); + end; +end; + +//-------------------------------------------------------------------- +// LoadResString() +// +// This system function is used to retrieve a resourcestring and +// return the result as an AnsiString. If we believe that the result +// is only a temporary value, and that it will be immediately +// assigned to a WideString or a Variant, then we will save the +// Unicode result as well as a reference to the original Ansi string. +// WStrFromPCharLen() or VarFromLStr() will return this saved +// Unicode string if it appears to receive the most recent result +// of LoadResString. +//-------------------------------------------------------------------- + + + //=========================================================================================== + // + // function CodeMatchesPatternForUnicode(...); + // + // GIVEN: SomeWideString := SSomeResString; { WideString := resourcestring } + // + // Delphi will compile this statement into the following: + // ------------------------------------------------- + // TempAnsiString := LoadResString(@SSomeResString); + // LINE 1: lea edx,[SomeTempAnsiString] + // LINE 2: mov eax,[@SomeResString] + // LINE 3: call LoadResString + // + // WStrFromLStr(SomeWideString, TempAnsiString); { SomeWideString := TempAnsiString } + // LINE 4: mov edx,[SomeTempAnsiString] + // LINE 5: mov/lea eax [@SomeWideString] + // LINE 6: call @WStrFromLStr + // ------------------------------------------------- + // + // The order in which the parameters are prepared for WStrFromLStr (ie LINE 4 & 5) is + // reversed when assigning a non-temporary AnsiString to a WideString. + // + // This code, for example, results in LINE 4 and LINE 5 being swapped. + // + // SomeAnsiString := SSomeResString; + // SomeWideString := SomeAnsiString; + // + // Since we know the "signature" used by the compiler, we can detect this pattern. + // If we believe it is only temporary, we can save the Unicode results for later + // retrieval from WStrFromLStr. + // + // One final note: When assigning a resourcestring to a Variant, the same patterns exist. + //=========================================================================================== + +function CodeMatchesPatternForUnicode(PLine4: PAnsiChar): Boolean; +const + SIZEOF_OPCODE = 1 {byte}; + MOV_16_OPCODE = AnsiChar($8B); { we'll assume operand size is 16 bits } + MOV_32_OPCODE = AnsiChar($B8); { we'll assume operand size is 32 bits } + LEA_OPCODE = AnsiChar($8D); { operand size can be 16 or 40 bits } + CALL_OPCODE = AnsiChar($E8); { assumed operand size is 32 bits } + BREAK_OPCODE = AnsiChar($CC); {in a breakpoint} +var + PLine1: PAnsiChar; + PLine2: PAnsiChar; + PLine3: PAnsiChar; + DataSize: Integer; // bytes in first LEA operand +begin + Result := False; + + PLine3 := PLine4 - SizeOf(CALL_OPCODE) - 4; + PLine2 := PLine3 - SizeOf(MOV_32_OPCODE) - 4; + + // figure PLine1 and operand size + DataSize := 2; { try 16 bit operand for line 1 } + PLine1 := PLine2 - DataSize - SizeOf(LEA_OPCODE); + if (PLine1^ <> LEA_OPCODE) and (not (IsDebugging and (PLine1^ = BREAK_OPCODE))) then + begin + DataSize := 5; { try 40 bit operand for line 1 } + PLine1 := PLine2 - DataSize - SizeOf(LEA_OPCODE); + end; + if (PLine1^ = LEA_OPCODE) or (IsDebugging and (PLine1^ = BREAK_OPCODE)) then + begin + if CompareMem(PLine1 + SIZEOF_OPCODE, PLine4 + SIZEOF_OPCODE, DataSize) then + begin + // After this check, it seems to match the WideString <- (temp) AnsiString pattern + Result := True; // It is probably OK. (The side effects of being wrong aren't very bad.) + end; + end; +end; + +threadvar + PLastResString: PAnsiChar; + LastResStringValue: AnsiString; + LastWideResString: WideString; + +procedure FreeTntSystemThreadVars; +begin + LastResStringValue := ''; + LastWideResString := ''; +end; + +procedure Custom_System_EndThread(ExitCode: Integer); +begin + FreeTntSystemThreadVars; + {$IFDEF COMPILER_10_UP} + if Assigned(SystemThreadEndProc) then + SystemThreadEndProc(ExitCode); + {$ENDIF} + ExitThread(ExitCode); +end; + +function Custom_System_LoadResString(ResStringRec: PResStringRec): AnsiString; +var + ReturnAddr: Pointer; +begin + // get return address + asm + PUSH ECX + MOV ECX, [EBP + 4] + MOV ReturnAddr, ECX + POP ECX + end; + // check calling code pattern + if CodeMatchesPatternForUnicode(ReturnAddr) then begin + // result will probably be assigned to an intermediate AnsiString + // on its way to either a WideString or Variant. + LastWideResString := WideLoadResString(ResStringRec); + Result := LastWideResString; + LastResStringValue := Result; + if Result = '' then + PLastResString := nil + else + PLastResString := PAnsiChar(Result); + end else begin + // result will probably be assigned to an actual AnsiString variable. + PLastResString := nil; + Result := WideLoadResString(ResStringRec); + end; +end; + +//-------------------------------------------------------------------- +// WStrFromPCharLen() +// +// This system function is used to assign an AnsiString to a WideString. +// It has been modified to assign Unicode results from LoadResString. +// Another purpose of this function is to specify the code page. +//-------------------------------------------------------------------- + +procedure Custom_System_WStrFromPCharLen(var Dest: WideString; Source: PAnsiChar; Length: Integer); +var + DestLen: Integer; + Buffer: array[0..2047] of WideChar; + Local_PLastResString: Pointer; +begin + Local_PLastResString := PLastResString; + if (Local_PLastResString <> nil) + and (Local_PLastResString = Source) + and (System.Length(LastResStringValue) = Length) + and (LastResStringValue = Source) then begin + // use last unicode resource string + PLastResString := nil; { clear for further use } + Dest := LastWideResString; + end else begin + if Local_PLastResString <> nil then + PLastResString := nil; { clear for further use } + if Length <= 0 then + begin + Dest := ''; + Exit; + end; + if Length + 1 < High(Buffer) then + begin + DestLen := MultiByteToWideChar(DefaultSystemCodePage, 0, Source, Length, Buffer, + High(Buffer)); + if DestLen > 0 then + begin + SetLength(Dest, DestLen); + Move(Pointer(@Buffer[0])^, Pointer(Dest)^, DestLen * SizeOf(WideChar)); + Exit; + end; + end; + DestLen := (Length + 1); + SetLength(Dest, DestLen); // overallocate, trim later + DestLen := MultiByteToWideChar(DefaultSystemCodePage, 0, Source, Length, Pointer(Dest), + DestLen); + if DestLen < 0 then + DestLen := 0; + SetLength(Dest, DestLen); + end; +end; + +{$IFNDEF COMPILER_9_UP} + +//-------------------------------------------------------------------- +// LStrFromPWCharLen() +// +// This system function is used to assign an WideString to an AnsiString. +// It has not been modified from its original purpose other than to specify the code page. +//-------------------------------------------------------------------- + +procedure Custom_System_LStrFromPWCharLen(var Dest: AnsiString; Source: PWideChar; Length: Integer); +var + DestLen: Integer; + Buffer: array[0..4095] of AnsiChar; +begin + if Length <= 0 then + begin + Dest := ''; + Exit; + end; + if Length + 1 < (High(Buffer) div sizeof(WideChar)) then + begin + DestLen := WideCharToMultiByte(DefaultSystemCodePage, 0, Source, + Length, Buffer, High(Buffer), + nil, nil); + if DestLen >= 0 then + begin + SetLength(Dest, DestLen); + Move(Pointer(@Buffer[0])^, PAnsiChar(Dest)^, DestLen); + Exit; + end; + end; + + DestLen := (Length + 1) * sizeof(WideChar); + SetLength(Dest, DestLen); // overallocate, trim later + DestLen := WideCharToMultiByte(DefaultSystemCodePage, 0, Source, Length, Pointer(Dest), DestLen, + nil, nil); + if DestLen < 0 then + DestLen := 0; + SetLength(Dest, DestLen); +end; + +//-------------------------------------------------------------------- +// WStrToString() +// +// This system function is used to assign an WideString to an short string. +// It has not been modified from its original purpose other than to specify the code page. +//-------------------------------------------------------------------- + +procedure Custom_System_WStrToString(Dest: PShortString; const Source: WideString; MaxLen: Integer); +var + SourceLen, DestLen: Integer; + Buffer: array[0..511] of AnsiChar; +begin + if MaxLen > 255 then MaxLen := 255; + SourceLen := Length(Source); + if SourceLen >= MaxLen then SourceLen := MaxLen; + if SourceLen = 0 then + DestLen := 0 + else begin + DestLen := WideCharToMultiByte(DefaultSystemCodePage, 0, Pointer(Source), SourceLen, + Buffer, SizeOf(Buffer), nil, nil); + if DestLen > MaxLen then DestLen := MaxLen; + end; + Dest^[0] := Chr(DestLen); + if DestLen > 0 then Move(Buffer, Dest^[1], DestLen); +end; + +{$ENDIF} + +//-------------------------------------------------------------------- +// VarFromLStr() +// +// This system function is used to assign an AnsiString to a Variant. +// It has been modified to assign Unicode results from LoadResString. +//-------------------------------------------------------------------- + +procedure Custom_System_VarFromLStr(var V: TVarData; const Value: AnsiString); +const + varDeepData = $BFE8; +var + Local_PLastResString: Pointer; +begin + if (V.VType and varDeepData) <> 0 then + VarClear(PVariant(@V)^); + + Local_PLastResString := PLastResString; + if (Local_PLastResString <> nil) + and (Local_PLastResString = PAnsiChar(Value)) + and (LastResStringValue = Value) then begin + // use last unicode resource string + PLastResString := nil; { clear for further use } + V.VOleStr := nil; + V.VType := varOleStr; + WideString(Pointer(V.VOleStr)) := Copy(LastWideResString, 1, MaxInt); + end else begin + if Local_PLastResString <> nil then + PLastResString := nil; { clear for further use } + V.VString := nil; + V.VType := varString; + AnsiString(V.VString) := Value; + end; +end; + +{$IFNDEF COMPILER_9_UP} + +//-------------------------------------------------------------------- +// WStrCat3() A := B + C; +// +// This system function is used to concatenate two strings into one result. +// This function is added because A := '' + '' doesn't necessarily result in A = ''; +//-------------------------------------------------------------------- + +procedure Custom_System_WStrCat3(var Dest: WideString; const Source1, Source2: WideString); + + function NewWideString(CharLength: Longint): Pointer; + var + _NewWideString: function(CharLength: Longint): Pointer; + begin + asm + PUSH ECX + MOV ECX, offset System.@NewWideString; + MOV _NewWideString, ECX + POP ECX + end; + Result := _NewWideString(CharLength); + end; + + procedure WStrSet(var S: WideString; P: PWideChar); + var + Temp: Pointer; + begin + Temp := Pointer(InterlockedExchange(Integer(S), Integer(P))); + if Temp <> nil then + WideString(Temp) := ''; + end; + +var + Source1Len, Source2Len: Integer; + NewStr: PWideChar; +begin + Source1Len := Length(Source1); + Source2Len := Length(Source2); + if (Source1Len <> 0) or (Source2Len <> 0) then + begin + NewStr := NewWideString(Source1Len + Source2Len); + Move(Pointer(Source1)^, Pointer(NewStr)^, Source1Len * sizeof(WideChar)); + Move(Pointer(Source2)^, NewStr[Source1Len], Source2Len * sizeof(WideChar)); + WStrSet(Dest, NewStr); + end else + Dest := ''; +end; + +{$ENDIF} + +//-------------------------------------------------------------------- +// System proc replacements +//-------------------------------------------------------------------- + +type + POverwrittenData = ^TOverwrittenData; + TOverwrittenData = record + Location: Pointer; + OldCode: array[0..6] of Byte; + end; + +procedure OverwriteProcedure(OldProcedure, NewProcedure: pointer; Data: POverwrittenData = nil); +{ OverwriteProcedure originally from Igor Siticov } +{ Modified by Jacques Garcia Vazquez } +var + x: PAnsiChar; + y: integer; + ov2, ov: cardinal; + p: pointer; +begin + if Assigned(Data) and (Data.Location <> nil) then + exit; { procedure already overwritten } + + // need six bytes in place of 5 + x := PAnsiChar(OldProcedure); + if not VirtualProtect(Pointer(x), 6, PAGE_EXECUTE_READWRITE, @ov) then + RaiseLastOSError; + + // if a jump is present then a redirect is found + // $FF25 = jmp dword ptr [xxx] + // This redirect is normally present in bpl files, but not in exe files + p := OldProcedure; + + if Word(p^) = $25FF then + begin + Inc(Integer(p), 2); // skip the jump + // get the jump address p^ and dereference it p^^ + p := Pointer(Pointer(p^)^); + + // release the memory + if not VirtualProtect(Pointer(x), 6, ov, @ov2) then + RaiseLastOSError; + + // re protect the correct one + x := PAnsiChar(p); + if not VirtualProtect(Pointer(x), 6, PAGE_EXECUTE_READWRITE, @ov) then + RaiseLastOSError; + end; + + if Assigned(Data) then + begin + Move(x^, Data.OldCode, 6); + { Assign Location last so that Location <> nil only if OldCode is properly initialized. } + Data.Location := x; + end; + + x[0] := AnsiChar($E9); + y := integer(NewProcedure) - integer(p) - 5; + x[1] := AnsiChar(y and 255); + x[2] := AnsiChar((y shr 8) and 255); + x[3] := AnsiChar((y shr 16) and 255); + x[4] := AnsiChar((y shr 24) and 255); + + if not VirtualProtect(Pointer(x), 6, ov, @ov2) then + RaiseLastOSError; +end; + +procedure RestoreProcedure(OriginalProc: Pointer; Data: TOverwrittenData); +var + ov, ov2: Cardinal; +begin + if Data.Location <> nil then begin + if not VirtualProtect(Data.Location, 6, PAGE_EXECUTE_READWRITE, @ov) then + RaiseLastOSError; + Move(Data.OldCode, Data.Location^, 6); + if not VirtualProtect(Data.Location, 6, ov, @ov2) then + RaiseLastOSError; + end; +end; + +function Addr_System_EndThread: Pointer; +begin + Result := @System.EndThread; +end; + +function Addr_System_LoadResString: Pointer; +begin + Result := @System.LoadResString{TNT-ALLOW LoadResString}; +end; + +function Addr_System_WStrFromPCharLen: Pointer; +asm + mov eax, offset System.@WStrFromPCharLen; +end; + +{$IFNDEF COMPILER_9_UP} +function Addr_System_LStrFromPWCharLen: Pointer; +asm + mov eax, offset System.@LStrFromPWCharLen; +end; + +function Addr_System_WStrToString: Pointer; +asm + mov eax, offset System.@WStrToString; +end; +{$ENDIF} + +function Addr_System_VarFromLStr: Pointer; +asm + mov eax, offset System.@VarFromLStr; +end; + +function Addr_System_WStrCat3: Pointer; +asm + mov eax, offset System.@WStrCat3; +end; + +var + System_EndThread_Code, + System_LoadResString_Code, + System_WStrFromPCharLen_Code, + {$IFNDEF COMPILER_9_UP} + System_LStrFromPWCharLen_Code, + System_WStrToString_Code, + {$ENDIF} + System_VarFromLStr_Code + {$IFNDEF COMPILER_9_UP} + , + System_WStrCat3_Code, + SysUtils_WideFmtStr_Code + {$ENDIF} + : TOverwrittenData; + +procedure InstallEndThreadOverride; +begin + OverwriteProcedure(Addr_System_EndThread, @Custom_System_EndThread, @System_EndThread_Code); +end; + +procedure InstallStringConversionOverrides; +begin + OverwriteProcedure(Addr_System_WStrFromPCharLen, @Custom_System_WStrFromPCharLen, @System_WStrFromPCharLen_Code); + {$IFNDEF COMPILER_9_UP} + OverwriteProcedure(Addr_System_LStrFromPWCharLen, @Custom_System_LStrFromPWCharLen, @System_LStrFromPWCharLen_Code); + OverwriteProcedure(Addr_System_WStrToString, @Custom_System_WStrToString, @System_WStrToString_Code); + {$ENDIF} +end; + +procedure InstallWideResourceStrings; +begin + OverwriteProcedure(Addr_System_LoadResString, @Custom_System_LoadResString, @System_LoadResString_Code); + OverwriteProcedure(Addr_System_VarFromLStr, @Custom_System_VarFromLStr, @System_VarFromLStr_Code); +end; + +{$IFNDEF COMPILER_9_UP} +procedure InstallWideStringConcatenationFix; +begin + OverwriteProcedure(Addr_System_WStrCat3, @Custom_System_WStrCat3, @System_WStrCat3_Code); +end; + +procedure InstallWideFormatFixes; +begin + OverwriteProcedure(@SysUtils.WideFmtStr, @TntSysUtils.Tnt_WideFmtStr, @SysUtils_WideFmtStr_Code); +end; +{$ENDIF} + +procedure InstallTntSystemUpdates(Updates: TTntSystemUpdateSet = AllTntSystemUpdates); +begin + InstallEndThreadOverride; + if tsWideResourceStrings in Updates then begin + InstallStringConversionOverrides; + InstallWideResourceStrings; + end; + {$IFNDEF COMPILER_9_UP} + if tsFixImplicitCodePage in Updates then begin + InstallStringConversionOverrides; + { CP_ACP is the code page used by the non-Unicode Windows API. } + GDefaultSystemCodePage := CP_ACP{TNT-ALLOW CP_ACP}; + end; + if tsFixWideStrConcat in Updates then begin + InstallWideStringConcatenationFix; + end; + if tsFixWideFormat in Updates then begin + InstallWideFormatFixes; + end; + {$ENDIF} +end; + +{$IFNDEF COMPILER_9_UP} +var + StartupDefaultUserCodePage: Cardinal; +{$ENDIF} + +procedure UninstallSystemOverrides; +begin + RestoreProcedure(Addr_System_EndThread, System_EndThread_Code); + // String Conversion + RestoreProcedure(Addr_System_WStrFromPCharLen, System_WStrFromPCharLen_Code); + {$IFNDEF COMPILER_9_UP} + RestoreProcedure(Addr_System_LStrFromPWCharLen, System_LStrFromPWCharLen_Code); + RestoreProcedure(Addr_System_WStrToString, System_WStrToString_Code); + GDefaultSystemCodePage := StartupDefaultUserCodePage; + {$ENDIF} + // Wide resourcestring + RestoreProcedure(Addr_System_LoadResString, System_LoadResString_Code); + RestoreProcedure(Addr_System_VarFromLStr, System_VarFromLStr_Code); + {$IFNDEF COMPILER_9_UP} + // WideString concat fix + RestoreProcedure(Addr_System_WStrCat3, System_WStrCat3_Code); + // WideFormat fixes + RestoreProcedure(@SysUtils.WideFmtStr, SysUtils_WideFmtStr_Code); + {$ENDIF} +end; + +initialization + {$IFDEF COMPILER_9_UP} + GDefaultSystemCodePage := GetACP; + {$ELSE} + {$IFDEF COMPILER_7_UP} + if (Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion >= 5) then + GDefaultSystemCodePage := CP_THREAD_ACP // Win 2K/XP/... + else + GDefaultSystemCodePage := LCIDToCodePage(GetThreadLocale); // Win NT4/95/98/ME + {$ELSE} + GDefaultSystemCodePage := CP_ACP{TNT-ALLOW CP_ACP}; + {$ENDIF} + {$ENDIF} + {$IFNDEF COMPILER_9_UP} + StartupDefaultUserCodePage := DefaultSystemCodePage; + {$ENDIF} + IsDebugging := DebugHook > 0; + +finalization + UninstallSystemOverrides; + FreeTntSystemThreadVars; { Make MemorySleuth happy. } + +end. diff --git a/internal/1/Source/TntWideStrUtils.pas b/internal/1/Source/TntWideStrUtils.pas new file mode 100644 index 0000000..02a64bb --- /dev/null +++ b/internal/1/Source/TntWideStrUtils.pas @@ -0,0 +1,451 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntWideStrUtils; + +{$INCLUDE TntCompilers.inc} + +interface + +{ Wide string manipulation functions } + +{$IFNDEF COMPILER_9_UP} +function WStrAlloc(Size: Cardinal): PWideChar; +function WStrBufSize(const Str: PWideChar): Cardinal; +{$ENDIF} +{$IFNDEF COMPILER_10_UP} +function WStrMove(Dest: PWideChar; const Source: PWideChar; Count: Cardinal): PWideChar; +{$ENDIF} +{$IFNDEF COMPILER_9_UP} +function WStrNew(const Str: PWideChar): PWideChar; +procedure WStrDispose(Str: PWideChar); +{$ENDIF} +//--------------------------------------------------------------------------------------------- +{$IFNDEF COMPILER_9_UP} +function WStrLen(Str: PWideChar): Cardinal; +function WStrEnd(Str: PWideChar): PWideChar; +{$ENDIF} +{$IFNDEF COMPILER_10_UP} +function WStrCat(Dest: PWideChar; const Source: PWideChar): PWideChar; +{$ENDIF} +{$IFNDEF COMPILER_9_UP} +function WStrCopy(Dest, Source: PWideChar): PWideChar; +function WStrLCopy(Dest, Source: PWideChar; MaxLen: Cardinal): PWideChar; +function WStrPCopy(Dest: PWideChar; const Source: WideString): PWideChar; +function WStrPLCopy(Dest: PWideChar; const Source: WideString; MaxLen: Cardinal): PWideChar; +{$ENDIF} +{$IFNDEF COMPILER_10_UP} +function WStrScan(const Str: PWideChar; Chr: WideChar): PWideChar; +// WStrComp and WStrPos were introduced as broken in Delphi 2006, but fixed in Delphi 2006 Update 2 +function WStrComp(Str1, Str2: PWideChar): Integer; +function WStrPos(Str, SubStr: PWideChar): PWideChar; +{$ENDIF} +function Tnt_WStrComp(Str1, Str2: PWideChar): Integer; deprecated; +function Tnt_WStrPos(Str, SubStr: PWideChar): PWideChar; deprecated; + +{ ------------ introduced --------------- } +function WStrECopy(Dest, Source: PWideChar): PWideChar; +function WStrLComp(Str1, Str2: PWideChar; MaxLen: Cardinal): Integer; +function WStrLIComp(Str1, Str2: PWideChar; MaxLen: Cardinal): Integer; +function WStrIComp(Str1, Str2: PWideChar): Integer; +function WStrLower(Str: PWideChar): PWideChar; +function WStrUpper(Str: PWideChar): PWideChar; +function WStrRScan(const Str: PWideChar; Chr: WideChar): PWideChar; +function WStrLCat(Dest: PWideChar; const Source: PWideChar; MaxLen: Cardinal): PWideChar; +function WStrPas(const Str: PWideChar): WideString; + +{ SysUtils.pas } //------------------------------------------------------------------------- + +{$IFNDEF COMPILER_10_UP} +function WideLastChar(const S: WideString): PWideChar; +function WideQuotedStr(const S: WideString; Quote: WideChar): WideString; +{$ENDIF} +{$IFNDEF COMPILER_9_UP} +function WideExtractQuotedStr(var Src: PWideChar; Quote: WideChar): Widestring; +{$ENDIF} +{$IFNDEF COMPILER_10_UP} +function WideDequotedStr(const S: WideString; AQuote: WideChar): WideString; +{$ENDIF} + +implementation + +uses + {$IFDEF COMPILER_9_UP} WideStrUtils, {$ENDIF} Math, Windows, TntWindows; + +{$IFNDEF COMPILER_9_UP} +function WStrAlloc(Size: Cardinal): PWideChar; +begin + Size := SizeOf(Cardinal) + (Size * SizeOf(WideChar)); + GetMem(Result, Size); + PCardinal(Result)^ := Size; + Inc(PAnsiChar(Result), SizeOf(Cardinal)); +end; + +function WStrBufSize(const Str: PWideChar): Cardinal; +var + P: PWideChar; +begin + P := Str; + Dec(PAnsiChar(P), SizeOf(Cardinal)); + Result := PCardinal(P)^ - SizeOf(Cardinal); + Result := Result div SizeOf(WideChar); +end; +{$ENDIF} + +{$IFNDEF COMPILER_10_UP} +function WStrMove(Dest: PWideChar; const Source: PWideChar; Count: Cardinal): PWideChar; +var + Length: Integer; +begin + Result := Dest; + Length := Count * SizeOf(WideChar); + Move(Source^, Dest^, Length); +end; +{$ENDIF} + +{$IFNDEF COMPILER_9_UP} +function WStrNew(const Str: PWideChar): PWideChar; +var + Size: Cardinal; +begin + if Str = nil then Result := nil else + begin + Size := WStrLen(Str) + 1; + Result := WStrMove(WStrAlloc(Size), Str, Size); + end; +end; + +procedure WStrDispose(Str: PWideChar); +begin + if Str <> nil then + begin + Dec(PAnsiChar(Str), SizeOf(Cardinal)); + FreeMem(Str, Cardinal(Pointer(Str)^)); + end; +end; +{$ENDIF} + +//--------------------------------------------------------------------------------------------- + +{$IFNDEF COMPILER_9_UP} +function WStrLen(Str: PWideChar): Cardinal; +begin + Result := WStrEnd(Str) - Str; +end; + +function WStrEnd(Str: PWideChar): PWideChar; +begin + // returns a pointer to the end of a null terminated string + Result := Str; + While Result^ <> #0 do + Inc(Result); +end; +{$ENDIF} + +{$IFNDEF COMPILER_10_UP} +function WStrCat(Dest: PWideChar; const Source: PWideChar): PWideChar; +begin + Result := Dest; + WStrCopy(WStrEnd(Dest), Source); +end; +{$ENDIF} + +{$IFNDEF COMPILER_9_UP} +function WStrCopy(Dest, Source: PWideChar): PWideChar; +begin + Result := WStrLCopy(Dest, Source, MaxInt); +end; + +function WStrLCopy(Dest, Source: PWideChar; MaxLen: Cardinal): PWideChar; +var + Count: Cardinal; +begin + // copies a specified maximum number of characters from Source to Dest + Result := Dest; + Count := 0; + While (Count < MaxLen) and (Source^ <> #0) do begin + Dest^ := Source^; + Inc(Source); + Inc(Dest); + Inc(Count); + end; + Dest^ := #0; +end; + +function WStrPCopy(Dest: PWideChar; const Source: WideString): PWideChar; +begin + Result := WStrLCopy(Dest, PWideChar(Source), Length(Source)); +end; + +function WStrPLCopy(Dest: PWideChar; const Source: WideString; MaxLen: Cardinal): PWideChar; +begin + Result := WStrLCopy(Dest, PWideChar(Source), MaxLen); +end; +{$ENDIF} + +{$IFNDEF COMPILER_10_UP} +function WStrScan(const Str: PWideChar; Chr: WideChar): PWideChar; +begin + Result := Str; + while Result^ <> Chr do + begin + if Result^ = #0 then + begin + Result := nil; + Exit; + end; + Inc(Result); + end; +end; + +function WStrComp(Str1, Str2: PWideChar): Integer; +begin + Result := WStrLComp(Str1, Str2, MaxInt); +end; + +function WStrPos(Str, SubStr: PWideChar): PWideChar; +var + PSave: PWideChar; + P: PWideChar; + PSub: PWideChar; +begin + // returns a pointer to the first occurance of SubStr in Str + Result := nil; + if (Str <> nil) and (Str^ <> #0) and (SubStr <> nil) and (SubStr^ <> #0) then begin + P := Str; + While P^ <> #0 do begin + if P^ = SubStr^ then begin + // investigate possibility here + PSave := P; + PSub := SubStr; + While (P^ = PSub^) do begin + Inc(P); + Inc(PSub); + if (PSub^ = #0) then begin + Result := PSave; + exit; // found a match + end; + if (P^ = #0) then + exit; // no match, hit end of string + end; + P := PSave; + end; + Inc(P); + end; + end; +end; +{$ENDIF} + +function Tnt_WStrComp(Str1, Str2: PWideChar): Integer; deprecated; +begin + Result := WStrComp(Str1, Str2); +end; + +function Tnt_WStrPos(Str, SubStr: PWideChar): PWideChar; deprecated; +begin + Result := WStrPos(Str, SubStr); +end; + +//------------------------------------------------------------------------------ + +function WStrECopy(Dest, Source: PWideChar): PWideChar; +begin + Result := WStrEnd(WStrCopy(Dest, Source)); +end; + +function WStrComp_EX(Str1, Str2: PWideChar; MaxLen: Cardinal; dwCmpFlags: Cardinal): Integer; +var + Len1, Len2: Integer; +begin + if MaxLen = Cardinal(MaxInt) then begin + Len1 := -1; + Len2 := -1; + end else begin + Len1 := Min(WStrLen(Str1), MaxLen); + Len2 := Min(WStrLen(Str2), MaxLen); + end; + Result := Tnt_CompareStringW(GetThreadLocale, dwCmpFlags, Str1, Len1, Str2, Len2) - 2; +end; + +function WStrLComp(Str1, Str2: PWideChar; MaxLen: Cardinal): Integer; +begin + Result := WStrComp_EX(Str1, Str2, MaxLen, 0); +end; + +function WStrLIComp(Str1, Str2: PWideChar; MaxLen: Cardinal): Integer; +begin + Result := WStrComp_EX(Str1, Str2, MaxLen, NORM_IGNORECASE); +end; + +function WStrIComp(Str1, Str2: PWideChar): Integer; +begin + Result := WStrLIComp(Str1, Str2, MaxInt); +end; + +function WStrLower(Str: PWideChar): PWideChar; +begin + Result := Str; + Tnt_CharLowerBuffW(Str, WStrLen(Str)) +end; + +function WStrUpper(Str: PWideChar): PWideChar; +begin + Result := Str; + Tnt_CharUpperBuffW(Str, WStrLen(Str)) +end; + +function WStrRScan(const Str: PWideChar; Chr: WideChar): PWideChar; +var + MostRecentFound: PWideChar; +begin + if Chr = #0 then + Result := WStrEnd(Str) + else + begin + Result := nil; + MostRecentFound := Str; + while True do + begin + while MostRecentFound^ <> Chr do + begin + if MostRecentFound^ = #0 then + Exit; + Inc(MostRecentFound); + end; + Result := MostRecentFound; + Inc(MostRecentFound); + end; + end; +end; + +function WStrLCat(Dest: PWideChar; const Source: PWideChar; MaxLen: Cardinal): PWideChar; +begin + Result := Dest; + WStrLCopy(WStrEnd(Dest), Source, MaxLen - WStrLen(Dest)); +end; + +function WStrPas(const Str: PWideChar): WideString; +begin + Result := Str; +end; + +//--------------------------------------------------------------------------------------------- + +{$IFNDEF COMPILER_10_UP} +function WideLastChar(const S: WideString): PWideChar; +begin + if S = '' then + Result := nil + else + Result := @S[Length(S)]; +end; + +function WideQuotedStr(const S: WideString; Quote: WideChar): WideString; +var + P, Src, + Dest: PWideChar; + AddCount: Integer; +begin + AddCount := 0; + P := WStrScan(PWideChar(S), Quote); + while (P <> nil) do + begin + Inc(P); + Inc(AddCount); + P := WStrScan(P, Quote); + end; + + if AddCount = 0 then + Result := Quote + S + Quote + else + begin + SetLength(Result, Length(S) + AddCount + 2); + Dest := PWideChar(Result); + Dest^ := Quote; + Inc(Dest); + Src := PWideChar(S); + P := WStrScan(Src, Quote); + repeat + Inc(P); + Move(Src^, Dest^, 2 * (P - Src)); + Inc(Dest, P - Src); + Dest^ := Quote; + Inc(Dest); + Src := P; + P := WStrScan(Src, Quote); + until P = nil; + P := WStrEnd(Src); + Move(Src^, Dest^, 2 * (P - Src)); + Inc(Dest, P - Src); + Dest^ := Quote; + end; +end; +{$ENDIF} + +{$IFNDEF COMPILER_9_UP} +function WideExtractQuotedStr(var Src: PWideChar; Quote: WideChar): Widestring; +var + P, Dest: PWideChar; + DropCount: Integer; +begin + Result := ''; + if (Src = nil) or (Src^ <> Quote) then Exit; + Inc(Src); + DropCount := 1; + P := Src; + Src := WStrScan(Src, Quote); + while Src <> nil do // count adjacent pairs of quote chars + begin + Inc(Src); + if Src^ <> Quote then Break; + Inc(Src); + Inc(DropCount); + Src := WStrScan(Src, Quote); + end; + if Src = nil then Src := WStrEnd(P); + if ((Src - P) <= 1) then Exit; + if DropCount = 1 then + SetString(Result, P, Src - P - 1) + else + begin + SetLength(Result, Src - P - DropCount); + Dest := PWideChar(Result); + Src := WStrScan(P, Quote); + while Src <> nil do + begin + Inc(Src); + if Src^ <> Quote then Break; + Move(P^, Dest^, (Src - P) * SizeOf(WideChar)); + Inc(Dest, Src - P); + Inc(Src); + P := Src; + Src := WStrScan(Src, Quote); + end; + if Src = nil then Src := WStrEnd(P); + Move(P^, Dest^, (Src - P - 1) * SizeOf(WideChar)); + end; +end; +{$ENDIF} + +{$IFNDEF COMPILER_10_UP} +function WideDequotedStr(const S: WideString; AQuote: WideChar): WideString; +var + LText : PWideChar; +begin + LText := PWideChar(S); + Result := WideExtractQuotedStr(LText, AQuote); + if Result = '' then + Result := S; +end; +{$ENDIF} + + +end. diff --git a/internal/1/Source/TntWideStrings.pas b/internal/1/Source/TntWideStrings.pas new file mode 100644 index 0000000..dfe3755 --- /dev/null +++ b/internal/1/Source/TntWideStrings.pas @@ -0,0 +1,831 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntWideStrings; + +{$INCLUDE TntCompilers.inc} + +interface + +{$IFDEF COMPILER_10_UP} + {$MESSAGE FATAL 'Do not refer to TntWideStrings.pas. It works correctly in Delphi 2006.'} +{$ENDIF} + +uses + Classes; + +{******************************************************************************} +{ } +{ Delphi 2005 introduced TWideStrings in WideStrings.pas. } +{ Unfortunately, it was not ready for prime time. } +{ Setting CommaText is not consistent, and it relies on CharNextW } +{ Which is only available on Windows NT+. } +{ } +{******************************************************************************} + +type + TWideStrings = class; + +{ IWideStringsAdapter interface } +{ Maintains link between TWideStrings and IWideStrings implementations } + + IWideStringsAdapter = interface + ['{25FE0E3B-66CB-48AA-B23B-BCFA67E8F5DA}'] + procedure ReferenceStrings(S: TWideStrings); + procedure ReleaseStrings; + end; + + TWideStringsEnumerator = class + private + FIndex: Integer; + FStrings: TWideStrings; + public + constructor Create(AStrings: TWideStrings); + function GetCurrent: WideString; + function MoveNext: Boolean; + property Current: WideString read GetCurrent; + end; + +{ TWideStrings class } + + TWideStrings = class(TPersistent) + private + FDefined: TStringsDefined; + FDelimiter: WideChar; + FQuoteChar: WideChar; + {$IFDEF COMPILER_7_UP} + FNameValueSeparator: WideChar; + {$ENDIF} + FUpdateCount: Integer; + FAdapter: IWideStringsAdapter; + function GetCommaText: WideString; + function GetDelimitedText: WideString; + function GetName(Index: Integer): WideString; + function GetValue(const Name: WideString): WideString; + procedure ReadData(Reader: TReader); + procedure SetCommaText(const Value: WideString); + procedure SetDelimitedText(const Value: WideString); + procedure SetStringsAdapter(const Value: IWideStringsAdapter); + procedure SetValue(const Name, Value: WideString); + procedure WriteData(Writer: TWriter); + function GetDelimiter: WideChar; + procedure SetDelimiter(const Value: WideChar); + function GetQuoteChar: WideChar; + procedure SetQuoteChar(const Value: WideChar); + function GetNameValueSeparator: WideChar; + {$IFDEF COMPILER_7_UP} + procedure SetNameValueSeparator(const Value: WideChar); + {$ENDIF} + function GetValueFromIndex(Index: Integer): WideString; + procedure SetValueFromIndex(Index: Integer; const Value: WideString); + protected + procedure AssignTo(Dest: TPersistent); override; + procedure DefineProperties(Filer: TFiler); override; + procedure Error(const Msg: WideString; Data: Integer); overload; + procedure Error(Msg: PResStringRec; Data: Integer); overload; + function ExtractName(const S: WideString): WideString; + function Get(Index: Integer): WideString; virtual; abstract; + function GetCapacity: Integer; virtual; + function GetCount: Integer; virtual; abstract; + function GetObject(Index: Integer): TObject; virtual; + function GetTextStr: WideString; virtual; + procedure Put(Index: Integer; const S: WideString); virtual; + procedure PutObject(Index: Integer; AObject: TObject); virtual; + procedure SetCapacity(NewCapacity: Integer); virtual; + procedure SetTextStr(const Value: WideString); virtual; + procedure SetUpdateState(Updating: Boolean); virtual; + property UpdateCount: Integer read FUpdateCount; + function CompareStrings(const S1, S2: WideString): Integer; virtual; + public + destructor Destroy; override; + function Add(const S: WideString): Integer; virtual; + function AddObject(const S: WideString; AObject: TObject): Integer; virtual; + procedure Append(const S: WideString); + procedure AddStrings(Strings: TStrings{TNT-ALLOW TStrings}); overload; virtual; + procedure AddStrings(Strings: TWideStrings); overload; virtual; + procedure Assign(Source: TPersistent); override; + procedure BeginUpdate; + procedure Clear; virtual; abstract; + procedure Delete(Index: Integer); virtual; abstract; + procedure EndUpdate; + function Equals(Strings: TWideStrings): Boolean; + procedure Exchange(Index1, Index2: Integer); virtual; + function GetEnumerator: TWideStringsEnumerator; + function GetTextW: PWideChar; virtual; + function IndexOf(const S: WideString): Integer; virtual; + function IndexOfName(const Name: WideString): Integer; virtual; + function IndexOfObject(AObject: TObject): Integer; virtual; + procedure Insert(Index: Integer; const S: WideString); virtual; abstract; + procedure InsertObject(Index: Integer; const S: WideString; + AObject: TObject); virtual; + procedure LoadFromFile(const FileName: WideString); virtual; + procedure LoadFromStream(Stream: TStream); virtual; + procedure Move(CurIndex, NewIndex: Integer); virtual; + procedure SaveToFile(const FileName: WideString); virtual; + procedure SaveToStream(Stream: TStream); virtual; + procedure SetTextW(const Text: PWideChar); virtual; + property Capacity: Integer read GetCapacity write SetCapacity; + property CommaText: WideString read GetCommaText write SetCommaText; + property Count: Integer read GetCount; + property Delimiter: WideChar read GetDelimiter write SetDelimiter; + property DelimitedText: WideString read GetDelimitedText write SetDelimitedText; + property Names[Index: Integer]: WideString read GetName; + property Objects[Index: Integer]: TObject read GetObject write PutObject; + property QuoteChar: WideChar read GetQuoteChar write SetQuoteChar; + property Values[const Name: WideString]: WideString read GetValue write SetValue; + property ValueFromIndex[Index: Integer]: WideString read GetValueFromIndex write SetValueFromIndex; + property NameValueSeparator: WideChar read GetNameValueSeparator {$IFDEF COMPILER_7_UP} write SetNameValueSeparator {$ENDIF}; + property Strings[Index: Integer]: WideString read Get write Put; default; + property Text: WideString read GetTextStr write SetTextStr; + property StringsAdapter: IWideStringsAdapter read FAdapter write SetStringsAdapter; + end; + + PWideStringItem = ^TWideStringItem; + TWideStringItem = record + FString: WideString; + FObject: TObject; + end; + + PWideStringItemList = ^TWideStringItemList; + TWideStringItemList = array[0..MaxListSize] of TWideStringItem; + +implementation + +uses + Windows, SysUtils, TntSystem, {$IFDEF COMPILER_9_UP} WideStrUtils, {$ELSE} TntWideStrUtils, {$ENDIF} + TntSysUtils, TntClasses; + +{ TWideStringsEnumerator } + +constructor TWideStringsEnumerator.Create(AStrings: TWideStrings); +begin + inherited Create; + FIndex := -1; + FStrings := AStrings; +end; + +function TWideStringsEnumerator.GetCurrent: WideString; +begin + Result := FStrings[FIndex]; +end; + +function TWideStringsEnumerator.MoveNext: Boolean; +begin + Result := FIndex < FStrings.Count - 1; + if Result then + Inc(FIndex); +end; + +{ TWideStrings } + +destructor TWideStrings.Destroy; +begin + StringsAdapter := nil; + inherited; +end; + +function TWideStrings.Add(const S: WideString): Integer; +begin + Result := GetCount; + Insert(Result, S); +end; + +function TWideStrings.AddObject(const S: WideString; AObject: TObject): Integer; +begin + Result := Add(S); + PutObject(Result, AObject); +end; + +procedure TWideStrings.Append(const S: WideString); +begin + Add(S); +end; + +procedure TWideStrings.AddStrings(Strings: TStrings{TNT-ALLOW TStrings}); +var + I: Integer; +begin + BeginUpdate; + try + for I := 0 to Strings.Count - 1 do + AddObject(Strings[I], Strings.Objects[I]); + finally + EndUpdate; + end; +end; + +procedure TWideStrings.AddStrings(Strings: TWideStrings); +var + I: Integer; +begin + BeginUpdate; + try + for I := 0 to Strings.Count - 1 do + AddObject(Strings[I], Strings.Objects[I]); + finally + EndUpdate; + end; +end; + +procedure TWideStrings.Assign(Source: TPersistent); +begin + if Source is TWideStrings then + begin + BeginUpdate; + try + Clear; + FDefined := TWideStrings(Source).FDefined; + {$IFDEF COMPILER_7_UP} + FNameValueSeparator := TWideStrings(Source).FNameValueSeparator; + {$ENDIF} + FQuoteChar := TWideStrings(Source).FQuoteChar; + FDelimiter := TWideStrings(Source).FDelimiter; + AddStrings(TWideStrings(Source)); + finally + EndUpdate; + end; + end + else if Source is TStrings{TNT-ALLOW TStrings} then + begin + BeginUpdate; + try + Clear; + {$IFDEF COMPILER_7_UP} + FNameValueSeparator := WideChar(TStrings{TNT-ALLOW TStrings}(Source).NameValueSeparator); + {$ENDIF} + FQuoteChar := WideChar(TStrings{TNT-ALLOW TStrings}(Source).QuoteChar); + FDelimiter := WideChar(TStrings{TNT-ALLOW TStrings}(Source).Delimiter); + AddStrings(TStrings{TNT-ALLOW TStrings}(Source)); + finally + EndUpdate; + end; + end + else + inherited Assign(Source); +end; + +procedure TWideStrings.AssignTo(Dest: TPersistent); +var + I: Integer; +begin + if Dest is TWideStrings then Dest.Assign(Self) + else if Dest is TStrings{TNT-ALLOW TStrings} then + begin + TStrings{TNT-ALLOW TStrings}(Dest).BeginUpdate; + try + TStrings{TNT-ALLOW TStrings}(Dest).Clear; + {$IFDEF COMPILER_7_UP} + TStrings{TNT-ALLOW TStrings}(Dest).NameValueSeparator := AnsiChar(NameValueSeparator); + {$ENDIF} + TStrings{TNT-ALLOW TStrings}(Dest).QuoteChar := AnsiChar(QuoteChar); + TStrings{TNT-ALLOW TStrings}(Dest).Delimiter := AnsiChar(Delimiter); + for I := 0 to Count - 1 do + TStrings{TNT-ALLOW TStrings}(Dest).AddObject(Strings[I], Objects[I]); + finally + TStrings{TNT-ALLOW TStrings}(Dest).EndUpdate; + end; + end + else + inherited AssignTo(Dest); +end; + +procedure TWideStrings.BeginUpdate; +begin + if FUpdateCount = 0 then SetUpdateState(True); + Inc(FUpdateCount); +end; + +procedure TWideStrings.DefineProperties(Filer: TFiler); + + function DoWrite: Boolean; + begin + if Filer.Ancestor <> nil then + begin + Result := True; + if Filer.Ancestor is TWideStrings then + Result := not Equals(TWideStrings(Filer.Ancestor)) + end + else Result := Count > 0; + end; + +begin + Filer.DefineProperty('Strings', ReadData, WriteData, DoWrite); +end; + +procedure TWideStrings.EndUpdate; +begin + Dec(FUpdateCount); + if FUpdateCount = 0 then SetUpdateState(False); +end; + +function TWideStrings.Equals(Strings: TWideStrings): Boolean; +var + I, Count: Integer; +begin + Result := False; + Count := GetCount; + if Count <> Strings.GetCount then Exit; + for I := 0 to Count - 1 do if Get(I) <> Strings.Get(I) then Exit; + Result := True; +end; + +procedure TWideStrings.Error(const Msg: WideString; Data: Integer); + + function ReturnAddr: Pointer; + asm + MOV EAX,[EBP+4] + end; + +begin + raise EStringListError.CreateFmt(Msg, [Data]) at ReturnAddr; +end; + +procedure TWideStrings.Error(Msg: PResStringRec; Data: Integer); +begin + Error(WideLoadResString(Msg), Data); +end; + +procedure TWideStrings.Exchange(Index1, Index2: Integer); +var + TempObject: TObject; + TempString: WideString; +begin + BeginUpdate; + try + TempString := Strings[Index1]; + TempObject := Objects[Index1]; + Strings[Index1] := Strings[Index2]; + Objects[Index1] := Objects[Index2]; + Strings[Index2] := TempString; + Objects[Index2] := TempObject; + finally + EndUpdate; + end; +end; + +function TWideStrings.ExtractName(const S: WideString): WideString; +var + P: Integer; +begin + Result := S; + P := Pos(NameValueSeparator, Result); + if P <> 0 then + SetLength(Result, P-1) else + SetLength(Result, 0); +end; + +function TWideStrings.GetCapacity: Integer; +begin // descendents may optionally override/replace this default implementation + Result := Count; +end; + +function TWideStrings.GetCommaText: WideString; +var + LOldDefined: TStringsDefined; + LOldDelimiter: WideChar; + LOldQuoteChar: WideChar; +begin + LOldDefined := FDefined; + LOldDelimiter := FDelimiter; + LOldQuoteChar := FQuoteChar; + Delimiter := ','; + QuoteChar := '"'; + try + Result := GetDelimitedText; + finally + FDelimiter := LOldDelimiter; + FQuoteChar := LOldQuoteChar; + FDefined := LOldDefined; + end; +end; + +function TWideStrings.GetDelimitedText: WideString; +var + S: WideString; + P: PWideChar; + I, Count: Integer; +begin + Count := GetCount; + if (Count = 1) and (Get(0) = '') then + Result := WideString(QuoteChar) + QuoteChar + else + begin + Result := ''; + for I := 0 to Count - 1 do + begin + S := Get(I); + P := PWideChar(S); + while not ((P^ in [WideChar(#0)..WideChar(' ')]) or (P^ = QuoteChar) or (P^ = Delimiter)) do + Inc(P); + if (P^ <> #0) then S := WideQuotedStr(S, QuoteChar); + Result := Result + S + Delimiter; + end; + System.Delete(Result, Length(Result), 1); + end; +end; + +function TWideStrings.GetName(Index: Integer): WideString; +begin + Result := ExtractName(Get(Index)); +end; + +function TWideStrings.GetObject(Index: Integer): TObject; +begin + Result := nil; +end; + +function TWideStrings.GetEnumerator: TWideStringsEnumerator; +begin + Result := TWideStringsEnumerator.Create(Self); +end; + +function TWideStrings.GetTextW: PWideChar; +begin + Result := WStrNew(PWideChar(GetTextStr)); +end; + +function TWideStrings.GetTextStr: WideString; +var + I, L, Size, Count: Integer; + P: PWideChar; + S, LB: WideString; +begin + Count := GetCount; + Size := 0; + LB := sLineBreak; + for I := 0 to Count - 1 do Inc(Size, Length(Get(I)) + Length(LB)); + SetString(Result, nil, Size); + P := Pointer(Result); + for I := 0 to Count - 1 do + begin + S := Get(I); + L := Length(S); + if L <> 0 then + begin + System.Move(Pointer(S)^, P^, L * SizeOf(WideChar)); + Inc(P, L); + end; + L := Length(LB); + if L <> 0 then + begin + System.Move(Pointer(LB)^, P^, L * SizeOf(WideChar)); + Inc(P, L); + end; + end; +end; + +function TWideStrings.GetValue(const Name: WideString): WideString; +var + I: Integer; +begin + I := IndexOfName(Name); + if I >= 0 then + Result := Copy(Get(I), Length(Name) + 2, MaxInt) else + Result := ''; +end; + +function TWideStrings.IndexOf(const S: WideString): Integer; +begin + for Result := 0 to GetCount - 1 do + if CompareStrings(Get(Result), S) = 0 then Exit; + Result := -1; +end; + +function TWideStrings.IndexOfName(const Name: WideString): Integer; +var + P: Integer; + S: WideString; +begin + for Result := 0 to GetCount - 1 do + begin + S := Get(Result); + P := Pos(NameValueSeparator, S); + if (P <> 0) and (CompareStrings(Copy(S, 1, P - 1), Name) = 0) then Exit; + end; + Result := -1; +end; + +function TWideStrings.IndexOfObject(AObject: TObject): Integer; +begin + for Result := 0 to GetCount - 1 do + if GetObject(Result) = AObject then Exit; + Result := -1; +end; + +procedure TWideStrings.InsertObject(Index: Integer; const S: WideString; + AObject: TObject); +begin + Insert(Index, S); + PutObject(Index, AObject); +end; + +procedure TWideStrings.LoadFromFile(const FileName: WideString); +var + Stream: TStream; +begin + Stream := TTntFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); + try + LoadFromStream(Stream); + finally + Stream.Free; + end; +end; + +procedure TWideStrings.LoadFromStream(Stream: TStream); +var + Size: Integer; + S: WideString; +begin + BeginUpdate; + try + Size := Stream.Size - Stream.Position; + SetString(S, nil, Size div SizeOf(WideChar)); + Stream.Read(Pointer(S)^, Length(S) * SizeOf(WideChar)); + SetTextStr(S); + finally + EndUpdate; + end; +end; + +procedure TWideStrings.Move(CurIndex, NewIndex: Integer); +var + TempObject: TObject; + TempString: WideString; +begin + if CurIndex <> NewIndex then + begin + BeginUpdate; + try + TempString := Get(CurIndex); + TempObject := GetObject(CurIndex); + Delete(CurIndex); + InsertObject(NewIndex, TempString, TempObject); + finally + EndUpdate; + end; + end; +end; + +procedure TWideStrings.Put(Index: Integer; const S: WideString); +var + TempObject: TObject; +begin + TempObject := GetObject(Index); + Delete(Index); + InsertObject(Index, S, TempObject); +end; + +procedure TWideStrings.PutObject(Index: Integer; AObject: TObject); +begin +end; + +procedure TWideStrings.ReadData(Reader: TReader); +begin + if Reader.NextValue in [vaString, vaLString] then + SetTextStr(Reader.ReadString) {JCL compatiblity} + else if Reader.NextValue = vaWString then + SetTextStr(Reader.ReadWideString) {JCL compatiblity} + else begin + BeginUpdate; + try + Clear; + Reader.ReadListBegin; + while not Reader.EndOfList do + if Reader.NextValue in [vaString, vaLString] then + Add(Reader.ReadString) {TStrings compatiblity} + else + Add(Reader.ReadWideString); + Reader.ReadListEnd; + finally + EndUpdate; + end; + end; +end; + +procedure TWideStrings.SaveToFile(const FileName: WideString); +var + Stream: TStream; +begin + Stream := TTntFileStream.Create(FileName, fmCreate); + try + SaveToStream(Stream); + finally + Stream.Free; + end; +end; + +procedure TWideStrings.SaveToStream(Stream: TStream); +var + SW: WideString; +begin + SW := GetTextStr; + Stream.WriteBuffer(PWideChar(SW)^, Length(SW) * SizeOf(WideChar)); +end; + +procedure TWideStrings.SetCapacity(NewCapacity: Integer); +begin + // do nothing - descendents may optionally implement this method +end; + +procedure TWideStrings.SetCommaText(const Value: WideString); +begin + Delimiter := ','; + QuoteChar := '"'; + SetDelimitedText(Value); +end; + +procedure TWideStrings.SetStringsAdapter(const Value: IWideStringsAdapter); +begin + if FAdapter <> nil then FAdapter.ReleaseStrings; + FAdapter := Value; + if FAdapter <> nil then FAdapter.ReferenceStrings(Self); +end; + +procedure TWideStrings.SetTextW(const Text: PWideChar); +begin + SetTextStr(Text); +end; + +procedure TWideStrings.SetTextStr(const Value: WideString); +var + P, Start: PWideChar; + S: WideString; +begin + BeginUpdate; + try + Clear; + P := Pointer(Value); + if P <> nil then + while P^ <> #0 do + begin + Start := P; + while not (P^ in [WideChar(#0), WideChar(#10), WideChar(#13)]) and (P^ <> WideLineSeparator) do + Inc(P); + SetString(S, Start, P - Start); + Add(S); + if P^ = #13 then Inc(P); + if P^ = #10 then Inc(P); + if P^ = WideLineSeparator then Inc(P); + end; + finally + EndUpdate; + end; +end; + +procedure TWideStrings.SetUpdateState(Updating: Boolean); +begin +end; + +procedure TWideStrings.SetValue(const Name, Value: WideString); +var + I: Integer; +begin + I := IndexOfName(Name); + if Value <> '' then + begin + if I < 0 then I := Add(''); + Put(I, Name + NameValueSeparator + Value); + end else + begin + if I >= 0 then Delete(I); + end; +end; + +procedure TWideStrings.WriteData(Writer: TWriter); +var + I: Integer; +begin + Writer.WriteListBegin; + for I := 0 to Count-1 do begin + Writer.WriteWideString(Get(I)); + end; + Writer.WriteListEnd; +end; + +procedure TWideStrings.SetDelimitedText(const Value: WideString); +var + P, P1: PWideChar; + S: WideString; +begin + BeginUpdate; + try + Clear; + P := PWideChar(Value); + while P^ in [WideChar(#1)..WideChar(' ')] do + Inc(P); + while P^ <> #0 do + begin + if P^ = QuoteChar then + S := WideExtractQuotedStr(P, QuoteChar) + else + begin + P1 := P; + while (P^ > ' ') and (P^ <> Delimiter) do + Inc(P); + SetString(S, P1, P - P1); + end; + Add(S); + while P^ in [WideChar(#1)..WideChar(' ')] do + Inc(P); + if P^ = Delimiter then + begin + P1 := P; + Inc(P1); + if P1^ = #0 then + Add(''); + repeat + Inc(P); + until not (P^ in [WideChar(#1)..WideChar(' ')]); + end; + end; + finally + EndUpdate; + end; +end; + +function TWideStrings.GetDelimiter: WideChar; +begin + if not (sdDelimiter in FDefined) then + Delimiter := ','; + Result := FDelimiter; +end; + +function TWideStrings.GetQuoteChar: WideChar; +begin + if not (sdQuoteChar in FDefined) then + QuoteChar := '"'; + Result := FQuoteChar; +end; + +procedure TWideStrings.SetDelimiter(const Value: WideChar); +begin + if (FDelimiter <> Value) or not (sdDelimiter in FDefined) then + begin + Include(FDefined, sdDelimiter); + FDelimiter := Value; + end +end; + +procedure TWideStrings.SetQuoteChar(const Value: WideChar); +begin + if (FQuoteChar <> Value) or not (sdQuoteChar in FDefined) then + begin + Include(FDefined, sdQuoteChar); + FQuoteChar := Value; + end +end; + +function TWideStrings.CompareStrings(const S1, S2: WideString): Integer; +begin + Result := WideCompareText(S1, S2); +end; + +function TWideStrings.GetNameValueSeparator: WideChar; +begin + {$IFDEF COMPILER_7_UP} + if not (sdNameValueSeparator in FDefined) then + NameValueSeparator := '='; + Result := FNameValueSeparator; + {$ELSE} + Result := '='; + {$ENDIF} +end; + +{$IFDEF COMPILER_7_UP} +procedure TWideStrings.SetNameValueSeparator(const Value: WideChar); +begin + if (FNameValueSeparator <> Value) or not (sdNameValueSeparator in FDefined) then + begin + Include(FDefined, sdNameValueSeparator); + FNameValueSeparator := Value; + end +end; +{$ENDIF} + +function TWideStrings.GetValueFromIndex(Index: Integer): WideString; +begin + if Index >= 0 then + Result := Copy(Get(Index), Length(Names[Index]) + 2, MaxInt) else + Result := ''; +end; + +procedure TWideStrings.SetValueFromIndex(Index: Integer; const Value: WideString); +begin + if Value <> '' then + begin + if Index < 0 then Index := Add(''); + Put(Index, Names[Index] + NameValueSeparator + Value); + end + else + if Index >= 0 then Delete(Index); +end; + +end. diff --git a/internal/1/Source/TntWindows.pas b/internal/1/Source/TntWindows.pas new file mode 100644 index 0000000..12d74d8 --- /dev/null +++ b/internal/1/Source/TntWindows.pas @@ -0,0 +1,1452 @@ + +{*****************************************************************************} +{ } +{ Tnt Delphi Unicode Controls } +{ http://www.tntware.com/delphicontrols/unicode/ } +{ Version: 2.3.0 } +{ } +{ Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) } +{ } +{*****************************************************************************} + +unit TntWindows; + +{$INCLUDE TntCompilers.inc} + +interface + +uses + Windows, ShellApi, ShlObj; + +// ......... compatibility + +const + DT_NOFULLWIDTHCHARBREAK = $00080000; + +const + INVALID_FILE_ATTRIBUTES = DWORD(-1); + +// ................ ANSI TYPES ................ +{TNT-WARN LPSTR} +{TNT-WARN PLPSTR} +{TNT-WARN LPCSTR} +{TNT-WARN LPCTSTR} +{TNT-WARN LPTSTR} + +// ........ EnumResourceTypesW, EnumResourceNamesW and EnumResourceLanguagesW are supposed .... +// ........ to work on Win95/98/ME but have caused access violations in testing on Win95 ...... +// .. TNT--WARN EnumResourceTypes .. +// .. TNT--WARN EnumResourceTypesA .. +// .. TNT--WARN EnumResourceNames .. +// .. TNT--WARN EnumResourceNamesA .. +// .. TNT--WARN EnumResourceLanguages .. +// .. TNT--WARN EnumResourceLanguagesA .. + +//------------------------------------------------------------------------------------------ + +// ......... The Unicode form of these functions are supported on Windows 95/98/ME ......... +{TNT-WARN ExtTextOut} +{TNT-WARN ExtTextOutA} +{TNT-WARN Tnt_ExtTextOutW} + +{TNT-WARN FindResource} +{TNT-WARN FindResourceA} +{TNT-WARN Tnt_FindResourceW} + +{TNT-WARN FindResourceEx} +{TNT-WARN FindResourceExA} +{TNT-WARN Tnt_FindResourceExW} + +{TNT-WARN GetCharWidth} +{TNT-WARN GetCharWidthA} +{TNT-WARN Tnt_GetCharWidthW} + +{TNT-WARN GetCommandLine} +{TNT-WARN GetCommandLineA} +{TNT-WARN Tnt_GetCommandLineW} + +{TNT-WARN GetTextExtentPoint} +{TNT-WARN GetTextExtentPointA} +{TNT-WARN Tnt_GetTextExtentPointW} + +{TNT-WARN GetTextExtentPoint32} +{TNT-WARN GetTextExtentPoint32A} +{TNT-WARN Tnt_GetTextExtentPoint32W} + +{TNT-WARN lstrcat} +{TNT-WARN lstrcatA} +{TNT-WARN Tnt_lstrcatW} + +{TNT-WARN lstrcpy} +{TNT-WARN lstrcpyA} +{TNT-WARN Tnt_lstrcpyW} + +{TNT-WARN lstrlen} +{TNT-WARN lstrlenA} +{TNT-WARN Tnt_lstrlenW} + +{TNT-WARN MessageBox} +{TNT-WARN MessageBoxA} +{TNT-WARN Tnt_MessageBoxW} + +{TNT-WARN MessageBoxEx} +{TNT-WARN MessageBoxExA} +{TNT-WARN Tnt_MessageBoxExA} + +{TNT-WARN TextOut} +{TNT-WARN TextOutA} +{TNT-WARN Tnt_TextOutW} + +//------------------------------------------------------------------------------------------ + +{TNT-WARN LOCALE_USER_DEFAULT} // <-- use GetThreadLocale +{TNT-WARN LOCALE_SYSTEM_DEFAULT} // <-- use GetThreadLocale + +//------------------------------------------------------------------------------------------ +// compatiblity +//------------------------------------------------------------------------------------------ +{$IFNDEF COMPILER_9_UP} +type + TStartupInfoA = _STARTUPINFOA; + TStartupInfoW = record + cb: DWORD; + lpReserved: PWideChar; + lpDesktop: PWideChar; + lpTitle: PWideChar; + dwX: DWORD; + dwY: DWORD; + dwXSize: DWORD; + dwYSize: DWORD; + dwXCountChars: DWORD; + dwYCountChars: DWORD; + dwFillAttribute: DWORD; + dwFlags: DWORD; + wShowWindow: Word; + cbReserved2: Word; + lpReserved2: PByte; + hStdInput: THandle; + hStdOutput: THandle; + hStdError: THandle; + end; + +function CreateProcessW{TNT-ALLOW CreateProcessW}(lpApplicationName: PWideChar; lpCommandLine: PWideChar; + lpProcessAttributes, lpThreadAttributes: PSecurityAttributes; + bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer; + lpCurrentDirectory: PWideChar; const lpStartupInfo: TStartupInfoW; + var lpProcessInformation: TProcessInformation): BOOL; stdcall; external kernel32 name 'CreateProcessW'; + +{$ENDIF} +//------------------------------------------------------------------------------------------ + +{TNT-WARN SetWindowText} +{TNT-WARN SetWindowTextA} +{TNT-WARN SetWindowTextW} +function Tnt_SetWindowTextW(hWnd: HWND; lpString: PWideChar): BOOL; + +{TNT-WARN RemoveDirectory} +{TNT-WARN RemoveDirectoryA} +{TNT-WARN RemoveDirectoryW} +function Tnt_RemoveDirectoryW(lpPathName: PWideChar): BOOL; + +{TNT-WARN GetShortPathName} +{TNT-WARN GetShortPathNameA} +{TNT-WARN GetShortPathNameW} +function Tnt_GetShortPathNameW(lpszLongPath: PWideChar; lpszShortPath: PWideChar; + cchBuffer: DWORD): DWORD; + +{TNT-WARN GetFullPathName} +{TNT-WARN GetFullPathNameA} +{TNT-WARN GetFullPathNameW} +function Tnt_GetFullPathNameW(lpFileName: PWideChar; nBufferLength: DWORD; + lpBuffer: PWideChar; var lpFilePart: PWideChar): DWORD; + +{TNT-WARN CreateFile} +{TNT-WARN CreateFileA} +{TNT-WARN CreateFileW} +function Tnt_CreateFileW(lpFileName: PWideChar; dwDesiredAccess, dwShareMode: DWORD; + lpSecurityAttributes: PSecurityAttributes; dwCreationDisposition, dwFlagsAndAttributes: DWORD; + hTemplateFile: THandle): THandle; + +{TNT-WARN FindFirstFile} +{TNT-WARN FindFirstFileA} +{TNT-WARN FindFirstFileW} +function Tnt_FindFirstFileW(lpFileName: PWideChar; var lpFindFileData: TWIN32FindDataW): THandle; + +{TNT-WARN FindNextFile} +{TNT-WARN FindNextFileA} +{TNT-WARN FindNextFileW} +function Tnt_FindNextFileW(hFindFile: THandle; var lpFindFileData: TWIN32FindDataW): BOOL; + +{TNT-WARN GetFileAttributes} +{TNT-WARN GetFileAttributesA} +{TNT-WARN GetFileAttributesW} +function Tnt_GetFileAttributesW(lpFileName: PWideChar): DWORD; + +{TNT-WARN SetFileAttributes} +{TNT-WARN SetFileAttributesA} +{TNT-WARN SetFileAttributesW} +function Tnt_SetFileAttributesW(lpFileName: PWideChar; dwFileAttributes: DWORD): BOOL; + +{TNT-WARN CreateDirectory} +{TNT-WARN CreateDirectoryA} +{TNT-WARN CreateDirectoryW} +function Tnt_CreateDirectoryW(lpPathName: PWideChar; + lpSecurityAttributes: PSecurityAttributes): BOOL; + +{TNT-WARN MoveFile} +{TNT-WARN MoveFileA} +{TNT-WARN MoveFileW} +function Tnt_MoveFileW(lpExistingFileName, lpNewFileName: PWideChar): BOOL; + +{TNT-WARN CopyFile} +{TNT-WARN CopyFileA} +{TNT-WARN CopyFileW} +function Tnt_CopyFileW(lpExistingFileName, lpNewFileName: PWideChar; bFailIfExists: BOOL): BOOL; + +{TNT-WARN DeleteFile} +{TNT-WARN DeleteFileA} +{TNT-WARN DeleteFileW} +function Tnt_DeleteFileW(lpFileName: PWideChar): BOOL; + +{TNT-WARN DrawText} +{TNT-WARN DrawTextA} +{TNT-WARN DrawTextW} +function Tnt_DrawTextW(hDC: HDC; lpString: PWideChar; nCount: Integer; + var lpRect: TRect; uFormat: UINT): Integer; + +{TNT-WARN GetDiskFreeSpace} +{TNT-WARN GetDiskFreeSpaceA} +{TNT-WARN GetDiskFreeSpaceW} +function Tnt_GetDiskFreeSpaceW(lpRootPathName: PWideChar; var lpSectorsPerCluster, + lpBytesPerSector, lpNumberOfFreeClusters, lpTotalNumberOfClusters: DWORD): BOOL; + +{TNT-WARN GetVolumeInformation} +{TNT-WARN GetVolumeInformationA} +{TNT-WARN GetVolumeInformationW} +function Tnt_GetVolumeInformationW(lpRootPathName: PWideChar; lpVolumeNameBuffer: PWideChar; + nVolumeNameSize: DWORD; lpVolumeSerialNumber: PDWORD; + var lpMaximumComponentLength, lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: PWideChar; + nFileSystemNameSize: DWORD): BOOL; + +{TNT-WARN GetModuleFileName} +{TNT-WARN GetModuleFileNameA} +{TNT-WARN GetModuleFileNameW} +function Tnt_GetModuleFileNameW(hModule: HINST; lpFilename: PWideChar; nSize: DWORD): DWORD; + +{TNT-WARN GetTempPath} +{TNT-WARN GetTempPathA} +{TNT-WARN GetTempPathW} +function Tnt_GetTempPathW(nBufferLength: DWORD; lpBuffer: PWideChar): DWORD; + +{TNT-WARN GetTempFileName} +{TNT-WARN GetTempFileNameA} +{TNT-WARN GetTempFileNameW} +function Tnt_GetTempFileNameW(lpPathName, lpPrefixString: PWideChar; uUnique: UINT; + lpTempFileName: PWideChar): UINT; + +{TNT-WARN GetWindowsDirectory} +{TNT-WARN GetWindowsDirectoryA} +{TNT-WARN GetWindowsDirectoryW} +function Tnt_GetWindowsDirectoryW(lpBuffer: PWideChar; uSize: UINT): UINT; + +{TNT-WARN GetSystemDirectory} +{TNT-WARN GetSystemDirectoryA} +{TNT-WARN GetSystemDirectoryW} +function Tnt_GetSystemDirectoryW(lpBuffer: PWideChar; uSize: UINT): UINT; + +{TNT-WARN GetCurrentDirectory} +{TNT-WARN GetCurrentDirectoryA} +{TNT-WARN GetCurrentDirectoryW} +function Tnt_GetCurrentDirectoryW(nBufferLength: DWORD; lpBuffer: PWideChar): DWORD; + +{TNT-WARN SetCurrentDirectory} +{TNT-WARN SetCurrentDirectoryA} +{TNT-WARN SetCurrentDirectoryW} +function Tnt_SetCurrentDirectoryW(lpPathName: PWideChar): BOOL; + +{TNT-WARN GetComputerName} +{TNT-WARN GetComputerNameA} +{TNT-WARN GetComputerNameW} +function Tnt_GetComputerNameW(lpBuffer: PWideChar; var nSize: DWORD): BOOL; + +{TNT-WARN GetUserName} +{TNT-WARN GetUserNameA} +{TNT-WARN GetUserNameW} +function Tnt_GetUserNameW(lpBuffer: PWideChar; var nSize: DWORD): BOOL; + +{TNT-WARN ShellExecute} +{TNT-WARN ShellExecuteA} +{TNT-WARN ShellExecuteW} +function Tnt_ShellExecuteW(hWnd: HWND; Operation, FileName, Parameters, + Directory: PWideChar; ShowCmd: Integer): HINST; + +{TNT-WARN LoadLibrary} +{TNT-WARN LoadLibraryA} +{TNT-WARN LoadLibraryW} +function Tnt_LoadLibraryW(lpLibFileName: PWideChar): HMODULE; + +{TNT-WARN LoadLibraryEx} +{TNT-WARN LoadLibraryExA} +{TNT-WARN LoadLibraryExW} +function Tnt_LoadLibraryExW(lpLibFileName: PWideChar; hFile: THandle; dwFlags: DWORD): HMODULE; + +{TNT-WARN CreateProcess} +{TNT-WARN CreateProcessA} +{TNT-WARN CreateProcessW} +function Tnt_CreateProcessW(lpApplicationName: PWideChar; lpCommandLine: PWideChar; + lpProcessAttributes, lpThreadAttributes: PSecurityAttributes; + bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer; + lpCurrentDirectory: PWideChar; const lpStartupInfo: TStartupInfoW; + var lpProcessInformation: TProcessInformation): BOOL; + +{TNT-WARN GetCurrencyFormat} +{TNT-WARN GetCurrencyFormatA} +{TNT-WARN GetCurrencyFormatW} +function Tnt_GetCurrencyFormatW(Locale: LCID; dwFlags: DWORD; lpValue: PWideChar; + lpFormat: PCurrencyFmtW; lpCurrencyStr: PWideChar; cchCurrency: Integer): Integer; + +{TNT-WARN CompareString} +{TNT-WARN CompareStringA} +{TNT-WARN CompareStringW} +function Tnt_CompareStringW(Locale: LCID; dwCmpFlags: DWORD; lpString1: PWideChar; + cchCount1: Integer; lpString2: PWideChar; cchCount2: Integer): Integer; + +{TNT-WARN CharUpper} +{TNT-WARN CharUpperA} +{TNT-WARN CharUpperW} +function Tnt_CharUpperW(lpsz: PWideChar): PWideChar; + +{TNT-WARN CharUpperBuff} +{TNT-WARN CharUpperBuffA} +{TNT-WARN CharUpperBuffW} +function Tnt_CharUpperBuffW(lpsz: PWideChar; cchLength: DWORD): DWORD; + +{TNT-WARN CharLower} +{TNT-WARN CharLowerA} +{TNT-WARN CharLowerW} +function Tnt_CharLowerW(lpsz: PWideChar): PWideChar; + +{TNT-WARN CharLowerBuff} +{TNT-WARN CharLowerBuffA} +{TNT-WARN CharLowerBuffW} +function Tnt_CharLowerBuffW(lpsz: PWideChar; cchLength: DWORD): DWORD; + +{TNT-WARN GetStringTypeEx} +{TNT-WARN GetStringTypeExA} +{TNT-WARN GetStringTypeExW} +function Tnt_GetStringTypeExW(Locale: LCID; dwInfoType: DWORD; + lpSrcStr: PWideChar; cchSrc: Integer; var lpCharType): BOOL; + +{TNT-WARN LoadString} +{TNT-WARN LoadStringA} +{TNT-WARN LoadStringW} +function Tnt_LoadStringW(hInstance: HINST; uID: UINT; lpBuffer: PWideChar; nBufferMax: Integer): Integer; + +{TNT-WARN InsertMenuItem} +{TNT-WARN InsertMenuItemA} +{TNT-WARN InsertMenuItemW} +function Tnt_InsertMenuItemW(hMenu: HMENU; uItem: DWORD; fByPosition: BOOL; lpmii: tagMenuItemINFOW): BOOL; + +{TNT-WARN ExtractIconEx} +{TNT-WARN ExtractIconExA} +{TNT-WARN ExtractIconExW} +function Tnt_ExtractIconExW(lpszFile: PWideChar; nIconIndex: Integer; + var phiconLarge, phiconSmall: HICON; nIcons: UINT): UINT; + +{TNT-WARN ExtractAssociatedIcon} +{TNT-WARN ExtractAssociatedIconA} +{TNT-WARN ExtractAssociatedIconW} +function Tnt_ExtractAssociatedIconW(hInst: HINST; lpIconPath: PWideChar; + var lpiIcon: Word): HICON; + +{TNT-WARN GetFileVersionInfoSize} +{TNT-WARN GetFileVersionInfoSizeA} +{TNT-WARN GetFileVersionInfoSizeW} +function Tnt_GetFileVersionInfoSizeW(lptstrFilename: PWideChar; var lpdwHandle: DWORD): DWORD; + +{TNT-WARN GetFileVersionInfo} +{TNT-WARN GetFileVersionInfoA} +{TNT-WARN GetFileVersionInfoW} +function Tnt_GetFileVersionInfoW(lptstrFilename: PWideChar; dwHandle, dwLen: DWORD; + lpData: Pointer): BOOL; + +const + VQV_FIXEDFILEINFO = '\'; + VQV_VARFILEINFO_TRANSLATION = '\VarFileInfo\Translation'; + VQV_STRINGFILEINFO = '\StringFileInfo'; + + VER_COMMENTS = 'Comments'; + VER_INTERNALNAME = 'InternalName'; + VER_PRODUCTNAME = 'ProductName'; + VER_COMPANYNAME = 'CompanyName'; + VER_LEGALCOPYRIGHT = 'LegalCopyright'; + VER_PRODUCTVERSION = 'ProductVersion'; + VER_FILEDESCRIPTION = 'FileDescription'; + VER_LEGALTRADEMARKS = 'LegalTrademarks'; + VER_PRIVATEBUILD = 'PrivateBuild'; + VER_FILEVERSION = 'FileVersion'; + VER_ORIGINALFILENAME = 'OriginalFilename'; + VER_SPECIALBUILD = 'SpecialBuild'; + +{TNT-WARN VerQueryValue} +{TNT-WARN VerQueryValueA} +{TNT-WARN VerQueryValueW} +function Tnt_VerQueryValueW(pBlock: Pointer; lpSubBlock: PWideChar; + var lplpBuffer: Pointer; var puLen: UINT): BOOL; + +type + TSHNameMappingHeaderA = record + cNumOfMappings: Cardinal; + lpNM: PSHNAMEMAPPINGA; + end; + PSHNameMappingHeaderA = ^TSHNameMappingHeaderA; + + TSHNameMappingHeaderW = record + cNumOfMappings: Cardinal; + lpNM: PSHNAMEMAPPINGW; + end; + PSHNameMappingHeaderW = ^TSHNameMappingHeaderW; + +{TNT-WARN SHFileOperation} +{TNT-WARN SHFileOperationA} +{TNT-WARN SHFileOperationW} // <-- no stub on early Windows 95 +function Tnt_SHFileOperationW(var lpFileOp: TSHFileOpStructW): Integer; + +{TNT-WARN SHFreeNameMappings} +procedure Tnt_SHFreeNameMappings(hNameMappings: THandle); + +{TNT-WARN SHBrowseForFolder} +{TNT-WARN SHBrowseForFolderA} +{TNT-WARN SHBrowseForFolderW} // <-- no stub on early Windows 95 +function Tnt_SHBrowseForFolderW(var lpbi: TBrowseInfoW): PItemIDList; + +{TNT-WARN SHGetPathFromIDList} +{TNT-WARN SHGetPathFromIDListA} +{TNT-WARN SHGetPathFromIDListW} // <-- no stub on early Windows 95 +function Tnt_SHGetPathFromIDListW(pidl: PItemIDList; pszPath: PWideChar): BOOL; + +{TNT-WARN SHGetFileInfo} +{TNT-WARN SHGetFileInfoA} +{TNT-WARN SHGetFileInfoW} // <-- no stub on early Windows 95 +function Tnt_SHGetFileInfoW(pszPath: PWideChar; dwFileAttributes: DWORD; + var psfi: TSHFileInfoW; cbFileInfo, uFlags: UINT): DWORD; + +// ......... introduced ......... +function Tnt_Is_IntResource(ResStr: LPCWSTR): Boolean; + +function LANGIDFROMLCID(lcid: LCID): WORD; +function MAKELANGID(usPrimaryLanguage, usSubLanguage: WORD): WORD; +function MAKELCID(wLanguageID: WORD; wSortID: WORD = SORT_DEFAULT): LCID; +function PRIMARYLANGID(lgid: WORD): WORD; +function SORTIDFROMLCID(lcid: LCID): WORD; +function SUBLANGID(lgid: WORD): WORD; + +implementation + +uses + SysUtils, Math, TntSysUtils, + {$IFDEF COMPILER_9_UP} WideStrUtils, {$ENDIF} TntWideStrUtils; + +function _PAnsiCharWithNil(const S: AnsiString): PAnsiChar; +begin + if S = '' then + Result := nil {Win9x needs nil for some parameters instead of empty strings} + else + Result := PAnsiChar(S); +end; + +function _PWideCharWithNil(const S: WideString): PWideChar; +begin + if S = '' then + Result := nil {Win9x needs nil for some parameters instead of empty strings} + else + Result := PWideChar(S); +end; + +function _WStr(lpString: PWideChar; cchCount: Integer): WideString; +begin + if cchCount = -1 then + Result := lpString + else + Result := Copy(WideString(lpString), 1, cchCount); +end; + +procedure _MakeWideWin32FindData(var WideFindData: TWIN32FindDataW; AnsiFindData: TWIN32FindDataA); +begin + CopyMemory(@WideFindData, @AnsiFindData, + Integer(@WideFindData.cFileName) - Integer(@WideFindData)); + WStrPCopy(WideFindData.cFileName, AnsiFindData.cFileName); + WStrPCopy(WideFindData.cAlternateFileName, AnsiFindData.cAlternateFileName); +end; + +function Tnt_SetWindowTextW(hWnd: HWND; lpString: PWideChar): BOOL; +begin + if Win32PlatformIsUnicode then + Result := SetWindowTextW{TNT-ALLOW SetWindowTextW}(hWnd, lpString) + else + Result := SetWindowTextA{TNT-ALLOW SetWindowTextA}(hWnd, PAnsiChar(AnsiString(lpString))); +end; + +//----------------------------- + +type + TPathLengthResultOption = (poAllowDirectoryMode, poZeroSmallBuff, poExactCopy, poExactCopySubPaths); + TPathLengthResultOptions = set of TPathLengthResultOption; + +procedure _ExactStrCopyW(pDest, pSource: PWideChar; Count: Integer); +var + i: integer; +begin + for i := 1 to Count do begin + pDest^ := pSource^; + Inc(PSource); + Inc(pDest); + end; +end; + +procedure _ExactCopySubPaths(pDest, pSource: PWideChar; Count: Integer); +var + i: integer; + OriginalSource: PWideChar; + PNextSlash: PWideChar; +begin + if Count >= 4 then begin + OriginalSource := pSource; + PNextSlash := WStrScan(pSource, '\'); + for i := 1 to Count - 1 do begin + // determine next path delimiter + if pSource > pNextSlash then begin + PNextSlash := WStrScan(pSource, '\'); + end; + // leave if no more sub paths + if (PNextSlash = nil) + or ((pNextSlash - OriginalSource) >= Count) then begin + exit; + end; + // copy char + pDest^ := pSource^; + Inc(PSource); + Inc(pDest); + end; + end; +end; + +function _HandlePathLengthResult(nBufferLength: DWORD; lpBuffer: PWideChar; const AnsiBuff: AnsiString; Options: TPathLengthResultOptions): Integer; +var + WideBuff: WideString; +begin + WideBuff := AnsiBuff; + if nBufferLength > Cardinal(Length(WideBuff)) then begin + // normal + Result := Length(WideBuff); + WStrLCopy(lpBuffer, PWideChar(WideBuff), nBufferLength); + end else if (poExactCopy in Options) then begin + // exact + Result := nBufferLength; + _ExactStrCopyW(lpBuffer, PWideChar(WideBuff), nBufferLength); + end else begin + // other + if (poAllowDirectoryMode in Options) + and (nBufferLength = Cardinal(Length(WideBuff))) then begin + Result := Length(WideBuff) + 1; + WStrLCopy(lpBuffer, PWideChar(WideBuff), nBufferLength - 1); + end else begin + Result := Length(WideBuff) + 1; + if (nBufferLength > 0) then begin + if (poZeroSmallBuff in Options) then + lpBuffer^ := #0 + else if (poExactCopySubPaths in Options) then + _ExactCopySubPaths(lpBuffer, PWideChar(WideBuff), nBufferLength); + end; + end; + end; +end; + +function _HandleStringLengthResult(nBufferLength: DWORD; lpBuffer: PWideChar; const AnsiBuff: AnsiString; Options: TPathLengthResultOptions): Integer; +var + WideBuff: WideString; +begin + WideBuff := AnsiBuff; + if nBufferLength >= Cardinal(Length(WideBuff)) then begin + // normal + Result := Length(WideBuff); + WStrLCopy(lpBuffer, PWideChar(WideBuff), nBufferLength); + end else if nBufferLength = 0 then + Result := Length(WideBuff) + else + Result := 0; +end; + +//------------------------------------------- + +function Tnt_RemoveDirectoryW(lpPathName: PWideChar): BOOL; +begin + if Win32PlatformIsUnicode then + Result := RemoveDirectoryW{TNT-ALLOW RemoveDirectoryW}(PWideChar(lpPathName)) + else + Result := RemoveDirectoryA{TNT-ALLOW RemoveDirectoryA}(PAnsiChar(AnsiString(lpPathName))); +end; + +function Tnt_GetShortPathNameW(lpszLongPath: PWideChar; lpszShortPath: PWideChar; + cchBuffer: DWORD): DWORD; +var + AnsiBuff: AnsiString; +begin + if Win32PlatformIsUnicode then + Result := GetShortPathNameW{TNT-ALLOW GetShortPathNameW}(lpszLongPath, lpszShortPath, cchBuffer) + else begin + SetLength(AnsiBuff, MAX_PATH * 2); + SetLength(AnsiBuff, GetShortPathNameA{TNT-ALLOW GetShortPathNameA}(PAnsiChar(AnsiString(lpszLongPath)), + PAnsiChar(AnsiBuff), Length(AnsiBuff))); + Result := _HandlePathLengthResult(cchBuffer, lpszShortPath, AnsiBuff, [poExactCopySubPaths]); + end; +end; + +function Tnt_GetFullPathNameW(lpFileName: PWideChar; nBufferLength: DWORD; + lpBuffer: PWideChar; var lpFilePart: PWideChar): DWORD; +var + AnsiBuff: AnsiString; + AnsiFilePart: PAnsiChar; + AnsiLeadingChars: Integer; + WideLeadingChars: Integer; +begin + if Win32PlatformIsUnicode then + Result := GetFullPathNameW{TNT-ALLOW GetFullPathNameW}(lpFileName, nBufferLength, lpBuffer, lpFilePart) + else begin + SetLength(AnsiBuff, MAX_PATH * 2); + SetLength(AnsiBuff, GetFullPathNameA{TNT-ALLOW GetFullPathNameA}(PAnsiChar(AnsiString(lpFileName)), + Length(AnsiBuff), PAnsiChar(AnsiBuff), AnsiFilePart)); + Result := _HandlePathLengthResult(nBufferLength, lpBuffer, AnsiBuff, [poZeroSmallBuff]); + // deal w/ lpFilePart + if (AnsiFilePart = nil) or (nBufferLength < Result) then + lpFilePart := nil + else begin + AnsiLeadingChars := AnsiFilePart - PAnsiChar(AnsiBuff); + WideLeadingChars := Length(WideString(Copy(AnsiBuff, 1, AnsiLeadingChars))); + lpFilePart := lpBuffer + WideLeadingChars; + end; + end; +end; + +function Tnt_CreateFileW(lpFileName: PWideChar; dwDesiredAccess, dwShareMode: DWORD; + lpSecurityAttributes: PSecurityAttributes; dwCreationDisposition, dwFlagsAndAttributes: DWORD; + hTemplateFile: THandle): THandle; +begin + if Win32PlatformIsUnicode then + Result := CreateFileW{TNT-ALLOW CreateFileW}(lpFileName, dwDesiredAccess, dwShareMode, + lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile) + else + Result := CreateFileA{TNT-ALLOW CreateFileA}(PAnsiChar(AnsiString(lpFileName)), dwDesiredAccess, dwShareMode, + lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile) +end; + +function Tnt_FindFirstFileW(lpFileName: PWideChar; var lpFindFileData: TWIN32FindDataW): THandle; +var + Ansi_lpFindFileData: TWIN32FindDataA; +begin + if Win32PlatformIsUnicode then + Result := FindFirstFileW{TNT-ALLOW FindFirstFileW}(lpFileName, lpFindFileData) + else begin + Result := FindFirstFileA{TNT-ALLOW FindFirstFileA}(PAnsiChar(AnsiString(lpFileName)), + Ansi_lpFindFileData); + if Result <> INVALID_HANDLE_VALUE then + _MakeWideWin32FindData(lpFindFileData, Ansi_lpFindFileData); + end; +end; + +function Tnt_FindNextFileW(hFindFile: THandle; var lpFindFileData: TWIN32FindDataW): BOOL; +var + Ansi_lpFindFileData: TWIN32FindDataA; +begin + if Win32PlatformIsUnicode then + Result := FindNextFileW{TNT-ALLOW FindNextFileW}(hFindFile, lpFindFileData) + else begin + Result := FindNextFileA{TNT-ALLOW FindNextFileA}(hFindFile, Ansi_lpFindFileData); + if Result then + _MakeWideWin32FindData(lpFindFileData, Ansi_lpFindFileData); + end; +end; + +function Tnt_GetFileAttributesW(lpFileName: PWideChar): DWORD; +begin + if Win32PlatformIsUnicode then + Result := GetFileAttributesW{TNT-ALLOW GetFileAttributesW}(lpFileName) + else + Result := GetFileAttributesA{TNT-ALLOW GetFileAttributesA}(PAnsiChar(AnsiString(lpFileName))); +end; + +function Tnt_SetFileAttributesW(lpFileName: PWideChar; dwFileAttributes: DWORD): BOOL; +begin + if Win32PlatformIsUnicode then + Result := SetFileAttributesW{TNT-ALLOW SetFileAttributesW}(lpFileName, dwFileAttributes) + else + Result := SetFileAttributesA{TNT-ALLOW SetFileAttributesA}(PAnsiChar(AnsiString(lpFileName)), dwFileAttributes); +end; + +function Tnt_CreateDirectoryW(lpPathName: PWideChar; + lpSecurityAttributes: PSecurityAttributes): BOOL; +begin + if Win32PlatformIsUnicode then + Result := CreateDirectoryW{TNT-ALLOW CreateDirectoryW}(lpPathName, lpSecurityAttributes) + else + Result := CreateDirectoryA{TNT-ALLOW CreateDirectoryA}(PAnsiChar(AnsiString(lpPathName)), lpSecurityAttributes); +end; + +function Tnt_MoveFileW(lpExistingFileName, lpNewFileName: PWideChar): BOOL; +begin + if Win32PlatformIsUnicode then + Result := MoveFileW{TNT-ALLOW MoveFileW}(lpExistingFileName, lpNewFileName) + else + Result := MoveFileA{TNT-ALLOW MoveFileA}(PAnsiChar(AnsiString(lpExistingFileName)), PAnsiChar(AnsiString(lpNewFileName))); +end; + +function Tnt_CopyFileW(lpExistingFileName, lpNewFileName: PWideChar; bFailIfExists: BOOL): BOOL; +begin + if Win32PlatformIsUnicode then + Result := CopyFileW{TNT-ALLOW CopyFileW}(lpExistingFileName, lpNewFileName, bFailIfExists) + else + Result := CopyFileA{TNT-ALLOW CopyFileA}(PAnsiChar(AnsiString(lpExistingFileName)), + PAnsiChar(AnsiString(lpNewFileName)), bFailIfExists); +end; + +function Tnt_DeleteFileW(lpFileName: PWideChar): BOOL; +begin + if Win32PlatformIsUnicode then + Result := DeleteFileW{TNT-ALLOW DeleteFileW}(lpFileName) + else + Result := DeleteFileA{TNT-ALLOW DeleteFileA}(PAnsiChar(AnsiString(lpFileName))); +end; + +function Tnt_DrawTextW(hDC: HDC; lpString: PWideChar; nCount: Integer; + var lpRect: TRect; uFormat: UINT): Integer; +begin + if Win32PlatformIsUnicode then + Result := DrawTextW{TNT-ALLOW DrawTextW}(hDC, lpString, nCount, lpRect, uFormat) + else + Result := DrawTextA{TNT-ALLOW DrawTextA}(hDC, + PAnsiChar(AnsiString(_WStr(lpString, nCount))), -1, lpRect, uFormat); +end; + +function Tnt_GetDiskFreeSpaceW(lpRootPathName: PWideChar; var lpSectorsPerCluster, + lpBytesPerSector, lpNumberOfFreeClusters, lpTotalNumberOfClusters: DWORD): BOOL; +begin + if Win32PlatformIsUnicode then + Result := GetDiskFreeSpaceW{TNT-ALLOW GetDiskFreeSpaceW}(lpRootPathName, + lpSectorsPerCluster, lpBytesPerSector, lpNumberOfFreeClusters, lpTotalNumberOfClusters) + else + Result := GetDiskFreeSpaceA{TNT-ALLOW GetDiskFreeSpaceA}(PAnsiChar(AnsiString(lpRootPathName)), + lpSectorsPerCluster, lpBytesPerSector, lpNumberOfFreeClusters, lpTotalNumberOfClusters) +end; + +function Tnt_GetVolumeInformationW(lpRootPathName: PWideChar; lpVolumeNameBuffer: PWideChar; + nVolumeNameSize: DWORD; lpVolumeSerialNumber: PDWORD; + var lpMaximumComponentLength, lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: PWideChar; + nFileSystemNameSize: DWORD): BOOL; +var + AnsiFileSystemNameBuffer: AnsiString; + AnsiVolumeNameBuffer: AnsiString; + AnsiBuffLen: DWORD; +begin + if Win32PlatformIsUnicode then + Result := GetVolumeInformationW{TNT-ALLOW GetVolumeInformationW}(lpRootPathName, lpVolumeNameBuffer, nVolumeNameSize, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize) + else begin + SetLength(AnsiVolumeNameBuffer, MAX_COMPUTERNAME_LENGTH + 1); + SetLength(AnsiFileSystemNameBuffer, MAX_COMPUTERNAME_LENGTH + 1); + AnsiBuffLen := Length(AnsiFileSystemNameBuffer); + Result := GetVolumeInformationA{TNT-ALLOW GetVolumeInformationA}(PAnsiChar(AnsiString(lpRootPathName)), PAnsiChar(AnsiVolumeNameBuffer), AnsiBuffLen, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, PAnsiChar(AnsiFileSystemNameBuffer), AnsiBuffLen); + if Result then begin + SetLength(AnsiFileSystemNameBuffer, AnsiBuffLen); + if (nFileSystemNameSize <= AnsiBuffLen) or (Length(AnsiFileSystemNameBuffer) = 0) then + Result := False + else begin + WStrPLCopy(lpFileSystemNameBuffer, AnsiFileSystemNameBuffer, nFileSystemNameSize); + WStrPLCopy(lpVolumeNameBuffer, AnsiVolumeNameBuffer, nVolumeNameSize); + end; + end; + end; +end; + +function Tnt_GetModuleFileNameW(hModule: HINST; lpFilename: PWideChar; nSize: DWORD): DWORD; +var + AnsiBuff: AnsiString; +begin + if Win32PlatformIsUnicode then + Result := GetModuleFileNameW{TNT-ALLOW GetModuleFileNameW}(hModule, lpFilename, nSize) + else begin + SetLength(AnsiBuff, MAX_PATH); + SetLength(AnsiBuff, GetModuleFileNameA{TNT-ALLOW GetModuleFileNameA}(hModule, PAnsiChar(AnsiBuff), Length(AnsiBuff))); + Result := _HandlePathLengthResult(nSize, lpFilename, AnsiBuff, [poExactCopy]); + end; +end; + +function Tnt_GetTempPathW(nBufferLength: DWORD; lpBuffer: PWideChar): DWORD; +var + AnsiBuff: AnsiString; +begin + if Win32PlatformIsUnicode then + Result := GetTempPathW{TNT-ALLOW GetTempPathW}(nBufferLength, lpBuffer) + else begin + SetLength(AnsiBuff, MAX_PATH); + SetLength(AnsiBuff, GetTempPathA{TNT-ALLOW GetTempPathA}(Length(AnsiBuff), PAnsiChar(AnsiBuff))); + Result := _HandlePathLengthResult(nBufferLength, lpBuffer, AnsiBuff, [poAllowDirectoryMode, poZeroSmallBuff]); + end; +end; + +function Tnt_GetTempFileNameW(lpPathName, lpPrefixString: PWideChar; uUnique: UINT; + lpTempFileName: PWideChar): UINT; +var + AnsiBuff: AnsiString; +begin + if Win32PlatformIsUnicode then + Result := GetTempFileNameW{TNT-ALLOW GetTempFileNameW}(lpPathName, lpPrefixString, uUnique, lpTempFileName) + else begin + SetLength(AnsiBuff, MAX_PATH); + Result := GetTempFileNameA{TNT-ALLOW GetTempFileNameA}(PAnsiChar(AnsiString(lpPathName)), PAnsiChar(lpPrefixString), uUnique, PAnsiChar(AnsiBuff)); + AnsiBuff := PAnsiChar(AnsiBuff); + _HandlePathLengthResult(MAX_PATH, lpTempFileName, AnsiBuff, [poZeroSmallBuff]); + end; +end; + +function Tnt_GetWindowsDirectoryW(lpBuffer: PWideChar; uSize: UINT): UINT; +var + AnsiBuff: AnsiString; +begin + if Win32PlatformIsUnicode then + Result := GetWindowsDirectoryW{TNT-ALLOW GetWindowsDirectoryW}(lpBuffer, uSize) + else begin + SetLength(AnsiBuff, MAX_PATH); + SetLength(AnsiBuff, GetWindowsDirectoryA{TNT-ALLOW GetWindowsDirectoryA}(PAnsiChar(AnsiBuff), Length(AnsiBuff))); + Result := _HandlePathLengthResult(uSize, lpBuffer, AnsiBuff, []); + end; +end; + +function Tnt_GetSystemDirectoryW(lpBuffer: PWideChar; uSize: UINT): UINT; +var + AnsiBuff: AnsiString; +begin + if Win32PlatformIsUnicode then + Result := GetSystemDirectoryW{TNT-ALLOW GetSystemDirectoryW}(lpBuffer, uSize) + else begin + SetLength(AnsiBuff, MAX_PATH); + SetLength(AnsiBuff, GetSystemDirectoryA{TNT-ALLOW GetSystemDirectoryA}(PAnsiChar(AnsiBuff), Length(AnsiBuff))); + Result := _HandlePathLengthResult(uSize, lpBuffer, AnsiBuff, []); + end; +end; + +function Tnt_GetCurrentDirectoryW(nBufferLength: DWORD; lpBuffer: PWideChar): DWORD; +var + AnsiBuff: AnsiString; +begin + if Win32PlatformIsUnicode then + Result := GetCurrentDirectoryW{TNT-ALLOW GetCurrentDirectoryW}(nBufferLength, lpBuffer) + else begin + SetLength(AnsiBuff, MAX_PATH); + SetLength(AnsiBuff, GetCurrentDirectoryA{TNT-ALLOW GetCurrentDirectoryA}(Length(AnsiBuff), PAnsiChar(AnsiBuff))); + Result := _HandlePathLengthResult(nBufferLength, lpBuffer, AnsiBuff, [poAllowDirectoryMode, poZeroSmallBuff]); + end; +end; + +function Tnt_SetCurrentDirectoryW(lpPathName: PWideChar): BOOL; +begin + if Win32PlatformIsUnicode then + Result := SetCurrentDirectoryW{TNT-ALLOW SetCurrentDirectoryW}(lpPathName) + else + Result := SetCurrentDirectoryA{TNT-ALLOW SetCurrentDirectoryA}(PAnsiChar(AnsiString(lpPathName))); +end; + +function Tnt_GetComputerNameW(lpBuffer: PWideChar; var nSize: DWORD): BOOL; +var + AnsiBuff: AnsiString; + AnsiBuffLen: DWORD; +begin + if Win32PlatformIsUnicode then + Result := GetComputerNameW{TNT-ALLOW GetComputerNameW}(lpBuffer, nSize) + else begin + SetLength(AnsiBuff, MAX_COMPUTERNAME_LENGTH + 1); + AnsiBuffLen := Length(AnsiBuff); + Result := GetComputerNameA{TNT-ALLOW GetComputerNameA}(PAnsiChar(AnsiBuff), AnsiBuffLen); + if Result then begin + SetLength(AnsiBuff, AnsiBuffLen); + if (nSize <= AnsiBuffLen) or (Length(AnsiBuff) = 0) then begin + nSize := AnsiBuffLen + 1; + Result := False; + end else begin + WStrPLCopy(lpBuffer, AnsiBuff, nSize); + nSize := WStrLen(lpBuffer); + end; + end; + end; +end; + +function Tnt_GetUserNameW(lpBuffer: PWideChar; var nSize: DWORD): BOOL; +var + AnsiBuff: AnsiString; + AnsiBuffLen: DWORD; +begin + if Win32PlatformIsUnicode then + Result := GetUserNameW{TNT-ALLOW GetUserNameW}(lpBuffer, nSize) + else begin + SetLength(AnsiBuff, 255); + AnsiBuffLen := Length(AnsiBuff); + Result := GetUserNameA{TNT-ALLOW GetUserNameA}(PAnsiChar(AnsiBuff), AnsiBuffLen); + if Result then begin + SetLength(AnsiBuff, AnsiBuffLen); + if (nSize <= AnsiBuffLen) or (Length(AnsiBuff) = 0) then begin + nSize := AnsiBuffLen + 1; + Result := False; + end else begin + WStrPLCopy(lpBuffer, AnsiBuff, nSize); + nSize := WStrLen(lpBuffer); + end; + end; + end; +end; + +function Tnt_ShellExecuteW(hWnd: HWND; Operation, FileName, Parameters, + Directory: PWideChar; ShowCmd: Integer): HINST; +begin + if Win32PlatformIsUnicode then + Result := ShellExecuteW{TNT-ALLOW ShellExecuteW}(hWnd, _PWideCharWithNil(WideString(Operation)), + FileName, Parameters, + Directory, ShowCmd) + else begin + Result := ShellExecuteA{TNT-ALLOW ShellExecuteA}(hWnd, _PAnsiCharWithNil(AnsiString(Operation)), + _PAnsiCharWithNil(AnsiString(FileName)), _PAnsiCharWithNil(AnsiString(Parameters)), + _PAnsiCharWithNil(AnsiString(Directory)), ShowCmd) + end; +end; + +function Tnt_LoadLibraryW(lpLibFileName: PWideChar): HMODULE; +begin + if Win32PlatformIsUnicode then + Result := LoadLibraryW{TNT-ALLOW LoadLibraryW}(lpLibFileName) + else + Result := LoadLibraryA{TNT-ALLOW LoadLibraryA}(PAnsiChar(AnsiString(lpLibFileName))); +end; + +function Tnt_LoadLibraryExW(lpLibFileName: PWideChar; hFile: THandle; dwFlags: DWORD): HMODULE; +begin + if Win32PlatformIsUnicode then + Result := LoadLibraryExW{TNT-ALLOW LoadLibraryExW}(lpLibFileName, hFile, dwFlags) + else + Result := LoadLibraryExA{TNT-ALLOW LoadLibraryExA}(PAnsiChar(AnsiString(lpLibFileName)), hFile, dwFlags); +end; + +function Tnt_CreateProcessW(lpApplicationName: PWideChar; lpCommandLine: PWideChar; + lpProcessAttributes, lpThreadAttributes: PSecurityAttributes; + bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer; + lpCurrentDirectory: PWideChar; const lpStartupInfo: TStartupInfoW; + var lpProcessInformation: TProcessInformation): BOOL; +var + AnsiStartupInfo: TStartupInfoA; +begin + if Win32PlatformIsUnicode then begin + Result := CreateProcessW{TNT-ALLOW CreateProcessW}(lpApplicationName, lpCommandLine, + lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, + lpCurrentDirectory, lpStartupInfo, lpProcessInformation) + end else begin + CopyMemory(@AnsiStartupInfo, @lpStartupInfo, SizeOf(TStartupInfo)); + AnsiStartupInfo.lpReserved := _PAnsiCharWithNil(AnsiString(lpStartupInfo.lpReserved)); + AnsiStartupInfo.lpDesktop := _PAnsiCharWithNil(AnsiString(lpStartupInfo.lpDesktop)); + AnsiStartupInfo.lpTitle := _PAnsiCharWithNil(AnsiString(lpStartupInfo.lpTitle)); + Result := CreateProcessA{TNT-ALLOW CreateProcessA}(_PAnsiCharWithNil(AnsiString(lpApplicationName)), + _PAnsiCharWithNil(AnsiString(lpCommandLine)), + lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, + _PAnsiCharWithNil(AnsiString(lpCurrentDirectory)), AnsiStartupInfo, lpProcessInformation); + end; +end; + +function Tnt_GetCurrencyFormatW(Locale: LCID; dwFlags: DWORD; lpValue: PWideChar; + lpFormat: PCurrencyFmtW; lpCurrencyStr: PWideChar; cchCurrency: Integer): Integer; +const + MAX_ANSI_BUFF_SIZE = 64; // can a currency string actually be larger? +var + AnsiFormat: TCurrencyFmtA; + PAnsiFormat: PCurrencyFmtA; + AnsiBuff: AnsiString; +begin + if Win32PlatformIsUnicode then + Result := GetCurrencyFormatW{TNT-ALLOW GetCurrencyFormatW}(Locale, dwFlags, lpValue, lpFormat, lpCurrencyStr, cchCurrency) + else begin + if lpFormat = nil then + PAnsiFormat := nil + else begin + ZeroMemory(@AnsiFormat, SizeOf(AnsiFormat)); + AnsiFormat.NumDigits := lpFormat.NumDigits; + AnsiFormat.LeadingZero := lpFormat.LeadingZero; + AnsiFormat.Grouping := lpFormat.Grouping; + AnsiFormat.lpDecimalSep := PAnsiChar(AnsiString(lpFormat.lpDecimalSep)); + AnsiFormat.lpThousandSep := PAnsiChar(AnsiString(lpFormat.lpThousandSep)); + AnsiFormat.NegativeOrder := lpFormat.NegativeOrder; + AnsiFormat.PositiveOrder := lpFormat.PositiveOrder; + AnsiFormat.lpCurrencySymbol := PAnsiChar(AnsiString(lpFormat.lpCurrencySymbol)); + PAnsiFormat := @AnsiFormat; + end; + SetLength(AnsiBuff, MAX_ANSI_BUFF_SIZE); + SetLength(AnsiBuff, GetCurrencyFormatA{TNT-ALLOW GetCurrencyFormatA}(Locale, dwFlags, + PAnsiChar(AnsiString(lpValue)), PAnsiFormat, PAnsiChar(AnsiBuff), MAX_ANSI_BUFF_SIZE)); + Result := _HandleStringLengthResult(cchCurrency, lpCurrencyStr, AnsiBuff, []); + end; +end; + +function Tnt_CompareStringW(Locale: LCID; dwCmpFlags: DWORD; lpString1: PWideChar; + cchCount1: Integer; lpString2: PWideChar; cchCount2: Integer): Integer; +var + WideStr1, WideStr2: WideString; + AnsiStr1, AnsiStr2: AnsiString; +begin + if Win32PlatformIsUnicode then + Result := CompareStringW{TNT-ALLOW CompareStringW}(Locale, dwCmpFlags, lpString1, cchCount1, lpString2, cchCount2) + else begin + WideStr1 := _WStr(lpString1, cchCount1); + WideStr2 := _WStr(lpString2, cchCount2); + if (dwCmpFlags = 0) then begin + // binary comparison + if WideStr1 < WideStr2 then + Result := 1 + else if WideStr1 = WideStr2 then + Result := 2 + else + Result := 3; + end else begin + AnsiStr1 := WideStr1; + AnsiStr2 := WideStr2; + Result := CompareStringA{TNT-ALLOW CompareStringA}(Locale, dwCmpFlags, + PAnsiChar(AnsiStr1), -1, PAnsiChar(AnsiStr2), -1); + end; + end; +end; + +function Tnt_CharUpperW(lpsz: PWideChar): PWideChar; +var + AStr: AnsiString; + WStr: WideString; +begin + if Win32PlatformIsUnicode then + Result := CharUpperW{TNT-ALLOW CharUpperW}(lpsz) + else begin + if HiWord(Cardinal(lpsz)) = 0 then begin + // literal char mode + Result := lpsz; + if IsWideCharMappableToAnsi(WideChar(lpsz)) then begin + AStr := WideChar(lpsz); // single character may be more than one byte + CharUpperA{TNT-ALLOW CharUpperA}(PAnsiChar(AStr)); + WStr := AStr; // should always be single wide char + if Length(WStr) = 1 then + Result := PWideChar(WStr[1]); + end + end else begin + // null-terminated string mode + Result := lpsz; + while lpsz^ <> #0 do begin + lpsz^ := WideChar(Tnt_CharUpperW(PWideChar(lpsz^))); + Inc(lpsz); + end; + end; + end; +end; + +function Tnt_CharUpperBuffW(lpsz: PWideChar; cchLength: DWORD): DWORD; +var + i: integer; +begin + if Win32PlatformIsUnicode then + Result := CharUpperBuffW{TNT-ALLOW CharUpperBuffW}(lpsz, cchLength) + else begin + Result := cchLength; + for i := 1 to cchLength do begin + lpsz^ := WideChar(Tnt_CharUpperW(PWideChar(lpsz^))); + Inc(lpsz); + end; + end; +end; + +function Tnt_CharLowerW(lpsz: PWideChar): PWideChar; +var + AStr: AnsiString; + WStr: WideString; +begin + if Win32PlatformIsUnicode then + Result := CharLowerW{TNT-ALLOW CharLowerW}(lpsz) + else begin + if HiWord(Cardinal(lpsz)) = 0 then begin + // literal char mode + Result := lpsz; + if IsWideCharMappableToAnsi(WideChar(lpsz)) then begin + AStr := WideChar(lpsz); // single character may be more than one byte + CharLowerA{TNT-ALLOW CharLowerA}(PAnsiChar(AStr)); + WStr := AStr; // should always be single wide char + if Length(WStr) = 1 then + Result := PWideChar(WStr[1]); + end + end else begin + // null-terminated string mode + Result := lpsz; + while lpsz^ <> #0 do begin + lpsz^ := WideChar(Tnt_CharLowerW(PWideChar(lpsz^))); + Inc(lpsz); + end; + end; + end; +end; + +function Tnt_CharLowerBuffW(lpsz: PWideChar; cchLength: DWORD): DWORD; +var + i: integer; +begin + if Win32PlatformIsUnicode then + Result := CharLowerBuffW{TNT-ALLOW CharLowerBuffW}(lpsz, cchLength) + else begin + Result := cchLength; + for i := 1 to cchLength do begin + lpsz^ := WideChar(Tnt_CharLowerW(PWideChar(lpsz^))); + Inc(lpsz); + end; + end; +end; + +function Tnt_GetStringTypeExW(Locale: LCID; dwInfoType: DWORD; + lpSrcStr: PWideChar; cchSrc: Integer; var lpCharType): BOOL; +var + AStr: AnsiString; +begin + if Win32PlatformIsUnicode then + Result := GetStringTypeExW{TNT-ALLOW GetStringTypeExW}(Locale, dwInfoType, lpSrcStr, cchSrc, lpCharType) + else begin + AStr := _WStr(lpSrcStr, cchSrc); + Result := GetStringTypeExA{TNT-ALLOW GetStringTypeExA}(Locale, dwInfoType, + PAnsiChar(AStr), -1, lpCharType); + end; +end; + +function Win9x_LoadStringW(hInstance: HINST; uID: UINT; lpBuffer: PWideChar; nBufferMax: Integer): Integer; +// This function originated by the WINE Project. +// It was translated to Pascal by Francisco Leong. +// It was further modified by Troy Wolbrink. +var + hmem: HGLOBAL; + hrsrc: THandle; + p: PWideChar; + string_num, i: Integer; + block: Integer; +begin + Result := 0; + // Netscape v3 fix... + if (HIWORD(uID) = $FFFF) then begin + uID := UINT(-(Integer(uID))); + end; + // figure block, string_num + block := ((uID shr 4) and $FFFF) + 1; // bits 4 - 19, mask out bits 20 - 31, inc by 1 + string_num := uID and $000F; + // get handle & pointer to string block + hrsrc := FindResource{TNT-ALLOW FindResource}(hInstance, MAKEINTRESOURCE(block), RT_STRING); + if (hrsrc <> 0) then + begin + hmem := LoadResource(hInstance, hrsrc); + if (hmem <> 0) then + begin + p := LockResource(hmem); + // walk the block to the requested string + for i := 0 to string_num - 1 do begin + p := p + Integer(p^) + 1; + end; + Result := Integer(p^); { p points to the length of string } + Inc(p); { p now points to the actual string } + if (lpBuffer <> nil) and (nBufferMax > 0) then + begin + Result := min(nBufferMax - 1, Result); { max length to copy } + if (Result > 0) then begin + CopyMemory(lpBuffer, p, Result * sizeof(WideChar)); + end; + lpBuffer[Result] := WideChar(0); { null terminate } + end; + end; + end; +end; + +function Tnt_LoadStringW(hInstance: HINST; uID: UINT; lpBuffer: PWideChar; nBufferMax: Integer): Integer; +begin + if Win32PlatformIsUnicode then + Result := Windows.LoadStringW{TNT-ALLOW LoadStringW}(hInstance, uID, lpBuffer, nBufferMax) + else + Result := Win9x_LoadStringW(hInstance, uID, lpBuffer, nBufferMax); +end; + +function Tnt_InsertMenuItemW(hMenu: HMENU; uItem: DWORD; fByPosition: BOOL; lpmii: TMenuItemInfoW): BOOL; +begin + if Win32PlatformIsUnicode then + Result := InsertMenuItemW{TNT-ALLOW InsertMenuItemW}(hMenu, uItem, fByPosition, lpmii) + else begin + TMenuItemInfoA(lpmii).dwTypeData := PAnsiChar(AnsiString(lpmii.dwTypeData)); + Result := InsertMenuItemA{TNT-ALLOW InsertMenuItemA}(hMenu, uItem, fByPosition, TMenuItemInfoA(lpmii)); + end; +end; + +function Tnt_ExtractIconExW(lpszFile: PWideChar; nIconIndex: Integer; + var phiconLarge, phiconSmall: HICON; nIcons: UINT): UINT; +begin + if Win32PlatformIsUnicode then + Result := ExtractIconExW{TNT-ALLOW ExtractIconExW}(lpszFile, + nIconIndex, phiconLarge, phiconSmall, nIcons) + else + Result := ExtractIconExA{TNT-ALLOW ExtractIconExA}(PAnsiChar(AnsiString(lpszFile)), + nIconIndex, phiconLarge, phiconSmall, nIcons); +end; + +function Tnt_ExtractAssociatedIconW(hInst: HINST; lpIconPath: PWideChar; + var lpiIcon: Word): HICON; +begin + if Win32PlatformIsUnicode then + Result := ExtractAssociatedIconW{TNT-ALLOW ExtractAssociatedIconW}(hInst, lpIconPath, lpiIcon) + else + Result := ExtractAssociatedIconA{TNT-ALLOW ExtractAssociatedIconA}(hInst, + PAnsiChar(AnsiString(lpIconPath)), lpiIcon) +end; + +function Tnt_GetFileVersionInfoSizeW(lptstrFilename: PWideChar; var lpdwHandle: DWORD): DWORD; +begin + if Win32PlatformIsUnicode then + Result := GetFileVersionInfoSizeW{TNT-ALLOW GetFileVersionInfoSizeW}(lptstrFilename, lpdwHandle) + else + Result := GetFileVersionInfoSizeA{TNT-ALLOW GetFileVersionInfoSizeA}(PAnsiChar(AnsiString(lptstrFilename)), lpdwHandle); +end; + +function Tnt_GetFileVersionInfoW(lptstrFilename: PWideChar; dwHandle, dwLen: DWORD; + lpData: Pointer): BOOL; +begin + if Win32PlatformIsUnicode then + Result := GetFileVersionInfoW{TNT-ALLOW GetFileVersionInfoW}(lptstrFilename, dwHandle, dwLen, lpData) + else + Result := GetFileVersionInfoA{TNT-ALLOW GetFileVersionInfoA}(PAnsiChar(AnsiString(lptstrFilename)), dwHandle, dwLen, lpData); +end; + +var + Last_VerQueryValue_String: WideString; + +function Tnt_VerQueryValueW(pBlock: Pointer; lpSubBlock: PWideChar; + var lplpBuffer: Pointer; var puLen: UINT): BOOL; +var + AnsiBuff: AnsiString; +begin + if Win32PlatformIsUnicode then + Result := VerQueryValueW{TNT-ALLOW VerQueryValueW}(pBlock, lpSubBlock, lplpBuffer, puLen) + else begin + Result := VerQueryValueA{TNT-ALLOW VerQueryValueA}(pBlock, PAnsiChar(AnsiString(lpSubBlock)), lplpBuffer, puLen); + if WideTextPos(VQV_STRINGFILEINFO, lpSubBlock) <> 1 then + else begin + { /StringFileInfo, convert ansi result to unicode } + SetString(AnsiBuff, PAnsiChar(lplpBuffer), puLen); + Last_VerQueryValue_String := AnsiBuff; + lplpBuffer := PWideChar(Last_VerQueryValue_String); + puLen := Length(Last_VerQueryValue_String); + end; + end; +end; + +//--------------------------------------------------------------------------------------- +// Wide functions from Shell32.dll should be loaded dynamically (no stub on early Win95) +//--------------------------------------------------------------------------------------- + +type + TSHFileOperationW = function(var lpFileOp: TSHFileOpStructW): Integer; stdcall; + TSHBrowseForFolderW = function(var lpbi: TBrowseInfoW): PItemIDList; stdcall; + TSHGetPathFromIDListW = function(pidl: PItemIDList; pszPath: PWideChar): BOOL; stdcall; + TSHGetFileInfoW = function(pszPath: PWideChar; dwFileAttributes: DWORD; + var psfi: TSHFileInfoW; cbFileInfo, uFlags: UINT): DWORD; stdcall; + +var + Safe_SHFileOperationW: TSHFileOperationW = nil; + Safe_SHBrowseForFolderW: TSHBrowseForFolderW = nil; + Safe_SHGetPathFromIDListW: TSHGetPathFromIDListW = nil; + Safe_SHGetFileInfoW: TSHGetFileInfoW = nil; + +var Shell32DLL: HModule = 0; + +procedure LoadWideShell32Procs; +begin + if Shell32DLL = 0 then begin + Shell32DLL := WinCheckH(Tnt_LoadLibraryW('shell32.dll')); + Safe_SHFileOperationW := WinCheckP(GetProcAddress(Shell32DLL, 'SHFileOperationW')); + Safe_SHBrowseForFolderW := WinCheckP(GetProcAddress(Shell32DLL, 'SHBrowseForFolderW')); + Safe_SHGetPathFromIDListW := WinCheckP(GetProcAddress(Shell32DLL, 'SHGetPathFromIDListW')); + Safe_SHGetFileInfoW := WinCheckP(GetProcAddress(Shell32DLL, 'SHGetFileInfoW')); + end; +end; + +function Tnt_SHFileOperationW(var lpFileOp: TSHFileOpStructW): Integer; +var + AnsiFileOp: TSHFileOpStructA; + MapCount: Integer; + PAnsiMap: PSHNameMappingA; + PWideMap: PSHNameMappingW; + OldPath: WideString; + NewPath: WideString; + i: integer; +begin + if Win32PlatformIsUnicode then begin + LoadWideShell32Procs; + Result := Safe_SHFileOperationW(lpFileOp); + end else begin + AnsiFileOp := TSHFileOpStructA(lpFileOp); + // convert PChar -> PWideChar + if lpFileOp.pFrom = nil then + AnsiFileOp.pFrom := nil + else + AnsiFileOp.pFrom := PAnsiChar(AnsiString(ExtractStringArrayStr(lpFileOp.pFrom))); + if lpFileOp.pTo = nil then + AnsiFileOp.pTo := nil + else + AnsiFileOp.pTo := PAnsiChar(AnsiString(ExtractStringArrayStr(lpFileOp.pTo))); + AnsiFileOp.lpszProgressTitle := PAnsiChar(AnsiString(lpFileOp.lpszProgressTitle)); + Result := SHFileOperationA{TNT-ALLOW SHFileOperationA}(AnsiFileOp); + // return struct results + lpFileOp.fAnyOperationsAborted := AnsiFileOp.fAnyOperationsAborted; + lpFileOp.hNameMappings := nil; + if (AnsiFileOp.hNameMappings <> nil) + and ((FOF_WANTMAPPINGHANDLE and AnsiFileOp.fFlags) <> 0) then begin + // alloc mem + MapCount := PSHNameMappingHeaderA(AnsiFileOp.hNameMappings).cNumOfMappings; + lpFileOp.hNameMappings := + AllocMem(SizeOf({hNameMappings}Cardinal) + SizeOf(TSHNameMappingW) * MapCount); + PSHNameMappingHeaderW(lpFileOp.hNameMappings).cNumOfMappings := MapCount; + // init pointers + PAnsiMap := PSHNameMappingHeaderA(AnsiFileOp.hNameMappings).lpNM; + PWideMap := PSHNameMappingHeaderW(lpFileOp.hNameMappings).lpNM; + for i := 1 to MapCount do begin + // old path + OldPath := Copy(PAnsiMap.pszOldPath, 1, PAnsiMap.cchOldPath); + PWideMap.pszOldPath := WStrNew(PWideChar(OldPath)); + PWideMap.cchOldPath := WStrLen(PWideMap.pszOldPath); + // new path + NewPath := Copy(PAnsiMap.pszNewPath, 1, PAnsiMap.cchNewPath); + PWideMap.pszNewPath := WStrNew(PWideChar(NewPath)); + PWideMap.cchNewPath := WStrLen(PWideMap.pszNewPath); + // next record + Inc(PAnsiMap); + Inc(PWideMap); + end; + end; + end; +end; + +procedure Tnt_SHFreeNameMappings(hNameMappings: THandle); +var + i: integer; + MapCount: Integer; + PWideMap: PSHNameMappingW; +begin + if Win32PlatformIsUnicode then + SHFreeNameMappings{TNT-ALLOW SHFreeNameMappings}(hNameMappings) + else begin + // free strings + MapCount := PSHNameMappingHeaderW(hNameMappings).cNumOfMappings; + PWideMap := PSHNameMappingHeaderW(hNameMappings).lpNM; + for i := 1 to MapCount do begin + WStrDispose(PWideMap.pszOldPath); + WStrDispose(PWideMap.pszNewPath); + Inc(PWideMap); + end; + // free struct + FreeMem(Pointer(hNameMappings)); + end; +end; + +function Tnt_SHBrowseForFolderW(var lpbi: TBrowseInfoW): PItemIDList; +var + AnsiInfo: TBrowseInfoA; + AnsiBuffer: array[0..MAX_PATH] of AnsiChar; +begin + if Win32PlatformIsUnicode then begin + LoadWideShell32Procs; + Result := Safe_SHBrowseForFolderW(lpbi); + end else begin + AnsiInfo := TBrowseInfoA(lpbi); + AnsiInfo.lpszTitle := PAnsiChar(AnsiString(lpbi.lpszTitle)); + if lpbi.pszDisplayName <> nil then + AnsiInfo.pszDisplayName := AnsiBuffer; + Result := SHBrowseForFolderA{TNT-ALLOW SHBrowseForFolderA}(AnsiInfo); + if lpbi.pszDisplayName <> nil then + WStrPCopy(lpbi.pszDisplayName, AnsiInfo.pszDisplayName); + lpbi.iImage := AnsiInfo.iImage; + end; +end; + +function Tnt_SHGetPathFromIDListW(pidl: PItemIDList; pszPath: PWideChar): BOOL; +var + AnsiPath: AnsiString; +begin + if Win32PlatformIsUnicode then begin + LoadWideShell32Procs; + Result := Safe_SHGetPathFromIDListW(pidl, pszPath); + end else begin + SetLength(AnsiPath, MAX_PATH); + Result := SHGetPathFromIDListA{TNT-ALLOW SHGetPathFromIDListA}(pidl, PAnsiChar(AnsiPath)); + if Result then + WStrPCopy(pszPath, PAnsiChar(AnsiPath)) + end; +end; + +function Tnt_SHGetFileInfoW(pszPath: PWideChar; dwFileAttributes: DWORD; + var psfi: TSHFileInfoW; cbFileInfo, uFlags: UINT): DWORD; +var + SHFileInfoA: TSHFileInfoA; +begin + if Win32PlatformIsUnicode then begin + LoadWideShell32Procs; + Result := Safe_SHGetFileInfoW(pszPath, dwFileAttributes, psfi, cbFileInfo, uFlags) + end else begin + Result := SHGetFileInfoA{TNT-ALLOW SHGetFileInfoA}(PAnsiChar(AnsiString(pszPath)), + dwFileAttributes, SHFileInfoA, SizeOf(TSHFileInfoA), uFlags); + // update pfsi... + ZeroMemory(@psfi, SizeOf(TSHFileInfoW)); + psfi.hIcon := SHFileInfoA.hIcon; + psfi.iIcon := SHFileInfoA.iIcon; + psfi.dwAttributes := SHFileInfoA.dwAttributes; + WStrPLCopy(psfi.szDisplayName, SHFileInfoA.szDisplayName, MAX_PATH); + WStrPLCopy(psfi.szTypeName, SHFileInfoA.szTypeName, 80); + end; +end; + + +function Tnt_Is_IntResource(ResStr: LPCWSTR): Boolean; +begin + Result := HiWord(Cardinal(ResStr)) = 0; +end; + +function LANGIDFROMLCID(lcid: LCID): WORD; +begin + Result := LoWord(lcid); +end; + +function MAKELANGID(usPrimaryLanguage, usSubLanguage: WORD): WORD; +begin + Result := (usSubLanguage shl 10) or usPrimaryLanguage; +end; + +function MAKELCID(wLanguageID: WORD; wSortID: WORD = SORT_DEFAULT): LCID; +begin + Result := MakeLong(wLanguageID, wSortID); +end; + +function PRIMARYLANGID(lgid: WORD): WORD; +begin + Result := lgid and $03FF; +end; + +function SORTIDFROMLCID(lcid: LCID): WORD; +begin + Result := HiWord(lcid); +end; + +function SUBLANGID(lgid: WORD): WORD; +begin + Result := lgid shr 10; +end; + +initialization + +finalization + if Shell32DLL <> 0 then + FreeLibrary(Shell32DLL); + +end.