Added: initial filter configuration dialog

This commit is contained in:
Mark van Renswoude 2007-12-14 15:38:55 +00:00
parent 450baa3705
commit 8faa61f358
10 changed files with 646 additions and 60 deletions

Binary file not shown.

View File

@ -52,6 +52,8 @@ contains
CmpSwDialog in '..\..\Source\CmpSwDialog.pas' {frmCmpSwDialog},
CmpSwFilters in '..\..\Source\CmpSwFilters.pas',
BaseSwSettings in '..\..\Source\BaseSwSettings.pas',
CmpSwSettings in '..\..\Source\CmpSwSettings.pas';
CmpSwSettings in '..\..\Source\CmpSwSettings.pas',
CmpSwConfiguration in '..\..\Source\CmpSwConfiguration.pas' {frmCmpSwConfiguration},
CmpSwFilterConfiguration in '..\..\Source\CmpSwFilterConfiguration.pas' {frmCmpSwFilterConfiguration};
end.

View File

@ -0,0 +1,235 @@
object frmCmpSwConfiguration: TfrmCmpSwConfiguration
Left = 279
Top = 170
BorderIcons = [biSystemMenu]
BorderStyle = bsDialog
Caption = 'ComponentSwitcher Configuration'
ClientHeight = 423
ClientWidth = 328
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
Position = poScreenCenter
DesignSize = (
328
423)
PixelsPerInch = 96
TextHeight = 13
object pcConfiguration: TPageControl
Left = 4
Top = 4
Width = 320
Height = 382
ActivePage = tsGeneral
Anchors = [akLeft, akTop, akRight, akBottom]
TabOrder = 0
object tsGeneral: TTabSheet
Caption = 'Filters'
DesignSize = (
312
354)
object btnDefault: TButton
Left = 4
Top = 323
Width = 109
Height = 25
Anchors = [akLeft, akBottom]
Caption = 'Reset to &default'
TabOrder = 0
OnClick = btnDefaultClick
end
object chkAllowEmptyResults: TCheckBox
Left = 4
Top = 292
Width = 273
Height = 17
Anchors = [akLeft, akBottom]
Caption = 'Allow e&mpty results'
TabOrder = 1
end
object lbFilters: TListBox
Left = 4
Top = 4
Width = 301
Height = 233
Style = lbVirtual
Anchors = [akLeft, akTop, akRight, akBottom]
ItemHeight = 16
TabOrder = 2
OnClick = lbFiltersClick
OnData = lbFiltersData
OnDataObject = lbFiltersDataObject
end
object btnAdd: TButton
Left = 4
Top = 243
Width = 97
Height = 25
Action = actAdd
Anchors = [akLeft, akBottom]
TabOrder = 3
end
object btnEdit: TButton
Left = 108
Top = 243
Width = 97
Height = 25
Action = actEdit
Anchors = [akLeft, akBottom]
TabOrder = 4
end
object btnRemove: TButton
Left = 212
Top = 243
Width = 93
Height = 25
Action = actRemove
Anchors = [akLeft, akBottom]
TabOrder = 5
end
end
object tsAbout: TTabSheet
Caption = 'About...'
ImageIndex = 1
DesignSize = (
312
354)
object imgAbout: TImage
Left = 8
Top = 8
Width = 32
Height = 32
Picture.Data = {
055449636F6E0000010001002020100001000400E80200001600000028000000
2000000040000000010004000000000000020000000000000000000000000000
0000000000000000000080000080000000808000800000008000800080800000
80808000C0C0C0000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000
FFFFFF0000000000000000000000000000000000000000000000000000000000
00000000000000F7777777777777777777777700000000F8F8F8F8F8F8F8F8F8
F8F8F700000000FF8F8F8F8F8F8F8F8F8F8F8700000000F8F8F8F8F8F8F8F8F8
F8F8F700000000FF8F8F8F8F8F8F8F8F8F8F8700000000F8F000000000000000
0008F700000000FF8F8F8F8F8F8F8F8F8F8F8700000000F8F8F8F8F8F8F8F8F8
F8F8F700000000FF8F8F8F8F8F8F8F8F8F8F8700000000F8F000000000000000
0008F700000000FF8F8F8F8F8F8F8F8F8F8F87000C0000F99999999999999999
999997000CC000F99999999999999999999997000CCE00F99FFFFFFFFFFFFFFF
FFF997000CE000F99999999999999999999997000E0000F99999999999999999
99999700000000FF8F8F8F8F8F8F8F8F8F8F8700000000F8F000000000000000
0008F700000000FF8F8F8F8F8F8F8F8F8F8F8700000000F8F8F8F8F8F8F8F8F8
F8F8F700000000FF8F8F8F8F8F8F8F8F8F8F8700000000F8F0000000000008F8
77777700000000FF8F8F8F8F8F8F8F8000000000000000F8F8F8F8F8F8F8F8F0
FFFFF000000000FF8F8F8F8F8F8F8F80FFFF0000000000F8F0000000000008F0
FFF00000000000FF8F8F8F8F8F8F8F80FF000000000000F8F8F8F8F8F8F8F8F0
F0000000000000FFFFFFFFFFFFFFFFF000000000000000000000000000000000
00000000FFFFFFFFF8000001F8000001F8000001F8000001F8000001F8000001
F8000001F8000001F8000001F800000178000001380000011800000108000001
0000000108000001180000013800000178000001F8000001F8000001F8000001
F8000001F8000001F8000003F8000007F800000FF800001FF800003FF800007F
F80000FF}
end
object TLabel
Left = 56
Top = 8
Width = 130
Height = 16
Caption = 'ComponentSwitcher'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -13
Font.Name = 'Tahoma'
Font.Style = [fsBold]
ParentFont = False
end
object lblVersion: TLabel
Left = 56
Top = 23
Width = 54
Height = 13
Caption = 'Version 0.1'
end
object TLabel
Left = 160
Top = 23
Width = 145
Height = 13
Anchors = [akTop, akRight]
Caption = 'Copyright '#169' 2007 X'#178'Software'
end
object TLabel
Left = 56
Top = 90
Width = 241
Height = 41
AutoSize = False
Caption =
'ComponentSwitcher is released as open-source under the zlib/libp' +
'ng OSI-approved license. See license.txt for details.'
WordWrap = True
end
object lblBugReport: TLabel
Left = 56
Top = 328
Width = 75
Height = 13
Cursor = crHandPoint
Anchors = [akLeft, akBottom]
Caption = 'Report a bug...'
Font.Charset = DEFAULT_CHARSET
Font.Color = clBlue
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = [fsUnderline]
ParentFont = False
OnClick = lblBugReportClick
end
end
end
object btnCancel: TButton
Left = 249
Top = 392
Width = 75
Height = 25
Anchors = [akRight, akBottom]
Cancel = True
Caption = 'Cancel'
ModalResult = 2
TabOrder = 1
end
object btnOk: TButton
Left = 168
Top = 392
Width = 75
Height = 25
Anchors = [akRight, akBottom]
Caption = 'OK'
Default = True
ModalResult = 1
TabOrder = 2
end
object dlgColor: TColorDialog
Options = [cdFullOpen]
Left = 24
Top = 364
end
object alMain: TActionList
Left = 96
Top = 364
object actAdd: TAction
Caption = '&Add...'
OnExecute = actAddExecute
end
object actEdit: TAction
Caption = '&Edit...'
Enabled = False
OnExecute = actEditExecute
end
object actRemove: TAction
Caption = '&Remove'
Enabled = False
OnExecute = actRemoveExecute
end
end
end

