321 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			321 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Text;
 | |
| using System.Windows.Forms;
 | |
| using System.Collections;
 | |
| using System.ComponentModel;
 | |
| using System.Drawing;
 | |
| 
 | |
| namespace DevComponents.DotNetBar
 | |
| {
 | |
|     /// <summary>
 | |
|     /// Represents the container for RibbonBar objects that will be merged into the MDI parent ribbon control.
 | |
|     /// </summary>
 | |
|     [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
 | |
|         /// <summary>
 | |
|         /// Occurs before the RibbonBar objects from container are merged into the Ribbon control.
 | |
|         /// </summary>
 | |
|         public event EventHandler BeforeRibbonMerge;
 | |
|         /// <summary>
 | |
|         /// Occurs after the RibbonBar objects are merged into the Ribbon control.
 | |
|         /// </summary>
 | |
|         public event EventHandler AfterRibbonMerge;
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Occurs after the RibbonBar objects are removed from the Ribbon control.
 | |
|         /// </summary>
 | |
|         public event EventHandler BeforeRibbonUnmerge;
 | |
| 
 | |
|         /// Occurs before the RibbonBar objects are removed from the Ribbon control.
 | |
|         /// </summary>
 | |
|         public event EventHandler AfterRibbonUnmerge;
 | |
|         #endregion
 | |
| 
 | |
|         #region Internal Implementation
 | |
|         /// <summary>
 | |
|         /// Gets whether RibbonBar controls are merged into the RibbonControl.
 | |
|         /// </summary>
 | |
|         public bool IsMerged
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return m_MergedRibbonBarsList.Count > 0;
 | |
|             }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// Removes any RibbonBar objects that were merged into the Ribbon control.
 | |
|         /// </summary>
 | |
|         /// <param name="ribbon">Reference to ribbon control to remove RibbonBar objects from.</param>
 | |
|         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());
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Merges RibbonBar objects from this container into the Ribbon control.
 | |
|         /// </summary>
 | |
|         /// <param name="ribbon">Reference to ribbon control to remove RibbonBar objects from.</param>
 | |
|         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;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 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.
 | |
|         /// </summary>
 | |
|         [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; }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets whether merge functionality is enabled for the container. Default value is true.
 | |
|         /// </summary>
 | |
|         [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; }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 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.
 | |
|         /// </summary>
 | |
|         [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 = "";
 | |
|         /// <summary>
 | |
|         /// 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.
 | |
|         /// </summary>
 | |
|         [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;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 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
 | |
|         /// </summary>
 | |
|         [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; }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 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.
 | |
|         /// </summary>
 | |
|         [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; }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 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.
 | |
|         /// </summary>
 | |
|         [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; }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 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.
 | |
|         /// </summary>
 | |
|         [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; }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Raises the BeforeRibbonMerge event.
 | |
|         /// </summary>
 | |
|         protected virtual void OnBeforeRibbonMerge(EventArgs e)
 | |
|         {
 | |
|             if (BeforeRibbonMerge != null)
 | |
|                 BeforeRibbonMerge(this, e);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Raises the AfterRibbonMerge event.
 | |
|         /// </summary>
 | |
|         protected virtual void OnAfterRibbonMerge(EventArgs e)
 | |
|         {
 | |
|             if (AfterRibbonMerge != null)
 | |
|                 AfterRibbonMerge(this, e);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Raises the BeforeRibbonUnmerge event.
 | |
|         /// </summary>
 | |
|         protected virtual void OnBeforeRibbonUnmerge(EventArgs e)
 | |
|         {
 | |
|             if (BeforeRibbonUnmerge != null)
 | |
|                 BeforeRibbonUnmerge(this, e);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Raises the AfterRibbonUnmerge event.
 | |
|         /// </summary>
 | |
|         protected virtual void OnAfterRibbonUnmerge(EventArgs e)
 | |
|         {
 | |
|             if (AfterRibbonUnmerge != null)
 | |
|                 AfterRibbonUnmerge(this, e);
 | |
|         }
 | |
|         #endregion
 | |
|     }
 | |
| }
 |