using System; using System.Collections; using System.ComponentModel; using System.Drawing; using System.Data; using System.Windows.Forms; using System.Reflection; namespace DevComponents.DotNetBar { /// /// Summary description for TabControl. /// [ToolboxItem(true), Designer("DevComponents.DotNetBar.Design.TabControlDesigner, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf")] public class TabControl : System.Windows.Forms.Control,ISupportInitialize { #region Events /// /// Occurs when selected tab changes. /// public event TabStrip.SelectedTabChangedEventHandler SelectedTabChanged; /// /// Occurs before selected tab changes and gives you opportunity to cancel the change. /// public event TabStrip.SelectedTabChangingEventHandler SelectedTabChanging; /// /// Occurs when tab is dragged by user. /// public event TabStrip.TabMovedEventHandler TabMoved; /// /// Occurs when the user navigates back using the back arrow. /// public event TabStrip.UserActionEventHandler NavigateBack; /// /// Occurs when the user navigates forward using the forward arrow. /// public event TabStrip.UserActionEventHandler NavigateForward; /// /// Occurs when tab item is closing. /// public event TabStrip.UserActionEventHandler TabItemClose; /// /// Occurs when tab item is added to the tabs collection. /// public event EventHandler TabItemOpen; /// /// Occurs before control or item attached to the tab is displayed. /// public event EventHandler BeforeTabDisplay; /// /// Occurs after tab item has been removed from tabs collection. /// public event EventHandler TabRemoved; #endregion #region Private Variables & Constructor, Dispose private DevComponents.DotNetBar.TabStrip tabStrip1; //private int m_SelectedTabIndex=0; private System.Windows.Forms.Timer m_ClickTimer=null; private bool m_AutoCloseTabs = false; private bool m_TabStripVisible = true; private int m_LoadSelectedTabIndex = -1; private bool m_SyncingTabStripSize = false; /// /// Required designer variable. /// private System.ComponentModel.Container components = null; public TabControl() { this.SetStyle(ControlStyles.Opaque,true); this.SetStyle(DisplayHelp.DoubleBufferFlag,true); this.SetStyle(ControlStyles.AllPaintingInWmPaint,true); this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); // This call is required by the Windows.Forms Form Designer. InitializeComponent(); //tabStrip1.VariableTabWidth=false; tabStrip1.TabLayoutType=eTabLayoutType.FixedWithNavigationBox; tabStrip1.SizeRecalculated+=new EventHandler(this.TabStripSizeRecalculated); StyleManager.Register(this); } /// /// Clean up any resources being used. /// protected override void Dispose( bool disposing ) { if( disposing ) { if(components != null) { components.Dispose(); } StyleManager.Unregister(this); } base.Dispose( disposing ); } #endregion #region Component Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { this.tabStrip1 = new DevComponents.DotNetBar.TabStrip(); this.SuspendLayout(); // // tabStrip1 // this.tabStrip1.CanReorderTabs = true; this.tabStrip1.CloseButtonVisible = true; this.tabStrip1.Dock = System.Windows.Forms.DockStyle.Top; this.tabStrip1.ImageList = null; this.tabStrip1.Name = "tabStrip1"; this.tabStrip1.SelectedTab = null; this.tabStrip1.Size = new System.Drawing.Size(256, 26); this.tabStrip1.Style = DevComponents.DotNetBar.eTabStripStyle.OneNote; this.tabStrip1.TabAlignment = DevComponents.DotNetBar.eTabStripAlignment.Top; this.tabStrip1.TabIndex = 0; this.tabStrip1.Text = "tabStrip1"; this.tabStrip1.AutoHideSystemBox=true; this.tabStrip1.CloseButtonVisible=false; this.tabStrip1.TabRemoved += new System.EventHandler(this.tabStrip1_TabRemoved); this.tabStrip1.TabItemOpen += new EventHandler(tabStrip1_TabItemAdded); this.tabStrip1.SelectedTabChanged += new DevComponents.DotNetBar.TabStrip.SelectedTabChangedEventHandler(this.tabStrip1_SelectedTabChanged); this.tabStrip1.SelectedTabChanging += new DevComponents.DotNetBar.TabStrip.SelectedTabChangingEventHandler(this.tabStrip1_SelectedTabChanging); this.tabStrip1.TabMoved+=new TabStrip.TabMovedEventHandler(this.tabStrip1_TabMoved); this.tabStrip1.NavigateBack+=new TabStrip.UserActionEventHandler(this.tabStrip1_NavigateBack); this.tabStrip1.NavigateForward+=new TabStrip.UserActionEventHandler(this.tabStrip1_NavigateForward); this.tabStrip1.TabItemClose+=new TabStrip.UserActionEventHandler(this.tabStrip1_TabItemClose); this.tabStrip1.TabItemOpen+=new EventHandler(this.tabStrip1_TabItemOpen); this.tabStrip1.TabsCleared += new EventHandler(this.tabStrip1_TabsCleared); this.tabStrip1.BeforeTabDisplay+=new EventHandler(this.tabStrip1_BeforeTabDisplay); this.tabStrip1.TabStop=false; // // TabControl // this.Controls.AddRange(new System.Windows.Forms.Control[] { this.tabStrip1}); this.Name = "TabControl"; this.Size = new System.Drawing.Size(256, 152); this.ResumeLayout(false); } #endregion #region Hidden Properties /// /// Gets or sets the background color. /// [Browsable(true),Description("Indicates the background color."),Category("Style")] public override Color BackColor { get {return base.BackColor;} set { base.BackColor=value; if (tabStrip1 != null) tabStrip1.BackColor = value; } } /// /// Gets whether property should be serialized. Used by Windows Forms designer. /// [EditorBrowsable(EditorBrowsableState.Never)] public bool ShouldSerializeBackColor() { return (BackColor != SystemColors.Control); } #endregion #region Internal Implementation /// /// Called by StyleManager to notify control that style on manager has changed and that control should refresh its appearance if /// its style is controlled by StyleManager. /// /// New active style. [EditorBrowsable(EditorBrowsableState.Never)] public void StyleManagerStyleChanged(eDotNetBarStyle newStyle) { UpdateTabPanelStyle(); } protected override void OnGotFocus(EventArgs e) { if (this.TabStripTabStop) tabStrip1.Focus(); base.OnGotFocus(e); } #if FRAMEWORK20 [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public virtual bool ValidateChildren() { return this.ValidateChildren(ValidationConstraints.Selectable); } [Browsable(false)] public virtual bool ValidateChildren(ValidationConstraints validationConstraints) { if ((validationConstraints < ValidationConstraints.None) || (validationConstraints > (ValidationConstraints.ImmediateChildren | ValidationConstraints.TabStop | ValidationConstraints.Visible | ValidationConstraints.Enabled | ValidationConstraints.Selectable))) { throw new InvalidEnumArgumentException("validationConstraints", (int)validationConstraints, typeof(ValidationConstraints)); } Type t = typeof(Control); MethodInfo mi = t.GetMethod("PerformContainerValidation", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance); if (mi != null) { bool b = (bool)mi.Invoke(this, new object[] { validationConstraints }); return !b; } return true; } #endif /// /// Gets the collection of all tabs. /// [Browsable(false), System.ComponentModel.Editor("DevComponents.DotNetBar.Design.TabStripTabsEditor, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf", typeof(System.Drawing.Design.UITypeEditor)), DesignerSerializationVisibility(DesignerSerializationVisibility.Content), System.ComponentModel.Category("Data"), System.ComponentModel.Description("Returns the collection of Tabs.")] public TabsCollection Tabs { get { return tabStrip1.Tabs; } } /// /// Gets or sets whether tabs are visible. Default value is true. /// [DefaultValue(true), Category("Appearance"), Description("Indicates whether tabs are visible")] public bool TabsVisible { get { return m_TabStripVisible; } set { m_TabStripVisible = value; tabStrip1.Visible = value; RefreshPanelsStyle(); } } /// /// Returns reference to internal tab strip control. /// [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public TabStrip TabStrip { get { return tabStrip1; } } /// /// Gets or sets whether TabStrip will get focus when Tab key is used. Default value is false. /// [DefaultValue(false), Category("Behavior"), Description("Gets or sets whether TabStrip will get focus when Tab key is used.")] public bool TabStripTabStop { get { return tabStrip1.TabStop; } set { tabStrip1.TabStop = value; } } public void RecalcLayout() { tabStrip1.Refresh(); this.SyncTabStripSize(); } private void tabStrip1_SelectedTabChanged(object sender, DevComponents.DotNetBar.TabStripTabChangedEventArgs e) { if(e.NewTab!=null && e.NewTab.AttachedControl!=null) e.NewTab.AttachedControl.BringToFront(); InvokeSelectedTabChanged(e); } protected virtual void InvokeSelectedTabChanged(DevComponents.DotNetBar.TabStripTabChangedEventArgs e) { if(SelectedTabChanged!=null) SelectedTabChanged(this,e); } private void tabStrip1_SelectedTabChanging(object sender, DevComponents.DotNetBar.TabStripTabChangingEventArgs e) { InvokeSelectedTabChanging(e); } protected virtual void InvokeSelectedTabChanging(DevComponents.DotNetBar.TabStripTabChangingEventArgs e) { if(SelectedTabChanging!=null) SelectedTabChanging(this,e); } private void tabStrip1_TabMoved(object sender, TabStripTabMovedEventArgs e) { InvokeTabMoved(e); } protected virtual void InvokeTabMoved(TabStripTabMovedEventArgs e) { if(TabMoved!=null) TabMoved(this,e); } private void tabStrip1_NavigateBack(object sender, TabStripActionEventArgs e) { InvokeNavigateBack(e); } protected virtual void InvokeNavigateBack(TabStripActionEventArgs e) { if(NavigateBack!=null) NavigateBack(this,e); } private void tabStrip1_NavigateForward(object sender, TabStripActionEventArgs e) { InvokeNavigateForward(e); } protected virtual void InvokeNavigateForward(TabStripActionEventArgs e) { if(NavigateForward!=null) NavigateForward(this,e); } private void tabStrip1_TabItemClose(object sender, TabStripActionEventArgs e) { InvokeTabItemClose(e); if (!e.Cancel && m_AutoCloseTabs && !this.DesignMode) { TabItem tab = tabStrip1.SelectedTab; if (tab != null) { tabStrip1.Tabs.Remove(tab); Control c = tab.AttachedControl; if (c != null) { if (this.Controls.Contains(c)) this.Controls.Remove(c); c.Dispose(); } } this.RecalcLayout(); } } protected virtual void InvokeTabItemClose(TabStripActionEventArgs e) { if(TabItemClose!=null) TabItemClose(this,e); } private void tabStrip1_TabItemOpen(object sender, EventArgs e) { InvokeTabItemOpen(e); } protected virtual void InvokeTabItemOpen(EventArgs e) { if(TabItemOpen!=null) TabItemOpen(this,e); } private void tabStrip1_BeforeTabDisplay(object sender, EventArgs e) { InvokeBeforeTabDisplay(e); } protected virtual void InvokeBeforeTabDisplay(EventArgs e) { if(BeforeTabDisplay!=null) BeforeTabDisplay(this,e); } protected override void OnControlAdded(ControlEventArgs e) { base.OnControlAdded(e); if (this.DesignMode) return; TabControlPanel panel=e.Control as TabControlPanel; if(panel==null) return; if(panel.TabItem!=null) { if(this.Tabs.Contains(panel.TabItem) && this.SelectedTab==panel.TabItem) { panel.Visible=true; panel.BringToFront(); } else panel.Visible=false; } else panel.Visible=false; } protected override void OnControlRemoved(ControlEventArgs e) { base.OnControlRemoved(e); TabControlPanel panel=e.Control as TabControlPanel; if(panel==null) return; if(panel.TabItem!=null) { if(this.Tabs.Contains(panel.TabItem)) this.Tabs.Remove(panel.TabItem); } } // protected override void OnEnter(EventArgs e) // { // base.OnEnter(e); // if(this.Controls.Count>0) // { // foreach(Control c in this.Controls) // { // if(c.Visible && c.Controls.Count>0) // { // this.SelectNextControl(c,true,true,true,true); // } // } // } // } private void tabStrip1_TabRemoved(object sender, System.EventArgs e) { if(sender is TabItem) { TabItem tab=sender as TabItem; if(tab.AttachedControl!=null && this.Controls.Contains(tab.AttachedControl)) { this.Controls.Remove(tab.AttachedControl); } } InvokeTabRemoved(e); } void tabStrip1_TabItemAdded(object sender, EventArgs e) { TabItem item = sender as TabItem; if (!this.DesignMode && !m_Initializing && item!=null && item.AttachedControl!=null && !this.Controls.Contains(item.AttachedControl)) { this.Controls.Add(item.AttachedControl); } } protected virtual void InvokeTabRemoved(EventArgs e) { if(TabRemoved!=null) TabRemoved(this,e); } private void tabStrip1_TabsCleared(object sender, EventArgs e) { if (this.DesignMode) return; Control[] cs = new Control[this.Controls.Count]; this.Controls.CopyTo(cs, 0); foreach (Control c in cs) { if (c is TabControlPanel) { this.Controls.Remove(c); } } } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); if (this.BackColor == Color.Transparent || this.ColorScheme.TabBackground == Color.Transparent) { base.OnPaintBackground(e); } if(this.Controls.Count<=1) { using(SolidBrush brush=new SolidBrush(SystemColors.Control)) e.Graphics.FillRectangle(brush,this.DisplayRectangle); } } protected override void OnResize(EventArgs e) { base.OnResize(e); if (this.Width == 0 || this.Height == 0) return; if(tabStrip1.IsMultiLine) { CreateSyncSizeTimer(); } } private void CreateSyncSizeTimer() { if(m_ClickTimer!=null) return; m_ClickTimer=new Timer(); m_ClickTimer.Interval=10; m_ClickTimer.Tick+=new EventHandler(this.SyncSizeTimerTick); m_ClickTimer.Enabled=true; m_ClickTimer.Start(); } private void SyncSizeTimerTick(object sender, EventArgs e) { m_ClickTimer.Stop(); m_ClickTimer.Enabled=false; m_ClickTimer=null; try { this.PerformLayout(); } catch{} } /// /// Applies default tab colors to the panel /// /// Panel to apply colors to. public void ApplyDefaultPanelStyle(TabControlPanel panel) { if(panel==null || panel.UseCustomStyle) return; if(panel.TabItem!=null && !panel.TabItem.BackColor.IsEmpty) { if(!panel.TabItem.BackColor2.IsEmpty) { panel.Style.BackColor1.Color=panel.TabItem.BackColor; panel.Style.BackColor2.Color=panel.TabItem.BackColor2; switch(tabStrip1.TabAlignment) { case eTabStripAlignment.Top: panel.Style.GradientAngle=panel.TabItem.BackColorGradientAngle-180; break; case eTabStripAlignment.Bottom: panel.Style.GradientAngle=panel.TabItem.BackColorGradientAngle; break; case eTabStripAlignment.Left: panel.Style.GradientAngle=panel.TabItem.BackColorGradientAngle-90; break; case eTabStripAlignment.Right: panel.Style.GradientAngle=panel.TabItem.BackColorGradientAngle+90; break; } } } else { panel.Style.BackColor1.Color=tabStrip1.ColorScheme.TabPanelBackground; panel.Style.BackColor2.Color=tabStrip1.ColorScheme.TabPanelBackground2; switch(tabStrip1.TabAlignment) { case eTabStripAlignment.Top: { panel.Style.GradientAngle=tabStrip1.ColorScheme.TabPanelBackgroundGradientAngle; break; } case eTabStripAlignment.Bottom: { panel.Style.GradientAngle=tabStrip1.ColorScheme.TabPanelBackgroundGradientAngle-180; break; } case eTabStripAlignment.Left: { panel.Style.GradientAngle=tabStrip1.ColorScheme.TabPanelBackgroundGradientAngle-90; break; } case eTabStripAlignment.Right: { panel.Style.GradientAngle=tabStrip1.ColorScheme.TabPanelBackgroundGradientAngle+90; break; } } panel.Style.BorderColor.Color=tabStrip1.ColorScheme.TabPanelBorder; } panel.Style.Border=eBorderType.SingleLine; if (m_TabStripVisible) { switch (tabStrip1.TabAlignment) { case eTabStripAlignment.Top: panel.Style.BorderSide = (eBorderSide.Left | eBorderSide.Right | eBorderSide.Bottom); break; case eTabStripAlignment.Bottom: panel.Style.BorderSide = (eBorderSide.Left | eBorderSide.Right | eBorderSide.Top); break; case eTabStripAlignment.Left: panel.Style.BorderSide = (eBorderSide.Top | eBorderSide.Right | eBorderSide.Bottom); break; case eTabStripAlignment.Right: panel.Style.BorderSide = (eBorderSide.Left | eBorderSide.Top | eBorderSide.Bottom); break; } } else panel.Style.BorderSide = eBorderSide.All; if(tabStrip1.IsThemed) panel.DrawThemedPane=true; else panel.DrawThemedPane=false; } private void UpdateTabPanelStyle() { foreach (Control c in this.Controls) { if (c is TabControlPanel) { TabControlPanel panel = c as TabControlPanel; ApplyDefaultPanelStyle(panel); } } } protected override void OnSystemColorsChanged(EventArgs e) { base.OnSystemColorsChanged(e); Application.DoEvents(); UpdateTabPanelStyle(); } /// /// Resumes normal layout logic. Optionally forces an immediate layout of pending layout requests. /// public new void ResumeLayout(bool performLayout) { base.ResumeLayout(performLayout); if (!this.IsHandleCreated) { m_DelayedSync = true; } else { tabStrip1.ResetTabHeight(); SyncTabStripSize(); } } private bool m_DelayedSync = false; protected override void OnHandleCreated(EventArgs e) { if (m_DelayedSync || this.DesignMode) { m_DelayedSync = false; tabStrip1.ResetTabHeight(); SyncTabStripSize(); if (this.DesignMode) // There is bug in VS2010 designer where tab alignment is not updated we need to remedy that { InvokeDelayed(new MethodInvoker(delegate { this.PerformLayout(); })); } } base.OnHandleCreated(e); } private void RefreshPanelsStyle() { if (m_Initializing) return; foreach(Control c in this.Controls) { if(c is TabControlPanel) ApplyDefaultPanelStyle(c as TabControlPanel); } } /// /// Use TabControlPanel.Style property to set the background image for each tab panel. /// [System.ComponentModel.Browsable(false),System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] public override Image BackgroundImage { get{return base.BackgroundImage;} set{base.BackgroundImage=value;} } private void TabStripSizeRecalculated(object sender, EventArgs e) { //if (tabStrip1.IsMultiLine) SyncTabStripSize(); } /// /// Resizes the portion of the control that holds the tabs. /// public void SyncTabStripSize() { if (m_SyncingTabStripSize) return; m_SyncingTabStripSize = true; try { switch (tabStrip1.Dock) { case DockStyle.Left: case DockStyle.Right: tabStrip1.Width = tabStrip1.MinTabStripHeight; break; default: tabStrip1.Height = tabStrip1.MinTabStripHeight; break; } //this.PerformLayout(); tabStrip1.SendToBack(); } finally { m_SyncingTabStripSize = false; } //this.ResumeLayout(); } private void InvokeDelayed(MethodInvoker method) { Timer delayedInvokeTimer = new Timer(); delayedInvokeTimer = new Timer(); delayedInvokeTimer.Tag = method; delayedInvokeTimer.Interval = 10; delayedInvokeTimer.Tick += new EventHandler(DelayedInvokeTimerTick); delayedInvokeTimer.Start(); } void DelayedInvokeTimerTick(object sender, EventArgs e) { Timer timer = (Timer)sender; MethodInvoker method = (MethodInvoker)timer.Tag; timer.Stop(); timer.Dispose(); method.Invoke(); } /// /// Creates new tab and tab panel and adds it to the Tabs collection. /// /// Tab text. /// Reference to newly created TabItem. public TabItem CreateTab(string tabText) { return CreateTab(tabText, -1); } /// /// Creates new tab and tab panel and inserts it at specified position inside of Tabs collection. /// /// Tab text. /// Index to insert newly created tab at. -1 will append tab to the end of Tabs collection. /// Reference to newly created TabItem. public TabItem CreateTab(string tabText, int insertAt) { TabItem tab = new TabItem(); tab.Text = tabText; TabControlPanel panel = new TabControlPanel(); this.ApplyDefaultPanelStyle(panel); tab.AttachedControl = panel; panel.TabItem = tab; if (insertAt < 0 || insertAt >= tabStrip1.Tabs.Count) { tabStrip1.Tabs.Add(tab); this.Controls.Add(panel); } else { tabStrip1.Tabs.Insert(insertAt, tab); this.Controls.Add(panel); } panel.Dock = DockStyle.Fill; panel.SendToBack(); this.RecalcLayout(); return tab; } protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if (_ControlTabNavigationEnabled) { if (keyData == (Keys.Tab | Keys.Control)) { tabStrip1.SelectNextTab(eEventSource.Keyboard, true); return true; } else if (keyData == (Keys.Tab | Keys.Control | Keys.Shift)) { tabStrip1.SelectPreviousTab(eEventSource.Keyboard, true); return true; } } return base.ProcessCmdKey(ref msg, keyData); } private bool _ControlTabNavigationEnabled = true; /// /// Gets or sets whether pressing Ctrl+Tab keys will cycle through the selected tabs. Default value is true. /// [DefaultValue(true), Category("Behavior"), Description("Indicates whether pressing Ctrl+Tab keys will cycle through the selected tabs.")] public bool ControlTabNavigationEnabled { get { return _ControlTabNavigationEnabled; } set { _ControlTabNavigationEnabled = value; } } #endregion #region ISupportInitialize private bool m_Initializing=false; void ISupportInitialize.BeginInit() { m_Initializing = true; } void ISupportInitialize.EndInit() { m_Initializing = false; // Apply default panel style RefreshPanelsStyle(); if(m_LoadSelectedTabIndex>=0) tabStrip1.SelectedTabIndex = m_LoadSelectedTabIndex; m_LoadSelectedTabIndex = -1; if(tabStrip1.SelectedTab!=null && tabStrip1.SelectedTab.AttachedControl!=null) { //if(!this.DesignMode) tabStrip1.SelectedTab.AttachedControl.Visible=true; } } #endregion #region Properties /// /// Gets or sets whether tabs use anti-alias smoothing when painted. Default value is false. /// [DefaultValue(false), Browsable(true), Category("Appearance"), Description("Gets or sets whether tabs use anti-aliasing when painted.")] public bool AntiAlias { get { return tabStrip1.AntiAlias; } set { tabStrip1.AntiAlias = value; } } /// /// Gets or sets whether the tab scrolling is animated. /// [Browsable(true),DevCoBrowsable(true),Description("Indicates whether the tab scrolling is animanted."),Category("Behavior"),DefaultValue(true)] public bool Animate { get{return tabStrip1.Animate;} set {tabStrip1.Animate=value;} } /// /// Gets or sets whether system box that enables scrolling and closing of the tabs is automatically hidden when tab items size does not exceed the size of the control. /// [Browsable(true),DefaultValue(true),Category("Behavior"),Description("Indicates whether system box that enables scrolling and closing of the tabs is automatically hidden when tab items size does not exceed the size of the control.")] public bool AutoHideSystemBox { get {return tabStrip1.AutoHideSystemBox;} set { tabStrip1.AutoHideSystemBox=value; if(this.DesignMode) this.Refresh(); } } /// /// Specifes whether end-user can reorder the tabs. /// [System.ComponentModel.Browsable(true),DevCoBrowsable(true),System.ComponentModel.Category("Behavior"),System.ComponentModel.Description("Specifes whether end-user can reorder the tabs.")] public bool CanReorderTabs { get { return tabStrip1.CanReorderTabs; } set { tabStrip1.CanReorderTabs=value; } } /// /// Gets or sets whether tab is automatically closed when close button is clicked. Closing the tab will remove tab being closed from Tabs collection /// and it will remove the panel as well. Default value is false which means that tab will not be closed and you should handle TabClose event to /// perform desired action as result of user closing the tab. /// [Browsable(true), DefaultValue(false), Category("Close Button"), Description("Indicates whether tab is automatically closed when close button is clicked.")] public bool AutoCloseTabs { get { return m_AutoCloseTabs; } set { m_AutoCloseTabs = value; } } /// /// Gets or sets whether the Close button that closes the active tab is visible on system box. /// [Browsable(true), DevCoBrowsable(true), Category("Close Button"), Description("Indicates whether the Close button that closes the active tab is visible."), DefaultValue(false)] public bool CloseButtonVisible { get { return tabStrip1.CloseButtonVisible; } set { tabStrip1.CloseButtonVisible=value; } } /// /// Gets or sets whether close button is visible on each tab instead of in system box. /// [Browsable(true), DefaultValue(false), DevCoBrowsable(true), Category("Close Button"), Description("Indicates whether close button is visible on each tab instead of in system box.")] public bool CloseButtonOnTabsVisible { get { return tabStrip1.CloseButtonOnTabsVisible; } set { tabStrip1.CloseButtonOnTabsVisible = value; this.Refresh(); } } /// /// Gets or sets whether close button on tabs when visible is displayed for every tab state. Default value is true. When set to false /// the close button will be displayed only for selected and tab that mouse is currently over. /// [Browsable(true), DefaultValue(true), DevCoBrowsable(true), Category("Close Button"), Description("Indicates whether close button on tabs when visible is displayed for every tab state.")] public bool CloseButtonOnTabsAlwaysDisplayed { get { return tabStrip1.CloseButtonOnTabsAlwaysDisplayed; } set { tabStrip1.CloseButtonOnTabsAlwaysDisplayed = value; } } /// /// Gets or sets the position of the close button displayed on each tab. Default value is Left. /// [Browsable(true), DefaultValue(eTabCloseButtonPosition.Left), DevCoBrowsable(true), Category("Close Button"), Description("Indicates position of the close button displayed on each tab.")] public eTabCloseButtonPosition CloseButtonPosition { get { return tabStrip1.CloseButtonPosition; } set { tabStrip1.CloseButtonPosition = value; } } /// /// Gets or sets custom image that is used on tabs as Close button that allows user to close the tab. /// Use TabCloseButtonHot property to specify image that is used when mouse is over the close button. Note that image size must /// be same for both images. /// Default value is null /// which means that internal representation of close button is used. /// [Browsable(true), DefaultValue(null), Category("Close Button"), Description("Indicates custom image that is used on tabs as Close button that allows user to close the tab.")] public Image TabCloseButtonNormal { get { return tabStrip1.TabCloseButtonNormal; } set {tabStrip1.TabCloseButtonNormal = value; } } /// /// Gets or sets custom image that is used on tabs as Close button whem mouse is over the close button. /// To use this property you must set TabCloseButtonNormal as well. Note that image size for both images must be same. /// Default value is null which means that internal representation of close button is used. /// [Browsable(true), DefaultValue(null), Category("Close Button"), Description("Indicates custom image that is used on tabs as Close button whem mouse is over the close button.")] public Image TabCloseButtonHot { get { return tabStrip1.TabCloseButtonHot; } set {tabStrip1.TabCloseButtonHot = value;} } /// /// Gets or sets whether only selected tab is displaying it's text. /// [Browsable(true),DevCoBrowsable(true),Category("Behavior"),Description("Specifes whether only selected tab is displaying it's text."),DefaultValue(false)] public bool DisplaySelectedTextOnly { get {return tabStrip1.DisplaySelectedTextOnly;} set { tabStrip1.DisplaySelectedTextOnly=value; } } /// /// Gets or sets the image list used by tab items. /// [Browsable(true),DevCoBrowsable(true),Category("Appearance"),DefaultValue(null)] public System.Windows.Forms.ImageList ImageList { get { return tabStrip1.ImageList; } set { tabStrip1.ImageList=value; } } /// /// Gets or sets scrolling offset of the first tab. You can use this property to programmatically scroll the tab strip. /// [Browsable(false),DevCoBrowsable(false),DefaultValue(0),DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public int ScrollOffset { get {return tabStrip1.ScrollOffset;} set {tabStrip1.ScrollOffset=value;} } /// /// Selects previous visible tab. Returns true if previous tab was found for selection. /// public bool SelectPreviousTab() { return tabStrip1.SelectPreviousTab(); } /// /// Selects next visible tab. Returns true if next tab was found for selection. /// public bool SelectNextTab() { return tabStrip1.SelectNextTab(); } /// /// Gets or sets Tab Control style. Theme style is supported only on themed OS and only for bottom or top aligned tabs. /// [Browsable(true),DevCoBrowsable(true),Category("Appearance"),Description("Specifies the Tab Control style."),DefaultValue(eTabStripStyle.OneNote)] public eTabStripStyle Style { get { return tabStrip1.Style; } set { tabStrip1.Style=value; this.SyncTabStripSize(); this.RefreshPanelsStyle(); if(this.DesignMode) this.Refresh(); } } protected override void OnParentChanged(EventArgs e) { if (this.Style == eTabStripStyle.Office2007Dock || this.Style == eTabStripStyle.Office2007Document) { tabStrip1.Style = this.Style; this.RefreshPanelsStyle(); } base.OnParentChanged(e); } /// /// Specifies whether tab is drawn using Themes when running on OS that supports themes like Windows XP. /// [System.ComponentModel.Browsable(true),DevCoBrowsable(true),System.ComponentModel.DefaultValue(false),System.ComponentModel.Category("Appearance"),System.ComponentModel.Description("Specifies whether tab is drawn using Themes when running on OS that supports themes like Windows XP.")] public virtual bool ThemeAware { get { return tabStrip1.ThemeAware; } set { tabStrip1.ThemeAware=value; this.RefreshPanelsStyle(); if(this.DesignMode) this.Refresh(); } } /// /// Gets or sets whether tabs are scrolled continuously while mouse is pressed over the scroll tab button. /// [System.ComponentModel.Browsable(true),DevCoBrowsable(true),System.ComponentModel.DefaultValue(false),System.ComponentModel.Category("Behavior"),System.ComponentModel.Description("Indicates whether tabs are scrolled continuously while mouse is pressed over the scroll tab button.")] public virtual bool TabScrollAutoRepeat { get { return tabStrip1.TabScrollAutoRepeat; } set { tabStrip1.TabScrollAutoRepeat=value; } } /// /// Gets or sets the auto-repeat interval for the tab scrolling while mouse button is kept pressed over the scroll tab button. /// [System.ComponentModel.Browsable(true),DevCoBrowsable(true),System.ComponentModel.DefaultValue(300),System.ComponentModel.Category("Behavior"),System.ComponentModel.Description("Indicates auto-repeat interval for the tab scrolling while mouse button is kept pressed over the scroll tab button.")] public virtual int TabScrollRepeatInterval { get { return tabStrip1.TabScrollRepeatInterval; } set { tabStrip1.TabScrollRepeatInterval=value; } } /// /// Gets or sets Tab Color Scheme. /// [Browsable(true),DevCoBrowsable(true),Category("Style"),Description("Gets or sets Tab Color Scheme."),DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public TabColorScheme ColorScheme { get {return tabStrip1.ColorScheme;} set { tabStrip1.ColorScheme=value; if(this.DesignMode) this.Refresh(); } } [Browsable(false),EditorBrowsable(EditorBrowsableState.Never)] public bool ShouldSerializeColorScheme() { return tabStrip1.ColorScheme.SchemeChanged; } /// /// Resets color scheme to default value. /// public void ResetColorScheme() { tabStrip1.ResetColorScheme(); if(this.DesignMode) this.Refresh(); } /// /// Gets or sets the tab alignment within the Tab-Strip control. /// [DefaultValue(eTabStripAlignment.Top),Browsable(true),DevCoBrowsable(true),Category("Appearance"),Description("Indicates the tab alignment within the Tab-Strip control.")] public eTabStripAlignment TabAlignment { get {return tabStrip1.TabAlignment;} set { if(tabStrip1.TabAlignment==value) return; this.SuspendLayout(); try { switch(value) { case eTabStripAlignment.Top: tabStrip1.Dock=DockStyle.Top; break; case eTabStripAlignment.Bottom: tabStrip1.Dock=DockStyle.Bottom; break; case eTabStripAlignment.Left: tabStrip1.Dock=DockStyle.Left; break; case eTabStripAlignment.Right: tabStrip1.Dock=DockStyle.Right; break; } tabStrip1.TabAlignment=value; RefreshPanelsStyle(); } finally { this.ResumeLayout(true); } if (this.Visible) SyncTabStripSize(); } } /// /// Gets or sets the selected tab. /// [Browsable(false),DevCoBrowsable(false),Category("Behavior"),Description("Indicates selected tab."),DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public TabItem SelectedTab { get { return tabStrip1.SelectedTab; } set { tabStrip1.SelectedTab=value; } } /// /// Gets or sets the selected tab Font /// [Browsable(true),DevCoBrowsable(true),Category("Style"),DefaultValue(null),Description("Gets or sets the selected tab Font")] public System.Drawing.Font SelectedTabFont { get { return tabStrip1.SelectedTabFont; } set { tabStrip1.SelectedTabFont=value; } } [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] public void ResetSelectedTabFont() { tabStrip1.ResetSelectedTabFont(); } /// /// Gets or sets whether focus rectangle is displayed on the tab when tab has input focus. /// [Browsable(true),DefaultValue(true),Category("Behavior"),Description("Indicates whether focus rectangle is displayed on the tab when tab has input focus.")] public bool ShowFocusRectangle { get {return tabStrip1.ShowFocusRectangle;} set {tabStrip1.ShowFocusRectangle=value;} } /// /// Gets or sets whether keyboard navigation using Left and Right arrow keys to select tabs is enabled. Default value is true. /// [Category("Behavior"), DefaultValue(true), Description("Indicates whether keyboard navigation using Left and Right arrow keys to select tabs is enabled.")] public bool KeyboardNavigationEnabled { get { return tabStrip1.KeyboardNavigationEnabled; } set { tabStrip1.KeyboardNavigationEnabled = value; } } /// /// Gets or sets the index of the selected tab. /// [Browsable(true),DevCoBrowsable(true),Category("Behavior"),Description("Indicates the index of selected tab.")] public int SelectedTabIndex { get { return tabStrip1.SelectedTabIndex; } set { if (m_Initializing) m_LoadSelectedTabIndex = value; else tabStrip1.SelectedTabIndex = value; } } /// /// Gets or sets selected tab panel. /// [Browsable(false),DevCoBrowsable(false),DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public TabControlPanel SelectedPanel { get { if(tabStrip1.SelectedTab!=null) return tabStrip1.SelectedTab.AttachedControl as TabControlPanel; return null; } set { if(value!=null && this.Controls.Contains(value) && value.TabItem!=null && this.Tabs.Contains(value.TabItem)) { tabStrip1.SelectedTab=value.TabItem; } } } /// /// Gets or sets the type of the tab layout. /// [Browsable(true),DefaultValue(eTabLayoutType.FitContainer),Category("Appearance"),Description("Indicates the type of the tab layout.")] public eTabLayoutType TabLayoutType { get {return tabStrip1.TabLayoutType;} set {tabStrip1.TabLayoutType=value;} } /// /// Indicates whether selected tab is aligned with the panel in multiple lines use case. /// [Browsable(true), Category("Appearance"), DefaultValue(true), Description("Indicates whether selected tab is aligned with the panel in multiple lines use case.")] public bool MultiLinePanelAlignSelectedTab { get { return tabStrip1.MultiLinePanelAlignSelectedTab; } set { tabStrip1.MultiLinePanelAlignSelectedTab = value; } } /// /// Gets or sets the fixed tab size in pixels. Either Height or Width can be set or both. /// Value of 0 indicates that size is automatically calculated which is /// default behavior. /// [Browsable(true), Category("Appearance"), Description("Gets or sets the fixed tab size in pixels. Either Height or Width can be set or both.")] public Size FixedTabSize { get { return tabStrip1.FixedTabSize; } set { tabStrip1.FixedTabSize = value; this.RecalcLayout(); } } /// /// Memeber used by Windows Forms designer. /// /// true if property should be serialized. [EditorBrowsable(EditorBrowsableState.Never)] public bool ShouldSerializeFixedTabSize() { return tabStrip1.ShouldSerializeFixedTabSize(); } /// /// Memeber used by Windows Forms designer to reset property to default value. /// [EditorBrowsable(EditorBrowsableState.Never)] public void ResetFixedTabSize() { TypeDescriptor.GetProperties(this)["FixedTabSize"].SetValue(this, Size.Empty); } #endregion } }