lazarus/ide/etmessageswnd.pas
2022-12-30 22:43:56 +01:00

298 lines
8.9 KiB
ObjectPascal

{
***************************************************************************
* *
* 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1335, USA. *
* *
***************************************************************************
Author: Mattias Gaertner
Abstract:
Window for (compiler) messages.
}
unit etMessagesWnd;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils,
// LCL
Forms, Controls, Graphics, Dialogs,
// BuildIntf
IDEExternToolIntf,
// IdeIntf
IDEMsgIntf, LazIDEIntf,
// SynEdit
SynEditMarks,
// IDE
IDEOptionDefs, etMessageFrame, etQuickFixes, LazarusIDEStrConsts;
type
{ TMessagesView }
TMessagesView = class(TIDEMessagesWindowInterface)
MessagesFrame1: TMessagesFrame;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure OnMsgCtrlOptsChanged(Sender: TObject);
function OnOpenMessage(Sender: TObject; Msg: TMessageLine): boolean;
private
function GetDblClickJumps: boolean;
function GetShowMessagesIcons: boolean;
procedure SetDblClickJumps(AValue: boolean);
procedure SetShowMessagesIcons(AValue: boolean);
protected
function GetViews(Index: integer): TExtToolView; override;
public
// views
procedure Clear; override;
procedure DeleteView(View: TExtToolView); override;
function FindUnfinishedView: TExtToolView; override;
function GetSelectedLine: TMessageLine; override;
function GetView(aCaption: string; CreateIfNotExist: boolean
): TExtToolView; override;
function ViewCount: integer; override;
function CreateView(aCaptionPrefix: string): TExtToolView; override;
function IndexOfView(View: TExtToolView): integer; override;
// lines
procedure SelectMsgLine(Msg: TMessageLine); override;
function SelectFirstUrgentMessage(aMinUrgency: TMessageLineUrgency;
WithSrcPos: boolean): boolean; override;
function SelectNextUrgentMessage(aMinUrgency: TMessageLineUrgency;
WithSrcPos, Downwards: boolean): boolean; override;
procedure ClearCustomMessages(const ViewCaption: string='');
function AddCustomMessage(TheUrgency: TMessageLineUrgency; Msg: string;
aSrcFilename: string=''; LineNumber: integer=0; Column: integer=0;
const ViewCaption: string=''): TMessageLine; override;
function OpenSelection: Boolean; override;
// misc
procedure SourceEditorPopup(MarkLine: TSynEditMarkLine; const LogicalCaretXY: TPoint);
procedure SourceEditorHint(MarkLine: TSynEditMarkLine; var HintStr: string);
// options
procedure ApplyIDEOptions;
property DblClickJumps: boolean read GetDblClickJumps write SetDblClickJumps;
property ShowMessagesIcons: boolean read GetShowMessagesIcons write SetShowMessagesIcons;
end;
var
MessagesView: TMessagesView;
implementation
{$R *.lfm}
{ TMessagesView }
procedure TMessagesView.FormCreate(Sender: TObject);
begin
Name := NonModalIDEWindowNames[nmiwMessagesView];
IDEMessagesWindow:=Self;
Caption:=lisMenuViewMessages;
{$IFNDEF LCLGtk2}
try
Icon.LoadFromResourceName(HInstance, 'WIN_MESSAGES');
except
end;
{$ENDIF}
MessagesFrame1.MessagesCtrl.OnOpenMessage:=@OnOpenMessage;
MessagesFrame1.MessagesCtrl.OnOptionsChanged:=@OnMsgCtrlOptsChanged;
ActiveControl:=MessagesFrame1.MessagesCtrl;
end;
procedure TMessagesView.FormDestroy(Sender: TObject);
begin
IDEMessagesWindow:=nil;
end;
procedure TMessagesView.OnMsgCtrlOptsChanged(Sender: TObject);
begin
if mcoWndStayOnTop in MessagesFrame1.MessagesCtrl.Options then
FormStyle:=fsStayOnTop
else
FormStyle:=fsNormal;
end;
function TMessagesView.OnOpenMessage(Sender: TObject; Msg: TMessageLine): boolean;
begin
Result:=false;
// ask quickfixes
if IDEQuickFixes.OpenMsg(Msg) then exit(true);
if Msg.GetFullFilename<>'' then begin
// open file in source editor and mark it as error
Result:=LazarusIDE.DoJumpToCompilerMessage(true,Msg);
end;
end;
function TMessagesView.OpenSelection: Boolean;
begin
Result := MessagesFrame1.MessagesCtrl.OpenSelection;
end;
procedure TMessagesView.SetDblClickJumps(AValue: boolean);
begin
if AValue then
MessagesFrame1.MessagesCtrl.Options:=
MessagesFrame1.MessagesCtrl.Options-[mcoSingleClickOpensFile]
else
MessagesFrame1.MessagesCtrl.Options:=
MessagesFrame1.MessagesCtrl.Options+[mcoSingleClickOpensFile]
end;
procedure TMessagesView.SetShowMessagesIcons(AValue: boolean);
begin
if AValue then
MessagesFrame1.MessagesCtrl.Options:=MessagesFrame1.MessagesCtrl.Options+[mcoShowMsgIcons]
else
MessagesFrame1.MessagesCtrl.Options:=MessagesFrame1.MessagesCtrl.Options-[mcoShowMsgIcons];
end;
function TMessagesView.GetViews(Index: integer): TExtToolView;
begin
Result:=MessagesFrame1.Views[Index];
end;
procedure TMessagesView.ClearCustomMessages(const ViewCaption: string);
begin
MessagesFrame1.ClearCustomMessages(ViewCaption);
end;
function TMessagesView.AddCustomMessage(TheUrgency: TMessageLineUrgency;
Msg: string; aSrcFilename: string; LineNumber: integer; Column: integer;
const ViewCaption: string): TMessageLine;
begin
Result:=MessagesFrame1.AddCustomMessage(TheUrgency,Msg,aSrcFilename,
LineNumber,Column,ViewCaption);
end;
procedure TMessagesView.SourceEditorPopup(MarkLine: TSynEditMarkLine;
const LogicalCaretXY: TPoint);
begin
MessagesFrame1.SourceEditorPopup(MarkLine,LogicalCaretXY);
end;
procedure TMessagesView.SourceEditorHint(MarkLine: TSynEditMarkLine;
var HintStr: string);
begin
MessagesFrame1.SourceEditorHint(MarkLine,HintStr);
end;
procedure TMessagesView.Clear;
begin
MessagesFrame1.ClearViews(true);
end;
procedure TMessagesView.DeleteView(View: TExtToolView);
begin
if View is TLMsgWndView then
MessagesFrame1.DeleteView(TLMsgWndView(View));
end;
function TMessagesView.FindUnfinishedView: TExtToolView;
begin
Result:=MessagesFrame1.FindUnfinishedView;
end;
function TMessagesView.GetSelectedLine: TMessageLine;
begin
Result:=MessagesFrame1.MessagesCtrl.GetSelectedMsg;
end;
function TMessagesView.GetView(aCaption: string; CreateIfNotExist: boolean
): TExtToolView;
begin
Result:=MessagesFrame1.GetView(aCaption,CreateIfNotExist);
end;
function TMessagesView.CreateView(aCaptionPrefix: string): TExtToolView;
function TryCaption(aCaption: string; var View: TExtToolView): boolean;
begin
if GetView(aCaption,false)<>nil then exit(false);
View:=GetView(aCaption,true);
Result:=true;
end;
var
i: Integer;
begin
Result:=nil;
if TryCaption(aCaptionPrefix,Result) then exit;
if (aCaptionPrefix<>'') and (aCaptionPrefix[length(aCaptionPrefix)] in ['0'..'9'])
then
aCaptionPrefix+='_';
i:=2;
repeat
if TryCaption(aCaptionPrefix+IntToStr(i),Result) then exit;
inc(i);
until false;
end;
function TMessagesView.IndexOfView(View: TExtToolView): integer;
begin
if View is TLMsgWndView then
Result:=MessagesFrame1.IndexOfView(TLMsgWndView(View))
else
Result:=-1;
end;
procedure TMessagesView.SelectMsgLine(Msg: TMessageLine);
begin
MessagesFrame1.SelectMsgLine(Msg,true);
end;
function TMessagesView.SelectFirstUrgentMessage(
aMinUrgency: TMessageLineUrgency; WithSrcPos: boolean): boolean;
begin
Result:=MessagesFrame1.SelectFirstUrgentMessage(aMinUrgency,WithSrcPos);
end;
function TMessagesView.SelectNextUrgentMessage(
aMinUrgency: TMessageLineUrgency; WithSrcPos, Downwards: boolean): boolean;
begin
Result:=MessagesFrame1.SelectNextUrgentMessage(aMinUrgency,WithSrcPos,Downwards);
end;
function TMessagesView.ViewCount: integer;
begin
Result:=MessagesFrame1.ViewCount;
end;
procedure TMessagesView.ApplyIDEOptions;
begin
MessagesFrame1.ApplyIDEOptions;
OnMsgCtrlOptsChanged(Self);
end;
function TMessagesView.GetDblClickJumps: boolean;
begin
Result:=not (mcoSingleClickOpensFile in MessagesFrame1.MessagesCtrl.Options);
end;
function TMessagesView.GetShowMessagesIcons: boolean;
begin
Result:=mcoShowMsgIcons in MessagesFrame1.MessagesCtrl.Options;
end;
end.