RulerPanel.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. using System;
  2. using System.Windows.Forms;
  3. using System.Drawing;
  4. using System.ComponentModel;
  5. using FastReport.Utils;
  6. using FastReport.Controls;
  7. #if !MONO
  8. using FastReport.DevComponents.DotNetBar;
  9. #endif
  10. namespace FastReport.Design.PageDesigners.Page
  11. {
  12. #if !DEBUG
  13. [DesignTimeVisible(false)]
  14. #endif
  15. internal class RulerPanel : SplitContainer
  16. {
  17. #region Fields
  18. private HorzRuler horzRuler;
  19. private VertRuler vertRuler;
  20. private Button btnSwitchView;
  21. private ControlContainer controlContainer;
  22. private BandStructure structure;
  23. private ReportPageDesigner pageDesigner;
  24. private ReportWorkspace workspace;
  25. private ReportPage page;
  26. #endregion
  27. #region Properties
  28. public HorzRuler HorzRuler
  29. {
  30. get { return horzRuler; }
  31. }
  32. public VertRuler VertRuler
  33. {
  34. get { return vertRuler; }
  35. }
  36. public BandStructure Structure
  37. {
  38. get { return structure; }
  39. }
  40. public ReportWorkspace Workspace
  41. {
  42. get { return workspace; }
  43. }
  44. private Designer Designer
  45. {
  46. get { return pageDesigner.Designer; }
  47. }
  48. #endregion
  49. #region Private Methods
  50. private void AdjustOffset()
  51. {
  52. if (Config.RightToLeft)
  53. {
  54. horzRuler.Offset = workspace.Left;
  55. }
  56. else
  57. {
  58. horzRuler.Offset = workspace.Left + this.LogicalToDevice(24);
  59. }
  60. horzRuler.Refresh();
  61. vertRuler.Offset = workspace.Top;
  62. vertRuler.Refresh();
  63. structure.Offset = workspace.Top;
  64. structure.Refresh();
  65. }
  66. private void Workspace_LocationChanged(object sender, EventArgs e)
  67. {
  68. AdjustOffset();
  69. }
  70. private void btnSwitchView_Click(object sender, EventArgs e)
  71. {
  72. ReportWorkspace.ClassicView = !ReportWorkspace.ClassicView;
  73. pageDesigner.UpdateContent();
  74. }
  75. private void RulerPanel_SplitterMoved(object sender, SplitterEventArgs e)
  76. {
  77. if (Config.RightToLeft)
  78. {
  79. if (workspace.Page != null)
  80. workspace.Refresh();
  81. }
  82. workspace.Focus();
  83. }
  84. #endregion
  85. public override void Refresh()
  86. {
  87. base.Refresh();
  88. workspace.Refresh();
  89. horzRuler.Refresh();
  90. vertRuler.Refresh();
  91. structure.Refresh();
  92. }
  93. public void SetStructureVisible(bool visible)
  94. {
  95. structure.Visible = visible;
  96. Panel1Collapsed = !visible;
  97. }
  98. public void UpdateUIStyle()
  99. {
  100. #if !MONO
  101. controlContainer.ColorSchemeStyle = UIStyleUtils.GetDotNetBarStyle(Designer.UIStyle);
  102. controlContainer.Office2007ColorTable = UIStyleUtils.GetOffice2007ColorScheme(Designer.UIStyle);
  103. Color color = UIStyleUtils.GetControlColor(Designer.UIStyle);
  104. structure.BackColor = color;
  105. horzRuler.BackColor = color;
  106. vertRuler.BackColor = color;
  107. workspace.BackColor = color;
  108. BackColor = color;
  109. #else
  110. Color color = UIStyleUtils.GetColorTable(Designer.UIStyle).ControlBackColor;
  111. structure.BackColor = color;
  112. horzRuler.BackColor = color;
  113. vertRuler.BackColor = color;
  114. BackColor = color;
  115. color = UIStyleUtils.GetColorTable(Designer.UIStyle).WorkspaceBackColor;
  116. controlContainer.BackColor = color;
  117. workspace.BackColor = color;
  118. #endif
  119. }
  120. public void UpdateDpiDependencies()
  121. {
  122. horzRuler.Height = this.LogicalToDevice(24);
  123. vertRuler.Width = this.LogicalToDevice(24);
  124. btnSwitchView.Location = this.LogicalToDevice(new Point(4, 4));
  125. btnSwitchView.Size = this.LogicalToDevice(new Size(16, 16));
  126. btnSwitchView.Image = this.GetImage(81);
  127. structure.UpdateDpiDependencies();
  128. workspace.Refresh();
  129. AdjustOffset();
  130. }
  131. public RulerPanel(ReportPageDesigner pd) : base()
  132. {
  133. pageDesigner = pd;
  134. page = pd.Page as ReportPage;
  135. workspace = new ReportWorkspace(pageDesigner);
  136. workspace.LocationChanged += Workspace_LocationChanged;
  137. horzRuler = new HorzRuler(pd);
  138. horzRuler.Dock = DockStyle.Top;
  139. vertRuler = new VertRuler(pd);
  140. btnSwitchView = new Button();
  141. // apply Right to Left layout if needed
  142. vertRuler.Dock = Config.RightToLeft ? DockStyle.Right : DockStyle.Left;
  143. if (Config.RightToLeft)
  144. {
  145. btnSwitchView.Dock = DockStyle.Right;
  146. horzRuler.Left -= btnSwitchView.Width;
  147. }
  148. btnSwitchView.FlatStyle = FlatStyle.Flat;
  149. btnSwitchView.FlatAppearance.BorderColor = SystemColors.ButtonFace;
  150. btnSwitchView.FlatAppearance.BorderSize = 0;
  151. btnSwitchView.Cursor = Cursors.Hand;
  152. btnSwitchView.Click += btnSwitchView_Click;
  153. horzRuler.Controls.Add(btnSwitchView);
  154. structure = new BandStructure(pageDesigner);
  155. structure.Dock = DockStyle.Fill;
  156. controlContainer = new ControlContainer(this);
  157. controlContainer.Dock = DockStyle.Fill;
  158. SplitterDistance = 120;
  159. Panel1.Controls.Add(structure);
  160. Panel2.Controls.AddRange(new Control[] { controlContainer, vertRuler, horzRuler });
  161. Panel1MinSize = 20;
  162. FixedPanel = FixedPanel.Panel1;
  163. SplitterMoved += RulerPanel_SplitterMoved;
  164. }
  165. #if !MONO
  166. public class ControlContainer : PanelX
  167. {
  168. private RulerPanel rulerPanel;
  169. private bool allowPaint = true;
  170. private const int WM_PAINT = 0x000F;
  171. private Point mousePositionOnContent;
  172. private ReportWorkspace Workspace
  173. {
  174. get { return rulerPanel.Workspace; }
  175. }
  176. private void UpdateContentLocation()
  177. {
  178. Workspace.Location = new Point(RightToLeft == RightToLeft.Yes ? Width - Workspace.Width - AutoScrollPosition.X : AutoScrollPosition.X, AutoScrollPosition.Y);
  179. }
  180. private void content_Resize(object sender, EventArgs e)
  181. {
  182. Size maxSize = new Size(Workspace.Width + 10, Workspace.Height + 10);
  183. if (maxSize.Width > Width)
  184. maxSize.Height += SystemInformation.HorizontalScrollBarHeight;
  185. if (maxSize.Height > Height)
  186. maxSize.Width += SystemInformation.VerticalScrollBarWidth;
  187. AutoScrollMinSize = maxSize;
  188. AutoScrollPosition = AutoScrollPosition;
  189. UpdateContentLocation();
  190. Refresh();
  191. }
  192. private void ControlContainer_AutoScrollPositionChanged(object sender, EventArgs e)
  193. {
  194. UpdateContentLocation();
  195. }
  196. protected override void OnScroll(ScrollEventArgs se)
  197. {
  198. base.OnScroll(se);
  199. UpdateContentLocation();
  200. }
  201. protected override void OnPaint(PaintEventArgs e)
  202. {
  203. base.OnPaint(e);
  204. // draw shadow around page
  205. ShadowPaintInfo pi = new ShadowPaintInfo();
  206. pi.Graphics = e.Graphics;
  207. pi.Rectangle = Workspace.Bounds;
  208. pi.Size = 6;
  209. // draw shadow Right to Left if needed
  210. if (Config.RightToLeft)
  211. {
  212. ShadowPainter.Paint2RightToLeft(pi);
  213. }
  214. else
  215. {
  216. ShadowPainter.Paint2(pi);
  217. }
  218. }
  219. protected override void WndProc(ref Message m)
  220. {
  221. if ((m.Msg != WM_PAINT) || (allowPaint && m.Msg == WM_PAINT))
  222. {
  223. base.WndProc(ref m);
  224. }
  225. }
  226. public ControlContainer(RulerPanel rulerPanel)
  227. {
  228. this.rulerPanel = rulerPanel;
  229. AutoScroll = true;
  230. FastScrolling = false;
  231. Controls.Add(this.rulerPanel.Workspace);
  232. Workspace.Resize += content_Resize;
  233. AutoScrollPositionChanged += ControlContainer_AutoScrollPositionChanged;
  234. }
  235. public void BeforeZoom(MouseEventArgs e)
  236. {
  237. // avoid unnecessary redraws while zooming
  238. allowPaint = false;
  239. rulerPanel.VertRuler.allowPaint = false;
  240. rulerPanel.HorzRuler.allowPaint = false;
  241. rulerPanel.Structure.allowPaint = false;
  242. VScrollBar.AllowPaint = false;
  243. HScrollBar.AllowPaint = false;
  244. float zoom = Workspace.ZoomDpi;
  245. mousePositionOnContent = new Point((int)(e.X / zoom), (int)(e.Y / zoom));
  246. }
  247. public void AfterZoom(MouseEventArgs e)
  248. {
  249. float zoom = Workspace.ZoomDpi;
  250. Point delta = new Point((int)(e.X - mousePositionOnContent.X * zoom), (int)(e.Y - mousePositionOnContent.Y * zoom));
  251. AutoScrollPosition = new Point(Workspace.Location.X + delta.X, Workspace.Location.Y + delta.Y);
  252. // redraw
  253. rulerPanel.VertRuler.allowPaint = true;
  254. rulerPanel.HorzRuler.allowPaint = true;
  255. rulerPanel.Structure.allowPaint = true;
  256. VScrollBar.AllowPaint = true;
  257. HScrollBar.AllowPaint = true;
  258. allowPaint = true;
  259. Refresh();
  260. }
  261. }
  262. #else
  263. private class ControlContainer : FRScrollablePanel
  264. {
  265. private Control FContent;
  266. private void UpdateContentLocation()
  267. {
  268. FContent.Location = new Point(AutoScrollPosition.X, AutoScrollPosition.Y);
  269. }
  270. private void content_Resize(object sender, EventArgs e)
  271. {
  272. Size maxSize = new Size(FContent.Width + 10, FContent.Height + 10);
  273. if (maxSize.Width > Width)
  274. maxSize.Height += SystemInformation.HorizontalScrollBarHeight;
  275. if (maxSize.Height > Height)
  276. maxSize.Width += SystemInformation.VerticalScrollBarWidth;
  277. AutoScrollMinSize = maxSize;
  278. AutoScrollPosition = AutoScrollPosition;
  279. UpdateContentLocation();
  280. Refresh();
  281. }
  282. protected override void OnScroll(ScrollEventArgs se)
  283. {
  284. base.OnScroll(se);
  285. UpdateContentLocation();
  286. }
  287. public ControlContainer(RulerPanel rulerPanel)
  288. {
  289. FContent = rulerPanel.Workspace;
  290. AutoScroll = true;
  291. Controls.Add(FContent);
  292. FContent.Resize += content_Resize;
  293. }
  294. }
  295. #endif
  296. }
  297. }