using System; using System.Collections.Generic; using System.Windows.Forms; using System.Drawing; using FastReport.Utils; using FastReport.Controls; namespace FastReport.Design.ToolWindows { /// /// Represents the "Properties" window. /// public class PropertiesWindow : ToolWindowBase { #region Fields private bool updating; private FRPropertiesGrid propertiesGrid; private FREventsGrid eventsGrid; private PageControl pageControl; private StyledComboBox cbxObjects; private ToolbarBase toolbar; private ToolbarButton btnCategory; private ToolbarButton btnAlphabetical; private ToolbarButton btnProperties; private ToolbarButton btnEvents; private ToolbarButton btnFilter; #endregion #region Public properties /// /// Gets or sets a value indicating that properties are filtered. /// public bool Filtered { get; set; } #endregion #region Private Methods private void EnumComponents(Base rootComponent, SortedList list) { string name = rootComponent is Report ? "" : rootComponent.Name; if (!list.ContainsKey(name)) list.Add(name, rootComponent); if (rootComponent.HasFlag(Flags.CanShowChildrenInReportTree)) { foreach (Base component in rootComponent.ChildObjects) EnumComponents(component, list); } } private void cbxObjects_MeasureItem(object sender, MeasureItemEventArgs e) { e.ItemHeight = Designer.LogicalToDevice(18); } private void cbxObjects_DrawItem(object sender, DrawItemEventArgs e) { e.DrawBackground(); Graphics g = e.Graphics; #if AVALONIA TextRenderer.FontScale = g.FontScale; #endif var rect = e.Bounds; rect.Inflate(Designer.LogicalToDevice(-2), 0); if (e.Index >= 0) { Base c = cbxObjects.Items[e.Index] as Base; using (Font f = new Font(e.Font, FontStyle.Bold)) { SizeF sz = TextRenderer.MeasureText(c.Name, f); if (c is Report) { TextRenderer.DrawText(g, c.ClassName, f, rect, e.ForeColor, TextFormatFlags.VerticalCenter); } else { TextRenderer.DrawText(g, c.Name, f, rect, e.ForeColor, TextFormatFlags.Left | TextFormatFlags.VerticalCenter); TextRenderer.DrawText(g, c.ClassName, e.Font, new Rectangle(rect.X + (int)sz.Width, rect.Y, rect.Width - (int)sz.Width, rect.Height), e.ForeColor, TextFormatFlags.Left | TextFormatFlags.VerticalCenter); } } } else { SelectedObjectCollection selection = Designer.SelectedObjects; string s = selection.Count == 0 ? "" : selection.Count > 1 ? String.Format(Res.Get("Designer,ToolWindow,Properties,NObjectsSelected"), selection.Count) : selection[0].Name; TextRenderer.DrawText(g, s, e.Font, rect, e.ForeColor, TextFormatFlags.Left | TextFormatFlags.VerticalCenter); } } private void cbxObjects_SelectedValueChanged(object sender, EventArgs e) { if (updating) return; Base c = cbxObjects.SelectedItem as Base; if (!(c is Report) && Designer.ActiveReportTab != null) { updating = true; Designer.ActiveReportTab.ActivePage = c.Page; updating = false; } if (Designer.SelectedObjects != null) { Designer.SelectedObjects.Clear(); Designer.SelectedObjects.Add(c); Designer.SelectionChanged(null); } } private void grid_PropertyValueChanged(object s, PropertyValueChangedEventArgs e) { Designer.SetModified(null, "Change"); } private void btnCategory_Click(object sender, EventArgs e) { propertiesGrid.PropertySort = PropertySort.Categorized; eventsGrid.PropertySort = propertiesGrid.PropertySort; btnCategory.Checked = true; btnAlphabetical.Checked = false; } private void btnAlphabetical_Click(object sender, EventArgs e) { propertiesGrid.PropertySort = PropertySort.Alphabetical; eventsGrid.PropertySort = propertiesGrid.PropertySort; btnCategory.Checked = false; btnAlphabetical.Checked = true; } private void btnProperties_Click(object sender, EventArgs e) { pageControl.ActivePageIndex = 0; btnProperties.Checked = true; btnEvents.Checked = false; } private void btnEvents_Click(object sender, EventArgs e) { pageControl.ActivePageIndex = 1; btnProperties.Checked = false; btnEvents.Checked = true; } private void btnFilter_Click(object sender, EventArgs e) { Filtered = btnFilter.Checked; UpdateContent(); } #endregion #region Public Methods /// public override void SaveState() { base.SaveState(); Storage.SetStr("Sort", propertiesGrid.PropertySort.ToString()); Storage.SetInt("TabIndex", pageControl.ActivePageIndex); } /// public override void RestoreState() { base.RestoreState(); propertiesGrid.PropertySort = eventsGrid.PropertySort = Storage.GetStr("Sort") == "Alphabetical" ? PropertySort.Alphabetical : PropertySort.CategorizedAlphabetical; int tabIndex = Storage.GetInt("TabIndex"); pageControl.ActivePageIndex = tabIndex; btnProperties.Checked = (tabIndex == 0); btnEvents.Checked = (tabIndex == 1); btnCategory.Checked = propertiesGrid.PropertySort == PropertySort.CategorizedAlphabetical; btnAlphabetical.Checked = !btnCategory.Checked; } /// public override void SelectionChanged() { if (updating) return; Throttle.Execute(() => { // prevent fire SelectedValueChanged updating = true; try { if (Designer.SelectedObjects != null && Designer.SelectedObjects.Count == 1) { cbxObjects.SelectedIndex = cbxObjects.Items.IndexOf(Designer.SelectedObjects[0]); cbxObjects.Refresh(); propertiesGrid.SelectedObjects = Designer.SelectedObjects.ToArray(); eventsGrid.SelectedObjects = propertiesGrid.SelectedObjects; } else { cbxObjects.SelectedItem = null; if (Designer.SelectedObjects != null) propertiesGrid.SelectedObjects = Designer.SelectedObjects.ToArray(); else propertiesGrid.SelectedObjects = null; eventsGrid.SelectedObjects = propertiesGrid.SelectedObjects; cbxObjects.Refresh(); } } finally { updating = false; } }); } /// public override void UpdateContent() { cbxObjects.BeginUpdate(); try { cbxObjects.Items.Clear(); if (Designer.ActiveReport != null) { Report report = Designer.ActiveReport.Report; SortedList sl = new SortedList(); EnumComponents(report, sl); foreach (Base c in sl.Values) { cbxObjects.Items.Add(c); } } SelectionChanged(); } finally { cbxObjects.EndUpdate(); } } /// public override void Lock() { base.Lock(); propertiesGrid.SelectedObjects = null; eventsGrid.SelectedObjects = propertiesGrid.SelectedObjects; } /// public override void Localize() { MyRes res = new MyRes("Designer,ToolWindow,Properties"); Text = res.Get(""); btnCategory.ToolTipText = res.Get("Categorized"); btnAlphabetical.ToolTipText = res.Get("Alphabetical"); btnProperties.ToolTipText = res.Get("PropertiesTab"); btnEvents.ToolTipText = res.Get("EventsTab"); btnFilter.ToolTipText = res.Get("Filter"); UpdateContent(); } /// public override void UpdateUIStyle() { base.UpdateUIStyle(); toolbar.UpdateUIStyle(); cbxObjects.SetStyle(Designer.UIStyle); Color color = UIStyleUtils.GetControlColor(Designer.UIStyle); propertiesGrid.BackColor = eventsGrid.BackColor = color; propertiesGrid.LineColor = eventsGrid.LineColor = color; propertiesGrid.HelpBackColor = eventsGrid.HelpBackColor = color; #if (WPF || AVALONIA) propertiesGrid.BorderStyle = eventsGrid.BorderStyle = BorderStyle.None; propertiesGrid.HelpBackColor = eventsGrid.HelpBackColor = Color.White; propertiesGrid.SplitterBackColor = eventsGrid.SplitterBackColor = color; #endif } /// public override void UpdateDpiDependencies() { base.UpdateDpiDependencies(); Image = Designer.GetImage(78); toolbar.Font = propertiesGrid.Font = eventsGrid.Font = Designer.LogicalToDevice(DrawUtils.DefaultFont); toolbar.Height = Designer.LogicalToDevice(26); cbxObjects.ItemHeight = Designer.LogicalToDevice(15); toolbar.UpdateDpiDependencies(); } #endregion /// /// Initializes a new instance of the class with default settings. /// /// The report designer. public PropertiesWindow(Designer designer) : base(designer) { Name = "PropertiesWindow"; #if !MONO Shortcut = DevComponents.DotNetBar.eShortcut.F4; #endif cbxObjects = new StyledComboBox(); cbxObjects.Dock = DockStyle.Top; cbxObjects.DropDownStyle = ComboBoxStyle.DropDownList; cbxObjects.DrawMode = DrawMode.OwnerDrawVariable; cbxObjects.MeasureItem += cbxObjects_MeasureItem; cbxObjects.DrawItem += cbxObjects_DrawItem; cbxObjects.SelectedValueChanged += cbxObjects_SelectedValueChanged; toolbar = new ToolbarBase(designer); toolbar.Dock = DockStyle.Top; toolbar.Fixed = true; #if (WPF || AVALONIA) toolbar.BorderThickness = new Padding(0); #endif btnCategory = AddButton(69, btnCategory_Click); btnCategory.Checked = true; btnAlphabetical = AddButton(67, btnAlphabetical_Click); btnProperties = AddButton(78, btnProperties_Click); btnProperties.BeginGroup = true; btnProperties.Checked = true; btnEvents = AddButton(79, btnEvents_Click); btnFilter = AddButton(180, btnFilter_Click); btnFilter.BeginGroup = true; btnFilter.CheckOnClick = true; toolbar.AddItems(btnCategory, btnAlphabetical, btnProperties, btnEvents, btnFilter); pageControl = new PageControl(); pageControl.Dock = DockStyle.Fill; PageControlPage propPage = new PageControlPage(); propPage.Dock = DockStyle.Fill; pageControl.Pages.Add(propPage); PageControlPage eventsPage = new PageControlPage(); eventsPage.Dock = DockStyle.Fill; pageControl.Pages.Add(eventsPage); propertiesGrid = new FRPropertiesGrid(); propertiesGrid.ToolbarVisible = false; propertiesGrid.Dock = DockStyle.Fill; propertiesGrid.PropertyValueChanged += grid_PropertyValueChanged; propertiesGrid.Parent = propPage; eventsGrid = new FREventsGrid(); eventsGrid.ToolbarVisible = false; eventsGrid.Dock = DockStyle.Fill; eventsGrid.PropertyValueChanged += grid_PropertyValueChanged; eventsGrid.Parent = eventsPage; Controls.AddRange(new Control[] { pageControl, toolbar, cbxObjects }); Localize(); UpdateDpiDependencies(); } } }