1309 lines
		
	
	
		
			50 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			1309 lines
		
	
	
		
			50 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Text;
 | |
| using System.Windows.Forms;
 | |
| using System.ComponentModel;
 | |
| using DevComponents.DotNetBar.Rendering;
 | |
| using System.Drawing;
 | |
| using DevComponents.DotNetBar.TextMarkup;
 | |
| using System.Reflection;
 | |
| using DevComponents.Editors;
 | |
| using System.Collections;
 | |
| 
 | |
| namespace DevComponents.DotNetBar.Controls
 | |
| {
 | |
|     [ToolboxBitmap(typeof(TextBoxX), "Controls.TextBoxX.ico"), ToolboxItem(true), Designer("DevComponents.DotNetBar.Design.TextBoxXDesigner, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf")]
 | |
|     public class TextBoxX : TextBox, INonClientControl
 | |
| #if FRAMEWORK20
 | |
| , IInputButtonControl
 | |
| #endif
 | |
|     {
 | |
|         #region Private Variables
 | |
|         private NonClientPaintHandler m_NCPainter = null;
 | |
|         private string m_WatermarkText = "";
 | |
|         private bool m_Focused = false;
 | |
|         private Font m_WatermarkFont = null;
 | |
|         private Color m_WatermarkColor = SystemColors.GrayText;
 | |
|         private ElementStyle m_BorderStyle = null;
 | |
|         private IntPtr m_LastFocusWindow;
 | |
|         private string m_OriginalText;
 | |
|         private bool m_IsTextBoxItem = false;
 | |
|         private Color m_FocusHighlightColor = ColorScheme.GetColor(0xFFFF88);
 | |
|         private bool m_FocusHighlightEnabled = false;
 | |
|         private Color m_LastBackColor = Color.Empty;
 | |
|         #endregion
 | |
| 
 | |
|         #region Events
 | |
| #if FRAMEWORK20
 | |
|         /// <summary>
 | |
|         /// Occurs when ButtonCustom control is clicked.
 | |
|         /// </summary>
 | |
|         public event EventHandler ButtonCustomClick;
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Occurs when ButtonCustom2 control is clicked.
 | |
|         /// </summary>
 | |
|         public event EventHandler ButtonCustom2Click;
 | |
| #endif
 | |
|         #endregion
 | |
| 
 | |
|         #region Constructor
 | |
|         public TextBoxX()
 | |
|         {
 | |
| #if FRAMEWORK20
 | |
|             _ButtonCustom = new InputButtonSettings(this);
 | |
|             _ButtonCustom2 = new InputButtonSettings(this);
 | |
|             CreateButtonGroup();
 | |
| #endif
 | |
| 
 | |
|             m_BorderStyle = new ElementStyle();
 | |
|             m_BorderStyle.StyleChanged += new EventHandler(BorderStyle_StyleChanged);
 | |
|             m_NCPainter = new NonClientPaintHandler(this, eScrollBarSkin.Optimized);
 | |
|             base.BorderStyle = BorderStyle.None;
 | |
|             this.AutoSize = false;
 | |
|             StyleManager.Register(this);
 | |
|         }
 | |
| 
 | |
|         /// <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)
 | |
|         {
 | |
|             // Metro needs BackColor and ForeColor set
 | |
|             if (StyleManager.IsMetro(newStyle) || StyleManager.IsMetro(StyleManager.PreviousStyle) && !StyleManager.IsMetro(newStyle))
 | |
|                 StyleManager.UpdateAmbientColors(this);
 | |
|             UpdateEnabledBackColor();
 | |
|         }
 | |
| 
 | |
|         internal TextBoxX(bool isTextBoxItem)
 | |
|             : this()
 | |
|         {
 | |
|             m_IsTextBoxItem = isTextBoxItem;
 | |
|         }
 | |
| 
 | |
|         protected override void Dispose(bool disposing)
 | |
|         {
 | |
|             if (m_NCPainter != null)
 | |
|             {
 | |
|                 m_NCPainter.Dispose();
 | |
|                 //m_NCPainter = null;
 | |
|             }
 | |
|             if (m_BorderStyle != null) m_BorderStyle.StyleChanged -= new EventHandler(BorderStyle_StyleChanged);
 | |
|             StyleManager.Unregister(this);
 | |
|             base.Dispose(disposing);
 | |
|         }
 | |
|         #endregion
 | |
| 
 | |
|         #region Windows Messages Handling
 | |
|         private bool m_IgnoreFocus = false;
 | |
|         private bool _MouseOverButtons = false;
 | |
|         protected override void WndProc(ref Message m)
 | |
|         {
 | |
|             if (this.IsDisposed)
 | |
|             {
 | |
|                 base.WndProc(ref m);
 | |
|                 return;
 | |
|             }
 | |
|             if (m_NCPainter != null)
 | |
|             {
 | |
|                 bool callBase = m_NCPainter.WndProc(ref m);
 | |
| 
 | |
|                 if (callBase)
 | |
|                     base.WndProc(ref m);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 base.WndProc(ref m);
 | |
|             }
 | |
| 
 | |
| #if FRAMEWORK20
 | |
|             if (RenderButtons)
 | |
|             {
 | |
|                 switch (m.Msg)
 | |
|                 {
 | |
|                     case (int)WinApi.WindowsMessages.WM_NCMOUSEMOVE:
 | |
|                     case (int)WinApi.WindowsMessages.WM_NCHITTEST:
 | |
|                         {
 | |
|                             Point p = PointToClient(new Point(WinApi.LOWORD(m.LParam), WinApi.HIWORD(m.LParam)));
 | |
|                             if (_ButtonGroup.RenderBounds.Contains(p))
 | |
|                             {
 | |
|                                 m.Result = new IntPtr((int)WinApi.WindowHitTestRegions.ClientArea);
 | |
|                                 return;
 | |
|                             }
 | |
|                             break;
 | |
|                         }
 | |
|                 }
 | |
|             }
 | |
| #endif
 | |
| 
 | |
|             switch (m.Msg)
 | |
|             {
 | |
|                 case (int)WinApi.WindowsMessages.WM_SETFOCUS:
 | |
|                     {
 | |
|                         if (m_IgnoreFocus)
 | |
|                         {
 | |
|                             m_IgnoreFocus = false;
 | |
|                         }
 | |
|                         else
 | |
|                         {
 | |
|                             m_Focused = true;
 | |
|                             m_LastFocusWindow = m.WParam;
 | |
|                             m_OriginalText = this.Text;
 | |
|                             if (this.FocusHighlightEnabled && this.Enabled)
 | |
|                             {
 | |
|                                 m_LastBackColor = this.BackColor;
 | |
|                                 this.BackColor = this.FocusHighlightColor;
 | |
|                                 this.InvalidateNonClient();
 | |
|                             }
 | |
|                         }
 | |
|                         break;
 | |
|                     }
 | |
|                 case (int)WinApi.WindowsMessages.WM_KILLFOCUS:
 | |
|                     {
 | |
|                         if (!m_Focused)
 | |
|                         {
 | |
|                             m_IgnoreFocus = true;
 | |
|                         }
 | |
|                         else
 | |
|                         {
 | |
|                             m_Focused = false;
 | |
|                             if (this.Text.Length == 0)
 | |
|                                 this.Invalidate();
 | |
|                             if (this.FocusHighlightEnabled && !m_LastBackColor.IsEmpty)
 | |
|                             {
 | |
|                                 this.BackColor = m_LastBackColor;
 | |
|                                 this.InvalidateNonClient();
 | |
|                             }
 | |
|                         }
 | |
|                         break;
 | |
|                     }
 | |
|                 case (int)WinApi.WindowsMessages.WM_PAINT:
 | |
|                     {
 | |
|                         if (RenderWatermark)
 | |
|                             DrawWatermark();
 | |
|                         if (this.Parent is ItemControl)
 | |
|                             ((ItemControl)this.Parent).UpdateKeyTipsCanvas();
 | |
|                         break;
 | |
|                     }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private bool RenderWatermark
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 if (!_WatermarkEnabled)
 | |
|                     return false;
 | |
|                 if (_WatermarkBehavior == eWatermarkBehavior.HideOnFocus)
 | |
|                     return !m_Focused && this.Enabled && this.Text != null && this.Text.Length == 0 && (m_WatermarkText.Length > 0 || _WatermarkImage != null);
 | |
|                 else
 | |
|                     return this.Enabled && this.Text != null && this.Text.Length == 0 && (m_WatermarkText.Length > 0 || _WatermarkImage != null);
 | |
|             }
 | |
|         }
 | |
|         #endregion
 | |
| 
 | |
|         #region Internal Implementation
 | |
| 
 | |
|         private bool _IsEnterInputKey = false;
 | |
|         /// <summary>
 | |
|         /// Indicates whether internal override for IsInputKey returns true for the Enter key.
 | |
|         /// </summary>
 | |
|         [DefaultValue(false), Category("Behavior"), Description("Indicates whether internal override for IsInputKey returns true for the Enter key.")]
 | |
|         public bool IsEnterInputKey
 | |
|         {
 | |
|             get { return _IsEnterInputKey; }
 | |
|             set { _IsEnterInputKey = value; }
 | |
|         }
 | |
| 
 | |
|         protected override bool IsInputKey(Keys keyData)
 | |
|         {
 | |
|             if (keyData == Keys.Enter && _IsEnterInputKey)
 | |
|                 return true;
 | |
|             return base.IsInputKey(keyData);
 | |
|         }
 | |
| 
 | |
|         private bool _AutoSelectAll = false;
 | |
|         /// <summary>
 | |
|         /// Indicates whether all text is auto-selected when control gets input focus. Default value is false.
 | |
|         /// </summary>
 | |
|         [DefaultValue(false), Category("Behavior"), Description("Indicates whether all text is auto-selected when control gets input focus.")]
 | |
|         public bool AutoSelectAll
 | |
|         {
 | |
|             get { return _AutoSelectAll; }
 | |
|             set { _AutoSelectAll = value; }
 | |
|         }
 | |
|         protected override void OnKeyPress(KeyPressEventArgs e)
 | |
|         {
 | |
|             _ButtonGroup.ProcessKeyPress(e);
 | |
|             if (!this.Multiline && _PreventEnterBeep && e.KeyChar == (char)Keys.Enter)
 | |
|             {
 | |
|                 e.Handled = true;
 | |
|             }
 | |
|             base.OnKeyPress(e);
 | |
|         }
 | |
| 
 | |
|         private bool _PreventEnterBeep = false;
 | |
|         /// <summary>
 | |
|         /// Gets or sets whether control prevents Beep sound when Enter key is pressed.
 | |
|         /// </summary>
 | |
|         [DefaultValue(false), Category("Behavior"), Description("Gets or sets whether control prevents Beep sound when Enter key is pressed.")]
 | |
|         public bool PreventEnterBeep
 | |
|         {
 | |
|             get { return _PreventEnterBeep; }
 | |
|             set
 | |
|             {
 | |
|                 _PreventEnterBeep = value;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets whether FocusHighlightColor is used as background color to highlight text box when it has input focus. Default value is false.
 | |
|         /// </summary>
 | |
|         [DefaultValue(false), Browsable(true), Category("Appearance"), Description("Indicates whether FocusHighlightColor is used as background color to highlight text box when it has input focus.")]
 | |
|         public bool FocusHighlightEnabled
 | |
|         {
 | |
|             get { return m_FocusHighlightEnabled; }
 | |
|             set
 | |
|             {
 | |
|                 if (m_FocusHighlightEnabled != value)
 | |
|                 {
 | |
|                     m_FocusHighlightEnabled = value;
 | |
|                     if (this.Focused)
 | |
|                         this.Invalidate();
 | |
|                     if (!m_FocusHighlightEnabled)
 | |
|                         this.ResetBackColor();
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets the color used as background color to highlight text box when it has input focus and focus highlight is enabled.
 | |
|         /// </summary>
 | |
|         [Browsable(true), Category("Appearance"), Description("Indicates color used as background color to highlight text box when it has input focus and focus highlight is enabled.")]
 | |
|         public Color FocusHighlightColor
 | |
|         {
 | |
|             get { return m_FocusHighlightColor; }
 | |
|             set
 | |
|             {
 | |
|                 if (m_FocusHighlightColor != value)
 | |
|                 {
 | |
|                     m_FocusHighlightColor = value;
 | |
|                     if (this.Focused)
 | |
|                         this.Invalidate();
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
 | |
|         public bool ShouldSerializeFocusHighlightColor()
 | |
|         {
 | |
|             return !m_FocusHighlightColor.Equals(ColorScheme.GetColor(0xFFFF88));
 | |
|         }
 | |
| 
 | |
|         [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
 | |
|         public void ResetFocusHighlightColor()
 | |
|         {
 | |
|             FocusHighlightColor = ColorScheme.GetColor(0xFFFF88);
 | |
|         }
 | |
| 
 | |
|         internal void ReleaseFocus()
 | |
|         {
 | |
|             if (this.Focused && m_LastFocusWindow != IntPtr.Zero)
 | |
|             {
 | |
|                 IntPtr focus = m_LastFocusWindow;
 | |
|                 m_LastFocusWindow = IntPtr.Zero;
 | |
|                 Control ctrl = Control.FromChildHandle(focus);
 | |
|                 if (ctrl != this)
 | |
|                 {
 | |
|                     Control p = this.Parent;
 | |
|                     while (p != null)
 | |
|                     {
 | |
|                         if (p == ctrl)
 | |
|                         {
 | |
|                             if (ctrl is MenuPanel)
 | |
|                                 ctrl.Focus();
 | |
|                             return;
 | |
|                         }
 | |
|                         p = p.Parent;
 | |
|                     }
 | |
| 
 | |
|                     if (ctrl != null)
 | |
|                         ctrl.Focus();
 | |
|                     else
 | |
|                     {
 | |
|                         NativeFunctions.SetFocus(focus);
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         protected override void OnKeyUp(KeyEventArgs e)
 | |
|         {
 | |
|             _ButtonGroup.ProcessKeyUp(e);
 | |
|             base.OnKeyUp(e);
 | |
|         }
 | |
| 
 | |
|         protected override void OnKeyDown(KeyEventArgs e)
 | |
|         {
 | |
|             _ButtonGroup.ProcessKeyDown(e);
 | |
| 
 | |
|             base.OnKeyDown(e);
 | |
|             if (m_IsTextBoxItem)
 | |
|             {
 | |
|                 /*if (e.KeyCode == Keys.Enter)
 | |
|                     ReleaseFocus();
 | |
|                 else*/
 | |
|                 if (!e.Handled && e.KeyCode == Keys.Escape)
 | |
|                 {
 | |
|                     this.Text = m_OriginalText;
 | |
|                     this.SelectionStart = 0;
 | |
|                     ReleaseFocus();
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Occurs during preprocessing to handle command keys. Command keys are keys that always take precedence over regular input keys. Examples of command keys include accelerators and menu shortcuts. Set Handled=true to indicate that you handled the key and that it should not be passed for further processing.
 | |
|         /// </summary>
 | |
|         [Description("Occurs during preprocessing to handle command keys. Command keys are keys that always take precedence over regular input keys. Examples of command keys include accelerators and menu shortcuts. Set Handled=true to indicate that you handled the key and that it should not be passed for further processing.")]
 | |
|         public event KeyEventHandler CommandKeyDown;
 | |
|         /// <summary>
 | |
|         /// Raises CommandKeyDown event.
 | |
|         /// </summary>
 | |
|         /// <param name="e">Provides event arguments.</param>
 | |
|         protected virtual void OnCommandKeyDown(KeyEventArgs e)
 | |
|         {
 | |
|             KeyEventHandler handler = CommandKeyDown;
 | |
|             if (handler != null)
 | |
|                 handler(this, e);
 | |
|         }
 | |
| 
 | |
|         protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
 | |
|         {
 | |
|             if ((keyData & Keys.A) == Keys.A && Control.ModifierKeys == Keys.ControlKey)
 | |
|             {
 | |
|                 this.SelectAll();
 | |
|                 return true;
 | |
|             }
 | |
|             if (_ButtonGroup.ProcessCmdKey(ref msg, keyData))
 | |
|                 return true;
 | |
|             if (CommandKeyDown != null)
 | |
|             {
 | |
|                 KeyEventArgs args = new KeyEventArgs(keyData);
 | |
|                 OnCommandKeyDown(args);
 | |
|                 if (args.Handled) return true;
 | |
|             }
 | |
|             return base.ProcessCmdKey(ref msg, keyData);
 | |
|         }
 | |
| 
 | |
|         protected override void OnGotFocus(EventArgs e)
 | |
|         {
 | |
|             if (_AutoSelectAll)
 | |
|                 this.SelectAll();
 | |
|             base.OnGotFocus(e);
 | |
|         }
 | |
| 
 | |
|         protected override void OnLostFocus(EventArgs e)
 | |
|         {
 | |
|             m_LastFocusWindow = IntPtr.Zero;
 | |
|             base.OnLostFocus(e);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets the scrollbar skinning type when control is using Office 2007 style.
 | |
|         /// </summary>
 | |
|         [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | |
|         public eScrollBarSkin ScrollbarSkin
 | |
|         {
 | |
|             get { return m_NCPainter.SkinScrollbars; }
 | |
|             set { m_NCPainter.SkinScrollbars = value; }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Specifies the control border style. Default value has Class property set so the system style for the control is used.
 | |
|         /// </summary>
 | |
|         [Browsable(true), Category("Style"), Description("Specifies the control border style. Default value has Class property set so the system style for the control is used."), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
 | |
|         public ElementStyle Border
 | |
|         {
 | |
|             get { return m_BorderStyle; }
 | |
|         }
 | |
| 
 | |
|         private void BorderStyle_StyleChanged(object sender, EventArgs e)
 | |
|         {
 | |
|             InvalidateNonClient();
 | |
|         }
 | |
| 
 | |
|         protected override void OnReadOnlyChanged(EventArgs e)
 | |
|         {
 | |
|             InvalidateNonClient();
 | |
|             base.OnReadOnlyChanged(e);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Invalidates non-client area of the text box as response to the border changes.
 | |
|         /// </summary>
 | |
|         public void InvalidateNonClient()
 | |
|         {
 | |
|             if (!BarFunctions.IsHandleValid(this)) return;
 | |
|             NativeFunctions.SetWindowPos(this.Handle, IntPtr.Zero, 0, 0, 0, 0, NativeFunctions.SWP_FRAMECHANGED |
 | |
|                                 NativeFunctions.SWP_NOACTIVATE | NativeFunctions.SWP_NOMOVE | NativeFunctions.SWP_NOSIZE | NativeFunctions.SWP_NOZORDER);
 | |
|             SetAutoHeight();
 | |
|             const int RDW_INVALIDATE = 0x0001;
 | |
|             const int RDW_FRAME = 0x0400;
 | |
|             NativeFunctions.RECT r = new NativeFunctions.RECT(0, 0, this.Width, this.Height);
 | |
|             NativeFunctions.RedrawWindow(this.Handle, ref r, IntPtr.Zero, RDW_INVALIDATE | RDW_FRAME);
 | |
|         }
 | |
| 
 | |
|         private TextMarkup.BodyElement m_TextMarkup = null;
 | |
|         private void MarkupTextChanged()
 | |
|         {
 | |
|             m_TextMarkup = null;
 | |
| 
 | |
|             if (!TextMarkup.MarkupParser.IsMarkup(ref m_WatermarkText))
 | |
|                 return;
 | |
| 
 | |
|             m_TextMarkup = TextMarkup.MarkupParser.Parse(m_WatermarkText);
 | |
|             ResizeMarkup();
 | |
|         }
 | |
| 
 | |
|         private void ResizeMarkup()
 | |
|         {
 | |
|             if (m_TextMarkup != null)
 | |
|             {
 | |
|                 using (Graphics g = this.CreateGraphics())
 | |
|                 {
 | |
|                     MarkupDrawContext dc = GetMarkupDrawContext(g);
 | |
|                     m_TextMarkup.Measure(GetWatermarkBounds().Size, dc);
 | |
|                     Size sz = m_TextMarkup.Bounds.Size;
 | |
|                     m_TextMarkup.Arrange(new Rectangle(GetWatermarkBounds().Location, sz), dc);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private Rectangle GetWatermarkBounds()
 | |
|         {
 | |
|             Rectangle r = this.ClientRectangle;
 | |
|             r.Inflate(-1, 0);
 | |
|             return r;
 | |
|         }
 | |
| 
 | |
|         private void DrawWatermark()
 | |
|         {
 | |
|             using (Graphics g = this.CreateGraphics())
 | |
|             {
 | |
|                 Rectangle bounds = GetWatermarkBounds();
 | |
|                 if (_WatermarkImage != null)
 | |
|                 {
 | |
|                     Rectangle imageBounds = new Rectangle(Point.Empty, _WatermarkImage.Size);
 | |
|                     if (_WatermarkImageAlignment == ContentAlignment.BottomCenter)
 | |
|                         imageBounds.Location = new Point(bounds.X + (bounds.Width - imageBounds.Width) / 2, bounds.Bottom - imageBounds.Height);
 | |
|                     else if (_WatermarkImageAlignment == ContentAlignment.BottomLeft)
 | |
|                         imageBounds.Location = new Point(bounds.X, bounds.Bottom - imageBounds.Height);
 | |
|                     else if (_WatermarkImageAlignment == ContentAlignment.BottomRight)
 | |
|                         imageBounds.Location = new Point(bounds.Right - imageBounds.Width, bounds.Bottom - imageBounds.Height);
 | |
|                     else if (_WatermarkImageAlignment == ContentAlignment.MiddleCenter)
 | |
|                         imageBounds.Location = new Point(bounds.X + (bounds.Width - imageBounds.Width) / 2, bounds.Y + (bounds.Height - imageBounds.Height) / 2);
 | |
|                     else if (_WatermarkImageAlignment == ContentAlignment.MiddleLeft)
 | |
|                         imageBounds.Location = new Point(bounds.X, bounds.Y + (bounds.Height - imageBounds.Height) / 2);
 | |
|                     else if (_WatermarkImageAlignment == ContentAlignment.MiddleRight)
 | |
|                         imageBounds.Location = new Point(bounds.Right - imageBounds.Width, bounds.Y + (bounds.Height - imageBounds.Height) / 2);
 | |
|                     else if (_WatermarkImageAlignment == ContentAlignment.TopCenter)
 | |
|                         imageBounds.Location = new Point(bounds.X + (bounds.Width - imageBounds.Width) / 2, bounds.Y);
 | |
|                     else if (_WatermarkImageAlignment == ContentAlignment.TopLeft)
 | |
|                         imageBounds.Location = new Point(bounds.X, bounds.Y);
 | |
|                     else if (_WatermarkImageAlignment == ContentAlignment.TopRight)
 | |
|                         imageBounds.Location = new Point(bounds.Right - imageBounds.Width, bounds.Y);
 | |
|                     g.DrawImage(_WatermarkImage, imageBounds);
 | |
| 
 | |
|                     if (_WatermarkImageAlignment == ContentAlignment.BottomLeft || _WatermarkImageAlignment == ContentAlignment.MiddleLeft || _WatermarkImageAlignment == ContentAlignment.TopLeft)
 | |
|                     {
 | |
|                         bounds.X = imageBounds.Right;
 | |
|                         bounds.Width = Math.Max(0, bounds.Width - imageBounds.Width);
 | |
|                     }
 | |
|                     else if (_WatermarkImageAlignment == ContentAlignment.BottomRight || _WatermarkImageAlignment == ContentAlignment.MiddleRight || _WatermarkImageAlignment == ContentAlignment.TopRight)
 | |
|                     {
 | |
|                         bounds.Width = Math.Max(0, bounds.Width - imageBounds.Width);
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 if (bounds.Width <= 0) return;
 | |
| 
 | |
|                 if (m_TextMarkup != null)
 | |
|                 {
 | |
|                     MarkupDrawContext dc = GetMarkupDrawContext(g);
 | |
|                     m_TextMarkup.Render(dc);
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     eTextFormat tf = eTextFormat.Left;
 | |
|                     if (this.Multiline)
 | |
|                     {
 | |
|                         if (this.TextAlign == HorizontalAlignment.Center)
 | |
|                             tf |= eTextFormat.VerticalCenter;
 | |
|                         else if (TextAlign == HorizontalAlignment.Right)
 | |
|                             tf |= eTextFormat.Bottom;
 | |
|                     }
 | |
| 
 | |
|                     if (this.RightToLeft == RightToLeft.Yes) tf |= eTextFormat.RightToLeft;
 | |
|                     if (this.TextAlign == HorizontalAlignment.Left)
 | |
|                         tf |= eTextFormat.Left;
 | |
|                     else if (this.TextAlign == HorizontalAlignment.Right)
 | |
|                         tf |= eTextFormat.Right;
 | |
|                     else if (this.TextAlign == HorizontalAlignment.Center)
 | |
|                         tf |= eTextFormat.HorizontalCenter;
 | |
|                     tf |= eTextFormat.EndEllipsis;
 | |
|                     tf |= eTextFormat.WordBreak;
 | |
|                     TextDrawing.DrawString(g, m_WatermarkText, (m_WatermarkFont == null ? this.Font : m_WatermarkFont),
 | |
|                         m_WatermarkColor, bounds, tf);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         protected override void OnFontChanged(EventArgs e)
 | |
|         {
 | |
|             SetAutoHeight();
 | |
|             base.OnFontChanged(e);
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// Calculates and sets the text-box height based on font and style. This method is used internally and should not be used.
 | |
|         /// </summary>
 | |
|         [EditorBrowsable(EditorBrowsableState.Never)]
 | |
|         public void SetAutoHeight()
 | |
|         {
 | |
|             if (!this.AutoSize && this.Multiline == false && this.BorderStyle == BorderStyle.None && !this.IsDisposed && this.Parent != null && !m_IsTextBoxItem)
 | |
|             {
 | |
|                 int h = this.FontHeight;
 | |
|                 if (this.Font != null) h = Math.Max(h, this.Font.Height);
 | |
|                 h++;
 | |
|                 // Adjust for DPI other than 96
 | |
|                 //using (Graphics graphics = Graphics.FromHwnd(IntPtr.Zero))
 | |
|                 //{
 | |
|                 //    if (graphics.DpiX != 96f)
 | |
|                 //    {
 | |
|                 //        h = (int)Math.Ceiling(h * (graphics.DpiX / 96f));
 | |
|                 //    }
 | |
|                 //}
 | |
|                 bool disposeStyle = false;
 | |
|                 ElementStyle style = GetBorderStyle(out disposeStyle);
 | |
|                 if (style != null)
 | |
|                 {
 | |
|                     if (style.PaintTopBorder)
 | |
|                     {
 | |
|                         if (style.CornerType == eCornerType.Rounded || style.CornerType == eCornerType.Diagonal)
 | |
|                             h += Math.Max(style.BorderTopWidth, style.CornerDiameter / 2 + 1);
 | |
|                         else
 | |
|                             h += style.BorderTopWidth;
 | |
|                     }
 | |
| 
 | |
|                     if (style.PaintBottomBorder)
 | |
|                     {
 | |
|                         if (style.CornerType == eCornerType.Rounded || style.CornerType == eCornerType.Diagonal)
 | |
|                             h += Math.Max(style.BorderBottomWidth, style.CornerDiameter / 2 + 1);
 | |
|                         else
 | |
|                             h += style.BorderBottomWidth;
 | |
|                     }
 | |
|                     h += style.PaddingTop + style.PaddingBottom;
 | |
|                     if (disposeStyle) style.Dispose();
 | |
|                 }
 | |
| #if (FRAMEWORK20)
 | |
|                 if (_ButtonCustom != null && _ButtonCustom.Visible && _ButtonCustom.Image != null)
 | |
|                 {
 | |
|                     h = Math.Max(h, _ButtonCustom.Image.Height + 6);
 | |
|                 }
 | |
|                 if (_ButtonCustom2 != null && _ButtonCustom2.Visible && _ButtonCustom2.Image != null)
 | |
|                 {
 | |
|                     h = Math.Max(h, _ButtonCustom2.Image.Height + 6);
 | |
|                 }
 | |
| #endif
 | |
|                 this.Height = h;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         protected override void OnResize(EventArgs e)
 | |
|         {
 | |
|             ResizeMarkup();
 | |
| #if (FRAMEWORK20)
 | |
|             _ButtonGroup.InvalidateArrange();
 | |
| #endif
 | |
|             base.OnResize(e);
 | |
|         }
 | |
| 
 | |
|         private MarkupDrawContext GetMarkupDrawContext(Graphics g)
 | |
|         {
 | |
|             return new MarkupDrawContext(g, (m_WatermarkFont == null ? this.Font : m_WatermarkFont), m_WatermarkColor, this.RightToLeft == RightToLeft.Yes);
 | |
|         }
 | |
| 
 | |
|         protected override void OnTextAlignChanged(EventArgs e)
 | |
|         {
 | |
|             if (m_WatermarkText.Length > 0)
 | |
|                 this.Invalidate();
 | |
|             base.OnTextAlignChanged(e);
 | |
|         }
 | |
| 
 | |
|         protected override void OnHandleCreated(EventArgs e)
 | |
|         {
 | |
|             base.OnHandleCreated(e);
 | |
|         }
 | |
| 
 | |
|         private Color _EnabledBackColor = Color.Empty;
 | |
|         protected override void OnEnabledChanged(EventArgs e)
 | |
|         {
 | |
|             if (m_WatermarkText.Length > 0)
 | |
|                 this.Invalidate();
 | |
|             UpdateEnabledBackColor();
 | |
|             base.OnEnabledChanged(e);
 | |
|         }
 | |
| 
 | |
|         private void UpdateEnabledBackColor()
 | |
|         {
 | |
|             if (!_DisabledBackColor.IsEmpty)
 | |
|             {
 | |
|                 if (!this.Enabled)
 | |
|                 {
 | |
|                     _EnabledBackColor = this.BackColor;
 | |
|                     this.BackColor = _DisabledBackColor;
 | |
|                 }
 | |
|                 else if (!_EnabledBackColor.IsEmpty)
 | |
|                 {
 | |
|                     this.BackColor = _EnabledBackColor;
 | |
|                     _EnabledBackColor = Color.Empty;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         protected override void OnTextChanged(EventArgs e)
 | |
|         {
 | |
|             if (m_WatermarkText.Length > 0)
 | |
|                 this.Invalidate();
 | |
|             base.OnTextChanged(e);
 | |
|         }
 | |
| 
 | |
|         [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | |
|         public new BorderStyle BorderStyle
 | |
|         {
 | |
|             get { return base.BorderStyle; }
 | |
|             set { }
 | |
|         }
 | |
| 
 | |
|         private Rendering.BaseRenderer m_DefaultRenderer = null;
 | |
|         private Rendering.BaseRenderer m_Renderer = null;
 | |
|         private eRenderMode m_RenderMode = eRenderMode.Global;
 | |
|         /// <summary>
 | |
|         /// Returns the renderer control will be rendered with.
 | |
|         /// </summary>
 | |
|         /// <returns>The current renderer.</returns>
 | |
|         public virtual Rendering.BaseRenderer GetRenderer()
 | |
|         {
 | |
|             if (m_RenderMode == eRenderMode.Global && Rendering.GlobalManager.Renderer != null)
 | |
|                 return Rendering.GlobalManager.Renderer;
 | |
|             else if (m_RenderMode == eRenderMode.Custom && m_Renderer != null)
 | |
|                 return m_Renderer;
 | |
| 
 | |
|             if (m_DefaultRenderer == null)
 | |
|                 m_DefaultRenderer = new Rendering.Office2007Renderer();
 | |
| 
 | |
|             return m_DefaultRenderer;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets the rendering mode used by control. Default value is eRenderMode.Global which means that static GlobalManager.Renderer is used. If set to Custom then Renderer property must
 | |
|         /// also be set to the custom renderer that will be used.
 | |
|         /// </summary>
 | |
|         [Browsable(false), DefaultValue(eRenderMode.Global)]
 | |
|         public eRenderMode RenderMode
 | |
|         {
 | |
|             get { return m_RenderMode; }
 | |
|             set
 | |
|             {
 | |
|                 if (m_RenderMode != value)
 | |
|                 {
 | |
|                     m_RenderMode = value;
 | |
|                     this.Invalidate(true);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets the custom renderer used by the items on this control. RenderMode property must also be set to eRenderMode.Custom in order renderer
 | |
|         /// specified here to be used.
 | |
|         /// </summary>
 | |
|         [Browsable(false), DefaultValue(null)]
 | |
|         public DevComponents.DotNetBar.Rendering.BaseRenderer Renderer
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return m_Renderer;
 | |
|             }
 | |
|             set { m_Renderer = value; }
 | |
|         }
 | |
| 
 | |
|         private bool _WatermarkEnabled = true;
 | |
|         /// <summary>
 | |
|         /// Gets or sets whether watermark text is displayed when control is empty. Default value is true.
 | |
|         /// </summary>
 | |
|         [DefaultValue(true), Description("Indicates whether watermark text is displayed when control is empty.")]
 | |
|         public virtual bool WatermarkEnabled
 | |
|         {
 | |
|             get { return _WatermarkEnabled; }
 | |
|             set { _WatermarkEnabled = value; this.Invalidate(); }
 | |
|         }
 | |
| 
 | |
|         private Image _WatermarkImage = null;
 | |
|         /// <summary>
 | |
|         /// Gets or sets the watermark image displayed inside of the control when Text is not set and control does not have input focus.
 | |
|         /// </summary>
 | |
|         [DefaultValue(null), Category("Appearance"), Description("Indicates watermark image displayed inside of the control when Text is not set and control does not have input focus.")]
 | |
|         public Image WatermarkImage
 | |
|         {
 | |
|             get { return _WatermarkImage; }
 | |
|             set { _WatermarkImage = value; this.Invalidate(); }
 | |
|         }
 | |
|         private ContentAlignment _WatermarkImageAlignment = ContentAlignment.MiddleLeft;
 | |
|         /// <summary>
 | |
|         /// Gets or sets the watermark image alignment.
 | |
|         /// </summary>
 | |
|         [DefaultValue(ContentAlignment.MiddleLeft), Category("Appearance"), Description("Indicates watermark image alignment.")]
 | |
|         public ContentAlignment WatermarkImageAlignment
 | |
|         {
 | |
|             get { return _WatermarkImageAlignment; }
 | |
|             set { _WatermarkImageAlignment = value; this.Invalidate(); }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets the watermark (tip) text displayed inside of the control when Text is not set and control does not have input focus. This property supports text-markup.
 | |
|         /// </summary>
 | |
|         [Browsable(true), DefaultValue(""), Localizable(true), Category("Appearance"), Description("Indicates watermark text displayed inside of the control when Text is not set and control does not have input focus."), Editor("DevComponents.DotNetBar.Design.TextMarkupUIEditor, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf", typeof(System.Drawing.Design.UITypeEditor))]
 | |
|         public string WatermarkText
 | |
|         {
 | |
|             get { return m_WatermarkText; }
 | |
|             set
 | |
|             {
 | |
|                 if (value == null) value = "";
 | |
|                 m_WatermarkText = value;
 | |
|                 MarkupTextChanged();
 | |
|                 this.Invalidate();
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets the watermark font.
 | |
|         /// </summary>
 | |
|         [Browsable(true), Category("Appearance"), Description("Indicates watermark font."), DefaultValue(null)]
 | |
|         public Font WatermarkFont
 | |
|         {
 | |
|             get { return m_WatermarkFont; }
 | |
|             set { m_WatermarkFont = value; this.Invalidate(); }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets the watermark text color.
 | |
|         /// </summary>
 | |
|         [Browsable(true), Category("Appearance"), Description("Indicates watermark text color.")]
 | |
|         public Color WatermarkColor
 | |
|         {
 | |
|             get { return m_WatermarkColor; }
 | |
|             set { m_WatermarkColor = value; this.Invalidate(); }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// Indicates whether property should be serialized by Windows Forms designer.
 | |
|         /// </summary>
 | |
|         [EditorBrowsable(EditorBrowsableState.Never)]
 | |
|         public bool ShouldSerializeWatermarkColor()
 | |
|         {
 | |
|             return m_WatermarkColor != SystemColors.GrayText;
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// Resets the property to default value.
 | |
|         /// </summary>
 | |
|         [EditorBrowsable(EditorBrowsableState.Never)]
 | |
|         public void ResetWatermarkColor()
 | |
|         {
 | |
|             this.WatermarkColor = SystemColors.GrayText;
 | |
|         }
 | |
| 
 | |
|         private eWatermarkBehavior _WatermarkBehavior = eWatermarkBehavior.HideOnFocus;
 | |
|         /// <summary>
 | |
|         /// Gets or sets the watermark hiding behaviour. Default value indicates that watermark is hidden when control receives input focus.
 | |
|         /// </summary>
 | |
|         [DefaultValue(eWatermarkBehavior.HideOnFocus), Category("Behavior"), Description("Indicates watermark hiding behaviour.")]
 | |
|         public eWatermarkBehavior WatermarkBehavior
 | |
|         {
 | |
|             get { return _WatermarkBehavior; }
 | |
|             set { _WatermarkBehavior = value; this.Invalidate(); }
 | |
|         }
 | |
| 
 | |
|         private ElementStyle GetBorderStyle(out bool disposeStyle)
 | |
|         {
 | |
|             disposeStyle = false;
 | |
|             m_BorderStyle.SetColorScheme(this.GetColorScheme());
 | |
|             return ElementStyleDisplay.GetElementStyle(m_BorderStyle, out disposeStyle);
 | |
|         }
 | |
| 
 | |
| #if FRAMEWORK20
 | |
|         private InputButtonSettings _ButtonCustom = null;
 | |
|         /// <summary>
 | |
|         /// Gets the object that describes the settings for the custom button that can execute an custom action of your choosing when clicked.
 | |
|         /// </summary>
 | |
|         [Category("Buttons"), Description("Describes the settings for the custom button that can execute an custom action of your choosing when clicked."), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
 | |
|         public InputButtonSettings ButtonCustom
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return _ButtonCustom;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private InputButtonSettings _ButtonCustom2 = null;
 | |
|         /// <summary>
 | |
|         /// Gets the object that describes the settings for the custom button that can execute an custom action of your choosing when clicked.
 | |
|         /// </summary>
 | |
|         [Category("Buttons"), Description("Describes the settings for the custom button that can execute an custom action of your choosing when clicked."), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
 | |
|         public InputButtonSettings ButtonCustom2
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return _ButtonCustom2;
 | |
|             }
 | |
|         }
 | |
| 
 | |
| 
 | |
|         void IInputButtonControl.InputButtonSettingsChanged(InputButtonSettings inputButtonSettings)
 | |
|         {
 | |
|             OnInputButtonSettingsChanged(inputButtonSettings);
 | |
|         }
 | |
| 
 | |
|         protected virtual void OnInputButtonSettingsChanged(InputButtonSettings inputButtonSettings)
 | |
|         {
 | |
|             UpdateButtons();
 | |
|         }
 | |
| 
 | |
|         private VisualGroup _ButtonGroup = null;
 | |
|         private void UpdateButtons()
 | |
|         {
 | |
|             RecreateButtons();
 | |
|             _ButtonGroup.InvalidateArrange();
 | |
|             this.InvalidateNonClient();
 | |
|         }
 | |
| 
 | |
|         protected virtual void RecreateButtons()
 | |
|         {
 | |
|             VisualItem[] buttons = CreateOrderedButtonList();
 | |
|             // Remove all system buttons that are already in the list
 | |
|             VisualGroup group = _ButtonGroup;
 | |
|             VisualItem[] items = new VisualItem[group.Items.Count];
 | |
|             group.Items.CopyTo(items);
 | |
|             foreach (VisualItem item in items)
 | |
|             {
 | |
|                 if (item.ItemType == eSystemItemType.SystemButton)
 | |
|                 {
 | |
|                     group.Items.Remove(item);
 | |
|                     if (item == _ButtonCustom.ItemReference)
 | |
|                         item.MouseUp -= new MouseEventHandler(CustomButtonClick);
 | |
|                     else if (item == _ButtonCustom2.ItemReference)
 | |
|                         item.MouseUp -= new MouseEventHandler(CustomButton2Click);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             // Add new buttons to the list
 | |
|             group.Items.AddRange(buttons);
 | |
|         }
 | |
| 
 | |
|         private void CustomButtonClick(object sender, MouseEventArgs e)
 | |
|         {
 | |
|             if (_ButtonCustom.ItemReference.RenderBounds.Contains(e.X, e.Y))
 | |
|                 OnButtonCustomClick(e);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Invokes ButtonCustomClick event.
 | |
|         /// </summary>
 | |
|         public void PerformButtonCustomClick()
 | |
|         {
 | |
|             OnButtonCustomClick(EventArgs.Empty);
 | |
|         }
 | |
| 
 | |
|         protected virtual void OnButtonCustomClick(EventArgs e)
 | |
|         {
 | |
|             if (ButtonCustomClick != null)
 | |
|                 ButtonCustomClick(this, e);
 | |
|         }
 | |
| 
 | |
|         private void CustomButton2Click(object sender, MouseEventArgs e)
 | |
|         {
 | |
|             if (_ButtonCustom2.ItemReference.RenderBounds.Contains(e.X, e.Y))
 | |
|                 OnButtonCustom2Click(e);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Invokes ButtonCustomClick2 event.
 | |
|         /// </summary>
 | |
|         public void PerformButtonCustom2Click()
 | |
|         {
 | |
|             OnButtonCustom2Click(EventArgs.Empty);
 | |
|         }
 | |
| 
 | |
|         protected virtual void OnButtonCustom2Click(EventArgs e)
 | |
|         {
 | |
|             if (ButtonCustom2Click != null)
 | |
|                 ButtonCustom2Click(this, e);
 | |
|         }
 | |
| 
 | |
|         private VisualItem[] CreateOrderedButtonList()
 | |
|         {
 | |
|             SortedList list = CreateSortedButtonList();
 | |
| 
 | |
|             VisualItem[] items = new VisualItem[list.Count];
 | |
|             list.Values.CopyTo(items, 0);
 | |
| 
 | |
|             return items;
 | |
|         }
 | |
| 
 | |
|         private void CustomButtonKeyClick(object sender, EventArgs e)
 | |
|         {
 | |
|             if (e is KeyEventArgs)
 | |
|                 OnButtonCustomClick(e);
 | |
|         }
 | |
|         private void CustomButton2KeyClick(object sender, EventArgs e)
 | |
|         {
 | |
|             if (e is KeyEventArgs)
 | |
|                 OnButtonCustom2Click(e);
 | |
|         }
 | |
|         protected virtual SortedList CreateSortedButtonList()
 | |
|         {
 | |
|             SortedList list = new SortedList(4);
 | |
|             if (_ButtonCustom.Visible)
 | |
|             {
 | |
|                 VisualItem button = CreateButton(_ButtonCustom);
 | |
|                 if (_ButtonCustom.ItemReference != null)
 | |
|                 {
 | |
|                     _ButtonCustom.ItemReference.MouseUp -= CustomButtonClick;
 | |
|                     _ButtonCustom.ItemReference.Click -= CustomButtonKeyClick;
 | |
|                 }
 | |
|                 _ButtonCustom.ItemReference = button;
 | |
|                 button.Click += CustomButtonKeyClick;
 | |
|                 button.MouseUp += new MouseEventHandler(CustomButtonClick);
 | |
|                 button.Enabled = _ButtonCustom.Enabled;
 | |
|                 list.Add(_ButtonCustom, button);
 | |
|             }
 | |
| 
 | |
|             if (_ButtonCustom2.Visible)
 | |
|             {
 | |
|                 VisualItem button = CreateButton(_ButtonCustom2);
 | |
|                 if (_ButtonCustom2.ItemReference != null)
 | |
|                 {
 | |
|                     _ButtonCustom2.ItemReference.MouseUp -= CustomButton2Click;
 | |
|                     _ButtonCustom2.ItemReference.Click -= CustomButton2KeyClick;
 | |
|                 }
 | |
|                 _ButtonCustom2.ItemReference = button;
 | |
|                 button.Click += CustomButton2KeyClick;
 | |
|                 button.MouseUp += new MouseEventHandler(CustomButton2Click);
 | |
|                 button.Enabled = _ButtonCustom2.Enabled;
 | |
|                 list.Add(_ButtonCustom2, button);
 | |
|             }
 | |
| 
 | |
|             return list;
 | |
|         }
 | |
| 
 | |
|         protected virtual VisualItem CreateButton(InputButtonSettings buttonSettings)
 | |
|         {
 | |
|             VisualCustomButton button = new VisualCustomButton();
 | |
|             ApplyButtonSettings(buttonSettings, button);
 | |
|             return button;
 | |
|         }
 | |
| 
 | |
|         protected virtual void ApplyButtonSettings(InputButtonSettings buttonSettings, VisualButton button)
 | |
|         {
 | |
|             button.Text = buttonSettings.Text;
 | |
|             button.Image = buttonSettings.Image;
 | |
|             button.ItemType = eSystemItemType.SystemButton;
 | |
|             button.Enabled = buttonSettings.Enabled;
 | |
|             button.Shortcut = buttonSettings.Shortcut;
 | |
|             button.Tooltip = buttonSettings.Tooltip;
 | |
|             button.Symbol = buttonSettings.Symbol;
 | |
|             button.SymbolSet = buttonSettings.SymbolSet;
 | |
|             button.SymbolColor = buttonSettings.SymbolColor;
 | |
|             button.Checked = buttonSettings.Checked;
 | |
|         }
 | |
| 
 | |
|         private void CreateButtonGroup()
 | |
|         {
 | |
|             VisualGroup group = new VisualGroup();
 | |
|             group.HorizontalItemSpacing = 0;
 | |
|             group.ArrangeInvalid += ButtonGroupArrangeInvalid;
 | |
|             group.RenderInvalid += ButtonGroupRenderInvalid;
 | |
|             group.ResetMouseHover += ButtonGroupResetMouseHover;
 | |
|             _ButtonGroup = group;
 | |
|         }
 | |
| 
 | |
|         private void ButtonGroupRenderInvalid(object sender, EventArgs e)
 | |
|         {
 | |
|             InvalidateNonClient();
 | |
|         }
 | |
| 
 | |
|         private void ButtonGroupArrangeInvalid(object sender, EventArgs e)
 | |
|         {
 | |
|             InvalidateNonClient();
 | |
|         }
 | |
| 
 | |
|         private void ButtonGroupResetMouseHover(object sender, EventArgs e)
 | |
|         {
 | |
|             DevComponents.AdvTree.Interop.WinApi.ResetHover(this);
 | |
|         }
 | |
| 
 | |
|         private bool _MouseOver = false;
 | |
|         private PaintInfo CreatePaintInfo(Graphics g)
 | |
|         {
 | |
|             PaintInfo p = new PaintInfo();
 | |
|             p.Graphics = g;
 | |
|             p.DefaultFont = this.Font;
 | |
|             p.ForeColor = this.ForeColor;
 | |
|             p.RenderOffset = new System.Drawing.Point();
 | |
|             Size s = this.Size;
 | |
|             bool disposeStyle = false;
 | |
|             ElementStyle style = GetBorderStyle(out disposeStyle);
 | |
|             s.Height -= (ElementStyleLayout.TopWhiteSpace(style, eSpacePart.Border) + ElementStyleLayout.BottomWhiteSpace(style, eSpacePart.Border)) + 2;
 | |
|             s.Width -= (ElementStyleLayout.LeftWhiteSpace(style, eSpacePart.Border) + ElementStyleLayout.RightWhiteSpace(style, eSpacePart.Border)) + 2;
 | |
|             p.AvailableSize = s;
 | |
|             p.ParentEnabled = this.Enabled;
 | |
|             p.MouseOver = _MouseOver || this.Focused;
 | |
|             if (disposeStyle) style.Dispose();
 | |
|             return p;
 | |
|         }
 | |
| 
 | |
|         private bool RenderButtons
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return (this.ScrollBars == ScrollBars.None) && (_ButtonCustom != null && _ButtonCustom.Visible || _ButtonCustom2 != null && _ButtonCustom2.Visible);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void PaintButtons(Graphics g)
 | |
|         {
 | |
|             PaintInfo p = CreatePaintInfo(g);
 | |
|             if (!_ButtonGroup.IsLayoutValid)
 | |
|             {
 | |
|                 _ButtonGroup.PerformLayout(p);
 | |
|             }
 | |
|             bool disposeStyle = false;
 | |
|             ElementStyle style = GetBorderStyle(out disposeStyle);
 | |
|             //p.RenderOffset = new Point(this.Width - ElementStyleLayout.RightWhiteSpace(style, eSpacePart.Border) - _ButtonGroup.Size.Width, ElementStyleLayout.TopWhiteSpace(style, eSpacePart.Border));
 | |
|             _ButtonGroup.RenderBounds = new Rectangle(this.Width - (ElementStyleLayout.RightWhiteSpace(style, eSpacePart.Border) + 1) - _ButtonGroup.Size.Width, ElementStyleLayout.TopWhiteSpace(style, eSpacePart.Border) + 1,
 | |
|                 _ButtonGroup.Size.Width, _ButtonGroup.Size.Height);
 | |
|             _ButtonGroup.ProcessPaint(p);
 | |
|             if (disposeStyle) style.Dispose();
 | |
|         }
 | |
| 
 | |
|         private Cursor _ControlCursor = null;
 | |
|         protected override void OnMouseMove(MouseEventArgs e)
 | |
|         {
 | |
|             if (RenderButtons)
 | |
|             {
 | |
|                 _ButtonGroup.ProcessMouseMove(e);
 | |
|                 if (_ButtonGroup.RenderBounds.Contains(e.X, e.Y))
 | |
|                 {
 | |
|                     if (_ControlCursor == null)
 | |
|                     {
 | |
|                         _InternalCursorChange = true;
 | |
|                         _ControlCursor = this.Cursor;
 | |
|                         this.Cursor = Cursors.Arrow;
 | |
|                         _InternalCursorChange = false;
 | |
|                     }
 | |
|                 }
 | |
|                 else if (_ControlCursor != null)
 | |
|                 {
 | |
|                     _InternalCursorChange = true;
 | |
|                     this.Cursor = _ControlCursor;
 | |
|                     _ControlCursor = null;
 | |
|                     _InternalCursorChange = false;
 | |
|                 }
 | |
|             }
 | |
|             base.OnMouseMove(e);
 | |
|         }
 | |
|         protected override void OnMouseEnter(EventArgs e)
 | |
|         {
 | |
|             _MouseOver = true;
 | |
|             base.OnMouseEnter(e);
 | |
|         }
 | |
|         protected override void OnMouseLeave(EventArgs e)
 | |
|         {
 | |
|             _MouseOver = false;
 | |
|             if (RenderButtons)
 | |
|             {
 | |
|                 _ButtonGroup.ProcessMouseLeave();
 | |
|                 if (_ControlCursor != null)
 | |
|                 {
 | |
|                     _InternalCursorChange = true;
 | |
|                     this.Cursor = _ControlCursor;
 | |
|                     _ControlCursor = null;
 | |
|                     _InternalCursorChange = false;
 | |
|                 }
 | |
|             }
 | |
|             base.OnMouseLeave(e);
 | |
|         }
 | |
|         private bool _InternalCursorChange = false;
 | |
|         protected override void OnCursorChanged(EventArgs e)
 | |
|         {
 | |
|             if (_ControlCursor != null && !_InternalCursorChange)
 | |
|                 _ControlCursor = this.Cursor;
 | |
|             base.OnCursorChanged(e);
 | |
|         }
 | |
|         protected override void OnMouseDown(MouseEventArgs e)
 | |
|         {
 | |
|             if (RenderButtons)
 | |
|                 _ButtonGroup.ProcessMouseDown(e);
 | |
|             base.OnMouseDown(e);
 | |
|         }
 | |
|         protected override void OnMouseUp(MouseEventArgs e)
 | |
|         {
 | |
|             if (RenderButtons)
 | |
|                 _ButtonGroup.ProcessMouseUp(e);
 | |
|             base.OnMouseUp(e);
 | |
|         }
 | |
|         protected override void OnMouseHover(EventArgs e)
 | |
|         {
 | |
|             if (RenderButtons)
 | |
|                 _ButtonGroup.ProcessMouseHover(e);
 | |
|             base.OnMouseHover(e);
 | |
|         }
 | |
| #endif
 | |
|         #endregion
 | |
| 
 | |
|         #region INonClientControl Members
 | |
|         void INonClientControl.BaseWndProc(ref Message m)
 | |
|         {
 | |
|             base.WndProc(ref m);
 | |
|         }
 | |
| 
 | |
|         //CreateParams INonClientControl.ControlCreateParams
 | |
|         //{
 | |
|         //    get { return base.CreateParams; }
 | |
|         //}
 | |
| 
 | |
|         ItemPaintArgs INonClientControl.GetItemPaintArgs(System.Drawing.Graphics g)
 | |
|         {
 | |
|             ItemPaintArgs pa = new ItemPaintArgs(this as IOwner, this, g, GetColorScheme());
 | |
|             pa.Renderer = this.GetRenderer();
 | |
|             pa.DesignerSelection = false; // m_DesignerSelection;
 | |
|             pa.GlassEnabled = !this.DesignMode && WinApi.IsGlassEnabled;
 | |
|             return pa;
 | |
|         }
 | |
| 
 | |
|         ElementStyle INonClientControl.BorderStyle
 | |
|         {
 | |
|             get { bool disposeStyle = false; return GetBorderStyle(out disposeStyle); }
 | |
|         }
 | |
| 
 | |
|         void INonClientControl.PaintBackground(PaintEventArgs e)
 | |
|         {
 | |
|             if (this.Parent == null) return;
 | |
|             Type t = typeof(Control);
 | |
|             MethodInfo mi = t.GetMethod("PaintTransparentBackground", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(PaintEventArgs), typeof(Rectangle) }, null);
 | |
|             if (mi != null)
 | |
|             {
 | |
|                 mi.Invoke(this, new object[] { e, new Rectangle(0, 0, this.Width, this.Height) });
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private ColorScheme m_ColorScheme = null;
 | |
|         /// <summary>
 | |
|         /// Returns the color scheme used by control. Color scheme for Office2007 style will be retrived from the current renderer instead of
 | |
|         /// local color scheme referenced by ColorScheme property.
 | |
|         /// </summary>
 | |
|         /// <returns>An instance of ColorScheme object.</returns>
 | |
|         protected virtual ColorScheme GetColorScheme()
 | |
|         {
 | |
|             BaseRenderer r = GetRenderer();
 | |
|             if (r is Office2007Renderer)
 | |
|                 return ((Office2007Renderer)r).ColorTable.LegacyColors;
 | |
|             if (m_ColorScheme == null)
 | |
|                 m_ColorScheme = new ColorScheme(eDotNetBarStyle.Office2007);
 | |
|             return m_ColorScheme;
 | |
|         }
 | |
| 
 | |
|         IntPtr INonClientControl.Handle
 | |
|         {
 | |
|             get { return this.Handle; }
 | |
|         }
 | |
| 
 | |
|         int INonClientControl.Width
 | |
|         {
 | |
|             get { return this.Width; }
 | |
|         }
 | |
| 
 | |
|         int INonClientControl.Height
 | |
|         {
 | |
|             get { return this.Height; }
 | |
|         }
 | |
| 
 | |
|         bool INonClientControl.IsHandleCreated
 | |
|         {
 | |
|             get { return this.IsHandleCreated; }
 | |
|         }
 | |
| 
 | |
|         Point INonClientControl.PointToScreen(Point client)
 | |
|         {
 | |
|             return this.PointToScreen(client);
 | |
|         }
 | |
| 
 | |
|         Color INonClientControl.BackColor
 | |
|         {
 | |
|             get { return this.BackColor; }
 | |
|         }
 | |
| 
 | |
|         void INonClientControl.AdjustClientRectangle(ref Rectangle r)
 | |
|         {
 | |
| #if FRAMEWORK20
 | |
|             if (RenderButtons)
 | |
|             {
 | |
|                 if (!_ButtonGroup.IsLayoutValid)
 | |
|                 {
 | |
|                     using (Graphics g = this.CreateGraphics())
 | |
|                     {
 | |
|                         PaintInfo p = CreatePaintInfo(g);
 | |
|                         _ButtonGroup.PerformLayout(p);
 | |
|                     }
 | |
|                 }
 | |
|                 r.Width -= _ButtonGroup.Size.Width + 1;
 | |
|             }
 | |
| #endif
 | |
|         }
 | |
| 
 | |
|         void INonClientControl.AdjustBorderRectangle(ref Rectangle r) { }
 | |
| 
 | |
|         void INonClientControl.RenderNonClient(Graphics g)
 | |
|         {
 | |
| #if FRAMEWORK20
 | |
|             if (RenderButtons)
 | |
|                 PaintButtons(g);
 | |
| #endif
 | |
|         }
 | |
| 
 | |
|         private Color _DisabledBackColor = Color.Empty;
 | |
|         /// <summary>
 | |
|         /// Specifies back color when Enabled=false
 | |
|         /// </summary>
 | |
|         [Browsable(true), Category("Appearance"), Description("Specifies back color when Enabled=false")]
 | |
|         public Color DisabledBackColor
 | |
|         {
 | |
|             get { return _DisabledBackColor; }
 | |
|             set
 | |
|             {
 | |
|                 _DisabledBackColor = value;
 | |
|                 if (!Enabled) this.Invalidate();
 | |
|             }
 | |
|         }
 | |
|         public bool ShouldSerializeDisabledBackColor()
 | |
|         {
 | |
|             return !_DisabledBackColor.IsEmpty;
 | |
|         }
 | |
|         public void ResetDisabledBackColor()
 | |
|         {
 | |
|             DisabledBackColor = Color.Empty;
 | |
|         }
 | |
|         #endregion
 | |
|     }
 | |
| }
 |