mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-08 08:08:13 +02:00

- lowers build times - ide is not that important anymore than years before - other utils like pastojs are also located in the packages tree git-svn-id: trunk@37926 -
384 lines
11 KiB
PHP
384 lines
11 KiB
PHP
{
|
|
This file is part of the Free Pascal Integrated Development Environment
|
|
Copyright (c) 1998 by Berczi Gabor
|
|
|
|
Tools menu entries
|
|
|
|
See the file COPYING.FPC, 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.
|
|
|
|
**********************************************************************}
|
|
|
|
procedure TIDEApp.Messages;
|
|
begin
|
|
if MessagesWindow=nil then
|
|
Desktop^.Insert(New(PMessagesWindow, Init))
|
|
else
|
|
MessagesWindow^.Focus;
|
|
end;
|
|
|
|
procedure TIDEApp.DoAsciiTable;
|
|
begin
|
|
if ASCIIChart=nil then
|
|
begin
|
|
New(ASCIIChart, Init);
|
|
Desktop^.Insert(ASCIIChart);
|
|
end
|
|
else
|
|
ASCIIChart^.Focus;
|
|
end;
|
|
|
|
|
|
procedure TIDEApp.Calculator;
|
|
begin
|
|
with CalcWindow^ do
|
|
begin
|
|
if GetState(sfVisible)=false then Show;
|
|
MakeFirst;
|
|
end;
|
|
end;
|
|
|
|
procedure TIDEApp.ExecuteTool(Idx: integer);
|
|
var Title,ProgramPath,Params: string;
|
|
W: PSourceWindow;
|
|
ToFocus : sw_integer;
|
|
Wo: word;
|
|
Err: integer;
|
|
CaptureFile: string;
|
|
TextFile : Text;
|
|
ExecMode: TExecType;
|
|
Executed: boolean;
|
|
begin
|
|
if (Idx<1) or (Idx>GetToolCount) then Exit;
|
|
InitToolProcessing;
|
|
GetToolParams(Idx-1,Title,ProgramPath,Params,Wo);
|
|
InitToolTempFiles;
|
|
Err:=ParseToolParams(Params,false);
|
|
if Err=-1 then
|
|
begin
|
|
DoneToolTempFiles;
|
|
Exit;
|
|
end;
|
|
if Err<>0 then
|
|
begin ErrorBox(msg_errorparsingtoolparams,nil); Exit; end;
|
|
if CaptureToolTo<>capNone then
|
|
begin
|
|
if ToolOutput<>'' then
|
|
begin
|
|
CaptureFile:=ToolOutput;
|
|
end
|
|
else
|
|
CaptureFile:=ToolCaptureName;
|
|
ExecMode:=exNoSwap;
|
|
end
|
|
else
|
|
begin
|
|
CaptureFile:='';
|
|
ExecMode:=exNormal;
|
|
end;
|
|
|
|
EraseFile(CaptureFile);
|
|
EraseFile(FilterCaptureName);
|
|
EraseFile(ToolCaptureErr);
|
|
|
|
if CaptureToolTo=capMessageWindow then
|
|
begin
|
|
Messages;
|
|
AddToolCommand(ProgramPath+' '+Params);
|
|
UpdateToolMessages;
|
|
ToFocus:=ToolMessages^.count-1;
|
|
end
|
|
else
|
|
ToFocus:=-1;
|
|
if CaptureToolTo<>capNone then
|
|
ShowMessage(FormatStrStr(msg_executingtool,KillTilde(Title)));
|
|
|
|
Executed:=DoExecute(ProgramPath,Params,'',CaptureFile,ToolCaptureErr,ExecMode);
|
|
|
|
if CaptureToolTo<>capNone then
|
|
HideMessage;
|
|
|
|
if Executed then
|
|
begin
|
|
if (DosError=0) {and (DosExitCode=0)} then
|
|
begin
|
|
if CaptureToolTo=capEditWindow then
|
|
begin
|
|
if ToolOutput<>'' then
|
|
W:=OpenEditorWindow(nil,ToolOutput,0,0)
|
|
else
|
|
begin
|
|
W:=OpenEditorWindow(nil,'',0,0);
|
|
if W<>nil then
|
|
if StartEditor(W^.Editor,CaptureFile)=false then
|
|
ErrorBox(msg_errorreadingoutput,nil);
|
|
end;
|
|
end
|
|
else if (ToolFilter<>'') or (CaptureToolTo=capMessageWindow) then
|
|
begin
|
|
if ToolFilter<>'' then
|
|
begin
|
|
ShowMessage(FormatStrStr(msg_executingfilterfor,KillTilde(Title)));
|
|
DoExecute(ToolFilter,'',CaptureFile,FilterCaptureName,'',exNoSwap);
|
|
HideMessage;
|
|
if (DosError=0) and (DosExitCode=0) then
|
|
begin
|
|
if ExistsFile(FilterCaptureName)=false then
|
|
ErrorBox(msg_cantfindfilteredoutput,nil)
|
|
else
|
|
if ProcessMessageFile(FilterCaptureName)=false then
|
|
ErrorBox(msg_errorprocessingfilteredoutput,nil);
|
|
end;
|
|
if (DosError<>0) then
|
|
ErrorBox(FormatStrStr(msg_errorexecutingfilter,KillTilde(GetToolName(Idx-1))),nil) else
|
|
if DosExitCode<>0 then
|
|
ErrorBox(FormatStrInt(msg_filterexecutionsuccessfulexitcodeis,DosExitCode),nil);
|
|
end
|
|
else
|
|
begin
|
|
if ExistsFile(CaptureFile) then
|
|
begin
|
|
Assign(TextFile,CaptureFile);
|
|
Reset(TextFile);
|
|
while not eof(TextFile) do
|
|
begin
|
|
Readln(TextFile,Params);
|
|
AddToolCommand(Params);
|
|
end;
|
|
Close(TextFile);
|
|
UpdateToolMessages;
|
|
if Assigned(MessagesWindow) then
|
|
MessagesWindow^.MakeFirst;
|
|
end;
|
|
end;
|
|
UpdateToolMessages;
|
|
if (ToFocus<>-1) then
|
|
if Assigned(MessagesWindow) then
|
|
MessagesWindow^.FocusItem(ToFocus);
|
|
if DosError=0 then
|
|
Messages;
|
|
end;
|
|
end;
|
|
end;
|
|
if (DosError<>0) or (DosExitCode<>0) or (SizeOfFile(ToolCaptureErr)>0) then
|
|
begin
|
|
if (DosError<>0) then
|
|
ErrorBox(FormatStrStr(msg_errorexecutingtool,KillTilde(GetToolName(Idx-1))),nil) else
|
|
if DosExitCode<>0 then
|
|
ErrorBox(FormatStrInt(msg_toolexecutionsuccessfulexitcodeis,DosExitCode),nil);
|
|
{$i-}
|
|
Assign(TextFile,ToolCaptureErr);
|
|
Reset(TextFile);
|
|
while not eof(TextFile) do
|
|
begin
|
|
Readln(TextFile,Params);
|
|
AddToolCommand(Params);
|
|
end;
|
|
Close(TextFile);
|
|
UpdateToolMessages;
|
|
if Assigned(MessagesWindow) then
|
|
begin
|
|
MessagesWindow^.MakeFirst;
|
|
if (ToFocus<>-1) then
|
|
MessagesWindow^.FocusItem(ToFocus);
|
|
end;
|
|
end;
|
|
{$ifndef DEBUG}
|
|
if ToolOutput='' then
|
|
begin
|
|
EraseFile(CaptureFile);
|
|
ToolOutput:='';
|
|
end;
|
|
EraseFile(FilterCaptureName);
|
|
EraseFile(ToolCaptureErr);
|
|
{$endif}
|
|
{ In case we have something that the compiler touched }
|
|
AskToReloadAllModifiedFiles;
|
|
DoneToolTempFiles;
|
|
end;
|
|
|
|
|
|
procedure TIDEApp.DoGrep;
|
|
Const
|
|
GrepExeName = 'grep'+ExeExt;
|
|
var
|
|
PGrepDialog : PCenterDialog;
|
|
R,R1,R2 : TRect;
|
|
Control : PView;
|
|
IL1,IL2 : PEditorInputLine;
|
|
s : string;
|
|
p,lineNb,GrepOutputLine : longint;
|
|
error : word;
|
|
PosText : longint;
|
|
showmsg,error_in_reading,FirstMsg : boolean;
|
|
ToFocus : sw_integer;
|
|
searchword,
|
|
GrepExe,GrepArgs,Line,ModuleName : String;
|
|
GrepOut : text;
|
|
Params : Array[0..4] of longint;
|
|
begin
|
|
showmsg:=false;
|
|
ToFocus:=-1;
|
|
{ Find grep.exe }
|
|
GrepExe:=GrepExeName;
|
|
If not LocateExeFile(GrepExe) then
|
|
Begin
|
|
ErrorBox(msg_grepprogramnotfound,nil);
|
|
Exit;
|
|
End;
|
|
{ Try to load the word from the editor }
|
|
If not(DeskTop^.Current=nil) and
|
|
(DeskTop^.Current^.HelpCtx=hcSourceWindow) then
|
|
Searchword:=PSourceWindow(DeskTop^.Current)^.Editor^.GetCurrentWord
|
|
else
|
|
Searchword:='';
|
|
{ Don't use the listseparator in the file list else it's seen as 1 file
|
|
(at least under linux }
|
|
s:=highlightexts;
|
|
ReplaceStr(s,';',' ');
|
|
{ add "" for args with spaces }
|
|
{ WARNING : text must still be entered in usual grep syntax }
|
|
{ -n is always added later because otherwise
|
|
we don't get the line info PM }
|
|
GrepArgs:=' -i "$TEXT" '+s;
|
|
{ Dialog }
|
|
R.Assign(0,0,50,8);
|
|
new(PGrepDialog,Init(R,dialog_greparguments));
|
|
with PGrepDialog^ do
|
|
begin
|
|
R2.A.Y:=R.A.Y+3;
|
|
R2.B.Y:=R2.A.Y+1;
|
|
R2.A.X:=R.A.X+3;
|
|
R2.B.X:=R.B.X-6;
|
|
New(IL1, Init(R2, 128));
|
|
IL1^.Data^:=SearchWord;
|
|
Insert(IL1);
|
|
R2.Move(0,-1);
|
|
Insert(New(PLabel, Init(R2, label_grep_texttofind, IL1)));
|
|
R1.Assign(R2.B.X, R2.A.Y+1, R2.B.X+3, R2.B.Y+1);
|
|
Control := New(PHistory, Init(R1, IL1, TextGrepId));
|
|
Insert(Control);
|
|
|
|
R2.Move(0,4);
|
|
New(IL2, Init(R2, 128));
|
|
IL2^.Data^:=GrepArgs;
|
|
Insert(IL2);
|
|
R2.Move(0,-1);
|
|
Insert(New(PLabel, Init(R2, label_grep_greparguments, IL2)));
|
|
R1.Assign(R2.B.X, R2.A.Y+1, R2.B.X+3, R2.B.Y+1);
|
|
Control := New(PHistory, Init(R1, IL2, GrepArgsId));
|
|
Insert(Control);
|
|
end;
|
|
|
|
InsertButtons(PGrepDialog);
|
|
IL1^.Select;
|
|
|
|
if Desktop^.ExecView(PGrepDialog)=cmOK then
|
|
begin
|
|
SearchWord:=IL1^.Data^;
|
|
if SearchWord<>'' then
|
|
begin
|
|
GrepArgs:=IL2^.Data^;
|
|
{ Remember last used Grep extensions }
|
|
PosText:=pos('"$TEXT" ',GrepArgs);
|
|
if PosText>0 then
|
|
HighlightExts:=Trim(Copy(GrepArgs,PosText+Length('"$TEXT" '),Length(GrepArgs)));
|
|
{ change spaces back into ';' again }
|
|
ReplaceStr(HighlightExts,' ',';');
|
|
{ Replace search string }
|
|
ReplaceStr(GrepArgs,'$TEXT',SearchWord);
|
|
{ Linux ? }
|
|
AddToolCommand(GrepExe+' -n '+GrepArgs);
|
|
ToFocus:=ToolMessages^.count-1;
|
|
UpdateToolMessages;
|
|
if Assigned(MessagesWindow) then
|
|
MessagesWindow^.FocusItem(ToFocus);
|
|
showmsg:=true;
|
|
Messages;
|
|
PushStatus(FormatStrStr(msg_runninggrepwithargs,GrepArgs));
|
|
if not ExecuteRedir(GrepExe,'-n '+GrepArgs,'',GrepOutName,GrepErrName) then
|
|
Begin
|
|
PopStatus;
|
|
{ 2 as exit code just means that
|
|
some file vwere not found ! }
|
|
if (IOStatus<>0) or (ExecuteResult<>2) then
|
|
begin
|
|
Params[0]:=IOStatus;
|
|
Params[1]:=ExecuteResult;
|
|
WarningBox(msg_errorrunninggrep,@Params);
|
|
end;
|
|
End
|
|
else
|
|
PopStatus;
|
|
{$I-}
|
|
Assign(GrepOut,GrepOutName);
|
|
Reset(GrepOut);
|
|
error_in_reading:=false;
|
|
FirstMsg:=True;
|
|
GrepOutputLine:=0;
|
|
While not eof(GrepOut) do
|
|
begin
|
|
readln(GrepOut,Line);
|
|
Inc(GrepOutputLine);
|
|
p:=pos(':',line);
|
|
if p>0 then
|
|
begin
|
|
ModuleName:=copy(Line,1,p-1);
|
|
Line:=Copy(Line,p+1,255);
|
|
p:=pos(':',Line);
|
|
val(copy(Line,1,p-1),lineNb,error);
|
|
if error=0 then
|
|
begin
|
|
AddToolMessage(ModuleName,Copy(Line,p+1,255),LineNb,1);
|
|
if FirstMsg then
|
|
begin
|
|
Inc(ToFocus);
|
|
FirstMsg:=false;
|
|
end;
|
|
end
|
|
else
|
|
error_in_reading:=true;
|
|
end;
|
|
end;
|
|
Close(GrepOut);
|
|
if not error_in_reading then
|
|
Erase(GrepOut)
|
|
else
|
|
begin
|
|
ClearFormatParams;
|
|
AddFormatParamInt(GrepOutputLine);
|
|
AddFormatParamStr(GrepOutName);
|
|
WarningBox(msg_errorreadinggrepoutput,@FormatParams);
|
|
end;
|
|
{ Delete also grep$$.err }
|
|
if not error_in_reading then
|
|
begin
|
|
Assign(GrepOut,GrepErrName);
|
|
Erase(GrepOut);
|
|
end;
|
|
{$I+}
|
|
EatIO;
|
|
end;
|
|
end;
|
|
Dispose(PGrepDialog, Done);
|
|
UpdateToolMessages;
|
|
if (ToFocus<>-1) then
|
|
if Assigned(MessagesWindow) then
|
|
begin
|
|
MessagesWindow^.Lock;
|
|
MessagesWindow^.FocusItem(ToolMessages^.count-1);
|
|
if ToFocus>0 then
|
|
MessagesWindow^.FocusItem(ToFocus-1);
|
|
MessagesWindow^.FocusItem(ToFocus);
|
|
MessagesWindow^.UnLock;
|
|
end;
|
|
if showmsg then
|
|
Messages;
|
|
end;
|
|
|
|
|