View File

@ -0,0 +1,179 @@
{: Contains the configuration dialog.
Last changed: $Date$
Revision: $Rev$
Author: $Author$
}
unit CmpSwConfiguration;
interface
uses
ActnList,
Classes,
ComCtrls,
Controls,
Dialogs,
ExtCtrls,
Forms,
Graphics,
StdCtrls;
type
TfrmCmpSwConfiguration = class(TForm)
actAdd: TAction;
actEdit: TAction;
actRemove: TAction;
alMain: TActionList;
btnAdd: TButton;
btnCancel: TButton;
btnDefault: TButton;
btnEdit: TButton;
btnOk: TButton;
btnRemove: TButton;
chkAllowEmptyResults: TCheckBox;
dlgColor: TColorDialog;
imgAbout: TImage;
lbFilters: TListBox;
lblBugReport: TLabel;
lblVersion: TLabel;
pcConfiguration: TPageControl;
tsAbout: TTabSheet;
tsGeneral: TTabSheet;
procedure btnDefaultClick(Sender: TObject);
procedure lblBugReportClick(Sender: TObject);
procedure actAddExecute(Sender: TObject);
procedure actEditExecute(Sender: TObject);
procedure actRemoveExecute(Sender: TObject);
procedure lbFiltersClick(Sender: TObject);
procedure lbFiltersData(Control: TWinControl; Index: Integer; var Data: String);
procedure lbFiltersDataObject(Control: TWinControl; Index: Integer; var DataObject: TObject);
private
function InternalExecute(): Boolean;
procedure LoadSettings();
procedure SaveSettings();
procedure RefreshFilters();
public
class function Execute(): Boolean;
end;
implementation
uses
ShellAPI,
Windows,
CmpSwSettings, CmpSwFilters;
{$R *.dfm}
{ TfrmCmpSwConfiguration }
class function TfrmCmpSwConfiguration.Execute(): Boolean;
begin
with Self.Create(nil) do
try
pcConfiguration.ActivePage := tsGeneral;
Result := InternalExecute();
finally
Free();
end;
end;
function TfrmCmpSwConfiguration.InternalExecute(): Boolean;
begin
LoadSettings();
RefreshFilters();
Result := (ShowModal() = mrOk);
if Result then
SaveSettings();
end;
procedure TfrmCmpSwConfiguration.lblBugReportClick(Sender: TObject);
begin
ShellExecute(0, 'open', 'mailto:support@x2software.net', nil, nil, SW_SHOWNORMAL);
end;
procedure TfrmCmpSwConfiguration.LoadSettings();
begin
chkAllowEmptyResults.Checked := Settings.AllowEmptyResult;
end;
procedure TfrmCmpSwConfiguration.SaveSettings();
begin
Settings.AllowEmptyResult := chkAllowEmptyResults.Checked;
Settings.Save();
end;
procedure TfrmCmpSwConfiguration.btnDefaultClick(Sender: TObject);
begin
if MessageBox(Self.Handle, 'Are you sure you want to revert the ' +
'settings? This action can not be undone.',
'Reset to default', MB_YESNO or MB_ICONQUESTION) = ID_YES then
begin
Settings.ResetDefaults();
Settings.Save();
LoadSettings();
end;
end;
procedure TfrmCmpSwConfiguration.actAddExecute(Sender: TObject);
begin
//
end;
procedure TfrmCmpSwConfiguration.actEditExecute(Sender: TObject);
begin
//
end;
procedure TfrmCmpSwConfiguration.actRemoveExecute(Sender: TObject);
begin
//
end;
procedure TfrmCmpSwConfiguration.lbFiltersClick(Sender: TObject);
var
itemSelected: Boolean;
begin
itemSelected := (lbFilters.ItemIndex > -1);
actEdit.Enabled := itemSelected;
actRemove.Enabled := itemSelected;
end;
procedure TfrmCmpSwConfiguration.RefreshFilters();
begin
lbFilters.Count := Settings.Filter.Count;
end;
procedure TfrmCmpSwConfiguration.lbFiltersData(Control: TWinControl; Index: Integer; var Data: String);
begin
if (Index >= 0) and (Index < Settings.Filter.Count) then
Data := Settings.Filter[Index].Name;
end;
procedure TfrmCmpSwConfiguration.lbFiltersDataObject(Control: TWinControl; Index: Integer; var DataObject: TObject);
begin
if (Index >= 0) and (Index < Settings.Filter.Count) then
DataObject := Settings.Filter[Index];
end;
end.

