IDE: further migration external tools

git-svn-id: trunk@42278 -
This commit is contained in:
mattias 2013-08-03 13:41:02 +00:00
parent ee532ac376
commit 5179b2a173
4 changed files with 592 additions and 456 deletions

View File

@ -22,6 +22,10 @@
}
unit EditMsgScannersDlg;
{$IFDEF EnableNewExtTools}
{$Error}
{$ENDIF}
{$mode objfpc}{$H+}
interface

View File

@ -57,87 +57,6 @@ const
MaxExtTools = ecExtToolLast-ecExtToolFirst+1;
{$IFDEF EnableNewExtTools}
const
ExternalToolOptionsVersion = 3;
// 3: changed ScanOutputForFPCMessages to scanner SubToolFPC
// changed ScanOutputForMakeMessages to scanner SubToolMake
type
{ TExternalToolMenuItem - the options of an external tool in the IDE menu Tools }
TExternalToolMenuItem = class(TComponent)
private
FChangeStamp: integer;
fCmdLineParams: string;
FEnvironmentOverrides: TStringList;
fFilename: string;
FHideMainForm: boolean;
FKey: word;
FScanners: TStrings;
FShift: TShiftState;
fTitle: string;
fWorkingDirectory: string;
fSavedChangeStamp: integer;
function GetModified: boolean;
procedure SetChangeStamp(AValue: integer);
procedure SetCmdLineParams(AValue: string);
procedure SetEnvironmentOverrides(AValue: TStringList);
procedure SetFilename(AValue: string);
procedure SetHideMainForm(AValue: boolean);
procedure SetModified(AValue: boolean);
procedure SetScanners(AValue: TStrings);
procedure SetTitle(AValue: string);
procedure SetWorkingDirectory(AValue: string);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Clear;
function Equals(Obj: TObject): boolean; override;
function Load(Config: TConfigStorage; CfgVersion: integer): TModalResult; virtual;
function Save(Config: TConfigStorage): TModalResult; virtual;
procedure AddScanner(const Scanner: string);
property CmdLineParams: string read fCmdLineParams write SetCmdLineParams;
property Filename: string read fFilename write SetFilename;
property Title: string read fTitle write SetTitle;
property WorkingDirectory: string read fWorkingDirectory write SetWorkingDirectory;
property EnvironmentOverrides: TStringList read FEnvironmentOverrides write SetEnvironmentOverrides;
property HideMainForm: boolean read FHideMainForm write SetHideMainForm default true;
property Scanners: TStrings read FScanners write SetScanners;
property Modified: boolean read GetModified write SetModified;
property ChangeStamp: integer read FChangeStamp write SetChangeStamp;
procedure IncreaseChangeStamp; inline;
public
// these properties are saved in the keymappings, not in the config
property Key: word read FKey write FKey;
property Shift: TShiftState read FShift write FShift;
end;
{ TExternalToolMenuItems }
TExternalToolMenuItems = class(TBaseExternalToolMenuItems)
private
fItems: TObjectList; // list of TExternalToolMenuItem
function GetItems(Index: integer): TExternalToolMenuItem; inline;
public
constructor Create;
destructor Destroy; override;
procedure Clear; inline;
function Equals(Obj: TObject): boolean; override;
procedure Assign(Src: TExternalToolMenuItems);
procedure Add(Item: TExternalToolMenuItem);
procedure Insert(Index: integer; Item: TExternalToolMenuItem);
procedure Move(CurIndex, NewIndex: integer);
function Load(Config: TConfigStorage): TModalResult;
function Load(Config: TConfigStorage; const Path: string): TModalResult;
override;
function Save(Config: TConfigStorage): TModalResult;
function Save(Config: TConfigStorage; const Path: string): TModalResult;
override;
procedure LoadShortCuts(KeyCommandRelationList: TKeyCommandRelationList);
procedure SaveShortCuts(KeyCommandRelationList: TKeyCommandRelationList);
function Count: integer; inline;
property Items[Index: integer]: TExternalToolMenuItem read GetItems; default;
end;
{$ELSE EnableNewExtTools}
@ -268,182 +187,6 @@ begin
end;
{$IFDEF EnableNewExtTools}
{ TExternalToolMenuItems }
// inline
function TExternalToolMenuItems.Count: integer;
begin
Result:=fItems.Count;
end;
// inline
function TExternalToolMenuItems.GetItems(Index: integer): TExternalToolMenuItem;
begin
Result:=TExternalToolMenuItem(fItems[Index]);
end;
// inline
procedure TExternalToolMenuItems.Clear;
begin
fItems.Clear;
end;
constructor TExternalToolMenuItems.Create;
begin
fItems:=TObjectList.Create(true);
end;
destructor TExternalToolMenuItems.Destroy;
begin
Clear;
FreeAndNil(fItems);
inherited Destroy;
end;
function TExternalToolMenuItems.Equals(Obj: TObject): boolean;
var
Src: TExternalToolMenuItems;
i: Integer;
begin
if Obj=Self then exit;
if Obj is TExternalToolMenuItems then begin
Src:=TExternalToolMenuItems(Obj);
Result:=false;
if Count<>Src.Count then exit;
for i:=0 to Count-1 do
if not Items[i].Equals(Src[i]) then exit;
Result:=true;
end else
Result:=inherited Equals(Obj);
end;
procedure TExternalToolMenuItems.Assign(Src: TExternalToolMenuItems);
var
Item: TExternalToolMenuItem;
begin
if Equals(Src) then exit;
Clear;
for i:=0 to Src.Count-1 do begin
Item:=TExternalToolMenuItem.Create(nil);
Item.Assign(Src[i]);
Add(Item);
end;
end;
procedure TExternalToolMenuItems.Add(Item: TExternalToolMenuItem);
begin
fItems.Add(Item);
end;
procedure TExternalToolMenuItems.Insert(Index: integer;
Item: TExternalToolMenuItem);
begin
fItems.Insert(Index,Item);
end;
procedure TExternalToolMenuItems.Move(CurIndex, NewIndex: integer);
begin
fItems.Move(CurIndex,NewIndex);
end;
function TExternalToolMenuItems.Load(Config: TConfigStorage): TModalResult;
var
i: integer;
NewTool: TExternalToolOptions;
begin
Clear;
Count:=Config.GetValue('Count',0);
for i:=0 to Count-1 do begin
NewTool:=TExternalToolOptions.Create;
Items[i]:=NewTool;
Config.AppendBasePath('Tool'+IntToStr(i+1)+'/');
try
if NewTool.Load(Config)<>mrOk then exit;
finally
Config.UndoAppendBasePath;
end;
end;
Result:=mrOk;
end;
function TExternalToolMenuItems.Load(Config: TConfigStorage; const Path: string
): TModalResult;
begin
if Path<>'' then
Config.AppendBasePath(Path);
try
Result:=Load(Config);
finally
if Path<>'' then
Config.UndoAppendBasePath;
end;
end;
function TExternalToolMenuItems.Save(Config: TConfigStorage): TModalResult;
var
i: integer;
begin
Config.SetValue('Count',Count);
for i:=0 to Count-1 do begin
Config.AppendBasePath('Tool'+IntToStr(i+1)+'/');
try
if Items[i].Save(Config)<>mrOk then exit;
finally
Config.UndoAppendBasePath;
end;
end;
Result:=mrOk;
end;
function TExternalToolMenuItems.Save(Config: TConfigStorage; const Path: string
): TModalResult;
begin
if Path<>'' then
Config.AppendBasePath(Path);
try
Result:=Save(Config);
finally
if Path<>'' then
Config.UndoAppendBasePath;
end;
end;
procedure TExternalToolMenuItems.LoadShortCuts(
KeyCommandRelationList: TKeyCommandRelationList);
var
i: integer;
KeyCommandRelation: TKeyCommandRelation;
begin
for i:=0 to Count-1 do begin
KeyCommandRelation:=KeyCommandRelationList.FindByCommand(ecExtToolFirst+i);
if KeyCommandRelation<>nil then begin
Items[i].Key:=KeyCommandRelation.ShortcutA.Key1;
Items[i].Shift:=KeyCommandRelation.ShortcutA.Shift1;
end else begin
Items[i].Key:=VK_UNKNOWN;
Items[i].Shift:=[];
end;
end;
end;
procedure TExternalToolMenuItems.SaveShortCuts(
KeyCommandRelationList: TKeyCommandRelationList);
var
i: integer;
KeyCommandRelation: TKeyCommandRelation;
begin
KeyCommandRelationList.ExtToolCount:=Count;
for i:=0 to Count-1 do begin
KeyCommandRelation:=KeyCommandRelationList.FindByCommand(ecExtToolFirst+i);
if KeyCommandRelation<>nil then begin
KeyCommandRelation.ShortcutA:=IDEShortCut(Items[i].Key,Items[i].Shift,
VK_UNKNOWN,[]);
end else begin
DebugLn('[TExternalToolMenuItems.SaveShortCuts] Error: '
+'unable to save shortcut for external tool "',Items[i].Title,'"');
end;
end;
end;
{$ELSE EnableNewExtTools}
@ -1040,185 +783,6 @@ begin
EnableButtons;
end;
{$IFDEF EnableNewExtTools}
{ TExternalToolMenuItem }
// inline
procedure TExternalToolMenuItem.IncreaseChangeStamp;
begin
CTIncreaseChangeStamp(FChangeStamp);
end;
function TExternalToolMenuItem.GetModified: boolean;
begin
Result:=FChangeStamp=fSavedChangeStamp;
end;
procedure TExternalToolMenuItem.SetChangeStamp(AValue: integer);
begin
if FChangeStamp=AValue then Exit;
FChangeStamp:=AValue;
end;
procedure TExternalToolMenuItem.SetCmdLineParams(AValue: string);
begin
AValue:=UTF8Trim(AValue,[]);
if fCmdLineParams=AValue then Exit;
fCmdLineParams:=AValue;
IncreaseChangeStamp;
end;
procedure TExternalToolMenuItem.SetEnvironmentOverrides(AValue: TStringList);
begin
if (FEnvironmentOverrides=AValue) or FEnvironmentOverrides.Equals(AValue) then Exit;
FEnvironmentOverrides.Assign(AValue);
IncreaseChangeStamp;
end;
procedure TExternalToolMenuItem.SetFilename(AValue: string);
begin
AValue:=TrimFilename(AValue);
if fFilename=AValue then Exit;
fFilename:=AValue;
IncreaseChangeStamp;
end;
procedure TExternalToolMenuItem.SetHideMainForm(AValue: boolean);
begin
if FHideMainForm=AValue then Exit;
FHideMainForm:=AValue;
IncreaseChangeStamp;
end;
procedure TExternalToolMenuItem.SetModified(AValue: boolean);
begin
if AValue then
IncreaseChangeStamp
else
fSavedChangeStamp:=FChangeStamp;
end;
procedure TExternalToolMenuItem.SetScanners(AValue: TStrings);
begin
if (FScanners=AValue) or FScanners.Equals(AValue) then Exit;
FScanners.Assign(AValue);
IncreaseChangeStamp;
end;
procedure TExternalToolMenuItem.SetTitle(AValue: string);
begin
AValue:=UTF8Trim(AValue,[]);
if fTitle=AValue then Exit;
fTitle:=AValue;
IncreaseChangeStamp;
end;
procedure TExternalToolMenuItem.SetWorkingDirectory(AValue: string);
begin
AValue:=TrimFilename(AValue);
if fWorkingDirectory=AValue then Exit;
fWorkingDirectory:=AValue;
IncreaseChangeStamp;
end;
constructor TExternalToolMenuItem.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FEnvironmentOverrides:=TStringList.Create;
FScanners:=TStringList.Create;
fSavedChangeStamp:=CTInvalidChangeStamp;
Clear;
end;
destructor TExternalToolMenuItem.Destroy;
begin
FreeAndNil(FEnvironmentOverrides);
FreeAndNil(FScanners);
inherited Destroy;
end;
procedure TExternalToolMenuItem.Clear;
begin
CmdLineParams:='';
if FEnvironmentOverrides.Count>0 then
begin
IncreaseChangeStamp;
FEnvironmentOverrides.Clear;
end;
Filename:='';
HideMainForm:=true;
if FScanners.Count>0 then
begin
FScanners.Clear;
IncreaseChangeStamp;
end;
Title:='';
WorkingDirectory:='';
end;
function TExternalToolMenuItem.Equals(Obj: TObject): boolean;
var
Src: TExternalToolMenuItem;
begin
if Obj is TExternalToolMenuItem then begin
Src:=TExternalToolMenuItem(Obj);
Result:=(CmdLineParams=Src.CmdLineParams)
and EnvironmentOverrides.Equals(Src.EnvironmentOverrides)
and (Filename=Src.Filename)
and (HideMainForm=Src.HideMainForm)
and Scanners.Equals(Src.Scanners)
and (Title=Src.Title)
and (WorkingDirectory=Src.WorkingDirectory);
end else
Result:=inherited Equals(Obj);
end;
function TExternalToolMenuItem.Load(Config: TConfigStorage; CfgVersion: integer
): TModalResult;
begin
Clear;
fTitle:=Config.GetValue('Title/Value','');
fFilename:=Config.GetValue('Filename/Value','');
fCmdLineParams:=Config.GetValue('CmdLineParams/Value','');
fWorkingDirectory:=Config.GetValue('WorkingDirectory/Value','');
Config.GetValue('EnvironmentOverrides/',FEnvironmentOverrides);
Config.GetValue('Scanners/',FScanners);
HideMainForm:=Config.GetValue('HideMainForm/Value',true);
if CfgVersion<3 then
begin
if Config.GetValue('ScanOutputForFPCMessages/Value',false) then
AddScanner(SubToolFPC);
if Config.GetValue('ScanOutputForMakeMessages/Value',false) then
AddScanner(SubToolMake);
if Config.GetValue('ShowAllOutput/Value',false) then
AddScanner(SubToolDefault);
end;
Modified:=false;
Result:=mrOk;
end;
function TExternalToolMenuItem.Save(Config: TConfigStorage): TModalResult;
begin
Config.SetDeleteValue('Title/Value',Title,'');
Config.SetDeleteValue('Filename/Value',Filename,'');
Config.SetDeleteValue('CmdLineParams/Value',CmdLineParams,'');
Config.SetDeleteValue('WorkingDirectory/Value',WorkingDirectory,'');
Config.SetValue('EnvironmentOverrides/',FEnvironmentOverrides);
Config.SetValue('Scanners/',FScanners);
Config.SetDeleteValue('HideMainForm/Value',HideMainForm,true);
Modified:=false;
end;
procedure TExternalToolMenuItem.AddScanner(const Scanner: string);
begin
if IndexInStringList(FScanners,cstCaseInsensitive,Scanner)>=0 then exit;
FScanners.Add(Scanner);
IncreaseChangeStamp;
end;
{$ENDIF}
initialization
ExternalToolListClass:=TExternalToolList;

