FastReport_2022_VCL/Source/frxMapInteractiveLayer.pas
2024-01-01 16:13:08 +01:00

129 lines
3.1 KiB
ObjectPascal

{******************************************}
{ }
{ FastReport VCL }
{ Map Interactive Layer }
{ }
{ Copyright (c) 1998-2021 }
{ by Fast Reports Inc. }
{ }
{******************************************}
unit frxMapInteractiveLayer;
interface
{$I frx.inc}
uses
Classes,
frxMapLayer, frxMapHelpers, frxClass, frxMapShape;
type
TfrxMapInteractiveLayer = class (TfrxCustomLayer)
private
FEditedShape: TShape;
protected
procedure AddValueList(vaAnalyticalValue: Variant); override; // Empty
public
constructor Create(AOwner: TComponent); override;
procedure AddShape(const ShapeData: TShapeData);
procedure ReplaceShape(const ShapeData: TShapeData);
function IsSelectEditedShape(P: TfrxPoint; Threshold: Extended): Boolean;
function IsHighlightSelectedShape: boolean; override;
function IsHiddenShape(iRecord: Integer): Boolean; override;
function IsEditing: Boolean;
procedure CancelEditedShape(NeedRebuild: Boolean = True);
procedure RemoveEditedShape;
property EditedShape: TShape read FEditedShape;
published
property LabelColumn;
end;
implementation
uses
Math, Contnrs, Types, frxMap, frxAnaliticGeometry;
{ TfrxMapInteractiveLayer }
procedure TfrxMapInteractiveLayer.AddShape(const ShapeData: TShapeData);
begin
FShapes.AddShapeData(ShapeData);
FShapes.SetMapRectByData;
end;
procedure TfrxMapInteractiveLayer.AddValueList(vaAnalyticalValue: Variant);
begin
// Empty
end;
procedure TfrxMapInteractiveLayer.CancelEditedShape(NeedRebuild: Boolean = True);
begin
FEditedShape := nil;
TfrxMapView(MapView).NeedBuildVector := NeedRebuild;
end;
constructor TfrxMapInteractiveLayer.Create(AOwner: TComponent);
begin
inherited;
FShapes := TShapeList.Create(FConverter);
FShapes.EmbeddedData := True;
CancelEditedShape;
end;
function TfrxMapInteractiveLayer.IsEditing: Boolean;
begin
Result := FEditedShape <> nil;
end;
function TfrxMapInteractiveLayer.IsHiddenShape(iRecord: Integer): Boolean;
begin
Result := FShapes[iRecord] = EditedShape;
end;
function TfrxMapInteractiveLayer.IsHighlightSelectedShape: boolean;
begin
Result := IsDesigning;
end;
function TfrxMapInteractiveLayer.IsSelectEditedShape(P: TfrxPoint; Threshold: Extended): Boolean;
var
i: Integer;
MD: TMinDistance;
begin
MD := TMinDistance.Create(Threshold);
for i := 0 to FShapes.Count - 1 do
MD.Add(FShapes.CanvasDistance(i, P), i);
Result := MD.IsNear;
if Result then
begin
FEditedShape := FShapes[MD.Index];
TfrxMapView(MapView).NeedBuildVector := True;
end;
MD.Free;
end;
procedure TfrxMapInteractiveLayer.RemoveEditedShape;
begin
FShapes.Remove(EditedShape);
CancelEditedShape;
TfrxMapView(MapView).NeedBuildVector := True;
end;
procedure TfrxMapInteractiveLayer.ReplaceShape(const ShapeData: TShapeData);
begin
FShapes.RePlaceShapeData(FShapes.IndexOf(EditedShape), ShapeData);
FShapes.SetMapRectByData;
end;
initialization
RegisterClasses([TfrxMapInteractiveLayer]);
end.