// --------------------------------------------------------------------------------------------------------------------
//
// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.
//
//
// Defines the LogViewModel type.
//
// --------------------------------------------------------------------------------------------------------------------
namespace HandBrakeWPF.ViewModels
{
using System;
using System.Diagnostics;
using System.Text;
using System.Windows;
using Caliburn.Micro;
using HandBrakeWPF.Properties;
using HandBrakeWPF.Services.Interfaces;
using HandBrakeWPF.Utilities;
using HandBrakeWPF.ViewModels.Interfaces;
using ILog = HandBrakeWPF.Services.Logging.Interfaces.ILog;
using LogEventArgs = HandBrakeWPF.Services.Logging.EventArgs.LogEventArgs;
using LogMessage = HandBrakeWPF.Services.Logging.Model.LogMessage;
using LogService = HandBrakeWPF.Services.Logging.LogService;
///
/// The Log View Model
///
public class LogViewModel : ViewModelBase, ILogViewModel
{
private readonly IErrorService errorService;
#region Private Fields
private readonly ILog logService;
private StringBuilder log = new StringBuilder();
private long lastReadIndex;
#endregion
///
/// Initializes a new instance of the class.
///
public LogViewModel(IErrorService errorService)
{
this.errorService = errorService;
this.logService = LogService.GetLogger();
this.Title = Resources.LogViewModel_Title;
}
///
/// Gets Log.
///
public string ActivityLog
{
get
{
return this.log.ToString();
}
}
///
/// The log message received.
///
public event EventHandler LogMessageReceived;
///
/// Open the Log file directory
///
public void OpenLogDirectory()
{
string logDir = DirectoryUtilities.GetLogDirectory();
string windir = Environment.GetEnvironmentVariable("WINDIR");
Process prc = new Process { StartInfo = { FileName = windir + @"\explorer.exe", Arguments = logDir } };
prc.Start();
}
///
/// Copy the log file to the system clipboard
///
public void CopyLog()
{
try
{
Clipboard.SetDataObject(this.ActivityLog, true);
}
catch (Exception exc)
{
this.errorService.ShowError(Resources.Clipboard_Unavailable, Resources.Clipboard_Unavailable_Solution, exc);
}
}
///
/// Handle the OnActivate Caliburn Event
///
protected override void OnActivate()
{
this.logService.MessageLogged += this.LogService_MessageLogged;
this.logService.LogReset += LogService_LogReset;
// Refresh the Log Display
this.log.Clear();
foreach (LogMessage logMessage in this.logService.LogMessages)
{
this.log.AppendLine(logMessage.Content);
this.lastReadIndex = logMessage.MessageIndex;
if (this.lastReadIndex > logMessage.MessageIndex)
{
throw new Exception("Log Message Index Error");
}
}
this.OnLogMessageReceived(null);
this.NotifyOfPropertyChange(() => this.ActivityLog);
base.OnActivate();
}
///
/// Trigger a faster / smoother way of updating the log window.
///
///
/// The e.
///
protected virtual void OnLogMessageReceived(LogEventArgs e)
{
var onLogMessageReceived = this.LogMessageReceived;
if (onLogMessageReceived != null)
{
onLogMessageReceived.Invoke(this, e);
}
}
///
/// Handle the OnDeactivate Caliburn Event
///
///
/// The close.
///
protected override void OnDeactivate(bool close)
{
this.logService.MessageLogged -= this.LogService_MessageLogged;
this.logService.LogReset -= this.LogService_LogReset;
base.OnDeactivate(close);
}
///
/// The log service_ log reset.
///
///
/// The sender.
///
///
/// The e.
///
private void LogService_LogReset(object sender, EventArgs e)
{
this.log.Clear();
this.lastReadIndex = 0;
foreach (LogMessage logMessage in this.logService.LogMessages)
{
this.log.AppendLine(logMessage.Content);
this.lastReadIndex = logMessage.MessageIndex;
if (this.lastReadIndex > logMessage.MessageIndex)
{
throw new Exception("Log Message Index Error");
}
}
this.NotifyOfPropertyChange(() => this.ActivityLog);
this.OnLogMessageReceived(null);
}
///
/// The log service_ message logged.
///
///
/// The sender.
///
///
/// The e.
///
private void LogService_MessageLogged(object sender, LogEventArgs e)
{
if (this.lastReadIndex < e.Log.MessageIndex)
{
Execute.OnUIThreadAsync(() =>
{
this.lastReadIndex = e.Log.MessageIndex;
this.log.AppendLine(e.Log.Content);
this.OnLogMessageReceived(e);
this.NotifyOfPropertyChange(() => this.ActivityLog);
});
}
}
}
}