4 using System.Collections.Generic;
5 using System.Collections.Specialized;
7 using System.Threading.Tasks;
9 using SiliconStudio.Core.Diagnostics;
10 using SiliconStudio.Presentation.Collections;
12 using SiliconStudio.Presentation.Services;
14 namespace SiliconStudio.Presentation.ViewModel
25 public const int DefaultUpdateInterval = 300;
27 protected readonly Dictionary<Logger, List<ILogMessage>> Loggers =
new Dictionary<Logger, List<ILogMessage>>();
28 private readonly ObservableList<ILogMessage> messages =
new ObservableList<ILogMessage>();
29 private readonly List<Tuple<Logger, ILogMessage>> pendingMessages =
new List<Tuple<Logger, ILogMessage>>();
31 private int updateInterval = DefaultUpdateInterval;
32 private bool updatePending;
39 : base(serviceProvider)
44 ClearMessagesCommand =
new AsyncCommand(serviceProvider, ClearMessages);
45 messages.CollectionChanged += MessagesCollectionChanged;
54 : this(serviceProvider)
56 if (logger == null)
throw new ArgumentNullException(
"logger");
57 Loggers.Add(logger,
new List<ILogMessage>());
58 logger.MessageLogged += MessageLogged;
67 : this(serviceProvider)
69 if (loggers == null)
throw new ArgumentNullException(
"loggers");
70 foreach (var logger
in loggers)
72 Loggers.Add(logger,
new List<ILogMessage>());
73 logger.MessageLogged += MessageLogged;
75 ClearMessagesCommand =
new AsyncCommand(serviceProvider, ClearMessages);
87 public IReadOnlyObservableCollection<ILogMessage> Messages {
get {
return messages; } }
94 public int UpdateInterval {
get {
return updateInterval; } set { SetValue(ref updateInterval, value); } }
99 public bool HasWarnings {
get;
private set; }
104 public bool HasErrors {
get;
private set; }
133 Loggers.Add(logger,
new List<ILogMessage>());
134 logger.MessageLogged += MessageLogged;
143 Loggers.Remove(logger);
144 logger.MessageLogged -= MessageLogged;
152 foreach (var logger
in Loggers)
154 logger.Key.MessageLogged -= MessageLogged;
166 var interval = updateInterval;
168 Dispatcher.Invoke(UpdateMessages);
169 updateInterval = interval;
178 foreach (var logger
in Loggers)
180 logger.Value.Clear();
189 List<ILogMessage> messagesToRemove;
190 if (Loggers.TryGetValue(logger, out messagesToRemove))
192 foreach (var messageToRemove
in messagesToRemove)
194 messages.Remove(messageToRemove);
206 lock (pendingMessages)
208 pendingMessages.Add(Tuple.Create((
Logger)sender, args.
Message));
211 updatePending =
true;
212 Dispatcher.InvokeAsync(UpdateMessages);
220 private async
void UpdateMessages()
222 if (UpdateInterval >= 0)
224 await Task.Delay(UpdateInterval);
226 List<Tuple<Logger, ILogMessage>> messagesToAdd = null;
227 lock (pendingMessages)
229 if (pendingMessages.Count > 0)
231 messagesToAdd = pendingMessages.ToList();
232 pendingMessages.Clear();
234 updatePending =
false;
236 if (messagesToAdd != null)
238 foreach (var messageToAdd
in messagesToAdd)
240 messages.Add(messageToAdd.Item2);
241 List<ILogMessage> logger;
242 if (Loggers.TryGetValue(messageToAdd.Item1, out logger))
244 logger.Add(messageToAdd.Item2);
253 private void MessagesCollectionChanged(
object sender, NotifyCollectionChangedEventArgs e)
255 if (e.Action == NotifyCollectionChangedAction.Add)
257 if (e.NewItems != null)
261 switch (newMessage.
Type)
263 case LogMessageType.Warning:
266 case LogMessageType.Error:
267 case LogMessageType.Fatal:
276 HasWarnings = messages.Any(x => x.Type == LogMessageType.Warning);
277 HasErrors = messages.Any(x => x.Type == LogMessageType.Error || x.Type == LogMessageType.Fatal);
LoggerViewModel(IViewModelServiceProvider serviceProvider, IEnumerable< Logger > loggers)
Initializes a new instance of the LoggerViewModel class with multiple loggers.
void ClearMessages()
Clears the Messages collection.
An implementation of CommandBase that route Execute calls to a given anonymous method.
An interface representing an implementation of ICommand with additional properties.
void ClearMessages(Logger logger)
Removes messages that comes from the given logger from the Messages collection.
virtual void RemoveLogger(Logger logger)
Removes a Logger from monitoring.
A service provider class for view model objects.
Base implementation for ILogger.
A view model that monitors messages from one or several loggers and update an observable collection o...
Arguments of the Logger.MessageLogged event.
This abstract class is an implementation of ViewModelBase that uses a dispatcher to invoke OnProperty...
LoggerViewModel(IViewModelServiceProvider serviceProvider, Logger logger)
Initializes a new instance of the LoggerViewModel class with a single logger.
The base interface for log messages used by the logging infrastructure.
LogMessageType Type
Gets or sets the type of this message.
void Flush()
Flushes the pending log messages to add them immediately in the view model.
virtual void AddLogger(Logger logger)
Adds a Logger to monitor.
LoggerViewModel(IViewModelServiceProvider serviceProvider)
Initializes a new instance of the LoggerViewModel class.
virtual void ClearLoggers()
Removes all loggers from monitoring.
ILogMessage Message
Gets the message that has been logged.