Anabranch.Neo4JConsolePackage.AutoCompleteBehavior.AutoCompleteBehavior.TextBox_OnTextChanged C# (CSharp) Method

TextBox_OnTextChanged() private static method

Search for auto-completion suggestions.
private static TextBox_OnTextChanged ( object sender, System.Windows.Controls.TextChangedEventArgs e ) : void
sender object
e System.Windows.Controls.TextChangedEventArgs
return void
        private static void TextBox_OnTextChanged(object sender, TextChangedEventArgs e)
        {
            if (e.Changes.Any(change => change.RemovedLength > 0) && e.Changes.Any(change => change.AddedLength > 0) == false)
                return;

            var tb = e.OriginalSource as TextBox;
            if (tb == null)
                return;

            var labels = GetAutoCompleteLabelsSource(tb).ToList();
            var relationships = GetAutoCompleteRelationshipsSource(tb).ToList();
            var values = GetAutoCompleteItemsSource(tb).ToList();
            //No reason to search if we don't have any values.
            if (values.IsNullOrEmpty() && relationships.IsNullOrEmpty() && labels.IsNullOrEmpty())
                return;

            //No reason to search if there's nothing there.
            if (string.IsNullOrEmpty(tb.Text))
                return;

            var comparer = GetAutoCompleteStringComparison(tb);
            //Do search and changes here.

            var doesContainSpaces = tb.Text.Contains(" ");
            var doesContainColons = tb.Text.Contains(":");
            var doesContainNewLines = tb.Text.Contains(Environment.NewLine);
            var spaceBeforeCaretIndex = 0;
            var colonBeforeCaretIndex = 0;
            var newlineBeforeCaretIndex = 0;
            if (doesContainSpaces)
            {
                spaceBeforeCaretIndex = tb.Text.Substring(0, tb.CaretIndex).LastIndexOf(" ", StringComparison.InvariantCultureIgnoreCase) + 1;
                if (spaceBeforeCaretIndex <= 0)
                    spaceBeforeCaretIndex = 0;
            }
            if (doesContainColons)
            {
                colonBeforeCaretIndex = tb.Text.Substring(0, tb.CaretIndex).LastIndexOf(":", StringComparison.InvariantCultureIgnoreCase) + 1;
                if (colonBeforeCaretIndex <= 0)
                    colonBeforeCaretIndex = 0;
            }
            if (doesContainNewLines)
            {
                newlineBeforeCaretIndex = tb.Text.Substring(0, tb.CaretIndex).LastIndexOf(Environment.NewLine, StringComparison.InvariantCultureIgnoreCase) + (Environment.NewLine.Length);
                if (newlineBeforeCaretIndex <= 0)
                    newlineBeforeCaretIndex = 0;
            }

            var valueToStartAt = Math.Max(newlineBeforeCaretIndex, Math.Max(spaceBeforeCaretIndex, colonBeforeCaretIndex));

            var lastCharPressed = tb.Text[tb.CaretIndex - 1];
            char closingChar;
            if (ShouldInsertClosingCharacter(lastCharPressed, out closingChar))
            {
                tb.TextChanged -= OnTextChanged;
                var cIndex = tb.CaretIndex;
                tb.Text = tb.Text.Insert(tb.CaretIndex, closingChar.ToString());
                tb.CaretIndex = cIndex;
                tb.TextChanged += OnTextChanged;
            }

            var textToLookFor = tb.Text.Substring(0, tb.CaretIndex).Substring(valueToStartAt);
            var lengthOfText = textToLookFor.Length;
            var initialCaretIndex = tb.CaretIndex;

            string match;
            if (CypherEvaluator.WasLastSignificantCharARelationshipLabel(tb.Text.Substring(0, tb.CaretIndex)))
                match = GetFirstMatch(relationships, lengthOfText, textToLookFor, comparer);
            else if (CypherEvaluator.WasLastSignificantCharANodeLabel(tb.Text.Substring(0, tb.CaretIndex)))
                match = GetFirstMatch(labels, lengthOfText, textToLookFor, comparer);
            else
                match = GetFirstMatch(values, lengthOfText, textToLookFor, comparer);

            //Nothing.  Leave 'em alone
            if (string.IsNullOrEmpty(match) || textToLookFor.Length == 0)
                return;

            tb.TextChanged -= OnTextChanged;
            //tb.Text = match;
            tb.Text = tb.Text.Insert(tb.CaretIndex, match.Substring(textToLookFor.Length, match.Length - textToLookFor.Length));

            tb.CaretIndex = lengthOfText;
            tb.SelectionStart = initialCaretIndex;
            tb.SelectionLength = (match.Length - lengthOfText);
            tb.TextChanged += OnTextChanged;
        }