public override void Update(InputHelper Input, GameTime GTime)
{
base.Update(Input, GTime);
if (m_Mode != TextEditMode.ReadOnly)
{
m_VerticalTextBoundary = (int)(Position.X + m_Font.MeasureString(m_Lines[m_Cursor.LineIndex].SBuilder.ToString()).X);
m_IsUpperCase = IsUpperCase(Input);
if (m_HasFocus)
{
Keys[] PressedKeys = Input.CurrentKeyboardState.GetPressedKeys();
foreach (Keys K in PressedKeys)
{
if (Input.IsNewPress(K))
{
switch (K)
{
case Keys.Divide:
if (m_Cursor.CharacterIndex < m_Lines[m_Cursor.LineIndex].SBuilder.Length)
m_Lines[m_Cursor.LineIndex].SBuilder[m_Cursor.CharacterIndex] = '/';
else
m_Lines[m_Cursor.LineIndex].SBuilder.Append("/");
m_Cursor.Position.X += m_Font.MeasureString("/").X;
m_Cursor.CharacterIndex++;
m_RemovingTxt = false;
break;
case Keys.OemSemicolon:
if (Input.InputRegion != null)
{
switch (Input.InputRegion.LayoutName)
{
case "English":
if (m_Cursor.CharacterIndex < m_Lines[m_Cursor.LineIndex].SBuilder.Length)
m_Lines[m_Cursor.LineIndex].SBuilder[m_Cursor.CharacterIndex] = ';';
else
m_Lines[m_Cursor.LineIndex].SBuilder.Append(";");
m_Cursor.CharacterIndex++;
m_MovingCursor = false;
m_RemovingTxt = false;
m_Cursor.Position.X += m_Font.MeasureString(";").X;
break;
}
}
break;
case Keys.OemQuotes:
if (Input.InputRegion != null)
{
switch (Input.InputRegion.LayoutName)
{
case "English": //TODO: Should this be double quote if upper??
if (m_Cursor.CharacterIndex < m_Lines[m_Cursor.LineIndex].SBuilder.Length)
m_Lines[m_Cursor.LineIndex].SBuilder[m_Cursor.CharacterIndex] = '\'';
else
m_Lines[m_Cursor.LineIndex].SBuilder.Append("'");
m_Cursor.CharacterIndex++;
m_MovingCursor = false;
m_RemovingTxt = false;
m_Cursor.Position.X += m_Font.MeasureString("'").X;
break;
}
}
break;
case Keys.OemCloseBrackets:
if (Input.InputRegion != null)
{
switch (Input.InputRegion.LayoutName)
{
case "English":
if (m_Cursor.CharacterIndex < m_Lines[m_Cursor.LineIndex].SBuilder.Length)
m_Lines[m_Cursor.LineIndex].SBuilder[m_Cursor.CharacterIndex] = '}';
else
m_Lines[m_Cursor.LineIndex].SBuilder.Append("}");
m_Cursor.Position.X += m_Font.MeasureString("}").X;
break;
case "Norwegian":
case "Swedish":
case "Finnish":
case "Danish":
if (IsUpperCase(Input))
{
if (m_Cursor.CharacterIndex < m_Lines[m_Cursor.LineIndex].SBuilder.Length)
m_Lines[m_Cursor.LineIndex].SBuilder[m_Cursor.CharacterIndex] = '^';
else
m_Lines[m_Cursor.LineIndex].SBuilder.Append("^");
m_Cursor.Position.X += m_Font.MeasureString("^").X;
}
else if (Input.IsCurPress(Keys.RightAlt))
{
if (m_Cursor.CharacterIndex < m_Lines[m_Cursor.LineIndex].SBuilder.Length)
m_Lines[m_Cursor.LineIndex].SBuilder[m_Cursor.CharacterIndex] = '~';
else
m_Lines[m_Cursor.LineIndex].SBuilder.Append("~");
m_Cursor.Position.X += m_Font.MeasureString("~").X;
}
break;
}
}
m_Cursor.CharacterIndex++;
m_MovingCursor = false;
m_RemovingTxt = false;
break;
case Keys.OemPlus:
if (m_Cursor.CharacterIndex < m_Lines[m_Cursor.LineIndex].SBuilder.Length)
m_Lines[m_Cursor.LineIndex].SBuilder[m_Cursor.CharacterIndex] = '+';
else
m_Lines[m_Cursor.LineIndex].SBuilder.Append("+");
m_Cursor.Position.X += m_Font.MeasureString("+").X;
m_Cursor.CharacterIndex++;
m_MovingCursor = false;
m_RemovingTxt = false;
break;
case Keys.OemComma:
if (IsUpperCase(Input))
{
if (m_Cursor.CharacterIndex < m_Lines[m_Cursor.LineIndex].SBuilder.Length)
m_Lines[m_Cursor.LineIndex].SBuilder[m_Cursor.CharacterIndex] = ';';
else
m_Lines[m_Cursor.LineIndex].SBuilder.Append(";");
m_Cursor.Position.X += m_Font.MeasureString(";").X;
}
else
{
if (m_Cursor.CharacterIndex < m_Lines[m_Cursor.LineIndex].SBuilder.Length)
m_Lines[m_Cursor.LineIndex].SBuilder[m_Cursor.CharacterIndex] = ',';
else
m_Lines[m_Cursor.LineIndex].SBuilder.Append(",");
m_Cursor.Position.X += m_Font.MeasureString(",").X;
}
m_Cursor.CharacterIndex++;
m_MovingCursor = false;
m_RemovingTxt = false;
break;
case Keys.OemPeriod:
if (m_Cursor.CharacterIndex < m_Lines[m_Cursor.LineIndex].SBuilder.Length)
m_Lines[m_Cursor.LineIndex].SBuilder[m_Cursor.CharacterIndex] = '.';
else
m_Lines[m_Cursor.LineIndex].SBuilder.Append(".");
m_Cursor.Position.X += m_Font.MeasureString(".").X;
m_Cursor.CharacterIndex++;
m_MovingCursor = false;
m_RemovingTxt = false;
break;
case Keys.Space:
if (m_Cursor.CharacterIndex < m_Lines[m_Cursor.LineIndex].SBuilder.Length)
m_Lines[m_Cursor.LineIndex].SBuilder[m_Cursor.CharacterIndex] = ' ';
else
m_Lines[m_Cursor.LineIndex].SBuilder.Append(" ");
m_Cursor.Position.X += m_Font.MeasureString(" ").X;
m_Cursor.CharacterIndex++;
m_MovingCursor = false;
m_RemovingTxt = false;
break;
case Keys.Tab:
if (m_Cursor.CharacterIndex < m_Lines[m_Cursor.LineIndex].SBuilder.Length)
m_Lines[m_Cursor.LineIndex].SBuilder.Append(" "); //TODO: How to insert tab??
else
m_Lines[m_Cursor.LineIndex].SBuilder.Append(" ");
m_Cursor.Position.X += m_Font.MeasureString(" ").X;
m_Cursor.CharacterIndex++;
m_MovingCursor = false;
m_RemovingTxt = false;
break;
case Keys.Subtract:
if (m_Cursor.CharacterIndex < m_Lines[m_Cursor.LineIndex].SBuilder.Length)
m_Lines[m_Cursor.LineIndex].SBuilder[m_Cursor.CharacterIndex] = '-';
else
m_Lines[m_Cursor.LineIndex].SBuilder.Append("-");
m_Cursor.Position.X += m_Font.MeasureString("-").X;
m_Cursor.CharacterIndex++;
m_MovingCursor = false;
m_RemovingTxt = false;
break;
case Keys.NumPad0:
if (m_Cursor.CharacterIndex < m_Lines[m_Cursor.LineIndex].SBuilder.Length)
m_Lines[m_Cursor.LineIndex].SBuilder[m_Cursor.CharacterIndex] = '0';
else
m_Lines[m_Cursor.LineIndex].SBuilder.Append("0");
m_Cursor.Position.X += m_Font.MeasureString("0").X;
m_Cursor.CharacterIndex++;
m_MovingCursor = false;
m_RemovingTxt = false;
break;
case Keys.NumPad1:
if (m_Cursor.CharacterIndex < m_Lines[m_Cursor.LineIndex].SBuilder.Length)
m_Lines[m_Cursor.LineIndex].SBuilder[m_Cursor.CharacterIndex] = '1';
else
m_Lines[m_Cursor.LineIndex].SBuilder.Append("1");
m_Cursor.Position.X += m_Font.MeasureString("1").X;
m_Cursor.CharacterIndex++;
m_MovingCursor = false;
m_RemovingTxt = false;
break;
case Keys.NumPad2:
if (m_Cursor.CharacterIndex < m_Lines[m_Cursor.LineIndex].SBuilder.Length)
m_Lines[m_Cursor.LineIndex].SBuilder[m_Cursor.CharacterIndex] = '2';
else
m_Lines[m_Cursor.LineIndex].SBuilder.Append("2");
m_Cursor.Position.X += m_Font.MeasureString("2").X;
m_Cursor.CharacterIndex++;
m_MovingCursor = false;
m_RemovingTxt = false;
break;
case Keys.NumPad3:
if (m_Cursor.CharacterIndex < m_Lines[m_Cursor.LineIndex].SBuilder.Length)
m_Lines[m_Cursor.LineIndex].SBuilder[m_Cursor.CharacterIndex] = '3';
else
m_Lines[m_Cursor.LineIndex].SBuilder.Append("3");
m_Cursor.Position.X += m_Font.MeasureString("3").X;
m_Cursor.CharacterIndex++;
m_MovingCursor = false;
m_RemovingTxt = false;
break;
case Keys.NumPad4:
if (m_Cursor.CharacterIndex < m_Lines[m_Cursor.LineIndex].SBuilder.Length)
m_Lines[m_Cursor.LineIndex].SBuilder[m_Cursor.CharacterIndex] = '4';
else
m_Lines[m_Cursor.LineIndex].SBuilder.Append("4");
m_Cursor.Position.X += m_Font.MeasureString("4").X;
m_Cursor.CharacterIndex++;
m_MovingCursor = false;
m_RemovingTxt = false;
break;
case Keys.NumPad5:
if (m_Cursor.CharacterIndex < m_Lines[m_Cursor.LineIndex].SBuilder.Length)
m_Lines[m_Cursor.LineIndex].SBuilder[m_Cursor.CharacterIndex] = '5';
else
m_Lines[m_Cursor.LineIndex].SBuilder.Append("5");
m_Cursor.Position.X += m_Font.MeasureString("5").X;
m_Cursor.CharacterIndex++;
m_MovingCursor = false;
m_RemovingTxt = false;
break;
case Keys.NumPad6:
if (m_Cursor.CharacterIndex < m_Lines[m_Cursor.LineIndex].SBuilder.Length)
m_Lines[m_Cursor.LineIndex].SBuilder[m_Cursor.CharacterIndex] = '6';
else
m_Lines[m_Cursor.LineIndex].SBuilder.Append("6");
m_Cursor.Position.X += m_Font.MeasureString("6").X;
m_Cursor.CharacterIndex++;
m_MovingCursor = false;
m_RemovingTxt = false;
break;
case Keys.NumPad7:
if (m_Cursor.CharacterIndex < m_Lines[m_Cursor.LineIndex].SBuilder.Length)
m_Lines[m_Cursor.LineIndex].SBuilder[m_Cursor.CharacterIndex] = '7';
m_Cursor.Position.X += m_Font.MeasureString("7").X;
m_Cursor.CharacterIndex++;
m_MovingCursor = false;
m_RemovingTxt = false;
break;
case Keys.NumPad8:
if (m_Cursor.CharacterIndex < m_Lines[m_Cursor.LineIndex].SBuilder.Length)
m_Lines[m_Cursor.LineIndex].SBuilder[m_Cursor.CharacterIndex] = '8';
else
m_Lines[m_Cursor.LineIndex].SBuilder.Append("8");
m_Cursor.Position.X += m_Font.MeasureString("8").X;
m_Cursor.CharacterIndex++;
m_MovingCursor = false;
m_RemovingTxt = false;
break;
case Keys.NumPad9:
if (m_Cursor.CharacterIndex < m_Lines[m_Cursor.LineIndex].SBuilder.Length)
m_Lines[m_Cursor.LineIndex].SBuilder[m_Cursor.CharacterIndex] = '9';
else
m_Lines[m_Cursor.LineIndex].SBuilder.Append("9");
m_Cursor.Position.X += m_Font.MeasureString("9").X;
m_Cursor.CharacterIndex++;
m_MovingCursor = false;
m_RemovingTxt = false;
break;
case Keys.Multiply:
if (m_Cursor.CharacterIndex < m_Lines[m_Cursor.LineIndex].SBuilder.Length)
m_Lines[m_Cursor.LineIndex].SBuilder[m_Cursor.CharacterIndex] = '*';
else
m_Lines[m_Cursor.LineIndex].SBuilder.Append("*");
m_Cursor.Position.X += m_Font.MeasureString("*").X;
m_Cursor.CharacterIndex++;
m_MovingCursor = false;
m_RemovingTxt = false;
break;
case Keys.Enter:
if (m_NumLines > 1)
{
m_TextPosition.X = Position.X;
m_TextPosition.Y += m_Font.LineSpacing;
m_Lines.Add(new RenderableText() { SBuilder = new StringBuilder(), Position = m_TextPosition });
m_Cursor.Position.X = Position.X;
m_Cursor.Position.Y += m_Font.LineSpacing;
m_Cursor.LineIndex += 1;
m_Cursor.CharacterIndex = 0;
m_MovingCursor = false;
m_RemovingTxt = false;
}
break;
case Keys.Back:
m_RemovingTxt = true;
//Cursor hasn't been moved.
if (!m_MovingCursor)
{
if (m_Cursor.Position.X <= m_VerticalTextBoundary)
m_Cursor.Position.X = m_VerticalTextBoundary;
else
{
if (m_Cursor.Position.X > Position.X)
m_Cursor.Position.X -= m_Font.MeasureString("a").X;
}
}
//If the current line is empty, move the cursor up.
if (m_Lines[m_Cursor.LineIndex].SBuilder.Length == 0)
{
if (m_NumLines > 1)
{
m_TextPosition.Y -= m_Font.LineSpacing;
m_Cursor.Position.X = Position.X + m_Size.X;
m_Cursor.Position.Y -= m_Font.LineSpacing;
if (m_Cursor.LineIndex > 0)
{
m_Cursor.LineIndex--;
m_Cursor.CharacterIndex = m_Lines[m_Cursor.LineIndex].SBuilder.Length;
}
}
else
{
if (m_Cursor.LineIndex > 0)
m_Cursor.LineIndex--;
}
}
else
{
if (m_NumLines > 1)
{
m_Lines[m_Cursor.LineIndex].SBuilder.Remove((int)(m_Cursor.CharacterIndex - 1), 1);
m_Cursor.CharacterIndex--;
m_Cursor.Position.X -= m_Font.MeasureString("a").X;
}
else
{
m_Lines.Remove(m_Lines[m_Cursor.CharacterIndex]);
m_Cursor.CharacterIndex--;
m_Cursor.LineIndex--;
m_Cursor.Position.X -= m_Font.MeasureString("a").X;
}
}
//Cursor moved to the beginning of a line.
if (m_Cursor.Position.X <= Position.X)
{
m_TextPosition.Y -= m_Font.LineSpacing;
m_Cursor.Position.X = Position.X + m_Size.X;
m_Cursor.Position.Y -= m_Font.LineSpacing;
if (m_Cursor.LineIndex > 0)
{
m_Cursor.LineIndex--;
m_Cursor.CharacterIndex = m_Lines[m_Cursor.LineIndex].SBuilder.Length;
}
}
break;
case Keys.Left:
if (m_Cursor.Position.X > Position.X)
{
m_Cursor.Position.X -= m_Font.MeasureString("a").X;
m_Cursor.CharacterIndex--;
if (m_NumLines == 1)
m_Cursor.LineIndex--;
}
else if (m_Cursor.Position.X <= Position.X)
{
if (m_NumLines == 1)
{
for (int i = 0; i < m_Lines.Count; i++)
{
//Don't know why Line[0] doesn't work here...
if ((m_Lines[1].Position.X < Position.X))
m_Lines[i].Position.X += m_ScrollFactor;
if (m_Lines[i].Position.X > (Position.X + Size.X))
m_Lines[i].Visible = false;
if (m_Lines[i].Position.X > Position.X && m_Lines[i].Position.X < (Position.X + Size.X))
m_Lines[i].Visible = true;
}
}
}
m_MovingCursor = true;
m_RemovingTxt = false;
break;
case Keys.Right:
if (m_Cursor.Position.X < (Position.X + m_Size.X))
{
if (m_NumLines > 1)
{
if (m_Lines[m_Cursor.LineIndex].SBuilder.Length > 0 &&
m_Cursor.CharacterIndex < m_Lines[m_Cursor.LineIndex].SBuilder.Length)
{
m_Cursor.Position.X += m_Font.MeasureString("a").X;
m_Cursor.CharacterIndex++;
}
}
else //Single-line control, simple.
{
m_Cursor.Position.X += m_Font.MeasureString("a").X;
m_Cursor.CharacterIndex++;
m_Cursor.LineIndex++;
}
}
else if (m_Cursor.Position.X >= (Position.X + m_Size.X))
{
if (m_NumLines == 1)
{
for (int i = 0; i < m_Lines.Count; i++)
{
if ((m_Lines[m_Lines.Count - 1].Position.X >= (Position.X + m_Size.X)))
m_Lines[i].Position.X -= m_ScrollFactor;
if (m_Lines[i].Position.X < (Position.X + Size.X))
m_Lines[i].Visible = true;
if (m_Lines[i].Position.X < (Position.X + Size.X) &&
m_Lines[i].Position.X < Position.X)
m_Lines[i].Visible = false;
}
}
}
m_MovingCursor = true;
m_RemovingTxt = false;
break;
case Keys.Up:
if (m_NumLines > 1)
{
if (m_Cursor.Position.Y > Position.Y)
{
m_Cursor.Position.Y -= m_Font.LineSpacing;
m_Cursor.LineIndex--;
//Part of a line was most likely deleted, so readjust the cursor accordingly.
if (m_Cursor.CharacterIndex > m_Lines[m_Cursor.LineIndex].SBuilder.Length)
{
m_Cursor.CharacterIndex = m_Lines[m_Cursor.LineIndex].SBuilder.Length;
m_Cursor.Position.X = Position.X +
m_Font.MeasureString(m_Lines[m_Cursor.LineIndex].SBuilder.ToString()).X;
}
}
m_MovingCursor = true;
m_RemovingTxt = false;
}
break;
case Keys.Down:
if (m_NumLines > 1)
{
if (m_Cursor.Position.Y < (Position.Y + m_Size.Y))
{
if (m_Lines.Count >= 2)
{
if (m_Cursor.Position.Y < m_Lines[m_Lines.Count - 1].Position.Y)
{
m_Cursor.Position.Y += m_Font.LineSpacing;
m_Cursor.LineIndex++;
//Part of a line was most likely deleted, so readjust the cursor accordingly.
if (m_Cursor.CharacterIndex > m_Lines[m_Cursor.LineIndex].SBuilder.Length)
{
m_Cursor.CharacterIndex = m_Lines[m_Cursor.LineIndex].SBuilder.Length;
m_Cursor.Position.X = Position.X +
m_Font.MeasureString(m_Lines[m_Cursor.LineIndex].SBuilder.ToString()).X;
}
}
}
}
m_MovingCursor = true;
m_RemovingTxt = false;
}
break;
}
}
}
}
}
if (IsMouseOver(Input))
{
if (Input.IsNewPress(MouseButtons.LeftButton) || Input.IsCurPress(MouseButtons.LeftButton))
{
if (m_NumLines > 1)
{
if (m_Lines.Count > (Input.MousePosition.Y - Position.Y))
{
if (m_Lines[(int)(Input.MousePosition.Y - Position.Y)].SBuilder.ToString() != "")
{
m_Cursor.Position = Input.MousePosition;
m_Cursor.CharacterIndex = (int)((Input.MousePosition.X - Position.X) - 1);
m_Cursor.LineIndex = (int)((Input.MousePosition.Y - Position.Y) - 1);
m_MovingCursor = true;
}
}
}
else
{
if ((Position.X + m_Font.MeasureString(CurrentInput).X) > Input.MousePosition.X)
{
int ApproxChars = (int)(m_Font.MeasureString(CurrentInput).X / m_Lines.Count);
int Index = (int)Input.MousePosition.X / ApproxChars;
//TODO: Figure out how to access an index in the array based on mouse position.
if (m_Lines[Index - 1].SBuilder.ToString() != "")
{
m_Cursor.Position.X = Input.MousePosition.X;
m_Cursor.CharacterIndex = (int)(Index - 1);
m_Cursor.LineIndex = (int)(Index);
m_MovingCursor = true;
}
}
}
}
}
}