diff --git a/Packages/D2006/UnitSwitcher.bdsproj b/Packages/D2006/UnitSwitcher.bdsproj index 291ec25..4176c8d 100644 --- a/Packages/D2006/UnitSwitcher.bdsproj +++ b/Packages/D2006/UnitSwitcher.bdsproj @@ -165,8 +165,10 @@ 1.0.0.0 - - + + UnitSwitcher + + diff --git a/Source/UnSwConfiguration.dfm b/Source/UnSwConfiguration.dfm index 74d2d80..aa73417 100644 --- a/Source/UnSwConfiguration.dfm +++ b/Source/UnSwConfiguration.dfm @@ -202,10 +202,23 @@ object frmUnSwConfiguration: TfrmUnSwConfiguration OnClick = PickColor end end + object btnDefault: TButton + Left = 8 + Top = 135 + Width = 109 + Height = 25 + Caption = 'Reset to &default' + TabOrder = 2 + OnClick = btnDefaultClick + end end object tsAbout: TTabSheet Caption = 'About...' ImageIndex = 1 + ExplicitLeft = 0 + ExplicitTop = 0 + ExplicitWidth = 0 + ExplicitHeight = 0 DesignSize = ( 287 181) @@ -334,7 +347,7 @@ object frmUnSwConfiguration: TfrmUnSwConfiguration end object dlgColor: TColorDialog Options = [cdFullOpen] - Left = 12 - Top = 176 + Left = 260 + Top = 160 end end diff --git a/Source/UnSwConfiguration.pas b/Source/UnSwConfiguration.pas index 8378c5c..fe50351 100644 --- a/Source/UnSwConfiguration.pas +++ b/Source/UnSwConfiguration.pas @@ -21,6 +21,7 @@ type TfrmUnSwConfiguration = class(TForm) btnCancel: TButton; btnDataModuleColor: TButton; + btnDefault: TButton; btnFormColor: TButton; btnOk: TButton; btnProjectColor: TButton; @@ -39,6 +40,7 @@ type tsAbout: TTabSheet; tsGeneral: TTabSheet; + procedure btnDefaultClick(Sender: TObject); procedure chkCustomColorClick(Sender: TObject); procedure lblBugReportClick(Sender: TObject); procedure PickColor(Sender: TObject); @@ -116,6 +118,18 @@ begin end; +procedure TfrmUnSwConfiguration.btnDefaultClick(Sender: TObject); +begin + if MessageBox(Self.Handle, 'Are you sure you want to revert the color ' + + 'settings? This action can not be undone.', + 'Reset to default', MB_YESNO or MB_ICONQUESTION) = ID_YES then + begin + Settings.ResetDefaults(True); + Settings.Save(); + LoadSettings(); + end; +end; + procedure TfrmUnSwConfiguration.chkCustomColorClick(Sender: TObject); const Colors: array[Boolean] of TColor = (clBtnFace, clWindow); diff --git a/Source/UnSwDialog.dfm b/Source/UnSwDialog.dfm index bbea285..455b522 100644 --- a/Source/UnSwDialog.dfm +++ b/Source/UnSwDialog.dfm @@ -51,7 +51,7 @@ object frmUnSwDialog: TfrmUnSwDialog TabOrder = 0 object pnlSearch: TPanel Left = 4 - Top = 4 + Top = 24 Width = 304 Height = 25 Align = alTop @@ -60,22 +60,24 @@ object frmUnSwDialog: TfrmUnSwDialog DesignSize = ( 304 25) - object edtSearch: TEdit + object cmbSearch: TComboBox Left = 0 Top = 0 Width = 304 Height = 21 Anchors = [akLeft, akTop, akRight] + ItemHeight = 13 TabOrder = 0 - OnChange = edtSearchChange - OnKeyDown = edtSearchKeyDown + OnChange = cmbSearchChange + OnKeyDown = cmbSearchKeyDown + OnKeyPress = cmbSearchKeyPress end end object lstUnits: TListBox Left = 4 - Top = 29 + Top = 49 Width = 304 - Height = 274 + Height = 254 Style = lbVirtualOwnerDraw Align = alClient ItemHeight = 20 @@ -86,6 +88,28 @@ object frmUnSwDialog: TfrmUnSwDialog OnDblClick = lstUnitsDblClick OnDrawItem = lstUnitsDrawItem 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 + end end object pnlButtons: TPanel Left = 0 @@ -176,8 +200,8 @@ object frmUnSwDialog: TfrmUnSwDialog end end object ilsTypes: TImageList - Left = 8 - Top = 32 + Left = 16 + Top = 264 Bitmap = { 494C010105000900040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 0000000000003600000028000000400000003000000001002000000000000030 @@ -583,8 +607,8 @@ object frmUnSwDialog: TfrmUnSwDialog 000000000000} end object alMain: TActionList - Left = 36 - Top = 32 + Left = 44 + Top = 264 object actSelectAll: TAction Caption = 'Select &All' ShortCut = 16449 @@ -617,20 +641,20 @@ object frmUnSwDialog: TfrmUnSwDialog ShortCut = 49165 OnExecute = actOpenPropertiesExecute end - object actMRUNext: TAction - Caption = 'actMRUNext' - ShortCut = 16422 - OnExecute = actMRUNextExecute - end object actMRUPrior: TAction Caption = 'actMRUPrior' - ShortCut = 16424 + ShortCut = 16422 OnExecute = actMRUPriorExecute end + object actMRUNext: TAction + Caption = 'actMRUNext' + ShortCut = 16424 + OnExecute = actMRUNextExecute + end end object pmnUnits: TPopupMenu - Left = 64 - Top = 32 + Left = 72 + Top = 264 object pmnUnitsSelectAll: TMenuItem Action = actSelectAll end diff --git a/Source/UnSwDialog.pas b/Source/UnSwDialog.pas index 47d13d7..5309242 100644 --- a/Source/UnSwDialog.pas +++ b/Source/UnSwDialog.pas @@ -53,8 +53,9 @@ type chkForms: TCheckBox; chkProjectSource: TCheckBox; chkUnits: TCheckBox; - edtSearch: TEdit; + cmbSearch: TComboBox; ilsTypes: TImageList; + lblSubFilters: TLabel; lstUnits: TListBox; pmnUnits: TPopupMenu; pmnUnitsOpenFolder: TMenuItem; @@ -69,7 +70,9 @@ type pnlIncludeTypes: TPanel; pnlMain: TPanel; pnlSearch: TPanel; + pnlSubFilters: TPanel; sbStatus: TStatusBar; + procedure cmbSearchKeyPress(Sender: TObject; var Key: Char); procedure actMRUNextExecute(Sender: TObject); procedure actMRUPriorExecute(Sender: TObject); @@ -78,8 +81,8 @@ type procedure actSelectAllExecute(Sender: TObject); procedure actSelectInvertExecute(Sender: TObject); procedure btnConfigurationClick(Sender: TObject); - procedure edtSearchChange(Sender: TObject); - procedure edtSearchKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); + procedure cmbSearchChange(Sender: TObject); + procedure cmbSearchKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormResize(Sender: TObject); procedure FormShow(Sender: TObject); procedure lstUnitsData(Control: TWinControl; Index: Integer; var Data: string); @@ -92,13 +95,16 @@ type FUnitList: TUnSwUnitList; FActiveUnit: TUnSwUnit; FFormsOnly: Boolean; - FMRUIndex: Integer; FMRUList: TStrings; + FMRUIndex: Integer; + FSubFilters: TStringList; FTypeFilteredList: TUnSwUnitList; + FSubFilteredList: TUnSwUnitList; FInputFilteredList: TUnSwUnitList; FTypeFilter: TUnSwUnitTypeFilter; + FSubFilter: TUnSwUnitSimpleFilter; FInputFilter: TUnSwUnitSimpleFilter; FStyleVisitor: TUnSwStyleVisitor; @@ -110,6 +116,10 @@ type function GetActiveUnits(): TUnSwUnitList; procedure SelectMRUItem(); + function PushFilter(const AFilter: String): Boolean; + procedure PopFilter(); + procedure UpdateSubFilters(); + procedure LoadSettings(); procedure SaveSettings(); public @@ -125,7 +135,7 @@ uses SysUtils, UnSwConfiguration, - UnSwSettings; + UnSwSettings, Dialogs; type TUnSwOpenVisitor = class(TInterfacedObject, IUnSwVisitor) @@ -295,19 +305,29 @@ begin end; function TfrmUnSwDialog.InternalExecute(): TUnSwUnitList; +type + TUnSwUnitSimpleFilterClass = class of TUnSwUnitSimpleFilter; + var iIndex: Integer; + pClass: TUnSwUnitSimpleFilterClass; begin Result := nil; + FSubFilters := TStringList.Create(); FTypeFilteredList := TUnSwUnitList.Create(); + FSubFilteredList := TUnSwUnitList.Create(); FInputFilteredList := TUnSwUnitList.Create(); FTypeFilter := TUnSwUnitTypeFilter.Create(FTypeFilteredList); if FFormsOnly then - FInputFilter := TUnSwUnitSimpleFormNameFilter.Create(FInputFilteredList) + pClass := TUnSwUnitSimpleFormNameFilter else - FInputFilter := TUnSwUnitSimpleNameFilter.Create(FInputFilteredList); + pClass := TUnSwUnitSimpleNameFilter; + + FSubFilter := pClass.Create(FSubFilteredList); + FInputFilter := pClass.Create(FInputFilteredList); + try LoadSettings(); @@ -323,14 +343,18 @@ begin try if Self.ShowModal() = mrOk then begin - iIndex := FMRUList.IndexOf(edtSearch.Text); - if iIndex > -1 then - FMRUList.Delete(iIndex); + 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)); + while FMRUList.Count >= 10 do + FMRUList.Delete(Pred(FMRUList.Count)); - FMRUList.Insert(0, edtSearch.Text); + FMRUList.Insert(0, cmbSearch.Text); + end; + Result := GetActiveUnits(); end; @@ -340,9 +364,12 @@ begin end; finally FreeAndNil(FInputFilter); + FreeAndNil(FSubFilter); FreeAndNil(FTypeFilter); + FreeAndNil(FSubFilteredList); FreeAndNil(FInputFilteredList); FreeAndNil(FTypeFilteredList); + FreeAndNil(FSubFilters); end; end; @@ -356,7 +383,7 @@ var begin activeUnits := GetActiveUnits(); - FInputFilteredList.Clone(FTypeFilteredList); + FInputFilteredList.Clone(FSubFilteredList); FInputFilteredList.AcceptVisitor(FInputFilter); lstUnits.Count := FInputFilteredList.Count; @@ -450,9 +477,58 @@ begin else FTypeFilteredList.Sort(SortByType); + UpdateSubFilters(); +end; + +procedure TfrmUnSwDialog.PopFilter(); +begin + if FSubFilters.Count > 0 then + begin + FSubFilters.Delete(Pred(FSubFilters.Count)); + 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] + ' '#187' '; + FSubFilter.Filter := FSubFilters[iFilter]; + FSubFilteredList.AcceptVisitor(FSubFilter); + 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; @@ -500,7 +576,7 @@ begin end; FMRUList := dialogSettings.MRUList; - FMRUIndex := -1; + cmbSearch.Items.Assign(FMRUList); Self.ClientWidth := dialogSettings.Width; Self.ClientHeight := dialogSettings.Height; @@ -559,16 +635,9 @@ end; procedure TfrmUnSwDialog.SelectMRUItem(); begin - if (FMRUIndex < -1) or (FMRUIndex > Pred(FMRUList.Count)) then - exit; - - if FMRUIndex = -1 then - edtSearch.Text := '' - else - edtSearch.Text := FMRUList[FMRUIndex]; - - ActiveControl := edtSearch; - edtSearch.SelectAll(); + cmbSearch.ItemIndex := FMRUIndex; + ActiveControl := cmbSearch; + cmbSearch.SelectAll(); end; procedure TfrmUnSwDialog.actMRUNextExecute(Sender: TObject); @@ -622,19 +691,46 @@ begin lstUnits.Invalidate(); end; -procedure TfrmUnSwDialog.edtSearchChange(Sender: TObject); +procedure TfrmUnSwDialog.cmbSearchChange(Sender: TObject); begin - FInputFilter.Filter := edtSearch.Text; + FInputFilter.Filter := cmbSearch.Text; UpdateList(); end; -procedure TfrmUnSwDialog.edtSearchKeyDown(Sender: TObject; var Key: Word; +procedure TfrmUnSwDialog.cmbSearchKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin - 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 - lstUnits.Perform(WM_KEYDOWN, Key, 0); + 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; +end; + +procedure TfrmUnSwDialog.cmbSearchKeyPress(Sender: TObject; var Key: Char); +begin + // Ctrl-Backspace + if Key = #127 then + Key := #0; end; procedure TfrmUnSwDialog.TypeFilterChange(Sender: TObject); diff --git a/Source/UnSwSettings.pas b/Source/UnSwSettings.pas index ea95256..cdc8ef7 100644 --- a/Source/UnSwSettings.pas +++ b/Source/UnSwSettings.pas @@ -91,7 +91,7 @@ type constructor Create(); destructor Destroy(); override; - procedure ResetDefaults(); + procedure ResetDefaults(const AColorsOnly: Boolean = False); procedure Save(); property Colors: TUnSwColorSettings read FColors write FColors; @@ -199,8 +199,7 @@ end; procedure TUnSwDialogSettings.Load(const ARegistry: TRegistry); var - eSort: TUnSwDialogSort; - iSort: Integer absolute eSort; + iSort: Integer; sMRU: String; begin @@ -226,18 +225,17 @@ begin ReadIntegerDef(ARegistry, FWidth, 'Width'); ReadIntegerDef(ARegistry, FHeight, 'Height'); - // The 'absolute' acts as an implicit typecast - eSort := FSort; + iSort := Integer(FSort); ReadIntegerDef(ARegistry, iSort, 'Sort'); - FSort := eSort; + FSort := TUnSwDialogSort(iSort); - if ARegistry.ValueExists('MRU') then + if ARegistry.ValueExists(GetKeyName('MRU')) then begin - SetLength(sMRU, ARegistry.GetDataSize('MRU')); + SetLength(sMRU, ARegistry.GetDataSize(GetKeyName('MRU'))); if Length(sMRU) > 0 then begin - ARegistry.ReadBinaryData('MRU', PChar(sMRU)^, Length(sMRU)); - FMRUList.Text := sMRU; + ARegistry.ReadBinaryData(GetKeyName('MRU'), PChar(sMRU)^, Length(sMRU)); + FMRUList.Text := Trim(sMRU); end; end; end; @@ -260,9 +258,9 @@ begin if FMRUList.Count > 0 then begin sMRU := FMRUList.Text; - ARegistry.WriteBinaryData('MRU', PChar(sMRU)^, Length(sMRU)); + ARegistry.WriteBinaryData(GetKeyName('MRU'), PChar(sMRU)^, Length(sMRU)); end else - ARegistry.DeleteValue('MRU'); + ARegistry.DeleteValue(GetKeyName('MRU')); end; @@ -298,6 +296,7 @@ begin FFormsDialog := TUnSwDialogSettings.Create('Forms'); FUnitsDialog := TUnSwDialogSettings.Create('Units'); ResetDefaults(); + Load(); end; destructor TUnSwSettings.Destroy(); @@ -310,7 +309,7 @@ begin end; -procedure TUnSwSettings.ResetDefaults(); +procedure TUnSwSettings.ResetDefaults(const AColorsOnly: Boolean); procedure ResetDialog(const ADialog: TUnSwDialogSettings); begin ADialog.IncludeDataModules := True; @@ -323,8 +322,11 @@ procedure TUnSwSettings.ResetDefaults(); end; begin - ResetDialog(FFormsDialog); - ResetDialog(FUnitsDialog); + if not AColorsOnly then + begin + ResetDialog(FFormsDialog); + ResetDialog(FUnitsDialog); + end; FColors.Enabled := True; FColors.DataModules := RGB( 35, 120, 35); // Green