Browse Source

Make template find methods to extension class.

pull/39/head
Steven Kirk 12 years ago
parent
commit
5a1aca2876
  1. 1
      Perspex.Controls/ContentControl.cs
  2. 16
      Perspex.Controls/ControlExtensions.cs
  3. 1
      Perspex.Controls/DropDown.cs
  4. 13
      Perspex.Controls/ItemsControl.cs
  5. 1
      Perspex.Controls/Perspex.Controls.csproj
  6. 54
      Perspex.Controls/Primitives/TemplatedControl.cs
  7. 57
      Perspex.Controls/Templates/TemplateExtensions.cs
  8. 7
      Tests/Perspex.Controls.UnitTests/ContentControlTests.cs
  9. 7
      Tests/Perspex.Controls.UnitTests/DropDownTests.cs
  10. 9
      Tests/Perspex.Controls.UnitTests/ItemsControlTests.cs
  11. 13
      Tests/Perspex.Controls.UnitTests/TemplatedControlTests.cs
  12. 5
      Tests/Perspex.Layout.UnitTests/FullLayoutTests.cs

1
Perspex.Controls/ContentControl.cs

@ -10,6 +10,7 @@ namespace Perspex.Controls
using Perspex.Collections;
using Perspex.Controls.Presenters;
using Perspex.Controls.Primitives;
using Perspex.Controls.Templates;
using Perspex.Layout;
public class ContentControl : TemplatedControl, IContentControl, ILogical

16
Perspex.Controls/ControlExtensions.cs

@ -22,21 +22,5 @@ namespace Perspex.Controls
.OfType<T>()
.FirstOrDefault(x => x.Id == id);
}
public static IEnumerable<Control> GetTemplateControls(this ITemplatedControl control)
{
var visual = control as IVisual;
if (visual != null)
{
return visual.GetVisualDescendents()
.OfType<Control>()
.Where(x => x.TemplatedParent != null);
}
else
{
return Enumerable.Empty<Control>();
}
}
}
}

1
Perspex.Controls/DropDown.cs

@ -10,6 +10,7 @@ namespace Perspex.Controls
using Perspex.Collections;
using Perspex.Controls.Presenters;
using Perspex.Controls.Primitives;
using Perspex.Controls.Templates;
using Perspex.Layout;
public class DropDown : SelectingItemsControl, IContentControl, ILogical

13
Perspex.Controls/ItemsControl.cs

@ -15,6 +15,7 @@ namespace Perspex.Controls
using Perspex.Controls.Generators;
using Perspex.Controls.Presenters;
using Perspex.Controls.Primitives;
using Perspex.Controls.Templates;
using Perspex.VisualTree;
public class ItemsControl : TemplatedControl, ILogical
@ -87,10 +88,14 @@ namespace Perspex.Controls
this.logicalChildren = null;
}
this.presenter = this.GetTemplateChild<ItemsPresenter>("itemsPresenter");
this.logicalChildren = new PerspexReadOnlyListView<IVisual, ILogical>(
((IVisual)presenter.Panel).VisualChildren,
x => (ILogical)x);
this.presenter = this.FindTemplateChild<ItemsPresenter>("itemsPresenter");
if (this.presenter != null)
{
this.logicalChildren = new PerspexReadOnlyListView<IVisual, ILogical>(
((IVisual)presenter.Panel).VisualChildren,
x => (ILogical)x);
}
}
private void ItemsChanged(Tuple<IEnumerable, IEnumerable> value)

1
Perspex.Controls/Perspex.Controls.csproj

@ -85,6 +85,7 @@
<Compile Include="Primitives\Thumb.cs" />
<Compile Include="RequestBringIntoViewEventArgs.cs" />
<Compile Include="Shapes\Ellipse.cs" />
<Compile Include="Templates\TemplateExtensions.cs" />
<Compile Include="TextWrapping.cs" />
<Compile Include="Utils\StringUtils.cs" />
<Compile Include="TopLevel.cs" />

54
Perspex.Controls/Primitives/TemplatedControl.cs

@ -9,6 +9,7 @@ namespace Perspex.Controls.Primitives
using System;
using System.Linq;
using Perspex.Controls.Presenters;
using Perspex.Controls.Templates;
using Perspex.Media;
using Perspex.Styling;
using Perspex.VisualTree;
@ -122,7 +123,7 @@ namespace Perspex.Controls.Primitives
this.AddVisualChild(child);
child.Parent = this;
foreach (var i in this.GetTemplateControls())
foreach (var i in this.GetTemplateChildren())
{
i.ApplyTemplate();
}
@ -162,57 +163,6 @@ namespace Perspex.Controls.Primitives
return new Size();
}
protected T FindTemplateChild<T>(string id) where T : Control
{
var matches = this.GetTemplateControls()
.OfType<T>()
.Where(x => x.Id == id)
.ToList();
if (matches.Count == 1)
{
return matches[0];
}
else if (matches.Count == 0)
{
return null;
}
else
{
// If there are multiple matches, try filtering out nested matches.
matches = matches.Where(x => x.TemplatedParent == this).ToList();
if (matches.Count > 1)
{
throw new InvalidOperationException(string.Format(
"Found multiple template children '{0}' of type '{1}' in template for '{2}'.",
id,
typeof(T).FullName,
this.GetType().FullName));
}
else
{
return matches.FirstOrDefault();
}
}
}
protected T GetTemplateChild<T>(string id) where T : Control
{
var result = this.FindTemplateChild<T>(id);
if (result == null)
{
throw new InvalidOperationException(string.Format(
"Could not find template child '{0}' of type '{1}' in template for '{2}'.",
id,
typeof(T).FullName,
this.GetType().FullName));
}
return result;
}
protected virtual void OnTemplateApplied()
{
}

