#region Imports using DPumpHydr.WinFrmUI.RLT.Manager; using System; using System.ComponentModel; using System.Drawing; using System.Runtime.InteropServices; using System.Windows.Forms; using static DPumpHydr.WinFrmUI.RLT.Helper.MaterialDrawHelper; using static DPumpHydr.WinFrmUI.RLT.Util.MaterialAnimations; #endregion namespace DPumpHydr.WinFrmUI.RLT.Controls { #region MaterialSingleTextBox [ToolboxItem(false), Description("This control has been replaced by MaterialTextBoxEdit"), Obsolete("Use MaterialTextBoxEdit instead", false)] public class MaterialSingleTextBox : Control, MaterialControlI { //Properties for managing the material design properties [Browsable(false)] public int Depth { get; set; } [Browsable(false)] public MaterialSkinManager SkinManager => MaterialSkinManager.Instance; [Browsable(false)] public MaterialMouseState MouseState { get; set; } private readonly BaseTextBox _baseTextBox; private readonly AnimationManager _animationManager; private bool useAccentColor; public bool UseAccentColor { get => useAccentColor; set { useAccentColor = value; Invalidate(); } } public override string Text { get => _baseTextBox.Text; set => _baseTextBox.Text = value; } public new object Tag { get => _baseTextBox.Tag; set => _baseTextBox.Tag = value; } public new int MaxLength { get => _baseTextBox.MaxLength; set => _baseTextBox.MaxLength = value; } public string SelectedText { get => _baseTextBox.SelectedText; set => _baseTextBox.SelectedText = value; } [DefaultValue(""), Localizable(true)] public string Hint { get => _baseTextBox.Hint; set => _baseTextBox.Hint = value; } public int SelectionStart { get => _baseTextBox.SelectionStart; set => _baseTextBox.SelectionStart = value; } public int SelectionLength { get => _baseTextBox.SelectionLength; set => _baseTextBox.SelectionLength = value; } public int TextLength => _baseTextBox.TextLength; public bool UseSystemPasswordChar { get => _baseTextBox.UseSystemPasswordChar; set => _baseTextBox.UseSystemPasswordChar = value; } public char PasswordChar { get => _baseTextBox.PasswordChar; set => _baseTextBox.PasswordChar = value; } public void SelectAll() { _baseTextBox.SelectAll(); } public void Clear() { _baseTextBox.Clear(); } public void Focus() { _baseTextBox.Focus(); } # region Forwarding events to baseTextBox public event EventHandler AcceptsTabChanged { add => _baseTextBox.AcceptsTabChanged += value; remove => _baseTextBox.AcceptsTabChanged -= value; } public new event EventHandler AutoSizeChanged { add => _baseTextBox.AutoSizeChanged += value; remove => _baseTextBox.AutoSizeChanged -= value; } public new event EventHandler BackgroundImageChanged { add => _baseTextBox.BackgroundImageChanged += value; remove => _baseTextBox.BackgroundImageChanged -= value; } public new event EventHandler BackgroundImageLayoutChanged { add => _baseTextBox.BackgroundImageLayoutChanged += value; remove => _baseTextBox.BackgroundImageLayoutChanged -= value; } public new event EventHandler BindingContextChanged { add => _baseTextBox.BindingContextChanged += value; remove => _baseTextBox.BindingContextChanged -= value; } public event EventHandler BorderStyleChanged { add => _baseTextBox.BorderStyleChanged += value; remove => _baseTextBox.BorderStyleChanged -= value; } public new event EventHandler CausesValidationChanged { add => _baseTextBox.CausesValidationChanged += value; remove => _baseTextBox.CausesValidationChanged -= value; } public new event UICuesEventHandler ChangeUICues { add => _baseTextBox.ChangeUICues += value; remove => _baseTextBox.ChangeUICues -= value; } public new event EventHandler Click { add => _baseTextBox.Click += value; remove => _baseTextBox.Click -= value; } public new event EventHandler ClientSizeChanged { add => _baseTextBox.ClientSizeChanged += value; remove => _baseTextBox.ClientSizeChanged -= value; } #if !NETCOREAPP3_1 && !NET7_0 && !NET8_0 && !NET9_0 public new event EventHandler ContextMenuChanged { add => _baseTextBox.ContextMenuChanged += value; remove => _baseTextBox.ContextMenuChanged -= value; } #endif public new event EventHandler ContextMenuStripChanged { add => _baseTextBox.ContextMenuStripChanged += value; remove => _baseTextBox.ContextMenuStripChanged -= value; } public new event ControlEventHandler ControlAdded { add => _baseTextBox.ControlAdded += value; remove => _baseTextBox.ControlAdded -= value; } public new event ControlEventHandler ControlRemoved { add => _baseTextBox.ControlRemoved += value; remove => _baseTextBox.ControlRemoved -= value; } public new event EventHandler CursorChanged { add => _baseTextBox.CursorChanged += value; remove => _baseTextBox.CursorChanged -= value; } public new event EventHandler Disposed { add => _baseTextBox.Disposed += value; remove => _baseTextBox.Disposed -= value; } public new event EventHandler DockChanged { add => _baseTextBox.DockChanged += value; remove => _baseTextBox.DockChanged -= value; } public new event EventHandler DoubleClick { add => _baseTextBox.DoubleClick += value; remove => _baseTextBox.DoubleClick -= value; } public new event DragEventHandler DragDrop { add => _baseTextBox.DragDrop += value; remove => _baseTextBox.DragDrop -= value; } public new event DragEventHandler DragEnter { add => _baseTextBox.DragEnter += value; remove => _baseTextBox.DragEnter -= value; } public new event EventHandler DragLeave { add => _baseTextBox.DragLeave += value; remove => _baseTextBox.DragLeave -= value; } public new event DragEventHandler DragOver { add => _baseTextBox.DragOver += value; remove => _baseTextBox.DragOver -= value; } public new event EventHandler EnabledChanged { add => _baseTextBox.EnabledChanged += value; remove => _baseTextBox.EnabledChanged -= value; } public new event EventHandler Enter { add => _baseTextBox.Enter += value; remove => _baseTextBox.Enter -= value; } public new event EventHandler FontChanged { add => _baseTextBox.FontChanged += value; remove => _baseTextBox.FontChanged -= value; } public new event EventHandler ForeColorChanged { add => _baseTextBox.ForeColorChanged += value; remove => _baseTextBox.ForeColorChanged -= value; } public new event GiveFeedbackEventHandler GiveFeedback { add => _baseTextBox.GiveFeedback += value; remove => _baseTextBox.GiveFeedback -= value; } public new event EventHandler GotFocus { add => _baseTextBox.GotFocus += value; remove => _baseTextBox.GotFocus -= value; } public new event EventHandler HandleCreated { add => _baseTextBox.HandleCreated += value; remove => _baseTextBox.HandleCreated -= value; } public new event EventHandler HandleDestroyed { add => _baseTextBox.HandleDestroyed += value; remove => _baseTextBox.HandleDestroyed -= value; } public new event HelpEventHandler HelpRequested { add => _baseTextBox.HelpRequested += value; remove => _baseTextBox.HelpRequested -= value; } public event EventHandler HideSelectionChanged { add => _baseTextBox.HideSelectionChanged += value; remove => _baseTextBox.HideSelectionChanged -= value; } public new event EventHandler ImeModeChanged { add => _baseTextBox.ImeModeChanged += value; remove => _baseTextBox.ImeModeChanged -= value; } public new event InvalidateEventHandler Invalidated { add => _baseTextBox.Invalidated += value; remove => _baseTextBox.Invalidated -= value; } public new event KeyEventHandler KeyDown { add => _baseTextBox.KeyDown += value; remove => _baseTextBox.KeyDown -= value; } public new event KeyPressEventHandler KeyPress { add => _baseTextBox.KeyPress += value; remove => _baseTextBox.KeyPress -= value; } public new event KeyEventHandler KeyUp { add => _baseTextBox.KeyUp += value; remove => _baseTextBox.KeyUp -= value; } public new event LayoutEventHandler Layout { add => _baseTextBox.Layout += value; remove => _baseTextBox.Layout -= value; } public new event EventHandler Leave { add => _baseTextBox.Leave += value; remove => _baseTextBox.Leave -= value; } public new event EventHandler LocationChanged { add => _baseTextBox.LocationChanged += value; remove => _baseTextBox.LocationChanged -= value; } public new event EventHandler LostFocus { add => _baseTextBox.LostFocus += value; remove => _baseTextBox.LostFocus -= value; } public new event EventHandler MarginChanged { add => _baseTextBox.MarginChanged += value; remove => _baseTextBox.MarginChanged -= value; } public event EventHandler ModifiedChanged { add => _baseTextBox.ModifiedChanged += value; remove => _baseTextBox.ModifiedChanged -= value; } public new event EventHandler MouseCaptureChanged { add => _baseTextBox.MouseCaptureChanged += value; remove => _baseTextBox.MouseCaptureChanged -= value; } public new event MouseEventHandler MouseClick { add => _baseTextBox.MouseClick += value; remove => _baseTextBox.MouseClick -= value; } public new event MouseEventHandler MouseDoubleClick { add => _baseTextBox.MouseDoubleClick += value; remove => _baseTextBox.MouseDoubleClick -= value; } public new event MouseEventHandler MouseDown { add => _baseTextBox.MouseDown += value; remove => _baseTextBox.MouseDown -= value; } public new event EventHandler MouseEnter { add => _baseTextBox.MouseEnter += value; remove => _baseTextBox.MouseEnter -= value; } public new event EventHandler MouseHover { add => _baseTextBox.MouseHover += value; remove => _baseTextBox.MouseHover -= value; } public new event EventHandler MouseLeave { add => _baseTextBox.MouseLeave += value; remove => _baseTextBox.MouseLeave -= value; } public new event MouseEventHandler MouseMove { add => _baseTextBox.MouseMove += value; remove => _baseTextBox.MouseMove -= value; } public new event MouseEventHandler MouseUp { add => _baseTextBox.MouseUp += value; remove => _baseTextBox.MouseUp -= value; } public new event MouseEventHandler MouseWheel { add => _baseTextBox.MouseWheel += value; remove => _baseTextBox.MouseWheel -= value; } public new event EventHandler Move { add => _baseTextBox.Move += value; remove => _baseTextBox.Move -= value; } public event EventHandler MultilineChanged { add => _baseTextBox.MultilineChanged += value; remove => _baseTextBox.MultilineChanged -= value; } public new event EventHandler PaddingChanged { add => _baseTextBox.PaddingChanged += value; remove => _baseTextBox.PaddingChanged -= value; } public new event PaintEventHandler Paint { add => _baseTextBox.Paint += value; remove => _baseTextBox.Paint -= value; } public new event EventHandler ParentChanged { add => _baseTextBox.ParentChanged += value; remove => _baseTextBox.ParentChanged -= value; } public new event PreviewKeyDownEventHandler PreviewKeyDown { add => _baseTextBox.PreviewKeyDown += value; remove => _baseTextBox.PreviewKeyDown -= value; } public new event QueryAccessibilityHelpEventHandler QueryAccessibilityHelp { add => _baseTextBox.QueryAccessibilityHelp += value; remove => _baseTextBox.QueryAccessibilityHelp -= value; } public new event QueryContinueDragEventHandler QueryContinueDrag { add => _baseTextBox.QueryContinueDrag += value; remove => _baseTextBox.QueryContinueDrag -= value; } public event EventHandler ReadOnlyChanged { add => _baseTextBox.ReadOnlyChanged += value; remove => _baseTextBox.ReadOnlyChanged -= value; } public new event EventHandler RegionChanged { add => _baseTextBox.RegionChanged += value; remove => _baseTextBox.RegionChanged -= value; } public new event EventHandler Resize { add => _baseTextBox.Resize += value; remove => _baseTextBox.Resize -= value; } public new event EventHandler RightToLeftChanged { add => _baseTextBox.RightToLeftChanged += value; remove => _baseTextBox.RightToLeftChanged -= value; } public new event EventHandler SizeChanged { add => _baseTextBox.SizeChanged += value; remove => _baseTextBox.SizeChanged -= value; } public new event EventHandler StyleChanged { add => _baseTextBox.StyleChanged += value; remove => _baseTextBox.StyleChanged -= value; } public new event EventHandler SystemColorsChanged { add => _baseTextBox.SystemColorsChanged += value; remove => _baseTextBox.SystemColorsChanged -= value; } public new event EventHandler TabIndexChanged { add => _baseTextBox.TabIndexChanged += value; remove => _baseTextBox.TabIndexChanged -= value; } public new event EventHandler TabStopChanged { add => _baseTextBox.TabStopChanged += value; remove => _baseTextBox.TabStopChanged -= value; } public event EventHandler TextAlignChanged { add => _baseTextBox.TextAlignChanged += value; remove => _baseTextBox.TextAlignChanged -= value; } public new event EventHandler TextChanged { add => _baseTextBox.TextChanged += value; remove => _baseTextBox.TextChanged -= value; } public new event EventHandler Validated { add => _baseTextBox.Validated += value; remove => _baseTextBox.Validated -= value; } public new event CancelEventHandler Validating { add => _baseTextBox.Validating += value; remove => _baseTextBox.Validating -= value; } public new event EventHandler VisibleChanged { add => _baseTextBox.VisibleChanged += value; remove => _baseTextBox.VisibleChanged -= value; } #endregion public MaterialSingleTextBox() { SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.DoubleBuffer, true); _animationManager = new AnimationManager { Increment = 0.06, AnimationType = AnimationType.EaseInOut, InterruptAnimation = false }; _animationManager.OnAnimationProgress += sender => Invalidate(); _baseTextBox = new BaseTextBox { BorderStyle = BorderStyle.None, Font = SkinManager.GetFontByType(MaterialSkinManager.FontType.Subtitle1), Location = new(0, 0), Width = Width, Height = Height - 5 }; if (!Controls.Contains(_baseTextBox) && !DesignMode) { Controls.Add(_baseTextBox); } _baseTextBox.GotFocus += (sender, args) => _animationManager.StartNewAnimation(AnimationDirection.In); _baseTextBox.LostFocus += (sender, args) => _animationManager.StartNewAnimation(AnimationDirection.Out); BackColorChanged += (sender, args) => { _baseTextBox.BackColor = BackColor; }; //Fix for tabstop _baseTextBox.TabStop = true; TabStop = false; } protected override void OnPaint(PaintEventArgs pevent) { Graphics g = pevent.Graphics; g.Clear(Parent.BackColor == Color.Transparent ? ((Parent.Parent == null || (Parent.Parent != null && Parent.Parent.BackColor == Color.Transparent)) ? SystemColors.Control : Parent.Parent.BackColor) : Parent.BackColor); int lineY = _baseTextBox.Bottom + 3; if (!_animationManager.IsAnimating()) { //No animation g.FillRectangle(_baseTextBox.Focused ? UseAccentColor ? SkinManager.ColorScheme.AccentBrush : SkinManager.ColorScheme.PrimaryBrush : SkinManager.DividersBrush, _baseTextBox.Location.X, lineY, _baseTextBox.Width, _baseTextBox.Focused ? 2 : 1); } else { //Animate int animationWidth = (int)(_baseTextBox.Width * _animationManager.GetProgress()); int halfAnimationWidth = animationWidth / 2; int animationStart = _baseTextBox.Location.X + (_baseTextBox.Width / 2); //Unfocused background g.FillRectangle(SkinManager.DividersBrush, _baseTextBox.Location.X, lineY, _baseTextBox.Width, 1); //Animated focus transition g.FillRectangle(UseAccentColor ? SkinManager.ColorScheme.AccentBrush : SkinManager.ColorScheme.PrimaryBrush, animationStart - halfAnimationWidth, lineY, animationWidth, 2); } } protected override void OnResize(EventArgs e) { base.OnResize(e); _baseTextBox.Location = new(0, 0); _baseTextBox.Width = Width; Height = _baseTextBox.Height + 5; } protected override void OnCreateControl() { base.OnCreateControl(); _baseTextBox.BackColor = Parent.BackColor == Color.Transparent ? ((Parent.Parent == null || (Parent.Parent != null && Parent.Parent.BackColor == Color.Transparent)) ? SystemColors.Control : Parent.Parent.BackColor) : Parent.BackColor; } private class BaseTextBox : TextBox { [DllImport("user32.dll", CharSet = CharSet.Unicode)] private static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, string lParam); private const int EM_SETCUEBANNER = 0x1501; private const char EmptyChar = (char)0; private const char VisualStylePasswordChar = '\u25CF'; private const char NonVisualStylePasswordChar = '\u002A'; private string hint = string.Empty; public string Hint { get => hint; set { hint = value; SendMessage(Handle, EM_SETCUEBANNER, (int)IntPtr.Zero, Hint); } } private char _passwordChar = EmptyChar; public new char PasswordChar { get => _passwordChar; set { _passwordChar = value; SetBasePasswordChar(); } } public new void SelectAll() { BeginInvoke((MethodInvoker)delegate () { base.Focus(); base.SelectAll(); }); } public new void Focus() { BeginInvoke((MethodInvoker)delegate () { base.Focus(); }); } private char _useSystemPasswordChar = EmptyChar; public new bool UseSystemPasswordChar { get => _useSystemPasswordChar != EmptyChar; set { if (value) { _useSystemPasswordChar = Application.RenderWithVisualStyles ? VisualStylePasswordChar : NonVisualStylePasswordChar; } else { _useSystemPasswordChar = EmptyChar; } SetBasePasswordChar(); } } #if NETCOREAPP3_1 || NET6_0 || NET7_0 || NET8_0 || NET9_0 //public EventHandler ContextMenuChanged { get; internal set; } public event EventHandler ContextMenuChanged; #endif private void SetBasePasswordChar() { base.PasswordChar = UseSystemPasswordChar ? _useSystemPasswordChar : _passwordChar; } public BaseTextBox() { MaterialContextMenuStrip cms = new TextBoxContextMenuStrip(); cms.Opening += ContextMenuStripOnOpening; cms.OnItemClickStart += ContextMenuStripOnItemClickStart; ContextMenuStrip = cms; } private void ContextMenuStripOnItemClickStart(object sender, ToolStripItemClickedEventArgs toolStripItemClickedEventArgs) { switch (toolStripItemClickedEventArgs.ClickedItem.Text) { case "Undo": Undo(); break; case "Cut": Cut(); break; case "Copy": Copy(); break; case "Paste": Paste(); break; case "Delete": SelectedText = string.Empty; break; case "Select All": SelectAll(); break; } } private void ContextMenuStripOnOpening(object sender, CancelEventArgs cancelEventArgs) { if (sender is TextBoxContextMenuStrip strip) { strip.Undo.Enabled = CanUndo; strip.Cut.Enabled = !string.IsNullOrEmpty(SelectedText); strip.Copy.Enabled = !string.IsNullOrEmpty(SelectedText); strip.Paste.Enabled = Clipboard.ContainsText(); strip.Delete.Enabled = !string.IsNullOrEmpty(SelectedText); strip.SelectAll.Enabled = !string.IsNullOrEmpty(Text); } } } private class TextBoxContextMenuStrip : MaterialContextMenuStrip { public readonly ToolStripItem Undo = new MaterialToolStripMenuItem { Text = "Undo" }; public readonly ToolStripItem Separator1 = new ToolStripSeparator(); public readonly ToolStripItem Cut = new MaterialToolStripMenuItem { Text = "Cut" }; public readonly ToolStripItem Copy = new MaterialToolStripMenuItem { Text = "Copy" }; public readonly ToolStripItem Paste = new MaterialToolStripMenuItem { Text = "Paste" }; public readonly ToolStripItem Delete = new MaterialToolStripMenuItem { Text = "Delete" }; public readonly ToolStripItem Separator2 = new ToolStripSeparator(); public readonly ToolStripItem SelectAll = new MaterialToolStripMenuItem { Text = "Select All" }; public TextBoxContextMenuStrip() { Items.AddRange(new[] { Undo, Separator1, Cut, Copy, Paste, Delete, Separator2, SelectAll }); } } } #endregion }