using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Tango.Protobuf.Compilers
{
///
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.Core.Commands;
using Tango.Integration.Logging;
using Tango.Integration.Operation;
using Tango.Logging;
using Tango.MachineStudio.Common.Notifications;
using Tango.MachineStudio.Common.StudioApplication;
using Tango.MachineStudio.Logging.Navigation;
using Tango.MachineStudio.Logging.Views;
using Tango.SharedUI;
namespace Tango.MachineStudio.Logging.ViewModels
{
public class EmbeddedLogsViewVM : ViewModel
{
private EmbeddedLogFileParser _parser;
private List<LogFile> _logFiles;
private INotificationProvider _notification;
private bool _dialog_shown;
private ControlledObservableCollection<LogItemBase> _realTimeLogs;
private List<LogItemBase> _pausedLogs;
private ControlledObservableCollection<LogItemBase> _logs;
public ControlledObservableCollection<LogItemBase> Logs
{
get { return _logs; }
set { _logs = value; RaisePropertyChangedAuto(); }
}
private LogItemBase _selectedLog;
public LogItemBase SelectedLog
{
get { return _selectedLog; }
set { _selectedLog = value; RaisePropertyChangedAuto(); OnSelectedLogChanged(); }
}
private ObservableCollection<DateTime> _dates;
public ObservableCollection<DateTime> Dates
{
get { return _dates; }
set { _dates = value; RaisePropertyChangedAuto(); }
}
private DateTime _selectedDate;
public DateTime SelectedDate
{
get { return _selectedDate; }
set { _selectedDate = value; RaisePropertyChangedAuto(); OnSelectedDateChanged(); }
}
private DateTime _minDate;
public DateTime MinDate
{
get { return _minDate; }
set { _minDate = value; RaisePropertyChangedAuto(); }
}
private DateTime _maxDate;
public DateTime MaxDate
{
get { return _maxDate; }
set { _maxDate = value; RaisePropertyChangedAuto(); }
}
private bool _isRealTime;
public bool IsRealTime
{
get { return _isRealTime; }
set { _isRealTime = value; RaisePropertyChangedAuto(); OnSelectedDateChanged(); }
}
private bool _realTimePaused;
public bool RealTimePaused
{
get { return _realTimePaused; }
set
{
_realTimePaused = value;
RaisePropertyChangedAuto();
if (!_realTimePaused)
{
_realTimeLogs.InsertRange(0, _pausedLogs);
_pausedLogs.Clear();
}
}
}
public RelayCommand NavigateToHomeCommand { get; set; }
public RelayCommand ToggleRealTimePaused { get; set; }
public RelayCommand ClearRealTimeLogsCommand { get; set; }
public EmbeddedLogsViewVM(LoggingNavigationManager navigation, IStudioApplicationManager application, INotificationProvider notification)
{
_notification = notification;
NavigateToHomeCommand = new RelayCommand(() => navigation.NavigateTo(LoggingNavigationView.HomeView));
_parser = new EmbeddedLogFileParser();
_logFiles = _parser.GetLogFiles();
Dates = new ObservableCollection<DateTime>(_logFiles.Select(x => x.DateTime).OrderBy(x => x));
_realTimeLogs = new ControlledObservableCollection<LogItemBase>();
_pausedLogs = new List<LogItemBase>();
IsRealTime = true;
RealTimePaused = true;
SelectedDate = Dates.LastOrDefault();
if (Dates.Count > 0)
{
MinDate = Dates.Min();
MaxDate = Dates.Max();
}
MachineOperator.EmbeddedLogManager.NewLog += EmbeddedLogManager_NewLog;
ToggleRealTimePaused = new RelayCommand(() => RealTimePaused = !RealTimePaused);
ClearRealTimeLogsCommand = new RelayCommand(() => { _realTimeLogs.Clear(); });
}
private void EmbeddedLogManager_NewLog(object sender, LogItemBase log)
{
if (!RealTimePaused)
{
InvokeUI(() =>
{
_realTimeLogs.Insert(0, log);
});
}
else
{
_pausedLogs.Add(log);
}
}
private async void OnSelectedDateChanged()
{
if (IsRealTime)
{
Logs = _realTimeLogs;
}
else
{
List<LogItemBase> logs = new List<LogItemBase>();
using (_notification.PushTaskItem("Loading embedded device logs..."))
{
await Task.Factory.StartNew(() =>
{
foreach (var logFile in _logFiles.Where(x => x.DateTime.Date == SelectedDate.Date))
{
logs.AddRange(_parser.Parse(logFile));
}
});
}
Logs = new ControlledObservableCollection<LogItemBase>(logs);
}
}
private void OnSelectedLogChanged()
{
if (SelectedLog != null && !_dialog_shown)
{
_dialog_shown = true;
_notification.ShowModalDialog<LogDetailsViewVM, EmbeddedLogDetailsView>(new LogDetailsViewVM(SelectedLog), (x) =>
{
}, () =>
{
_dialog_shown = false;
});
}
}
}
}