From 5179b2a17361eb4a0415a89e8cd068030214c87f Mon Sep 17 00:00:00 2001 From: mattias Date: Sat, 3 Aug 2013 13:41:02 +0000 Subject: [PATCH] IDE: further migration external tools git-svn-id: trunk@42278 - --- ide/editmsgscannersdlg.pas | 4 + ide/exttooldialog.pas | 436 ------------------------------ ide/exttooleditdlg.pas | 531 ++++++++++++++++++++++++++++++++++++- packager/packagesystem.pas | 77 +++++- 4 files changed, 592 insertions(+), 456 deletions(-) diff --git a/ide/editmsgscannersdlg.pas b/ide/editmsgscannersdlg.pas index b45af83889..6252e89108 100644 --- a/ide/editmsgscannersdlg.pas +++ b/ide/editmsgscannersdlg.pas @@ -22,6 +22,10 @@ } unit EditMsgScannersDlg; +{$IFDEF EnableNewExtTools} + {$Error} +{$ENDIF} + {$mode objfpc}{$H+} interface diff --git a/ide/exttooldialog.pas b/ide/exttooldialog.pas index 8243b042d0..4c72944894 100644 --- a/ide/exttooldialog.pas +++ b/ide/exttooldialog.pas @@ -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; diff --git a/ide/exttooleditdlg.pas b/ide/exttooleditdlg.pas index c9d1745d8d..98042cd3c2 100644 --- a/ide/exttooleditdlg.pas +++ b/ide/exttooleditdlg.pas @@ -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); diff --git a/packager/packagesystem.pas b/packager/packagesystem.pas index a3b1a2c255..6b0ddc75d5 100644 --- a/packager/packagesystem.pas +++ b/packager/packagesystem.pas @@ -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;