View File

@ -42,13 +42,103 @@ uses
{$IFDEF IDE_MEM_CHECK}
MemCheck,
{$ENDIF}
Classes, SysUtils, FileUtil,
LCLType, Controls, Forms, Buttons, StdCtrls,
Dialogs, ExtCtrls, LCLProc, ButtonPanel,
IDEMsgIntf, IDEExternToolIntf, IDEHelpIntf,
PropEdits, IDEDialogs, TransferMacros, LazarusIDEStrConsts,
EditMsgScannersDlg;
Classes, SysUtils, contnrs, FileUtil, LazConfigStorage, LazUTF8, LCLType,
Controls, Forms, Buttons, StdCtrls, Dialogs, ExtCtrls, LCLProc, ButtonPanel,
IDEMsgIntf, IDEExternToolIntf, IDEHelpIntf, PropEdits, IDEDialogs,
IDECommands, FileProcs, TransferMacros, LazarusIDEStrConsts, EnvironmentOpts,
KeyMapping, IDEProcs
{$IFDEF EnableNewExtTools}
{$ELSE}
,EditMsgScannersDlg
{$ENDIF}
;
{$IFDEF EnableNewExtTools}
const
ExternalToolOptionsVersion = 3;
// 3: changed ScanOutputForFPCMessages to scanner SubToolFPC
// changed ScanOutputForMakeMessages to scanner SubToolMake
type
{ TExternalToolMenuItem - the options of an external tool in the IDE menu Tools }
TExternalToolMenuItem = class(TComponent)
private
FChangeStamp: integer;
fCmdLineParams: string;
FEnvironmentOverrides: TStringList;
fFilename: string;
FHideMainForm: boolean;
FKey: word;
FScanners: TStrings;
FShift: TShiftState;
fTitle: string;
fWorkingDirectory: string;
fSavedChangeStamp: integer;
function GetHasScanner(aName: string): boolean;
function GetModified: boolean;
procedure SetChangeStamp(AValue: integer);
procedure SetCmdLineParams(AValue: string);
procedure SetEnvironmentOverrides(AValue: TStringList);
procedure SetFilename(AValue: string);
procedure SetHasScanner(aName: string; AValue: boolean);
procedure SetHideMainForm(AValue: boolean);
procedure SetModified(AValue: boolean);
procedure SetScanners(AValue: TStrings);
procedure SetTitle(AValue: string);
procedure SetWorkingDirectory(AValue: string);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Clear;
function Equals(Obj: TObject): boolean; override;
procedure Assign(Source: TPersistent); override;
function Load(Config: TConfigStorage; CfgVersion: integer): TModalResult; virtual;
function Save(Config: TConfigStorage): TModalResult; virtual;
property CmdLineParams: string read fCmdLineParams write SetCmdLineParams;
property Filename: string read fFilename write SetFilename;
property Title: string read fTitle write SetTitle;
property WorkingDirectory: string read fWorkingDirectory write SetWorkingDirectory;
property EnvironmentOverrides: TStringList read FEnvironmentOverrides write SetEnvironmentOverrides;
property HideMainForm: boolean read FHideMainForm write SetHideMainForm default true;
property Scanners: TStrings read FScanners write SetScanners;
property HasScanner[aName: string]: boolean read GetHasScanner write SetHasScanner;
property Modified: boolean read GetModified write SetModified;
property ChangeStamp: integer read FChangeStamp write SetChangeStamp;
procedure IncreaseChangeStamp; inline;
public
// these properties are saved in the keymappings, not in the config
property Key: word read FKey write FKey;
property Shift: TShiftState read FShift write FShift;
end;
{ TExternalToolMenuItems }
TExternalToolMenuItems = class(TBaseExternalToolMenuItems)
private
fItems: TObjectList; // list of TExternalToolMenuItem
function GetItems(Index: integer): TExternalToolMenuItem; inline;
public
constructor Create;
destructor Destroy; override;
procedure Clear; inline;
function Equals(Obj: TObject): boolean; override;
procedure Assign(Src: TExternalToolMenuItems);
procedure Add(Item: TExternalToolMenuItem);
procedure Insert(Index: integer; Item: TExternalToolMenuItem);
procedure Move(CurIndex, NewIndex: integer);
function Load(Config: TConfigStorage): TModalResult;
function Load(Config: TConfigStorage; const Path: string): TModalResult;
override;
function Save(Config: TConfigStorage): TModalResult;
function Save(Config: TConfigStorage; const Path: string): TModalResult;
override;
procedure LoadShortCuts(KeyCommandRelationList: TKeyCommandRelationList);
procedure SaveShortCuts(KeyCommandRelationList: TKeyCommandRelationList);
function Count: integer; inline;
property Items[Index: integer]: TExternalToolMenuItem read GetItems; default;
end;
{$ELSE}
type
{ TExternalToolOptions }
@ -63,8 +153,10 @@ type
property Key: word read fKey write fKey;
property Shift: TShiftState read fShift write fShift;
end;
{$ENDIF}
{ TExternalToolOptionDlg - the editor dialog for a single external tool}
type
{ TExternalToolOptionDlg - the editor dialog for a single external tool }
TExternalToolOptionDlg = class(TForm)
ButtonPanel: TButtonPanel;
@ -97,7 +189,7 @@ type
procedure OpenButtonClick({%H-}sender : TOBject);
procedure ScannersButtonClick(Sender: TObject);
private
fOptions: TExternalToolOptions;
fOptions: {$IFDEF EnableNewExtTools}TExternalToolMenuItem{$ELSE}TExternalToolOptions{$ENDIF};
fTransferMacros: TTransferMacroList;
fScanners: TStrings;
fKeyBox: TShortCutGrabBox;
@ -107,24 +199,24 @@ type
procedure UpdateButtons;
function ScannersToString(List: TStrings): string;
procedure SetComboBox(AComboBox: TComboBox; const AValue: string);
procedure SetOptions(TheOptions: TExternalToolOptions);
procedure SetOptions(TheOptions: {$IFDEF EnableNewExtTools}TExternalToolMenuItem{$ELSE}TExternalToolOptions{$ENDIF});
procedure SetTransferMacros(TransferMacroList: TTransferMacroList);
public
property Options: TExternalToolOptions read fOptions write SetOptions;
property Options: {$IFDEF EnableNewExtTools}TExternalToolMenuItem{$ELSE}TExternalToolOptions{$ENDIF} read fOptions write SetOptions;
property MacroList: TTransferMacroList
read fTransferMacros write SetTransferMacros;
end;
function ShowExtToolOptionDlg(TransferMacroList: TTransferMacroList;
ExternalToolOptions: TExternalToolOptions):TModalResult;
ExternalToolOptions: {$IFDEF EnableNewExtTools}TExternalToolMenuItem{$ELSE}TExternalToolOptions{$ENDIF}):TModalResult;
implementation
{$R *.lfm}
function ShowExtToolOptionDlg(TransferMacroList: TTransferMacroList;
ExternalToolOptions: TExternalToolOptions):TModalResult;
ExternalToolOptions: {$IFDEF EnableNewExtTools}TExternalToolMenuItem{$ELSE}TExternalToolOptions{$ENDIF}):TModalResult;
var ExternalToolOptionDlg: TExternalToolOptionDlg;
begin
Result:=mrCancel;
@ -140,6 +232,401 @@ begin
end;
end;
{$IFDEF EnableNewExtTools}
{ TExternalToolMenuItem }
// inline
procedure TExternalToolMenuItem.IncreaseChangeStamp;
begin
CTIncreaseChangeStamp(FChangeStamp);
end;
function TExternalToolMenuItem.GetModified: boolean;
begin
Result:=FChangeStamp=fSavedChangeStamp;
end;
function TExternalToolMenuItem.GetHasScanner(aName: string): boolean;
begin
Result:=IndexInStringList(FScanners,cstCaseInsensitive,aName)>=0;
end;
procedure TExternalToolMenuItem.SetChangeStamp(AValue: integer);
begin
if FChangeStamp=AValue then Exit;
FChangeStamp:=AValue;
end;
procedure TExternalToolMenuItem.SetCmdLineParams(AValue: string);
begin
AValue:=UTF8Trim(AValue,[]);
if fCmdLineParams=AValue then Exit;
fCmdLineParams:=AValue;
IncreaseChangeStamp;
end;
procedure TExternalToolMenuItem.SetEnvironmentOverrides(AValue: TStringList);
begin
if (FEnvironmentOverrides=AValue) or FEnvironmentOverrides.Equals(AValue) then Exit;
FEnvironmentOverrides.Assign(AValue);
IncreaseChangeStamp;
end;
procedure TExternalToolMenuItem.SetFilename(AValue: string);
begin
AValue:=TrimFilename(AValue);
if fFilename=AValue then Exit;
fFilename:=AValue;
IncreaseChangeStamp;
end;
procedure TExternalToolMenuItem.SetHasScanner(aName: string; AValue: boolean);
var
i: Integer;
begin
i:=IndexInStringList(FScanners,cstCaseInsensitive,aName);
if i>=0 then begin
if AValue then exit;
FScanners.Add(aName);
end else begin
if not AValue then exit;
FScanners.Delete(i);
end;
IncreaseChangeStamp;
end;
procedure TExternalToolMenuItem.SetHideMainForm(AValue: boolean);
begin
if FHideMainForm=AValue then Exit;
FHideMainForm:=AValue;
IncreaseChangeStamp;
end;
procedure TExternalToolMenuItem.SetModified(AValue: boolean);
begin
if AValue then
IncreaseChangeStamp
else
fSavedChangeStamp:=FChangeStamp;
end;
procedure TExternalToolMenuItem.SetScanners(AValue: TStrings);
begin
if (FScanners=AValue) or FScanners.Equals(AValue) then Exit;
FScanners.Assign(AValue);
IncreaseChangeStamp;
end;
procedure TExternalToolMenuItem.SetTitle(AValue: string);
begin
AValue:=UTF8Trim(AValue,[]);
if fTitle=AValue then Exit;
fTitle:=AValue;
IncreaseChangeStamp;
end;
procedure TExternalToolMenuItem.SetWorkingDirectory(AValue: string);
begin
AValue:=TrimFilename(AValue);
if fWorkingDirectory=AValue then Exit;
fWorkingDirectory:=AValue;
IncreaseChangeStamp;
end;
constructor TExternalToolMenuItem.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FEnvironmentOverrides:=TStringList.Create;
FScanners:=TStringList.Create;
fSavedChangeStamp:=CTInvalidChangeStamp;
Clear;
end;
destructor TExternalToolMenuItem.Destroy;
begin
FreeAndNil(FEnvironmentOverrides);
FreeAndNil(FScanners);
inherited Destroy;
end;
procedure TExternalToolMenuItem.Clear;
begin
CmdLineParams:='';
if FEnvironmentOverrides.Count>0 then
begin
IncreaseChangeStamp;
FEnvironmentOverrides.Clear;
end;
Filename:='';
HideMainForm:=true;
if FScanners.Count>0 then
begin
FScanners.Clear;
IncreaseChangeStamp;
end;
Title:='';
WorkingDirectory:='';
end;
function TExternalToolMenuItem.Equals(Obj: TObject): boolean;
var
Src: TExternalToolMenuItem;
begin
if Obj is TExternalToolMenuItem then begin
Src:=TExternalToolMenuItem(Obj);
Result:=(CmdLineParams=Src.CmdLineParams)
and EnvironmentOverrides.Equals(Src.EnvironmentOverrides)
and (Filename=Src.Filename)
and (HideMainForm=Src.HideMainForm)
and Scanners.Equals(Src.Scanners)
and (Title=Src.Title)
and (WorkingDirectory=Src.WorkingDirectory)
and (Key=Src.Key)
and (Shift=Src.Shift);
end else
Result:=inherited;
end;
procedure TExternalToolMenuItem.Assign(Source: TPersistent);
var
Src: TExternalToolMenuItem;
begin
if Equals(Source) then exit;
if Source is TExternalToolMenuItem then begin
Src:=TExternalToolMenuItem(Source);
CmdLineParams:=Src.CmdLineParams;
EnvironmentOverrides:=Src.EnvironmentOverrides;
Filename:=Src.Filename;
HideMainForm:=Src.HideMainForm;
Scanners:=Src.Scanners;
Title:=Src.Title;
Key:=Src.Key;
Shift:=Src.Shift;
end else
inherited;
end;
function TExternalToolMenuItem.Load(Config: TConfigStorage; CfgVersion: integer
): TModalResult;
begin
Clear;
fTitle:=Config.GetValue('Title/Value','');
fFilename:=Config.GetValue('Filename/Value','');
fCmdLineParams:=Config.GetValue('CmdLineParams/Value','');
fWorkingDirectory:=Config.GetValue('WorkingDirectory/Value','');
Config.GetValue('EnvironmentOverrides/',FEnvironmentOverrides);
HideMainForm:=Config.GetValue('HideMainForm/Value',true);
if CfgVersion<3 then
begin
if Config.GetValue('ScanOutputForFPCMessages/Value',false) then
FScanners.Add(SubToolFPC);
if Config.GetValue('ScanOutputForMakeMessages/Value',false) then
FScanners.Add(SubToolMake);
if Config.GetValue('ShowAllOutput/Value',false) then
FScanners.Add(SubToolDefault);
end else
Config.GetValue('Scanners/',FScanners);
Modified:=false;
Result:=mrOk;
end;
function TExternalToolMenuItem.Save(Config: TConfigStorage): TModalResult;
begin
Config.SetDeleteValue('Title/Value',Title,'');
Config.SetDeleteValue('Filename/Value',Filename,'');
Config.SetDeleteValue('CmdLineParams/Value',CmdLineParams,'');
Config.SetDeleteValue('WorkingDirectory/Value',WorkingDirectory,'');
Config.SetValue('EnvironmentOverrides/',FEnvironmentOverrides);
Config.SetValue('Scanners/',FScanners);
Config.SetDeleteValue('HideMainForm/Value',HideMainForm,true);
Modified:=false;
end;
{ TExternalToolMenuItems }
// inline
function TExternalToolMenuItems.Count: integer;
begin
Result:=fItems.Count;
end;
// inline
function TExternalToolMenuItems.GetItems(Index: integer): TExternalToolMenuItem;
begin
Result:=TExternalToolMenuItem(fItems[Index]);
end;
// inline
procedure TExternalToolMenuItems.Clear;
begin
fItems.Clear;
end;
constructor TExternalToolMenuItems.Create;
begin
fItems:=TObjectList.Create(true);
end;
destructor TExternalToolMenuItems.Destroy;
begin
Clear;
FreeAndNil(fItems);
inherited Destroy;
end;
function TExternalToolMenuItems.Equals(Obj: TObject): boolean;
var
Src: TExternalToolMenuItems;
i: Integer;
begin
if Obj=Self then exit;
if Obj is TExternalToolMenuItems then begin
Src:=TExternalToolMenuItems(Obj);
Result:=false;
if Count<>Src.Count then exit;
for i:=0 to Count-1 do
if not Items[i].Equals(Src[i]) then exit;
Result:=true;
end else
Result:=inherited Equals(Obj);
end;
procedure TExternalToolMenuItems.Assign(Src: TExternalToolMenuItems);
var
Item: TExternalToolMenuItem;
i: Integer;
begin
if Equals(Src) then exit;
Clear;
for i:=0 to Src.Count-1 do begin
Item:=TExternalToolMenuItem.Create(nil);
Item.Assign(Src[i]);
Add(Item);
end;
end;
procedure TExternalToolMenuItems.Add(Item: TExternalToolMenuItem);
begin
fItems.Add(Item);
end;
procedure TExternalToolMenuItems.Insert(Index: integer;
Item: TExternalToolMenuItem);
begin
fItems.Insert(Index,Item);
end;
procedure TExternalToolMenuItems.Move(CurIndex, NewIndex: integer);
begin
fItems.Move(CurIndex,NewIndex);
end;
function TExternalToolMenuItems.Load(Config: TConfigStorage): TModalResult;
var
i: integer;
NewTool: TExternalToolMenuItem;
NewCount: Integer;
CfgVersion: Integer;
begin
Clear;
NewCount:=Config.GetValue('Count',0);
CfgVersion:=Config.GetValue('Version',0);
for i:=1 to NewCount do begin
NewTool:=TExternalToolMenuItem.Create(nil);
fItems.Add(NewTool);
Config.AppendBasePath('Tool'+IntToStr(i)+'/');
try
if NewTool.Load(Config,CfgVersion)<>mrOk then exit;
finally
Config.UndoAppendBasePath;
end;
end;
Result:=mrOk;
end;
function TExternalToolMenuItems.Load(Config: TConfigStorage; const Path: string
): TModalResult;
begin
if Path<>'' then
Config.AppendBasePath(Path);
try
Result:=Load(Config);
finally
if Path<>'' then
Config.UndoAppendBasePath;
end;
end;
function TExternalToolMenuItems.Save(Config: TConfigStorage): TModalResult;
var
i: integer;
begin
Config.SetValue('Version',ExternalToolOptionsVersion);
Config.SetValue('Count',Count);
for i:=1 to Count do begin
Config.AppendBasePath('Tool'+IntToStr(i)+'/');
try
if Items[i-1].Save(Config)<>mrOk then exit;
finally
Config.UndoAppendBasePath;
end;
end;
Result:=mrOk;
end;
function TExternalToolMenuItems.Save(Config: TConfigStorage; const Path: string
): TModalResult;
begin
if Path<>'' then
Config.AppendBasePath(Path);
try
Result:=Save(Config);
finally
if Path<>'' then
Config.UndoAppendBasePath;
end;
end;
procedure TExternalToolMenuItems.LoadShortCuts(
KeyCommandRelationList: TKeyCommandRelationList);
var
i: integer;
KeyCommandRelation: TKeyCommandRelation;
begin
for i:=0 to Count-1 do begin
KeyCommandRelation:=KeyCommandRelationList.FindByCommand(ecExtToolFirst+i);
if KeyCommandRelation<>nil then begin
Items[i].Key:=KeyCommandRelation.ShortcutA.Key1;
Items[i].Shift:=KeyCommandRelation.ShortcutA.Shift1;
end else begin
Items[i].Key:=VK_UNKNOWN;
Items[i].Shift:=[];
end;
end;
end;
procedure TExternalToolMenuItems.SaveShortCuts(
KeyCommandRelationList: TKeyCommandRelationList);
var
i: integer;
KeyCommandRelation: TKeyCommandRelation;
begin
KeyCommandRelationList.ExtToolCount:=Count;
for i:=0 to Count-1 do begin
KeyCommandRelation:=KeyCommandRelationList.FindByCommand(ecExtToolFirst+i);
if KeyCommandRelation<>nil then begin
KeyCommandRelation.ShortcutA:=IDEShortCut(Items[i].Key,Items[i].Shift,
VK_UNKNOWN,[]);
end else begin
DebugLn('[TExternalToolMenuItems.SaveShortCuts] Error: '
+'unable to save shortcut for external tool "',Items[i].Title,'"');
end;
end;
end;
{$ENDIF}
{ TExternalToolOptionDlg }
procedure TExternalToolOptionDlg.OpenButtonClick(sender : TOBject);
@ -150,10 +637,13 @@ End;
procedure TExternalToolOptionDlg.ScannersButtonClick(Sender: TObject);
begin
{$IFDEF EnableNewExtTools}
{$ELSE}
if ShowEditMsgScannersDialog('Edit tool '+copy(TitleEdit.Text,1,20),
fScanners)=mrOk
then
UpdateButtons;
{$ENDIF}
end;
procedure TExternalToolOptionDlg.SaveToOptions;
@ -164,20 +654,28 @@ begin
fOptions.WorkingDirectory:=WorkingDirEdit.Text;
fOptions.Key:=fKeyBox.Key;
fOptions.Shift:=fKeyBox.ShiftState;
FOptions.HideMainForm := chkHideMainForm.Checked;
{$IFDEF EnableNewExtTools}
{$ELSE}
fOptions.ScanOutputForFPCMessages:=OptionScanOutputForFPCMessagesCheckBox.Checked;
fOptions.ScanOutputForMakeMessages:=OptionScanOutputForMakeMessagesCheckBox.Checked;
FOptions.HideMainForm := chkHideMainForm.Checked;
fOptions.Scanners:=fScanners;
{$ENDIF}
end;
procedure TExternalToolOptionDlg.UpdateButtons;
begin
{$IFDEF EnableNewExtTools}
ScannersButton.Visible:=false;
{$ELSE}
if IDEMsgScanners.Count>0 then begin
ScannersButton.Visible:=true;
ScannersButton.Caption:=Format(lisetEditCustomScanners, [ScannersToString(fScanners)]);
end else begin
ScannersButton.Visible:=false;
end;
{$ENDIF}
end;
function TExternalToolOptionDlg.ScannersToString(List: TStrings): string;
@ -208,8 +706,13 @@ begin
WorkingDirEdit.Text:=fOptions.WorkingDirectory;
fKeyBox.Key:=fOptions.Key;
fKeyBox.ShiftState:=fOptions.Shift;
{$IFDEF EnableNewExtTools}
OptionScanOutputForFPCMessagesCheckBox.Checked:=fOptions.HasScanner[SubToolFPC];
OptionScanOutputForMakeMessagesCheckBox.Checked:=fOptions.HasScanner[SubToolMake];
{$ELSE}
OptionScanOutputForFPCMessagesCheckBox.Checked:=fOptions.ScanOutputForFPCMessages;
OptionScanOutputForMakeMessagesCheckBox.Checked:=fOptions.ScanOutputForMakeMessages;
{$ENDIF}
chkHideMainForm.Checked:=FOptions.HideMainForm;
fScanners.Assign(fOptions.Scanners);
UpdateButtons;
@ -276,7 +779,7 @@ begin
LazarusHelp.ShowHelpForIDEControl(Self);
end;
procedure TExternalToolOptionDlg.SetOptions(TheOptions: TExternalToolOptions);
procedure TExternalToolOptionDlg.SetOptions(TheOptions: {$IFDEF EnableNewExtTools}TExternalToolMenuItem{$ELSE}TExternalToolOptions{$ENDIF});
begin
if fOptions=TheOptions then exit;
fOptions.Assign(TheOptions);

