PreviewWorkspace.cs 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Windows.Forms;
  5. using System.Drawing.Drawing2D;
  6. using System.ComponentModel;
  7. using System.Diagnostics;
  8. using FastReport.Utils;
  9. #if !MONO
  10. using FastReport.DevComponents.DotNetBar;
  11. #else
  12. using FastReport.Controls;
  13. #endif
  14. namespace FastReport.Preview
  15. {
  16. internal enum PreviewZoomMode
  17. {
  18. Normal,
  19. PageWidth,
  20. WholePage
  21. }
  22. #if !MONO
  23. #if !DEBUG
  24. [DesignTimeVisible(false)]
  25. #endif
  26. internal class PreviewWorkspace : PanelX
  27. #else
  28. internal class PreviewWorkspace : FRScrollablePanel
  29. #endif
  30. {
  31. #region Fields
  32. private PreviewTab previewTab;
  33. private PreviewPages previewPages;
  34. private float zoom;
  35. private PreviewZoomMode zoomMode;
  36. private int pageNo;
  37. private Point lastMousePoint;
  38. private Cursor curHand;
  39. private Cursor curHandMove;
  40. private ReportComponentBase activeObject;
  41. private SearchInfo searchInfo;
  42. private bool locked;
  43. private bool layoutLocked;
  44. private bool allowPaint = true;
  45. #endregion
  46. #region Properties
  47. private PreviewTab PreviewTab
  48. {
  49. get { return previewTab; }
  50. }
  51. private PreviewControl Preview
  52. {
  53. get { return PreviewTab.Preview; }
  54. }
  55. private Report Report
  56. {
  57. get { return PreviewTab.Report; }
  58. }
  59. private PreparedPages PreparedPages
  60. {
  61. get { return PreviewTab.PreparedPages; }
  62. }
  63. private PreviewPages PreviewPages
  64. {
  65. get { return previewPages; }
  66. }
  67. public int PageNo
  68. {
  69. get { return pageNo; }
  70. set { SetPageNo(value, true); }
  71. }
  72. public int PageCount
  73. {
  74. get { return PreparedPages.Count; }
  75. }
  76. public float Zoom
  77. {
  78. get { return zoom; }
  79. set { DoZoom(value); }
  80. }
  81. public float ZoomDpi
  82. {
  83. get { return zoom * this.DpiMultiplier(); }
  84. }
  85. public SearchInfo SearchInfo
  86. {
  87. get { return searchInfo; }
  88. set { searchInfo = value; }
  89. }
  90. private Point Offset
  91. {
  92. get { return new Point(-AutoScrollPosition.X, -AutoScrollPosition.Y); }
  93. set
  94. {
  95. AutoScrollPosition = new Point(-value.X, -value.Y);
  96. FindPageNo();
  97. }
  98. }
  99. private GraphicCache GraphicCache
  100. {
  101. get { return Report.GraphicCache; }
  102. }
  103. public bool Disabled
  104. {
  105. get { return PageCount == 0 || locked || layoutLocked; }
  106. }
  107. #endregion
  108. #region Private Methods
  109. private void SetPageNo(int value, bool scrollTo)
  110. {
  111. if (value > PageCount)
  112. value = PageCount;
  113. if (value < 1)
  114. value = 1;
  115. bool pageChanged = value != pageNo;
  116. pageNo = value;
  117. if (Disabled)
  118. return;
  119. if (scrollTo)
  120. ScrollToCurrentPage();
  121. // update active page border
  122. if (pageChanged)
  123. {
  124. Invalidate();
  125. UpdatePageNumbers();
  126. }
  127. }
  128. private void ScrollToCurrentPage()
  129. {
  130. Rectangle pageBounds = previewPages.GetPageBounds(PageNo - 1);
  131. pageBounds.Y -= 10;
  132. Offset = pageBounds.Location;
  133. }
  134. private void FindPageNo()
  135. {
  136. int pageNo = PreviewPages.FindPage(Offset.Y) + 1;
  137. if (!PreviewPages.IsSameRow(pageNo - 1, PageNo - 1))
  138. SetPageNo(pageNo, false);
  139. }
  140. private void DrawPages(Graphics g)
  141. {
  142. if (Disabled)
  143. return;
  144. // draw visible pages
  145. int firstVisible = PreviewPages.FindFirstVisiblePage(Offset.Y);
  146. int lastVisible = PreviewPages.FindLastVisiblePage(Offset.Y + ClientSize.Height);
  147. // draw pages from right to left if needed
  148. if (Config.RightToLeft)
  149. {
  150. int i = firstVisible;
  151. while (i <= lastVisible)
  152. {
  153. List<int> pagesInSameRow = new List<int>();
  154. pagesInSameRow.Add(i);
  155. // get list of pages in current row
  156. while (PreviewPages.IsSameRow(i, i + 1))
  157. {
  158. pagesInSameRow.Add(i + 1);
  159. i++;
  160. }
  161. if (pagesInSameRow.Count > 1)
  162. {
  163. // swap pages in current row
  164. for (int j = 0, k = pagesInSameRow.Count - 1; j < k; j++, k--)
  165. {
  166. PreviewPages.SwapPageBounds(pagesInSameRow[j], pagesInSameRow[k]);
  167. }
  168. }
  169. i++;
  170. }
  171. }
  172. for (int i = firstVisible; i <= lastVisible; i++)
  173. {
  174. Rectangle pageBounds = PreviewPages.GetPageBounds(i);
  175. pageBounds.Offset(-Offset.X, -Offset.Y);
  176. ReportPage page = PreparedPages.GetCachedPage(i);
  177. #if !MONO
  178. // draw shadow around page
  179. bool drawShadow = !(Preview.ActivePageBorderColor == Color.White && Preview.BackColor == Color.White);
  180. if (drawShadow)
  181. {
  182. ShadowPaintInfo pi = new ShadowPaintInfo();
  183. pi.Graphics = g;
  184. pi.Rectangle = new Rectangle(pageBounds.Left - 4, pageBounds.Top - 4, pageBounds.Width + 4, pageBounds.Height + 4);
  185. pi.Size = 5;
  186. ShadowPainter.Paint2(pi);
  187. }
  188. #endif
  189. // shift the origin because page.Draw draws at 0, 0
  190. g.TranslateTransform((int)pageBounds.Left, (int)pageBounds.Top);
  191. FRPaintEventArgs e;
  192. if (Config.IsRunningOnMono)
  193. {
  194. g.ScaleTransform(ZoomDpi, ZoomDpi);
  195. e = new FRPaintEventArgs(g, 1, 1, GraphicCache);
  196. }
  197. else
  198. {
  199. e = new FRPaintEventArgs(g, ZoomDpi, ZoomDpi, GraphicCache);
  200. }
  201. // draw page
  202. page.Draw(e);
  203. // draw search highlight
  204. if (SearchInfo != null && SearchInfo.visible && SearchInfo.pageNo == i + 1)
  205. page.DrawSearchHighlight(e, SearchInfo.objNo, SearchInfo.ranges[SearchInfo.rangeNo]);
  206. g.ResetTransform();
  207. // draw border around active page
  208. if (i == PageNo - 1)
  209. {
  210. Pen borderPen = GraphicCache.GetPen(Preview.ActivePageBorderColor, 2, DashStyle.Solid);
  211. pageBounds.Inflate(-1, -1);
  212. g.DrawRectangle(borderPen, pageBounds);
  213. }
  214. }
  215. }
  216. private void DoZoom(float zoom)
  217. {
  218. DoZoom(zoom, new Point(Width / 2, Height / 2));
  219. }
  220. private void DoZoom(float zoom, Point relativeTo)
  221. {
  222. // pause control painting
  223. // if you don't do this, the page will flicker while zooming
  224. allowPaint = false;
  225. {
  226. Point mouse_position_on_workspace = new Point(Offset.X + relativeTo.X, Offset.Y + relativeTo.Y);
  227. PointF mouse_position_on_page_percent = new PointF();
  228. int pageNo = -1;
  229. // todo: avoid try/catch, upd: if catch does not happen, remove it
  230. try
  231. {
  232. // if(PreparedPages.Count)
  233. pageNo = PreviewPages.FindPage(mouse_position_on_workspace.X, mouse_position_on_workspace.Y);
  234. Rectangle pageBounds = PreviewPages.GetPageBounds(pageNo);
  235. if (pageBounds.Width > 0 && pageBounds.Height > 0)
  236. {
  237. mouse_position_on_page_percent.X = (float)(mouse_position_on_workspace.X - pageBounds.X) / (float)pageBounds.Width;
  238. mouse_position_on_page_percent.Y = (float)(mouse_position_on_workspace.Y - pageBounds.Y) / (float)pageBounds.Height;
  239. }
  240. }
  241. catch { }
  242. // apply zoom value
  243. {
  244. if (zoom < 0.1f)
  245. zoom = 0.1f;
  246. if (zoom > 10)
  247. zoom = 10;
  248. if (Math.Abs(this.zoom - 0.1f) < 0.001 && Math.Abs(zoom - 0.35f) < 0.001)
  249. zoom = 0.25f;
  250. this.zoom = zoom;
  251. zoomMode = PreviewZoomMode.Normal;
  252. Preview.UpdateZoom(zoom);
  253. UpdatePages();
  254. }
  255. if (pageNo >= 0 && pageNo < PreviewPages.Count)
  256. {
  257. Rectangle pageBounds = PreviewPages.GetPageBounds(pageNo);
  258. Point mouse_position_on_page_new = new Point(
  259. (int)(pageBounds.Width * mouse_position_on_page_percent.X),
  260. (int)(pageBounds.Height * mouse_position_on_page_percent.Y));
  261. Offset = new Point(pageBounds.X + mouse_position_on_page_new.X - relativeTo.X, pageBounds.Y + mouse_position_on_page_new.Y - relativeTo.Y);
  262. }
  263. else
  264. AutoScrollPosition = AutoScrollPosition;
  265. }
  266. allowPaint = true;
  267. Refresh();
  268. }
  269. #endregion
  270. #region Protected Methods
  271. protected override void OnPaint(PaintEventArgs e)
  272. {
  273. BackColor = Preview.BackColor;
  274. BackgroundImage = Preview.BackgroundImage;
  275. BackgroundImageLayout = Preview.BackgroundImageLayout;
  276. DefaultPaint = Preview.UseBackColor;
  277. base.OnPaint(e);
  278. DrawPages(e.Graphics);
  279. }
  280. protected override void OnMouseDown(MouseEventArgs e)
  281. {
  282. base.OnMouseDown(e);
  283. if (Disabled)
  284. return;
  285. int pageNo = PreviewPages.FindPage(Offset.X + e.X, Offset.Y + e.Y);
  286. ReportPage page = PreparedPages.GetCachedPage(pageNo);
  287. Rectangle pageBounds = PreviewPages.GetPageBounds(pageNo);
  288. SetPageNo(pageNo + 1, false);
  289. Cursor = curHandMove;
  290. lastMousePoint = e.Location;
  291. // reset page's NeedRefresh flag
  292. page.NeedRefresh = false;
  293. page.NeedModify = false;
  294. // generate mousedown event
  295. if (activeObject != null)
  296. {
  297. activeObject.OnMouseDown(new MouseEventArgs(e.Button, e.Clicks,
  298. (int)Math.Round((Offset.X + e.X - pageBounds.X) / ZoomDpi - page.LeftMargin * Units.Millimeters - activeObject.AbsLeft),
  299. (int)Math.Round((Offset.Y + e.Y - pageBounds.Y) / ZoomDpi - page.TopMargin * Units.Millimeters - activeObject.AbsTop),
  300. e.Delta));
  301. }
  302. // reset search highlight
  303. if (SearchInfo != null && SearchInfo.visible)
  304. {
  305. SearchInfo.visible = false;
  306. Refresh();
  307. }
  308. // modify and refresh the page if requested in the object's script
  309. if (page.NeedModify)
  310. PreparedPages.ModifyPage(pageNo, page);
  311. if (page.NeedRefresh)
  312. Refresh();
  313. }
  314. protected override void OnMouseMove(MouseEventArgs e)
  315. {
  316. base.OnMouseMove(e);
  317. if (Disabled)
  318. return;
  319. // find an object under mouse
  320. int pageNo = PreviewPages.FindPage(Offset.X + e.X, Offset.Y + e.Y);
  321. ReportPage page = PreparedPages.GetCachedPage(pageNo);
  322. Rectangle pageBounds = PreviewPages.GetPageBounds(pageNo);
  323. ReportComponentBase obj = page.HitTest(new PointF((Offset.X + e.X - pageBounds.X) / ZoomDpi,
  324. (Offset.Y + e.Y - pageBounds.Y) / ZoomDpi));
  325. // reset page's NeedRefresh flag
  326. page.NeedRefresh = false;
  327. page.NeedModify = false;
  328. // generate mouse enter, mouseleave events
  329. if (obj != activeObject)
  330. {
  331. if (activeObject != null)
  332. activeObject.OnMouseLeave(EventArgs.Empty);
  333. if (obj != null)
  334. obj.OnMouseEnter(EventArgs.Empty);
  335. }
  336. activeObject = obj;
  337. // generate mousemove event
  338. if (activeObject != null)
  339. {
  340. activeObject.OnMouseMove(new MouseEventArgs(e.Button, e.Clicks,
  341. (int)Math.Round((Offset.X + e.X - pageBounds.X) / ZoomDpi - page.LeftMargin * Units.Millimeters - activeObject.AbsLeft),
  342. (int)Math.Round((Offset.Y + e.Y - pageBounds.Y) / ZoomDpi - page.TopMargin * Units.Millimeters - activeObject.AbsTop),
  343. e.Delta));
  344. }
  345. string url = "";
  346. Cursor cursor = Cursors.Default;
  347. if (obj != null)
  348. {
  349. cursor = obj.Cursor;
  350. url = obj.Hyperlink.Value;
  351. }
  352. Cursor = cursor == Cursors.Default ? (e.Button == MouseButtons.Left ? curHandMove : curHand) : cursor;
  353. Preview.UpdateUrl(url);
  354. // prevent report panning if active object supports mouse events (currently Map object only)
  355. if (activeObject == null || !activeObject.HasFlag(Flags.InterceptsPreviewMouseEvents))
  356. if (e.Button == MouseButtons.Left)
  357. {
  358. Offset = new Point(Offset.X - (e.X - lastMousePoint.X), Offset.Y - (e.Y - lastMousePoint.Y));
  359. lastMousePoint = e.Location;
  360. }
  361. // refresh page if requested in the object's script
  362. if (page.NeedModify)
  363. PreparedPages.ModifyPage(pageNo, page);
  364. if (page.NeedRefresh)
  365. Refresh();
  366. }
  367. protected override void OnMouseUp(MouseEventArgs e)
  368. {
  369. base.OnMouseUp(e);
  370. if (Disabled)
  371. return;
  372. Cursor = curHand;
  373. // find object under mouse to invoke its PreviewClick event
  374. int pageNo = PreviewPages.FindPage(Offset.X + e.X, Offset.Y + e.Y);
  375. ReportPage page = PreparedPages.GetCachedPage(pageNo);
  376. Rectangle pageBounds = PreviewPages.GetPageBounds(pageNo);
  377. // reset NeedRefresh flag
  378. page.NeedRefresh = false;
  379. page.NeedModify = false;
  380. Report.NeedRefresh = false;
  381. // generate mouseup event
  382. if (activeObject != null)
  383. {
  384. activeObject.OnMouseUp(new MouseEventArgs(e.Button, e.Clicks,
  385. (int)Math.Round((Offset.X + e.X - pageBounds.X) / ZoomDpi - page.LeftMargin * Units.Millimeters - activeObject.AbsLeft),
  386. (int)Math.Round((Offset.Y + e.Y - pageBounds.Y) / ZoomDpi - page.TopMargin * Units.Millimeters - activeObject.AbsTop),
  387. e.Delta));
  388. Hyperlink hyperlink = activeObject.Hyperlink;
  389. switch (hyperlink.Kind)
  390. {
  391. case HyperlinkKind.URL:
  392. try
  393. {
  394. if (!String.IsNullOrEmpty(hyperlink.Value))
  395. ProcessHelper.StartProcess(hyperlink.Value);
  396. }
  397. catch
  398. {
  399. }
  400. break;
  401. case HyperlinkKind.PageNumber:
  402. PageNo = int.Parse(hyperlink.Value);
  403. break;
  404. case HyperlinkKind.Bookmark:
  405. Bookmarks.BookmarkItem bookmark = PreparedPages.Bookmarks.Find(hyperlink.Value);
  406. if (bookmark != null)
  407. PositionTo(bookmark.pageNo + 1, new PointF(0, bookmark.offsetY));
  408. break;
  409. case HyperlinkKind.DetailReport:
  410. if (hyperlink.Value == "")
  411. break;
  412. // if detail report name is empty, refresh this report
  413. if (String.IsNullOrEmpty(hyperlink.DetailReportName))
  414. {
  415. hyperlink.SetParameters(Report);
  416. Report.NeedRefresh = true;
  417. }
  418. else
  419. {
  420. // open a new report. check if such tab is opened already
  421. // check if this tab equals to the hyperlink value, open a new tab if so
  422. if (PreviewTab.HyperlinkValue == hyperlink.Value || !Preview.SwitchToTab(hyperlink))
  423. {
  424. locked = true;
  425. try
  426. {
  427. Report report = hyperlink.GetReport(true);
  428. report.Prepare();
  429. Preview.AddPreviewTab(report, hyperlink.Value, hyperlink, true);
  430. }
  431. finally
  432. {
  433. locked = false;
  434. }
  435. }
  436. }
  437. break;
  438. case HyperlinkKind.DetailPage:
  439. if (hyperlink.Value == "")
  440. break;
  441. ReportPage reportPage = Report.FindObject(hyperlink.DetailPageName) as ReportPage;
  442. if (reportPage != null)
  443. {
  444. hyperlink.SetParameters(Report);
  445. // open a new report. check if such tab is opened already
  446. // check if this tab equals to the hyperlink value, open a new tab if so
  447. if (PreviewTab.HyperlinkValue == hyperlink.Value || !Preview.SwitchToTab(hyperlink))
  448. {
  449. locked = true;
  450. Preview.Lock();
  451. PreparedPages pages = new PreparedPages(Report);
  452. try
  453. {
  454. Report.SetPreparedPages(pages);
  455. Report.PreparePage(reportPage);
  456. }
  457. finally
  458. {
  459. locked = false;
  460. Preview.Unlock();
  461. Preview.AddPreviewTab(Report, hyperlink.Value, hyperlink, true);
  462. }
  463. }
  464. }
  465. break;
  466. }
  467. if (activeObject != null)
  468. activeObject.OnClick(e);
  469. }
  470. // modify and refresh the page if requested in the object's script
  471. if (page.NeedModify)
  472. PreparedPages.ModifyPage(pageNo, page);
  473. if (page.NeedRefresh)
  474. Refresh();
  475. if (Report.NeedRefresh)
  476. RefreshReport();
  477. }
  478. protected override void OnClick(EventArgs e)
  479. {
  480. base.OnClick(e);
  481. if (Disabled)
  482. return;
  483. Preview.DoClick();
  484. }
  485. protected override void OnMouseWheel(MouseEventArgs e)
  486. {
  487. base.OnMouseWheel(e);
  488. if (Disabled)
  489. return;
  490. if ((ModifierKeys & Keys.Control) != 0)
  491. DoZoom(zoom + Math.Sign(e.Delta) * 0.25f, new Point(e.X, e.Y));
  492. else if (ModifierKeys == Keys.Shift)
  493. {
  494. #if !MONO
  495. DoHorizontalMouseWheel(e);
  496. #endif
  497. }
  498. else
  499. {
  500. if (activeObject != null && activeObject.HasFlag(Flags.InterceptsPreviewMouseEvents))
  501. {
  502. activeObject.OnMouseWheel(e);
  503. Refresh();
  504. }
  505. else
  506. {
  507. #if !MONO
  508. DoMouseWheel(e);
  509. #endif
  510. FindPageNo();
  511. }
  512. }
  513. }
  514. protected override void OnKeyDown(KeyEventArgs e)
  515. {
  516. if (Config.DisableHotkeys)
  517. return;
  518. base.OnKeyDown(e);
  519. if (Disabled)
  520. return;
  521. if ((e.KeyData & Keys.Control) == 0)
  522. {
  523. switch (e.KeyCode)
  524. {
  525. case Keys.Up:
  526. Offset = new Point(Offset.X, Offset.Y - VScrollBar.SmallChange);
  527. break;
  528. case Keys.Down:
  529. Offset = new Point(Offset.X, Offset.Y + VScrollBar.SmallChange);
  530. break;
  531. case Keys.Left:
  532. Offset = new Point(Offset.X - HScrollBar.SmallChange, Offset.Y);
  533. break;
  534. case Keys.Right:
  535. Offset = new Point(Offset.X + HScrollBar.SmallChange, Offset.Y);
  536. break;
  537. case Keys.PageUp:
  538. Offset = new Point(Offset.X, Offset.Y - VScrollBar.LargeChange);
  539. break;
  540. case Keys.PageDown:
  541. Offset = new Point(Offset.X, Offset.Y + VScrollBar.LargeChange);
  542. break;
  543. case Keys.Home:
  544. PreviewTab.First();
  545. break;
  546. case Keys.End:
  547. PreviewTab.Last();
  548. break;
  549. case Keys.Add:
  550. PreviewTab.ZoomIn();
  551. break;
  552. case Keys.Subtract:
  553. PreviewTab.ZoomOut();
  554. break;
  555. }
  556. }
  557. else
  558. {
  559. switch (e.KeyCode)
  560. {
  561. case Keys.F:
  562. if ((Preview.Buttons & PreviewButtons.Find) != 0)
  563. PreviewTab.Find();
  564. break;
  565. case Keys.P:
  566. if ((Preview.Buttons & PreviewButtons.Print) != 0)
  567. PreviewTab.Print();
  568. break;
  569. }
  570. }
  571. }
  572. protected override bool IsInputKey(Keys keyData)
  573. {
  574. return (keyData & Keys.Up) != 0 || (keyData & Keys.Down) != 0 ||
  575. (keyData & Keys.Left) != 0 || (keyData & Keys.Right) != 0;
  576. }
  577. protected override void OnScroll(ScrollEventArgs se)
  578. {
  579. base.OnScroll(se);
  580. if (Disabled)
  581. return;
  582. if (se.ScrollOrientation == ScrollOrientation.VerticalScroll)
  583. FindPageNo();
  584. }
  585. protected override void OnResize(EventArgs e)
  586. {
  587. base.OnResize(e);
  588. if (Disabled)
  589. return;
  590. if (zoomMode == PreviewZoomMode.PageWidth)
  591. ZoomPageWidth();
  592. else if (zoomMode == PreviewZoomMode.WholePage)
  593. ZoomWholePage();
  594. }
  595. #if !MONO
  596. private const int WM_PAINT = 0x000F;
  597. protected override void WndProc(ref Message m)
  598. {
  599. if ((m.Msg != WM_PAINT) || (allowPaint && m.Msg == WM_PAINT))
  600. {
  601. base.WndProc(ref m);
  602. }
  603. }
  604. #endif
  605. #endregion
  606. #region Public Methods
  607. public void UpdatePages()
  608. {
  609. PreviewPages.Clear();
  610. if (layoutLocked)
  611. return;
  612. for (int i = 0; i < PreparedPages.Count; i++)
  613. {
  614. SizeF pageSize = PreparedPages.GetPageSize(i);
  615. PreviewPages.AddPage(pageSize, ZoomDpi);
  616. }
  617. PreviewPages.LayoutPages(Width - SystemInformation.VerticalScrollBarWidth, Preview.PageOffset);
  618. locked = false;
  619. UpdatePageNumbers();
  620. Size maxSize = PreviewPages.GetMaxSize(Preview.PageOffset);
  621. if (maxSize.Width > Width - SystemInformation.VerticalScrollBarWidth)
  622. maxSize.Height += SystemInformation.HorizontalScrollBarHeight;
  623. if (maxSize.Height > Height - SystemInformation.HorizontalScrollBarHeight)
  624. maxSize.Width += SystemInformation.VerticalScrollBarWidth;
  625. AutoScrollMinSize = maxSize;
  626. SetPageNo(PageNo, false);
  627. Refresh();
  628. }
  629. public void UpdatePageNumbers()
  630. {
  631. Preview.UpdatePageNumbers(PageNo, PageCount);
  632. }
  633. public void PositionTo(int pageNo, PointF point)
  634. {
  635. if (Disabled)
  636. return;
  637. RectangleF pageBounds = PreviewPages.GetPageBounds(pageNo - 1);
  638. ReportPage page = PreparedPages.GetCachedPage(pageNo - 1);
  639. Offset = new Point((int)Math.Round(pageBounds.Left + (page.LeftMargin * Units.Millimeters + point.X) * ZoomDpi),
  640. (int)Math.Round(pageBounds.Top + (page.TopMargin * Units.Millimeters + point.Y) * ZoomDpi) - 10);
  641. SetPageNo(pageNo, false);
  642. }
  643. public void RefreshReport()
  644. {
  645. bool saveShowProgress = Config.ReportSettings.ShowProgress;
  646. Config.ReportSettings.ShowProgress = false;
  647. locked = true;
  648. try
  649. {
  650. PreviewPages.Clear();
  651. PreparedPages.ClearPageCache();
  652. if (PreviewTab.DetailReportPage != null)
  653. Report.PreparePage(PreviewTab.DetailReportPage);
  654. else
  655. Report.InternalRefresh();
  656. }
  657. finally
  658. {
  659. locked = false;
  660. Config.ReportSettings.ShowProgress = saveShowProgress;
  661. }
  662. UpdatePages();
  663. // ensure the updated report fits in the workspace
  664. Offset = Offset;
  665. }
  666. public void UnlockLayout()
  667. {
  668. layoutLocked = false;
  669. }
  670. public void ZoomWholePage()
  671. {
  672. if (Disabled)
  673. return;
  674. SizeF pageSize = PreparedPages.GetPageSize(PageNo - 1);
  675. if (pageSize.Width / ClientSize.Width > pageSize.Height / ClientSize.Height)
  676. Zoom = (ClientSize.Width - 20) / pageSize.Width;
  677. else
  678. Zoom = (ClientSize.Height - 20) / pageSize.Height;
  679. zoomMode = PreviewZoomMode.WholePage;
  680. }
  681. public void ZoomPageWidth()
  682. {
  683. if (Disabled)
  684. return;
  685. SizeF pageSize = PreparedPages.GetPageSize(PageNo - 1);
  686. Zoom = (ClientSize.Width - 20 - SystemInformation.VerticalScrollBarWidth) / pageSize.Width;
  687. zoomMode = PreviewZoomMode.PageWidth;
  688. }
  689. #endregion
  690. public PreviewWorkspace(PreviewTab previewTab)
  691. {
  692. this.previewTab = previewTab;
  693. previewPages = new PreviewPages();
  694. curHand = ResourceLoader.GetCursor("Hand.cur");
  695. curHandMove = ResourceLoader.GetCursor("HandMove.cur");
  696. Cursor = curHand;
  697. Dock = DockStyle.Fill;
  698. AutoScroll = true;
  699. layoutLocked = true;
  700. #if !MONO
  701. ColorSchemeStyle = eDotNetBarStyle.Office2007;
  702. FastScrolling = Preview.FastScrolling;
  703. VScrollBar.Dock = Config.RightToLeft ? DockStyle.Left : DockStyle.Right;
  704. #endif
  705. }
  706. }
  707. }