public ConversationViewModel(ChatClient client, Conversation convo)
        {
            this.client = client;

            sendChatCommand = new RelayCommand(_ =>
                {
                    Conversation.SendMessage(CurrentMessage, App.Current.ClientFont);
                    CurrentMessage = "";
                }, _ => CurrentMessage.Length > 0);

            App.Current.FontChanged += OnFontChanged;
            OnFontChanged(this, null);

            SetConversation(convo);
        }
        public void SwitchToConversation(Conversation convo)
        {
            var convoVM = openTabs.Single(vm =>
                {
                    if (vm is ConversationViewModel)
                        return (vm as ConversationViewModel).Conversation == convo;
                    return false;
                }) as ConversationViewModel;

            OpenTabsView.MoveCurrentTo(convoVM);
        }
 public void DeleteConversation(Conversation convo)
 {
     conversations.Remove(convo);
     conversationEventsMap.Remove(convo.Name);
 }
 public NewConversationEventArgs(Conversation convo, bool clientStarted)
 {
     Conversation = convo;
     ClientStarted = clientStarted;
 }
        Conversation CreateConversation(IContact who, bool clientStarted)
        {
            Conversation convo;
            var events = new ConversationEvents();
            if (who is User)
                convo = new Conversation(client, who as User, events);
            else if (who is Group)
                convo = new Conversation(client, who as Group, events);
            else
                throw new ArgumentException("who is not a User or a Group");

            conversations.Add(convo);
            conversationEventsMap[who.Name] = events;

            NewConversation.SafeInvoke(this, new NewConversationEventArgs(convo, clientStarted));

            return convo;
        }
        public void SetConversation(Conversation convo)
        {
            if (Conversation != null)
            {
                typingParticipants.Clear();
                foreach (var participant in participants)
                    participant.Dispose();
                participants.Clear();

                Conversation.Contact.Changed -= OnContactChanged;
                Conversation.UserAdded -= OnUserAdded;
                Conversation.UserChanged -= OnUserChanged;
                Conversation.UserRemoved -= OnUserRemoved;
                Conversation.NewMessage -= OnChatReceived;
                Conversation.UserTyping -= OnUserTyping;
                Conversation.Ended -= OnEnded;
            }

            Conversation = convo;

            var oldContact = Contact;
            if (convo != null)
            {
                convo.Contact.Changed += OnContactChanged;
                convo.UserAdded += OnUserAdded;
                convo.UserChanged += OnUserChanged;
                convo.UserRemoved += OnUserRemoved;
                convo.NewMessage += OnChatReceived;
                convo.UserTyping += OnUserTyping;
                convo.Ended += OnEnded;

                foreach (var participant in convo.Participants)
                    participants.Add(new UserViewModel(client, participant.User));

                Contact = ContactViewModel.Create(client, convo.Contact);
            }
            else
                Contact = null;

            if (oldContact != null)
                oldContact.Dispose();
        }