// -----------------------------------------------------------------------
//
// Copyright 2014 MIT Licence. See licence.md for more information.
//
// -----------------------------------------------------------------------
namespace Perspex.Input
{
using System.Linq;
using Perspex.VisualTree;
using Splat;
public class KeyboardNavigation : IKeyboardNavigation
{
public static IKeyboardNavigation Instance
{
get { return Locator.Current.GetService(); }
}
public bool MoveNext(IInputElement element)
{
var parent = element.GetVisualParent();
var descendent = element.GetVisualDescendents()
.OfType()
.Where(x => x.Focusable && x.IsEnabledCore)
.FirstOrDefault();
if (descendent != null)
{
FocusManager.Instance.Focus(descendent, true);
return true;
}
else if (parent != null)
{
var sibling = parent.GetVisualChildren()
.OfType()
.Where(x => x.Focusable && x.IsEnabledCore)
.SkipWhile(x => x != element)
.Skip(1)
.FirstOrDefault();
if (sibling != null)
{
FocusManager.Instance.Focus(sibling, true);
return true;
}
}
return false;
}
public bool MovePrevious(IInputElement element)
{
var parent = element.GetVisualParent();
var descendent = element.GetVisualDescendents()
.OfType()
.Where(x => x.Focusable && x.IsEnabledCore)
.Reverse()
.FirstOrDefault();
if (descendent != null)
{
FocusManager.Instance.Focus(descendent, true);
return true;
}
else if (parent != null)
{
var previous = parent.GetVisualChildren()
.OfType()
.Where(x => x.Focusable && x.IsEnabledCore)
.Reverse()
.SkipWhile(x => x != element)
.Skip(1)
.FirstOrDefault();
if (previous != null)
{
FocusManager.Instance.Focus(previous, true);
return true;
}
}
return false;
}
}
}