using System;
using System.ComponentModel;
using FastReport.Utils;
using System.Drawing.Design;
namespace FastReport.Data
{
///
/// This class represents a single parameter to use in the "select" command.
///
public class CommandParameter : Base
{
private enum ParamValue { Uninitialized }
#region Fields
private int dataType;
private int size;
private string expression;
private string defaultValue;
private object value;
private object lastValue;
#endregion
#region Properties
///
/// Gets or sets the parameter's data type.
///
[TypeConverter(typeof(FastReport.TypeConverters.ParameterDataTypeConverter))]
[Category("Data")]
[Editor("FastReport.TypeEditors.ParameterDataTypeEditor, FastReport", typeof(UITypeEditor))]
public int DataType
{
get { return dataType; }
set { dataType = value; }
}
///
/// Gets or sets the size of parameter's data.
///
///
/// This property is used if the property is set to String.
///
[DefaultValue(0)]
[Category("Data")]
public int Size
{
get { return size; }
set { size = value; }
}
///
/// Gets or sets an expression that returns the parameter's value.
///
///
/// If this property is not set, the property will be used
/// to obtain a parameter's value.
///
[Category("Data")]
[Editor("FastReport.TypeEditors.ExpressionEditor, FastReport", typeof(UITypeEditor))]
public string Expression
{
get { return expression; }
set { expression = value; }
}
///
/// Gets or sets a default value for this parameter.
///
///
/// This value is used when you designing a report. Also it is used when report is running
/// in case if you don't provide a value for the property.
///
public string DefaultValue
{
get { return defaultValue; }
set
{
defaultValue = value;
this.value = null;
}
}
///
/// Gets or sets the parameter's value.
///
[Browsable(false)]
public object Value
{
get
{
if (!String.IsNullOrEmpty(Expression) && Report.IsRunning)
value = Report.Calc(Expression);
if (value == null)
value = new Variant(DefaultValue);
return value;
}
set { this.value = value; }
}
///
/// This property is not relevant to this class.
///
[Browsable(false)]
public new Restrictions Restrictions
{
get { return base.Restrictions; }
set { base.Restrictions = value; }
}
internal Type GetUnderlyingDataType
{
get
{
if (Parent is TableDataSource && Parent.Parent is DataConnectionBase)
return (Parent.Parent as DataConnectionBase).GetParameterType();
return null;
}
}
internal object LastValue
{
get { return lastValue; }
set { lastValue = value; }
}
#endregion
#region Public Methods
///
public override void Serialize(FRWriter writer)
{
CommandParameter c = writer.DiffObject as CommandParameter;
base.Serialize(writer);
if (DataType != c.DataType)
writer.WriteInt("DataType", DataType);
if (Size != c.Size)
writer.WriteInt("Size", Size);
if (Expression != c.Expression)
writer.WriteStr("Expression", Expression);
if (DefaultValue != c.DefaultValue)
writer.WriteStr("DefaultValue", DefaultValue);
}
///
public override string[] GetExpressions()
{
return new string[] { Expression };
}
internal void ResetLastValue()
{
LastValue = ParamValue.Uninitialized;
}
#endregion
///
/// Initializes a new instance of the class with default settings.
///
public CommandParameter()
{
Expression = "";
DefaultValue = "";
SetFlags(Flags.CanEdit | Flags.CanCopy, false);
}
}
}