1
0
mirror of synced 2024-11-15 00:43:50 +00:00
unitswitcher/Source/UnSwDialog.pas

284 lines
7.8 KiB
ObjectPascal
Raw Normal View History

2006-01-05 06:03:24 +00:00
unit UnSwDialog;
// #ToDo1 Store dialog settings
2006-01-05 06:03:24 +00:00
interface
uses
Classes,
ComCtrls,
Controls,
ExtCtrls,
Forms,
ImgList,
StdCtrls,
Windows,
UnSwObjects,
UnSwFilters;
2006-01-05 06:03:24 +00:00
type
TUnSwIconVisitor = class(TUnSwNoRefIntfObject, IUnSwVisitor)
private
FImageIndex: Integer;
protected
procedure VisitModule(const AUnit: TUnSwModuleUnit);
procedure VisitProject(const AUnit: TUnSwProjectUnit);
public
property ImageIndex: Integer read FImageIndex;
end;
2006-01-05 06:03:24 +00:00
TfrmUnSwDialog = class(TForm)
btnCancel: TButton;
btnOK: TButton;
2006-01-05 21:14:36 +00:00
chkDataModules: TCheckBox;
chkForms: TCheckBox;
chkProjectSource: TCheckBox;
2006-01-05 06:03:24 +00:00
edtSearch: TEdit;
ilsTypes: TImageList;
lstUnits: TListBox;
pnlButtons: TPanel;
2006-01-05 21:14:36 +00:00
pnlIncludeTypes: TPanel;
2006-01-05 06:03:24 +00:00
pnlMain: TPanel;
pnlSearch: TPanel;
sbStatus: TStatusBar;
procedure edtSearchChange(Sender: TObject);
procedure edtSearchKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
2006-01-05 21:14:36 +00:00
procedure TypeFilterChange(Sender: TObject);
2006-01-05 06:03:24 +00:00
procedure lstUnitsData(Control: TWinControl; Index: Integer; var Data: string);
procedure lstUnitsDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
private
2006-01-05 21:14:36 +00:00
FLoading: Boolean;
2006-01-05 06:03:24 +00:00
FUnitList: TUnSwUnitList;
FActiveUnit: TUnSwUnit;
FFormsOnly: Boolean;
2006-01-05 06:03:24 +00:00
FTypeFilteredList: TUnSwUnitList;
FInputFilteredList: TUnSwUnitList;
FTypeFilter: TUnSwUnitTypeFilter;
FInputFilter: TUnSwUnitSimpleFilter;
FIconVisitor: TUnSwIconVisitor;
function InternalExecute(): TUnSwUnit;
procedure UpdateTypeFilter();
2006-01-05 06:03:24 +00:00
procedure UpdateList();
function GetActiveUnit(): TUnSwUnit;
public
class function Execute(const AUnits: TUnSwUnitList;
const AFormsOnly: Boolean;
const AActive: TUnSwUnit = nil): TUnSwUnit;
2006-01-05 06:03:24 +00:00
end;
implementation
uses
2006-01-05 21:14:36 +00:00
DIalogs,
2006-01-05 06:03:24 +00:00
SysUtils,
Graphics;
2006-01-05 06:03:24 +00:00
{$R *.dfm}
{ TUnSwIconVisitor }
procedure TUnSwIconVisitor.VisitModule(const AUnit: TUnSwModuleUnit);
begin
case AUnit.UnitType of
swutForm: FImageIndex := 1;
swutDataModule: FImageIndex := 2;
else
FImageIndex := 0;
end;
end;
procedure TUnSwIconVisitor.VisitProject(const AUnit: TUnSwProjectUnit);
begin
FImageIndex := 3;
end;
2006-01-05 06:03:24 +00:00
{ TfrmUnSwDialog }
class function TfrmUnSwDialog.Execute(const AUnits: TUnSwUnitList;
const AFormsOnly: Boolean;
const AActive: TUnSwUnit): TUnSwUnit;
2006-01-05 06:03:24 +00:00
begin
with Self.Create(nil) do
try
FUnitList := AUnits;
FActiveUnit := AActive;
FFormsOnly := AFormsOnly;
Result := InternalExecute();
2006-01-05 06:03:24 +00:00
finally
Free();
end;
end;
function SortByName(Item1, Item2: Pointer): Integer;
begin
Result := CompareText(TUnSwUnit(Item1).Name, TUnSwUnit(Item2).Name)
end;
function TfrmUnSwDialog.InternalExecute(): TUnSwUnit;
2006-01-05 06:03:24 +00:00
begin
Result := nil;
2006-01-05 06:03:24 +00:00
FTypeFilteredList := TUnSwUnitList.Create();
FInputFilteredList := TUnSwUnitList.Create();
FTypeFilter := TUnSwUnitTypeFilter.Create(FTypeFilteredList);
FInputFilter := TUnSwUnitSimpleFilter.Create(FInputFilteredList);
2006-01-05 06:03:24 +00:00
try
2006-01-05 21:14:36 +00:00
if not FFormsOnly then
begin
FLoading := True;
try
chkForms.Checked := FTypeFilter.IncludeForms;
chkDataModules.Checked := FTypeFilter.IncludeDataModules;
chkProjectSource.Checked := FTypeFilter.IncludeProjectSource;
finally
FLoading := False;
end;
end else
pnlIncludeTypes.Visible := False;
UpdateTypeFilter();
2006-01-05 06:03:24 +00:00
FIconVisitor := TUnSwIconVisitor.Create();
try
if Self.ShowModal() = mrOk then
Result := GetActiveUnit();
finally
FreeAndNil(FIconVisitor);
end;
2006-01-05 06:03:24 +00:00
finally
FreeAndNil(FInputFilter);
FreeAndNil(FTypeFilter);
FreeAndNil(FInputFilteredList);
FreeAndNil(FTypeFilteredList);
end;
end;
procedure TfrmUnSwDialog.UpdateList();
var
pActive: TUnSwUnit;
begin
pActive := GetActiveUnit();
FInputFilteredList.Clone(FTypeFilteredList);
FInputFilteredList.AcceptVisitor(FInputFilter);
2006-01-05 06:03:24 +00:00
lstUnits.Count := FInputFilteredList.Count;
if FInputFilteredList.Count > 0 then
begin
if Assigned(pActive) then
lstUnits.ItemIndex := FInputFilteredList.IndexOf(pActive);
if lstUnits.ItemIndex = -1 then
lstUnits.ItemIndex := 0;
end;
end;
procedure TfrmUnSwDialog.UpdateTypeFilter();
begin
FTypeFilter.IncludeUnits := not FFormsOnly;
FTypeFilter.IncludeForms := (FFormsOnly or chkForms.Checked);
FTypeFilter.IncludeDataModules := ((not FFormsOnly) and chkDataModules.Checked);
FTypeFilter.IncludeProjectSource := ((not FFormsOnly) and chkProjectSource.Checked);
FTypeFilteredList.Clone(FUnitList);
FTypeFilteredList.AcceptVisitor(FTypeFilter);
FTypeFilteredList.Sort(SortByName);
UpdateList();
end;
2006-01-05 06:03:24 +00:00
function TfrmUnSwDialog.GetActiveUnit(): TUnSwUnit;
begin
Result := FActiveUnit;
if not Assigned(Result) then
begin
if lstUnits.ItemIndex > -1 then
Result := FInputFilteredList[lstUnits.ItemIndex];
end else
FActiveUnit := nil;
2006-01-05 06:03:24 +00:00
end;
procedure TfrmUnSwDialog.edtSearchChange(Sender: TObject);
begin
FInputFilter.Filter := edtSearch.Text;
UpdateList();
end;
procedure TfrmUnSwDialog.edtSearchKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Shift = [] then
case Key of
VK_UP:
begin
if lstUnits.ItemIndex > 0 then
lstUnits.ItemIndex := Pred(lstUnits.ItemIndex);
Key := 0;
end;
2006-01-05 06:03:24 +00:00
VK_DOWN:
begin
if lstUnits.ItemIndex < Pred(lstUnits.Items.Count) then
lstUnits.ItemIndex := Succ(lstUnits.ItemIndex);
Key := 0;
end;
2006-01-05 06:03:24 +00:00
end;
end;
procedure TfrmUnSwDialog.TypeFilterChange(Sender: TObject);
begin
2006-01-05 21:14:36 +00:00
if not FLoading then
UpdateTypeFilter();
end;
2006-01-05 06:03:24 +00:00
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
pUnit: TUnSwUnit;
2006-01-05 06:03:24 +00:00
rText: TRect;
sText: String;
begin
with TListBox(Control) do
begin
pUnit := FInputFilteredList[Index];
2006-01-05 06:03:24 +00:00
if odSelected in State then
begin
Canvas.Brush.Color := clHighlight;
Canvas.Font.Color := clHighlightText;
end else
begin
Canvas.Brush.Color := clWindow;
Canvas.Font.Color := clWindowText;
end;
Canvas.FillRect(Rect);
rText := Rect;
InflateRect(rText, -2, -2);
pUnit.AcceptVisitor(FIconVisitor);
ilsTypes.Draw(Canvas, rText.Left, rText.Top, FIconVisitor.ImageIndex);
2006-01-05 06:03:24 +00:00
Inc(rText.Left, ilsTypes.Width + 4);
sText := pUnit.Name;
2006-01-05 06:03:24 +00:00
DrawText(Canvas.Handle, PChar(sText), Length(sText), rText, DT_SINGLELINE or
DT_LEFT or DT_VCENTER or DT_END_ELLIPSIS);
end;
end;
end.