123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340 |
- using System;
- using System.Windows.Forms;
- using System.Drawing;
- using System.ComponentModel;
- using FastReport.Utils;
- using FastReport.Controls;
- #if !MONO
- using FastReport.DevComponents.DotNetBar;
- #endif
- namespace FastReport.Design.PageDesigners.Page
- {
- #if !DEBUG
- [DesignTimeVisible(false)]
- #endif
- internal class RulerPanel : SplitContainer
- {
- #region Fields
- private HorzRuler horzRuler;
- private VertRuler vertRuler;
- private Button btnSwitchView;
- private ControlContainer controlContainer;
- private BandStructure structure;
- private ReportPageDesigner pageDesigner;
- private ReportWorkspace workspace;
- private ReportPage page;
- #endregion
- #region Properties
- public HorzRuler HorzRuler
- {
- get { return horzRuler; }
- }
- public VertRuler VertRuler
- {
- get { return vertRuler; }
- }
- public BandStructure Structure
- {
- get { return structure; }
- }
- public ReportWorkspace Workspace
- {
- get { return workspace; }
- }
- private Designer Designer
- {
- get { return pageDesigner.Designer; }
- }
- #endregion
- #region Private Methods
- private void AdjustOffset()
- {
- if (Config.RightToLeft)
- {
- horzRuler.Offset = workspace.Left;
- }
- else
- {
- horzRuler.Offset = workspace.Left + this.LogicalToDevice(24);
- }
- horzRuler.Refresh();
- vertRuler.Offset = workspace.Top;
- vertRuler.Refresh();
- structure.Offset = workspace.Top;
- structure.Refresh();
- }
- private void Workspace_LocationChanged(object sender, EventArgs e)
- {
- AdjustOffset();
- }
- private void btnSwitchView_Click(object sender, EventArgs e)
- {
- ReportWorkspace.ClassicView = !ReportWorkspace.ClassicView;
- pageDesigner.UpdateContent();
- }
- private void RulerPanel_SplitterMoved(object sender, SplitterEventArgs e)
- {
- if (Config.RightToLeft)
- {
- if (workspace.Page != null)
- workspace.Refresh();
- }
- workspace.Focus();
- }
- #endregion
- public override void Refresh()
- {
- base.Refresh();
- workspace.Refresh();
- horzRuler.Refresh();
- vertRuler.Refresh();
- structure.Refresh();
- }
- public void SetStructureVisible(bool visible)
- {
- structure.Visible = visible;
- Panel1Collapsed = !visible;
- }
- public void UpdateUIStyle()
- {
- #if !MONO
- controlContainer.ColorSchemeStyle = UIStyleUtils.GetDotNetBarStyle(Designer.UIStyle);
- controlContainer.Office2007ColorTable = UIStyleUtils.GetOffice2007ColorScheme(Designer.UIStyle);
- Color color = UIStyleUtils.GetControlColor(Designer.UIStyle);
- structure.BackColor = color;
- horzRuler.BackColor = color;
- vertRuler.BackColor = color;
- workspace.BackColor = color;
- BackColor = color;
- #else
- Color color = UIStyleUtils.GetColorTable(Designer.UIStyle).ControlBackColor;
- structure.BackColor = color;
- horzRuler.BackColor = color;
- vertRuler.BackColor = color;
- BackColor = color;
- color = UIStyleUtils.GetColorTable(Designer.UIStyle).WorkspaceBackColor;
- controlContainer.BackColor = color;
- workspace.BackColor = color;
- #endif
- }
- public void UpdateDpiDependencies()
- {
- horzRuler.Height = this.LogicalToDevice(24);
- vertRuler.Width = this.LogicalToDevice(24);
- btnSwitchView.Location = this.LogicalToDevice(new Point(4, 4));
- btnSwitchView.Size = this.LogicalToDevice(new Size(16, 16));
- btnSwitchView.Image = this.GetImage(81);
- structure.UpdateDpiDependencies();
- workspace.Refresh();
- AdjustOffset();
- }
- public RulerPanel(ReportPageDesigner pd) : base()
- {
- pageDesigner = pd;
- page = pd.Page as ReportPage;
- workspace = new ReportWorkspace(pageDesigner);
- workspace.LocationChanged += Workspace_LocationChanged;
- horzRuler = new HorzRuler(pd);
- horzRuler.Dock = DockStyle.Top;
- vertRuler = new VertRuler(pd);
- btnSwitchView = new Button();
- // apply Right to Left layout if needed
- vertRuler.Dock = Config.RightToLeft ? DockStyle.Right : DockStyle.Left;
- if (Config.RightToLeft)
- {
- btnSwitchView.Dock = DockStyle.Right;
- horzRuler.Left -= btnSwitchView.Width;
- }
- btnSwitchView.FlatStyle = FlatStyle.Flat;
- btnSwitchView.FlatAppearance.BorderColor = SystemColors.ButtonFace;
- btnSwitchView.FlatAppearance.BorderSize = 0;
- btnSwitchView.Cursor = Cursors.Hand;
- btnSwitchView.Click += btnSwitchView_Click;
- horzRuler.Controls.Add(btnSwitchView);
- structure = new BandStructure(pageDesigner);
- structure.Dock = DockStyle.Fill;
- controlContainer = new ControlContainer(this);
- controlContainer.Dock = DockStyle.Fill;
- SplitterDistance = 120;
- Panel1.Controls.Add(structure);
- Panel2.Controls.AddRange(new Control[] { controlContainer, vertRuler, horzRuler });
- Panel1MinSize = 20;
- FixedPanel = FixedPanel.Panel1;
- SplitterMoved += RulerPanel_SplitterMoved;
- }
- #if !MONO
- public class ControlContainer : PanelX
- {
- private RulerPanel rulerPanel;
- private bool allowPaint = true;
- private const int WM_PAINT = 0x000F;
- private Point mousePositionOnContent;
- private ReportWorkspace Workspace
- {
- get { return rulerPanel.Workspace; }
- }
- private void UpdateContentLocation()
- {
- Workspace.Location = new Point(RightToLeft == RightToLeft.Yes ? Width - Workspace.Width - AutoScrollPosition.X : AutoScrollPosition.X, AutoScrollPosition.Y);
- }
- private void content_Resize(object sender, EventArgs e)
- {
- Size maxSize = new Size(Workspace.Width + 10, Workspace.Height + 10);
- if (maxSize.Width > Width)
- maxSize.Height += SystemInformation.HorizontalScrollBarHeight;
- if (maxSize.Height > Height)
- maxSize.Width += SystemInformation.VerticalScrollBarWidth;
- AutoScrollMinSize = maxSize;
- AutoScrollPosition = AutoScrollPosition;
- UpdateContentLocation();
- Refresh();
- }
- private void ControlContainer_AutoScrollPositionChanged(object sender, EventArgs e)
- {
- UpdateContentLocation();
- }
- protected override void OnScroll(ScrollEventArgs se)
- {
- base.OnScroll(se);
- UpdateContentLocation();
- }
- protected override void OnPaint(PaintEventArgs e)
- {
- base.OnPaint(e);
- // draw shadow around page
- ShadowPaintInfo pi = new ShadowPaintInfo();
- pi.Graphics = e.Graphics;
- pi.Rectangle = Workspace.Bounds;
- pi.Size = 6;
- // draw shadow Right to Left if needed
- if (Config.RightToLeft)
- {
- ShadowPainter.Paint2RightToLeft(pi);
- }
- else
- {
- ShadowPainter.Paint2(pi);
- }
- }
- protected override void WndProc(ref Message m)
- {
- if ((m.Msg != WM_PAINT) || (allowPaint && m.Msg == WM_PAINT))
- {
- base.WndProc(ref m);
- }
- }
- public ControlContainer(RulerPanel rulerPanel)
- {
- this.rulerPanel = rulerPanel;
- AutoScroll = true;
- FastScrolling = false;
- Controls.Add(this.rulerPanel.Workspace);
- Workspace.Resize += content_Resize;
- AutoScrollPositionChanged += ControlContainer_AutoScrollPositionChanged;
- }
- public void BeforeZoom(MouseEventArgs e)
- {
- // avoid unnecessary redraws while zooming
- allowPaint = false;
- rulerPanel.VertRuler.allowPaint = false;
- rulerPanel.HorzRuler.allowPaint = false;
- rulerPanel.Structure.allowPaint = false;
- VScrollBar.AllowPaint = false;
- HScrollBar.AllowPaint = false;
- float zoom = Workspace.ZoomDpi;
- mousePositionOnContent = new Point((int)(e.X / zoom), (int)(e.Y / zoom));
- }
- public void AfterZoom(MouseEventArgs e)
- {
- float zoom = Workspace.ZoomDpi;
- Point delta = new Point((int)(e.X - mousePositionOnContent.X * zoom), (int)(e.Y - mousePositionOnContent.Y * zoom));
- AutoScrollPosition = new Point(Workspace.Location.X + delta.X, Workspace.Location.Y + delta.Y);
- // redraw
- rulerPanel.VertRuler.allowPaint = true;
- rulerPanel.HorzRuler.allowPaint = true;
- rulerPanel.Structure.allowPaint = true;
- VScrollBar.AllowPaint = true;
- HScrollBar.AllowPaint = true;
- allowPaint = true;
- Refresh();
- }
- }
- #else
- private class ControlContainer : FRScrollablePanel
- {
- private Control FContent;
- private void UpdateContentLocation()
- {
- FContent.Location = new Point(AutoScrollPosition.X, AutoScrollPosition.Y);
- }
- private void content_Resize(object sender, EventArgs e)
- {
- Size maxSize = new Size(FContent.Width + 10, FContent.Height + 10);
- if (maxSize.Width > Width)
- maxSize.Height += SystemInformation.HorizontalScrollBarHeight;
- if (maxSize.Height > Height)
- maxSize.Width += SystemInformation.VerticalScrollBarWidth;
- AutoScrollMinSize = maxSize;
- AutoScrollPosition = AutoScrollPosition;
- UpdateContentLocation();
- Refresh();
- }
- protected override void OnScroll(ScrollEventArgs se)
- {
- base.OnScroll(se);
- UpdateContentLocation();
- }
- public ControlContainer(RulerPanel rulerPanel)
- {
- FContent = rulerPanel.Workspace;
- AutoScroll = true;
- Controls.Add(FContent);
- FContent.Resize += content_Resize;
- }
- }
- #endif
- }
- }
|