IDE: further migration external tools

git-svn-id: trunk@42335 -
This commit is contained in:
mattias 2013-08-04 20:34:00 +00:00
parent 0fbb1e90df
commit ddd03e966d
8 changed files with 171 additions and 24 deletions

View File

@ -79,8 +79,7 @@ type
);
TMessageLineFlags = set of TMessageLineFlag;
{ TMessageLine
Access needs Lines.Tool.Enter/LeaveCriticalSection }
{ TMessageLine }
TMessageLine = packed class
private
@ -176,8 +175,7 @@ type
property MaxLine: integer read FMaxLine;
end;
{ TMessageLines
Access needs Tool.Enter/LeaveCriticalSection }
{ TMessageLines }
TETMarksFixedEvent = procedure(ListOfTMessageLine: TFPList) of object;
@ -235,7 +233,7 @@ type
{ TExtToolParser
Read the output of a tool, for example the output of the Free Pascal compiler.
It does not filter. Some parsers can work together, for example make and fpc.
Usage: Tool.AddParser('fpc');
Usage: Tool.AddParsers('fpc');
}
TExtToolParser = class(TComponent)
private
@ -270,7 +268,7 @@ type
TMakeParser = class(TExtToolParser)
end;
{ TDefaultParser - simple parser for simple text output, no filter at all }
{ TDefaultParser - simple parser for simple text output, no filtering }
TDefaultParser = class(TExtToolParser)
public
@ -283,8 +281,7 @@ type
const
DefaultETViewMinUrgency = mluHint;
type
{ TExtToolView
Access needs Enter/LeaveCriticalSection }
{ TExtToolView }
TExtToolView = class(TComponent)
private
@ -1985,7 +1982,7 @@ begin
end;
end.
{$ELSE}
{$ELSE EnableNewExtTools}
interface
uses

View File

