diff --git a/Perspex.Controls/DataTemplate.cs b/Perspex.Controls/DataTemplate.cs index 6d238a7f9b..ab674b53ed 100644 --- a/Perspex.Controls/DataTemplate.cs +++ b/Perspex.Controls/DataTemplate.cs @@ -9,7 +9,7 @@ namespace Perspex.Controls using System; using System.Reflection; - public class DataTemplate + public class DataTemplate : IDataTemplate { public static readonly DataTemplate Default = new DataTemplate(typeof(object), o => new TextBlock { Text = o.ToString() }); @@ -41,6 +41,16 @@ namespace Perspex.Controls { return t.GetTypeInfo().IsAssignableFrom(o.GetType().GetTypeInfo()); } + + bool IDataTemplate.Match(object data) + { + return this.Match(data); + } + + Control IDataTemplate.Build(object data) + { + return this.Build(data); + } } public class DataTemplate : DataTemplate diff --git a/Perspex.Controls/DataTemplateExtensions.cs b/Perspex.Controls/DataTemplateExtensions.cs index 576aa3beb2..fb937e7461 100644 --- a/Perspex.Controls/DataTemplateExtensions.cs +++ b/Perspex.Controls/DataTemplateExtensions.cs @@ -14,7 +14,7 @@ namespace Perspex.Controls { public static Control ApplyDataTemplate(this Control control, object data) { - DataTemplate result = control.FindDataTemplate(data); + IDataTemplate result = control.FindDataTemplate(data); if (result != null) { @@ -30,12 +30,12 @@ namespace Perspex.Controls } } - public static DataTemplate FindDataTemplate(this Control control, object data) + public static IDataTemplate FindDataTemplate(this Control control, object data) { // TODO: This needs to traverse the logical tree, not the visual. foreach (var i in control.GetSelfAndVisualAncestors().OfType()) { - foreach (DataTemplate dt in i.DataTemplates.Reverse()) + foreach (IDataTemplate dt in i.DataTemplates.Reverse()) { if (dt.Match(data)) { @@ -48,7 +48,7 @@ namespace Perspex.Controls if (global != null) { - foreach (DataTemplate dt in global.DataTemplates.Reverse()) + foreach (IDataTemplate dt in global.DataTemplates.Reverse()) { if (dt.Match(data)) { diff --git a/Perspex.Controls/DataTemplates.cs b/Perspex.Controls/DataTemplates.cs index 7de64339ed..c06b5bbf6f 100644 --- a/Perspex.Controls/DataTemplates.cs +++ b/Perspex.Controls/DataTemplates.cs @@ -8,7 +8,7 @@ namespace Perspex.Controls { using Perspex.Collections; - public class DataTemplates : PerspexList + public class DataTemplates : PerspexList { } } diff --git a/Perspex.Controls/Generators/TreeItemContainerGenerator.cs b/Perspex.Controls/Generators/TreeItemContainerGenerator.cs index 17ce092309..e8688aa3ba 100644 --- a/Perspex.Controls/Generators/TreeItemContainerGenerator.cs +++ b/Perspex.Controls/Generators/TreeItemContainerGenerator.cs @@ -52,7 +52,7 @@ namespace Perspex.Controls.Generators private TreeDataTemplate GetTreeDataTemplate(object item) { - DataTemplate template = this.Owner.FindDataTemplate(item); + IDataTemplate template = this.Owner.FindDataTemplate(item); if (template == null) { diff --git a/Perspex.Controls/IDataTemplate.cs b/Perspex.Controls/IDataTemplate.cs new file mode 100644 index 0000000000..30d47d6bc5 --- /dev/null +++ b/Perspex.Controls/IDataTemplate.cs @@ -0,0 +1,15 @@ +// ----------------------------------------------------------------------- +// +// Copyright 2014 MIT Licence. See licence.md for more information. +// +// ----------------------------------------------------------------------- + +namespace Perspex.Controls +{ + public interface IDataTemplate + { + bool Match(object data); + + Control Build(object data); + } +} diff --git a/Perspex.Controls/Perspex.Controls.csproj b/Perspex.Controls/Perspex.Controls.csproj index e8f03d97cb..4ca024736f 100644 --- a/Perspex.Controls/Perspex.Controls.csproj +++ b/Perspex.Controls/Perspex.Controls.csproj @@ -41,6 +41,7 @@ + diff --git a/Perspex.Controls/Presenters/ContentPresenter.cs b/Perspex.Controls/Presenters/ContentPresenter.cs index 4646a05f67..6a121dbb71 100644 --- a/Perspex.Controls/Presenters/ContentPresenter.cs +++ b/Perspex.Controls/Presenters/ContentPresenter.cs @@ -110,7 +110,7 @@ namespace Perspex.Controls.Presenters } else { - DataTemplate dataTemplate = this.FindDataTemplate(content); + IDataTemplate dataTemplate = this.FindDataTemplate(content); if (dataTemplate != null) { diff --git a/Perspex.SceneGraph/LogicalTree/LogicalExtensions.cs b/Perspex.SceneGraph/LogicalTree/LogicalExtensions.cs new file mode 100644 index 0000000000..98c7ec6a70 --- /dev/null +++ b/Perspex.SceneGraph/LogicalTree/LogicalExtensions.cs @@ -0,0 +1,80 @@ +// ----------------------------------------------------------------------- +// +// Copyright 2014 MIT Licence. See licence.md for more information. +// +// ----------------------------------------------------------------------- + +namespace Perspex.LogicalTree +{ + using System; + using System.Collections.Generic; + using System.Linq; + + public static class LogicalExtensions + { + public static IEnumerable GetLogicalAncestors(this ILogical logical) + { + Contract.Requires(logical != null); + + logical = logical.LogicalParent; + + while (logical != null) + { + yield return logical; + logical = logical.LogicalParent; + } + } + + public static IEnumerable GetSelfAndLogicalAncestors(this ILogical logical) + { + yield return logical; + + foreach (var ancestor in logical.GetLogicalAncestors()) + { + yield return ancestor; + } + } + + + public static IEnumerable GetLogicalChildren(this ILogical logical) + { + return logical.LogicalChildren; + } + + public static IEnumerable GetLogicalDescendents(this ILogical logical) + { + foreach (ILogical child in logical.LogicalChildren) + { + yield return child; + + foreach (ILogical descendent in child.GetLogicalDescendents()) + { + yield return descendent; + } + } + } + + public static ILogical GetLogicalParent(this ILogical logical) + { + return logical.LogicalParent; + } + + public static T GetLogicalParent(this ILogical logical) where T : class + { + return logical.LogicalParent as T; + } + + public static IEnumerable GetLogicalSiblings(this ILogical logical) + { + ILogical parent = logical.LogicalParent; + + if (parent != null) + { + foreach (ILogical sibling in parent.LogicalChildren) + { + yield return sibling; + } + } + } + } +} diff --git a/Perspex.SceneGraph/Perspex.SceneGraph.csproj b/Perspex.SceneGraph/Perspex.SceneGraph.csproj index 3760967f12..577272b72c 100644 --- a/Perspex.SceneGraph/Perspex.SceneGraph.csproj +++ b/Perspex.SceneGraph/Perspex.SceneGraph.csproj @@ -92,6 +92,7 @@ +