mirror of
				https://gitlab.com/freepascal.org/lazarus/lazarus.git
				synced 2025-11-04 09:19:50 +01: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.
 | 
						|
 |