lazarus/ide/frames/compiler_messages_options.pas

180 lines
5.2 KiB
ObjectPascal

unit compiler_messages_options;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, ListFilterEdit, StdCtrls, CheckLst, Dialogs,
IDEOptionsIntf, LazarusIDEStrConsts, EnvironmentOpts, CompilerOptions,
IDEMsgIntf, IDEDialogs;
type
{ TCompilerMessagesOptionsFrame }
TCompilerMessagesOptionsFrame = class(TAbstractIDEOptionsEditor)
chklistCompMsg: TCheckListBox;
editMsgFilter: TListFilterEdit;
grpCompilerMessages: TGroupBox;
lblFilter: TLabel;
MsgFileBrowseButton: TButton;
MsgFileEdit: TEdit;
UseMsgFileCheckBox: TCheckBox;
procedure chklistCompMsgItemClick(Sender: TObject; Index: integer);
function CheckItem(Item: TObject): Boolean;
procedure MsgFileBrowseButtonClick(Sender: TObject);
procedure UseMsgFileCheckBoxChange(Sender: TObject);
private
TempMessages: TCompilerMessagesList;
public
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
{$R *.lfm}
{ TCompilerMessagesOptionsFrame }
procedure TCompilerMessagesOptionsFrame.chklistCompMsgItemClick(Sender: TObject; Index: integer);
const
BoolToMessageState: array[Boolean] of TCompilerMessageState = (msOff, msOn);
var
m: TCompilerMessageConfig;
begin
if (Index >= 0) and (Index < chklistCompMsg.Items.Count) then begin
m := TCompilerMessageConfig(chklistCompMsg.Items.Objects[Index]);
if (m.DefIgnored <> chklistCompMsg.Checked[Index]) then
m.State := msDefault
else
m.State := BoolToMessageState[chklistCompMsg.Checked[Index]];
end;
end;
function TCompilerMessagesOptionsFrame.CheckItem(Item: TObject): Boolean;
var
m: TCompilerMessageConfig;
begin
m := Item as TCompilerMessageConfig;
if m.State = msDefault then
Result := not m.DefIgnored
else
Result := m.State = msOn;
end;
procedure TCompilerMessagesOptionsFrame.MsgFileBrowseButtonClick(Sender: TObject
);
var
OpenDialog: TOpenDialog;
begin
OpenDialog:=TOpenDialog.Create(nil);
try
InitIDEFileDialog(OpenDialog);
OpenDialog.Title:=lisChooseAnFPCMessageFile;
OpenDialog.Options:=OpenDialog.Options+[ofFileMustExist];
OpenDialog.Filter:=lisFPCMessageFile+' (*.msg)|*.msg|'+dlgAllFiles+'|'+
GetAllFilesMask;
if OpenDialog.Execute then
MsgFileEdit.Text:=OpenDialog.FileName;
finally
OpenDialog.Free;
end;
end;
procedure TCompilerMessagesOptionsFrame.UseMsgFileCheckBoxChange(Sender: TObject
);
begin
MsgFileEdit.Enabled:=UseMsgFileCheckBox.Checked;
MsgFileBrowseButton.Enabled:=UseMsgFileCheckBox.Checked;
end;
constructor TCompilerMessagesOptionsFrame.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
TempMessages:=TCompilerMessagesList.Create;
end;
destructor TCompilerMessagesOptionsFrame.Destroy;
begin
editMsgFilter.Items.Clear;
chklistCompMsg.Clear;
chklistCompMsg.Items.Clear;
TempMessages.Free;
inherited Destroy;
end;
function TCompilerMessagesOptionsFrame.GetTitle: String;
begin
Result:=dlgCOCfgCmpMessages;
end;
procedure TCompilerMessagesOptionsFrame.Setup(ADialog: TAbstractOptionsEditorDialog);
begin
grpCompilerMessages.Caption:=dlgCompilerMessage;
lblFilter.Caption:=lisFilter;
UseMsgFileCheckBox.Caption:=lisUseMessageFile;
MsgFileBrowseButton.Caption:=lisPathEditBrowse;
end;
procedure TCompilerMessagesOptionsFrame.ReadSettings(AOptions: TAbstractIDEOptions);
const // todo: should be translated
MsgTypeStr: array [TFPCErrorType] of String = ('-','H','N','W','E','F','P');
var
topidx, i: Integer;
m: TCompilerMessageConfig;
s: String;
CompOpts: TBaseCompilerOptions;
begin
CompOpts:=AOptions as TBaseCompilerOptions;
TempMessages.Assign(CompOpts.CompilerMessages);
topidx := chklistCompMsg.TopIndex;
UseMsgFileCheckBox.Checked:=CompOpts.UseMsgFile;
MsgFileEdit.Text:=CompOpts.MsgFileName;
MsgFileEdit.Enabled:=UseMsgFileCheckBox.Checked;
MsgFileBrowseButton.Enabled:=UseMsgFileCheckBox.Checked;
// Copy data to filter component
editMsgFilter.Items.Clear;
for i := 0 to TempMessages.Count - 1 do
begin
m := TempMessages.Msg[i];
if m.MsgType in [etNote, etHint, etWarning] then
begin
s := Format('(%s) %s', [MsgTypeStr[m.MsgType], m.MsgText]);
editMsgFilter.Items.AddObject(s, m);
end;
end;
editMsgFilter.InvalidateFilter;
chkListCompMsg.TopIndex := topidx;
end;
procedure TCompilerMessagesOptionsFrame.WriteSettings(AOptions: TAbstractIDEOptions);
begin
with AOptions as TBaseCompilerOptions do
begin
UseMsgFile:=UseMsgFileCheckBox.Checked;
MsgFileName:=MsgFileEdit.Text;
CompilerMessages.Assign(TempMessages);
end;
end;
class function TCompilerMessagesOptionsFrame.SupportedOptionsClass: TAbstractIDEOptionsClass;
begin
Result:=TBaseCompilerOptions;
end;
initialization
RegisterIDEOptionsEditor(GroupCompiler, TCompilerMessagesOptionsFrame, CompilerOptionsMessages);
RegisterIDEOptionsEditor(GroupPkgCompiler, TCompilerMessagesOptionsFrame, CompilerOptionsMessages);
end.