public void OnChatClosed(FrameworkElement vChat)
        {
            var data = vChat.Tag as Tuple <RatChat.Core.IChatSource, string>;

            data.Item1.OnNewMessagesArrived -= ichat_OnNewMessagesArrived;
            data.Item1.EndWork();


            RatChat.Core.IChatListener iListener = data.Item1 as RatChat.Core.IChatListener;
            if (iListener == null)
            {
                foreach (FrameworkElement fe in Chats)
                {
                    RatChat.Core.IChatSource   i  = ((Tuple <RatChat.Core.IChatSource, string>)fe.Tag).Item1;
                    RatChat.Core.IChatListener il = i as RatChat.Core.IChatListener;
                    if (il != null)
                    {
                        data.Item1.OnNewMessagesArrived -= il.OnNewMessageReceived;
                    }
                    //i.OnNewMessagesArrived += iListener.OnNewMessageReceived;
                }
            }
            else
            {
                foreach (FrameworkElement fe in Chats)
                {
                    RatChat.Core.IChatSource i = ((Tuple <RatChat.Core.IChatSource, string>)fe.Tag).Item1;
                    i.OnNewMessagesArrived -= iListener.OnNewMessageReceived;
                }
            }

            Chats.Remove(vChat);

            ChatConfigStorage.RemoveWithPrefix(data.Item1.ConfigPrefix);
        }
        public void CreateChat(string ConfigPrefix, string SourceChatId)
        {
            if (!Sources.ContainsKey(SourceChatId))
            {
                return;
            }

            RatChat.Core.IChatSource ichat = Activator.CreateInstance(Sources[SourceChatId]) as RatChat.Core.IChatSource;
            ichat.ConfigPrefix = ConfigPrefix;
            ichat.OnLoad(ChatConfigStorage);
            ichat.OnNewMessagesArrived += ichat_OnNewMessagesArrived;


            if (ichat.SmilesUri != null)
            {
                foreach (var smile in ichat.SmilesUri)
                {
                    SmilesDataDase.AddSmileTuple(smile.Key, smile.Value);
                }
            }

            UserControl customView = ichat.CreateCustomView();

            if (customView == null)
            {
                RatChat.Controls.VisualChatCtrl vchat = new Controls.VisualChatCtrl();
                vchat.Manager = this;
                vchat.Tag     = new Tuple <RatChat.Core.IChatSource, string>(ichat, SourceChatId);
                Chats.Add(vchat);
                vchat.ConnectToChatSource(ichat);
            }
            else
            {
                RatChat.Controls.CustomControlContainer vchat = new Controls.CustomControlContainer();
                vchat.Manager = this;
                vchat.Tag     = new Tuple <RatChat.Core.IChatSource, string>(ichat, SourceChatId);
                Chats.Add(vchat);
                vchat.ConnectToChatSource(customView, ichat);
            }


            RatChat.Core.IChatListener iListener = ichat as RatChat.Core.IChatListener;
            if (iListener != null)
            {
                // При добавлении Listener, ищу ВСЕ Source и подписываюсь
                foreach (FrameworkElement fe in Chats)
                {
                    RatChat.Core.IChatSource i = ((Tuple <RatChat.Core.IChatSource, string>)fe.Tag).Item1;
                    i.OnNewMessagesArrived += iListener.OnNewMessageReceived;
                }
            }
            else
            {
                // При добавлении Source, ищу ВСЕ Listeners и подписываю
                foreach (FrameworkElement fe in Chats)
                {
                    RatChat.Core.IChatSource   i  = ((Tuple <RatChat.Core.IChatSource, string>)fe.Tag).Item1;
                    RatChat.Core.IChatListener il = i as RatChat.Core.IChatListener;
                    if (il != null)
                    {
                        ichat.OnNewMessagesArrived += il.OnNewMessageReceived;
                    }
                    //i.OnNewMessagesArrived += iListener.OnNewMessageReceived;
                }
            }
        }