// 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;
using System.Collections.Generic;
using System.Reflection;
using System.Windows.Media;
using Nova.CodeDOM;
using ParameterModifier = Nova.CodeDOM.ParameterModifier;
namespace Nova.UI
{
/// <summary>
/// The view model for a <see cref="CodeDOM.ParameterRef"/>.
/// </summary>
public class ParameterRefVM : VariableRefVM
{
#region /* STATICS */
internal static void AddViewModelMapping()
{
CreateViewModel.Add(typeof(ParameterRef),
delegate(CodeObject codeObject, bool isDescription, Dictionary<CodeObject, CodeObjectVM> dictionary) { return new ParameterRefVM((ParameterRef)codeObject, dictionary); });
}
#endregion
#region /* CONSTRUCTORS */
/// <summary>
/// Create a view model instance for the specified <see cref="CodeDOM.ParameterRef"/>.
/// </summary>
public ParameterRefVM(ParameterRef parameterRef, Dictionary<CodeObject, CodeObjectVM> dictionary)
: base(parameterRef, dictionary)
{ }
#endregion
#region /* PROPERTIES */
/// <summary>
/// The underlying <see cref="CodeDOM.ParameterRef"/> model.
/// </summary>
public ParameterRef ParameterRef
{
get { return (ParameterRef)CodeObject; }
}
#endregion
#region /* METHODS */
#endregion
#region /* RENDERING */
protected override Brush RenderBrush(RenderFlags flags)
{
// This allows 'value' refs to be rendered as keywords
if (ParameterRef.Reference is ParameterDecl)
return ((ParameterDeclVM)CreateVM((ParameterDecl)ParameterRef.Reference)).RenderBrush();
return IDENTIFIER_BRUSH;
}
public static void RenderParameterInfo(CodeRenderer renderer, ParameterInfo parameterInfo, RenderFlags flags, CodeObjectVM tag)
{
RenderFlags passFlags = flags & ~RenderFlags.Description;
bool hasBorder = flags.HasFlag(RenderFlags.ForceBorder);
if (hasBorder)
renderer.CreateBorder(VariableDeclVM.StaticBorderBrush, VariableDeclVM.StaticBackgroundBrush, tag);
AttributeVM.RenderAttributes(renderer, parameterInfo, tag);
ParameterModifier modifier = ParameterRef.GetParameterModifier(parameterInfo);
if (modifier != ParameterModifier.None)
{
renderer.RenderText(ParameterDecl.ParameterModifierToString(modifier), KEYWORD_BRUSH, tag);
renderer.RenderText(" ", PUNC_BRUSH, tag);
}
Type parameterType = parameterInfo.ParameterType;
if (parameterType.IsByRef)
{
// Dereference (remove the trailing '&') if it's a reference type
parameterType = parameterType.GetElementType();
}
TypeRefBaseVM.RenderTypeAsTypeRefVM(renderer, parameterType, passFlags, tag); // Render as TypeRefVM for nested tooltips
renderer.RenderText(" ", PUNC_BRUSH, tag);
renderer.RenderText(parameterInfo.Name, IDENTIFIER_BRUSH, tag);
// If we have a border, return to the previous one
if (hasBorder)
renderer.ReturnToBorderParent(tag);
}
#endregion
}
}