From 6a34259518f5d7b7c51a6bcdba4a11c26b4a54a0 Mon Sep 17 00:00:00 2001 From: Mark van Renswoude Date: Sun, 9 Dec 2007 12:02:11 +0000 Subject: [PATCH] Added: working ComponentSwitcher implementation --- Lib/D2006/UnitSwitcherD2006.bpl | Bin 96256 -> 117760 bytes Packages/D2006/UnitSwitcher.bdsproj | 3 +- Packages/D2006/UnitSwitcher.dpk | 16 +- Resources/Component.ico | Bin 0 -> 1406 bytes Resources/ReadOnly.ico | Bin 318 -> 318 bytes Source/BaseSwDialog.dfm | 460 +--------------------- Source/BaseSwDialog.pas | 471 ++++++---------------- Source/BaseSwFilters.pas | 8 +- Source/CmpSwClient.pas | 202 +++------- Source/CmpSwDialog.dfm | 151 +++++++ Source/CmpSwDialog.pas | 52 +++ Source/CmpSwObjects.pas | 60 +++ Source/UnSwConfiguration.dfm | 4 +- Source/UnSwConfiguration.pas | 2 +- Source/UnSwDialog.dfm | 265 +++---------- Source/UnSwDialog.pas | 590 ++++++---------------------- Source/UnSwFilters.pas | 6 +- Source/UnSwObjects.pas | 2 +- 18 files changed, 636 insertions(+), 1656 deletions(-) create mode 100644 Resources/Component.ico create mode 100644 Source/CmpSwDialog.dfm create mode 100644 Source/CmpSwDialog.pas create mode 100644 Source/CmpSwObjects.pas diff --git a/Lib/D2006/UnitSwitcherD2006.bpl b/Lib/D2006/UnitSwitcherD2006.bpl index 481fee75cda7be6a7580852d56e356105a321f36..1f15c10fbc0f61659b6a1125278987b8dfb057b2 100644 GIT binary patch literal 117760 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 literal 96256 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 diff --git a/Packages/D2006/UnitSwitcher.bdsproj b/Packages/D2006/UnitSwitcher.bdsproj index 6039fbf..4176c8d 100644 --- a/Packages/D2006/UnitSwitcher.bdsproj +++ b/Packages/D2006/UnitSwitcher.bdsproj @@ -165,8 +165,7 @@ 1.0.0.0 - - + UnitSwitcher diff --git a/Packages/D2006/UnitSwitcher.dpk b/Packages/D2006/UnitSwitcher.dpk index 6519545..1811dae 100644 --- a/Packages/D2006/UnitSwitcher.dpk +++ b/Packages/D2006/UnitSwitcher.dpk @@ -29,7 +29,11 @@ package UnitSwitcher; requires rtl, - designide; + designide, + vcl, + xmlrtl, + vclactnband, + vclx; contains UnSwClient in '..\..\Source\UnSwClient.pas', @@ -38,6 +42,14 @@ contains UnSwFilters in '..\..\Source\UnSwFilters.pas', UnSwConfiguration in '..\..\Source\UnSwConfiguration.pas' {frmUnSwConfiguration}, UnSwSettings in '..\..\Source\UnSwSettings.pas', - UnSwShortcuts in '..\..\Source\UnSwShortcuts.pas' {frmUnSwShortcuts}; + UnSwShortcuts in '..\..\Source\UnSwShortcuts.pas' {frmUnSwShortcuts}, + CmpSwClient in '..\..\Source\CmpSwClient.pas', + BaseSwClient in '..\..\Source\BaseSwClient.pas', + BaseSwDialog in '..\..\Source\BaseSwDialog.pas' {frmBaseSwDialog}, + BaseSwFilters in '..\..\Source\BaseSwFilters.pas', + BaseSwObjects in '..\..\Source\BaseSwObjects.pas', + UnSwReg in '..\..\Source\UnSwReg.pas', + CmpSwDialog in '..\..\Source\CmpSwDialog.pas' {frmCmpSwDialog}, + CmpSwObjects in '..\..\Source\CmpSwObjects.pas'; end. diff --git a/Resources/Component.ico b/Resources/Component.ico new file mode 100644 index 0000000000000000000000000000000000000000..40209a7572318dcfebc5022375c6e06072749261 GIT binary patch literal 1406 zcmeH{=~InS9LGO5Zi~8H&xA*|8m(GXh&0&>NxHNVk+o7G7ni!ZEvSs8D3eh`gE5w} zRJP2dscG(z<%MO&*co}j7&DgPMe{gmuJM9@!1z7$dCvKM&-2VV=l7d)KqVfn7V)+v zO$`G9Pl2#-7IgbRL)Fv#>Ra?$;phbhfl*)rjZuTNQ9?G#xaGRxlj}o(DS(;j-Wc>F zIUL-dlOAw-3{)i!<k{NN5n5Rdg%{CmZ(vAS6E1r%l2}&D!qP@o9I7YgT?z5Zev*}gq$|f@Uz;ex9h@rL zajj~Fn){+KPmzw@!>h(D_Iw-8y%t62#QyqAB95A|Yx@kX-{3|UJXDaLbfI~pp!%-h z^-94*Q3w(!H;Yj29uNutAOBhg6j9&5M<1K8p274bOEbd9s(nYRrU@f+S<3p<d=aEAtZQq{h!Nt|p&0Uh5 zEIL}Jn>$K&9AMFNV`JkI2FsE~CoV48ndC7=RbpQJUqr2;o literal 0 HcmV?d00001 diff --git a/Resources/ReadOnly.ico b/Resources/ReadOnly.ico index 06809b3bf827c19aa95e12a5305533df54842d3c..6da04f80c6b1491c63337a56d0ef8e7c5dc2b879 100644 GIT binary patch literal 318 zcmbtOI~IT-3=8kMxWVG==rQpKj-9v)?|CXGObTu~*^;C*dMOGI8_|)Oa~Cp8BBRzyqxnK>stBf9B1K9r!AxJm%5}J!b$#|j=W_WunEAaw)K1Q^ QkMa0WpKtW!`JCT+1H%2XsP=jD2RtKC4fH4W{5ER4fJ2^z0~BqyUMPbEZxx377#ClF3SJ zZckiC!o)(6Fe+OjXst0&|4_A#uxw=Fuh#H=2|sVwV?6KqoA diff --git a/Source/BaseSwDialog.dfm b/Source/BaseSwDialog.dfm index 274cf57..8fb3bc3 100644 --- a/Source/BaseSwDialog.dfm +++ b/Source/BaseSwDialog.dfm @@ -1,10 +1,10 @@ object frmBaseSwDialog: TfrmBaseSwDialog Left = 284 Top = 120 - Width = 320 - Height = 425 BorderIcons = [biSystemMenu] Caption = 'UnitSwitcher' + ClientHeight = 398 + ClientWidth = 312 Color = clBtnFace Constraints.MinHeight = 240 Constraints.MinWidth = 290 @@ -27,6 +27,7 @@ object frmBaseSwDialog: TfrmBaseSwDialog OldCreateOrder = False Position = poScreenCenter OnResize = FormResize + OnShow = FormShow PixelsPerInch = 96 TextHeight = 13 object sbStatus: TStatusBar @@ -83,7 +84,7 @@ object frmBaseSwDialog: TfrmBaseSwDialog Align = alClient ItemHeight = 20 MultiSelect = True - PopupMenu = pmnUnits + PopupMenu = pmnItems TabOrder = 1 OnClick = lstItemsClick OnData = lstItemsData @@ -151,409 +152,6 @@ object frmBaseSwDialog: TfrmBaseSwDialog object ilsTypes: TImageList Left = 28 Top = 228 - Bitmap = { - 494C010106000900040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 - 0000000000003600000028000000400000003000000001002000000000000030 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000C0C0C000C0C0C000C0C0C000C0C0C0000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000FFFFFF00808080008080 - 8000808080008080800080808000808080008080800080808000808080008080 - 8000808080000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000FFFFFF000000800000008000C0C0C0000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00C0C0 - C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0 - C000808080000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000FFFFFF000000FF0000008000C0C0C0000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000FFFFFF00C0C0C000FFFF - FF00C0C0C000FFFFFF00C0C0C000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000FFFFFF00FFFFFF00FFFFFF00C0C0C0000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00C0C0 - C000FFFFFF00C0C0C000FFFFFF0000000000FFFFFF0080808000808080008080 - 8000808080008080800080808000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000FFFFFF000000800000008000C0C0C0000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000FFFFFF00C0C0C000FFFF - FF00C0C0C000FFFFFF00C0C0C00000000000FFFFFF00FFFFFF00C0C0C000FFFF - FF00C0C0C000FFFFFF0080808000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000FFFFFF000000FF0000008000C0C0C0000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00C0C0 - C000FFFFFF00C0C0C000FFFFFF0000000000FFFFFF00C0C0C000FFFFFF00C0C0 - C000FFFFFF00C0C0C00080808000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000FFFFFF000000FF0000008000C0C0C0000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000FFFFFF00C0C0C000FFFF - FF00C0C0C000FFFFFF00C0C0C00000000000FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000FFFFFF000000FF0000008000C0C0C0000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00C0C0 - C000FFFFFF00C0C0C000FFFFFF00000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000FFFFFF000000FF0000008000C0C0C0000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000FFFFFF00C0C0C000FFFF - FF00C0C0C000FFFFFF00C0C0C00000000000FF000000FF000000FF000000FF00 - 0000FF00000000000000C0C0C000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000FFFFFF000000FF0000008000C0C0C0000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00C0C0 - C000FFFFFF00C0C0C000FFFFFF00000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000FFFFFF00FFFFFF00FFFFFF00C0C0C0000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000FFFFFF00C0C0C000FFFF - FF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFF - FF00808080000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000FF000000FF000000FF00 - 0000FF000000FF000000FF00000000000000C0C0C00000000000C0C0C0000000 - 0000C0C0C0000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000008000 - 0000000000000000000080808000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000FFFFFF008080800080808000808080008080800080808000808080008080 - 8000808080008080800080808000000000000000000000000000000000000000 - 0000FFFFFF008080800080808000808080008080800080808000808080008080 - 8000808080008080800080808000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000080000000800000008000 - 0000800000000000000080808000C0C0C000C0C0C000C0C0C000C0C0C0000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000FFFFFF00FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFF - FF00C0C0C000FFFFFF0080808000000000000000000000000000000000000000 - 0000FFFFFF00FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFF - FF00C0C0C000FFFFFF0080808000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000080000000000000008000 - 0000000000000000000080808000808080008080800000000000808080008080 - 8000000000000000000000000000000000000000000000000000000000000000 - 0000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0 - C000FFFFFF00C0C0C00080808000000000000000000000000000000000000000 - 0000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0 - C000FFFFFF00C0C0C000808080000000000000000000FFFFFF00808080008080 - 8000808080008080800080808000808080008080800080808000808080008080 - 8000808080008080800080808000000000000000000080000000000000000000 - 0000000000000000000000000000000000008080800000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000FFFFFF00FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFF - FF00C0C0C000FFFFFF0080808000000000000000000000000000000000000000 - 0000FFFFFF00FFFFFF0000000000000000000000000000000000000000000000 - 000000000000FFFFFF00808080000000000000000000FFFFFF00FFFFFF00C0C0 - C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0 - C000FFFFFF00C0C0C00080808000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0 - C000FFFFFF00C0C0C00080808000000000000000000000000000000000000000 - 0000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0 - C000FFFFFF00C0C0C000808080000000000000000000FFFFFF00C0C0C000FFFF - FF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFF - FF00C0C0C000FFFFFF0080808000000000008080800000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000FFFFFF00FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFF - FF00C0C0C000FFFFFF0080808000000000000000000000000000000000000000 - 0000FFFFFF000000FF000000FF000000FF000000FF000000FF000000FF000000 - FF000000FF000000FF00808080000000000000000000FFFFFF00FFFFFF00C0C0 - C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0 - C000FFFFFF00C0C0C00080808000000000008080800080808000000000000000 - 000000000000FFFFFF0080808000808080008080800080808000808080008080 - 8000808080008080800080808000000000000000000000000000000000000000 - 0000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0 - C000FFFFFF00C0C0C00080808000000000000000000080000000000000000000 - 0000FFFFFF000000FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF000000FF00808080000000000000000000FFFFFF00C0C0C000FFFF - FF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFF - FF00C0C0C000FFFFFF0080808000000000000000000000000000000000000000 - 000000000000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFF - FF00C0C0C000FFFFFF0080808000000000000000000000000000000000000000 - 0000FFFFFF00FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFF - FF00C0C0C000FFFFFF0080808000000000000000000000000000000000000000 - 0000FFFFFF000000FF000000FF000000FF000000FF000000FF000000FF000000 - FF000000FF000000FF00808080000000000000000000FFFFFF00FFFFFF00C0C0 - C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0 - C000FFFFFF00C0C0C00080808000000000000000000000000000000000000000 - 000000000000FFFFFF00FFFFFF00C0C0C0000000FF000000FF000000FF00C0C0 - C000FFFFFF00C0C0C00080808000000000000000000000000000000000000000 - 0000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0 - C000FFFFFF00C0C0C00080808000000000000000000000000000000000000000 - 0000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0 - C000FFFFFF00C0C0C000808080000000000000000000FFFFFF00C0C0C000FFFF - FF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFF - FF00C0C0C000FFFFFF0080808000000000000000000000000000000000000000 - 000000000000FFFFFF00C0C0C000FFFFFF000000FF000000FF00C0C0C000FFFF - FF00C0C0C000FFFFFF0080808000000000000000000000000000000000000000 - 0000FFFFFF00FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFF - FF00C0C0C000FFFFFF0080808000000000000000000000000000000000000000 - 0000FFFFFF00FFFFFF0000000000000000000000000000000000000000000000 - 0000C0C0C000FFFFFF00808080000000000000000000FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 - 000000000000FFFFFF00FFFFFF00C0C0C0000000FF00C0C0C0000000FF000000 - FF00FFFFFF00C0C0C00080808000000000000000000000000000000000000000 - 0000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0 - C000FFFFFF00C0C0C00080808000000000000000000000000000000000000000 - 0000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0 - C000FFFFFF008080800080808000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFF - FF00C0C0C000FFFFFF0080808000000000000000000000000000000000000000 - 0000FFFFFF00FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFF - FF00000000000000000000000000000000000000000000000000000000000000 - 0000FFFFFF00FFFFFF0000000000000000000000000000000000C0C0C000FFFF - FF000000000000000000000000000000000000000000FF000000FF000000FF00 - 0000FF000000FF000000FF000000FF000000FF00000000000000C0C0C0000000 - 0000C0C0C00000000000C0C0C000000000000000000000000000000000000000 - 000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 - 0000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0 - C00000000000FFFFFF0000000000000000000000000000000000000000000000 - 0000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0 - C00000000000FFFFFF0000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00000000000000000000000000000000000000000000000000000000000000 - 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000FF000000FF000000FF000000FF00000000000000C0C0C0000000 - 0000C0C0C00000000000C0C0C000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000424D3E000000000000003E000000 - 2800000040000000300000000100010000000000800100000000000000000000 - 000000000000000000000000FFFFFF0000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000003FFF0000000000003FFF000000000 - 0003FFF0000000000000FFF0000000000000FFF0000000000000FFF000000000 - 0000FFF0000000000000FFF0000000000000FFF0000000000000FFF000000000 - 0000FFF0000000000003FFFF000000000003FFFF000000000003FFFF00000000 - 0003FFFF000000000003FFFF00000000E000E000FFFFEC0FE000E000FFFF840F - E000E0000000AC0FE000E0000000BF3FE000E0000000FFFFE000600000001000 - E000200000001000E00000000000B000E00020000000F000E00060000000F000 - E000E0000000F000E000E0000000F000E000E0000000F000E001E0010000F000 - E003E003FFFFF000E007E007FFFFF00000000000000000000000000000000000 - 000000000000} end object alMain: TActionList Left = 84 @@ -579,58 +177,14 @@ object frmBaseSwDialog: TfrmBaseSwDialog OnExecute = actMRUNextExecute end end - object pmnUnits: TPopupMenu + object pmnItems: TPopupMenu Left = 140 Top = 228 - object pmnUnitsOpen: TMenuItem - Caption = '&Open' - ShortCut = 13 - end - object pmnUnitsOpenDFM: TMenuItem - Caption = 'Open D&FM' - ShortCut = 8205 - end - object pmnUnitsSep1: TMenuItem - Caption = '-' - end - object pmnUnitsSelectAll: TMenuItem + object pmnItemsSelectAll: TMenuItem Action = actSelectAll end - object pmnUnitsSelectInvert: TMenuItem + object pmnItemsSelectInvert: TMenuItem Action = actSelectInvert end - object pmnUnitsSep2: TMenuItem - Caption = '-' - end - object pmnUnitsSortByName: TMenuItem - Caption = 'Sort by &Name' - ShortCut = 49230 - end - object pmnUnitsSortByType: TMenuItem - Caption = 'Sort by &Type' - ShortCut = 49236 - end - object pmnUnitsSep3: TMenuItem - Caption = '-' - end - object pmnUnitsReadOnly: TMenuItem - Caption = '&Read only' - ShortCut = 49234 - end - object pmnUnitsSep4: TMenuItem - Caption = '-' - end - object pmnUnitsOpenFolder: TMenuItem - Caption = 'Open containing &folder' - ShortCut = 49222 - end - object pmnUnitsOpenProperties: TMenuItem - Caption = '.PAS &Properties' - ShortCut = 49165 - end - object pmnUnitsOpenDFMProperties: TMenuItem - Caption = '.&DFM Properties' - ShortCut = 24589 - end end end diff --git a/Source/BaseSwDialog.pas b/Source/BaseSwDialog.pas index 98dacfa..8cd9eef 100644 --- a/Source/BaseSwDialog.pas +++ b/Source/BaseSwDialog.pas @@ -33,7 +33,7 @@ type FImageIndex: Integer; FOverlayIndex: Integer; protected - procedure VisitItem(const AItem: TBaseSwItem); + procedure VisitItem(const AItem: TBaseSwItem); virtual; public property Color: TColor read FColor write FColor; property ImageIndex: Integer read FImageIndex write FImageIndex; @@ -53,21 +53,9 @@ type ilsTypes: TImageList; lblSubFilters: TLabel; lstItems: TListBox; - pmnUnits: TPopupMenu; - pmnUnitsOpen: TMenuItem; - pmnUnitsOpenDFM: TMenuItem; - pmnUnitsOpenDFMProperties: TMenuItem; - pmnUnitsOpenFolder: TMenuItem; - pmnUnitsOpenProperties: TMenuItem; - pmnUnitsReadOnly: TMenuItem; - pmnUnitsSelectAll: TMenuItem; - pmnUnitsSelectInvert: TMenuItem; - pmnUnitsSep1: TMenuItem; - pmnUnitsSep2: TMenuItem; - pmnUnitsSep3: TMenuItem; - pmnUnitsSep4: TMenuItem; - pmnUnitsSortByName: TMenuItem; - pmnUnitsSortByType: TMenuItem; + pmnItems: TPopupMenu; + pmnItemsSelectAll: TMenuItem; + pmnItemsSelectInvert: TMenuItem; pnlButtons: TPanel; pnlMain: TPanel; pnlSearch: TPanel; @@ -82,28 +70,23 @@ type procedure cmbSearchKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure cmbSearchKeyPress(Sender: TObject; var Key: Char); procedure FormResize(Sender: TObject); - procedure FormShow(Sender: TObject); - procedure lstItemsClick(Sender: TObject); procedure lstItemsData(Control: TWinControl; Index: Integer; var Data: string); procedure lstItemsDblClick(Sender: TObject); procedure lstItemsDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); procedure lstItemsMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); + procedure lstItemsClick(Sender: TObject); procedure btnOKClick(Sender: TObject); + procedure FormShow(Sender: TObject); private - FLoading: Boolean; FItemList: TBaseSwItemList; FActiveItem: TBaseSwItem; - FFormsOnly: Boolean; FMRUList: TStrings; FMRUIndex: Integer; FSubFilters: TStringList; - FOpenDFM: Boolean; -// FTypeFilteredList: TUnSwUnitList; FSubFilteredList: TBaseSwItemList; FInputFilteredList: TBaseSwItemList; -// FTypeFilter: TUnSwUnitTypeFilter; FSubFilter: TBaseSwItemSimpleFilter; FInputFilter: TBaseSwItemSimpleFilter; FLastFilter: String; @@ -111,9 +94,19 @@ type FStyleVisitor: TBaseSwStyleVisitor; protected function InternalExecute(): TBaseSwItemList; virtual; -// procedure UpdateTypeFilter(); procedure UpdateList(); virtual; + function CreateItemList(): TBaseSwItemList; virtual; + function CreateInputFilter(): TBaseSwItemSimpleFilter; virtual; + function CreateStyleVisitor(): TBaseSwStyleVisitor; virtual; + + function AllowEmptyResult(): Boolean; virtual; abstract; + function ColorsEnabled(): Boolean; virtual; + + function GetBaseItemList(): TBaseSwItemList; virtual; + function GetItemDisplayName(const AItem: TBaseSwItem): String; virtual; + procedure UpdateItemActions(); virtual; + function GetActiveItems(): TBaseSwItemList; procedure SelectMRUItem(); @@ -123,8 +116,10 @@ type procedure LoadSettings(); virtual; procedure SaveSettings(); virtual; - - procedure UpdateUnitActions(); + protected + property ActiveItem: TBaseSwItem read FActiveItem write FActiveItem; + property ItemList: TBaseSwItemList read FItemList write FItemList; + property MRUList: TStrings read FMRUList; public class function Execute(const AItems: TBaseSwItemList; const AActive: TBaseSwItem = nil): TBaseSwItemList; end; @@ -132,7 +127,8 @@ type implementation uses - SysUtils; + Messages, + SysUtils, Dialogs; const @@ -157,8 +153,8 @@ class function TfrmBaseSwDialog.Execute(const AItems: TBaseSwItemList; begin with Self.Create(nil) do try - FItemList := AItems; - FActiveItem := AActive; + ItemList := AItems; + ActiveItem := AActive; Result := InternalExecute(); finally @@ -173,6 +169,13 @@ begin end; +procedure TfrmBaseSwDialog.FormShow(Sender: TObject); +begin + // Setting ListBox.Selected[x] won't work before OnShow... + UpdateSubFilters(); +end; + + function TfrmBaseSwDialog.InternalExecute(): TBaseSwItemList; type TBaseSwItemSimpleFilterClass = class of TBaseSwItemSimpleFilter; @@ -185,33 +188,37 @@ var begin Result := nil; FSubFilters := TStringList.Create(); -// FTypeFilteredList := TUnSwUnitList.Create(); - FSubFilteredList := TBaseSwItemList.Create(); - FInputFilteredList := TBaseSwItemList.Create(); -// FTypeFilter := TUnSwUnitTypeFilter.Create; + FSubFilteredList := CreateItemList(); + FInputFilteredList := CreateItemList(); + FSubFilter := CreateInputFilter(); + FInputFilter := CreateInputFilter(); + + FMRUList := TStringList.Create(); try - FStyleVisitor := TUnSwStyleVisitor.Create(); + LoadSettings(); + + FStyleVisitor := CreateStyleVisitor(); try if Self.ShowModal() = mrOk then begin if Length(Trim(cmbSearch.Text)) > 0 then begin - iIndex := FMRUList.IndexOf(cmbSearch.Text); + iIndex := MRUList.IndexOf(cmbSearch.Text); if iIndex > -1 then - FMRUList.Delete(iIndex); + MRUList.Delete(iIndex); - while FMRUList.Count >= 10 do - FMRUList.Delete(Pred(FMRUList.Count)); + while MRUList.Count >= 10 do + MRUList.Delete(Pred(MRUList.Count)); mruText := cmbSearch.Text; for subFilterIndex := Pred(FSubFilters.Count) downto 0 do mruText := FSubFilters[subFilterIndex] + SubFilterSeparator; - FMRUList.Insert(0, mruText); + MRUList.Insert(0, mruText); end; - Result := GetActiveUnits(); + Result := GetActiveItems(); end; SaveSettings(); @@ -219,96 +226,50 @@ begin FreeAndNil(FStyleVisitor); end; finally + FreeAndNil(FMRUList); FreeAndNil(FInputFilter); FreeAndNil(FSubFilter); -// FreeAndNil(FTypeFilter); FreeAndNil(FSubFilteredList); FreeAndNil(FInputFilteredList); -// FreeAndNil(FTypeFilteredList); FreeAndNil(FSubFilters); end; end; -procedure TfrmBaseSwDialog.UpdateUnitActions(); -var - bDFM: Boolean; - bUnits: Boolean; - iUnit: Integer; - pUnits: TUnSwUnitList; - pVisitor: TUnSwReadOnlyVisitor; - sStatus: String; - +procedure TfrmBaseSwDialog.LoadSettings(); begin - { Read-only status } - pUnits := GetActiveUnits(); - if Assigned(pUnits) then - try - pVisitor := TUnSwReadOnlyVisitor.Create(); - try - pUnits.AcceptVisitor(pVisitor); - actReadOnly.Checked := (pVisitor.ReadOnlyCount > 0); + cmbSearch.Items.Assign(MRUList); +end; - sStatus := ''; - if pVisitor.ReadOnlyCount > 0 then - if pVisitor.ReadOnlyCount = 1 then - sStatus := '1 read-only unit selected' - else - sStatus := Format('%d read-only units selected', - [pVisitor.ReadOnlyCount]); - sbStatus.Panels[0].Text := sStatus; - finally - FreeAndNil(pVisitor); - end; - finally - FreeAndNil(pUnits); - end; +procedure TfrmBaseSwDialog.SaveSettings(); +begin +end; - { Properties } - bDFM := False; - bUnits := False; - pUnits := GetActiveUnits(); - if Assigned(pUnits) then - try - bUnits := (pUnits.Count > 0); - - for iUnit := 0 to Pred(pUnits.Count) do - if (pUnits[iUnit] is TUnSwModuleUnit) and - (TUnSwModuleUnit(pUnits[iUnit]).UnitType in [swutForm, swutDataModule]) then - begin - bDFM := True; - break; - end; - finally - FreeAndNil(pUnits); - end; - - actOpenFolder.Enabled := bUnits; - actOpenProperties.Enabled := bUnits; - actOpenDFMProperties.Enabled := bDFM; +procedure TfrmBaseSwDialog.UpdateItemActions(); +begin end; procedure TfrmBaseSwDialog.UpdateList(); var - activeUnit: TUnSwUnit; - activeUnits: TUnSwUnitList; + activeUnit: TBaseSwItem; + activeUnits: TBaseSwItemList; itemIndex: Integer; listIndex: Integer; - filteredList: TUnSwUnitList; + filteredList: TBaseSwItemList; selStart: Integer; begin - activeUnits := GetActiveUnits(); + activeUnits := GetActiveItems(); - filteredList := TUnSwUnitList.Create(); + filteredList := CreateItemList(); try filteredList.Clone(FSubFilteredList); FInputFilter.FilterList(filteredList); - if (filteredList.Count = 0) and (not Settings.Filter.AllowEmptyResult) then + if (filteredList.Count = 0) and (not AllowEmptyResult) then begin { Only enforce AllowEmptyResult when adding to the filter } if Length(FInputFilter.Filter) > Length(FLastFilter) then @@ -355,80 +316,6 @@ begin end; -function SortByName(Item1, Item2: Pointer): Integer; -begin - Result := CompareText(TUnSwUnit(Item1).Name, TUnSwUnit(Item2).Name) -end; - - -function SortByType(Item1, Item2: Pointer): Integer; -const - Above = -1; - Equal = 0; - Below = 1; - - function SortByModuleType(Item1, Item2: TUnSwUnitType): Integer; - begin - Result := Equal; - if Item1 <> Item2 then - case Item1 of - swutForm: - case Item2 of - swutDataModule: Result := Below; - swutUnit: Result := Above; - end; - swutDataModule: Result := Above; - swutUnit: Result := Below; - end; - end; - -var - pItem1: TUnSwUnit; - pItem2: TUnSwUnit; - -begin - // #ToDo3 Refactor SortByType - - // The following order is assumed: - // Project source, DataModules, Forms, Units - Result := Equal; - pItem1 := TUnSwUnit(Item1); - pItem2 := TUnSwUnit(Item2); - - if pItem1.ClassType <> pItem2.ClassType then - begin - if pItem1 is TUnSwProjectUnit then - Result := Above - else if pItem2 is TUnSwProjectUnit then - Result := Below; - end else if pItem1 is TUnSwModuleUnit then - Result := SortByModuleType(TUnSwModuleUnit(pItem1).UnitType, - TUnSwModuleUnit(pItem2).UnitType); - - if Result = Equal then - Result := SortByName(Item1, Item2); -end; - - -procedure TfrmBaseSwDialog.UpdateTypeFilter(); -begin - FTypeFilter.IncludeUnits := ((not FFormsOnly) and chkUnits.Checked); - FTypeFilter.IncludeProjectSource := ((not FFormsOnly) and chkProjectSource.Checked); - FTypeFilter.IncludeForms := chkForms.Checked; - FTypeFilter.IncludeDataModules := chkDataModules.Checked; - - FTypeFilteredList.Clone(FUnitList); - FTypeFilter.FilterList(FTypeFilteredList); - - if actSortByName.Checked then - FTypeFilteredList.Sort(SortByName) - else - FTypeFilteredList.Sort(SortByType); - - UpdateSubFilters(); -end; - - procedure TfrmBaseSwDialog.PopFilter(); begin if FSubFilters.Count > 0 then @@ -445,7 +332,7 @@ var sFilters: String; begin - FSubFilteredList.Clone(FTypeFilteredList); + FSubFilteredList.Clone(GetBaseItemList()); if FSubFilters.Count > 0 then begin @@ -470,7 +357,7 @@ var sFilter: String; begin - sFilter := Trim(AFilter); + sFilter := Trim(AFilter); Result := (Length(sFilter) > 0) and (FSubFilters.IndexOf(AFilter) = -1); if Result then begin @@ -480,22 +367,22 @@ begin end; -function TfrmBaseSwDialog.GetActiveUnits(): TUnSwUnitList; +function TfrmBaseSwDialog.GetActiveItems(): TBaseSwItemList; var itemIndex: Integer; begin Result := nil; - if Assigned(FActiveUnit) then + if Assigned(ActiveItem) then begin - Result := TUnSwUnitList.Create(); + Result := CreateItemList(); Result.OwnsObjects := False; - Result.Add(FActiveUnit); - FActiveUnit := nil; + Result.Add(ActiveItem); + ActiveItem := nil; end else if lstItems.SelCount > 0 then begin - Result := TUnSwUnitList.Create(); + Result := CreateItemList(); Result.OwnsObjects := False; for itemIndex := 0 to Pred(lstItems.Items.Count) do @@ -505,63 +392,39 @@ begin end; -procedure TfrmBaseSwDialog.LoadSettings(); -var - dialogSettings: TUnSwDialogSettings; - +function TfrmBaseSwDialog.GetBaseItemList(): TBaseSwItemList; begin - if FFormsOnly then - dialogSettings := Settings.FormsDialog - else - dialogSettings := Settings.UnitsDialog; - - FLoading := True; - try - chkDataModules.Checked := dialogSettings.IncludeDataModules; - chkForms.Checked := dialogSettings.IncludeForms; - chkUnits.Checked := dialogSettings.IncludeUnits; - chkProjectSource.Checked := dialogSettings.IncludeProjectSource; - - case dialogSettings.Sort of - dsName: actSortByName.Checked := True; - dsType: actSortByType.Checked := True; - end; - - FMRUList := dialogSettings.MRUList; - cmbSearch.Items.Assign(FMRUList); - - Self.ClientWidth := dialogSettings.Width; - Self.ClientHeight := dialogSettings.Height; - finally - FLoading := False; - end; + Result := ItemList; end; -procedure TfrmBaseSwDialog.SaveSettings(); -var - dialogSettings: TUnSwDialogSettings; - +function TfrmBaseSwDialog.GetItemDisplayName(const AItem: TBaseSwItem): String; begin - if FFormsOnly then - dialogSettings := Settings.FormsDialog - else - dialogSettings := Settings.UnitsDialog; + Result := AItem.Name; +end; - dialogSettings.IncludeDataModules := chkDataModules.Checked; - dialogSettings.IncludeForms := chkForms.Checked; - dialogSettings.IncludeUnits := chkUnits.Checked; - dialogSettings.IncludeProjectSource := chkProjectSource.Checked; - if actSortByName.Checked then - dialogSettings.Sort := dsName - else - dialogSettings.Sort := dsType; +function TfrmBaseSwDialog.ColorsEnabled(): Boolean; +begin + Result := False; +end; - dialogSettings.Width := Self.ClientWidth; - dialogSettings.Height := Self.ClientHeight; - Settings.Save(); +function TfrmBaseSwDialog.CreateItemList(): TBaseSwItemList; +begin + Result := TBaseSwItemList.Create(); +end; + + +function TfrmBaseSwDialog.CreateInputFilter(): TBaseSwItemSimpleFilter; +begin + Result := TBaseSwItemSimpleNameFilter.Create(); +end; + + +function TfrmBaseSwDialog.CreateStyleVisitor(): TBaseSwStyleVisitor; +begin + Result := nil; end; @@ -581,19 +444,14 @@ begin end; -procedure TfrmBaseSwDialog.SortExecute(Sender: TObject); +procedure TfrmBaseSwDialog.btnOKClick(Sender: TObject); begin - (Sender as TAction).Checked := True; - UpdateTypeFilter(); + ModalResult := mrOk; end; procedure TfrmBaseSwDialog.SelectMRUItem(); -var - mruText: String; - begin - mruText := FMRUList[FMRUIndex]; cmbSearch.ItemIndex := FMRUIndex; ActiveControl := cmbSearch; cmbSearch.SelectAll(); @@ -605,7 +463,7 @@ end; procedure TfrmBaseSwDialog.actMRUNextExecute(Sender: TObject); begin - if FMRUIndex < Pred(FMRUList.Count) then + if FMRUIndex < Pred(MRUList.Count) then Inc(FMRUIndex); SelectMRUItem(); @@ -621,58 +479,6 @@ begin end; -procedure TfrmBaseSwDialog.actOpenFolderExecute(Sender: TObject); -var - pUnits: TUnSwUnitList; - -begin - pUnits := GetActiveUnits(); - if Assigned(pUnits) then - try - pUnits.AcceptVisitor(TUnSwOpenFolderVisitor.Create()); - finally - FreeAndNil(pUnits); - end; -end; - - -procedure TfrmBaseSwDialog.actOpenPropertiesExecute(Sender: TObject); -var - pUnits: TUnSwUnitList; - -begin - pUnits := GetActiveUnits(); - if Assigned(pUnits) then - try - pUnits.AcceptVisitor(TUnSwOpenPropertiesVisitor.Create()); - finally - FreeAndNil(pUnits); - end; -end; - - -procedure TfrmBaseSwDialog.actOpenDFMPropertiesExecute(Sender: TObject); -var - pUnits: TUnSwUnitList; - -begin - pUnits := GetActiveUnits(); - if Assigned(pUnits) then - try - pUnits.AcceptVisitor(TUnSwOpenDFMPropertiesVisitor.Create()); - finally - FreeAndNil(pUnits); - end; -end; - - -procedure TfrmBaseSwDialog.btnConfigurationClick(Sender: TObject); -begin - if TfrmUnSwConfiguration.Execute() then - lstItems.Invalidate(); -end; - - procedure TfrmBaseSwDialog.cmbSearchChange(Sender: TObject); begin if cmbSearch.Text <> FInputFilter.Filter then @@ -721,13 +527,6 @@ begin end; -procedure TfrmBaseSwDialog.TypeFilterChange(Sender: TObject); -begin - if not FLoading then - UpdateTypeFilter(); -end; - - procedure TfrmBaseSwDialog.lstItemsDblClick(Sender: TObject); begin btnOK.Click(); @@ -736,7 +535,7 @@ end; procedure TfrmBaseSwDialog.lstItemsClick(Sender: TObject); begin - UpdateUnitActions(); + UpdateItemActions(); end; @@ -750,20 +549,18 @@ end; procedure TfrmBaseSwDialog.lstItemsDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var - currentUnit: TUnSwUnit; + currentItem: TBaseSwItem; textRect: TRect; text: String; begin with TListBox(Control) do begin - currentUnit := FInputFilteredList[Index]; - currentUnit.AcceptVisitor(FStyleVisitor); - - if FFormsOnly and (currentUnit is TUnSwModuleUnit) then - text := TUnSwModuleUnit(currentUnit).FormName - else - text := currentUnit.Name; + currentItem := FInputFilteredList[Index]; + if Assigned(FStyleVisitor) then + currentItem.AcceptVisitor(FStyleVisitor); + + text := GetItemDisplayName(currentItem); if odSelected in State then begin @@ -772,7 +569,8 @@ begin end else begin Canvas.Brush.Color := clWindow; - if Settings.Colors.Enabled then + + if Assigned(FStyleVisitor) and ColorsEnabled() then Canvas.Font.Color := FStyleVisitor.Color else Canvas.Font.Color := clWindowText; @@ -781,10 +579,14 @@ begin textRect := Rect; InflateRect(textRect, -2, -2); - ilsTypes.Draw(Canvas, textRect.Left, textRect.Top, FStyleVisitor.ImageIndex); - if FStyleVisitor.OverlayIndex > -1 then - ilsTypes.Draw(Canvas, textRect.Left, textRect.Top, FStyleVisitor.OverlayIndex); + if Assigned(FStyleVisitor) then + begin + ilsTypes.Draw(Canvas, textRect.Left, textRect.Top, FStyleVisitor.ImageIndex); + + if FStyleVisitor.OverlayIndex > -1 then + ilsTypes.Draw(Canvas, textRect.Left, textRect.Top, FStyleVisitor.OverlayIndex); + end; Inc(textRect.Left, ilsTypes.Width + 4); DrawText(Canvas.Handle, PChar(text), Length(text), textRect, DT_SINGLELINE or @@ -807,54 +609,9 @@ begin begin lstItems.ClearSelection; lstItems.Selected[itemIndex] := True; - UpdateUnitActions(); + UpdateItemActions(); end; end; end; - -procedure TfrmBaseSwDialog.actReadOnlyExecute(Sender: TObject); -var - pUnits: TUnSwUnitList; - pVisitor: TUnSwSetReadOnlyVisitor; - -begin - pUnits := GetActiveUnits(); - if Assigned(pUnits) then - try - pVisitor := TUnSwSetReadOnlyVisitor.Create(); - try - pVisitor.ReadOnlyFlag := not actReadOnly.Checked; - pUnits.AcceptVisitor(pVisitor); - finally - FreeAndNil(pVisitor); - end; - finally - FreeAndNil(pUnits); - - lstItems.Invalidate(); - UpdateUnitActions(); - end; -end; - - -procedure TfrmBaseSwDialog.actOpenExecute(Sender: TObject); -begin - FOpenDFM := False; - ModalResult := mrOk; -end; - - -procedure TfrmBaseSwDialog.actOpenDFMExecute(Sender: TObject); -begin - FOpenDFM := True; - ModalResult := mrOk; -end; - -procedure TfrmBaseSwDialog.btnOKClick(Sender: TObject); -begin - FOpenDFM := ((GetKeyState(VK_SHIFT) and 128) <> 0); - ModalResult := mrOk; -end; - end. diff --git a/Source/BaseSwFilters.pas b/Source/BaseSwFilters.pas index c12a58c..ca9529a 100644 --- a/Source/BaseSwFilters.pas +++ b/Source/BaseSwFilters.pas @@ -18,7 +18,7 @@ type FList: TBaseSwItemList; protected // IBaseSwVisitor - procedure VisitItem(AItem: TBaseSwItem); virtual; + procedure VisitItem(const AItem: TBaseSwItem); virtual; procedure FilterItem(const AItem: TBaseSwItem); virtual; public @@ -38,7 +38,7 @@ type TBaseSwItemSimpleNameFilter = class(TBaseSwItemSimpleFilter) protected - procedure VisitItem(AItem: TBaseSwItem); override; + procedure VisitItem(const AItem: TBaseSwItem); override; end; @@ -65,7 +65,7 @@ begin end; -procedure TBaseSwItemFilter.VisitItem(AItem: TBaseSwItem); +procedure TBaseSwItemFilter.VisitItem(const AItem: TBaseSwItem); begin end; @@ -78,7 +78,7 @@ end; { TBaseSwItemSimpleNameFilter } -procedure TBaseSwItemSimpleNameFilter.VisitItem(AItem: TBaseSwItem); +procedure TBaseSwItemSimpleNameFilter.VisitItem(const AItem: TBaseSwItem); begin if (Length(Filter) > 0) and (AnsiPos(Filter, LowerCase(AItem.Name)) = 0) then diff --git a/Source/CmpSwClient.pas b/Source/CmpSwClient.pas index 744cec4..b86506d 100644 --- a/Source/CmpSwClient.pas +++ b/Source/CmpSwClient.pas @@ -6,6 +6,9 @@ } unit CmpSwClient; +// #ToDo2 (MvR) 9-12-2007: Ctrl activates the designer guidelines in BDS 2006 +// and up, which get drawn over our dialog. messy. + interface uses ActnList, @@ -16,26 +19,24 @@ uses BaseSwClient; - + type TComponentSwitcherHook = class(TBaseSwitcherHook) protected function ActiveModule(): IOTAModule; function ActiveEditor(): IOTAEditor; -// function ActiveFileName(): String; -// {$IFDEF DELPHI7ORLOWER} -// function ActiveGroup(): IOTAProjectGroup; -// {$ENDIF} -// function ActiveProject(): IOTAProject; - - procedure NewExecute(Sender: TObject); virtual; + procedure NewExecute(Sender: TObject); public constructor Create(); end; implementation +uses + BaseSwObjects, + CmpSwDialog, + CmpSwObjects, Windows; { TComponentSwitcherHook} @@ -52,128 +53,6 @@ begin end; -(* -function TUnitSwitcherHook.ActiveFileName(): String; -var - module: IOTAModule; - -begin - Result := ''; - module := (BorlandIDEServices as IOTAModuleServices).CurrentModule; - if Assigned(module) then - begin - if Assigned(module.CurrentEditor) then - Result := module.FileName; - end; -end; - -{$IFDEF DELPHI7ORLOWER} -function TUnitSwitcherHook.ActiveGroup(): IOTAProjectGroup; -var - module: IOTAModule; - moduleServices: IOTAModuleServices; - moduleIndex: Integer; - -begin - Result := nil; - moduleServices := (BorlandIDEServices as IOTAModuleServices); - for moduleIndex := 0 to Pred(moduleServices.ModuleCount) do - begin - module := moduleServices.Modules[moduleIndex]; - if Supports(module, IOTAProjectGroup, Result) then - break; - end; -end; -{$ENDIF} - -function TUnitSwitcherHook.ActiveProject(): IOTAProject; -{$IFDEF DELPHI7ORLOWER} -var - projectGroup: IOTAProjectGroup; - module: IOTAModule; - moduleServices: IOTAModuleServices; - moduleIndex: Integer; -{$ENDIF} - -begin - {$IFDEF DELPHI7ORLOWER} - Result := nil; - projectGroup := ActiveGroup(); - if not Assigned(projectGroup) then - begin - moduleServices := (BorlandIDEServices as IOTAModuleServices); - for moduleIndex := 0 to Pred(moduleServices.ModuleCount) do - begin - module := moduleServices.Modules[moduleIndex]; - if Supports(module, IOTAProject, Result) then - break; - end; - end else - Result := projectGroup.ActiveProject; - {$ELSE} - Result := (BorlandIDEServices as IOTAModuleServices).GetActiveProject(); - {$ENDIF} -end; - - -procedure TUnitSwitcherHook.NewExecute(Sender: TObject); -var - activeIndex: Integer; - activeUnit: TUnSwUnit; - itemIndex: Integer; - moduleIndex: Integer; - project: IOTAProject; - selectedUnits: TUnSwUnitList; - unitList: TUnSwUnitList; - openDFM: Boolean; - openType: TUnSwActivateType; - fileName: string; - -begin - project := ActiveProject(); - if not Assigned(project) then - exit; - - unitList := TUnSwUnitList.Create(); - try - unitList.Add(TUnSwProjectUnit.Create(project)); - - for moduleIndex := 0 to Pred(project.GetModuleCount) do - unitList.Add(TUnSwModuleUnit.Create(project.GetModule(moduleIndex))); - - activeUnit := nil; - fileName := ActiveFileName(); - - if SameText(ExtractFileExt(fileName), '.dfm') then - fileName := ChangeFileExt(fileName, '.pas'); - - activeIndex := unitList.IndexOfFileName(fileName); - if activeIndex > -1 then - activeUnit := unitList[activeIndex]; - - selectedUnits := TfrmUnSwDialog.Execute(unitList, (Sender = FViewFormAction), - openDFM, activeUnit); - if Assigned(selectedUnits) then - try - openType := atSource; - if openDFM then - openType := atDFM - else if Sender = FViewFormAction then - openType := atForm; - - for itemIndex := 0 to Pred(selectedUnits.Count) do - selectedUnits[itemIndex].Activate(openType); - finally - FreeAndNil(selectedUnits); - end; - finally - FreeAndNil(unitList); - end; -end; -*) - - - function TComponentSwitcherHook.ActiveModule(): IOTAModule; begin Result := (BorlandIDEServices as IOTAModuleServices).CurrentModule; @@ -193,21 +72,66 @@ begin end; +function SortByName(Item1, Item2: Pointer): Integer; +begin + Result := CompareText(TCmpSwComponent(Item1).Name, TCmpSwComponent(Item2).Name) +end; + + procedure TComponentSwitcherHook.NewExecute(Sender: TObject); var - editor: IOTAEditor; - formEditor: IOTAFormEditor; - name: String; + editor: IOTAEditor; + formEditor: IOTAFormEditor; + formComponent: IOTAComponent; + componentIndex: Integer; + component: IOTAComponent; + itemList: TBaseSwItemList; + item: TCmpSwComponent; + selectedItems: TBaseSwItemList; begin editor := ActiveEditor(); - if Supports(editor, IOTAFormEditor, formEditor) then + if Assigned(editor) and Supports(editor, IOTAFormEditor, formEditor) then begin - name := ''; - formEditor.GetRootComponent.GetPropValueByName('Name', name); - ShowMessage(name); - end else - OldActionExecute(Sender); + formComponent := formEditor.GetRootComponent; + itemList := TBaseSwItemList.Create(); + + for componentIndex := Pred(formComponent.GetComponentCount) downto 0 do + begin + component := formComponent.GetComponent(componentIndex); + item := TCmpSwComponent.TryCreate(component); + + if Assigned(item) then + itemList.Add(item); + end; + + if itemList.Count > 0 then + begin + itemList.Sort(SortByName); + + (* + ps := (borlandideservices as IOTAPackageServices); + for pi := 0 to Pred(ps.PackageCount) do + begin + for ci := 0 to Pred(ps.ComponentCount[pi]) do + begin + itemList.Add(TTestItem.Create(ps.PackageNames[pi] + ' - ' + ps.ComponentNames[pi, ci])); + end; + end; + *) + + selectedItems := TfrmCmpSwDialog.Execute(itemList); + + if Assigned(selectedItems) then + begin + for componentIndex := 0 to Pred(selectedItems.Count) do + begin + item := TCmpSwComponent(selectedItems[componentIndex]); + item.Activate(componentIndex = 0); + end; + end; + end; + end; end; end. diff --git a/Source/CmpSwDialog.dfm b/Source/CmpSwDialog.dfm new file mode 100644 index 0000000..ff6598a --- /dev/null +++ b/Source/CmpSwDialog.dfm @@ -0,0 +1,151 @@ +inherited frmCmpSwDialog: TfrmCmpSwDialog + Caption = 'ComponentSwitcher' + PixelsPerInch = 96 + TextHeight = 13 + inherited pnlMain: TPanel + inherited lstItems: TListBox + ExplicitTop = 47 + end + end + inherited ilsTypes: TImageList + Bitmap = { + 494C010101000200040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000001000000001002000000000000010 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000002C7C2C001274 + 1200729872000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000005990 + AC0010719F000673A6005A8FB40066A0660018801800007E000000870000078F + 0C00006E00004F8D4F0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000639AB2000679AC000082 + B5000091C3000D84B3000064AD0000811000008F000001970100049E080019AC + 270000720000006E00004E874E00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000218EB500009BCE0000A0 + D40000AADD001B90BA000064AD00059417000CA8150012AB260018B1320030C7 + 52000072000000720000317E3100000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000001A97C50000AFE30000B3 + E60009C3F400249BC200006BB200129C370020BB3D0025BE4A0028C2560044DE + 7500007E0000007E0000257C2500000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000012A3D30000C2F80000C9 + FD000DE5FF0029A0C7000070B60014A24F0032DB6C003FDB760052EB88006AFF + A300078F0C00007E0000187B1800000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000BBFE10001F9FF0027FF + FF0036FFFF0029E2FF00007ABA00476A2B00819542005FFF980055FF920051F0 + 7E0053EE7D0020BB3D000D7B0D00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000026B9CD0012DCFD0000D6 + FF003D979C009B591C00CB460000CC510000BA410000A8270000767223002CC5 + 43001AB42D0036B03E0067A46900000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000048A2 + C700C3660700DC680000D56D0000D9720000BE611800A9410000AA3300009E39 + 1100000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000DC680000E0790000E0790000E67F0000CB702400A9410000A9410000B341 + 0B00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000E7800000EC860000EC860000F38B0000D47F3000B44E0000AE480000B344 + 0400000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000F38B0000FD940000FD940000FF9B0000DE8D3B00B84D0000B44E0000A941 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFB65400FFC77600FFCA8600FFCF9500F6BB7F00D47F2E00BF5C0800B44E + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000C0936B00C9936200CE8B4F00CF813900CB7B3600C57B3B00C07E4C00B77A + 5300000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000040000000100000000100010000000000800000000000000000000000 + 000000000000000000000000FFFFFF00FFFF000000000000FFC7000000000000 + E003000000000000800100000000000080010000000000008001000000000000 + 800100000000000080010000000000008001000000000000E00F000000000000 + F00F000000000000F00F000000000000F00F000000000000F00F000000000000 + F00F000000000000FFFF00000000000000000000000000000000000000000000 + 000000000000} + end +end diff --git a/Source/CmpSwDialog.pas b/Source/CmpSwDialog.pas new file mode 100644 index 0000000..f1bbb04 --- /dev/null +++ b/Source/CmpSwDialog.pas @@ -0,0 +1,52 @@ +unit CmpSwDialog; + +interface +uses + ActnList, + Classes, + ComCtrls, + Controls, + ExtCtrls, + ImgList, + Menus, + StdCtrls, + + BaseSwDialog, + BaseSwObjects; + + +type + TCmpSwStyleVisitor = class(TBaseSwStyleVisitor) + protected + procedure VisitItem(const AItem: TBaseSwItem); override; + end; + + + TfrmCmpSwDialog = class(TfrmBaseSwDialog) + protected + function CreateStyleVisitor(): TBaseSwStyleVisitor; override; + end; + + +implementation + + +{$R *.dfm} + + +{ TCmpSwStyleVisitor } +procedure TCmpSwStyleVisitor.VisitItem(const AItem: TBaseSwItem); +begin + inherited; + + ImageIndex := 0; +end; + + +{ TfrmCmpSwDialog } +function TfrmCmpSwDialog.CreateStyleVisitor(): TBaseSwStyleVisitor; +begin + Result := TCmpSwStyleVisitor.Create(); +end; + +end. diff --git a/Source/CmpSwObjects.pas b/Source/CmpSwObjects.pas new file mode 100644 index 0000000..d56be05 --- /dev/null +++ b/Source/CmpSwObjects.pas @@ -0,0 +1,60 @@ +unit CmpSwObjects; + +interface +uses + ToolsAPI, + + BaseSwObjects; + + +type + TCmpSwComponent = class(TBaseSwItem) + private + FComponent: IOTAComponent; + FName: String; + protected + function GetName(): String; override; + public + constructor Create(AComponent: IOTAComponent); + + procedure Activate(const AClearSelection: Boolean); + + class function TryCreate(AComponent: IOTAComponent): TCmpSwComponent; + end; + + +implementation +uses + SysUtils; + + +{ TCmpSwComponent } +class function TCmpSwComponent.TryCreate(AComponent: IOTAComponent): TCmpSwComponent; +begin + Result := TCmpSwComponent.Create(AComponent); + if Length(Result.Name) = 0 then + FreeAndNil(Result); +end; + + +constructor TCmpSwComponent.Create(AComponent: IOTAComponent); +begin + inherited Create(); + + FComponent := AComponent; + FComponent.GetPropValueByName('Name', FName); +end; + + +procedure TCmpSwComponent.Activate(const AClearSelection: Boolean); +begin + FComponent.Select(not AClearSelection); +end; + + +function TCmpSwComponent.GetName(): String; +begin + Result := FName; +end; + +end. diff --git a/Source/UnSwConfiguration.dfm b/Source/UnSwConfiguration.dfm index eb15acf..db0f315 100644 --- a/Source/UnSwConfiguration.dfm +++ b/Source/UnSwConfiguration.dfm @@ -24,7 +24,7 @@ object frmUnSwConfiguration: TfrmUnSwConfiguration Top = 4 Width = 295 Height = 231 - ActivePage = tsGeneral + ActivePage = tsAbout Anchors = [akLeft, akTop, akRight, akBottom] TabOrder = 0 object tsGeneral: TTabSheet @@ -276,7 +276,7 @@ object frmUnSwConfiguration: TfrmUnSwConfiguration Top = 23 Width = 54 Height = 13 - Caption = 'Version 0.5' + Caption = 'Version 0.6' end object TLabel Left = 135 diff --git a/Source/UnSwConfiguration.pas b/Source/UnSwConfiguration.pas index a6caaf0..80ac698 100644 --- a/Source/UnSwConfiguration.pas +++ b/Source/UnSwConfiguration.pas @@ -104,7 +104,7 @@ end; procedure TfrmUnSwConfiguration.lblBugReportClick(Sender: TObject); begin - ShellExecute(0, 'open', 'http://projects.kamadev.net/', nil, nil, SW_SHOWNORMAL); + ShellExecute(0, 'open', 'mailto:support@x2software.net', nil, nil, SW_SHOWNORMAL); end; diff --git a/Source/UnSwDialog.dfm b/Source/UnSwDialog.dfm index e2deee4..fefc1c7 100644 --- a/Source/UnSwDialog.dfm +++ b/Source/UnSwDialog.dfm @@ -1,153 +1,21 @@ -object frmUnSwDialog: TfrmUnSwDialog - Left = 284 - Top = 120 - Width = 320 - Height = 425 - BorderIcons = [biSystemMenu] - Caption = 'UnitSwitcher' - Color = clBtnFace - Constraints.MinHeight = 240 - Constraints.MinWidth = 290 - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'Tahoma' - Font.Style = [] - Icon.Data = { - 0000010001001010100001000400280100001600000028000000100000002000 - 0000010004000000000080000000000000000000000000000000000000000000 - 000000008000008000000080800080000000800080008080000080808000C0C0 - C0000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF000000 - 0000000000000000F777777777700000FF8F8F8F8F700000F8F8F8F8F8700000 - FF0000000F700000F8F8F8F8F8700000F999999999700400F9FFFFFFF9700000 - F999999999700000F8F8F8F8F8700000FF0000008F700000F8F8F8F8F7700000 - FF00008F00000000F8F8F8F80F000000FFFFFFFF00000000000000000000E000 - 0000E0000000E0000000E0000000E00000006000000020000000000000002000 - 000060000000E0000000E0000000E0000000E0010000E0030000E0070000} - OldCreateOrder = False - Position = poScreenCenter - OnResize = FormResize - OnShow = FormShow +inherited frmUnSwDialog: TfrmUnSwDialog + ExplicitHeight = 425 PixelsPerInch = 96 TextHeight = 13 - object sbStatus: TStatusBar - Left = 0 - Top = 379 - Width = 312 - Height = 19 - Panels = < - item - Width = 50 - end> - end - object pnlMain: TPanel - Left = 0 - Top = 0 - Width = 312 + inherited pnlMain: TPanel Height = 307 - Align = alClient - BevelOuter = bvNone - BorderWidth = 4 - TabOrder = 0 - object pnlSearch: TPanel - Left = 4 - Top = 24 - Width = 304 - Height = 25 - Align = alTop - BevelOuter = bvNone - TabOrder = 0 - DesignSize = ( - 304 - 25) - object cmbSearch: TComboBox - Left = 0 - Top = 0 - Width = 304 - Height = 21 - AutoComplete = False - Anchors = [akLeft, akTop, akRight] - DropDownCount = 10 - ItemHeight = 13 - TabOrder = 0 - OnChange = cmbSearchChange - OnKeyDown = cmbSearchKeyDown - OnKeyPress = cmbSearchKeyPress - end - end - object lstUnits: TListBox - Left = 4 - Top = 49 - Width = 304 + ExplicitHeight = 307 + inherited lstItems: TListBox Height = 254 - Style = lbVirtualOwnerDraw - Align = alClient - ItemHeight = 20 - MultiSelect = True - PopupMenu = pmnUnits - TabOrder = 1 - OnClick = lstUnitsClick - OnData = lstUnitsData - OnDblClick = lstUnitsDblClick - OnDrawItem = lstUnitsDrawItem - OnMouseDown = lstUnitsMouseDown - end - object pnlSubFilters: TPanel - Left = 4 - Top = 4 - Width = 304 - Height = 20 - Align = alTop - BevelOuter = bvNone - TabOrder = 2 - Visible = False - DesignSize = ( - 304 - 20) - object lblSubFilters: TLabel - Left = 0 - Top = 1 - Width = 305 - Height = 13 - Anchors = [akLeft, akTop, akRight] - AutoSize = False - Caption = 'frm '#187' Dialog '#187 - end + ExplicitTop = 47 + ExplicitHeight = 254 end end - object pnlButtons: TPanel - Left = 0 - Top = 343 - Width = 312 - Height = 36 - Align = alBottom - BevelOuter = bvNone + inherited pnlButtons: TPanel TabOrder = 2 - DesignSize = ( - 312 - 36) - object btnCancel: TButton - Left = 233 - Top = 5 - Width = 75 - Height = 25 - Anchors = [akRight, akBottom] - Cancel = True - Caption = 'Cancel' - ModalResult = 2 + inherited btnOK: TButton TabOrder = 2 end - object btnOK: TButton - Left = 152 - Top = 5 - Width = 75 - Height = 25 - Anchors = [akRight, akBottom] - Caption = 'OK' - Default = True - TabOrder = 1 - OnClick = btnOKClick - end object btnConfiguration: TButton Left = 4 Top = 5 @@ -158,7 +26,7 @@ object frmUnSwDialog: TfrmUnSwDialog OnClick = btnConfigurationClick end end - object pnlIncludeTypes: TPanel + object pnlIncludeTypes: TPanel [3] Left = 0 Top = 307 Width = 312 @@ -203,11 +71,9 @@ object frmUnSwDialog: TfrmUnSwDialog OnClick = TypeFilterChange end end - object ilsTypes: TImageList - Left = 28 - Top = 228 + inherited ilsTypes: TImageList Bitmap = { - 494C010106000900040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 494C010106000900040010001000FFFFFFFFFF00FFFFFFFFFFFFFFFF424D3600 0000000000003600000028000000400000003000000001002000000000000030 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -340,64 +206,64 @@ object frmUnSwDialog: TfrmUnSwDialog 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000C0C0C000C0C0C000C0C0C000C0C0C0000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000080000000 + 8000000080000000800000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000FFFFFF00808080008080 8000808080008080800080808000808080008080800080808000808080008080 8000808080000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000FFFFFF000000800000008000C0C0C0000000000000000000000000000000 + 00000000000000000000000000000000000000000000000080000000FF000000 + FF000000FF000000FF0000008000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00C0C0 C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0C000FFFFFF00C0C0 C000808080000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000FFFFFF000000FF0000008000C0C0C0000000000000000000000000000000 + 0000000000000000000000000000000000000000FF000000FF000000FF00FFFF + FF00FFFFFF000000FF000000FF00000080000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000FFFFFF00C0C0C000FFFF FF00C0C0C000FFFFFF00C0C0C000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000FFFFFF00FFFFFF00FFFFFF00C0C0C0000000000000000000000000000000 + 0000000000000000000000000000000000000000FF000000FF000000FF000000 + FF000000FF000000FF000000FF00000080000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00C0C0 C000FFFFFF00C0C0C000FFFFFF0000000000FFFFFF0080808000808080008080 8000808080008080800080808000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000FFFFFF000000800000008000C0C0C0000000000000000000000000000000 + 0000000000000000000000000000000000000000FF000000FF000000FF00FFFF + FF00FFFFFF000000FF000000FF00000080000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000FFFFFF00C0C0C000FFFF FF00C0C0C000FFFFFF00C0C0C00000000000FFFFFF00FFFFFF00C0C0C000FFFF FF00C0C0C000FFFFFF0080808000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000FFFFFF000000FF0000008000C0C0C0000000000000000000000000000000 + 0000000000000000000000000000000000000000FF000000FF000000FF00FFFF + FF00FFFFFF000000FF000000FF00000080000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00C0C0 C000FFFFFF00C0C0C000FFFFFF0000000000FFFFFF00C0C0C000FFFFFF00C0C0 C000FFFFFF00C0C0C00080808000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000FFFFFF000000FF0000008000C0C0C0000000000000000000000000000000 + 000000000000000000000000000000000000000000000000FF000000FF00FFFF + FF00FFFFFF000000FF0000008000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000FFFFFF00C0C0C000FFFF FF00C0C0C000FFFFFF00C0C0C00000000000FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000FFFFFF000000FF0000008000C0C0C0000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000FF000000 + FF000000FF000000FF0000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -405,7 +271,7 @@ object frmUnSwDialog: TfrmUnSwDialog C000FFFFFF00C0C0C000FFFFFF00000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 - 0000FFFFFF000000FF0000008000C0C0C0000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -413,7 +279,7 @@ object frmUnSwDialog: TfrmUnSwDialog FF00C0C0C000FFFFFF00C0C0C00000000000FF000000FF000000FF000000FF00 0000FF00000000000000C0C0C000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 - 0000FFFFFF000000FF0000008000C0C0C0000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -421,7 +287,7 @@ object frmUnSwDialog: TfrmUnSwDialog C000FFFFFF00C0C0C000FFFFFF00000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 - 0000FFFFFF00FFFFFF00FFFFFF00C0C0C0000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -599,30 +465,17 @@ object frmUnSwDialog: TfrmUnSwDialog 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000003FFF0000000000003FFF000000000 - 0003FFF0000000000000FFF0000000000000FFF0000000000000FFF000000000 - 0000FFF0000000000000FFF0000000000000FFF0000000000000FFF000000000 - 0000FFF0000000000003FFFF000000000003FFFF000000000003FFFF00000000 + 000000000000000000000000000000000003FFC3000000000003FF8100000000 + 0003FF00000000000000FF00000000000000FF00000000000000FF0000000000 + 0000FF81000000000000FFC3000000000000FFFF000000000000FFFF00000000 + 0000FFFF000000000003FFFF000000000003FFFF000000000003FFFF00000000 0003FFFF000000000003FFFF00000000E000E000FFFFEC0FE000E000FFFF840F E000E0000000AC0FE000E0000000BF3FE000E0000000FFFFE000600000001000 E000200000001000E00000000000B000E00020000000F000E00060000000F000 E000E0000000F000E000E0000000F000E000E0000000F000E001E0010000F000 - E003E003FFFFF000E007E007FFFFF00000000000000000000000000000000000 - 000000000000} + E003E003FFFFF000E007E007FFFFF000} end - object alMain: TActionList - Left = 84 - Top = 228 - object actSelectAll: TAction - Caption = 'Select &All' - ShortCut = 16449 - OnExecute = actSelectAllExecute - end - object actSelectInvert: TAction - Caption = '&Invert Selection' - ShortCut = 16457 - OnExecute = actSelectInvertExecute - end + inherited alMain: TActionList object actSortByName: TAction Caption = 'Sort by &Name' GroupIndex = 1 @@ -650,16 +503,6 @@ object frmUnSwDialog: TfrmUnSwDialog ShortCut = 24589 OnExecute = actOpenDFMPropertiesExecute end - object actMRUPrior: TAction - Caption = 'actMRUPrior' - ShortCut = 16422 - OnExecute = actMRUPriorExecute - end - object actMRUNext: TAction - Caption = 'actMRUNext' - ShortCut = 16424 - OnExecute = actMRUNextExecute - end object actReadOnly: TAction Caption = '&Read only' ShortCut = 49234 @@ -676,49 +519,41 @@ object frmUnSwDialog: TfrmUnSwDialog OnExecute = actOpenDFMExecute end end - object pmnUnits: TPopupMenu - Left = 140 - Top = 228 - object pmnUnitsOpen: TMenuItem + inherited pmnItems: TPopupMenu + object pmnItemsOpen: TMenuItem Action = actOpen end - object pmnUnitsOpenDFM: TMenuItem + object pmnItemsOpenDFM: TMenuItem Action = actOpenDFM end - object pmnUnitsSep1: TMenuItem + object pmnItemsSep1: TMenuItem Caption = '-' end - object pmnUnitsSelectAll: TMenuItem - Action = actSelectAll - end - object pmnUnitsSelectInvert: TMenuItem - Action = actSelectInvert - end - object pmnUnitsSep2: TMenuItem + object pmnItemsSep2: TMenuItem Caption = '-' end - object pmnUnitsSortByName: TMenuItem + object pmnItemsSortByName: TMenuItem Action = actSortByName end - object pmnUnitsSortByType: TMenuItem + object pmnItemsSortByType: TMenuItem Action = actSortByType end - object pmnUnitsSep3: TMenuItem + object pmnItemsSep3: TMenuItem Caption = '-' end - object pmnUnitsReadOnly: TMenuItem + object pmnItemsReadOnly: TMenuItem Action = actReadOnly end - object pmnUnitsSep4: TMenuItem + object pmnItemsSep4: TMenuItem Caption = '-' end - object pmnUnitsOpenFolder: TMenuItem + object pmnItemsOpenFolder: TMenuItem Action = actOpenFolder end - object pmnUnitsOpenProperties: TMenuItem + object pmnItemsOpenProperties: TMenuItem Action = actOpenProperties end - object pmnUnitsOpenDFMProperties: TMenuItem + object pmnItemsOpenDFMProperties: TMenuItem Action = actOpenDFMProperties end end diff --git a/Source/UnSwDialog.pas b/Source/UnSwDialog.pas index 31cbb54..1bb4424 100644 --- a/Source/UnSwDialog.pas +++ b/Source/UnSwDialog.pas @@ -22,135 +22,87 @@ uses StdCtrls, Windows, + BaseSwDialog, BaseSwFilters, BaseSwObjects, UnSwObjects, UnSwFilters; type - TUnSwStyleVisitor = class(TInterfacedPersistent, IBaseSwVisitor, IUnSwVisitor) - private - FColor: TColor; - FImageIndex: Integer; - FOverlayIndex: Integer; + TUnSwStyleVisitor = class(TBaseSwStyleVisitor, IBaseSwVisitor, IUnSwVisitor) protected - procedure VisitItem(const AItem: TBaseSwItem); - procedure VisitModule(const AUnit: TUnSwModuleUnit); - procedure VisitProject(const AUnit: TUnSwProjectUnit); - public - property Color: TColor read FColor; - property ImageIndex: Integer read FImageIndex; - property OverlayIndex: Integer read FOverlayIndex; + procedure VisitItem(const AItem: TBaseSwItem); override; + procedure VisitModule(const AUnit: TUnSwModuleUnit); virtual; + procedure VisitProject(const AUnit: TUnSwProjectUnit); virtual; end; - TfrmUnSwDialog = class(TForm) - actMRUNext: TAction; - actMRUPrior: TAction; + TfrmUnSwDialog = class(TfrmBaseSwDialog) actOpen: TAction; actOpenDFM: TAction; actOpenDFMProperties: TAction; actOpenFolder: TAction; actOpenProperties: TAction; actReadOnly: TAction; - actSelectAll: TAction; - actSelectInvert: TAction; actSortByName: TAction; actSortByType: TAction; - alMain: TActionList; - btnCancel: TButton; - btnConfiguration: TButton; - btnOK: TButton; chkDataModules: TCheckBox; chkForms: TCheckBox; chkProjectSource: TCheckBox; chkUnits: TCheckBox; - cmbSearch: TComboBox; - ilsTypes: TImageList; - lblSubFilters: TLabel; - lstUnits: TListBox; - pmnUnits: TPopupMenu; - pmnUnitsOpen: TMenuItem; - pmnUnitsOpenDFM: TMenuItem; - pmnUnitsOpenDFMProperties: TMenuItem; - pmnUnitsOpenFolder: TMenuItem; - pmnUnitsOpenProperties: TMenuItem; - pmnUnitsReadOnly: TMenuItem; - pmnUnitsSelectAll: TMenuItem; - pmnUnitsSelectInvert: TMenuItem; - pmnUnitsSep1: TMenuItem; - pmnUnitsSep2: TMenuItem; - pmnUnitsSep3: TMenuItem; - pmnUnitsSep4: TMenuItem; - pmnUnitsSortByName: TMenuItem; - pmnUnitsSortByType: TMenuItem; - pnlButtons: TPanel; + pmnItemsOpen: TMenuItem; + pmnItemsOpenDFM: TMenuItem; + pmnItemsOpenDFMProperties: TMenuItem; + pmnItemsOpenFolder: TMenuItem; + pmnItemsOpenProperties: TMenuItem; + pmnItemsReadOnly: TMenuItem; + pmnItemsSep1: TMenuItem; + pmnItemsSep2: TMenuItem; + pmnItemsSep3: TMenuItem; + pmnItemsSep4: TMenuItem; + pmnItemsSortByName: TMenuItem; + pmnItemsSortByType: TMenuItem; pnlIncludeTypes: TPanel; - pnlMain: TPanel; - pnlSearch: TPanel; - pnlSubFilters: TPanel; - sbStatus: TStatusBar; - procedure actMRUNextExecute(Sender: TObject); - procedure actMRUPriorExecute(Sender: TObject); procedure actOpenDFMPropertiesExecute(Sender: TObject); procedure actOpenFolderExecute(Sender: TObject); procedure actOpenPropertiesExecute(Sender: TObject); procedure actReadOnlyExecute(Sender: TObject); - procedure actSelectAllExecute(Sender: TObject); - procedure actSelectInvertExecute(Sender: TObject); - procedure btnConfigurationClick(Sender: TObject); - procedure cmbSearchChange(Sender: TObject); - procedure cmbSearchKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); - procedure cmbSearchKeyPress(Sender: TObject; var Key: Char); - procedure FormResize(Sender: TObject); - procedure FormShow(Sender: TObject); - procedure lstUnitsClick(Sender: TObject); - procedure lstUnitsData(Control: TWinControl; Index: Integer; var Data: string); + procedure btnConfigurationClick(Sender: TObject); procedure lstUnitsDblClick(Sender: TObject); - procedure lstUnitsDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); - procedure lstUnitsMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure SortExecute(Sender: TObject); procedure TypeFilterChange(Sender: TObject); procedure actOpenExecute(Sender: TObject); procedure actOpenDFMExecute(Sender: TObject); procedure btnOKClick(Sender: TObject); + procedure FormShow(Sender: TObject); private FLoading: Boolean; - FUnitList: TUnSwUnitList; - FActiveUnit: TUnSwUnit; FFormsOnly: Boolean; - FMRUList: TStrings; - FMRUIndex: Integer; - FSubFilters: TStringList; FOpenDFM: Boolean; FTypeFilteredList: TUnSwUnitList; - FSubFilteredList: TUnSwUnitList; - FInputFilteredList: TUnSwUnitList; - FTypeFilter: TUnSwUnitTypeFilter; - FSubFilter: TBaseSwItemSimpleFilter; - FInputFilter: TBaseSwItemSimpleFilter; - FLastFilter: String; + protected + function InternalExecute(): TBaseSwItemList; override; + procedure UpdateTypeFilter(AUpdateList: Boolean); - FStyleVisitor: TUnSwStyleVisitor; + function CreateItemList(): TBaseSwItemList; override; + function CreateInputFilter(): TBaseSwItemSimpleFilter; override; + function CreateStyleVisitor(): TBaseSwStyleVisitor; override; - function InternalExecute(): TUnSwUnitList; - procedure UpdateTypeFilter(); - procedure UpdateList(); + function AllowEmptyResult(): Boolean; override; + function ColorsEnabled(): Boolean; override; + + function GetBaseItemList(): TBaseSwItemList; override; + function GetItemDisplayName(const AItem: TBaseSwItem): String; override; + + procedure UpdateItemActions(); override; function GetActiveUnits(): TUnSwUnitList; - procedure SelectMRUItem(); - function PushFilter(const AFilter: String): Boolean; - procedure PopFilter(); - procedure UpdateSubFilters(); - - procedure LoadSettings(); - procedure SaveSettings(); - - procedure UpdateUnitActions(); + procedure LoadSettings(); override; + procedure SaveSettings(); override; public class function Execute(const AUnits: TUnSwUnitList; const AFormsOnly: Boolean; @@ -391,9 +343,9 @@ end; procedure TUnSwStyleVisitor.VisitItem(const AItem: TBaseSwItem); begin if (AItem is TUnSwUnit) and IsReadOnly(TUnSwUnit(AItem).FileName) then - FOverlayIndex := 5 + OverlayIndex := 5 else - FOverlayIndex := -1; + OverlayIndex := -1; end; @@ -403,22 +355,22 @@ begin case AUnit.UnitType of swutUnit: begin - FColor := Settings.Colors.Units; - FImageIndex := 1; + Color := Settings.Colors.Units; + ImageIndex := 1; end; swutForm: begin - FColor := Settings.Colors.Forms; - FImageIndex := 2; + Color := Settings.Colors.Forms; + ImageIndex := 2; end; swutDataModule: begin - FColor := Settings.Colors.DataModules; - FImageIndex := 3; - end + Color := Settings.Colors.DataModules; + ImageIndex := 3; + end; else - FColor := clWindowText; - FImageIndex := 0; + Color := clWindowText; + ImageIndex := 0; end; end; @@ -426,8 +378,8 @@ end; procedure TUnSwStyleVisitor.VisitProject(const AUnit: TUnSwProjectUnit); begin VisitItem(AUnit); - FColor := Settings.Colors.ProjectSource; - FImageIndex := 4; + Color := Settings.Colors.ProjectSource; + ImageIndex := 4; end; @@ -439,11 +391,11 @@ class function TfrmUnSwDialog.Execute(const AUnits: TUnSwUnitList; begin with Self.Create(nil) do try - FUnitList := AUnits; - FActiveUnit := AActive; + ItemList := AUnits; + ActiveItem := AActive; FFormsOnly := AFormsOnly; - Result := InternalExecute(); + Result := TUnSwUnitList(InternalExecute()); AOpenDFM := FOpenDFM; finally Free(); @@ -451,48 +403,39 @@ begin end; -procedure TfrmUnSwDialog.FormResize(Sender: TObject); -begin - lstUnits.Invalidate(); -end; - - procedure TfrmUnSwDialog.FormShow(Sender: TObject); begin - // Setting ListBox.Selected[x] won't work before OnShow... - UpdateTypeFilter(); + UpdateTypeFilter(False); + inherited; end; -function TfrmUnSwDialog.InternalExecute(): TUnSwUnitList; -type - TBaseSwItemSimpleFilterClass = class of TBaseSwItemSimpleFilter; - -var - iIndex: Integer; - pClass: TBaseSwItemSimpleFilterClass; - mruText: String; - subFilterIndex: Integer; - +function TfrmUnSwDialog.GetActiveUnits(): TUnSwUnitList; begin - Result := nil; - FSubFilters := TStringList.Create(); - FTypeFilteredList := TUnSwUnitList.Create(); - FSubFilteredList := TUnSwUnitList.Create(); - FInputFilteredList := TUnSwUnitList.Create(); - FTypeFilter := TUnSwUnitTypeFilter.Create; + Result := (GetActiveItems() as TUnSwUnitList); +end; - if FFormsOnly then - pClass := TUnSwUnitSimpleFormNameFilter + +function TfrmUnSwDialog.GetBaseItemList(): TBaseSwItemList; +begin + Result := FTypeFilteredList; +end; + + +function TfrmUnSwDialog.GetItemDisplayName(const AItem: TBaseSwItem): String; +begin + if FFormsOnly and (AItem is TUnSwModuleUnit) then + Result := TUnSwModuleUnit(AItem).FormName else - pClass := TBaseSwItemSimpleNameFilter; + Result := inherited GetItemDisplayName(AItem); +end; - FSubFilter := pClass.Create; - FInputFilter := pClass.Create; +function TfrmUnSwDialog.InternalExecute(): TBaseSwItemList; +begin + FTypeFilteredList := TUnSwUnitList.Create(); + FTypeFilter := TUnSwUnitTypeFilter.Create; try - LoadSettings(); - if FFormsOnly then begin chkProjectSource.Visible := False; @@ -501,46 +444,15 @@ begin end else Self.Caption := 'UnitSwitcher - View Unit'; - FStyleVisitor := TUnSwStyleVisitor.Create(); - try - if Self.ShowModal() = mrOk then - begin - if Length(Trim(cmbSearch.Text)) > 0 then - begin - iIndex := FMRUList.IndexOf(cmbSearch.Text); - if iIndex > -1 then - FMRUList.Delete(iIndex); - - while FMRUList.Count >= 10 do - FMRUList.Delete(Pred(FMRUList.Count)); - - mruText := cmbSearch.Text; - for subFilterIndex := Pred(FSubFilters.Count) downto 0 do - mruText := FSubFilters[subFilterIndex] + SubFilterSeparator; - - FMRUList.Insert(0, mruText); - end; - - Result := GetActiveUnits(); - end; - - SaveSettings(); - finally - FreeAndNil(FStyleVisitor); - end; + Result := inherited InternalExecute(); finally - FreeAndNil(FInputFilter); - FreeAndNil(FSubFilter); FreeAndNil(FTypeFilter); - FreeAndNil(FSubFilteredList); - FreeAndNil(FInputFilteredList); FreeAndNil(FTypeFilteredList); - FreeAndNil(FSubFilters); end; end; -procedure TfrmUnSwDialog.UpdateUnitActions(); +procedure TfrmUnSwDialog.UpdateItemActions(); var bDFM: Boolean; bUnits: Boolean; @@ -601,70 +513,6 @@ begin end; -procedure TfrmUnSwDialog.UpdateList(); -var - activeUnit: TUnSwUnit; - activeUnits: TUnSwUnitList; - itemIndex: Integer; - listIndex: Integer; - filteredList: TUnSwUnitList; - selStart: Integer; - -begin - activeUnits := GetActiveUnits(); - - filteredList := TUnSwUnitList.Create(); - try - filteredList.Clone(FSubFilteredList); - FInputFilter.FilterList(filteredList); - - if (filteredList.Count = 0) and (not Settings.Filter.AllowEmptyResult) then - begin - { Only enforce AllowEmptyResult when adding to the filter } - if Length(FInputFilter.Filter) > Length(FLastFilter) then - begin - FInputFilter.Filter := FLastFilter; - selStart := cmbSearch.SelStart; - cmbSearch.Text := FLastFilter; - cmbSearch.SelStart := selStart; - Exit; - end; - end; - - FLastFilter := FInputFilter.Filter; - FInputFilteredList.Clone(filteredList); - finally - FreeAndNil(filteredList); - end; - - - lstUnits.Count := FInputFilteredList.Count; - if FInputFilteredList.Count > 0 then - begin - lstUnits.ClearSelection(); - - if Assigned(activeUnits) then - try - for itemIndex := 0 to Pred(activeUnits.Count) do - begin - activeUnit := activeUnits[itemIndex]; - listIndex := FInputFilteredList.IndexOf(activeUnit); - if listIndex > -1 then - lstUnits.Selected[listIndex] := True; - end; - finally - FreeAndNil(activeUnits); - end; - - if lstUnits.SelCount = 0 then - lstUnits.Selected[0] := True; - end; - - if Assigned(lstUnits.OnClick) then - lstUnits.OnClick(nil); -end; - - function SortByName(Item1, Item2: Pointer): Integer; begin Result := CompareText(TUnSwUnit(Item1).Name, TUnSwUnit(Item2).Name) @@ -720,14 +568,14 @@ begin end; -procedure TfrmUnSwDialog.UpdateTypeFilter(); +procedure TfrmUnSwDialog.UpdateTypeFilter(AUpdateList: Boolean); begin FTypeFilter.IncludeUnits := ((not FFormsOnly) and chkUnits.Checked); FTypeFilter.IncludeProjectSource := ((not FFormsOnly) and chkProjectSource.Checked); FTypeFilter.IncludeForms := chkForms.Checked; FTypeFilter.IncludeDataModules := chkDataModules.Checked; - FTypeFilteredList.Clone(FUnitList); + FTypeFilteredList.Clone(ItemList); FTypeFilter.FilterList(FTypeFilteredList); if actSortByName.Checked then @@ -735,83 +583,8 @@ begin else FTypeFilteredList.Sort(SortByType); - UpdateSubFilters(); -end; - - -procedure TfrmUnSwDialog.PopFilter(); -begin - if FSubFilters.Count > 0 then - begin - FSubFilters.Delete(Pred(FSubFilters.Count)); + if AUpdateList then UpdateSubFilters(); - end; -end; - - -procedure TfrmUnSwDialog.UpdateSubFilters(); -var - iFilter: Integer; - sFilters: String; - -begin - FSubFilteredList.Clone(FTypeFilteredList); - - if FSubFilters.Count > 0 then - begin - for iFilter := 0 to Pred(FSubFilters.Count) do - begin - sFilters := sFilters + FSubFilters[iFilter] + SubFilterSeparator; - FSubFilter.Filter := FSubFilters[iFilter]; - FSubFilter.FilterList(FSubFilteredList); - end; - - lblSubFilters.Caption := Trim(sFilters); - pnlSubFilters.Visible := True; - end else - pnlSubFilters.Visible := False; - - UpdateList(); -end; - - -function TfrmUnSwDialog.PushFilter(const AFilter: String): Boolean; -var - sFilter: String; - -begin - sFilter := Trim(AFilter); - Result := (Length(sFilter) > 0) and (FSubFilters.IndexOf(AFilter) = -1); - if Result then - begin - FSubFilters.Add(AFilter); - UpdateSubFilters(); - end; -end; - - -function TfrmUnSwDialog.GetActiveUnits(): TUnSwUnitList; -var - itemIndex: Integer; - -begin - Result := nil; - - if Assigned(FActiveUnit) then - begin - Result := TUnSwUnitList.Create(); - Result.OwnsObjects := False; - Result.Add(FActiveUnit); - FActiveUnit := nil; - end else if lstUnits.SelCount > 0 then - begin - Result := TUnSwUnitList.Create(); - Result.OwnsObjects := False; - - for itemIndex := 0 to Pred(lstUnits.Items.Count) do - if lstUnits.Selected[itemIndex] then - Result.Add(FInputFilteredList[itemIndex]); - end; end; @@ -837,11 +610,12 @@ begin dsType: actSortByType.Checked := True; end; - FMRUList := dialogSettings.MRUList; - cmbSearch.Items.Assign(FMRUList); - + MRUList.Assign(dialogSettings.MRUList); + Self.ClientWidth := dialogSettings.Width; Self.ClientHeight := dialogSettings.Height; + + inherited LoadSettings(); finally FLoading := False; end; @@ -871,63 +645,18 @@ begin dialogSettings.Width := Self.ClientWidth; dialogSettings.Height := Self.ClientHeight; + dialogSettings.MRUList.Assign(MRUList); + Settings.Save(); -end; - -procedure TfrmUnSwDialog.actSelectAllExecute(Sender: TObject); -begin - lstUnits.SelectAll(); -end; - - -procedure TfrmUnSwDialog.actSelectInvertExecute(Sender: TObject); -var - iItem: Integer; - -begin - for iItem := Pred(lstUnits.Count) downto 0 do - lstUnits.Selected[iItem] := not lstUnits.Selected[iItem]; + inherited SaveSettings(); end; procedure TfrmUnSwDialog.SortExecute(Sender: TObject); begin (Sender as TAction).Checked := True; - UpdateTypeFilter(); -end; - - -procedure TfrmUnSwDialog.SelectMRUItem(); -var - mruText: String; - -begin - mruText := FMRUList[FMRUIndex]; - cmbSearch.ItemIndex := FMRUIndex; - ActiveControl := cmbSearch; - cmbSearch.SelectAll(); - - if Assigned(cmbSearch.OnChange) then - cmbSearch.OnChange(nil); -end; - - -procedure TfrmUnSwDialog.actMRUNextExecute(Sender: TObject); -begin - if FMRUIndex < Pred(FMRUList.Count) then - Inc(FMRUIndex); - - SelectMRUItem(); -end; - - -procedure TfrmUnSwDialog.actMRUPriorExecute(Sender: TObject); -begin - if FMRUIndex >= -1 then - Dec(FMRUIndex); - - SelectMRUItem(); + UpdateTypeFilter(True); end; @@ -979,62 +708,41 @@ end; procedure TfrmUnSwDialog.btnConfigurationClick(Sender: TObject); begin if TfrmUnSwConfiguration.Execute() then - lstUnits.Invalidate(); + lstItems.Invalidate(); end; -procedure TfrmUnSwDialog.cmbSearchChange(Sender: TObject); +function TfrmUnSwDialog.CreateItemList(): TBaseSwItemList; begin - if cmbSearch.Text <> FInputFilter.Filter then - begin - FInputFilter.Filter := cmbSearch.Text; - UpdateList(); - end; + Result := TUnSwUnitList.Create(); end; -procedure TfrmUnSwDialog.cmbSearchKeyDown(Sender: TObject; var Key: Word; - Shift: TShiftState); +function TfrmUnSwDialog.ColorsEnabled(): Boolean; begin - if not cmbSearch.DroppedDown then - if ((Shift = []) and (Key in [VK_UP, VK_DOWN, VK_PRIOR, VK_NEXT])) or - ((Shift = [ssCtrl]) and (Key in [VK_HOME, VK_END])) or - ((Shift = [ssShift]) and (Key in [VK_UP, VK_DOWN, VK_PRIOR, VK_NEXT])) then - begin - lstUnits.Perform(WM_KEYDOWN, Key, 0); - Key := 0; - end else if Shift = [ssCtrl] then - case Key of - VK_TAB: - begin - if PushFilter(cmbSearch.Text) then - cmbSearch.Text := ''; - - Key := 0; - end; - VK_BACK: - begin - cmbSearch.Text := ''; - FInputFilter.Filter := ''; - PopFilter(); - Key := 0; - end; - end; + Result := Settings.Colors.Enabled; end; -procedure TfrmUnSwDialog.cmbSearchKeyPress(Sender: TObject; var Key: Char); +function TfrmUnSwDialog.CreateStyleVisitor(): TBaseSwStyleVisitor; begin - // Ctrl-Backspace - if Key = #127 then - Key := #0; + Result := TUnSwStyleVisitor.Create(); +end; + + +function TfrmUnSwDialog.CreateInputFilter(): TBaseSwItemSimpleFilter; +begin + if FFormsOnly then + Result := TUnSwUnitSimpleFormNameFilter.Create() + else + Result := TBaseSwItemSimpleNameFilter.Create(); end; procedure TfrmUnSwDialog.TypeFilterChange(Sender: TObject); begin if not FLoading then - UpdateTypeFilter(); + UpdateTypeFilter(True); end; @@ -1044,85 +752,6 @@ begin end; -procedure TfrmUnSwDialog.lstUnitsClick(Sender: TObject); -begin - UpdateUnitActions(); -end; - - -procedure TfrmUnSwDialog.lstUnitsData(Control: TWinControl; Index: Integer; - var Data: string); -begin - Data := FInputFilteredList[Index].Name; -end; - - -procedure TfrmUnSwDialog.lstUnitsDrawItem(Control: TWinControl; Index: Integer; - Rect: TRect; State: TOwnerDrawState); -var - currentUnit: TUnSwUnit; - textRect: TRect; - text: String; - -begin - with TListBox(Control) do - begin - currentUnit := FInputFilteredList[Index]; - currentUnit.AcceptVisitor(FStyleVisitor); - - if FFormsOnly and (currentUnit is TUnSwModuleUnit) then - text := TUnSwModuleUnit(currentUnit).FormName - else - text := currentUnit.Name; - - if odSelected in State then - begin - Canvas.Brush.Color := clHighlight; - Canvas.Font.Color := clHighlightText; - end else - begin - Canvas.Brush.Color := clWindow; - if Settings.Colors.Enabled then - Canvas.Font.Color := FStyleVisitor.Color - else - Canvas.Font.Color := clWindowText; - end; - Canvas.FillRect(Rect); - - textRect := Rect; - InflateRect(textRect, -2, -2); - ilsTypes.Draw(Canvas, textRect.Left, textRect.Top, FStyleVisitor.ImageIndex); - - if FStyleVisitor.OverlayIndex > -1 then - ilsTypes.Draw(Canvas, textRect.Left, textRect.Top, FStyleVisitor.OverlayIndex); - - Inc(textRect.Left, ilsTypes.Width + 4); - DrawText(Canvas.Handle, PChar(text), Length(text), textRect, DT_SINGLELINE or - DT_LEFT or DT_VCENTER or DT_END_ELLIPSIS); - end; -end; - - -procedure TfrmUnSwDialog.lstUnitsMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); -var - itemIndex: Integer; - -begin - { Bij rechtermuisknop het item selecteren indien deze niet al - geselecteerd was } - if Button = mbRight then - begin - itemIndex := lstUnits.ItemAtPos(Point(X, Y), True); - if (itemIndex > -1) and (not lstUnits.Selected[itemIndex]) then - begin - lstUnits.ClearSelection; - lstUnits.Selected[itemIndex] := True; - UpdateUnitActions(); - end; - end; -end; - - procedure TfrmUnSwDialog.actReadOnlyExecute(Sender: TObject); var pUnits: TUnSwUnitList; @@ -1142,12 +771,18 @@ begin finally FreeAndNil(pUnits); - lstUnits.Invalidate(); - UpdateUnitActions(); + lstItems.Invalidate(); + UpdateItemActions(); end; end; +function TfrmUnSwDialog.AllowEmptyResult(): Boolean; +begin + Result := Settings.Filter.AllowEmptyResult; +end; + + procedure TfrmUnSwDialog.actOpenExecute(Sender: TObject); begin FOpenDFM := False; @@ -1164,7 +799,8 @@ end; procedure TfrmUnSwDialog.btnOKClick(Sender: TObject); begin FOpenDFM := ((GetKeyState(VK_SHIFT) and 128) <> 0); - ModalResult := mrOk; + + inherited; end; end. diff --git a/Source/UnSwFilters.pas b/Source/UnSwFilters.pas index 36b2d64..78afc61 100644 --- a/Source/UnSwFilters.pas +++ b/Source/UnSwFilters.pas @@ -23,7 +23,7 @@ type end; - TUnSwUnitTypeFilter = class(TBaseSwItemFilter) + TUnSwUnitTypeFilter = class(TBaseSwItemFilter, IBaseSwVisitor, IUnSwVisitor) private FIncludeDataModules: Boolean; FIncludeForms: Boolean; @@ -33,7 +33,7 @@ type procedure VisitModule(const AUnit: TUnSwModuleUnit); procedure VisitProject(const AUnit: TUnSwProjectUnit); public - constructor Create; + constructor Create(); property IncludeDataModules: Boolean read FIncludeDataModules write FIncludeDataModules; property IncludeForms: Boolean read FIncludeForms write FIncludeForms; @@ -63,7 +63,7 @@ end; { TUnSwUnitTypeFilter } -constructor TUnSwUnitTypeFilter.Create; +constructor TUnSwUnitTypeFilter.Create(); begin inherited; diff --git a/Source/UnSwObjects.pas b/Source/UnSwObjects.pas index 3ffec72..5fd68f3 100644 --- a/Source/UnSwObjects.pas +++ b/Source/UnSwObjects.pas @@ -272,7 +272,7 @@ begin end; end; {$ELSE} - OpenModule(FProject, True); + OpenModule(FProject, atSource); {$ENDIF} end;