From 27d0467e084beacc610cb7c436965c3133fa9440 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 3 Feb 2017 15:02:16 -0700 Subject: [PATCH] added a message collection function for adding multiple msgs at once. only one notification will be raised for a batch of msgs --- .../Messages/MessageCollectorTests.cs | 32 +++++++++++++++++++ mRemoteV1/Messages/MessageCollector.cs | 26 +++++++++++---- 2 files changed, 51 insertions(+), 7 deletions(-) diff --git a/mRemoteNGTests/Messages/MessageCollectorTests.cs b/mRemoteNGTests/Messages/MessageCollectorTests.cs index bbb4d70f..3ae639ed 100644 --- a/mRemoteNGTests/Messages/MessageCollectorTests.cs +++ b/mRemoteNGTests/Messages/MessageCollectorTests.cs @@ -56,5 +56,37 @@ namespace mRemoteNGTests.Messages _messageCollector.AddMessage(message); Assert.That(wasCalled, Is.True); } + + [Test] + public void BatchAddAddsAllItems() + { + var msg1 = Substitute.For(); + var msg2 = Substitute.For(); + var msgCollection = new[] {msg1, msg2}; + _messageCollector.AddMessages(msgCollection); + Assert.That(_messageCollector.Messages, Is.EquivalentTo(msgCollection)); + } + + [Test] + public void OneNotificationRaisedForBatchAdd() + { + var notificationCount = 0; + _messageCollector.CollectionChanged += (sender, args) => notificationCount++; + var msg1 = Substitute.For(); + var msg2 = Substitute.For(); + _messageCollector.AddMessages(new[] { msg1, msg2 }); + Assert.That(notificationCount, Is.EqualTo(1)); + } + + [Test] + public void EventNotRaisedIfMsgIsntUnique() + { + var notificationCount = 0; + var msg1 = Substitute.For(); + _messageCollector.AddMessage(msg1); + _messageCollector.CollectionChanged += (sender, args) => notificationCount++; + _messageCollector.AddMessage(msg1); + Assert.That(notificationCount, Is.EqualTo(0)); + } } } \ No newline at end of file diff --git a/mRemoteV1/Messages/MessageCollector.cs b/mRemoteV1/Messages/MessageCollector.cs index 1c6e6de1..944a60ab 100644 --- a/mRemoteV1/Messages/MessageCollector.cs +++ b/mRemoteV1/Messages/MessageCollector.cs @@ -1,7 +1,8 @@ using System; +using System.Collections; using System.Collections.Generic; -using System.Collections.ObjectModel; using System.Collections.Specialized; +using System.Linq; namespace mRemoteNG.Messages @@ -14,8 +15,7 @@ namespace mRemoteNG.Messages public MessageCollector() { - _messageList = new ObservableCollection(); - ((INotifyCollectionChanged) _messageList).CollectionChanged += RaiseCollectionChangedEvent; + _messageList = new List(); } public void AddMessage(MessageClass messageClass, string messageText, bool onlyLog = false) @@ -26,8 +26,20 @@ namespace mRemoteNG.Messages public void AddMessage(IMessage message) { - if (_messageList.Contains(message)) return; - _messageList.Add(message); + AddMessages(new [] {message}); + } + + public void AddMessages(IEnumerable messages) + { + var newMessages = new List(); + foreach (var message in messages) + { + if (_messageList.Contains(message)) continue; + _messageList.Add(message); + newMessages.Add(message); + } + if (newMessages.Any()) + RaiseCollectionChangedEvent(NotifyCollectionChangedAction.Add, newMessages); } public void AddExceptionMessage(string message, Exception ex, MessageClass msgClass = MessageClass.ErrorMsg, bool logOnly = true) @@ -47,9 +59,9 @@ namespace mRemoteNG.Messages public event NotifyCollectionChangedEventHandler CollectionChanged; - private void RaiseCollectionChangedEvent(object sender, NotifyCollectionChangedEventArgs args) + private void RaiseCollectionChangedEvent(NotifyCollectionChangedAction action, IList items) { - CollectionChanged?.Invoke(this, args); + CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(action, items)); } } } \ No newline at end of file