/// <summary>
        /// This command shows the basic functionality of how to remove the reference of a Reviewer Session from the current project.
        /// In this example the first Reviewer Session that is referenced in the current project will be removed.
        /// </summary>
        /// <returns></returns>
        internal static async Task RemoveSession_Basic()
        {
            try
            {
                //Step 1: Get Reviewer Results project item
                //A project can contain only one Reviewer Results project item
                IEnumerable <ProjectItem>  projectItems       = Project.Current.GetItems <ReviewerResultsProjectItem>();
                ReviewerResultsProjectItem resultsProjectItem = null;
                if (projectItems.Count() > 0)
                {
                    resultsProjectItem = projectItems.FirstOrDefault() as ReviewerResultsProjectItem;
                }
                else
                {
                    return;
                }

                if (null != resultsProjectItem)
                {
                    //Step 2: Get all session items that are currently referenced in the project.
                    IEnumerable <Item> sessionItems = await resultsProjectItem.GetItemsAsync();

                    if (null != sessionItems && sessionItems.Count() > 0)
                    {
                        //Step 3: Remove the first Session from Project
                        await resultsProjectItem.RemoveSessionItemAsync(sessionItems.FirstOrDefault());
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error);
            }
        }
        /// <summary>
        /// This command shows how to mark a Reviewer Session as default.
        /// In this example you can right click a session in the Reviewer Session gallery and mark it as default
        /// </summary>
        /// <returns></returns>
        internal static async Task MarkDefaultSession_Advanced()
        {
            try
            {
                await QueuedTask.Run(() =>
                {
                    //Step 1: Get the Reviewer Session that is right clicked
                    var galleryItem = Utilities.GetContext <GalleryItem>().FirstOrDefault();
                    if (null == galleryItem)
                    {
                        return;
                    }

                    //Step 2: Get Reviewer Results project item
                    //A project can contain only one Reviewer Results project item
                    IEnumerable <ReviewerResultsProjectItem> projectItems = Project.Current.GetItems <ReviewerResultsProjectItem>();
                    ReviewerResultsProjectItem resultsProjectItem         = null;
                    if (projectItems.Count() > 0)
                    {
                        resultsProjectItem = projectItems.FirstOrDefault() as ReviewerResultsProjectItem;
                    }
                    else
                    {
                        MessageBox.Show(string.Format("Current project does not have a connection to the Reviewer Results.{0}Please add a connection to the Reviewer Results and add Reviewer Sessions.", Environment.NewLine), "Warning", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Warning);
                        return;
                    }

                    if (null != resultsProjectItem)
                    {
                        //Step 3: Get all session items that are currently referenced in the project.
                        IEnumerable <Item> sessionItems = resultsProjectItem.GetItems();
                        if (null != sessionItems && sessionItems.Count() > 0)
                        {
                            //Step 4: Find the session item (in the project) that is right clicked in the gallery
                            Item markDefaultItem = sessionItems.Where(p => (p as Item).Path == galleryItem.Path).FirstOrDefault() as Item;
                            if (null != markDefaultItem)
                            {
                                //Step 5: Mark this session as Default
                                resultsProjectItem.DefaultSessionItem = markDefaultItem;

                                //Step 6: Update Default Session property
                                DefaultSession = resultsProjectItem.GetSessionFromItem(markDefaultItem);
                            }
                        }
                        else
                        {
                            MessageBox.Show(string.Format("There are no Reviewer Sessions referenced in the current project.{0}Please add at least one Reviewer Session to the current project.", Environment.NewLine), "Warning", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Warning);
                        }
                    }
                });
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error);
            }
        }
        /// <summary>
        /// This command shows the basic functionality of how to remove the reference of a Reviewer Session from the current project.
        /// In this example the first Reviewer Session that is referenced in the current project will be removed.
        /// </summary>
        /// <returns></returns>
        internal static async Task RemoveSession_Basic()
        {
            try
            {
                await QueuedTask.Run(async() =>
                {
                    //Step 1: Get Reviewer Results project item
                    //A project can contain only one Reviewer Results project item
                    IEnumerable <ReviewerResultsProjectItem> projectItems = Project.Current.GetItems <ReviewerResultsProjectItem>();
                    ReviewerResultsProjectItem resultsProjectItem         = null;
                    if (projectItems.Count() > 0)
                    {
                        resultsProjectItem = projectItems.FirstOrDefault() as ReviewerResultsProjectItem;
                    }
                    else
                    {
                        return;
                    }

                    if (null != resultsProjectItem)
                    {
                        //Step 2: Get all session items that are currently referenced in the project.
                        IEnumerable <Item> sessionItems = resultsProjectItem.GetItems();
                        if (null != sessionItems && sessionItems.Count() > 0)
                        {
                            //Step 3: Remove the first Session that is not default from Project
                            if (sessionItems.Count() > 0)
                            {
                                var firstItem = sessionItems.ToList()[0];
                                if (!firstItem.IsDefault)
                                {
                                    await resultsProjectItem.RemoveSessionItemAsync(firstItem);
                                }
                                else
                                {
                                    if (sessionItems.Count() > 1)
                                    {
                                        var secondItem = sessionItems.ToList()[1];
                                        await resultsProjectItem.RemoveSessionItemAsync(secondItem);
                                    }
                                }
                            }
                        }
                    }
                });
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error);
            }
        }
        /// <summary>
        /// This command shows how to remove the reference of a Reviewer Session from the current project.
        /// In this example you can right click a session in the Reviewer Session gallery and remove it from the current project.
        /// </summary>
        /// <returns></returns>
        internal static async Task RemoveSessions_Advanced()
        {
            try
            {
                //Step 1: Get the session that is right clicked
                var galleryItem = Utilities.GetContext <GalleryItem>().FirstOrDefault();
                if (null == galleryItem)
                {
                    return;
                }
                else
                {
                    //Step 2: Remove the Session from Gallery
                    GalleryItemsChangedEvent.Publish(galleryItem, false);
                }

                await QueuedTask.Run(async() =>
                {
                    //Step 3: Get Reviewer Results project item
                    //A project can contain only one Reviewer Results project item
                    IEnumerable <ReviewerResultsProjectItem> projectItems = Project.Current.GetItems <ReviewerResultsProjectItem>();
                    ReviewerResultsProjectItem resultsProjectItem         = null;
                    if (projectItems.Count() > 0)
                    {
                        resultsProjectItem = projectItems.FirstOrDefault() as ReviewerResultsProjectItem;
                    }

                    if (null != resultsProjectItem)
                    {
                        //Step 4: Get all session items that are currently referenced in the project
                        IEnumerable <Item> sessionItems = resultsProjectItem.GetItems();
                        if (null != sessionItems)
                        {
                            //Step 5: Find the session item (in the project) that is right clicked in the gallery
                            Item itemToRemove = sessionItems.Where(p => (p as Item).Path == galleryItem.Path).FirstOrDefault() as Item;
                            if (null != itemToRemove)
                            {
                                //Step 6: Remove this Session from the current project
                                await resultsProjectItem.RemoveSessionItemAsync(itemToRemove);
                            }
                        }
                    }
                });
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error);
            }
        }
        /// <summary>
        /// This command shows how to add all sessions in a Reviewer Workspace to the current project.
        /// These sessions are also added in the Reviewer Sessions Gallery for quick access
        /// </summary>
        /// <returns></returns>
        internal static async Task AddSessions_Advanced()
        {
            try
            {
                //Step 1: Get Reviewer Results project item
                //A project can contain only one Reviewer Results project item
                IEnumerable <ReviewerResultsProjectItem> projectItems = Project.Current.GetItems <ReviewerResultsProjectItem>();
                ReviewerResultsProjectItem resultsProjectItem         = null;
                if (projectItems.Count() > 0)
                {
                    resultsProjectItem = projectItems.FirstOrDefault() as ReviewerResultsProjectItem;
                }
                else
                {
                    MessageBox.Show(string.Format("Current project does not have a connection to the Reviewer Results.{0}Please add a connection to the Reviewer Results", Environment.NewLine), "Warning", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Warning);
                    return;
                }

                if (null != resultsProjectItem)
                {
                    //Step 2: Get the Reviewer Dataset associated with the Reviewer Results project item
                    ReviewerDataset reviewerDataset = resultsProjectItem.ReviewerDataset;
                    if (null != reviewerDataset)
                    {
                        IEnumerable <Session> reviewerSessions = null;
                        await QueuedTask.Run(() =>
                        {
                            //Step 3: Get all Reviewer session that are in the Reviewer dataset
                            reviewerSessions = reviewerDataset.GetSessions();
                            foreach (Session session in reviewerSessions)
                            {
                                //Step 4: Add each Reviewer session to the current project
                                Item sessionItem = resultsProjectItem.CreateSessionItem(session);
                                resultsProjectItem.AddSessionItemAsync(sessionItem);

                                //Step 5: Raise GalleryItemsChangedEvent to add the Reviewer session to the Gallery
                                GalleryItemsChangedEvent.Publish(new GalleryItem(sessionItem.TypeID, sessionItem.Path, sessionItem.Name), true);
                            }
                        });
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error);
            }
        }
        /// <summary>
        /// This command shows the basic functionality of how to mark a Reviewer Session as default.
        /// In this example the first Reviewer Session that is referenced in the current project will be be marked as default
        /// </summary>
        /// <returns></returns>
        internal static async Task MarkDefaultSession_Basic()
        {
            try
            {
                await QueuedTask.Run(() =>
                {
                    //Step 1: Get Reviewer Results project item
                    //A project can contain only one Reviewer Results project item
                    IEnumerable <ReviewerResultsProjectItem> projectItems = Project.Current.GetItems <ReviewerResultsProjectItem>();
                    ReviewerResultsProjectItem resultsProjectItem         = null;
                    if (projectItems.Count() > 0)
                    {
                        resultsProjectItem = projectItems.FirstOrDefault() as ReviewerResultsProjectItem;
                    }
                    else
                    {
                        MessageBox.Show(string.Format("Current project does not have a connection to the Reviewer Results.{0}Please add a connection to the Reviewer Results and add Reviewer Sessions.", Environment.NewLine), "Warning", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Warning);
                        return;
                    }

                    if (null != resultsProjectItem)
                    {
                        //Step 2: Get all session items that are currently referenced in the project.
                        IEnumerable <Item> sessionItems = resultsProjectItem.GetItems();
                        if (null != sessionItems && sessionItems.Count() > 0)
                        {
                            //Step 3: Mark first session as Default
                            resultsProjectItem.DefaultSessionItem = sessionItems.FirstOrDefault();
                        }
                        else
                        {
                            MessageBox.Show(string.Format("There are no Reviewer Sessions referenced in the current project.{0}Please add at least one Reviewer Session to the current project.", Environment.NewLine), "Warning", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Warning);
                        }
                    }
                });
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error);
            }
        }
        /// <summary>
        /// This command shows the basic functionality of how to remove a connection to Reviewer Results from the current project.
        /// </summary>
        /// <returns></returns>
        internal static async Task RemoveReviewerResults_Basic()
        {
            try
            {
                //Step 1: Get Reviewer Results project item
                //A project can contain only one Reviewer Results project item
                IEnumerable <ReviewerResultsProjectItem> projectItems = Project.Current.GetItems <ReviewerResultsProjectItem>();
                if (projectItems.Count() > 0)
                {
                    //Step 2: Remove Reviewer Results project item from the current project
                    ReviewerResultsProjectItem resultsProjectItem = projectItems.FirstOrDefault();

                    await QueuedTask.Run(() =>
                    {
                        Project.Current.RemoveItem(resultsProjectItem as IProjectItem);
                    });
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error);
            }
        }