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();
}
}
}