private void injectButton_Click(object sender, System.EventArgs e)
        {
            qf4net.ILQHsm hsm = SelectedHSM;
            if (hsm == null)
            {
                throw new ArgumentException ("No hsm selected");
            }

            if (eventInput.Text.Trim () != "")
            {
                string inject = eventInput.Text;
                inject = inject.Trim ();

                // if inject matches a TransitionEventAttribute then find its editor an edit!
                foreach (qf4net.TransitionEventAttribute te in hsm.TransitionEvents)
                {
                    if (te.HasDataType)
                    {
                        if (te.ToString () == inject)
                        {
                            qf4net.IQEventEditor eventEditor = GetEditor (te);

                            Form frm = new OkCancelForm ();
                            frm.Text = "Event " + te.EventName;
                            qf4net.QEventDefaultEditContext ctx = new qf4net.QEventDefaultEditContext (frm);
                            if (eventEditor.Edit (ctx) == false)
                            {
                                return;
                            }

                            hsm.AsyncDispatch (new qf4net.QEvent (te.EventName, ctx.Instance));

                            if (eventEditor.SupportsParse)
                            {
                                inject = te + "|" + ctx.Instance;
                                if (!eventInput.Items.Contains (inject))
                                {
                                    eventInput.Items.Add (inject);
                                }
                            }

                            return;
                        }
                    }
                }

                // if inject matches a TransitionEventAttribute + extra data then parse the extra data!
                foreach (qf4net.TransitionEventAttribute te in hsm.TransitionEvents)
                {
                    if (te.HasDataType)
                    {
                        if (inject.StartsWith (te.ToString () + "|"))
                        {
                            qf4net.IQEventEditor eventEditor = GetEditor (te);
                            if (!eventEditor.SupportsParse)
                            {
                                throw new NotSupportedException (te.ToString () + " editor does not support string parsing");
                            }

                            string[] strlist = inject.Split (new char[] {'|'}, 2);
                            string eventName = strlist[0].Trim ();
                            System.Diagnostics.Debug.Assert (eventName != "" && eventName == te.ToString ());
                            string data = null;
                            if (strlist.Length > 1)
                            {
                                data = strlist [1].Trim ();
                            }
                            if (data == null)
                            {
                                throw new ArgumentException ("[" + inject + "] does not contain a Parsable event data string");
                            }

                            object instance = eventEditor.Parse (data);

                            hsm.AsyncDispatch (new qf4net.QEvent (te.EventName, instance));

                            return;
                        }
                    }
                }

                hsm.AsyncDispatch (new qf4net.QEvent (inject));
            }
        }
        private void injectButton_Click(object sender, System.EventArgs e)
        {
            qf4net.ILQHsm hsm = SelectedHSM;
            if (hsm == null)
            {
                throw new ArgumentException("No hsm selected");
            }

            if (eventInput.Text.Trim() != "")
            {
                string inject = eventInput.Text;
                inject = inject.Trim();

                // if inject matches a TransitionEventAttribute then find its editor an edit!
                foreach (qf4net.TransitionEventAttribute te in hsm.TransitionEvents)
                {
                    if (te.HasDataType)
                    {
                        if (te.ToString() == inject)
                        {
                            qf4net.IQEventEditor eventEditor = GetEditor(te);

                            Form frm = new OkCancelForm();
                            frm.Text = "Event " + te.EventName;
                            QEventDefaultEditContext ctx = new QEventDefaultEditContext(frm);
                            if (eventEditor.Edit(ctx) == false)
                            {
                                return;
                            }

                            hsm.AsyncDispatch(new qf4net.QEvent(te.EventName, ctx.Instance));

                            if (eventEditor.SupportsParse)
                            {
                                inject = te + "|" + ctx.Instance;
                                if (!eventInput.Items.Contains(inject))
                                {
                                    eventInput.Items.Add(inject);
                                }
                            }

                            return;
                        }
                    }
                }

                // if inject matches a TransitionEventAttribute + extra data then parse the extra data!
                foreach (qf4net.TransitionEventAttribute te in hsm.TransitionEvents)
                {
                    if (te.HasDataType)
                    {
                        if (inject.StartsWith(te.ToString() + "|"))
                        {
                            qf4net.IQEventEditor eventEditor = GetEditor(te);
                            if (!eventEditor.SupportsParse)
                            {
                                throw new NotSupportedException(te.ToString() + " editor does not support string parsing");
                            }

                            string[] strlist   = inject.Split(new char[] { '|' }, 2);
                            string   eventName = strlist[0].Trim();
                            System.Diagnostics.Debug.Assert(eventName != "" && eventName == te.ToString());
                            string data = null;
                            if (strlist.Length > 1)
                            {
                                data = strlist [1].Trim();
                            }
                            if (data == null)
                            {
                                throw new ArgumentException("[" + inject + "] does not contain a Parsable event data string");
                            }

                            object instance = eventEditor.Parse(data);

                            hsm.AsyncDispatch(new qf4net.QEvent(te.EventName, instance));

                            return;
                        }
                    }
                }

                hsm.AsyncDispatch(new qf4net.QEvent(inject));
            }
        }