lazarus/ideintf/ideexterntoolintf.pas
2009-02-27 02:35:55 +00:00

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.