private void UpdateStateMachine()
        {
            // Stop editing the textBox
            EditorGUIUtility.editingTextField = false;

            // Update state machine
            RexISM.Update();

            // Only reenable editing if the state is NOT intelliselect
            if (RexISM.State != RexInputState.IntelliSelect)
            {
                EditorGUIUtility.editingTextField = true;
            }
            else
            {
                _inputField.MoveLineEnd();
            }

            if (RexISM.ShouldReplaceCode)
            {
                RexISM.Code = RexISM.ReplacementCode;
                //EditorGUI.FocusTextInControl(NameOfInputField);

                RexISM.ShouldReplaceCode = false;
                // This doesnt seem to work in with EditorGUI TextField

                GUI.FocusControl(NAME_OF_INPUT_FIELD);
                if (_inputField != null)
                {
                    _inputField.text = RexISM.Code;
                    _inputField.MoveLineEnd();
                }
            }
        }
        public void IntellisenseSelectionTest()
        {
            RexISM.Enter_Typing();
            RexISM.Code = "Math.P";
            RexISM.Update();
            Assert.AreEqual(RexInputState.Typing, RexISM.State);
            Assert.IsTrue(RexISM.DisplayHelp);
            Assert.IsNotEmpty(RexISM.IntelliSenceHelp);
            Assert.AreEqual(RexISM.SelectedHelp, -1);

            PressKey(KeyCode.DownArrow);
            Assert.AreEqual(RexInputState.IntelliSelect, RexISM.State);
            Assert.AreEqual(RexISM.SelectedHelp, 0);

            RexISM.Enter_Typing();
            Assert.AreEqual(RexInputState.Typing, RexISM.State);
            Assert.AreEqual(RexISM.SelectedHelp, -1);

            RexISM.Code = "x = Math.";
            RexISM.Update();
            PressKey(KeyCode.DownArrow);
            Assert.AreEqual(RexInputState.IntelliSelect, RexISM.State);
            Assert.AreEqual(RexISM.SelectedHelp, 0);


            PressKey(KeyCode.DownArrow);
            Assert.AreEqual(RexInputState.IntelliSelect, RexISM.State);
            Assert.AreEqual(RexISM.SelectedHelp, 1);

            PressKey(KeyCode.Return);
            Assert.IsTrue(RexISM.Code.Contains("x = Math."));
        }
        /// <summary>
        /// Registers a all keypress events and keeps track of keys being held down.
        /// </summary>
        static void HandleKeyInput()
        {
            if (Event.current.isKey)
            {
                var keyCode   = Event.current.keyCode;
                var eventType = Event.current.type;
                if (RexISM.InputBuffer.ContainsKey(keyCode))
                {
                    if (eventType == EventType.KeyUp)
                    {
                        RexISM.InputBuffer.Remove(keyCode);
                    }
                    else if (eventType == EventType.KeyDown &&
                             DateTime.Now >= RexISM.InputBuffer[keyCode].LastPressed + RexISM.KeyInput.DelayAmount)
                    {
                        RexISM.InputBuffer[keyCode].LastPressed = DateTime.Now;
                        RexISM.InputBuffer[keyCode].IsHandled   = false;
                    }
                }
                else if (eventType == EventType.KeyDown)
                {
                    foreach (var item in RexISM.InputBuffer.ToArray())
                    {
                        if (!item.Value.IsHandled && item.Value.LastPressed + RexISM.KeyInput.DelayAmount < DateTime.Now)
                        {
                            RexISM.InputBuffer.Remove(item.Key);
                        }
                    }

                    RexISM.PressKey(keyCode);
                }
            }
        }
        void OnEnable()
        {
            hideFlags = HideFlags.HideAndDontSave;

            if (_compileEngine == null)
            {
                _compileEngine = RexCompileEngine.Instance;
            }

            if (_texts == null)
            {
                _texts = RexStaticTextCollection.Instance;
            }

            if (_macros == null)
            {
                _macros = RexMacroHandler.LoadMacros();
            }

            RexISM.Repaint     = Repaint;
            RexISM.DebugLog    = Debug.Log;
            RexISM.ExecuteCode = Execute;
            RexISM.Enter_NoInput();

            updateSkins = true;
            minSize     = new Vector2(450f, 350f);
            autoRepaintOnSceneChange = true;
            titleContent.text        = "REX";
            titleContent.tooltip     = "Runtime Expressions";
        }
        void TestIntelliSelect(string code, IEnumerable <string> selections, bool withMethodOverloads = true)
        {
            RexISM.Enter_Typing();
            RexISM.Code = code;
            RexISM.Update();
            Assert.AreEqual(RexInputState.Typing, RexISM.State);
            Assert.IsTrue(RexISM.DisplayHelp);

            var help = RexISM.IntelliSenceHelp.Where(i => !i.IsMethodOverload);
            var meth = RexISM.IntelliSenceHelp.Where(i => i.IsMethodOverload);

            Assert.IsNotEmpty(help);
            if (withMethodOverloads)
            {
                Assert.IsNotEmpty(meth);
            }
            else
            {
                Assert.IsEmpty(meth);
            }

            Assert.AreEqual(-1, RexISM.SelectedHelp);
            var count = 0;

            foreach (var select in selections)
            {
                PressKey(KeyCode.DownArrow);
                Assert.AreEqual(select, RexISM.ReplacementString(), "At i = " + count);
                Assert.AreEqual(count++, RexISM.SelectedHelp);
            }
        }
 public static void PressKey(KeyCode key, int repeat = 1)
 {
     for (int i = 0; i < repeat; i++)
     {
         RexISM.PressKey(key);
         RexISM.Update();
     }
 }
 public void IntellisenseTest()
 {
     RexISM.Enter_Typing();
     RexISM.Code = "Math.P";
     RexISM.Update();
     Assert.AreEqual(RexInputState.Typing, RexISM.State);
     Assert.IsTrue(RexISM.DisplayHelp);
     Assert.IsNotEmpty(RexISM.IntelliSenceHelp);
 }
 private void HandleTabKeyPress()
 {
     if (Event.current.keyCode == KeyCode.Tab || Event.current.character == '\t')
     {
         if (RexISM.DisplayHelp)
         {
             RexISM.PressKey(KeyCode.Tab);
         }
         Event.current.Use();
     }
 }
 public void ClassSetup()
 {
     RexISM.Repaint     = () => { };
     RexISM.DebugLog    = msg => Console.WriteLine(msg);
     RexISM.ExecuteCode = TestExecute;
     RexISM.Code        = string.Empty;
     RexISM.Enter_NoInput();
     RexISM.IntelliSenceHelp.Clear();
     RexISM.IntelliSenceLastCode = string.Empty;
     RexISM.InputBuffer.Clear();
 }
 private void HandleInputHistory(bool hasFocus)
 {
     if (_inputHistroy.Count == 0 ||
         _inputHistroy.First.Value != RexISM.Code)
     {
         if (_inputHistroy.Count > INPUT_HISTORY_LENGTH)
         {
             _inputHistroy.RemoveLast();
         }
         _inputHistroy.AddFirst(RexISM.Code);
     }
     if (hasFocus && RexISM.AnyKeyDown() && Event.current.type == EventType.Layout)
     {
         UpdateStateMachine();
     }
 }
        private void DisplayInputField(ref Rect inpLabelRect, ref Rect inpStringRect, ref Rect inpButRect)
        {
            GUI.Label(inpLabelRect, _texts["expression_header"]);
            var oldColor = ColorInput();

            GUI.SetNextControlName(NAME_OF_INPUT_FIELD);
            RexISM.Code = GUI.TextField(inpStringRect, RexISM.Code);

            //To have the cursor change to the 'I' on hover:
            GUI.color = Color.clear;
            EditorGUI.TextField(inpStringRect, "");
            GUI.color = oldColor;

            if (GUI.Button(inpButRect, _texts["evaluate_button"]))
            {
                GUI.FocusControl(NAME_OF_INPUT_FIELD);
                RexISM.PressKey(KeyCode.Return);
            }
        }
        public void UpdateTest()
        {
            Assert.AreEqual(RexInputState.NoInput, RexISM.State);

            RexISM.Update();
            Assert.AreEqual(RexInputState.NoInput, RexISM.State);

            RexISM.Enter_Typing();
            Assert.AreEqual(RexInputState.Typing, RexISM.State);
            Assert.IsTrue(RexISM.DisplayHelp);

            RexISM.Update();
            Assert.AreEqual(RexInputState.Typing, RexISM.State);
            Assert.IsTrue(RexISM.DisplayHelp);

            PressKey(KeyCode.Escape);
            RexISM.Update();
            Assert.AreEqual(RexInputState.Typing, RexISM.State);
            Assert.IsFalse(RexISM.DisplayHelp);
            Assert.IsEmpty(RexISM.IntelliSenceHelp);
        }