lazarus/ide/frames/compiler_messages_options.pas

186 lines
4.8 KiB
ObjectPascal

unit compiler_messages_options;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, StdCtrls, CheckLst,
Dialogs,
IDEOptionsIntf, Project,
LazarusIDEStrConsts,
CompilerOptions;
type
{ TCompilerMessagesOptionsFrame }
TCompilerMessagesOptionsFrame = class(TAbstractIDEOptionsEditor)
btnBrowseMsg: TButton;
chklistCompMsg: TCheckListBox;
chkUseMsgFile: TCheckBox;
editMsgFileName: TEdit;
grpCompilerMessages: TGroupBox;
procedure btnBrowseMsgClick(Sender: TObject);
procedure chklistCompMsgClick(Sender: TObject);
procedure chkUseMsgFileChange(Sender: TObject);
private
{ private declarations }
TempMessages: TCompilerMessagesList;
procedure UpdateMessages;
public
{ public declarations }
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
function GetTitle: String; override;
procedure Setup(ADialog: TAbstractOptionsEditorDialog); override;
procedure ReadSettings(AOptions: TAbstractIDEOptions); override;
procedure WriteSettings(AOptions: TAbstractIDEOptions); override;
class function SupportedOptionsClass: TAbstractIDEOptionsClass; override;
end;
implementation
{ TCompilerMessagesOptionsFrame }
procedure TCompilerMessagesOptionsFrame.chkUseMsgFileChange(Sender: TObject);
begin
UpdateMessages;
end;
procedure TCompilerMessagesOptionsFrame.chklistCompMsgClick(Sender: TObject);
var
i : Integer;
begin
for i := 0 to chklistCompMsg.Count - 1 do
TCompilerMessageConfig(chklistCompMsg.Items.Objects[i]).Ignored := not chklistCompMsg.Checked[i];
end;
procedure TCompilerMessagesOptionsFrame.btnBrowseMsgClick(Sender: TObject);
var
dlg : TOpenDialog;
begin
dlg := TOpenDialog.Create(Self);
try
dlg.Filter := dlgBrowseMsgFilter;
if not dlg.Execute then Exit;
editMsgFileName.Caption := dlg.FileName;
UpdateMessages;
finally
dlg.Free
end;
end;
procedure TCompilerMessagesOptionsFrame.UpdateMessages;
const
MaxIndexLen = 5;
var
i : Integer;
j : Integer;
topidx : Integer;
m : TCompilerMessageConfig;
function IntToStrLen(idx, strlen: integer): string;
var
s : string;
begin
Result := IntToStr(idx);
if length(Result) < strlen then begin
SetLength(s, strlen - length(Result));
FillChar(s[1], length(s), '0');
Result := s + Result;
end;
end;
begin
topidx := chklistCompMsg.TopIndex;
chklistCompMsg.Items.BeginUpdate;
try
if chkUseMsgFile.Checked and FileExistsUTF8(editMsgFileName.Caption) and (editMsgFileName.Caption <> '') then begin
try
// FPC messages file is expected to be UTF8 encoded, no matter for the current code page is
TempMessages.LoadMsgFile(editMsgFileName.Caption, true);
except
TempMessages.SetDefault;
end;
end else
TempMessages.SetDefault;
chklistCompMsg.Clear;
chklistCompMsg.Items.Clear;
for i := 0 to TempMessages.Count - 1 do begin
m := TempMessages.Msg[i];
j := chklistCompMsg.Items.AddObject( Format('(%s) %s', [m.MsgType, m.GetUserText]), m);
chklistCompMsg.Checked[j] := not m.Ignored;
end;
finally
chklistCompMsg.Items.EndUpdate;
chkListCompMsg.TopIndex := topidx;
end;
end;
constructor TCompilerMessagesOptionsFrame.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
TempMessages:=TCompilerMessagesList.Create;
end;
destructor TCompilerMessagesOptionsFrame.Destroy;
begin
TempMessages.Free;
inherited Destroy;
end;
function TCompilerMessagesOptionsFrame.GetTitle: String;
begin
Result:=dlgCOCfgCmpMessages;
end;
procedure TCompilerMessagesOptionsFrame.Setup(ADialog: TAbstractOptionsEditorDialog);
begin
grpCompilerMessages.Caption := dlgCompilerMessage;
chkUseMsgFile.Caption := dlgUseMsgFile;
editMsgFileName.Caption := '';
end;
procedure TCompilerMessagesOptionsFrame.ReadSettings(AOptions: TAbstractIDEOptions);
begin
chkUseMsgFile.OnChange := nil;
try
with AOptions as TProjectCompilerOptions do
begin
chkUseMsgFile.Checked := UseMsgFile;
editMsgFileName.Caption := MsgFileName;
TempMessages.Assign(CompilerMessages);
UpdateMessages;
end;
finally
chkUseMsgFile.OnChange := @chkUseMsgFileChange;
end;
end;
procedure TCompilerMessagesOptionsFrame.WriteSettings(AOptions: TAbstractIDEOptions);
begin
with AOptions as TProjectCompilerOptions do
begin
UseMsgFile := chkUseMsgFile.Checked;
MsgFileName := editMsgFileName.Caption;
CompilerMessages.Assign(TempMessages);
end;
end;
class function TCompilerMessagesOptionsFrame.SupportedOptionsClass: TAbstractIDEOptionsClass;
begin
Result := TProjectCompilerOptions;
end;
initialization
{$I compiler_messages_options.lrs}
RegisterIDEOptionsEditor(GroupCompiler, TCompilerMessagesOptionsFrame, CompilerOptionsMessages);
end.