PropertiesWindow.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  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. using System.Runtime.InteropServices;
  8. #if !MONO
  9. using FastReport.DevComponents.DotNetBar;
  10. using FastReport.DevComponents.DotNetBar.Controls;
  11. #endif
  12. namespace FastReport.Design.ToolWindows
  13. {
  14. /// <summary>
  15. /// Represents the "Properties" window.
  16. /// </summary>
  17. public class PropertiesWindow : ToolWindowBase
  18. {
  19. #region Fields
  20. private bool updating;
  21. private FRPropertyGrid propertiesGrid;
  22. private FRPropertyGrid eventsGrid;
  23. private PageControl pageControl;
  24. private bool saving;
  25. #if !MONO
  26. private ComboBoxEx cbxObjects;
  27. private Bar toolbar;
  28. private ButtonItem btnCategory;
  29. private ButtonItem btnAlphabetical;
  30. private ButtonItem btnProperties;
  31. private ButtonItem btnEvents;
  32. #else
  33. private ComboBox cbxObjects;
  34. private ToolStrip toolbar;
  35. private ToolStripButton btnCategory;
  36. private ToolStripButton btnAlphabetical;
  37. private ToolStripButton btnProperties;
  38. private ToolStripButton btnEvents;
  39. #endif
  40. #endregion
  41. #region Public properties
  42. /// <inheritdoc/>
  43. public bool Saving
  44. {
  45. get { return saving; }
  46. set { saving = value; }
  47. }
  48. #endregion
  49. #region Private Methods
  50. private void cbxObjects_DrawItem(object sender, DrawItemEventArgs e)
  51. {
  52. e.DrawBackground();
  53. Graphics g = e.Graphics;
  54. if (e.Index >= 0)
  55. {
  56. Base c = cbxObjects.Items[e.Index] as Base;
  57. using (Font f = new Font(e.Font, FontStyle.Bold))
  58. {
  59. SizeF sz = TextRenderer.MeasureText(c.Name, f);
  60. if (c is Report)
  61. {
  62. TextRenderer.DrawText(g, c.ClassName, f, new Point(e.Bounds.X, e.Bounds.Y), e.ForeColor);
  63. }
  64. else
  65. {
  66. TextRenderer.DrawText(g, c.Name, f, e.Bounds,
  67. e.ForeColor, TextFormatFlags.Left | TextFormatFlags.VerticalCenter);
  68. TextRenderer.DrawText(g, c.ClassName, e.Font,
  69. new Rectangle(e.Bounds.X + (int)sz.Width, e.Bounds.Y, e.Bounds.Width - (int)sz.Width, e.Bounds.Height),
  70. e.ForeColor, TextFormatFlags.Left | TextFormatFlags.VerticalCenter);
  71. }
  72. }
  73. }
  74. else
  75. {
  76. SelectedObjectCollection selection = Designer.SelectedObjects;
  77. string s = selection.Count == 0 ? "" : selection.Count > 1 ?
  78. String.Format(Res.Get("Designer,ToolWindow,Properties,NObjectsSelected"), selection.Count) :
  79. selection[0].Name;
  80. TextRenderer.DrawText(g, s, e.Font, new Point(e.Bounds.X, e.Bounds.Y), e.ForeColor);
  81. }
  82. }
  83. private void cbxObjects_SelectedValueChanged(object sender, EventArgs e)
  84. {
  85. if (updating)
  86. return;
  87. Base c = cbxObjects.SelectedItem as Base;
  88. if (!(c is Report) && Designer.ActiveReportTab != null)
  89. {
  90. updating = true;
  91. Designer.ActiveReportTab.ActivePage = c.Page;
  92. updating = false;
  93. }
  94. if (Designer.SelectedObjects != null)
  95. {
  96. Designer.SelectedObjects.Clear();
  97. Designer.SelectedObjects.Add(c);
  98. Designer.SelectionChanged(null);
  99. }
  100. }
  101. private void grid_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
  102. {
  103. Designer.SetModified(null, "Change");
  104. }
  105. private void btnCategory_Click(object sender, EventArgs e)
  106. {
  107. propertiesGrid.PropertySort = PropertySort.Categorized;
  108. eventsGrid.PropertySort = propertiesGrid.PropertySort;
  109. btnCategory.Checked = true;
  110. btnAlphabetical.Checked = false;
  111. }
  112. private void btnAlphabetical_Click(object sender, EventArgs e)
  113. {
  114. propertiesGrid.PropertySort = PropertySort.Alphabetical;
  115. eventsGrid.PropertySort = propertiesGrid.PropertySort;
  116. btnCategory.Checked = false;
  117. btnAlphabetical.Checked = true;
  118. }
  119. private void btnProperties_Click(object sender, EventArgs e)
  120. {
  121. pageControl.ActivePageIndex = 0;
  122. btnProperties.Checked = true;
  123. btnEvents.Checked = false;
  124. }
  125. private void btnEvents_Click(object sender, EventArgs e)
  126. {
  127. pageControl.ActivePageIndex = 1;
  128. btnProperties.Checked = false;
  129. btnEvents.Checked = true;
  130. }
  131. #endregion
  132. #region Public Methods
  133. /// <inheritdoc/>
  134. public override void SaveState()
  135. {
  136. XmlItem xi = Config.Root.FindItem("Designer").FindItem(Name);
  137. xi.SetProp("Sort", propertiesGrid.PropertySort.ToString());
  138. xi.SetProp("TabIndex", pageControl.ActivePageIndex.ToString());
  139. }
  140. /// <inheritdoc/>
  141. public override void RestoreState()
  142. {
  143. XmlItem xi = Config.Root.FindItem("Designer").FindItem(Name);
  144. propertiesGrid.PropertySort = xi.GetProp("Sort") == "Alphabetical" ? PropertySort.Alphabetical : PropertySort.CategorizedAlphabetical;
  145. eventsGrid.PropertySort = propertiesGrid.PropertySort;
  146. string tabIndexProp = xi.GetProp("TabIndex");
  147. if (!String.IsNullOrEmpty(tabIndexProp))
  148. {
  149. int tabIndex = 0;
  150. Int32.TryParse(tabIndexProp, out tabIndex);
  151. pageControl.ActivePageIndex = tabIndex;
  152. btnProperties.Checked = (tabIndex == 0);
  153. btnEvents.Checked = (tabIndex == 1);
  154. }
  155. btnCategory.Checked = propertiesGrid.PropertySort == PropertySort.CategorizedAlphabetical;
  156. btnAlphabetical.Checked = !btnCategory.Checked;
  157. }
  158. /// <inheritdoc/>
  159. public override void SelectionChanged()
  160. {
  161. if (updating)
  162. return;
  163. // prevent fire SelectedValueChanged
  164. updating = true;
  165. try
  166. {
  167. if (Designer.SelectedObjects != null && Designer.SelectedObjects.Count == 1)
  168. {
  169. cbxObjects.SelectedIndex = cbxObjects.Items.IndexOf(Designer.SelectedObjects[0]);
  170. cbxObjects.Refresh();
  171. propertiesGrid.SelectedObjects = Designer.SelectedObjects.ToArray();
  172. eventsGrid.SelectedObjects = propertiesGrid.SelectedObjects;
  173. }
  174. else
  175. {
  176. cbxObjects.SelectedItem = null;
  177. if (Designer.SelectedObjects != null)
  178. propertiesGrid.SelectedObjects = Designer.SelectedObjects.ToArray();
  179. else
  180. propertiesGrid.SelectedObjects = null;
  181. eventsGrid.SelectedObjects = propertiesGrid.SelectedObjects;
  182. cbxObjects.Refresh();
  183. }
  184. }
  185. finally
  186. {
  187. updating = false;
  188. }
  189. }
  190. private void EnumComponents(Base rootComponent, SortedList<string, Base> list)
  191. {
  192. string name = rootComponent is Report ? "" : rootComponent.Name;
  193. if (!list.ContainsKey(name))
  194. list.Add(name, rootComponent);
  195. if (rootComponent.HasFlag(Flags.CanShowChildrenInReportTree))
  196. {
  197. foreach (Base component in rootComponent.ChildObjects)
  198. EnumComponents(component, list);
  199. }
  200. }
  201. /// <inheritdoc/>
  202. public override void UpdateContent()
  203. {
  204. cbxObjects.BeginUpdate();
  205. try
  206. {
  207. if (!Saving)
  208. {
  209. cbxObjects.Items.Clear();
  210. if (Designer.ActiveReport != null)
  211. {
  212. Report report = Designer.ActiveReport.Report;
  213. SortedList<string, Base> sl = new SortedList<string, Base>();
  214. EnumComponents(report, sl);
  215. foreach (Base c in sl.Values)
  216. {
  217. cbxObjects.Items.Add(c);
  218. }
  219. }
  220. SelectionChanged();
  221. }
  222. }
  223. finally
  224. {
  225. cbxObjects.EndUpdate();
  226. }
  227. }
  228. /// <inheritdoc/>
  229. public override void Lock()
  230. {
  231. base.Lock();
  232. propertiesGrid.SelectedObjects = null;
  233. eventsGrid.SelectedObjects = propertiesGrid.SelectedObjects;
  234. }
  235. /// <inheritdoc/>
  236. public override void Localize()
  237. {
  238. Text = Res.Get("Designer,ToolWindow,Properties");
  239. UpdateContent();
  240. }
  241. /// <inheritdoc/>
  242. public override void UpdateUIStyle()
  243. {
  244. base.UpdateUIStyle();
  245. #if !MONO
  246. toolbar.Style = UIStyleUtils.GetDotNetBarStyle(Designer.UIStyle);
  247. cbxObjects.Style = toolbar.Style;
  248. Color color = UIStyleUtils.GetControlColor(Designer.UIStyle);
  249. ParentControl.BackColor = color;
  250. #else
  251. toolbar.Renderer = UIStyleUtils.GetToolStripRenderer(Designer.UIStyle);
  252. propertiesGrid.Style = Designer.UIStyle;
  253. eventsGrid.Style = propertiesGrid.Style;
  254. Color color = UIStyleUtils.GetColorTable(Designer.UIStyle).ControlBackColor;
  255. #endif
  256. propertiesGrid.BackColor = color;
  257. propertiesGrid.LineColor = color;
  258. propertiesGrid.HelpBackColor = color;
  259. eventsGrid.BackColor = color;
  260. eventsGrid.LineColor = color;
  261. eventsGrid.HelpBackColor = color;
  262. }
  263. /// <inheritdoc/>
  264. public override void UpdateDpiDependencies()
  265. {
  266. base.UpdateDpiDependencies();
  267. toolbar.Font = Designer.LogicalToDevice(DrawUtils.DefaultFont);
  268. cbxObjects.ItemHeight = Designer.LogicalToDevice(15);
  269. Image = Designer.GetImage(78);
  270. #if !MONO
  271. ImageIndex = 78;
  272. toolbar.UpdateDpiDependencies();
  273. UpdateImages(toolbar.Items);
  274. #endif
  275. }
  276. #if !MONO
  277. [DllImport("user32.dll", CharSet = CharSet.Auto)]
  278. internal static extern int SendMessage(IntPtr hWnd, int msg, int wParam, IntPtr lParam);
  279. #endif
  280. internal void TypeChar(char c)
  281. {
  282. #if !MONO
  283. FRPropertyGrid grid = pageControl.ActivePageIndex == 0 ? propertiesGrid : eventsGrid;
  284. grid.Focus();
  285. SendMessage(grid.ActiveControl.Handle, 0x0102, (int)c, IntPtr.Zero);
  286. #endif
  287. }
  288. #endregion
  289. /// <summary>
  290. /// Initializes a new instance of the <see cref="PropertiesWindow"/> class with default settings.
  291. /// </summary>
  292. /// <param name="designer">The report designer.</param>
  293. public PropertiesWindow(Designer designer)
  294. : base(designer)
  295. {
  296. Name = "PropertiesWindow";
  297. #if !MONO
  298. Shortcut = eShortcut.F4;
  299. cbxObjects = new ComboBoxEx();
  300. cbxObjects.Dock = DockStyle.Top;
  301. cbxObjects.DisableInternalDrawing = true;
  302. cbxObjects.DropDownStyle = ComboBoxStyle.DropDownList;
  303. cbxObjects.DrawMode = DrawMode.OwnerDrawFixed;
  304. cbxObjects.DrawItem += new DrawItemEventHandler(cbxObjects_DrawItem);
  305. cbxObjects.SelectedValueChanged += new EventHandler(cbxObjects_SelectedValueChanged);
  306. toolbar = new Bar();
  307. toolbar.Dock = DockStyle.Top;
  308. toolbar.RoundCorners = false;
  309. btnCategory = AddButton(69, btnCategory_Click);
  310. btnCategory.AutoCheckOnClick = true;
  311. btnCategory.OptionGroup = "1";
  312. btnAlphabetical = AddButton(67, btnAlphabetical_Click);
  313. btnAlphabetical.AutoCheckOnClick = true;
  314. btnAlphabetical.OptionGroup = "1";
  315. btnProperties = AddButton(78, btnProperties_Click);
  316. btnProperties.BeginGroup = true;
  317. btnProperties.AutoCheckOnClick = true;
  318. btnProperties.OptionGroup = "2";
  319. btnProperties.Checked = true;
  320. btnEvents = AddButton(79, btnEvents_Click);
  321. btnEvents.AutoCheckOnClick = true;
  322. btnEvents.OptionGroup = "2";
  323. toolbar.Items.AddRange(new ButtonItem[] { btnCategory, btnAlphabetical, btnProperties, btnEvents });
  324. #else
  325. cbxObjects = new ComboBox();
  326. cbxObjects.Dock = DockStyle.Top;
  327. cbxObjects.FlatStyle = FlatStyle.Popup;
  328. cbxObjects.DropDownStyle = ComboBoxStyle.DropDownList;
  329. cbxObjects.DrawMode = DrawMode.OwnerDrawFixed;
  330. cbxObjects.ItemHeight = 16;
  331. cbxObjects.DrawItem += cbxObjects_DrawItem;
  332. cbxObjects.SelectedValueChanged += cbxObjects_SelectedValueChanged;
  333. toolbar = new ToolStrip();
  334. toolbar.Dock = DockStyle.Top;
  335. toolbar.Font = DrawUtils.DefaultFont;
  336. toolbar.GripStyle = ToolStripGripStyle.Hidden;
  337. btnCategory = new ToolStripButton("", this.GetImage(69), btnCategory_Click);
  338. btnCategory.Checked = true;
  339. // mono fix
  340. btnCategory.AutoSize = false;
  341. btnCategory.Size = new Size(23, 22);
  342. btnAlphabetical = new ToolStripButton("", this.GetImage(67), btnAlphabetical_Click);
  343. btnProperties = new ToolStripButton("", this.GetImage(78), btnProperties_Click);
  344. btnProperties.Checked = true;
  345. btnEvents = new ToolStripButton("", this.GetImage(79), btnEvents_Click);
  346. toolbar.Items.AddRange(new ToolStripItem[] {
  347. btnCategory, btnAlphabetical, new ToolStripSeparator(),
  348. btnProperties, btnEvents });
  349. #endif
  350. pageControl = new PageControl();
  351. pageControl.Dock = DockStyle.Fill;
  352. PageControlPage propPage = new PageControlPage();
  353. propPage.Dock = DockStyle.Fill;
  354. pageControl.Pages.Add(propPage);
  355. PageControlPage eventsPage = new PageControlPage();
  356. eventsPage.Dock = DockStyle.Fill;
  357. pageControl.Pages.Add(eventsPage);
  358. propertiesGrid = new FRPropertiesGrid();
  359. propertiesGrid.ToolbarVisible = false;
  360. propertiesGrid.Dock = DockStyle.Fill;
  361. propertiesGrid.PropertyValueChanged += new PropertyValueChangedEventHandler(grid_PropertyValueChanged);
  362. propertiesGrid.Parent = propPage;
  363. eventsGrid = new FREventsGrid();
  364. eventsGrid.ToolbarVisible = false;
  365. eventsGrid.Dock = DockStyle.Fill;
  366. eventsGrid.PropertyValueChanged += new PropertyValueChangedEventHandler(grid_PropertyValueChanged);
  367. eventsGrid.Parent = eventsPage;
  368. #if !MONO
  369. ParentControl.Controls.AddRange(new Control[] { pageControl, toolbar, cbxObjects });
  370. #else
  371. Controls.AddRange(new Control[] { pageControl, toolbar, cbxObjects });
  372. #endif
  373. Localize();
  374. UpdateDpiDependencies();
  375. }
  376. }
  377. }