From 79b18c0bf67166677a28ae38a54f13e862aaf7ed Mon Sep 17 00:00:00 2001 From: Mark van Renswoude Date: Fri, 9 Feb 2007 13:58:37 +0000 Subject: [PATCH] Added: initial AllowEmptyResults implementation --- Lib/D7/UnitSwitcherD7.bpl | Bin 95744 -> 96768 bytes Source/UnSwDialog.dfm | 21 ++++----- Source/UnSwDialog.pas | 91 +++++++++++++++++++++++++++++++++----- Source/UnSwFilters.pas | 22 ++++++--- Source/UnSwSettings.pas | 64 ++++++++++++++++++++++++--- 5 files changed, 165 insertions(+), 33 deletions(-) diff --git a/Lib/D7/UnitSwitcherD7.bpl b/Lib/D7/UnitSwitcherD7.bpl index 848ea50475abe3663f8ea7a2cf296a1c7cee431a..6e6a8ee62924f3957fd5be980bd914eed1a77539 100644 GIT binary patch delta 25833 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 K6b0OY*fs!#auacYmEcf73AcG9&I8~G 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 AQUCw| diff --git a/Source/UnSwDialog.dfm b/Source/UnSwDialog.dfm index 310c6d1..bdbec98 100644 --- a/Source/UnSwDialog.dfm +++ b/Source/UnSwDialog.dfm @@ -1,10 +1,10 @@ object frmUnSwDialog: TfrmUnSwDialog Left = 187 Top = 83 + Width = 320 + Height = 425 BorderIcons = [biSystemMenu] Caption = 'UnitSwitcher' - ClientHeight = 398 - ClientWidth = 312 Color = clBtnFace Constraints.MinHeight = 240 Constraints.MinWidth = 290 @@ -204,10 +204,10 @@ object frmUnSwDialog: TfrmUnSwDialog end end object ilsTypes: TImageList - Left = 16 - Top = 264 + Left = 28 + Top = 228 Bitmap = { - 494C010106000900040010001000FFFFFFFFFF00FFFFFFFFFFFFFFFF424D3600 + 494C010106000900040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 0000000000003600000028000000400000003000000001002000000000000030 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -607,11 +607,12 @@ object frmUnSwDialog: TfrmUnSwDialog E000E0000000AC0FE000E0000000BF3FE000E0000000FFFFE000600000001000 E000200000001000E00000000000B000E00020000000F000E00060000000F000 E000E0000000F000E000E0000000F000E000E0000000F000E001E0010000F000 - E003E003FFFFF000E007E007FFFFF000} + E003E003FFFFF000E007E007FFFFF00000000000000000000000000000000000 + 000000000000} end object alMain: TActionList - Left = 44 - Top = 264 + Left = 84 + Top = 228 object actSelectAll: TAction Caption = 'Select &All' ShortCut = 16449 @@ -666,8 +667,8 @@ object frmUnSwDialog: TfrmUnSwDialog end end object pmnUnits: TPopupMenu - Left = 72 - Top = 264 + Left = 140 + Top = 228 object pmnUnitsSelectAll: TMenuItem Action = actSelectAll end diff --git a/Source/UnSwDialog.pas b/Source/UnSwDialog.pas index fa91844..77ecead 100644 --- a/Source/UnSwDialog.pas +++ b/Source/UnSwDialog.pas @@ -120,6 +120,7 @@ type FTypeFilter: TUnSwUnitTypeFilter; FSubFilter: TUnSwUnitSimpleFilter; FInputFilter: TUnSwUnitSimpleFilter; + FLastFilter: String; FStyleVisitor: TUnSwStyleVisitor; @@ -168,22 +169,26 @@ type destructor Destroy(); override; end; + TUnSwOpenFolderVisitor = class(TUnSwOpenVisitor) protected procedure OpenFile(const AFileName: String); override; end; + TUnSwOpenPropertiesVisitor = class(TUnSwOpenVisitor) protected procedure OpenFile(const AFileName: String); override; end; + TUnSwOpenDFMPropertiesVisitor = class(TUnSwOpenPropertiesVisitor) protected procedure VisitModule(const AUnit: TUnSwModuleUnit); override; procedure VisitProject(const AUnit: TUnSwProjectUnit); override; end; + TUnSwReadOnlyVisitor = class(TUnSwOpenVisitor) private FReadOnlyCount: Integer; @@ -193,6 +198,7 @@ type property ReadOnlyCount: Integer read FReadOnlyCount; end; + TUnSwSetReadOnlyVisitor = class(TUnSwOpenVisitor) private FReadOnlyFlag: Boolean; @@ -225,6 +231,7 @@ begin FProcessed.CaseSensitive := False; end; + destructor TUnSwOpenVisitor.Destroy(); begin FreeAndNil(FProcessed); @@ -232,6 +239,7 @@ begin inherited; end; + function TUnSwOpenVisitor.IsProcessed(const AFileName: String; const ARegister: Boolean): Boolean; begin @@ -244,11 +252,13 @@ begin end; end; + procedure TUnSwOpenVisitor.VisitModule(const AUnit: TUnSwModuleUnit); begin OpenFile(AUnit.FileName); end; + procedure TUnSwOpenVisitor.VisitProject(const AUnit: TUnSwProjectUnit); begin OpenFile(AUnit.FileName); @@ -305,6 +315,7 @@ begin OpenFile(ChangeFileExt(AUnit.FileName, '.dfm')); end; + procedure TUnSwOpenDFMPropertiesVisitor.VisitProject(const AUnit: TUnSwProjectUnit); begin end; @@ -360,6 +371,7 @@ begin FOverlayIndex := -1; end; + procedure TUnSwStyleVisitor.VisitModule(const AUnit: TUnSwModuleUnit); begin VisitUnit(AUnit); @@ -385,6 +397,7 @@ begin end; end; + procedure TUnSwStyleVisitor.VisitProject(const AUnit: TUnSwProjectUnit); begin VisitUnit(AUnit); @@ -409,21 +422,24 @@ begin end; 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(); end; + function TfrmUnSwDialog.InternalExecute(): TUnSwUnitList; type TUnSwUnitSimpleFilterClass = class of TUnSwUnitSimpleFilter; - + var iIndex: Integer; pClass: TUnSwUnitSimpleFilterClass; @@ -434,15 +450,15 @@ begin FTypeFilteredList := TUnSwUnitList.Create(); FSubFilteredList := TUnSwUnitList.Create(); FInputFilteredList := TUnSwUnitList.Create(); - FTypeFilter := TUnSwUnitTypeFilter.Create(FTypeFilteredList); + FTypeFilter := TUnSwUnitTypeFilter.Create; if FFormsOnly then pClass := TUnSwUnitSimpleFormNameFilter else pClass := TUnSwUnitSimpleNameFilter; - FSubFilter := pClass.Create(FSubFilteredList); - FInputFilter := pClass.Create(FInputFilteredList); + FSubFilter := pClass.Create; + FInputFilter := pClass.Create; try LoadSettings(); @@ -489,6 +505,7 @@ begin end; end; + procedure TfrmUnSwDialog.UpdateUnitActions(); var bDFM: Boolean; @@ -549,18 +566,43 @@ begin actOpenDFMProperties.Enabled := bDFM; end; + procedure TfrmUnSwDialog.UpdateList(); var activeUnit: TUnSwUnit; activeUnits: TUnSwUnitList; itemIndex: Integer; listIndex: Integer; + filteredList: TUnSwUnitList; + selStart: Integer; begin - activeUnits := GetActiveUnits(); + 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; - FInputFilteredList.Clone(FSubFilteredList); - FInputFilteredList.AcceptVisitor(FInputFilter); lstUnits.Count := FInputFilteredList.Count; if FInputFilteredList.Count > 0 then @@ -588,11 +630,13 @@ begin lstUnits.OnClick(nil); 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; @@ -641,6 +685,7 @@ begin Result := SortByName(Item1, Item2); end; + procedure TfrmUnSwDialog.UpdateTypeFilter(); begin FTypeFilter.IncludeUnits := ((not FFormsOnly) and chkUnits.Checked); @@ -649,7 +694,7 @@ begin FTypeFilter.IncludeDataModules := chkDataModules.Checked; FTypeFilteredList.Clone(FUnitList); - FTypeFilteredList.AcceptVisitor(FTypeFilter); + FTypeFilter.FilterList(FTypeFilteredList); if actSortByName.Checked then FTypeFilteredList.Sort(SortByName) @@ -659,6 +704,7 @@ begin UpdateSubFilters(); end; + procedure TfrmUnSwDialog.PopFilter(); begin if FSubFilters.Count > 0 then @@ -668,6 +714,7 @@ begin end; end; + procedure TfrmUnSwDialog.UpdateSubFilters(); var iFilter: Integer; @@ -682,7 +729,7 @@ begin begin sFilters := sFilters + FSubFilters[iFilter] + ' '#187' '; FSubFilter.Filter := FSubFilters[iFilter]; - FSubFilteredList.AcceptVisitor(FSubFilter); + FSubFilter.FilterList(FSubFilteredList); end; lblSubFilters.Caption := Trim(sFilters); @@ -708,6 +755,7 @@ begin end; end; + function TfrmUnSwDialog.GetActiveUnits(): TUnSwUnitList; var itemIndex: Integer; @@ -764,6 +812,7 @@ begin end; end; + procedure TfrmUnSwDialog.SaveSettings(); var dialogSettings: TUnSwDialogSettings; @@ -796,6 +845,7 @@ begin lstUnits.SelectAll(); end; + procedure TfrmUnSwDialog.actSelectInvertExecute(Sender: TObject); var iItem: Integer; @@ -805,6 +855,7 @@ begin lstUnits.Selected[iItem] := not lstUnits.Selected[iItem]; end; + procedure TfrmUnSwDialog.SortExecute(Sender: TObject); begin (Sender as TAction).Checked := True; @@ -822,6 +873,7 @@ begin cmbSearch.OnChange(nil); end; + procedure TfrmUnSwDialog.actMRUNextExecute(Sender: TObject); begin if FMRUIndex < Pred(FMRUList.Count) then @@ -830,6 +882,7 @@ begin SelectMRUItem(); end; + procedure TfrmUnSwDialog.actMRUPriorExecute(Sender: TObject); begin if FMRUIndex >= -1 then @@ -838,6 +891,7 @@ begin SelectMRUItem(); end; + procedure TfrmUnSwDialog.actOpenFolderExecute(Sender: TObject); var pUnits: TUnSwUnitList; @@ -852,6 +906,7 @@ begin end; end; + procedure TfrmUnSwDialog.actOpenPropertiesExecute(Sender: TObject); var pUnits: TUnSwUnitList; @@ -866,6 +921,7 @@ begin end; end; + procedure TfrmUnSwDialog.actOpenDFMPropertiesExecute(Sender: TObject); var pUnits: TUnSwUnitList; @@ -887,12 +943,17 @@ begin lstUnits.Invalidate(); end; + procedure TfrmUnSwDialog.cmbSearchChange(Sender: TObject); begin - FInputFilter.Filter := cmbSearch.Text; - UpdateList(); + if cmbSearch.Text <> FInputFilter.Filter then + begin + FInputFilter.Filter := cmbSearch.Text; + UpdateList(); + end; end; + procedure TfrmUnSwDialog.cmbSearchKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin @@ -922,6 +983,7 @@ begin end; end; + procedure TfrmUnSwDialog.cmbSearchKeyPress(Sender: TObject; var Key: Char); begin // Ctrl-Backspace @@ -929,28 +991,33 @@ begin Key := #0; end; + procedure TfrmUnSwDialog.TypeFilterChange(Sender: TObject); begin if not FLoading then UpdateTypeFilter(); end; + procedure TfrmUnSwDialog.lstUnitsDblClick(Sender: TObject); begin btnOK.Click(); 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 @@ -996,6 +1063,7 @@ begin end; end; + procedure TfrmUnSwDialog.lstUnitsMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var itemIndex: Integer; @@ -1015,6 +1083,7 @@ begin end; end; + procedure TfrmUnSwDialog.actReadOnlyExecute(Sender: TObject); var pUnits: TUnSwUnitList; diff --git a/Source/UnSwFilters.pas b/Source/UnSwFilters.pas index 5e7c3b6..807ca84 100644 --- a/Source/UnSwFilters.pas +++ b/Source/UnSwFilters.pas @@ -23,7 +23,7 @@ type procedure FilterUnit(const AUnit: TUnSwUnit); virtual; public - constructor Create(const AList: TUnSwUnitList); virtual; + procedure FilterList(AList: TUnSwUnitList); end; TUnSwUnitSimpleFilter = class(TUnSwUnitFilter) @@ -55,7 +55,7 @@ type procedure VisitModule(const AUnit: TUnSwModuleUnit); override; procedure VisitProject(const AUnit: TUnSwProjectUnit); override; public - constructor Create(const AList: TUnSwUnitList); override; + constructor Create; property IncludeDataModules: Boolean read FIncludeDataModules write FIncludeDataModules; property IncludeForms: Boolean read FIncludeForms write FIncludeForms; @@ -69,28 +69,34 @@ uses { TUnSwUnitFilter } -constructor TUnSwUnitFilter.Create(const AList: TUnSwUnitList); +procedure TUnSwUnitFilter.FilterList(AList: TUnSwUnitList); begin - inherited Create(); - - Assert(Assigned(AList), 'List must be assigned.'); FList := AList; + try + FList.AcceptVisitor(Self); + finally + FList := nil; + end; end; + procedure TUnSwUnitFilter.VisitUnit(const AUnit: TUnSwUnit); begin end; + procedure TUnSwUnitFilter.VisitModule(const AUnit: TUnSwModuleUnit); begin VisitUnit(AUnit); end; + procedure TUnSwUnitFilter.VisitProject(const AUnit: TUnSwProjectUnit); begin VisitUnit(AUnit); end; + procedure TUnSwUnitFilter.FilterUnit(const AUnit: TUnSwUnit); begin FList.Remove(AUnit); @@ -123,7 +129,7 @@ end; { TUnSwUnitTypeFilter } -constructor TUnSwUnitTypeFilter.Create(const AList: TUnSwUnitList); +constructor TUnSwUnitTypeFilter.Create; begin inherited; @@ -133,6 +139,7 @@ begin FIncludeUnits := True; end; + procedure TUnSwUnitTypeFilter.VisitModule(const AUnit: TUnSwModuleUnit); var validTypes: TUnSwUnitTypes; @@ -153,6 +160,7 @@ begin FilterUnit(AUnit); end; + procedure TUnSwUnitTypeFilter.VisitProject(const AUnit: TUnSwProjectUnit); begin if not FIncludeProjectSource then diff --git a/Source/UnSwSettings.pas b/Source/UnSwSettings.pas index cdc8ef7..02360d5 100644 --- a/Source/UnSwSettings.pas +++ b/Source/UnSwSettings.pas @@ -29,6 +29,7 @@ type procedure WriteColor(const ARegistry: TRegistry; const AValue: TColor; const AName: String); end; + TUnSwDialogSort = (dsName, dsType); TUnSwDialogSettings = class(TUnSwBaseSettings) @@ -60,6 +61,7 @@ type property Width: Integer read FWidth write FWidth; end; + TUnSwColorSettings = class(TUnSwBaseSettings) private FDataModules: TColor; @@ -78,9 +80,22 @@ type property Units: TColor read FUnits write FUnits; end; + + TUnSwFilterSettings = class(TUnSwBaseSettings) + private + FAllowEmptyResults: Boolean; + protected + procedure Load(const ARegistry: TRegistry); override; + procedure Save(const ARegistry: TRegistry); override; + public + property AllowEmptyResult: Boolean read FAllowEmptyResults write FAllowEmptyResults; + end; + + TUnSwSettings = class(TObject) private FColors: TUnSwColorSettings; + FFilter: TUnSwFilterSettings; FFormsDialog: TUnSwDialogSettings; FUnitsDialog: TUnSwDialogSettings; @@ -95,12 +110,15 @@ type procedure Save(); property Colors: TUnSwColorSettings read FColors write FColors; + property Filter: TUnSwFilterSettings read FFilter write FFilter; property FormsDialog: TUnSwDialogSettings read FFormsDialog write FFormsDialog; property UnitsDialog: TUnSwDialogSettings read FUnitsDialog write FUnitsDialog; end; + function Settings(): TUnSwSettings; + implementation uses SysUtils, @@ -126,6 +144,7 @@ begin Result := AName; end; + procedure TUnSwBaseSettings.ReadBoolDef(const ARegistry: TRegistry; var AValue: Boolean; const AName: String); @@ -134,6 +153,7 @@ begin AValue := ARegistry.ReadBool(GetKeyName(AName)); end; + procedure TUnSwBaseSettings.ReadColorDef(const ARegistry: TRegistry; var AValue: TColor; const AName: String); @@ -142,6 +162,7 @@ begin AValue := TColor(ARegistry.ReadInteger(GetKeyName(AName))); end; + procedure TUnSwBaseSettings.ReadIntegerDef(const ARegistry: TRegistry; var AValue: Integer; const AName: String); @@ -158,6 +179,7 @@ begin ARegistry.WriteBool(GetKeyName(AName), AValue); end; + procedure TUnSwBaseSettings.WriteColor(const ARegistry: TRegistry; const AValue: TColor; const AName: String); @@ -165,6 +187,7 @@ begin WriteInteger(ARegistry, Integer(AValue), AName); end; + procedure TUnSwBaseSettings.WriteInteger(const ARegistry: TRegistry; const AValue: Integer; const AName: String); @@ -184,6 +207,7 @@ begin TStringList(FMRUList).CaseSensitive := False end; + destructor TUnSwDialogSettings.Destroy(); begin FreeAndNil(FMRUList); @@ -240,6 +264,7 @@ begin end; end; + procedure TUnSwDialogSettings.Save(const ARegistry: TRegistry); var sMRU: String; @@ -274,6 +299,7 @@ begin ReadColorDef(ARegistry, FUnits, 'ColorUnits'); end; + procedure TUnSwColorSettings.Save(const ARegistry: TRegistry); begin WriteBool(ARegistry, FEnabled, 'ColorEnabled'); @@ -284,6 +310,19 @@ begin end; +{ TUnSwFilterSettings } +procedure TUnSwFilterSettings.Load(const ARegistry: TRegistry); +begin + ReadBoolDef(ARegistry, FAllowEmptyResults, 'AllowEmptyResults'); +end; + + +procedure TUnSwFilterSettings.Save(const ARegistry: TRegistry); +begin + WriteBool(ARegistry, FAllowEmptyResults, 'AllowEmptyResults'); +end; + + { TUnSwSettings } constructor TUnSwSettings.Create(); begin @@ -293,16 +332,20 @@ begin '\UnitSwitcher'; FColors := TUnSwColorSettings.Create(); + FFilter := TUnSwFilterSettings.Create(); FFormsDialog := TUnSwDialogSettings.Create('Forms'); FUnitsDialog := TUnSwDialogSettings.Create('Units'); + ResetDefaults(); Load(); end; + destructor TUnSwSettings.Destroy(); begin FreeAndNil(FUnitsDialog); FreeAndNil(FFormsDialog); + FreeAndNil(FFilter); FreeAndNil(FColors); inherited; @@ -310,6 +353,7 @@ end; procedure TUnSwSettings.ResetDefaults(const AColorsOnly: Boolean); + procedure ResetDialog(const ADialog: TUnSwDialogSettings); begin ADialog.IncludeDataModules := True; @@ -321,6 +365,7 @@ procedure TUnSwSettings.ResetDefaults(const AColorsOnly: Boolean); ADialog.Height := 425; end; + begin if not AColorsOnly then begin @@ -328,11 +373,13 @@ begin ResetDialog(FUnitsDialog); end; - FColors.Enabled := True; - FColors.DataModules := RGB( 35, 120, 35); // Green - FColors.Forms := RGB( 50, 70, 120); // Blue - FColors.ProjectSource := RGB(120, 120, 35); // Yellow - FColors.Units := RGB(150, 35, 35); // Red + FColors.Enabled := True; + FColors.DataModules := RGB( 35, 120, 35); // Green + FColors.Forms := RGB( 50, 70, 120); // Blue + FColors.ProjectSource := RGB(120, 120, 35); // Yellow + FColors.Units := RGB(150, 35, 35); // Red + + FFilter.AllowEmptyResult := False; end; procedure TUnSwSettings.Load(); @@ -344,11 +391,14 @@ begin with ideRegistry do try RootKey := HKEY_CURRENT_USER; + if OpenKey(FRegistryKey, False) then begin FColors.Load(ideRegistry); + FFilter.Load(ideRegistry); FFormsDialog.Load(ideRegistry); FUnitsDialog.Load(ideRegistry); + CloseKey(); end; finally @@ -356,6 +406,7 @@ begin end; end; + procedure TUnSwSettings.Save(); var ideRegistry: TRegistry; @@ -365,11 +416,14 @@ begin with ideRegistry do try RootKey := HKEY_CURRENT_USER; + if OpenKey(FRegistryKey, True) then begin FColors.Save(ideRegistry); + FFilter.Save(ideRegistry); FFormsDialog.Save(ideRegistry); FUnitsDialog.Save(ideRegistry); + CloseKey(); end; finally