517 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			517 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Text;
 | |
| using System.Drawing;
 | |
| using System.Drawing.Drawing2D;
 | |
| using System.ComponentModel;
 | |
| using DevComponents.DotNetBar.Rendering;
 | |
| 
 | |
| namespace DevComponents.DotNetBar
 | |
| {
 | |
|     public class DualButton : BaseItem
 | |
|     {
 | |
|         #region Constructor
 | |
|         /// <summary>
 | |
|         /// Initializes a new instance of the DualButton class.
 | |
|         /// </summary>
 | |
|         public DualButton()
 | |
|         {
 | |
|             RecreatePaths(_ButtonSize);
 | |
|         }
 | |
|         protected override void Dispose(bool disposing)
 | |
|         {
 | |
|             if (_TopPartPath != null)
 | |
|             {
 | |
|                 _TopPartPath.Dispose();
 | |
|                 _TopPartPath = null;
 | |
|             }
 | |
|             if (_BottomPartPath != null)
 | |
|             {
 | |
|                 _BottomPartPath.Dispose();
 | |
|                 _BottomPartPath = null;
 | |
|             }
 | |
| 
 | |
|             base.Dispose(disposing);
 | |
|         }
 | |
|         #endregion
 | |
| 
 | |
|         #region Implementation
 | |
|         public override BaseItem Copy()
 | |
|         {
 | |
|             DualButton button = new DualButton();
 | |
|             CopyToItem(button);
 | |
|             return button;
 | |
|         }
 | |
|         protected override void CopyToItem(BaseItem objCopy)
 | |
|         {
 | |
|             DualButton button = (DualButton)objCopy;
 | |
|             button.ButtonSize = _ButtonSize;
 | |
|             button.Text2 = _Text2;
 | |
|             base.CopyToItem(objCopy);
 | |
|         }
 | |
|         private Size _ButtonSize = new Size(38, 24);
 | |
|         public Size ButtonSize
 | |
|         {
 | |
|             get { return _ButtonSize; }
 | |
|             set
 | |
|             {
 | |
|                 if (value.IsEmpty)
 | |
|                     throw new ArgumentException("Empty size is not valid size");
 | |
|                 if (value.Width < 1 || value.Width < 1)
 | |
|                     throw new ArgumentException("Width or Height cannot be less than 1");
 | |
|                 if (value != _ButtonSize)
 | |
|                 {
 | |
|                     Size oldValue = _ButtonSize;
 | |
|                     _ButtonSize = value;
 | |
|                     OnButtonSizeChanged(oldValue, value);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         private void RecreatePaths(Size buttonSize)
 | |
|         {
 | |
|             if (_TopPartPath != null) _TopPartPath.Dispose();
 | |
|             if (_BottomPartPath != null) _BottomPartPath.Dispose();
 | |
|             _TopPartPath = new GraphicsPath();
 | |
|             _TopPartPath.AddLines(new PointF[] { new PointF(0, buttonSize.Height - 3), new PointF(0, 0), new PointF(buttonSize.Width - 2, 0) });
 | |
|             _TopPartPath.CloseAllFigures();
 | |
| 
 | |
|             _BottomPartPath = new GraphicsPath();
 | |
|             _BottomPartPath.AddLines(new PointF[] { new PointF(2, buttonSize.Height - 1), new PointF(buttonSize.Width - 1, buttonSize.Height - 1), new PointF(buttonSize.Width - 1, 2) });
 | |
|             _BottomPartPath.CloseAllFigures();
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// Called when ButtonSize property has changed.
 | |
|         /// </summary>
 | |
|         /// <param name="oldValue">Old property value</param>
 | |
|         /// <param name="newValue">New property value</param>
 | |
|         protected virtual void OnButtonSizeChanged(Size oldValue, Size newValue)
 | |
|         {
 | |
|             RecreatePaths(newValue);
 | |
|             //OnPropertyChanged(new PropertyChangedEventArgs("ButtonSize"));
 | |
|         }
 | |
|         private GraphicsPath _TopPartPath = null, _BottomPartPath = null;
 | |
| 
 | |
|         public override void RecalcSize()
 | |
|         {
 | |
|             m_Rect.Size = _ButtonSize;
 | |
|             base.RecalcSize();
 | |
|         }
 | |
| 
 | |
|         public override void Paint(ItemPaintArgs p)
 | |
|         {
 | |
|             Graphics g = p.Graphics;
 | |
|             Matrix oldMatrix = g.Transform;
 | |
|             g.TranslateTransform(m_Rect.X, m_Rect.Y, MatrixOrder.Append);
 | |
|             LinearGradientColorTable border = null, back = null, back2 = null;
 | |
|             Color textColor = Color.Empty;
 | |
| 
 | |
| 
 | |
| 
 | |
|             if (_TopPartPath != null)
 | |
|             {
 | |
|                 Office2007ButtonItemStateColorTable table = GetOffice2007StateColorTable(p, eDualButtonPart.Up);
 | |
|                 if (table != null)
 | |
|                 {
 | |
|                     if (table.Background != null)
 | |
|                         back = table.Background;
 | |
|                     else
 | |
|                     {
 | |
|                         back = table.TopBackground;
 | |
|                         back2 = table.BottomBackground;
 | |
|                     }
 | |
|                     border = table.OuterBorder;
 | |
|                     textColor = table.Text;
 | |
|                 }
 | |
|                 DrawBackground(g, _TopPartPath, border, back, back2);
 | |
|                 //g.FillPath(_LeftMouseButtonDown == eDualButtonPart.Up ? Brushes.Blue : (_MouseOverPart == eDualButtonPart.Up ? Brushes.Yellow : Brushes.Red), _TopPartPath);
 | |
|                 Rectangle textBounds = Rectangle.Round(_TopPartPath.GetBounds());
 | |
|                 textBounds.Offset(0, -1);
 | |
|                 textBounds.Width = textBounds.Width / 2;
 | |
|                 TextDrawing.DrawString(g, Text, _Font ?? p.Font, textColor, textBounds, eTextFormat.HorizontalCenter | eTextFormat.Top);
 | |
|             }
 | |
|             if (_BottomPartPath != null)
 | |
|             {
 | |
|                 Office2007ButtonItemStateColorTable table = GetOffice2007StateColorTable(p, eDualButtonPart.Down);
 | |
|                 back2 = null;
 | |
|                 if (table != null)
 | |
|                 {
 | |
|                     if (table.Background != null)
 | |
|                         back = table.Background;
 | |
|                     else
 | |
|                     {
 | |
|                         back = table.TopBackground;
 | |
|                         back2 = table.BottomBackground;
 | |
|                     }
 | |
|                     border = table.OuterBorder;
 | |
|                     textColor = table.Text;
 | |
|                 }
 | |
|                 DrawBackground(g, _BottomPartPath, border, back, back2);
 | |
|                 //g.FillPath(_LeftMouseButtonDown == eDualButtonPart.Down ? Brushes.Blue : (_MouseOverPart == eDualButtonPart.Down ? Brushes.Yellow : Brushes.Green), _BottomPartPath);
 | |
|                 Rectangle textBounds = Rectangle.Round(_BottomPartPath.GetBounds());
 | |
|                 textBounds.Offset(textBounds.Width / 2, 1);
 | |
|                 textBounds.Width = textBounds.Width / 2;
 | |
|                 TextDrawing.DrawString(g, Text2, _Font ?? p.Font, textColor, textBounds, eTextFormat.HorizontalCenter | eTextFormat.Bottom);
 | |
|             }
 | |
|             g.Transform = oldMatrix;
 | |
| 
 | |
|         }
 | |
| 
 | |
|         private Office2007ButtonItemStateColorTable GetOffice2007StateColorTable(ItemPaintArgs p, eDualButtonPart part)
 | |
|         {
 | |
|             if (BarFunctions.IsOffice2007Style(EffectiveStyle))
 | |
|             {
 | |
|                 if (p.Renderer is Office2007Renderer)
 | |
|                 {
 | |
|                     Office2007ColorTable ct = ((Office2007Renderer)p.Renderer).ColorTable;
 | |
|                     Office2007ButtonItemColorTable buttonColorTable = ct.ButtonItemColors[Enum.GetName(typeof(eButtonColor), eButtonColor.OrangeWithBackground)];
 | |
|                     if (!this.Enabled)
 | |
|                         return buttonColorTable.Disabled;
 | |
|                     else if (_LeftMouseButtonDown == part)
 | |
|                         return buttonColorTable.Pressed;
 | |
|                     else if (_MouseOverPart == part)
 | |
|                         return buttonColorTable.MouseOver;
 | |
|                     else if (this.IsSelected == part)
 | |
|                         return buttonColorTable.Checked;
 | |
|                     else
 | |
|                         return buttonColorTable.Default;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             return null;
 | |
|         }
 | |
| 
 | |
|         private void DrawBackground(Graphics g, GraphicsPath path, LinearGradientColorTable border, LinearGradientColorTable back, LinearGradientColorTable back2)
 | |
|         {
 | |
|             if (back != null && !back.IsEmpty)
 | |
|             {
 | |
|                 if (back2 != null && !back2.IsEmpty)
 | |
|                 {
 | |
|                     using (LinearGradientBrush brush = new LinearGradientBrush(path.GetBounds(), back.Start, back2.End, 90))
 | |
|                     {
 | |
|                         ColorBlend cb = new ColorBlend(4);
 | |
|                         cb.Colors = new Color[] { back.Start, back.End, back2.Start, back2.End };
 | |
|                         cb.Positions = new float[] { 0f, .5f, .5f, 1f };
 | |
|                         brush.InterpolationColors = cb;
 | |
|                         g.FillPath(brush, path);
 | |
|                     }
 | |
|                 }
 | |
|                 else
 | |
|                     DisplayHelp.FillPath(g, path, back);
 | |
|             }
 | |
|             if (border != null && !border.IsEmpty)
 | |
|             {
 | |
|                 using (Brush brush = DisplayHelp.CreateBrush(Rectangle.Round(path.GetBounds()), border))
 | |
|                 {
 | |
|                     using (Pen pen = new Pen(brush, 1))
 | |
|                         g.DrawPath(pen, path);
 | |
|                 }
 | |
|                 //DisplayHelp.DrawGradientPathBorder(g, path, border, 1);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public override void InternalMouseDown(System.Windows.Forms.MouseEventArgs objArg)
 | |
|         {
 | |
|             if (objArg.Button == System.Windows.Forms.MouseButtons.Left)
 | |
|             {
 | |
|                 this.LeftMouseButtonDown = HitTest(objArg.X, objArg.Y);
 | |
|             }
 | |
|             base.InternalMouseDown(objArg);
 | |
|         }
 | |
| 
 | |
|         public override void InternalMouseUp(System.Windows.Forms.MouseEventArgs objArg)
 | |
|         {
 | |
|             if (objArg.Button == System.Windows.Forms.MouseButtons.Left)
 | |
|             {
 | |
|                 if (LeftMouseButtonDown != eDualButtonPart.None && MouseOverPart == LeftMouseButtonDown)
 | |
|                 {
 | |
|                     if (LeftMouseButtonDown == eDualButtonPart.Up)
 | |
|                         ExecuteCommand();
 | |
|                     else
 | |
|                         ExecuteCommand2();
 | |
|                 }
 | |
|                 LeftMouseButtonDown = eDualButtonPart.None;
 | |
|             }
 | |
|             base.InternalMouseUp(objArg);
 | |
|         }
 | |
| 
 | |
|         public override void InternalMouseMove(System.Windows.Forms.MouseEventArgs objArg)
 | |
|         {
 | |
|             this.MouseOverPart = HitTest(objArg.X, objArg.Y);
 | |
|             //if (objArg.Button == System.Windows.Forms.MouseButtons.Left && LeftMouseButtonDownPart == eDualButtonPart.None && _MouseOverPart != eDualButtonPart.None)
 | |
|             //    LeftMouseButtonDownPart = _MouseOverPart;
 | |
|             if (_LeftMouseButtonDown != eDualButtonPart.None && _MouseOverPart != _LeftMouseButtonDown)
 | |
|                 LeftMouseButtonDown = eDualButtonPart.None;
 | |
|             base.InternalMouseMove(objArg);
 | |
|         }
 | |
| 
 | |
|         public eDualButtonPart HitTest(Point clientPoint)
 | |
|         {
 | |
|             return HitTest(clientPoint.X, clientPoint.Y);
 | |
|         }
 | |
|         public eDualButtonPart HitTest(int x, int y)
 | |
|         {
 | |
|             Point p = new Point(x - m_Rect.X, y - m_Rect.Y);
 | |
|             if (_TopPartPath.IsVisible(p))
 | |
|                 return eDualButtonPart.Up;
 | |
|             else if (_BottomPartPath.IsVisible(p))
 | |
|                 return eDualButtonPart.Down;
 | |
| 
 | |
|             return eDualButtonPart.None;
 | |
|         }
 | |
| 
 | |
|         public override void InternalMouseLeave()
 | |
|         {
 | |
|             this.MouseOverPart = eDualButtonPart.None;
 | |
|             LeftMouseButtonDown = eDualButtonPart.None;
 | |
|             base.InternalMouseLeave();
 | |
|         }
 | |
| 
 | |
|         private string _Text2 = string.Empty;
 | |
|         /// <summary>
 | |
|         /// Gets or sets the second button part text.
 | |
|         /// </summary>
 | |
|         [DefaultValue(""), Category("Appearance"), Description("Indicates second button part text."), Localizable(true)]
 | |
|         public string Text2
 | |
|         {
 | |
|             get { return _Text2; }
 | |
|             set
 | |
|             {
 | |
|                 if (value == null) value = string.Empty;
 | |
|                 if (value != _Text2)
 | |
|                 {
 | |
|                     string oldValue = _Text2;
 | |
|                     _Text2 = value;
 | |
|                     OnText2Changed(oldValue, value);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// Called when Text2 property has changed.
 | |
|         /// </summary>
 | |
|         /// <param name="oldValue">Old property value</param>
 | |
|         /// <param name="newValue">New property value</param>
 | |
|         protected virtual void OnText2Changed(string oldValue, string newValue)
 | |
|         {
 | |
|             //OnPropertyChanged(new PropertyChangedEventArgs("Text2"));
 | |
|             this.Refresh();
 | |
|         }
 | |
| 
 | |
|         private eDualButtonPart _MouseOverPart;
 | |
|         public eDualButtonPart MouseOverPart
 | |
|         {
 | |
|             get { return _MouseOverPart; }
 | |
|             private set
 | |
|             {
 | |
|                 if (value != _MouseOverPart)
 | |
|                 {
 | |
|                     eDualButtonPart oldValue = _MouseOverPart;
 | |
|                     _MouseOverPart = value;
 | |
|                     OnMouseOverPartChanged(oldValue, value);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// Called when MouseOverPart property has changed.
 | |
|         /// </summary>
 | |
|         /// <param name="oldValue">Old property value</param>
 | |
|         /// <param name="newValue">New property value</param>
 | |
|         protected virtual void OnMouseOverPartChanged(eDualButtonPart oldValue, eDualButtonPart newValue)
 | |
|         {
 | |
|             //OnPropertyChanged(new PropertyChangedEventArgs("MouseOverPart"));
 | |
|             this.Refresh();
 | |
|         }
 | |
| 
 | |
|         private eDualButtonPart _LeftMouseButtonDown = eDualButtonPart.None;
 | |
|         public eDualButtonPart LeftMouseButtonDown
 | |
|         {
 | |
|             get { return _LeftMouseButtonDown; }
 | |
|             private set
 | |
|             {
 | |
|                 if (value != _LeftMouseButtonDown)
 | |
|                 {
 | |
|                     eDualButtonPart oldValue = _LeftMouseButtonDown;
 | |
|                     _LeftMouseButtonDown = value;
 | |
|                     OnLeftMouseButtonDownChanged(oldValue, value);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// Called when LeftMouseButtonDownPart property has changed.
 | |
|         /// </summary>
 | |
|         /// <param name="oldValue">Old property value</param>
 | |
|         /// <param name="newValue">New property value</param>
 | |
|         protected virtual void OnLeftMouseButtonDownChanged(eDualButtonPart oldValue, eDualButtonPart newValue)
 | |
|         {
 | |
|             //OnPropertyChanged(new PropertyChangedEventArgs("LeftMouseButtonDownPart"));
 | |
|             this.Refresh();
 | |
|         }
 | |
| 
 | |
|         protected virtual void ExecuteCommand2()
 | |
|         {
 | |
|             if (_Command2 == null) return;
 | |
|             CommandManager.ExecuteCommand(new ExtraCommandSource(_Command2, _Command2Parameter));
 | |
|         }
 | |
| 
 | |
|         internal void ExecuteCommand2Internal()
 | |
|         {
 | |
|             ExecuteCommand2();
 | |
|         }
 | |
| 
 | |
|         private ICommand _Command2 = null;
 | |
|         /// <summary>
 | |
|         /// Gets or sets the command assigned to the item. Default value is null.
 | |
|         /// <remarks>Note that for ButtonItem instances if this property is set to null and command was assigned previously, Enabled property will be set to false automatically to disable the item.</remarks>
 | |
|         /// </summary>
 | |
|         [DefaultValue(null), Category("Commands"), Description("Indicates the command assigned to the item.")]
 | |
|         public virtual ICommand Command2
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return _Command2;
 | |
|             }
 | |
|             set
 | |
|             {
 | |
|                 bool changed = false;
 | |
|                 if (_Command2 != value)
 | |
|                     changed = true;
 | |
| 
 | |
|                 if (_Command2 != null)
 | |
|                     CommandManager.UnRegisterCommandSource(this, _Command2);
 | |
|                 _Command2 = value;
 | |
|                 if (value != null)
 | |
|                     CommandManager.RegisterCommand(this, value);
 | |
|                 if (changed)
 | |
|                     OnCommand2Changed();
 | |
|             }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// Called when Command property value changes.
 | |
|         /// </summary>
 | |
|         protected virtual void OnCommand2Changed()
 | |
|         {
 | |
|         }
 | |
| 
 | |
|         private object _Command2Parameter = null;
 | |
|         /// <summary>
 | |
|         /// Gets or sets user defined data value that can be passed to the command when it is executed.
 | |
|         /// </summary>
 | |
|         [Browsable(true), DefaultValue(null), Category("Commands"), Description("Indicates user defined data value that can be passed to the command when it is executed."), System.ComponentModel.TypeConverter(typeof(System.ComponentModel.StringConverter)), System.ComponentModel.Localizable(true)]
 | |
|         public virtual object Command2Parameter
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return _Command2Parameter;
 | |
|             }
 | |
|             set
 | |
|             {
 | |
|                 _Command2Parameter = value;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private eDualButtonPart _IsSelected = eDualButtonPart.None;
 | |
|         /// <summary>
 | |
|         /// Gets or sets the selected part of button.
 | |
|         /// </summary>
 | |
|         [DefaultValue(eDualButtonPart.None), Category("Behavior"), Description("Indicates selected part of button.")]
 | |
|         public eDualButtonPart IsSelected
 | |
|         {
 | |
|             get { return _IsSelected; }
 | |
|             set
 | |
|             {
 | |
|                 if (value != _IsSelected)
 | |
|                 {
 | |
|                     eDualButtonPart oldValue = _IsSelected;
 | |
|                     _IsSelected = value;
 | |
|                     OnIsSelectedChanged(oldValue, value);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// Called when IsSelected property has changed.
 | |
|         /// </summary>
 | |
|         /// <param name="oldValue">Old property value</param>
 | |
|         /// <param name="newValue">New property value</param>
 | |
|         protected virtual void OnIsSelectedChanged(eDualButtonPart oldValue, eDualButtonPart newValue)
 | |
|         {
 | |
|             //OnPropertyChanged(new PropertyChangedEventArgs("IsSelected"));
 | |
| 
 | |
|         }
 | |
| 
 | |
|         private Font _Font = null;
 | |
|         /// <summary>
 | |
|         /// Gets or sets the text font.
 | |
|         /// </summary>
 | |
|         [DefaultValue(null), Category("Appearance"), Description("Gets or sets the text font.")]
 | |
|         public Font Font
 | |
|         {
 | |
|             get { return _Font; }
 | |
|             set
 | |
|             {
 | |
|                 if (value != _Font)
 | |
|                 {
 | |
|                     Font oldValue = _Font;
 | |
|                     _Font = value;
 | |
|                     OnFontChanged(oldValue, value);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// Called when Font property has changed.
 | |
|         /// </summary>
 | |
|         /// <param name="oldValue">Old property value</param>
 | |
|         /// <param name="newValue">New property value</param>
 | |
|         protected virtual void OnFontChanged(Font oldValue, Font newValue)
 | |
|         {
 | |
|             //OnPropertyChanged(new PropertyChangedEventArgs("Font"));
 | |
|             
 | |
|         }
 | |
|         #endregion
 | |
| 
 | |
|         #region ExtraCommandSource
 | |
|         public class ExtraCommandSource : ICommandSource
 | |
|         {
 | |
|             public ExtraCommandSource(ICommand command, object commandParam)
 | |
|             {
 | |
|                 _Command = command;
 | |
|                 _CommandParameter = commandParam;
 | |
|             }
 | |
| 
 | |
|             #region ICommandSource Members
 | |
|             private ICommand _Command;
 | |
|             public ICommand Command
 | |
|             {
 | |
|                 get
 | |
|                 {
 | |
|                     return _Command;
 | |
|                 }
 | |
|                 set
 | |
|                 {
 | |
|                     _Command = value;
 | |
|                 }
 | |
|             }
 | |
|             private object _CommandParameter = null;
 | |
|             public object CommandParameter
 | |
|             {
 | |
|                 get
 | |
|                 {
 | |
|                     return _CommandParameter;
 | |
|                 }
 | |
|                 set
 | |
|                 {
 | |
|                     _CommandParameter = value;
 | |
|                 }
 | |
|             }
 | |
|             #endregion
 | |
| 
 | |
|             #endregion
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public enum eDualButtonPart
 | |
|     {
 | |
|         None,
 | |
|         Up,
 | |
|         Down
 | |
|     }
 | |
| }
 |