Skip to content

Commit

Permalink
moved deque showing logic to DequeControl
Browse files Browse the repository at this point in the history
  • Loading branch information
svick committed May 15, 2011
1 parent 97834c3 commit 9a7ba9c
Show file tree
Hide file tree
Showing 5 changed files with 139 additions and 95 deletions.
6 changes: 6 additions & 0 deletions DequeControl.xaml
@@ -0,0 +1,6 @@
<UserControl x:Class="Immutable_Deque_visualization.DequeControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:tc="clr-namespace:TreeContainer;assembly=TreeContainer">
<tc:TreeContainer Name="treeContainer" Margin="5" x:FieldModifier="private" />
</UserControl>
122 changes: 122 additions & 0 deletions DequeControl.xaml.cs
@@ -0,0 +1,122 @@
using System;
using System.Reflection;
using System.Windows;
using System.Windows.Controls;
using TreeContainer;

namespace Immutable_Deque_visualization
{
public partial class DequeControl : UserControl
{
public static readonly DependencyProperty DequeProperty =
DependencyProperty.Register("Deque", typeof(IDeque<string>), typeof(DequeControl), new PropertyMetadata(DequeChanged));

public IDeque<string> Deque
{
get { return (IDeque<string>)GetValue(DequeProperty); }
set { SetValue(DequeProperty, value); }
}

public DequeControl()
{
InitializeComponent();
}

static void DequeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((DequeControl)d).Visualize();
}

public void Visualize()
{
Visualize(Deque, null);
}

void Visualize<T>(IDeque<T> iDeque, TreeNode parent)
{
var dequeNode = AddDequeNode(iDeque, parent);

if (iDeque is Deque<T>.SingleDeque)
{
var singleDeque = (Deque<T>.SingleDeque)iDeque;
Visualize(singleDeque.Item, dequeNode);
}
else if (iDeque is Deque<T>)
{
var deque = (Deque<T>)iDeque;
Visualize(deque.Left, dequeNode);
Visualize(deque.Middle, dequeNode);
Visualize(deque.Right, dequeNode);
}
}

void Visualize<T>(Deque<T>.Dequelette dequelette, TreeNode parent)
{
var dequeletteNode = AddDequeletteNode(dequelette, parent);

if (dequelette is Deque<T>.One)
{
var one = (Deque<T>.One)dequelette;
Visualize(one.V1, dequeletteNode);
}
else if (dequelette is Deque<T>.Two)
{
var two = (Deque<T>.Two)dequelette;
Visualize(two.V1, dequeletteNode);
Visualize(two.V2, dequeletteNode);
}
else if (dequelette is Deque<T>.Three)
{
var three = (Deque<T>.Three)dequelette;
Visualize(three.V1, dequeletteNode);
Visualize(three.V2, dequeletteNode);
Visualize(three.V3, dequeletteNode);
}
else if (dequelette is Deque<T>.Four)
{
var four = (Deque<T>.Four)dequelette;
Visualize(four.V1, dequeletteNode);
Visualize(four.V2, dequeletteNode);
Visualize(four.V3, dequeletteNode);
Visualize(four.V4, dequeletteNode);
}
}

void Visualize<T>(T value, TreeNode parent)
{
MethodInfo bestOverload = null;
Type t = typeof(T);
while (bestOverload == null)
{
bestOverload = typeof(DequeControl).GetGenericMethod(
"Visualize", BindingFlags.NonPublic | BindingFlags.Instance, t, typeof(TreeNode));
if (bestOverload == null)
t = t.BaseType;
}
var thisMethod = MethodBase.GetCurrentMethod();

if (bestOverload == thisMethod)
AddValueNode(value, parent);
else
bestOverload.MakeGenericMethod(t.GetGenericArguments()).Invoke(this, new object[] { value, parent });
}

private TreeNode AddDequeletteNode<T>(Deque<T>.Dequelette dequelette, TreeNode parent)
{
var valueNode = new DequeletteNode<T>(dequelette);
return treeContainer.AddNode(valueNode, parent);
}

TreeNode AddDequeNode<T>(IDeque<T> deque, TreeNode parent)
{
var dequeNode = new DequeNode<T>(deque);
return parent == null ? treeContainer.AddRoot(dequeNode) : treeContainer.AddNode(dequeNode, parent);
}

void AddValueNode<T>(T value, TreeNode parent)
{
var valueNode = new ValueNode<T>(value);
treeContainer.AddNode(valueNode, parent);
}
}
}
7 changes: 7 additions & 0 deletions Immutable Deque visualization.csproj
Expand Up @@ -55,8 +55,15 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Compile Include="DequeControl.xaml.cs">
<DependentUpon>DequeControl.xaml</DependentUpon>
</Compile>
<Compile Include="DequeViewModel.cs" />
<Compile Include="TypeExtensions.cs" />
<Page Include="DequeControl.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="MainWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
Expand Down
5 changes: 3 additions & 2 deletions MainWindow.xaml
@@ -1,8 +1,9 @@
<Window x:Class="Immutable_Deque_visualization.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:tc="clr-namespace:TreeContainer;assembly=TreeContainer"
xmlns:local="clr-namespace:Immutable_Deque_visualization"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" d:DataContext="{d:DesignInstance local:DequeViewModel}"
Title="MainWindow" Height="350" Width="800">
<Window.Resources>
<DataTemplate DataType="{x:Type local:DequeNodeBase}">
Expand All @@ -12,6 +13,6 @@
</DataTemplate>
</Window.Resources>
<DockPanel>
<tc:TreeContainer Name="treeContainer" Margin="5" x:FieldModifier="private" />
<local:DequeControl x:Name="dequeControl" Deque="{Binding Deque}" />
</DockPanel>
</Window>
94 changes: 1 addition & 93 deletions MainWindow.xaml.cs
@@ -1,7 +1,4 @@
using System;
using System.Reflection;
using System.Windows;
using TreeContainer;
using System.Windows;

