SEBWIN-219: Extracted message box from UI factory and tidied up user interface contracts.

This commit is contained in:
dbuechel 2018-03-14 12:07:20 +01:00
parent 6334294e4d
commit 49d9b03d7a
37 changed files with 183 additions and 185 deletions

View file

@ -18,6 +18,7 @@ using SafeExamBrowser.Contracts.Configuration;
using SafeExamBrowser.Contracts.I18n;
using SafeExamBrowser.Contracts.Logging;
using SafeExamBrowser.Contracts.UserInterface;
using SafeExamBrowser.Contracts.UserInterface.MessageBox;
using SafeExamBrowser.Contracts.UserInterface.Taskbar;
using BrowserSettings = SafeExamBrowser.Contracts.Configuration.Settings.BrowserSettings;
@ -29,6 +30,7 @@ namespace SafeExamBrowser.Browser
private IList<IApplicationInstance> instances = new List<IApplicationInstance>();
private BrowserSettings settings;
private ILogger logger;
private IMessageBox messageBox;
private IRuntimeProxy runtime;
private RuntimeInfo runtimeInfo;
private IUserInterfaceFactory uiFactory;
@ -38,11 +40,13 @@ namespace SafeExamBrowser.Browser
BrowserSettings settings,
RuntimeInfo runtimeInfo,
ILogger logger,
IMessageBox messageBox,
IRuntimeProxy runtime,
IText text,
IUserInterfaceFactory uiFactory)
{
this.logger = logger;
this.messageBox = messageBox;
this.runtime = runtime;
this.runtimeInfo = runtimeInfo;
this.settings = settings;
@ -122,7 +126,7 @@ namespace SafeExamBrowser.Browser
private void Instance_ConfigurationDetected(string url, CancelEventArgs args)
{
var result = uiFactory.Show(TextKey.MessageBox_ReconfigurationQuestion, TextKey.MessageBox_ReconfigurationQuestionTitle, MessageBoxAction.YesNo, MessageBoxIcon.Question);
var result = messageBox.Show(TextKey.MessageBox_ReconfigurationQuestion, TextKey.MessageBox_ReconfigurationQuestionTitle, MessageBoxAction.YesNo, MessageBoxIcon.Question);
var reconfigure = result == MessageBoxResult.Yes;
var allowed = false;
@ -137,13 +141,13 @@ namespace SafeExamBrowser.Browser
if (!allowed)
{
uiFactory.Show(TextKey.MessageBox_ReconfigurationDenied, TextKey.MessageBox_ReconfigurationDeniedTitle);
messageBox.Show(TextKey.MessageBox_ReconfigurationDenied, TextKey.MessageBox_ReconfigurationDeniedTitle);
}
}
catch (Exception e)
{
logger.Error("Failed to communicate the reconfiguration request to the runtime!", e);
uiFactory.Show(TextKey.MessageBox_ReconfigurationError, TextKey.MessageBox_ReconfigurationErrorTitle, icon: MessageBoxIcon.Error);
messageBox.Show(TextKey.MessageBox_ReconfigurationError, TextKey.MessageBox_ReconfigurationErrorTitle, icon: MessageBoxIcon.Error);
}
}

View file

