diff --git a/ChatController/ChatController.csproj b/ChatController/ChatController.csproj
index 104c59d..de91cda 100644
--- a/ChatController/ChatController.csproj
+++ b/ChatController/ChatController.csproj
@@ -67,6 +67,7 @@
ChatMainControl.xaml
+
@@ -99,10 +100,14 @@
True
Resource.resx
+
+
+
+
@@ -148,6 +153,7 @@
+
diff --git a/ChatController/ChatKlassen/ChatMessage.cs b/ChatController/ChatKlassen/ChatMessage.cs
index b556226..a9f5358 100644
--- a/ChatController/ChatKlassen/ChatMessage.cs
+++ b/ChatController/ChatKlassen/ChatMessage.cs
@@ -4,10 +4,11 @@ using System.ComponentModel;
using System.Windows.Documents;
using System.Windows.Media;
using ChatController.Core;
-using ChatController.HauptKlassen;
using ChatController.Utilities;
using static System.Windows.HorizontalAlignment;
using Application = System.Windows.Application;
+using Brush = System.Windows.Media.Brush;
+using Color = System.Windows.Media.Color;
using HorizontalAlignment = System.Windows.HorizontalAlignment;
namespace ChatController.ChatKlassen
@@ -147,9 +148,11 @@ namespace ChatController.ChatKlassen
public string SendTimeString => SendTime.Date == DateTime.Today ? $"Heute {SendTime:HH:mm}" : SendTime.ToString("dd. MMM HH:mm");
- public Brush BorderBrush => IsSeparator ? new SolidColorBrush(Colors.Transparent) : IsMyMessage ? new SolidColorBrush(Color.FromRgb(255, 90, 0)) : new SolidColorBrush(Color.FromRgb(229, 229, 229));
+ public Brush BorderBrush => IsSeparator ? new SolidColorBrush(Colors.Transparent) : IsMyMessage ? new SolidColorBrush(Color.FromRgb(255, 90, 0)) : new SolidColorBrush(Color.FromRgb(255, 255, 255));
- public Brush HighlightedBorderBrush => IsSeparator ? new SolidColorBrush(Colors.Transparent) : IsMyMessage ? new SolidColorBrush(Color.FromRgb(255, 153, 153)) : new SolidColorBrush(Color.FromRgb(247, 247, 247));
+ public Brush HighlightedBorderBrush => IsSeparator ? new SolidColorBrush(Colors.Transparent) : IsMyMessage ? new SolidColorBrush(Color.FromRgb(255, 152, 143)) : new SolidColorBrush(Color.FromRgb(247, 247, 247));
+
+ public Brush TextColor => !IsMyMessage && !IsSeparator ? new SolidColorBrush(Colors.Black) : new SolidColorBrush(Colors.White);
public Brush Foreground => new BrushConverter().ConvertFromString("#505050") as SolidColorBrush;
diff --git a/ChatController/ChatKlassen/Contact.cs b/ChatController/ChatKlassen/Contact.cs
index b4995a0..9ab8f2d 100644
--- a/ChatController/ChatKlassen/Contact.cs
+++ b/ChatController/ChatKlassen/Contact.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
+using System.Windows;
using System.Windows.Media;
using ChatController.Core;
using ChatController.LoginKlassen;
@@ -179,4 +180,14 @@ namespace ChatController.ChatKlassen
handler?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
+
+ public class ContactDependencyObject : DependencyObject
+ {
+ public Contact Contact { get; set; }
+
+ public ContactDependencyObject(Contact contact)
+ {
+ Contact = contact;
+ }
+ }
}
diff --git a/ChatController/ChatMainControl.xaml b/ChatController/ChatMainControl.xaml
index 2a0aef2..713f447 100644
--- a/ChatController/ChatMainControl.xaml
+++ b/ChatController/ChatMainControl.xaml
@@ -7,18 +7,132 @@
xmlns:chatKlassen="clr-namespace:ChatController.ChatKlassen"
xmlns:core="clr-namespace:ChatController.Core"
xmlns:chatController="clr-namespace:ChatController"
- mc:Ignorable="d" x:Name="ChatControlling"
+ xmlns:utilities="clr-namespace:ChatController.Utilities"
+ mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="600"
Loaded="ChatMainControl_OnLoaded"
SnapsToDevicePixels="True" d:DataContext="{d:DesignData ChatMainControl}">
-
+
+
-
-
+
+
+
+
+
+
+
+
+
-
+
-
+
-
-
+
+
@@ -171,8 +302,8 @@
-
-
+
+
@@ -188,9 +319,16 @@
-
-
diff --git a/ChatController/ChatMainControl.xaml.cs b/ChatController/ChatMainControl.xaml.cs
index bef8dc8..2c5f6ab 100644
--- a/ChatController/ChatMainControl.xaml.cs
+++ b/ChatController/ChatMainControl.xaml.cs
@@ -8,6 +8,7 @@ using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading;
+using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
@@ -25,6 +26,7 @@ using ChatController.Utilities;
using ChatController.Utilities.Extensions;
using Application = System.Windows.Forms.Application;
using Button = System.Windows.Controls.Button;
+using CheckBox = System.Windows.Controls.CheckBox;
using Cursors = System.Windows.Input.Cursors;
using DataFormats = System.Windows.DataFormats;
using KeyEventArgs = System.Windows.Input.KeyEventArgs;
@@ -112,11 +114,17 @@ namespace ChatController
}
}
- public ObservableCollection ContactList
+ // ToDo: Hier die ContactDepenencyObject-Klasse benutzen wie im Kalender des BeWoPlaners!
+ public ObservableSortCollection ContactList
{
- get
+ get => _ContactList ?? (_ContactList = new ObservableSortCollection());
+
+ set
{
- return _ContactList == null ? new ObservableCollection() : new ObservableCollection(_ContactList.OrderByDescending(contact => contact.TimeStamp));
+ _ContactList = new ObservableSortCollection(value);
+ _ContactList.Sort((x, y) => DateTime.Compare(y.Contact.TimeStamp, x.Contact.TimeStamp));
+
+ OnPropertyChanged(nameof(ContactList));
}
}
@@ -124,16 +132,21 @@ namespace ChatController
{
get
{
- if(_CurrentContact is null)
+ if(_CurrentContact is null && Chat?.IsInBroadcastMode == false)
{
return Visibility.Collapsed;
}
- return _CurrentContact.IsChatMessageInputGridVisible ? Visibility.Visible : Visibility.Collapsed;
+ if(false == (Chat?.IsInBroadcastMode ?? false) && !(_CurrentContact is null))
+ {
+ return _CurrentContact.IsChatMessageInputGridVisible ? Visibility.Visible : Visibility.Collapsed;
+ }
+
+ return Chat?.IsInBroadcastMode ?? false ? Visibility.Visible : Visibility.Collapsed;
}
}
- private List _ContactList;
+ private ObservableSortCollection _ContactList;
private bool _ScrollPrueferAktivieren;
@@ -150,19 +163,18 @@ namespace ChatController
public ChatMainControl()
{
InitializeComponent();
-
+
_ThreadExceptionImageSource = new BitmapImage(new Uri("pack://application:,,,/ChatController;component/Ressourcen/warning-exclamation-mark.png", UriKind.Absolute));
_ChatMessages = new ObservableCollection();
ChatMessages = CollectionViewSource.GetDefaultView(_ChatMessages) as ListCollectionView;
+
if (!(ChatMessages is null))
{
ChatMessages.CustomSort = new ChatMessageComparer();
}
DataContext = this;
-
- ReloadGruppen.Visibility = Visibility.Collapsed;
}
private void ContainingWindowOnDeactivated(object sender, EventArgs e)
@@ -202,20 +214,27 @@ namespace ChatController
OnPropertyChanged(nameof(Chat));
- _ContactList = Chat.AddContacts();
+ _ContactList = new ObservableSortCollection();
+
+ foreach(var contact in Chat.AddContacts())
+ {
+ ContactList.Add(new ContactDependencyObject(contact));
+ }
+
+ ContactList.Sort((x, y) => DateTime.Compare(y.Contact.TimeStamp, x.Contact.TimeStamp));
OnPropertyChanged(nameof(ContactList));
ReadNewSyncFile();
- foreach (var contact in _ContactList)
+ foreach (var contactDependencyObject in _ContactList)
{
- if (_GroupId2DateTime.ContainsKey(contact.GroupId))
+ if (_GroupId2DateTime.ContainsKey(contactDependencyObject.Contact.GroupId))
{
- var isUnread = _GroupId2DateTime[contact.GroupId].IsUnread;
+ var isUnread = _GroupId2DateTime[contactDependencyObject.Contact.GroupId].IsUnread;
- contact.IsNewMessage = isUnread;
- contact.HasUnreadMessages = contact.IsNewMessage;
+ contactDependencyObject.Contact.IsNewMessage = isUnread;
+ contactDependencyObject.Contact.HasUnreadMessages = contactDependencyObject.Contact.IsNewMessage;
}
}
@@ -230,11 +249,11 @@ namespace ChatController
{
var notificationIcon = Resource.ownchat_favicon;
- var contact = _ContactList.FirstOrDefault(a => a.GroupId == pGroupId);
+ var contact = _ContactList.FirstOrDefault(a => a.Contact.GroupId == pGroupId);
if (contact != null)
{
- notificationIcon = Utils.ImageSourceToIcon(contact.Image);
+ notificationIcon = Utils.ImageSourceToIcon(contact.Contact.Image);
}
var notifyIcon = new NotifyIcon { Icon = notificationIcon, Visible = true, Tag = pMessage };
@@ -255,10 +274,10 @@ namespace ChatController
_ContainingWindow.Activate();
- var selectedContact = _ContactList?.FirstOrDefault(f => f?.GroupId == pGroupId);
+ var selectedContact = _ContactList?.FirstOrDefault(f => f?.Contact.GroupId == pGroupId);
if(selectedContact != null)
{
- SelectContact(selectedContact);
+ SelectContact(selectedContact.Contact);
}
};
@@ -314,9 +333,14 @@ namespace ChatController
private void Clientlist_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
- if(Clientlist?.SelectedItem is Contact selectedContact)
+ if(Chat.IsInBroadcastMode)
{
- SelectContact(selectedContact);
+ return;
+ }
+
+ if(Clientlist?.SelectedItem is ContactDependencyObject selectedContactDependencyObject)
+ {
+ SelectContact(selectedContactDependencyObject.Contact);
}
}
@@ -324,7 +348,7 @@ namespace ChatController
{
try
{
- if (pContact == null)
+ if (pContact is null)
{
return;
}
@@ -346,7 +370,7 @@ namespace ChatController
var currentContact = pContact;
pContact.IsNewMessage = false;
- var shouldChangeIcon = _ContactList.Any(contact => contact.IsNewMessage);
+ var shouldChangeIcon = _ContactList.Any(contact => contact.Contact.IsNewMessage);
if (shouldChangeIcon)
{
ContainingWindow.Icon = Utils.ConvertIconToImageSource(Resource.ownchat_favicon);
@@ -354,9 +378,12 @@ namespace ChatController
CurrentContact = currentContact;
- if (Clientlist.Items.Contains(pContact))
+ foreach(ContactDependencyObject item in Clientlist.Items)
{
- Clientlist.SelectedItem = pContact;
+ if(item.Contact.Equals(pContact))
+ {
+ Clientlist.SelectedItem = item;
+ }
}
_ChatMessages.Clear();
@@ -460,9 +487,9 @@ namespace ChatController
}
}
- private void PasteOnClick(object sender, RoutedEventArgs routedEventArgs)
+ private async void PasteOnClick(object sender, RoutedEventArgs routedEventArgs)
{
- Chat.Paste(CurrentContact.GroupId,this);
+ await Chat.Paste(CurrentContact.GroupId,this);
}
private void CopyOnClick(object sender, RoutedEventArgs routedEventArgs)
@@ -582,7 +609,7 @@ namespace ChatController
}
}
- private void MediaButton_OnClick(object sender, RoutedEventArgs e)
+ private async void MediaButton_OnClick(object sender, RoutedEventArgs e)
{
if(CurrentContact != null)
{
@@ -600,7 +627,7 @@ namespace ChatController
return;
}
- if (!string.IsNullOrWhiteSpace(pathToScaledImage))
+ if (File.Exists(pathToScaledImage))
{
_ChatMessages.AddRangeIfElementsNotIn(Chat.AddNewFile(pathToScaledImage, pathToOriginalImage, CurrentContact.GroupId, GetFirstMessage()));
@@ -610,7 +637,7 @@ namespace ChatController
ChatListBox.ScrollIntoView(currentChatMessage);
- Chat.SendFileToContact(CurrentContact, pathToScaledImage,pathToOriginalImage);
+ await Chat.SendFileToContact(CurrentContact, pathToScaledImage, pathToOriginalImage, Chatbox.Text);
if (!string.IsNullOrWhiteSpace(pathToScaledImage) && !pathToScaledImage.Equals(pathToOriginalImage) && File.Exists(pathToScaledImage))
{
@@ -625,8 +652,14 @@ namespace ChatController
}
}
- private void SendButton_OnClick(object sender, RoutedEventArgs e)
+ private async void SendButton_OnClick(object sender, RoutedEventArgs e)
{
+ if(Chat.IsInBroadcastMode)
+ {
+ SendBroadcastMessage();
+ return;
+ }
+
if(CurrentContact != null && !string.IsNullOrEmpty(Chatbox.Text))
{
var messages2Add = Chat.AddNewMessage(Chatbox.Text, CurrentContact.GroupId, GetFirstMessage());
@@ -639,12 +672,10 @@ namespace ChatController
WpfUtils.ScrollToBottomOfListBox(ChatListBox);
- Chat.SendMessage(Chatbox.Text, CurrentContact.GroupId);
+ await Chat.SendMessage(Chatbox.Text, CurrentContact.GroupId);
Chatbox.Text = string.Empty;
- Thread.Sleep(500);
-
DoSynchro();
}
}
@@ -672,12 +703,15 @@ namespace ChatController
// ChatListBox.Items.MoveCurrentToLast();
// ChatListBox.ScrollIntoView(ChatListBox.Items.CurrentItem);
-
+
// Chat.SendMessage(Chatbox.Text, CurrentContact.GroupId);
// Chatbox.Text = string.Empty;
// }
//}
+
+ OnPropertyChanged(nameof(IsBroadcastButtonEnabled));
+ OnPropertyChanged(nameof(IsSendButtonEnabled));
}
catch (Exception ed)
{
@@ -685,6 +719,12 @@ namespace ChatController
}
}
+ private void Chatbox_OnKeyUpHandler(object sender, KeyEventArgs e)
+ {
+ OnPropertyChanged(nameof(IsBroadcastButtonEnabled));
+ OnPropertyChanged(nameof(IsSendButtonEnabled));
+ }
+
public delegate void EmojiiDelegate(Button button);
public event EmojiiDelegate OnEmojii;
@@ -725,20 +765,23 @@ namespace ChatController
ChatMessages.MoveCurrentToFirst();
var currentChatMessage = ChatMessages.CurrentItem;
-
- var selectedContact = (Contact) Clientlist.SelectedItem;
- Chat.LoadMoreMessagesAsync(selectedContact, GetFirstMessage(), chatMessages =>
+ if(!(Clientlist.SelectedItem is null))
{
- this.Dispatch(() =>
+ var selectedContact = ((ContactDependencyObject) Clientlist.SelectedItem).Contact;
+
+ Chat.LoadMoreMessagesAsync(selectedContact, GetFirstMessage(), chatMessages =>
{
- EndWaiting();
+ this.Dispatch(() =>
+ {
+ EndWaiting();
- _ChatMessages.AddRangeIfElementsNotIn(chatMessages);
+ _ChatMessages.AddRangeIfElementsNotIn(chatMessages);
- ChatListBox.ScrollIntoView(currentChatMessage);
+ ChatListBox.ScrollIntoView(currentChatMessage);
+ });
});
- });
+ }
}
}
}
@@ -782,19 +825,25 @@ namespace ChatController
{
foreach (var newContact in updatedContacts)
{
- if (contact.GroupId == newContact.GroupId)
+ if (contact.Contact.GroupId == newContact.GroupId)
{
// ReceivedMessage kann null sein!
- if (contact.ReceivedMessage != null && !contact.ReceivedMessage.Id.Equals(newContact.ReceivedMessage?.Id))
+ if (contact.Contact.ReceivedMessage != null && !contact.Contact.ReceivedMessage.Id.Equals(newContact.ReceivedMessage?.Id))
{
- contact.ReceivedMessage = newContact.ReceivedMessage;
- contact.TimeStamp = newContact.TimeStamp;
+ contact.Contact.ReceivedMessage = newContact.ReceivedMessage;
+ contact.Contact.TimeStamp = newContact.TimeStamp;
+
+ Contact selectedContact = null;
+
+ if(Clientlist.SelectedItem is ContactDependencyObject selectedContactDependencyObject)
+ {
+ selectedContact = selectedContactDependencyObject.Contact;
+ }
- var selectedContact = (Contact)Clientlist.SelectedItem;
// Angemeldeter Benutzer
var userOid = Chat.ChatDaten.LoggedInUser.Response.User.Oid;
- var senderId = contact.ReceivedMessage?.UserId;
+ var senderId = contact.Contact.ReceivedMessage?.UserId;
var receiverId = userOid;
var receiverGroupId = newContact.GroupId;
var selectedGroupId = selectedContact?.GroupId;
@@ -812,18 +861,18 @@ namespace ChatController
// 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;
+ contact.Contact.HasUnreadMessages = false;
}
else
{
- contact.HasUnreadMessages = true;
- contact.IsNewMessage = true;
+ contact.Contact.HasUnreadMessages = true;
+ contact.Contact.IsNewMessage = true;
}
}
}
}
- if (!updatedContacts.Contains(contact))
+ if (!updatedContacts.Contains(contact.Contact))
{
_ContactList.ToList().Remove(contact);
}
@@ -853,7 +902,7 @@ namespace ChatController
private void ListenForMessagesForCurrentContact(Contact pCurrentContact)
{
- if (!ShouldInterruptContactsThread)
+ if (!ShouldInterruptContactsThread && !(CurrentContact is null))
{
Chat.CheckIfNewMessagesExistAsync(CurrentContact.GroupId, hasNewMessages =>
{
@@ -888,7 +937,12 @@ namespace ChatController
return true;
}
- return (item as Contact).Name.IndexOf(Suche.Text, StringComparison.OrdinalIgnoreCase) >= 0;
+ if(item is ContactDependencyObject contactDependencyObject)
+ {
+ return contactDependencyObject.Contact.Name.IndexOf(Suche.Text, StringComparison.OrdinalIgnoreCase) >= 0;
+ }
+
+ return false;
}
private void Chat_OnMouseDoubleClick(object sender, MouseButtonEventArgs e)
@@ -1021,7 +1075,13 @@ namespace ChatController
{
this.Dispatch(() =>
{
- _ContactList = Chat.UpdateContacts(data); // <- dauert eine Sekunde!
+ ContactList = new ObservableSortCollection();
+ foreach(var contact in Chat.UpdateContacts(data))// <- dauert eine Sekunde!
+ {
+ ContactList.Add(new ContactDependencyObject(contact));
+ }
+ ContactList.Sort((x, y) => DateTime.Compare(y.Contact.TimeStamp, x.Contact.TimeStamp));
+
OnPropertyChanged(nameof(ContactList));
ReadNewSyncFile();
@@ -1054,9 +1114,9 @@ namespace ChatController
{
Encoding enc = new UTF8Encoding();
- foreach (var contact in _ContactList.ToList().Where(contact => contact.ReceivedMessage != null))
+ foreach (var contact in _ContactList.ToList().Where(contact => contact.Contact.ReceivedMessage != null))
{
- var text = contact.GroupId + ";" + contact.TimeStamp.ToUniversalTime() + ";" + contact.IsNewMessage + ";";
+ var text = contact.Contact.GroupId + ";" + contact.Contact.TimeStamp.ToUniversalTime() + ";" + contact.Contact.IsNewMessage + ";";
var bytes = enc.GetBytes(text);
var base64String = Convert.ToBase64String(bytes);
@@ -1066,7 +1126,7 @@ namespace ChatController
File.SetAttributes(Path.Combine(Utils.GetAndCreateUserAppDataPath(), Resource.SyncFile2Name), FileAttributes.ReadOnly);
}
}
- catch (Exception exception)
+ catch (Exception)
{
}
@@ -1113,7 +1173,7 @@ namespace ChatController
Chat.LastTimeStamp = latestDateTime.GetUnixTimeStamp();
}
}
- catch (Exception e)
+ catch(Exception)
{
}
@@ -1128,9 +1188,9 @@ namespace ChatController
foreach(var contactItem in Clientlist.Items)
{
- if(contactItem is Contact contact && contact.HasUnreadMessages && !string.IsNullOrEmpty(contact.ReceivedMessage?.Text))
+ if(contactItem is ContactDependencyObject contactDependencyObject && contactDependencyObject.Contact.HasUnreadMessages && !string.IsNullOrEmpty(contactDependencyObject.Contact.ReceivedMessage?.Text))
{
- contacts.Add(contact);
+ contacts.Add(contactDependencyObject.Contact);
}
}
@@ -1146,9 +1206,9 @@ namespace ChatController
{
foreach(var groupId2DateTime in pGroupId2DateTime)
{
- if(contact.GroupId == groupId2DateTime.Key)
+ if(contact.Contact.GroupId == groupId2DateTime.Key)
{
- contact.HasUnreadMessages = false;
+ contact.Contact.HasUnreadMessages = false;
}
}
}
@@ -1195,9 +1255,9 @@ namespace ChatController
File.Delete(file);
}
}
- catch (Exception e)
+ catch (Exception)
{
- //ignore
+ //ignore okeee
}
}
}
@@ -1227,6 +1287,9 @@ namespace ChatController
{
Chatbox.Height = 25;
}
+
+ OnPropertyChanged(nameof(IsBroadcastButtonEnabled));
+ OnPropertyChanged(nameof(IsSendButtonEnabled));
}
public void AddMessages(List newMessages)
@@ -1238,5 +1301,272 @@ namespace ChatController
{
return _ChatMessages.FirstOrDefault();
}
+
+
+ #region Broadcast
+
+ public bool IsSendButtonEnabled => !string.IsNullOrEmpty(Chatbox.Text);
+
+ public bool IsBroadcastButtonEnabled
+ {
+ get
+ {
+ var isInBroadcastMode = Chat.IsInBroadcastMode;
+ var hasSelectedContacts = GetSelectedContacts().Any();
+ var hasTextOrFile = !string.IsNullOrEmpty(Chatbox.Text) || !(BroadcastMessage?.BroadcastMessageImageSource is null);
+
+ return isInBroadcastMode && hasSelectedContacts && hasTextOrFile;
+ }
+ }
+
+ private Contact _PreviousContact;
+
+ private CancellationTokenSource _CancellationTokenSource;
+
+ private string _DefaultBroadcastInfoText = "Dies ist eine Nachricht, die als Broadcast an alle ausgewählten Kontakte geschickt wird.";
+
+ private string _BroadcastInfoText;
+ public string BroadcastInfoText
+ {
+ get => _BroadcastInfoText ?? (_BroadcastInfoText = _DefaultBroadcastInfoText);
+ set
+ {
+ _BroadcastInfoText = $"{_DefaultBroadcastInfoText}{Environment.NewLine}{value}";
+ OnPropertyChanged(BroadcastInfoText);
+ }
+ }
+
+ private double _BroadcastProgressValue;
+ public double BroadcastProgressValue
+ {
+ get => _BroadcastProgressValue;
+ set
+ {
+ _BroadcastProgressValue = value;
+ OnPropertyChanged(nameof(BroadcastProgressValue));
+ }
+ }
+
+ private BroadcastMessage _BroadcastMessage;
+ public BroadcastMessage BroadcastMessage
+ {
+ get => _BroadcastMessage;
+ set
+ {
+ _BroadcastMessage = value;
+
+ OnPropertyChanged(nameof(BroadcastMessage));
+ OnPropertyChanged(nameof(IsBroadcastButtonEnabled));
+ }
+ }
+
+
+ private void BroadcastButton_OnClick(object sender, RoutedEventArgs e)
+ {
+ Chat.IsInBroadcastMode = !Chat.IsInBroadcastMode;
+
+ BroadcastProgressValue = 0;
+
+ DeselectAllContacts();
+
+ if (Chat.IsInBroadcastMode)
+ {
+ _CancellationTokenSource = new CancellationTokenSource();
+ _PreviousContact = CurrentContact;
+ CurrentContact = null;
+ }
+ else
+ {
+ CloseBroadcastMode();
+ }
+
+ OnPropertyChanged(nameof(IsSendButtonEnabled));
+ OnPropertyChanged(nameof(ChatMessageInputGridVisibility));
+ OnPropertyChanged(nameof(BroadcastMessage));
+ }
+
+ private void AbortBroadcastButton_OnClick(object sender, RoutedEventArgs e)
+ {
+ CloseBroadcastMode();
+ }
+
+ private async void SendBroadcastMessage()
+ {
+ var selectedContacts = GetSelectedContacts();
+
+ if (selectedContacts.Count == 0 || string.IsNullOrEmpty(Chatbox.Text) && BroadcastMessage.BroadcastMessageImageSource is null)
+ {
+ return;
+ }
+
+ var progress = new Progress();
+ progress.ProgressChanged += ReportProgress;
+
+ try
+ {
+ await SendBroadcast(progress, _CancellationTokenSource.Token);
+ }
+ catch(OperationCanceledException)
+ {
+ BroadcastInfoText = "Der Broadcast wurde abgebrochen.";
+ }
+
+ DoSynchro();
+
+ CloseBroadcastMode();
+ }
+
+ private async Task SendBroadcast(IProgress progress, CancellationToken cancellationToken)
+ {
+ var count = 0;
+ var report = new BroadcastProgressReportModel();
+
+ var selectedContacts = GetSelectedContacts();
+
+ foreach (var contact in selectedContacts.Where(selectedContact => selectedContact.IsChatMessageInputGridVisible))
+ {
+ if(BroadcastMessage is null)
+ {
+ await Chat.SendMessage(Chatbox.Text, contact.GroupId);
+ }
+ else
+ {
+ await Chat.SendFileToContact(contact, BroadcastMessage.ScaledFilePath, BroadcastMessage.OriginalFilePath, Chatbox.Text);
+ }
+
+ cancellationToken.ThrowIfCancellationRequested();
+
+ count++;
+ report.PercentageComplete = count * 100 / selectedContacts.Count;
+
+ progress.Report(report);
+ }
+ }
+
+ private void ReportProgress(object sender, BroadcastProgressReportModel e)
+ {
+ BroadcastProgressValue = e.PercentageComplete;
+ }
+
+ private void SelectAllContacts_OnClick(object sender, RoutedEventArgs e)
+ {
+ if(sender is CheckBox checkBox)
+ {
+ var isChecked = checkBox.IsChecked ?? false;
+
+ foreach (var contactDependencyObject in ContactList)
+ {
+ contactDependencyObject.SetValue(ListItemHelper.IsCheckedProperty, isChecked);
+ }
+
+ OnPropertyChanged(nameof(ContactList));
+ OnPropertyChanged(nameof(IsBroadcastButtonEnabled));
+ }
+ }
+
+ private void SendBroatcastButton_OnClick(object sender, RoutedEventArgs e)
+ {
+ SendBroadcastMessage();
+ }
+
+ private void CancelBroadcastButton_OnClick(object sender, RoutedEventArgs e)
+ {
+ _CancellationTokenSource?.Cancel();
+ BroadcastMessage = null;
+ Chatbox.Text = string.Empty;
+ }
+
+ private void AddMediaFileToBroadcastMessage_OnClick(object sender, RoutedEventArgs e)
+ {
+ if(Chat.IsInBroadcastMode)
+ {
+ var originalFilePath = Chat.OpenFile();
+
+ if(File.Exists(originalFilePath))
+ {
+ var scaledImagePath = FileUtils.ScaleImage(originalFilePath, Path.GetExtension(originalFilePath.ToUpperInvariant()), Chat.ChatDaten.MaxUploadSize);
+
+ var isFileSizeTooLarge = FileUtils.CheckFileSize(scaledImagePath, Chat.ChatDaten.MaxUploadSize);
+
+ if(isFileSizeTooLarge)
+ {
+ MessageBox.Show($"Die ausgewählte Datei ist zu groß. Die maximale Größe beträgt {Chat.ChatDaten.MaxUploadSize / 1000 / 1000} MB", "Senden nicht möglich", MessageBoxButton.OK, MessageBoxImage.Warning);
+ return;
+ }
+
+ if(File.Exists(scaledImagePath))
+ {
+ if (BroadcastMessage is null)
+ {
+ BroadcastMessage = new BroadcastMessage(originalFilePath, scaledImagePath);
+ }
+ }
+ }
+ }
+ }
+
+ private void CloseBroadcastMode()
+ {
+ Chatbox.Text = string.Empty;
+
+ if(!(_PreviousContact is null))
+ {
+ SelectContact(_PreviousContact);
+ }
+
+ _CancellationTokenSource = null;
+ BroadcastMessage = null;
+ BroadcastProgressValue = 0;
+
+ DeselectAllContacts();
+
+ OnPropertyChanged(nameof(IsSendButtonEnabled));
+ OnPropertyChanged(nameof(ChatMessageInputGridVisibility));
+ OnPropertyChanged(nameof(BroadcastMessage));
+
+ Chat.IsInBroadcastMode = false;
+ }
+ #endregion
+
+ private void ContactCheckBox_OnClick(object sender, RoutedEventArgs e)
+ {
+ OnPropertyChanged(nameof(IsBroadcastButtonEnabled));
+ }
+
+ private void ContactCheckBox_OnChecked(object sender, RoutedEventArgs e)
+ {
+ UpdateContactSelection();
+ }
+
+ private void UpdateContactSelection()
+ {
+ OnPropertyChanged(nameof(ContactList));
+ OnPropertyChanged(nameof(IsBroadcastButtonEnabled));
+
+ SelectAllContactsCheckBox.IsChecked = GetSelectedContacts().Count == ContactList.Where(contactDependencyObject => contactDependencyObject.Contact.IsChatMessageInputGridVisible).ToList().Count;
+ }
+
+ private List GetSelectedContacts()
+ {
+ var result = new List();
+
+ foreach(var contactDependencyObject in ContactList.Where(contactDependencyObject => contactDependencyObject.Contact.IsChatMessageInputGridVisible))
+ {
+ if(contactDependencyObject.GetValue(ListItemHelper.IsCheckedProperty) is bool isChecked && isChecked)
+ {
+ result.AddIfNotIn(contactDependencyObject.Contact);
+ }
+ }
+
+ return result;
+ }
+
+ private void DeselectAllContacts()
+ {
+ foreach (var contactDependencyObject in ContactList)
+ {
+ contactDependencyObject.SetValue(ListItemHelper.IsCheckedProperty, false);
+ }
+ }
}
}
diff --git a/ChatController/Converter/BroadcastCheckBoxVisibilityMultiConverter.cs b/ChatController/Converter/BroadcastCheckBoxVisibilityMultiConverter.cs
new file mode 100644
index 0000000..91c5ab9
--- /dev/null
+++ b/ChatController/Converter/BroadcastCheckBoxVisibilityMultiConverter.cs
@@ -0,0 +1,30 @@
+using System;
+using System.Globalization;
+using System.Windows;
+using System.Windows.Data;
+
+namespace ChatController.Converter
+{
+ public class BroadcastCheckBoxVisibilityMultiConverter : IMultiValueConverter
+ {
+ public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
+ {
+ if(values.Length == 2 && values[0] is bool isInBroadcastMode && values[1] is bool isChatMessageInputGridVisible)
+ {
+ if(isInBroadcastMode)
+ {
+ return isChatMessageInputGridVisible ? Visibility.Visible : Visibility.Hidden;
+ }
+
+ return Visibility.Collapsed;
+ }
+
+ return Visibility.Collapsed;
+ }
+
+ public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/ChatController/HauptKlassen/Chat.cs b/ChatController/HauptKlassen/Chat.cs
index 06ad221..6d3f02a 100644
--- a/ChatController/HauptKlassen/Chat.cs
+++ b/ChatController/HauptKlassen/Chat.cs
@@ -3,6 +3,7 @@ using Newtonsoft.Json;
using System;
using System.Collections;
using System.Collections.Generic;
+using System.ComponentModel;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
@@ -10,8 +11,10 @@ using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Security;
+using System.Runtime.CompilerServices;
using System.Security.Cryptography.X509Certificates;
using System.Threading;
+using System.Threading.Tasks;
using System.Web;
using System.Windows;
using System.Windows.Controls;
@@ -19,6 +22,7 @@ using System.Windows.Data;
using System.Windows.Forms;
using System.Windows.Media;
using System.Windows.Media.Imaging;
+using ChatController.Annotations;
using ChatController.Core;
using ChatController.Extensions;
using ChatController.LoginKlassen;
@@ -35,7 +39,7 @@ using MessageBox = System.Windows.MessageBox;
namespace ChatController.HauptKlassen
{
// Ist quasi das ViewModel
- public class Chat
+ public class Chat : INotifyPropertyChanged
{
public Action ExceptionCallback { get; set; }
public Action ThreadExceptionCallback { get; set; }
@@ -451,7 +455,7 @@ namespace ChatController.HauptKlassen
}
}
- public async void SendMessage(string message, long groupId)
+ public async Task SendMessage(string message, long groupId)
{
try
{
@@ -466,14 +470,12 @@ namespace ChatController.HauptKlassen
var httpRequest = new HttpRequestMessage {Method = HttpMethod.Post, RequestUri = requestUri, Content = multiPartContent};
- //wegen Kontent nachschauen
httpRequest.Headers.Add("Token", ChatDaten.AuthToken);
httpRequest.Headers.Add("CustomerID", ChatDaten.Kundennummer);
var httpClient = new HttpClient();
await httpClient.SendAsync(httpRequest, CancellationToken.None).ConfigureAwait(false);
}
-
}
catch (Exception exception)
{
@@ -501,13 +503,13 @@ namespace ChatController.HauptKlassen
}
}
- public List AddNewFile(string pathToFile, string originalFilePath, long groupId, ChatMessage previousMessage)
+ public List AddNewFile(string pathToScaledFile, string originalFilePath, long groupId, ChatMessage previousMessage)
{
var result = new List();
try
{
- if (string.IsNullOrEmpty(pathToFile) || string.IsNullOrEmpty(originalFilePath))
+ if(string.IsNullOrEmpty(pathToScaledFile) || string.IsNullOrEmpty(originalFilePath))
{
return result;
}
@@ -516,10 +518,10 @@ namespace ChatController.HauptKlassen
var sendTime = DateTime.Now;
- if (Constants.ImageFileExtensions.Contains(Path.GetExtension(pathToFile).ToUpperInvariant()))
+ if (Constants.ImageFileExtensions.Contains(Path.GetExtension(pathToScaledFile).ToUpperInvariant()))
{
byte[] file;
- using (Stream reader = File.OpenRead(pathToFile))
+ using (Stream reader = File.OpenRead(pathToScaledFile))
{
file = Utils.ReadFully(reader);
}
@@ -558,7 +560,8 @@ namespace ChatController.HauptKlassen
bitmapImage.EndInit();
bitmapImage.Freeze();
- var chatMessage = new ChatMessage(groupId, 0, ChatDaten.LoggedInUser.Response.User.UserName, Path.GetFileName(pathToFile), sendTime, true, memoryStream.Length, null, pathToFile, Path.GetFileName(pathToFile), null, bitmapImage, ChatMessageType.Image, ChatDaten.LoggedInUser.Response.User.Oid);
+ var chatMessage = new ChatMessage(groupId, 0, ChatDaten.LoggedInUser.Response.User.UserName, Path.GetFileName(pathToScaledFile), sendTime, true, memoryStream.Length, null, pathToScaledFile, Path.GetFileName(pathToScaledFile), null, bitmapImage, ChatMessageType.Image, ChatDaten.LoggedInUser.Response.User.Oid);
+
result.Add(chatMessage);
}
}
@@ -568,7 +571,7 @@ namespace ChatController.HauptKlassen
{
var linkToThumbnail = $"{ChatDaten.ServerUrl}/document.png";
- var chatMessage = new ChatMessage(groupId, 0, ChatDaten.LoggedInUser.Response.User.UserName, Path.GetFileName(pathToFile), sendTime, true, 0, pathToFile, null, null, linkToThumbnail, null, ChatMessageType.Document, ChatDaten.LoggedInUser.Response.User.Oid);
+ var chatMessage = new ChatMessage(groupId, 0, ChatDaten.LoggedInUser.Response.User.UserName, Path.GetFileName(pathToScaledFile), sendTime, true, 0, pathToScaledFile, null, null, linkToThumbnail, null, ChatMessageType.Document, ChatDaten.LoggedInUser.Response.User.Oid);
result.Add(chatMessage);
}
@@ -628,11 +631,11 @@ namespace ChatController.HauptKlassen
return AddSeparators(result);
}
- public void SendFileToContact(Contact currentContact, string pFile, string pOriginalFilePath)
+ public async Task SendFileToContact(Contact currentContact, string scaledImagePath, string originalFilePath, string message)
{
try
- {
- SendFile(pFile, currentContact, pOriginalFilePath);
+ {
+ await SendFile(scaledImagePath, currentContact, originalFilePath, message);
}
catch (Exception exception)
{
@@ -641,7 +644,7 @@ namespace ChatController.HauptKlassen
}
// WebRequest
- private void SendFile(string pFile, Contact currentContact, string pOriginalFilePath)
+ private async Task SendFile(string pFile, Contact currentContact, string pOriginalFilePath, string message)
{
if(string.IsNullOrEmpty(pOriginalFilePath))
{
@@ -660,18 +663,18 @@ namespace ChatController.HauptKlassen
{
fileName = fileName.Replace(".bmp", ".jpg");
- SendMediaMessage(fileName, currentContact.GroupId, mediaFile);
+ await SendMediaMessage(fileName, currentContact.GroupId, mediaFile, message);
}
else
{
- SendMediaMessage(fileName, currentContact.GroupId, mediaFile);
+ await SendMediaMessage(fileName, currentContact.GroupId, mediaFile, message);
}
}
private HttpRequestMessage _HttpRequest;
// WebRequest
- private async void SendMediaMessage(string pMessage, long pGroupId, byte[] pMediaFile)
+ private async Task SendMediaMessage(string fileName, long groupId, byte[] mediaFile, string message)
{
try
{
@@ -679,8 +682,13 @@ namespace ChatController.HauptKlassen
{
var requestUri = new Uri(ChatDaten.ServerUrl + Constants.SendMessageUrl);
- multiPartContent.Add(new ByteArrayContent(pMediaFile, 0, pMediaFile.Length), "file", pMessage);
- multiPartContent.Add(new StringContent(pGroupId.ToString()), "groupid");
+ multiPartContent.Add(new ByteArrayContent(mediaFile, 0, mediaFile.Length), "file", fileName);
+ multiPartContent.Add(new StringContent(groupId.ToString()), "groupid");
+
+ if(!string.IsNullOrWhiteSpace(message))
+ {
+ multiPartContent.Add(new StringContent(message), "text");
+ }
_HttpRequest = new HttpRequestMessage
{
@@ -693,7 +701,7 @@ namespace ChatController.HauptKlassen
_HttpRequest.Headers.Add(Constants.CustomerId, ChatDaten.Kundennummer);
var httpClient = new HttpClient();
- var httpResponse = await httpClient.SendAsync(_HttpRequest, CancellationToken.None).ConfigureAwait(false);
+ var httpResponse = await httpClient.SendAsync(_HttpRequest, CancellationToken.None);//.ConfigureAwait(false);
var antwortResponse = await httpResponse.Content.ReadAsStringAsync();
}
@@ -800,7 +808,7 @@ namespace ChatController.HauptKlassen
}
}
- public void Paste(long pGroupOid, ChatMainControl pChatMainControl)
+ public async Task Paste(long pGroupOid, ChatMainControl pChatMainControl)
{
var dataObject = Clipboard.GetDataObject();
@@ -828,7 +836,7 @@ namespace ChatController.HauptKlassen
pChatMainControl.ChatListBox.Items.MoveCurrentToLast();
pChatMainControl.ChatListBox.ScrollIntoView(pChatMainControl.ChatListBox.Items.CurrentItem);
- SendMediaMessage(fileName, pGroupOid, mediaFile);
+ await SendMediaMessage(fileName, pGroupOid, mediaFile, null);
}
}
}
@@ -850,7 +858,7 @@ namespace ChatController.HauptKlassen
pChatMainControl.ChatListBox.Items.MoveCurrentToLast();
pChatMainControl.ChatListBox.ScrollIntoView(pChatMainControl.ChatListBox.Items.CurrentItem);
- SendMessage(text, pGroupOid);
+ await SendMessage(text, pGroupOid);
}
else if (dataObject.GetDataPresent(DataFormats.Bitmap))
{
@@ -867,7 +875,7 @@ namespace ChatController.HauptKlassen
pChatMainControl.ChatListBox.Items.MoveCurrentToLast();
pChatMainControl.ChatListBox.ScrollIntoView(pChatMainControl.ChatListBox.Items.CurrentItem);
- SendMediaMessage(imageName, pGroupOid, Utils.ImageToByteArray(image));
+ await SendMediaMessage(imageName, pGroupOid, Utils.ImageToByteArray(image), null);
}
else
{
@@ -1189,6 +1197,34 @@ namespace ChatController.HauptKlassen
ExceptionCallback?.Invoke(exception);
}
}
+
+ private bool _IsInBroadcastMode;
+
+ public bool IsInBroadcastMode
+ {
+ get => _IsInBroadcastMode;
+ set
+ {
+ _IsInBroadcastMode = value;
+ OnPropertyChanged(nameof(IsInBroadcastMode));
+ }
+ }
+
+ public void SendBroadcastMessage()
+ {
+ throw new NotImplementedException("SendBroadcastMessage implementieren!");
+ }
+
+
+
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ [NotifyPropertyChangedInvocator]
+ protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
+ {
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+ }
}
public class ChatMessageComparer : IComparer
diff --git a/ChatController/LoginControl.xaml b/ChatController/LoginControl.xaml
index 49a8ad7..f6c2aa1 100644
--- a/ChatController/LoginControl.xaml
+++ b/ChatController/LoginControl.xaml
@@ -53,21 +53,21 @@