blob: d1ca6606aea9743014be52c0b3bc1d707126a035 [file] [log] [blame]
using System;
using Agility.Core;
using Nexus.Core;
using Nexus.Core.Tables;
using Nexus.Core.Validators;
using Spring.Context;
namespace Nexus.Extras.Spring
{
/// <summary>
/// Concrete IFieldContext implementation that uses Spring MessageSource to resolve text .
/// </summary>
/// <remarks><p>
/// This implementation *requires* that a Spring MessageSource be exposed to each the FieldContext member.
/// The simplest way to do that is by using a base FieldContext in the Spring configuration file.
/// The MessageSource property can be set once in the base and inherited by the others.
/// </p><p>
/// In this implementation,
/// the text properties -- Alert, Hint, Help, Label, and Required -- are read-only
/// and cannot be accessed with a MessageSource property.
/// When the property is read,
/// the method looks for a message resource that shares the same ID as the FieldContext,
/// but with a "_property" suffix (_alert, _hint, _help, _label, _required).
/// So, if the FieldContext ID is LastName, then reading its Alert will look for a message
/// resource named "LastName_alert".
/// </p><p>
/// In the case of an Alert, a message may also be provided by the Processor.
/// If so, then the Processor message supercedes the default message.
/// In this way, you can set a default for all the controls,
/// and then override the default for specific processors.
/// </p><p>
/// To provide a default Alert or Required to use when no other is provided,
/// provide a Message Resource entry in the form: "_alert" or "_required".
/// </p><p>
/// If a Label message is not found, the FieldContext ID is returned instead.
/// Otherwise, if no message is found,
/// then the FieldContext ID and property tag (e.g. "LastName_required")
/// is returned.
/// </p></remarks>
///
[Serializable]
public class FieldContext : Context, IFieldContext
{
public FieldContext() : base()
{
ControlTypeName = Tokens.CONTROL_INPUT; // Default
}
public string ControlTypeName
{
get { return this[Tokens.ControlTypeName] as string; }
set { this[Tokens.ControlTypeName] = value; }
}
public string ID
{
get { return this[Tokens.ID] as string; }
set { this[Tokens.ID] = value; }
}
public IProcessor Processor
{
get { return this[Tokens.Processor] as IProcessor; }
set { this[Tokens.Processor] = value; }
}
#region text properties
private IMessageSource _MessageSource;
/// <summary>
/// Identify the message source for this FieldContext.
/// </summary>
/// <exception cref="System.InvalidOperationException">
/// If the context has not been initialized yet.
/// </exception>
public IMessageSource MessageSource
{
get { return _MessageSource; }
set { _MessageSource = value; }
}
/// <summary>
/// Resolve the message.
/// </summary>
/// <param name="name">The name of the resource to get.</param>
/// <returns>
/// The resolved message if the lookup was successful. Otherwise, it either throws
/// an exception or returns the resource name, depending on the implementation.
/// </returns>
private string GetMessage(string name)
{
return MessageSource.GetMessage(name);
}
/// <summary>
/// Resolve the message or return null.
/// </summary>
/// <param name="name">The name of the resource to get.</param>
/// <returns>A resolved message or null if the message could not be located for any reason.</returns>
private string GetMessageOrNull(string name)
{
string _name = null;
try
{
_name = GetMessage(name);
}
catch (Exception e)
{
e = e; // silly assignment
_name = null;
}
return _name;
}
/// <summary>
/// Return the message for the Processor,
/// or the message for the FieldContext,
/// or the message for the suffix,
/// or the FieldContext ID and suffix verbatim,
/// if all else fails.
/// </summary>
/// <param name="root">FieldContext ID</param>
/// <param name="suffix">Message type</param>
/// <returns>A message or the root+suffix</returns>
private string GetText(string root, string suffix)
{
string text = null;
IProcessor processor = Processor;
string id = null;
if (processor != null) id = processor.ID;
if (id != null) text = GetMessageOrNull(id + suffix);
if (text == null)
{
text = GetMessageOrNull(root + suffix);
}
if (text == null)
{
text = GetMessageOrNull(suffix);
}
if (text == null) text = root + suffix;
return text;
}
public string Alert
{
get { return GetText(this.ID, "_alert"); }
set { throw new NotSupportedException(); }
}
public string Hint
{
get { return GetText(this.ID, "_hint"); }
set { throw new NotSupportedException(); }
}
public string Help
{
get { return GetText(this.ID, "_help"); }
set { throw new NotSupportedException(); }
}
public string Label
{
get
{
string label = GetMessageOrNull(this.ID + "_label");
if (label == null) label = ID;
return label;
}
set { throw new NotSupportedException(); }
}
public string Required
{
get { return GetText(this.ID, "_required"); }
set { throw new NotSupportedException(); }
}
#endregion
}
}