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;
}