IDE: started new external tools

git-svn-id: trunk@42230 -
This commit is contained in:
mattias 2013-07-29 15:42:45 +00:00
parent aa37def788
commit 7335961add
9 changed files with 9619 additions and 2 deletions

6
.gitattributes vendored
View File

@ -4949,6 +4949,12 @@ ide/emptymethodsdlg.pas svneol=native#text/plain
ide/encloseselectiondlg.lfm svneol=native#text/plain
ide/encloseselectiondlg.pas svneol=native#text/pascal
ide/environmentopts.pp svneol=native#text/pascal
ide/etfpcmsgparser.pas svneol=native#text/plain
ide/etmakemsgparser.pas svneol=native#text/plain
ide/etmessageframe.lfm svneol=native#text/plain
ide/etmessageframe.pas svneol=native#text/plain
ide/etquickfixes.pas svneol=native#text/plain
ide/etsrceditmarks.pas svneol=native#text/plain
ide/examplemanager.lfm svneol=native#text/plain
ide/examplemanager.pas svneol=native#text/plain
ide/extractprocdlg.lfm svneol=native#text/plain

File diff suppressed because it is too large Load Diff

1706
ide/etfpcmsgparser.pas Normal file

File diff suppressed because it is too large Load Diff

344
ide/etmakemsgparser.pas Normal file
View File

