|  | @@ -159,6 +159,7 @@ public partial class MainWindow : IPanelHostControl
 | 
	
		
			
				|  |  |          HotKeyManager.RegisterHotKey(Key.F6, ShowRecordingNotes);
 | 
	
		
			
				|  |  |          HotKeyManager.RegisterHotKey(Key.F4, ToggleRecordingAudio);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        Logger.Send(LogType.Information, "", "Connecting to server");
 | 
	
		
			
				|  |  |          var settings = App.DatabaseSettings;
 | 
	
		
			
				|  |  |          bool dbConnected;
 | 
	
		
			
				|  |  |          DatabaseType = settings.DatabaseType;
 | 
	
	
		
			
				|  | @@ -250,6 +251,8 @@ public partial class MainWindow : IPanelHostControl
 | 
	
		
			
				|  |  |          ConsoleStatus.Source = PRSDesktop.Resources.view.AsGrayScale().AsBitmapImage();
 | 
	
		
			
				|  |  |          SelectTask.Source = PRSDesktop.Resources.uparrow.Invert().AsBitmapImage();
 | 
	
		
			
				|  |  |          Title = $"{(String.Equals(App.Profile?.ToUpper(), "DEFAULT") ? "PRS Desktop" : App.Profile)} (Release {CoreUtils.GetVersion()})";
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        Logger.Send(LogType.Information, "", "Checking for updates");
 | 
	
		
			
				|  |  |          CheckForUpdates();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          Exception? startupException = null;
 | 
	
	
		
			
				|  | @@ -284,13 +287,16 @@ public partial class MainWindow : IPanelHostControl
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              var tasks = new List<Task>
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                Task.Run(() => CoreUtils.RegisterClasses(typeof(TaskGrid).Assembly)),
 | 
	
		
			
				|  |  | -                Task.Run(() => CoreUtils.RegisterClasses()),
 | 
	
		
			
				|  |  | -                Task.Run(() => ComalUtils.RegisterClasses()),
 | 
	
		
			
				|  |  | -                Task.Run(() => PRSSharedUtils.RegisterClasses()),
 | 
	
		
			
				|  |  | -                Task.Run(() => ReportUtils.RegisterClasses()),
 | 
	
		
			
				|  |  | -                Task.Run(() => ConfigurationUtils.RegisterClasses()),
 | 
	
		
			
				|  |  | -                Task.Run(() => DynamicGridUtils.RegisterClasses()),
 | 
	
		
			
				|  |  | +                Task.Run(() =>
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    CoreUtils.RegisterClasses(typeof(TaskGrid).Assembly);
 | 
	
		
			
				|  |  | +                    CoreUtils.RegisterClasses();
 | 
	
		
			
				|  |  | +                    ComalUtils.RegisterClasses();
 | 
	
		
			
				|  |  | +                    PRSSharedUtils.RegisterClasses();
 | 
	
		
			
				|  |  | +                    ReportUtils.RegisterClasses();
 | 
	
		
			
				|  |  | +                    ConfigurationUtils.RegisterClasses();
 | 
	
		
			
				|  |  | +                    DynamicGridUtils.RegisterClasses();
 | 
	
		
			
				|  |  | +                }),
 | 
	
		
			
				|  |  |                  Task.Run(() =>
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  |                      ScriptDocument.DefaultAssemblies.AddRange(
 | 
	
	
		
			
				|  | @@ -306,6 +312,8 @@ public partial class MainWindow : IPanelHostControl
 | 
	
		
			
				|  |  |              };
 | 
	
		
			
				|  |  |              Task.WaitAll(tasks.ToArray());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +            Logger.Send(LogType.Information, "", "Configuring Application");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              progress.Report("Configuring Application");
 | 
	
		
			
				|  |  |              RegisterModules(progress);
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -328,28 +336,45 @@ public partial class MainWindow : IPanelHostControl
 | 
	
		
			
				|  |  |                      );
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            if (startupException is null && App.DatabaseSettings.Autologin)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                Logger.Send(LogType.Information, "", "Logging in");
 | 
	
		
			
				|  |  | +                progress.Report("Logging in");
 | 
	
		
			
				|  |  | +                loginStatus = TryAutoLogin();
 | 
	
		
			
				|  |  | +                if(loginStatus == ValidationStatus.VALID)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    // Do the AfterLogin() here so that we aren't opening and closing progress windows again and again.
 | 
	
		
			
				|  |  | +                    AfterLogin(progress);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          if (startupException != null)
 | 
	
		
			
				|  |  | -            MessageBox.Show(startupException.Message);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        if (DoLogin(App.DatabaseSettings.Autologin) == ValidationStatus.VALID)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            AfterLogin();
 | 
	
		
			
				|  |  | +            MessageWindow.ShowError("Error during startup.", startupException);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        // If the login status is valid, then we've already loaded everything, so we don't here.
 | 
	
		
			
				|  |  | +        if(loginStatus != ValidationStatus.VALID)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            Logger.Send(LogType.Information, "", "Logging in");
 | 
	
		
			
				|  |  | +            if (DoLogin() == ValidationStatus.VALID)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                AfterLogin(null);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          ProfileName.Content = App.Profile;
 | 
	
		
			
				|  |  |          URL.Content = GetDatabaseConnectionDescription();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Progress.ShowModal("Starting Up", progress =>
 | 
	
		
			
				|  |  | +        if (loginStatus == ValidationStatus.VALID && DatabaseType == DatabaseType.Standalone)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            if (loginStatus == ValidationStatus.VALID && DatabaseType == DatabaseType.Standalone)
 | 
	
		
			
				|  |  | +            Progress.ShowModal("Starting Scheduler", progress =>
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                progress.Report("Starting Scheduler");
 | 
	
		
			
				|  |  |                  scheduler.Start();
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        });
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      #region Connection Management
 | 
	
	
		
			
				|  | @@ -622,16 +647,15 @@ public partial class MainWindow : IPanelHostControl
 | 
	
		
			
				|  |  |      }*/
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    private void ConfigureMainScreen()
 | 
	
		
			
				|  |  | +    private void ConfigureMainScreen(IProgress<string>? progress)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | -        SetupScreen();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |          var bMaps = Security.CanView<Equipment>()
 | 
	
		
			
				|  |  |                      || Security.CanView<Job>()
 | 
	
		
			
				|  |  |                      || Security.CanView<TimeSheet>()
 | 
	
		
			
				|  |  |                      || Security.CanView<GPSTracker>();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        Progress.ShowModal(
 | 
	
		
			
				|  |  | +        var sections = new[]
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  |              new ProgressSection("Configuring Main Screen", SetupMainScreen),
 | 
	
		
			
				|  |  |              new ProgressSection("Configuring Quotes Screen", () => SetupQuotesTab(bMaps)),
 | 
	
		
			
				|  |  |              new ProgressSection("Configuring Projects", () => SetupProjectsTab(bMaps)),
 | 
	
	
		
			
				|  | @@ -644,7 +668,22 @@ public partial class MainWindow : IPanelHostControl
 | 
	
		
			
				|  |  |              new ProgressSection("Configuring DigitalForms", () => SetupDigitalFormsTab(bMaps)),
 | 
	
		
			
				|  |  |              new ProgressSection("Configuring Dashboards", () => SetupDashboardsTab(bMaps)),
 | 
	
		
			
				|  |  |              new ProgressSection("Configuring System Modules", SetupSystemModules)
 | 
	
		
			
				|  |  | -        );
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if(progress is not null)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            Dispatcher.Invoke(SetupScreen);
 | 
	
		
			
				|  |  | +            foreach(var section in sections)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                progress.Report(section.Message);
 | 
	
		
			
				|  |  | +                Dispatcher.Invoke(section.Action);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        else
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            SetupScreen();
 | 
	
		
			
				|  |  | +            Progress.ShowModal(sections);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      private void SetupScreen()
 | 
	
	
		
			
				|  | @@ -1196,10 +1235,9 @@ public partial class MainWindow : IPanelHostControl
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              if (OutstandingDailyReports(false))
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                MessageBox.Show("There are outstanding Daily Reports that must be filled out before continuing!" +
 | 
	
		
			
				|  |  | -                                "\n\nAccess to PRS is restricted until this is corrected.",
 | 
	
		
			
				|  |  | -                    "Outstanding Reports"
 | 
	
		
			
				|  |  | -                );
 | 
	
		
			
				|  |  | +                MessageWindow.ShowMessage("There are outstanding Daily Reports that must be filled out before continuing!"
 | 
	
		
			
				|  |  | +                    + "\n\nAccess to PRS is restricted until this is corrected.",
 | 
	
		
			
				|  |  | +                    "Outstanding Reports");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  var dailyReportPanel = LoadWindow<DailyReport>(ProjectDailyReportButton);
 | 
	
		
			
				|  |  |                  if(dailyReportPanel is not null)
 | 
	
	
		
			
				|  | @@ -1208,7 +1246,7 @@ public partial class MainWindow : IPanelHostControl
 | 
	
		
			
				|  |  |                      {
 | 
	
		
			
				|  |  |                          if (!OutstandingDailyReports(true))
 | 
	
		
			
				|  |  |                          {
 | 
	
		
			
				|  |  | -                            ConfigureMainScreen();
 | 
	
		
			
				|  |  | +                            ConfigureMainScreen(null);
 | 
	
		
			
				|  |  |                              LoadApplicationState();
 | 
	
		
			
				|  |  |                          }
 | 
	
		
			
				|  |  |                      };
 | 
	
	
		
			
				|  | @@ -1264,8 +1302,7 @@ public partial class MainWindow : IPanelHostControl
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              catch (Exception e)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                CoreUtils.LogException(ClientFactory.UserID, e);
 | 
	
		
			
				|  |  | -                MessageBox.Show(string.Format("Unable to Load {0}!\n\n{1}\n{2}", app.Settings["CurrentPanel"], e.Message, e.StackTrace));
 | 
	
		
			
				|  |  | +                MessageWindow.ShowError($"Unable to load {app.Settings["CurrentPanel"]}", e);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -1478,29 +1515,31 @@ public partial class MainWindow : IPanelHostControl
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      #region Login Management
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    private ValidationStatus? DoLogin(bool autoLogin)
 | 
	
		
			
				|  |  | +    private ValidationStatus? TryAutoLogin()
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |          ValidationStatus? result = null;
 | 
	
		
			
				|  |  | -        if (autoLogin)
 | 
	
		
			
				|  |  | +        if (App.DatabaseSettings.LoginType == LoginType.UserID)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            if (App.DatabaseSettings.LoginType == LoginType.UserID)
 | 
	
		
			
				|  |  | +            try
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                try
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    result = ClientFactory.Validate(App.DatabaseSettings.UserID, App.DatabaseSettings.Password);
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -                catch (Exception e)
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    Logger.Send(LogType.Error, ClientFactory.UserID, $"Error connecting to server: {CoreUtils.FormatException(e)}");
 | 
	
		
			
				|  |  | -                    MessageBox.Show("Error connecting to server.\nPlease check the server URL and port number.");
 | 
	
		
			
				|  |  | -                    result = null;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -                if (result == ValidationStatus.INVALID)
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    MessageBox.Show("Unable to Login with User ID: " + App.DatabaseSettings.UserID);
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | +                result = ClientFactory.Validate(App.DatabaseSettings.UserID, App.DatabaseSettings.Password);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            catch (Exception e)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                MessageWindow.ShowError("Error connecting to server.\nPlease check the server URL and port number.", e);
 | 
	
		
			
				|  |  | +                result = null;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if (result == ValidationStatus.INVALID)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                MessageWindow.ShowMessage("Unable to Login with User ID: " + App.DatabaseSettings.UserID, "Login failed");
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +        return result;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private ValidationStatus? DoLogin()
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        ValidationStatus? result = null;
 | 
	
		
			
				|  |  |          if (result != ValidationStatus.VALID)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              var login = new PinLogin(CoreUtils.GetVersion(), result ?? ValidationStatus.INVALID);
 | 
	
	
		
			
				|  | @@ -1516,8 +1555,10 @@ public partial class MainWindow : IPanelHostControl
 | 
	
		
			
				|  |  |      /// <summary>
 | 
	
		
			
				|  |  |      /// To be called after <see cref="DoLogin(bool)"/> and if a valid login session exists. Configures the main screen and loads the windows.
 | 
	
		
			
				|  |  |      /// </summary>
 | 
	
		
			
				|  |  | -    private void AfterLogin()
 | 
	
		
			
				|  |  | +    /// <param name="progress">If not <see langword="null"/>, then rather than opening a new progress window, just uses that.</param>
 | 
	
		
			
				|  |  | +    private void AfterLogin(IProgress<string>? progress)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | +        Logger.Send(LogType.Information, "", "Loading employee");
 | 
	
		
			
				|  |  |          LoadCurrentEmployee();
 | 
	
		
			
				|  |  |          if (CheckTimesheetBypass(true))
 | 
	
		
			
				|  |  |          {
 | 
	
	
		
			
				|  | @@ -1525,7 +1566,7 @@ public partial class MainWindow : IPanelHostControl
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          else
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            MessageBox.Show("You must clock on before logging in to PRS!");
 | 
	
		
			
				|  |  | +            MessageWindow.ShowMessage("You must clock on before logging in to PRS!", "Not clocked in.");
 | 
	
		
			
				|  |  |              ClientFactory.InvalidateUser();
 | 
	
		
			
				|  |  |              App.EmployeeID = Guid.Empty;
 | 
	
		
			
				|  |  |              App.EmployeeName = "";
 | 
	
	
		
			
				|  | @@ -1533,10 +1574,38 @@ public partial class MainWindow : IPanelHostControl
 | 
	
		
			
				|  |  |              App.EmployeeEmail = "";
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        ApplyColorScheme();
 | 
	
		
			
				|  |  | -        ConfigureMainScreen();
 | 
	
		
			
				|  |  | -        LoadApplicationState();
 | 
	
		
			
				|  |  | -        LoadSecondaryWindows();
 | 
	
		
			
				|  |  | +        Logger.Send(LogType.Information, "", "Setting colours");
 | 
	
		
			
				|  |  | +        if(progress is null)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            ApplyColorScheme();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        else
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            Dispatcher.Invoke(ApplyColorScheme);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Logger.Send(LogType.Information, "", "Configuring main window");
 | 
	
		
			
				|  |  | +        ConfigureMainScreen(progress);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Logger.Send(LogType.Information, "", "Loading current window");
 | 
	
		
			
				|  |  | +        if(progress is null)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            LoadApplicationState();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        else
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            Dispatcher.Invoke(LoadApplicationState);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Logger.Send(LogType.Information, "", "Loading secondary window");
 | 
	
		
			
				|  |  | +        if(progress is null)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            LoadSecondaryWindows();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        else
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            Dispatcher.Invoke(LoadSecondaryWindows);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          //if (_ribbon.Menu.IsVisible)
 | 
	
		
			
				|  |  |          //{
 | 
	
	
		
			
				|  | @@ -1578,7 +1647,6 @@ public partial class MainWindow : IPanelHostControl
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      private void LoadCurrentEmployee()
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |          var me = new Client<Employee>().Query(
 | 
	
		
			
				|  |  |              new Filter<Employee>(x => x.UserLink.ID).IsEqualTo(ClientFactory.UserGuid),
 | 
	
		
			
				|  |  |              Columns.None<Employee>().Add(x => x.ID).Add(x => x.Email).Add(x => x.Name)
 | 
	
	
		
			
				|  | @@ -1643,17 +1711,17 @@ public partial class MainWindow : IPanelHostControl
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          ClientFactory.InvalidateUser();
 | 
	
		
			
				|  |  | -        ConfigureMainScreen();
 | 
	
		
			
				|  |  | +        ConfigureMainScreen(null);
 | 
	
		
			
				|  |  |          LoadSecondaryWindows();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          if (message != null)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            MessageBox.Show(message);
 | 
	
		
			
				|  |  | +            MessageWindow.ShowMessage(message, "Logged out");
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        if (DoLogin(false) == ValidationStatus.VALID)
 | 
	
		
			
				|  |  | +        if (DoLogin() == ValidationStatus.VALID)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            AfterLogin();
 | 
	
		
			
				|  |  | +            AfterLogin(null);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          return true;
 | 
	
	
		
			
				|  | @@ -3461,8 +3529,8 @@ public partial class MainWindow : IPanelHostControl
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      private void LoginButton_OnClick(object sender, RoutedEventArgs e)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | -        if (DoLogin(false) == ValidationStatus.VALID)
 | 
	
		
			
				|  |  | -            AfterLogin();
 | 
	
		
			
				|  |  | +        if (DoLogin() == ValidationStatus.VALID)
 | 
	
		
			
				|  |  | +            AfterLogin(null);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      private void ExitButton_OnClick(object sender, RoutedEventArgs e)
 |