View File

@ -3335,13 +3335,14 @@ var
PkgCompileTool: TAbstractExternalTool;
{$ELSE}
PkgCompileTool: TIDEExternalToolOptions;
BlockBegan: Boolean;
CompileResult: TModalResult;
{$ENDIF}
CompilerFilename: String;
EffectiveCompilerParams: String;
CompilePolicy: TPackageUpdatePolicy;
BlockBegan: Boolean;
NeedBuildAllFlag: Boolean;
CompileResult, MsgResult: TModalResult;
MsgResult: TModalResult;
SrcPPUFile: String;
SrcPPUFileExists: Boolean;
CompilerParams: String;
@ -3390,9 +3391,12 @@ begin
end;
end;
{$IFDEF EnableNewExtTools}
{$ELSE}
BlockBegan:=IDEMessagesWindow<>nil;
if BlockBegan then
IDEMessagesWindow.BeginBlock;
{$ENDIF}
try
if (LazarusIDE<>nil) then
LazarusIDE.MainBarSubTitle:=APackage.Name;
@ -3479,6 +3483,30 @@ begin
EffectiveCompilerParams:='-B';
end;
{$IFDEF EnableNewExtTools}
PkgCompileTool:=ExternalToolList.Add(Format(lisPkgMangCompilingPackage, [APackage.IDAsString]));
PkgCompileTool.AddParsers(SubToolFPC);
PkgCompileTool.AddParsers(SubToolMake);
PkgCompileTool.Process.CurrentDirectory:=APackage.Directory;
PkgCompileTool.Process.Executable:=CompilerFilename;
PkgCompileTool.CmdLineParams:=EffectiveCompilerParams;
PkgCompileTool.Execute;
PkgCompileTool.WaitForExit;
// check if main ppu file was created
SrcPPUFile:=APackage.GetSrcPPUFilename;
SrcPPUFileExists:=(SrcPPUFile<>'') and FileExistsUTF8(SrcPPUFile);
// write state file
Result:=SavePackageCompiledState(APackage,
CompilerFilename,CompilerParams,
PkgCompileTool.ErrorMessage='',SrcPPUFileExists,true);
if Result<>mrOk then begin
DebugLn(['TLazPackageGraph.CompilePackage SavePackageCompiledState failed: ',APackage.IDAsString]);
exit;
end;
if PkgCompileTool.ErrorMessage<>'' then
exit(mrCancel);
{$ELSE}
PkgCompileTool:=TIDEExternalToolOptions.Create;
try
PkgCompileTool.Title:=Format(lisPkgMangCompilingPackage, [APackage.IDAsString]);
@ -3511,16 +3539,22 @@ begin
// clean up
PkgCompileTool.Free;
end;
{$ENDIF}
end;
// update .po files
if (APackage.POOutputDirectory<>'') then begin
Result:=ConvertPackageRSTFiles(APackage);
if Result<>mrOk then begin
DebugLn('TLazPackageGraph.CompilePackage ConvertPackageRSTFiles failed: ',APackage.IDAsString);
{$IFDEF EnableNewExtTools}
IDEMessagesWindow.AddCustomMessage(mluError,
'Updating po files failed for package '+APackage.IDAsString);
{$ELSE}
IDEMessagesWindow.AddMsg(Format(
lisPkgMangErrorUpdatingPoFilesFailedForPackage, [APackage.IDAsString
]), APackage.Directory, -1);
DebugLn('TLazPackageGraph.CompilePackage ConvertPackageRSTFiles failed: ',APackage.IDAsString);
{$ENDIF}
exit;
end;
end;
@ -3530,10 +3564,14 @@ begin
Result:=APackage.CompilerOptions.ExecuteAfter.Execute(
APackage.Directory,'Executing command after');
if Result<>mrOk then begin
DebugLn(['TLazPackageGraph.CompilePackage ExecuteAfter failed: ',APackage.IDAsString]);
{$IFDEF EnableNewExtTools}
// messages window already contains error message
{$ELSE}
IDEMessagesWindow.AddMsg(Format(
lisIDEInfoErrorRunningCompileAfterToolFailedForPackage, [APackage.
IDAsString]), APackage.Directory, -1);
DebugLn(['TLazPackageGraph.CompilePackage ExecuteAfter failed: ',APackage.IDAsString]);
{$ENDIF}
exit;
end;
end;
@ -3541,8 +3579,10 @@ begin
finally
if (LazarusIDE<>nil) then
LazarusIDE.MainBarSubTitle:='';
{$IFNDEF EnableNewExtTools}
if BlockBegan and (IDEMessagesWindow<>nil) then
IDEMessagesWindow.EndBlock;
{$ENDIF}
if Result<>mrOk then begin
if (APackage.AutoInstall<>pitNope)
and (OnUninstallPackage<>nil)
@ -3711,7 +3751,11 @@ var
MakefileFPCFilename: String;
UnitOutputPath: String;
UnitPath: String;
{$IFDEF EnableNewExtTools}
FPCMakeTool: TAbstractExternalTool;
{$ELSE}
FPCMakeTool: TIDEExternalToolOptions;
{$ENDIF}
CodeBuffer: TCodeBuffer;
MainSrcFile: String;
CustomOptions: String;
@ -3720,6 +3764,7 @@ var
OtherOptions: String;
FormUnitPath: String;
FormIncPath: String;
Executable: String;
begin
Result:=mrCancel;
PathDelimNeedsReplace:=PathDelim<>'/';
@ -3878,14 +3923,29 @@ begin
exit;
end;
Executable:=FindFPCTool('fpcmake'+GetExecutableExt,
EnvironmentOptions.GetParsedCompilerFilename);
if not FileIsExecutableCached(Executable) then
Executable:='fpcmake'+GetExecutableExt;
// call fpcmake to create the Makefile
{$IFDEF EnableNewExtTools}
FPCMakeTool:=ExternalToolList.Add(
Format(lisIDEInfoCreatingMakefileForPackage, [APackage.IDAsString]));
FPCMakeTool.Process.CurrentDirectory:=APackage.Directory;
FPCMakeTool.Process.Executable:=Executable;
FPCMakeTool.CmdLineParams:='-q -TAll';
FPCMakeTool.EnvironmentOverrides.Add(
'FPCDIR='+EnvironmentOptions.GetParsedFPCSourceDirectory);
FPCMakeTool.Execute;
FPCMakeTool.WaitForExit;
{$ELSE}
FPCMakeTool:=TIDEExternalToolOptions.Create;
try
FPCMakeTool.Title:=Format(lisIDEInfoCreatingMakefileForPackage, [APackage.
IDAsString]);
FPCMakeTool.WorkingDirectory:=APackage.Directory;
FPCMakeTool.Filename:=FindFPCTool('fpcmake'+GetExecutableExt,
EnvironmentOptions.GetParsedCompilerFilename);
FPCMakeTool.Filename:=Executable;
FPCMakeTool.CmdLineParams:='-q -TAll';
FPCMakeTool.EnvironmentOverrides.Add(
'FPCDIR='+EnvironmentOptions.GetParsedFPCSourceDirectory);
@ -3907,6 +3967,7 @@ begin
// clean up
FPCMakeTool.Free;
end;
{$ENDIF}
Result:=mrOk;
end;
@ -4430,9 +4491,13 @@ begin
end;
if (CurUnitName='') or (not IsValidUnitName(CurUnitName)) then begin
{$IFDEF EnableNewExtTools}
AddMessage(mluError,Format('invalid unit name in package %s',[APackage.IDAsString]),CurFile.Filename);
{$ELSE}
AddMessage(Format(lisIDEInfoWARNINGUnitNameInvalidPackage, [CurFile.
Filename, APackage.IDAsString]),
APackage.Directory);
{$ENDIF}
continue;
end;