using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Data; using Tango.Core; using Tango.Core.Commands; using Tango.Logging; using Tango.PPC.Common; using Tango.PPC.Technician.Dialogs; namespace Tango.PPC.Technician.ViewModels { public class LoggingViewVM : PPCViewModel { private const int MAX_LOGS = 1000; private List paused_logs; public SynchronizedObservableCollection ApplicationLogs { get; set; } public SynchronizedObservableCollection EmbeddedLogs { get; set; } private LogItemBase _selectedLog; public LogItemBase SelectedLog { get { return _selectedLog; } set { _selectedLog = value; RaisePropertyChangedAuto(); OnSelectedLogChanged(); } } private ICollectionView _applicationLogsViewSource; public ICollectionView ApplicationLogsViewSource { get { return _applicationLogsViewSource; } set { _applicationLogsViewSource = value; RaisePropertyChangedAuto(); } } private String _filter; public String Filter { get { return _filter; } set { _filter = value; RaisePropertyChangedAuto(); ApplicationLogsViewSource.Refresh(); } } private bool _isPaused; public bool IsPaused { get { return _isPaused; } set { _isPaused = value; RaisePropertyChangedAuto(); OnIsPausedChanged(); } } public RelayCommand ClearCommand { get; set; } public LoggingViewVM() { ApplicationLogs = new SynchronizedObservableCollection(); EmbeddedLogs = new SynchronizedObservableCollection(); ApplicationLogsViewSource = CollectionViewSource.GetDefaultView(ApplicationLogs); paused_logs = new List(); LogManager.NewLog += LogManager_NewLog; ClearCommand = new RelayCommand(ClearLogs); Filter = "error"; ApplicationLogsViewSource.Filter = (x) => { try { LogItemBase log = x as LogItemBase; return String.IsNullOrWhiteSpace(Filter) || log.Category.ToString().ToLower().Contains(Filter.ToLower()) || log.Message.ToLower().Contains(Filter.ToLower()); } catch { return false; } }; } private void OnIsPausedChanged() { foreach (var log in paused_logs) { LogManager_NewLog(this, log); } paused_logs.Clear(); } private void LogManager_NewLog(object sender, LogItemBase log) { if (!IsPaused) { InvokeUI(() => { ApplicationLogs.Insert(0, log); try { if (ApplicationLogs.Count > MAX_LOGS) { ApplicationLogs.Remove(ApplicationLogs.Last()); } } catch { //I don't know if this will cause an exception but I'm tired. } }); } else { paused_logs.Add(log); } } private void ClearLogs() { ApplicationLogs.Clear(); paused_logs.Clear(); } private async void OnSelectedLogChanged() { if (SelectedLog != null) { await NotificationProvider.ShowDialog(new LogItemDetailsViewVM() { Log = SelectedLog, }); SelectedLog = null; } } public override void OnApplicationStarted() { } } }