using System; using System.ComponentModel; using System.Collections.Generic; using System.Diagnostics; using System.Text; using FastReport.Utils; using System.Drawing; using System.Drawing.Drawing2D; using System.IO; namespace FastReport.Map { /// /// Represents a map point. /// public partial class ShapePoint : ShapeBase { #region Fields private PointD point; private RectangleF largestBoundsRect; #endregion // Fields #region Properties /// /// Gets or sets the X-coordinate of the point. /// public double X { get { return point.X; } set { point.X = value; } } /// /// Gets or sets the Y-coordinate of the point. /// public double Y { get { return point.Y; } set { point.Y = value; } } #endregion // Properties #region Private Methods private PointF GetPoint() { float left = Map.AbsLeft + Map.Padding.Left + Map.OffsetXG; float top = Map.AbsTop + Map.Padding.Top + Map.OffsetYG; double minX = Layer.Box.MinX; double maxY = Layer.Box.MaxY; float scale = Map.ScaleG; return new PointF( left + CoordinateConverter.GetX(point.X + ShapeOffsetX, minX, scale), top + CoordinateConverter.GetY(point.Y + ShapeOffsetY, maxY, scale, Map.MercatorProjection)); } #endregion #region Public Methods /// public override void Assign(Base source) { base.Assign(source); ShapePoint src = source as ShapePoint; X = src.X; Y = src.Y; } /// public override void Draw(FRPaintEventArgs e) { PointF point = GetPoint(); point.X *= e.ScaleX; point.Y *= e.ScaleY; ShapeStyle style = UseCustomStyle ? CustomStyle : Layer.DefaultShapeStyle; float size = style.PointSize; Pen pen = e.Cache.GetPen(style.BorderColor, 1, DashStyle.Solid); Brush brush = e.Cache.GetBrush(style.FillColor); // get color & size from the layer's color & size ranges if (!IsValueEmpty) { brush = e.Cache.GetBrush(Layer.ColorRanges.GetColor(Value)); float rangeSize = Layer.SizeRanges.GetSize(Value); if (rangeSize != 0) size = rangeSize; } DrawDesign(e, ref brush, ref size); if (Map.Zoom >= Layer.LabelsVisibleAtZoom) { e.Graphics.FillAndDrawEllipse(pen, brush, point.X - size / 2, point.Y - size / 2, size, size); } largestBoundsRect = new RectangleF(point.X - 100, point.Y - 20, 200, 20); } /// public override void DrawLabel(FRPaintEventArgs e) { ShapeStyle style = UseCustomStyle ? CustomStyle : Layer.DefaultShapeStyle; string text = ""; if (Layer.LabelKind != MapLabelKind.Value) text = SpatialData.GetValue(Layer.LabelColumn); if (!IsValueEmpty) { if (Layer.LabelKind == MapLabelKind.NameAndValue || Layer.LabelKind == MapLabelKind.Value) text += "\r\n" + Value.ToString(Layer.LabelFormat); } Font font = e.Cache.GetFont(style.Font.FontFamily, IsPrinting ? style.Font.Size : style.Font.Size * e.ScaleX * 96f / DrawUtils.ScreenDpi, style.Font.Style); RectangleF textBounds = largestBoundsRect; textBounds.Offset(CenterOffsetX * e.ScaleX, CenterOffsetY * e.ScaleY); StringFormat format = e.Cache.GetStringFormat(StringAlignment.Center, StringAlignment.Center, StringTrimming.None, StringFormatFlags.NoClip, 0, 0); SolidBrush brush = e.Cache.GetBrush(style.TextColor); e.Graphics.DrawString(text, font, brush, textBounds, format); } internal void Load(Stream stream) { point.Load(stream); } internal void Save(Stream stream) { point.Save(stream); } /// public override void Serialize(FRWriter writer) { ShapePoint c = writer.DiffObject as ShapePoint; base.Serialize(writer); if (X != c.X) writer.WriteDouble("X", X); if (Y != c.Y) writer.WriteDouble("Y", Y); } /// public override bool HitTest(PointF point) { PointF pt = GetPoint(); RectangleF bounds = new RectangleF(pt.X - 16, pt.Y - 16, 16, 16); if (bounds.Contains(point)) return true; return false; } #endregion // Public Methods /// /// Initializes a new instance of the class. /// public ShapePoint() { point = new PointD(); BaseName = "Point"; } } }