SEBWIN-106: Implemented basic zoom functionality for browser.
This commit is contained in:
parent
483eec6ef8
commit
6527969e75
17 changed files with 235 additions and 74 deletions
|
@ -149,6 +149,7 @@ namespace SafeExamBrowser.Browser
|
||||||
|
|
||||||
private void Instance_PopupRequested(PopupRequestedEventArgs args)
|
private void Instance_PopupRequested(PopupRequestedEventArgs args)
|
||||||
{
|
{
|
||||||
|
// TODO: Use settings for additional browser windows!
|
||||||
var popupSettings = new BrowserSettings
|
var popupSettings = new BrowserSettings
|
||||||
{
|
{
|
||||||
AllowAddressBar = false,
|
AllowAddressBar = false,
|
||||||
|
|
|
@ -76,7 +76,10 @@ namespace SafeExamBrowser.Browser
|
||||||
|
|
||||||
displayHandler.FaviconChanged += DisplayHandler_FaviconChanged;
|
displayHandler.FaviconChanged += DisplayHandler_FaviconChanged;
|
||||||
downloadHandler.ConfigurationDownloadRequested += DownloadHandler_ConfigurationDownloadRequested;
|
downloadHandler.ConfigurationDownloadRequested += DownloadHandler_ConfigurationDownloadRequested;
|
||||||
keyboardHandler.ReloadRequested += KeyboardHandler_ReloadRequested;
|
keyboardHandler.ReloadRequested += ReloadRequested;
|
||||||
|
keyboardHandler.ZoomInRequested += ZoomInRequested;
|
||||||
|
keyboardHandler.ZoomOutRequested += ZoomOutRequested;
|
||||||
|
keyboardHandler.ZoomResetRequested += ZoomResetRequested;
|
||||||
lifeSpanHandler.PopupRequested += LifeSpanHandler_PopupRequested;
|
lifeSpanHandler.PopupRequested += LifeSpanHandler_PopupRequested;
|
||||||
|
|
||||||
control = new BrowserControl(contextMenuHandler, displayHandler, downloadHandler, keyboardHandler, lifeSpanHandler, requestHandler, settings.StartUrl);
|
control = new BrowserControl(contextMenuHandler, displayHandler, downloadHandler, keyboardHandler, lifeSpanHandler, requestHandler, settings.StartUrl);
|
||||||
|
@ -91,40 +94,16 @@ namespace SafeExamBrowser.Browser
|
||||||
window.IsMainWindow = isMainInstance;
|
window.IsMainWindow = isMainInstance;
|
||||||
window.Closing += () => Terminated?.Invoke(Id);
|
window.Closing += () => Terminated?.Invoke(Id);
|
||||||
window.AddressChanged += Window_AddressChanged;
|
window.AddressChanged += Window_AddressChanged;
|
||||||
window.ReloadRequested += Window_ReloadRequested;
|
window.ReloadRequested += ReloadRequested;
|
||||||
window.BackwardNavigationRequested += Window_BackwardNavigationRequested;
|
window.BackwardNavigationRequested += Window_BackwardNavigationRequested;
|
||||||
window.ForwardNavigationRequested += Window_ForwardNavigationRequested;
|
window.ForwardNavigationRequested += Window_ForwardNavigationRequested;
|
||||||
|
window.ZoomInRequested += ZoomInRequested;
|
||||||
|
window.ZoomOutRequested += ZoomOutRequested;
|
||||||
|
window.ZoomResetRequested += ZoomResetRequested;
|
||||||
|
|
||||||
logger.Debug("Initialized browser window.");
|
logger.Debug("Initialized browser window.");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void HandleReloadRequest()
|
|
||||||
{
|
|
||||||
if (settings.AllowReloading && settings.ShowReloadWarning)
|
|
||||||
{
|
|
||||||
var result = messageBox.Show(TextKey.MessageBox_ReloadConfirmation, TextKey.MessageBox_ReloadConfirmationTitle, MessageBoxAction.YesNo, MessageBoxIcon.Question, window);
|
|
||||||
|
|
||||||
if (result == MessageBoxResult.Yes)
|
|
||||||
{
|
|
||||||
logger.Debug("The user confirmed reloading the current page...");
|
|
||||||
control.Reload();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
logger.Debug("The user aborted reloading the current page.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (settings.AllowReloading)
|
|
||||||
{
|
|
||||||
logger.Debug("Reloading current page...");
|
|
||||||
control.Reload();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
logger.Debug("Blocked reload attempt, as the user is not allowed to reload web pages.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Control_AddressChanged(string address)
|
private void Control_AddressChanged(string address)
|
||||||
{
|
{
|
||||||
logger.Debug($"Navigated to '{address}'.");
|
logger.Debug($"Navigated to '{address}'.");
|
||||||
|
@ -164,11 +143,6 @@ namespace SafeExamBrowser.Browser
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void KeyboardHandler_ReloadRequested()
|
|
||||||
{
|
|
||||||
HandleReloadRequest();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void LifeSpanHandler_PopupRequested(PopupRequestedEventArgs args)
|
private void LifeSpanHandler_PopupRequested(PopupRequestedEventArgs args)
|
||||||
{
|
{
|
||||||
if (settings.AllowPopups)
|
if (settings.AllowPopups)
|
||||||
|
@ -182,17 +156,39 @@ namespace SafeExamBrowser.Browser
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void ReloadRequested()
|
||||||
|
{
|
||||||
|
if (settings.AllowReloading && settings.ShowReloadWarning)
|
||||||
|
{
|
||||||
|
var result = messageBox.Show(TextKey.MessageBox_ReloadConfirmation, TextKey.MessageBox_ReloadConfirmationTitle, MessageBoxAction.YesNo, MessageBoxIcon.Question, window);
|
||||||
|
|
||||||
|
if (result == MessageBoxResult.Yes)
|
||||||
|
{
|
||||||
|
logger.Debug("The user confirmed reloading the current page...");
|
||||||
|
control.Reload();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logger.Debug("The user aborted reloading the current page.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (settings.AllowReloading)
|
||||||
|
{
|
||||||
|
logger.Debug("Reloading current page...");
|
||||||
|
control.Reload();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logger.Debug("Blocked reload attempt, as the user is not allowed to reload web pages.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void Window_AddressChanged(string address)
|
private void Window_AddressChanged(string address)
|
||||||
{
|
{
|
||||||
logger.Debug($"The user requested to navigate to '{address}'.");
|
logger.Debug($"The user requested to navigate to '{address}'.");
|
||||||
control.NavigateTo(address);
|
control.NavigateTo(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Window_ReloadRequested()
|
|
||||||
{
|
|
||||||
HandleReloadRequest();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Window_BackwardNavigationRequested()
|
private void Window_BackwardNavigationRequested()
|
||||||
{
|
{
|
||||||
logger.Debug($"Navigating forwards...");
|
logger.Debug($"Navigating forwards...");
|
||||||
|
@ -204,5 +200,32 @@ namespace SafeExamBrowser.Browser
|
||||||
logger.Debug($"Navigating backwards...");
|
logger.Debug($"Navigating backwards...");
|
||||||
control.NavigateForwards();
|
control.NavigateForwards();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void ZoomInRequested()
|
||||||
|
{
|
||||||
|
if (settings.AllowPageZoom)
|
||||||
|
{
|
||||||
|
control.ZoomIn();
|
||||||
|
logger.Debug("Increased page zoom.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ZoomOutRequested()
|
||||||
|
{
|
||||||
|
if (settings.AllowPageZoom)
|
||||||
|
{
|
||||||
|
control.ZoomOut();
|
||||||
|
logger.Debug("Decreased page zoom.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ZoomResetRequested()
|
||||||
|
{
|
||||||
|
if (settings.AllowPageZoom)
|
||||||
|
{
|
||||||
|
control.ZoomReset();
|
||||||
|
logger.Debug("Reset page zoom.");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,8 @@ namespace SafeExamBrowser.Browser
|
||||||
{
|
{
|
||||||
internal class BrowserControl : ChromiumWebBrowser, IBrowserControl
|
internal class BrowserControl : ChromiumWebBrowser, IBrowserControl
|
||||||
{
|
{
|
||||||
|
private const double ZOOM_FACTOR = 0.1;
|
||||||
|
|
||||||
private IContextMenuHandler contextMenuHandler;
|
private IContextMenuHandler contextMenuHandler;
|
||||||
private IDisplayHandler displayHandler;
|
private IDisplayHandler displayHandler;
|
||||||
private IDownloadHandler downloadHandler;
|
private IDownloadHandler downloadHandler;
|
||||||
|
@ -94,5 +96,32 @@ namespace SafeExamBrowser.Browser
|
||||||
{
|
{
|
||||||
GetBrowser().Reload();
|
GetBrowser().Reload();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void ZoomReset()
|
||||||
|
{
|
||||||
|
GetBrowser().SetZoomLevel(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ZoomIn()
|
||||||
|
{
|
||||||
|
GetBrowser().GetZoomLevelAsync().ContinueWith(task =>
|
||||||
|
{
|
||||||
|
if (task.IsCompleted)
|
||||||
|
{
|
||||||
|
GetBrowser().SetZoomLevel(task.Result + ZOOM_FACTOR);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ZoomOut()
|
||||||
|
{
|
||||||
|
GetBrowser().GetZoomLevelAsync().ContinueWith(task =>
|
||||||
|
{
|
||||||
|
if (task.IsCompleted)
|
||||||
|
{
|
||||||
|
GetBrowser().SetZoomLevel(task.Result - ZOOM_FACTOR);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 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/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace SafeExamBrowser.Browser.Events
|
|
||||||
{
|
|
||||||
internal delegate void ReloadRequestedEventHandler();
|
|
||||||
}
|
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using CefSharp;
|
using CefSharp;
|
||||||
using SafeExamBrowser.Browser.Events;
|
using SafeExamBrowser.Contracts.UserInterface;
|
||||||
|
|
||||||
namespace SafeExamBrowser.Browser.Handlers
|
namespace SafeExamBrowser.Browser.Handlers
|
||||||
{
|
{
|
||||||
|
@ -17,16 +17,37 @@ namespace SafeExamBrowser.Browser.Handlers
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
internal class KeyboardHandler : IKeyboardHandler
|
internal class KeyboardHandler : IKeyboardHandler
|
||||||
{
|
{
|
||||||
public event ReloadRequestedEventHandler ReloadRequested;
|
public event ActionRequestedEventHandler ReloadRequested;
|
||||||
|
public event ActionRequestedEventHandler ZoomInRequested;
|
||||||
|
public event ActionRequestedEventHandler ZoomOutRequested;
|
||||||
|
public event ActionRequestedEventHandler ZoomResetRequested;
|
||||||
|
|
||||||
public bool OnKeyEvent(IWebBrowser browserControl, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey)
|
public bool OnKeyEvent(IWebBrowser browserControl, IBrowser browser, KeyType type, int keyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey)
|
||||||
{
|
{
|
||||||
|
var ctrl = modifiers.HasFlag(CefEventFlags.ControlDown);
|
||||||
|
var shift = modifiers.HasFlag(CefEventFlags.ShiftDown);
|
||||||
|
|
||||||
|
if (type == KeyType.KeyUp && ((keyCode == (int)Keys.Add && ctrl) || (keyCode == (int)Keys.D1 && ctrl && shift)))
|
||||||
|
{
|
||||||
|
ZoomInRequested?.Invoke();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (type == KeyType.KeyUp && (keyCode == (int) Keys.Subtract || keyCode == (int) Keys.OemMinus) && ctrl)
|
||||||
|
{
|
||||||
|
ZoomOutRequested?.Invoke();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (type == KeyType.KeyUp && (keyCode == (int) Keys.D0 || keyCode == (int) Keys.NumPad0) && ctrl)
|
||||||
|
{
|
||||||
|
ZoomResetRequested?.Invoke();
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool OnPreKeyEvent(IWebBrowser browserControl, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey, ref bool isKeyboardShortcut)
|
public bool OnPreKeyEvent(IWebBrowser browserControl, IBrowser browser, KeyType type, int keyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey, ref bool isKeyboardShortcut)
|
||||||
{
|
{
|
||||||
if (type == KeyType.KeyUp && windowsKeyCode == (int) Keys.F5)
|
if (type == KeyType.KeyUp && keyCode == (int) Keys.F5)
|
||||||
{
|
{
|
||||||
ReloadRequested?.Invoke();
|
ReloadRequested?.Invoke();
|
||||||
|
|
||||||
|
|
|
@ -69,7 +69,6 @@
|
||||||
<Compile Include="Events\FaviconChangedEventHandler.cs" />
|
<Compile Include="Events\FaviconChangedEventHandler.cs" />
|
||||||
<Compile Include="Events\PopupRequestedEventArgs.cs" />
|
<Compile Include="Events\PopupRequestedEventArgs.cs" />
|
||||||
<Compile Include="Events\PopupRequestedEventHandler.cs" />
|
<Compile Include="Events\PopupRequestedEventHandler.cs" />
|
||||||
<Compile Include="Events\ReloadRequestedEventHandler.cs" />
|
|
||||||
<Compile Include="Handlers\ContextMenuHandler.cs" />
|
<Compile Include="Handlers\ContextMenuHandler.cs" />
|
||||||
<Compile Include="BrowserControl.cs">
|
<Compile Include="BrowserControl.cs">
|
||||||
<SubType>Component</SubType>
|
<SubType>Component</SubType>
|
||||||
|
|
|
@ -15,6 +15,7 @@ namespace SafeExamBrowser.Contracts.I18n
|
||||||
public enum TextKey
|
public enum TextKey
|
||||||
{
|
{
|
||||||
Browser_ShowDeveloperConsole,
|
Browser_ShowDeveloperConsole,
|
||||||
|
BrowserWindow_ZoomMenuItem,
|
||||||
LogWindow_Title,
|
LogWindow_Title,
|
||||||
MessageBox_ApplicationError,
|
MessageBox_ApplicationError,
|
||||||
MessageBox_ApplicationErrorTitle,
|
MessageBox_ApplicationErrorTitle,
|
||||||
|
|
|
@ -174,7 +174,7 @@
|
||||||
<Compile Include="SystemComponents\ISystemComponent.cs" />
|
<Compile Include="SystemComponents\ISystemComponent.cs" />
|
||||||
<Compile Include="SystemComponents\IWirelessNetwork.cs" />
|
<Compile Include="SystemComponents\IWirelessNetwork.cs" />
|
||||||
<Compile Include="SystemComponents\WirelessNetworkStatus.cs" />
|
<Compile Include="SystemComponents\WirelessNetworkStatus.cs" />
|
||||||
<Compile Include="UserInterface\Browser\Events\ActionRequestedEventHandler.cs" />
|
<Compile Include="UserInterface\Events\ActionRequestedEventHandler.cs" />
|
||||||
<Compile Include="UserInterface\Browser\Events\AddressChangedEventHandler.cs" />
|
<Compile Include="UserInterface\Browser\Events\AddressChangedEventHandler.cs" />
|
||||||
<Compile Include="UserInterface\Browser\Events\LoadingStateChangedEventHandler.cs" />
|
<Compile Include="UserInterface\Browser\Events\LoadingStateChangedEventHandler.cs" />
|
||||||
<Compile Include="UserInterface\Browser\Events\TitleChangedEventHandler.cs" />
|
<Compile Include="UserInterface\Browser\Events\TitleChangedEventHandler.cs" />
|
||||||
|
|
|
@ -55,5 +55,20 @@ namespace SafeExamBrowser.Contracts.UserInterface.Browser
|
||||||
/// Reloads the current web page.
|
/// Reloads the current web page.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
void Reload();
|
void Reload();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Increases the page zoom.
|
||||||
|
/// </summary>
|
||||||
|
void ZoomIn();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Decreases the page zoom.
|
||||||
|
/// </summary>
|
||||||
|
void ZoomOut();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Resets the page zoom.
|
||||||
|
/// </summary>
|
||||||
|
void ZoomReset();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,6 +37,21 @@ namespace SafeExamBrowser.Contracts.UserInterface.Browser
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event ActionRequestedEventHandler ReloadRequested;
|
event ActionRequestedEventHandler ReloadRequested;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Event fired when the user would like to zoom in.
|
||||||
|
/// </summary>
|
||||||
|
event ActionRequestedEventHandler ZoomInRequested;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Event fired when the user would like to zoom out.
|
||||||
|
/// </summary>
|
||||||
|
event ActionRequestedEventHandler ZoomOutRequested;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Event fired when the user would like to reset the zoom factor.
|
||||||
|
/// </summary>
|
||||||
|
event ActionRequestedEventHandler ZoomResetRequested;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Determines whether this window is the main browser window.
|
/// Determines whether this window is the main browser window.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace SafeExamBrowser.Contracts.UserInterface.Browser.Events
|
namespace SafeExamBrowser.Contracts.UserInterface
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates that the user requested an action.
|
/// Indicates that the user requested an action.
|
|
@ -3,6 +3,9 @@
|
||||||
<Entry key="Browser_ShowDeveloperConsole">
|
<Entry key="Browser_ShowDeveloperConsole">
|
||||||
Open Console
|
Open Console
|
||||||
</Entry>
|
</Entry>
|
||||||
|
<Entry key="BrowserWindow_ZoomMenuItem">
|
||||||
|
Page Zoom
|
||||||
|
</Entry>
|
||||||
<Entry key="LogWindow_Title">
|
<Entry key="LogWindow_Title">
|
||||||
Application Log
|
Application Log
|
||||||
</Entry>
|
</Entry>
|
||||||
|
|
|
@ -4,13 +4,14 @@
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
xmlns:fa="http://schemas.fontawesome.io/icons/"
|
xmlns:fa="http://schemas.fontawesome.io/icons/"
|
||||||
xmlns:local="clr-namespace:SafeExamBrowser.UserInterface.Desktop"
|
xmlns:local="clr-namespace:SafeExamBrowser.UserInterface.Desktop.Controls"
|
||||||
mc:Ignorable="d" Title="BrowserWindow" Background="#FFF0F0F0" Height="500" Width="750" MinHeight="250" MinWidth="250" Icon=".\Images\SafeExamBrowser.ico">
|
mc:Ignorable="d" Title="BrowserWindow" Background="#FFF0F0F0" Height="500" Width="750" MinHeight="250" MinWidth="250" Icon=".\Images\SafeExamBrowser.ico">
|
||||||
<Window.Resources>
|
<Window.Resources>
|
||||||
<ResourceDictionary>
|
<ResourceDictionary>
|
||||||
<ResourceDictionary.MergedDictionaries>
|
<ResourceDictionary.MergedDictionaries>
|
||||||
<ResourceDictionary Source="./Templates/Buttons.xaml" />
|
<ResourceDictionary Source="./Templates/Buttons.xaml" />
|
||||||
<ResourceDictionary Source="./Templates/Colors.xaml" />
|
<ResourceDictionary Source="./Templates/Colors.xaml" />
|
||||||
|
<ResourceDictionary Source="./Templates/ScrollViewers.xaml" />
|
||||||
</ResourceDictionary.MergedDictionaries>
|
</ResourceDictionary.MergedDictionaries>
|
||||||
</ResourceDictionary>
|
</ResourceDictionary>
|
||||||
</Window.Resources>
|
</Window.Resources>
|
||||||
|
@ -19,21 +20,47 @@
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="*" />
|
<RowDefinition Height="*" />
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
<Border Grid.Row="0" BorderBrush="LightGray" BorderThickness="0 0 0 1">
|
<Border Grid.Row="0" BorderBrush="LightGray" BorderThickness="0,0,0,1" Margin="5,0">
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
<ColumnDefinition Width="*" />
|
<ColumnDefinition Width="*" />
|
||||||
<ColumnDefinition Width="Auto" />
|
<ColumnDefinition Width="Auto" />
|
||||||
<ColumnDefinition Width="Auto" />
|
|
||||||
<ColumnDefinition Width="Auto" />
|
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
<Grid Grid.Column="0" Height="25" Margin="10">
|
<Button Grid.Column="0" x:Name="BackButton" Height="30" HorizontalAlignment="Center" Margin="5" Template="{StaticResource BrowserButton}" VerticalAlignment="Center" />
|
||||||
|
<Button Grid.Column="1" x:Name="ForwardButton" Height="30" HorizontalAlignment="Center" Margin="5" Template="{StaticResource BrowserButton}" VerticalAlignment="Center" />
|
||||||
|
<Button Grid.Column="2" x:Name="ReloadButton" Height="30" HorizontalAlignment="Center" Margin="5" Template="{StaticResource BrowserButton}" VerticalAlignment="Center" />
|
||||||
|
<Grid Grid.Column="3" Height="25" Margin="5,0">
|
||||||
<TextBox x:Name="UrlTextBox" HorizontalAlignment="Stretch" Padding="5,0" VerticalContentAlignment="Center" />
|
<TextBox x:Name="UrlTextBox" HorizontalAlignment="Stretch" Padding="5,0" VerticalContentAlignment="Center" />
|
||||||
<fa:ImageAwesome x:Name="LoadingIcon" Foreground="Gray" HorizontalAlignment="Right" Icon="Spinner" Margin="5,3" SpinDuration="1.5" Visibility="Collapsed" />
|
<fa:ImageAwesome x:Name="LoadingIcon" Foreground="Gray" HorizontalAlignment="Right" Icon="Spinner" Margin="5,3" SpinDuration="1.5" Visibility="Collapsed" />
|
||||||
</Grid>
|
</Grid>
|
||||||
<Button Grid.Column="1" x:Name="ReloadButton" Height="30" HorizontalAlignment="Center" Margin="2.5,5,2.5,5" Template="{StaticResource BrowserButton}" VerticalAlignment="Center" />
|
<Button Grid.Column="4" x:Name="MenuButton" Height="30" HorizontalAlignment="Center" Margin="5" Template="{StaticResource BrowserButton}" VerticalAlignment="Center" />
|
||||||
<Button Grid.Column="2" x:Name="BackButton" Height="30" HorizontalAlignment="Center" Margin="2.5,5,2.5,5" Template="{StaticResource BrowserButton}" VerticalAlignment="Center" />
|
<Popup x:Name="MenuPopup" IsOpen="False" Placement="Bottom" PlacementTarget="{Binding ElementName=MenuButton}" HorizontalOffset="-215" VerticalOffset="4">
|
||||||
<Button Grid.Column="3" x:Name="ForwardButton" Height="30" HorizontalAlignment="Center" Margin="2.5,5,5,5" Template="{StaticResource BrowserButton}" VerticalAlignment="Center" />
|
<Border Background="{StaticResource BackgroundBrush}" BorderBrush="LightGray" BorderThickness="0.75,0,0.75,0.75" Width="250">
|
||||||
|
<StackPanel Orientation="Vertical">
|
||||||
|
<Grid Height="40">
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="*" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<TextBlock Grid.Column="0" x:Name="ZoomText" HorizontalAlignment="Center" VerticalAlignment="Center" />
|
||||||
|
<Button Grid.Column="1" x:Name="ZoomInButton" Margin="5" Padding="5" Template="{StaticResource BrowserButton}">
|
||||||
|
<fa:ImageAwesome Icon="SearchPlus" />
|
||||||
|
</Button>
|
||||||
|
<Button Grid.Column="2" x:Name="ZoomResetButton" Margin="5" Padding="5" Template="{StaticResource BrowserButton}">
|
||||||
|
<fa:ImageAwesome Icon="Refresh" />
|
||||||
|
</Button>
|
||||||
|
<Button Grid.Column="3" x:Name="ZoomOutButton" Margin="5" Padding="5" Template="{StaticResource BrowserButton}">
|
||||||
|
<fa:ImageAwesome Icon="SearchMinus" />
|
||||||
|
</Button>
|
||||||
|
</Grid>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
</Popup>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Border>
|
</Border>
|
||||||
<WindowsFormsHost Grid.Row="1" x:Name="BrowserControlHost" />
|
<WindowsFormsHost Grid.Row="1" x:Name="BrowserControlHost" />
|
||||||
|
|
|
@ -7,11 +7,15 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.Threading.Tasks;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
|
using System.Windows.Media;
|
||||||
using System.Windows.Media.Imaging;
|
using System.Windows.Media.Imaging;
|
||||||
using SafeExamBrowser.Contracts.Configuration;
|
using SafeExamBrowser.Contracts.Configuration;
|
||||||
using SafeExamBrowser.Contracts.Configuration.Settings;
|
using SafeExamBrowser.Contracts.Configuration.Settings;
|
||||||
|
using SafeExamBrowser.Contracts.I18n;
|
||||||
|
using SafeExamBrowser.Contracts.UserInterface;
|
||||||
using SafeExamBrowser.Contracts.UserInterface.Browser;
|
using SafeExamBrowser.Contracts.UserInterface.Browser;
|
||||||
using SafeExamBrowser.Contracts.UserInterface.Browser.Events;
|
using SafeExamBrowser.Contracts.UserInterface.Browser.Events;
|
||||||
using SafeExamBrowser.Contracts.UserInterface.Taskbar.Events;
|
using SafeExamBrowser.Contracts.UserInterface.Taskbar.Events;
|
||||||
|
@ -24,7 +28,8 @@ namespace SafeExamBrowser.UserInterface.Desktop
|
||||||
{
|
{
|
||||||
private bool isMainWindow;
|
private bool isMainWindow;
|
||||||
private BrowserSettings settings;
|
private BrowserSettings settings;
|
||||||
public WindowClosingEventHandler closing;
|
private IText text;
|
||||||
|
private WindowClosingEventHandler closing;
|
||||||
|
|
||||||
public bool IsMainWindow
|
public bool IsMainWindow
|
||||||
{
|
{
|
||||||
|
@ -43,6 +48,9 @@ namespace SafeExamBrowser.UserInterface.Desktop
|
||||||
public event ActionRequestedEventHandler BackwardNavigationRequested;
|
public event ActionRequestedEventHandler BackwardNavigationRequested;
|
||||||
public event ActionRequestedEventHandler ForwardNavigationRequested;
|
public event ActionRequestedEventHandler ForwardNavigationRequested;
|
||||||
public event ActionRequestedEventHandler ReloadRequested;
|
public event ActionRequestedEventHandler ReloadRequested;
|
||||||
|
public event ActionRequestedEventHandler ZoomInRequested;
|
||||||
|
public event ActionRequestedEventHandler ZoomOutRequested;
|
||||||
|
public event ActionRequestedEventHandler ZoomResetRequested;
|
||||||
|
|
||||||
event WindowClosingEventHandler IWindow.Closing
|
event WindowClosingEventHandler IWindow.Closing
|
||||||
{
|
{
|
||||||
|
@ -50,9 +58,10 @@ namespace SafeExamBrowser.UserInterface.Desktop
|
||||||
remove { closing -= value; }
|
remove { closing -= value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public BrowserWindow(IBrowserControl browserControl, BrowserSettings settings)
|
public BrowserWindow(IBrowserControl browserControl, BrowserSettings settings, IText text)
|
||||||
{
|
{
|
||||||
this.settings = settings;
|
this.settings = settings;
|
||||||
|
this.text = text;
|
||||||
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
InitializeBrowserWindow(browserControl);
|
InitializeBrowserWindow(browserControl);
|
||||||
|
@ -112,25 +121,36 @@ namespace SafeExamBrowser.UserInterface.Desktop
|
||||||
|
|
||||||
private void InitializeBrowserWindow(IBrowserControl browserControl)
|
private void InitializeBrowserWindow(IBrowserControl browserControl)
|
||||||
{
|
{
|
||||||
|
var originalBrush = MenuButton.Background;
|
||||||
|
|
||||||
if (browserControl is System.Windows.Forms.Control control)
|
if (browserControl is System.Windows.Forms.Control control)
|
||||||
{
|
{
|
||||||
BrowserControlHost.Child = control;
|
BrowserControlHost.Child = control;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BackButton.Click += (o, args) => BackwardNavigationRequested?.Invoke();
|
||||||
Closing += (o, args) => closing?.Invoke();
|
Closing += (o, args) => closing?.Invoke();
|
||||||
|
ForwardButton.Click += (o, args) => ForwardNavigationRequested?.Invoke();
|
||||||
|
MenuButton.Click += (o, args) => MenuPopup.IsOpen = !MenuPopup.IsOpen;
|
||||||
|
MenuButton.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => MenuPopup.IsOpen = MenuPopup.IsMouseOver));
|
||||||
|
MenuPopup.Closed += (o, args) => { MenuButton.Background = originalBrush; };
|
||||||
|
MenuPopup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => MenuPopup.IsOpen = IsMouseOver));
|
||||||
|
MenuPopup.Opened += (o, args) => { MenuButton.Background = Brushes.LightGray; };
|
||||||
KeyUp += BrowserWindow_KeyUp;
|
KeyUp += BrowserWindow_KeyUp;
|
||||||
|
ReloadButton.Click += (o, args) => ReloadRequested?.Invoke();
|
||||||
UrlTextBox.GotKeyboardFocus += (o, args) => UrlTextBox.SelectAll();
|
UrlTextBox.GotKeyboardFocus += (o, args) => UrlTextBox.SelectAll();
|
||||||
UrlTextBox.GotMouseCapture += UrlTextBox_GotMouseCapture;
|
UrlTextBox.GotMouseCapture += UrlTextBox_GotMouseCapture;
|
||||||
UrlTextBox.LostKeyboardFocus += (o, args) => UrlTextBox.Tag = null;
|
UrlTextBox.LostKeyboardFocus += (o, args) => UrlTextBox.Tag = null;
|
||||||
UrlTextBox.LostFocus += (o, args) => UrlTextBox.Tag = null;
|
UrlTextBox.LostFocus += (o, args) => UrlTextBox.Tag = null;
|
||||||
UrlTextBox.KeyUp += UrlTextBox_KeyUp;
|
UrlTextBox.KeyUp += UrlTextBox_KeyUp;
|
||||||
UrlTextBox.MouseDoubleClick += (o, args) => UrlTextBox.SelectAll();
|
UrlTextBox.MouseDoubleClick += (o, args) => UrlTextBox.SelectAll();
|
||||||
ReloadButton.Click += (o, args) => ReloadRequested?.Invoke();
|
ZoomInButton.Click += (o, args) => ZoomInRequested?.Invoke();
|
||||||
BackButton.Click += (o, args) => BackwardNavigationRequested?.Invoke();
|
ZoomOutButton.Click += (o, args) => ZoomOutRequested?.Invoke();
|
||||||
ForwardButton.Click += (o, args) => ForwardNavigationRequested?.Invoke();
|
ZoomResetButton.Click += (o, args) => ZoomResetRequested?.Invoke();
|
||||||
|
|
||||||
ApplySettings();
|
ApplySettings();
|
||||||
LoadIcons();
|
LoadIcons();
|
||||||
|
LoadText();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UrlTextBox_GotMouseCapture(object sender, MouseEventArgs e)
|
private void UrlTextBox_GotMouseCapture(object sender, MouseEventArgs e)
|
||||||
|
@ -198,14 +218,22 @@ namespace SafeExamBrowser.UserInterface.Desktop
|
||||||
{
|
{
|
||||||
var backUri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/NavigateBack.xaml");
|
var backUri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/NavigateBack.xaml");
|
||||||
var forwardUri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/NavigateForward.xaml");
|
var forwardUri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/NavigateForward.xaml");
|
||||||
|
var menuUri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/Menu.xaml");
|
||||||
var reloadUri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/Reload.xaml");
|
var reloadUri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/Reload.xaml");
|
||||||
var back = new XamlIconResource(backUri);
|
var back = new XamlIconResource(backUri);
|
||||||
var forward = new XamlIconResource(forwardUri);
|
var forward = new XamlIconResource(forwardUri);
|
||||||
|
var menu = new XamlIconResource(menuUri);
|
||||||
var reload = new XamlIconResource(reloadUri);
|
var reload = new XamlIconResource(reloadUri);
|
||||||
|
|
||||||
ReloadButton.Content = IconResourceLoader.Load(reload);
|
|
||||||
BackButton.Content = IconResourceLoader.Load(back);
|
BackButton.Content = IconResourceLoader.Load(back);
|
||||||
ForwardButton.Content = IconResourceLoader.Load(forward);
|
ForwardButton.Content = IconResourceLoader.Load(forward);
|
||||||
|
MenuButton.Content = IconResourceLoader.Load(menu);
|
||||||
|
ReloadButton.Content = IconResourceLoader.Load(reload);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LoadText()
|
||||||
|
{
|
||||||
|
ZoomText.Text = text.Get(TextKey.BrowserWindow_ZoomMenuItem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
7
SafeExamBrowser.UserInterface.Desktop/Images/Menu.xaml
Normal file
7
SafeExamBrowser.UserInterface.Desktop/Images/Menu.xaml
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
<Viewbox Stretch="Uniform"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:fa="http://schemas.fontawesome.io/icons/">
|
||||||
|
<Canvas Height="120" Width="120">
|
||||||
|
<Path Stroke="Black" StrokeLineJoin="Round" StrokeStartLineCap="Round" StrokeEndLineCap="Round" StrokeThickness="8" Data="M 20,30 L 100,30 M 20,60 L 100,60 M 20,90 L 100,90" />
|
||||||
|
</Canvas>
|
||||||
|
</Viewbox>
|
|
@ -162,6 +162,10 @@
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
<Generator>MSBuild:Compile</Generator>
|
<Generator>MSBuild:Compile</Generator>
|
||||||
</Page>
|
</Page>
|
||||||
|
<Resource Include="Images\Menu.xaml">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
</Resource>
|
||||||
<Page Include="Templates\ScrollViewers.xaml">
|
<Page Include="Templates\ScrollViewers.xaml">
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
<Generator>MSBuild:Compile</Generator>
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
|
|
@ -45,7 +45,7 @@ namespace SafeExamBrowser.UserInterface.Desktop
|
||||||
|
|
||||||
public IBrowserWindow CreateBrowserWindow(IBrowserControl control, BrowserSettings settings)
|
public IBrowserWindow CreateBrowserWindow(IBrowserControl control, BrowserSettings settings)
|
||||||
{
|
{
|
||||||
return new BrowserWindow(control, settings);
|
return new BrowserWindow(control, settings, text);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ISystemKeyboardLayoutControl CreateKeyboardLayoutControl()
|
public ISystemKeyboardLayoutControl CreateKeyboardLayoutControl()
|
||||||
|
|
Loading…
Reference in a new issue