// The Nova Project by Ken Beckett.
// Copyright (C) 2007-2012 Inevitable Software, all rights reserved.
// Released under the Common Development and Distribution License, CDDL-1.0: http://opensource.org/licenses/cddl1.php
using System.Collections.Generic;
using System.Windows.Media;
using Nova.CodeDOM;
namespace Nova.UI
{
/// <summary>
/// The view model for a <see cref="CodeDOM.For"/>.
/// </summary>
public class ForVM : BlockStatementVM
{
#region /* STATICS */
internal static void AddViewModelMapping()
{
CreateViewModel.Add(typeof(For),
delegate(CodeObject codeObject, bool isDescription, Dictionary<CodeObject, CodeObjectVM> dictionary) { return new ForVM((For)codeObject, isDescription, dictionary); });
}
#endregion
#region /* FIELDS */
protected object _initializationVMs;
protected ExpressionVM _conditionalVM;
protected ChildListVM<ExpressionVM> _iterationVMs;
#endregion
#region /* CONSTRUCTORS */
/// <summary>
/// Create a view model instance for the specified <see cref="CodeDOM.For"/>.
/// </summary>
public ForVM(For @for, bool isDescription, Dictionary<CodeObject, CodeObjectVM> dictionary)
: base(@for, isDescription, dictionary)
{
_initializationVMs = CreateVM(@for.Initialization, isDescription, dictionary);
if (_initializationVMs == null)
_initializationVMs = CreateListVM<Expression, ExpressionVM>(@for.Initializations, dictionary);
_conditionalVM = (ExpressionVM)CreateVM(@for.Conditional, isDescription, dictionary);
_iterationVMs = CreateListVM<Expression, ExpressionVM>(@for.Iterations, dictionary);
}
#endregion
#region /* PROPERTIES */
/// <summary>
/// The underlying <see cref="CodeDOM.For"/> model.
/// </summary>
public For For
{
get { return (For)CodeObject; }
}
/// <summary>
/// A <see cref="LocalDeclVM"/> used as the loop initializer.
/// </summary>
public LocalDeclVM InitializationVM
{
get { return (_initializationVMs is LocalDeclVM ? (LocalDeclVM)_initializationVMs : null); }
}
/// <summary>
/// A list of <see cref="ExpressionVM"/>s used as the loop initializer.
/// </summary>
public ChildListVM<ExpressionVM> InitializationVMs
{
get
{
if (_initializationVMs is LocalDeclVM)
return null;
return (ChildListVM<ExpressionVM>)_initializationVMs;
}
}
/// <summary>
/// The conditional <see cref="ExpressionVM"/>.
/// </summary>
public ExpressionVM ConditionalVM
{
get { return _conditionalVM; }
}
/// <summary>
/// The list of <see cref="ExpressionVM"/>s used for the loop iterations section.
/// </summary>
public ChildListVM<ExpressionVM> IterationVMs
{
get
{
if (_iterationVMs == null)
_iterationVMs = new ChildListVM<ExpressionVM>(this);
return _iterationVMs;
}
}
#endregion
#region /* METHODS */
#endregion
#region /* RENDERING */
public override Brush BorderBrush
{
get { return DarkLavender; }
}
public override Brush BackgroundBrush
{
get { return Brushes.Lavender; }
}
protected override void RenderArgument(CodeRenderer renderer, RenderFlags flags)
{
RenderInfixComments(renderer, AnnotationFlags.IsInfix1, flags);
if (InitializationVM != null)
InitializationVM.Render(renderer, flags);
else
renderer.RenderList(InitializationVMs, flags, this);
renderer.RenderText(Statement.ParseTokenTerminator + " ", PUNC_BRUSH, this);
RenderInfixComments(renderer, AnnotationFlags.IsInfix2, flags);
if (_conditionalVM != null)
_conditionalVM.Render(renderer, flags);
renderer.RenderText(Statement.ParseTokenTerminator + " ", PUNC_BRUSH, this);
RenderInfixComments(renderer, AnnotationFlags.IsInfix3, flags);
renderer.RenderList(_iterationVMs, flags, this);
}
public override void RenderVisible(CodeRenderer renderer, RenderFlags flags)
{
base.RenderVisible(renderer, flags);
if (InitializationVM != null)
InitializationVM.RenderVisible(renderer, flags);
else
renderer.RenderVisibleList(InitializationVMs, flags);
if (_conditionalVM != null)
_conditionalVM.RenderVisible(renderer, flags);
renderer.RenderVisibleList(_iterationVMs, flags);
}
public override void UnRender()
{
if (InitializationVM != null)
InitializationVM.UnRender();
else
ChildListHelpers.UnRender(InitializationVMs);
if (_conditionalVM != null)
_conditionalVM.UnRender();
ChildListHelpers.UnRender(_iterationVMs);
base.UnRender();
}
#endregion
}
}