DotNet 4.8.1 build of DotNetBar
This commit is contained in:
207
PROMS/DotNetBar Source Code/Editors/VisualListInput.cs
Normal file
207
PROMS/DotNetBar Source Code/Editors/VisualListInput.cs
Normal file
@@ -0,0 +1,207 @@
|
||||
#if FRAMEWORK20
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Drawing;
|
||||
using DevComponents.DotNetBar;
|
||||
|
||||
namespace DevComponents.Editors
|
||||
{
|
||||
public class VisualListInput : VisualInputBase
|
||||
{
|
||||
#region Private Variables
|
||||
#endregion
|
||||
|
||||
#region Events
|
||||
#endregion
|
||||
|
||||
#region Constructor
|
||||
#endregion
|
||||
|
||||
#region Internal Implementation
|
||||
protected override bool OnCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
|
||||
{
|
||||
if (keyData == System.Windows.Forms.Keys.Up)
|
||||
{
|
||||
SelectPrevious();
|
||||
return true;
|
||||
}
|
||||
else if (keyData == System.Windows.Forms.Keys.Down)
|
||||
{
|
||||
SelectNext();
|
||||
return true;
|
||||
}
|
||||
return base.OnCmdKey(ref msg, keyData);
|
||||
}
|
||||
|
||||
protected override void OnMouseWheel(System.Windows.Forms.MouseEventArgs e)
|
||||
{
|
||||
if (!this.IsReadOnly)
|
||||
{
|
||||
if (e.Delta > 0)
|
||||
{
|
||||
SelectNext();
|
||||
}
|
||||
else
|
||||
{
|
||||
SelectPrevious();
|
||||
}
|
||||
}
|
||||
|
||||
base.OnMouseWheel(e);
|
||||
}
|
||||
|
||||
protected override bool ValidateNewInputStack(string s)
|
||||
{
|
||||
if (s.Length == 0 && !_AllowEmptyState)
|
||||
return false;
|
||||
return base.ValidateNewInputStack(s);
|
||||
}
|
||||
|
||||
public virtual void SelectNext()
|
||||
{
|
||||
if (this.IsReadOnly) return;
|
||||
ResetInputStack();
|
||||
InputComplete(false);
|
||||
}
|
||||
|
||||
public virtual void SelectPrevious()
|
||||
{
|
||||
if (this.IsReadOnly) return;
|
||||
|
||||
ResetInputStack();
|
||||
InputComplete(false);
|
||||
}
|
||||
|
||||
protected override void ResetValue()
|
||||
{
|
||||
if (SetInputStack(""))
|
||||
{
|
||||
SetInputPosition(InputStack.Length);
|
||||
}
|
||||
base.ResetValue();
|
||||
}
|
||||
|
||||
public override void PerformLayout(PaintInfo p)
|
||||
{
|
||||
Size size = Size.Empty;
|
||||
Graphics g = p.Graphics;
|
||||
Font font = p.DefaultFont;
|
||||
eTextFormat textFormat = eTextFormat.Default | eTextFormat.NoPadding;
|
||||
|
||||
string s = GetMeasureString();
|
||||
|
||||
size = TextDrawing.MeasureString(g, s, font, 0, textFormat);
|
||||
size.Width++; // Additional pixel for selection
|
||||
this.Size = size;
|
||||
|
||||
base.PerformLayout(p);
|
||||
}
|
||||
|
||||
protected virtual string GetMeasureString()
|
||||
{
|
||||
string s = GetRenderString();
|
||||
if (s.Length == 0) s = "T";
|
||||
return s;
|
||||
}
|
||||
|
||||
protected override void OnPaint(PaintInfo p)
|
||||
{
|
||||
Graphics g = p.Graphics;
|
||||
Font font = p.DefaultFont;
|
||||
Color color = p.ForeColor;
|
||||
if (!GetIsEnabled(p))
|
||||
color = p.DisabledForeColor;
|
||||
eTextFormat textFormat = eTextFormat.Default | eTextFormat.NoPadding;
|
||||
|
||||
string text = GetRenderString();
|
||||
Rectangle selectionBounds = this.RenderBounds;
|
||||
Region oldClip = null;
|
||||
|
||||
if (this.IsFocused && this.InputStack.Length > 0 && this.InputStack.Length < text.Length)
|
||||
{
|
||||
// Render partial selection based on the input stack
|
||||
Size inputSize = TextDrawing.MeasureString(g, text.Substring(0, this.InputStack.Length), font);
|
||||
oldClip = g.Clip;
|
||||
Rectangle newClip = selectionBounds;
|
||||
if (this.IsRightToLeft)
|
||||
{
|
||||
newClip.X += newClip.Width - inputSize.Width;
|
||||
newClip.Width = inputSize.Width;
|
||||
selectionBounds.Width -= inputSize.Width;
|
||||
}
|
||||
else
|
||||
{
|
||||
newClip.Width = inputSize.Width;
|
||||
selectionBounds.X += inputSize.Width;
|
||||
selectionBounds.Width -= inputSize.Width;
|
||||
}
|
||||
g.SetClip(newClip, System.Drawing.Drawing2D.CombineMode.Intersect);
|
||||
TextDrawing.DrawString(g, text, font, color, RenderBounds, textFormat);
|
||||
g.Clip = oldClip;
|
||||
g.SetClip(selectionBounds, System.Drawing.Drawing2D.CombineMode.Intersect);
|
||||
}
|
||||
|
||||
|
||||
if (this.IsFocused)
|
||||
{
|
||||
if (p.Colors.Highlight.IsEmpty)
|
||||
g.FillRectangle(SystemBrushes.Highlight, selectionBounds);
|
||||
else
|
||||
{
|
||||
using (SolidBrush brush = new SolidBrush(p.Colors.Highlight))
|
||||
g.FillRectangle(brush, selectionBounds);
|
||||
}
|
||||
color = p.Colors.HighlightText.IsEmpty ? SystemColors.HighlightText : p.Colors.HighlightText;
|
||||
}
|
||||
|
||||
if (!this.IsEmpty)
|
||||
{
|
||||
TextDrawing.DrawString(g, text, font, color, RenderBounds, textFormat);
|
||||
}
|
||||
|
||||
if (oldClip != null)
|
||||
g.Clip = oldClip;
|
||||
|
||||
base.OnPaint(p);
|
||||
}
|
||||
|
||||
protected virtual string GetRenderString()
|
||||
{
|
||||
return GetInputStringValue();
|
||||
}
|
||||
|
||||
public override bool IsEmpty
|
||||
{
|
||||
get
|
||||
{
|
||||
return GetInputStringValue().Length == 0;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value != IsEmpty)
|
||||
{
|
||||
if (value && _AllowEmptyState)
|
||||
{
|
||||
ResetValue();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private bool _AllowEmptyState = true;
|
||||
/// <summary>
|
||||
/// Gets or sets whether control allows empty input state i.e. does not have an text entered. Default value is true.
|
||||
/// </summary>
|
||||
public bool AllowEmptyState
|
||||
{
|
||||
get { return _AllowEmptyState; }
|
||||
set { _AllowEmptyState = value; }
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user