lazarus-ccr/components/lazmapviewer/examples/fulldemo/configframe.pas
2024-04-09 22:58:42 +00:00

348 lines
10 KiB
ObjectPascal

unit ConfigFrame;
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils, IniFiles,
Graphics,
Forms, Controls, StdCtrls, Buttons, Dialogs, ExtCtrls, ColorBox, ExtDlgs, Spin,
mvMapViewer, mvEngine,
globals;
type
{ TCfgFrame }
TCfgFrame = class(TFrame)
Bevel1: TBevel;
Bevel3: TBevel;
Bevel4: TBevel;
Bevel5: TBevel;
btnLoadMapProviders: TSpeedButton;
btnPOITextFont: TButton;
btnSaveMapProviders: TSpeedButton;
btnSelectPOIImage: TButton;
cbCyclicView: TCheckBox;
cbDebugTiles: TCheckBox;
cbDoubleBuffer: TCheckBox;
cbPOITextBgColor: TColorBox;
cbPreviewTiles: TCheckBox;
cmbProviders: TComboBox;
cbUseThreads: TCheckBox;
cbZoomToCursor: TCheckBox;
clbBackColor: TColorButton;
edProxyHost: TEdit;
edProxyPassword: TEdit;
edProxyUserName: TEdit;
FontDialog: TFontDialog;
gbProxy: TGroupBox;
LblPOITextBgColor: TLabel;
LblProviders: TLabel;
lblProxyHost: TLabel;
lblProxyPassword: TLabel;
lblProxyPort: TLabel;
lblProxyUserName: TLabel;
OpenPictureDialog: TOpenPictureDialog;
rbNoProxy: TRadioButton;
rbProxyData: TRadioButton;
rbSystemProxy: TRadioButton;
rgPOIMode: TRadioGroup;
seProxyPort: TSpinEdit;
procedure btnLoadMapProvidersClick(Sender: TObject);
procedure btnPOITextFontClick(Sender: TObject);
procedure btnSaveMapProvidersClick(Sender: TObject);
procedure btnSelectPOIImageClick(Sender: TObject);
procedure cbCyclicViewChange(Sender: TObject);
procedure cbDebugTilesChange(Sender: TObject);
procedure cbDoubleBufferChange(Sender: TObject);
procedure cbPOITextBgColorChange(Sender: TObject);
procedure cbPreviewTilesChange(Sender: TObject);
procedure cbUseThreadsChange(Sender: TObject);
procedure cbZoomToCursorChange(Sender: TObject);
procedure clbBackColorColorChanged(Sender: TObject);
procedure cmbProvidersChange(Sender: TObject);
procedure rbNoProxyChange(Sender: TObject);
procedure rgPOIModeClick(Sender: TObject);
procedure rbProxyDataChange(Sender: TObject);
procedure rbSystemProxyChange(Sender: TObject);
private
FMapView: TMapView;
FPOIImage: TCustomBitmap;
FDrawGPSPointEvent: TDrawGpsPointEvent;
FUpdateLayersEvent: TNotifyEvent;
function GetMapProviders: TStrings;
function GetPOIMode: TPOIMode;
function GetPOITextBkColor: TColor;
procedure SetMapView(AValue: TMapView);
protected
procedure DoUpdateLayers; virtual;
procedure UpdateDownloadEngineProxy;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure ReadFromIni(ini: TCustomIniFile); virtual;
procedure WriteToIni(ini: TCustomIniFile); virtual;
property MapView: TMapView read FMapView write SetMapView;
property MapProviders: TStrings read GetMapProviders;
property POIMode: TPOIMode read GetPOIMode;
property POITextBkColor: TColor read GetPOITextBkColor;
property OnDrawGPSPoint: TDrawGpsPointEvent read FDrawGPSPointEvent write FDrawGPSPointEvent;
property OnUpdateLayers: TNotifyEvent read FUpdateLayersEvent write FUpdateLayersEvent;
end;
implementation
{$R *.lfm}
{ TCfgFrame }
constructor TCfgFrame.Create(AOwner: TComponent);
begin
inherited;
FPOIImage := TPortableNetworkGraphic.Create;
FPOIImage.LoadFromResourceName(HINSTANCE, 'mapmarker');
end;
destructor TCfgFrame.Destroy;
begin
FPOIImage.Free;
inherited;
end;
procedure TCfgFrame.btnLoadMapProvidersClick(Sender: TObject);
var
fn: String;
msg: String;
begin
fn := Application.Location + MAP_PROVIDER_FILENAME;
if FileExists(fn) then begin
if MapView.Engine.ReadProvidersFromXML(fn, msg) then begin
MapView.GetMapProviders(cmbProviders.Items);
cmbProviders.ItemIndex := 0;
MapView.MapProvider := cmbProviders.Text;
// sgLayers.Columns[1].PickList.Assign(cmbProviders.Items); // <<--- FIXME
end else
ShowMessage(msg);
end;
end;
procedure TCfgFrame.btnPOITextFontClick(Sender: TObject);
begin
FontDialog.Font.Assign(MapView.Font);
if FontDialog.Execute then
MapView.Font.Assign(FontDialog.Font);
end;
procedure TCfgFrame.btnSaveMapProvidersClick(Sender: TObject);
begin
MapView.Engine.WriteProvidersToXML(Application.Location + MAP_PROVIDER_FILENAME);
end;
procedure TCfgFrame.btnSelectPOIImageClick(Sender: TObject);
begin
OpenPictureDialog.Filter := 'PNG files|*.png|BMP files|*.bmp';
OpenPictureDialog.DefaultExt := '.png';
if OpenPictureDialog.Execute then
begin
FPOIImage.LoadFromFile(OpenPictureDialog.FileName);
MapView.POIImage.Assign(FPOIImage);
end;
end;
procedure TCfgFrame.cbCyclicViewChange(Sender: TObject);
begin
MapView.Cyclic := cbCyclicView.Checked;
DoUpdateLayers;
end;
procedure TCfgFrame.cbDebugTilesChange(Sender: TObject);
begin
MapView.DebugTiles := CbDebugTiles.Checked;
MapView.Invalidate;
end;
procedure TCfgFrame.cbDoubleBufferChange(Sender: TObject);
begin
MapView.DoubleBuffered := cbDoubleBuffer.Checked;
end;
procedure TCfgFrame.cbPOITextBgColorChange(Sender: TObject);
begin
MapView.POITextBgColor := cbPOITextBgColor.Selected;
end;
procedure TCfgFrame.cbPreviewTilesChange(Sender: TObject);
begin
MapView.DrawPreviewTiles := cbPreviewTiles.Checked;
end;
procedure TCfgFrame.cbUseThreadsChange(Sender: TObject);
begin
MapView.UseThreads := cbUseThreads.Checked;
DoUpdateLayers;
end;
procedure TCfgFrame.clbBackColorColorChanged(Sender: TObject);
begin
MapView.InactiveColor := clbBackColor.ButtonColor;
end;
procedure TCfgFrame.cbZoomToCursorChange(Sender: TObject);
begin
MapView.ZoomToCursor := CbZoomToCursor.Checked;
end;
procedure TCfgFrame.cmbProvidersChange(Sender: TObject);
begin
MapView.MapProvider := cmbProviders.Text;
end;
procedure TCfgFrame.DoUpdateLayers;
begin
if Assigned(FUpdateLayersEvent) then
FUpdateLayersEvent(Self);
end;
function TCfgFrame.GetMapProviders: TStrings;
begin
Result := cmbProviders.Items;
end;
function TCfgFrame.GetPOIMode: TPOIMode;
begin
Result := TPOIMode(rgPOIMode.ItemIndex);
end;
function TCfgFrame.GetPOITextBkColor: TColor;
begin
Result := cbPOITextBgColor.Selected;
end;
procedure TCfgFrame.ReadFromIni(ini: TCustomIniFile);
var
n: Integer;
begin
n := ini.ReadInteger('Proxy', 'UseProxy', 0);
case n of
0: rbNoProxy.Checked := true;
1: rbSystemProxy.Checked := true;
2: rbProxyData.Checked := true;
end;
edProxyHost.Text := ini.ReadString('Proxy', 'ProxyHost', edProxyHost.Text);
seProxyPort.Value := ini.ReadInteger('Proxy', 'ProxyPort', seProxyPort.Value);
edProxyUserName.Text := ini.ReadString('Proxy', 'ProxyName', edProxyUserName.Text);
edProxyPassword.Text := ini.ReadString('Proxy', 'ProxyPassword', edProxyPassword.Text);
UpdateDownloadEngineProxy;
// The following parameters already have been read by the main form,
// we still must update the frame controls.
MapView.GetMapProviders(cmbProviders.Items);
cmbProviders.ItemIndex := cmbProviders.Items.IndexOf(MapView.MapProvider);
clbBackColor.ButtonColor := MapView.InactiveColor;
end;
procedure TCfgFrame.rbNoProxyChange(Sender: TObject);
begin
UpdateDownloadEngineProxy;
end;
procedure TCfgFrame.rbProxyDataChange(Sender: TObject);
begin
UpdateDownloadEngineProxy;
end;
procedure TCfgFrame.rbSystemProxyChange(Sender: TObject);
begin
UpdateDownloadEngineProxy;
end;
procedure TCfgFrame.rgPOIModeClick(Sender: TObject);
begin
case rgPOIMode.ItemIndex of
0: begin // default symbol
if MapView.POIImage <> nil then MapView.POIImage.Clear;
MapView.OnDrawGPSPoint := nil;
end;
1: begin // default POI image
MapView.POIImage := FPOIImage;
MapView.OnDrawGPSPoint := nil;
end;
2: begin // image from image list, to be applied to the next POI only
//
end;
3: begin // custom-drawn symbol
if MapView.POIImage <> nil then MapView.POIImage.Clear;
MapView.OnDrawGPSPoint := FDrawGpsPointEvent;
end;
end;
MapView.Invalidate;
btnSelectPOIImage.Enabled := (rgPOIMode.ItemIndex = 1);
end;
procedure TCfgFrame.SetMapView(AValue: TMapView);
begin
if FMapView = AValue then
exit;
FMapView := AValue;
if FMapView = nil then
raise Exception.Create('[TCfgFrame.SetMapView] New mapview is nil.');
FMapView.GetMapProviders(cmbProviders.Items);
cmbProviders.ItemIndex := cmbProviders.Items.IndexOf(FMapView.MapProvider);
//sgLayers.Columns[1].PickList.Assign(CbProviders.Items); // << --- FIX ME
FMapView.DoubleBuffered := true;
FMapView.Zoom := 1;
cbZoomToCursor.Checked := FMapView.ZoomToCursor;
cbUseThreads.Checked := FMapView.UseThreads;
cbDoubleBuffer.Checked := FMapView.DoubleBuffered;
cbPOITextBgColor.Selected := FMapView.POITextBgColor;
cbPOITextBgColor.ItemHeight := cmbProviders.ItemHeight + 2;
clbBackColor.ButtonColor := FMapView.InactiveColor;
FDrawGPSpointEvent := FMapView.OnDrawGPSPoint;
end;
procedure TCfgFrame.UpdateDownloadEngineProxy;
begin
if MapView.DownloadEngine.HasProxySupport then
begin
MapView.DownloadEngine.SetProxy(
rbSystemProxy.Checked, rbProxyData.Checked,
edProxyHost.Name, seProxyPort.Value, edProxyUserName.Text, edProxyPassword.Text
);
rbSystemProxy.Enabled := MapView.DownloadEngine.SupportsSystemProxy;
lblProxyHost.Enabled := rbProxyData.Checked;
edProxyHost.Enabled := rbProxyData.Checked;
lblProxyPort.Enabled := rbProxyData.Checked;
seProxyPort.Enabled := rbProxyData.Checked;
lblProxyUserName.Enabled := rbProxyData.Checked;
edProxyUserName.Enabled := rbProxyData.Checked;
lblProxyPassword.Enabled := rbProxyData.Checked;
edProxyPassword.Enabled := rbProxyData.Checked;
end;
end;
procedure TCfgFrame.WriteToIni(ini: TCustomIniFile);
var
n: Integer = 0;
begin
if rbSystemProxy.Checked then
n := 1
else if rbProxyData.Checked then
n := 2;
ini.EraseSection('Proxy');
ini.WriteInteger('Proxy', 'UseProxy', n);
ini.WriteString('Proxy', 'ProxyHost', edProxyHost.Text);
ini.WriteInteger('Proxy', 'ProxyPort', seProxyPort.Value);
ini.WriteString('Proxy', 'ProxyName', edProxyUserName.Text);
ini.WriteString('Proxy', 'ProxyPassword', edProxyPassword.Text);
end;
end.