/ src / modules / MouseWithoutBorders / App / Control / ColorBorderField.cs
ColorBorderField.cs
  1  // Copyright (c) Microsoft Corporation
  2  // The Microsoft Corporation licenses this file to you under the MIT license.
  3  // See the LICENSE file in the project root for more information.
  4  
  5  using System;
  6  using System.ComponentModel;
  7  using System.Drawing;
  8  using System.Windows.Forms;
  9  
 10  namespace MouseWithoutBorders
 11  {
 12      public partial class ColorBorderField : UserControl
 13      {
 14          [Category("Property Changed")]
 15          [Description("The text property of the field has changed")]
 16          public event EventHandler FieldTextChanged;
 17  
 18          private int _borderSize;
 19  
 20          [Category("Appearance")]
 21          [Description("The thickness of the border around the field")]
 22          [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
 23          public int BorderSize
 24          {
 25              get => _borderSize;
 26              set
 27              {
 28                  _borderSize = value;
 29                  UpdateFieldSize();
 30              }
 31          }
 32  
 33          private Color _borderColor;
 34  
 35          [Category("Appearance")]
 36          [Description("The color of the border around the field")]
 37          [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
 38          public Color BorderColor
 39          {
 40              get => _borderColor;
 41              set
 42              {
 43                  _borderColor = value;
 44                  UpdateBorderColor();
 45              }
 46          }
 47  
 48          private Color _focusColor;
 49  
 50          [Category("Appearance")]
 51          [Description("The color of the border around the field when it has focus")]
 52          [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
 53          public Color FocusColor
 54          {
 55              get => _focusColor;
 56              set
 57              {
 58                  _focusColor = value;
 59                  UpdateBorderColor();
 60              }
 61          }
 62  
 63          [Category("Behavior")]
 64          [Description("The maximum number of characters that can be typed in the field")]
 65          [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
 66          public int MaximumLength
 67          {
 68              get => InnerField.MaxLength;
 69              set => InnerField.MaxLength = value;
 70          }
 71  
 72          [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 73          public override string Text
 74          {
 75              get => InnerField.Text;
 76              set => InnerField.Text = value;
 77          }
 78  
 79          public ColorBorderField()
 80          {
 81              InitializeComponent();
 82              InnerField.GotFocus += InnerFieldGotFocus;
 83              InnerField.LostFocus += InnerFieldLostFocus;
 84              InnerField.TextChanged += InnerFieldTextChanged;
 85              UpdateBorderColor();
 86          }
 87  
 88          protected override void OnResize(EventArgs e)
 89          {
 90              base.OnResize(e);
 91              UpdateFieldSize();
 92          }
 93  
 94          protected override void OnGotFocus(EventArgs e)
 95          {
 96              base.OnGotFocus(e);
 97              _ = InnerField.Focus();
 98          }
 99  
100          private void InnerFieldGotFocus(object sender, EventArgs e)
101          {
102              BackColor = FocusColor;
103          }
104  
105          private void InnerFieldLostFocus(object sender, EventArgs e)
106          {
107              BackColor = BorderColor;
108          }
109  
110          private void InnerFieldTextChanged(object sender, EventArgs e)
111          {
112              FieldTextChanged?.Invoke(this, EventArgs.Empty);
113          }
114  
115          private void UpdateFieldSize()
116          {
117              InnerField.Left = BorderSize;
118              InnerField.Top = BorderSize;
119              InnerField.Width = Width - (BorderSize * 2);
120              Height = InnerField.Height + (BorderSize * 2);
121          }
122  
123          private void UpdateBorderColor()
124          {
125              BackColor = Focused ? FocusColor : BorderColor;
126          }
127      }
128  }