using System; using System.Text; using System.Windows.Forms; using System.Collections; using System.ComponentModel; using System.Drawing; namespace DevComponents.DotNetBar { /// /// Represents the container for RibbonBar objects that will be merged into the MDI parent ribbon control. /// [ToolboxBitmap(typeof(RibbonBarMergeContainer), "Ribbon.RibbonControl.ico"), ToolboxItem(true), Designer("DevComponents.DotNetBar.Design.RibbonBarMergeContainerDesigner, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf"), System.Runtime.InteropServices.ComVisible(false)] public class RibbonBarMergeContainer : RibbonPanel { #region Private variables private bool m_AutoActivateTab = true; private string m_RibbonTabText = ""; private string m_MergeIntoRibbonTabItemName = ""; private ArrayList m_MergedRibbonBarsList = new ArrayList(); private bool m_RibbonTabItemCreated = false; private bool m_PreMergedVisibleState = false; private bool m_AllowMerge = true; private string m_MergeRibbonGroupName = ""; private int m_MergeRibbonTabItemIndex = -1; private eRibbonTabColor m_RibbonTabColorTable = eRibbonTabColor.Default; #endregion #region Events /// /// Occurs before the RibbonBar objects from container are merged into the Ribbon control. /// public event EventHandler BeforeRibbonMerge; /// /// Occurs after the RibbonBar objects are merged into the Ribbon control. /// public event EventHandler AfterRibbonMerge; /// /// Occurs after the RibbonBar objects are removed from the Ribbon control. /// public event EventHandler BeforeRibbonUnmerge; /// Occurs before the RibbonBar objects are removed from the Ribbon control. /// public event EventHandler AfterRibbonUnmerge; #endregion #region Internal Implementation /// /// Gets whether RibbonBar controls are merged into the RibbonControl. /// public bool IsMerged { get { return m_MergedRibbonBarsList.Count > 0; } } /// /// Removes any RibbonBar objects that were merged into the Ribbon control. /// /// Reference to ribbon control to remove RibbonBar objects from. public virtual void RemoveMergedRibbonBars(RibbonControl ribbon) { OnBeforeRibbonUnmerge(new EventArgs()); Control parent = null; foreach (RibbonBar c in m_MergedRibbonBarsList) { if (c.Parent != null) { if (parent == null) { parent = c.Parent; parent.SuspendLayout(); } c.Parent.Controls.Remove(c); } this.Controls.Add(c); c.Enabled = false; // Disable shortcuts } m_MergedRibbonBarsList.Clear(); if (parent != null) parent.ResumeLayout(); if (m_RibbonTabItemCreated) { this.RibbonTabItem.Parent.SubItems.Remove(this.RibbonTabItem); if (this.RibbonTabItem.Panel != null && this.RibbonTabItem.Panel.Parent!=null) { this.RibbonTabItem.Panel.Parent.Controls.Remove(this.RibbonTabItem.Panel); } this.RibbonTabItem.Panel.Dispose(); this.RibbonTabItem.Panel = null; m_RibbonTabItemCreated = false; } this.RibbonTabItem = null; if (this.Visible != m_PreMergedVisibleState) this.Visible = m_PreMergedVisibleState; OnAfterRibbonUnmerge(new EventArgs()); } /// /// Merges RibbonBar objects from this container into the Ribbon control. /// /// Reference to ribbon control to remove RibbonBar objects from. public virtual void MergeRibbonBars(RibbonControl ribbon) { OnBeforeRibbonMerge(new EventArgs()); m_PreMergedVisibleState = this.Visible; if (this.Visible) this.Visible = false; RibbonTabItem tab = GetCreateRibbonTabItem(ribbon); Control[] controls = new Control[this.Controls.Count]; this.Controls.CopyTo(controls, 0); int xpos = tab.Panel.Width + 1; tab.Panel.SuspendLayout(); foreach (Control c in controls) { if (c is RibbonBar) { this.Controls.Remove(c); if (m_MergeIntoRibbonTabItemName.Length > 0 && !tab.Panel.DefaultLayout) { c.Left = xpos; xpos += c.Width; } tab.Panel.Controls.Add(c); c.Enabled = true; m_MergedRibbonBarsList.Add(c); } } tab.Panel.ResumeLayout(); OnAfterRibbonMerge(new EventArgs()); } private RibbonTabItem GetCreateRibbonTabItem(RibbonControl ribbon) { if (m_MergeIntoRibbonTabItemName != "") { if(ribbon.Items.IndexOf(m_MergeIntoRibbonTabItemName)<0) throw new NullReferenceException("MergeIntoRibbonTabItemName specified (" + m_MergeIntoRibbonTabItemName + ") cannot be found in RibbonControl.Items collection"); this.RibbonTabItem = ribbon.Items[m_MergeIntoRibbonTabItemName] as RibbonTabItem; return this.RibbonTabItem; } string tabText = m_RibbonTabText; if (tabText.Length == 0) tabText = this.Name; string tabName = (this.Parent != null ? this.Parent.Name + "." : "") + this.Name; this.RibbonTabItem = ribbon.CreateRibbonTab(tabText, tabName, m_MergeRibbonTabItemIndex); if (!string.IsNullOrEmpty(_RibbonTabKeyTips)) this.RibbonTabItem.KeyTips = _RibbonTabKeyTips; this.RibbonTabItem.ColorTable = m_RibbonTabColorTable; m_RibbonTabItemCreated = true; if (m_MergeRibbonGroupName.Length > 0) { RibbonTabItemGroup group = ribbon.TabGroups[m_MergeRibbonGroupName]; if (group != null) { int lastTabGroupIndex = -1; for (int i = 0; i < ribbon.Items.Count; i++) { if (ribbon.Items[i] is RibbonTabItem && ((RibbonTabItem)ribbon.Items[i]).Group == group) lastTabGroupIndex = i; } this.RibbonTabItem.Group = group; if (lastTabGroupIndex >= 0) { ribbon.Items.Remove(this.RibbonTabItem); ribbon.Items.Insert(lastTabGroupIndex + 1, this.RibbonTabItem); } } } return this.RibbonTabItem; } /// /// Gets or sets whether RibbonTab item the RibbonBar controls are added to when merged is automatically activated (selected) after /// controls are merged. Default value is true. /// [Browsable(true), DefaultValue(true), Category("Behaviour"), Description("Indicates whether RibbonTab item the RibbonBar controls are added to when merged is automatically activated (selected) after controls are merged.")] public bool AutoActivateTab { get { return m_AutoActivateTab; } set { m_AutoActivateTab = value; } } /// /// Gets or sets whether merge functionality is enabled for the container. Default value is true. /// [Browsable(true), DefaultValue(true), Category("Behaviour"), Description("Indicates whether merge functionality is enabled for the container.")] public bool AllowMerge { get { return m_AllowMerge; } set { m_AllowMerge = value; } } /// /// Gets or sets the Ribbon Tab text for the tab that will be created when ribbon bar objects from this container are merged into the ribbon. /// [Browsable(true), DefaultValue(""), Localizable(true), Category("Data"), Description("Indicates the Ribbon Tab text for the tab that will be created when ribbon bar objects from this container are merged into the ribbon.")] public string RibbonTabText { get { return m_RibbonTabText; } set { m_RibbonTabText = value; if (this.IsMerged && this.RibbonTabItem != null) this.RibbonTabItem.Text = value; } } private string _RibbonTabKeyTips = ""; /// /// Gets or sets the Key Tips access key or keys for the Ribbon Tab. Use KeyTips property /// when you want to assign the one or more letters to be used to access an item. For example assigning the FN to KeyTips property /// will require the user to press F then N keys to select an item. Pressing the F letter will show only keytips for the items that start with letter F. /// [Browsable(true), Category("Appearance"), DefaultValue(""), Description("Indicates the Key Tips access key or keys for the Ribbon Tab.")] public virtual string RibbonTabKeyTips { get { return _RibbonTabKeyTips; } set { if (value == null) value = ""; _RibbonTabKeyTips = value.ToUpper(); if (this.IsMerged && this.RibbonTabItem != null) this.RibbonTabItem.KeyTips = _RibbonTabKeyTips; } } /// /// Gets or sets the predefined color for the ribbon tab that is created when ribbon bar controls are merged into the ribbon. /// Default value is eRibbonTabColor.Default /// [Browsable(true), DefaultValue(eRibbonTabColor.Default), Category("Appearance"), Description("Indicates predefined color for the ribbon tab that is created when ribbon bar controls are merged into the ribbon.")] public eRibbonTabColor RibbonTabColorTable { get { return m_RibbonTabColorTable; } set { m_RibbonTabColorTable = value; } } /// /// Gets or sets the name of RibbonTabItem object that already exists on Ribbon control into which the RibbonBar controls are merged. /// If name is not specified new RibbonTabItem is created and RibbonBar controls are added to it. /// [Browsable(true), DefaultValue(""), Category("Data"), Description("Indicates the name of RibbonTabItem object that already exists on Ribbon control into which the RibbonBar controls are merged.")] public string MergeIntoRibbonTabItemName { get { return m_MergeIntoRibbonTabItemName; } set { m_MergeIntoRibbonTabItemName = value; } } /// /// Gets or sets the name of the RibbonTabItemGroup the new Ribbon Tab Item that is created will be added to. The RibbonTabItemGroup /// must be created and added to RibbonControl.TabGroups collection. /// [Browsable(true), DefaultValue(""), Category("Data"), Description("Indicates the name of the RibbonTabItemGroup the new Ribbon Tab Item that is created will be added to.")] public string MergeRibbonGroupName { get { return m_MergeRibbonGroupName; } set { m_MergeRibbonGroupName = value; } } /// /// Gets or sets the insertion index for the ribbon tab item that is created when ribbon bars are merged into the ribbon control. /// Default value is -1 which means that ribbon tab item is appended to the existing ribbon tab items. /// [Browsable(true), DefaultValue(-1), Category("Data"), Description("Indicates the insertion index for the ribbon tab item that is created when ribbon bars are merged into the ribbon control.")] public int MergeRibbonTabItemIndex { get { return m_MergeRibbonTabItemIndex; } set { m_MergeRibbonTabItemIndex = value; } } /// /// Raises the BeforeRibbonMerge event. /// protected virtual void OnBeforeRibbonMerge(EventArgs e) { if (BeforeRibbonMerge != null) BeforeRibbonMerge(this, e); } /// /// Raises the AfterRibbonMerge event. /// protected virtual void OnAfterRibbonMerge(EventArgs e) { if (AfterRibbonMerge != null) AfterRibbonMerge(this, e); } /// /// Raises the BeforeRibbonUnmerge event. /// protected virtual void OnBeforeRibbonUnmerge(EventArgs e) { if (BeforeRibbonUnmerge != null) BeforeRibbonUnmerge(this, e); } /// /// Raises the AfterRibbonUnmerge event. /// protected virtual void OnAfterRibbonUnmerge(EventArgs e) { if (AfterRibbonUnmerge != null) AfterRibbonUnmerge(this, e); } #endregion } }