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.BL.Enumerations; using Tango.Core.Commands; using Tango.Core.DI; using Tango.FSE.Common; using Tango.FSE.Common.Connection; using Tango.FSE.Common.Dialogs; using Tango.FSE.Common.Helpers; using Tango.Integration.Logging; using Tango.Logging; using Tango.SharedUI.Components; namespace Tango.FSE.UI.Panes { /// /// Represents the log viewer pane view model. /// /// public class LogViewerPaneVM : FSEViewModel { private List _pausedFSELogs; private List _pausedApplicationLogs; private List _pausedFirmwareLogs; private const int MAX_LOGS = 100000; //100,000 /// /// Gets a value indicating whether the current user has FSE logs permission. /// public bool HasFSELogsPermission { get { return CurrentUser != null && CurrentUser.HasPermission(Permissions.FSE_ViewFSELogs); } } /// /// Gets or sets the FSE logs. /// public ObservableCollection FSELogs { get; set; } /// /// Gets or sets the application logs. /// public ObservableCollection ApplicationLogs { get; set; } /// /// Gets or sets the firmware logs. /// public ObservableCollection FirmwareLogs { get; set; } /// /// Gets or sets the FSE logs view. /// public ICollectionView FSELogsView { get; set; } /// /// Gets or sets the application logs view. /// public ICollectionView ApplicationLogsView { get; set; } /// /// Gets or sets the firmware logs view. /// public ICollectionView FirmwareLogsView { get; set; } /// /// Gets or sets the selected FSE logs categories. /// public SelectedObjectCollection SelectedFSELogsCategories { get; set; } /// /// Gets or sets the selected application logs categories. /// public SelectedObjectCollection SelectedApplicationLogsCategories { get; set; } /// /// Gets or sets the selected firmware logs categories. /// public SelectedObjectCollection SelectedFirmwareLogsCategories { get; set; } /// /// Gets or sets a value indicating whether to pause the insertion of FSE logs. /// public bool FSELogsPaused { get; set; } /// /// Gets or sets a value indicating whether to pause the insertion of application logs. /// public bool ApplicationLogsPaused { get; set; } /// /// Gets or sets a value indicating whether to pause the insertion of firmware logs. /// public bool FirmwareLogsPaused { get; set; } private String _fseLogsFilter; /// /// Gets or sets the application logs filter. /// public String FSELogsFilter { get { return _fseLogsFilter; } set { _fseLogsFilter = value; RaisePropertyChangedAuto(); FSELogsView.Refresh(); } } private String _applicationLogsFilter; /// /// Gets or sets the application logs filter. /// public String ApplicationLogsFilter { get { return _applicationLogsFilter; } set { _applicationLogsFilter = value; RaisePropertyChangedAuto(); ApplicationLogsView.Refresh(); } } private String _firmwareLogsFilter; /// /// Gets or sets the firmware logs filter. /// public String FirmwareLogsFilter { get { return _firmwareLogsFilter; } set { _firmwareLogsFilter = value; RaisePropertyChangedAuto(); FirmwareLogsView.Refresh(); } } /// /// Clears the FSE logs. /// public RelayCommand ClearFSELogsCommand { get; set; } /// /// Clears the application logs. /// public RelayCommand ClearApplicationLogsCommand { get; set; } /// /// Clears the firmware logs. /// public RelayCommand ClearFirmwareLogsCommand { get; set; } /// /// Opens the detailed FSE log dialog. /// public RelayCommand OpenFSELogItemCommand { get; set; } /// /// Opens the detailed application log dialog. /// public RelayCommand OpenApplicationLogItemCommand { get; set; } /// /// Opens the detailed firmware log dialog. /// public RelayCommand OpenFirmareLogItemCommand { get; set; } /// /// Initializes a new instance of the class. /// public LogViewerPaneVM() { _pausedFSELogs = new List(); _pausedApplicationLogs = new List(); _pausedFirmwareLogs = new List(); FSELogs = new ObservableCollection(); ApplicationLogs = new ObservableCollection(); FirmwareLogs = new ObservableCollection(); FSELogsView = CollectionViewSource.GetDefaultView(FSELogs); ApplicationLogsView = CollectionViewSource.GetDefaultView(ApplicationLogs); FirmwareLogsView = CollectionViewSource.GetDefaultView(FirmwareLogs); FSELogsView.Filter = (log) => FilterLogsFunc(log as LogItemBase, FSELogsFilter); ApplicationLogsView.Filter = (log) => FilterLogsFunc(log as LogItemBase, ApplicationLogsFilter); FirmwareLogsView.Filter = (log) => FilterLogsFunc(log as LogItemBase, FirmwareLogsFilter); SelectedFSELogsCategories = new SelectedObjectCollection(new ObservableCollection() { LogCategory.Info, LogCategory.Warning, LogCategory.Error, LogCategory.Critical, }, new ObservableCollection() { LogCategory.Info, LogCategory.Warning, LogCategory.Error, LogCategory.Critical, }); SelectedApplicationLogsCategories = new SelectedObjectCollection(new ObservableCollection() { LogCategory.Info, LogCategory.Warning, LogCategory.Error, LogCategory.Critical, }, new ObservableCollection() { LogCategory.Info, LogCategory.Warning, LogCategory.Error, LogCategory.Critical, }); SelectedFirmwareLogsCategories = new SelectedObjectCollection(new ObservableCollection() { LogCategory.Info, LogCategory.Warning, LogCategory.Error, LogCategory.Critical, LogCategory.Debug, }, new ObservableCollection() { LogCategory.Info, LogCategory.Warning, LogCategory.Error, LogCategory.Critical, LogCategory.Debug, }); SelectedFSELogsCategories.SynchedSource.CollectionChanged += (_, __) => FSELogsView?.Refresh(); SelectedApplicationLogsCategories.SynchedSource.CollectionChanged += (_, __) => ApplicationLogsView?.Refresh(); SelectedFirmwareLogsCategories.SynchedSource.CollectionChanged += (_, __) => FirmwareLogsView?.Refresh(); ClearFSELogsCommand = new RelayCommand(ClearFSELogs); ClearApplicationLogsCommand = new RelayCommand(ClearApplicationLogs); ClearFirmwareLogsCommand = new RelayCommand(ClearFirmwareLogs); TangoIOC.Default.Inject(this); var appStartLogs = LogsHelper.GetLogSafe().EmptyAndDispose(); foreach (var log in appStartLogs) { FSELogs.Insert(0, log); } LoggingProvider.FSELogAvailable += LoggingProvider_FSELogAvailable; LoggingProvider.ApplicationLogAvailable += LoggingProvider_ApplicationLogAvailable; LoggingProvider.FirmwareLogAvailable += LoggingProvider_FirmwareLogAvailable; OpenFSELogItemCommand = new RelayCommand(OpenFSELogItem); OpenApplicationLogItemCommand = new RelayCommand(OpenApplicationLogItem); OpenFirmareLogItemCommand = new RelayCommand(OpenFirmwareLogItem); MachineProvider.MachineConnected += MachineProvider_MachineConnected; AuthenticationProvider.CurrentUserChanged += AuthenticationProvider_CurrentUserChanged; } private void AuthenticationProvider_CurrentUserChanged(object sender, Tango.BL.Entities.User e) { RaisePropertyChanged(nameof(HasFSELogsPermission)); } private void MachineProvider_MachineConnected(object sender, MachineConnectedEventArgs e) { if (e.DifferentFromPrevious) { InvokeUI(() => { ClearApplicationLogs(); ClearFirmwareLogs(); }); } } private async void OpenFSELogItem(LogItemBase logItem) { await NotificationProvider.ShowDialog(new ApplicationLogItemViewVM() { LogItem = logItem }); } private async void OpenApplicationLogItem(LogItemBase logItem) { await NotificationProvider.ShowDialog(new ApplicationLogItemViewVM() { LogItem = logItem }); } private async void OpenFirmwareLogItem(EmbeddedLogItem logItem) { await NotificationProvider.ShowDialog(new FirmwareLogItemViewVM() { LogItem = logItem }); } private bool FilterLogsFunc(LogItemBase log, String filter) { if (log != null) { bool includeLog = false; if (String.IsNullOrWhiteSpace(filter)) return true; if (filter.Contains("|")) { List keywords = filter.Split('|').ToList(); if (keywords.Any(x => log.Category.ToString().ToLower() == x.ToLower())) { includeLog = true; } } else { if (log.Category.ToString().ToLower() == filter.ToLower()) { includeLog = true; } } if (log.TimeStamp.ToString("HH:mm:ss").Contains(filter)) { includeLog = true; } if (log.ClassName.ToLower() == filter.ToLower()) { includeLog = true; } if (log.Message.ToLower().Contains(filter.ToLower())) { includeLog = true; } return includeLog; } else { return false; } } private void ClearFSELogs() { _pausedFSELogs.Clear(); FSELogs.Clear(); } private void ClearApplicationLogs() { _pausedApplicationLogs.Clear(); ApplicationLogs.Clear(); } private void ClearFirmwareLogs() { _pausedFirmwareLogs.Clear(); FirmwareLogs.Clear(); } private void LoggingProvider_FSELogAvailable(object sender, LogItemBase logItem) { if (FSELogsPaused) { _pausedFSELogs.Add(logItem); } else { InvokeUI(() => { if (_pausedFSELogs.Count > 0) { foreach (var pausedItem in _pausedFSELogs) { InsertFSELog(pausedItem); } _pausedFSELogs.Clear(); } InsertFSELog(logItem); }); } } private void InsertFSELog(LogItemBase log) { FSELogs.Insert(0, log); if (FSELogs.Count > MAX_LOGS) { FSELogs.RemoveAt(FSELogs.Count - 1); } } private void LoggingProvider_ApplicationLogAvailable(object sender, LogItemBase logItem) { if (ApplicationLogsPaused) { _pausedApplicationLogs.Add(logItem); } else { InvokeUI(() => { if (_pausedApplicationLogs.Count > 0) { foreach (var pausedItem in _pausedApplicationLogs) { InsertApplicationLog(pausedItem); } _pausedApplicationLogs.Clear(); } InsertApplicationLog(logItem); }); } } private void InsertApplicationLog(LogItemBase log) { ApplicationLogs.Insert(0, log); if (ApplicationLogs.Count > MAX_LOGS) { ApplicationLogs.RemoveAt(ApplicationLogs.Count - 1); } } private void LoggingProvider_FirmwareLogAvailable(object sender, EmbeddedLogItem logItem) { if (FirmwareLogsPaused) { _pausedFirmwareLogs.Add(logItem); } else { InvokeUI(() => { if (_pausedFirmwareLogs.Count > 0) { foreach (var pausedItem in _pausedFirmwareLogs) { InsertFirmwareLog(pausedItem); } _pausedFirmwareLogs.Clear(); } InsertFirmwareLog(logItem); }); } } private void InsertFirmwareLog(EmbeddedLogItem log) { FirmwareLogs.Insert(0, log); if (FirmwareLogs.Count > MAX_LOGS) { FirmwareLogs.RemoveAt(FirmwareLogs.Count - 1); } } } }