private void MovePopup()
        {
            if (!IsResident && !popup.IsOpen)
            {
                return;
            }

            if (!IsResident)
            {
                Candidates = CandidatesGenerator?.GenerateCandidates(textBox.Text);
            }

            if (popupListBox.Items.Count != 0)
            {
                if (popupListBox.SelectedIndex == -1)
                {
                    popupListBox.SelectedIndex = 0;
                }
                popup.IsOpen             = true;
                popup.PlacementTarget    = textBox;
                popup.PlacementRectangle = textBox.GetRectFromCharacterIndex(textBox.CaretIndex);
                popupListBox.UpdateLayout();
                AdjustPopupLocation();
            }
            else
            {
                popup.IsOpen = false;
            }
        }
 private void textBox_GotFocus(object sender, RoutedEventArgs e)
 {
     if (IsResident)
     {
         popup.IsOpen = true;
         Candidates   = CandidatesGenerator?.GenerateCandidates(textBox.Text);
     }
     MovePopup();
 }
        public void AddOptionLazy()
        {
            var input     = "hah -searchTarget:";
            var generator = new CandidatesGenerator(Syntax);
            var result    = generator.GenerateCandidates(input);

            Assert.AreEqual(2, result.Count());

            var optionArgTextBox = new ArgumentRule("TextBox", MockMethods.TextBox);
            var targetArgs       = Syntax[0].OptionalArgs.ElementAt(1).OptionalArgs;

            targetArgs.Add(optionArgTextBox);

            result = generator.GenerateCandidates(input);
            Assert.AreEqual(3, result.Count());

            CollectionAssert.AreEqual(targetArgs.Select(x => x.Name).ToArray(), result.Select(x => x.Name).ToArray());
        }
        private void textBox_Loaded(object sender, RoutedEventArgs e)
        {
            if (!string.IsNullOrEmpty(textBox.Text))
            {
                IsTextValid(textBox.Text);
            }

            // GetCandidates
            Observable.FromEvent <TextChangedEventHandler, TextChangedEventArgs>(
                action => (s, ev) => action(ev),
                h => textBox.TextChanged += h,
                h => textBox.TextChanged -= h)
            .Where(_ => IsResident)
            .Select(text => textBox.Text)
            .Select(text => Task.Run(() => CandidatesGenerator?.GenerateCandidates(text)))
            .Switch()
            .ObserveOnDispatcher()
            .Select(candidates => Candidates = candidates)
            .Subscribe(_ => MovePopup());
        }
        public void Setup()
        {
            Syntax      = new CommandSyntax();
            Parser      = new CommandParser(Syntax);
            Validator   = new CommandValidator(Parser, new MockLocalizer());
            MockMethods = new MockCommand();
            Generator   = new CandidatesGenerator(Syntax);

            Switch      = new ArgumentRule("switch", MockMethods.Switch);
            Click       = new ArgumentRule("click", MockMethods.Click);
            RightClick  = new ArgumentRule("rightclick", MockMethods.RightClick);
            DoubleClick = new ArgumentRule("doubleclick", MockMethods.DoubleClick);

            ArgApplication   = new ArgumentRule("application", MockMethods.Application, ArgsFactory(Switch));
            ArgWindow        = new ArgumentRule("window", MockMethods.Window, ArgsFactory(Click, RightClick, DoubleClick));
            ArgTaskbar       = new ArgumentRule("taskbar", MockMethods.Taskbar, ArgsFactory(Click, RightClick));
            ArgDividedscreen = new ArgumentRule("windowdividedscreen", MockMethods.WindowDividedScreen, ArgsFactory(Click, DoubleClick));

            ArgText           = new ArgumentRule("Text", MockMethods.Text);
            ArgCommand        = new ArgumentRule("Command", MockMethods.Command);
            ArgInItemsControl = new ArgumentRule("TextInItemsControl", MockMethods.TextInItemsControl);

            OptButton   = new ArgumentRule("Button", MockMethods.Button);
            OptCheckBox = new ArgumentRule("CheckBox", MockMethods.CheckBox);

            OptGenerator = new ArgumentRule("-hintGenerator", MockMethods.HintGenerator);
            OptTarget    = new ArgumentRule("-searchTarget", MockMethods.SearchTarget, null, ArgsFactory(OptButton, OptCheckBox));

            Hah            = new CommandRule("hah", MockMethods.HitaHint, ArgsFactory(ArgWindow, ArgApplication, ArgTaskbar, ArgDividedscreen), ArgsFactory(OptGenerator, OptTarget));
            SearchByText   = new CommandRule("/", MockMethods.SearchByText, ArgsFactory(ArgText, ArgCommand, ArgInItemsControl), ArgsFactory(OptTarget));
            Hah2           = new CommandRule("hah2", MockMethods.HitaHint2, ArgsFactory(ArgWindow, ArgDividedscreen));
            MouseEmulation = new CommandRule("me", MockMethods.MouseEmulation);

            Syntax.Add(Hah);
            Syntax.Add(SearchByText);
            Syntax.Add(Hah2);
            Syntax.Add(MouseEmulation);
        }