Files
Chat/ChatController/ChatMainControl.xaml.cs

1089 lines
38 KiB
C#
Raw Normal View History

2017-09-12 14:32:34 +02:00
using System;
using System.Collections.Generic;
2017-09-14 12:36:48 +02:00
using System.Diagnostics;
using System.IO;
2017-09-12 14:32:34 +02:00
using System.Linq;
2017-09-14 12:36:48 +02:00
using System.Net;
using System.Text;
2017-09-12 14:32:34 +02:00
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
2019-04-04 13:00:10 +02:00
using System.Windows.Forms;
2017-09-12 14:32:34 +02:00
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Navigation;
using System.Windows.Threading;
2019-04-02 13:43:30 +02:00
2017-09-12 14:32:34 +02:00
using ChatController.ChatKlassen;
using ChatController.HauptKlassen;
2019-04-04 13:00:10 +02:00
using ChatController.LoginKlassen;
using ChatController.Utilities;
using ChatController.Utilities.Extensions;
2019-04-04 13:00:10 +02:00
using Button = System.Windows.Controls.Button;
using Cursors = System.Windows.Input.Cursors;
using DataFormats = System.Windows.DataFormats;
using KeyEventArgs = System.Windows.Input.KeyEventArgs;
using MenuItem = System.Windows.Controls.MenuItem;
using MessageBox = System.Windows.MessageBox;
using Orientation = System.Windows.Controls.Orientation;
using Panel = System.Windows.Controls.Panel;
2017-09-14 12:36:48 +02:00
using Path = System.IO.Path;
2019-04-04 13:00:10 +02:00
using ScrollBar = System.Windows.Controls.Primitives.ScrollBar;
using Timer = System.Windows.Forms.Timer;
2017-09-12 14:32:34 +02:00
namespace ChatController
{
2019-04-02 13:43:30 +02:00
public partial class ChatMainControl
2017-09-12 14:32:34 +02:00
{
private readonly Dictionary<long, NotifyIcon> _Group2NotifyIcons = new Dictionary<long, NotifyIcon>();
private readonly Dictionary<int, SyncFileInfoStruct> _GroupId2DateTime = new Dictionary<int, SyncFileInfoStruct>();
private Window _ContainingWindow;
public Window ContainingWindow
{
get => _ContainingWindow;
set
{
_ContainingWindow = value;
if(value != null)
{
_ContainingWindow.Deactivated += ContainingWindowOnDeactivated;
_ContainingWindow.Activated += ContainingWindowOnActivated;
}
}
}
2019-04-02 13:43:30 +02:00
private Chat _Chat;
private CurrentContact _CurrentContact;
2017-09-12 14:32:34 +02:00
2019-04-02 13:43:30 +02:00
private bool _IsChatBoxOnFocus;
2017-09-12 14:32:34 +02:00
2019-04-04 13:00:10 +02:00
private IOrderedEnumerable<Contact> _ContactList;
2017-11-09 12:20:03 +01:00
2019-04-02 13:43:30 +02:00
private bool _ScrollPrueferAktivieren;
2017-09-12 14:32:34 +02:00
public bool ShouldInterruptContactsThread = true;
2017-09-12 14:32:34 +02:00
2019-04-02 13:43:30 +02:00
private readonly List<string> _CreatedTempFiles = new List<string>();
2017-09-12 14:32:34 +02:00
private readonly Dictionary<string, Action<string>> _MenuItemName2Callback = new Dictionary<string, Action<string>>();
2017-10-18 10:09:20 +02:00
2019-04-02 13:43:30 +02:00
private bool _IsDesktopVersion = true;
2017-10-06 12:08:05 +02:00
private bool _IsInBackground;
2017-09-12 14:32:34 +02:00
public ChatMainControl()
{
2017-10-18 14:32:00 +02:00
InitializeComponent();
2017-12-11 14:32:56 +01:00
ReloadGruppen.Visibility = Visibility.Collapsed;
2017-09-12 14:32:34 +02:00
}
private void ContainingWindowOnDeactivated(object sender, EventArgs e)
{
_IsInBackground = true;
}
private void ContainingWindowOnActivated(object sender, EventArgs e)
{
_IsInBackground = false;
}
2017-09-12 14:32:34 +02:00
public void InitMitChatdaten(ChatDatenUebergabe cdu)
{
2019-04-02 13:43:30 +02:00
_Chat = new Chat(cdu);
_ContactList = _Chat.AddContacts();
2017-09-12 14:32:34 +02:00
2019-04-02 13:43:30 +02:00
Clientlist.ItemsSource = _ContactList;
ReadNewSyncFile();
foreach (var contact in _ContactList)
{
if (_GroupId2DateTime.ContainsKey(contact.GroupId))
{
var dateTimeFromFile = _GroupId2DateTime[contact.GroupId].TimeStamp;
var isUnread = _GroupId2DateTime[contact.GroupId].IsUnread;
var isYounger = contact.TimeStamp > dateTimeFromFile;
contact.IsNewMessage = isUnread;
contact.HasUnreadMessages = contact.IsNewMessage;
}
}
2019-04-02 13:43:30 +02:00
var view = (CollectionView) CollectionViewSource.GetDefaultView(Clientlist.ItemsSource);
view.Filter = UserFilter;
2017-09-12 14:32:34 +02:00
GlobalListeningThreadtimer?.Stop();
GlobalListeningThreadtimer = null;
InitGlobalListeningThread();
2017-11-07 11:56:29 +01:00
Clientlist.Items.Refresh();
2017-09-12 14:32:34 +02:00
}
public void ShowNotification(string pTitle, string pMessage, int pGroupId)
2017-09-12 14:32:34 +02:00
{
if (!_Group2NotifyIcons.ContainsKey(pGroupId))
{
var notificationIcon = Resource.ownchat_favicon;
var contact = _ContactList.FirstOrDefault(a => a.GroupId == pGroupId);
if(contact != null)
{
notificationIcon = Utils.ImageSourceToIcon(contact.Image);
}
var notifyIcon = new NotifyIcon { Icon = notificationIcon, Visible = true };
notifyIcon.BalloonTipClicked += (sender, args) =>
{
DisposeAndRemoveNotification((NotifyIcon)sender, pGroupId);
if (_ContainingWindow.WindowState == WindowState.Minimized)
{
_ContainingWindow.WindowState = WindowState.Normal;
}
_ContainingWindow.Activate();
SelectContact(_ContactList.FirstOrDefault(f => f.GroupId.Equals(pGroupId)));
};
notifyIcon.BalloonTipClosed += (sender, args) =>
{
DisposeAndRemoveNotification((NotifyIcon)sender, pGroupId);
};
_Group2NotifyIcons.Add(pGroupId, notifyIcon);
}
2017-09-12 14:32:34 +02:00
_Group2NotifyIcons[pGroupId].ShowBalloonTip(Constants.NotificationTimeout, pTitle, pMessage, ToolTipIcon.None);
2017-09-12 14:32:34 +02:00
}
public void ClearNotifications()
2017-09-12 14:32:34 +02:00
{
foreach(var group2NotifyIcon in _Group2NotifyIcons)
2017-09-12 14:32:34 +02:00
{
group2NotifyIcon.Value.Dispose();
2017-09-12 14:32:34 +02:00
}
_Group2NotifyIcons.Clear();
}
private void DisposeAndRemoveNotification(IDisposable pNotification, long pGroupId)
{
pNotification.Dispose();
_Group2NotifyIcons.Remove(pGroupId);
2017-09-12 14:32:34 +02:00
}
2019-04-02 13:43:30 +02:00
public void ResetStyle()
2017-10-06 12:08:05 +02:00
{
EmojiButton.Style = null;
MediaButton.Style = null;
ReloadGruppen.Visibility = Visibility.Visible;
2019-04-02 13:43:30 +02:00
_IsDesktopVersion = false;
2017-10-06 12:08:05 +02:00
}
2017-11-16 15:38:30 +01:00
2017-09-12 14:32:34 +02:00
private void AktChatUser_OnMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
_Chat.ShowProfilePicture(_CurrentContact);
2017-09-12 14:32:34 +02:00
}
private void Clientlist_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
if(Clientlist.SelectedItem != null)
{
SelectContact((Contact) Clientlist.SelectedItem);
}
}
2017-09-12 14:32:34 +02:00
private void SelectContact(Contact pContact)
{
if(pContact == null)
{
return;
}
ShouldInterruptContactsThread = true;
2017-09-12 14:32:34 +02:00
Cursor = Cursors.Wait;
_ScrollPrueferAktivieren = false;
2017-09-12 14:32:34 +02:00
AktChatUserList.Items.Clear();
2017-09-12 14:32:34 +02:00
if (pContact.HasUnreadMessages)
{
pContact.HasUnreadMessages = false;
2017-09-12 14:32:34 +02:00
Clientlist.Items.Refresh();
}
2017-09-12 14:32:34 +02:00
var currentContact = new CurrentContact(pContact);
pContact.IsNewMessage = false;
2017-09-12 14:32:34 +02:00
var shouldChangeIcon = _ContactList.Any(contact => contact.IsNewMessage);
if(shouldChangeIcon)
{
ContainingWindow.Icon = Utils.GetImageSourceFromIcon(Resource.ownchat_favicon);
}
2017-09-12 14:32:34 +02:00
AktChatUserList.Items.Add(currentContact);
_CurrentContact = currentContact;
if(Clientlist.Items.Contains(pContact))
{
Clientlist.SelectedItem = pContact;
}
var chatMessages = _Chat.LoadChatMessagesForContact(currentContact);
ChatListBox.ItemsSource = chatMessages;
2017-12-18 18:22:13 +01:00
if (VisualTreeHelper.GetChildrenCount(ChatListBox) > 0)
{
var border = (Border) VisualTreeHelper.GetChild(ChatListBox, 0);
var scrollViewer = (ScrollViewer) VisualTreeHelper.GetChild(border, 0);
scrollViewer.ScrollToBottom();
}
2017-12-18 18:22:13 +01:00
ChatListBox.ContextMenu = _Chat.ErstelleKontextMenue();
SetContextHandler();
_ScrollPrueferAktivieren = true;
2017-11-10 11:41:09 +01:00
ListenForMessages();
Cursor = Cursors.Arrow;
2017-12-18 18:22:13 +01:00
WriteToNewSyncFile();
ShouldInterruptContactsThread = false;
2017-09-12 14:32:34 +02:00
}
private void SetContextHandler()
{
var contextItems = ChatListBox?.ContextMenu?.Items;
2019-04-02 13:43:30 +02:00
foreach (var menuItemText in _MenuItemName2Callback.Keys)
2017-09-12 14:32:34 +02:00
{
2019-04-02 13:43:30 +02:00
var cb = _MenuItemName2Callback[menuItemText];
2017-09-12 14:32:34 +02:00
var menuItem = new MenuItem();
2017-09-12 14:32:34 +02:00
menuItem.Click += (s, e2) =>
2017-09-12 14:32:34 +02:00
{
cb(menuItemText);
};
menuItem.Header = menuItemText;
2017-09-12 14:32:34 +02:00
contextItems.Add(menuItem);
2017-09-12 14:32:34 +02:00
}
var item2 = (MenuItem)contextItems[0];
item2.Click += Item2OnClick; // umbenenen in Speichern unter
2017-09-12 14:32:34 +02:00
var item3 = (MenuItem)contextItems[1];
item3.Click += Item3OnClick; //Umbenenen in Einfügen
// neu und vor Einfügen setzen und anpassen
var item4 = (MenuItem) contextItems[2];
item4.Click += Item4OnClick; //Umbenenen in Kopieren
2017-09-12 14:32:34 +02:00
}
2017-09-14 12:36:48 +02:00
private void Item2OnClick(object sender, RoutedEventArgs routedEventArgs)
2017-09-12 14:32:34 +02:00
{
2017-12-11 14:32:56 +01:00
foreach (var items in ChatListBox.SelectedItems)
2017-09-14 12:36:48 +02:00
{
2017-12-11 14:32:56 +01:00
var item = (ChatMessage)items;
2017-09-12 14:32:34 +02:00
_Chat.SaveFileAs(item);
2017-09-14 12:36:48 +02:00
}
}
2017-09-12 14:32:34 +02:00
2017-09-14 12:36:48 +02:00
private void Item3OnClick(object sender, RoutedEventArgs routedEventArgs)
{
var kontakt = (CurrentContact)AktChatUserList.Items[0];
_Chat.Paste(kontakt.GroupId,this);
}
private void Item4OnClick(object sender, RoutedEventArgs routedEventArgs)
{
string chatmessages = "";
2017-12-11 14:32:56 +01:00
foreach (var items in ChatListBox.SelectedItems)
{
2017-12-11 14:32:56 +01:00
var item = (ChatMessage)items;
chatmessages += item.UserMessage + "\n";
}
if(!chatmessages.Equals(""))
_Chat.Copy(chatmessages, 1);
2017-09-14 12:36:48 +02:00
}
2017-09-14 12:36:48 +02:00
private void Chat_OnContextMenuOpening(object sender, ContextMenuEventArgs e)
{
2017-12-11 14:32:56 +01:00
var chatItems = ChatListBox.SelectedItems;
2017-09-14 12:36:48 +02:00
if (chatItems.Count > 0)
{
foreach (var items in chatItems)
{
2017-12-11 14:32:56 +01:00
var item = items as ChatMessage;
2017-09-14 12:36:48 +02:00
if (item != null && item.ImageSources != null)
{
2017-12-11 14:32:56 +01:00
var contextItems = ChatListBox.ContextMenu.Items;
2017-09-14 12:36:48 +02:00
var ContextItemSpeichernUnter = (MenuItem)contextItems[0];
ContextItemSpeichernUnter.Visibility = Visibility.Visible;
}
else
{
2017-12-11 14:32:56 +01:00
var contextItems = ChatListBox.ContextMenu.Items;
2017-09-14 12:36:48 +02:00
var ContextItemSpeichernUnter = (MenuItem)contextItems[0];
ContextItemSpeichernUnter.Visibility = Visibility.Collapsed;
}
if (item.ImageSources == null && item.FilePath == null)
{
2017-12-11 14:32:56 +01:00
var contextItems = ChatListBox.ContextMenu.Items;
var ContextItemSpeichernUnter = (MenuItem) contextItems[2];
ContextItemSpeichernUnter.Visibility = Visibility.Visible;
}
else
{
2017-12-11 14:32:56 +01:00
var contextItems = ChatListBox.ContextMenu.Items;
var ContextItemSpeichernUnter = (MenuItem)contextItems[2];
ContextItemSpeichernUnter.Visibility = Visibility.Collapsed;
}
2017-09-14 12:36:48 +02:00
}
}
else
{
//Schalte speichern unter Aus
2017-12-11 14:32:56 +01:00
var contextItems = ChatListBox.ContextMenu.Items;
2017-09-14 12:36:48 +02:00
var ContextItemSpeichernUnter = (MenuItem)contextItems[0];
ContextItemSpeichernUnter.Visibility = Visibility.Collapsed;
}
2017-09-12 14:32:34 +02:00
2017-09-14 12:36:48 +02:00
//prüfe ob was in dem Speicher vorhanden ist //Einfügen
var d = System.Windows.Forms.Clipboard.GetDataObject();
if (d.GetDataPresent(DataFormats.FileDrop))
2017-09-14 12:36:48 +02:00
{
2017-12-11 14:32:56 +01:00
var contextItems = ChatListBox.ContextMenu.Items;
2017-09-14 12:36:48 +02:00
var ContextItemSpeichernUnter = (MenuItem)contextItems[1];
ContextItemSpeichernUnter.Visibility = Visibility.Visible;
}
else if (d.GetDataPresent(DataFormats.Text))
{
2017-12-11 14:32:56 +01:00
var contextItems = ChatListBox.ContextMenu.Items;
2017-09-14 12:36:48 +02:00
var ContextItemSpeichernUnter = (MenuItem)contextItems[1];
ContextItemSpeichernUnter.Visibility = Visibility.Visible;
}
else if (d.GetDataPresent(DataFormats.Bitmap))
{
2017-12-11 14:32:56 +01:00
var contextItems = ChatListBox.ContextMenu.Items;
2017-09-14 12:36:48 +02:00
var ContextItemSpeichernUnter = (MenuItem)contextItems[1];
ContextItemSpeichernUnter.Visibility = Visibility.Visible;
}
else
{
2017-12-11 14:32:56 +01:00
var contextItems = ChatListBox.ContextMenu.Items;
2017-09-14 12:36:48 +02:00
var ContextItemSpeichernUnter = (MenuItem)contextItems[1];
ContextItemSpeichernUnter.Visibility = Visibility.Collapsed;
}
2017-09-12 14:32:34 +02:00
//prüfe ob dokumentation erlaubt
var kontakt = (CurrentContact)AktChatUserList.Items[0];
if (kontakt.UserIdManage == null && ChatListBox.ContextMenu.Items.Count > 3)
2017-09-12 14:32:34 +02:00
{
2017-12-11 14:32:56 +01:00
var contextItems = ChatListBox.ContextMenu.Items;
var ContextItemSpeichernUnter = (MenuItem)contextItems[3];
2017-09-14 12:36:48 +02:00
ContextItemSpeichernUnter.Visibility = Visibility.Collapsed;
}
2017-12-11 14:32:56 +01:00
else if (ChatListBox.ContextMenu.Items.Count > 3)
{
2017-12-11 14:32:56 +01:00
var contextItems = ChatListBox.ContextMenu.Items;
var ContextItemSpeichernUnter = (MenuItem)contextItems[3];
ContextItemSpeichernUnter.Visibility = Visibility.Visible;
}
2017-09-12 14:32:34 +02:00
2017-12-11 14:32:56 +01:00
if (ChatListBox.ContextMenu.Items.Count == 0)
2017-09-14 12:36:48 +02:00
{
2017-12-11 14:32:56 +01:00
ChatListBox.ContextMenu.Visibility = Visibility.Collapsed;
2017-09-12 14:32:34 +02:00
}
2017-09-14 12:36:48 +02:00
2017-09-12 14:32:34 +02:00
}
private void MediaButton_OnClick(object sender, RoutedEventArgs e)
{
2017-12-11 14:32:56 +01:00
if (AktChatUserList.Items.Count > 0)
2017-09-14 12:36:48 +02:00
{
var kontakt = (CurrentContact)AktChatUserList.Items[0];
2017-10-20 14:41:03 +02:00
var medium = _Chat.OpenFile();
2017-09-12 14:32:34 +02:00
2017-10-20 14:41:03 +02:00
if(medium != null) {
2017-09-12 14:32:34 +02:00
2019-04-02 13:43:30 +02:00
string convertetMedia = _Chat.ScaleImage(medium, Path.GetExtension(medium.ToUpperInvariant()));
if (!convertetMedia.Equals(""))
{
_Chat.AddNewFile(convertetMedia,medium,kontakt.GroupId);
2017-12-11 14:32:56 +01:00
CollectionViewSource.GetDefaultView(ChatListBox.ItemsSource).Refresh();
ChatListBox.Items.MoveCurrentToLast();
ChatListBox.ScrollIntoView(ChatListBox.Items.CurrentItem);
_Chat.SendFileToContact(kontakt, convertetMedia,medium);
2017-12-11 14:32:56 +01:00
if (!convertetMedia.Equals("") && !convertetMedia.Equals(medium) && File.Exists(convertetMedia))
{
File.Delete(convertetMedia);
}
}
else
{
2017-12-11 14:32:56 +01:00
MessageBox.Show("Die gewählte Datei ist zu groß!", "Fehler", MessageBoxButton.OK, MessageBoxImage.Exclamation);
}
2017-10-20 14:41:03 +02:00
}
2017-09-14 12:36:48 +02:00
}
else
{
2017-12-11 14:32:56 +01:00
MessageBox.Show("Bitte wählen Sie einen Kontakt aus.","ownChat",MessageBoxButton.OK, MessageBoxImage.Information);
2017-09-14 12:36:48 +02:00
}
2017-09-12 14:32:34 +02:00
}
private void SendButton_OnClick(object sender, RoutedEventArgs e)
{
2019-04-02 13:43:30 +02:00
if (!AktChatUserList.Items.IsEmpty && !Chatbox.Text.Equals("") && _IsChatBoxOnFocus)
2017-09-12 14:32:34 +02:00
{
if (!Chatbox.Text.Equals(""))
{
var kontakt = (CurrentContact)AktChatUserList.Items[0];
2017-10-20 14:41:03 +02:00
_Chat.AddNewMessage(Chatbox.Text, kontakt.GroupId);
2017-10-20 14:41:03 +02:00
2017-12-11 14:32:56 +01:00
CollectionViewSource.GetDefaultView(ChatListBox.ItemsSource).Refresh();
ChatListBox.Items.MoveCurrentToLast();
ChatListBox.ScrollIntoView(ChatListBox.Items.CurrentItem);
2017-10-20 14:41:03 +02:00
2019-04-02 13:43:30 +02:00
_Chat.SendMessage(Chatbox.Text, kontakt.GroupId);
2017-10-24 11:39:59 +02:00
2017-10-20 14:41:03 +02:00
Chatbox.Text = "";
2017-09-12 14:32:34 +02:00
if (Chatbox.Text.Equals(""))
{
Chatbox.Text = "Nachricht schreiben";
Chatbox.Foreground = new SolidColorBrush(Colors.DarkGray);
2019-04-02 13:43:30 +02:00
_IsChatBoxOnFocus = false;
2017-09-12 14:32:34 +02:00
}
}
}
else
{
2017-12-11 14:32:56 +01:00
if (AktChatUserList.Items.IsEmpty)
2017-09-12 14:32:34 +02:00
{
MessageBox.Show("Bitte wählen Sie einen Chatpartner aus.", "Fehler", MessageBoxButton.OK);
if (string.IsNullOrEmpty(Chatbox.Text))
2017-09-12 14:32:34 +02:00
{
Chatbox.Text = "Nachricht schreiben";
Chatbox.Foreground = new SolidColorBrush(Colors.DarkGray);
2019-04-02 13:43:30 +02:00
_IsChatBoxOnFocus = false;
2017-09-12 14:32:34 +02:00
}
}
else if (string.IsNullOrEmpty(Chatbox.Text))
2017-09-12 14:32:34 +02:00
{
MessageBox.Show("Sie können keine leere Nachricht verschicken.", "Fehler", MessageBoxButton.OK);
Chatbox.Text = "Nachricht schreiben";
Chatbox.Foreground = new SolidColorBrush(Colors.DarkGray);
_IsChatBoxOnFocus = false;
2017-09-12 14:32:34 +02:00
}
}
}
private void Chatbox_OnGotFocus(object sender, RoutedEventArgs e)
{
if (Chatbox.Text.Equals("Nachricht schreiben"))
{
Chatbox.Text = "";
Chatbox.Foreground = new SolidColorBrush(Colors.Black);
2019-04-02 13:43:30 +02:00
_IsChatBoxOnFocus = true;
2017-09-12 14:32:34 +02:00
}
}
private void Chatbox_OnKeyDownHandler(object sender, KeyEventArgs e)
{
try
{
if (e.Key == Key.Return)
{
2017-12-11 14:32:56 +01:00
if (!AktChatUserList.Items.IsEmpty && !Chatbox.Text.Equals(""))
2017-09-12 14:32:34 +02:00
{
var kontakt = (CurrentContact)AktChatUserList.Items[0];
2017-10-20 14:41:03 +02:00
_Chat.AddNewMessage(Chatbox.Text, kontakt.GroupId);
2017-09-12 14:32:34 +02:00
2017-12-11 14:32:56 +01:00
CollectionViewSource.GetDefaultView(ChatListBox.ItemsSource).Refresh();
ChatListBox.Items.MoveCurrentToLast();
ChatListBox.ScrollIntoView(ChatListBox.Items.CurrentItem);
2017-10-20 14:41:03 +02:00
2019-04-02 13:43:30 +02:00
_Chat.SendMessage(Chatbox.Text, kontakt.GroupId);
2017-10-24 11:39:59 +02:00
2017-11-09 12:20:03 +01:00
2017-09-12 14:32:34 +02:00
Chatbox.Text = "";
2017-10-20 14:41:03 +02:00
2017-09-12 14:32:34 +02:00
}
else
{
2017-12-11 14:32:56 +01:00
if (AktChatUserList.Items.IsEmpty)
2017-09-12 14:32:34 +02:00
{
MessageBox.Show("Bitte wählen Sie einen Chatpartner aus.", "Fehler", MessageBoxButton.OK);
}
else if (Chatbox.Text.Equals(""))
{
MessageBox.Show("Sie können keine lehre Nachricht verschicken.", "Fehler", MessageBoxButton.OK);
}
}
}
}
catch (Exception ed)
{
MessageBox.Show("Beim Senden einer Nachricht ist ein Fehler aufgetreten. " + ed.Message + "\n" + ed.StackTrace, "Fehler", MessageBoxButton.OK);
}
}
2017-10-24 11:39:59 +02:00
public delegate void EmojiiDelegate(Button button);
2017-09-12 14:32:34 +02:00
public event EmojiiDelegate OnEmojii;
private void EmojiButton_OnClick(object sender, RoutedEventArgs e)
{
//hier wie bei login
if (OnEmojii != null)
{
OnEmojii(EmojiButton);
}
}
2017-09-12 14:32:34 +02:00
private void Chat_OnScrollChanged(object sender, ScrollChangedEventArgs e)
{
var scrollBarList = GetVisualChildCollection<ScrollBar>(ChatListBox);
foreach (var scrollBar in scrollBarList)
2017-09-12 14:32:34 +02:00
{
if (scrollBar.Orientation == Orientation.Horizontal)
{
2019-04-02 13:43:30 +02:00
_ScrollPrueferAktivieren = true;
2017-09-12 14:32:34 +02:00
}
else
{
scrollBar.ValueChanged += VerticalScrollbarChanged;
}
}
}
private void VerticalScrollbarChanged(object sender, RoutedPropertyChangedEventArgs<double> routedPropertyChangedEventArgs)
{
2019-04-02 13:43:30 +02:00
if (_ScrollPrueferAktivieren == true)
2017-09-12 14:32:34 +02:00
{
var x = (ScrollBar) sender;
if (x.Value > 0)
{
//nix
}
else
{
Cursor = Cursors.Wait;
//StartWaiting();
2019-04-02 13:43:30 +02:00
_ScrollPrueferAktivieren = false;
2017-12-11 14:32:56 +01:00
ChatListBox.Items.MoveCurrentToFirst();
ChatMessage item = ChatListBox.Items.CurrentItem as ChatMessage;
ChatListBox.ItemsSource = null;
2017-09-12 14:32:34 +02:00
2019-04-04 13:00:10 +02:00
var kontakt = (Contact)Clientlist.SelectedItem;
2017-09-12 14:32:34 +02:00
var xy = _Chat.LoadMoreMessages(kontakt);
2017-09-12 14:32:34 +02:00
2017-12-11 14:32:56 +01:00
ChatListBox.ItemsSource = xy;
ChatListBox.ScrollIntoView(item);
//EndWaiting();
Cursor = Cursors.Arrow;
2017-09-12 14:32:34 +02:00
}
}
}
private static List<T> GetVisualChildCollection<T>(object parent) where T : Visual
{
var visualCollection = new List<T>();
2017-09-12 14:32:34 +02:00
GetVisualChildCollection(parent as DependencyObject, visualCollection);
2017-09-12 14:32:34 +02:00
return visualCollection;
}
private static void GetVisualChildCollection<T>(DependencyObject parent, ICollection<T> visualCollection) where T : Visual
2017-09-12 14:32:34 +02:00
{
var count = VisualTreeHelper.GetChildrenCount(parent);
for (var i = 0; i < count; i++)
2017-09-12 14:32:34 +02:00
{
var child = VisualTreeHelper.GetChild(parent, i);
if (child is T item)
2017-09-12 14:32:34 +02:00
{
visualCollection.Add(item);
2017-09-12 14:32:34 +02:00
}
else
2017-09-12 14:32:34 +02:00
{
GetVisualChildCollection(child, visualCollection);
}
}
}
private void ListenForMessages()
{
_ListeningThreadTimer?.Stop();
_ListeningThreadTimer = null;
InitListeningThread((CurrentContact)AktChatUserList.Items[0]);
}
2017-09-12 14:32:34 +02:00
public Timer _ListeningThreadTimer;
public Timer GlobalListeningThreadtimer { get; set; }
2017-09-12 14:32:34 +02:00
private void InitGlobalListeningThread()
2017-09-12 14:32:34 +02:00
{
GlobalListeningThreadtimer = new Timer();
GlobalListeningThreadtimer.Tick += GlobalListeningThreadTimerTickEvent;
GlobalListeningThreadtimer.Interval = 2000;
GlobalListeningThreadtimer.Start();
}
2017-09-12 14:32:34 +02:00
private void GlobalListeningThreadTimerTickEvent(object sender, EventArgs e)
{
ListenGloballyForMessages();
2017-09-12 14:32:34 +02:00
}
private void ListenGloballyForMessages()
2017-09-12 14:32:34 +02:00
{
var numberOfNewMessages = _Chat.GetNumberOfAllNewMessages();
2017-12-18 18:22:13 +01:00
if (numberOfNewMessages > 0)
{
Dispatcher.BeginInvoke(
DispatcherPriority.Normal,
(Action)delegate
2017-09-12 14:32:34 +02:00
{
var contacts = _Chat.NeueGroupklassenKontakte().ToList();
CurrentContact currentContact = null;
2017-12-11 14:32:56 +01:00
if (AktChatUserList.HasItems)
2017-09-12 14:32:34 +02:00
{
currentContact = (CurrentContact)AktChatUserList.Items[0];
}
foreach (var contact in _ContactList)
{
foreach (var newContact in contacts)
{
if (contact.GroupId == newContact.GroupId)
2017-12-11 14:32:56 +01:00
{
if (!contact.ReceivedMessage.Equals(newContact.ReceivedMessage))
{
contact.ReceivedMessage = newContact.ReceivedMessage;
contact.TimeStamp = newContact.TimeStamp;
2017-12-11 14:32:56 +01:00
// TODO: Prüfen, ob die App im Hintergrund oder minimiert ist
if ((Clientlist.SelectedItem != null && !((Contact)Clientlist.SelectedItem).GroupId.Equals(newContact.GroupId) || Clientlist.SelectedItem == null) || _IsInBackground)
{
ContainingWindow.Icon = Utils.GetImageSourceFromIcon(Resource.oC_favico_NewMessage);
ShowNotification(newContact.Name, "Sie haben eine neue Nachricht", newContact.GroupId);
}
2017-12-11 14:32:56 +01:00
// Wenn der momentan ausgewählte Kontakt der aktuelle Kontakt in der Schleife ist, werden die Nachrichten nicht als ungelesen angezeigt, sonst schon.
if (currentContact != null && newContact.GroupId == currentContact.GroupId)
{
contact.HasUnreadMessages = false;
}
else
{
contact.HasUnreadMessages = true;
contact.IsNewMessage = true;
}
}
}
if (!_ContactList.Contains(newContact))
{
_ContactList.ToList().Add(newContact);
}
}
if (!contacts.Contains(contact))
{
_ContactList.ToList().Remove(contact);
}
2017-12-11 14:32:56 +01:00
}
Clientlist.Items.Refresh();
});
2017-09-12 14:32:34 +02:00
}
}
private void InitListeningThread(CurrentContact pCurrentContacObject)
2017-09-12 14:32:34 +02:00
{
_ListeningThreadTimer = new Timer {Tag = pCurrentContacObject};
_ListeningThreadTimer.Tick += ListeningThreadTimerTickEvent;
_ListeningThreadTimer.Interval = 2000;
_ListeningThreadTimer.Start();
2017-09-12 14:32:34 +02:00
}
private void ListeningThreadTimerTickEvent(object sender, EventArgs e)
{
ListenForMessagesForCurrentContact((CurrentContact) ((Timer) sender).Tag);
}
2017-09-12 14:32:34 +02:00
private void ListenForMessagesForCurrentContact(CurrentContact pCurrentContact)
{
if (!ShouldInterruptContactsThread)
{
var hasNewMessages = _Chat.CheckIfNewMessagesExist(pCurrentContact);
2017-09-12 14:32:34 +02:00
if (hasNewMessages)
{
Dispatcher.BeginInvoke(DispatcherPriority.Background,
(Action)delegate
2017-09-12 14:32:34 +02:00
{
_Chat.LoadChatMessagesForContact(pCurrentContact);
2017-10-24 11:39:59 +02:00
CollectionViewSource.GetDefaultView(ChatListBox.ItemsSource).Refresh();
2017-09-12 14:32:34 +02:00
ChatListBox.Items.MoveCurrentToLast();
ChatListBox.ScrollIntoView(ChatListBox.Items.CurrentItem);
});
2017-09-12 14:32:34 +02:00
}
}
}
private void Suche_OnTextChanged(object sender, TextChangedEventArgs e)
{
CollectionViewSource.GetDefaultView(Clientlist.ItemsSource).Refresh();
}
private bool UserFilter(object item)
{
if (String.IsNullOrEmpty(Suche.Text))
return true;
else
2019-04-04 13:00:10 +02:00
return ((item as Contact).Name.IndexOf(Suche.Text, StringComparison.OrdinalIgnoreCase) >= 0);
2017-09-12 14:32:34 +02:00
}
2017-09-14 12:36:48 +02:00
private void Chat_OnMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
2017-10-20 07:34:26 +02:00
Cursor = Cursors.Wait;
2017-12-18 18:22:13 +01:00
2017-12-11 14:32:56 +01:00
var chatItems = ChatListBox.SelectedItems;
2017-09-14 12:36:48 +02:00
2017-10-20 07:34:26 +02:00
if (chatItems.Count > 0)
{
2017-09-14 12:36:48 +02:00
foreach (var items in chatItems)
{
2017-12-11 14:32:56 +01:00
var item = items as ChatMessage;
2017-09-14 12:36:48 +02:00
if (item != null && item.ImageSources != null)
2017-11-06 07:16:43 +01:00
{
2017-12-18 18:22:13 +01:00
StartWaiting();
2019-04-02 13:43:30 +02:00
_Chat.ShowPicture(item, EndWaiting);
2017-09-14 12:36:48 +02:00
}
else if(item != null && item.FilePath != null)
2017-11-06 07:16:43 +01:00
{
var filename = Path.GetFileName(item.FilePath.ToString());
LoadDocument(item.FilePath.ToString(), filename);
2017-11-06 07:16:43 +01:00
}
2017-09-14 12:36:48 +02:00
}
2017-11-06 07:16:43 +01:00
Cursor = Cursors.Arrow;
2017-09-14 12:36:48 +02:00
}
2017-10-20 07:34:26 +02:00
else
{
Cursor = Cursors.Arrow;
2017-11-06 07:16:43 +01:00
}
2017-09-14 12:36:48 +02:00
}
private void LoadDocument(string link, string filename)
2017-12-18 18:22:13 +01:00
{
try
2017-09-14 12:36:48 +02:00
{
2017-12-18 18:22:13 +01:00
StartWaiting();
var path = Path.Combine(Path.GetTempPath(), filename);
2019-04-02 13:43:30 +02:00
_CreatedTempFiles.Add(path);
2017-12-18 18:22:13 +01:00
if (!File.Exists(path))
2017-09-14 12:36:48 +02:00
{
using (var webClient = new WebClient())
2017-12-18 18:22:13 +01:00
{
webClient.DownloadFile(link, path);
}
2017-09-14 12:36:48 +02:00
2017-12-18 18:22:13 +01:00
if (File.Exists(path))
{
Process.Start(path);
}
}
else
2017-09-14 12:36:48 +02:00
{
Process.Start(path);
}
}
2017-12-18 18:22:13 +01:00
catch (Exception e)
2017-09-14 12:36:48 +02:00
{
2017-12-18 18:22:13 +01:00
}
finally
{
EndWaiting();
}
2017-09-14 12:36:48 +02:00
}
private ChatControlWaitLayer _waitLayer;
public void StartWaiting()
{
Dispatcher.BeginInvoke(DispatcherPriority.Background, (Action)StartWaitingImmediately);
}
public void StartWaitingImmediately()
{
if (_waitLayer == null)
{
_waitLayer = new ChatControlWaitLayer();
//Grid.SetColumnSpan(_waitLayer, 3);
Grid.SetRowSpan(_waitLayer, 3);
GridRechts.Children.Add(_waitLayer);
Panel.SetZIndex(_waitLayer, int.MaxValue);
_waitLayer.RefreshChatUI();
}
}
public void EndWaiting()
{
Dispatcher.BeginInvoke(
DispatcherPriority.Background,
(Action)delegate
{
if (_waitLayer != null)
{
GridRechts.Children.Remove(_waitLayer);
_waitLayer = null;
}
});
}
private void Hyperlink_OnRequestNavigate(object sender, RequestNavigateEventArgs e)
{
Process.Start(e.Uri.ToString());
}
2017-10-06 12:08:05 +02:00
private void ButtonReloadGruppen_OnClick(object sender, RoutedEventArgs e)
2017-10-24 11:39:59 +02:00
{
2017-10-06 12:08:05 +02:00
DoSynchro();
}
private void DoSynchro()
{
try
{
Cursor = Cursors.Wait;
WriteToNewSyncFile();
2017-10-24 11:39:59 +02:00
var aktuelleGruppen = _Chat.UpdateGroups();
2017-10-18 10:09:20 +02:00
_ContactList = _Chat.GroupklassenAktuallisieren(aktuelleGruppen);
2017-10-18 10:09:20 +02:00
ReadNewSyncFile();
2017-10-24 11:39:59 +02:00
Clientlist.Items.Refresh();
2017-10-20 07:34:26 +02:00
Cursor = Cursors.Arrow;
2017-10-06 12:08:05 +02:00
}
catch (Exception e)
{
MessageBox.Show("Ein Fehler bei der Synchronisation ist aufgetreten.\nFehler:\n" + e.Message, "Fehler", MessageBoxButton.OK);
}
}
2017-12-11 14:32:56 +01:00
// Speichert die TimeStamps der zuletzt empfangenen Nachrichten
public void WriteToNewSyncFile()
2017-10-18 14:32:00 +02:00
{
try
2017-10-18 14:32:00 +02:00
{
if (File.Exists(Path.Combine(Utils.GetAndCreateUserAppDataPath(), Resource.SyncFile2Name)))
{
File.SetAttributes(Path.Combine(Utils.GetAndCreateUserAppDataPath(), Resource.SyncFile2Name), FileAttributes.Normal);
File.Delete(Path.Combine(Utils.GetAndCreateUserAppDataPath(), Resource.SyncFile2Name));
}
using (var streamWriter = new StreamWriter(Path.Combine(Utils.GetAndCreateUserAppDataPath(), Resource.SyncFile2Name)))
{
Encoding enc = new UTF8Encoding();
foreach (var contact in _ContactList.ToList().Where(contact => contact.ReceivedMessage != null))
{
var text = contact.GroupId + ";" + contact.TimeStamp.ToUniversalTime() + ";" + contact.IsNewMessage + ";";
var bytes = enc.GetBytes(text);
var base64String = Convert.ToBase64String(bytes);
streamWriter.WriteLine(base64String);
}
File.SetAttributes(Path.Combine(Utils.GetAndCreateUserAppDataPath(), Resource.SyncFile2Name), FileAttributes.ReadOnly);
2017-10-18 14:32:00 +02:00
}
}
catch (Exception exception)
{
2017-10-18 14:32:00 +02:00
}
2017-10-18 14:32:00 +02:00
}
public void ReadNewSyncFile()
2017-10-18 14:32:00 +02:00
{
try
2017-10-18 14:32:00 +02:00
{
if(File.Exists(Path.Combine(Utils.GetAndCreateUserAppDataPath(), Resource.SyncFile2Name)))
{
using (var streamReader = new StreamReader(Path.Combine(Utils.GetAndCreateUserAppDataPath(), Resource.SyncFile2Name), true))
{
string line;
2017-10-18 14:32:00 +02:00
_GroupId2DateTime.Clear();
2017-10-18 14:32:00 +02:00
while ((line = streamReader.ReadLine()) != null)
{
var encodedTextBytes = Convert.FromBase64String(line);
var plainText = Encoding.UTF8.GetString(encodedTextBytes);
var splitPlainText = plainText.Split(';');
// Ist kein Datum vorhanden -> 01.01.0001 00:00:00
var groupId = int.Parse(splitPlainText[0]);
var dateTime = DateTime.Parse(splitPlainText[1]);
var isUnread = splitPlainText.Length <= 2 || string.IsNullOrEmpty(splitPlainText[2]) || bool.Parse(splitPlainText[2]);
_GroupId2DateTime.Add(groupId, new SyncFileInfoStruct(isUnread, dateTime));
}
}
var latestDateTime = Utils.DefaultDate;
foreach(var id2dateTime in _GroupId2DateTime)
2017-10-18 14:32:00 +02:00
{
if(id2dateTime.Value.TimeStamp > latestDateTime)
2017-10-18 14:32:00 +02:00
{
latestDateTime = id2dateTime.Value.TimeStamp;
2017-10-18 14:32:00 +02:00
}
}
_Chat.LastTimeStamp = latestDateTime.GetUnixTimeStamp();
2017-10-18 14:32:00 +02:00
}
}
catch (Exception e)
{
}
2017-11-09 12:20:03 +01:00
}
public List<Contact> GetContactsWithoutUnreadMessages()
2017-11-09 12:20:03 +01:00
{
var contacts = new List<Contact>();
2017-11-07 11:56:29 +01:00
2017-11-09 12:20:03 +01:00
Clientlist.Items.Refresh();
2017-11-07 11:56:29 +01:00
foreach(var contactItem in Clientlist.Items)
2017-11-09 12:20:03 +01:00
{
if(contactItem is Contact contact && contact.HasUnreadMessages && !string.IsNullOrEmpty(contact.ReceivedMessage))
2017-11-09 12:20:03 +01:00
{
contacts.Add(contact);
2017-11-09 12:20:03 +01:00
}
}
return contacts;
2017-10-18 14:32:00 +02:00
}
2017-11-09 12:20:03 +01:00
public void ResetNumberOfUnreadMessages(Dictionary<long, DateTime> pGroupId2DateTime)
2017-11-09 12:20:03 +01:00
{
if(pGroupId2DateTime != null)
2017-11-09 12:20:03 +01:00
{
foreach(var contact in _ContactList)
2017-11-09 12:20:03 +01:00
{
foreach(var groupId2DateTime in pGroupId2DateTime)
2017-11-09 12:20:03 +01:00
{
if(contact.GroupId == groupId2DateTime.Key)
2017-11-09 12:20:03 +01:00
{
contact.HasUnreadMessages = false;
2017-11-09 12:20:03 +01:00
}
}
}
}
}
public List<ChatMessage> GetSelectedMessages()
{
var messages = (from object selectedItem in ChatListBox.SelectedItems select selectedItem as ChatMessage).ToList();
return messages.Count > 0 ? messages : null;
}
public CurrentContact GetCurrentContact()
{
if(AktChatUserList != null && AktChatUserList.Items.Count > 0)
{
var contact = (CurrentContact) AktChatUserList.Items[0];
return contact.UserIdManage == null ? null : contact;
}
return null;
}
public void AddContextMenu(string menuItemText, Action<string> callBackAction)
{
if (!_MenuItemName2Callback.ContainsKey(menuItemText))
{
_MenuItemName2Callback.Add(menuItemText, callBackAction);
}
2017-11-09 12:20:03 +01:00
}
2017-12-18 18:22:13 +01:00
public void DeleteTempFiles()
{
2019-04-02 13:43:30 +02:00
foreach (var file in _CreatedTempFiles)
2017-12-18 18:22:13 +01:00
{
try
{
if (File.Exists(file))
2019-04-04 13:00:10 +02:00
{
2017-12-18 18:22:13 +01:00
File.Delete(file);
2019-04-04 13:00:10 +02:00
}
2017-12-18 18:22:13 +01:00
}
catch (Exception e)
{
//ignore
}
}
}
2017-09-12 14:32:34 +02:00
}
}