@ -0,0 +1,344 @@
{
***************************************************************************
* *
* This source is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This code 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. See the GNU *
* General Public License for more details. *
* *
* A copy of the GNU General Public License is available on the World *
* Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also *
* obtain it by writing to the Free Software Foundation, *
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
***************************************************************************
Author: Mattias Gaertner
Abstract:
Parser for GNU 'make' output.
}
unit etMakeMsgParser;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, IDEExternToolIntf, CodeToolsStructs, KeywordFuncLists,
LazFileUtils, FileUtil;
const
MakeMsgIDEnteringDirectory = 1;
MakeMsgIDLeavingDirectory = 2;
type
{ TIDEMakeParser
Parse lines of 'make' tool. Finding the current directory is needed by other parsers. }
TIDEMakeParser = class(TMakeParser)
protected
fIsFileExecutable: TFilenameToPointerTree;
function IsFileExecutable(const Filename: string): boolean;
public
DirectoryStack: TStrings;
DefaultDirectory: string;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Init; override;
procedure ReadLine(Line: string; OutputIndex: integer; var Handled: boolean); override;
class function DefaultSubTool: string; override;
class function Priority: integer; override;
end;
function CompStr(const SubStr: string; p: PChar): boolean;
function CompStrI(const SubStr: string; p: PChar): boolean;
function FindSubStrI(const SubStr: string; p: PChar): PChar;
function GetString(p: PChar; MaxLen: integer): string;
function Str2Integer(p: PChar; const Default: integer): integer;
function ReadDecimal(var p: PChar): boolean;
function ReadNumberWithThousandSep(var p: PChar): boolean;
function ReadChar(var p: PChar; c: char): boolean; inline;
function ReadString(var p: PChar; const Find: string): boolean; inline;
procedure RegisterMakeParser;
implementation
function CompStr(const SubStr: string; p: PChar): boolean;
var
s: PChar;
begin
Result:=false;
if (SubStr='') or (p=nil) then exit;
s:=PChar(SubStr);
while (s^<>#0) and (p^=s^) do begin
inc(p);
inc(s);
end;
Result:=s^=#0;
end;
function CompStrI(const SubStr: string; p: PChar): boolean;
var
s: PChar;
begin
Result:=false;
if (SubStr='') or (p=nil) then exit;
s:=PChar(SubStr);
while (s^<>#0) and (UpChars[p^]=UpChars[s^]) do begin
inc(p);
inc(s);
end;
Result:=s^=#0;
end;
function FindSubStrI(const SubStr: string; p: PChar): PChar;
var
s: PChar;
begin
Result:=nil;
if (SubStr='') or (p=nil) then exit;
s:=PChar(SubStr);
while p^<>#0 do begin
if (UpChars[p^]=UpChars[s^]) and CompStrI(SubStr,p) then begin
Result:=p;
exit;
end;
inc(p);
end;
end;
function GetString(p: PChar; MaxLen: integer): string;
var
e: PChar;
len: Integer;
begin
e:=p;
len:=0;
while (e^<>#0) and (len<MaxLen) do begin
inc(e);
inc(len);
end;
SetLength(Result,len);
if len>0 then
System.Move(p^,Result[1],len);
end;
function Str2Integer(p: PChar; const Default: integer): integer;
var
Negated: Boolean;
i: int64;
begin
i:=0;
if p^='-' then begin
Negated:=true;
inc(p);
end else
Negated:=false;
while p^ in ['0'..'9'] do begin
i:=i*10+ord(p^)-ord('0');
if (i>High(Result)) then begin
Result:=Default;
exit;
end;
inc(p);
end;
Result:=i;
if Negated then
Result:=-Result;
end;
function ReadDecimal(var p: PChar): boolean;
var
OldP: PChar;
begin
OldP:=p;
while p^ in ['0'..'9'] do inc(p);
Result:=(OldP<p) and (p-OldP<10);
end;
function ReadNumberWithThousandSep(var p: PChar): boolean;
var
OldP: PChar;
begin
OldP:=p;
repeat
case p^ of
'0'..'9': ;
'.':
if p=OldP then exit(false)
else if p[1]='.' then exit(false);
else break;
end;
inc(p);
until false;
Result:=(OldP<p) and (p-OldP<20);
end;
function ReadChar(var p: PChar; c: char): boolean;
begin
Result:=p^=c;
if Result then inc(p);
end;
function ReadString(var p: PChar; const Find: string): boolean;
begin
Result:=CompStr(Find,p);
if Result then inc(p,length(Find));
end;
procedure RegisterMakeParser;
begin
ExternalToolList.RegisterParser(TIDEMakeParser);
end;
{ TIDEMakeParser }
function TIDEMakeParser.IsFileExecutable(const Filename: string): boolean;
var
p: Pointer;
begin
p:=fIsFileExecutable[Filename];
if p=Pointer(Self) then
Result:=true
else if p=Pointer(fIsFileExecutable) then
Result:=false
else begin
Result:=FileIsExecutable(Filename);
if Result then
fIsFileExecutable[Filename]:=Pointer(Self)
else
fIsFileExecutable[Filename]:=Pointer(fIsFileExecutable);
end;
end;
constructor TIDEMakeParser.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
fIsFileExecutable:=TFilenameToPointerTree.Create(false);
end;
destructor TIDEMakeParser.Destroy;
begin
FreeAndNil(fIsFileExecutable);
FreeAndNil(DirectoryStack);
inherited Destroy;
end;
procedure TIDEMakeParser.Init;
begin
DefaultDirectory:=Tool.WorkerDirectory;
inherited Init;
end;
procedure TIDEMakeParser.ReadLine(Line: string; OutputIndex: integer;
var Handled: boolean);
{ returns true, if it is a make/gmake message
Examples for make messages:
make[1]: Entering directory `<filename>'
make[1]: Leaving directory `<filename>'
make[1]: *** [<filename>] Killed
make <command>
/bin/cp <options>
}
const
EnterDirPattern = ']: Entering directory `';
LeavingDirPattern = ']: Leaving directory `';
MakeMsgPattern = ']: *** [';
var
MsgLine: TMessageLine;
p: PChar;
Filename, Dir: string;
Run: PChar;
begin
if Line='' then exit;
p:=PChar(Line);
if ReadString(p,'make[') or ReadString(p,'make.exe[') then begin
Handled:=true;
MsgLine:=CreateMsgLine(OutputIndex);
MsgLine.SubTool:=SubToolMake;
MsgLine.Urgency:=mluVerbose;
MsgLine.Msg:=Line;
while not (p^ in [']',#0]) do inc(p);
if ReadString(p,EnterDirPattern) then begin
// entering directory
MsgLine.MsgID:=MakeMsgIDEnteringDirectory;
if DefaultDirectory='' then DefaultDirectory:=Tool.WorkerDirectory;
if (Tool.WorkerDirectory<>'') then begin
if (DirectoryStack=nil) then DirectoryStack:=TStringList.Create;
DirectoryStack.Add(Tool.WorkerDirectory);
end;
Dir:=p;
if (Dir<>'') and (Dir[length(Dir)]='''') then
Dir:=copy(Dir,1,length(Dir)-1);
Tool.WorkerDirectory:=p;
end else if ReadString(p,LeavingDirPattern) then begin
// leaving directory
MsgLine.MsgID:=MakeMsgIDLeavingDirectory;
if (DirectoryStack<>nil) and (DirectoryStack.Count>0) then begin
Tool.WorkerDirectory:=DirectoryStack[DirectoryStack.Count-1];
DirectoryStack.Delete(DirectoryStack.Count-1);
end else begin
// leaving what directory?
Tool.WorkerDirectory:=DefaultDirectory;
end;
end else if ReadString(p,MakeMsgPattern) then begin
MsgLine.Msg:=p-1;
end;
AddMsgLine(MsgLine);
exit;
end else if ReadString(p,'make ') then begin
// e.g. make --assume-new=lazbuild.lpr lazbuild
Handled:=true;
MsgLine:=CreateMsgLine(OutputIndex);
MsgLine.SubTool:=SubToolMake;
MsgLine.Urgency:=mluVerbose;
MsgLine.Msg:=Line;
AddMsgLine(MsgLine);
exit;
end;
if not (p^ in [#0,' ',#9]) then begin
// check for command <option>
Run:=p;
while not (Run^ in [' ',#9,#0]) do inc(Run);
if Run^<>#0 then begin
SetLength(Filename,Run-p);
System.Move(p^,Filename[1],length(Filename));
Filename:=TrimFilename(Filename);
if FilenameIsAbsolute(Filename)
and ((GetExeExt='') or (ExtractFileExt(Filename)=GetExeExt))
and IsFileExecutable(Filename) then begin
Handled:=true;
MsgLine:=CreateMsgLine(OutputIndex);
MsgLine.SubTool:=SubToolMake;
MsgLine.Urgency:=mluVerbose;
MsgLine.Msg:=Line;
AddMsgLine(MsgLine);
end;
end;
end;
end;
class function TIDEMakeParser.DefaultSubTool: string;
begin
Result:=SubToolMake;
end;
class function TIDEMakeParser.Priority: integer;
begin
Result:=SubToolMakePriority;
end;
end.

592
ide/etmessageframe.lfm Normal file
View File

@ -0,0 +1,592 @@
object MessagesFrame: TMessagesFrame
Left = 0
Height = 106
Top = 0
Width = 444
ClientHeight = 106
ClientWidth = 444
LCLVersion = '1.1'
TabOrder = 0
DesignLeft = 297
DesignTop = 171
object SearchPanel: TPanel
Left = 0
Height = 27
Top = 79
Width = 444
Align = alBottom
AutoSize = True
ClientHeight = 27
ClientWidth = 444
TabOrder = 0
object SearchEdit: TEdit
AnchorSideLeft.Control = HideSearchSpeedButton
AnchorSideLeft.Side = asrBottom
Left = 34
Height = 25
Top = 1
Width = 200
BorderSpacing.Left = 10
Constraints.MinWidth = 200
OnChange = SearchEditChange
OnEnter = SearchEditEnter
OnExit = SearchEditExit
TabOrder = 0
Text = 'SearchEdit'
end
object SearchNextSpeedButton: TSpeedButton
AnchorSideLeft.Control = SearchEdit
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = SearchEdit
AnchorSideBottom.Control = SearchEdit
AnchorSideBottom.Side = asrBottom
Left = 234
Height = 25
Top = 1
Width = 23
Anchors = [akTop, akLeft, akBottom]
Flat = True
Glyph.Data = {
36040000424D3604000000000000360000002800000010000000100000000100
2000000000000004000064000000640000000000000000000000FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00256929C4216425C9FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002D7533CF488F4DFF458C4AFF2265
26D1FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF003C8A430638833ED9519957FF79C07EFF76BF7CFF468D
4BFF236627DB20622306FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF0042924AB83D8C45F765AD6CFF7DC282FF7AC180FF4B92
50FF276D2CF7246828BBFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF0043944B384E9A55FF81C587FF7EC385FF317A
36FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0045954CFF85C78CFF82C689FF3682
3DFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004A9E53FF8ACA91FF87C98EFF3C8A
43FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0050A659FF8ECC95FF8BCB93FF4292
4AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0056AD5FFF93CF9AFF90CE98FF489A
50FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005BB465FF96D29FFF94D09CFF4EA2
57FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005FBB6AFF9AD4A3FF98D3A1FF53AA
5DFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0063C06FFF9ED6A7FF9CD4A5FF59B2
63FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0066C572FFA2D8ABFFA0D7A9FF5DB8
68FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0068C774FF67C673FF65C270FF62BE
6DFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
}
OnClick = SearchNextSpeedButtonClick
ShowHint = True
ParentShowHint = False
end
object SearchPrevSpeedButton: TSpeedButton
AnchorSideLeft.Control = SearchNextSpeedButton
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = SearchNextSpeedButton
AnchorSideBottom.Control = SearchNextSpeedButton
AnchorSideBottom.Side = asrBottom
Left = 257
Height = 25
Top = 1
Width = 23
Anchors = [akTop, akLeft, akBottom]
Flat = True
Glyph.Data = {
36040000424D3604000000000000360000002800000010000000100000000100
2000000000000004000064000000640000000000000000000000FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00286E2DFF256929FF216425FF1E60
22FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002D7533FF74BD7AFF72BD78FF2265
26FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00337D39FF79C07EFF76BF7CFF266B
2BFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0039853FFF7DC282FF7AC180FF2B72
30FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003F8D46FF81C587FF7EC385FF317A
36FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0045954CFF85C78CFF82C689FF3682
3DFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004A9E53FF8ACA91FF87C98EFF3C8A
43FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0050A659FF8ECC95FF8BCB93FF4292
4AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0056AD5FFF93CF9AFF90CE98FF489A
50FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005BB465FF96D29FFF94D09CFF5DAC
65FF499C5238FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF0065C371BB62BF6EF779C683FF9AD4A3FF98D3A1FF7DC3
86FF4FA458F74A9E53B8FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF0068C7740666C472DB7CCA87FF9ED6A7FF9CD4A5FF73C0
7DFF55AC5ED950A65906FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0066C572D17ECA88FF7BC885FF5DB8
68CFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0067C673C965C270C4FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
}
OnClick = SearchPrevSpeedButtonClick
ShowHint = True
ParentShowHint = False
end
object HideSearchSpeedButton: TSpeedButton
AnchorSideLeft.Control = SearchPanel
AnchorSideTop.Control = SearchPanel
AnchorSideBottom.Control = SearchPanel
AnchorSideBottom.Side = asrBottom
Left = 1
Height = 25
Top = 1
Width = 23
Anchors = [akTop, akLeft, akBottom]
Flat = True
Glyph.Data = {
36040000424D3604000000000000360000002800000010000000100000000100
2000000000000004000064000000640000000000000000000000FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00806D5EFF7C614CFF806249FF816249FF816249FF816249FF816249FF8362
48FF816348FF816249FF7C614CFF806D5EFFFFFFFF00FFFFFF00FFFFFF00FFFF
FF007C614CFFE6CCB4FFD1B69CFFD2B59AFFD1B398FFD2B295FFCBAB8EFFCBA9
8CFFC8A689FFC6A389FFDCBDA4FF7E614CFFFFFFFF00FFFFFF00FFFFFF00FFFF
FF007C614CFFEED4BCFFEDD2B8FFEFD2B7FFEDCFB4FFEFCFB2FFEECEB1FFF1CF
B2FFF0CEB1FFEFCCB2FFEBCCB3FF7E614CFFFFFFFF00FFFFFF00FFFFFF00FFFF
FF00806D5EFF7C614CFF806249FF816249FF816249FF826449FF816348FF8362
48FF836248FF84624AFF7E614CFF806D5EFFFFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
}
OnClick = HideSearchSpeedButtonClick
ShowHint = True
ParentShowHint = False
end
end
object ImageList1: TImageList
left = 97
top = 25
Bitmap = {
4C69070000001000000010000000FFFFFF00FFFFFF00FFFFFF0091DEFB0391DE
FB0FFFFFFF00FFFFFF00FFFFFF0000C1FE12FFFFFF0000BDFD6000BAFC1200B7
FB0F00B4FA09FFFFFF00FFFFFF00FFFFFF00FFFFFF0091DEFB2E91DEFBE791DE
FBBF8FDDFB958FDDFB428DDDFB0200BFFD3C00BCFDA800B9FCC300B6FB8D00B3
F9C0FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0091DEFB8B91DEFBC290DD
FBFA8FD6F1EA8DD1EBF463D3FAFF4B9EBAF501B9FAFE41C8FEFF28B8FCFF00AF
F8C600ACF76600A8F521FFFFFF00FFFFFF00FFFFFF0091DEFB6190DCF9F887BA
CDF78B8D8EFF98AEB7FF80D4F4FF22C0F8FF43CBFEFF4DC2FFFF3FB0FFFF15A5
FAFF00A7F56CFFFFFF00FFFFFF00FFFFFF00FFFFFF008D95986E89CDE7FF8FDC
F9FF677479FF6C6C6CFF5F9CB2FF09B5F6FF28BDFCFF44B6FFFF36A3FFFF109E
F9FF0795DBD6009EF218FFFFFF00FFFFFF0083838334787878E4727E82FF8BD1
EBFF788083FF323232FF858585FF717E83FF03ADF4FF01A9F4FF0EA1F8FF268F
C3FF2E2E2ED529292934FFFFFF00FFFFFF007D7D7D80929292FF505050FF7777
77FF5D5D5DFF232323FF6B6B6BFF53859BFF457E98FF228DBFFF3C6E87FF2A7F
AFFF4A4F53FF1F1F1F80FFFFFF00FFFFFF00777777C0929292FF656565FF3232
32FF282828FF676767FF797979FF6D6D6DFF616161FF44687AFF4E5051FF4D4D
4DFF545454FF191919C0FFFFFF00FFFFFF006F6F6FED909090FF7D7D7DFF7D7D
7DFF7B7B7BFF767676FF6E6E6EFF626262FF595959FF4F4F4FFF484848FF4444
44FF545454FF141414EDFFFFFF00FFFFFF00646464ED808080FF717171FF6F6F
6FFF6C6C6CFF676767FF606060FF575757FF4F4F4FFF474747FF414141FF3D3D
3DFF4B4B4BFF101010EDFFFFFF00FFFFFF005B5B5BC0707070FF696969FF6161
61FF5D5D5DFF5A5A5AFF545454FF4C4C4CFF454545FF3F3F3FFF393939FF3B3B
3BFF3D3D3DFF0C0C0CC0FFFFFF00FFFFFF004F4F4F80616161FF626262FF5656
56FF515151FF4D4D4DFF484848FF424242FF3D3D3DFF373737FF343434FF3C3C
3CFF2A2A2AFF09090980FFFFFF00FFFFFF00404040343B3B3BD5626262FF5454
54FF484848FF434343FF3F3F3FFF3A3A3AFF353535FF313131FF373737FF3C3C
3CFF090909D507070734FFFFFF00FFFFFF00FFFFFF00313131672C2C2CF15656
56FF4C4C4CFF414141FF393939FF353535FF353535FF393939FF3A3A3AFF0909
09F106060667FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00232323671E1E
1ED53A3A3AFF454545FF474747FF424242FF373737FF262626FF070707D50505
0567FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001A1A
1A34131313800F0F0FC00C0C0CED0A0A0AED080808C00606068005050534FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006A85
FC236984FA7D6782F9DB6580F7F3637EF5F3617CF3DB5F7AF17D5D77EF23FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006984FA536882
F9E66E83EEFF92A6F4FFA0B4F8FFA0B4F8FF91A6F3FF687DE9FF5973EBE65671
E953FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006883F9536681F8F48497
F1FFA9BDFBFF8AA3F8FF6B89F6FF6B89F6FF89A2F8FFA8BCFAFF7F92ECFF526C
E4F44F69E253FFFFFF00FFFFFF00FFFFFF006781F822657FF6E58397F0FFA9BD
FBFF6382F5FF6382F5FFFFFFFFFFFFFFFFFF617EF3FF607CF3FFA6B9F9FF7B8D
EAFF4A64DEE54862DB22FFFFFF00FFFFFF00637EF57E6C81ECFFA9BDFBFF6382
F5FF6281F5FF6280F4FFFFFFFFFFFFFFFFFF5F7AF1FF5F78F0FF5D76EFFFA5B5
F8FF5D70DDFF435DD77EFFFFFF00FFFFFF005F7AF1DB91A6F3FF88A1F8FF6280
F4FF617EF3FF607CF3FFFFFFFFFFFFFFFFFF5D76EFFF5C73EEFF5B70ECFF8293
F1FF8998ECFF3E58D2DBFFFFFF00FFFFFF005B76EDF6A1B6F8FF6784F4FF607C
F3FF5F7AF1FF5F78F0FFFFFFFFFFFFFFFFFF5B70ECFF5A6EEBFF596CEAFF5F6F
E9FF9BA8F1FF3A53CEF6FFFFFF00FFFFFF005771E9F6A0B3F7FF6580F2FF5F78
F0FF5D76EFFF5C73EEFFD3D9FAFFFFFFFFFF596CEAFF5869E8FF5767E7FF5D6C
E7FF99A5F1FF354FCAF6FFFFFF00FFFFFF00526DE5DB8E9FF0FF8499F4FF5C73
EEFF5B70ECFF5A6EEBFF909DF1FFA6AFF3FF5767E7FF5665E6FF5562E5FF7D89
EBFF8591E7FF314AC6DBFFFFFF00FFFFFF004E68E17E6073E0FFA4B3F7FF5A6E
EBFF596CEAFF5869E8FFFFFFFFFFFFFFFFFF5562E5FF5461E3FF535FE2FF9FA9
F2FF5061D1FF2D46C27EFFFFFF00FFFFFF004963DC224660DAE57888E6FFA3B0
F5FF5767E7FF5665E6FF8992EDFF8892ECFF535FE2FF525DE1FF9FA9F2FF6F7D
DDFF2B44C0E52942BE22FFFFFF00FFFFFF00FFFFFF00425CD5533F59D3F47584
E3FFA1ACF4FF7F8BECFF5C67E4FF5B66E3FF7D87EAFF9FA8F1FF6F7CDDFF2943
BFF42741BD53FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003A54CF533852
CCE65264D4FF8490E7FF95A0EEFF959FEDFF838EE5FF4C5DCEFF2841BDE6263F
BB53FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00334D
C823314BC67D2F48C4DB2C46C2F32A44C0F32842BEDB2640BC7D243EBA23FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF003DBFEC033CBCEBD43ABAEAC339B8E803FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF003CBCEB9585D4F1FF82D1F0FF37B5E769FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF003CBCEB123ABAE9F2F1FAFDFFD5EFFAFF35B2E6ED33AFE412FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF003AB9E9B494D8F2FFF3FCFEFFE7FAFEFF8FD3F0FF31ACE396FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003AB9
E93038B7E8FDF9FDFFFF94E9F9FF9EEBFAFFECFAFEFF2FA9E1FC2DA6E030FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0038B7
E8D4A9DFF4FFEDF9FDFF3EA3D6FF3EA3D6FFD4F5FCFFA2D7F1FF2BA3DEC3FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0038B6E85A71C8
EDFFF9FEFFFF5EDCF4FF3EA2D5FF3EA2D5FF5CD9F4FFEDFBFEFF68BBE5FF269C
DB5AFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0038B6E80C36B4E6ECC8EA
F7FFE6FAFDFF5DDAF4FF3DA1D5FF3DA1D5FF57D7F2FFC7F3FCFFC0E3F4FF2499
D9E42296D80CFFFFFF00FFFFFF00FFFFFF00FFFFFF0036B3E6AA8CD2F0FFEAFB
FEFF94E6F8FF5CDAF4FF47B1DDFF3DA1D5FF56D7F2FF5CDBF5FFDEF8FDFF7DC0
E7FF1D8ED487FFFFFF00FFFFFF00FFFFFF0036B3E62434B1E5FBF3FBFEFFC3F2
FBFF5CDCF6FF5CDAF4FF64DFF6FF57CBEBFF55D6F2FF54D9F5FF94E7F8FFE3F4
FBFF1787D0F91380CD24FFFFFF00FFFFFF0034B0E5CA9DD7F1FFE7F9FDFF8BE5
F8FF5ADBF6FF5BDAF4FF3DA1D5FF3DA1D5FF54D6F2FF52D8F5FF50D6F4FFD8F6
FCFF88BFE5FF0E79C9B4FFFFFF0034B0E54B62BFE8FFF4FCFEFFB5EFFAFF58DA
F5FF58DAF5FF57D8F3FF58D7F2FF58D6F2FF57D9F4FF51D8F5FF4ED7F4FF62DA
F6FFEAFBFEFF4493D2FF066DC34B31ADE3E3BEE3F5FFF4FCFEFFEFFBFEFFEEFB
FEFFEEFBFEFFEFFCFEFFEFFCFEFFEFFBFEFFEEFBFEFFEDFBFEFFEDFBFEFFECFB
FEFFF2FCFEFFABCEEBFF0368C1D82FAAE2A22DA7E0FF2BA4DFFF29A1DDFF279E
DCFF259BDAFF2398D9FF2093D6FF1B8CD3FF1685CFFF117ECCFF0D77C9FF0971
C6FF066CC3FF0368C1FF0064BFA2FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000101E2000101E3000101E200000000000000000000000000000000000000
00000000000000000000000000000000000001B3CC8101B3CCAB01B3CCAB01B3
CCAB01B3CCAB01B3CCAB01B3CCAB01B3CCAB01B3CCAB01B3CCAB01B3CCAB01B3
CC3C1FB1D70001B3CC00000000000000000001B1CAAD9CEFFBFF8FEBF9FF8DEA
F8FF8AE9F8FF85E7F6FF7CE3F3FF74E0F0FF6FDDEEFF6FDDEEFF4DC4D5FF01B1
CAAD01B1CA3D01B1CA00000000000000000001AFC8AE95EDFBFF7EE6F7FF7CE5
F6FF7BE4F5FF79E3F4FF75E0F1FF70DBECFF6AD7E8FF67D5E6FF45BCCDFFBBF6
FFFF01AFC8AE01AFC83E000000000000000001ADC6AF97EDFBFF7FE7F8FF7EE6
F7FF7CE5F6FF7BE4F5FF79E3F4FF75E0F1FF70DBECFF6AD7E8FF37AEBFFF37AE
BFFF37AEBFFF0194ACBF000000000000000001AAC3B199EEFCFF81E9FAFF7FE7
F8FF7EE6F7FF7CE5F6FF7BE4F5FF79E3F4FF75E0F1FF70DBECFF6AD7E8FF67D5
E6FF6FDDEEFF01AAC3B1000000000000000001A7C0B39BEFFDFF82EAFBFF81E9
FAFF7FE7F8FF7EE6F7FF7CE5F6FF7BE4F5FF79E3F4FF75E0F1FF70DBECFF6AD7
E8FF6FDDEEFF01A7C0B3000000000000000001A4BCB59DF0FDFF84EBFCFF82EA
FBFF81E9FAFF7FE7F8FF7EE6F7FF7CE5F6FF7BE4F5FF79E3F4FF75E0F1FF70DB
ECFF74E0F0FF01A4BCB5000000000000000001A1B9B79EF1FEFF85ECFDFF84EB
FCFF82EAFBFF81E9FAFF7FE7F8FF7EE6F7FF7CE5F6FF7BE4F5FF79E3F4FF75E0
F1FF7CE3F3FF01A1B9B70000000000000000019EB5B9A0F1FFFF86ECFDFF85EC
FDFF84EBFCFF82EAFBFF81E9FAFF7FE7F8FF7EE6F7FF7CE5F6FF7BE4F5FF79E3
F4FF85E7F6FF019EB5B90000000000000000019AB2BBA1F2FFFF87EDFEFF86EC
FDFF85ECFDFF84EBFCFF82EAFBFF81E9FAFF7FE7F8FF7EE6F7FF7CE5F6FF7BE4
F5FF8AE9F8FF019AB2BB00000000000000000091A8C1AFF4FFFFA1F2FFFFA0F1
FFFF9EF1FEFF9CF0FDFF9BEFFDFF99EEFCFF97EDFBFF95EDFBFF92ECFAFF90EA
F9FF96ECFAFF0091A8C1000000000000000000869D9600859CC900859CC90085
9CC900859CC900859CC900859CC900859CC900859CC900859CC900859CC90085
9CC900859CC900869D9600000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B8875812B88758A5B887
58F9B88758FFB88758FFB88758FFB88758FFB88758FFB88758FFB88758FFB887
58BAB8875824FFFFFF00FFFFFF00FFFFFF00FFFFFF00B88758B1DAC1A9FFFDFC
FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFC9
B4FFB88758DBB8875806FFFFFF00FFFFFF00B887580CB88758FCFEFEFDFFFEF6
F0FFFEF2E9FFFEF1E6FFFEEFE4FFFEEEE1FFFEECDEFFFDEADBFFFDEADCFFFFFF
FFFFC7A07BFFB8875836FFFFFF00FFFFFF00B887581EC0956CFFFFFFFFFFFEF1
E8FFFEF0E6FFFEEFE3FFFEEDE0FFFEECDDFFFDEADBFFFDE8D7FFFDE6D5FFFFFF
FFFFCDAA89FFB887584BFFFFFF00FFFFFF00B887581EC0956CFFFFFFFFFFFEF0
E5FFFEEEE2FFFEEDE0FFFEEBDDFFFDE9DAFFFDE8D7FFFDE6D4FFFDE4D1FFFFFF
FFFFCDAA89FFB887584BFFFFFF00FFFFFF00B887580CB88758FCFEFEFDFFFEF2
E9FFFEECDFFFFDEBDCFFFDE9D9FFFDE7D6FFFDE6D3FFFDE4D0FFFCE4D1FFFFFF
FFFFC8A27DFFB8875839FFFFFF00FFFFFF00FFFFFF00B88758B1DAC1A9FFFEFE
FDFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEE2FFFDE3D0FFFEF2E9FFFFFFFFFFDFC9
B4FFB88758DBB8875809FFFFFF00FFFFFF00FFFFFF00B8875812B88758A5B887
58FCB88758FFB88758FFD5B89DFFFFFFFFFFFFFFFFFFF8F3EFFFD5B89DFFB887
58D3B8875824FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00B88758DCF5EEE7FFD5B89DFFB88758F7B887587DFFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00B887588DD4B699FFB88758F4B8875871FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00B8875822B88758DEB8875864FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D898
5223D4964D7DD2924CDBCD8C45F3CB8B41F3C98B40DBC78B407DC5873D23FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D6974F53D191
49E6D0A06AFFE0BFA0FFE3C5AEFFE3C5AEFFDFBC9FFFC89762FFBD7D35E6BC7E
3553FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D4964D53CF8D47F4D9B2
8CFFE6CDB8FFE0BA9DFFD7AB85FFD6A982FFD9B391FFE1C2ABFFD4AE86FFB16B
35F4B16F3553FFFFFF00FFFFFF00FFFFFF00D2934C22CE8E47E5D9B28CFFE6CA
B3FFD6A97DFFD1A579FFE2C4A8FFE1C3A8FFD0A276FFD1A477FFDDBDA2FFD0AC
85FFAB6635E5A9653522FFFFFF00FFFFFF00CE91477ECD9C68FFE7CBB4FFD4A5
7AFFD0A077FFCF9E74FFFBF8F5FFFBF8F5FFCB9E71FFCB9D71FFCDA177FFDFC0
A5FFB98A5BFFA45C347EFFFFFF00FFFFFF00CB8E41DBE0BC9FFFDBB393FFCFA0
75FFCD9E72FFCB9C71FFDDBFA3FFDDBFA2FFC5996BFFC5996BFFC4986BFFD1AB
85FFD8BA97FF9E5635DBFFFFFF00FFFFFF00C5853BF6E4C9B0FFD0A37AFFCC9D
71FFC79A6CFFC5986BFFFFFFFFFFFFFFFEFFC39669FFC19468FFC29468FFC398
6DFFDFC5ABFF955334F6FFFFFF00FFFFFF00BF7E35F6E3C7AFFFD0A276FFC599
6BFFC4976AFFC49669FFEEE0D4FFFBF7F4FFBF9066FFBE8F65FFBE8F64FFBE92
69FFDFC6AAFF925034F6FFFFFF00FFFFFF00BC7E35DBDBBC9CFFD5AD89FFC798
6CFFC39569FFC19367FFEDDFD3FFFAF7F4FFBB8B63FFB98A63FFB88A62FFC59D
78FFD2B893FF905135DBFFFFFF00FFFFFF00B878357EBF915EFFE0C2A8FFC596
6CFFC29169FFE1CBB8FFFEFDFCFFFFFFFEFFEADCD0FFB4855EFFB3855EFFD4B5
99FFAE7B56FF8F51357EFFFFFF00FFFFFF00AF703522AB6935E5CFAA81FFDABC
A2FFBE9166FFBA8C62FFB7895FFFB3845EFFB1835DFFB0835CFFCDAA8DFFC6A5
79FF895034E589503522FFFFFF00FFFFFF00FFFFFF00A76234539F5533F4CBA7
7DFFD8BB9FFFC39C77FFB68A62FFB48660FFBE9672FFD1B397FFC5A377FF844F
35F489503553FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009F5634539955
34E6B28057FFD5B793FFDBC3A6FFDAC3A6FFD2B490FFAB7A52FF864F34E68850
3553FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009754
35239453347D925234DB8A5034F3884F34F3895035DB8950357D84503623FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF0069452100694521006945210069452100694521006945210069452100FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EA84
6220EC866487EC8664D0EC8664F5EC8664F5EC8664D0EC866487EA8462206945
2100FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00DF7A5860E384
64EBEFB7A4FFFAE4DDFFFEF9F7FFFEF9F7FFFAE4DDFFEFB7A4FFE38464EBDF7A
586069452100FFFFFF00FFFFFF00FFFFFF00FFFFFF00CF6B4960D77F61F9F6E3
DCFFFCFCFCFFFBFBFBFFFBFBFBFFFBFBFBFFFBFBFBFFFCFCFCFFF6E3DCFFD77F
61F9CF6B4960FFFFFF00FFFFFF00FFFFFF00BF5C3A20C56747EBF2DFD9FFF8F8
F8FFF7F7F7FFC15D3BFFC15D3BFFC15D3BFFC15D3BFFE9D0C8FFF8F8F8FFF2DF
D9FFC56747EBBF5C3A20FFFFFF00FFFFFF00B34F2D87D49D8AFFF5F5F5FFF3F3
F3FFF3F3F3FFDAA998FFDAA998FFCF8E78FFB34F2DFFD3A190FFF3F3F3FFF5F5
F5FFD49C89FFB34F2D87FFFFFF00FFFFFF00AB4624D0EAD5CDFFF0F0F0FFF0F0
F0FFF0F0F0FFEBEBEBFFE0E0E0FFC89C8DFFAB4624FFBD8A79FFCECECEFFD2D1
D1FFDCC7C0FFAB4624D0FFFFFF00FFFFFF00AD4422F5F4EFEDFFEEEEEEFFEAEA
EAFFDCDBDBFFD3D1D1FFC7A69CFFAE4725FFC1735AFFDEDCDCFFD2D0D0FFD2D0
D0FFDFD8D7FFAD4422F5FFFFFF00FFFFFF00B74826F5F4EEEDFFE7E5E5FFDAD6
D6FFD8D4D4FFD8D4D4FFB74826FFB74826FFE3DFDFFFD8D4D4FFD8D4D4FFD8D4
D4FFE1D8D6FFB74826F5FFFFFF00FFFFFF00C5502ED0EAD0C8FFE1DADAFFE0D9
D9FFE0D9D9FFE0D9D9FFF1EDEDFFF1EDEDFFE0D9D9FFE0D9D9FFE0D9D9FFE0D9
D9FFE1C4BDFFC5502ED0FFFFFF00FFFFFF00D6593787E59D8AFFEAE2E2FFE7DF
DFFFE7DFDFFFE7DFDFFFD65937FFD65937FFE7DFDFFFE7DFDFFFE7DFDFFFE8E0
E0FFE19784FFD6593787FFFFFF00FFFFFF00E3603E20E66A4AEBF3D3CDFFF0E5
E5FFEFE4E4FFEFE4E4FFE5613FFFE5613FFFEFE4E4FFEFE4E4FFEFE4E4FFEFCD
C7FFE66A4AEBE3603E20FFFFFF00FFFFFF00FFFFFF00EE664460EF7659F9F7D4
CEFFF7E9E9FFF7E8E8FFFCF4F4FFFCF4F4FFF7E8E8FFF7E9E9FFF6D1CAFFEF76
58F9EE664460FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EE664460EF6F
4FEBF5A28FFFFAD1CAFFFCE7E5FFFCE6E5FFF9D1C9FFF4A18EFFEF6E4EEBEE66
4460FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EE66
4420EE664487EE6644D0EE6644F5EE6644F5EE6644D0EE664487EE664420FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF006945210069452100FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00
}
end
object MsgCtrlPopupMenu: TPopupMenu
OnPopup = MsgCtrlPopupMenuPopup
OnClose = MsgCtrlPopupMenuClose
left = 240
top = 25
object QuickFixesMenuItem: TMenuItem
Caption = 'QuickFixesMenuItem'
end
object FindMenuItem: TMenuItem
Caption = 'FindMenuItem'
OnClick = FindMenuItemClick
end
object HideSeparatorMenuItem: TMenuItem
Caption = '-'
end
object HideMsgOfTypeMenuItem: TMenuItem
Caption = 'HideMsgOfTypeMenuItem'
OnClick = HideMsgOfTypeMenuItemClick
end
object UnhideMsgTypeMenuItem: TMenuItem
Caption = 'UnhideMsgTypeMenuItem'
object UnhideMsgTypeSeparatorMenuItem: TMenuItem
Caption = '-'
end
object ClearHideMsgTypesMenuItem: TMenuItem
Caption = 'ClearHideMsgTypesMenuItem'
OnClick = ClearHideMsgTypesMenuItemClick
end
end
object HideBelowMenuItem: TMenuItem
Caption = 'HideBelowMenuItem'
object HideWarningsMenuItem: TMenuItem
AutoCheck = True
Caption = 'HideWarningsMenuItem'
GroupIndex = 1
RadioItem = True
OnClick = HideUrgencyMenuItemClick
end
object HideNotesMenuItem: TMenuItem
AutoCheck = True
Caption = 'HideNotesMenuItem'
GroupIndex = 1
RadioItem = True
OnClick = HideUrgencyMenuItemClick
end
object HideHintsMenuItem: TMenuItem
AutoCheck = True
Caption = 'HideHintsMenuItem'
GroupIndex = 1
RadioItem = True
OnClick = HideUrgencyMenuItemClick
end
object HideVerboseMenuItem: TMenuItem
AutoCheck = True
Caption = 'HideVerboseMenuItem'
GroupIndex = 1
RadioItem = True
OnClick = HideUrgencyMenuItemClick
end
object HideDebugMenuItem: TMenuItem
AutoCheck = True
Caption = 'HideDebugMenuItem'
GroupIndex = 1
RadioItem = True
OnClick = HideUrgencyMenuItemClick
end
object HideNoneMenuItem: TMenuItem
AutoCheck = True
Caption = 'HidenoneMenuItem'
GroupIndex = 1
RadioItem = True
OnClick = HideUrgencyMenuItemClick
end
end
object HideHintsWithoutPosMenuItem: TMenuItem
AutoCheck = True
Caption = 'HideHintsWithoutPosMenuItem'
Checked = True
OnClick = HideHintsWithoutPosMenuItemClick
end
object SwitchFilterMenuItem: TMenuItem
Caption = 'SwitchFilterMenuItem'
object FilterSeparatorMenuItem: TMenuItem
Caption = '-'
end
object AddFilterMenuItem: TMenuItem
Caption = 'AddFilterMenuItem'
OnClick = AddFilterMenuItemClick
end
end
object CopySeparatorMenuItem: TMenuItem
Caption = '-'
end
object CopyMenuItem: TMenuItem
Caption = 'CopyMenuItem'
object CopyFilenameMenuItem: TMenuItem
Caption = 'CopyFilenameMenuItem'
OnClick = CopyFilenameMenuItemClick
end
object CopyMsgMenuItem: TMenuItem
Caption = 'CopyMsgMenuItem'
OnClick = CopyMsgMenuItemClick
end
object CopyShownMenuItem: TMenuItem
Caption = 'CopyShownMenuItem'
OnClick = CopyShownMenuItemClick
end
object CopyAllMenuItem: TMenuItem
Caption = 'CopyAllMenuItem'
OnClick = CopyAllMenuItemClick
end
end
object SaveToFileMenuItem: TMenuItem
Caption = 'SaveToFileMenuItem'
object SaveAllToFileMenuItem: TMenuItem
Caption = 'SaveAllToFileMenuItem'
OnClick = SaveAllToFileMenuItemClick
end
object SaveShownToFileMenuItem: TMenuItem
Caption = 'SaveShownToFileMenuItem'
OnClick = SaveShownToFileMenuItemClick
end
end
object StyleSeparatorMenuItem: TMenuItem
Caption = '-'
end
object FilenameStyleMenuItem: TMenuItem
Caption = 'FilenameStyleMenuItem'
object FileStyleShortMenuItem: TMenuItem
AutoCheck = True
Caption = 'FileStyleShortMenuItem'
GroupIndex = 2
RadioItem = True
OnClick = FileStyleMenuItemClick
end
object FileStyleRelativeMenuItem: TMenuItem
AutoCheck = True
Caption = 'FileStyleRelativeMenuItem'
GroupIndex = 2
RadioItem = True
OnClick = FileStyleMenuItemClick
end
object FileStyleFullMenuItem: TMenuItem
AutoCheck = True
Caption = 'FileStyleFullMenuItem'
GroupIndex = 2
RadioItem = True
OnClick = FileStyleMenuItemClick
end
end
object TranslateMenuItem: TMenuItem
AutoCheck = True
Caption = 'TranslateMenuItem'
OnClick = TranslateMenuItemClick
end
object ShowIDMenuItem: TMenuItem
AutoCheck = True
Caption = 'ShowIDMenuItem'
OnClick = ShowIDMenuItemClick
end
object InfoSeparatorMenuItem: TMenuItem
Caption = '-'
end
object AboutToolMenuItem: TMenuItem
Caption = 'AboutToolMenuItem'
OnClick = AboutToolMenuItemClick
end
end
end

3524
ide/etmessageframe.pas Normal file

File diff suppressed because it is too large Load Diff

314
ide/etquickfixes.pas Normal file
View File

@ -0,0 +1,314 @@
{
***************************************************************************
* *
* This source is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This code 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. See the GNU *
* General Public License for more details. *
* *
* A copy of the GNU General Public License is available on the World *
* Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also *
* obtain it by writing to the Free Software Foundation, *
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
***************************************************************************
Author: Mattias Gaertner
Abstract:
Standard Quick Fixes - small tools to fix (compiler) messages.
}
unit etQuickFixes;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, IDEExternToolIntf, Menus, CodeToolManager, CodeCache,
LazLogger, AvgLvlTree, LazFileUtils;
type
{ TQuickFix_Hide }
TQuickFix_Hide = class(TMsgQuickFix)
public
function IsApplicable(Msg: TMessageLine): boolean;
procedure CreateMenuItems(Fixes: TMsgQuickFixes); override;
procedure QuickFix(Fixes: TMsgQuickFixes; Msg: TMessageLine); override;
end;
{ TIDEQuickFixes }
TIDEQuickFixes = class(TMsgQuickFixes)
private
FParentMenuItem: TMenuItem;
fMenuItemToInfo: TPointerToPointerTree; // TMenuItem to TMenuItemInfo
procedure MenuItemClick(Sender: TObject);
public
constructor Create(aOwner: TComponent); override;
destructor Destroy; override;
procedure OnPopupMenu(aParentMenuItem: TMenuItem);
procedure SetMsgLines(aMsg: TMessageLine);
procedure AddMsgLine(aMsg: TMessageLine);
procedure ClearLines;
function AddMenuItem(Fix: TMsgQuickFix; Msg: TMessageLine; aCaption: string;
aTag: PtrInt=0): TMenuItem; override;
property ParentMenuItem: TMenuItem read FParentMenuItem write FParentMenuItem;
end;
var
IDEQuickFixes: TIDEQuickFixes = nil;
implementation
type
TMenuItemInfo = class
public
MenuItem: TMenuItem;
Fix: TMsgQuickFix;
Msg: TMessageLine;
end;
{ TQuickFix_Hide }
procedure TQuickFix_Hide.QuickFix(Fixes: TMsgQuickFixes; Msg: TMessageLine);
var
Code: TCodeBuffer;
procedure Fix(CurMsg: TMessageLine);
var
p: integer;
aFilename: String;
begin
aFilename:=CurMsg.GetFullFilename;
if (Code=nil) or (CompareFilenames(aFilename,Code.Filename)<>0) then begin
Code:=CodeToolBoss.LoadFile(aFilename,true,false);
if Code=nil then begin
DebugLn(['TQuickFix_Hide.MenuItemClick ']);
// ToDo: IDEMessageDialog
exit;
end;
end;
Code.LineColToPosition(CurMsg.Line,CurMsg.Column,p);
if p<1 then begin
DebugLn(['TQuickFix_Hide failed because invalid line, column']);
{IDEMessageDialog(lisCCOErrorCaption,
Format(lisInvalidLineColumnInMessage, [LineEnding, Msg.Msg]),
mtError, [mbCancel]);}
exit;
end;
debugln(['TQuickFix_Hide.MenuItemClick ',Code.Filename,' ',CurMsg.Line,',',CurMsg.Column]);
Code.Insert(p,'{%H-}');
CurMsg.Flags:=CurMsg.Flags+[mlfHiddenByIDEDirectiveValid,mlfHiddenByIDEDirective];
CurMsg.MarkFixed;
end;
var
Tree: TAvgLvlTree;
Node: TAvgLvlTreeNode;
i: Integer;
begin
Tree:=TAvgLvlTree.Create(@CompareMsgLinesSrcPos);
try
// get all messages to hide and sort them for position
if Msg=nil then begin
for i:=0 to Fixes.LineCount-1 do begin
Msg:=Fixes.Lines[i];
if not IsApplicable(Msg) then continue;
Tree.Add(Msg);
end;
end else if IsApplicable(Msg) then
Tree.Add(Msg);
if Tree.Count=0 then exit;
{if not LazarusIDE.BeginCodeTools then begin
DebugLn(['TQuickFix_Hide failed because IDE busy']);
exit;
end;}
// insert marks beginning with the highest line,column
Code:=nil;
Node:=Tree.FindHighest;
while Node<>nil do begin
Msg:=TMessageLine(Node.Data);
Fix(Msg);
Node:=Node.Precessor;
end;
finally
Tree.Free;
end;
end;
function TQuickFix_Hide.IsApplicable(Msg: TMessageLine): boolean;
begin
Result:=false;
if (Msg.Urgency>=mluError)
or (Msg.Line<1) or (Msg.Column<1)
or (mlfHiddenByIDEDirective in Msg.Flags)
or (Msg.GetFullFilename='') then exit;
Result:=true;
end;
procedure TQuickFix_Hide.CreateMenuItems(Fixes: TMsgQuickFixes);
var
Msg: TMessageLine;
i: Integer;
List: TFPList;
aCaption: String;
aFilename: String;
MultiFile: Boolean;
begin
List:=TFPList.Create;
try
MultiFile:=false;
aFilename:='';
for i:=0 to Fixes.LineCount-1 do begin
Msg:=Fixes.Lines[i];
if not IsApplicable(Msg) then continue;
if aFilename='' then
aFilename:=Msg.GetFullFilename
else if CompareFilenames(aFilename,Msg.GetFullFilename)<>0 then
MultiFile:=true;
List.Add(Msg);
end;
if List.Count=0 then exit;
if List.Count>1 then
Fixes.AddMenuItem(Self,nil,'Hide all hints and warnings by inserting IDE directives {%H-}');
for i:=0 to List.Count-1 do begin
Msg:=TMessageLine(List[i]);
if MultiFile then
aCaption:=Msg.GetShortFilename
else
aCaption:='';
if List.Count>1 then
aCaption+='('+IntToStr(Msg.Line)+','+IntToStr(Msg.Column)+')';
if aCaption<>'' then
aCaption:='Hide message at '+aCaption+' by inserting IDE directive {%H-}'
else
aCaption:='Hide message by inserting IDE directive {%H-}';
Fixes.AddMenuItem(Self,Msg,aCaption);
end;
finally
List.Free;
end;
end;
{ TIDEQuickFixes }
procedure TIDEQuickFixes.MenuItemClick(Sender: TObject);
var
i: Integer;
Info: TMenuItemInfo;
ListsMsgLines: TFPList;
MsgLines: TMessageLines;
begin
Info:=TMenuItemInfo(fMenuItemToInfo[Sender]);
if Info=nil then exit;
try
Info.Fix.QuickFix(Self,Info.Msg);
finally
ListsMsgLines:=TFPList.Create;
try
for i:=0 to LineCount-1 do begin
MsgLines:=Lines[i].Lines;
if ListsMsgLines.IndexOf(MsgLines)>=0 then continue;
ListsMsgLines.Add(MsgLines);
end;
for i:=0 to ListsMsgLines.Count-1 do
TMessageLines(ListsMsgLines[i]).ApplyFixedMarks;
finally
ListsMsgLines.Free;
end;
end;
end;
constructor TIDEQuickFixes.Create(aOwner: TComponent);
begin
inherited Create(aOwner);
IDEQuickFixes:=Self;
MsgQuickFixes:=Self;
fMenuItemToInfo:=TPointerToPointerTree.Create;
// init standard quickfixes
IDEQuickFixes.RegisterQuickFix(TQuickFix_Hide.Create(nil));
end;
destructor TIDEQuickFixes.Destroy;
begin
FreeAndNil(fMenuItemToInfo);
MsgQuickFixes:=nil;
IDEQuickFixes:=nil;
inherited Destroy;
end;
procedure TIDEQuickFixes.OnPopupMenu(aParentMenuItem: TMenuItem);
var
i: Integer;
begin
ParentMenuItem:=aParentMenuItem;
try
if LineCount=0 then exit;
for i:=0 to Count-1 do
Items[i].CreateMenuItems(Self);
finally
ParentMenuItem:=nil;
end;
end;
procedure TIDEQuickFixes.SetMsgLines(aMsg: TMessageLine);
begin
ClearLines;
if aMsg<>nil then
fMsg.Add(aMsg);
end;
procedure TIDEQuickFixes.AddMsgLine(aMsg: TMessageLine);
begin
if (aMsg<>nil) and (fMsg.IndexOf(aMsg)<0) then
fMsg.Add(aMsg);
end;
procedure TIDEQuickFixes.ClearLines;
var
i: Integer;
begin
fMenuItemToInfo.Clear;
for i:=ComponentCount-1 downto 0 do
if Components[i] is TMenuItem then
Components[i].Free;
fMsg.Clear;
end;
function TIDEQuickFixes.AddMenuItem(Fix: TMsgQuickFix; Msg: TMessageLine;
aCaption: string; aTag: PtrInt): TMenuItem;
var
Info: TMenuItemInfo;
begin
if (Fix=nil) then
raise Exception.Create('missing Fix');
if (aCaption='') then
raise Exception.Create('missing Caption');
if (ParentMenuItem.Count>50) then exit(nil);
Result:=TMenuItem.Create(Self);
Info:=TMenuItemInfo.Create;
Info.MenuItem:=Result;
Info.Fix:=Fix;
Info.Msg:=Msg;
fMenuItemToInfo[Result]:=Info;
Result.Caption:=aCaption;
Result.Tag:=aTag;
Result.OnClick:=@MenuItemClick;
ParentMenuItem.Add(Result);
end;
end.

1073
ide/etsrceditmarks.pas Normal file

File diff suppressed because it is too large Load Diff

View File

@ -66,7 +66,7 @@
<PackageName Value="SynEdit"/>
</Item7>
</RequiredPackages>
<Units Count="103">
<Units Count="108">
<Unit0>
<Filename Value="lazarus.pp"/>
<IsPartOfProject Value="True"/>
@ -784,6 +784,32 @@
<IsPartOfProject Value="True"/>
<UnitName Value="ConvertDelphi"/>
</Unit102>
<Unit103>
<Filename Value="etfpcmsgparser.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="etFPCMsgParser"/>
</Unit103>
<Unit104>
<Filename Value="etmakemsgparser.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="etMakeMsgParser"/>
</Unit104>
<Unit105>
<Filename Value="etmessageframe.pas"/>
<IsPartOfProject Value="True"/>
<HasResources Value="True"/>
<UnitName Value="etMessageFrame"/>
</Unit105>
<Unit106>
<Filename Value="etquickfixes.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="etQuickFixes"/>
</Unit106>
<Unit107>
<Filename Value="etsrceditmarks.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="etSrcEditMarks"/>
</Unit107>
</Units>
</ProjectOptions>
<CompilerOptions>