using System; using System.Collections; using System.ComponentModel; using System.Drawing; using System.Data; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Windows.Forms; namespace DevComponents.DotNetBar { #region Event Delegates /// /// Delegate for OptionGroupChanging event. /// public delegate void PanelChangingEventHandler(object sender, PanelChangingEventArgs e); /// /// Delegate for PanelPopup events. /// public delegate void PanelPopupEventHandler(object sender, PanelPopupEventArgs e); #endregion /// /// Represents Outlook 2003 style navigation pane control. /// [ToolboxItem(true), Designer("DevComponents.DotNetBar.Design.NavigationPaneDesigner, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf")] public class NavigationPane : System.Windows.Forms.UserControl { private DevComponents.DotNetBar.PanelExTitle panelTitle; private DevComponents.DotNetBar.NavigationBar navBar; /// /// Required designer variable. /// private System.ComponentModel.Container components = null; private int m_NavigationBarHeight=0; private bool m_CanCollapse = false; private bool m_Expanded = true; private bool m_ExpandedDelayed = true; private Image m_DefaultCollapseImage = null; private Image m_DefaultExpandImage = null; private Image m_DefaultCollapseImageMouseOver = null; private Image m_DefaultExpandImageMouseOver = null; private Image m_TitleImageCollapse = null; private Image m_TitleImageExpand = null; private Image m_TitleImageCollapseMouseOver = null; private Image m_TitleImageExpandMouseOver = null; private int m_ExpandedSize = 0; private int m_CollapsedSize = 0; private PanelEx m_PanePopupPanel = null; private int m_AnimationTime = 100; private bool m_PopupPaneVisible = false; private PanelEx m_PopupPanelContainer = null; private bool m_LayoutSuspended = false; #region Events /// /// Occurs when Item is clicked. /// [System.ComponentModel.Description("Occurs when Item is clicked."),Category("Navigation Pane Events")] public event EventHandler ItemClick; /// /// Occurs when currently selected panel is about to change. /// [System.ComponentModel.Description("Occurs when Item is clicked."),Category("Navigation Pane Events")] public event PanelChangingEventHandler PanelChanging; /// /// Occurs when control is looking for translated text for one of the internal text that are /// displayed on menus, toolbars and customize forms. You need to set Handled=true if you want /// your custom text to be used instead of the built-in system value. /// public event DotNetBarManager.LocalizeStringEventHandler LocalizeString; /// /// Occurs before panel is displayed on popup when control is collapsed. You can use this event to modify default /// size of the popup panel or cancel the popup of the panel. /// public event PanelPopupEventHandler BeforePanelPopup; /// /// Occurs after panel is displayed on popup. /// public event EventHandler AfterPanelPopup; /// /// Occurs after panel displayed on popup is closed. /// public event EventHandler PanelPopupClosed; /// /// Occurs before Expanded property is changed. You can cancel change of this property by setting Cancel=true on the event arguments. /// public event ExpandChangeEventHandler ExpandedChanging; /// /// Occurs after Expanded property has changed. You can handle ExpandedChanging event and have opportunity to cancel the change. /// public event ExpandChangeEventHandler ExpandedChanged; /// /// Occurs after Options dialog which is used to customize control's content has closed by user using OK button. /// public event EventHandler OptionsDialogClosed; #endregion public NavigationPane() { // This call is required by the Windows.Forms Form Designer. InitializeComponent(); this.SetStyle(ControlStyles.Opaque,true); this.SetStyle(DisplayHelp.DoubleBufferFlag,true); this.SetStyle(ControlStyles.AllPaintingInWmPaint,true); navBar.ItemAdded+=new EventHandler(NavBarItemAdded); navBar.ItemRemoved+=new BarBaseControl.ItemRemovedEventHandler(NavBarItemRemoved); navBar.ApplicationMouseDown += new HandlerMessageEventHandler(ApplicationMouseDown); navBar.LocalizeString += new DotNetBarManager.LocalizeStringEventHandler(navBar_LocalizeString); navBar.OptionsDialogClosed += new EventHandler(NavBarOptionsDialogClosed); navBar.SplitterVisible=true; m_NavigationBarHeight=navBar.Height; panelTitle.ExpandedClick += new EventHandler(panelEx1_ExpandedClick); panelTitle.ExpandChangeButton.ImagePaddingHorizontal = 2; panelTitle.ExpandChangeButton.ImagePaddingVertical = 2; StyleManager.Register(this); } void NavBarOptionsDialogClosed(object sender, EventArgs e) { OnOptionsDialogClosed(e); } void navBar_LocalizeString(object sender, LocalizeEventArgs e) { if (LocalizeString != null) LocalizeString(this, e); } protected virtual void OnOptionsDialogClosed(EventArgs e) { EventHandler handler = OptionsDialogClosed; if (handler != null) handler(this, e); } /// /// Clean up any resources being used. /// protected override void Dispose( bool disposing ) { if( disposing ) { if (m_DefaultCollapseImage != null) m_DefaultCollapseImage.Dispose(); if (m_DefaultExpandImage != null) m_DefaultExpandImage.Dispose(); if(components != null) { components.Dispose(); } } StyleManager.Unregister(this); base.Dispose( disposing ); } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); if (navBar.ItemsContainer.EffectiveStyle == eDotNetBarStyle.Office2010) { Rendering.BaseRenderer renderer = navBar.GetRenderer(); if(renderer!=null) renderer.DrawNavPaneButtonBackground(new NavPaneRenderEventArgs(e.Graphics, this.ClientRectangle)); } else { using (SolidBrush brush = new SolidBrush(this.NavigationBar.GetColorScheme().BarBackground)) e.Graphics.FillRectangle(brush, this.ClientRectangle); using (Pen pen = new Pen(this.NavigationBar.GetColorScheme().PanelBorder, 1)) e.Graphics.DrawRectangle(pen, new Rectangle(0, 0, this.Width - 1, this.Height - 1)); } } [EditorBrowsable(EditorBrowsableState.Never)] public void SetDesignMode() { navBar.SetDesignMode(this.DesignMode); } /// /// Returns the width of the expanded control if control is currently collapsed. /// [Browsable(false)] public int ExpandedSize { get { return m_ExpandedSize; } } /// /// Returns collection containing buttons on navigation bar. /// [DesignerSerializationVisibility(DesignerSerializationVisibility.Content), Browsable(false)] public SubItemsCollection Items { get { return navBar.Items; } } /// /// Applies any layout changes and repaint the control. /// public virtual void RecalcLayout() { navBar.RecalcLayout(); } private void NavBarItemAdded(object sender, EventArgs e) { ButtonItem item=sender as ButtonItem; if (item != null && !item.IsOnCustomizeMenu) { item.CheckedChanged += new EventHandler(ItemCheckedChanged); item.TextChanged += new EventHandler(ItemTextChanged); item.VisibleChanged += new EventHandler(ItemVisibleChanged); if (item.Checked) { item.SetChecked(false); item.Checked = true; } } } void ItemVisibleChanged(object sender, EventArgs e) { ButtonItem item = sender as ButtonItem; if (item == null || item.IsOnCustomizeMenu) return; if (item.Checked && !item.Visible) { foreach (BaseItem childItem in this.Items) { ButtonItem button = childItem as ButtonItem; if (button == null || !button.Visible) continue; button.Checked = true; break; } } } private void NavBarItemRemoved(object sender, ItemRemovedEventArgs e) { ButtonItem item=sender as ButtonItem; if(item!=null) { try { item.CheckedChanged-=new EventHandler(ItemCheckedChanged); item.TextChanged -= new EventHandler(ItemTextChanged); item.VisibleChanged -= new EventHandler(ItemVisibleChanged); } catch{} } } private void ItemCheckedChanged(object sender, EventArgs e) { ButtonItem item=sender as ButtonItem; if(item==null || item.IsOnCustomizeMenu) return; foreach(Control c in this.Controls) { if(c is NavigationPanePanel) { NavigationPanePanel panel=c as NavigationPanePanel; if(panel.ParentItem==item) { if(item.Checked) { if (m_Expanded) { if (!this.DesignMode) panel.Visible = true; panel.BringToFront(); } panelTitle.Text=item.Text; if (m_PanePopupPanel != null) m_PanePopupPanel.Text = panelTitle.Text; } else { if (m_Expanded) { if (!this.DesignMode) panel.Visible = false; else panel.SendToBack(); } } break; } } } } private void ItemTextChanged(object sender, EventArgs e) { ButtonItem item=sender as ButtonItem; if(item==null) return; if (item.Checked) { panelTitle.Text = item.Text; if (m_PanePopupPanel != null) m_PanePopupPanel.Text = item.Text; } } protected override void OnControlAdded(ControlEventArgs e) { base.OnControlAdded(e); if(this.DesignMode) return; NavigationPanePanel panel=e.Control as NavigationPanePanel; if(panel==null) return; if(panel.ParentItem!=null && m_Expanded) { if(this.Items.Contains(panel.ParentItem) && panel.ParentItem is ButtonItem) { panel.Visible=((ButtonItem)panel.ParentItem).Checked; if(panel.Visible) panel.BringToFront(); } else panel.Visible=false; } else panel.Visible=false; } protected override void OnSystemColorsChanged(EventArgs e) { base.OnSystemColorsChanged(e); Application.DoEvents(); if (m_CanCollapse) { UpdateExpandCollapseImages(); UpdateExpandButton(); } } /// /// Returns Panel associated with button on navigation bar or null if panel cannot be found. /// /// Button on navigation bar. /// public NavigationPanePanel GetPanel(ButtonItem item) { if(item==null) return null; foreach(Control c in this.Controls) { NavigationPanePanel panel=c as NavigationPanePanel; if(panel!=null) { if(panel.ParentItem==item) return panel; } } return null; } /// /// Gets or sets the height of the navigation bar part of the navigation pane control. /// Navigation Bar height is automatically calculated based on the content. /// Setting this property suggests desired height of the navigation bar but the actual height will be /// calculated to ensure that complete buttons are visible so suggested and actual height might differ. /// [Browsable(true),DevCoBrowsable(true),Category("Layout"),DefaultValue(32)] public int NavigationBarHeight { get { if (!this.DesignMode && navBar != null && navBar.Items.Count > 0) return navBar.Height; return m_NavigationBarHeight; } set { m_NavigationBarHeight=value; navBar.Height=m_NavigationBarHeight; } } private void OnNavBarResize(object sender, EventArgs e) { if(this.DesignMode) m_NavigationBarHeight=navBar.Height; } protected override void OnLayout(LayoutEventArgs e) { base.OnLayout(e); UpdatePanePopupPanelSize(); } /// /// Suspends normal layout logic. /// public new void SuspendLayout() { m_LayoutSuspended = true; base.SuspendLayout(); } /// /// Resumes normal layout logic. Optionally forces an immediate layout of pending layout requests. /// public new void ResumeLayout(bool performLayout) { m_LayoutSuspended = false; navBar.Height=m_NavigationBarHeight; navBar.SendToBack(); base.ResumeLayout(true); this.Expanded = m_ExpandedDelayed; } /// /// Returns reference to internal NavigationBar control. /// [Browsable(false),DevCoBrowsable(false)] public NavigationBar NavigationBar { get { return navBar; } } /// /// Gets or sets size of the image that will be use to resize images to when button button is on the bottom summary line of navigation bar and AutoSizeButtonImage=true. /// [Browsable(true),DevCoBrowsable(true),Category("Appearance"),Description("Indicates size of the image that will be use to resize images to when button button is on the bottom summary line of navigation bar and AutoSizeButtonImage=true.")] public Size ImageSizeSummaryLine { get {return navBar.ImageSizeSummaryLine;} set {navBar.ImageSizeSummaryLine=value;} } [EditorBrowsable(EditorBrowsableState.Never)] public bool ShouldSerializeImageSizeSummaryLine() { return navBar.ShouldSerializeImageSizeSummaryLine(); } /// /// Gets or sets whether Configure Buttons button is visible. /// [Browsable(true),DevCoBrowsable(true),Category("Behavior"),Description("Indicates Configure Buttons button is visible."),DefaultValue(true)] public bool ConfigureItemVisible { get {return navBar.ConfigureItemVisible;} set {navBar.ConfigureItemVisible=value;} } /// /// Gets or sets whether Show More Buttons and Show Fewer Buttons menu items are visible on Configure buttons menu. /// [Browsable(true),DevCoBrowsable(true),Category("Behavior"),Description("Indicates whether Show More Buttons and Show Fewer Buttons menu items are visible on Configure buttons menu."),System.ComponentModel.DefaultValue(true)] public bool ConfigureShowHideVisible { get {return navBar.ConfigureShowHideVisible;} set {navBar.ConfigureShowHideVisible=value;} } /// /// Gets or sets whether Navigation Pane Options menu item is visible on Configure buttons menu. /// [Browsable(true),DevCoBrowsable(true),Category("Behavior"),Description("Gets or sets whether Navigation Pane Options menu item is visible on Configure buttons menu."),System.ComponentModel.DefaultValue(true)] public bool ConfigureNavOptionsVisible { get {return navBar.ConfigureNavOptionsVisible;} set {navBar.ConfigureNavOptionsVisible=value;} } /// /// Gets or sets whether Navigation Pane Add/Remove Buttons menu item is visible on Configure buttons menu. /// [Browsable(true),DevCoBrowsable(true),Category("Behavior"),Description("Indicates whether Navigation Pane Add/Remove Buttons menu item is visible on Configure buttons menu."),System.ComponentModel.DefaultValue(true)] public bool ConfigureAddRemoveVisible { get {return navBar.ConfigureAddRemoveVisible;} set {navBar.ConfigureAddRemoveVisible=value;} } /// /// Returns reference to currently checked button. /// public ButtonItem CheckedButton { get {return navBar.CheckedButton;} } /// /// Returns reference to currently selected panel. Panels are automatically switched when buttons are checked. /// public NavigationPanePanel SelectedPanel { get {return this.GetPanel(this.CheckedButton);} } /// /// Increases the size of the navigation bar if possible by showing more buttons on the top. /// public void ShowMoreButtons() { navBar.ShowMoreButtons(); } /// /// Reduces the size of the navigation bar if possible by showing fewer buttons on the top. /// public void ShowFewerButtons() { navBar.ShowFewerButtons(); } /// /// ImageList for images used on Items. /// [System.ComponentModel.Browsable(true),System.ComponentModel.Category("Data"),DefaultValue(null),System.ComponentModel.Description("ImageList for images used on Items.")] public System.Windows.Forms.ImageList Images { get { return navBar.Images; } set { navBar.Images=value; } } /// /// Returns reference to the PanelEx that is used to display title. /// [Browsable(true),DevCoBrowsable(true),DesignerSerializationVisibility(DesignerSerializationVisibility.Content),Category("Appearance"),Description("PanelEx control that is used to display title.")] public PanelEx TitlePanel { get {return panelTitle;} } /// /// Gets or sets the padding in pixels at the top portion of the item. Height of each item will be increased by padding amount. /// [Browsable(true),DevCoBrowsable(true),Category("Layout"),Description("Indicates the padding in pixels at the top portion of the item."),DefaultValue(4)] public int ItemPaddingTop { get {return navBar.ItemPaddingTop;} set { navBar.ItemPaddingTop=value; if(this.DesignMode) this.RecalcLayout(); } } /// /// Gets or sets the padding in pixels for bottom portion of the item. Height of each item will be increased by padding amount. /// [Browsable(true),DevCoBrowsable(true),Category("Layout"),Description("Indicates the padding in pixels at the bottom of the item."),DefaultValue(4)] public int ItemPaddingBottom { get {return navBar.ItemPaddingBottom;} set { navBar.ItemPaddingBottom=value; if(this.DesignMode) this.RecalcLayout(); } } /// /// Gets or sets whether images are automatically resized to size specified in ImageSizeSummaryLine when button is on the bottom summary line of navigation bar. /// [Browsable(true),DevCoBrowsable(true),Category("Appearance"),Description("Indicates whether images are automatically resized to size specified in ImageSizeSummaryLine when button is on the bottom summary line of navigation bar."),DefaultValue(true)] public bool AutoSizeButtonImage { get {return navBar.AutoSizeButtonImage;} set {navBar.AutoSizeButtonImage=value;} } /// /// Saves current visual layout of navigation bar control to XML based file. /// /// File name to save layout to. public void SaveLayout(string fileName) { navBar.SaveLayout(fileName); } /// /// Saves current visual layout of navigation bar control to XmlElement. /// /// XmlElement object that will act as a parent for the layout definition. Exact same element should be passed into the LoadLayout method to load the layout. public void SaveLayout(System.Xml.XmlElement xmlParent) { navBar.SaveLayout(xmlParent); } /// /// Gets or sets the navigation bar definition string. /// [Browsable(false),DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public string LayoutDefinition { get { return navBar.LayoutDefinition; } set { navBar.LayoutDefinition=value; } } /// /// Gets or sets whether anti-alias smoothing is used while painting. Default value is false. /// [DefaultValue(false), Browsable(true), Category("Appearance"), Description("Gets or sets whether anti-aliasing is used while painting.")] public bool AntiAlias { get { return navBar.AntiAlias; } set { navBar.AntiAlias = value; if (panelTitle != null) panelTitle.AntiAlias = value; if (m_PanePopupPanel != null) m_PanePopupPanel.AntiAlias = value; if (m_PopupPanelContainer != null) m_PopupPanelContainer.AntiAlias = value; } } /// /// Gets or sets animation time in milliseconds when control is expanded or collapsed. Default value is 100 miliseconds. You can set this to 0 (zero) to disable animation. /// [Browsable(true), DefaultValue(100), Category("Expand"), Description("Indicates animation time in milliseconds when control is expanded or collapsed.")] public int AnimationTime { get { return m_AnimationTime; } set { if (m_AnimationTime >= 0) m_AnimationTime = value; } } /// /// Gets or sets whether navigation pane can be collapsed. Default value is false. When set to true /// expand/collapse button will be displayed in title so control can be reduced in size. /// [Browsable(true), Category("Title"), DefaultValue(false), Description("Indicates whether navigation pane can be collapsed.")] public bool CanCollapse { get { return m_CanCollapse; } set { m_CanCollapse = value; OnCanCollapseChanged(); panelTitle.ExpandButtonVisible = m_CanCollapse; } } /// /// Gets or sets alignment of the expand button inside of title bar. /// [Browsable(true), DefaultValue(eTitleButtonAlignment.Right), Category("Title"), Description("Indicates the alignment of expand button inside title bar.")] public eTitleButtonAlignment TitleButtonAlignment { get { return panelTitle.ButtonAlignment; } set { panelTitle.ButtonAlignment = value; UpdateExpandButton(); } } /// /// Gets or sets whether navigation pane is expanded. Default value is true. /// When control is collapsed it is reduced in size so it consumes less space. /// [Browsable(true), Category("Title"), DefaultValue(true), Description("Indicates whether navigation pane can be collapsed.")] public bool Expanded { get { return m_Expanded; } set { if (m_LayoutSuspended) { m_ExpandedDelayed = value; return; } if (m_Expanded != value) { SetExpanded(value, eEventSource.Code); } } } private void SetExpanded(bool expanded, eEventSource source) { if(ExpandedChanging!=null) { ExpandedChangeEventArgs args=new ExpandedChangeEventArgs(source, expanded); ExpandedChanging(this,args); if(args.Cancel) return; } m_Expanded = expanded; OnExpandedChanged(); if(ExpandedChanged!=null) { ExpandedChangeEventArgs args=new ExpandedChangeEventArgs(source, expanded); ExpandedChanged(this,args); } } private void OnExpandedChanged() { if (m_Expanded) { foreach (BaseItem item in navBar.Items) item.RenderText = true; panelTitle.DrawText = true; this.PopupSelectedPaneVisible = false; DestroyPanePopup(); if (this.AnimationTime == 0 || this.DesignMode) TypeDescriptor.GetProperties(this)["Width"].SetValue(this, m_ExpandedSize); else { Rectangle targetRect = new Rectangle(this.Location, new Size(m_ExpandedSize, this.Height)); if (this.Dock == DockStyle.Right) targetRect.Offset(-m_ExpandedSize, 0); BarFunctions.AnimateControl(this, true, m_AnimationTime, this.Bounds, targetRect); } } else { panelTitle.DrawText = false; m_ExpandedSize = this.Width; if (this.AnimationTime == 0 || this.DesignMode) TypeDescriptor.GetProperties(this)["Width"].SetValue(this, GetCollapsedSize()); else { Rectangle targetRect = new Rectangle(this.Location, new Size(GetCollapsedSize(), this.Height)); if (this.Dock == DockStyle.Right) targetRect.Offset(this.Width - targetRect.Width, 0); BarFunctions.AnimateControl(this, true, m_AnimationTime, this.Bounds, targetRect); } SetupPanePopup(); foreach (BaseItem item in navBar.Items) item.RenderText = false; navBar.Invalidate(); } this.UpdateExpandButton(); } private int GetCollapsedSize() { int defaultCollapsedSize = Math.Max(panelTitle.Font.Height + 10, 34); if (m_CollapsedSize > 0) return m_CollapsedSize; ButtonItem item = navBar.ItemsContainer.GetFirstVisibleItem() as ButtonItem; if (item == null) return defaultCollapsedSize; if (item.ImageSize.IsEmpty) return defaultCollapsedSize; CompositeImage image = item.GetImage(ImageState.Default, Color.Black); if (image != null) return Math.Max(defaultCollapsedSize, image.RealWidth + 10); return defaultCollapsedSize; } void panelEx1_ExpandedClick(object sender, EventArgs e) { SetExpanded(!this.Expanded,eEventSource.Mouse); } private void ApplicationMouseDown(object sender, HandlerMessageEventArgs e) { if (this.PopupSelectedPaneVisible) { string s = NativeFunctions.GetClassName(e.hWnd); s = s.ToLower(); if (s.IndexOf("combolbox") >= 0) return; Control c = Control.FromChildHandle(e.hWnd); while (c != null) { if (c == m_PopupPanelContainer || c == m_PanePopupPanel) return; c=c.Parent; } this.PopupSelectedPaneVisible = false; } } /// /// Gets the reference to the inner panel displaying Navigation Pane vertical text created when control is collapsed. /// [Browsable(false)] public PanelEx CollapsedInnerPanel { get { return m_PanePopupPanel; } } private void SetupPanePopup() { m_PanePopupPanel = new PanelEx(); m_PanePopupPanel.ColorSchemeStyle = navBar.Style; m_PanePopupPanel.ColorScheme = navBar.GetColorScheme(); m_PanePopupPanel.ApplyButtonStyle(); m_PanePopupPanel.Style.VerticalText = true; m_PanePopupPanel.Style.ForeColor.ColorSchemePart = eColorSchemePart.PanelText; m_PanePopupPanel.Style.BackColor1.ColorSchemePart = eColorSchemePart.PanelBackground; m_PanePopupPanel.Style.ResetBackColor2(); m_PanePopupPanel.StyleMouseOver.VerticalText = true; m_PanePopupPanel.StyleMouseDown.VerticalText = true; m_PanePopupPanel.Font = panelTitle.Font; m_PanePopupPanel.AntiAlias = this.AntiAlias; UpdatePanePopupPanelSize(); if(this.CheckedButton!=null) m_PanePopupPanel.Text = this.CheckedButton.Text; else m_PanePopupPanel.Text = "Navigation Pane"; foreach (Control c in this.Controls) { if (c is NavigationPanePanel) c.Visible = false; } this.Controls.Add(m_PanePopupPanel); m_PanePopupPanel.Click += new EventHandler(PanePopupPanelClick); } void PanePopupPanelClick(object sender, EventArgs e) { this.PopupSelectedPaneVisible = !this.PopupSelectedPaneVisible; } /// /// Popup selected pane when control is collapsed. When control is collapsed (Expanded=false) currently selected pane is not visible /// calling this method will popup selected pane and allow user access to it. Use PopupPaneVisible property /// to check whether currently selected pane is displayed as popup. /// private void PopupSelectedPane() { if (m_PopupPaneVisible) return; Control selectedNavPane = null; foreach (Control c in this.Controls) { if (c is NavigationPanePanel && ((NavigationPanePanel)c).ParentItem == this.CheckedButton) { selectedNavPane = c; break; } } if (selectedNavPane == null) return; // Animation start and end rectangles int h = navBar.Top - panelTitle.Bottom; Rectangle targetRect = new Rectangle(this.Width, panelTitle.Bottom, m_ExpandedSize, h); Rectangle startRect = new Rectangle(this.Width, panelTitle.Bottom, 16, h); if(BeforePanelPopup!=null) { PanelPopupEventArgs args=new PanelPopupEventArgs(targetRect); BeforePanelPopup(this, args); if(args.Cancel) return; targetRect=args.PopupBounds; } Control parentForm = this.FindForm(); if (parentForm == null) parentForm = this.TopLevelControl; if (parentForm == null) parentForm = this.Parent; m_PopupPanelContainer = new PanelEx(); m_PopupPanelContainer.Visible = false; m_PopupPanelContainer.ApplyLabelStyle(); m_PopupPanelContainer.AntiAlias = this.AntiAlias; //m_PopupPanelContainer.Style.BorderSide = eBorderSide.All; //m_PopupPanelContainer.Style.Border = eBorderType.SingleLine; //m_PopupPanelContainer.Style.BorderWidth = 1; //m_PopupPanelContainer.Style.BorderColor.Color = panelTitle.Style.BorderColor.Color; //m_PopupPanelContainer.DockPadding.All = 1; parentForm.Controls.Add(m_PopupPanelContainer); m_PopupPanelContainer.BringToFront(); this.Controls.Remove(selectedNavPane); if (selectedNavPane is NavigationPanePanel) { NavigationPanePanel panel = ((NavigationPanePanel)selectedNavPane); panel.DockPadding.Bottom = 1; if (panel.Style.Border == eBorderType.None) { m_PopupPanelContainer.Style.BorderSide = eBorderSide.All; m_PopupPanelContainer.Style.Border = eBorderType.SingleLine; m_PopupPanelContainer.Style.BorderWidth = 1; m_PopupPanelContainer.Style.BorderColor.Color = panelTitle.Style.BorderColor.Color; m_PopupPanelContainer.DockPadding.All = 1; } } m_PopupPanelContainer.Controls.Add(selectedNavPane); selectedNavPane.Visible = true; if (this.Dock == DockStyle.Right) { targetRect.Offset(-(this.Width + targetRect.Width), 0); startRect.Offset(-(this.Width + startRect.Width), 0); } Point p = this.PointToScreen(targetRect.Location); targetRect.Location = parentForm.PointToClient(p); p = this.PointToScreen(startRect.Location); startRect.Location = parentForm.PointToClient(p); if (AnimationTime == 0) { m_PopupPanelContainer.Bounds = targetRect; m_PopupPanelContainer.Visible = true; } else BarFunctions.AnimateControl(m_PopupPanelContainer, true, AnimationTime, startRect, targetRect); m_PopupPanelContainer.Focus(); m_PopupPanelContainer.Leave += new EventHandler(m_PopupPanelContainer_Leave); m_PopupPaneVisible = true; if (AfterPanelPopup != null) AfterPanelPopup(this, new EventArgs()); } void m_PopupPanelContainer_Leave(object sender, EventArgs e) { if (PopupSelectedPaneVisible) PopupSelectedPaneVisible = false; } private bool m_Hiding=false; /// /// Hides popup selected pane when control is collapsed and selected pane is displayed as popup. When control is collapsed (Expanded=false) /// currently selected pane can be displayed as popup. Calling this method will hide the popup pane. Use PopupPaneVisible property /// to check whether currently selected pane is displayed as popup. /// private void HideSelectedPopupPane() { if (!m_PopupPaneVisible || m_Hiding) return; m_Hiding=true; try { if (AnimationTime == 0) m_PopupPanelContainer.Hide(); else { Rectangle targetRect = new Rectangle(this.Width, this.Top, 16, this.Height); if (this.Dock == DockStyle.Right) targetRect.Offset(-(this.Width + targetRect.Width), 0); Point p = this.PointToScreen(targetRect.Location); targetRect.Location = m_PopupPanelContainer.Parent.PointToClient(p); BarFunctions.AnimateControl(m_PopupPanelContainer, false, AnimationTime, m_PopupPanelContainer.Bounds, targetRect); } Control navPanel=null; foreach(Control c in m_PopupPanelContainer.Controls) { if(c is NavigationPanePanel) { c.Visible=false; m_PopupPanelContainer.Controls.Remove(c); navPanel=c; break; } } if(navPanel is NavigationPanePanel) ((NavigationPanePanel)navPanel).DockPadding.Bottom = 0; this.Controls.Add(navPanel); m_PopupPanelContainer.Leave -= new EventHandler(m_PopupPanelContainer_Leave); m_PopupPanelContainer.Dispose(); m_PopupPanelContainer = null; m_PopupPaneVisible = false; OnPanelPopupClosed(EventArgs.Empty); } finally { m_Hiding=false; } } /// /// Raises the PanelPopupClosed event. /// /// Provides event arguments. protected virtual void OnPanelPopupClosed(EventArgs e) { EventHandler handler = PanelPopupClosed; if (handler != null) handler(this, e); } /// /// Gets or sets whether selected pane is displayed as popup when control is collapsed (Expanded=false). Using /// navigation pane button that is displayed when control is collapsed user can popup or close currently selected pane without /// expanding the control. You can use this property to do same from code as well as check whether selected pane is displayed as /// popup. Note that control must be collapsed (Expanded=false) in order for this property to have any effect. /// [Browsable(false),DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public bool PopupSelectedPaneVisible { get { return m_PopupPaneVisible; } set { if (m_PopupPaneVisible != value) { if (value) PopupSelectedPane(); else HideSelectedPopupPane(); } } } private void UpdatePanePopupPanelSize() { if (m_PanePopupPanel == null) return; int margin = 3; m_PanePopupPanel.Bounds=new Rectangle(new Point(this.ClientRectangle.X + margin, panelTitle.Bottom + margin), new Size(this.ClientRectangle.Width - margin * 2, navBar.Top - panelTitle.Bottom - margin * 2)); } private void DestroyPanePopup() { if (m_PanePopupPanel != null) { this.Controls.Remove(m_PanePopupPanel); m_PanePopupPanel.Dispose(); m_PanePopupPanel = null; } foreach(Control c in this.Controls) { if (c is NavigationPanePanel && ((NavigationPanePanel)c).ParentItem == this.CheckedButton) { c.Visible = true; if(this.DesignMode) TypeDescriptor.GetProperties(c)["Visible"].SetValue(c, true); c.BringToFront(); break; } } } private void OnCanCollapseChanged() { if (m_CanCollapse) { UpdateExpandCollapseImages(); } UpdateExpandButton(); } private Image GetCollapseImage(bool mouseOverImage) { if (mouseOverImage) { if (m_TitleImageCollapseMouseOver != null) return m_TitleImageCollapseMouseOver; return m_DefaultCollapseImageMouseOver; } else { if (m_TitleImageCollapse != null) return m_TitleImageCollapse; return m_DefaultCollapseImage; } } private Image GetExpandImage(bool mouseOverImage) { if (mouseOverImage) { if (m_TitleImageExpandMouseOver != null) return m_TitleImageExpandMouseOver; return m_DefaultExpandImageMouseOver; } else { if (m_TitleImageExpand != null) return m_TitleImageExpand; return m_DefaultExpandImage; } } internal void Office2007ColorTableChanged() { ColorSchemeStyleChanged(); } private void UpdateExpandButton() { LocalizationManager lm=new LocalizationManager(navBar as IOwnerLocalize); if (m_Expanded) { if (panelTitle.ButtonAlignment == eTitleButtonAlignment.Right || m_TitleImageCollapse!=null) { panelTitle.ExpandChangeButton.Image = GetCollapseImage(false); panelTitle.ExpandChangeButton.HoverImage = GetCollapseImage(true); } else { panelTitle.ExpandChangeButton.Image = GetExpandImage(false); panelTitle.ExpandChangeButton.HoverImage = GetExpandImage(true); } panelTitle.ExpandChangeButton.Tooltip = lm.GetDefaultLocalizedString(LocalizationKeys.NavPaneCollapseButtonTooltip); } else { if (panelTitle.ButtonAlignment == eTitleButtonAlignment.Right || m_TitleImageExpand != null) { panelTitle.ExpandChangeButton.Image = GetExpandImage(false); panelTitle.ExpandChangeButton.HoverImage = GetExpandImage(true); } else { panelTitle.ExpandChangeButton.Image = GetCollapseImage(false); panelTitle.ExpandChangeButton.HoverImage = GetCollapseImage(true); } panelTitle.ExpandChangeButton.Tooltip = lm.GetDefaultLocalizedString(LocalizationKeys.NavPaneExpandButtonTooltip); } panelTitle.UpdateButtonPosition(); } private void UpdateExpandCollapseImages() { if (m_DefaultCollapseImage != null) m_DefaultCollapseImage.Dispose(); if (m_DefaultExpandImage != null) m_DefaultExpandImage.Dispose(); if (m_DefaultCollapseImageMouseOver != null) m_DefaultCollapseImageMouseOver.Dispose(); if (m_DefaultExpandImageMouseOver != null) m_DefaultExpandImageMouseOver.Dispose(); m_DefaultCollapseImage = UIGraphics.CreateExpandButtonImage(true, panelTitle.ColorScheme.PanelText, false); m_DefaultCollapseImageMouseOver = UIGraphics.CreateExpandButtonImage(true, panelTitle.ColorScheme.ItemHotText, false); m_DefaultExpandImage = UIGraphics.CreateExpandButtonImage(false, panelTitle.ColorScheme.PanelText, false); m_DefaultExpandImageMouseOver = UIGraphics.CreateExpandButtonImage(false, panelTitle.ColorScheme.ItemHotText, false); } /// /// Loads navigation bar layout that was saved using SaveLayout method. Note that this method must be called after all items are created and added to the control. /// /// File to load layout from. public void LoadLayout(string fileName) { navBar.LoadLayout(fileName); } /// /// Loads navigation bar layout that was saved using SaveLayout method. Note that this method must be called after all items are created and added to the control. /// /// Parent XML element that is used to load layout from. Note that this must be the same element that was passed into the SaveLayout method. public void LoadLayout(System.Xml.XmlElement xmlParent) { navBar.LoadLayout(xmlParent); } /// /// Gets/Sets the visual style for the control. Default style is Office 2003. /// [Browsable(true), DevCoBrowsable(true), Category("Appearance"), Description("Specifies the visual style of the control."), DefaultValue(eDotNetBarStyle.Office2003)] public eDotNetBarStyle Style { get { return navBar.Style; } set { navBar.Style = value; ColorSchemeStyleChanged(); } } /// /// 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) { ColorSchemeStyleChanged(); if (this.IsHandleCreated && this.Visible) this.Invalidate(true); } protected override void OnHandleCreated(EventArgs e) { ColorSchemeStyleChanged(); base.OnHandleCreated(e); } /// /// Updates the color scheme on child panels to reflect the style of the NavigationBar control. Calling this method is necessary only if you manually /// change the NavigationBar.ColorScheme property. /// public void ColorSchemeStyleChanged() { ColorScheme cs = null; eDotNetBarStyle style = navBar.ItemsContainer.EffectiveStyle; if (BarFunctions.IsOffice2007Style(style) || navBar.ColorScheme != null && navBar.ColorScheme.PredefinedColorScheme == ePredefinedColorScheme.SystemColors) cs = navBar.GetColorScheme(); foreach (Control c in this.Controls) { if (c is PanelEx) { PanelEx p = c as PanelEx; TypeDescriptor.GetProperties(p)["ColorSchemeStyle"].SetValue(p, style); if (cs != null) ((PanelEx)c).ColorScheme = cs; } } if (style == eDotNetBarStyle.Office2010) panelTitle.Style.Border = eBorderType.None; else if (BarFunctions.IsOffice2007Style(style)) panelTitle.Style.Border = eBorderType.RaisedInner; else panelTitle.Style.Border = eBorderType.SingleLine; UpdateExpandCollapseImages(); UpdateExpandButton(); if (style == eDotNetBarStyle.Office2010) { this.DockPadding.All = 0; this.navBar.BackgroundStyle.BorderWidth = 0; this.navBar.BackgroundStyle.BorderColor.Color = Color.Transparent; } else { this.DockPadding.All = 1; this.navBar.BackgroundStyle.BorderWidth = 1; navBar.BackgroundStyle.BorderColor.ColorSchemePart = eColorSchemePart.PanelBorder; } } #region Event Forwarding private void OnNavBarItemClick(object sender, EventArgs e) { if(ItemClick!=null) ItemClick(sender, e); } private void OnNavBarOptionGroupChanging(object sender, OptionGroupChangingEventArgs e) { NavigationPanePanel oldPanel=null, newPanel=null; if(e.OldChecked!=null) oldPanel=this.GetPanel((ButtonItem)e.OldChecked); if(e.NewChecked!=null) newPanel = this.GetPanel((ButtonItem)e.NewChecked); if(newPanel==null) return; PanelChangingEventArgs epanel=new PanelChangingEventArgs(oldPanel,newPanel); InvokePanelChanging(epanel); e.Cancel=epanel.Cancel; } protected virtual void InvokePanelChanging(PanelChangingEventArgs e) { if(PanelChanging!=null) PanelChanging(this,e); } #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.panelTitle = new DevComponents.DotNetBar.PanelExTitle(); this.navBar = new DevComponents.DotNetBar.NavigationBar(); ((ISupportInitialize)this.navBar).BeginInit(); //this.SuspendLayout(); // // panelTitle // this.panelTitle.Dock = System.Windows.Forms.DockStyle.Top; this.panelTitle.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0))); this.panelTitle.Name = "panelTitle"; this.panelTitle.Size = new System.Drawing.Size(150, 24); this.panelTitle.Style.Alignment = System.Drawing.StringAlignment.Near; this.panelTitle.Style.BackColor1.ColorSchemePart = DevComponents.DotNetBar.eColorSchemePart.PanelBackground; this.panelTitle.Style.BackColor2.ColorSchemePart = DevComponents.DotNetBar.eColorSchemePart.PanelBackground2; this.panelTitle.Style.Border = DevComponents.DotNetBar.eBorderType.SingleLine; this.panelTitle.Style.BorderSide = eBorderSide.Bottom; this.panelTitle.Style.BorderColor.ColorSchemePart = DevComponents.DotNetBar.eColorSchemePart.PanelBorder; this.panelTitle.Style.ForeColor.ColorSchemePart = DevComponents.DotNetBar.eColorSchemePart.PanelText; this.panelTitle.Style.GradientAngle = 90; this.panelTitle.Style.MarginLeft=4; this.panelTitle.StyleMouseDown.Alignment = System.Drawing.StringAlignment.Near; this.panelTitle.StyleMouseOver.Alignment = System.Drawing.StringAlignment.Near; this.panelTitle.TabIndex = 0; this.panelTitle.ExpandButtonVisible = false; this.panelTitle.Text = "Title"; // // navigationBar1 // this.navBar.BackgroundStyle.BackColor1.ColorSchemePart = eColorSchemePart.PanelBackground; this.navBar.BackgroundStyle.Border = DevComponents.DotNetBar.eBorderType.SingleLine; this.navBar.BackgroundStyle.BorderSide = eBorderSide.Top; this.navBar.BackgroundStyle.BorderColor.ColorSchemePart = eColorSchemePart.PanelBorder; this.navBar.Dock = System.Windows.Forms.DockStyle.Bottom; this.navBar.Location = new System.Drawing.Point(0, 128); this.navBar.Name = "navigationBar1"; this.navBar.Size = new System.Drawing.Size(150, 32); this.navBar.TabIndex = 1; this.navBar.Text = "navBar"; this.navBar.Resize+=new EventHandler(this.OnNavBarResize); this.navBar.ItemClick+=new EventHandler(this.OnNavBarItemClick); this.navBar.OptionGroupChanging+=new OptionGroupChangingEventHandler(this.OnNavBarOptionGroupChanging); this.navBar.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0))); // // NavigationPane // this.Controls.AddRange(new System.Windows.Forms.Control[] { this.navBar, this.panelTitle}); this.Name = "NavigationPane"; this.Size = new System.Drawing.Size(150, 192); this.DockPadding.All = 1; ((ISupportInitialize)this.navBar).EndInit(); //this.ResumeLayout(false); } #endregion } #region PanelChangingEventArgs /// /// Represents event arguments for PanelChanging event. /// public class PanelChangingEventArgs : EventArgs { /// /// Set to true to cancel changing of the panel. /// public bool Cancel=false; /// /// Panel that will be selected if operation is not cancelled. /// public readonly NavigationPanePanel NewPanel; /// /// Panel that is currently selected and which will be de-selected if operation is not cancelled. /// public readonly NavigationPanePanel OldPanel; /// /// Default constructor. /// public PanelChangingEventArgs(NavigationPanePanel oldpanel, NavigationPanePanel newpanel) { NewPanel=newpanel; OldPanel=oldpanel; } } #endregion #region PanelPopupEventArgs /// /// Represents event arguments for BeforePanelPopup event. /// public class PanelPopupEventArgs : EventArgs { /// /// Set to true to cancel popup of the panel. /// public bool Cancel=false; /// /// Size and position of popup. You can modify this memeber to affect size and position of popup. /// public Rectangle PopupBounds=Rectangle.Empty; /// /// Default constructor. /// public PanelPopupEventArgs(Rectangle popupBounds) { this.PopupBounds=popupBounds; } } #endregion }