using System; using System.Windows.Forms; using System.Drawing; using System.ComponentModel; using System.Drawing.Drawing2D; using FastReport.Utils; using FastReport.Design.PageDesigners.Page; namespace FastReport { partial class BandBase { #region Fields internal static int HeaderSize { get { return 20; } } #endregion #region Properties /// [Browsable(false)] public override float Left { get { return base.Left; } set { base.Left = value; } } /// [Browsable(false)] public override float Top { get { return base.Top; } set { base.Top = value; } } /// [Browsable(false)] public override float Width { get { return base.Width; } set { base.Width = value; } } /// /// This property is not relevant to this class. /// [Browsable(false)] public override DockStyle Dock { get { return base.Dock; } set { base.Dock = value; } } /// /// This property is not relevant to this class. /// [Browsable(false)] public override AnchorStyles Anchor { get { return base.Anchor; } set { base.Anchor = value; } } /// /// This property is not relevant to this class. /// [Browsable(false)] public new bool GrowToBottom { get { return base.GrowToBottom; } set { base.GrowToBottom = value; } } /// /// This property is not relevant to this class. /// [Browsable(false)] public new ShiftMode ShiftMode { get { return base.ShiftMode; } set { base.ShiftMode = value; } } /// /// This property is not relevant to this class. /// [DefaultValue(false)] public new bool CanBreak { get { return base.CanBreak; } set { base.CanBreak = value; } } /// /// This property is not relevant to this class. /// [Browsable(false)] public new BreakableComponent BreakTo { get { return base.BreakTo; } set { base.BreakTo = value; } } internal bool CanDelete { get { if (Page != null) { // do not delete the sole band on the page ObjectCollection pageObjects = Page.AllObjects; ObjectCollection bands = new ObjectCollection(); foreach (Base obj in pageObjects) { // fix: it was possible to delete the band if it has a child band if (obj is BandBase && (obj == this || !(obj is ChildBand))) bands.Add(obj); } return bands.Count > 1; } else return false; } } internal float DesignWidth { get { ReportPage page = Page as ReportPage; if (page != null && page.ExtraDesignWidth) { if (page.Columns.Count <= 1 || !IsColumnDependentBand) return Width * 5; } return Width; } } #endregion #region Public Methods /// public override void DrawSelection(FRPaintEventArgs e) { DrawSelectionPoint(e, Pens.Black, Brushes.White, Left + Width / 2, Top + Height + 2); DrawSelectionPoint(e, Pens.Black, Brushes.White, Left + Width / 2, Top + 2); } /// public override bool PointInObject(PointF point) { if (IsDesigning) { if (ReportWorkspace.ClassicView) return new RectangleF(Left, Top - (HeaderSize - 1), DesignWidth, Height + HeaderSize - 1).Contains(point); else return new RectangleF(Left, Top, DesignWidth, Height).Contains(point); } return AbsBounds.Contains(point); } /// public override void HandleMouseDown(FRMouseEventArgs e) { base.HandleMouseDown(e); if (e.handled) { if (e.modifierKeys != Keys.Shift) { e.mode = WorkspaceMode2.SelectionRect; e.activeObject = this; } } } /// public override void HandleMouseHover(FRMouseEventArgs e) { base.HandleMouseHover(e); if (e.handled) e.cursor = Cursors.Default; } /// public override void HandleMouseMove(FRMouseEventArgs e) { PointF point = new PointF(e.x, e.y); if (e.button == MouseButtons.None) { e.sizingPoint = SizingPoint.None; if (point.Y > Bounds.Bottom && point.Y < Bounds.Bottom + 4) { e.mode = WorkspaceMode2.Size; e.sizingPoint = SizingPoint.BottomCenter; e.cursor = Cursors.HSplit; e.handled = true; } if (point.Y > Bounds.Top && point.Y < Bounds.Top + 4 && point.X > (Bounds.Left + Bounds.Right) / 2 - 2 && point.X < (Bounds.Left + Bounds.Right) / 2 + 2) { e.mode = WorkspaceMode2.Size; e.sizingPoint = SizingPoint.TopCenter; e.cursor = Cursors.HSplit; e.handled = true; } } else { if (e.activeObject == this && e.mode == WorkspaceMode2.Size) { if (e.sizingPoint == SizingPoint.BottomCenter) { Height += e.delta.Y; FixHeight(); } if (e.sizingPoint == SizingPoint.TopCenter) { Height -= e.delta.Y; FixHeightWithComponentsShift(e.delta.Y); } e.handled = true; } } } /// public override void HandleMouseUp(FRMouseEventArgs e) { if (e.mode == WorkspaceMode2.SelectionRect) { ObjectCollection selectedList = new ObjectCollection(); // find objects inside the selection rect for (int i = 0; i < Report.Designer.Objects.Count; i++) { Base c = Report.Designer.Objects[i]; if (c is ComponentBase && !(c is BandBase)) { e.handled = false; (c as ComponentBase).HandleMouseUp(e); // object is inside if (e.handled) selectedList.Add(c); } } if (selectedList.Count > 0) selectedList.CopyTo(Report.Designer.SelectedObjects); } FixHeight(); } /// public override SizeF GetPreferredSize() { SizeF result = new SizeF(0, 0); switch (ReportWorkspace.Grid.GridUnits) { case PageUnits.Millimeters: result = new SizeF(Units.Millimeters * 10, Units.Millimeters * 10); break; case PageUnits.Centimeters: result = new SizeF(Units.Centimeters * 1, Units.Centimeters * 1); break; case PageUnits.Inches: result = new SizeF(Units.Inches * 0.5f, Units.Inches * 0.5f); break; case PageUnits.HundrethsOfInch: result = new SizeF(Units.HundrethsOfInch * 50, Units.HundrethsOfInch * 50); break; } return result; } /// public override void Delete() { if (CanDelete) Dispose(); } internal virtual string GetInfoText() { return ""; } internal void DrawBandHeader(Graphics g, RectangleF rect, bool drawTopLine) { Color color1 = Color.Empty; if (this is GroupHeaderBand || this is GroupFooterBand) color1 = Color.FromArgb(144, 228, 0); else if (this is DataBand) color1 = Color.FromArgb(255, 144, 0); else { // select appropriate gray color switch (Report.Designer.UIStyle) { case UIStyle.VisualStudio2005: color1 = SystemColors.Control; break; case UIStyle.Office2003: color1 = Color.FromArgb(145, 180, 230); break; case UIStyle.Office2007Blue: color1 = Color.FromArgb(170, 210, 255); break; case UIStyle.Office2007Silver: #if !MONO case UIStyle.Office2010Silver: case UIStyle.Office2013: case UIStyle.VisualStudio2012Light: #endif color1 = Color.FromArgb(192, 193, 194); break; #if !MONO case UIStyle.VisualStudio2010: color1 = Color.FromArgb(188, 199, 216); break; #endif case UIStyle.Office2007Black: color1 = Color.FromArgb(143, 150, 160); break; case UIStyle.VistaGlass: color1 = Color.FromArgb(190, 200, 227); break; } } Color color2 = Color.FromArgb(100, color1); Color color3 = Color.FromArgb(180, Color.White); Color color4 = Color.Transparent; g.FillRectangle(Brushes.White, rect); using (LinearGradientBrush b = new LinearGradientBrush(rect, color1, color2, 90)) { g.FillRectangle(b, rect); } rect.Height /= 3; using (LinearGradientBrush b = new LinearGradientBrush(rect, color3, color4, 90)) { g.FillRectangle(b, rect); } if (drawTopLine) { using (Pen p = new Pen(color1)) { g.DrawLine(p, rect.Left, rect.Top, rect.Right, rect.Top); } } } /// public override ContextMenuBase GetContextMenu() { return new BandBaseMenu(Report.Designer); } /// public override void Draw(FRPaintEventArgs e) { UpdateWidth(); if (IsDesigning) { IGraphics g = e.Graphics; RectangleF bounds = Bounds; bounds.X *= e.ScaleX; bounds.Y *= e.ScaleY; bounds.Width = DesignWidth * e.ScaleX; bounds.Height *= e.ScaleY; if (ReportWorkspace.ClassicView && Width != 0) { RectangleF fillRect = new RectangleF(bounds.Left, bounds.Top - (BandBase.HeaderSize - 1) * e.ScaleY, bounds.Width, (BandBase.HeaderSize - 1) * e.ScaleY); if (bounds.Top == BandBase.HeaderSize) { fillRect.Y = 0; fillRect.Height += e.ScaleY; } DrawBandHeader(g.Graphics, fillRect, true); ObjectInfo info = RegisteredObjects.FindObject(this); string text = Res.Get(info.Text); if (GetInfoText() != "") text += ": " + GetInfoText(); fillRect.X += 4; using (Font f = new Font(DrawUtils.Default96Font.Name, DrawUtils.Default96Font.Size * Report.Designer.ZoomDpi, FontStyle.Regular)) TextRenderer.DrawText(g.Graphics, text, f, Rectangle.Round(fillRect), SystemColors.WindowText, TextFormatFlags.VerticalCenter); } g.FillRectangle(SystemBrushes.Window, bounds.Left, (int)Math.Round(bounds.Top), bounds.Width, bounds.Height + (ReportWorkspace.ClassicView ? 1 : 4)); DrawBackground(e); if (ReportWorkspace.ShowGrid) ReportWorkspace.Grid.Draw(g.Graphics, bounds, e.ScaleX); if (!ReportWorkspace.ClassicView) { Pen pen = e.Cache.GetPen(Color.Silver, 1, DashStyle.Dot); g.DrawLine(pen, bounds.Left, bounds.Bottom + 1, bounds.Right + 1, bounds.Bottom + 1); g.DrawLine(pen, bounds.Left + 1, bounds.Bottom + 2, bounds.Right + 1, bounds.Bottom + 2); g.DrawLine(pen, bounds.Left, bounds.Bottom + 3, bounds.Right + 1, bounds.Bottom + 3); } } else { DrawBackground(e); Border.Draw(e, new RectangleF(AbsLeft, AbsTop, Width, Height)); } } #endregion } }