250 lines
7.0 KiB
C#
250 lines
7.0 KiB
C#
#if FRAMEWORK20
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
|
|
namespace DevComponents.Editors
|
|
{
|
|
public class IpAddressGroup : VisualInputGroup
|
|
{
|
|
#region Events
|
|
public event EventHandler ValueChanged;
|
|
#endregion
|
|
|
|
#region Constructors
|
|
/// <summary>
|
|
/// Initializes a new instance of the IPAddressGroup class.
|
|
/// </summary>
|
|
public IpAddressGroup()
|
|
{
|
|
// Create IP4 default items
|
|
for (int i = 0; i < 4; i++)
|
|
{
|
|
VisualIntegerInput input = new VisualIntegerInput();
|
|
input.MaxValue = 255;
|
|
input.MinValue = 0;
|
|
this.Items.Add(input);
|
|
if (i < 3)
|
|
{
|
|
VisualLabel label = new VisualLabel();
|
|
label.Text = ".";
|
|
this.Items.Add(label);
|
|
}
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region Internal Implementation
|
|
private string _Value;
|
|
public string Value
|
|
{
|
|
get
|
|
{
|
|
if (this.IsFocused)
|
|
{
|
|
if (IsInputValid())
|
|
return GetCurrentInputValue();
|
|
}
|
|
return _Value;
|
|
}
|
|
set
|
|
{
|
|
bool valueChanged = _Value != value;
|
|
if (!string.IsNullOrEmpty(value))
|
|
{
|
|
if (!IsValueValid(value))
|
|
throw new ArgumentException("Value is not valid IP value");
|
|
}
|
|
_Value = value;
|
|
UpdateInputItems();
|
|
if(valueChanged)
|
|
OnValueChanged(EventArgs.Empty);
|
|
}
|
|
}
|
|
|
|
bool _UpdatingInputItems = false;
|
|
private void UpdateInputItems()
|
|
{
|
|
if (_UpdatingInputItems) return;
|
|
|
|
_UpdatingInputItems = true;
|
|
try
|
|
{
|
|
if (string.IsNullOrEmpty(_Value))
|
|
{
|
|
// Clear all input
|
|
for (int i = 0; i < this.Items.Count; i++)
|
|
{
|
|
if (this.Items[i] is VisualIntegerInput)
|
|
{
|
|
VisualIntegerInput input = this.Items[i] as VisualIntegerInput;
|
|
input.IsEmpty = true;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
int[] value = ParseIPv4Value(_Value);
|
|
int index = 0;
|
|
for (int i = 0; i < this.Items.Count; i++)
|
|
{
|
|
if (this.Items[i] is VisualIntegerInput)
|
|
{
|
|
VisualIntegerInput input = this.Items[i] as VisualIntegerInput;
|
|
input.Value = value[index];
|
|
index++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
_UpdatingInputItems = false;
|
|
}
|
|
}
|
|
|
|
private void OnValueChanged(EventArgs e)
|
|
{
|
|
EventHandler handler = ValueChanged;
|
|
if (handler != null) ValueChanged(this, e);
|
|
}
|
|
|
|
internal bool IsValueValid(string ipValue)
|
|
{
|
|
int[] value = ParseIPv4Value(ipValue);
|
|
return value != null;
|
|
}
|
|
|
|
private int[] ParseIPv4Value(string ipValue)
|
|
{
|
|
if (string.IsNullOrEmpty(ipValue)) return null;
|
|
string[] parts = ipValue.Split('.');
|
|
if (parts.Length != 4) return null;
|
|
|
|
int[] value = new int[4];
|
|
|
|
for (int i = 0; i < parts.Length; i++)
|
|
{
|
|
int partValue = 0;
|
|
if (int.TryParse(parts[i], out partValue))
|
|
{
|
|
if (partValue < 0 || partValue > 255) return null;
|
|
value[i] = partValue;
|
|
}
|
|
else return null;
|
|
}
|
|
|
|
return value;
|
|
}
|
|
|
|
private bool IsInputValid()
|
|
{
|
|
bool allEmpty = true;
|
|
for (int i = 0; i < this.Items.Count; i++)
|
|
{
|
|
VisualIntegerInput input = this.Items[i] as VisualIntegerInput;
|
|
if (input != null)
|
|
{
|
|
if (input.IsEmpty)
|
|
{
|
|
if (!allEmpty && AllowEmptyState) return false;
|
|
}
|
|
else
|
|
{
|
|
if (allEmpty && i > 0) return false;
|
|
allEmpty = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
protected override void OnLostFocus()
|
|
{
|
|
UpdateValue();
|
|
base.OnLostFocus();
|
|
}
|
|
|
|
protected override void OnInputChanged(VisualInputBase input)
|
|
{
|
|
if (!_UpdatingInputItems && GetCurrentInputValue() != null)
|
|
{
|
|
_UpdatingInputItems = true; // Stop update of UI items
|
|
try
|
|
{
|
|
UpdateValue();
|
|
}
|
|
finally
|
|
{
|
|
_UpdatingInputItems = false;
|
|
}
|
|
}
|
|
base.OnInputChanged(input);
|
|
}
|
|
|
|
private string GetCurrentInputValue()
|
|
{
|
|
int[] value = new int[4];
|
|
int index = 0;
|
|
bool isInvalid = false;
|
|
for (int i = 0; i < this.Items.Count; i++)
|
|
{
|
|
VisualIntegerInput input = this.Items[i] as VisualIntegerInput;
|
|
if (input != null)
|
|
{
|
|
if (input.IsEmpty)
|
|
{
|
|
if (!this.AllowEmptyState)
|
|
value[index] = 0;
|
|
else
|
|
{
|
|
isInvalid = true;
|
|
break;
|
|
}
|
|
}
|
|
value[index] = input.Value;
|
|
index++;
|
|
}
|
|
}
|
|
|
|
if (isInvalid)
|
|
return null;
|
|
else
|
|
{
|
|
string s = "";
|
|
for (int i = 0; i < value.Length; i++)
|
|
{
|
|
s += value[i].ToString();
|
|
if (i < value.Length - 1)
|
|
s += ".";
|
|
|
|
}
|
|
return s;
|
|
}
|
|
}
|
|
|
|
private void UpdateValue()
|
|
{
|
|
Value = GetCurrentInputValue();
|
|
}
|
|
|
|
private bool _ResettingValue = false;
|
|
protected override void ResetValue()
|
|
{
|
|
_ResettingValue = true;
|
|
try
|
|
{
|
|
this.Value = null;
|
|
}
|
|
finally
|
|
{
|
|
_ResettingValue = false;
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
|
|
}
|
|
}
|
|
#endif |