Gonzo.Elements.UITextEdit.Update C# (CSharp) Method

Update() public method

public Update ( InputHelper Input, GameTime GTime ) : void
Input InputHelper
GTime Microsoft.Xna.Framework.GameTime
return void
        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;
                            }
                        }
                    }
                }
            }
        }