fpc/packages/ide/fpmtools.inc
florian 3ce7927096 * made the ide a package, so it can be build in parallel with the other packages, reasons:
- 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 -
2018-01-06 20:22:30 +00:00

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;