IDE: further migration external tools

git-svn-id: trunk@42584 -
This commit is contained in:
mattias 2013-09-04 09:15:41 +00:00
parent 2d4a9df1ad
commit fa26364e98
10 changed files with 430 additions and 568 deletions

View File

@ -698,7 +698,7 @@ type
RealTargetOS: string;
RealTargetCPU: string;
RealCompilerInPath: string; // the ppc<target> in PATH
FullVersion: string;
FullVersion: string; // Version.Release.Patch
ConfigFiles: TFPCConfigFileStateList;
UnitPaths: TStrings;
Defines: TStringToStringTree; // macro to value
@ -902,6 +902,8 @@ type
property ConfigCaches: TFPCTargetConfigCaches read FConfigCaches write SetConfigCaches;
property TestFilename: string read FTestFilename write FTestFilename; // an empty file to test the compiler, will be auto created
property ExtraOptions: string read FExtraOptions write FExtraOptions; // additional compiler options not used as key
function GetFPCVersion(const CompilerFilename, TargetOS, TargetCPU: string;
UseCompiledVersionAsDefault: boolean): string;
function FindUnitSet(const CompilerFilename, TargetOS, TargetCPU,
Options, FPCSrcDir: string;
CreateIfNotExists: boolean): TFPCUnitSetCache;
@ -926,6 +928,7 @@ function GetCompiledTargetCPU: string;
function GetDefaultCompilerFilename(const TargetCPU: string = ''; Cross: boolean = false): string;
function GetFPCTargetOS(TargetOS: string): string;
function GetFPCTargetCPU(TargetCPU: string): string;
function IsFPCExecutable(const CompilerFilename: string): boolean;
// functions to quickly setup some defines
function CreateDefinesInDirectories(const SourcePaths, FlagName: string
@ -2660,6 +2663,19 @@ begin
Result:=LowerCase(TargetCPU);
end;
function IsFPCExecutable(const CompilerFilename: string): boolean;
var
ShortFilename: String;
begin
Result:=false;
if not FilenameIsAbsolute(CompilerFilename) then exit;
if CompareFilenames(ExtractFileExt(CompilerFilename),ExeExt)<>0 then exit;
ShortFilename:=ExtractFileNameOnly(CompilerFilename);
if (CompareFilenames(ShortFilename,'fpc')<>0)
and (CompareFilenames(LeftStr(ShortFilename,3),'ppc')<>0) then exit;
Result:=true;
end;
function CreateDefinesInDirectories(const SourcePaths, FlagName: string
): TDefineTemplate;
var
@ -7443,7 +7459,7 @@ begin
if FileExistsCached(Compiler) then begin
ExtraOptions:=GetFPCInfoCmdLineOptions(ExtraOptions);
// get real OS and CPU
// get version and real OS and CPU
InfoTypes:=[fpciTargetOS,fpciTargetProcessor,fpciFullVersion];
Info:=RunFPCInfo(Compiler,InfoTypes,ExtraOptions);
if ParseFPCInfo(Info,InfoTypes,Infos) then begin
@ -8333,6 +8349,22 @@ begin
Result:=false;
end;
function TFPCDefinesCache.GetFPCVersion(const CompilerFilename, TargetOS,
TargetCPU: string; UseCompiledVersionAsDefault: boolean): string;
var
CfgCache: TFPCTargetConfigCache;
begin
if UseCompiledVersionAsDefault then
Result:={$I %FPCVersion%}
else
Result:='';
if not IsFPCExecutable(CompilerFilename) then exit;
CfgCache:=ConfigCaches.Find(CompilerFilename,ExtraOptions,TargetOS,TargetCPU,true);
if not CfgCache.Update(TestFilename,ExtraOptions) then exit;
if CfgCache.FullVersion='' then exit;
Result:=CfgCache.FullVersion;
end;
function TFPCDefinesCache.FindUnitSet(const CompilerFilename, TargetOS,
TargetCPU, Options, FPCSrcDir: string; CreateIfNotExists: boolean
): TFPCUnitSetCache;

View File

@ -241,7 +241,8 @@ type
FTool: TAbstractExternalTool;
public
destructor Destroy; override; // (main thread)
procedure Init; virtual; // called if process started, before first line (worker thread)
procedure Init; virtual; // called after macros resolved, before starting thread (main thread)
procedure InitReading; virtual; // called if process started, before first line (worker thread)
procedure Done; virtual; // called after process stopped (worker thread)
procedure ReadLine(Line: string; OutputIndex: integer; var Handled: boolean); virtual; abstract; // (worker thread)
function CreateMsgLine(OutputIndex: integer): TMessageLine; // (worker thread)
@ -380,6 +381,7 @@ type
FFreeData: boolean;
FGroup: TExternalToolGroup;
FResolveMacrosOnExecute: boolean;
FThread: TThread;
FWorkerDirectory: string;
FWorkerMessages: TMessageLines;
FParsers: TFPList; // list of TExtToolParser
@ -418,6 +420,7 @@ type
destructor Destroy; override;
procedure EnterCriticalSection; virtual; // always use before access
procedure LeaveCriticalSection; virtual;
property Thread: TThread read FThread write FThread;
procedure ConsistencyCheck; virtual;
property Title: string read FTitle write SetTitle;
@ -1223,6 +1226,11 @@ begin
end;
procedure TExtToolParser.InitReading;
begin
end;
procedure TExtToolParser.Done;
begin

View File

@ -129,7 +129,6 @@ type
function CTMacroFuncProjectIncPath(Data: Pointer): boolean;
function CTMacroFuncProjectSrcPath(Data: Pointer): boolean;
{$IFDEF EnableNewExtTools}
procedure FPCMsgFilePoolLoadFile(aFilename: string; out s: string);
{$ELSE}
function OnRunCompilerWithOptions(ExtTool: TIDEExternalToolOptions;
CompOptions: TBaseCompilerOptions): TModalResult;
@ -492,7 +491,6 @@ begin
ExternalToolList.RegisterParser(TDefaultParser);
FPCMsgFilePool:=TFPCMsgFilePool.Create(nil);
FPCMsgFilePool.OnLoadFile:=@FPCMsgFilePoolLoadFile;
end;
{$ENDIF}
@ -1920,6 +1918,8 @@ function TBuildManager.MacroFuncFPCVer(const Param: string; const Data: PtrInt;
CompilerFilename: String;
ConfigCache: TFPCTargetConfigCache;
begin
if OverrideFPCVer<>'' then
exit(OverrideFPCVer);
Result:={$I %FPCVERSION%}; // Version.Release.Patch
if CodeToolBoss<>nil then begin
// fetch the FPC version from the current compiler
@ -2115,25 +2115,6 @@ begin
end;
{$IFDEF EnableNewExtTools}
procedure TBuildManager.FPCMsgFilePoolLoadFile(aFilename: string; out s: string
);
// Note: called by any thread
var
fs: TFileStreamUTF8;
Encoding: String;
begin
s:='';
fs := TFileStreamUTF8.Create(aFilename, fmOpenRead or fmShareDenyNone);
try
SetLength(s,fs.Size);
if s<>'' then
fs.Read(s[1],length(s));
Encoding:=GuessEncoding(s);
s:=ConvertEncoding(s,Encoding,EncodingUTF8);
finally
fs.Free;
end;
end;
{$ELSE EnableNewExtTools}
function TBuildManager.OnRunCompilerWithOptions(
ExtTool: TIDEExternalToolOptions; CompOptions: TBaseCompilerOptions): TModalResult;

View File

@ -410,7 +410,7 @@ type
function GetParsedLazarusDirectory: string;
function GetParsedTestBuildDirectory: string;
function GetParsedCompilerFilename: string;
function GetParsedFPCSourceDirectory: string;
function GetParsedFPCSourceDirectory(FPCVer: string = ''): string;
function GetParsedMakeFilename: string;
function GetParsedCompilerMessagesFilename: string;
function GetParsedFPDocPaths: string;
@ -658,6 +658,7 @@ type
end;
var
OverrideFPCVer: string = '';
EnvironmentOptions: TEnvironmentOptions = nil;
function PascalExtToType(const Ext: string): TPascalExtType;
@ -1785,8 +1786,28 @@ begin
Result:=GetParsedValue(eopTestBuildDirectory);
end;
function TEnvironmentOptions.GetParsedFPCSourceDirectory: string;
function TEnvironmentOptions.GetParsedFPCSourceDirectory(FPCVer: string
): string;
var
s: String;
begin
if (FPCVer<>'') and (Pos('$(',FPCSourceDirectory)>0) then begin
s:='$(FPCVer)';
GlobalMacroList.SubstituteStr(s);
if s<>FPCVer then begin
// override macro FPCVer
OverrideFPCVer:=FPCVer;
IncreaseCompilerParseStamp;
try
Result:=GetParsedValue(eopFPCSourceDirectory);
debugln(['TEnvironmentOptions.GetParsedFPCSourceDirectory FPCVer=',FPCVer,' FPCSrcDir=',Result]);
finally
OverrideFPCVer:='';
IncreaseCompilerParseStamp;
end;
exit;
end;
end;
Result:=GetParsedValue(eopFPCSourceDirectory);
end;

View File

@ -32,8 +32,8 @@ interface
uses
Classes, SysUtils, strutils, FileProcs, KeywordFuncLists, IDEExternToolIntf,
PackageIntf, LazIDEIntf, ProjectIntf, CodeToolsFPCMsgs, CodeToolsStructs,
CodeCache, CodeToolManager, DirectoryCacher, BasicCodeTools, LazUTF8,
etMakeMsgParser, EnvironmentOpts;
CodeCache, CodeToolManager, DirectoryCacher, BasicCodeTools, DefineTemplates,
LazUTF8, FileUtil, etMakeMsgParser, EnvironmentOpts;
type
TFPCMsgFilePool = class;
@ -59,22 +59,30 @@ type
TETLoadFileEvent = procedure(aFilename: string; out s: string) of object;
{ TFPCMsgFilePool }
TFPCMsgFilePool = class(TComponent)
private
fCritSec: TRTLCriticalSection;
FDefaultEnglishFile: string;
FDefaultLocaleFile: string;
FDefaultTranslationFile: string;
FFiles: TFPList; // list of TFPCMsgFilePoolItem sorted for loaded
FOnLoadFile: TETLoadFileEvent;
fPendingLog: TStrings;
procedure Log(Msg: string; AThread: TThread);
procedure LogSync;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function LoadFile(aFilename: string; UpdateFromDisk: boolean): TFPCMsgFilePoolItem;
procedure UnloadFile(var aFile: TFPCMsgFilePoolItem);
function LoadFile(aFilename: string; UpdateFromDisk: boolean;
AThread: TThread): TFPCMsgFilePoolItem;
procedure UnloadFile(var aFile: TFPCMsgFilePoolItem; AThread: TThread);
procedure EnterCriticalsection;
procedure LeaveCriticalSection;
procedure GetMsgFileNames(CompilerFilename, TargetOS, TargetCPU: string;
out anEnglishFile, aTranslationFile: string); // (main thread)
property DefaultEnglishFile: string read FDefaultEnglishFile write FDefaultEnglishFile;
property DefaultLocaleFile: string read FDefaultLocaleFile write FDefaultLocaleFile;
property DefaulTranslationFile: string read FDefaultTranslationFile write FDefaultTranslationFile;
property OnLoadFile: TETLoadFileEvent read FOnLoadFile write FOnLoadFile; // (main or workerthread)
end;
@ -146,8 +154,9 @@ type
TranslationFile: TFPCMsgFilePoolItem;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Init; override; // called before reading the output
procedure Done; override;
procedure Init; override; // called after macros resolved, before starting thread (main thread)
procedure InitReading; override; // called if process started, before first line (worker thread)
procedure Done; override; // called after process stopped (worker thread)
procedure ReadLine(Line: string; OutputIndex: integer; var Handled: boolean); override;
function LongenFilename(aFilename: string): string;
procedure ImproveMessages(aSynchronized: boolean); override;
@ -599,11 +608,36 @@ end;
{ TFPCMsgFilePool }
procedure TFPCMsgFilePool.Log(Msg: string; AThread: TThread);
begin
EnterCriticalsection;
try
fPendingLog.Add(Msg);
finally
LeaveCriticalSection;
end;
if AThread<>nil then
LogSync
else
TThread.Synchronize(AThread,@LogSync);
end;
procedure TFPCMsgFilePool.LogSync;
begin
EnterCriticalsection;
try
dbgout(fPendingLog.Text);
finally
LeaveCriticalSection;
end;
end;
constructor TFPCMsgFilePool.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
InitCriticalSection(fCritSec);
FFiles:=TFPList.Create;
fPendingLog:=TStringList.Create;
end;
destructor TFPCMsgFilePool.Destroy;
@ -629,29 +663,52 @@ begin
if FPCMsgFilePool=Self then
FPCMsgFilePool:=nil;
inherited Destroy;
FreeAndNil(fPendingLog);
finally
LeaveCriticalSection;
end;
DoneCriticalsection(fCritSec);
end;
function TFPCMsgFilePool.LoadFile(aFilename: string; UpdateFromDisk: boolean
): TFPCMsgFilePoolItem;
function TFPCMsgFilePool.LoadFile(aFilename: string; UpdateFromDisk: boolean;
AThread: TThread): TFPCMsgFilePoolItem;
var
IsMainThread: Boolean;
procedure ResultOutdated;
begin
// cached file needs update
if Result.fUseCount=0 then begin
FFiles.Remove(Result);
Result.Free;
end;
Result:=nil;
end;
function FileExists: boolean;
begin
if IsMainThread then
Result:=FileExistsCached(aFilename)
else
Result:=FileExistsUTF8(aFilename);
end;
var
Item: TFPCMsgFilePoolItem;
i: Integer;
NewItem: TFPCMsgFilePoolItem;
FileTxt: string;
Code: TCodeBuffer;
begin
Result:=nil;
if aFilename='' then exit;
aFilename:=TrimAndExpandFilename(aFilename);
//debugln(['TFPCMsgFilePool.LoadFile ',aFilename]);
//Log('TFPCMsgFilePool.LoadFile '+aFilename,aThread);
IsMainThread:=GetThreadID=MainThreadID;
if UpdateFromDisk then begin
// Note: do not use FileExistsCached, called by threads
if not FileExistsUTF8(aFilename) then begin
debugln(['TFPCMsgFilePool.LoadFile file not found: ',aFilename]);
if not FileExists then begin
Log('TFPCMsgFilePool.LoadFile file not found: '+aFilename,AThread);
exit;
end;
end;
@ -665,19 +722,21 @@ begin
Result:=Item;
break;
end;
Code:=nil;
if UpdateFromDisk then begin
if (Result<>nil)
and (FileAgeUTF8(aFilename)<>Result.LoadedFileAge) then begin
// cached file needs update
if Result.fUseCount=0 then begin
FFiles.Remove(Result);
Result.Free;
end;
Result:=nil;
if IsMainThread then begin
Code:=CodeToolBoss.LoadFile(aFilename,true,false);
if (Code<>nil) and (Result<>nil) and (Code.FileDateOnDisk<>Result.LoadedFileAge)
then
ResultOutdated;
end else begin
if (Result<>nil)
and (FileAgeUTF8(aFilename)<>Result.LoadedFileAge) then
ResultOutdated;
end;
end else if Result=nil then begin
// not yet loaded, not yet checked if file exists -> check now
if not FileExistsUTF8(aFilename) then
if not FileExists then
exit;
end;
@ -687,20 +746,30 @@ begin
end else begin
// load for the first time
NewItem:=TFPCMsgFilePoolItem.Create(Self,aFilename);
//debugln(['TFPCMsgFilePool.LoadFile ',NewItem.FFile<>nil,' ',aFilename]);
//Log('TFPCMsgFilePool.LoadFile '+dbgs(NewItem.FFile<>nil)+' '+aFilename,aThread);
if Assigned(OnLoadFile) then begin
OnLoadFile(aFilename,FileTxt);
NewItem.FFile.LoadFromText(FileTxt);
NewItem.FLoadedFileAge:=FileAgeUTF8(aFilename);
end else begin
NewItem.FFile.LoadFromFile(aFilename);
if IsMainThread then begin
if Code=nil then
Code:=CodeToolBoss.LoadFile(aFilename,true,false);
if Code=nil then
exit;
NewItem.FFile.LoadFromText(Code.Source);
NewItem.FLoadedFileAge:=Code.FileDateOnDisk;
end else begin
NewItem.FFile.LoadFromFile(aFilename);
NewItem.FLoadedFileAge:=FileAgeUTF8(aFilename);
end;
end;
NewItem.FLoadedFileAge:=FileAgeUTF8(aFilename);
// load successful
Result:=NewItem;
NewItem:=nil;
FFiles.Add(Result);
inc(Result.fUseCount);
//debugln(['TFPCMsgFilePool.LoadFile ',Result.Filename,' ',Result.fUseCount]);
//log('TFPCMsgFilePool.LoadFile '+Result.Filename+' '+dbgs(Result.fUseCount),aThread);
end;
finally
FreeAndNil(NewItem);
@ -708,7 +777,8 @@ begin
end;
end;
procedure TFPCMsgFilePool.UnloadFile(var aFile: TFPCMsgFilePoolItem);
procedure TFPCMsgFilePool.UnloadFile(var aFile: TFPCMsgFilePoolItem;
AThread: TThread);
var
i: Integer;
Item: TFPCMsgFilePoolItem;
@ -721,7 +791,7 @@ begin
if FFiles.IndexOf(aFile)<0 then
raise Exception.Create('TFPCMsgFilePool.UnloadFile unknown, maybe already freed');
dec(aFile.fUseCount);
//debugln(['TFPCMsgFilePool.UnloadFile ',aFile.Filename,' UseCount=',aFile.fUseCount]);
//log('TFPCMsgFilePool.UnloadFile '+aFile.Filename+' UseCount='+dbgs(aFile.fUseCount),aThread);
if aFile.fUseCount>0 then exit;
// not used anymore
if not FileExistsUTF8(aFile.Filename) then begin
@ -742,7 +812,7 @@ begin
if Keep then begin
// this file is the newest version => keep it in cache
end else begin
//debugln(['TFPCMsgFilePool.UnloadFile free: ',aFile.Filename]);
//log('TFPCMsgFilePool.UnloadFile free: '+aFile.Filename,aThread);
FFiles.Remove(aFile);
aFile.Free;
end;
@ -762,6 +832,28 @@ begin
System.LeaveCriticalsection(fCritSec);
end;
procedure TFPCMsgFilePool.GetMsgFileNames(CompilerFilename, TargetOS,
TargetCPU: string; out anEnglishFile, aTranslationFile: string);
var
FPCVer: String;
FPCSrcDir: String;
aFilename: String;
begin
anEnglishFile:=DefaultEnglishFile;
aTranslationFile:=DefaulTranslationFile;
if IsFPCExecutable(CompilerFilename) then
FPCVer:=CodeToolBoss.FPCDefinesCache.GetFPCVersion(CompilerFilename,TargetOS,TargetCPU,false)
else
FPCVer:='';
FPCSrcDir:=EnvironmentOptions.GetParsedFPCSourceDirectory(FPCVer);
if FilenameIsAbsolute(FPCSrcDir) then begin
aFilename:=AppendPathDelim(FPCSrcDir)+SetDirSeparators('compiler/msg/errore.msg');
if FileExistsCached(aFilename) then
anEnglishFile:=aFilename;
// ToDo: translation
end;
end;
{ TFPCMsgFilePoolItem }
constructor TFPCMsgFilePoolItem.Create(aPool: TFPCMsgFilePool;
@ -792,9 +884,9 @@ begin
FreeAndNil(fFileExists);
FreeAndNil(fLastSource);
if TranslationFile<>nil then
FPCMsgFilePool.UnloadFile(TranslationFile);
FPCMsgFilePool.UnloadFile(TranslationFile,nil);
if MsgFile<>nil then
FPCMsgFilePool.UnloadFile(MsgFile);
FPCMsgFilePool.UnloadFile(MsgFile,nil);
FreeAndNil(DirectoryStack);
FreeAndNil(fLineToMsgID);
inherited Destroy;
@ -807,7 +899,7 @@ procedure TIDEFPCParser.Init;
//debugln(['TFPCParser.Init load Msg filename=',aFilename]);
if (aFilename<>'') and (List=nil) then begin
try
List:=FPCMsgFilePool.LoadFile(aFilename,true);
List:=FPCMsgFilePool.LoadFile(aFilename,true,nil);
except
on E: Exception do begin
debugln(['TFPCParser.Init failed to load file '+aFilename+': '+E.Message]);
@ -817,11 +909,40 @@ procedure TIDEFPCParser.Init;
end;
var
Item: TFPCMsgItem;
i: Integer;
Param: String;
p: PChar;
aTargetOS: String;
aTargetCPU: String;
begin
inherited Init;
if FPCMsgFilePool<>nil then begin
aTargetOS:='';
aTargetCPU:='';
for i:=0 to Tool.Process.Parameters.Count-1 do begin
Param:=Tool.Process.Parameters[i];
if Param='' then continue;
p:=PChar(Param);
if p^<>'-' then continue;
if p[1]='T' then
aTargetOS:=copy(Param,3,255)
else if p[1]='P' then
aTargetCPU:=copy(Param,3,255);
end;
FPCMsgFilePool.GetMsgFileNames(Tool.Process.Executable,aTargetOS,aTargetCPU,
MsgFilename,TranslationFilename);
end;
LoadMsgFile(MsgFilename,MsgFile);
LoadMsgFile(TranslationFilename,TranslationFile);
end;
procedure TIDEFPCParser.InitReading;
var
Item: TFPCMsgItem;
begin
inherited InitReading;
fLineToMsgID.Clear;
// FPC logo lines
@ -1571,10 +1692,6 @@ end;
constructor TIDEFPCParser.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
if FPCMsgFilePool<>nil then begin
MsgFilename:=FPCMsgFilePool.DefaultEnglishFile;
TranslationFilename:=FPCMsgFilePool.DefaultLocaleFile;
end;
fLineToMsgID:=TPatternToMsgIDs.Create;
fFileExists:=TFilenameToPointerTree.Create(false);
end;
@ -1984,14 +2101,14 @@ begin
Result:='';
if CompareText(SubTool,SubToolFPC)=0 then begin
if FPCMsgFilePool=nil then exit;
CurMsgFile:=FPCMsgFilePool.LoadFile(FPCMsgFilePool.DefaultEnglishFile,false);
CurMsgFile:=FPCMsgFilePool.LoadFile(FPCMsgFilePool.DefaultEnglishFile,false,nil);
if CurMsgFile=nil then exit;
try
MsgItem:=CurMsgFile.GetMsg(MsgID);
if MsgItem=nil then exit;
Result:=MsgItem.GetTrimmedComment(false,true);
finally
FPCMsgFilePool.UnloadFile(CurMsgFile);
FPCMsgFilePool.UnloadFile(CurMsgFile,nil);
end;
end;
end;
@ -2005,14 +2122,14 @@ begin
Result:='';
if CompareText(SubTool,SubToolFPC)=0 then begin
if FPCMsgFilePool=nil then exit;
CurMsgFile:=FPCMsgFilePool.LoadFile(FPCMsgFilePool.DefaultEnglishFile,false);
CurMsgFile:=FPCMsgFilePool.LoadFile(FPCMsgFilePool.DefaultEnglishFile,false,nil);
if CurMsgFile=nil then exit;
try
MsgItem:=CurMsgFile.GetMsg(MsgID);
if MsgItem=nil then exit;
Result:=MsgItem.Pattern;
finally
FPCMsgFilePool.UnloadFile(CurMsgFile);
FPCMsgFilePool.UnloadFile(CurMsgFile,nil);
end;
end;
end;

View File

@ -51,7 +51,7 @@ type
DefaultDirectory: string;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Init; override;
procedure InitReading; override;
procedure ReadLine(Line: string; OutputIndex: integer; var Handled: boolean); override;
class function DefaultSubTool: string; override;
class function Priority: integer; override;
@ -232,10 +232,10 @@ begin
inherited Destroy;
end;
procedure TIDEMakeParser.Init;
procedure TIDEMakeParser.InitReading;
begin
DefaultDirectory:=Tool.WorkerDirectory;
inherited Init;
inherited InitReading;
end;
procedure TIDEMakeParser.ReadLine(Line: string; OutputIndex: integer;

View File

@ -5,25 +5,24 @@ object MessagesFrame: TMessagesFrame
Width = 444
ClientHeight = 106
ClientWidth = 444
LCLVersion = '1.1'
TabOrder = 0
DesignLeft = 297
DesignTop = 171
object SearchPanel: TPanel
Left = 0
Height = 27
Top = 79
Height = 24
Top = 82
Width = 444
Align = alBottom
AutoSize = True
ClientHeight = 27
ClientHeight = 24
ClientWidth = 444
TabOrder = 0
object SearchEdit: TEdit
AnchorSideLeft.Control = HideSearchSpeedButton
AnchorSideLeft.Side = asrBottom
Left = 34
Height = 25
Height = 22
Top = 1
Width = 200
BorderSpacing.Left = 10
@ -41,47 +40,11 @@ object MessagesFrame: TMessagesFrame
AnchorSideBottom.Control = SearchEdit
AnchorSideBottom.Side = asrBottom
Left = 234
Height = 25
Height = 22
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
@ -93,47 +56,11 @@ object MessagesFrame: TMessagesFrame
AnchorSideBottom.Control = SearchNextSpeedButton
AnchorSideBottom.Side = asrBottom
Left = 257
Height = 25
Height = 22
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
@ -144,283 +71,16 @@ object MessagesFrame: TMessagesFrame
AnchorSideBottom.Control = SearchPanel
AnchorSideBottom.Side = asrBottom
Left = 1
Height = 25
Height = 22
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

View File

@ -36,7 +36,7 @@ uses
LazUTF8Classes, LazFileUtils, LazUTF8, AvgLvlTree, SynEdit,
LResources, Forms, Buttons, ExtCtrls, Controls, LMessages, LCLType, Graphics,
LCLIntf, Themes, ImgList, GraphType, Menus, Clipbrd, Dialogs, StdCtrls,
IDEExternToolIntf, etSrcEditMarks, etQuickFixes;
IDEExternToolIntf, IDEImagesIntf, MenuIntf, etSrcEditMarks, etQuickFixes;
const
CustomViewCaption = '------------------------------';
@ -221,7 +221,7 @@ type
FHeaderBackground: array[TLMVToolState] of TColor;
FIdleConnected: boolean;
FImageChangeLink: TChangeLink;
FImages: TImageList;
FImages: TCustomImageList;
FItemHeight: integer;
FOnAllViewsStopped: TNotifyEvent;
FOnOpenMessage: TOnOpenMessageLine;
@ -253,7 +253,7 @@ type
procedure SetActiveFilter(AValue: TLMsgViewFilter);
procedure SetHeaderBackground(aToolState: TLMVToolState; AValue: TColor);
procedure SetIdleConnected(AValue: boolean);
procedure SetImages(AValue: TImageList);
procedure SetImages(AValue: TCustomImageList);
procedure SetItemHeight(AValue: integer);
procedure SetOptions(NewOptions: TMsgCtrlOptions);
procedure SetScrollLeft(AValue: integer);
@ -368,7 +368,7 @@ type
property BackgroundColor: TColor read FBackgroundColor write SetBackgroundColor default MCDefaultBackground;
property HeaderBackground[aToolState: TLMVToolState]: TColor read GetHeaderBackground write SetHeaderBackground;
property AutoHeaderBackground: TColor read FAutoHeaderBackground write SetAutoHeaderBackground default MCDefaultAutoHeaderBackground;
property Images: TImageList read FImages write SetImages;
property Images: TCustomImageList read FImages write SetImages;
property UrgencyStyles[Urgency: TMessageLineUrgency]: TMsgCtrlUrgencyStyle read GetUrgencyStyles write SetUrgencyStyles;
property SearchText: string read FSearchText write SetSearchText;
property IdleConnected: boolean read FIdleConnected write SetIdleConnected;
@ -383,48 +383,13 @@ type
{ TMessagesFrame }
TMessagesFrame = class(TFrame)
AboutToolMenuItem: TMenuItem;
AddFilterMenuItem: TMenuItem;
ClearHideMsgTypesMenuItem: TMenuItem;
CopyAllMenuItem: TMenuItem;
CopyFilenameMenuItem: TMenuItem;
CopyMenuItem: TMenuItem;
CopyMsgMenuItem: TMenuItem;
CopySeparatorMenuItem: TMenuItem;
CopyShownMenuItem: TMenuItem;
FilenameStyleMenuItem: TMenuItem;
FileStyleFullMenuItem: TMenuItem;
FileStyleRelativeMenuItem: TMenuItem;
FileStyleShortMenuItem: TMenuItem;
FilterSeparatorMenuItem: TMenuItem;
FindMenuItem: TMenuItem;
HideBelowMenuItem: TMenuItem;
HideDebugMenuItem: TMenuItem;
HideHintsMenuItem: TMenuItem;
HideHintsWithoutPosMenuItem: TMenuItem;
HideMsgOfTypeMenuItem: TMenuItem;
HideNoneMenuItem: TMenuItem;
HideNotesMenuItem: TMenuItem;
HideSearchSpeedButton: TSpeedButton;
HideSeparatorMenuItem: TMenuItem;
HideVerboseMenuItem: TMenuItem;
HideWarningsMenuItem: TMenuItem;
ImageList1: TImageList;
InfoSeparatorMenuItem: TMenuItem;
MsgCtrlPopupMenu: TPopupMenu;
QuickFixesMenuItem: TMenuItem;
SaveAllToFileMenuItem: TMenuItem;
SaveShownToFileMenuItem: TMenuItem;
SaveToFileMenuItem: TMenuItem;
SearchEdit: TEdit;
SearchNextSpeedButton: TSpeedButton;
SearchPanel: TPanel;
SearchPrevSpeedButton: TSpeedButton;
ShowIDMenuItem: TMenuItem;
StyleSeparatorMenuItem: TMenuItem;
SwitchFilterMenuItem: TMenuItem;
TranslateMenuItem: TMenuItem;
UnhideMsgTypeMenuItem: TMenuItem;
UnhideMsgTypeSeparatorMenuItem: TMenuItem;
procedure AboutToolMenuItemClick(Sender: TObject);
procedure AddFilterMenuItemClick(Sender: TObject);
@ -495,11 +460,109 @@ type
function GetDefaultSearchText: string;
end;
const
MessagesMenuRootName = 'Messages';
var
MsgFindMenuItem: TIDEMenuCommand;
MsgQuickFixMenuSection: TIDEMenuSection;
MsgClearMenuItem: TIDEMenuCommand;
MsgHideMsgOfTypeMenuItem: TIDEMenuCommand;
MsgUnhideMsgTypeMenuSection: TIDEMenuSection;
MsgClearHideMsgTypesMenuItem: TIDEMenuCommand;
MsgHideBelowMenuSection: TIDEMenuSection;
MsgHideWarningsMenuItem: TIDEMenuCommand;
MsgHideNotesMenuItem: TIDEMenuCommand;
MsgHideHintsMenuItem: TIDEMenuCommand;
MsgHideVerboseMenuItem: TIDEMenuCommand;
MsgHideDebugMenuItem: TIDEMenuCommand;
MsgHideNoneMenuItem: TIDEMenuCommand;
MsgHideHintsWithoutPosMenuItem: TIDEMenuCommand;
MsgSwitchFilterMenuSection: TIDEMenuSection;
MsgFiltersMenuSection: TIDEMenuSection;
MsgAddFilterMenuItem: TIDEMenuCommand;
MsgCopyMenuSection: TIDEMenuSection;
MsgCopyFilenameMenuItem: TIDEMenuCommand;
MsgCopyMsgMenuItem: TIDEMenuCommand;
MsgCopyShownMenuItem: TIDEMenuCommand;
MsgCopyAllMenuItem: TIDEMenuCommand;
MsgSaveToFileMenuSection: TIDEMenuSection;
MsgSaveAllToFileMenuItem: TIDEMenuCommand;
MsgSaveShownToFileMenuItem: TIDEMenuCommand;
MsgFilenameStyleMenuSection: TIDEMenuSection;
MsgFileStyleShortMenuItem: TIDEMenuCommand;
MsgFileStyleRelativeMenuItem: TIDEMenuCommand;
MsgFileStyleFullMenuItem: TIDEMenuCommand;
MsgTranslateMenuItem: TIDEMenuCommand;
MsgShowIDMenuItem: TIDEMenuCommand;
MsgAboutToolMenuItem: TIDEMenuCommand;
procedure RegisterStandardMessagesViewMenuItems;
function CompareHideMsgType(HideMsgType1, HideMsgType2: Pointer): integer;
function CompareLineAndHideMsgType(MessageLine1, HideMsgType1: Pointer): integer;
implementation
procedure RegisterStandardMessagesViewMenuItems;
var
Path: String;
Parent: TIDEMenuSection;
begin
MessagesMenuRoot := RegisterIDEMenuRoot(MessagesMenuRootName);
Path := MessagesMenuRoot.Name;
MsgFindMenuItem := RegisterIDEMenuCommand(Path, 'Find', 'Find ...');
MsgQuickFixMenuSection := RegisterIDEMenuSection(Path, 'Quick Fix');
MsgClearMenuItem := RegisterIDEMenuCommand(Path, 'Clear', lisClear);
MsgHideMsgOfTypeMenuItem:=RegisterIDEMenuCommand(Path,'HideMsgOfType','');
MsgUnhideMsgTypeMenuSection:=RegisterIDEMenuCommand(Parent,'UnhideMsgType');
Parent:=MsgUnhideMsgTypeMenuSection;
Parent.ChildsAsSubMenu:=true;
Parent.Caption:='Unhide message type';
MsgUnhideMsgOfTypeMenuSection:=RegisterIDEMenuSection(Parent,'UnhideMsgOfTypeSection');
MsgClearHideMsgTypesMenuItem:=RegisterIDEMenuCommand(Parent,'Unhide all','Unhide all');
MsgHideBelowMenuSection:=RegisterIDEMenuSection(Path,'Hide Below Section');
Parent:=MsgHideBelowMenuSection;
Parent.ChildsAsSubMenu:=true;
Parent.Caption:='Hide non urgent messages ...';
MsgHideWarningsMenuItem:=RegisterIDEMenuCommand(Parent,'Hide warnings','Hide warnings');
MsgHideNotesMenuItem:=RegisterIDEMenuCommand(Parent,'Hide notes','Hide notes');
MsgHideHintsMenuItem:=RegisterIDEMenuCommand(Parent,'Hide hints','Hide hints');
MsgHideVerboseMenuItem:=RegisterIDEMenuCommand(Parent,'Hide verbose messages','Hide verbose messages');
MsgHideDebugMenuItem:=RegisterIDEMenuCommand(Parent,'Hide debug messages','Hide debug messages');
MsgHideNoneMenuItem:=RegisterIDEMenuCommand(Parent,'Hide none, do not hide by urgency','Hide none, do not hide by urgency');
MsgHideHintsWithoutPosMenuItem:=RegisterIDEMenuCommand(Path, 'Hide hints without source position', 'Hide hints without source position');
MsgSwitchFilterMenuSection:=RegisterIDEMenuSection(Path,'Switch Filter Section');
Parent:=MsgSwitchFilterMenuSection;
Parent.ChildsAsSubMenu:=true;
Parent.Caption:='Switch Filter Settings ...';
MsgFiltersMenuSection:=RegisterIDEMenuSection(Parent,'Filters');
MsgAddFilterMenuItem:=RegisterIDEMenuCommand(Parent,'Add Filter','Add filter ...');
MsgCopyMenuSection:=RegisterIDEMenuSection(Path,'Copy');
Parent:=MsgCopyMenuSection;
Parent.ChildsAsSubMenu:=true;
Parent.Caption:='Copy ...';
MsgCopyFilenameMenuItem:=RegisterIDEMenuCommand(Parent,'Filename','Copy file name to clipboard');
MsgCopyMsgMenuItem := RegisterIDEMenuCommand(Parent, 'Selected',lisCopySelectedMessagesToClipboard);
MsgCopyShownMenuItem: := RegisterIDEMenuCommand(Parent, 'Shown', 'Copy shown messages to clipboard');
MsgCopyAllMenuItem:=RegisterIDEMenuCommand(Parent,'All'.'Copy all/original messages to clipboard');
MsgSaveToFileMenuSection:=RegisterIDEMenuSection(Path,'Save');
Parent:=MsgSaveToFileMenuSection;
Parent.ChildsAsSubMenu:=true;
Parent.Caption:='Save ...';
MsgSaveShownToFileMenuItem:=RegisterIDEMenuCommand(Parent,'Save shown messages to file ...','Shown');
MsgSaveAllToFileMenuItem:=RegisterIDEMenuCommand(Parent,'Save all/original messages to file ...','All');
MsgFilenameStyleMenuSection:=RegisterIDEMenuSection(Path,'Filename Styles');
Parent:=MsgFilenameStyleMenuSection;
Parent.ChildsAsSubMenu:=true;
Parent.Caption:='Filename Style ...';
MsgFileStyleShortMenuItem:=RegisterIDEMenuCommand(Parent,'Short','Short, no path');
MsgFileStyleRelativeMenuItem:=RegisterIDEMenuCommand(Parent,'Relative','Relative');
MsgFileStyleFullMenuItem:=RegisterIDEMenuCommand(Parent,'Full','Full');
MsgTranslateMenuItem:=RegisterIDEMenuCommand(Path, 'Translate', 'Translate');
MsgShowIDMenuItem:=RegisterIDEMenuCommand(Path, 'ShowID', 'Show message type ID');
MsgAboutToolMenuItem:=RegisterIDEMenuCommand(Path, 'About', 'About Tool');
end;
function CompareHideMsgType(HideMsgType1, HideMsgType2: Pointer): integer;
var
Item1: TLMVFilterHideMsgType absolute HideMsgType1;
@ -1421,7 +1484,7 @@ begin
Application.RemoveOnIdleHandler(@OnIdle);
end;
procedure TMessagesCtrl.SetImages(AValue: TImageList);
procedure TMessagesCtrl.SetImages(AValue: TCustomImageList);
begin
if FImages=AValue then Exit;
if Images <> nil then
@ -2968,11 +3031,11 @@ begin
end;
InfoSeparatorMenuItem.Visible:=true;
AboutToolMenuItem.Caption:='About '+View.Caption;
AboutToolMenuItem.Visible:=true;
MsgAboutToolMenuItem.Caption:='About '+View.Caption;
MsgAboutToolMenuItem.Visible:=true;
end else begin
InfoSeparatorMenuItem.Visible:=false;
AboutToolMenuItem.Visible:=false;
MsgAboutToolMenuItem.Visible:=false;
end;
if CanHideMsgType then begin
@ -2981,26 +3044,26 @@ begin
end else begin
HideMsgOfTypeMenuItem.Visible:=false;
end;
HideHintsWithoutPosMenuItem.Checked:=MessagesCtrl.ActiveFilter.HideNotesWithoutPos;
MsgHideHintsWithoutPosMenuItem.Checked:=MessagesCtrl.ActiveFilter.HideNotesWithoutPos;
CopyMsgMenuItem.Enabled:=HasText;
CopyFilenameMenuItem.Enabled:=HasFilename;
CopyAllMenuItem.Enabled:=not Running;
CopyShownMenuItem.Enabled:=HasViewContent;
SaveAllToFileMenuItem.Enabled:=not Running;
SaveShownToFileMenuItem.Enabled:=HasViewContent;
MsgCopyMsgMenuItem.Enabled:=HasText;
MsgCopyFilenameMenuItem.Enabled:=HasFilename;
MsgCopyAllMenuItem.Enabled:=not Running;
MsgCopyShownMenuItem.Enabled:=HasViewContent;
MsgSaveAllToFileMenuItem.Enabled:=not Running;
MsgSaveShownToFileMenuItem.Enabled:=HasViewContent;
MinUrgency:=MessagesCtrl.ActiveFilter.MinUrgency;
HideWarningsMenuItem.Checked:=MinUrgency in [mluError..mluPanic];
HideNotesMenuItem.Checked:=MinUrgency in [mluWarning,mluImportant];
HideHintsMenuItem.Checked:=MinUrgency=mluNote;
HideVerboseMenuItem.Checked:=MinUrgency=mluHint;
HideDebugMenuItem.Checked:=MinUrgency in [mluProgress..mluVerbose];
HideNoneMenuItem.Checked:=MinUrgency=mluNone;
MsgHideWarningsMenuItem.Checked:=MinUrgency in [mluError..mluPanic];
MsgHideNotesMenuItem.Checked:=MinUrgency in [mluWarning,mluImportant];
MsgHideHintsMenuItem.Checked:=MinUrgency=mluNote;
MsgHideVerboseMenuItem.Checked:=MinUrgency=mluHint;
MsgHideDebugMenuItem.Checked:=MinUrgency in [mluProgress..mluVerbose];
MsgHideNoneMenuItem.Checked:=MinUrgency=mluNone;
FileStyleShortMenuItem.Checked:=MessagesCtrl.FilenameStyle=mcfsShort;
FileStyleRelativeMenuItem.Checked:=MessagesCtrl.FilenameStyle=mcfsRelative;
FileStyleFullMenuItem.Checked:=MessagesCtrl.FilenameStyle=mcfsFull;
MsgFileStyleShortMenuItem.Checked:=MessagesCtrl.FilenameStyle=mcfsShort;
MsgFileStyleRelativeMenuItem.Checked:=MessagesCtrl.FilenameStyle=mcfsRelative;
MsgFileStyleFullMenuItem.Checked:=MessagesCtrl.FilenameStyle=mcfsFull;
UpdateUnhideItems;
UpdateFilterItems;
@ -3071,7 +3134,7 @@ end;
procedure TMessagesFrame.TranslateMenuItemClick(Sender: TObject);
begin
if TranslateMenuItem.Checked then
if MsgTranslateMenuItem.Checked then
MessagesCtrl.Options:=MessagesCtrl.Options+[mcoShowTranslated]
else
MessagesCtrl.Options:=MessagesCtrl.Options-[mcoShowTranslated];
@ -3131,11 +3194,11 @@ end;
procedure TMessagesFrame.FileStyleMenuItemClick(Sender: TObject);
begin
if Sender=FileStyleShortMenuItem then
if Sender=MsgFileStyleShortMenuItem then
MessagesCtrl.FilenameStyle:=mcfsShort
else if Sender=FileStyleRelativeMenuItem then
else if Sender=MsgFileStyleRelativeMenuItem then
MessagesCtrl.FilenameStyle:=mcfsRelative
else if Sender=FileStyleFullMenuItem then
else if Sender=MsgFileStyleFullMenuItem then
MessagesCtrl.FilenameStyle:=mcfsFull;
end;
@ -3148,7 +3211,7 @@ end;
procedure TMessagesFrame.HideHintsWithoutPosMenuItemClick(Sender: TObject);
begin
MessagesCtrl.ActiveFilter.HideNotesWithoutPos:=HideHintsWithoutPosMenuItem.Checked;
MessagesCtrl.ActiveFilter.HideNotesWithoutPos:=MsgHideHintsWithoutPosMenuItem.Checked;
end;
procedure TMessagesFrame.HideMsgOfTypeMenuItemClick(Sender: TObject);
@ -3165,17 +3228,17 @@ procedure TMessagesFrame.HideUrgencyMenuItemClick(Sender: TObject);
var
MinUrgency: TMessageLineUrgency;
begin
if Sender=HideWarningsMenuItem then
if Sender=MsgHideWarningsMenuItem then
MinUrgency:=mluError
else if Sender=HideNotesMenuItem then
else if Sender=MsgHideNotesMenuItem then
MinUrgency:=mluWarning
else if Sender=HideHintsMenuItem then
else if Sender=MsgHideHintsMenuItem then
MinUrgency:=mluNote
else if Sender=HideVerboseMenuItem then
else if Sender=MsgHideVerboseMenuItem then
MinUrgency:=mluHint
else if Sender=HideDebugMenuItem then
else if Sender=MsgHideDebugMenuItem then
MinUrgency:=mluVerbose3
else if Sender=HideNoneMenuItem then
else if Sender=MsgHideNoneMenuItem then
MinUrgency:=mluNone;
MessagesCtrl.ActiveFilter.MinUrgency:=MinUrgency;
end;
@ -3396,74 +3459,54 @@ begin
end;
constructor TMessagesFrame.Create(TheOwner: TComponent);
var
ImgIDInfo: Integer;
ImgIDHint: Integer;
ImgIDNote: Integer;
ImgIDWarning: Integer;
ImgIDError: Integer;
ImgIDFatal: Integer;
begin
inherited Create(TheOwner);
MessagesCtrl:=TMessagesCtrl.Create(Self);
ImgIDInfo:=IDEImages.LoadImage(12, 'state12x12_information');
ImgIDHint:=IDEImages.LoadImage(12, 'state12x12_hint');
ImgIDNote:=IDEImages.LoadImage(12, 'state12x12_note');
ImgIDWarning:=IDEImages.LoadImage(12, 'state12x12_warning');
ImgIDError:=IDEImages.LoadImage(12, 'state12x12_error');
ImgIDFatal:=IDEImages.LoadImage(12, 'state12x12_fatal');
with MessagesCtrl do begin
Name:='MessagesCtrl';
Align:=alClient;
Parent:=Self;
UrgencyStyles[mluNone].SetValues('?',6,clDefault);
UrgencyStyles[mluProgress].SetValues('Fortschritt',5,clDefault);
UrgencyStyles[mluDebug].SetValues('Debug',5,clDefault);
UrgencyStyles[mluVerbose3].SetValues('ExtAusfuehrlich',5,clDefault);
UrgencyStyles[mluVerbose2].SetValues('SehrAusfuerhlich',5,clDefault);
UrgencyStyles[mluVerbose].SetValues('Ausfuerhlich',5,clDefault);
UrgencyStyles[mluHint].SetValues('Hinweis',4,clDefault);
UrgencyStyles[mluNote].SetValues('Note',3,clDefault);
UrgencyStyles[mluWarning].SetValues('Warnung',2,clDefault);
UrgencyStyles[mluImportant].SetValues('Sonstiges',4,clDefault);
UrgencyStyles[mluError].SetValues('Fehler',1,clDefault);
UrgencyStyles[mluFatal].SetValues('Fatal',0,clDefault);
UrgencyStyles[mluPanic].SetValues('Panik',0,clDefault);
Images:=ImageList1;
UrgencyStyles[mluNone].SetValues('?',ImgIDInfo,clDefault);
UrgencyStyles[mluProgress].SetValues('Fortschritt',ImgIDInfo,clDefault);
UrgencyStyles[mluDebug].SetValues('Debug',ImgIDInfo,clDefault);
UrgencyStyles[mluVerbose3].SetValues('ExtAusfuehrlich',ImgIDInfo,clDefault);
UrgencyStyles[mluVerbose2].SetValues('SehrAusfuerhlich',ImgIDInfo,clDefault);
UrgencyStyles[mluVerbose].SetValues('Ausfuerhlich',ImgIDInfo,clDefault);
UrgencyStyles[mluHint].SetValues('Hinweis',ImgIDHint,clDefault);
UrgencyStyles[mluNote].SetValues('Note',ImgIDNote,clDefault);
UrgencyStyles[mluWarning].SetValues('Warnung',ImgIDWarning,clDefault);
UrgencyStyles[mluImportant].SetValues('Sonstiges',ImgIDInfo,clDefault);
UrgencyStyles[mluError].SetValues('Fehler',ImgIDError,clDefault);
UrgencyStyles[mluFatal].SetValues('Fatal',ImgIDFatal,clDefault);
UrgencyStyles[mluPanic].SetValues('Panik',ImgIDFatal,clDefault);
Images:=IDEImages.Images_12;
PopupMenu:=MsgCtrlPopupMenu;
end;
// popup menu
QuickFixesMenuItem.Caption:='Quick Fix ...';
FindMenuItem.Caption:='Find ...';
// popup menu: filter
HideBelowMenuItem.Caption:='Hide non urgent messages ...';
HideWarningsMenuItem.Caption:='Hide warnings';
HideNotesMenuItem.Caption:='Hide notes';
HideHintsMenuItem.Caption:='Hide hints';
HideVerboseMenuItem.Caption:='Hide verbose messages';
HideDebugMenuItem.Caption:='Hide debug messages';
HideNoneMenuItem.Caption:='Hide none, do not hide by urgency';
HideVerboseMenuItem.Checked:=true;
// HideMsgOfTypeMenuItem.Caption:=automatically in OnPopup
UnhideMsgTypeMenuItem.Caption:='Unhide message type';
ClearHideMsgTypesMenuItem.Caption:='Unhide all above';
HideHintsWithoutPosMenuItem.Caption:='Hide hints without source position';
SwitchFilterMenuItem.Caption:='Switch filter settings ...';
AddFilterMenuItem.Caption:='Add filter';
// popup menu: copy and save messages
CopyMenuItem.Caption:='Copy ...';
CopyFilenameMenuItem.Caption:='Copy file name';
CopyMsgMenuItem.Caption:='Copy selected messages';
CopyShownMenuItem.Caption:='Copy shown messages';
CopyAllMenuItem.Caption:='Copy all messages';
SaveToFileMenuItem.Caption:='Save to file ...';
SaveShownToFileMenuItem.Caption:='Save shown messages to file ...';
SaveAllToFileMenuItem.Caption:='Save all messages to file ...';
// popup menu: view options
TranslateMenuItem.Caption:='Translate';
TranslateMenuItem.Checked:=mcoShowTranslated in MessagesCtrl.Options;
ShowIDMenuItem.Caption:='Show message type ID';
ShowIDMenuItem.Checked:=mcoShowMessageID in MessagesCtrl.Options;
FilenameStyleMenuItem.Caption:='File name style';
FileStyleShortMenuItem.Caption:='Short, no path';
FileStyleRelativeMenuItem.Caption:='Relative';
FileStyleFullMenuItem.Caption:='Full';
// search
SearchPanel.Visible:=false; // by default the search is hidden
HideSearchSpeedButton.Hint:='Hide Search';
HideSearchSpeedButton.LoadGlyphFromLazarusResource('debugger_power_grey');
SearchEdit.Text:=GetDefaultSearchText;
SearchNextSpeedButton.Hint:='Find the next occurence of the phrase';
SearchNextSpeedButton.LoadGlyphFromLazarusResource('callstack_bottom');
SearchPrevSpeedButton.Hint:='Find the previous occurence of the phrase';
SearchPrevSpeedButton.LoadGlyphFromLazarusResource('callstack_top');
end;
destructor TMessagesFrame.Destroy;

View File

@ -44,13 +44,6 @@ type
procedure FormDestroy(Sender: TObject);
function OnOpenMessage(Sender: TObject; Msg: TMessageLine): boolean;
private
ImgIDNone: integer;
ImgIDInformation: integer;
ImgIDHint: integer;
ImgIDNote: integer;
ImgIDWarning: integer;
ImgIDError: integer;
ImgIDFatal: integer;
function GetDblClickJumps: boolean;
function GetHideMessagesIcons: boolean;
procedure SetDblClickJumps(AValue: boolean);
@ -83,43 +76,46 @@ type
var
MessagesView: TMessagesView;
const
MessagesMenuRootName = 'Messages';
procedure RegisterStandardMessagesViewMenuItems;
implementation
procedure RegisterStandardMessagesViewMenuItems;
begin
end;
{$R *.lfm}
{ TMessagesView }
procedure TMessagesView.FormCreate(Sender: TObject);
var
ImgIDInfo: Integer;
ImgIDHint: Integer;
ImgIDNote: Integer;
ImgIDWarning: Integer;
ImgIDError: Integer;
ImgIDFatal: Integer;
begin
IDEMessagesWindow:=Self;
SourceMarks:=TETMarks.Create(Self);
ImgIDInfo:=IDEImages.LoadImage(12, 'state12x12_information');
ImgIDHint:=IDEImages.LoadImage(12, 'state12x12_hint');
ImgIDNote:=IDEImages.LoadImage(12, 'state12x12_note');
ImgIDWarning:=IDEImages.LoadImage(12, 'state12x12_warning');
ImgIDError:=IDEImages.LoadImage(12, 'state12x12_error');
ImgIDFatal:=IDEImages.LoadImage(12, 'state12x12_fatal');
with SourceMarks do begin
ImageList:=IDEImages.Images_12;
//OnGetSynEditOfFile:=@SourceMarksGetSynEditOfFile;
MarkStyles[mluNone].ImageIndex:=-1;
MarkStyles[mluProgress].ImageIndex:=-1;
MarkStyles[mluDebug].ImageIndex:=IDEImages.LoadImage(12, 'state12x12_information');
MarkStyles[mluVerbose3].ImageIndex:=IDEImages.LoadImage(12, 'state12x12_information');
MarkStyles[mluVerbose2].ImageIndex:=IDEImages.LoadImage(12, 'state12x12_information');
MarkStyles[mluVerbose].ImageIndex:=IDEImages.LoadImage(12, 'state12x12_information');
MarkStyles[mluHint].ImageIndex:=IDEImages.LoadImage(12, 'state12x12_hint');
MarkStyles[mluNote].ImageIndex:=IDEImages.LoadImage(12, 'state12x12_note');
MarkStyles[mluWarning].ImageIndex:=IDEImages.LoadImage(12, 'state12x12_warning');
MarkStyles[mluDebug].ImageIndex:= ImgIDInfo;
MarkStyles[mluVerbose3].ImageIndex:=ImgIDInfo;
MarkStyles[mluVerbose2].ImageIndex:=ImgIDInfo;
MarkStyles[mluVerbose].ImageIndex:=ImgIDInfo;
MarkStyles[mluHint].ImageIndex:=ImgIDHint;
MarkStyles[mluNote].ImageIndex:=ImgIDNote;
MarkStyles[mluWarning].ImageIndex:=ImgIDWarning;
MarkStyles[mluImportant].ImageIndex:=-1;
MarkStyles[mluError].ImageIndex:=IDEImages.LoadImage(12, 'state12x12_error');
MarkStyles[mluFatal].ImageIndex:=IDEImages.LoadImage(12, 'state12x12_fatal');
MarkStyles[mluPanic].ImageIndex:=IDEImages.LoadImage(12, 'state12x12_fatal');
MarkStyles[mluError].ImageIndex:=ImgIDError;
MarkStyles[mluFatal].ImageIndex:=ImgIDFatal;
MarkStyles[mluPanic].ImageIndex:=ImgIDFatal;
end;
MessagesFrame1.MessagesCtrl.SourceMarks:=SourceMarks;
MessagesFrame1.MessagesCtrl.OnOpenMessage:=@OnOpenMessage;

View File

@ -108,7 +108,7 @@ uses
CodeToolsDefines, DiffDialog, DiskDiffsDialog, UnitInfoDlg, EditorOptions,
SourceEditProcs, ViewUnit_dlg, FPDocEditWindow,
{$IFDEF EnableNewExtTools}
etQuickFixes, etMessagesWnd,
etQuickFixes, etMessageFrame, etMessagesWnd,
{$ELSE}
OutputFilter, MsgQuickFixes, MsgView,
{$ENDIF}
@ -9032,6 +9032,9 @@ var
begin
Result:=false;
if Screen.GetCurrentModalForm<>nil then
exit;
{$IFDEF EnableNewExtTools}
if Msg=nil then begin
if MessagesView.SelectFirstUrgentMessage(mluError,true) then
@ -10598,7 +10601,8 @@ var
Msg: TMessageLine;
{$ENDIF}
begin
if CodeToolBoss.ErrorMessage='' then begin
if (Screen.GetCurrentModalForm<>nil) or (CodeToolBoss.ErrorMessage='') then
begin
SourceFileMgr.UpdateSourceNames;
debugln('TMainIDE.DoJumpToCodeToolBossError No errormessage');
exit;