private void UpdateConversationDetails(ConversationDetails details)
        {
            Dispatcher.adopt(delegate
            {
                if (Globals.location.activeConversation.IsEmpty)
                {
                    current.Visibility = Visibility.Collapsed;
                    currentConversation.Visibility = Visibility.Collapsed;
                    separator2.Visibility = Visibility.Collapsed;
                }
                if (details.IsEmpty) return;

                // if the conversation we're participating in has been deleted or we're no longer in the listed permission group 
                if (details.Jid == Globals.location.activeConversation.Jid)
                {
                    if (details.isDeleted || (!details.UserHasPermission(Globals.credentials)))
                    {
                        current.Visibility = Visibility.Collapsed;
                        currentConversation.Visibility = Visibility.Collapsed;
                        separator2.Visibility = Visibility.Collapsed;
                        Commands.ShowConversationSearchBox.Execute("find");
                    }
                }
            });
        }
 private bool canJoinConversation(ConversationDetails details)
 {
     if (details.isDeleted || !details.UserHasPermission(Globals.credentials))
     {
         UpdateConversationDetails(details);
         return false;
     }
     return true;
 }
 public void Display(ConversationDetails details)
 {
     //We only display the details of our current conversation (or the one we're entering)
     if (details.IsEmpty)
         return;
     Dispatcher.adopt(delegate
     {
         if (details.IsEmpty || !details.UserHasPermission(Globals.credentials))
         {
             thumbnailList.Clear();
             return;
         }
         //Commands.RequestTeacherStatus.Execute(new TeacherStatus { Conversation = Globals.conversationDetails.Jid, Slide = "0", Teacher = Globals.conversationDetails.Author });
         IsNavigationLocked = calculateNavigationLocked();
         checkMovementLimits();
         redrawing = true;
         foreach (var thumb in thumbnailList.Where(sl => !details.Slides.Exists(s => sl.id == s.id)).ToList())
         {
             thumbnailList.Remove(thumb);
         }
         foreach (var slide in details.Slides.OrderBy(s => s.index).Where(slide => slide.type == Slide.TYPE.SLIDE))
         {
             var lastLegalPos = Math.Min(thumbnailList.Count, slide.index);
             var thumb = thumbnailList.FirstOrDefault(s => s.id == slide.id);
             if (thumb != null && thumb != default(Slide))
             {
                 if (thumb.index != slide.index)
                 {
                     thumbnailList.Remove(thumb);
                     thumbnailList.Insert(lastLegalPos, slide);
                 }
             }
             else
             {
                 thumbnailList.Insert(lastLegalPos, slide);
             }
             if (slide.id == currentSlideId)
                 slides.SelectedItem = slide;
         }
         redrawing = false;
     });
 }