|
|
@@ -92,13 +92,28 @@ namespace ControlCatalog.Pages
|
|
|
}
|
|
|
public StateData[] States { get; private set; }
|
|
|
|
|
|
+ private LinkedList<string>[] BuildAllSentences()
|
|
|
+ {
|
|
|
+ return new string[]
|
|
|
+ {
|
|
|
+ "Hello world",
|
|
|
+ "No this is Patrick",
|
|
|
+ "Never gonna give you up",
|
|
|
+ "How does one patch KDE2 under FreeBSD"
|
|
|
+ }
|
|
|
+ .Select(x => new LinkedList<string>(x.Split(' ')))
|
|
|
+ .ToArray();
|
|
|
+ }
|
|
|
+ public LinkedList<string>[] Sentences { get; private set; }
|
|
|
+
|
|
|
public AutoCompleteBoxPage()
|
|
|
{
|
|
|
this.InitializeComponent();
|
|
|
|
|
|
States = BuildAllStates();
|
|
|
+ Sentences = BuildAllSentences();
|
|
|
|
|
|
- foreach (AutoCompleteBox box in GetAllAutoCompleteBox())
|
|
|
+ foreach (AutoCompleteBox box in GetAllAutoCompleteBox().Where(x => x.Name != "CustomAutocompleteBox"))
|
|
|
{
|
|
|
box.Items = States;
|
|
|
}
|
|
|
@@ -116,6 +131,11 @@ namespace ControlCatalog.Pages
|
|
|
|
|
|
var asyncBox = this.FindControl<AutoCompleteBox>("AsyncBox");
|
|
|
asyncBox.AsyncPopulator = PopulateAsync;
|
|
|
+
|
|
|
+ var customAutocompleteBox = this.FindControl<AutoCompleteBox>("CustomAutocompleteBox");
|
|
|
+ customAutocompleteBox.Items = Sentences.SelectMany(x => x);
|
|
|
+ customAutocompleteBox.TextFilter = LastWordContains;
|
|
|
+ customAutocompleteBox.TextSelector = AppendWord;
|
|
|
}
|
|
|
private IEnumerable<AutoCompleteBox> GetAllAutoCompleteBox()
|
|
|
{
|
|
|
@@ -137,6 +157,42 @@ namespace ControlCatalog.Pages
|
|
|
.ToList();
|
|
|
}
|
|
|
|
|
|
+ private bool LastWordContains(string searchText, string item)
|
|
|
+ {
|
|
|
+ var words = searchText.Split(' ');
|
|
|
+ var options = Sentences.Select(x => x.First).ToArray();
|
|
|
+ for (var i = 0; i < words.Length; ++i)
|
|
|
+ {
|
|
|
+ var word = words[i];
|
|
|
+ for (var j = 0; j < options.Length; ++j)
|
|
|
+ {
|
|
|
+ var option = options[j];
|
|
|
+ if (option == null)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (i == words.Length - 1)
|
|
|
+ {
|
|
|
+ options[j] = option.Value.ToLower().Contains(word.ToLower()) ? option : null;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ options[j] = option.Value.Equals(word, StringComparison.InvariantCultureIgnoreCase) ? option.Next : null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return options.Any(x => x != null && x.Value == item);
|
|
|
+ }
|
|
|
+ private string AppendWord(string text, string item)
|
|
|
+ {
|
|
|
+ string[] parts = text.Split(' ');
|
|
|
+ if (parts.Length == 0)
|
|
|
+ return item;
|
|
|
+
|
|
|
+ parts[parts.Length - 1] = item;
|
|
|
+ return string.Join(" ", parts);
|
|
|
+ }
|
|
|
+
|
|
|
private void InitializeComponent()
|
|
|
{
|
|
|
AvaloniaXamlLoader.Load(this);
|