WelcomeForm.cs 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.IO;
  5. using System.Windows.Forms;
  6. using FastReport.Design;
  7. using FastReport.Utils;
  8. using FastReport.Wizards;
  9. using System.Linq;
  10. using FastReport.Cloud.FastReport;
  11. namespace FastReport.Forms
  12. {
  13. /// <summary>
  14. /// Represents the Welcome window displayed on the designer startup
  15. /// </summary>
  16. public partial class WelcomeForm : BaseForm
  17. {
  18. private Designer designer;
  19. private Button btnOpen;
  20. private const int maxItemsInColumn = 9;
  21. /// <summary>
  22. /// Initializes a new instance of the <see cref="WelcomeForm"/> class.
  23. /// </summary>
  24. /// <param name="designer"></param>
  25. public WelcomeForm(Designer designer)
  26. {
  27. InitializeComponent();
  28. #if COMMUNITY
  29. if (Config.WelcomeScreen != null)
  30. this.banner.Image = Config.WelcomeScreen;
  31. btnAccount.Visible = false;
  32. #endif
  33. this.designer = designer;
  34. setupLeftPanel();
  35. setupRightPanel();
  36. Localize();
  37. cbShowOnStartup.Checked = Config.WelcomeShowOnStartup;
  38. FRCloudOptions.Instance.ResetBackendHostAndApiKey();
  39. Config.DesignerSettings.ReportLoaded += DesignerSettings_ReportLoaded;
  40. UIUtils.CheckRTL(this);
  41. UpdateDpiDependencies();
  42. }
  43. public override void UpdateDpiDependencies()
  44. {
  45. base.UpdateDpiDependencies();
  46. this.banner.Image = GetImage("Images.Welcome.png");
  47. this.lblNew.Font = this.lblOpen.Font = this.LogicalToDevice(new Font("Arial", 11.25F, FontStyle.Bold), true);
  48. panelLeft.Controls.OfType<Button>().ToList().ForEach(button => SetButtonImage(button));
  49. panelRight.Controls.OfType<Button>().ToList().ForEach(button => SetButtonImage(button));
  50. }
  51. #region Setup
  52. private void SetButtonImage(Button button)
  53. {
  54. // select image based on button tag
  55. int imageIndex = 66; // default
  56. if (button.Tag is ObjectInfo info) // wizard
  57. imageIndex = info.ImageIndex;
  58. else if (button.Tag is string file) // recent file
  59. imageIndex = designer.cmdRecentFiles.IsCloudFile(file) ? 259 : 134;
  60. button.Image = GetImage(imageIndex);
  61. }
  62. private void setupLeftPanel()
  63. {
  64. int i = 0;
  65. // Open item
  66. btnOpen = createButton
  67. (
  68. open_Click,
  69. "Open...",
  70. getX(),
  71. getY(i),
  72. panelLeft,
  73. null,
  74. true,
  75. null
  76. );
  77. i++;
  78. // Recent items
  79. if (designer.cmdRecentFiles.Enabled && designer.RecentFiles.Count > 0)
  80. {
  81. for (int k = designer.RecentFiles.Count - 1; k >= 0; k--)
  82. {
  83. string file = designer.RecentFiles[k];
  84. createButton
  85. (
  86. recent_Click,
  87. Path.GetFileName(file),
  88. getX(),
  89. getY(i),
  90. panelLeft,
  91. file,
  92. true,
  93. file
  94. );
  95. i++;
  96. if (i >= maxItemsInColumn)
  97. break;
  98. }
  99. }
  100. }
  101. private void setupRightPanel()
  102. {
  103. List<ObjectInfo> objects = new List<ObjectInfo>();
  104. RegisteredObjects.Objects.EnumItems(objects);
  105. int i = 0;
  106. // Wizards
  107. foreach (ObjectInfo info in objects)
  108. {
  109. if (info.Object != null &&
  110. info.Object.IsSubclassOf(typeof(WizardBase)) &&
  111. info.Flags == 0)
  112. {
  113. createButton
  114. (
  115. new_Click,
  116. Res.TryGet(info.Text),
  117. getX(),
  118. getY(i),
  119. panelRight,
  120. null,
  121. true,
  122. info
  123. );
  124. i++;
  125. if (i >= maxItemsInColumn)
  126. break;
  127. }
  128. }
  129. }
  130. public override void Localize()
  131. {
  132. MyRes res = new MyRes("Designer,Welcome");
  133. Text = res.Get("Title");
  134. #if COMMUNITY
  135. Text += " Community";
  136. #endif
  137. cbShowOnStartup.Text = res.Get("Show");
  138. btnAccount.Text = res.Get("Account");
  139. lblOpen.Text = res.Get("Open");
  140. lblNew.Text = res.Get("New");
  141. btnOpen.Text = " " + Res.Get("Designer,Menu,File,Open");
  142. }
  143. #endregion
  144. #region Events
  145. private void open_Click(object sender, EventArgs e)
  146. {
  147. designer.cmdOpen.Invoke();
  148. }
  149. private void recent_Click(object sender, EventArgs e)
  150. {
  151. designer.cmdRecentFiles.LoadFile((sender as Button).Tag as string);
  152. }
  153. private void new_Click(object sender, EventArgs e)
  154. {
  155. (Activator.CreateInstance(((sender as Button).Tag as ObjectInfo).Object) as WizardBase).Run(designer);
  156. }
  157. private void table_CellPaint(object sender, TableLayoutCellPaintEventArgs e)
  158. {
  159. if (e.Column == 0 && e.Row == 0)
  160. {
  161. int t = 15;
  162. e.Graphics.DrawLine(new Pen(Color.DarkGray),
  163. e.CellBounds.Right,
  164. e.CellBounds.Top + t,
  165. e.CellBounds.Right,
  166. e.CellBounds.Bottom - t);
  167. }
  168. }
  169. private void bottom_Paint(object sender, PaintEventArgs e)
  170. {
  171. e.Graphics.DrawLine(new Pen(Color.LightGray),
  172. e.ClipRectangle.Left,
  173. e.ClipRectangle.Top,
  174. e.ClipRectangle.Right,
  175. e.ClipRectangle.Top);
  176. }
  177. private void DesignerSettings_ReportLoaded(object sender, ReportLoadedEventArgs e)
  178. {
  179. Config.DesignerSettings.ReportLoaded -= DesignerSettings_ReportLoaded;
  180. Close();
  181. }
  182. private void cbShowOnStartup_CheckedChanged(object sender, EventArgs e)
  183. {
  184. Config.WelcomeShowOnStartup = cbShowOnStartup.Checked;
  185. }
  186. #endregion
  187. #region Utils
  188. private Button createButton(EventHandler onClick,
  189. string text,
  190. int x,
  191. int y,
  192. Control parent,
  193. string tooltipText,
  194. bool trimText,
  195. object tag)
  196. {
  197. Button b = new Button();
  198. b.Tag = tag;
  199. if (onClick != null)
  200. b.Click += onClick;
  201. b.Location = new Point(x, y);
  202. b.Height = (int)(28 * DrawUtils.ScreenDpi / 96f);
  203. b.Width = parent.Width;
  204. b.Text = " " + text;
  205. b.TextAlign = ContentAlignment.MiddleLeft;
  206. b.TextImageRelation = TextImageRelation.ImageBeforeText;
  207. b.FlatStyle = FlatStyle.Flat;
  208. b.FlatAppearance.BorderSize = 0;
  209. b.FlatAppearance.BorderColor = parent != null ? parent.BackColor : Color.White;
  210. b.FlatAppearance.MouseOverBackColor = Color.FromArgb(-2628366);
  211. b.FlatAppearance.MouseDownBackColor = Color.FromArgb(-4599318);
  212. b.ImageAlign = ContentAlignment.MiddleLeft;
  213. if (tooltipText != null && tooltipText.Trim() != "")
  214. {
  215. ToolTip tooltip = new ToolTip();
  216. tooltip.SetToolTip(b, tooltipText);
  217. }
  218. if (trimText)
  219. trim(b);
  220. if (parent != null)
  221. parent.Controls.Add(b);
  222. return b;
  223. }
  224. private int getX()
  225. {
  226. return (int)(40 * DrawUtils.ScreenDpi / 96f);
  227. }
  228. private int getY(int i)
  229. {
  230. return (int)(i * (28 * DrawUtils.ScreenDpi / 96f) + (45 * DrawUtils.ScreenDpi / 96f));
  231. }
  232. private bool trim(Control control)
  233. {
  234. string txt = control.Text;
  235. if (txt.Length == 0 || control.Width == 0)
  236. return false;
  237. bool trimmed = false;
  238. int i = txt.Length;
  239. int iconWidth = control.LogicalToDevice(30);
  240. while (TextRenderer.MeasureText(txt + "...", control.Font).Width > control.Width - iconWidth)
  241. {
  242. txt = control.Text.Substring(0, --i);
  243. trimmed = true;
  244. if (i == 0)
  245. break;
  246. }
  247. control.Text = txt + (trimmed ? "..." : "");
  248. return trimmed;
  249. }
  250. #endregion
  251. }
  252. }