// -----------------------------------------------------------------------
//
// Copyright 2014 MIT Licence. See licence.md for more information.
//
// -----------------------------------------------------------------------
namespace Perspex
{
using System;
using System.Collections.Generic;
using System.Linq;
using Perspex.Controls;
using Perspex.Styling;
public static class VisualExtensions
{
public static IEnumerable GetVisual(this IVisual visual, Func selector)
{
Selector sel = selector(new Selector());
IEnumerable visuals = Enumerable.Repeat(visual, 1).Concat(visual.GetVisualDescendents());
foreach (IStyleable v in visuals.OfType())
{
using (StyleActivator activator = sel.GetActivator(v))
{
if (activator.CurrentValue)
{
yield return (IVisual)v;
}
}
}
}
public static T GetVisualAncestor(this IVisual visual) where T : class
{
Contract.Requires(visual != null);
visual = visual.VisualParent;
while (visual != null)
{
if (visual is T)
{
return (T)visual;
}
else
{
visual = visual.VisualParent;
}
}
return null;
}
public static T GetVisualAncestorOrSelf(this IVisual visual) where T : class
{
Contract.Requires(visual != null);
return (visual as T) ?? visual.GetVisualAncestor();
}
public static IEnumerable GetVisualAncestors(this IVisual visual)
{
visual = visual.VisualParent;
while (visual != null)
{
yield return visual;
visual = visual.VisualParent;
}
}
public static IEnumerable GetVisualAncestorsAndSelf(this IVisual visual)
{
yield return visual;
visual = visual.VisualParent;
while (visual != null)
{
yield return visual;
visual = visual.VisualParent;
}
}
public static IVisual GetVisualAt(this IVisual visual, Point p)
{
Contract.Requires(visual != null);
return visual.GetVisualsAt(p).LastOrDefault();
}
public static IEnumerable GetVisualsAt(this IVisual visual, Point p)
{
Contract.Requires(visual != null);
if (visual.Bounds.Contains(p))
{
yield return visual;
p -= visual.Bounds.Position;
if (visual.VisualChildren.Any())
{
foreach (IVisual child in visual.VisualChildren)
{
foreach (IVisual v in child.GetVisualsAt(p))
{
yield return v;
}
}
}
}
}
public static IEnumerable GetVisualDescendents(this IVisual visual)
{
foreach (IVisual child in visual.VisualChildren)
{
yield return child;
foreach (IVisual descendent in child.GetVisualDescendents())
{
yield return descendent;
}
}
}
public static IEnumerable GetVisualSiblings(this IVisual visual)
{
IVisual parent = visual.VisualParent;
if (parent != null)
{
foreach (T sibling in parent.VisualChildren.OfType())
{
if ((IVisual)sibling != visual)
{
yield return sibling;
}
}
}
}
}
}