lazarus/components/simplewebservergui/simplewebsrvoptionsframe.pas
2022-01-31 13:27:49 +01:00

262 lines
6.5 KiB
ObjectPascal

{
Author: Mattias Gaertner
}
unit SimpleWebSrvOptionsFrame;
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils, Controls, Graphics, Dialogs, StdCtrls,
FileUtil, LazFileUtils, IDEOptEditorIntf, IDEDialogs,
FileProcs, IDEOptionsIntf,
SimpleWebSrvStrConsts, SimpleWebSrvOptions, SimpleWebSrvController;
type
{ TSimpleWebSrvOptsFrame }
TSimpleWebSrvOptsFrame = class(TAbstractIDEOptionsEditor)
BindAnyCheckBox: TCheckBox;
ServerAddrLabel: TLabel;
ServerAddrComboBox: TComboBox;
PortComboBox: TComboBox;
PortLabel: TLabel;
ServerExeBrowseButton: TButton;
ServerExeComboBox: TComboBox;
ServerExeLabel: TLabel;
procedure ServerExeBrowseButtonClick(Sender: TObject);
private
FOldOptions: TSimpleWebServerOptions;
procedure SetCombobox(aComboBox: TComboBox; const aValue: string; ListItems: TStrings);
procedure SetComboBoxText(aComboBox: TComboBox; const aValue: string);
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
function GetTitle: String; override;
procedure ReadSettings({%H-}AOptions: TAbstractIDEOptions); override;
procedure Setup({%H-}ADialog: TAbstractOptionsEditorDialog); override;
class function SupportedOptionsClass: TAbstractIDEOptionsClass; override;
procedure WriteSettings({%H-}AOptions: TAbstractIDEOptions); override;
procedure RestoreSettings({%H-}AOptions: TAbstractIDEOptions); override;
property OldOptions: TSimpleWebServerOptions read FOldOptions;
end;
var
SimpleWebSrvOptsFrame: TSimpleWebSrvOptsFrame;
SimpleWebServerOptionID: integer = 1000; // IDE frame ID, set by Register
implementation
{$R *.lfm}
procedure SetComboBoxText(Box: TComboBox; NewText: string; CaseSensitive: boolean; aCapacity: integer = 30);
function IsSame(const A,B: string): boolean;
begin
if CaseSensitive then
Result:=A=B
else
Result:=SameText(A,B);
end;
var
i: Integer;
begin
if IsSame(Box.Text,NewText) then exit;
i:=0;
while (i<Box.Items.Count) and not IsSame(Box.Items[i],NewText) do inc(i);
if i=Box.Items.Count then
begin
Box.Items.Insert(0,NewText);
i:=0;
if Box.Items.Count>aCapacity then
Box.Items.Delete(Box.Items.Count-1);
end else begin
// move to top
Box.Items.Move(i,0);
i:=0;
end;
Box.ItemIndex:=i;
Box.Text:=NewText;
end;
{ TSimpleWebSrvOptsFrame }
procedure TSimpleWebSrvOptsFrame.ServerExeBrowseButtonClick(Sender: TObject);
var
Dlg: TOpenDialog;
ExpExe, ErrMsg: String;
begin
Dlg:=TOpenDialog.Create(nil);
try
Dlg.Title:='Select compileserver'+GetExeExt;
Dlg.Options:=Dlg.Options+[ofFileMustExist];
if not Dlg.Execute then exit;
ExpExe:=ExpandFileNameUTF8(Dlg.FileName);
ServerExeComboBox.Text:=ExpExe;
ErrMsg:=CheckCompileServerExeQuality(ExpExe,'',true);
if ErrMsg<>'' then
IDEMessageDialog('Invalid compileserver'+GetExeExt,
ErrMsg,mtError,[mbOk]);
finally
Dlg.Free;
end;
end;
procedure TSimpleWebSrvOptsFrame.SetCombobox(aComboBox: TComboBox;
const aValue: string; ListItems: TStrings);
begin
aComboBox.Items.Assign(ListItems);
SetComboBoxText(aComboBox,aValue);
end;
procedure TSimpleWebSrvOptsFrame.SetComboBoxText(aComboBox: TComboBox;
const aValue: string);
var
i: Integer;
begin
for i:=0 to aComboBox.Items.Count-1 do
if aComboBox.Items[i]=aValue then
begin
aComboBox.ItemIndex:=i;
exit;
end;
aComboBox.Items.Insert(0,aValue);
aComboBox.ItemIndex:=0;
end;
constructor TSimpleWebSrvOptsFrame.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
FOldOptions:=TSimpleWebServerOptions.Create;
end;
destructor TSimpleWebSrvOptsFrame.Destroy;
begin
FreeAndNil(FOldOptions);
inherited Destroy;
end;
function TSimpleWebSrvOptsFrame.GetTitle: String;
begin
Result:=rsSWSTitle;
end;
procedure TSimpleWebSrvOptsFrame.ReadSettings(AOptions: TAbstractIDEOptions);
procedure AddDefault(sl: TStringList; aValue: string);
begin
if sl.IndexOf(aValue)<0 then
sl.Add(aValue);
end;
var
sl: TStringList;
Options: TSimpleWebServerOptions;
begin
if not (AOptions is SupportedOptionsClass) then exit;
Options:=SimpleWebServerController.Options;
OldOptions.Assign(Options);
sl:=TStringList.Create;
try
sl.Assign(Options.RecentLists[swsrlServerExe]);
AddDefault(sl,Options.GetDefaultServerExe);
SetCombobox(ServerExeComboBox,Options.ServerExe,sl);
sl.Assign(Options.RecentLists[swsrlServerAddr]);
AddDefault(sl,SWSDefaultServerAddr);
SetCombobox(ServerAddrComboBox,Options.ServerAddr,sl);
BindAnyCheckBox.Checked:=Options.BindAny;
sl.Assign(Options.RecentLists[swsrlServerPort]);
AddDefault(sl,IntToStr(SWSDefaultServerPort));
SetCombobox(PortComboBox,IntToStr(Options.Port),sl);
finally
sl.Free;
end;
end;
procedure TSimpleWebSrvOptsFrame.Setup(ADialog: TAbstractOptionsEditorDialog);
begin
ServerExeLabel.Caption:=rsSWSPathOfCompileserver;
ServerAddrLabel.Caption:=rsSWSAddress;
BindAnyCheckBox.Caption:=rsSWSBindAny+' (0.0.0.0)';
PortLabel.Caption:=rsSWSPort;
end;
class function TSimpleWebSrvOptsFrame.SupportedOptionsClass: TAbstractIDEOptionsClass;
begin
Result:=TAbstractIDEEnvironmentOptions;
end;
procedure TSimpleWebSrvOptsFrame.WriteSettings(AOptions: TAbstractIDEOptions);
var
Options: TSimpleWebServerOptions;
procedure SetRecentList(List: TSWSRecentList; Items: TStrings; const aValue: string);
var
i: Integer;
begin
i:=Items.Count-1;
while i>=0 do
begin
if Items[i]=aValue then
begin
Items.Move(i,0);
break;
end;
dec(i);
end;
if i<0 then
begin
Items.Insert(0,aValue);
if Items.Count>30 then
Items.Delete(Items.Count-1);
end;
Options.RecentLists[List]:=Items;
end;
var
s: string;
i: LongInt;
begin
Options:=SimpleWebServerController.Options;
s:=Trim(ServerExeComboBox.Text);
if s<>'' then
Options.ServerExe:=s;
SetRecentList(swsrlServerExe,ServerExeComboBox.Items,Options.ServerExe);
s:=Trim(ServerAddrComboBox.Text);
if s<>'' then
Options.ServerAddr:=s;
SetRecentList(swsrlServerAddr,ServerAddrComboBox.Items,Options.ServerAddr);
Options.BindAny:=BindAnyCheckBox.Checked;
s:=Trim(PortComboBox.Text);
i:=StrToIntDef(s,0);
if (i>0) and (i<=65535) then
Options.Port:=i;
SetRecentList(swsrlServerPort,PortComboBox.Items,IntToStr(Options.Port));
if Options.Modified then
begin
Options.SaveSafe;
Options.Apply;
end;
end;
procedure TSimpleWebSrvOptsFrame.RestoreSettings(AOptions: TAbstractIDEOptions);
begin
inherited RestoreSettings(AOptions);
end;
end.