From 450baa3705ea10c691f5c014b00b3286555ee038 Mon Sep 17 00:00:00 2001 From: Mark van Renswoude Date: Wed, 12 Dec 2007 10:18:59 +0000 Subject: [PATCH] Added: Sort by Name / Sort by Type option Added: optionally include descendants in non-wildcard filters Changed: filter checkboxes now work in reverse; checking them shows that particular group, unchecking hides it (makes more sense) --- Lib/D7/UnitSwitcherD7.bpl | Bin 129536 -> 131072 bytes Source/CmpSwClient.pas | 19 ----- Source/CmpSwDialog.dfm | 22 +++++- Source/CmpSwDialog.pas | 151 +++++++++++++++++++++----------------- Source/CmpSwFilters.pas | 81 +++++++++++++------- Source/CmpSwSettings.pas | 44 ++++++++++- 6 files changed, 201 insertions(+), 116 deletions(-) diff --git a/Lib/D7/UnitSwitcherD7.bpl b/Lib/D7/UnitSwitcherD7.bpl index 2ce98e9eac7a77ff6034f7c05c900fc28b400f36..992fc8e4e974b932edd45300a7eb5e964fc4889e 100644 GIT binary patch delta 36268 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

ZMr$Gbw9gGUYpa)iiW1trN3k;k>6K%t2hMNUo z12_z-K_mDbjGBrf2m8S>K(89eMs|M-a?~_QKMQg#yFUo|EVu;P!Bhnj2KIw8K(9K; zkFk6g4Q-HvmD0TlG8xjT z@<-qofe{ky2N!_14%MPV{ojk5D$oWd>5&6a20jBa13ZB|PyrgikAPk>BU&+73=V*2 zK{KG2w+U?r&?_D?lieSNtYY_#kR7IY$oC>t_$>Gds;XGh@|u zviq8x9Q&Z}*&`o$DQv;>d5(r3haXC)1syvEG0nx;JPv<;6y$?w5DFUb!vEA5)ZJ)~ zO9u+j9L#ZLzzULqY!Y-6@wfB96;KbVKm|w#$sis?PeeP=;U)}ph9WYM2Xa6>2muKb zU=O0lqkMtqR0KMOHX%@u4w66uhz1&<0CFG$DMsYffKt(OTqX#MKuLiR;0-Jqj?;lK zP^;#+a*zX3rlFK<$W1jUn-9+*9VCF-I7AMjLH#_G&RnS+81KP0ObpC z&I8mZa9D++6hJUIzXZ7hRf|z7Kn~gvP6Oyz1A7nxidUmlLD?!KFa-$&Tng$xbS3I~ z1yYmD;V;_311JOv;0J_dNB~F%-r&koj;jP3;0H<)VF#|zM6E@803B&a5Xb{@snBhP z{U(?}G&r1rjBP|hHlqIHaN`5AH=sVjwe?600%<&eT!TE236eoP$S*)Kf)ro^VIUaz zfwp`k9)yCr`!Tx(t@{z?K17&@KD--YBqG!B-k_5$|~7e+CU5v{k@u1&UmD1}Q}9GlAwcG!~Hk zDvJ3ZaBv>E1BzETjswj|OfKwAfc`JySYQI09`|aDs_`HbJP2L@AA)u;bO9cj;4ZMs zhM&j51#kllT!;xASPJe1$AJR~U;rK(YH$azfhWK_;0F-6i07ifT2KV4z*W#|G0#l~ zOTbR>B)9^4EkQiMwgx{XpbC5hxCD3r_kjiwp2%~h;Bzo$DbH;Ir$IdsK>uZUUVvoNtn5UYM{LXb2IQfXa<3I^4v!77-+Z?&*59RvE0RTTfs^2Dez9_xk#`VybT5~ z=egzJ7-#}XEAXra*MWH@+yUPdloqH3Ux8k$Pz9h2v;x^`gaHb`m%w8U&y8JUL$TrJ zNpKPT07j(p-2LDk;Gf2G)4^tN6ub-k*J7FkPJu?yZynD~0SiGUI17B!F&zR|fp$F- z0saJ|Hz2bh4U~YlZTR6fVkH6Y2j$=*5I|@K>J2;wT7h;G7JA?~cpvoL%yW8h5;TJ7 zEtrvj2GBnfB?z{F6cF$!kloL7i69GU7!GzgIooZYdYU?Z6jAMVyZB zQ~H1(AJA($Kce(0KmN5vMt%lw;mv#$AIY0|13!w_^IBfRt9T`^;MIHtKZc*kkLE-9 zDSQ||fgjIL7GfQ6_%xini;pe{m z?O?vBS82jfe#juV?@l>ONOopO>E>m8@XLpX^6$t?RkQej(%Ip>ymXD4*O#Ww;)jUF zmmg8{B_5viRAuS(x%{Zo1`RLwrbhbL>RDx2z*szP;6^``1Q)kmtIRh=pibwBlBb%1(;dOrR#;70Wh zbzbS&WPY#zaqVgCd)lj7LHoPbBfMXDK={~jMd`fd{Gz^lA`V29Mx2bOEPY}*|5o4Y zh8u=o4ZVzhr8`#e6QPGM456w!)UMVumDk)TLYWGe1g*cGoT zDwQuPUqgPsQ2kT&D{?$YJyg9@eMo&uy--WEA8NnUwrX!_J;MXTE#V2_&xXGc{!(~N z_y^%l;mzS~;aq9yTKosB_=r^zX%XcS6%myYRS}mW8Y8Yn2oW8n?`7~oqvLd|bZNR% zx|{l6^`3^IhB!mKA;FMj$TZ{_at(!sW2Gxo_yAjj;fkTraLv$e=x_8jh8i_SoiWxJ zZ%i;I8Iz4E##CdvF~gW?v>LOGImTRLo-yC}u(8_sk?~Vwn~^j5nF3966laJj)D&h? zm^3Dx$z-yaqD`@;I8(eS)AXR}Ar$LZrhv$($n}vgMqWi}wnz3ho6Ht-w2wK~oMO%} zXPR@&g{Ax|-oNy_&Aj)ZCi8FRKh3hJ;HZ$O(5SE|P3g2%{CfUU>5)}@RB6*X-rIIa zaZK^OvX3fQWl$|sZBpf_j;Wqe)v7*GeW&WJ9IMoUy>YA#xboXk0 z*h+u9~=o0cmby@n4+(}e57O=9C%7rrt4bolx3*TXx)M@7U( ztk)Ikp42_7`(C$1pRRvMKfs_d>@j#71B|1LOHhlS7+a0QOo^rgrjJdU$Q_Y;Ba6|} zg~-;(Hq=W;WM`zz9Bd9TE6kSCM-kOHt2rCBlWRU@zG!~OJT_`V)a0mXQR=9OsD)7* zqq3uNqVl5-m#$jH2ie-9I4seUP$+#B0~A`tZpH74CCZh`4CO9mp7NBkLRqP-QdTR^ zD{GZ?%6jD`WrOmHvQgQpq)VwB6bC2dR&C{A{&D)v=&376< zl#W8H)0(svZL~I48>fxeCTNqi$=Vccs&<>UI86JL_8D!Rwi&&rP1~;R&~|FMaL;h> zaG!9$a2a}&B0M%cE<80nFTAicGK04N@Rsmz!#yKHB9bDuMr23iMI4SOi#X-#Rn-ya zBWfcqM>I$L8u3TOV4YkyUN>2{NcWxYH(g)-K>cuikbbgWp*QKL>*wni>sRR4=(p&t z`ds~k`p5NW^>zA>^xx^d4dV>U4UZZgF`YKOY^pbXYPwWwKbn`tJ zMjkOwi?T#5idr4DJql}4E*fJAub869QWPml6wfJMQM|4AMDc~i5(is|EG%YEI*)k(Hj?z>h1fN#j>fRA@C~q0P|Vt-Tj5s#N<3TGLnB z{un+(!o$&w;=1= zGe6olG%6};W>ivCdQ?VKW>j|RqE-A1&rB?WN>8lgSIs`Js8!S{>J^t2H&i}&49r3g zzE2z;Ur{$8lfS70G$S-Ynz5QtjY(tC9M?RqIjuRPc~VcUq8>V&G3lf4a4__F-9YX*iFXW#?k1MnWjS1(8#foiz2^^>}Q^B zPBcGgUKdpr)fvU*Vl9hB-*`o`Vk@2^uPWYEe5=S-KB6o~hw7smt6HMUR6U`(sv4+X zp?+W8M^k{#^Rnh??LV}Bw($4DPe*(i(Hh~ao2iS}ZN~^vrTawJt{bACrjOMp>d&B# zFX}nNNW*i6R}A%r&kRil&ggCQG5Q&0sA0J=*cgK6Lzpqzc$aad@vyPdSdYi)0Mj7T zC{v`V$@GiqPm>Xi`FP|Lk&Tf*N6yDsd7t@NbE7#nDq=&_y-^3E-iZ1+3Rx(|o&<)7 z-iif^ROI8TqC>Gvxkj0(+@n08Jfu9Td>nbA!$f`Q&JBFPv`!_b@>F@NhN?!X#;Yu< zL`)nGsE(>Gt45<`Y*v4%zNzj|_d~OnYl1b3(#O*Hu`~B;%8>h4FmSYKLeK-Edkh!p z+6--`)~e0cI!D<;ZLzjQTY=V5?>5rfoFi>YcrJ#G*TWm|2wojAT34+5mo8MFtTz}w zG<=C?#Vvy;N+`^z5TBtYqXi`uYm8&hQmgTx@sP3HScOt+FkUe>8m}3fjLj&)Ry;>< z83V3$O*=@U6JQW?3x7P&w2LgWOq$~@D&!+acFXk1ieRCLrzjJ*eG zX_iT)IaOiCa9e{BVxTfcxmdYcnX7zCS)=?`8H)n5s&?b?_>`(1Gpy^XcFZ>xYLYb> znj&Zm-D1C@tgE1mbAFof)C!s7-^r?8}Wau+70%q%TFbW>lSL&6`R| zzD?h*@6dOmrFj~>4L$}xgUk?UkQ;&xA%;*xm_dQ3mCj%?SPapISUPDb-MEqW9h7OX z8nVTiOP(PgvzOx1Whr>xIAD& z=S*iYBEN#M>m!WH!yl7yy zUn;)0DRwANC|^>(qr9&CUFod~SG|b&T#EV$b+PumHY|KW_+6M*918y^JTxLUVr4{5 z#Qq3-L=B2^f$pgOU41V@q+x+!onbp>WQPog4b_HPLmfKbB|~?{It{e*C14VEA0}S~ zXhIdnb7(&4n70~tnT{geLn7so^CGR04@Wv8e~eU_jpqB!kDFgIe`f9<6@Up;IELDV zQA?vzqPAh?QW*7c)T2>PmTq0gPx7qAMwmF{ZgCE|mlO?(D~d+NHAR!6Ss^G|6>W-k z^w3T`aXgjYN*|@4Ql<=4%9X*&5M`(`OsP<6lsctJX;DTiW0i5rcx8ezNtvunQKl;Y z&oY2je}Q3%VTEB0Fg>;yb{O^;PB5HeIAgjX@RYmhHCc=j3b5?WVqJ$ojFsCgS?WbEAm+)?H zoXp6|IDO3{#zWJmJq7kV=T2dq&isjqdAjd2V7K)X6AOqTIeqpsMj0TFb-KV*MzQJk X&lvfpn@nZY-JUX)aZbwQfGv9fY6U0& delta 35617 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 diff --git a/Source/CmpSwClient.pas b/Source/CmpSwClient.pas index 6edcfff..daf06dd 100644 --- a/Source/CmpSwClient.pas +++ b/Source/CmpSwClient.pas @@ -73,12 +73,6 @@ 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; @@ -108,19 +102,6 @@ begin 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 diff --git a/Source/CmpSwDialog.dfm b/Source/CmpSwDialog.dfm index 78a3920..641a28b 100644 --- a/Source/CmpSwDialog.dfm +++ b/Source/CmpSwDialog.dfm @@ -53,7 +53,6 @@ inherited frmCmpSwDialog: TfrmCmpSwDialog Width = 342 Height = 65 Align = alClient - Caption = ' Filter ' TabOrder = 0 DesignSize = ( 342 @@ -75,6 +74,18 @@ inherited frmCmpSwDialog: TfrmCmpSwDialog Caption = '&Filter selected class(es)' Enabled = False end + object actSortByName: TAction + Caption = 'Sort by &Name' + GroupIndex = 1 + ShortCut = 49230 + OnExecute = SortExecute + end + object actSortByType: TAction + Caption = 'Sort by &Type' + GroupIndex = 1 + ShortCut = 49236 + OnExecute = SortExecute + end end inherited pmnItems: TPopupMenu object pmnItemsFilters: TMenuItem [0] @@ -86,6 +97,15 @@ inherited frmCmpSwDialog: TfrmCmpSwDialog object pmnItemsSep1: TMenuItem [2] Caption = '-' end + object pmnItemsSortByName: TMenuItem [3] + Action = actSortByName + end + object pmnItemsSortByType: TMenuItem [4] + Action = actSortByType + end + object pmnItemsSep2: TMenuItem [5] + Caption = '-' + end end object pmnMoreFilters: TPopupMenu Left = 192 diff --git a/Source/CmpSwDialog.pas b/Source/CmpSwDialog.pas index 0fed6ff..2ed592d 100644 --- a/Source/CmpSwDialog.pas +++ b/Source/CmpSwDialog.pas @@ -17,7 +17,7 @@ uses BaseSwDialog, BaseSwObjects, - CmpSwFilters; + CmpSwFilters, UnSwDialog; type @@ -46,25 +46,36 @@ type gbFilters: TGroupBox; btnMoreFilters: TButton; pmnMoreFilters: TPopupMenu; + actSortByName: TAction; + actSortByType: TAction; + pmnItemsSortByName: TMenuItem; + pmnItemsSortByType: TMenuItem; + pmnItemsSep2: TMenuItem; procedure btnMoreFiltersClick(Sender: TObject); procedure FormShow(Sender: TObject); + procedure SortExecute(Sender: TObject); private FClassFilteredList: TBaseSwItemList; FClassFilter: TCmpSwComponentClassFilter; FFilterCheckBoxes: TObjectList; + FOtherGroup: TCmpSwFilterGroup; protected function InternalExecute(): TBaseSwItemList; override; function CreateStyleVisitor(): TBaseSwStyleVisitor; override; function GetBaseItemList(): TBaseSwItemList; override; + function AllowEmptyResult(): Boolean; override; + function ColorsEnabled(): Boolean; override; + procedure LoadSettings(); override; procedure SaveSettings(); override; procedure DrawItemText(ACanvas: TCanvas; AItem: TBaseSwItem; ARect: TRect); override; procedure UpdateClassFilter(); + procedure SortList(); procedure BuildFilterCheckboxes(); function CreateFilterMenuItem(AParent: TMenuItem; AGroup: TCmpSwFilterGroup; AItemIndex: Integer): TMenuItem; @@ -72,7 +83,8 @@ type procedure FilterCheckBoxClick(Sender: TObject); procedure FilterMenuItemClick(Sender: TObject); - property ClassFilter: TCmpSwComponentClassFilter read FClassFilter; + property ClassFilter: TCmpSwComponentClassFilter read FClassFilter; + property ClassFilteredList: TBaseSwItemList read FClassFilteredList; end; @@ -233,9 +245,15 @@ begin FClassFilteredList := TBaseSwItemList.Create(); FClassFilter := TCmpSwComponentClassFilter.Create(); FFilterCheckBoxes := TObjectList.Create(); + FOtherGroup := TCmpSwFilterGroup.Create(nil); try - Result := inherited InternalExecute(); + FOtherGroup.Name := 'Other'; + FOtherGroup.Enabled := False; + FOtherGroup.Visible := False; + + Result := inherited InternalExecute(); finally + FreeAndNil(FOtherGroup); FreeAndNil(FFilterCheckBoxes); FreeAndNil(FClassFilter); FreeAndNil(FClassFilteredList); @@ -271,7 +289,7 @@ begin DT_LEFT or DT_VCENTER or DT_END_ELLIPSIS or DT_CALCRECT); textRect.Left := textRect.Right; - textRect.Right := ARect.Right; + textRect.Right := ARect.Right - 2; { Draw component class text } ACanvas.Font.Color := clGrayText; @@ -288,62 +306,6 @@ var itemIndex: Integer; begin - if ClassFilter.Groups.Count = 0 then - begin - with ClassFilter.Groups.Add() do - begin - Name := 'Actions'; - Filter.Add('TAction'); - Visible := True; - end; - - with ClassFilter.Groups.Add() do - begin - Name := 'Menu items'; - Filter.Add('TMenuItem'); - Visible := True; - end; - - with ClassFilter.Groups.Add() do - begin - Name := 'Dataset fields'; - - Filter.Add('TField'); - Filter.Add('T*Field'); - Visible := True; - end; - - with ClassFilter.Groups.Add() do - begin - Name := 'DevEx Grid columns'; - - Filter.Add('TcxGridDBColumn'); - Filter.Add('TcxGridColumn'); - end; - -// with ClassFilter.Groups.Add() do -// begin -// Name := 'Toolbar2000 items'; -// Enabled := True; -// -// Filter.Add('TTBXItem'); -// Filter.Add('TTBItem'); -// Filter.Add('TTBXSeparatorItem'); -// Filter.Add('TTBXNoPrefixItem'); -// Filter.Add('TTBXNoPrefixSubmenuItem'); -// Filter.Add('TTBXSubmenuItem'); -// end; - -// with ClassFilter.Groups.Add() do -// begin -// Name := 'X2Software items'; -// Enabled := True; -// -// Filter.Add('TX2GraphicContainerItem'); -// end; - end; - - pnlFilters.Visible := (ClassFilter.Groups.Count > 0); @@ -358,6 +320,9 @@ begin end; end; + CreateFilterMenuItem(pmnItemsFilters, FOtherGroup, itemIndex); + Inc(itemIndex); + { Remove excess menu items } for groupIndex := Pred(pmnItemsFilters.Count) downto itemIndex do pmnItemsFilters.Delete(groupIndex); @@ -374,6 +339,9 @@ begin end; end; + CreateFilterMenuItem(pmnMoreFilters.Items, FOtherGroup, itemIndex); + Inc(itemIndex); + for groupIndex := Pred(pmnMoreFilters.Items.Count) downto itemIndex do pmnMoreFilters.Items.Delete(groupIndex); @@ -381,14 +349,17 @@ begin BuildFilterCheckboxes(); btnMoreFilters.Visible := (pmnMoreFilters.Items.Count > 0); - FClassFilteredList.Clone(ItemList); - ClassFilter.FilterList(FClassFilteredList); + ClassFilteredList.Clone(ItemList); + + ClassFilter.FilterUnmatched := FOtherGroup.Enabled; + ClassFilter.FilterList(ClassFilteredList); + SortList(); end; function TfrmCmpSwDialog.GetBaseItemList(): TBaseSwItemList; begin - Result := FClassFilteredList; + Result := ClassFilteredList; end; @@ -418,7 +389,7 @@ begin checkBox.Top := checkBoxTop; checkBox.Left := 12; checkBox.Caption := StringReplace(group.Name, '&', '&&', [rfReplaceAll]); - checkBox.Checked := group.Enabled; + checkBox.Checked := not group.Enabled; checkBox.Tag := Integer(group); checkBox.OnClick := FilterCheckBoxClick; checkBox.Parent := gbFilters; @@ -443,7 +414,7 @@ begin Result := AParent[AItemIndex]; Result.Caption := StringReplace(AGroup.Name, '&', '&&', [rfReplaceAll]); - Result.Checked := AGroup.Enabled; + Result.Checked := not AGroup.Enabled; Result.Tag := Integer(AGroup); end; @@ -457,9 +428,9 @@ begin checkBox := (Sender as TCheckBox); group := TCmpSwFilterGroup(checkBox.Tag); - if checkBox.Checked <> group.Enabled then + if checkBox.Checked = group.Enabled then begin - group.Enabled := checkBox.Checked; + group.Enabled := not checkBox.Checked; UpdateClassFilter(); UpdateSubFilters(); @@ -476,8 +447,8 @@ begin menuItem := (Sender as TMenuItem); group := TCmpSwFilterGroup(menuItem.Tag); - menuItem.Checked := not menuItem.Checked; group.Enabled := menuItem.Checked; + menuItem.Checked := not menuItem.Checked; UpdateClassFilter(); UpdateSubFilters(); @@ -508,6 +479,8 @@ end; procedure TfrmCmpSwDialog.SaveSettings(); begin + // #ToDo2 (MvR) 12-12-2007: save 'sort by ...' + Settings.Dialog.Width := Self.ClientWidth; Settings.Dialog.Height := Self.ClientHeight; Settings.Dialog.MRUList.Assign(MRUList); @@ -518,4 +491,46 @@ begin inherited SaveSettings(); end; + + +function TfrmCmpSwDialog.AllowEmptyResult(): Boolean; +begin + Result := True; +end; + + +function TfrmCmpSwDialog.ColorsEnabled(): Boolean; +begin + Result := inherited ColorsEnabled(); +end; + + +procedure TfrmCmpSwDialog.SortExecute(Sender: TObject); +begin + (Sender as TAction).Checked := True; + SortList(); + UpdateSubFilters(); +end; + + +function SortByName(Item1, Item2: Pointer): Integer; +begin + Result := CompareText(TCmpSwComponent(Item1).Name, TCmpSwComponent(Item2).Name); +end; + + +function SortByType(Item1, Item2: Pointer): Integer; +begin + Result := CompareText(TCmpSwComponent(Item1).ComponentClass, TCmpSwComponent(Item2).ComponentClass); +end; + + +procedure TfrmCmpSwDialog.SortList(); +begin + if actSortByType.Checked then + ClassFilteredList.Sort(SortByType) + else + ClassFilteredList.Sort(SortByName); +end; + end. diff --git a/Source/CmpSwFilters.pas b/Source/CmpSwFilters.pas index dc12ae1..be247fc 100644 --- a/Source/CmpSwFilters.pas +++ b/Source/CmpSwFilters.pas @@ -10,16 +10,15 @@ uses type - // #ToDo3 (MvR) 11-12-2007: "Include descendants" option - TCmpSwFilterGroup = class(TCollectionItem) private - FEnabled: Boolean; - FFilter: TStrings; - FFilterChanged: Boolean; - FFilterMasks: TObjectList; - FName: String; - FVisible: Boolean; + FEnabled: Boolean; + FFilter: TStrings; + FFilterChanged: Boolean; + FFilterMasks: TObjectList; + FIncludeDescendants: Boolean; + FName: String; + FVisible: Boolean; protected procedure FilterChange(Sender: TObject); @@ -33,13 +32,16 @@ type function Matches(const AValue: String): Boolean; - property Enabled: Boolean read FEnabled write FEnabled; - property Filter: TStrings read FFilter; - property Name: String read FName write FName; - property Visible: Boolean read FVisible write FVisible; + property Enabled: Boolean read FEnabled write FEnabled; + property Filter: TStrings read FFilter; + property IncludeDescendants: Boolean read FIncludeDescendants write FIncludeDescendants; + property Name: String read FName write FName; + property Visible: Boolean read FVisible write FVisible; end; + TCmpSwMatchResult = (mrNoMatch, mrDisabledMatch, mrMatch); + TCmpSwFilterGroups = class(TCollection) private function GetItem(Index: Integer): TCmpSwFilterGroup; @@ -48,7 +50,7 @@ type constructor Create(); function Add(): TCmpSwFilterGroup; - function Matches(const AValue: String): Boolean; + function Matches(const AValue: String; AMatchDisabled: Boolean): TCmpSwMatchResult; property Items[Index: Integer]: TCmpSwFilterGroup read GetItem write SetItem; default; end; @@ -56,14 +58,16 @@ type TCmpSwComponentClassFilter = class(TBaseSwItemFilter) private - FGroups: TCmpSwFilterGroups; + FFilterUnmatched: Boolean; + FGroups: TCmpSwFilterGroups; protected procedure VisitItem(const AItem: TBaseSwItem); override; public constructor Create(); destructor Destroy(); override; - property Groups: TCmpSwFilterGroups read FGroups; + property FilterUnmatched: Boolean read FFilterUnmatched write FFilterUnmatched; + property Groups: TCmpSwFilterGroups read FGroups; end; @@ -72,7 +76,7 @@ uses Masks, SysUtils, - CmpSwObjects; + CmpSwObjects, Dialogs; const @@ -105,6 +109,8 @@ end; function TCmpSwFilterGroup.Matches(const AValue: String): Boolean; var filterIndex: Integer; + valueClass: TClass; + filterClass: TClass; begin Result := False; @@ -113,10 +119,24 @@ begin for filterIndex := Pred(Filter.Count) downto 0 do begin if Assigned(Filter.Objects[filterIndex]) then - Result := TMask(Filter.Objects[filterIndex]).Matches(AValue) - else + begin + Result := TMask(Filter.Objects[filterIndex]).Matches(AValue); + end else + begin Result := SameText(Filter[filterIndex], AValue); + if (not Result) and IncludeDescendants then + begin + filterClass := GetClass(Filter[filterIndex]); + if Assigned(filterClass) then + begin + valueClass := GetClass(AValue); + if Assigned(valueClass) then + Result := valueClass.InheritsFrom(filterClass); + end; + end; + end; + if Result then Break; end; @@ -197,20 +217,26 @@ begin end; -function TCmpSwFilterGroups.Matches(const AValue: String): Boolean; +function TCmpSwFilterGroups.Matches(const AValue: String; AMatchDisabled: Boolean): TCmpSwMatchResult; var itemIndex: Integer; begin - Result := False; + Result := mrNoMatch; for itemIndex := Pred(Count) downto 0 do begin - if Items[itemIndex].Enabled then + if AMatchDisabled or Items[itemIndex].Enabled then begin - Result := Items[itemIndex].Matches(AValue); - if Result then + if Items[itemIndex].Matches(AValue) then + begin + if Items[itemIndex].Enabled then + Result := mrMatch + else + Result := mrDisabledMatch; + Break; + end; end; end; end; @@ -235,8 +261,13 @@ end; procedure TCmpSwComponentClassFilter.VisitItem(const AItem: TBaseSwItem); begin - if Groups.Matches(TCmpSwComponent(AItem).ComponentClass) then - FilterItem(AItem); + case Groups.Matches(TCmpSwComponent(AItem).ComponentClass, FilterUnmatched) of + mrMatch: + FilterItem(AItem); + mrNoMatch: + if FilterUnmatched then + FilterItem(AItem); + end; end; end. diff --git a/Source/CmpSwSettings.pas b/Source/CmpSwSettings.pas index 5f58b70..061549c 100644 --- a/Source/CmpSwSettings.pas +++ b/Source/CmpSwSettings.pas @@ -240,6 +240,42 @@ begin CloseKey(); end; end; + end else + begin + { Fill default groups } + with AGroups.Add() do + begin + Name := 'Actions'; + + Filter.Add('TAction'); + IncludeDescendants := True; + Visible := True; + end; + + with AGroups.Add() do + begin + Name := 'Menu items'; + + Filter.Add('TMenuItem'); + Visible := True; + end; + + with AGroups.Add() do + begin + Name := 'Dataset fields'; + + Filter.Add('TField'); + IncludeDescendants := True; + Visible := True; + end; + + with AGroups.Add() do + begin + Name := 'DevEx Grid columns'; + + Filter.Add('TcxGridDBColumn'); + Filter.Add('TcxGridColumn'); + end; end; finally Free(); @@ -300,9 +336,10 @@ var filterText: String; begin - AGroup.Name := ARegistry.ReadString('Name'); - AGroup.Enabled := ARegistry.ReadBool('Enabled'); - AGroup.Visible := ARegistry.ReadBool('Visible'); + AGroup.Name := ARegistry.ReadString('Name'); + AGroup.Enabled := ARegistry.ReadBool('Enabled'); + AGroup.IncludeDescendants := ARegistry.ReadBool('IncludeDescendants'); + AGroup.Visible := ARegistry.ReadBool('Visible'); if ARegistry.ValueExists('Filter') then begin @@ -323,6 +360,7 @@ var begin ARegistry.WriteString('Name', AGroup.Name); ARegistry.WriteBool('Enabled', AGroup.Enabled); + ARegistry.WriteBool('IncludeDescendants', AGroup.IncludeDescendants); ARegistry.WriteBool('Visible', AGroup.Visible); if AGroup.Filter.Count > 0 then