lazarus/packager/frames/package_usage_options.pas
2012-03-24 14:44:29 +00:00

292 lines
8.8 KiB
ObjectPascal

unit package_usage_options;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, StdCtrls, Dialogs, PathEditorDlg,
IDEOptionsIntf, MacroIntf,
LazarusIDEStrConsts, IDEProcs, PackageDefs;
type
{ TPackageUsageOptionsFrame }
TPackageUsageOptionsFrame = class(TAbstractIDEOptionsEditor)
AddOptionsGroupBox: TGroupBox;
AddPackageUnitToProjectCheckBox: TCheckBox;
AddPathsGroupBox: TGroupBox;
CustomOptionsLabel: TLabel;
CustomOptionsMemo: TMemo;
IncludePathEdit: TEdit;
IncludePathLabel: TLabel;
LibraryPathEdit: TEdit;
LibraryPathLabel: TLabel;
LinkerOptionsLabel: TLabel;
LinkerOptionsMemo: TMemo;
ObjectPathEdit: TEdit;
ObjectPathLabel: TLabel;
ProjectGroupBox: TGroupBox;
UnitPathEdit: TEdit;
UnitPathLabel: TLabel;
private
UnitPathButton: TPathEditorButton;
IncludePathButton: TPathEditorButton;
ObjectPathButton: TPathEditorButton;
LibraryPathButton: TPathEditorButton;
FLazPackage: TLazPackage;
procedure PathEditBtnClick(Sender: TObject);
procedure PathEditBtnExecuted(Sender: TObject);
function GetEditForPathButton(AButton: TPathEditorButton): TEdit;
public
function GetTitle: string; override;
procedure Setup(ADialog: TAbstractOptionsEditorDialog); override;
procedure ReadSettings(AOptions: TAbstractIDEOptions); override;
procedure WriteSettings(AOptions: TAbstractIDEOptions); override;
class function SupportedOptionsClass: TAbstractIDEOptionsClass; override;
end;
implementation
{$R *.lfm}
{ TPackageUsageOptionsFrame }
procedure TPackageUsageOptionsFrame.PathEditBtnClick(Sender: TObject);
var
AButton: TPathEditorButton;
OldPath: string;
AnEdit: TEdit;
Templates: string;
begin
if not (Sender is TPathEditorButton) then
exit;
AButton := TPathEditorButton(Sender);
AnEdit := GetEditForPathButton(AButton);
OldPath := AnEdit.Text;
if AButton = UnitPathButton then
begin
Templates := SetDirSeparators('$(PkgOutDir)' +
'$(LazarusDir)/lcl/units/$(TargetCPU)-$(TargetOS)' +
';$(LazarusDir)/lcl/units/$(TargetCPU)-$(TargetOS)/$(LCLWidgetType)' +
';$(LazarusDir)/components/codetools/units/$(TargetCPU)-$(TargetOS)' +
';$(LazarusDir)/components/custom' +
';$(LazarusDir)/packager/units/$(TargetCPU)-$(TargetOS)');
end
else if AButton = IncludePathButton then
begin
Templates := 'include';
end
else
if AButton = ObjectPathButton then
begin
Templates := 'objects';
end
else
if AButton = LibraryPathButton then
begin
Templates := '';
end;
AButton.CurrentPathEditor.Path := OldPath;
AButton.CurrentPathEditor.Templates := SetDirSeparators(Templates);
end;
procedure TPackageUsageOptionsFrame.PathEditBtnExecuted(Sender: TObject);
var
AButton: TPathEditorButton;
NewPath: string;
AnEdit: TEdit;
OldPath: string;
CurDir: string;
StartPos: integer;
DlgResult: TModalResult;
OldStartPos: longint;
begin
if not (Sender is TPathEditorButton) then
exit;
AButton := TPathEditorButton(Sender);
if AButton.CurrentPathEditor.ModalResult <> mrOk then
exit;
NewPath := AButton.CurrentPathEditor.Path;
AnEdit := GetEditForPathButton(AButton);
OldPath := AnEdit.Text;
if OldPath <> NewPath then
begin
// check NewPath
StartPos := 1;
repeat
OldStartPos := StartPos;
CurDir := GetNextDirectoryInSearchPath(NewPath, StartPos);
if CurDir <> '' then
begin
IDEMacros.SubstituteMacros(CurDir);
FLazPackage.LongenFilename(CurDir);
if not DirPathExists(CurDir) then
begin
DlgResult := QuestionDlg(lisEnvOptDlgDirectoryNotFound,
Format(lisDirectoryNotFound, ['"', CurDir, '"']),
mtError, [mrIgnore, mrYes, lisRemoveFromSearchPath, mrCancel], 0);
case DlgResult of
mrIgnore: ;
mrYes:
begin
// remove directory from search path
NewPath := copy(NewPath, 1, OldStartPos - 1) +
copy(NewPath, StartPos, length(NewPath));
StartPos := OldStartPos;
end;
else
// undo
NewPath := OldPath;
break;
end;
end;
end;
until StartPos > length(NewPath);
end;
AnEdit.Text := NewPath;
end;
function TPackageUsageOptionsFrame.GetEditForPathButton(
AButton: TPathEditorButton): TEdit;
begin
if AButton = UnitPathButton then
Result := UnitPathEdit
else if AButton = IncludePathButton then
Result := IncludePathEdit
else if AButton = ObjectPathButton then
Result := ObjectPathEdit
else if AButton = LibraryPathButton then
Result := LibraryPathEdit
else
Result := nil;
end;
function TPackageUsageOptionsFrame.GetTitle: string;
begin
Result := lisPckOptsUsage;
end;
procedure TPackageUsageOptionsFrame.Setup(ADialog: TAbstractOptionsEditorDialog);
begin
AddPathsGroupBox.Caption := lisPckOptsAddPathsToDependentPackagesProjects;
UnitPathLabel.Caption := lisPkgFileTypeUnit;
IncludePathLabel.Caption := lisPckOptsInclude;
ObjectPathLabel.Caption := lisPckOptsObject;
LibraryPathLabel.Caption := lisPckOptsLibrary;
AddOptionsGroupBox.Caption := lisPckOptsAddOptionsToDependentPackagesAndProjects;
LinkerOptionsLabel.Caption := lisPckOptsLinker;
CustomOptionsLabel.Caption := lisPckOptsCustom;
UnitPathButton := TPathEditorButton.Create(Self);
with UnitPathButton do
begin
Name := 'UnitPathButton';
Parent := AddPathsGroupBox;
Caption := '...';
AutoSize := True;
Anchors := [akRight];
AnchorParallel(akRight, 6, AddPathsGroupBox);
AnchorParallel(akTop, 0, UnitPathEdit);
AnchorParallel(akBottom, 0, UnitPathEdit);
OnClick := @PathEditBtnClick;
OnExecuted := @PathEditBtnExecuted;
end;
UnitPathEdit.AnchorToNeighbour(akRight,0,UnitPathButton);
IncludePathButton := TPathEditorButton.Create(Self);
with IncludePathButton do
begin
Name := 'IncludePathButton';
Parent := AddPathsGroupBox;
Caption := '...';
AutoSize := True;
Anchors := [akRight];
AnchorParallel(akRight, 6, AddPathsGroupBox);
AnchorParallel(akTop, 0, IncludePathEdit);
AnchorParallel(akBottom, 0, IncludePathEdit);
OnClick := @PathEditBtnClick;
OnExecuted := @PathEditBtnExecuted;
end;
IncludePathEdit.AnchorToNeighbour(akRight,0,IncludePathButton);
ObjectPathButton := TPathEditorButton.Create(Self);
with ObjectPathButton do
begin
Name := 'ObjectPathButton';
Parent := AddPathsGroupBox;
Caption := '...';
AutoSize := True;
Anchors := [akRight];
AnchorParallel(akRight, 6, AddPathsGroupBox);
AnchorParallel(akTop, 0, ObjectPathEdit);
AnchorParallel(akBottom, 0, ObjectPathEdit);
OnClick := @PathEditBtnClick;
OnExecuted := @PathEditBtnExecuted;
end;
ObjectPathEdit.AnchorToNeighbour(akRight,0,ObjectPathButton);
LibraryPathButton := TPathEditorButton.Create(Self);
with LibraryPathButton do
begin
Name := 'LibraryPathButton';
Parent := AddPathsGroupBox;
Caption := '...';
AutoSize := True;
Anchors := [akRight];
AnchorParallel(akRight, 6, AddPathsGroupBox);
AnchorParallel(akTop, 0, LibraryPathEdit);
AnchorParallel(akBottom, 0, LibraryPathEdit);
OnClick := @PathEditBtnClick;
OnExecuted := @PathEditBtnExecuted;
end;
LibraryPathEdit.AnchorToNeighbour(akRight,0,LibraryPathButton);
ProjectGroupBox.Caption := dlgProject;
AddPackageUnitToProjectCheckBox.Caption := podAddPackageUnitToUsesSection;
end;
procedure TPackageUsageOptionsFrame.ReadSettings(AOptions: TAbstractIDEOptions);
var
LazPackage: TLazPackage absolute AOptions;
begin
FLazPackage := LazPackage;
with LazPackage.UsageOptions do
begin
UnitPathEdit.Text := UnitPath;
IncludePathEdit.Text := IncludePath;
ObjectPathEdit.Text := ObjectPath;
LibraryPathEdit.Text := LibraryPath;
LinkerOptionsMemo.Text := LinkerOptions;
CustomOptionsMemo.Text := CustomOptions;
end;
AddPackageUnitToProjectCheckBox.Checked := LazPackage.AddToProjectUsesSection;
end;
procedure TPackageUsageOptionsFrame.WriteSettings(AOptions: TAbstractIDEOptions);
var
LazPackage: TLazPackage absolute AOptions;
begin
with LazPackage.UsageOptions do
begin
UnitPath := TrimSearchPath(UnitPathEdit.Text, '');
IncludePath := TrimSearchPath(IncludePathEdit.Text, '');
ObjectPath := TrimSearchPath(ObjectPathEdit.Text, '');
LibraryPath := TrimSearchPath(LibraryPathEdit.Text, '');
LinkerOptions := LinkerOptionsMemo.Text;
CustomOptions := CustomOptionsMemo.Text;
end;
LazPackage.AddToProjectUsesSection := AddPackageUnitToProjectCheckBox.Checked;
end;
class function TPackageUsageOptionsFrame.SupportedOptionsClass: TAbstractIDEOptionsClass;
begin
Result := TLazPackage;
end;
initialization
RegisterIDEOptionsEditor(GroupPackage, TPackageUsageOptionsFrame, PackageOptionsUsage);
end.