// Decompiled with JetBrains decompiler // Type: ZuneUI.AutoCompleteHelper // Assembly: ZuneShell, Version=4.7.0.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217 // MVID: FC8028F3-A47B-4FB4-B35B-11D1752D8264 // Assembly location: C:\Program Files\Zune\ZuneShell.dll using Microsoft.Iris; using MicrosoftZuneLibrary; using System; using System.Collections; using System.Collections.Generic; namespace ZuneUI { public class AutoCompleteHelper : ModelItem { private IList _options; private IList _filteredOptions; private string _entry; private int _cursorPosition; private bool _useEntrySeparator = true; private bool _applyfilter = true; protected static char[] s_entrySeparators = new char[2] { ';', ',' }; private static char[] s_entryTrimmers = new char[3] { ';', ',', ' ' }; public AutoCompleteHelper() { this._entry = string.Empty; this._cursorPosition = 0; } public string InsertAtCursor(string insert) { insert = insert ?? string.Empty; string filterString = this.GetFilterString(); if (this._cursorPosition > 0 && filterString.Length > 0) { insert = this._entry.Substring(0, this._cursorPosition - filterString.Length) + insert; if (this._cursorPosition < this._entry.Length) insert += this._entry.Substring(this._cursorPosition - filterString.Length); else if (this._useEntrySeparator) insert = string.Format("{0}{1} ", insert, s_entrySeparators[0]); this.Entry = insert; } else this.InsertAtEnd(insert); return this.Entry; } public string InsertAtEnd(string insert) { if (this.Entry == null || !this._useEntrySeparator) this.Entry = insert; else if (!string.IsNullOrEmpty(insert)) { string str = this.Entry.TrimEnd(s_entryTrimmers); if (str.Length > 0) insert = string.Format("{0} {1}{2} ", s_entrySeparators[0], insert, s_entrySeparators[0]); else if (this._useEntrySeparator) insert = string.Format("{0}{1} ", insert, s_entrySeparators[0]); this.Entry = str + insert; } return this.Entry; } public IList Options { get => this._options; set { if (this._options == value) return; this._options = value; this.FirePropertyChanged(nameof(Options)); } } public string Entry { get => this._entry; set { if (!(this._entry != value)) return; this._cursorPosition = this._entry == null || value == null || !value.StartsWith(this._entry, StringComparison.CurrentCultureIgnoreCase) ? -1 : value.Length; this._entry = value; if (this.Applyfilter) this.Filter(); else this.FilteredOptions = this._options; this.FirePropertyChanged(nameof(Entry)); } } public IList FilteredOptions { get => this._filteredOptions; set { if (this._filteredOptions == value) return; this._filteredOptions = value; this.FirePropertyChanged(nameof(FilteredOptions)); } } public bool UseEntrySeparator { get => this._useEntrySeparator; set { if (this._useEntrySeparator == value) return; this._useEntrySeparator = value; this.FirePropertyChanged(nameof(UseEntrySeparator)); } } public bool Applyfilter { get => this._applyfilter; set { if (this._applyfilter == value) return; this._applyfilter = value; this.FirePropertyChanged(nameof(Applyfilter)); } } private void Filter() { List stringList = new List(); string filterString = this.GetFilterString(); if (this._options != null && !string.IsNullOrEmpty(filterString)) { int index; if (this._options is ISearchableList) index = ((ISearchableList)this._options).SearchForString(filterString); else if (this._options is List) { index = ((List)this._options).BinarySearch(filterString, StringComparer.CurrentCultureIgnoreCase); if (index < 0) index = ~index; } else index = -1; if (index >= 0) { for (; index < this._options.Count; ++index) { string option = (string)this._options[index]; if (ZuneLibrary.CompareWithoutArticles(filterString, option) == 0) stringList.Add(option); else break; } } } this.FilteredOptions = stringList; } private string GetFilterString() { string str = string.Empty; if (this._cursorPosition > 0 && this._entry != null) { int num1 = this._entry.LastIndexOfAny(s_entrySeparators, this._cursorPosition - 1) + 1; while (num1 < this._entry.Length && char.IsWhiteSpace(this._entry, num1)) ++num1; int num2 = this._entry.IndexOfAny(s_entrySeparators, num1); int length = num2 <= 0 ? this._entry.Length - num1 : num2 - num1; str = this._entry.Substring(num1, length); } return str.Normalize(); } } }