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.Integration.Logging; using Tango.Integration.Operation; using Tango.Logging; using Tango.PPC.Common; using Tango.PPC.Common.Helpers; using Tango.PPC.Technician.Dialogs; namespace Tango.PPC.Technician.ViewModels { public class LoggingViewVM : PPCViewModel { private const int MAX_LOGS = 1000; private List paused_logs; private List paused_embedded_logs; public SynchronizedObservableCollection ApplicationLogs { get; set; } public SynchronizedObservableCollection EmbeddedLogs { get; set; } private ICollectionView _applicationLogsViewSource; public ICollectionView ApplicationLogsViewSource { get { return _applicationLogsViewSource; } set { _applicationLogsViewSource = value; RaisePropertyChangedAuto(); } } private ICollectionView _embeddedLogsViewSource; public ICollectionView EmbeddedLogsViewSource { get { return _embeddedLogsViewSource; } set { _embeddedLogsViewSource = value; RaisePropertyChangedAuto(); } } private LogItemBase _selectedLog; public LogItemBase SelectedLog { get { return _selectedLog; } set { _selectedLog = value; RaisePropertyChangedAuto(); OnSelectedLogChanged(); } } private String _filter; public String Filter { get { return _filter; } set { _filter = value; RaisePropertyChangedAuto(); ApplicationLogsViewSource.Refresh(); EmbeddedLogsViewSource.Refresh(); } } private bool _isPaused; public bool IsPaused { get { return _isPaused; } set { _isPaused = value; RaisePropertyChangedAuto(); OnIsPausedChanged(); } } private bool _processDebugLogs; public bool ProcessDebugLogs { get { return _processDebugLogs; } set { _processDebugLogs = value; RaisePropertyChangedAuto(); OnProcessDebugLogsChanged(); } } public RelayCommand ClearCommand { get; set; } public LoggingViewVM() { ApplicationLogs = new SynchronizedObservableCollection(); EmbeddedLogs = new SynchronizedObservableCollection(); ApplicationLogsViewSource = CollectionViewSource.GetDefaultView(ApplicationLogs); EmbeddedLogsViewSource = CollectionViewSource.GetDefaultView(EmbeddedLogs); paused_logs = new List(); paused_embedded_logs = new List(); var appStartLogs = LogsHelper.GetLogSafe().EmptyAndDispose(); foreach (var log in appStartLogs) { ApplicationLogs.Insert(0, log); } LogManager.NewLog += LogManager_NewLog; MachineOperator.EmbeddedLogManager.NewLog += EmbeddedLogManager_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; } }; EmbeddedLogsViewSource.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 OnProcessDebugLogsChanged() { if (ProcessDebugLogs) { LogManager.Categories.Add(LogCategory.Debug); } else { LogManager.Categories.RemoveAll(x => x == LogCategory.Debug); } } private void OnIsPausedChanged() { foreach (var log in paused_logs) { LogManager_NewLog(this, log); } paused_logs.Clear(); foreach (var log in paused_embedded_logs) { EmbeddedLogManager_NewLog(this, log); } paused_embedded_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 EmbeddedLogManager_NewLog(object sender, LogItemBase log) { if (!IsPaused) { InvokeUI(() => { EmbeddedLogs.Insert(0, log); try { if (EmbeddedLogs.Count > MAX_LOGS) { EmbeddedLogs.Remove(EmbeddedLogs.Last()); } } catch { //I don't know if this will cause an exception but I'm tired. } }); } else { paused_embedded_logs.Add(log); } } private void ClearLogs() { ApplicationLogs.Clear(); EmbeddedLogs.Clear(); paused_logs.Clear(); paused_embedded_logs.Clear(); } private async void OnSelectedLogChanged() { if (SelectedLog != null) { if (SelectedLog.GetType() == typeof(EmbeddedLogItem)) { await NotificationProvider.ShowDialog(new EmbeddedLogItemDetailsViewVM() { Log = SelectedLog as EmbeddedLogItem, }); } else { await NotificationProvider.ShowDialog(new LogItemDetailsViewVM() { Log = SelectedLog, }); } } } public override void OnApplicationStarted() { } } }