208 lines
6.0 KiB
C#

#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