View File

@ -37,6 +37,15 @@ inherited frmCmpSwDialog: TfrmCmpSwDialog
inherited btnOK: TButton
Left = 190
end
object btnConfiguration: TButton
Left = 4
Top = 5
Width = 85
Height = 25
Caption = '&Configuration'
TabOrder = 2
OnClick = btnConfigurationClick
end
end
object pnlFilters: TPanel [3]
Left = 0

View File

@ -51,10 +51,12 @@ type
pmnItemsSortByName: TMenuItem;
pmnItemsSortByType: TMenuItem;
pmnItemsSep2: TMenuItem;
btnConfiguration: TButton;
procedure btnMoreFiltersClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure SortExecute(Sender: TObject);
procedure btnConfigurationClick(Sender: TObject);
private
FClassFilteredList: TBaseSwItemList;
FClassFilter: TCmpSwComponentClassFilter;
@ -93,6 +95,7 @@ uses
SysUtils,
ToolsAPI,
CmpSwConfiguration,
CmpSwObjects,
CmpSwSettings;
@ -247,6 +250,8 @@ begin
FFilterCheckBoxes := TObjectList.Create();
FOtherGroup := TCmpSwFilterGroup.Create(nil);
try
ClassFilter.Groups := Settings.Filter;
FOtherGroup.Name := 'Other';
FOtherGroup.Enabled := False;
FOtherGroup.Visible := False;
@ -471,8 +476,6 @@ begin
Self.ClientHeight := Settings.Dialog.Height;
MRUList.Assign(Settings.Dialog.MRUList);
Settings.LoadFilter(ClassFilter.Groups);
inherited LoadSettings();
end;
@ -486,8 +489,6 @@ begin
Settings.Dialog.MRUList.Assign(MRUList);
Settings.Save();
Settings.SaveFilter(ClassFilter.Groups);
inherited SaveSettings();
end;
@ -495,7 +496,7 @@ end;
function TfrmCmpSwDialog.AllowEmptyResult(): Boolean;
begin
Result := True;
Result := Settings.AllowEmptyResult;
end;
@ -533,4 +534,14 @@ begin
ClassFilteredList.Sort(SortByName);
end;
procedure TfrmCmpSwDialog.btnConfigurationClick(Sender: TObject);
begin
if TfrmCmpSwConfiguration.Execute() then
begin
UpdateClassFilter();
UpdateSubFilters();
end;
end;
end.