namespace Immutable_Deque_visualization
{
Expand All @@ -15,95 +12,6 @@ public MainWindow()

m_viewModel = new DequeViewModel();
DataContext = m_viewModel;

Visualize(m_viewModel.Deque, null);
}

void Visualize<T>(IDeque<T> iDeque, TreeNode parent)
{
var dequeNode = AddDequeNode(iDeque, parent);

if (iDeque is Deque<T>.SingleDeque)
{
var singleDeque = (Deque<T>.SingleDeque)iDeque;
Visualize(singleDeque.Item, dequeNode);
}
else if (iDeque is Deque<T>)
{
var deque = (Deque<T>)iDeque;
Visualize(deque.Left, dequeNode);
Visualize(deque.Middle, dequeNode);
Visualize(deque.Right, dequeNode);
}
}

void Visualize<T>(Deque<T>.Dequelette dequelette, TreeNode parent)
{
var dequeletteNode = AddDequeletteNode(dequelette, parent);

if (dequelette is Deque<T>.One)
{
var one = (Deque<T>.One)dequelette;
Visualize(one.V1, dequeletteNode);
}
else if (dequelette is Deque<T>.Two)
{
var two = (Deque<T>.Two)dequelette;
Visualize(two.V1, dequeletteNode);
Visualize(two.V2, dequeletteNode);
}
else if (dequelette is Deque<T>.Three)
{
var three = (Deque<T>.Three)dequelette;
Visualize(three.V1, dequeletteNode);
Visualize(three.V2, dequeletteNode);
Visualize(three.V3, dequeletteNode);
}
else if (dequelette is Deque<T>.Four)
{
var four = (Deque<T>.Four)dequelette;
Visualize(four.V1, dequeletteNode);
Visualize(four.V2, dequeletteNode);
Visualize(four.V3, dequeletteNode);
Visualize(four.V4, dequeletteNode);
}
}

void Visualize<T>(T value, TreeNode parent)
{
MethodInfo bestOverload = null;
Type t = typeof(T);
while (bestOverload == null)
{
bestOverload = typeof(MainWindow).GetGenericMethod(
"Visualize", BindingFlags.NonPublic | BindingFlags.Instance, t, typeof(TreeNode));
if (bestOverload == null)
t = t.BaseType;
}
var thisMethod = MethodBase.GetCurrentMethod();

if (bestOverload == thisMethod)
AddValueNode(value, parent);
else
bestOverload.MakeGenericMethod(t.GetGenericArguments()).Invoke(this, new object[] { value, parent });
}

private TreeNode AddDequeletteNode<T>(Deque<T>.Dequelette dequelette, TreeNode parent)
{
var valueNode = new DequeletteNode<T>(dequelette);
return treeContainer.AddNode(valueNode, parent);
}

TreeNode AddDequeNode<T>(IDeque<T> deque, TreeNode parent)
{
var dequeNode = new DequeNode<T>(deque);
return parent == null ? treeContainer.AddRoot(dequeNode) : treeContainer.AddNode(dequeNode, parent);
}

void AddValueNode<T>(T value, TreeNode parent)
{
var valueNode = new ValueNode<T>(value);
treeContainer.AddNode(valueNode, parent);
}
}
}

0 comments on commit 9a7ba9c

Please sign in to comment.