777 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			777 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Collections.Generic;
 | 
						|
using System.ComponentModel;
 | 
						|
using System.Data.SqlTypes;
 | 
						|
using System.Drawing;
 | 
						|
using System.Text;
 | 
						|
using System.Windows.Forms;
 | 
						|
using System.Windows.Forms.VisualStyles;
 | 
						|
using DevComponents.DotNetBar.Metro;
 | 
						|
using DevComponents.DotNetBar.Rendering;
 | 
						|
 | 
						|
namespace DevComponents.DotNetBar.Controls
 | 
						|
{
 | 
						|
    /// <summary>
 | 
						|
    /// Represents SideNav control to create "hamburger" menus.
 | 
						|
    /// </summary>
 | 
						|
    [ToolboxBitmap(typeof(SideNav), "Controls.SideNav.ico"), ToolboxItem(true),Designer("DevComponents.DotNetBar.Design.SideNavDesigner, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf"), System.Runtime.InteropServices.ComVisible(false)]
 | 
						|
    public class SideNav : System.Windows.Forms.ContainerControl
 | 
						|
    {
 | 
						|
        #region Constructor
 | 
						|
        private SideNavStrip _Strip = null;
 | 
						|
        private Bar _TitleBar = null;
 | 
						|
        private LabelItem _TitleLabel = null;
 | 
						|
        private ButtonItem _CloseButton = null;
 | 
						|
        private ButtonItem _MaximizeButton = null;
 | 
						|
        private ButtonItem _RestoreButton = null;
 | 
						|
        private Control _Splitter = null;
 | 
						|
        public SideNav()
 | 
						|
        {
 | 
						|
            this.SetStyle(ControlStyles.AllPaintingInWmPaint
 | 
						|
                  | ControlStyles.ResizeRedraw
 | 
						|
                  | DisplayHelp.DoubleBufferFlag
 | 
						|
                  | ControlStyles.UserPaint
 | 
						|
                  | ControlStyles.Opaque
 | 
						|
                  , true);
 | 
						|
 | 
						|
            this.Padding = new System.Windows.Forms.Padding(1);
 | 
						|
 | 
						|
            _Splitter = new Control();
 | 
						|
            _Splitter.Width = 4;
 | 
						|
            _Splitter.Name = "splitter";
 | 
						|
            _Splitter.Cursor = Cursors.VSplit;
 | 
						|
            _Splitter.Dock = DockStyle.Right;
 | 
						|
            _Splitter.MouseMove += SplitterMouseMove;
 | 
						|
            _Splitter.MouseDown += SplitterMouseDown;
 | 
						|
            this.Controls.Add(_Splitter);
 | 
						|
 | 
						|
 | 
						|
            // Title bar and fold/extend buttons
 | 
						|
            Bar titleBar = new Bar();
 | 
						|
            titleBar.Name = "titleBar";
 | 
						|
            titleBar.AntiAlias = true;
 | 
						|
            titleBar.Name = "titleBar";
 | 
						|
            titleBar.PaddingBottom = 7;
 | 
						|
            titleBar.PaddingTop = 5;
 | 
						|
            titleBar.PaddingLeft = 6;
 | 
						|
            titleBar.RoundCorners = false;
 | 
						|
            titleBar.Dock = DockStyle.Top;
 | 
						|
            titleBar.Stretch = true;
 | 
						|
            titleBar.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
 | 
						|
            titleBar.TabIndex = 0;
 | 
						|
            titleBar.TabStop = false;
 | 
						|
            titleBar.BarType = eBarType.StatusBar;
 | 
						|
            titleBar.ItemsContainer.OverflowEnabled = false;
 | 
						|
            LabelItem titleLabel=new LabelItem();
 | 
						|
            titleLabel.Name = "titleLabel";
 | 
						|
            titleLabel.Text = "Title";
 | 
						|
            titleLabel.FontBold = true;
 | 
						|
            _TitleLabel = titleLabel;
 | 
						|
            titleBar.Items.Add(titleLabel);
 | 
						|
            _TitleBar = titleBar;
 | 
						|
            _CloseButton = new ButtonItem("openCloseButton");
 | 
						|
            _CloseButton.Symbol = "\uf0d9";
 | 
						|
            _CloseButton.ImagePaddingHorizontal = 18;
 | 
						|
            _CloseButton.ItemAlignment= eItemAlignment.Far;
 | 
						|
            _CloseButton.SymbolSize = 12f;
 | 
						|
            _CloseButton.Click+=CloseButtonClick;
 | 
						|
            titleBar.Items.Add(_CloseButton);
 | 
						|
            _MaximizeButton = new ButtonItem("maximizeButton");
 | 
						|
            _MaximizeButton.Symbol = "\uf090";
 | 
						|
            _MaximizeButton.ItemAlignment = eItemAlignment.Far;
 | 
						|
            _MaximizeButton.SymbolSize = 12f;
 | 
						|
            _MaximizeButton.Click += MaximizeButtonClick;
 | 
						|
            titleBar.Items.Add(_MaximizeButton);
 | 
						|
            _RestoreButton = new ButtonItem("restoreButton");
 | 
						|
            _RestoreButton.Symbol = "\uf100";
 | 
						|
            _RestoreButton.ItemAlignment = eItemAlignment.Far;
 | 
						|
            _RestoreButton.SymbolSize = 12f;
 | 
						|
            _RestoreButton.Click += RestoreButtonClick;
 | 
						|
            _RestoreButton.Visible = false;
 | 
						|
            titleBar.Items.Add(_RestoreButton);
 | 
						|
 | 
						|
            this.Controls.Add(titleBar);
 | 
						|
 | 
						|
            _Strip = new SideNavStrip();
 | 
						|
            _Strip.Dock = DockStyle.Left;
 | 
						|
            _Strip.AutoSize = true;
 | 
						|
            _Strip.AutoSyncSizeOrientation = eOrientation.Horizontal;
 | 
						|
            _Strip.ButtonCheckedChanged += StripButtonCheckedChanged;
 | 
						|
 | 
						|
            //SideNavItem menuItem=new SideNavItem();
 | 
						|
            //menuItem.Name = "menuItem";
 | 
						|
            //menuItem.Text = "Menu";
 | 
						|
            //menuItem.Symbol = "\uf0c9";
 | 
						|
            //menuItem.IsSystemMenu = true;
 | 
						|
            //_Strip.Items.Add(menuItem);
 | 
						|
 | 
						|
            //Separator sep = new Separator();
 | 
						|
            //sep.SeparatorOrientation = eDesignMarkerOrientation.Vertical;
 | 
						|
            //sep.FixedSize = new Size(3,1);
 | 
						|
            //sep.Padding.Left = 6;
 | 
						|
            //sep.Padding.Right = 6;
 | 
						|
            //_Strip.Items.Add(sep);
 | 
						|
 | 
						|
            //SideNavItem item = new SideNavItem();
 | 
						|
            //item.Text = "Home";
 | 
						|
            //item.Symbol = "\uf015";
 | 
						|
            //_Strip.Items.Add(item);
 | 
						|
            //SideNavPanel panel=new SideNavPanel();
 | 
						|
            //panel.Dock = DockStyle.Fill;
 | 
						|
            //this.Controls.Add(panel);
 | 
						|
            //item.Panel = panel;
 | 
						|
 | 
						|
            //item = new SideNavItem();
 | 
						|
            //item.Text = "Explore";
 | 
						|
            //item.Symbol = "\uf002";
 | 
						|
            //_Strip.Items.Add(item);
 | 
						|
 | 
						|
            //ButtonItem button=new ButtonItem();
 | 
						|
            //button.Text = "Button";
 | 
						|
            //button.Symbol = "\uf003";
 | 
						|
            //button.ButtonStyle = eButtonStyle.ImageAndText;
 | 
						|
            //_Strip.Items.Add(button);
 | 
						|
            
 | 
						|
            this.Controls.Add(_Strip);
 | 
						|
            _Strip.Width = 48;
 | 
						|
 | 
						|
            StyleManager.Register(this);
 | 
						|
            UpdateColors();
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void Dispose(bool disposing)
 | 
						|
        {
 | 
						|
            if (_IsMaximized && disposing && this.Parent!=null)
 | 
						|
            {
 | 
						|
                this.Parent.Resize -= ParentResize;
 | 
						|
            }
 | 
						|
            base.Dispose(disposing);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Implementation
 | 
						|
        /// <summary>
 | 
						|
        /// 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.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="newStyle">New active style.</param>
 | 
						|
        [EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
        public void StyleManagerStyleChanged(eDotNetBarStyle newStyle)
 | 
						|
        {
 | 
						|
            UpdateColors();
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Updates the control colors from the global color table.
 | 
						|
        /// </summary>
 | 
						|
        public void UpdateColors()
 | 
						|
        {
 | 
						|
            SideNavColorTable ct = GetColorTable();
 | 
						|
            _TitleBar.BackColor = ct.TitleBackColor;
 | 
						|
            _TitleBar.BorderColors = ct.TitleBorderColors;
 | 
						|
            this.Invalidate(true);
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void OnPaint(PaintEventArgs e)
 | 
						|
        {   
 | 
						|
            Graphics g = e.Graphics;
 | 
						|
            DisplayHelp.FillRectangle(g,this.ClientRectangle, this.BackColor);
 | 
						|
            SideNavColorTable table = GetColorTable();
 | 
						|
            DisplayHelp.DrawRoundedRectangle(g, this.ClientRectangle, table.BorderColors, 0);
 | 
						|
        }
 | 
						|
 | 
						|
        private SideNavColorTable GetColorTable()
 | 
						|
        {
 | 
						|
            return ((Office2007Renderer)GlobalManager.Renderer).ColorTable.SideNav;
 | 
						|
        }
 | 
						|
 | 
						|
        [EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
        public void SetDesignMode()
 | 
						|
        {
 | 
						|
            _Strip.SetDesignMode(true);
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _EnableSplitter = true;
 | 
						|
        /// <summary>
 | 
						|
        /// Indicates whether splitter that is located on right hand side of open control is visible and enabled.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(true), Category("Appearance"), Description("Indicates whether splitter that is located on right hand side of open control is visible and enabled.")]
 | 
						|
        public bool EnableSplitter
 | 
						|
        {
 | 
						|
            get { return _EnableSplitter; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_EnableSplitter != value)
 | 
						|
                {
 | 
						|
                    bool oldValue = _EnableSplitter;
 | 
						|
                    _EnableSplitter = value;
 | 
						|
                    OnEnableSplitterChanged(value, oldValue);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        protected virtual void OnEnableSplitterChanged(bool newValue, bool oldValue)
 | 
						|
        {
 | 
						|
            _Splitter.Visible = newValue;
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _EnableClose = true;
 | 
						|
        /// <summary>
 | 
						|
        /// Indicates whether button which folds/closes the control is visible.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(true), Category("Appearance"), Description("Indicates whether button which folds/closes the control is visible.")]
 | 
						|
        public bool EnableClose
 | 
						|
        {
 | 
						|
            get { return _EnableClose; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_EnableClose != value)
 | 
						|
                {
 | 
						|
                    bool oldValue = _EnableClose;
 | 
						|
                    _EnableClose = value;
 | 
						|
                    OnEnableCloseChanged(value, oldValue);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        protected virtual void OnEnableCloseChanged(bool newValue, bool oldValue)
 | 
						|
        {
 | 
						|
            _CloseButton.Visible = newValue;
 | 
						|
            _TitleBar.RecalcLayout();
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _EnableMaximize = true;
 | 
						|
        // <summary>
 | 
						|
        /// Indicates whether buttons which maximize and restore the control are visible.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(true), Category("Apeparance"), Description("Indicates whether buttons which maximize and restore the control are visible.")]
 | 
						|
        public bool EnableMaximize
 | 
						|
        {
 | 
						|
            get { return _EnableMaximize; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_EnableMaximize != value)
 | 
						|
                {
 | 
						|
                    bool oldValue = _EnableMaximize;
 | 
						|
                    _EnableMaximize = value;
 | 
						|
                    OnEnableMaximizeChanged(value, oldValue);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        protected virtual void OnEnableMaximizeChanged(bool newValue, bool oldValue)
 | 
						|
        {
 | 
						|
            if (!newValue)
 | 
						|
            {
 | 
						|
                _MaximizeButton.Visible = false;
 | 
						|
                _RestoreButton.Visible = false;
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                if (_IsMaximized)
 | 
						|
                    _RestoreButton.Visible = true;
 | 
						|
                else
 | 
						|
                    _MaximizeButton.Visible = true;
 | 
						|
            }
 | 
						|
            _TitleBar.RecalcLayout();
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Returns collection of items on a bar.
 | 
						|
        /// </summary>
 | 
						|
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content), Browsable(false)]
 | 
						|
        public SubItemsCollection Items
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return _Strip.Items;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void CloseButtonClick(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            Close(eEventSource.Mouse);
 | 
						|
        }
 | 
						|
 | 
						|
        private void MaximizeButtonClick(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            Maximize(eEventSource.Mouse);
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _IsMaximized = false;
 | 
						|
        private int _RestoredWidth = 0;
 | 
						|
        /// <summary>
 | 
						|
        /// Maximizes control width so it fills up space to the right of the control.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="source">Source of the event.</param>
 | 
						|
        public void Maximize(eEventSource source)
 | 
						|
        {
 | 
						|
            if(_IsMaximized) return;
 | 
						|
            
 | 
						|
            if (this.Parent == null) 
 | 
						|
                return;
 | 
						|
            if (this.Bounds.Right >= this.Parent.ClientRectangle.Right)
 | 
						|
                return;
 | 
						|
            
 | 
						|
            CancelSourceEventArgs args=new CancelSourceEventArgs(source);
 | 
						|
            OnBeforeMaximize(args);
 | 
						|
            if(args.Cancel) return;
 | 
						|
 | 
						|
            _IsMaximized = true;
 | 
						|
            int maxWidth = GetMaxWidth();
 | 
						|
            _RestoredWidth = this.Width;
 | 
						|
            BarFunctions.AnimateControl(this, true, _AnimationTime, this.Bounds, new Rectangle(this.Location, new Size(maxWidth, this.Height)));
 | 
						|
            _RestoreButton.Visible = true;
 | 
						|
            _MaximizeButton.Visible = false;
 | 
						|
            _TitleBar.RecalcLayout();
 | 
						|
            _Splitter.Visible = false;
 | 
						|
            this.Invalidate();
 | 
						|
            this.Parent.Resize += ParentResize;
 | 
						|
        }
 | 
						|
 | 
						|
        void ParentResize(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            if (this.Parent.Width > 0)
 | 
						|
                this.Width = GetMaxWidth();
 | 
						|
        }
 | 
						|
 | 
						|
        private int GetMaxWidth()
 | 
						|
        {
 | 
						|
            int width = this.Width + this.Parent.ClientRectangle.Right - this.Bounds.Right;
 | 
						|
            if (this.Parent is MetroAppForm)
 | 
						|
            {
 | 
						|
                MetroAppForm form = (MetroAppForm) this.Parent;
 | 
						|
                if (form.BorderThickness.Right > 0)
 | 
						|
                    width -= (int)form.BorderThickness.Right;
 | 
						|
                else
 | 
						|
                    width -= 3;
 | 
						|
            }
 | 
						|
            
 | 
						|
            return width;
 | 
						|
        }
 | 
						|
 | 
						|
        private void RestoreButtonClick(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            Restore(eEventSource.Mouse);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Restores the control to previous size if it was maximized before.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="source">Source of event.</param>
 | 
						|
        public void Restore(eEventSource source)
 | 
						|
        {
 | 
						|
            if (!_IsMaximized || _RestoredWidth == 0) return;
 | 
						|
            _IsMaximized = false;
 | 
						|
            
 | 
						|
            CancelSourceEventArgs args = new CancelSourceEventArgs(source);
 | 
						|
            OnBeforeRestore(args);
 | 
						|
            if (args.Cancel) return;
 | 
						|
 | 
						|
            BarFunctions.AnimateControl(this, true, _AnimationTime, this.Bounds, new Rectangle(this.Location, new Size(_RestoredWidth, this.Height)));
 | 
						|
            _RestoredWidth = 0;
 | 
						|
            _RestoreButton.Visible = false;
 | 
						|
            _MaximizeButton.Visible = true;
 | 
						|
            _TitleBar.RecalcLayout();
 | 
						|
            _Splitter.Visible = _EnableSplitter;
 | 
						|
            this.Invalidate();
 | 
						|
            if(this.Parent!=null)
 | 
						|
                this.Parent.Resize -= ParentResize;
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _IsOpen = true;
 | 
						|
        private int _OpenWidth = 0;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets whether control is closed, i.e. whether selected item panel is shown or not. When closed
 | 
						|
        /// any selected item is unselected and selected panel hidden.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(false), Browsable(false)]
 | 
						|
        public bool IsClosed
 | 
						|
        {
 | 
						|
            get { return !_IsOpen; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value)
 | 
						|
                {
 | 
						|
                    if(_IsOpen)
 | 
						|
                        Close(eEventSource.Code);
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    if (!_IsOpen)
 | 
						|
                    {
 | 
						|
                        SideNavItem item = FirstVisibleSideNavItem??_LastOpenItem;
 | 
						|
                        if (item != null)
 | 
						|
                            Open(item, eEventSource.Code);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private SideNavItem FirstVisibleSideNavItem
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                for (int i = 0; i < _Strip.Items.Count; i++)
 | 
						|
                {
 | 
						|
                    if (_Strip.Items[i] is SideNavItem && _Strip.Items[i].Visible)
 | 
						|
                        return (SideNavItem)_Strip.Items[i];
 | 
						|
                }
 | 
						|
                return null;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void StripButtonCheckedChanged(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            if (sender is SideNavItem && ((SideNavItem)sender).Checked)
 | 
						|
            {
 | 
						|
                OnSelectedItemChanged(EventArgs.Empty);
 | 
						|
                if (!_IsOpen)
 | 
						|
                    Open((SideNavItem)sender, eEventSource.Code);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Opens the control, i.e. expands it, selects specified item and shows its associated panel.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="item">Item to select.</param>
 | 
						|
        /// <param name="source">Source of the event.</param>
 | 
						|
        public void Open(SideNavItem item, eEventSource source)
 | 
						|
        {
 | 
						|
            if (item == null)
 | 
						|
                throw new ArgumentException("item must be set to valid item to select");
 | 
						|
 | 
						|
            if (_IsOpen) return;
 | 
						|
 | 
						|
            CancelSourceEventArgs args=new CancelSourceEventArgs(source, item);
 | 
						|
            OnBeforeOpen(args);
 | 
						|
            if(args.Cancel) return;
 | 
						|
 | 
						|
            if (!item.Checked)
 | 
						|
                item.Checked = true;
 | 
						|
            BarFunctions.AnimateControl(this, true, _AnimationTime, this.Bounds, new Rectangle(this.Location, new Size(_OpenWidth, this.Height)));
 | 
						|
            _IsOpen = true;
 | 
						|
            _Splitter.Visible = _EnableSplitter;
 | 
						|
            this.Invalidate();
 | 
						|
        }
 | 
						|
 | 
						|
        private SideNavItem _LastOpenItem = null;
 | 
						|
        /// <summary>
 | 
						|
        /// Closes the control, i.e. unselects any selected item, hide its associated panel and folds the control.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="source">Source of the event.</param>
 | 
						|
        public void Close(eEventSource source)
 | 
						|
        {
 | 
						|
            if(!_IsOpen) return;
 | 
						|
 | 
						|
            CancelSourceEventArgs args = new CancelSourceEventArgs(source);
 | 
						|
            OnBeforeClose(args);
 | 
						|
            if (args.Cancel) return;
 | 
						|
 | 
						|
            _OpenWidth = this.Width;
 | 
						|
            int closedWidth = _Strip.Width + this.Padding.Horizontal;
 | 
						|
            _Splitter.Visible = false;
 | 
						|
            BarFunctions.AnimateControl(this, true, _AnimationTime, this.Bounds, new Rectangle(this.Location, new Size(closedWidth, this.Height)));
 | 
						|
            _IsOpen = false;
 | 
						|
            if (_Strip.SelectedItem != null)
 | 
						|
            {
 | 
						|
                _LastOpenItem = _Strip.SelectedItem;
 | 
						|
                _Strip.SelectedItem.Checked = false;
 | 
						|
            }
 | 
						|
            else
 | 
						|
                _LastOpenItem = null;
 | 
						|
 | 
						|
            this.Invalidate();
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _IsMenuExpanded = true;
 | 
						|
        /// <summary>
 | 
						|
        /// Indicates whether side menu is expanded, i.e. shows both image and text. When menu is collapsed only image is shown.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(true), Category("Appearance"), Description("Indicates whether side menu is expanded, i.e. shows both image and text. When menu is collapsed only image is shown.")]
 | 
						|
        public bool IsMenuExpanded
 | 
						|
        {
 | 
						|
            get { return _IsMenuExpanded; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_IsMenuExpanded != value)
 | 
						|
                {
 | 
						|
                    bool oldValue = _IsMenuExpanded;
 | 
						|
                    _IsMenuExpanded = value;
 | 
						|
                    OnIsMenuExpandedChanged(value, oldValue);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        protected virtual void OnIsMenuExpandedChanged(bool newValue, bool oldValue)
 | 
						|
        {
 | 
						|
            ExpandMenu(newValue);
 | 
						|
            OnIsMenuExpandedChanged(EventArgs.Empty);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when IsMenuExpanded property has changed its value.
 | 
						|
        /// </summary>
 | 
						|
        [Description("Occurs when IsMenuExpanded property has changed.")]
 | 
						|
        public event EventHandler IsMenuExpandedChanged;
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Raises IsMenuExpandedChanged event.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="e">Provides event arguments.</param>
 | 
						|
        protected virtual void OnIsMenuExpandedChanged(EventArgs e)
 | 
						|
        {
 | 
						|
            EventHandler h = IsMenuExpandedChanged;
 | 
						|
            if (h != null)
 | 
						|
                h(this, e);
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _IsMenuExpandedDelayedSet = false;
 | 
						|
        /// <summary>
 | 
						|
        /// Expands or collapses the control items menu.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="expand"></param>
 | 
						|
        private void ExpandMenu(bool expand)
 | 
						|
        {
 | 
						|
            if (!this.IsHandleCreated)
 | 
						|
            {
 | 
						|
                _IsMenuExpandedDelayedSet = true;
 | 
						|
                return;
 | 
						|
            }
 | 
						|
            for (int i = 0; i < _Strip.Items.Count; i++)
 | 
						|
            {
 | 
						|
                ButtonItem button = _Strip.Items[i] as ButtonItem;
 | 
						|
                if (button != null)
 | 
						|
                {
 | 
						|
                    button.ButtonStyle = (expand ? eButtonStyle.ImageAndText : eButtonStyle.Default);
 | 
						|
                }
 | 
						|
            }
 | 
						|
            _Strip.RecalcLayout();
 | 
						|
            if (!_IsOpen)
 | 
						|
                this.Width = _Strip.Width + this.Padding.Horizontal;
 | 
						|
        }
 | 
						|
 | 
						|
        private int _AnimationTime = 250;
 | 
						|
        /// <summary>
 | 
						|
        /// Indicates the animation time in milliseconds for operations that perform visual animation of transition. Set to zero to disable animation.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(250), Category("Behavior"), Description("Indicates the animation time in milliseconds for operations that perform visual animation of transition. Set to zero to disable animation.")]
 | 
						|
        public int AnimationTime
 | 
						|
        {
 | 
						|
            get { return _AnimationTime; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value != _AnimationTime)
 | 
						|
                {
 | 
						|
                    int oldValue = _AnimationTime;
 | 
						|
                    _AnimationTime = value;
 | 
						|
                    OnAnimationTimeChanged(oldValue, value);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Called when AnimationTime property has changed.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="oldValue">Old property value</param>
 | 
						|
        /// <param name="newValue">New property value</param>
 | 
						|
        protected virtual void OnAnimationTimeChanged(int oldValue, int newValue)
 | 
						|
        {
 | 
						|
            //OnPropertyChanged(new PropertyChangedEventArgs("AnimationTime"));
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs before the control is maximized and allows you to cancel that.
 | 
						|
        /// </summary>
 | 
						|
        [Description("Occurs before the control is maximized and allows you to cancel that.")]
 | 
						|
        public event CancelSourceEventHandler BeforeMaximize;
 | 
						|
        /// <summary>
 | 
						|
        /// Raises BeforeMaximize event.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="e">Provides event arguments.</param>
 | 
						|
        protected virtual void OnBeforeMaximize(CancelSourceEventArgs e)
 | 
						|
        {
 | 
						|
            CancelSourceEventHandler h = BeforeMaximize;
 | 
						|
            if (h != null)
 | 
						|
                h(this, e);
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs before the control is restored and allows you to cancel that.
 | 
						|
        /// </summary>
 | 
						|
        [Description("Occurs before the control is restored and allows you to cancel that.")]
 | 
						|
        public event CancelSourceEventHandler BeforeRestore;
 | 
						|
        /// <summary>
 | 
						|
        /// Raises BeforeRestore event.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="e">Provides event arguments.</param>
 | 
						|
        protected virtual void OnBeforeRestore(CancelSourceEventArgs e)
 | 
						|
        {
 | 
						|
            CancelSourceEventHandler h = BeforeRestore;
 | 
						|
            if (h != null)
 | 
						|
                h(this, e);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs before the control is opened and allows you to cancel that.
 | 
						|
        /// </summary>
 | 
						|
        [Description("Occurs before the control is opened and allows you to cancel that.")]
 | 
						|
        public event CancelSourceEventHandler BeforeOpen;
 | 
						|
        /// <summary>
 | 
						|
        /// Raises BeforeOpen event.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="e">Provides event arguments.</param>
 | 
						|
        protected virtual void OnBeforeOpen(CancelSourceEventArgs e)
 | 
						|
        {
 | 
						|
            CancelSourceEventHandler h = BeforeOpen;
 | 
						|
            if (h != null)
 | 
						|
                h(this, e);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs before the control is closed and allows you to cancel that.
 | 
						|
        /// </summary>
 | 
						|
        [Description("Occurs before the control is closed and allows you to cancel that.")]
 | 
						|
        public event CancelSourceEventHandler BeforeClose;
 | 
						|
        /// <summary>
 | 
						|
        /// Raises BeforeClose event.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="e">Provides event arguments.</param>
 | 
						|
        protected virtual void OnBeforeClose(CancelSourceEventArgs e)
 | 
						|
        {
 | 
						|
            CancelSourceEventHandler h = BeforeClose;
 | 
						|
            if (h != null)
 | 
						|
                h(this, e);
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void OnHandleCreated(EventArgs e)
 | 
						|
        {
 | 
						|
            UpdateSelectedItemTitle();
 | 
						|
            UpdateColors();
 | 
						|
            if (_IsMenuExpandedDelayedSet)
 | 
						|
            {
 | 
						|
                ExpandMenu(_IsMenuExpanded);
 | 
						|
                _IsMenuExpandedDelayedSet = false;
 | 
						|
            }
 | 
						|
            base.OnHandleCreated(e);
 | 
						|
        }
 | 
						|
 | 
						|
        internal void UpdateSelectedItemTitle()
 | 
						|
        {
 | 
						|
            SideNavItem item = _Strip.SelectedItem;
 | 
						|
            if (item == null) return;
 | 
						|
 | 
						|
            if (!string.IsNullOrEmpty(item.Title))
 | 
						|
                _TitleLabel.Text = item.Title;
 | 
						|
            else
 | 
						|
                _TitleLabel.Text = item.Text;
 | 
						|
        }
 | 
						|
 | 
						|
        private Point _SplitterMouseDownPoint = Point.Empty;
 | 
						|
        private void SplitterMouseDown(object sender, MouseEventArgs e)
 | 
						|
        {
 | 
						|
            if (e.Button == MouseButtons.Left)
 | 
						|
                _SplitterMouseDownPoint = e.Location;
 | 
						|
        }
 | 
						|
        private void SplitterMouseMove(object sender, MouseEventArgs e)
 | 
						|
        {
 | 
						|
            if (e.Button == MouseButtons.Left)
 | 
						|
            {
 | 
						|
                int maxWidth = GetMaxWidth();
 | 
						|
                int minWidth = _Strip.Width + 64;
 | 
						|
                int newWidth = this.Width + (e.X - _SplitterMouseDownPoint.X);
 | 
						|
                if (newWidth > maxWidth)
 | 
						|
                    newWidth = maxWidth;
 | 
						|
                else if (newWidth < minWidth)
 | 
						|
                    newWidth = minWidth;
 | 
						|
                this.Width = newWidth;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets currently selected item. Only items with Panel assigned can be selected.
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						|
        public SideNavItem SelectedItem
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                foreach (BaseItem item in this.Items)
 | 
						|
                {
 | 
						|
                    if (item is SideNavItem && ((SideNavItem)item).Checked)
 | 
						|
                    {
 | 
						|
                        return (SideNavItem)item;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                return null;
 | 
						|
            }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value != null && value.Panel != null)
 | 
						|
                    value.Checked = true;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when SelectedItem changes.
 | 
						|
        /// </summary>
 | 
						|
        [Description("Occurs when SelectedItem changes.")]
 | 
						|
        public event EventHandler SelectedItemChanged;
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Raises SelectedItemChanged event.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="e">Provides event arguments.</param>
 | 
						|
        protected virtual void OnSelectedItemChanged(EventArgs e)
 | 
						|
        {
 | 
						|
            EventHandler h = SelectedItemChanged;
 | 
						|
            if (h != null)
 | 
						|
                h(this, e);
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Gets reference to internal SideNavStrip control.
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(false)]
 | 
						|
        public SideNavStrip SideNavStrip
 | 
						|
        {
 | 
						|
            get { return _Strip; }
 | 
						|
        }
 | 
						|
        #endregion
 | 
						|
    }
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Defines delegate for the CancelSource events.
 | 
						|
    /// </summary>
 | 
						|
    /// <param name="sender"></param>
 | 
						|
    /// <param name="ea"></param>
 | 
						|
    public delegate void CancelSourceEventHandler(object sender, CancelSourceEventArgs e);
 | 
						|
    /// <summary>
 | 
						|
    /// Event arguments for CancelSourceEventHandler
 | 
						|
    /// </summary>
 | 
						|
    public class CancelSourceEventArgs : CancelEventArgs
 | 
						|
    {
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the source of the event.
 | 
						|
        /// </summary>
 | 
						|
        public eEventSource Source = eEventSource.Code;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets any optional data that is associated with the event.
 | 
						|
        /// </summary>
 | 
						|
        public object Data = null;
 | 
						|
        /// <summary>
 | 
						|
        /// Creates new instance of the object.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="source">Source of event</param>
 | 
						|
        public CancelSourceEventArgs(eEventSource source)
 | 
						|
        {
 | 
						|
            this.Source = source;
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Creates new instance of the object.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="source">Source of event</param>
 | 
						|
        /// <param name="data">Optional data associated with the event.</param>
 | 
						|
        public CancelSourceEventArgs(eEventSource source, object data)
 | 
						|
        {
 | 
						|
            this.Source = source;
 | 
						|
            this.Data = data;
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |