| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 | using System;using System.Collections.Generic;using System.Text;using System.Windows.Forms;using System.Drawing;using System.Drawing.Drawing2D;using System.Drawing.Design;using System.ComponentModel;using FastReport.Utils;using FastReport.TypeEditors;using FastReport.Design.PageDesigners.Page;namespace FastReport{  /// <summary>  /// Specifies the shape of the <b>CrossBandObject</b>.  /// </summary>  internal enum CrossBandShape  {    /// <summary>    /// Specifies the vertical line shape.    /// </summary>    Line,        /// <summary>    /// Specifies the rectangle shape.    /// </summary>    Rectangle  }      /// <summary>  /// Represents an object that can be printed across several bands.  /// </summary>  internal class CrossBandObject : ReportComponentBase  {    private CrossBandShape shape;    private BandBase startBand;    private BandBase endBand;    private float endBandHeight;    #region Properties    /// <summary>    /// Gets or sets the object's shape.    /// </summary>    [DefaultValue(ShapeKind.Rectangle)]    [Category("Appearance")]    public CrossBandShape Shape    {      get { return shape; }      set { shape = value; }    }    [Category("Layout")]    public BandBase EndBand    {      get { return endBand; }      set { endBand = value; }    }    [Category("Layout")]    public float EndBandHeight    {      get { return endBandHeight; }      set       {         endBandHeight = value;        if (endBand != null)          Height = endBand.AbsTop - AbsTop + endBandHeight;      }    }    public override float Top    {      get { return base.Top; }      set      {        base.Top = value;        if (endBand != null)          endBandHeight = AbsBottom - endBand.AbsTop;      }    }        public override float Height    {      get { return base.Height; }      set      {        base.Height = value;        if (endBand != null)          endBandHeight = AbsBottom - endBand.AbsTop;      }    }    #endregion    #region Private Methods    private void FindStartEndBands()    {      startBand = null;      endBand = null;            List<BandBase> list = new List<BandBase>();      foreach (Base c in Page.AllObjects)      {        if (c is BandBase)          list.Add(c as BandBase);      }      int bandGap = ReportWorkspace.ClassicView && IsDesigning ? BandBase.HeaderSize : 4;      foreach (BandBase c in list)      {        bool topInside = AbsTop > c.AbsTop - bandGap && AbsTop < c.AbsBottom + 1;        if (topInside)        {          startBand = c;          break;        }      }      foreach (BandBase c in list)      {        bool bottomInside = AbsBottom > c.AbsTop - bandGap && AbsBottom < c.AbsBottom + 1;        if (bottomInside)        {          endBand = c;          break;        }      }    }    #endregion    #region Protected Methods    /// <inheritdoc/>    protected override SelectionPoint[] GetSelectionPoints()    {      if (Shape == CrossBandShape.Line)        return new SelectionPoint[] {          new SelectionPoint(AbsLeft, AbsTop, SizingPoint.TopCenter),          new SelectionPoint(AbsLeft, AbsTop + Height, SizingPoint.BottomCenter) };      return base.GetSelectionPoints();    }    #endregion    #region Public Methods    /// <inheritdoc/>    public override void Assign(Base source)    {      base.Assign(source);      CrossBandObject src = source as CrossBandObject;      Shape = src.Shape;      EndBand = src.EndBand;      EndBandHeight = src.EndBandHeight;    }    /// <inheritdoc/>    public override void Draw(FRPaintEventArgs e)    {      if (IsDesigning)      {        // force set height        EndBandHeight = EndBandHeight;      }            base.Draw(e);      if (Shape == CrossBandShape.Line)      {        Border.Lines = BorderLines.Left;        Width = 0;      }      Border.Draw(e, new RectangleF(AbsLeft * e.ScaleX, AbsTop * e.ScaleY, Width * e.ScaleX, Height * e.ScaleY));    }    /// <inheritdoc/>    public override bool PointInObject(PointF point)    {      using (Pen pen = new Pen(Color.Black, 10))      using (GraphicsPath path = new GraphicsPath())      {        path.AddLine(AbsLeft, AbsTop, AbsRight, AbsTop);        path.AddLine(AbsRight, AbsTop, AbsRight, AbsBottom);        path.AddLine(AbsRight, AbsBottom, AbsLeft, AbsBottom);        path.AddLine(AbsLeft, AbsBottom, AbsLeft, AbsTop);        return path.IsOutlineVisible(point, pen);      }    }    /// <inheritdoc/>    public override void CheckParent(bool immediately)    {      if (!(Parent is BandBase) || !IsSelected || IsAncestor)        return;      if (Top < 0 || Top > (Parent as BandBase).Height || EndBand == null ||        EndBandHeight < 0 || EndBandHeight > EndBand.Height)      {        FindStartEndBands();        if (startBand != null && HasFlag(Flags.CanChangeParent))        {          Top = (int)Math.Round((AbsTop - startBand.AbsTop) / Page.SnapSize.Height) * Page.SnapSize.Height;          Parent = startBand;        }        if (endBand != null)        {          Height = endBand.AbsTop - AbsTop + (int)Math.Round((AbsBottom - endBand.AbsTop) / Page.SnapSize.Height) * Page.SnapSize.Height;        }      }    }    /// <inheritdoc/>    public override void Serialize(FRWriter writer)    {      CrossBandObject c = writer.DiffObject as CrossBandObject;      base.Serialize(writer);      if (Shape != c.Shape)        writer.WriteValue("Shape", Shape);      if (EndBand != null)        writer.WriteRef("EndBand", EndBand);      if (FloatDiff(EndBandHeight, c.EndBandHeight))        writer.WriteFloat("EndBandHeight", EndBandHeight);    }    /// <inheritdoc/>    public override void OnBeforeInsert(int flags)    {      Shape = (CrossBandShape)flags;      Border.Lines = BorderLines.All;    }    #endregion    /// <summary>    /// Initializes a new instance of the <see cref="CrossBandObject"/> class with the default settings.    /// </summary>    public CrossBandObject()    {      Border.Lines = BorderLines.All;    }  }}
 |