@ -285,7 +285,12 @@ type
// progress and error messages
function ShowProgress(const SomeText: string;
Step, MaxStep: integer): boolean; virtual; abstract; // False if canceled by user
function DoJumpToCompilerMessage(Index:integer;
function DoJumpToCompilerMessage(
{$IFDEF EnableNewExtTools}
Msg: TMessageLine; // if nil then it jumps to first message
{$ELSE}
Index:integer;
{$ENDIF}
FocusEditor: boolean): boolean; virtual; abstract;
procedure DoJumpToNextError(DirectionDown: boolean); virtual; abstract;
procedure DoShowMessagesView(BringToFront: boolean = true); virtual; abstract;

View File

@ -694,7 +694,7 @@ begin
LfmFixer.RootMustBeClassInIntf:=true;
LfmFixer.ObjectsMustExist:=true;
if LfmFixer.ConvertAndRepair<>mrOK then begin
LazarusIDE.DoJumpToCompilerMessage(-1,true);
LazarusIDE.DoJumpToCompilerMessage({$IFDEF EnableNewExtTools}nil{$ELSE}-1{$ENDIF},true);
fOwnerConverter.fErrorMsg:='Problems when repairing form file '
+ChangeFileExt(fOrigUnitFilename, '.lfm');
exit(mrAbort);

View File

@ -53,8 +53,25 @@ type
ImgIDFatal: integer;
function GetDblClickJumps: boolean;
procedure SetDblClickJumps(AValue: boolean);
protected
function GetViews(Index: integer): TExtToolView; override;
public
SourceMarks: TETMarks;
function AddCustomMessage(TheUrgency: TMessageLineUrgency; Msg: string;
aSrcFilename: string=''; LineNumber: integer=0; Column: integer=0;
const ViewCaption: string=''): TMessageLine; override;
procedure Clear; override;
procedure DeleteView(View: TExtToolView); override;
function FindUnfinishedView: TExtToolView; override;
function GetSelectedLine: TMessageLine; override;
function GetView(aCaption: string; CreateIfNotExist: boolean
): TExtToolView; override;
function IndexOfView(View: TExtToolView): integer; override;
function SelectFirstUrgentMessage(aMinUrgency: TMessageLineUrgency;
WithSrcPos: boolean): boolean; override;
function SelectNextUrgentMessage(aMinUrgency: TMessageLineUrgency;
WithSrcPos, Downwards: boolean): boolean; override;
function ViewCount: integer; override;
property DblClickJumps: boolean read GetDblClickJumps write SetDblClickJumps;
end;
@ -137,6 +154,71 @@ begin
MessagesFrame1.MessagesCtrl.Options+[mcoSingleClickOpensFile]
end;
function TMessagesView.GetViews(Index: integer): TExtToolView;
begin
Result:=MessagesFrame1.Views[Index];
end;
function TMessagesView.AddCustomMessage(TheUrgency: TMessageLineUrgency;
Msg: string; aSrcFilename: string; LineNumber: integer; Column: integer;
const ViewCaption: string): TMessageLine;
begin
Result:=MessagesFrame1.AddCustomMessage(TheUrgency,Msg,aSrcFilename,
LineNumber,Column,ViewCaption);
end;
procedure TMessagesView.Clear;
begin
MessagesFrame1.ClearViews;
end;
procedure TMessagesView.DeleteView(View: TExtToolView);
begin
if View is TLMsgWndView then
MessagesFrame1.DeleteView(TLMsgWndView(View));
end;
function TMessagesView.FindUnfinishedView: TExtToolView;
begin
Result:=MessagesFrame1.FindUnfinishedView;
end;
function TMessagesView.GetSelectedLine: TMessageLine;
begin
Result:=MessagesFrame1.MessagesCtrl.GetSelectedMsg;
end;
function TMessagesView.GetView(aCaption: string; CreateIfNotExist: boolean
): TExtToolView;
begin
Result:=MessagesFrame1.GetView(aCaption,CreateIfNotExist);
end;
function TMessagesView.IndexOfView(View: TExtToolView): integer;
begin
if View is TLMsgWndView then
Result:=MessagesFrame1.IndexOfView(TLMsgWndView(View))
else
Result:=-1;
end;
function TMessagesView.SelectFirstUrgentMessage(
aMinUrgency: TMessageLineUrgency; WithSrcPos: boolean): boolean;
begin
Result:=MessagesFrame1.SelectFirstUrgentMessage(aMinUrgency,WithSrcPos);
end;
function TMessagesView.SelectNextUrgentMessage(
aMinUrgency: TMessageLineUrgency; WithSrcPos, Downwards: boolean): boolean;
begin
Result:=MessagesFrame1.SelectNextUrgentMessage(aMinUrgency,WithSrcPos,Downwards);
end;
function TMessagesView.ViewCount: integer;
begin
Result:=MessagesFrame1.ViewCount;
end;
function TMessagesView.GetDblClickJumps: boolean;
begin
Result:=not (mcoSingleClickOpensFile in MessagesFrame1.MessagesCtrl.Options);

View File

@ -603,9 +603,13 @@ end;
function TExternalToolDialog.ToolDescription(Index: integer): string;
begin
{$IFDEF EnableNewExtTools}
Result:=fExtToolList[Index].Title;
{$ELSE}
Result:=fExtToolList[Index].ShortDescription;
if Result='' then
Result:=fExtToolList[Index].Title;
{$ENDIF}
if Result='' then
Result:=ExtractFilename(fExtToolList[Index].Filename);
//DebugLn(['TExternalToolDialog.ToolDescription Index=',Index,' Result=',Result,' Cmd="',fExtToolList[Index].Filename,' ',fExtToolList[Index].CmdLineParams,'"']);
@ -638,7 +642,7 @@ begin
exit;
end;
{$IFDEF EnableNewExtTools}
NewTool:=TExternalToolMenuItem.Create;
NewTool:=TExternalToolMenuItem.Create(nil);
{$ELSE}
NewTool:=TExternalToolOptions.Create;
{$ENDIF}
@ -668,7 +672,7 @@ begin
OldTool := fExtToolList.Items[Listbox.ItemIndex];
If Assigned(OldTool) Then Begin
{$IFDEF EnableNewExtTools}
NewTool:=TExternalToolMenuItem.Create;
NewTool:=TExternalToolMenuItem.Create(nil);
{$ELSE}
NewTool:=TExternalToolOptions.Create;
{$ENDIF}
@ -783,7 +787,9 @@ begin
EnableButtons;
end;
{$IFNDEF EnableNewExtTools}
initialization
ExternalToolListClass:=TExternalToolList;
{$ENDIF}
end.

View File

@ -126,6 +126,7 @@ type
procedure Assign(Src: TExternalToolMenuItems);
procedure Add(Item: TExternalToolMenuItem);
procedure Insert(Index: integer; Item: TExternalToolMenuItem);
procedure Delete(Index: integer);
procedure Move(CurIndex, NewIndex: integer);
function Load(Config: TConfigStorage): TModalResult;
function Load(Config: TConfigStorage; const Path: string): TModalResult;
@ -138,6 +139,9 @@ type
function Count: integer; inline;
property Items[Index: integer]: TExternalToolMenuItem read GetItems; default;
end;
var
ExternalToolMenuItems: TExternalToolMenuItems = nil;
{$ELSE}
type
{ TExternalToolOptions }
@ -472,6 +476,8 @@ end;
destructor TExternalToolMenuItems.Destroy;
begin
if ExternalToolMenuItems=Self then
ExternalToolMenuItems:=nil;
Clear;
FreeAndNil(fItems);
inherited Destroy;
@ -519,6 +525,11 @@ begin
fItems.Insert(Index,Item);
end;
procedure TExternalToolMenuItems.Delete(Index: integer);
begin
fItems.Delete(Index);
end;
procedure TExternalToolMenuItems.Move(CurIndex, NewIndex: integer);
begin
fItems.Move(CurIndex,NewIndex);

View File

@ -625,7 +625,9 @@ type
Scanner: TLinkScanner);
// MessagesView events
{$IFNDEF EnableNewExtTools}
procedure MessagesViewSelectionChanged(sender: TObject);
{$ENDIF}
// SearchResultsView events
procedure SearchResultsViewSelectionChanged(sender: TObject);
@ -693,7 +695,9 @@ type
procedure SetupDialogs;
procedure SetupComponentPalette;
procedure SetupHints;
{$IFNDEF EnableNewExtTools}
procedure SetupOutputFilter;
{$ENDIF}
procedure SetupObjectInspector;
procedure SetupFormEditor;
procedure SetupSourceNotebook;
@ -839,7 +843,9 @@ type
// external tools
function PrepareForCompile: TModalResult; override;
{$IFNDEF EnableNewExtTools}
function OnRunExternalTool(Tool: TIDEExternalToolOptions): TModalResult;
{$ENDIF}
function DoRunExternalTool(Index: integer; ShowAbort: Boolean): TModalResult;
function DoSaveBuildIDEConfigs(Flags: TBuildLazarusFlags): TModalResult; override;
function DoExampleManager: TModalResult; override;
@ -964,7 +970,12 @@ type
function DoConvertDelphiPackage(const DelphiFilename: string): TModalResult;
// message view
function DoJumpToCompilerMessage(Index:integer;
function DoJumpToCompilerMessage(
{$IFDEF EnableNewExtTools}
Msg: TMessageLine;
{$ELSE}
Index:integer;
{$ENDIF}
FocusEditor: boolean): boolean; override;
procedure DoJumpToNextError(DirectionDown: boolean); override;
procedure DoShowMessagesView(BringToFront: boolean = true); override;
@ -1289,7 +1300,12 @@ begin
SetupIDEMsgQuickFixItems;
EditorOpts.Load;
{$IFDEF EnableNewExtTools}
ExternalToolMenuItems:=TExternalToolMenuItems(EnvironmentOptions.ExternalToolMenuItems);
ExternalToolMenuItems.LoadShortCuts(EditorOpts.KeyMap);
{$ELSE}
ExternalTools.LoadShortCuts(EditorOpts.KeyMap);
{$ENDIF}
MiscellaneousOptions := TMiscellaneousOptions.Create;
MiscellaneousOptions.Load;
@ -1327,6 +1343,7 @@ begin
FWaitForClose := False;
SetupDialogs;
{$IFNDEF EnableNewExtTools}
RunExternalTool:=@OnRunExternalTool;
{$IFDEF UseAsyncProcess}
if Widgetset.GetLCLCapability(lcAsyncProcess) = 1 then
@ -1336,6 +1353,7 @@ begin
{$ELSE}
TOutputFilterProcess := TProcessUTF8;
{$ENDIF}
{$ENDIF}
MainBuildBoss:=TBuildManager.Create(nil);
MainBuildBoss.HasGUI:=true;
@ -1431,7 +1449,9 @@ begin
HelpBoss.ConnectMainBarEvents;
{$IFDEF IDE_MEM_CHECK}CheckHeapWrtMemCnt('TMainIDE.Create MANAGERS');{$ENDIF}
// setup the IDE components
{$IFNDEF EnableNewExtTools}
SetupOutputFilter;
{$ENDIF}
MainBuildBoss.SetupCompilerInterface;
SetupObjectInspector;
SetupFormEditor;
@ -1532,7 +1552,13 @@ begin
// free IDE parts
FreeFormEditor;
FreeTextConverters;
{$IFDEF EnableNewExtTools}
FreeThenNil(IDEQuickFixes);
{$ELSE}
FreeStandardIDEQuickFixItems;
FreeThenNil(IDEMsgScanners);
FreeThenNil(TheOutputFilter);
{$ENDIF}
FreeThenNil(GlobalDesignHook);
FreeThenNil(LPKInfoCache);
FreeThenNil(PkgBoss);
@ -1541,8 +1567,6 @@ begin
FreeThenNil(TheCompiler);
FreeThenNil(HiddenWindowsOnRun);
FreeThenNil(LastActivatedWindows);
FreeThenNil(IDEMsgScanners);
FreeThenNil(TheOutputFilter);
FreeThenNil(GlobalMacroList);
FreeThenNil(IDEMacros);
FreeThenNil(IDECodeMacros);
@ -1577,7 +1601,9 @@ end;
procedure TMainIDE.CreateOftenUsedForms;
begin
MessagesView:=TMessagesView.Create(nil);
{$IFNDEF EnableNewExtTools}
MessagesView.OnSelectionChanged := @MessagesViewSelectionChanged;
{$ENDIF}
LazFindReplaceDialog:=TLazFindReplaceDialog.Create(nil);
end;
@ -2030,12 +2056,14 @@ begin
end;
end;
{$IFNDEF EnableNewExtTools}
procedure TMainIDE.SetupOutputFilter;
begin
TheOutputFilter:=TOutputFilter.Create;
TheOutputFilter.OnGetIncludePath:=@CodeToolBoss.GetIncludePathForDirectory;
IDEMsgScanners:=TMessageScanners.Create;
end;
{$ENDIF}
procedure TMainIDE.SetupObjectInspector;
begin
@ -3136,7 +3164,7 @@ begin
ecContextHelp:
if Sender=MessagesView then
HelpBoss.ShowHelpForMessage(-1)
HelpBoss.ShowHelpForMessage{$IFDEF EnableNewExtTools}(){$ELSE}(-1){$ENDIF}
else if Sender is TObjectInspectorDlg then
HelpBoss.ShowHelpForObjectInspector(Sender);
ecEditContextHelp:
@ -4374,12 +4402,14 @@ end;
procedure TMainIDE.mnuToolConfigureClicked(Sender: TObject);
begin
if ShowExtToolDialog(ExternalTools,GlobalMacroList)=mrOk then
if ShowExtToolDialog(
{$IFDEF EnableNewExtTools}ExternalToolMenuItems{$ELSE}ExternalTools{$ENDIF},
GlobalMacroList)=mrOk then
begin
// save to environment options
SaveEnvironment(true);
// save shortcuts to editor options
ExternalTools.SaveShortCuts(EditorOpts.KeyMap);
{$IFDEF EnableNewExtTools}ExternalToolMenuItems{$ELSE}ExternalTools{$ENDIF}.SaveShortCuts(EditorOpts.KeyMap);
EditorOpts.Save;
UpdateHighlighters(True);
SourceEditorManager.ReloadEditorOptions;
@ -7083,10 +7113,13 @@ begin
OldToolStatus := ToolStatus; // It can still be itDebugger, if the debugger is still stopping. Prevent any "Run" command after building, until the debugger is clear
ToolStatus:=itBuilder;
{$IFDEF EnableNewExtTools}
{$ELSE}
ConnectOutputFilter;
for err := Low(TFPCErrorType) to High(TFPCErrorType) do
with Project1.CompilerOptions.CompilerMessages do
TheOutputFilter.ErrorTypeName[err] := ErrorNames[err];
{$ENDIF}
// compile
CompilerFilename:=Project1.GetCompilerFilename;
@ -7180,7 +7213,7 @@ function TMainIDE.DoAbortBuild: TModalResult;
begin
Result:=mrOk;
if ToolStatus<>itBuilder then exit;
TheOutputFilter.StopExecute:=true;
AbortBuild;
end;
procedure TMainIDE.DoQuickCompile;
@ -8080,12 +8113,14 @@ begin
MainBuildBoss.RescanCompilerDefines(false,false,false,false);
end;
{$IFNDEF EnableNewExtTools}
function TMainIDE.OnRunExternalTool(Tool: TIDEExternalToolOptions): TModalResult;
begin
SourceEditorManager.ClearErrorLines;
Result:=ExternalTools.Run(Tool,GlobalMacroList,false);
DoCheckFilesOnDisk;
end;
{$ENDIF}
function TMainIDE.DoCheckSyntax: TModalResult;
var
@ -8521,8 +8556,12 @@ end;
procedure TMainIDE.AbortBuild;
begin
{$IFDEF EnableNewExtTools}
ExternalTools.TerminateAll;
{$ELSE}
if TheOutputFilter<>nil then
TheOutputFilter.StopExecute:=true;
{$ENDIF}
end;
procedure TMainIDE.UpdateCaption;
@ -8841,7 +8880,12 @@ begin
ErrType:=FPCErrorTypeNameToType(ALine.Parts.Values['Type']);
end;
function TMainIDE.DoJumpToCompilerMessage(Index:integer;
function TMainIDE.DoJumpToCompilerMessage(
{$IFDEF EnableNewExtTools}
Msg: TMessageLine;
{$ELSE}
Index:integer;
{$ENDIF}
FocusEditor: boolean): boolean;
var
MaxMessages: integer;
@ -11141,10 +11185,12 @@ end;
//-----------------------------------------------------------------------------
{$IFNDEF EnableNewExtTools}
procedure TMainIDE.MessagesViewSelectionChanged(sender: TObject);
begin
DoJumpToCompilerMessage(TMessagesView(Sender).SelectedMessageIndex,True);
end;
{$ENDIF}
procedure TMainIDE.SearchResultsViewSelectionChanged(sender: TObject);
begin

View File

@ -3943,7 +3943,7 @@ begin
mtInformation,[mbOk],'');
end;
end else begin
MainIDE.DoJumpToCompilerMessage(-1,true);
MainIDE.DoJumpToCompilerMessage({$IFDEF EnableNewExtTools}nil{$ELSE}-1{$ENDIF},true);
Result:=mrAbort;
exit;
end;