View File

@ -0,0 +1,62 @@
object frmCmpSwFilterConfiguration: TfrmCmpSwFilterConfiguration
Left = 317
Top = 192
BorderIcons = [biSystemMenu]
BorderStyle = bsDialog
BorderWidth = 8
Caption = 'Filter'
ClientHeight = 343
ClientWidth = 345
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Position = poScreenCenter
PixelsPerInch = 96
TextHeight = 13
object gbMain: TGroupBox
Left = 0
Top = 0
Width = 345
Height = 308
Align = alClient
TabOrder = 0
end
object pnlButtons: TPanel
Left = 0
Top = 308
Width = 345
Height = 35
Align = alBottom
BevelOuter = bvNone
TabOrder = 1
DesignSize = (
345
35)
object btnOk: TButton
Left = 189
Top = 10
Width = 75
Height = 25
Anchors = [akRight, akBottom]
Caption = 'OK'
Default = True
ModalResult = 1
TabOrder = 0
end
object btnCancel: TButton
Left = 270
Top = 10
Width = 75
Height = 25
Anchors = [akRight, akBottom]
Cancel = True
Caption = 'Cancel'
ModalResult = 2
TabOrder = 1
end
end
end

View File

@ -0,0 +1,57 @@
{: Contains the filter configuration dialog.
Last changed: $Date$
Revision: $Rev$
Author: $Author$
}
unit CmpSwFilterConfiguration;
interface
uses
Classes,
Controls,
ExtCtrls,
Forms,
StdCtrls,
CmpSwFilters;
type
TfrmCmpSwFilterConfiguration = class(TForm)
gbMain: TGroupBox;
pnlButtons: TPanel;
btnOk: TButton;
btnCancel: TButton;
protected
function InternalExecute(AGroup: TCmpSwFilterGroup): Boolean;
public
class function Execute(AGroup: TCmpSwFilterGroup): Boolean;
end;
implementation
{$R *.dfm}
{ TfrmCmpSwFilterConfiguration }
class function TfrmCmpSwFilterConfiguration.Execute(AGroup: TCmpSwFilterGroup): Boolean;
begin
with Self.Create(nil) do
try
Result := InternalExecute(AGroup);
finally
Free();
end;
end;
function TfrmCmpSwFilterConfiguration.InternalExecute(AGroup: TCmpSwFilterGroup): Boolean;
begin
Result := (ShowModal() = mrOk);
end;
end.

View File

@ -60,14 +60,17 @@ type
private
FFilterUnmatched: Boolean;
FGroups: TCmpSwFilterGroups;
FOwnsGroups: Boolean;
function GetGroups(): TCmpSwFilterGroups;
procedure SetGroups(const Value: TCmpSwFilterGroups);
protected
procedure VisitItem(const AItem: TBaseSwItem); override;
public
constructor Create();
destructor Destroy(); override;
property FilterUnmatched: Boolean read FFilterUnmatched write FFilterUnmatched;
property Groups: TCmpSwFilterGroups read FGroups;
property Groups: TCmpSwFilterGroups read GetGroups write SetGroups;
end;
@ -243,19 +246,37 @@ end;
{ TCmpSwComponentClassFilter }
constructor TCmpSwComponentClassFilter.Create();
destructor TCmpSwComponentClassFilter.Destroy();
begin
inherited;
if FOwnsGroups then
FreeAndNil(FGroups);
FGroups := TCmpSwFilterGroups.Create();
inherited;
end;
destructor TCmpSwComponentClassFilter.Destroy();
function TCmpSwComponentClassFilter.GetGroups(): TCmpSwFilterGroups;
begin
FreeAndNil(FGroups);
if not Assigned(FGroups) then
begin
FGroups := TCmpSwFilterGroups.Create();
FOwnsGroups := True;
end;
inherited;
Result := FGroups;
end;
procedure TCmpSwComponentClassFilter.SetGroups(const Value: TCmpSwFilterGroups);
begin
if Value <> FGroups then
begin
if FOwnsGroups then
FreeAndNil(FGroups);
FGroups := Value;
FOwnsGroups := False;
end;
end;

