using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using Tango.Core.Helpers;
using Tango.BL.Entities;
using Tango.Logging;
using Tango.MachineStudio.UI.Windows;
using Tango.Settings;
using Tango.MachineStudio.Common.EventLogging;
using Tango.BL.Enumerations;
using Tango.Core.DI;
using Tango.MachineStudio.UI.TFS;
using Tango.TFS;
using Tango.MachineStudio.Common.Notifications;
using Tango.MachineStudio.UI.ViewModels;
using Tango.MachineStudio.UI.Views;
using Tango.MachineStudio.Common;
namespace Tango.MachineStudio.UI
{
///
/// Interaction logic for App.xaml
///
public partial class App : Application
{
private WpfGlobalExceptionTrapper exceptionTrapper;
private LogManager LogManager = LogManager.Default;
protected override void OnStartup(StartupEventArgs e)
{
LogManager.RegisterLogger(new VSOutputLogger());
LogManager.RegisterLogger(new FileLogger());
LogManager.Log("Application Started...");
base.OnStartup(e);
LogManager.Categories.Clear();
var settings = SettingsManager.Default.GetOrCreate();
if (settings.LoggingCategories.Count == 0)
{
settings.LoggingCategories.Add(LogCategory.Critical);
settings.LoggingCategories.Add(LogCategory.Error);
settings.LoggingCategories.Add(LogCategory.Info);
settings.LoggingCategories.Add(LogCategory.Warning);
}
LogManager.Categories.AddRange(settings.LoggingCategories);
exceptionTrapper = new WpfGlobalExceptionTrapper();
exceptionTrapper.Initialize(this);
exceptionTrapper.ApplicationCrashed += ExceptionTrapper_ApplicationCrashed;
}
#region Global Exception Trapping
///
/// Handles the ApplicationCrashed event of the ExceptionTrapper.
///
/// The source of the event.
/// The instance containing the event data.
private void ExceptionTrapper_ApplicationCrashed(object sender, ApplicationCrashedEventArgs e)
{
try
{
if (Application.Current == null)
{
new Application { ShutdownMode = ShutdownMode.OnExplicitShutdown };
}
}
catch { }
try
{
var eventLogger = TangoIOC.Default.GetInstance();
if (eventLogger != null)
{
eventLogger.Log(e.Exception, "Application Crashed!");
}
}
catch { }
Application.Current.Dispatcher.Invoke(() =>
{
WorkItem bug = null;
TeamFoundationServiceExtendedClient tfsClient = null;
INotificationProvider notification = null;
try
{
tfsClient = TangoIOC.Default.GetInstance();
notification = TangoIOC.Default.GetInstance();
if (tfsClient != null && tfsClient.IsInitialized)
{
bug = tfsClient.CreateBug();
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.ToString());
}
ExceptionWindow exWin = new ExceptionWindow(e.Exception, bug != null);
exWin.ShowDialog();
switch (exWin.Resolution)
{
case ExceptionResolutions.Ignore:
e.TryRecover = true;
break;
case ExceptionResolutions.Restart:
e.TryRecover = false;
LogManager.Log("User selection was to restart the application. Restarting...");
Process.Start(Application.ResourceAssembly.Location);
Environment.Exit(0);
break;
case ExceptionResolutions.Shutdown:
e.TryRecover = false;
LogManager.Log("User selection was to shutdown the application. Restarting...");
Environment.Exit(0);
break;
case ExceptionResolutions.Report:
e.TryRecover = true;
LogManager.Log("User selection was to report the issue.");
if (bug != null)
{
notification.ShowModalDialog(new ReportIssueViewVM(tfsClient.Project, bug), async (vm) =>
{
using (notification.PushTaskItem("Uploading bug report..."))
{
try
{
tfsClient.FinalizeBug(vm.WorkItem);
await tfsClient.UploadWorkItem(vm.WorkItem);
}
catch (Exception ex)
{
notification.ShowError("An error occurred while trying to create the issue." + Environment.NewLine + ex.Message);
}
}
}, null);
}
break;
}
});
}
#endregion
}
}