using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using HändlerEditor.Code;
using System.Threading;
namespace HändlerEditor.XAML
{
///
/// Interaction logic for ItemSelector.xaml
///
public partial class ItemSelector : Window
{
public List- SearchResult
{
get { return _results; }
private set { _results = value; }
}
private List
- _results;
private bool _updating;
private bool _needUpdate;
private bool _running;
private string _prevString;
public Item Item
{
get;
set;
}
public bool ItemChoosen { get; private set; }
public ItemSelector()
{
Item = null;
SearchResult = new List
- (DataProvider.Items);
InitializeComponent();
_updating = false;
_needUpdate = false;
_running = true;
_prevString = "";
var t = new Thread(UpdateQuery);
t.Start();
}
private void SearchTextChanged(object sender, TextChangedEventArgs e)
{
_needUpdate = true;
e.Handled = true;
}
private void UpdateQuery()
{
while(_running)
{
if(!_updating)
if(_needUpdate)
{
Thread t = new Thread(UpdateItems);
_updating = true;
t.Start();
_needUpdate = false;
}
Thread.Sleep(500);
}
}
private bool SaveCheckContains(string text)
{
if(tb.Dispatcher.CheckAccess())
return tb.Text.Contains(text);
return (bool) tb.Dispatcher.Invoke(new ChkDlgt(SaveCheckContains), text);
}
private string SaveGetString()
{
if (tb.Dispatcher.CheckAccess())
return tb.Text;
return (string) tb.Dispatcher.Invoke(new GetDlgt(SaveGetString));
}
private void SaveRefresh()
{
if (Items.Dispatcher.CheckAccess())
Items.Items.Refresh();
else
Items.Dispatcher.Invoke(new ActnDlgt(SaveRefresh));
}
private delegate void ActnDlgt();
private delegate string GetDlgt();
private delegate bool ChkDlgt(string text);
private void UpdateItems()
{
_updating = true;
string text = SaveGetString();
if(SaveCheckContains(_prevString))
{
List
- toRem = (from i in _results
where !(i.Name.Contains(text) || i.InxName.Contains(text))
select i).ToList();
foreach (Item item in toRem)
_results.Remove(item);
}
else
{
SearchResult.Clear();
var toAdd =
DataProvider.Items.Where(i => (i.Name.Contains(text)) || i.InxName.Contains(text)).ToList();
SearchResult.AddRange(toAdd);
}
_prevString = SaveGetString();
SaveRefresh();
_updating = false;
}
private void ItemsMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
if (Items.SelectedItems.Count > 0)
{
ItemChoosen = true;
this.Item = (Item) Items.SelectedItems[0];
this.Close();
}
}
private void SelfWindowClosing(object sender, System.ComponentModel.CancelEventArgs e)
{
_running = false;
}
}
}