2013-09-21 17:34:24 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.Globalization;
|
|
|
|
|
using System.Windows.Forms;
|
|
|
|
|
namespace BizHawk.MultiClient
|
|
|
|
|
{
|
2013-09-21 23:55:17 +00:00
|
|
|
|
class WatchValueBox : TextBox, INumberBox
|
2013-09-21 17:34:24 +00:00
|
|
|
|
{
|
|
|
|
|
private Watch.WatchSize _size = Watch.WatchSize.Byte;
|
|
|
|
|
private Watch.DisplayType _type = Watch.DisplayType.Hex;
|
|
|
|
|
|
|
|
|
|
public WatchValueBox()
|
|
|
|
|
{
|
|
|
|
|
CharacterCasing = CharacterCasing.Upper;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Watch.WatchSize ByteSize
|
|
|
|
|
{
|
|
|
|
|
get { return _size; }
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
if (_size != value)
|
|
|
|
|
{
|
|
|
|
|
if (!Watch.AvailableTypes(value).Contains(_type))
|
|
|
|
|
{
|
|
|
|
|
Type = Watch.AvailableTypes(value)[0];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
_size = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Watch.DisplayType Type
|
|
|
|
|
{
|
|
|
|
|
get { return _type; }
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
_type = value;
|
|
|
|
|
switch(_type)
|
|
|
|
|
{
|
|
|
|
|
default:
|
|
|
|
|
MaxLength = 8;
|
|
|
|
|
break;
|
|
|
|
|
case Watch.DisplayType.Binary:
|
|
|
|
|
switch (_size)
|
|
|
|
|
{
|
|
|
|
|
default:
|
|
|
|
|
case Watch.WatchSize.Byte:
|
|
|
|
|
MaxLength = 8;
|
|
|
|
|
break;
|
|
|
|
|
case Watch.WatchSize.Word:
|
|
|
|
|
MaxLength = 16;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case Watch.DisplayType.Hex:
|
|
|
|
|
switch (_size)
|
|
|
|
|
{
|
|
|
|
|
default:
|
|
|
|
|
case Watch.WatchSize.Byte:
|
|
|
|
|
MaxLength = 2;
|
|
|
|
|
break;
|
|
|
|
|
case Watch.WatchSize.Word:
|
|
|
|
|
MaxLength = 4;
|
|
|
|
|
break;
|
|
|
|
|
case Watch.WatchSize.DWord:
|
|
|
|
|
MaxLength = 8;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case Watch.DisplayType.Signed:
|
|
|
|
|
switch (_size)
|
|
|
|
|
{
|
|
|
|
|
default:
|
|
|
|
|
case Watch.WatchSize.Byte:
|
|
|
|
|
MaxLength = 4;
|
|
|
|
|
break;
|
|
|
|
|
case Watch.WatchSize.Word:
|
|
|
|
|
MaxLength = 6;
|
|
|
|
|
break;
|
|
|
|
|
case Watch.WatchSize.DWord:
|
|
|
|
|
MaxLength = 11;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case Watch.DisplayType.Unsigned:
|
|
|
|
|
switch (_size)
|
|
|
|
|
{
|
|
|
|
|
default:
|
|
|
|
|
case Watch.WatchSize.Byte:
|
|
|
|
|
MaxLength = 3;
|
|
|
|
|
break;
|
|
|
|
|
case Watch.WatchSize.Word:
|
|
|
|
|
MaxLength = 5;
|
|
|
|
|
break;
|
|
|
|
|
case Watch.WatchSize.DWord:
|
|
|
|
|
MaxLength = 10;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case Watch.DisplayType.Float:
|
|
|
|
|
case Watch.DisplayType.FixedPoint_12_4:
|
|
|
|
|
case Watch.DisplayType.FixedPoint_20_12:
|
|
|
|
|
MaxLength = 32;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void OnKeyPress(KeyPressEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if (e.KeyChar == '\b' || e.KeyChar == 22 || e.KeyChar == 1 || e.KeyChar == 3)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (e.KeyChar == '.')
|
|
|
|
|
{
|
|
|
|
|
if (Text.Contains("."))
|
|
|
|
|
{
|
|
|
|
|
e.Handled = true;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (e.KeyChar == '-')
|
|
|
|
|
{
|
|
|
|
|
if (Text.Contains("-"))
|
|
|
|
|
{
|
|
|
|
|
e.Handled = true;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch(_type)
|
|
|
|
|
{
|
|
|
|
|
default:
|
|
|
|
|
case Watch.DisplayType.Binary:
|
|
|
|
|
if (!InputValidate.IsValidBinaryNumber(e.KeyChar))
|
|
|
|
|
{
|
|
|
|
|
e.Handled = true;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case Watch.DisplayType.FixedPoint_12_4:
|
|
|
|
|
case Watch.DisplayType.FixedPoint_20_12:
|
|
|
|
|
if (!InputValidate.IsValidFixedPointNumber(e.KeyChar))
|
|
|
|
|
{
|
|
|
|
|
e.Handled = true;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case Watch.DisplayType.Float:
|
|
|
|
|
if (!InputValidate.IsValidDecimalNumber(e.KeyChar))
|
|
|
|
|
{
|
|
|
|
|
e.Handled = true;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case Watch.DisplayType.Hex:
|
|
|
|
|
if (!InputValidate.IsValidHexNumber(e.KeyChar))
|
|
|
|
|
{
|
|
|
|
|
e.Handled = true;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case Watch.DisplayType.Signed:
|
|
|
|
|
if (!InputValidate.IsValidSignedNumber(e.KeyChar))
|
|
|
|
|
{
|
|
|
|
|
e.Handled = true;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case Watch.DisplayType.Unsigned:
|
|
|
|
|
if (!InputValidate.IsValidUnsignedNumber(e.KeyChar))
|
|
|
|
|
{
|
|
|
|
|
e.Handled = true;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void OnKeyDown(KeyEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if (e.KeyCode == Keys.Up)
|
|
|
|
|
{
|
2013-09-28 20:20:43 +00:00
|
|
|
|
int val = ToRawInt();
|
2013-09-28 00:10:06 +00:00
|
|
|
|
val++;
|
|
|
|
|
|
|
|
|
|
switch (_type)
|
|
|
|
|
{
|
|
|
|
|
default:
|
|
|
|
|
Text = val.ToString();
|
|
|
|
|
break;
|
|
|
|
|
case Watch.DisplayType.Binary:
|
|
|
|
|
throw new NotImplementedException();
|
|
|
|
|
case Watch.DisplayType.Hex:
|
|
|
|
|
string formatstr = "{0:X" + MaxLength.ToString() + "}";
|
|
|
|
|
Text = String.Format(formatstr, val);
|
|
|
|
|
break;
|
|
|
|
|
}
|
2013-09-21 17:34:24 +00:00
|
|
|
|
}
|
|
|
|
|
else if (e.KeyCode == Keys.Down)
|
|
|
|
|
{
|
2013-09-28 20:20:43 +00:00
|
|
|
|
int val = ToRawInt();
|
2013-09-28 00:10:06 +00:00
|
|
|
|
val--;
|
|
|
|
|
|
|
|
|
|
switch (_type)
|
|
|
|
|
{
|
|
|
|
|
default:
|
|
|
|
|
Text = val.ToString();
|
|
|
|
|
break;
|
|
|
|
|
case Watch.DisplayType.Binary:
|
|
|
|
|
throw new NotImplementedException();
|
|
|
|
|
case Watch.DisplayType.Hex:
|
|
|
|
|
string formatstr = "{0:X" + MaxLength.ToString() + "}";
|
|
|
|
|
Text = String.Format(formatstr, val);
|
|
|
|
|
break;
|
|
|
|
|
}
|
2013-09-21 17:34:24 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
base.OnKeyDown(e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2013-09-28 00:10:06 +00:00
|
|
|
|
protected override void OnTextChanged(EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if (String.IsNullOrWhiteSpace(Text))
|
|
|
|
|
{
|
|
|
|
|
Text = "0";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2013-09-28 20:20:43 +00:00
|
|
|
|
public int ToRawInt()
|
2013-09-21 17:34:24 +00:00
|
|
|
|
{
|
2013-09-28 00:10:06 +00:00
|
|
|
|
if (String.IsNullOrWhiteSpace(Text))
|
2013-09-21 17:34:24 +00:00
|
|
|
|
{
|
2013-09-28 00:10:06 +00:00
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
switch (_type)
|
|
|
|
|
{
|
|
|
|
|
default:
|
2013-09-28 20:20:43 +00:00
|
|
|
|
case Watch.DisplayType.Signed:
|
2013-09-28 00:10:06 +00:00
|
|
|
|
return int.Parse(Text);
|
2013-09-28 20:20:43 +00:00
|
|
|
|
case Watch.DisplayType.Unsigned:
|
|
|
|
|
return (int)uint.Parse(Text);
|
2013-09-28 00:10:06 +00:00
|
|
|
|
case Watch.DisplayType.Binary:
|
|
|
|
|
return Convert.ToInt32(Text, 2);
|
|
|
|
|
case Watch.DisplayType.Hex:
|
|
|
|
|
return int.Parse(Text, NumberStyles.HexNumber);
|
2013-09-28 20:20:43 +00:00
|
|
|
|
case Watch.DisplayType.FixedPoint_12_4:
|
|
|
|
|
return (int)(double.Parse(Text) * 16.0);
|
|
|
|
|
case Watch.DisplayType.FixedPoint_20_12:
|
|
|
|
|
return (int)(double.Parse(Text) * 4096.0);
|
|
|
|
|
case Watch.DisplayType.Float:
|
|
|
|
|
float val = float.Parse(Text);
|
|
|
|
|
byte[] bytes = BitConverter.GetBytes(val);
|
|
|
|
|
return BitConverter.ToInt32(bytes, 0);
|
2013-09-28 00:10:06 +00:00
|
|
|
|
}
|
2013-09-21 17:34:24 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|