122 lines
3.2 KiB
C#
122 lines
3.2 KiB
C#
using System.Diagnostics;
|
|
using System.Windows.Controls.Primitives;
|
|
using System.Windows.Input;
|
|
|
|
namespace AutoCompleteTextBox.Editors
|
|
{
|
|
public class SelectionAdapter
|
|
{
|
|
public class PreSelectionAdapterFinishArgs {
|
|
public EventCause cause;
|
|
public bool is_cancel;
|
|
public bool handled;
|
|
}
|
|
|
|
#region "Fields"
|
|
#endregion
|
|
|
|
#region "Constructors"
|
|
|
|
public SelectionAdapter(Selector selector)
|
|
{
|
|
SelectorControl = selector;
|
|
SelectorControl.PreviewMouseUp += OnSelectorMouseDown;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region "Events"
|
|
|
|
public enum EventCause { Other, PopupClosed, ItemClicked, EnterPressed, EscapePressed, TabPressed, MouseDown}
|
|
public delegate void CancelEventHandler(EventCause cause);
|
|
|
|
public delegate void CommitEventHandler(EventCause cause);
|
|
|
|
public delegate void SelectionChangedEventHandler();
|
|
|
|
public event CancelEventHandler Cancel;
|
|
public event CommitEventHandler Commit;
|
|
public event SelectionChangedEventHandler SelectionChanged;
|
|
#endregion
|
|
|
|
#region "Properties"
|
|
|
|
public Selector SelectorControl { get; set; }
|
|
|
|
#endregion
|
|
|
|
#region "Methods"
|
|
|
|
public void HandleKeyDown(KeyEventArgs key)
|
|
{
|
|
switch (key.Key)
|
|
{
|
|
case Key.Down:
|
|
IncrementSelection();
|
|
break;
|
|
case Key.Up:
|
|
DecrementSelection();
|
|
break;
|
|
case Key.Enter:
|
|
Commit?.Invoke(EventCause.EnterPressed);
|
|
|
|
break;
|
|
case Key.Escape:
|
|
Cancel?.Invoke(EventCause.EscapePressed);
|
|
|
|
break;
|
|
case Key.Tab:
|
|
Commit?.Invoke(EventCause.TabPressed);
|
|
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
key.Handled = true;
|
|
}
|
|
|
|
private void DecrementSelection()
|
|
{
|
|
if (SelectorControl.SelectedIndex == -1)
|
|
{
|
|
SelectorControl.SelectedIndex = SelectorControl.Items.Count - 1;
|
|
}
|
|
else
|
|
{
|
|
SelectorControl.SelectedIndex -= 1;
|
|
}
|
|
|
|
SelectionChanged?.Invoke();
|
|
}
|
|
|
|
private void IncrementSelection()
|
|
{
|
|
if (SelectorControl.SelectedIndex == SelectorControl.Items.Count - 1)
|
|
{
|
|
SelectorControl.SelectedIndex = -1;
|
|
}
|
|
else
|
|
{
|
|
SelectorControl.SelectedIndex += 1;
|
|
}
|
|
|
|
SelectionChanged?.Invoke();
|
|
}
|
|
|
|
private void OnSelectorMouseDown(object sender, MouseButtonEventArgs e)
|
|
{
|
|
// If sender is the RepeatButton from the scrollbar we need to
|
|
// to skip this event otherwise focus get stuck in the RepeatButton
|
|
// and list is scrolled up or down til the end.
|
|
if (e.OriginalSource.GetType() != typeof(RepeatButton))
|
|
{
|
|
Commit?.Invoke(EventCause.MouseDown);
|
|
e.Handled = true;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
}
|
|
|
|
} |