private void viewLibrariesToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                var form = (Entity)lvForms.FocusedItem.Tag;
                var formLibrariesNode = FormManager.GetFormLibraries(form);
                if (formLibrariesNode == null || !formLibrariesNode.HasChildNodes)
                {
                    MessageBox.Show("No Libraries are currently registered for the form");
                    return;
                }
                var scripts = (from XmlNode l in formLibrariesNode
                               select ScriptsByName[l.Attributes["name"].Value]).ToList();

                var sod = new ScriptsOrderDialog(scripts, true)
                {
                    StartPosition = FormStartPosition.CenterParent
                };
                if (sod.ShowDialog(ParentForm) == DialogResult.Cancel)
                {
                    return;
                }

                var libraryNodes = new List <XmlNode>();
                foreach (XmlNode node in formLibrariesNode.ChildNodes)
                {
                    libraryNodes.Add(node);
                }

                formLibrariesNode.RemoveAll();

                foreach (var script in sod.Scripts)
                {
                    foreach (var libraryNode in libraryNodes)
                    {
                        if (libraryNode.Attributes["name"].Value == script.GetAttributeValue <string>("name"))
                        {
                            formLibrariesNode.AppendChild(libraryNode);
                            break;
                        }
                    }
                }

                Plugin.UpdateFormLibraryOrder(form, formLibrariesNode);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return;
            }
        }
        private void tsbAddCheckedScripts_Click(object sender, EventArgs e)
        {
            lvLogs.Items.Clear();
            var scripts = crmScriptsTreeView1.GetSelectedScripts();
            var forms   = crmForms1.GetSelectedForms();

            if (scripts.Count == 0)
            {
                MessageBox.Show(ParentForm, "Please select at least one script", "Warning", MessageBoxButtons.OK,
                                MessageBoxIcon.Warning);

                return;
            }

            if (forms.Count == 0)
            {
                MessageBox.Show(ParentForm, "Please select at least one form", "Warning", MessageBoxButtons.OK,
                                MessageBoxIcon.Warning);

                return;
            }

            var sod = new ScriptsOrderDialog(scripts, false)
            {
                StartPosition = FormStartPosition.CenterParent
            };

            if (sod.ShowDialog(ParentForm) == DialogResult.Cancel)
            {
                return;
            }

            WorkAsync(new WorkAsyncInfo
            {
                Message       = "Updating forms...",
                AsyncArgument = new object[] { sod.Scripts, sod.AddFirst, forms },
                Work          = (bw, evt) =>
                {
                    var scriptsArg   = (List <Entity>)((object[])evt.Argument)[0];
                    var addFirstArg  = (bool)((object[])evt.Argument)[1];
                    var formsArg     = (List <Entity>)((object[])evt.Argument)[2];
                    var formsUpdated = new HashSet <Entity>();

                    if (addFirstArg)
                    {
                        scripts.Reverse();
                    }

                    var fManager = new FormManager(Service);

                    bool atLeastOneSuccess = false;

                    foreach (var form in formsArg)
                    {
                        bw.ReportProgress(0, string.Format("Updating form '{0}' ({1})...", form.GetAttributeValue <string>("name"), form.GetAttributeValue <string>("objecttypecode")));

                        bool atLeastOneScriptSucess = false;

                        foreach (var script in scriptsArg)
                        {
                            try
                            {
                                fManager.AddLibrary(form, script.GetAttributeValue <string>("name"), addFirstArg);

                                atLeastOneScriptSucess = true;
                                atLeastOneSuccess      = true;
                                if (!formsUpdated.Contains(form))
                                {
                                    formsUpdated.Add(form);
                                }

                                ListViewDelegates.AddItem(lvLogs,
                                                          new ListViewItem
                                {
                                    Text     = form.GetAttributeValue <string>("objecttypecode"),
                                    SubItems =
                                    {
                                        new ListViewItem.ListViewSubItem {
                                            Text = form.GetAttributeValue <string>("name")
                                        },
                                        new ListViewItem.ListViewSubItem {
                                            Text = script.GetAttributeValue <string>("name")
                                        },
                                        new ListViewItem.ListViewSubItem {
                                            Text = "Added!"
                                        }
                                    },
                                    ForeColor = Color.Green
                                });
                            }
                            catch (Exception error)
                            {
                                ListViewDelegates.AddItem(lvLogs,
                                                          new ListViewItem
                                {
                                    Text     = form.GetAttributeValue <string>("objecttypecode"),
                                    SubItems =
                                    {
                                        new ListViewItem.ListViewSubItem {
                                            Text = form.GetAttributeValue <string>("name")
                                        },
                                        new ListViewItem.ListViewSubItem {
                                            Text = script.GetAttributeValue <string>("name")
                                        },
                                        new ListViewItem.ListViewSubItem {
                                            Text = error.Message
                                        }
                                    },
                                    ForeColor = Color.Red
                                });
                            }
                        }
                        if (atLeastOneScriptSucess)
                        {
                            fManager.UpdateForm(form);
                        }
                    }

                    if (!atLeastOneSuccess)
                    {
                        return;
                    }

                    foreach (var entityToPublish in formsUpdated.Select(f => f.GetAttributeValue <string>("objecttypecode")).Distinct())
                    {
                        bw.ReportProgress(0, string.Format("Publishing entity '{0}'...", entityToPublish));
                        fManager.PublishEntity(entityToPublish);
                    }
                },
                PostWorkCallBack = evt =>
                {
                    if (evt.Error != null)
                    {
                        MessageBox.Show(ParentForm, "An error occured:" + evt.Error.Message, "Error", MessageBoxButtons.OK,
                                        MessageBoxIcon.Error);
                    }
                },
                ProgressChanged = evt => { SetWorkingMessage(evt.UserState.ToString()); }
            });
        }