57
Perspex.Controls/Templates/TemplateExtensions.cs

@ -0,0 +1,57 @@
// -----------------------------------------------------------------------
// <copyright file="TemplateExtensions.cs" company="Steven Kirk">
// Copyright 2014 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Controls.Templates
{
using System;
using System.Collections.Generic;
using System.Linq;
using Perspex.Controls;
using Perspex.Styling;
using Perspex.VisualTree;
public static class TemplateExtensions
{
public static T FindTemplateChild<T>(this ITemplatedControl control, string id) where T : Control
{
return control.GetTemplateChildren().OfType<T>().SingleOrDefault(x => x.Id == id);
}
public static T GetTemplateChild<T>(this ITemplatedControl control, string id) where T : Control
{
var result = control.FindTemplateChild<T>(id);
if (result == null)
{
throw new InvalidOperationException(string.Format(
"Could not find template child '{0}' of type '{1}' in template for '{2}'.",
id,
typeof(T).FullName,
control.GetType().FullName));
}
return result;
}
public static IEnumerable<Control> GetTemplateChildren(this ITemplatedControl control)
{
var visual = control as IVisual;
if (visual != null)
{
// TODO: This searches the whole descendent tree - it can stop when it exits the
// template.
return visual.GetVisualDescendents()
.OfType<Control>()
.Where(x => x.TemplatedParent == control);
}
else
{
return Enumerable.Empty<Control>();
}
}
}
}

7
Tests/Perspex.Controls.UnitTests/ContentControlTests.cs

@ -12,6 +12,7 @@ namespace Perspex.Controls.UnitTests
using Moq;
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Controls.Templates;
using Perspex.Layout;
using Perspex.Platform;
using Perspex.Styling;
@ -173,7 +174,7 @@ namespace Perspex.Controls.UnitTests
contentControl.ApplyTemplate();
// Need to call ApplyTemplate on presenter for CollectionChanged to be called.
var presenter = contentControl.GetTemplateControls().Single(x => x.Id == "contentPresenter");
var presenter = contentControl.GetTemplateChildren().Single(x => x.Id == "contentPresenter");
presenter.ApplyTemplate();
Assert.True(called);
@ -196,7 +197,7 @@ namespace Perspex.Controls.UnitTests
contentControl.Content = null;
// Need to call ApplyTemplate on presenter for CollectionChanged to be called.
var presenter = contentControl.GetTemplateControls().Single(x => x.Id == "contentPresenter");
var presenter = contentControl.GetTemplateChildren().Single(x => x.Id == "contentPresenter");
presenter.ApplyTemplate();
Assert.True(called);
@ -220,7 +221,7 @@ namespace Perspex.Controls.UnitTests
contentControl.Content = child2;
// Need to call ApplyTemplate on presenter for CollectionChanged to be called.
var presenter = contentControl.GetTemplateControls().Single(x => x.Id == "contentPresenter");
var presenter = contentControl.GetTemplateChildren().Single(x => x.Id == "contentPresenter");
presenter.ApplyTemplate();
Assert.True(called);

7
Tests/Perspex.Controls.UnitTests/DropDownTests.cs

@ -12,6 +12,7 @@ namespace Perspex.Controls.UnitTests
using Moq;
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Controls.Templates;
using Perspex.Platform;
using Perspex.Styling;
using Perspex.VisualTree;
@ -172,7 +173,7 @@ namespace Perspex.Controls.UnitTests
target.ApplyTemplate();
// Need to call ApplyTemplate on presenter for CollectionChanged to be called.
var presenter = target.GetTemplateControls().Single(x => x.Id == "contentPresenter");
var presenter = target.GetTemplateChildren().Single(x => x.Id == "contentPresenter");
presenter.ApplyTemplate();
Assert.True(called);
@ -195,7 +196,7 @@ namespace Perspex.Controls.UnitTests
target.Content = null;
// Need to call ApplyTemplate on presenter for CollectionChanged to be called.
var presenter = target.GetTemplateControls().Single(x => x.Id == "contentPresenter");
var presenter = target.GetTemplateChildren().Single(x => x.Id == "contentPresenter");
presenter.ApplyTemplate();
Assert.True(called);
@ -219,7 +220,7 @@ namespace Perspex.Controls.UnitTests
target.Content = child2;
// Need to call ApplyTemplate on presenter for CollectionChanged to be called.
var presenter = target.GetTemplateControls().Single(x => x.Id == "contentPresenter");
var presenter = target.GetTemplateChildren().Single(x => x.Id == "contentPresenter");
presenter.ApplyTemplate();
Assert.True(called);