@ -12,6 +12,8 @@ using SafeExamBrowser.Contracts.Configuration;
using SafeExamBrowser.Contracts.Configuration.Settings;
using SafeExamBrowser.Contracts.I18n;
using SafeExamBrowser.Contracts.UserInterface;
using SafeExamBrowser.Contracts.UserInterface.Browser;
using SafeExamBrowser.Contracts.UserInterface.Windows;
namespace SafeExamBrowser.Browser
{

View file

@ -10,7 +10,7 @@ using System;
using CefSharp.WinForms;
using SafeExamBrowser.Browser.Handlers;
using SafeExamBrowser.Contracts.I18n;
using SafeExamBrowser.Contracts.UserInterface;
using SafeExamBrowser.Contracts.UserInterface.Browser;
using BrowserSettings = SafeExamBrowser.Contracts.Configuration.Settings.BrowserSettings;
namespace SafeExamBrowser.Browser

View file

@ -10,8 +10,8 @@ using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using SafeExamBrowser.Client.Notifications;
using SafeExamBrowser.Contracts.Configuration;
using SafeExamBrowser.Contracts.I18n;
using SafeExamBrowser.Contracts.UserInterface;
using SafeExamBrowser.Contracts.UserInterface.Windows;
namespace SafeExamBrowser.Client.UnitTests.Notifications
{

View file

@ -11,6 +11,7 @@ using Moq;
using SafeExamBrowser.Client.Notifications;
using SafeExamBrowser.Contracts.Logging;
using SafeExamBrowser.Contracts.UserInterface;
using SafeExamBrowser.Contracts.UserInterface.Windows;
namespace SafeExamBrowser.Client.UnitTests.Notifications
{

View file

@ -16,7 +16,9 @@ using SafeExamBrowser.Contracts.I18n;
using SafeExamBrowser.Contracts.Logging;
using SafeExamBrowser.Contracts.Monitoring;
using SafeExamBrowser.Contracts.UserInterface;
using SafeExamBrowser.Contracts.UserInterface.MessageBox;
using SafeExamBrowser.Contracts.UserInterface.Taskbar;
using SafeExamBrowser.Contracts.UserInterface.Windows;
namespace SafeExamBrowser.Client.Behaviour
{
@ -24,6 +26,7 @@ namespace SafeExamBrowser.Client.Behaviour
{
private IDisplayMonitor displayMonitor;
private ILogger logger;
private IMessageBox messageBox;
private IOperationSequence operations;
private IProcessMonitor processMonitor;
private IRuntimeProxy runtime;
@ -54,6 +57,7 @@ namespace SafeExamBrowser.Client.Behaviour
public ClientController(
IDisplayMonitor displayMonitor,
ILogger logger,
IMessageBox messageBox,
IOperationSequence operations,
IProcessMonitor processMonitor,
IRuntimeProxy runtime,
@ -64,6 +68,7 @@ namespace SafeExamBrowser.Client.Behaviour
{
this.displayMonitor = displayMonitor;
this.logger = logger;
this.messageBox = messageBox;
this.operations = operations;
this.processMonitor = processMonitor;
this.runtime = runtime;
@ -186,7 +191,7 @@ namespace SafeExamBrowser.Client.Behaviour
private void Runtime_ConnectionLost()
{
logger.Error("Lost connection to the runtime!");
uiFactory.Show(TextKey.MessageBox_ApplicationError, TextKey.MessageBox_ApplicationErrorTitle, icon: MessageBoxIcon.Error);
messageBox.Show(TextKey.MessageBox_ApplicationError, TextKey.MessageBox_ApplicationErrorTitle, icon: MessageBoxIcon.Error);
taskbar.Close();
shutdown.Invoke();
@ -194,7 +199,7 @@ namespace SafeExamBrowser.Client.Behaviour
private void Taskbar_QuitButtonClicked()
{
var result = uiFactory.Show(TextKey.MessageBox_Quit, TextKey.MessageBox_QuitTitle, MessageBoxAction.YesNo, MessageBoxIcon.Question);
var result = messageBox.Show(TextKey.MessageBox_Quit, TextKey.MessageBox_QuitTitle, MessageBoxAction.YesNo, MessageBoxIcon.Question);
if (result == MessageBoxResult.Yes)
{
@ -205,7 +210,7 @@ namespace SafeExamBrowser.Client.Behaviour
catch (Exception e)
{
logger.Error("Failed to communicate shutdown request to the runtime!", e);
uiFactory.Show(TextKey.MessageBox_QuitError, TextKey.MessageBox_QuitErrorTitle, icon: MessageBoxIcon.Error);
messageBox.Show(TextKey.MessageBox_QuitError, TextKey.MessageBox_QuitErrorTitle, icon: MessageBoxIcon.Error);
}
}
}

View file

@ -22,6 +22,7 @@ using SafeExamBrowser.Contracts.Configuration;
using SafeExamBrowser.Contracts.I18n;
using SafeExamBrowser.Contracts.Logging;
using SafeExamBrowser.Contracts.UserInterface;
using SafeExamBrowser.Contracts.UserInterface.MessageBox;
using SafeExamBrowser.Contracts.WindowsApi;
using SafeExamBrowser.Core.Behaviour.OperationModel;
using SafeExamBrowser.Core.Communication;
@ -47,6 +48,7 @@ namespace SafeExamBrowser.Client
private ClientConfiguration configuration;
private IClientHost clientHost;
private ILogger logger;
private IMessageBox messageBox;
private INativeMethods nativeMethods;
private IRuntimeProxy runtimeProxy;
private ISystemInfo systemInfo;
@ -68,6 +70,7 @@ namespace SafeExamBrowser.Client
InitializeLogging();
text = new Text(logger);
messageBox = new MessageBox(text);
uiFactory = new UserInterfaceFactory(text);
runtimeProxy = new RuntimeProxy(runtimeHostUri, new ModuleLogger(logger, typeof(RuntimeProxy)));
@ -96,7 +99,7 @@ namespace SafeExamBrowser.Client
var sequence = new OperationSequence(logger, operations);
ClientController = new ClientController(displayMonitor, logger, sequence, processMonitor, runtimeProxy, shutdown, Taskbar, uiFactory, windowMonitor);
ClientController = new ClientController(displayMonitor, logger, messageBox, sequence, processMonitor, runtimeProxy, shutdown, Taskbar, uiFactory, windowMonitor);
}
internal void LogStartupInformation()
@ -145,7 +148,7 @@ namespace SafeExamBrowser.Client
private IOperation BuildBrowserOperation()
{
var moduleLogger = new ModuleLogger(logger, typeof(BrowserApplicationController));
var browserController = new BrowserApplicationController(configuration.Settings.Browser, configuration.RuntimeInfo, moduleLogger, runtimeProxy, text, uiFactory);
var browserController = new BrowserApplicationController(configuration.Settings.Browser, configuration.RuntimeInfo, moduleLogger, messageBox, runtimeProxy, text, uiFactory);
var browserInfo = new BrowserApplicationInfo();
var operation = new BrowserOperation(browserController, browserInfo, logger, Taskbar, uiFactory);

View file

@ -8,9 +8,9 @@
using SafeExamBrowser.Contracts.Behaviour;
using SafeExamBrowser.Contracts.Configuration;
using SafeExamBrowser.Contracts.I18n;
using SafeExamBrowser.Contracts.UserInterface;
using SafeExamBrowser.Contracts.UserInterface.Taskbar;
using SafeExamBrowser.Contracts.UserInterface.Windows;
namespace SafeExamBrowser.Client.Notifications
{

View file

@ -7,10 +7,10 @@
*/
using SafeExamBrowser.Contracts.Behaviour;
using SafeExamBrowser.Contracts.I18n;
using SafeExamBrowser.Contracts.Logging;
using SafeExamBrowser.Contracts.UserInterface;
using SafeExamBrowser.Contracts.UserInterface.Taskbar;
using SafeExamBrowser.Contracts.UserInterface.Windows;
namespace SafeExamBrowser.Client.Notifications
{

View file

@ -8,6 +8,7 @@
using System;
using SafeExamBrowser.Contracts.UserInterface;
using SafeExamBrowser.Contracts.UserInterface.Windows;
namespace SafeExamBrowser.Contracts.Configuration
{

View file

@ -123,14 +123,14 @@
<Compile Include="SystemComponents\ISystemComponent.cs" />
<Compile Include="SystemComponents\IWirelessNetwork.cs" />
<Compile Include="SystemComponents\WirelessNetworkStatus.cs" />
<Compile Include="UserInterface\IBrowserControl.cs" />
<Compile Include="UserInterface\IBrowserWindow.cs" />
<Compile Include="UserInterface\IMessageBox.cs" />
<Compile Include="UserInterface\Browser\IBrowserControl.cs" />
<Compile Include="UserInterface\Browser\IBrowserWindow.cs" />
<Compile Include="UserInterface\MessageBox\IMessageBox.cs" />
<Compile Include="UserInterface\IProgressIndicator.cs" />
<Compile Include="UserInterface\IRuntimeWindow.cs" />
<Compile Include="UserInterface\MessageBoxResult.cs" />
<Compile Include="UserInterface\Windows\IRuntimeWindow.cs" />
<Compile Include="UserInterface\MessageBox\MessageBoxResult.cs" />
<Compile Include="UserInterface\Taskbar\INotificationButton.cs" />
<Compile Include="UserInterface\ISplashScreen.cs" />
<Compile Include="UserInterface\Windows\ISplashScreen.cs" />
<Compile Include="UserInterface\Taskbar\ISystemKeyboardLayoutControl.cs" />
<Compile Include="UserInterface\Taskbar\ISystemPowerSupplyControl.cs" />
<Compile Include="UserInterface\Taskbar\ISystemControl.cs" />
@ -140,9 +140,9 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="UserInterface\Taskbar\IApplicationButton.cs" />
<Compile Include="UserInterface\IUserInterfaceFactory.cs" />
<Compile Include="UserInterface\IWindow.cs" />
<Compile Include="UserInterface\MessageBoxAction.cs" />
<Compile Include="UserInterface\MessageBoxIcon.cs" />
<Compile Include="UserInterface\Windows\IWindow.cs" />
<Compile Include="UserInterface\MessageBox\MessageBoxAction.cs" />
<Compile Include="UserInterface\MessageBox\MessageBoxIcon.cs" />
<Compile Include="WindowsApi\IBounds.cs" />
<Compile Include="WindowsApi\IDesktop.cs" />
<Compile Include="WindowsApi\INativeMethods.cs" />

View file

@ -6,7 +6,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
namespace SafeExamBrowser.Contracts.UserInterface
namespace SafeExamBrowser.Contracts.UserInterface.Browser
{
public delegate void AddressChangedEventHandler(string address);
public delegate void LoadingStateChangedEventHandler(bool isLoading);

View file

@ -6,7 +6,9 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
namespace SafeExamBrowser.Contracts.UserInterface
using SafeExamBrowser.Contracts.UserInterface.Windows;
namespace SafeExamBrowser.Contracts.UserInterface.Browser
{
public delegate void ActionRequestedEventHandler();

View file

@ -9,7 +9,9 @@
using SafeExamBrowser.Contracts.Configuration;
using SafeExamBrowser.Contracts.Configuration.Settings;
using SafeExamBrowser.Contracts.Logging;
using SafeExamBrowser.Contracts.UserInterface.Browser;
using SafeExamBrowser.Contracts.UserInterface.Taskbar;
using SafeExamBrowser.Contracts.UserInterface.Windows;
namespace SafeExamBrowser.Contracts.UserInterface
{
@ -18,7 +20,7 @@ namespace SafeExamBrowser.Contracts.UserInterface
/// from the particular user interface framework in use, all dynamically generated user interface elements must be generated by this
/// factory.
/// </summary>
public interface IUserInterfaceFactory : IMessageBox
public interface IUserInterfaceFactory
{
/// <summary>
/// Creates a new about window displaying information about the currently running application version.

View file

@ -8,7 +8,7 @@
using SafeExamBrowser.Contracts.I18n;
namespace SafeExamBrowser.Contracts.UserInterface
namespace SafeExamBrowser.Contracts.UserInterface.MessageBox
{
/// <summary>
/// Defines the API for message boxes.

View file

@ -6,7 +6,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
namespace SafeExamBrowser.Contracts.UserInterface
namespace SafeExamBrowser.Contracts.UserInterface.MessageBox
{
/// <summary>
/// Defines all actions available for a message box.

View file

@ -6,7 +6,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
namespace SafeExamBrowser.Contracts.UserInterface
namespace SafeExamBrowser.Contracts.UserInterface.MessageBox
{
/// <summary>
/// Defines all icons available in a message box.

View file

@ -6,7 +6,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
namespace SafeExamBrowser.Contracts.UserInterface
namespace SafeExamBrowser.Contracts.UserInterface.MessageBox
{
/// <summary>
/// Defines all possible results of a message box.

View file

@ -8,7 +8,7 @@
using SafeExamBrowser.Contracts.Logging;
namespace SafeExamBrowser.Contracts.UserInterface
namespace SafeExamBrowser.Contracts.UserInterface.Windows
{
/// <summary>
/// The main window of the runtime application component. It is controlled by the <see cref="Behaviour.IRuntimeController"/> and serves

View file

@ -8,7 +8,7 @@
using SafeExamBrowser.Contracts.Configuration;
namespace SafeExamBrowser.Contracts.UserInterface
namespace SafeExamBrowser.Contracts.UserInterface.Windows
{
/// <summary>
/// Defines the functionality of a splash screen.

View file

@ -6,7 +6,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
namespace SafeExamBrowser.Contracts.UserInterface
namespace SafeExamBrowser.Contracts.UserInterface.Windows
{
public delegate void WindowClosingEventHandler();

View file

@ -16,6 +16,7 @@ using SafeExamBrowser.Contracts.Configuration.Settings;
using SafeExamBrowser.Contracts.I18n;
using SafeExamBrowser.Contracts.Logging;
using SafeExamBrowser.Contracts.UserInterface;
using SafeExamBrowser.Contracts.UserInterface.MessageBox;
using SafeExamBrowser.Runtime.Behaviour.Operations;
namespace SafeExamBrowser.Runtime.UnitTests.Behaviour.Operations
@ -24,22 +25,22 @@ namespace SafeExamBrowser.Runtime.UnitTests.Behaviour.Operations
public class ConfigurationOperationTests
{
private Mock<ILogger> logger;
private Mock<IMessageBox> messageBox;
private RuntimeInfo info;
private Mock<IConfigurationRepository> repository;
private Settings settings;
private Mock<IText> text;
private Mock<IUserInterfaceFactory> uiFactory;
private ConfigurationOperation sut;
[TestInitialize]
public void Initialize()
{
logger = new Mock<ILogger>();
info = new RuntimeInfo();
logger = new Mock<ILogger>();
messageBox = new Mock<IMessageBox>();
repository = new Mock<IConfigurationRepository>();
settings = new Settings();
text = new Mock<IText>();
uiFactory = new Mock<IUserInterfaceFactory>();
info.AppDataFolder = @"C:\Not\Really\AppData";
info.DefaultSettingsFileName = "SettingsDummy.txt";
@ -53,11 +54,11 @@ namespace SafeExamBrowser.Runtime.UnitTests.Behaviour.Operations
{
repository.Setup(r => r.LoadDefaultSettings());
sut = new ConfigurationOperation(repository.Object, logger.Object, info, text.Object, uiFactory.Object, null);
sut = new ConfigurationOperation(repository.Object, logger.Object, messageBox.Object, info, text.Object, null);
sut.Perform();
sut = new ConfigurationOperation(repository.Object, logger.Object, info, text.Object, uiFactory.Object, new string[] { });
sut = new ConfigurationOperation(repository.Object, logger.Object, messageBox.Object, info, text.Object, new string[] { });
sut.Perform();
@ -69,7 +70,7 @@ namespace SafeExamBrowser.Runtime.UnitTests.Behaviour.Operations
{
var path = @"an/invalid\path.'*%yolo/()";
sut = new ConfigurationOperation(repository.Object, logger.Object, info, text.Object, uiFactory.Object, new [] { "blubb.exe", path });
sut = new ConfigurationOperation(repository.Object, logger.Object, messageBox.Object, info, text.Object, new [] { "blubb.exe", path });
sut.Perform();
}
@ -83,7 +84,7 @@ namespace SafeExamBrowser.Runtime.UnitTests.Behaviour.Operations
info.ProgramDataFolder = location;
info.AppDataFolder = location;
sut = new ConfigurationOperation(repository.Object, logger.Object, info, text.Object, uiFactory.Object, new[] { "blubb.exe", path });
sut = new ConfigurationOperation(repository.Object, logger.Object, messageBox.Object, info, text.Object, new[] { "blubb.exe", path });
sut.Perform();
@ -98,7 +99,7 @@ namespace SafeExamBrowser.Runtime.UnitTests.Behaviour.Operations
info.ProgramDataFolder = location;
info.AppDataFolder = $@"{location}\WRONG";
sut = new ConfigurationOperation(repository.Object, logger.Object, info, text.Object, uiFactory.Object, null);
sut = new ConfigurationOperation(repository.Object, logger.Object, messageBox.Object, info, text.Object, null);
sut.Perform();
@ -112,7 +113,7 @@ namespace SafeExamBrowser.Runtime.UnitTests.Behaviour.Operations
info.AppDataFolder = location;
sut = new ConfigurationOperation(repository.Object, logger.Object, info, text.Object, uiFactory.Object, null);
sut = new ConfigurationOperation(repository.Object, logger.Object, messageBox.Object, info, text.Object, null);
sut.Perform();
@ -122,7 +123,7 @@ namespace SafeExamBrowser.Runtime.UnitTests.Behaviour.Operations
[TestMethod]
public void MustFallbackToDefaultsAsLastPrio()
{
sut = new ConfigurationOperation(repository.Object, logger.Object, info, text.Object, uiFactory.Object, null);
sut = new ConfigurationOperation(repository.Object, logger.Object, messageBox.Object, info, text.Object, null);
sut.Perform();
@ -133,9 +134,9 @@ namespace SafeExamBrowser.Runtime.UnitTests.Behaviour.Operations
public void MustAbortIfWishedByUser()
{
info.ProgramDataFolder = Path.GetDirectoryName(GetType().Assembly.Location);
uiFactory.Setup(u => u.Show(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<MessageBoxAction>(), It.IsAny<MessageBoxIcon>())).Returns(MessageBoxResult.Yes);
messageBox.Setup(u => u.Show(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<MessageBoxAction>(), It.IsAny<MessageBoxIcon>())).Returns(MessageBoxResult.Yes);
sut = new ConfigurationOperation(repository.Object, logger.Object, info, text.Object, uiFactory.Object, null);
sut = new ConfigurationOperation(repository.Object, logger.Object, messageBox.Object, info, text.Object, null);
var result = sut.Perform();
@ -145,9 +146,9 @@ namespace SafeExamBrowser.Runtime.UnitTests.Behaviour.Operations
[TestMethod]
public void MustNotAbortIfNotWishedByUser()
{
uiFactory.Setup(u => u.Show(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<MessageBoxAction>(), It.IsAny<MessageBoxIcon>())).Returns(MessageBoxResult.No);
messageBox.Setup(u => u.Show(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<MessageBoxAction>(), It.IsAny<MessageBoxIcon>())).Returns(MessageBoxResult.No);
sut = new ConfigurationOperation(repository.Object, logger.Object, info, text.Object, uiFactory.Object, null);
sut = new ConfigurationOperation(repository.Object, logger.Object, messageBox.Object, info, text.Object, null);
var result = sut.Perform();

View file

@ -14,6 +14,7 @@ using SafeExamBrowser.Contracts.Configuration.Settings;
using SafeExamBrowser.Contracts.I18n;
using SafeExamBrowser.Contracts.Logging;
using SafeExamBrowser.Contracts.UserInterface;
using SafeExamBrowser.Contracts.UserInterface.MessageBox;
namespace SafeExamBrowser.Runtime.Behaviour.Operations
{
@ -21,9 +22,9 @@ namespace SafeExamBrowser.Runtime.Behaviour.Operations
{
private IConfigurationRepository repository;
private ILogger logger;
private IMessageBox messageBox;
private RuntimeInfo runtimeInfo;
private IText text;
private IUserInterfaceFactory uiFactory;
private string[] commandLineArgs;
public IProgressIndicator ProgressIndicator { private get; set; }
@ -31,17 +32,17 @@ namespace SafeExamBrowser.Runtime.Behaviour.Operations
public ConfigurationOperation(
IConfigurationRepository repository,
ILogger logger,
IMessageBox messageBox,
RuntimeInfo runtimeInfo,
IText text,
IUserInterfaceFactory uiFactory,
string[] commandLineArgs)
{
this.repository = repository;
this.logger = logger;
this.messageBox = messageBox;
this.commandLineArgs = commandLineArgs;
this.runtimeInfo = runtimeInfo;
this.text = text;
this.uiFactory = uiFactory;
}
public OperationResult Perform()
@ -129,7 +130,7 @@ namespace SafeExamBrowser.Runtime.Behaviour.Operations
{
var message = text.Get(TextKey.MessageBox_ClientConfigurationQuestion);
var title = text.Get(TextKey.MessageBox_ClientConfigurationQuestionTitle);
var abort = uiFactory.Show(message, title, MessageBoxAction.YesNo, MessageBoxIcon.Question);
var abort = messageBox.Show(message, title, MessageBoxAction.YesNo, MessageBoxIcon.Question);
return abort == MessageBoxResult.Yes;
}

View file

@ -15,6 +15,8 @@ using SafeExamBrowser.Contracts.Configuration.Settings;
using SafeExamBrowser.Contracts.I18n;
using SafeExamBrowser.Contracts.Logging;
using SafeExamBrowser.Contracts.UserInterface;
using SafeExamBrowser.Contracts.UserInterface.MessageBox;
using SafeExamBrowser.Contracts.UserInterface.Windows;
namespace SafeExamBrowser.Runtime.Behaviour
{
@ -24,6 +26,7 @@ namespace SafeExamBrowser.Runtime.Behaviour
private IConfigurationRepository configuration;
private ILogger logger;
private IMessageBox messageBox;
private IOperationSequence bootstrapSequence;
private IOperationSequence sessionSequence;
private IRuntimeHost runtimeHost;
@ -37,6 +40,7 @@ namespace SafeExamBrowser.Runtime.Behaviour
public RuntimeController(
IConfigurationRepository configuration,
ILogger logger,
IMessageBox messageBox,
IOperationSequence bootstrapSequence,
IOperationSequence sessionSequence,
IRuntimeHost runtimeHost,
@ -46,11 +50,12 @@ namespace SafeExamBrowser.Runtime.Behaviour
IUserInterfaceFactory uiFactory)
{
this.configuration = configuration;
this.logger = logger;
this.bootstrapSequence = bootstrapSequence;
this.sessionSequence = sessionSequence;
this.logger = logger;
this.messageBox = messageBox;
this.runtimeHost = runtimeHost;
this.runtimeInfo = runtimeInfo;
this.sessionSequence = sessionSequence;
this.service = service;
this.shutdown = shutdown;
this.uiFactory = uiFactory;
@ -86,7 +91,7 @@ namespace SafeExamBrowser.Runtime.Behaviour
logger.Info("--- Application startup aborted! ---");
logger.Log(string.Empty);
uiFactory.Show(TextKey.MessageBox_StartupError, TextKey.MessageBox_StartupErrorTitle, icon: MessageBoxIcon.Error);
messageBox.Show(TextKey.MessageBox_StartupError, TextKey.MessageBox_StartupErrorTitle, icon: MessageBoxIcon.Error);
}
return initialized && sessionRunning;
@ -121,7 +126,7 @@ namespace SafeExamBrowser.Runtime.Behaviour
logger.Info("--- Shutdown procedure failed! ---");
logger.Log(string.Empty);
uiFactory.Show(TextKey.MessageBox_ShutdownError, TextKey.MessageBox_ShutdownErrorTitle, icon: MessageBoxIcon.Error);
messageBox.Show(TextKey.MessageBox_ShutdownError, TextKey.MessageBox_ShutdownErrorTitle, icon: MessageBoxIcon.Error);
}
splashScreen?.Close();
@ -163,7 +168,7 @@ namespace SafeExamBrowser.Runtime.Behaviour
if (result == OperationResult.Failed)
{
uiFactory.Show(TextKey.MessageBox_SessionStartError, TextKey.MessageBox_SessionStartErrorTitle, icon: MessageBoxIcon.Error);
messageBox.Show(TextKey.MessageBox_SessionStartError, TextKey.MessageBox_SessionStartErrorTitle, icon: MessageBoxIcon.Error);
}
if (!initial)
@ -193,7 +198,7 @@ namespace SafeExamBrowser.Runtime.Behaviour
else
{
logger.Info(">>>--- Session reversion was erroneous! ---<<<");
uiFactory.Show(TextKey.MessageBox_SessionStopError, TextKey.MessageBox_SessionStopErrorTitle, icon: MessageBoxIcon.Error);
messageBox.Show(TextKey.MessageBox_SessionStopError, TextKey.MessageBox_SessionStopErrorTitle, icon: MessageBoxIcon.Error);
}
}
@ -225,7 +230,7 @@ namespace SafeExamBrowser.Runtime.Behaviour
{
logger.Error($"Client application has unexpectedly terminated with exit code {exitCode}!");
// TODO: Check if message box is rendered on new desktop as well -> otherwise shutdown is blocked!
uiFactory.Show(TextKey.MessageBox_ApplicationError, TextKey.MessageBox_ApplicationErrorTitle, icon: MessageBoxIcon.Error);
messageBox.Show(TextKey.MessageBox_ApplicationError, TextKey.MessageBox_ApplicationErrorTitle, icon: MessageBoxIcon.Error);
shutdown.Invoke();
}
@ -234,7 +239,7 @@ namespace SafeExamBrowser.Runtime.Behaviour
{
logger.Error("Lost connection to the client application!");
// TODO: Check if message box is rendered on new desktop as well -> otherwise shutdown is blocked!
uiFactory.Show(TextKey.MessageBox_ApplicationError, TextKey.MessageBox_ApplicationErrorTitle, icon: MessageBoxIcon.Error);
messageBox.Show(TextKey.MessageBox_ApplicationError, TextKey.MessageBox_ApplicationErrorTitle, icon: MessageBoxIcon.Error);
shutdown.Invoke();
}

View file

@ -46,6 +46,7 @@ namespace SafeExamBrowser.Runtime
InitializeLogging();
var text = new Text(logger);
var messageBox = new MessageBox(text);
var uiFactory = new UserInterfaceFactory(text);
var desktop = new Desktop(new ModuleLogger(logger, typeof(Desktop)));
var processFactory = new ProcessFactory(desktop, new ModuleLogger(logger, typeof(ProcessFactory)));
@ -61,7 +62,7 @@ namespace SafeExamBrowser.Runtime
bootstrapOperations.Enqueue(new CommunicationOperation(runtimeHost, logger));
sessionOperations.Enqueue(new SessionSequenceStartOperation(sessionController));
sessionOperations.Enqueue(new ConfigurationOperation(configuration, logger, runtimeInfo, text, uiFactory, args));
sessionOperations.Enqueue(new ConfigurationOperation(configuration, logger, messageBox, runtimeInfo, text, args));
sessionOperations.Enqueue(new ServiceConnectionOperation(configuration, logger, serviceProxy, text));
sessionOperations.Enqueue(new KioskModeOperation(logger, configuration));
sessionOperations.Enqueue(new SessionSequenceEndOperation(sessionController));
@ -69,7 +70,7 @@ namespace SafeExamBrowser.Runtime
var boostrapSequence = new OperationSequence(logger, bootstrapOperations);
var sessionSequence = new OperationSequence(logger, sessionOperations);
RuntimeController = new RuntimeController(configuration, logger, boostrapSequence, sessionSequence, runtimeHost, runtimeInfo, serviceProxy, shutdown, uiFactory);
RuntimeController = new RuntimeController(configuration, logger, messageBox, boostrapSequence, sessionSequence, runtimeHost, runtimeInfo, serviceProxy, shutdown, uiFactory);
}
internal void LogStartupInformation()

View file

@ -10,7 +10,7 @@ using System.Windows;
using System.Windows.Documents;
using SafeExamBrowser.Contracts.Configuration;
using SafeExamBrowser.Contracts.I18n;
using SafeExamBrowser.Contracts.UserInterface;
using SafeExamBrowser.Contracts.UserInterface.Windows;
namespace SafeExamBrowser.UserInterface.Classic
{

View file

@ -10,7 +10,8 @@ using System;
using System.Windows;
using System.Windows.Input;
using SafeExamBrowser.Contracts.Configuration.Settings;
using SafeExamBrowser.Contracts.UserInterface;
using SafeExamBrowser.Contracts.UserInterface.Browser;
using SafeExamBrowser.Contracts.UserInterface.Windows;
using SafeExamBrowser.UserInterface.Classic.Utilities;
namespace SafeExamBrowser.UserInterface.Classic

View file

@ -10,7 +10,7 @@ using System.ComponentModel;
using System.Windows;
using SafeExamBrowser.Contracts.I18n;
using SafeExamBrowser.Contracts.Logging;
using SafeExamBrowser.Contracts.UserInterface;
using SafeExamBrowser.Contracts.UserInterface.Windows;
using SafeExamBrowser.UserInterface.Classic.ViewModels;
namespace SafeExamBrowser.UserInterface.Classic

View file

@ -0,0 +1,82 @@
/*
* Copyright (c) 2018 ETH Zürich, Educational Development and Technology (LET)
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
using System.Windows;
using SafeExamBrowser.Contracts.I18n;
using SafeExamBrowser.Contracts.UserInterface.MessageBox;
using MessageBoxResult = SafeExamBrowser.Contracts.UserInterface.MessageBox.MessageBoxResult;
namespace SafeExamBrowser.UserInterface.Classic
{
public class MessageBox : IMessageBox
{
private IText text;
public MessageBox(IText text)
{
this.text = text;
}
public MessageBoxResult Show(string message, string title, MessageBoxAction action = MessageBoxAction.Confirm, MessageBoxIcon icon = MessageBoxIcon.Information)
{
// The last two parameters are an unfortunate necessity, since e.g. splash screens are displayed topmost while running in their
// own thread / dispatcher, and would thus conceal the message box...
var result = System.Windows.MessageBox.Show(message, title, ToButton(action), ToImage(icon), System.Windows.MessageBoxResult.None, MessageBoxOptions.ServiceNotification);
return ToResult(result);
}
public MessageBoxResult Show(TextKey message, TextKey title, MessageBoxAction action = MessageBoxAction.Confirm, MessageBoxIcon icon = MessageBoxIcon.Information)
{
return Show(text.Get(message), text.Get(title), action, icon);
}
private MessageBoxButton ToButton(MessageBoxAction action)
{
switch (action)
{
case MessageBoxAction.YesNo:
return MessageBoxButton.YesNo;
default:
return MessageBoxButton.OK;
}
}
private MessageBoxImage ToImage(MessageBoxIcon icon)
{
switch (icon)
{
case MessageBoxIcon.Error:
return MessageBoxImage.Error;
case MessageBoxIcon.Question:
return MessageBoxImage.Question;
case MessageBoxIcon.Warning:
return MessageBoxImage.Warning;
default:
return MessageBoxImage.Information;
}
}
private MessageBoxResult ToResult(System.Windows.MessageBoxResult result)
{
switch (result)
{
case System.Windows.MessageBoxResult.Cancel:
return MessageBoxResult.Cancel;
case System.Windows.MessageBoxResult.No:
return MessageBoxResult.No;
case System.Windows.MessageBoxResult.OK:
return MessageBoxResult.Ok;
case System.Windows.MessageBoxResult.Yes:
return MessageBoxResult.Yes;
default:
return MessageBoxResult.None;
}
}
}
}

View file

@ -12,7 +12,7 @@ using System.Windows.Documents;
using SafeExamBrowser.Contracts.Configuration;
using SafeExamBrowser.Contracts.I18n;
using SafeExamBrowser.Contracts.Logging;
using SafeExamBrowser.Contracts.UserInterface;
using SafeExamBrowser.Contracts.UserInterface.Windows;
using SafeExamBrowser.UserInterface.Classic.ViewModels;
namespace SafeExamBrowser.UserInterface.Classic

View file

@ -105,6 +105,7 @@
<Compile Include="LogWindow.xaml.cs">
<DependentUpon>LogWindow.xaml</DependentUpon>
</Compile>
<Compile Include="MessageBox.cs" />
<Compile Include="RuntimeWindow.xaml.cs">
<DependentUpon>RuntimeWindow.xaml</DependentUpon>
</Compile>

View file

@ -10,7 +10,7 @@ using System.Windows;
using System.Windows.Documents;
using SafeExamBrowser.Contracts.Configuration;
using SafeExamBrowser.Contracts.I18n;
using SafeExamBrowser.Contracts.UserInterface;
using SafeExamBrowser.Contracts.UserInterface.Windows;
using SafeExamBrowser.UserInterface.Classic.ViewModels;
namespace SafeExamBrowser.UserInterface.Classic

View file

@ -7,16 +7,16 @@
*/
using System.Threading;
using System.Windows;
using SafeExamBrowser.Contracts.Configuration;
using SafeExamBrowser.Contracts.Configuration.Settings;
using SafeExamBrowser.Contracts.I18n;
using SafeExamBrowser.Contracts.Logging;
using SafeExamBrowser.Contracts.UserInterface;
using SafeExamBrowser.Contracts.UserInterface.Browser;
using SafeExamBrowser.Contracts.UserInterface.Taskbar;
using SafeExamBrowser.Contracts.UserInterface.Windows;
using SafeExamBrowser.UserInterface.Classic.Controls;
using SafeExamBrowser.UserInterface.Classic.Utilities;
using MessageBoxResult = SafeExamBrowser.Contracts.UserInterface.MessageBoxResult;
namespace SafeExamBrowser.UserInterface.Classic
{
@ -137,62 +137,5 @@ namespace SafeExamBrowser.UserInterface.Classic
{
return new WirelessNetworkControl();
}
public MessageBoxResult Show(string message, string title, MessageBoxAction action = MessageBoxAction.Confirm, MessageBoxIcon icon = MessageBoxIcon.Information)
{
// The last two parameters are an unfortunate necessity, since e.g. splash screens are displayed topmost while running in their
// own thread / dispatcher, and would thus conceal the message box...
var result = MessageBox.Show(message, title, ToButton(action), ToImage(icon), System.Windows.MessageBoxResult.None, MessageBoxOptions.ServiceNotification);
return ToResult(result);
}
public MessageBoxResult Show(TextKey message, TextKey title, MessageBoxAction action = MessageBoxAction.Confirm, MessageBoxIcon icon = MessageBoxIcon.Information)
{
return Show(text.Get(message), text.Get(title), action, icon);
}
private MessageBoxButton ToButton(MessageBoxAction action)
{
switch (action)
{
case MessageBoxAction.YesNo:
return MessageBoxButton.YesNo;
default:
return MessageBoxButton.OK;
}
}
private MessageBoxImage ToImage(MessageBoxIcon icon)
{
switch (icon)
{
case MessageBoxIcon.Error:
return MessageBoxImage.Error;
case MessageBoxIcon.Question:
return MessageBoxImage.Question;
case MessageBoxIcon.Warning:
return MessageBoxImage.Warning;
default:
return MessageBoxImage.Information;
}
}
private MessageBoxResult ToResult(System.Windows.MessageBoxResult result)
{
switch (result)
{
case System.Windows.MessageBoxResult.Cancel:
return MessageBoxResult.Cancel;
case System.Windows.MessageBoxResult.No:
return MessageBoxResult.No;
case System.Windows.MessageBoxResult.OK:
return MessageBoxResult.Ok;
case System.Windows.MessageBoxResult.Yes:
return MessageBoxResult.Yes;
default:
return MessageBoxResult.None;
}
}
}
}

View file

@ -10,7 +10,7 @@ using System.Windows;
using System.Windows.Documents;
using SafeExamBrowser.Contracts.Configuration;
using SafeExamBrowser.Contracts.I18n;
using SafeExamBrowser.Contracts.UserInterface;
using SafeExamBrowser.Contracts.UserInterface.Windows;
namespace SafeExamBrowser.UserInterface.Windows10
{

View file

@ -10,7 +10,7 @@ using System.ComponentModel;
using System.Windows;
using SafeExamBrowser.Contracts.I18n;
using SafeExamBrowser.Contracts.Logging;
using SafeExamBrowser.Contracts.UserInterface;
using SafeExamBrowser.Contracts.UserInterface.Windows;
using SafeExamBrowser.UserInterface.Windows10.ViewModels;
namespace SafeExamBrowser.UserInterface.Windows10

View file

@ -10,7 +10,7 @@ using System.Windows;
using System.Windows.Documents;
using SafeExamBrowser.Contracts.Configuration;
using SafeExamBrowser.Contracts.I18n;
using SafeExamBrowser.Contracts.UserInterface;
using SafeExamBrowser.Contracts.UserInterface.Windows;
using SafeExamBrowser.UserInterface.Windows10.ViewModels;
namespace SafeExamBrowser.UserInterface.Windows10

View file

@ -7,15 +7,15 @@
*/
using System.Threading;
using System.Windows;
using SafeExamBrowser.Contracts.Configuration;
using SafeExamBrowser.Contracts.Configuration.Settings;
using SafeExamBrowser.Contracts.I18n;
using SafeExamBrowser.Contracts.Logging;
using SafeExamBrowser.Contracts.UserInterface;
using SafeExamBrowser.Contracts.UserInterface.Browser;
using SafeExamBrowser.Contracts.UserInterface.Taskbar;
using SafeExamBrowser.Contracts.UserInterface.Windows;
using SafeExamBrowser.UserInterface.Windows10.Controls;
using MessageBoxResult = SafeExamBrowser.Contracts.UserInterface.MessageBoxResult;
namespace SafeExamBrowser.UserInterface.Windows10
{
@ -122,62 +122,5 @@ namespace SafeExamBrowser.UserInterface.Windows10
// TODO
throw new System.NotImplementedException();
}
public MessageBoxResult Show(string message, string title, MessageBoxAction action = MessageBoxAction.Confirm, MessageBoxIcon icon = MessageBoxIcon.Information)
{
// The last two parameters are an unfortunate necessity, since e.g. splash screens are displayed topmost while running in their
// own thread / dispatcher, and would thus conceal the message box...
var result = MessageBox.Show(message, title, ToButton(action), ToImage(icon), System.Windows.MessageBoxResult.None, MessageBoxOptions.ServiceNotification);
return ToResult(result);
}
public MessageBoxResult Show(TextKey message, TextKey title, MessageBoxAction action = MessageBoxAction.Confirm, MessageBoxIcon icon = MessageBoxIcon.Information)
{
return Show(text.Get(message), text.Get(title), action, icon);
}
private MessageBoxButton ToButton(MessageBoxAction action)
{
switch (action)
{
case MessageBoxAction.YesNo:
return MessageBoxButton.YesNo;
default:
return MessageBoxButton.OK;
}
}
private MessageBoxImage ToImage(MessageBoxIcon icon)
{
switch (icon)
{
case MessageBoxIcon.Error:
return MessageBoxImage.Error;
case MessageBoxIcon.Question:
return MessageBoxImage.Question;
case MessageBoxIcon.Warning:
return MessageBoxImage.Warning;
default:
return MessageBoxImage.Information;
}
}
private MessageBoxResult ToResult(System.Windows.MessageBoxResult result)
{
switch (result)
{
case System.Windows.MessageBoxResult.Cancel:
return MessageBoxResult.Cancel;
case System.Windows.MessageBoxResult.No:
return MessageBoxResult.No;
case System.Windows.MessageBoxResult.OK:
return MessageBoxResult.Ok;
case System.Windows.MessageBoxResult.Yes:
return MessageBoxResult.Yes;
default:
return MessageBoxResult.None;
}
}
}
}