498 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			498 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
#if FRAMEWORK20
 | 
						|
using System;
 | 
						|
using System.Collections.Generic;
 | 
						|
using System.Text;
 | 
						|
using System.Drawing;
 | 
						|
using System.ComponentModel;
 | 
						|
using DevComponents.DotNetBar.Rendering;
 | 
						|
using DevComponents.DotNetBar;
 | 
						|
 | 
						|
namespace DevComponents.Editors
 | 
						|
{
 | 
						|
    /// <summary>
 | 
						|
    /// Represents the up down button which allows change of the value in currently focused input control.
 | 
						|
    /// </summary>
 | 
						|
    public class VisualUpDownButton : VisualButtonBase
 | 
						|
    {
 | 
						|
        #region Private Variables
 | 
						|
        private bool _MouseOverButtonUp = false;
 | 
						|
        private bool _MouseOverButtonDown = false;
 | 
						|
        private bool _MouseDownButtonUp = false;
 | 
						|
        private bool _MouseDownButtonDown = false;
 | 
						|
        private Rectangle _DownButtonRectangle = Rectangle.Empty;
 | 
						|
        private Rectangle _UpButtonRectangle = Rectangle.Empty;
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Events
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when Up part of the button has been clicked.
 | 
						|
        /// </summary>
 | 
						|
        public event EventHandler UpClick;
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when Down part of the button has been clicked.
 | 
						|
        /// </summary>
 | 
						|
        public event EventHandler DownClick;
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Constructor
 | 
						|
        /// <summary>
 | 
						|
        /// Initializes a new instance of the VisualUpDownButton class.
 | 
						|
        /// </summary>
 | 
						|
        public VisualUpDownButton()
 | 
						|
        {
 | 
						|
            this.Focusable = false;
 | 
						|
            this.ClickAutoRepeat = true;
 | 
						|
        }
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Internal Implementation
 | 
						|
        public override void PerformLayout(PaintInfo pi)
 | 
						|
        {
 | 
						|
            int height = pi.AvailableSize.Height;
 | 
						|
            if (height % 2 != 0)
 | 
						|
                height++;
 | 
						|
            Size size = new Size(Dpi.Width(_ButtonWidth), height);
 | 
						|
 | 
						|
            if (_UpImage != null && _DownImage != null)
 | 
						|
                size.Width = Math.Max(Dpi.Width(_UpImage.Width), Dpi.Width(_DownImage.Width));
 | 
						|
 | 
						|
            this.Size = size;
 | 
						|
            this.CalculatedSize = size;
 | 
						|
            base.PerformLayout(pi);
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void OnPaint(PaintInfo p)
 | 
						|
        {
 | 
						|
            Graphics g = p.Graphics;
 | 
						|
            Rectangle r = this.RenderBounds;
 | 
						|
            if (r.Width <= 0 || r.Height <= 0)
 | 
						|
                return;
 | 
						|
 | 
						|
            Rectangle buttonRect = new Rectangle(r.X, r.Y, r.Width, r.Height / 2);
 | 
						|
            if (_UpImage != null)
 | 
						|
                g.DrawImage(_UpImage, buttonRect.Location);
 | 
						|
            else
 | 
						|
            {
 | 
						|
                Office2007ButtonItemStateColorTable ct = GetOffice2007StateColorTableButtonUp(p);
 | 
						|
                PaintButtonBackground(p, ct, buttonRect);
 | 
						|
                using (SolidBrush brush = new SolidBrush(ct.Text))
 | 
						|
                    p.Graphics.FillPolygon(brush, Office2007ButtonItemPainter.GetExpandPolygon(buttonRect, ePopupSide.Top));
 | 
						|
            }
 | 
						|
            _UpButtonRectangle = buttonRect;
 | 
						|
 | 
						|
 | 
						|
            buttonRect = new Rectangle(r.X, buttonRect.Bottom, r.Width, r.Height - buttonRect.Height);
 | 
						|
            if (_DownImage != null)
 | 
						|
                g.DrawImage(_DownImage, buttonRect.Location);
 | 
						|
            else
 | 
						|
            {
 | 
						|
                Office2007ButtonItemStateColorTable ct = GetOffice2007StateColorTableButtonDown(p);
 | 
						|
                PaintButtonBackground(p, ct, buttonRect);
 | 
						|
                using (SolidBrush brush = new SolidBrush(ct.Text))
 | 
						|
                    p.Graphics.FillPolygon(brush, Office2007ButtonItemPainter.GetExpandPolygon(buttonRect, ePopupSide.Bottom));
 | 
						|
            }
 | 
						|
            _DownButtonRectangle = buttonRect;
 | 
						|
 | 
						|
            base.OnPaint(p);
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void OnMouseMove(System.Windows.Forms.MouseEventArgs e)
 | 
						|
        {
 | 
						|
            if (this.GetIsEnabled())
 | 
						|
            {
 | 
						|
                if (_DownButtonRectangle.Contains(e.X, e.Y))
 | 
						|
                {
 | 
						|
                    this.MouseOverButtonDown = true;
 | 
						|
                    this.MouseOverButtonUp = false;
 | 
						|
                }
 | 
						|
                else if (_UpButtonRectangle.Contains(e.X, e.Y))
 | 
						|
                {
 | 
						|
                    this.MouseOverButtonUp = true;
 | 
						|
                    this.MouseOverButtonDown = false;
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    this.MouseOverButtonUp = false;
 | 
						|
                    this.MouseOverButtonDown = false;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            base.OnMouseMove(e);
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e)
 | 
						|
        {
 | 
						|
            if (e.Button == System.Windows.Forms.MouseButtons.Left && this.GetIsEnabled())
 | 
						|
            {
 | 
						|
                if (this.MouseOverButtonUp)
 | 
						|
                    this.MouseDownButtonUp = true;
 | 
						|
                else if (this.MouseOverButtonDown)
 | 
						|
                    this.MouseDownButtonDown = true;
 | 
						|
 | 
						|
                ExecuteClickAction();
 | 
						|
            }
 | 
						|
            base.OnMouseDown(e);
 | 
						|
        }
 | 
						|
 | 
						|
        private void ExecuteClickAction()
 | 
						|
        {
 | 
						|
            if (this.MouseOverButtonUp)
 | 
						|
            {
 | 
						|
                if (_AutoChange != eUpDownButtonAutoChange.None || _AutoChangeItem != null)
 | 
						|
                    UpClickFocusedInputValue();
 | 
						|
                OnUpClick(new EventArgs());
 | 
						|
            }
 | 
						|
            else if (this.MouseOverButtonDown)
 | 
						|
            {
 | 
						|
                if (_AutoChange != eUpDownButtonAutoChange.None || _AutoChangeItem != null)
 | 
						|
                    DownClickFocusedInputValue();
 | 
						|
                OnDownClick(new EventArgs());
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void OnClickAutoRepeat()
 | 
						|
        {
 | 
						|
            ExecuteClickAction();
 | 
						|
            base.OnClickAutoRepeat();
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void OnMouseUp(System.Windows.Forms.MouseEventArgs e)
 | 
						|
        {
 | 
						|
            this.MouseDownButtonDown = false;
 | 
						|
            this.MouseDownButtonUp = false;
 | 
						|
            base.OnMouseUp(e);
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void OnMouseLeave()
 | 
						|
        {
 | 
						|
            this.MouseOverButtonDown = false;
 | 
						|
            this.MouseOverButtonUp = false;
 | 
						|
            base.OnMouseLeave();
 | 
						|
        }
 | 
						|
 | 
						|
        private void DownClickFocusedInputValue()
 | 
						|
        {
 | 
						|
            VisualItem focusedItem = GetAutoChangeItem();
 | 
						|
            if (focusedItem == null) return;
 | 
						|
 | 
						|
            VisualInputGroup parent = null;
 | 
						|
            if (focusedItem.Parent is VisualInputGroup && !((VisualInputGroup)this.Parent).IsUserInput)
 | 
						|
            {
 | 
						|
                parent = (VisualInputGroup)this.Parent;
 | 
						|
                parent.IsUserInput = true;
 | 
						|
            }
 | 
						|
 | 
						|
            if (focusedItem is VisualNumericInput)
 | 
						|
                ((VisualNumericInput)focusedItem).DecreaseValue();
 | 
						|
            else if (focusedItem is VisualListInput)
 | 
						|
                ((VisualListInput)focusedItem).SelectNext();
 | 
						|
 | 
						|
            if (parent != null)
 | 
						|
                parent.IsUserInput = false;
 | 
						|
        }
 | 
						|
 | 
						|
        private void UpClickFocusedInputValue()
 | 
						|
        {
 | 
						|
            VisualItem focusedItem = GetAutoChangeItem();
 | 
						|
            if (focusedItem == null) return;
 | 
						|
 | 
						|
            VisualInputGroup parent=null;
 | 
						|
            if (focusedItem.Parent is VisualInputGroup && !((VisualInputGroup)this.Parent).IsUserInput)
 | 
						|
            {
 | 
						|
                parent = (VisualInputGroup)this.Parent;
 | 
						|
                parent.IsUserInput = true;
 | 
						|
            }
 | 
						|
 | 
						|
            if (focusedItem is VisualNumericInput)
 | 
						|
                ((VisualNumericInput)focusedItem).IncreaseValue();
 | 
						|
            else if (focusedItem is VisualListInput)
 | 
						|
                ((VisualListInput)focusedItem).SelectPrevious();
 | 
						|
 | 
						|
            if (parent != null)
 | 
						|
                parent.IsUserInput = false;
 | 
						|
        }
 | 
						|
 | 
						|
        private VisualItem GetAutoChangeItem()
 | 
						|
        {
 | 
						|
            if (_AutoChangeItem != null) return _AutoChangeItem;
 | 
						|
 | 
						|
            if (_AutoChange == eUpDownButtonAutoChange.None || this.Parent == null || !(this.Parent is VisualGroup))
 | 
						|
                return null;
 | 
						|
            VisualGroup group = this.Parent as VisualGroup;
 | 
						|
            if (_AutoChange == eUpDownButtonAutoChange.FocusedItem)
 | 
						|
            {
 | 
						|
                if (group.FocusedItem is VisualInputGroup)
 | 
						|
                {
 | 
						|
                    VisualInputGroup g = group.FocusedItem as VisualInputGroup;
 | 
						|
                    while (g.FocusedItem is VisualInputGroup)
 | 
						|
                        g = g.FocusedItem as VisualInputGroup;
 | 
						|
                    return g.FocusedItem;
 | 
						|
                }
 | 
						|
                if (!(group.FocusedItem is VisualInputBase))
 | 
						|
                {
 | 
						|
                    foreach (VisualItem item in group.Items)
 | 
						|
                    {
 | 
						|
                        if (item is VisualInputBase && item.Enabled && item.Visible && item.Focusable)
 | 
						|
                            return item;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
 | 
						|
                return group.FocusedItem;
 | 
						|
            }
 | 
						|
            int start = group.Items.IndexOf(this);
 | 
						|
            for (int i = start; i >= 0; i--)
 | 
						|
            {
 | 
						|
                VisualItem item = group.Items[i];
 | 
						|
                if (item is VisualInputBase && item.Visible)
 | 
						|
                    return item;
 | 
						|
            }
 | 
						|
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Raises the UpClick event.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="e">Provides event data.</param>
 | 
						|
        protected virtual void OnUpClick(EventArgs e)
 | 
						|
        {
 | 
						|
            if (UpClick != null)
 | 
						|
                UpClick(this, e);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Raises the DownClick event.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="e">Provides event data.</param>
 | 
						|
        protected virtual void OnDownClick(EventArgs e)
 | 
						|
        {
 | 
						|
            if (DownClick != null)
 | 
						|
                DownClick(this, e);
 | 
						|
        }
 | 
						|
 | 
						|
        private Image _UpImage = null;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the image displayed on the face of the button.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(null)]
 | 
						|
        public Image UpImage
 | 
						|
        {
 | 
						|
            get { return _UpImage; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_UpImage != value)
 | 
						|
                {
 | 
						|
                    _UpImage = value;
 | 
						|
                    this.InvalidateArrange();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private Image _DownImage = null;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the image displayed on the face of the button.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(null)]
 | 
						|
        public Image DownImage
 | 
						|
        {
 | 
						|
            get { return _DownImage; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_DownImage != value)
 | 
						|
                {
 | 
						|
                    _DownImage = value;
 | 
						|
                    this.InvalidateArrange();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						|
        public bool MouseOverButtonUp
 | 
						|
        {
 | 
						|
            get { return _MouseOverButtonUp; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_MouseOverButtonUp != value)
 | 
						|
                {
 | 
						|
                    _MouseOverButtonUp = value;
 | 
						|
                    this.InvalidateRender();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						|
        public bool MouseOverButtonDown
 | 
						|
        {
 | 
						|
            get { return _MouseOverButtonDown; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_MouseOverButtonDown != value)
 | 
						|
                {
 | 
						|
                    _MouseOverButtonDown = value;
 | 
						|
                    this.InvalidateRender();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						|
        public bool MouseDownButtonDown
 | 
						|
        {
 | 
						|
            get { return _MouseDownButtonDown; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_MouseDownButtonDown != value)
 | 
						|
                {
 | 
						|
                    _MouseDownButtonDown = value;
 | 
						|
                    this.InvalidateRender();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						|
        public bool MouseDownButtonUp
 | 
						|
        {
 | 
						|
            get { return _MouseDownButtonUp; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_MouseDownButtonUp != value)
 | 
						|
                {
 | 
						|
                    _MouseDownButtonUp = value;
 | 
						|
                    this.InvalidateRender();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private int _ButtonWidth = 15;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the default width of the buttons.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(15)]
 | 
						|
        public int ButtonWidth
 | 
						|
        {
 | 
						|
            get { return _ButtonWidth; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_ButtonWidth != value)
 | 
						|
                {
 | 
						|
                    _ButtonWidth = value;
 | 
						|
                    this.InvalidateArrange();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private eUpDownButtonAutoChange _AutoChange = eUpDownButtonAutoChange.None;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets whether control automatically tries to increase/decrease the value of the item that has input focus in the same
 | 
						|
        /// parent group as the button. Default value is false.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(eUpDownButtonAutoChange.None)]
 | 
						|
        public eUpDownButtonAutoChange AutoChange
 | 
						|
        {
 | 
						|
            get { return _AutoChange; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _AutoChange = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private VisualItem _AutoChangeItem;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the item that is automatically changed when buttons are pressed.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(null)]
 | 
						|
        public VisualItem AutoChangeItem
 | 
						|
        {
 | 
						|
            get { return _AutoChangeItem; }
 | 
						|
            set { _AutoChangeItem = value; }
 | 
						|
        }
 | 
						|
 | 
						|
        private bool RenderBackground(PaintInfo p)
 | 
						|
        {
 | 
						|
            if (RenderDefaultBackground) return true;
 | 
						|
 | 
						|
            if (!p.MouseOver && !(this.MouseDownButtonUp || this.MouseDownButtonDown) && !(this.MouseOverButtonUp || this.MouseOverButtonDown) || !this.GetIsEnabled())
 | 
						|
                return false;
 | 
						|
 | 
						|
            return true;
 | 
						|
        }
 | 
						|
 | 
						|
        protected virtual void PaintButtonBackground(PaintInfo p, Office2007ButtonItemStateColorTable ct, Rectangle r)
 | 
						|
        {
 | 
						|
            Graphics g = p.Graphics;
 | 
						|
            if(RenderBackground(p))
 | 
						|
                Office2007ButtonItemPainter.PaintBackground(g, ct, r, RoundRectangleShapeDescriptor.RectangleShape);
 | 
						|
        }
 | 
						|
 | 
						|
        protected Office2007ButtonItemStateColorTable GetOffice2007StateColorTableButtonUp(PaintInfo p)
 | 
						|
        {
 | 
						|
            if (GlobalManager.Renderer is Office2007Renderer)
 | 
						|
            {
 | 
						|
                Office2007ColorTable ct = ((Office2007Renderer)GlobalManager.Renderer).ColorTable;
 | 
						|
                Office2007ButtonItemColorTable buttonColorTable = ct.ButtonItemColors[Enum.GetName(typeof(eButtonColor), eButtonColor.OrangeWithBackground)];
 | 
						|
                if (!this.GetIsEnabled(p) || !_UpEnabled)
 | 
						|
                    return buttonColorTable.Disabled;
 | 
						|
                else if (this.MouseDownButtonUp)
 | 
						|
                    return buttonColorTable.Pressed;
 | 
						|
                else if (this.MouseOverButtonUp)
 | 
						|
                    return buttonColorTable.MouseOver;
 | 
						|
                else
 | 
						|
                    return buttonColorTable.Default;
 | 
						|
            }
 | 
						|
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
 | 
						|
        protected Office2007ButtonItemStateColorTable GetOffice2007StateColorTableButtonDown(PaintInfo p)
 | 
						|
        {
 | 
						|
            if (GlobalManager.Renderer is Office2007Renderer)
 | 
						|
            {
 | 
						|
                Office2007ColorTable ct = ((Office2007Renderer)GlobalManager.Renderer).ColorTable;
 | 
						|
                Office2007ButtonItemColorTable buttonColorTable = ct.ButtonItemColors[Enum.GetName(typeof(eButtonColor), eButtonColor.OrangeWithBackground)];
 | 
						|
                if (!this.GetIsEnabled(p) || !_DownEnabled)
 | 
						|
                    return buttonColorTable.Disabled;
 | 
						|
                else if (this.MouseDownButtonDown)
 | 
						|
                    return buttonColorTable.Pressed;
 | 
						|
                else if (this.MouseOverButtonDown)
 | 
						|
                    return buttonColorTable.MouseOver;
 | 
						|
                else
 | 
						|
                    return buttonColorTable.Default;
 | 
						|
            }
 | 
						|
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _UpEnabled = true;
 | 
						|
        [DefaultValue(true)]
 | 
						|
        public bool UpEnabled
 | 
						|
        {
 | 
						|
            get { return _UpEnabled; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_UpEnabled != value)
 | 
						|
                {
 | 
						|
                    _UpEnabled = value;
 | 
						|
                    this.InvalidateRender();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _DownEnabled = true;
 | 
						|
        [DefaultValue(true)]
 | 
						|
        public bool DownEnabled
 | 
						|
        {
 | 
						|
            get { return _DownEnabled; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_DownEnabled != value)
 | 
						|
                {
 | 
						|
                    _DownEnabled = value;
 | 
						|
                    this.InvalidateRender();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        #endregion
 | 
						|
 | 
						|
    }
 | 
						|
}
 | 
						|
#endif
 | 
						|
 |