using FastReport.Forms; using FastReport.Utils; using System.Collections; using System.Windows; using System.Windows.Forms; namespace FastReport.Design.RibbonDesigner { internal enum GroupState { Normal, Reduced, Collapsed } internal enum GroupPriority { Low, Medium, High } internal class RibbonGroup : GridPanel, IDesignerPlugin { private Hashtable cachedWidths = new Hashtable(); public Designer Designer { get; } public StackedPanel Panel { get; } public Label Caption { get; } private GroupState state; public GroupState State { get => state; set { state = value; UpdateState(); control.UpdateLayout(); } } public double GroupWidth { get { if (!cachedWidths.ContainsKey(state)) cachedWidths[state] = this.Measure(); return (double)cachedWidths[state]; } } public ToolbarLayoutDropDownButton CollapsedButton { get; } public string CollapsedImageName { get; set; } public GroupPriority Priority { get; set; } private ControlStorageService storage; /// /// Gets storage service. /// public ControlStorageService Storage { get { if (storage == null) storage = new ControlStorageService(this, "Designer," + Name); return storage; } } public override string Text { get => base.Text; set { base.Text = value; Caption.Text = value; CollapsedButton.Text = value; } } public override bool Visible { get => base.Visible; set { if (value != Visible) { base.Visible = value; control.Visibility = value ? Visibility.Visible : Visibility.Collapsed; cachedWidths.Clear(); control.UpdateLayout(); (Parent as Ribbon).UpdateLayout(); } } } #region IDesignerPlugin public string PluginName => Name; /// public virtual void SaveState() { } /// public virtual void RestoreState() { } /// public virtual void SelectionChanged() { } /// public virtual void UpdateContent() { } /// public void Lock() { } /// public void Unlock() { UpdateContent(); } /// public virtual void Localize() { cachedWidths.Clear(); } /// public virtual DesignerOptionsPage GetOptionsPage() { return null; } /// public virtual void UpdateUIStyle() { Panel.UpdateUIStyle(Designer.UIStyle); CollapsedButton.UpdateUIStyle(Designer.UIStyle); } /// public virtual void UpdateDpiDependencies() { RibbonExtensions.UpdateDpiDependencies(this); Panel.UpdateDpiDependencies(); if (!string.IsNullOrEmpty(CollapsedImageName)) CollapsedButton.Image = Designer.GetImage(CollapsedImageName); } #endregion public virtual void UpdateState() { if (State == GroupState.Collapsed) { Panel.CollapseTo(CollapsedButton); } else { CollapsedButton.ExpandTo(Panel); } } public void SetItemText(ToolStripItem item, string text) { if (text.EndsWith("...")) text = text.Substring(0, text.Length - 3); item.ToolTipText = text; item.Text = text; } public RibbonGroup(Designer designer) { Designer = designer; state = GroupState.Normal; control.Margin = new Thickness(4, 1, 4, 1); Caption = new RibbonGroupCaption(); this.Controls.Add(Caption); Panel = new StackedPanel() { Vertical = false }; Panel.control.Margin = new Thickness(0, 3, 0, 16); this.Controls.Add(Panel); CollapsedButton = new ToolbarLayoutDropDownButton(); CollapsedButton.MakeBig(); CollapsedButton.DropDownOpening += (s, e) => UpdateDpiDependencies(); } } }