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 */ #if (!PocketPC) [PropertyTab(typeof(System.Windows.Forms.Design.EventsTab), PropertyTabScope.Component)] [DefaultEvent("Callback")] #endif [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; #if (!PocketPC) [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] #endif public ushort Key { get { return key; } set { key = value; } } private object[] args; #if (!PocketPC) [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] #endif 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 List arguments; ///SentMessageClasses the first word token of sent messages /// optimise the parsing process when sending messages /// #if (!PocketPC) [Category("Ivy")] [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")] #endif public List Arguments { get { return arguments; } } #if (!PocketPC) [Category("Ivy")] [Description("Event fired when Message Matching expression received")] #endif public event EventHandler Callback; public IvyApplicationBinding() { arguments = new List(); } public IvyApplicationBinding(IContainer container) : this() { container.Add(this); } // translate part of expression to object property public void FormatExpression() { //// Safely : #if (!PocketPC)//TODO Pocket PC doesn't have Target Member EventHandler temp = Callback; if (temp != null) { //TODO Pocket PC doesn't have Target Member object target = temp.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 #endif formated_expression = expression; } #if ( PocketPC ) 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); } #else 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.Post(update, e); } else temp(this, e); } #endif } }