using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
namespace DevComponents.DotNetBar
{
	/// 
	/// Represents a group RibbonTabItem objects are assigned to.
	/// 
    [DesignTimeVisible(false), ToolboxItem(false), TypeConverterAttribute("DevComponents.DotNetBar.Design.RibbonTabItemGroupConverter, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf")]
	public class RibbonTabItemGroup:Component
	{
		#region Private Variables & Constructor
		private ElementStyle m_Style=null;
		private string m_GroupTitle="";
		private RibbonStrip m_ParentRibbonStrip=null;
        [EditorBrowsable(EditorBrowsableState.Never), Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
		public ArrayList DisplayPositions=new ArrayList();
        private eRibbonTabGroupColor m_Color = eRibbonTabGroupColor.Default;
        private string m_Name = "";
        private string m_CustomColorName = "";
		public RibbonTabItemGroup()
		{
			m_Style=new ElementStyle();
			m_Style.StyleChanged+=new EventHandler(StyleChanged);
		}
		#endregion
		#region Internal Implementation
        /// 
        /// Gets or sets the predefined color of the group. Color specified here applies to groups with Office 12 style only. It does not have
        /// any effect on other styles. Default value is eRibbonTabGroupColor.Default
        /// 
        [Browsable(true), DefaultValue(eRibbonTabGroupColor.Default), Category("Appearance"), Description("Indicates predefined color of the group when Office 12 style is used.")]
        public eRibbonTabGroupColor Color
        {
            get { return m_Color; }
            set
            {
                if (m_Color != value)
                {
                    m_Color = value;
                    if (this.ParentRibbonStrip != null)
                        this.ParentRibbonStrip.Invalidate();
                }
            }
        }
        /// 
        /// Gets or sets the custom color name. Name specified here must be represented by the coresponding object with the same name that is part
        /// of the Office2007ColorTable.RibbonTabGroupColors collection. See documentation for Office2007ColorTable.RibbonTabGroupColors for more information.
        /// If color table with specified name cannot be found default color will be used. Valid settings for this property override any
        /// setting to the Color property.
        /// 
        [Browsable(true), DevCoBrowsable(false), DefaultValue(""), Category("Appearance"), Description("Indicates custom color table name for the button when Office 2007 style is used.")]
        public string CustomColorName
        {
            get { return m_CustomColorName; }
            set
            {
                m_CustomColorName = value;
                if (this.ParentRibbonStrip != null)
                    this.ParentRibbonStrip.Invalidate();
            }
        }
		/// 
		/// Gets the style for tab group.
		/// 
		[Browsable(false),Category("Background"),Description("Gets the style for tab group."),DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
		public ElementStyle Style
		{
			get {return m_Style;}
		}
		/// 
		/// Gets or sets title of the group that will be displayed when group is visually represented.
		/// 
        [Browsable(true), DevCoBrowsable(true), DefaultValue(""), Localizable(true)]
		public string GroupTitle
		{
			get {return m_GroupTitle;}
			set
			{
				m_GroupTitle=value;
				if(this.DesignMode && m_ParentRibbonStrip!=null)
				{
					m_ParentRibbonStrip.RecalcLayout();
				}
			}
		}
		private void StyleChanged(object sender, EventArgs e)
		{
			if(m_ParentRibbonStrip!=null)
				m_ParentRibbonStrip.Refresh();
		}
		
		/// 
		/// Gets or sets parent ribbon strip for this group.
		/// 
		[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),Browsable(false)]
		internal RibbonStrip ParentRibbonStrip
		{
			get {return m_ParentRibbonStrip;}
			set
			{
				m_ParentRibbonStrip=value;
				if(m_ParentRibbonStrip!=null)
					m_Style.SetColorScheme(m_ParentRibbonStrip.ColorScheme);
			}
		}
		public override string ToString()
		{
			if(m_GroupTitle.Length>0)
				return m_GroupTitle;
			return base.ToString ();
		}
		/// 
		/// Gets or sets whether RibbonTabItem objects that belong to this group are visible. Setting this property will
		/// show/hide all RibbonTabItem objects that are assigned to this group through RibbonTabItem.Group property.
		/// 
		[Browsable(false),DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
		public bool Visible
		{
			get
			{
				if(m_ParentRibbonStrip==null)
					return true;
				bool visible=false;
				foreach(BaseItem item in m_ParentRibbonStrip.Items)
				{
					if(item is RibbonTabItem)
					{
						RibbonTabItem tab=item as RibbonTabItem;
						if(tab.Group == this && tab.Visible)
						{
							visible=true;
							break;
						}
					}
				}
				return visible;
			}
			set
			{
				if(m_ParentRibbonStrip==null)
					return;
				foreach(BaseItem item in m_ParentRibbonStrip.Items)
				{
					if(item is RibbonTabItem)
					{
						RibbonTabItem tab=item as RibbonTabItem;
						if(tab.Group==this)
							tab.Visible=value;
					}
				}
				m_ParentRibbonStrip.RecalcLayout();
			}
		}
        /// 
        /// Gets whether any tab from this tab group is selected.
        /// 
        [Browsable(false)]
        public bool IsTabFromGroupSelected
        {
            get
            {
                if(m_ParentRibbonStrip==null)
					return false;
				foreach(BaseItem item in m_ParentRibbonStrip.Items)
				{
					if(item is RibbonTabItem)
					{
						RibbonTabItem tab=item as RibbonTabItem;
                        if (tab.Group == this && tab.Checked)
                            return true;
					}
				}
                return false;
            }
        }
        /// 
        /// Selected first tab that is part of this group.
        /// 
        public void SelectFirstTab()
        {
            if (m_ParentRibbonStrip == null)
                return;
            foreach (BaseItem item in m_ParentRibbonStrip.Items)
            {
                if (item is RibbonTabItem)
                {
                    RibbonTabItem tab = item as RibbonTabItem;
                    if (tab.Group == this && tab.Visible)
                    {
                        tab.Checked = true;
                        break;
                    }
                }
            }
        }
        /// 
        /// Gets or sets name of the group that can be used to identify item from the code.
        /// 
        [Browsable(false), Category("Design"), Description("Indicates the name used to identify the group.")]
        public string Name
        {
            get
            {
                if (this.Site != null)
                    m_Name = this.Site.Name;
                return m_Name;
            }
            set
            {
                if (this.Site != null)
                    this.Site.Name = value;
                if (value == null)
                    m_Name = "";
                else
                    m_Name = value;
            }
        }
        /// 
        /// Gets an array of Rectangle objects that describe the visual position on the ribbon control of the group titles displayed.
        /// If tabs that belong to a tab group are not next to each other then there will be multiple rectangle returned as part of the array
        /// for each tab group that is apart.
        /// 
        [Browsable(false)]
        public Rectangle[] TitleBounds
        {
            get
            {
                return (Rectangle[])DisplayPositions.ToArray(typeof(Rectangle));
            }
        }
		#endregion
	}
}