202 lines
5.5 KiB
C#
202 lines
5.5 KiB
C#
|
//-------------------------------------------------------------
|
|||
|
// <copyright company=<3D>Microsoft Corporation<6F>>
|
|||
|
// Copyright <20> Microsoft Corporation. All Rights Reserved.
|
|||
|
// </copyright>
|
|||
|
//-------------------------------------------------------------
|
|||
|
// @owner=alexgor, deliant
|
|||
|
//=================================================================
|
|||
|
// File: FormulaRegistry.cs
|
|||
|
//
|
|||
|
// Namespace: System.Web.UI.WebControls[Windows.Forms].Charting.Formulas
|
|||
|
//
|
|||
|
// Classes: FormulaRegistry
|
|||
|
//
|
|||
|
// Purpose: Keep track of all registered formula module types.
|
|||
|
//
|
|||
|
// Reviewed: GS - August 6, 2002
|
|||
|
// AG - August 7, 2002
|
|||
|
//
|
|||
|
//===================================================================
|
|||
|
|
|||
|
|
|||
|
#region Used namespace
|
|||
|
|
|||
|
using System;
|
|||
|
using System.Collections;
|
|||
|
using System.ComponentModel;
|
|||
|
using System.ComponentModel.Design;
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#if Microsoft_CONTROL
|
|||
|
namespace System.Windows.Forms.DataVisualization.Charting.Formulas
|
|||
|
#else
|
|||
|
namespace System.Web.UI.DataVisualization.Charting.Formulas
|
|||
|
#endif
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// Keep track of all registered formula modules types.
|
|||
|
/// </summary>
|
|||
|
internal class FormulaRegistry : IServiceProvider
|
|||
|
{
|
|||
|
#region Fields
|
|||
|
|
|||
|
// Storage for all registered formula modules
|
|||
|
internal Hashtable registeredModules = new Hashtable(StringComparer.OrdinalIgnoreCase);
|
|||
|
private Hashtable _createdModules = new Hashtable(StringComparer.OrdinalIgnoreCase);
|
|||
|
private ArrayList _modulesNames = new ArrayList();
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region Methods
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Formula Registry public constructor
|
|||
|
/// </summary>
|
|||
|
public FormulaRegistry()
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Adds modules into the registry.
|
|||
|
/// </summary>
|
|||
|
/// <param name="name">Module name.</param>
|
|||
|
/// <param name="moduleType">Module class type.</param>
|
|||
|
public void Register(string name, Type moduleType)
|
|||
|
{
|
|||
|
// First check if module with specified name already registered
|
|||
|
if(registeredModules.Contains(name))
|
|||
|
{
|
|||
|
// If same type provided - ignore
|
|||
|
if(registeredModules[name].GetType() == moduleType)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
// Error - throw exception
|
|||
|
throw( new ArgumentException( SR.ExceptionFormulaModuleNameIsNotUnique( name ) ) );
|
|||
|
}
|
|||
|
|
|||
|
// Add Module Name
|
|||
|
_modulesNames.Add(name);
|
|||
|
|
|||
|
// Make sure that specified class support IFormula interface
|
|||
|
bool found = false;
|
|||
|
Type[] interfaces = moduleType.GetInterfaces();
|
|||
|
foreach(Type type in interfaces)
|
|||
|
{
|
|||
|
if(type == typeof(IFormula))
|
|||
|
{
|
|||
|
found = true;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
if(!found)
|
|||
|
{
|
|||
|
throw( new ArgumentException( SR.ExceptionFormulaModuleHasNoInterface));
|
|||
|
}
|
|||
|
|
|||
|
// Add formula module to the hash table
|
|||
|
registeredModules[name] = moduleType;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Returns formula module registry service object.
|
|||
|
/// </summary>
|
|||
|
/// <param name="serviceType">Service AxisName.</param>
|
|||
|
/// <returns>Service object.</returns>
|
|||
|
[EditorBrowsableAttribute(EditorBrowsableState.Never)]
|
|||
|
object IServiceProvider.GetService(Type serviceType)
|
|||
|
{
|
|||
|
if(serviceType == typeof(FormulaRegistry))
|
|||
|
{
|
|||
|
return this;
|
|||
|
}
|
|||
|
throw (new ArgumentException( SR.ExceptionFormulaModuleRegistryUnsupportedType( serviceType.ToString())));
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Returns formula module object by name.
|
|||
|
/// </summary>
|
|||
|
/// <param name="name">Formula Module name.</param>
|
|||
|
/// <returns>Formula module object derived from IFormula.</returns>
|
|||
|
public IFormula GetFormulaModule(string name)
|
|||
|
{
|
|||
|
// First check if formula module with specified name registered
|
|||
|
if(!registeredModules.Contains(name))
|
|||
|
{
|
|||
|
throw( new ArgumentException( SR.ExceptionFormulaModuleNameUnknown( name ) ) );
|
|||
|
}
|
|||
|
|
|||
|
// Check if the formula module object is already created
|
|||
|
if(!_createdModules.Contains(name))
|
|||
|
{
|
|||
|
// Create formula module object
|
|||
|
_createdModules[name] =
|
|||
|
((Type)registeredModules[name]).Assembly.
|
|||
|
CreateInstance(((Type)registeredModules[name]).ToString());
|
|||
|
}
|
|||
|
|
|||
|
return (IFormula)_createdModules[name];
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Returns the name of the module.
|
|||
|
/// </summary>
|
|||
|
/// <param name="index">Module index.</param>
|
|||
|
/// <returns>Module Name.</returns>
|
|||
|
public string GetModuleName( int index )
|
|||
|
{
|
|||
|
return (string)_modulesNames[index];
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region Properties
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Return the number of registered modules.
|
|||
|
/// </summary>
|
|||
|
public int Count
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _modulesNames.Count;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Interface which defines the set of standard methods and
|
|||
|
/// properties for each formula module
|
|||
|
/// </summary>
|
|||
|
internal interface IFormula
|
|||
|
{
|
|||
|
#region IFormula Properties and Methods
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Formula Module name
|
|||
|
/// </summary>
|
|||
|
string Name { get; }
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// The first method in the module, which converts a formula
|
|||
|
/// name to the corresponding private method.
|
|||
|
/// </summary>
|
|||
|
/// <param name="formulaName">String which represent a formula name</param>
|
|||
|
/// <param name="inputValues">Arrays of doubles - Input values</param>
|
|||
|
/// <param name="outputValues">Arrays of doubles - Output values</param>
|
|||
|
/// <param name="parameterList">Array of strings - Formula parameters</param>
|
|||
|
/// <param name="extraParameterList">Array of strings - Extra Formula parameters from DataManipulator object</param>
|
|||
|
/// <param name="outLabels">Array of strings - Used for Labels. Description for output results.</param>
|
|||
|
void Formula(string formulaName, double [][] inputValues, out double [][] outputValues, string [] parameterList, string [] extraParameterList, out string [][] outLabels );
|
|||
|
|
|||
|
#endregion
|
|||
|
}
|
|||
|
}
|
|||
|
|