View File

@ -36,12 +36,17 @@ type
TCmpSwSettings = class(TObject)
private
FAllowEmptyResult: Boolean;
FDialog: TCmpSwDialogSettings;
FFilter: TCmpSwFilterGroups;
FRegistryKey: String;
protected
procedure Load();
procedure LoadFilter(const AKey: String; AGroups: TCmpSwFilterGroups);
procedure SaveFilter(const AKey: String; AGroups: TCmpSwFilterGroups);
procedure LoadFilterGroup(ARegistry: TRegistry; AGroup: TCmpSwFilterGroup);
procedure SaveFilterGroup(ARegistry: TRegistry; AGroup: TCmpSwFilterGroup);
public
@ -51,10 +56,9 @@ type
procedure ResetDefaults();
procedure Save();
procedure LoadFilter(AGroups: TCmpSwFilterGroups);
procedure SaveFilter(AGroups: TCmpSwFilterGroups);
property Dialog: TCmpSwDialogSettings read FDialog write FDialog;
property AllowEmptyResult: Boolean read FAllowEmptyResult write FAllowEmptyResult;
property Dialog: TCmpSwDialogSettings read FDialog write FDialog;
property Filter: TCmpSwFilterGroups read FFilter;
end;
function Settings(): TCmpSwSettings;
@ -144,6 +148,7 @@ begin
'\ComponentSwitcher';
FDialog := TCmpSwDialogSettings.Create();
FFilter := TCmpSwFilterGroups.Create();
ResetDefaults();
Load();
@ -152,6 +157,7 @@ end;
destructor TCmpSwSettings.Destroy();
begin
FreeAndNil(FFilter);
FreeAndNil(FDialog);
inherited;
@ -171,6 +177,7 @@ begin
if OpenKey(FRegistryKey, False) then
begin
FDialog.Load(ideRegistry);
LoadFilter('\Filter', Filter);
CloseKey();
end;
@ -182,8 +189,46 @@ end;
procedure TCmpSwSettings.ResetDefaults();
begin
AllowEmptyResult := True;
Dialog.Width := 350;
Dialog.Height := 530;
{ Fill default groups }
Filter.Clear();
with Filter.Add() do
begin
Name := 'Actions';
Filter.Add('TAction');
IncludeDescendants := True;
Visible := True;
end;
with Filter.Add() do
begin
Name := 'Menu items';
Filter.Add('TMenuItem');
Visible := True;
end;
with Filter.Add() do
begin
Name := 'Dataset fields';
Filter.Add('TField');
IncludeDescendants := True;
Visible := True;
end;
with Filter.Add() do
begin
Name := 'DevEx Grid columns';
Filter.Add('TcxGridDBColumn');
Filter.Add('TcxGridColumn');
end;
end;
@ -200,6 +245,7 @@ begin
if OpenKey(FRegistryKey, True) then
begin
FDialog.Save(ideRegistry);
SaveFilter('\Filter', Filter);
CloseKey();
end;
@ -209,7 +255,7 @@ begin
end;
procedure TCmpSwSettings.LoadFilter(AGroups: TCmpSwFilterGroups);
procedure TCmpSwSettings.LoadFilter(const AKey: String; AGroups: TCmpSwFilterGroups);
var
ideRegistry: TRegistry;
groupCount: Integer;
@ -222,7 +268,7 @@ begin
try
RootKey := HKEY_CURRENT_USER;
if OpenKey(FRegistryKey + '\Filter', False) then
if OpenKey(FRegistryKey + AKey, False) then
begin
AGroups.Clear();
groupCount := 0;
@ -240,42 +286,6 @@ 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();
@ -283,7 +293,7 @@ begin
end;
procedure TCmpSwSettings.SaveFilter(AGroups: TCmpSwFilterGroups);
procedure TCmpSwSettings.SaveFilter(const AKey: String; AGroups: TCmpSwFilterGroups);
var
ideRegistry: TRegistry;
subKeys: TStringList;
@ -296,7 +306,7 @@ begin
try
RootKey := HKEY_CURRENT_USER;
if OpenKey(FRegistryKey + '\Filter', True) then
if OpenKey(FRegistryKey + AKey, True) then
begin
subKeys := TStringList.Create();
try