ReportTab.cs 37 KB

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