using FastReport.Utils; using System.Drawing; using System.Drawing.Drawing2D; using System.ComponentModel; namespace FastReport.Gauge.Simple.Progress { /// /// SimpleProgressGauge pointer types /// public enum SimpleProgressPointerType { /// /// Full sized pointer /// Full, /// /// Small pointer /// Small } /// #if !DEBUG [DesignTimeVisible(false)] #endif public class SimpleProgressPointer : SimplePointer { private SimpleProgressPointerType type; private float smallPointerWidthRatio; /// /// Gets or sets the pointer type /// public SimpleProgressPointerType Type { get { return type; } set { type = value; } } /// /// Gets or sets the small pointer width ratio /// public float SmallPointerWidthRatio { get { return smallPointerWidthRatio; } set { if (value > 1) smallPointerWidthRatio = 1; else if (value < 0) smallPointerWidthRatio = 0; else smallPointerWidthRatio = value; } } /// public SimpleProgressPointer(GaugeObject parent) : base(parent) { smallPointerWidthRatio = 0.1f; } internal override void DrawHorz(FRPaintEventArgs e) { IGraphics g = e.Graphics; Pen pen = e.Cache.GetPen(BorderColor, BorderWidth * e.ScaleX, DashStyle.Solid); Left = (Parent.AbsLeft + Parent.Border.Width / 2 + HorizontalOffset) * e.ScaleX; Top = (Parent.AbsTop + Parent.Border.Width / 2 + (Parent.Height - Parent.Border.Width) / 2 - (Parent.Height - Parent.Border.Width) * PointerRatio / 2) * e.ScaleY; Height = ((Parent.Height - Parent.Border.Width) * PointerRatio) * e.ScaleY; Width = (float)((Parent.Width - Parent.Border.Width - HorizontalOffset * 2) * (Parent.Value - Parent.Minimum) / (Parent.Maximum - Parent.Minimum) * e.ScaleX); if (type == SimpleProgressPointerType.Small) { float prntWidth = (Parent.Width - Parent.Border.Width + HorizontalOffset) * e.ScaleX; float widthSml = (Parent.Width - Parent.Border.Width - HorizontalOffset * 2) * smallPointerWidthRatio * e.ScaleX; float leftSml = Left + Width - prntWidth * smallPointerWidthRatio + widthSml / 2; if (leftSml >= Left && leftSml + widthSml < Left + prntWidth) Left = leftSml; else if (leftSml + widthSml >= Left + prntWidth) Left += prntWidth - widthSml; Width = widthSml; } Brush brush = Fill.CreateBrush(new RectangleF(Left, Top, Width, Height), e.ScaleX, e.ScaleY); g.FillAndDrawRectangle(pen, brush, Left, Top, Width, Height); } internal override void DrawVert(FRPaintEventArgs e) { IGraphics g = e.Graphics; Pen pen = e.Cache.GetPen(BorderColor, BorderWidth * e.ScaleY, DashStyle.Solid); Width = ((Parent.Width - Parent.Border.Width) * PointerRatio) * e.ScaleX; Height = (float)((Parent.Height - Parent.Border.Width - HorizontalOffset * 2) * (Parent.Value - Parent.Minimum) / (Parent.Maximum - Parent.Minimum) * e.ScaleY); Left = (Parent.AbsLeft + Parent.Border.Width / 2 + (Parent.Width - Parent.Border.Width) / 2 - (Parent.Width - Parent.Border.Width) * PointerRatio / 2) * e.ScaleX; Top = (Parent.AbsTop + Parent.Border.Width / 2 + Parent.Height - Parent.Border.Width) * e.ScaleY - Height; if (type == SimpleProgressPointerType.Small) { float prntTop = (Parent.AbsTop + Parent.Border.Width / 2) * e.ScaleY; float prntHeight = (Parent.Height - Parent.Border.Width) * e.ScaleY; float heightSml = (Parent.Height - Parent.Border.Width) * smallPointerWidthRatio * e.ScaleY; float topSml = Top - heightSml / 2; if (topSml + heightSml > prntTop + prntHeight) Top = prntTop + prntHeight - heightSml; else if (topSml < prntTop) Top = prntTop; else Top = topSml; Height = heightSml; } Brush brush = Fill.CreateBrush(new RectangleF(Left, Top, Width, Height), e.ScaleX, e.ScaleY); g.FillAndDrawRectangle(pen, brush, Left, Top, Width, Height); } /// public override void Assign(GaugePointer src) { base.Assign(src); SimpleProgressPointer s = src as SimpleProgressPointer; Type = s.Type; SmallPointerWidthRatio = s.SmallPointerWidthRatio; } /// public override void Serialize(FRWriter writer, string prefix, GaugePointer diff) { base.Serialize(writer, prefix, diff); SimpleProgressPointer dc = diff as SimpleProgressPointer; if (Type != dc.Type) { writer.WriteValue(prefix + ".Type", Type); } if (SmallPointerWidthRatio != dc.SmallPointerWidthRatio) { writer.WriteValue(prefix + ".SmallPointerWidthRatio", SmallPointerWidthRatio); } } } }