mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-29 06:24:02 +02:00
290 lines
9.1 KiB
ObjectPascal
290 lines
9.1 KiB
ObjectPascal
{ Copyright (C) 2006
|
|
|
|
*****************************************************************************
|
|
* *
|
|
* See the file COPYING.modifiedLGPL.txt, included in this distribution, *
|
|
* for details about the copyright. *
|
|
* *
|
|
* This program is distributed in the hope that it will be useful, *
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
|
|
* *
|
|
*****************************************************************************
|
|
|
|
Author: Mattias Gaertner
|
|
}
|
|
unit IDEExternToolIntf;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, LCLType, LazConfigStorage, Forms, Controls, BaseIDEIntf;
|
|
|
|
{ The xml format version:
|
|
When the format changes (new values, changed formats) we can distinguish old
|
|
files and are able to convert them.
|
|
}
|
|
const
|
|
ExternalToolOptionsVersion = '2';
|
|
|
|
type
|
|
TIDEExternalToolOptions = class;
|
|
|
|
{ TIDEScanMessageLine }
|
|
|
|
TIDEScanMessageLine = class(TPersistent)
|
|
private
|
|
FCaller: TObject;
|
|
FLine: string;
|
|
FLineNumber: integer;
|
|
FTool: TIDEExternalToolOptions;
|
|
FWorkingDirectory: string;
|
|
procedure SetLine(const AValue: string);
|
|
procedure SetWorkingDirectory(const AValue: string);
|
|
protected
|
|
procedure SetTool(const AValue: TIDEExternalToolOptions);
|
|
procedure SetLineNumber(const NewLineNumber: integer);
|
|
procedure LineChanged(const OldValue: string); virtual; abstract;
|
|
procedure WorkingDirectoryChanged(const OldValue: string); virtual; abstract;
|
|
public
|
|
constructor Create(TheCaller: TObject = nil; TheTool: TIDEExternalToolOptions = nil);
|
|
property Caller: TObject read FCaller;
|
|
property Line: string read FLine write SetLine;
|
|
property WorkingDirectory: string read FWorkingDirectory write SetWorkingDirectory;
|
|
property LineNumber: integer read FLineNumber;
|
|
property Tool: TIDEExternalToolOptions read FTool;
|
|
end;
|
|
|
|
|
|
TOnIDEExtToolParseLine = procedure(Sender: TObject;
|
|
Line: TIDEScanMessageLine) of object;
|
|
|
|
{
|
|
TIDEExternalToolOptions - the storage object for a single external tool
|
|
}
|
|
TIDEExternalToolOptions = class(TPersistent)
|
|
private
|
|
fCmdLineParams: string;
|
|
FEnvironmentOverrides: TStringList;
|
|
fFilename: string;
|
|
FOnParseLine: TOnIDEExtToolParseLine;
|
|
FScanners: TStrings;
|
|
FScanOutput: boolean;
|
|
fScanOutputForFPCMessages: boolean;
|
|
fScanOutputForMakeMessages: boolean;
|
|
FShowAllOutput: boolean;
|
|
fTitle: string;
|
|
fWorkingDirectory: string;
|
|
procedure SetScanners(const AValue: TStrings);
|
|
procedure SetScanOutput(const AValue: boolean);
|
|
procedure SetShowAllOutput(const AValue: boolean);
|
|
public
|
|
constructor Create;
|
|
destructor Destroy; override;
|
|
procedure Assign(Source: TPersistent); override;
|
|
procedure Clear; virtual;
|
|
function NeedsOutputFilter: boolean;
|
|
function Load(Config: TConfigStorage): TModalResult; virtual;
|
|
function Save(Config: TConfigStorage): TModalResult; virtual;
|
|
function ShortDescription: string;
|
|
procedure AssignEnvironmentTo(Strings: TStrings);
|
|
procedure ParseLine(Sender: TObject; Line: TIDEScanMessageLine); virtual;
|
|
|
|
property CmdLineParams: string read fCmdLineParams write fCmdLineParams;
|
|
property Filename: string read fFilename write fFilename;
|
|
property Title: string read fTitle write fTitle;
|
|
property WorkingDirectory: string
|
|
read fWorkingDirectory write fWorkingDirectory;
|
|
property EnvironmentOverrides: TStringList read FEnvironmentOverrides;
|
|
property ScanOutputForFPCMessages: boolean
|
|
read fScanOutputForFPCMessages write fScanOutputForFPCMessages;
|
|
property ScanOutputForMakeMessages: boolean
|
|
read fScanOutputForMakeMessages write fScanOutputForMakeMessages;
|
|
property ScanOutput: boolean read FScanOutput write SetScanOutput;
|
|
property ShowAllOutput: boolean read FShowAllOutput write SetShowAllOutput;
|
|
property OnParseLine: TOnIDEExtToolParseLine read FOnParseLine write FOnParseLine;
|
|
property Scanners: TStrings read FScanners write SetScanners;
|
|
end;
|
|
|
|
type
|
|
TRunExternalTool = function (Tool: TIDEExternalToolOptions): TModalResult of object;
|
|
|
|
var
|
|
RunExternalTool: TRunExternalTool = nil;// set by the IDE
|
|
|
|
implementation
|
|
|
|
{ TIDEExternalToolOptions }
|
|
|
|
procedure TIDEExternalToolOptions.SetScanOutput(const AValue: boolean);
|
|
begin
|
|
if FScanOutput=AValue then exit;
|
|
FScanOutput:=AValue;
|
|
end;
|
|
|
|
procedure TIDEExternalToolOptions.SetScanners(const AValue: TStrings);
|
|
begin
|
|
if FScanners=AValue then exit;
|
|
FScanners.Assign(AValue);
|
|
end;
|
|
|
|
procedure TIDEExternalToolOptions.SetShowAllOutput(const AValue: boolean);
|
|
begin
|
|
if FShowAllOutput=AValue then exit;
|
|
FShowAllOutput:=AValue;
|
|
end;
|
|
|
|
procedure TIDEExternalToolOptions.Assign(Source: TPersistent);
|
|
var
|
|
Src: TIDEExternalToolOptions;
|
|
begin
|
|
if Source=Self then exit;
|
|
if Source is TIDEExternalToolOptions then begin
|
|
Src:=TIDEExternalToolOptions(Source);
|
|
fTitle:=Src.fTitle;
|
|
fFilename:=Src.fFilename;
|
|
fCmdLineParams:=Src.fCmdLineParams;
|
|
fWorkingDirectory:=Src.fWorkingDirectory;
|
|
fScanOutputForFPCMessages:=Src.fScanOutputForFPCMessages;
|
|
fScanOutputForMakeMessages:=Src.fScanOutputForMakeMessages;
|
|
FScanOutput:=Src.FScanOutput;
|
|
FShowAllOutput:=Src.FShowAllOutput;
|
|
FScanners.Assign(Src.FScanners);
|
|
end else
|
|
inherited Assign(Source);
|
|
end;
|
|
|
|
constructor TIDEExternalToolOptions.Create;
|
|
begin
|
|
inherited Create;
|
|
FEnvironmentOverrides:=TStringList.Create;
|
|
FScanners:=TStringList.Create;
|
|
Clear;
|
|
end;
|
|
|
|
destructor TIDEExternalToolOptions.Destroy;
|
|
begin
|
|
FreeAndNil(FEnvironmentOverrides);
|
|
FreeAndNil(FScanners);
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TIDEExternalToolOptions.Clear;
|
|
begin
|
|
fTitle:='';
|
|
fFilename:='';
|
|
fCmdLineParams:='';
|
|
fWorkingDirectory:='';
|
|
fScanOutputForFPCMessages:=false;
|
|
fScanOutputForMakeMessages:=false;
|
|
FScanOutput:=false;
|
|
FShowAllOutput:=false;
|
|
FEnvironmentOverrides.Clear;
|
|
FScanners.Clear;
|
|
end;
|
|
|
|
function TIDEExternalToolOptions.Load(Config: TConfigStorage): TModalResult;
|
|
begin
|
|
Clear;
|
|
fTitle:=Config.GetValue('Title/Value','');
|
|
fFilename:=Config.GetValue('Filename/Value','');
|
|
fCmdLineParams:=Config.GetValue('CmdLineParams/Value','');
|
|
fWorkingDirectory:=Config.GetValue('WorkingDirectory/Value','');
|
|
fScanOutputForFPCMessages:=Config.GetValue(
|
|
'ScanOutputForFPCMessages/Value',false);
|
|
fScanOutputForMakeMessages:=Config.GetValue(
|
|
'ScanOutputForMakeMessages/Value',false);
|
|
FShowAllOutput:=Config.GetValue('ShowAllOutput/Value',false);
|
|
Config.GetValue('EnvironmentOverrides/',FEnvironmentOverrides);
|
|
Config.GetValue('Scanners/',FScanners);
|
|
Result:=mrOk;
|
|
end;
|
|
|
|
function TIDEExternalToolOptions.Save(Config: TConfigStorage): TModalResult;
|
|
begin
|
|
Config.SetValue('Format/Version',ExternalToolOptionsVersion);
|
|
Config.SetDeleteValue('Title/Value',fTitle,'');
|
|
Config.SetDeleteValue('Filename/Value',fFilename,'');
|
|
Config.SetDeleteValue('CmdLineParams/Value',fCmdLineParams,'');
|
|
Config.SetDeleteValue('WorkingDirectory/Value',fWorkingDirectory,'');
|
|
Config.SetDeleteValue(
|
|
'ScanOutputForFPCMessages/Value',fScanOutputForFPCMessages,
|
|
false);
|
|
Config.SetDeleteValue(
|
|
'ScanOutputForMakeMessages/Value',fScanOutputForMakeMessages,
|
|
false);
|
|
Config.SetDeleteValue('ShowAllOutput/Value',FShowAllOutput,false);
|
|
Config.SetValue('EnvironmentOverrides/',FEnvironmentOverrides);
|
|
Config.SetValue('Scanners/',FScanners);
|
|
Result:=mrOk;
|
|
end;
|
|
|
|
function TIDEExternalToolOptions.ShortDescription: string;
|
|
begin
|
|
Result:=Title;
|
|
end;
|
|
|
|
procedure TIDEExternalToolOptions.AssignEnvironmentTo(Strings: TStrings);
|
|
begin
|
|
BaseIDEIntf.AssignEnvironmentTo(Strings,EnvironmentOverrides);
|
|
end;
|
|
|
|
procedure TIDEExternalToolOptions.ParseLine(Sender: TObject;
|
|
Line: TIDEScanMessageLine);
|
|
begin
|
|
if Assigned(OnParseLine) then
|
|
OnParseLine(Sender,Line);
|
|
end;
|
|
|
|
function TIDEExternalToolOptions.NeedsOutputFilter: boolean;
|
|
begin
|
|
Result:=ScanOutput
|
|
or ScanOutputForFPCMessages or ScanOutputForMakeMessages
|
|
or ShowAllOutput
|
|
or ((FScanners<>nil) and (FScanners.Count>0));
|
|
end;
|
|
|
|
{ TIDEScanMessageLine }
|
|
|
|
procedure TIDEScanMessageLine.SetLine(const AValue: string);
|
|
var
|
|
OldLine: String;
|
|
begin
|
|
if FLine=AValue then exit;
|
|
OldLine:=FLine;
|
|
FLine:=AValue;
|
|
LineChanged(OldLine);
|
|
end;
|
|
|
|
procedure TIDEScanMessageLine.SetWorkingDirectory(const AValue: string);
|
|
var
|
|
OldDir: String;
|
|
begin
|
|
if FWorkingDirectory=AValue then exit;
|
|
OldDir:=FWorkingDirectory;
|
|
FWorkingDirectory:=AValue;
|
|
WorkingDirectoryChanged(OldDir);
|
|
end;
|
|
|
|
procedure TIDEScanMessageLine.SetTool(const AValue: TIDEExternalToolOptions);
|
|
begin
|
|
FTool:=AValue;
|
|
end;
|
|
|
|
procedure TIDEScanMessageLine.SetLineNumber(const NewLineNumber: integer);
|
|
begin
|
|
FLineNumber:=NewLineNumber;
|
|
end;
|
|
|
|
constructor TIDEScanMessageLine.Create(TheCaller: TObject;
|
|
TheTool: TIDEExternalToolOptions);
|
|
begin
|
|
FCaller:=TheCaller;
|
|
FTool:=TheTool;
|
|
end;
|
|
|
|
end.
|
|
|