9
Tests/Perspex.Controls.UnitTests/ItemsControlTests.cs

@ -12,6 +12,7 @@ namespace Perspex.Controls.UnitTests
using Perspex.Collections;
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Controls.Templates;
using Perspex.Platform;
using Perspex.Styling;
using Perspex.VisualTree;
@ -31,8 +32,8 @@ namespace Perspex.Controls.UnitTests
target.Items = new[] { "Foo" };
target.ApplyTemplate();
var presenter = target.GetTemplateControls().OfType<ItemsPresenter>().Single();
var panel = presenter.GetTemplateControls().OfType<StackPanel>().Single();
var presenter = target.GetTemplateChildren().OfType<ItemsPresenter>().Single();
var panel = presenter.GetTemplateChildren().OfType<StackPanel>().Single();
Assert.Equal(presenter, panel.TemplatedParent);
}
@ -46,8 +47,8 @@ namespace Perspex.Controls.UnitTests
target.Items = new[] { "Foo" };
target.ApplyTemplate();
var presenter = target.GetTemplateControls().OfType<ItemsPresenter>().Single();
var panel = presenter.GetTemplateControls().OfType<StackPanel>().Single();
var presenter = target.GetTemplateChildren().OfType<ItemsPresenter>().Single();
var panel = presenter.GetTemplateChildren().OfType<StackPanel>().Single();
var item = (TextBlock)panel.GetVisualChildren().First();
Assert.Null(item.TemplatedParent);

13
Tests/Perspex.Controls.UnitTests/TemplatedControlTests.cs

@ -11,6 +11,7 @@ namespace Perspex.Controls.UnitTests
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Controls.Primitives;
using Perspex.Controls.Templates;
using Perspex.Styling;
using Perspex.VisualTree;
using Splat;
@ -201,8 +202,8 @@ namespace Perspex.Controls.UnitTests
target.ApplyTemplate();
var panel = target.GetTemplateControls().OfType<StackPanel>().Single();
var textBlock = target.GetTemplateControls().OfType<TextBlock>().Single();
var panel = target.GetTemplateChildren().OfType<StackPanel>().Single();
var textBlock = target.GetTemplateChildren().OfType<TextBlock>().Single();
Assert.Equal(target, panel.TemplatedParent);
Assert.Equal(target, textBlock.TemplatedParent);
@ -226,7 +227,7 @@ namespace Perspex.Controls.UnitTests
target.ApplyTemplate();
var presenter = target.GetTemplateControls().OfType<ContentPresenter>().Single();
var presenter = target.GetTemplateChildren().OfType<ContentPresenter>().Single();
var textBlock = (TextBlock)presenter.Child;
Assert.Equal(target, presenter.TemplatedParent);
@ -261,9 +262,9 @@ namespace Perspex.Controls.UnitTests
target.ApplyTemplate();
var contentControl = target.GetTemplateControls().OfType<ContentControl>().Single();
var border = contentControl.GetTemplateControls().OfType<Border>().Single();
var presenter = contentControl.GetTemplateControls().OfType<ContentPresenter>().Single();
var contentControl = target.GetTemplateChildren().OfType<ContentControl>().Single();
var border = contentControl.GetTemplateChildren().OfType<Border>().Single();
var presenter = contentControl.GetTemplateChildren().OfType<ContentPresenter>().Single();
var textBlock = (TextBlock)presenter.Content;
Assert.Equal(target, contentControl.TemplatedParent);

5
Tests/Perspex.Layout.UnitTests/FullLayoutTests.cs

@ -11,6 +11,7 @@ namespace Perspex.Layout.UnitTests
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Controls.Primitives;
using Perspex.Controls.Templates;
using Perspex.Input;
using Perspex.Platform;
using Perspex.Rendering;
@ -98,8 +99,8 @@ namespace Perspex.Layout.UnitTests
Assert.Equal(new Point(300, 200), Position(scrollViewer));
Assert.Equal(new Size(400, 400), textBlock.ActualSize);
var scrollBars = scrollViewer.GetTemplateControls().OfType<ScrollBar>().ToList();
var presenters = scrollViewer.GetTemplateControls().OfType<ScrollContentPresenter>().ToList();
var scrollBars = scrollViewer.GetTemplateChildren().OfType<ScrollBar>().ToList();
var presenters = scrollViewer.GetTemplateChildren().OfType<ScrollContentPresenter>().ToList();
Assert.Equal(2, scrollBars.Count);
Assert.Equal(1, presenters.Count);

Loading…
Cancel
Save