using System; using System.Collections.Generic; using System.Windows.Forms; using System.Drawing; using FastReport.Utils; using FastReport.Controls; using System.Runtime.InteropServices; #if !MONO using FastReport.DevComponents.DotNetBar; using FastReport.DevComponents.DotNetBar.Controls; #endif namespace FastReport.Design.ToolWindows { /// /// Represents the "Properties" window. /// public class PropertiesWindow : ToolWindowBase { #region Fields private bool updating; private FRPropertyGrid propertiesGrid; private FRPropertyGrid eventsGrid; private PageControl pageControl; private bool saving; #if !MONO private ComboBoxEx cbxObjects; private Bar toolbar; private ButtonItem btnCategory; private ButtonItem btnAlphabetical; private ButtonItem btnProperties; private ButtonItem btnEvents; #else private ComboBox cbxObjects; private ToolStrip toolbar; private ToolStripButton btnCategory; private ToolStripButton btnAlphabetical; private ToolStripButton btnProperties; private ToolStripButton btnEvents; #endif #endregion #region Public properties /// public bool Saving { get { return saving; } set { saving = value; } } #endregion #region Private Methods private void cbxObjects_DrawItem(object sender, DrawItemEventArgs e) { e.DrawBackground(); Graphics g = e.Graphics; 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, new Point(e.Bounds.X, e.Bounds.Y), e.ForeColor); } else { TextRenderer.DrawText(g, c.Name, f, e.Bounds, e.ForeColor, TextFormatFlags.Left | TextFormatFlags.VerticalCenter); TextRenderer.DrawText(g, c.ClassName, e.Font, new Rectangle(e.Bounds.X + (int)sz.Width, e.Bounds.Y, e.Bounds.Width - (int)sz.Width, e.Bounds.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, new Point(e.Bounds.X, e.Bounds.Y), e.ForeColor); } } 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; } #endregion #region Public Methods /// public override void SaveState() { XmlItem xi = Config.Root.FindItem("Designer").FindItem(Name); xi.SetProp("Sort", propertiesGrid.PropertySort.ToString()); xi.SetProp("TabIndex", pageControl.ActivePageIndex.ToString()); } /// public override void RestoreState() { XmlItem xi = Config.Root.FindItem("Designer").FindItem(Name); propertiesGrid.PropertySort = xi.GetProp("Sort") == "Alphabetical" ? PropertySort.Alphabetical : PropertySort.CategorizedAlphabetical; eventsGrid.PropertySort = propertiesGrid.PropertySort; string tabIndexProp = xi.GetProp("TabIndex"); if (!String.IsNullOrEmpty(tabIndexProp)) { int tabIndex = 0; Int32.TryParse(tabIndexProp, out 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; // 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; } } 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); } } /// public override void UpdateContent() { cbxObjects.BeginUpdate(); try { if (!Saving) { 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() { Text = Res.Get("Designer,ToolWindow,Properties"); UpdateContent(); } /// public override void UpdateUIStyle() { base.UpdateUIStyle(); #if !MONO toolbar.Style = UIStyleUtils.GetDotNetBarStyle(Designer.UIStyle); cbxObjects.Style = toolbar.Style; Color color = UIStyleUtils.GetControlColor(Designer.UIStyle); ParentControl.BackColor = color; #else toolbar.Renderer = UIStyleUtils.GetToolStripRenderer(Designer.UIStyle); propertiesGrid.Style = Designer.UIStyle; eventsGrid.Style = propertiesGrid.Style; Color color = UIStyleUtils.GetColorTable(Designer.UIStyle).ControlBackColor; #endif propertiesGrid.BackColor = color; propertiesGrid.LineColor = color; propertiesGrid.HelpBackColor = color; eventsGrid.BackColor = color; eventsGrid.LineColor = color; eventsGrid.HelpBackColor = color; } /// public override void UpdateDpiDependencies() { base.UpdateDpiDependencies(); toolbar.Font = Designer.LogicalToDevice(DrawUtils.DefaultFont); cbxObjects.ItemHeight = Designer.LogicalToDevice(15); Image = Designer.GetImage(78); #if !MONO ImageIndex = 78; toolbar.UpdateDpiDependencies(); UpdateImages(toolbar.Items); #endif } #if !MONO [DllImport("user32.dll", CharSet = CharSet.Auto)] internal static extern int SendMessage(IntPtr hWnd, int msg, int wParam, IntPtr lParam); #endif internal void TypeChar(char c) { #if !MONO FRPropertyGrid grid = pageControl.ActivePageIndex == 0 ? propertiesGrid : eventsGrid; grid.Focus(); SendMessage(grid.ActiveControl.Handle, 0x0102, (int)c, IntPtr.Zero); #endif } #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 = eShortcut.F4; cbxObjects = new ComboBoxEx(); cbxObjects.Dock = DockStyle.Top; cbxObjects.DisableInternalDrawing = true; cbxObjects.DropDownStyle = ComboBoxStyle.DropDownList; cbxObjects.DrawMode = DrawMode.OwnerDrawFixed; cbxObjects.DrawItem += new DrawItemEventHandler(cbxObjects_DrawItem); cbxObjects.SelectedValueChanged += new EventHandler(cbxObjects_SelectedValueChanged); toolbar = new Bar(); toolbar.Dock = DockStyle.Top; toolbar.RoundCorners = false; btnCategory = AddButton(69, btnCategory_Click); btnCategory.AutoCheckOnClick = true; btnCategory.OptionGroup = "1"; btnAlphabetical = AddButton(67, btnAlphabetical_Click); btnAlphabetical.AutoCheckOnClick = true; btnAlphabetical.OptionGroup = "1"; btnProperties = AddButton(78, btnProperties_Click); btnProperties.BeginGroup = true; btnProperties.AutoCheckOnClick = true; btnProperties.OptionGroup = "2"; btnProperties.Checked = true; btnEvents = AddButton(79, btnEvents_Click); btnEvents.AutoCheckOnClick = true; btnEvents.OptionGroup = "2"; toolbar.Items.AddRange(new ButtonItem[] { btnCategory, btnAlphabetical, btnProperties, btnEvents }); #else cbxObjects = new ComboBox(); cbxObjects.Dock = DockStyle.Top; cbxObjects.FlatStyle = FlatStyle.Popup; cbxObjects.DropDownStyle = ComboBoxStyle.DropDownList; cbxObjects.DrawMode = DrawMode.OwnerDrawFixed; cbxObjects.ItemHeight = 16; cbxObjects.DrawItem += cbxObjects_DrawItem; cbxObjects.SelectedValueChanged += cbxObjects_SelectedValueChanged; toolbar = new ToolStrip(); toolbar.Dock = DockStyle.Top; toolbar.Font = DrawUtils.DefaultFont; toolbar.GripStyle = ToolStripGripStyle.Hidden; btnCategory = new ToolStripButton("", this.GetImage(69), btnCategory_Click); btnCategory.Checked = true; // mono fix btnCategory.AutoSize = false; btnCategory.Size = new Size(23, 22); btnAlphabetical = new ToolStripButton("", this.GetImage(67), btnAlphabetical_Click); btnProperties = new ToolStripButton("", this.GetImage(78), btnProperties_Click); btnProperties.Checked = true; btnEvents = new ToolStripButton("", this.GetImage(79), btnEvents_Click); toolbar.Items.AddRange(new ToolStripItem[] { btnCategory, btnAlphabetical, new ToolStripSeparator(), btnProperties, btnEvents }); #endif 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 += new PropertyValueChangedEventHandler(grid_PropertyValueChanged); propertiesGrid.Parent = propPage; eventsGrid = new FREventsGrid(); eventsGrid.ToolbarVisible = false; eventsGrid.Dock = DockStyle.Fill; eventsGrid.PropertyValueChanged += new PropertyValueChangedEventHandler(grid_PropertyValueChanged); eventsGrid.Parent = eventsPage; #if !MONO ParentControl.Controls.AddRange(new Control[] { pageControl, toolbar, cbxObjects }); #else Controls.AddRange(new Control[] { pageControl, toolbar, cbxObjects }); #endif Localize(); UpdateDpiDependencies(); } } }