void ClearState()
 {
     ErrorMessage = "";
     DiagramItems.Clear();
     HeaderItems.Clear();
     NotifyOfPropertyChange(nameof(HasItems));
 }
        public void Handle(ScrollDiagramItemIntoView @event)
        {
            var diagramItem = DiagramItems.OfType <Arrow>()
                              .FirstOrDefault(a => a.SelectedMessage.Id == @event.Message.Id);

            if (diagramItem != null)
            {
                view?.diagram.BringIntoView(diagramItem);
            }
        }
        void RefreshSelection()
        {
            foreach (var item in DiagramItems.OfType <Handler>())
            {
                item.IsFocused = false;
            }

            foreach (var item in DiagramItems.OfType <Arrow>())
            {
                if (string.Equals(item.SelectedMessage.Id, Selection.SelectedMessage.Id, StringComparison.InvariantCultureIgnoreCase))
                {
                    item.IsFocused = true;
                    continue;
                }

                item.IsFocused = false;
            }
        }
        void CreateElements(List <StoredMessage> messages)
        {
            var modelCreator = new ModelCreator(messages, this);
            var endpoints    = modelCreator.Endpoints;
            var handlers     = modelCreator.Handlers;
            var routes       = modelCreator.Routes;

            ClearState();

            DiagramItems.AddRange(endpoints);
            DiagramItems.AddRange(endpoints.Select(e => e.Timeline));
            DiagramItems.AddRange(handlers);
            DiagramItems.AddRange(handlers.SelectMany(h => h.Out));
            DiagramItems.AddRange(routes);

            HeaderItems.AddRange(endpoints);

            NotifyOfPropertyChange(nameof(HasItems));
        }
        public async Task Handle(SelectedMessageChanged message)
        {
            try
            {
                var conversationId = Selection?.SelectedMessage?.ConversationId;
                if (string.IsNullOrEmpty(conversationId))
                {
                    ClearState();
                    return;
                }

                if (loadedConversationId == conversationId && DiagramItems.Any()) //If we've already displayed this diagram
                {
                    RefreshSelection();
                    return;
                }

                var messages = (await serviceControl.GetConversationById(conversationId)).ToList();
                if (messages.Count == 0)
                {
                    LogTo.Warning("No messages found for conversation id {0}", conversationId);
                    ClearState();
                    return;
                }

                CreateElements(messages);
                loadedConversationId = conversationId;
                RefreshSelection();
            }
            catch (Exception ex)
            {
                ClearState();
                ErrorMessage  = $"There was an error processing the message data.";
                ReportPackage = new ReportMessageCommand.ReportMessagePackage(ex, Selection?.SelectedMessage);
            }
        }