PropertiesWindow.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Windows.Forms;
  4. using System.Drawing;
  5. using FastReport.Utils;
  6. using FastReport.Controls;
  7. namespace FastReport.Design.ToolWindows
  8. {
  9. /// <summary>
  10. /// Represents the "Properties" window.
  11. /// </summary>
  12. public class PropertiesWindow : ToolWindowBase
  13. {
  14. #region Fields
  15. private bool updating;
  16. private FRPropertiesGrid propertiesGrid;
  17. private FREventsGrid eventsGrid;
  18. private PageControl pageControl;
  19. private StyledComboBox cbxObjects;
  20. private ToolbarBase toolbar;
  21. private ToolbarButton btnCategory;
  22. private ToolbarButton btnAlphabetical;
  23. private ToolbarButton btnProperties;
  24. private ToolbarButton btnEvents;
  25. private ToolbarButton btnFilter;
  26. #endregion
  27. #region Public properties
  28. /// <summary>
  29. /// Gets or sets a value indicating that properties are filtered.
  30. /// </summary>
  31. public bool Filtered { get; set; }
  32. #endregion
  33. #region Private Methods
  34. private void EnumComponents(Base rootComponent, SortedList<string, Base> list)
  35. {
  36. string name = rootComponent is Report ? "" : rootComponent.Name;
  37. if (!list.ContainsKey(name))
  38. list.Add(name, rootComponent);
  39. if (rootComponent.HasFlag(Flags.CanShowChildrenInReportTree))
  40. {
  41. foreach (Base component in rootComponent.ChildObjects)
  42. EnumComponents(component, list);
  43. }
  44. }
  45. private void cbxObjects_MeasureItem(object sender, MeasureItemEventArgs e)
  46. {
  47. e.ItemHeight = Designer.LogicalToDevice(18);
  48. }
  49. private void cbxObjects_DrawItem(object sender, DrawItemEventArgs e)
  50. {
  51. e.DrawBackground();
  52. Graphics g = e.Graphics;
  53. #if AVALONIA
  54. TextRenderer.FontScale = g.FontScale;
  55. #endif
  56. var rect = e.Bounds;
  57. rect.Inflate(Designer.LogicalToDevice(-2), 0);
  58. if (e.Index >= 0)
  59. {
  60. Base c = cbxObjects.Items[e.Index] as Base;
  61. using (Font f = new Font(e.Font, FontStyle.Bold))
  62. {
  63. SizeF sz = TextRenderer.MeasureText(c.Name, f);
  64. if (c is Report)
  65. {
  66. TextRenderer.DrawText(g, c.ClassName, f, rect, e.ForeColor, TextFormatFlags.VerticalCenter);
  67. }
  68. else
  69. {
  70. TextRenderer.DrawText(g, c.Name, f, rect,
  71. e.ForeColor, TextFormatFlags.Left | TextFormatFlags.VerticalCenter);
  72. TextRenderer.DrawText(g, c.ClassName, e.Font,
  73. new Rectangle(rect.X + (int)sz.Width, rect.Y, rect.Width - (int)sz.Width, rect.Height),
  74. e.ForeColor, TextFormatFlags.Left | TextFormatFlags.VerticalCenter);
  75. }
  76. }
  77. }
  78. else
  79. {
  80. SelectedObjectCollection selection = Designer.SelectedObjects;
  81. string s = selection.Count == 0 ? "" : selection.Count > 1 ?
  82. String.Format(Res.Get("Designer,ToolWindow,Properties,NObjectsSelected"), selection.Count) :
  83. selection[0].Name;
  84. TextRenderer.DrawText(g, s, e.Font, rect, e.ForeColor, TextFormatFlags.Left | TextFormatFlags.VerticalCenter);
  85. }
  86. }
  87. private void cbxObjects_SelectedValueChanged(object sender, EventArgs e)
  88. {
  89. if (updating)
  90. return;
  91. Base c = cbxObjects.SelectedItem as Base;
  92. if (!(c is Report) && Designer.ActiveReportTab != null)
  93. {
  94. updating = true;
  95. Designer.ActiveReportTab.ActivePage = c.Page;
  96. updating = false;
  97. }
  98. if (Designer.SelectedObjects != null)
  99. {
  100. Designer.SelectedObjects.Clear();
  101. Designer.SelectedObjects.Add(c);
  102. Designer.SelectionChanged(null);
  103. }
  104. }
  105. private void grid_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
  106. {
  107. Designer.SetModified(null, "Change");
  108. }
  109. private void btnCategory_Click(object sender, EventArgs e)
  110. {
  111. propertiesGrid.PropertySort = PropertySort.Categorized;
  112. eventsGrid.PropertySort = propertiesGrid.PropertySort;
  113. btnCategory.Checked = true;
  114. btnAlphabetical.Checked = false;
  115. }
  116. private void btnAlphabetical_Click(object sender, EventArgs e)
  117. {
  118. propertiesGrid.PropertySort = PropertySort.Alphabetical;
  119. eventsGrid.PropertySort = propertiesGrid.PropertySort;
  120. btnCategory.Checked = false;
  121. btnAlphabetical.Checked = true;
  122. }
  123. private void btnProperties_Click(object sender, EventArgs e)
  124. {
  125. pageControl.ActivePageIndex = 0;
  126. btnProperties.Checked = true;
  127. btnEvents.Checked = false;
  128. }
  129. private void btnEvents_Click(object sender, EventArgs e)
  130. {
  131. pageControl.ActivePageIndex = 1;
  132. btnProperties.Checked = false;
  133. btnEvents.Checked = true;
  134. }
  135. private void btnFilter_Click(object sender, EventArgs e)
  136. {
  137. Filtered = btnFilter.Checked;
  138. UpdateContent();
  139. }
  140. #endregion
  141. #region Public Methods
  142. /// <inheritdoc/>
  143. public override void SaveState()
  144. {
  145. base.SaveState();
  146. Storage.SetStr("Sort", propertiesGrid.PropertySort.ToString());
  147. Storage.SetInt("TabIndex", pageControl.ActivePageIndex);
  148. }
  149. /// <inheritdoc/>
  150. public override void RestoreState()
  151. {
  152. base.RestoreState();
  153. propertiesGrid.PropertySort = eventsGrid.PropertySort = Storage.GetStr("Sort") == "Alphabetical" ? PropertySort.Alphabetical : PropertySort.CategorizedAlphabetical;
  154. int tabIndex = Storage.GetInt("TabIndex");
  155. pageControl.ActivePageIndex = tabIndex;
  156. btnProperties.Checked = (tabIndex == 0);
  157. btnEvents.Checked = (tabIndex == 1);
  158. btnCategory.Checked = propertiesGrid.PropertySort == PropertySort.CategorizedAlphabetical;
  159. btnAlphabetical.Checked = !btnCategory.Checked;
  160. }
  161. /// <inheritdoc/>
  162. public override void SelectionChanged()
  163. {
  164. if (updating)
  165. return;
  166. Throttle.Execute(() =>
  167. {
  168. // prevent fire SelectedValueChanged
  169. updating = true;
  170. try
  171. {
  172. if (Designer.SelectedObjects != null && Designer.SelectedObjects.Count == 1)
  173. {
  174. cbxObjects.SelectedIndex = cbxObjects.Items.IndexOf(Designer.SelectedObjects[0]);
  175. cbxObjects.Refresh();
  176. propertiesGrid.SelectedObjects = Designer.SelectedObjects.ToArray();
  177. eventsGrid.SelectedObjects = propertiesGrid.SelectedObjects;
  178. }
  179. else
  180. {
  181. cbxObjects.SelectedItem = null;
  182. if (Designer.SelectedObjects != null)
  183. propertiesGrid.SelectedObjects = Designer.SelectedObjects.ToArray();
  184. else
  185. propertiesGrid.SelectedObjects = null;
  186. eventsGrid.SelectedObjects = propertiesGrid.SelectedObjects;
  187. cbxObjects.Refresh();
  188. }
  189. }
  190. finally
  191. {
  192. updating = false;
  193. }
  194. });
  195. }
  196. /// <inheritdoc/>
  197. public override void UpdateContent()
  198. {
  199. cbxObjects.BeginUpdate();
  200. try
  201. {
  202. cbxObjects.Items.Clear();
  203. if (Designer.ActiveReport != null)
  204. {
  205. Report report = Designer.ActiveReport.Report;
  206. SortedList<string, Base> sl = new SortedList<string, Base>();
  207. EnumComponents(report, sl);
  208. foreach (Base c in sl.Values)
  209. {
  210. cbxObjects.Items.Add(c);
  211. }
  212. }
  213. SelectionChanged();
  214. }
  215. finally
  216. {
  217. cbxObjects.EndUpdate();
  218. }
  219. }
  220. /// <inheritdoc/>
  221. public override void Lock()
  222. {
  223. base.Lock();
  224. propertiesGrid.SelectedObjects = null;
  225. eventsGrid.SelectedObjects = propertiesGrid.SelectedObjects;
  226. }
  227. /// <inheritdoc/>
  228. public override void Localize()
  229. {
  230. MyRes res = new MyRes("Designer,ToolWindow,Properties");
  231. Text = res.Get("");
  232. btnCategory.ToolTipText = res.Get("Categorized");
  233. btnAlphabetical.ToolTipText = res.Get("Alphabetical");
  234. btnProperties.ToolTipText = res.Get("PropertiesTab");
  235. btnEvents.ToolTipText = res.Get("EventsTab");
  236. btnFilter.ToolTipText = res.Get("Filter");
  237. UpdateContent();
  238. }
  239. /// <inheritdoc/>
  240. public override void UpdateUIStyle()
  241. {
  242. base.UpdateUIStyle();
  243. toolbar.UpdateUIStyle();
  244. cbxObjects.SetStyle(Designer.UIStyle);
  245. Color color = UIStyleUtils.GetControlColor(Designer.UIStyle);
  246. propertiesGrid.BackColor = eventsGrid.BackColor = color;
  247. propertiesGrid.LineColor = eventsGrid.LineColor = color;
  248. propertiesGrid.HelpBackColor = eventsGrid.HelpBackColor = color;
  249. #if (WPF || AVALONIA)
  250. propertiesGrid.BorderStyle = eventsGrid.BorderStyle = BorderStyle.None;
  251. propertiesGrid.HelpBackColor = eventsGrid.HelpBackColor = Color.White;
  252. propertiesGrid.SplitterBackColor = eventsGrid.SplitterBackColor = color;
  253. #endif
  254. }
  255. /// <inheritdoc/>
  256. public override void UpdateDpiDependencies()
  257. {
  258. base.UpdateDpiDependencies();
  259. Image = Designer.GetImage(78);
  260. toolbar.Font = propertiesGrid.Font = eventsGrid.Font = Designer.LogicalToDevice(DrawUtils.DefaultFont);
  261. toolbar.Height = Designer.LogicalToDevice(26);
  262. cbxObjects.ItemHeight = Designer.LogicalToDevice(15);
  263. toolbar.UpdateDpiDependencies();
  264. }
  265. #endregion
  266. /// <summary>
  267. /// Initializes a new instance of the <see cref="PropertiesWindow"/> class with default settings.
  268. /// </summary>
  269. /// <param name="designer">The report designer.</param>
  270. public PropertiesWindow(Designer designer) : base(designer)
  271. {
  272. Name = "PropertiesWindow";
  273. #if !MONO
  274. Shortcut = DevComponents.DotNetBar.eShortcut.F4;
  275. #endif
  276. cbxObjects = new StyledComboBox();
  277. cbxObjects.Dock = DockStyle.Top;
  278. cbxObjects.DropDownStyle = ComboBoxStyle.DropDownList;
  279. cbxObjects.DrawMode = DrawMode.OwnerDrawVariable;
  280. cbxObjects.MeasureItem += cbxObjects_MeasureItem;
  281. cbxObjects.DrawItem += cbxObjects_DrawItem;
  282. cbxObjects.SelectedValueChanged += cbxObjects_SelectedValueChanged;
  283. toolbar = new ToolbarBase(designer);
  284. toolbar.Dock = DockStyle.Top;
  285. toolbar.Fixed = true;
  286. #if (WPF || AVALONIA)
  287. toolbar.BorderThickness = new Padding(0);
  288. #endif
  289. btnCategory = AddButton(69, btnCategory_Click);
  290. btnCategory.Checked = true;
  291. btnAlphabetical = AddButton(67, btnAlphabetical_Click);
  292. btnProperties = AddButton(78, btnProperties_Click);
  293. btnProperties.BeginGroup = true;
  294. btnProperties.Checked = true;
  295. btnEvents = AddButton(79, btnEvents_Click);
  296. btnFilter = AddButton(180, btnFilter_Click);
  297. btnFilter.BeginGroup = true;
  298. btnFilter.CheckOnClick = true;
  299. toolbar.AddItems(btnCategory, btnAlphabetical, btnProperties, btnEvents, btnFilter);
  300. pageControl = new PageControl();
  301. pageControl.Dock = DockStyle.Fill;
  302. PageControlPage propPage = new PageControlPage();
  303. propPage.Dock = DockStyle.Fill;
  304. pageControl.Pages.Add(propPage);
  305. PageControlPage eventsPage = new PageControlPage();
  306. eventsPage.Dock = DockStyle.Fill;
  307. pageControl.Pages.Add(eventsPage);
  308. propertiesGrid = new FRPropertiesGrid();
  309. propertiesGrid.ToolbarVisible = false;
  310. propertiesGrid.Dock = DockStyle.Fill;
  311. propertiesGrid.PropertyValueChanged += grid_PropertyValueChanged;
  312. propertiesGrid.Parent = propPage;
  313. eventsGrid = new FREventsGrid();
  314. eventsGrid.ToolbarVisible = false;
  315. eventsGrid.Dock = DockStyle.Fill;
  316. eventsGrid.PropertyValueChanged += grid_PropertyValueChanged;
  317. eventsGrid.Parent = eventsPage;
  318. Controls.AddRange(new Control[] { pageControl, toolbar, cbxObjects });
  319. Localize();
  320. UpdateDpiDependencies();
  321. }
  322. }
  323. }