ReportTab.cs 36 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174
  1. using System;
  2. using System.Windows.Forms;
  3. using System.IO;
  4. using System.Drawing;
  5. using FastReport.Utils;
  6. using FastReport.Dialog;
  7. using FastReport.Design.PageDesigners;
  8. using FastReport.Design.PageDesigners.Code;
  9. using FastReport.Controls;
  10. using FastReport.Forms;
  11. #if !MONO
  12. using FastReport.DevComponents.DotNetBar;
  13. #endif
  14. namespace FastReport.Design
  15. {
  16. internal class ReportTab : DocumentWindow
  17. {
  18. #region Const
  19. private const string newPageButtonName = "+";
  20. #endregion
  21. #region Fields
  22. private bool disposed;
  23. private PageBase activePage;
  24. private bool frxEditor = false;
  25. private bool oldFrxEditor = false;
  26. private bool frxEditorWasCreated = false;
  27. private bool resetSelecteObj = true;
  28. #if !MONO
  29. private readonly TabStrip tabs;
  30. #else
  31. private readonly FRTabStrip tabs;
  32. #endif
  33. private bool tabMoved;
  34. private bool updatingTabs;
  35. #endregion
  36. #region Properties
  37. public Report Report { get; }
  38. public Designer Designer { get; }
  39. public BlobStore BlobStore { get; }
  40. public PageBase ActivePage
  41. {
  42. get { return activePage; }
  43. set
  44. {
  45. if (activePage != value || (activePage == null && oldFrxEditor != frxEditor))
  46. {
  47. PageDesignerBase oldPd = GetPageDesigner(activePage, oldFrxEditor);
  48. PageDesignerBase newPd = GetPageDesigner(value, frxEditor);
  49. oldPd.CancelPaste();
  50. oldPd.PageDeactivated();
  51. #if !MONO
  52. foreach (TabItem tab in tabs.Tabs)
  53. #else
  54. foreach (Tab tab in tabs.Tabs)
  55. #endif
  56. {
  57. if (tab.Tag == value && value != null)
  58. {
  59. updatingTabs = true;
  60. tabs.SelectedTab = tab;
  61. updatingTabs = false;
  62. break;
  63. }
  64. }
  65. if (activePage?.Name == tabs.SelectedTab?.Text)
  66. return;
  67. oldFrxEditor = frxEditor;
  68. activePage = value;
  69. #if MONO
  70. if (oldPd != newPd)
  71. {
  72. oldPd.Visible = false;
  73. newPd.Visible = true;
  74. }
  75. #endif
  76. newPd.Page = value;
  77. newPd.FillObjects(resetSelecteObj);
  78. newPd.BringToFront();
  79. newPd.PageActivated();
  80. if(resetSelecteObj)
  81. Designer.SelectionChanged(null);
  82. }
  83. }
  84. }
  85. public PageDesignerBase ActivePageDesigner
  86. {
  87. get { return GetPageDesigner(ActivePage, frxEditor); }
  88. }
  89. public int ActivePageIndex
  90. {
  91. get { return tabs.SelectedTabIndex; }
  92. set
  93. {
  94. tabs.SelectedTabIndex = value;
  95. ActivePage = tabs.SelectedTab.Tag as PageBase;
  96. }
  97. }
  98. public bool IsFRXPageActie
  99. {
  100. get { return frxEditor; }
  101. }
  102. public bool Modified { get; private set; }
  103. public CodePageDesigner Editor
  104. {
  105. get { return GetPageDesigner(null, false) as CodePageDesigner; }
  106. }
  107. public FRXPageDesigner FRXEditor
  108. {
  109. get { return (GetPageDesigner(null, true) as FRXPageDesigner); }
  110. }
  111. public string Script
  112. {
  113. get { return Editor.Script; }
  114. set { Editor.Script = value; }
  115. }
  116. public string ReportName
  117. {
  118. get
  119. {
  120. if (String.IsNullOrEmpty(Report.FileName))
  121. return Res.Get("Designer,Untitled");
  122. return Report.FileName;
  123. }
  124. }
  125. internal UndoRedo UndoRedo { get; }
  126. internal bool CanUndo
  127. {
  128. get
  129. {
  130. int i = ActivePageIndex;
  131. if (i == 0 && !frxEditorWasCreated || i == 1 && frxEditorWasCreated)
  132. return Editor.CanUndo();
  133. if (i == 0 && frxEditorWasCreated )
  134. return FRXEditor.CanUndo();
  135. return UndoRedo.UndoCount > 1;
  136. }
  137. }
  138. internal bool CanRedo
  139. {
  140. get
  141. {
  142. int i = ActivePageIndex;
  143. if (i == 0 && !frxEditorWasCreated || i == 1 && frxEditorWasCreated)
  144. return Editor.CanRedo();
  145. if (i == 0 && frxEditorWasCreated)
  146. return FRXEditor.CanRedo();
  147. return UndoRedo.RedoCount > 0;
  148. }
  149. }
  150. public PluginCollection Plugins { get; }
  151. public float Zoom
  152. {
  153. get
  154. {
  155. if (ActivePageDesigner != null)
  156. return ActivePageDesigner.Zoom;
  157. return 1;
  158. }
  159. set
  160. {
  161. if (ActivePageDesigner != null)
  162. ActivePageDesigner.Zoom = value;
  163. }
  164. }
  165. #endregion
  166. #region Private Methods
  167. // (Deprecated) for better appearance, play with ui controls offset
  168. private Point UIOffset
  169. {
  170. get
  171. {
  172. return new Point();
  173. }
  174. }
  175. private PageDesignerBase GetPageDesigner(PageBase page, bool xmleditor = false)
  176. {
  177. Type pdType = page == null ? (xmleditor ? typeof(FRXPageDesigner) : typeof(CodePageDesigner) ): page.GetPageDesignerType();
  178. // try to find existing page designer
  179. foreach (IDesignerPlugin plugin in Plugins)
  180. {
  181. if (plugin.GetType() == pdType)
  182. return plugin as PageDesignerBase;
  183. }
  184. // not found, create new one
  185. PageDesignerBase pd = Activator.CreateInstance(pdType, new object[] { Designer }) as PageDesignerBase;
  186. pd.Page = page;
  187. #if !MONO
  188. pd.Location = new Point(UIOffset.X, 0);
  189. pd.Size = new Size(ParentControl.Width - UIOffset.X, ParentControl.Height - tabs.Height - UIOffset.Y);
  190. ParentControl.Controls.Add(pd);
  191. #else
  192. pd.Location = new Point(0, 0);
  193. pd.Size = new Size(Width, Height - tabs.Height);
  194. Controls.Add(pd);
  195. #endif
  196. Plugins.Add(pd);
  197. pd.RestoreState();
  198. pd.UpdateUIStyle();
  199. pd.UpdateDpiDependencies();
  200. return pd;
  201. }
  202. #if !MONO
  203. private void FTabs_TabItemClose(object sender, TabStripActionEventArgs e)
  204. {
  205. // do not allow to close the "Code" tab
  206. if (tabs.SelectedTab.Tag == null)
  207. e.Cancel = true;
  208. else
  209. Designer.cmdDeletePage.Invoke();
  210. }
  211. private void Tabs_DoubleClick(object sender, EventArgs e)
  212. {
  213. TabStrip ts = sender as TabStrip;
  214. if (!ts.SelectedTab.IsMouseOver && !ts._TabSystemBox.IsMouseOverArrowControls)
  215. NewReportPage();
  216. }
  217. private void FTabs_TabMoved(object sender, TabStripTabMovedEventArgs e)
  218. #else
  219. private void FTabs_TabMoved(object sender, TabMovedEventArgs e)
  220. #endif
  221. {
  222. // do not allow to move the "Code" tab
  223. if (e.OldIndex == 0 || e.NewIndex == 0)
  224. #if !MONO
  225. e.Cancel = true;
  226. #else
  227. ;
  228. #endif
  229. else
  230. tabMoved = true;
  231. }
  232. private void FTabs_MouseUp(object sender, MouseEventArgs e)
  233. {
  234. if (tabs.SelectedTab.Text == newPageButtonName)
  235. NewReportPage();
  236. if (tabMoved)
  237. {
  238. // clear pages. Do not call Clear because pages will be disposed then
  239. while (Report.Pages.Count > 0)
  240. {
  241. Report.Pages.RemoveAt(0);
  242. }
  243. // add pages in new order
  244. #if !MONO
  245. foreach (TabItem tab in tabs.Tabs)
  246. #else
  247. foreach (Tab tab in tabs.Tabs)
  248. #endif
  249. {
  250. if (tab.Tag is PageBase)
  251. Report.Pages.Add(tab.Tag as PageBase);
  252. }
  253. Designer.SetModified(null, "ChangePagesOrder");
  254. }
  255. tabMoved = false;
  256. }
  257. #if !MONO
  258. private void FTabs_SelectedTabChanged(object sender, TabStripTabChangedEventArgs e)
  259. #else
  260. private void FTabs_SelectedTabChanged(object sender, EventArgs e)
  261. #endif
  262. {
  263. if (updatingTabs)
  264. return;
  265. if (tabs.SelectedTab.Text != newPageButtonName)
  266. {
  267. #if !MONO
  268. if (e.NewTab == e.OldTab)
  269. {
  270. PageDesignerBase page = GetPageDesigner(activePage, frxEditor);
  271. page.FillObjects(true);
  272. Designer.SelectionChanged(null);
  273. }
  274. else
  275. #endif
  276. {
  277. if (tabs.SelectedTab.Text == "FRX")
  278. {
  279. frxEditor = true;
  280. }
  281. else
  282. frxEditor = false;
  283. ActivePage = tabs.SelectedTab.Tag as PageBase;
  284. }
  285. }
  286. }
  287. #if !MONO
  288. private void ParentControl_Resize(object sender, EventArgs e)
  289. {
  290. foreach (Control c in ParentControl.Controls)
  291. {
  292. if (c is PageDesignerBase)
  293. c.Size = new Size(ParentControl.Width - UIOffset.X, ParentControl.Height - tabs.Height - UIOffset.Y);
  294. }
  295. }
  296. #else
  297. protected override void OnResize(EventArgs eventargs)
  298. {
  299. base.OnResize(eventargs);
  300. foreach (Control c in Controls)
  301. {
  302. if (c is PageDesignerBase)
  303. c.Size = new Size(Width, Height - tabs.Height);
  304. }
  305. }
  306. #endif
  307. #endregion
  308. #region Protected Methods
  309. protected override void Dispose(bool disposing)
  310. {
  311. base.Dispose(disposing);
  312. if (!disposed)
  313. {
  314. for (int i = 0; i < Plugins.Count; i++)
  315. {
  316. IDesignerPlugin plugin = Plugins[i];
  317. if (plugin is IDisposable)
  318. (plugin as IDisposable).Dispose();
  319. }
  320. if (Designer.MdiMode && Report != null)
  321. Report.Dispose();
  322. UndoRedo.Dispose();
  323. if (BlobStore != null)
  324. BlobStore.Dispose();
  325. disposed = true;
  326. }
  327. }
  328. #endregion
  329. #region Public Methods
  330. public bool CanClose()
  331. {
  332. ActivePageDesigner.PageDeactivated();
  333. if (Designer.AskSave && !SaveCurrentFile())
  334. {
  335. ActivePageDesigner.PageActivated();
  336. return false;
  337. }
  338. return true;
  339. }
  340. internal void ReportActivated()
  341. {
  342. ActivePageDesigner.FillObjects(true);
  343. ActivePageDesigner.PageActivated();
  344. UpdateCaption();
  345. }
  346. internal void ReportDeactivated()
  347. {
  348. ActivePageDesigner.PageDeactivated();
  349. }
  350. internal void SetModified()
  351. {
  352. Modified = true;
  353. UpdateCaption();
  354. }
  355. internal void SetModified(object sender, string action, string objName)
  356. {
  357. // cancel insertion if user has changed some properties (#2573)
  358. if (ActivePageDesigner.IsInsertingObject && action == "Change")
  359. {
  360. ActivePageDesigner.CancelPaste();
  361. Designer.SelectedObjects.Clear();
  362. Designer.SelectedObjects.Add(ActivePageDesigner.Page);
  363. Designer.SelectionChanged(null);
  364. }
  365. Modified = true;
  366. Report.ScriptText = Script;
  367. if (action != "Script-no-undo")
  368. {
  369. UndoRedo.AddUndo(action, objName);
  370. UndoRedo.ClearRedo();
  371. }
  372. bool resetSelection = action == "Delete" ? true : false;
  373. ActivePageDesigner.FillObjects(resetSelection);
  374. InitPages(ActivePageIndex);
  375. UpdateCaption();
  376. }
  377. internal void ResetModified()
  378. {
  379. Modified = false;
  380. UndoRedo.ClearUndo();
  381. UndoRedo.ClearRedo();
  382. UndoRedo.AddUndo("Load", null);
  383. Editor.Edit.Modified = false;
  384. FRXEditor.Edit.Modified = false;
  385. UpdateCaption();
  386. }
  387. public void SwitchToCode()
  388. {
  389. oldFrxEditor = frxEditor;
  390. frxEditor = false;
  391. if (FRXPageSettings.Enable)
  392. {
  393. tabs.SelectedTabIndex = 1;
  394. }
  395. else
  396. {
  397. tabs.SelectedTabIndex = 0;
  398. }
  399. ActivePage = null;
  400. }
  401. internal void UpdateCaption()
  402. {
  403. Text = ReportName;
  404. string titleText = "";
  405. if (String.IsNullOrEmpty(Config.DesignerSettings.Text))
  406. titleText = "FastReport - " + ReportName;
  407. else
  408. titleText = Config.DesignerSettings.Text + ReportName;
  409. if (Designer.cmdSave.Enabled)
  410. titleText += "*";
  411. Form form = Designer.FindForm();
  412. if (form != null && (form.GetType().Name.EndsWith("DesignerForm") || form.GetType().Name.EndsWith("DesignerRibbonForm")))
  413. form.Text = titleText;
  414. }
  415. public void InitReport()
  416. {
  417. // check if report has a reportpage
  418. bool reportPageExists = false;
  419. foreach (PageBase page in Report.Pages)
  420. {
  421. if (page is ReportPage)
  422. reportPageExists = true;
  423. }
  424. // if it has not, create the page
  425. if (!reportPageExists)
  426. {
  427. ReportPage reportPage = new ReportPage();
  428. Report.Pages.Add(reportPage);
  429. reportPage.CreateUniqueName();
  430. reportPage.SetDefaults();
  431. }
  432. Script = Report.ScriptText;
  433. if(frxEditorWasCreated)
  434. InitPages(2);
  435. else
  436. InitPages(1);
  437. UpdateCaption();
  438. ResetModified();
  439. Plugins.Unlock();
  440. }
  441. public void InitPages(int index)
  442. {
  443. updatingTabs = true;
  444. resetSelecteObj = !(index == ActivePageIndex);
  445. // add tabs
  446. tabs.Tabs.Clear();
  447. activePage = null;
  448. // code tab
  449. #if !MONO
  450. TabItem codeTab = new TabItem();
  451. TabItem frxTab = new TabItem();
  452. #else
  453. Tab codeTab = new Tab();
  454. codeTab.AllowMove = false;
  455. codeTab.CloseButton = false;
  456. Tab frxTab = new Tab();
  457. frxTab.AllowMove = false;
  458. frxTab.CloseButton = false;
  459. #endif
  460. codeTab.Text = Res.Get("Designer,Workspace,Code");
  461. codeTab.Image = Designer.GetImage(61);
  462. frxTab.Text = "FRX";
  463. frxTab.Image = Designer.GetImage(61);
  464. if (FRXPageSettings.Enable)
  465. {
  466. tabs.Tabs.Add(frxTab);
  467. if (!frxEditorWasCreated)
  468. index++;
  469. frxEditorWasCreated = true;
  470. }
  471. else
  472. {
  473. frxEditor = false;
  474. if (frxEditorWasCreated && index > 0)
  475. index--;
  476. frxEditorWasCreated = false;
  477. }
  478. tabs.Tabs.Add(codeTab);
  479. if (Designer.Restrictions.DontEditCode)
  480. codeTab.Visible = false;
  481. // page tabs
  482. foreach (PageBase page in Report.Pages)
  483. {
  484. #if !MONO
  485. TabItem pageTab = new TabItem();
  486. #else
  487. Tab pageTab = new Tab();
  488. pageTab.CloseButton = false;
  489. #endif
  490. pageTab.Tag = page;
  491. pageTab.Text = page.PageName;
  492. ObjectInfo info = RegisteredObjects.FindObject(page);
  493. pageTab.Image = Designer.GetImage(info.ImageIndex);
  494. tabs.Tabs.Add(pageTab);
  495. }
  496. // "+" button
  497. #if !MONO
  498. TabItem newPage = new TabItem();
  499. #else
  500. Tab newPage = new Tab();
  501. newPage.CloseButton = false;
  502. #endif
  503. newPage.Text = newPageButtonName;
  504. tabs.Tabs.Add(newPage);
  505. updatingTabs = false;
  506. ActivePageIndex = index;
  507. tabs.Refresh();
  508. resetSelecteObj = true;
  509. }
  510. public override void Localize()
  511. {
  512. Plugins.Localize();
  513. InitPages(ActivePageIndex);
  514. }
  515. public override void UpdateDpiDependencies()
  516. {
  517. base.UpdateDpiDependencies();
  518. Plugins.UpdateDpiDependencies(this);
  519. InitPages(ActivePageIndex);
  520. tabs.Height = Designer.LogicalToDevice(25);
  521. }
  522. public override void UpdateUIStyle()
  523. {
  524. #if !MONO
  525. tabs.Style = UIStyleUtils.GetTabStripStyle1(Designer.UIStyle);
  526. //HACK
  527. if (StyleManager.Style == eStyle.VisualStudio2012Light)
  528. {
  529. tabs.ColorScheme.TabItemHotText = Color.White;
  530. tabs.ColorScheme.TabItemSelectedText = Color.White;
  531. }
  532. else
  533. {
  534. tabs.ColorScheme = new TabColorScheme(tabs.Style);
  535. }
  536. Plugins.UpdateUIStyle();
  537. ParentControl_Resize(this, EventArgs.Empty);
  538. #else
  539. tabs.Style = Designer.UIStyle;
  540. Plugins.UpdateUIStyle();
  541. #endif
  542. }
  543. public void ZoomPageWidth()
  544. {
  545. if (ActivePageDesigner != null)
  546. ActivePageDesigner.ZoomPageWidth();
  547. }
  548. public void ZoomWholePage()
  549. {
  550. if (ActivePageDesigner != null)
  551. ActivePageDesigner.ZoomWholePage();
  552. }
  553. #endregion
  554. #region Designer Commands
  555. internal bool SaveCurrentFile()
  556. {
  557. if (Modified)
  558. {
  559. DialogResult res = AskSave();
  560. if (res == DialogResult.Cancel)
  561. return false;
  562. if (Designer.IsPreviewPageDesigner)
  563. {
  564. if (res == DialogResult.No)
  565. Designer.Modified = false;
  566. }
  567. else
  568. {
  569. if (res == DialogResult.Yes)
  570. return SaveFile(false);
  571. else if (res == DialogResult.No)
  572. Designer.Modified = false;
  573. }
  574. }
  575. return true;
  576. }
  577. internal bool EmptyReport(bool askSave)
  578. {
  579. if (askSave)
  580. {
  581. if (!SaveCurrentFile())
  582. return false;
  583. }
  584. Designer.Lock();
  585. try
  586. {
  587. Report.FileName = "";
  588. Report.Clear();
  589. Report.Dictionary.ReRegisterData();
  590. Config.DesignerSettings.OnReportLoaded(this, new ReportLoadedEventArgs(Report));
  591. }
  592. finally
  593. {
  594. InitReport();
  595. Designer.Unlock();
  596. }
  597. return true;
  598. }
  599. private DialogResult AskSave()
  600. {
  601. string text = Designer.IsPreviewPageDesigner ?
  602. Res.Get("Messages,SaveChangesToPreviewPage") : String.Format(Res.Get("Messages,SaveChanges"), ReportName);
  603. return FRMessageBox.Confirm(text, MessageBoxButtons.YesNoCancel);
  604. }
  605. public bool LoadFile(string fileName)
  606. {
  607. OpenSaveDialogEventArgs e = new OpenSaveDialogEventArgs(Designer);
  608. // empty fileName: user pressed "Open" button, show open dialog.
  609. // non-empty fileName: user choosed a report from recent file list, just load the specified report.
  610. if (String.IsNullOrEmpty(fileName))
  611. {
  612. Config.DesignerSettings.OnCustomOpenDialog(Designer, e);
  613. if (e.Cancel)
  614. return false;
  615. fileName = e.FileName;
  616. }
  617. bool result = SaveCurrentFile();
  618. if (result)
  619. {
  620. try
  621. {
  622. Designer.Lock();
  623. OpenSaveReportEventArgs e1 = new OpenSaveReportEventArgs(Report, fileName, e.Data, false);
  624. Config.ReportSettings.OnStartLoadingProgress(Report);
  625. Config.DesignerSettings.OnCustomOpenReport(Designer, e1);
  626. Report.FileName = fileName;
  627. if (Path.GetExtension(fileName).ToLower() == ".frx")
  628. {
  629. Designer.cmdRecentFiles.Update(fileName);
  630. }
  631. else
  632. {
  633. Report.FileName = Path.ChangeExtension(fileName, ".frx");
  634. }
  635. Config.DesignerSettings.OnReportLoaded(this, new ReportLoadedEventArgs(Report));
  636. result = true;
  637. }
  638. #if !DEBUG
  639. catch (Exception ex)
  640. {
  641. EmptyReport(false);
  642. FRMessageBox.Error(String.Format(Res.Get("Messages,CantLoadReport") + "\r\n" + ex.Message, fileName));
  643. result = false;
  644. }
  645. #endif
  646. finally
  647. {
  648. InitReport();
  649. Designer.Unlock();
  650. }
  651. }
  652. return result;
  653. }
  654. public bool LoadAutoSaveFile(string filePath)
  655. {
  656. OpenSaveDialogEventArgs e = new OpenSaveDialogEventArgs(Designer);
  657. string fileName = Config.AutoSaveFile;
  658. bool result = SaveCurrentFile();
  659. if (result)
  660. {
  661. try
  662. {
  663. Designer.Lock();
  664. OpenSaveReportEventArgs e1 = new OpenSaveReportEventArgs(Report, fileName, e.Data, false);
  665. Config.DesignerSettings.OnCustomOpenReport(Designer, e1);
  666. Report.FileName = filePath;
  667. Config.DesignerSettings.OnReportLoaded(this, new ReportLoadedEventArgs(Report));
  668. result = true;
  669. }
  670. #if !DEBUG
  671. catch (Exception ex)
  672. {
  673. EmptyReport(false);
  674. FRMessageBox.Error(String.Format(Res.Get("Messages,CantLoadReport") + "\r\n" + ex.Message, fileName));
  675. result = false;
  676. }
  677. #endif
  678. finally
  679. {
  680. InitReport();
  681. Designer.Unlock();
  682. }
  683. }
  684. return result;
  685. }
  686. public bool SaveFile(bool saveAs)
  687. {
  688. if (File.Exists(Config.AutoSaveFileName))
  689. File.Delete(Config.AutoSaveFileName);
  690. if (File.Exists(Config.AutoSaveFile))
  691. File.Delete(Config.AutoSaveFile);
  692. if (ActivePageDesigner is FRXPageDesigner)
  693. {
  694. (ActivePageDesigner as FRXPageDesigner).CommitChanges();
  695. }
  696. // update report's script
  697. Report.ScriptText = Script;
  698. while (true)
  699. {
  700. OpenSaveDialogEventArgs e = new OpenSaveDialogEventArgs(Designer);
  701. string fileName = Report.FileName;
  702. // show save dialog in case of untitled report or "save as"
  703. if (saveAs || String.IsNullOrEmpty(fileName))
  704. {
  705. if (String.IsNullOrEmpty(fileName))
  706. fileName = Res.Get("Designer,Untitled");
  707. else
  708. fileName = Path.GetFileName(fileName);
  709. e.FileName = fileName;
  710. Config.DesignerSettings.OnCustomSaveDialog(Designer, e);
  711. if (e.Cancel)
  712. return false;
  713. fileName = e.FileName;
  714. }
  715. OpenSaveReportEventArgs e1 = new OpenSaveReportEventArgs(Report, fileName, e.Data, e.IsPlugin);
  716. try
  717. {
  718. Config.DesignerSettings.OnCustomSaveReport(Designer, e1);
  719. // don't change the report name if plugin was used
  720. if (e.IsPlugin)
  721. fileName = Report.FileName;
  722. Report.FileName = fileName;
  723. if(ActivePageDesigner is CodePageDesigner)
  724. (ActivePageDesigner as CodePageDesigner).CommitChanges();
  725. Modified = false;
  726. Designer.UpdatePlugins(null);
  727. if (!e.IsPlugin)
  728. Designer.cmdRecentFiles.Update(fileName);
  729. UpdateCaption();
  730. return true;
  731. }
  732. catch
  733. {
  734. // something goes wrong, suggest to save to another place
  735. FRMessageBox.Error(Res.Get("Messages,CantSaveReport"));
  736. saveAs = true;
  737. }
  738. }
  739. }
  740. public bool SaveWithRandomData()
  741. {
  742. if (File.Exists(Config.AutoSaveFileName))
  743. File.Delete(Config.AutoSaveFileName);
  744. if (File.Exists(Config.AutoSaveFile))
  745. File.Delete(Config.AutoSaveFile);
  746. if (ActivePageDesigner is FRXPageDesigner)
  747. {
  748. (ActivePageDesigner as FRXPageDesigner).CommitChanges();
  749. }
  750. // update report's script
  751. Report.ScriptText = Script;
  752. while (true)
  753. {
  754. OpenSaveDialogEventArgs e = new OpenSaveDialogEventArgs(Designer);
  755. string fileName = Report.FileName;
  756. if (String.IsNullOrEmpty(fileName))
  757. fileName = Res.Get("Designer,Untitled");
  758. else
  759. fileName = Path.GetFileName(fileName);
  760. e.FileName = fileName;
  761. Config.DesignerSettings.OnCustomSaveDialog(Designer, e);
  762. if (e.Cancel)
  763. return false;
  764. fileName = e.FileName;
  765. OpenSaveReportEventArgs e1 = new OpenSaveReportEventArgs(Report, fileName, e.Data, e.IsPlugin);
  766. try
  767. {
  768. Config.DesignerSettings.OnSaveReportWithRandomData(Designer, e1);
  769. // don't change the report name if plugin was used
  770. if (e.IsPlugin)
  771. fileName = Report.FileName;
  772. Report.FileName = fileName;
  773. Modified = false;
  774. Designer.UpdatePlugins(null);
  775. if (!e.IsPlugin)
  776. Designer.cmdRecentFiles.Update(fileName);
  777. UpdateCaption();
  778. return true;
  779. }
  780. catch
  781. {
  782. // something goes wrong, suggest to save to another place
  783. FRMessageBox.Error(Res.Get("Messages,CantSaveReport"));
  784. }
  785. }
  786. }
  787. public bool AutoSaveFile()
  788. {
  789. bool result = false;
  790. Report.ScriptText = Script;
  791. OpenSaveDialogEventArgs e = new OpenSaveDialogEventArgs(Designer);
  792. OpenSaveReportEventArgs e1 = new OpenSaveReportEventArgs(Report, Config.AutoSaveFile, e.Data, e.IsPlugin);
  793. try
  794. {
  795. Designer.Lock();
  796. Designer.PropertiesWindow.Saving = true;
  797. Directory.CreateDirectory(Config.AutoSaveFolder);
  798. using (FileStream f = new FileStream(Config.AutoSaveFile, FileMode.Create))
  799. Report.Save(f);
  800. File.WriteAllText(Config.AutoSaveFileName, Report.FileName);
  801. result = true;
  802. }
  803. catch
  804. {
  805. result = false;
  806. }
  807. finally
  808. {
  809. Designer.Unlock();
  810. Designer.PropertiesWindow.Saving = false;
  811. }
  812. return result;
  813. }
  814. public void Preview()
  815. {
  816. ActivePageDesigner.CancelPaste();
  817. int i = ActivePageIndex;
  818. Report.ScriptText = Script;
  819. Designer.MessagesWindow.ClearMessages();
  820. UndoRedo.AddUndo("Preview", "Report");
  821. Designer.Lock();
  822. Designer.PropertiesWindow.SaveState();
  823. bool saveProgress = Config.ReportSettings.ShowProgress;
  824. Config.ReportSettings.ShowProgress = true;
  825. try
  826. {
  827. if (Report.Prepare())
  828. Config.DesignerSettings.OnCustomPreviewReport(Report, EventArgs.Empty);
  829. }
  830. #if !DEBUG
  831. catch (Exception e)
  832. {
  833. if (!(e is CompilerException))
  834. {
  835. FRMessageBox.Error(e.Message);
  836. //using (ExceptionForm form = new ExceptionForm(e))
  837. //{
  838. // form.ShowDialog();
  839. //}
  840. }
  841. else
  842. Designer.MessagesWindow.Show();
  843. }
  844. #endif
  845. finally
  846. {
  847. Config.ReportSettings.ShowProgress = saveProgress;
  848. Image previewPicture = null;
  849. if (Report.ReportInfo.SavePreviewPicture)
  850. {
  851. previewPicture = Report.ReportInfo.Picture;
  852. Report.ReportInfo.Picture = null;
  853. }
  854. UndoRedo.GetUndo(1);
  855. UndoRedo.ClearRedo();
  856. if (Report.ReportInfo.SavePreviewPicture)
  857. Report.ReportInfo.Picture = previewPicture;
  858. // clear dead objects
  859. Designer.Objects.Clear();
  860. Designer.SelectedObjects.Clear();
  861. InitPages(i);
  862. Designer.PropertiesWindow.RestoreState();
  863. Designer.Unlock();
  864. }
  865. }
  866. public void Undo(int actionsCount)
  867. {
  868. int i = ActivePageIndex;
  869. if (i == 0 && !frxEditorWasCreated || i == 1 && frxEditorWasCreated)
  870. {
  871. #if !MONO
  872. Editor.Source.Undo();
  873. #else
  874. Editor.Edit.Undo();
  875. #endif
  876. return;
  877. }
  878. if (i == 0 && frxEditorWasCreated )
  879. {
  880. #if !MONO
  881. FRXEditor.Source.Undo();
  882. #else
  883. FRXEditor.Edit.Undo();
  884. #endif
  885. return;
  886. }
  887. Designer.Lock();
  888. Report.ScriptText = Script;
  889. UndoRedo.GetUndo(actionsCount);
  890. Script = Report.ScriptText;
  891. InitPages(i);
  892. Designer.Unlock();
  893. }
  894. public void Redo(int actionsCount)
  895. {
  896. int i = ActivePageIndex;
  897. if (i == 0 && !frxEditorWasCreated || i == 1 && frxEditorWasCreated)
  898. {
  899. #if !MONO
  900. Editor.Source.Redo();
  901. #endif
  902. return;
  903. }
  904. if(i == 0 && frxEditorWasCreated)
  905. {
  906. #if !MONO
  907. FRXEditor.Source.Redo();
  908. #endif
  909. return;
  910. }
  911. Designer.Lock();
  912. UndoRedo.GetRedo(actionsCount);
  913. Script = Report.ScriptText;
  914. InitPages(i);
  915. Designer.Unlock();
  916. }
  917. public void NewReportPage()
  918. {
  919. ReportPage page = new ReportPage();
  920. Report.Pages.Add(page);
  921. page.SetDefaults();
  922. page.CreateUniqueName();
  923. InitPages(Report.Pages.Count);
  924. Designer.SetModified(this, "AddPage");
  925. }
  926. public void NewDialog()
  927. {
  928. DialogPage page = new DialogPage();
  929. Report.Pages.Add(page);
  930. page.SetDefaults();
  931. page.CreateUniqueName();
  932. InitPages(Report.Pages.Count);
  933. Designer.SetModified(this, "AddPage");
  934. }
  935. public void DeletePage()
  936. {
  937. Designer.Lock();
  938. Report.Pages.Remove(ActivePage);
  939. foreach (Base obj in ActivePage.AllObjects)
  940. {
  941. if (obj is SubreportObject)
  942. obj.Delete();
  943. }
  944. ActivePage.Delete();
  945. InitPages(Report.Pages.Count);
  946. Designer.Unlock();
  947. Designer.SetModified(this, "DeletePage");
  948. }
  949. public void CopyPage()
  950. {
  951. Designer.Lock();
  952. if (ActivePage is ReportPage)
  953. {
  954. ReportPage newPage = new ReportPage();
  955. newPage.AssignAll(ActivePage);
  956. Report.Pages.Add(newPage);
  957. newPage.CreateUniqueName();
  958. foreach (object obj in newPage.AllObjects)
  959. {
  960. if (obj is Base)
  961. {
  962. (obj as Base).CreateUniqueName();
  963. }
  964. }
  965. }
  966. else if (ActivePage is DialogPage)
  967. {
  968. DialogPage newPage = new DialogPage();
  969. newPage.AssignAll(ActivePage);
  970. Report.Pages.Add(newPage);
  971. newPage.CreateUniqueName();
  972. foreach (object obj in newPage.AllObjects)
  973. {
  974. if (obj is Base)
  975. {
  976. (obj as Base).CreateUniqueName();
  977. }
  978. }
  979. }
  980. InitPages(Report.Pages.Count);
  981. Designer.Unlock();
  982. Designer.SetModified(this, "CopyPage");
  983. }
  984. #if !MONO
  985. public void CtrlTab()
  986. {
  987. if (!tabs.SelectNextTab()) tabs.SelectedTabIndex = 0;
  988. }
  989. public void CtrlShiftTab()
  990. {
  991. tabs.SelectPreviousTab();
  992. }
  993. #endif
  994. #endregion
  995. public ReportTab(Designer designer, Report report)
  996. : base()
  997. {
  998. this.Designer = designer;
  999. this.Report = report;
  1000. Plugins = new PluginCollection(this.Designer);
  1001. UndoRedo = new UndoRedo(this);
  1002. if (!designer.IsPreviewPageDesigner)
  1003. BlobStore = new BlobStore(false);
  1004. #if !MONO
  1005. tabs = new TabStrip();
  1006. tabs.Dock = DockStyle.Bottom;
  1007. tabs.TabAlignment = eTabStripAlignment.Bottom;
  1008. tabs.TabLayoutType = eTabLayoutType.FixedWithNavigationBox;
  1009. tabs.AutoHideSystemBox = true;
  1010. tabs.ShowFocusRectangle = false;
  1011. tabs.CloseButtonVisible = false;
  1012. tabs.Margin = tabs.Margin;
  1013. tabs.TabItemClose += new TabStrip.UserActionEventHandler(FTabs_TabItemClose);
  1014. tabs.TabMoved += new TabStrip.TabMovedEventHandler(FTabs_TabMoved);
  1015. tabs.MouseUp += new MouseEventHandler(FTabs_MouseUp);
  1016. tabs.SelectedTabChanged += new TabStrip.SelectedTabChangedEventHandler(FTabs_SelectedTabChanged);
  1017. tabs.DoubleClick += Tabs_DoubleClick;
  1018. ParentControl.Controls.Add(tabs);
  1019. ParentControl.Resize += new EventHandler(ParentControl_Resize);
  1020. #else
  1021. tabs = new FRTabStrip();
  1022. tabs.Dock = DockStyle.Bottom;
  1023. tabs.TabOrientation = TabOrientation.Bottom;
  1024. tabs.Height = 24;
  1025. tabs.TabMoved += FTabs_TabMoved;
  1026. tabs.MouseUp += FTabs_MouseUp;
  1027. tabs.SelectedTabChanged += FTabs_SelectedTabChanged;
  1028. Controls.Add(tabs);
  1029. #endif
  1030. InitReport();
  1031. #if !MONO
  1032. ParentControl.Focus();
  1033. #endif
  1034. }
  1035. }
  1036. }