using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Text;
using System.ComponentModel;
using System.Threading;
namespace IvyBus
{
/* This is the Application side of binding storage */
/* association of a generated Key and a delegate and the expression */
/* this is SEND to other client */
[PropertyTab(typeof(System.Windows.Forms.Design.EventsTab), PropertyTabScope.Component)]
[DefaultEvent("Callback")]
[DesignerCategory("Component")]
[DesignTimeVisible(false)] /* should be added via Ivy component */
public class IvyApplicationBinding : System.ComponentModel.Component
{
private BindingType binding;
#if (!PocketPC)
[Category("Ivy")]
#endif
public BindingType Binding
{
get { return binding; }
set { binding = value; }
}
private ushort key;
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public ushort Key
{
get { return key; }
set { key = value; }
}
private object[] args;
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public object[] Args
{
get { return args; }
set { args = value; }
}
private string expression;
#if (!PocketPC)
[Category("Ivy")]
#endif
[DefaultValue(null)]
public string Expression
{
get { return expression; }
set { expression = value; }
}
private string formated_expression;
public string FormatedExpression
{
get
{
FormatExpression();
return formated_expression;
}
}
private StringCollection arguments;
///SentMessageClasses the first word token of sent messages
/// optimise the parsing process when sending messages
///
#if (!PocketPC)
[Category("Ivy")]
#endif
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
// sinon bug System.String constructor not found !
[Editor(
"System.Windows.Forms.Design.StringCollectionEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",
"System.Drawing.Design.UITypeEditor,System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
)]
[Description("Arguments used when formating the expression")]
public StringCollection Arguments
{
get
{
return arguments;
}
}
#if (!PocketPC)
[Category("Ivy")]
#endif
[Description("Event fired when Message Matching expression received")]
public event EventHandler Callback;
public IvyApplicationBinding()
{
arguments = new StringCollection();
}
public IvyApplicationBinding(IContainer container)
: this()
{
container.Add(this);
}
// translate part of expression to object property
public void FormatExpression()
{
if (Callback != null)
{
object target = Callback.Target;
if (args == null)
{
args = new object[arguments.Count];
for (int i = 0; i < arguments.Count; i++)
{
System.Reflection.PropertyInfo prop = target.GetType().GetProperty(arguments[i]);
if (prop != null)
args[i] = prop.GetValue(target, null);
else //TODO what else BUG msgbox in desing mode !!!
args[i] = arguments[i];
}
}
formated_expression = string.Format(expression, args);
}
else //TODO Abnormal condition Design Time
formated_expression = expression;
}
#if ( SyncContext)
internal void Firevent(System.Threading.SynchronizationContext syncContext, IvyMessageEventArgs e)
{
//// Safely invoke an event:
EventHandler temp = Callback;
if (temp == null)
{
throw new IvyException("(callCallback) Not callback for id " + e.Id);
}
if (syncContext != null)
{
SendOrPostCallback update = delegate(object state)
{
IvyMessageEventArgs args = (IvyMessageEventArgs)state;
temp(this, args);
};
syncContext.Send(update, e);
}
else
temp(this, e);
}
#else
internal void Firevent(System.Windows.Forms.Control control, IvyMessageEventArgs e)
{
//// Safely invoke an event:
EventHandler temp = Callback;
if (temp == null)
{
throw new IvyException("(callCallback) Not callback for id " + e.Id);
}
if (control != null)
{
control.Invoke(temp,this, e);
}
else
temp(this, e);
}
#endif
}
}