public override void PerformReflection(ReflectionContext context)
        {
            Type[] workflowTypes = context.WorkflowAssembly.GetWorkflowTypes();

            if (workflowTypes == null)
            {
                return;
            }

            foreach (Type workflowType in workflowTypes)
            {
                WorkflowNode workflowNode = new WorkflowNode();
                workflowNode.Name               = workflowType.Name;
                workflowNode.Text               = workflowType.FullName;
                workflowNode.WorkflowType       = workflowType;
                workflowNode.SelectedImageIndex = workflowNode.ImageIndex = context.GetImageIndex(typeof(WorkflowComponent), WorkflowNodeImageName);

                context.CurrentTreeNode.Nodes.Add(workflowNode);
                ReflectChildComponents(context.CreateClone(workflowNode));
            }

            if (context.WorkflowAssembly.GetWorkflowTypes().Length == 0)
            {
                TreeNode node = new TreeNode();
                node.Text = "<No Workflows Found>";

                context.CurrentTreeNode.Nodes.Add(node);
            }
        }
        private void OpenXamlInNotepad(object sender, EventArgs e)
        {
            ToolStripMenuItem item = (ToolStripMenuItem)sender;
            WorkflowNode      node = (WorkflowNode)item.Tag;

            object workflowInstance = null;

            try
            {
                workflowInstance = node.WorkflowType.InvokeMember(string.Empty, BindingFlags.CreateInstance, null, null, null, CultureInfo.InvariantCulture);
            }
            catch (Exception exc)
            {
                MessageBox.Show("The workflow type could not be created: " + exc.ToString());
                return;
            }

            WorkflowMarkupSerializer serializer = new WorkflowMarkupSerializer();

            string tempFileName = Path.GetTempFileName();


            using (XmlWriter xmlWriter = XmlWriter.Create(tempFileName))
            {
                serializer.Serialize(xmlWriter, workflowInstance);
            }

            ProcessStartInfo psi = new ProcessStartInfo();

            psi.Arguments = tempFileName;
            psi.FileName  = Path.Combine(Environment.GetEnvironmentVariable("windir"), "notepad.exe");

            Process.Start(psi);
        }
        private void OnItemClick(object sender, EventArgs e)
        {
            ToolStripMenuItem item = (ToolStripMenuItem)sender;

            RuleNode node = (RuleNode)item.Tag;
            RuleExpressionCondition expressionCondition = (RuleExpressionCondition)node.Rule;

            WorkflowNode workflowNode = (WorkflowNode)node.Parent;

            EvaluateRuleDialog dialog = new EvaluateRuleDialog(expressionCondition.Expression, workflowNode.WorkflowType);

            dialog.ShowDialog();
        }
        public override void PerformReflection(ReflectionContext context)
        {
            WorkflowNode workflowNode = context.CurrentTreeNode as WorkflowNode;

            if (workflowNode == null)
            {
                throw new ApplicationException("Expected the parent node to be a workflow node.");
            }

            object workflowInstance = null;

            try
            {
                workflowInstance = workflowNode.WorkflowType.InvokeMember(string.Empty, BindingFlags.CreateInstance, null, null, null, CultureInfo.InvariantCulture);
            }
            catch (Exception exc)
            {
                MessageBox.Show("Could not create workflow type: " + exc.ToString());
                return;
            }

            TreeNode activitiesNode = new TreeNode();

            activitiesNode.Text       = "Activities";
            activitiesNode.ImageIndex = activitiesNode.SelectedImageIndex = context.GetImageIndex(typeof(WorkflowActivitiesComponent), ActivitiesNodeImageName);

            workflowNode.Nodes.Add(activitiesNode);

            if (!(workflowInstance is CompositeActivity))
            {
                TreeNode none = new TreeNode();
                none.Text = "<Workflow is not a CompositeActivity>";
                activitiesNode.Nodes.Add(none);
            }
            else
            {
                Queue <KeyValuePair <CompositeActivity, TreeNode> > toProcess = new Queue <KeyValuePair <CompositeActivity, TreeNode> >();
                toProcess.Enqueue(new KeyValuePair <CompositeActivity, TreeNode>((CompositeActivity)workflowInstance, activitiesNode));

                while (toProcess.Count > 0)
                {
                    KeyValuePair <CompositeActivity, TreeNode> pair = toProcess.Dequeue();
                    CompositeActivity compositeActivity             = pair.Key;
                    TreeNode          parent = pair.Value;

                    foreach (Activity activity in compositeActivity.Activities)
                    {
                        ActivityNode activityNode = new ActivityNode();
                        activityNode.Activity   = activity;
                        activityNode.ImageIndex = activityNode.SelectedImageIndex = context.GetImageIndex(typeof(WorkflowActivitiesComponent), ActivityNodeImageName);
                        parent.Nodes.Add(activityNode);

                        ReflectChildComponents(context.CreateClone(activityNode));

                        if (activity is CompositeActivity)
                        {
                            toProcess.Enqueue(new KeyValuePair <CompositeActivity, TreeNode>((CompositeActivity)activity, activityNode));
                        }
                    }
                }
            }
        }
        public override void PerformReflection(ReflectionContext context)
        {
            Type[] workflowTypes = context.WorkflowAssembly.GetWorkflowTypes();
            
            if (workflowTypes == null)
                return;

            foreach (Type workflowType in workflowTypes)
            {
                WorkflowNode workflowNode = new WorkflowNode();
                workflowNode.Name = workflowType.Name;
                workflowNode.Text = workflowType.FullName;
                workflowNode.WorkflowType = workflowType;
                workflowNode.SelectedImageIndex = workflowNode.ImageIndex = context.GetImageIndex(typeof(WorkflowComponent), WorkflowNodeImageName);

                context.CurrentTreeNode.Nodes.Add(workflowNode);
                ReflectChildComponents(context.CreateClone(workflowNode));
            }

            if (context.WorkflowAssembly.GetWorkflowTypes().Length == 0)
            {
                TreeNode node = new TreeNode();
                node.Text = "<No Workflows Found>";

                context.CurrentTreeNode.Nodes.Add(node);
            }
        }