diff --git a/Source/NETworkManager.Controls/MultiSelectDataGrid.cs b/Source/NETworkManager.Controls/MultiSelectDataGrid.cs index 40a89b1e8f..3aeaeaa4bb 100644 --- a/Source/NETworkManager.Controls/MultiSelectDataGrid.cs +++ b/Source/NETworkManager.Controls/MultiSelectDataGrid.cs @@ -1,4 +1,5 @@ using System.Collections; +using System.Collections.Specialized; using System.Windows; using System.Windows.Controls; @@ -6,9 +7,11 @@ namespace NETworkManager.Controls; public class MultiSelectDataGrid : DataGrid { + private bool _isUpdatingSelection; + public static readonly DependencyProperty SelectedItemsListProperty = DependencyProperty.Register("SelectedItemsList", typeof(IList), typeof(MultiSelectDataGrid), - new PropertyMetadata(null)); + new PropertyMetadata(null, OnSelectedItemsListChanged)); public MultiSelectDataGrid() { @@ -21,8 +24,81 @@ public IList SelectedItemsList set => SetValue(SelectedItemsListProperty, value); } + private static void OnSelectedItemsListChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not MultiSelectDataGrid dataGrid) + return; + + dataGrid.UnsubscribeFromCollectionChanged(e.OldValue as IList); + dataGrid.SubscribeToCollectionChanged(e.NewValue as IList); + dataGrid.UpdateSelectedItems(); + } + + private void SubscribeToCollectionChanged(IList list) + { + if (list is INotifyCollectionChanged observableCollection) + { + observableCollection.CollectionChanged += OnSelectedItemsListCollectionChanged; + } + } + + private void UnsubscribeFromCollectionChanged(IList list) + { + if (list is INotifyCollectionChanged observableCollection) + { + observableCollection.CollectionChanged -= OnSelectedItemsListCollectionChanged; + } + } + + private void OnSelectedItemsListCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) + { + UpdateSelectedItems(); + } + + private void UpdateSelectedItems() + { + if (_isUpdatingSelection) + return; + + _isUpdatingSelection = true; + + try + { + SelectedItems.Clear(); + + if (SelectedItemsList != null) + { + foreach (var item in SelectedItemsList) + { + SelectedItems.Add(item); + } + } + } + finally + { + _isUpdatingSelection = false; + } + } + private void DataGridMultiItemSelect_SelectionChanged(object sender, SelectionChangedEventArgs e) { - SelectedItemsList = SelectedItems; + if (_isUpdatingSelection || SelectedItemsList == null) + return; + + _isUpdatingSelection = true; + + try + { + SelectedItemsList.Clear(); + + foreach (var item in SelectedItems) + { + SelectedItemsList.Add(item); + } + } + finally + { + _isUpdatingSelection = false; + } } } \ No newline at end of file diff --git a/Source/NETworkManager.Settings/AppearanceManager.cs b/Source/NETworkManager.Settings/AppearanceManager.cs index 5887c0c70e..c8c8741b7e 100644 --- a/Source/NETworkManager.Settings/AppearanceManager.cs +++ b/Source/NETworkManager.Settings/AppearanceManager.cs @@ -1,5 +1,4 @@ using ControlzEx.Theming; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.Theming; using NETworkManager.Models.Appearance; using System; @@ -42,11 +41,6 @@ public static class AppearanceManager /// private const string ThemeFolderName = "Themes"; - /// - /// Contains the default settings for a new - /// - public static readonly MetroDialogSettings MetroDialog = new(); - /// /// List who contains all MahApps.Metro themes. /// @@ -83,15 +77,6 @@ static AppearanceManager() ThemeManager.Current.ThemeChanged += Current_ThemeChanged; LoadCustomThemes(); - - MetroDialog.CustomResourceDictionary = new ResourceDictionary - { - Source = new Uri("NETworkManager;component/Resources/Styles/MetroDialogStyles.xaml", - UriKind.RelativeOrAbsolute) - }; - - MetroDialog.DialogButtonFontSize = 14; - MetroDialog.DialogMessageFontSize = 14; } #endregion diff --git a/Source/NETworkManager.Utilities/VisualTreeHelper.cs b/Source/NETworkManager.Utilities/VisualTreeHelper.cs index 8592fa5756..86d560131d 100644 --- a/Source/NETworkManager.Utilities/VisualTreeHelper.cs +++ b/Source/NETworkManager.Utilities/VisualTreeHelper.cs @@ -3,8 +3,25 @@ namespace NETworkManager.Utilities; +/// +/// Provides helper methods for traversing and querying the visual tree of WPF elements. +/// +/// The VisualTreeHelper class contains static methods that facilitate searching for and enumerating +/// visual child elements within a WPF application's visual tree. These methods are useful for scenarios where you need +/// to locate elements of a specific type or perform operations on all descendants of a visual element. public class VisualTreeHelper { + /// + /// Enumerates all descendant visual children of a specified type from the visual tree starting at the given + /// dependency object. + /// + /// This method performs a recursive depth-first traversal of the visual tree. It yields each + /// descendant of the specified type, including those nested at any depth. The enumeration is deferred and elements + /// are returned as they are discovered. + /// The type of visual child to search for. Must derive from DependencyObject. + /// The root of the visual tree to search. Cannot be null. + /// An enumerable collection of all descendant elements of type T found in the visual tree. The collection is empty + /// if no matching elements are found. public static IEnumerable FindVisualChildren(DependencyObject depObj) where T : DependencyObject { if (depObj == null) @@ -19,4 +36,4 @@ public static IEnumerable FindVisualChildren(DependencyObject depObj) wher foreach (var childOfChild in FindVisualChildren(child)) yield return childOfChild; } } -} \ No newline at end of file +} diff --git a/Source/NETworkManager/App.xaml b/Source/NETworkManager/App.xaml index 059b0654ca..36c4e5454a 100644 --- a/Source/NETworkManager/App.xaml +++ b/Source/NETworkManager/App.xaml @@ -35,7 +35,6 @@ - diff --git a/Source/NETworkManager/Controls/DragablzTabHostWindow.xaml b/Source/NETworkManager/Controls/DragablzTabHostWindow.xaml index 0f2a6e2b68..a60f681974 100644 --- a/Source/NETworkManager/Controls/DragablzTabHostWindow.xaml +++ b/Source/NETworkManager/Controls/DragablzTabHostWindow.xaml @@ -10,12 +10,10 @@ xmlns:controls="clr-namespace:NETworkManager.Controls" xmlns:application="clr-namespace:NETworkManager.Models;assembly=NETworkManager.Models" xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" - xmlns:wpfHelpers="clr-namespace:NETworkManager.Utilities.WPF;assembly=NETworkManager.Utilities.WPF" - xmlns:dialogs="clr-namespace:MahApps.Metro.Controls.Dialogs;assembly=MahApps.Metro" + xmlns:wpfHelpers="clr-namespace:NETworkManager.Utilities.WPF;assembly=NETworkManager.Utilities.WPF" mc:Ignorable="d" Style="{DynamicResource DefaultWindow}" MinWidth="800" Width="1024" Height="768" MinHeight="600" - TitleAlignment="Left" Activated="MetroWindow_Activated" - dialogs:DialogParticipation.Register="{Binding}" + TitleAlignment="Left" Activated="MetroWindow_Activated" Closing="DragablzTabHostWindow_OnClosing" d:DataContext="{d:DesignInstance controls:DragablzTabHostWindow}"> diff --git a/Source/NETworkManager/Controls/DragablzTabHostWindow.xaml.cs b/Source/NETworkManager/Controls/DragablzTabHostWindow.xaml.cs index a49b4b3da9..2bbcd42044 100644 --- a/Source/NETworkManager/Controls/DragablzTabHostWindow.xaml.cs +++ b/Source/NETworkManager/Controls/DragablzTabHostWindow.xaml.cs @@ -1,5 +1,4 @@ using Dragablz; -using MahApps.Metro.Controls.Dialogs; using NETworkManager.Localization; using NETworkManager.Localization.Resources; using NETworkManager.Models; @@ -224,13 +223,13 @@ private async void RemoteDesktop_SendCtrlAltDelAction(object view) } catch (Exception ex) { - ConfigurationManager.OnDialogOpen(); + //ConfigurationManager.OnDialogOpen(); - await this.ShowMessageAsync(Strings.Error, - string.Format("{0}\n\nMessage:\n{1}", - Strings.CouldNotSendKeystroke, ex.Message)); + // Use built-in message box because we have visual issues in the dragablz window + System.Windows.MessageBox.Show(string.Format("{0}\n\nMessage:\n{1}", + Strings.CouldNotSendKeystroke, ex.Message), Strings.Error, MessageBoxButton.OK, MessageBoxImage.Error); - ConfigurationManager.OnDialogClose(); + //ConfigurationManager.OnDialogClose(); } } diff --git a/Source/NETworkManager/Controls/PowerShellControl.xaml b/Source/NETworkManager/Controls/PowerShellControl.xaml index b9fc10e9c1..051baa2312 100644 --- a/Source/NETworkManager/Controls/PowerShellControl.xaml +++ b/Source/NETworkManager/Controls/PowerShellControl.xaml @@ -8,8 +8,7 @@ xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" xmlns:local="clr-namespace:NETworkManager.Controls" xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" - xmlns:settings="clr-namespace:NETworkManager.Settings;assembly=NETworkManager.Settings" - mah:DialogParticipation.Register="{Binding}" + xmlns:settings="clr-namespace:NETworkManager.Settings;assembly=NETworkManager.Settings" mc:Ignorable="d" Loaded="UserControl_Loaded" d:DataContext="{d:DesignInstance local:PowerShellControl}"> diff --git a/Source/NETworkManager/Controls/PowerShellControl.xaml.cs b/Source/NETworkManager/Controls/PowerShellControl.xaml.cs index d8dbd968b0..420654fc22 100644 --- a/Source/NETworkManager/Controls/PowerShellControl.xaml.cs +++ b/Source/NETworkManager/Controls/PowerShellControl.xaml.cs @@ -5,7 +5,6 @@ using System.Threading.Tasks; using System.Windows; using System.Windows.Input; -using MahApps.Metro.Controls.Dialogs; using NETworkManager.Localization.Resources; using NETworkManager.Models.PowerShell; using NETworkManager.Settings; @@ -29,8 +28,6 @@ private void WindowGrid_SizeChanged(object sender, SizeChangedEventArgs e) private bool _initialized; private bool _closed; - private readonly IDialogCoordinator _dialogCoordinator; - private readonly Guid _tabId; private readonly PowerShellSessionInfo _sessionInfo; @@ -76,8 +73,6 @@ public PowerShellControl(Guid tabId, PowerShellSessionInfo sessionInfo) InitializeComponent(); DataContext = this; - _dialogCoordinator = DialogCoordinator.Instance; - ConfigurationManager.Current.PowerShellTabCount++; _tabId = tabId; @@ -196,17 +191,8 @@ private async Task Connect() catch (Exception ex) { if (!_closed) - { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - - ConfigurationManager.OnDialogOpen(); - - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, - ex.Message, MessageDialogStyle.Affirmative, settings); - - ConfigurationManager.OnDialogClose(); - } + // Use built-in message box because we have visual issues in the dragablz window + MessageBox.Show(ex.Message, Strings.Error, MessageBoxButton.OK, MessageBoxImage.Error); } IsConnecting = false; diff --git a/Source/NETworkManager/Controls/PuTTYControl.xaml b/Source/NETworkManager/Controls/PuTTYControl.xaml index 227a61868f..d431ec8685 100644 --- a/Source/NETworkManager/Controls/PuTTYControl.xaml +++ b/Source/NETworkManager/Controls/PuTTYControl.xaml @@ -9,7 +9,6 @@ xmlns:local="clr-namespace:NETworkManager.Controls" xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" xmlns:settings="clr-namespace:NETworkManager.Settings;assembly=NETworkManager.Settings" - mah:DialogParticipation.Register="{Binding}" mc:Ignorable="d" Loaded="UserControl_Loaded" d:DataContext="{d:DesignInstance local:PuTTYControl}"> diff --git a/Source/NETworkManager/Controls/PuTTYControl.xaml.cs b/Source/NETworkManager/Controls/PuTTYControl.xaml.cs index fdc8ef9f3a..8d7c623af2 100644 --- a/Source/NETworkManager/Controls/PuTTYControl.xaml.cs +++ b/Source/NETworkManager/Controls/PuTTYControl.xaml.cs @@ -5,7 +5,6 @@ using System.Threading.Tasks; using System.Windows; using System.Windows.Input; -using MahApps.Metro.Controls.Dialogs; using NETworkManager.Localization.Resources; using NETworkManager.Models.PuTTY; using NETworkManager.Settings; @@ -30,8 +29,6 @@ private void WindowGrid_SizeChanged(object sender, SizeChangedEventArgs e) private bool _initialized; private bool _closed; - private readonly IDialogCoordinator _dialogCoordinator; - private readonly Guid _tabId; private readonly PuTTYSessionInfo _sessionInfo; @@ -77,8 +74,6 @@ public PuTTYControl(Guid tabId, PuTTYSessionInfo sessionInfo) InitializeComponent(); DataContext = this; - _dialogCoordinator = DialogCoordinator.Instance; - ConfigurationManager.Current.PuTTYTabCount++; _tabId = tabId; @@ -213,17 +208,8 @@ private async Task Connect() catch (Exception ex) { if (!_closed) - { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - - ConfigurationManager.OnDialogOpen(); - - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, - ex.Message, MessageDialogStyle.Affirmative, settings); - - ConfigurationManager.OnDialogClose(); - } + // Use built-in message box because we have visual issues in the dragablz window + MessageBox.Show(ex.Message, Strings.Error, MessageBoxButton.OK, MessageBoxImage.Error); } IsConnecting = false; diff --git a/Source/NETworkManager/Controls/TigerVNCControl.xaml b/Source/NETworkManager/Controls/TigerVNCControl.xaml index a20f0c5a3e..eaa52952ef 100644 --- a/Source/NETworkManager/Controls/TigerVNCControl.xaml +++ b/Source/NETworkManager/Controls/TigerVNCControl.xaml @@ -9,7 +9,6 @@ xmlns:local="clr-namespace:NETworkManager.Controls" xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" xmlns:settings="clr-namespace:NETworkManager.Settings;assembly=NETworkManager.Settings" - mah:DialogParticipation.Register="{Binding}" mc:Ignorable="d" Loaded="UserControl_Loaded" d:DataContext="{d:DesignInstance local:TigerVNCControl}"> diff --git a/Source/NETworkManager/Controls/TigerVNCControl.xaml.cs b/Source/NETworkManager/Controls/TigerVNCControl.xaml.cs index 55f8fb1e04..b4f6f4bf89 100644 --- a/Source/NETworkManager/Controls/TigerVNCControl.xaml.cs +++ b/Source/NETworkManager/Controls/TigerVNCControl.xaml.cs @@ -5,7 +5,6 @@ using System.Threading.Tasks; using System.Windows; using System.Windows.Input; -using MahApps.Metro.Controls.Dialogs; using NETworkManager.Localization.Resources; using NETworkManager.Models.TigerVNC; using NETworkManager.Settings; @@ -29,8 +28,6 @@ private void TigerVNCGrid_SizeChanged(object sender, SizeChangedEventArgs e) private bool _initialized; private bool _closed; - private readonly IDialogCoordinator _dialogCoordinator; - private readonly Guid _tabId; private readonly TigerVNCSessionInfo _sessionInfo; @@ -76,8 +73,6 @@ public TigerVNCControl(Guid tabId, TigerVNCSessionInfo sessionInfo) InitializeComponent(); DataContext = this; - _dialogCoordinator = DialogCoordinator.Instance; - ConfigurationManager.Current.TigerVNCTabCount++; _tabId = tabId; @@ -209,16 +204,8 @@ private async Task Connect() catch (Exception ex) { if (!_closed) - { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - ConfigurationManager.OnDialogOpen(); - - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, - ex.Message, MessageDialogStyle.Affirmative, settings); - - ConfigurationManager.OnDialogClose(); - } + // Use built-in message box because we have visual issues in the dragablz window + MessageBox.Show(ex.Message, Strings.Error, MessageBoxButton.OK, MessageBoxImage.Error); } IsConnecting = false; diff --git a/Source/NETworkManager/Controls/WebConsoleControl.xaml b/Source/NETworkManager/Controls/WebConsoleControl.xaml index 9ac5538813..92b8056c28 100644 --- a/Source/NETworkManager/Controls/WebConsoleControl.xaml +++ b/Source/NETworkManager/Controls/WebConsoleControl.xaml @@ -10,7 +10,6 @@ xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" xmlns:settings="clr-namespace:NETworkManager.Settings;assembly=NETworkManager.Settings" xmlns:webview="clr-namespace:Microsoft.Web.WebView2.Wpf;assembly=Microsoft.Web.WebView2.Wpf" - mah:DialogParticipation.Register="{Binding}" mc:Ignorable="d" Loaded="UserControl_Loaded" d:DataContext="{d:DesignInstance local:WebConsoleControl}"> diff --git a/Source/NETworkManager/DialogHelper.cs b/Source/NETworkManager/DialogHelper.cs index 818dd8ab76..a5882b633a 100644 --- a/Source/NETworkManager/DialogHelper.cs +++ b/Source/NETworkManager/DialogHelper.cs @@ -24,19 +24,19 @@ public static class DialogHelper /// The title text displayed in the message dialog window. Cannot be null. /// The main message content shown in the dialog. Cannot be null. /// The icon to display in the dialog, indicating the message type. Defaults to Info if not specified. - /// The text to display on the OK button. If null, a default value is used. + /// The text to display on the confirm button. If null, a default value is used. /// A task that completes when the user closes the message dialog. - public static Task ShowOKMessageAsync(Window parentWindow, string title, string message, ChildWindowIcon icon = ChildWindowIcon.Info, string buttonOKText = null) + public static Task ShowMessageAsync(Window parentWindow, string title, string message, ChildWindowIcon icon = ChildWindowIcon.Info, string confirmButtonText = null) { - buttonOKText ??= Strings.OK; + confirmButtonText ??= Strings.OK; - var childWindow = new OKMessageChildWindow(); + var childWindow = new MessageChildWindow(); - var childWindowViewModel = new OKMessageViewModel(_ => + var childWindowViewModel = new MessageViewModel(_ => { childWindow.IsOpen = false; ConfigurationManager.Current.IsChildWindowOpen = false; - }, message, icon, buttonOKText); + }, message, icon, confirmButtonText); childWindow.Title = title; @@ -58,20 +58,20 @@ public static Task ShowOKMessageAsync(Window parentWindow, string title, string /// The title text displayed in the dialog window. /// The message content shown to the user in the dialog. /// The icon displayed in the dialog to indicate the message type. Defaults to Info. - /// The text label for the OK button. If null, a default value is used. - /// The text label for the Cancel button. If null, a default value is used. + /// The text label for the confirm button. If null, a default value is used. + /// The text label for the cancel button. If null, a default value is used. /// A task that represents the asynchronous operation. The task result is if the user /// clicks OK; otherwise, . - public static async Task ShowOKCancelMessageAsync(Window parentWindow, string title, string message, ChildWindowIcon icon = ChildWindowIcon.Info, string buttonOKText = null, string buttonCancelText = null) + public static async Task ShowConfirmationMessageAsync(Window parentWindow, string title, string message, ChildWindowIcon icon = ChildWindowIcon.Info, string confirmButtonText = null, string cancelButtonText = null) { - buttonOKText ??= Strings.OK; - buttonCancelText ??= Strings.Cancel; + confirmButtonText ??= Strings.OK; + cancelButtonText ??= Strings.Cancel; var result = false; - var childWindow = new OKCancelMessageChildWindow(); + var childWindow = new MessageConfirmationChildWindow(); - var childWindowViewModel = new OKCancelMessageViewModel(_ => + var childWindowViewModel = new MessageConfirmationViewModel(_ => { childWindow.IsOpen = false; ConfigurationManager.Current.IsChildWindowOpen = false; @@ -83,7 +83,7 @@ public static async Task ShowOKCancelMessageAsync(Window parentWindow, str childWindow.IsOpen = false; ConfigurationManager.Current.IsChildWindowOpen = false; }, - message, icon, buttonOKText, buttonCancelText); + message, icon, confirmButtonText, cancelButtonText); childWindow.Title = title; childWindow.DataContext = childWindowViewModel; diff --git a/Source/NETworkManager/MainWindow.xaml b/Source/NETworkManager/MainWindow.xaml index bffce2d0e2..e0badb75ef 100644 --- a/Source/NETworkManager/MainWindow.xaml +++ b/Source/NETworkManager/MainWindow.xaml @@ -10,14 +10,12 @@ xmlns:interactivity="http://schemas.microsoft.com/xaml/behaviors" xmlns:asf="clr-namespace:AirspaceFixer;assembly=AirspaceFixer" xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" - xmlns:settings="clr-namespace:NETworkManager.Settings;assembly=NETworkManager.Settings" - xmlns:dialogs="clr-namespace:MahApps.Metro.Controls.Dialogs;assembly=MahApps.Metro" + xmlns:settings="clr-namespace:NETworkManager.Settings;assembly=NETworkManager.Settings" xmlns:resources="clr-namespace:NETworkManager.Properties" xmlns:networkManager="clr-namespace:NETworkManager" xmlns:models="clr-namespace:NETworkManager.Models;assembly=NETworkManager.Models" mc:Ignorable="d" - Style="{DynamicResource ResourceKey=DefaultWindow}" - dialogs:DialogParticipation.Register="{Binding }" + Style="{DynamicResource ResourceKey=DefaultWindow}" MinWidth="800" MinHeight="600" Width="1024" Height="768" SaveWindowPosition="True" TitleAlignment="Left" diff --git a/Source/NETworkManager/MainWindow.xaml.cs b/Source/NETworkManager/MainWindow.xaml.cs index 3a122be998..75f86b6cc8 100644 --- a/Source/NETworkManager/MainWindow.xaml.cs +++ b/Source/NETworkManager/MainWindow.xaml.cs @@ -1,6 +1,5 @@ using Dragablz; using log4net; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; using NETworkManager.Controls; using NETworkManager.Documentation; @@ -34,6 +33,7 @@ using System.Windows.Interop; using System.Windows.Markup; using System.Windows.Threading; +using static System.Runtime.InteropServices.JavaScript.JSType; using Application = System.Windows.Application; using ContextMenu = System.Windows.Controls.ContextMenu; using MouseEventArgs = System.Windows.Forms.MouseEventArgs; @@ -460,12 +460,8 @@ private async void WelcomeThenLoadAsync() // Show a note if settings have been reset if (ConfigurationManager.Current.ShowSettingsResetNoteOnStartup) { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - - await this.ShowMessageAsync(Strings.SettingsHaveBeenReset, - Strings.SettingsFileFoundWasCorruptOrNotCompatibleMessage, - MessageDialogStyle.Affirmative, settings); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.SettingsHaveBeenReset, + Strings.SettingsFileFoundWasCorruptOrNotCompatibleMessage, ChildWindowIcon.Error); } // Show welcome dialog @@ -593,19 +589,14 @@ private async void MetroWindowMain_Closing(object sender, CancelEventArgs e) if (WindowState == WindowState.Minimized) BringWindowToFront(); - var settings = AppearanceManager.MetroDialog; + ConfigurationManager.OnDialogOpen(); - settings.AffirmativeButtonText = Strings.Close; - settings.NegativeButtonText = Strings.Cancel; - settings.DefaultButtonFocus = MessageDialogResult.Affirmative; + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, Strings.ConfirmClose, + Strings.ConfirmCloseMessage, ChildWindowIcon.Question, Strings.Close, Strings.Cancel); - ConfigurationManager.OnDialogOpen(); - var result = await this.ShowMessageAsync(Strings.ConfirmClose, - Strings.ConfirmCloseMessage, MessageDialogStyle.AffirmativeAndNegative, - settings); ConfigurationManager.OnDialogClose(); - if (result != MessageDialogResult.Affirmative) + if (!result) return; _isClosing = true; @@ -1047,12 +1038,9 @@ private async void EventSystem_RedirectDataToApplicationEvent(object sender, Eve // Show error message if the application was not found if (application == null) { - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - - await this.ShowMessageAsync(Strings.Error, + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, string.Format(Strings.CouldNotFindApplicationXXXMessage, - data.Application.ToString())); + $"{data.Application}"), ChildWindowIcon.Error); return; } @@ -1464,16 +1452,10 @@ private async void SwitchProfile(ProfileFileInfo info) ConfigurationManager.Current.ProfileManagerErrorMessage = Strings.ProfileFileCouldNotBeLoaded; - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - - settings.DefaultButtonFocus = MessageDialogResult.Affirmative; - ConfigurationManager.OnDialogOpen(); - await this.ShowMessageAsync(Strings.ProfileFileCouldNotBeLoaded, - string.Format(Strings.ProfileFileCouldNotBeLoadedMessage, ex.Message), - MessageDialogStyle.Affirmative, settings); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.ProfileFileCouldNotBeLoaded, + string.Format(Strings.ProfileFileCouldNotBeLoadedMessage, ex.Message), ChildWindowIcon.Error); ConfigurationManager.OnDialogClose(); } diff --git a/Source/NETworkManager/NETworkManager.csproj b/Source/NETworkManager/NETworkManager.csproj index 11a8d3dd31..91b3d08b42 100644 --- a/Source/NETworkManager/NETworkManager.csproj +++ b/Source/NETworkManager/NETworkManager.csproj @@ -141,7 +141,7 @@ Wpf Designer - + MSBuild:Compile Wpf Designer diff --git a/Source/NETworkManager/ProfileDialogManager.cs b/Source/NETworkManager/ProfileDialogManager.cs index 2018416487..5f6d9c83f9 100644 --- a/Source/NETworkManager/ProfileDialogManager.cs +++ b/Source/NETworkManager/ProfileDialogManager.cs @@ -553,7 +553,7 @@ public static async Task ShowDeleteProfileDialog(Window parentWindow, IProfileMa viewModel.OnProfileManagerDialogOpen(); - var result = await DialogHelper.ShowOKCancelMessageAsync(parentWindow, + var result = await DialogHelper.ShowConfirmationMessageAsync(parentWindow, profiles.Count == 1 ? Strings.DeleteProfile : Strings.DeleteProfiles, profiles.Count == 1 ? Strings.DeleteProfileMessage : Strings.DeleteProfilesMessage, ChildWindowIcon.Info, @@ -639,7 +639,7 @@ public static async Task ShowDeleteGroupDialog(Window parentWindow, IProfileMana { viewModel.OnProfileManagerDialogOpen(); - var result = await DialogHelper.ShowOKCancelMessageAsync(parentWindow, + var result = await DialogHelper.ShowConfirmationMessageAsync(parentWindow, Strings.DeleteGroup, Strings.DeleteGroupMessage, ChildWindowIcon.Info, diff --git a/Source/NETworkManager/Resources/Styles/MetroDialogStyles.xaml b/Source/NETworkManager/Resources/Styles/MetroDialogStyles.xaml deleted file mode 100644 index e346ab0834..0000000000 --- a/Source/NETworkManager/Resources/Styles/MetroDialogStyles.xaml +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/ARPTableAddEntryViewModel.cs b/Source/NETworkManager/ViewModels/ARPTableAddEntryViewModel.cs index a24b7ea6e0..ddf627f729 100644 --- a/Source/NETworkManager/ViewModels/ARPTableAddEntryViewModel.cs +++ b/Source/NETworkManager/ViewModels/ARPTableAddEntryViewModel.cs @@ -7,7 +7,7 @@ namespace NETworkManager.ViewModels; /// /// View model for adding an ARP table entry. /// -public class ArpTableAddEntryViewModel : ViewModelBase +public class ARPTableAddEntryViewModel : ViewModelBase { /// /// Backing field for . @@ -20,12 +20,12 @@ public class ArpTableAddEntryViewModel : ViewModelBase private string _macAddress; /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// The action to execute when the add command is invoked. /// The action to execute when the cancel command is invoked. - public ArpTableAddEntryViewModel(Action addCommand, - Action cancelHandler) + public ARPTableAddEntryViewModel(Action addCommand, + Action cancelHandler) { AddCommand = new RelayCommand(_ => addCommand(this)); CancelCommand = new RelayCommand(_ => cancelHandler(this)); diff --git a/Source/NETworkManager/ViewModels/ARPTableViewModel.cs b/Source/NETworkManager/ViewModels/ARPTableViewModel.cs index b7de224c1b..dcab0e5f5a 100644 --- a/Source/NETworkManager/ViewModels/ARPTableViewModel.cs +++ b/Source/NETworkManager/ViewModels/ARPTableViewModel.cs @@ -1,6 +1,5 @@ using log4net; using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; using NETworkManager.Localization.Resources; using NETworkManager.Models.Export; @@ -33,10 +32,9 @@ public class ARPTableViewModel : ViewModelBase /// Initializes a new instance of the class. /// /// The dialog coordinator instance. - public ARPTableViewModel(IDialogCoordinator instance) + public ARPTableViewModel() { _isLoading = true; - _dialogCoordinator = instance; // Result view + search ResultsView = CollectionViewSource.GetDefaultView(Results); @@ -81,11 +79,6 @@ public ARPTableViewModel(IDialogCoordinator instance) private static readonly ILog Log = LogManager.GetLogger(typeof(ARPTableViewModel)); - /// - /// The dialog coordinator instance. - /// - private readonly IDialogCoordinator _dialogCoordinator; - /// /// Indicates whether the view model is loading. /// @@ -465,14 +458,13 @@ private async Task AddEntryAction() { IsStatusMessageDisplayed = false; - var customDialog = new CustomDialog - { - Title = Strings.AddEntry - }; + var childWindow = new ARPTableAddEntryChildWindow(); - var arpTableAddEntryViewModel = new ArpTableAddEntryViewModel(async instance => + + var childWindowViewModel = new ARPTableAddEntryViewModel(async instance => { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; try { @@ -489,14 +481,19 @@ private async Task AddEntryAction() StatusMessage = ex.Message; IsStatusMessageDisplayed = true; } - }, _ => { _dialogCoordinator.HideMetroDialogAsync(this, customDialog); }); - - customDialog.Content = new ARPTableAddEntryDialog + }, _ => { - DataContext = arpTableAddEntryViewModel - }; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }); - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); + childWindow.Title = Strings.AddEntry; + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; + + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } /// @@ -527,12 +524,9 @@ private Task ExportAction() { Log.Error("Error while exporting data as " + instance.FileType, ex); - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, - Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + - Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); } SettingsManager.Current.ARPTable_ExportFileType = instance.FileType; @@ -552,7 +546,7 @@ await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, ConfigurationManager.Current.IsChildWindowOpen = true; - return (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } #endregion diff --git a/Source/NETworkManager/ViewModels/BitCalculatorViewModel.cs b/Source/NETworkManager/ViewModels/BitCalculatorViewModel.cs index b4e2c816a5..5ff6cc9aca 100644 --- a/Source/NETworkManager/ViewModels/BitCalculatorViewModel.cs +++ b/Source/NETworkManager/ViewModels/BitCalculatorViewModel.cs @@ -1,6 +1,5 @@ using log4net; using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; using NETworkManager.Localization.Resources; using NETworkManager.Models.Export; @@ -26,11 +25,6 @@ public class BitCalculatorViewModel : ViewModelBase { #region Variables - /// - /// The dialog coordinator instance. - /// - private readonly IDialogCoordinator _dialogCoordinator; - private static readonly ILog Log = LogManager.GetLogger(typeof(BitCalculatorViewModel)); /// @@ -180,11 +174,9 @@ private set /// /// Initializes a new instance of the class. /// - /// The dialog coordinator instance. - public BitCalculatorViewModel(IDialogCoordinator instance) + public BitCalculatorViewModel() { _isLoading = true; - _dialogCoordinator = instance; InputHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.BitCalculator_InputHistory); @@ -258,12 +250,9 @@ private Task ExportAction() { Log.Error("Error while exporting data as " + instance.FileType, ex); - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, - Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + - Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); } SettingsManager.Current.BitCalculator_ExportFileType = instance.FileType; @@ -283,7 +272,7 @@ await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, ConfigurationManager.Current.IsChildWindowOpen = true; - return (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } #endregion diff --git a/Source/NETworkManager/ViewModels/ConnectionsViewModel.cs b/Source/NETworkManager/ViewModels/ConnectionsViewModel.cs index 7298212d95..996707a1f8 100644 --- a/Source/NETworkManager/ViewModels/ConnectionsViewModel.cs +++ b/Source/NETworkManager/ViewModels/ConnectionsViewModel.cs @@ -1,6 +1,5 @@ using log4net; using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; using NETworkManager.Localization; using NETworkManager.Localization.Resources; @@ -33,13 +32,10 @@ public class ConnectionsViewModel : ViewModelBase /// /// Initializes a new instance of the class. /// - /// The dialog coordinator instance. - public ConnectionsViewModel(IDialogCoordinator instance) + public ConnectionsViewModel() { _isLoading = true; - _dialogCoordinator = instance; - // Result view + search ResultsView = CollectionViewSource.GetDefaultView(Results); @@ -108,11 +104,6 @@ private async void AutoRefreshTimer_Tick(object sender, EventArgs e) private static readonly ILog Log = LogManager.GetLogger(typeof(ConnectionsViewModel)); - /// - /// The dialog coordinator instance. - /// - private readonly IDialogCoordinator _dialogCoordinator; - /// /// Indicates whether the view model is loading. /// @@ -412,12 +403,9 @@ private Task ExportAction() { Log.Error("Error while exporting data as " + instance.FileType, ex); - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, - Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + - Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); } SettingsManager.Current.Connections_ExportFileType = instance.FileType; @@ -438,7 +426,7 @@ await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, ConfigurationManager.Current.IsChildWindowOpen = true; - return (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } #endregion diff --git a/Source/NETworkManager/ViewModels/DNSLookupSettingsViewModel.cs b/Source/NETworkManager/ViewModels/DNSLookupSettingsViewModel.cs index be62bedbcf..8ab7dcdaf4 100644 --- a/Source/NETworkManager/ViewModels/DNSLookupSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/DNSLookupSettingsViewModel.cs @@ -1,5 +1,4 @@ using DnsClient; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; using NETworkManager.Localization.Resources; using NETworkManager.Models.Network; @@ -34,11 +33,6 @@ public class DNSLookupSettingsViewModel : ViewModelBase /// private readonly ServerConnectionInfo _profileDialogDefaultValues = new("10.0.0.1", 53, TransportProtocol.Udp); - /// - /// The dialog coordinator instance. - /// - private readonly IDialogCoordinator _dialogCoordinator; - /// /// Gets the collection view of DNS servers. /// @@ -325,13 +319,10 @@ public int Timeout /// /// Initializes a new instance of the class. /// - /// The dialog coordinator instance. - public DNSLookupSettingsViewModel(IDialogCoordinator instance) + public DNSLookupSettingsViewModel() { _isLoading = true; - _dialogCoordinator = instance; - DNSServers = CollectionViewSource.GetDefaultView(SettingsManager.Current.DNSLookup_DNSServers); DNSServers.SortDescriptions.Add(new SortDescription(nameof(DNSServerConnectionInfoProfile.Name), ListSortDirection.Ascending)); @@ -343,6 +334,8 @@ public DNSLookupSettingsViewModel(IDialogCoordinator instance) return !info.UseWindowsDNSServer; }; + SelectedDNSServer = DNSServers.Cast().FirstOrDefault(x => !x.UseWindowsDNSServer); + LoadSettings(); _isLoading = false; @@ -358,7 +351,7 @@ private void LoadSettings() CustomDNSSuffix = SettingsManager.Current.DNSLookup_CustomDNSSuffix; Recursion = SettingsManager.Current.DNSLookup_Recursion; UseCache = SettingsManager.Current.DNSLookup_UseCache; - QueryClasses = Enum.GetValues(typeof(QueryClass)).Cast().OrderBy(x => x.ToString()).ToList(); + QueryClasses = [.. Enum.GetValues().Cast().OrderBy(x => x.ToString())]; QueryClass = QueryClasses.First(x => x == SettingsManager.Current.DNSLookup_QueryClass); //ShowOnlyMostCommonQueryTypes = SettingsManager.Current.DNSLookup_ShowOnlyMostCommonQueryTypes; UseTCPOnly = SettingsManager.Current.DNSLookup_UseTCPOnly; @@ -441,7 +434,7 @@ private async Task AddDNSServer() ConfigurationManager.Current.IsChildWindowOpen = true; - await (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } /// @@ -473,7 +466,7 @@ public async Task EditDNSServer() ConfigurationManager.Current.IsChildWindowOpen = true; - await (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } /// @@ -481,7 +474,7 @@ public async Task EditDNSServer() /// private async Task DeleteDNSServer() { - var result = await DialogHelper.ShowOKCancelMessageAsync(Application.Current.MainWindow, + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, Strings.DeleteDNSServer, Strings.DeleteDNSServerMessage, ChildWindowIcon.Info, diff --git a/Source/NETworkManager/ViewModels/DNSLookupViewModel.cs b/Source/NETworkManager/ViewModels/DNSLookupViewModel.cs index 0924da7dd2..5e2a38a1fc 100644 --- a/Source/NETworkManager/ViewModels/DNSLookupViewModel.cs +++ b/Source/NETworkManager/ViewModels/DNSLookupViewModel.cs @@ -1,7 +1,6 @@ using DnsClient; using log4net; using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; using NETworkManager.Controls; using NETworkManager.Localization.Resources; @@ -15,7 +14,6 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; -using System.Diagnostics; using System.Linq; using System.Net; using System.Threading.Tasks; @@ -34,11 +32,6 @@ public class DNSLookupViewModel : ViewModelBase #region Variables private static readonly ILog Log = LogManager.GetLogger(typeof(DNSLookupViewModel)); - /// - /// The dialog coordinator instance. - /// - private readonly IDialogCoordinator _dialogCoordinator; - private readonly Guid _tabId; private bool _firstLoad = true; private bool _closed; @@ -304,15 +297,12 @@ private set /// /// Initializes a new instance of the class. /// - /// The dialog coordinator instance. /// The ID of the tab. /// The host to lookup. - public DNSLookupViewModel(IDialogCoordinator instance, Guid tabId, string host) + public DNSLookupViewModel(Guid tabId, string host) { _isLoading = true; - _dialogCoordinator = instance; - ConfigurationManager.Current.DNSLookupTabCount++; _tabId = tabId; @@ -622,12 +612,9 @@ private Task Export() { Log.Error("Error while exporting data as " + instance.FileType, ex); - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(window, Strings.Error, - Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + - Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); + await DialogHelper.ShowMessageAsync(window, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); } SettingsManager.Current.DNSLookup_ExportFileType = instance.FileType; diff --git a/Source/NETworkManager/ViewModels/DiscoveryProtocolViewModel.cs b/Source/NETworkManager/ViewModels/DiscoveryProtocolViewModel.cs index f57a45d2fe..b3a84ac13e 100644 --- a/Source/NETworkManager/ViewModels/DiscoveryProtocolViewModel.cs +++ b/Source/NETworkManager/ViewModels/DiscoveryProtocolViewModel.cs @@ -1,5 +1,4 @@ using log4net; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; using NETworkManager.Localization.Resources; using NETworkManager.Models.Export; @@ -26,11 +25,6 @@ public class DiscoveryProtocolViewModel : ViewModelBase #region Variables private static readonly ILog Log = LogManager.GetLogger(typeof(DiscoveryProtocolViewModel)); - /// - /// The dialog coordinator instance. - /// - private readonly IDialogCoordinator _dialogCoordinator; - /// /// The discovery protocol capture instance. /// @@ -296,12 +290,10 @@ private set /// Initializes a new instance of the class. /// /// The dialog coordinator instance. - public DiscoveryProtocolViewModel(IDialogCoordinator instance) + public DiscoveryProtocolViewModel() { _isLoading = true; - _dialogCoordinator = instance; - _discoveryProtocolCapture.PackageReceived += DiscoveryProtocol_PackageReceived; _discoveryProtocolCapture.ErrorReceived += DiscoveryProtocol_ErrorReceived; _discoveryProtocolCapture.WarningReceived += DiscoveryProtocol_WarningReceived; @@ -351,8 +343,7 @@ private async Task RestartAsAdminAction() } catch (Exception ex) { - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, ex.Message, - MessageDialogStyle.Affirmative, AppearanceManager.MetroDialog); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, ex.Message, ChildWindowIcon.Error); } } @@ -392,8 +383,7 @@ private async Task CaptureAction() { Log.Error("Error while trying to capture", ex); - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, ex.Message, - MessageDialogStyle.Affirmative, AppearanceManager.MetroDialog); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, ex.Message, ChildWindowIcon.Error); } } @@ -423,12 +413,9 @@ private Task ExportAction() { Log.Error("Error while exporting data as " + instance.FileType, ex); - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, - Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + - Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); } SettingsManager.Current.DiscoveryProtocol_ExportFileType = instance.FileType; @@ -449,7 +436,7 @@ await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, ConfigurationManager.Current.IsChildWindowOpen = true; - return (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } #endregion diff --git a/Source/NETworkManager/ViewModels/DropdownViewModel.cs b/Source/NETworkManager/ViewModels/DropdownViewModel.cs index a24ebe2b58..1cd4370ef6 100644 --- a/Source/NETworkManager/ViewModels/DropdownViewModel.cs +++ b/Source/NETworkManager/ViewModels/DropdownViewModel.cs @@ -9,7 +9,7 @@ namespace NETworkManager.ViewModels; /// /// View model for a dropdown dialog. /// -public class DropdownViewModel : ViewModelBase +public class DropDownViewModel : ViewModelBase { /// /// Backing field for . @@ -27,13 +27,13 @@ public class DropdownViewModel : ViewModelBase private string _selectedValue; /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// The action to execute when OK is clicked. /// The action to execute when Cancel is clicked. /// The list of values to display in the dropdown. /// The description of the value. - public DropdownViewModel(Action okCommand, Action cancelHandler, + public DropDownViewModel(Action okCommand, Action cancelHandler, List values, string valueDescription) { ValueDescription = valueDescription; diff --git a/Source/NETworkManager/ViewModels/HostsFileEditorViewModel.cs b/Source/NETworkManager/ViewModels/HostsFileEditorViewModel.cs index 08f77b591b..3734abd491 100644 --- a/Source/NETworkManager/ViewModels/HostsFileEditorViewModel.cs +++ b/Source/NETworkManager/ViewModels/HostsFileEditorViewModel.cs @@ -1,6 +1,5 @@ using log4net; using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; using NETworkManager.Localization.Resources; using NETworkManager.Models.Export; @@ -29,11 +28,6 @@ public class HostsFileEditorViewModel : ViewModelBase private static readonly ILog Log = LogManager.GetLogger(typeof(HostsFileEditorViewModel)); - /// - /// The dialog coordinator instance. - /// - private readonly IDialogCoordinator _dialogCoordinator; - /// /// Indicates whether the view model is loading. /// @@ -222,11 +216,9 @@ private set /// /// Initializes a new instance of the class. /// - /// The dialog coordinator instance. - public HostsFileEditorViewModel(IDialogCoordinator instance) + public HostsFileEditorViewModel() { _isLoading = true; - _dialogCoordinator = instance; // Result view + search ResultsView = CollectionViewSource.GetDefaultView(Results); @@ -322,12 +314,9 @@ private Task ExportAction() { Log.Error("Error while exporting data as " + instance.FileType, ex); - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + - Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); + Environment.NewLine + ex.Message, ChildWindowIcon.Error); } SettingsManager.Current.HostsFileEditor_ExportFileType = instance.FileType; @@ -347,7 +336,7 @@ await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, ConfigurationManager.Current.IsChildWindowOpen = true; - return (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } /// @@ -439,7 +428,7 @@ private async Task AddEntryAction() ConfigurationManager.Current.IsChildWindowOpen = true; - await (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } /// @@ -489,7 +478,7 @@ private async Task EditEntryAction() ConfigurationManager.Current.IsChildWindowOpen = true; - await (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } /// @@ -505,7 +494,7 @@ private async Task DeleteEntryAction() { IsModifying = true; - var result = await DialogHelper.ShowOKCancelMessageAsync(Application.Current.MainWindow, + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, Strings.DeleteEntry, string.Format(Strings.DeleteHostsFileEntryMessage, SelectedResult.IPAddress, SelectedResult.Hostname, string.IsNullOrEmpty(SelectedResult.Comment) ? "" : $"# {SelectedResult.Comment}"), @@ -557,21 +546,8 @@ private async Task ShowErrorMessageAsync(HostsFileEntryModifyResult result) _ => Strings.UnkownError }; - var childWindow = new OKMessageChildWindow(); - - var childWindowViewModel = new OKMessageViewModel(_ => - { - childWindow.IsOpen = false; - ConfigurationManager.Current.IsChildWindowOpen = false; - }, message, ChildWindowIcon.Error, Strings.OK); - - childWindow.Title = Strings.Error; - - childWindow.DataContext = childWindowViewModel; - - ConfigurationManager.Current.IsChildWindowOpen = true; - - await (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, message, + ChildWindowIcon.Error); } /// @@ -590,21 +566,8 @@ private async Task RestartAsAdminAction() } catch (Exception ex) { - var childWindow = new OKMessageChildWindow(); - - var childWindowViewModel = new OKMessageViewModel(_ => - { - childWindow.IsOpen = false; - ConfigurationManager.Current.IsChildWindowOpen = false; - }, ex.Message, ChildWindowIcon.Error, Strings.OK); - - childWindow.Title = Strings.Error; - - childWindow.DataContext = childWindowViewModel; - - ConfigurationManager.Current.IsChildWindowOpen = true; - - await (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, ex.Message, + ChildWindowIcon.Error); } } diff --git a/Source/NETworkManager/ViewModels/IPGeolocationHostViewModel.cs b/Source/NETworkManager/ViewModels/IPGeolocationHostViewModel.cs index bdea0a12fb..9eb0a0f519 100644 --- a/Source/NETworkManager/ViewModels/IPGeolocationHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/IPGeolocationHostViewModel.cs @@ -1,5 +1,4 @@ using Dragablz; -using MahApps.Metro.Controls.Dialogs; using NETworkManager.Controls; using NETworkManager.Localization.Resources; using NETworkManager.Models; diff --git a/Source/NETworkManager/ViewModels/IPGeolocationViewModel.cs b/Source/NETworkManager/ViewModels/IPGeolocationViewModel.cs index 8538ce7c66..ea4a691b6a 100644 --- a/Source/NETworkManager/ViewModels/IPGeolocationViewModel.cs +++ b/Source/NETworkManager/ViewModels/IPGeolocationViewModel.cs @@ -1,6 +1,5 @@ using log4net; using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; using NETworkManager.Controls; using NETworkManager.Localization.Resources; @@ -28,11 +27,6 @@ public class IPGeolocationViewModel : ViewModelBase private static readonly ILog Log = LogManager.GetLogger(typeof(IPGeolocationViewModel)); - /// - /// The dialog coordinator instance. - /// - private readonly IDialogCoordinator _dialogCoordinator; - private readonly Guid _tabId; private bool _firstLoad = true; private bool _closed; @@ -175,13 +169,10 @@ private set /// /// Initializes a new instance of the class. /// - /// The dialog coordinator instance. /// The ID of the tab. /// The host to query. - public IPGeolocationViewModel(IDialogCoordinator instance, Guid tabId, string host) + public IPGeolocationViewModel(Guid tabId, string host) { - _dialogCoordinator = instance; - ConfigurationManager.Current.IPGeolocationTabCount++; _tabId = tabId; @@ -335,12 +326,9 @@ private Task Export() { Log.Error("Error while exporting data as " + instance.FileType, ex); - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(window, Strings.Error, - Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + - Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); + await DialogHelper.ShowMessageAsync(window, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); } SettingsManager.Current.IPGeolocation_ExportFileType = instance.FileType; diff --git a/Source/NETworkManager/ViewModels/IPScannerHostViewModel.cs b/Source/NETworkManager/ViewModels/IPScannerHostViewModel.cs index 995d91872c..3e03a4f207 100644 --- a/Source/NETworkManager/ViewModels/IPScannerHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/IPScannerHostViewModel.cs @@ -1,5 +1,4 @@ using Dragablz; -using MahApps.Metro.Controls.Dialogs; using NETworkManager.Controls; using NETworkManager.Localization.Resources; using NETworkManager.Models; diff --git a/Source/NETworkManager/ViewModels/IPScannerSettingsViewModel.cs b/Source/NETworkManager/ViewModels/IPScannerSettingsViewModel.cs index b60ed88f02..7234d9563c 100644 --- a/Source/NETworkManager/ViewModels/IPScannerSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/IPScannerSettingsViewModel.cs @@ -1,5 +1,4 @@ -using MahApps.Metro.Controls.Dialogs; -using MahApps.Metro.SimpleChildWindow; +using MahApps.Metro.SimpleChildWindow; using NETworkManager.Localization.Resources; using NETworkManager.Settings; using NETworkManager.Utilities; @@ -24,11 +23,6 @@ public class IPScannerSettingsViewModel : ViewModelBase /// private readonly bool _isLoading; - /// - /// The dialog coordinator instance. - /// - private readonly IDialogCoordinator _dialogCoordinator; - /// /// Backing field for . /// @@ -374,13 +368,10 @@ public int MaxPortThreads /// /// Initializes a new instance of the class. /// - /// The dialog coordinator instance. - public IPScannerSettingsViewModel(IDialogCoordinator instance) + public IPScannerSettingsViewModel() { _isLoading = true; - _dialogCoordinator = instance; - CustomCommands = CollectionViewSource.GetDefaultView(SettingsManager.Current.IPScanner_CustomCommands); CustomCommands.SortDescriptions.Add(new SortDescription(nameof(CustomCommandInfo.Name), ListSortDirection.Ascending)); @@ -458,56 +449,67 @@ private void DeleteCustomCommandAction() #region Methods /// - /// Adds a new custom command. + /// Add a new custom command. /// - private async void AddCustomCommand() + private Task AddCustomCommand() { - var customDialog = new CustomDialog - { - Title = Strings.AddCustomCommand - }; + var childWindow = new CustomCommandChildWindow(); - var customCommandViewModel = new CustomCommandViewModel(instance => + var childWindowViewModel = new CustomCommandViewModel(instance => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + SettingsManager.Current.IPScanner_CustomCommands.Add(new CustomCommandInfo( + instance.ID, + instance.Name, + instance.FilePath, + instance.Arguments) + ); + }, _ => { - _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }); - SettingsManager.Current.IPScanner_CustomCommands.Add(new CustomCommandInfo(instance.ID, instance.Name, - instance.FilePath, instance.Arguments)); - }, _ => { _dialogCoordinator.HideMetroDialogAsync(this, customDialog); }); + childWindow.Title = Strings.AddCustomCommand; - customDialog.Content = new CustomCommandDialog - { - DataContext = customCommandViewModel - }; + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } /// - /// Edits the selected custom command. + /// Edit the selected custom command. /// - public async void EditCustomCommand() + public Task EditCustomCommand() { - var customDialog = new CustomDialog - { - Title = Strings.EditCustomCommand - }; - var customCommandViewModel = new CustomCommandViewModel(instance => + var childWindow = new CustomCommandChildWindow(); + + var childWindowViewModel = new CustomCommandViewModel(instance => { - _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; SettingsManager.Current.IPScanner_CustomCommands.Remove(SelectedCustomCommand); SettingsManager.Current.IPScanner_CustomCommands.Add(new CustomCommandInfo(instance.ID, instance.Name, instance.FilePath, instance.Arguments)); - }, _ => { _dialogCoordinator.HideMetroDialogAsync(this, customDialog); }, true, SelectedCustomCommand); - - customDialog.Content = new CustomCommandDialog + }, _ => { - DataContext = customCommandViewModel - }; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, true, SelectedCustomCommand); + + childWindow.Title = Strings.EditCustomCommand; + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } /// @@ -515,7 +517,7 @@ public async void EditCustomCommand() /// private async Task DeleteCustomCommand() { - var result = await DialogHelper.ShowOKCancelMessageAsync(Application.Current.MainWindow, + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, Strings.DeleteCustomCommand, Strings.DeleteCustomCommandMessage, ChildWindowIcon.Info, diff --git a/Source/NETworkManager/ViewModels/IPScannerViewModel.cs b/Source/NETworkManager/ViewModels/IPScannerViewModel.cs index a747ccb077..8ac07d114d 100644 --- a/Source/NETworkManager/ViewModels/IPScannerViewModel.cs +++ b/Source/NETworkManager/ViewModels/IPScannerViewModel.cs @@ -1,6 +1,5 @@ using log4net; using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; using NETworkManager.Controls; using NETworkManager.Localization; @@ -39,8 +38,6 @@ public class IPScannerViewModel : ViewModelBase, IProfileManagerMinimal #region Variables private static readonly ILog Log = LogManager.GetLogger(typeof(IPScannerViewModel)); - private readonly IDialogCoordinator _dialogCoordinator; - private CancellationTokenSource _cancellationTokenSource; private readonly Guid _tabId; @@ -285,13 +282,10 @@ private set /// /// Initializes a new instance of the class. /// - /// The dialog coordinator instance. /// The unique identifier for the tab. /// The initial host or IP range to scan. - public IPScannerViewModel(IDialogCoordinator instance, Guid tabId, string hostOrIPRange) + public IPScannerViewModel(Guid tabId, string hostOrIPRange) { - _dialogCoordinator = instance; - ConfigurationManager.Current.IPScannerTabCount++; _tabId = tabId; @@ -564,15 +558,17 @@ private async Task DetectIPRange() } if (!subnetmaskDetected) - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, - Strings.CouldNotDetectSubnetmask, MessageDialogStyle.Affirmative, - AppearanceManager.MetroDialog); + { + var window = Application.Current.Windows.OfType().FirstOrDefault(x => x.IsActive); + + await DialogHelper.ShowMessageAsync(window, Strings.Error, Strings.CouldNotDetectSubnetmask, ChildWindowIcon.Error); + } } else { - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, - Strings.CouldNotDetectLocalIPAddressMessage, MessageDialogStyle.Affirmative, - AppearanceManager.MetroDialog); + var window = Application.Current.Windows.OfType().FirstOrDefault(x => x.IsActive); + + await DialogHelper.ShowMessageAsync(window, Strings.Error, Strings.CouldNotDetectLocalIPAddressMessage, ChildWindowIcon.Error); } IsSubnetDetectionRunning = false; @@ -614,10 +610,9 @@ private async Task CustomCommand(object guid) { Log.Error("Error trying to run custom command", ex); - await _dialogCoordinator.ShowMessageAsync(this, - Strings.ResourceManager.GetString("Error", - LocalizationManager.GetInstance().Culture), ex.Message, MessageDialogStyle.Affirmative, - AppearanceManager.MetroDialog); + var window = Application.Current.Windows.OfType().FirstOrDefault(x => x.IsActive); + + await DialogHelper.ShowMessageAsync(window, Strings.Error, ex.Message, ChildWindowIcon.Error); } } } @@ -667,12 +662,9 @@ private Task Export() { Log.Error("Error while exporting data as " + instance.FileType, ex); - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(window, Strings.Error, + await DialogHelper.ShowMessageAsync(window, Strings.Error, Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + - Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); + Environment.NewLine + ex.Message, ChildWindowIcon.Error); } SettingsManager.Current.IPScanner_ExportFileType = instance.FileType; diff --git a/Source/NETworkManager/ViewModels/ListenersViewModel.cs b/Source/NETworkManager/ViewModels/ListenersViewModel.cs index 5d47544065..a7b4fe06cc 100644 --- a/Source/NETworkManager/ViewModels/ListenersViewModel.cs +++ b/Source/NETworkManager/ViewModels/ListenersViewModel.cs @@ -1,6 +1,5 @@ using log4net; using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; using NETworkManager.Localization.Resources; using NETworkManager.Models.Export; @@ -32,13 +31,10 @@ public class ListenersViewModel : ViewModelBase /// /// Initializes a new instance of the class. /// - /// The dialog coordinator instance. - public ListenersViewModel(IDialogCoordinator instance) + public ListenersViewModel() { _isLoading = true; - _dialogCoordinator = instance; - // Result view + search ResultsView = CollectionViewSource.GetDefaultView(Results); @@ -99,11 +95,6 @@ private async void AutoRefreshTimer_Tick(object sender, EventArgs e) private static readonly ILog Log = LogManager.GetLogger(typeof(ListenersViewModel)); - /// - /// The dialog coordinator instance. - /// - private readonly IDialogCoordinator _dialogCoordinator; - /// /// Indicates whether the view model is loading. /// @@ -402,12 +393,9 @@ private Task ExportAction() { Log.Error("Error while exporting data as " + instance.FileType, ex); - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, - Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + - Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); } SettingsManager.Current.Listeners_ExportFileType = instance.FileType; @@ -426,7 +414,7 @@ await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, ConfigurationManager.Current.IsChildWindowOpen = true; - return (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } #endregion diff --git a/Source/NETworkManager/ViewModels/LookupOUILookupViewModel.cs b/Source/NETworkManager/ViewModels/LookupOUILookupViewModel.cs index 76daee1589..3ee09ff332 100644 --- a/Source/NETworkManager/ViewModels/LookupOUILookupViewModel.cs +++ b/Source/NETworkManager/ViewModels/LookupOUILookupViewModel.cs @@ -1,6 +1,5 @@ using log4net; using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; using NETworkManager.Localization.Resources; using NETworkManager.Models.Export; @@ -32,11 +31,8 @@ public class LookupOUILookupViewModel : ViewModelBase /// /// Initializes a new instance of the class. /// - /// The dialog coordinator instance. - public LookupOUILookupViewModel(IDialogCoordinator instance) + public LookupOUILookupViewModel() { - _dialogCoordinator = instance; - // Search history SearchHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.Lookup_OUI_SearchHistory); @@ -77,11 +73,6 @@ private void AddSearchToHistory(string macAddressOrVendor) /// private static readonly ILog Log = LogManager.GetLogger(typeof(LookupOUILookupViewModel)); - /// - /// The dialog coordinator. - /// - private readonly IDialogCoordinator _dialogCoordinator; - /// /// Backing field for . /// @@ -338,12 +329,9 @@ private Task ExportAction() { Log.Error("Error while exporting data as " + instance.FileType, ex); - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, - Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + - Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); } SettingsManager.Current.Lookup_OUI_ExportFileType = instance.FileType; @@ -363,7 +351,7 @@ await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, ConfigurationManager.Current.IsChildWindowOpen = true; - return (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } #endregion diff --git a/Source/NETworkManager/ViewModels/LookupPortViewModel.cs b/Source/NETworkManager/ViewModels/LookupPortViewModel.cs index 7051fa87f0..4c93491d56 100644 --- a/Source/NETworkManager/ViewModels/LookupPortViewModel.cs +++ b/Source/NETworkManager/ViewModels/LookupPortViewModel.cs @@ -1,6 +1,5 @@ using log4net; using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; using NETworkManager.Localization.Resources; using NETworkManager.Models.Export; @@ -33,11 +32,8 @@ public class LookupPortLookupViewModel : ViewModelBase /// /// Initializes a new instance of the class. /// - /// The dialog coordinator instance. - public LookupPortLookupViewModel(IDialogCoordinator instance) + public LookupPortLookupViewModel() { - _dialogCoordinator = instance; - SearchHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.Lookup_Port_SearchHistory); ResultsView = CollectionViewSource.GetDefaultView(Results); } @@ -73,11 +69,6 @@ private void AddSearchToHistory(string portOrService) /// private static readonly ILog Log = LogManager.GetLogger(typeof(LookupPortLookupViewModel)); - /// - /// The dialog coordinator. - /// - private readonly IDialogCoordinator _dialogCoordinator; - /// /// Backing field for . /// @@ -399,12 +390,9 @@ private Task ExportAction() { Log.Error("Error while exporting data as " + instance.FileType, ex); - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, - Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + - Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); } SettingsManager.Current.Lookup_Port_ExportFileType = instance.FileType; @@ -424,7 +412,7 @@ await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, ConfigurationManager.Current.IsChildWindowOpen = true; - return (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } #endregion diff --git a/Source/NETworkManager/ViewModels/OKCancelMessageViewModel.cs b/Source/NETworkManager/ViewModels/MessageConfirmationViewModel.cs similarity index 64% rename from Source/NETworkManager/ViewModels/OKCancelMessageViewModel.cs rename to Source/NETworkManager/ViewModels/MessageConfirmationViewModel.cs index ba61091858..3472366e86 100644 --- a/Source/NETworkManager/ViewModels/OKCancelMessageViewModel.cs +++ b/Source/NETworkManager/ViewModels/MessageConfirmationViewModel.cs @@ -7,33 +7,33 @@ namespace NETworkManager.ViewModels; /// /// Represents the ViewModel for a message dialog with OK and Cancel options. /// -public class OKCancelMessageViewModel : ViewModelBase +public class MessageConfirmationViewModel : ViewModelBase { /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// - /// The action to execute when the OK button is clicked. + /// The action to execute when the confirm button is clicked. /// The action to execute when the Cancel button is clicked. /// The message to display. /// The icon to display in the message window. - /// The text for the OK button. - /// The text for the Cancel button. - public OKCancelMessageViewModel(Action okCommand, - Action cancelHandler, string message, ChildWindowIcon icon = ChildWindowIcon.Info, string okButtonText = null, string cancelButtonText = null) + /// The text for the confirm button. + /// The text for the cancel button. + public MessageConfirmationViewModel(Action confirmCommand, + Action cancelHandler, string message, ChildWindowIcon icon = ChildWindowIcon.Info, string confirmButtonText = null, string cancelButtonText = null) { - OKCommand = new RelayCommand(_ => okCommand(this)); + ConfirmCommand = new RelayCommand(_ => confirmCommand(this)); CancelCommand = new RelayCommand(_ => cancelHandler(this)); Message = message; - OKButtonText = okButtonText ?? Localization.Resources.Strings.OK; + ConfirmButtonText = confirmButtonText ?? Localization.Resources.Strings.OK; CancelButtonText = cancelButtonText ?? Localization.Resources.Strings.Cancel; } /// /// Gets the command for the OK button. /// - public ICommand OKCommand { get; } + public ICommand ConfirmCommand { get; } /// /// Gets the command for the Cancel button. @@ -58,20 +58,20 @@ private init } } - private readonly string _okButtonText; + private readonly string _confirmButtonText; /// - /// Gets the text for the OK button. + /// Gets the text for the confirm button. /// - public string OKButtonText + public string ConfirmButtonText { - get => _okButtonText; + get => _confirmButtonText; private init { - if (value == _okButtonText) + if (value == _confirmButtonText) return; - _okButtonText = value; + _confirmButtonText = value; OnPropertyChanged(); } } @@ -79,7 +79,7 @@ private init private readonly string _cancelButtonText; /// - /// Gets the text for the Cancel button. + /// Gets the text for the cancel button. /// public string CancelButtonText { diff --git a/Source/NETworkManager/ViewModels/OKMessageViewModel.cs b/Source/NETworkManager/ViewModels/MessageViewModel.cs similarity index 59% rename from Source/NETworkManager/ViewModels/OKMessageViewModel.cs rename to Source/NETworkManager/ViewModels/MessageViewModel.cs index 690e177d58..1dc4a20c16 100644 --- a/Source/NETworkManager/ViewModels/OKMessageViewModel.cs +++ b/Source/NETworkManager/ViewModels/MessageViewModel.cs @@ -7,29 +7,29 @@ namespace NETworkManager.ViewModels; /// /// Represents the ViewModel for a message dialog with an OK option. /// -public class OKMessageViewModel : ViewModelBase +public class MessageViewModel : ViewModelBase { /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// - /// The action to execute when the OK button is clicked. + /// The action to execute when the confirm button is clicked. /// The message to display. /// The icon to display in the message window. - /// The text for the OK button. - public OKMessageViewModel(Action okCommand, string message, ChildWindowIcon icon = ChildWindowIcon.Info, string okButtonText = null) + /// The text for the OK button. + public MessageViewModel(Action confirmCommand, string message, ChildWindowIcon icon = ChildWindowIcon.Info, string confirmButtonText = null) { - OKCommand = new RelayCommand(_ => okCommand(this)); + ConfirmCommand = new RelayCommand(_ => confirmCommand(this)); Message = message; - OKButtonText = okButtonText ?? Localization.Resources.Strings.OK; + ConfirmButtonText = confirmButtonText ?? Localization.Resources.Strings.OK; Icon = icon; } /// /// Gets the command for the OK button. /// - public ICommand OKCommand { get; } + public ICommand ConfirmCommand { get; } private readonly string _message; @@ -49,20 +49,20 @@ private init } } - private readonly string _okButtonText; + private readonly string _confirmButtonText; /// - /// Gets the text for the OK button. + /// Gets the text for the confirm button. /// - public string OKButtonText + public string ConfirmButtonText { - get => _okButtonText; + get => _confirmButtonText; private init { - if (value == _okButtonText) + if (value == _confirmButtonText) return; - _okButtonText = value; + _confirmButtonText = value; OnPropertyChanged(); } } diff --git a/Source/NETworkManager/ViewModels/NetworkInterfaceViewModel.cs b/Source/NETworkManager/ViewModels/NetworkInterfaceViewModel.cs index cfbff48e89..08d2a724e5 100644 --- a/Source/NETworkManager/ViewModels/NetworkInterfaceViewModel.cs +++ b/Source/NETworkManager/ViewModels/NetworkInterfaceViewModel.cs @@ -3,8 +3,8 @@ using LiveCharts.Wpf; using log4net; using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; +using NETworkManager.Controls; using NETworkManager.Localization.Resources; using NETworkManager.Models; using NETworkManager.Models.EventSystem; @@ -27,7 +27,6 @@ using System.Windows.Data; using System.Windows.Input; using System.Windows.Threading; -using NETworkManager.Controls; using NetworkInterface = NETworkManager.Models.Network.NetworkInterface; namespace NETworkManager.ViewModels; @@ -41,7 +40,6 @@ public class NetworkInterfaceViewModel : ViewModelBase, IProfileManager private static readonly ILog Log = LogManager.GetLogger(typeof(NetworkInterfaceViewModel)); - private readonly IDialogCoordinator _dialogCoordinator; private readonly DispatcherTimer _searchDispatcherTimer = new(); private bool _searchDisabled; private BandwidthMeter _bandwidthMeter; @@ -761,12 +759,10 @@ public GridLength ProfileWidth /// Initializes a new instance of the class. /// /// The dialog coordinator instance. - public NetworkInterfaceViewModel(IDialogCoordinator instance) + public NetworkInterfaceViewModel() { _isLoading = true; - _dialogCoordinator = instance; - LoadNetworkInterfaces().ConfigureAwait(false); InitialBandwidthChart(); @@ -919,12 +915,9 @@ private Task ExportAction() { Log.Error("Error while exporting data as " + instance.FileType, ex); - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + - Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); + Environment.NewLine + ex.Message, ChildWindowIcon.Error); } SettingsManager.Current.NetworkInterface_ExportFileType = instance.FileType; @@ -945,7 +938,7 @@ await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, ConfigurationManager.Current.IsChildWindowOpen = true; - return (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } /// @@ -1222,24 +1215,27 @@ private void Renew6Action() private async Task AddIPv4AddressAction() { - var customDialog = new CustomDialog - { - Title = Strings.AddIPv4Address - }; + var childWindow = new IPAddressAndSubnetmaskChildWindow(); - var ipAddressAndSubnetmaskViewModel = new IPAddressAndSubnetmaskViewModel(async instance => + var childWindowViewModel = new IPAddressAndSubnetmaskViewModel(async instance => { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; await AddIPv4Address(instance.IPAddress, instance.Subnetmask); - }, _ => { _dialogCoordinator.HideMetroDialogAsync(this, customDialog); }); - - customDialog.Content = new IPAddressAndSubnetmaskDialog + }, _ => { - DataContext = ipAddressAndSubnetmaskViewModel - }; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }); + + childWindow.Title = Strings.AddIPv4Address; + + childWindow.DataContext = childWindowViewModel; - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); + ConfigurationManager.Current.IsChildWindowOpen = true; + + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } /// @@ -1250,26 +1246,30 @@ private async Task AddIPv4AddressAction() private async Task RemoveIPv4AddressAction() { - var customDialog = new CustomDialog - { - Title = Strings.RemoveIPv4Address - }; + var childWindow = new DropDownChildWindow(); - var dropdownViewModel = new DropdownViewModel(async instance => + var childWindowViewModel = new DropDownViewModel(async instance => { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; await RemoveIPv4Address(instance.SelectedValue.Split("/")[0]); - }, _ => { _dialogCoordinator.HideMetroDialogAsync(this, customDialog); }, - SelectedNetworkInterface.IPv4Address.Select(x => $"{x.Item1}/{Subnetmask.ConvertSubnetmaskToCidr(x.Item2)}") - .ToList(), Strings.IPv4Address); + }, _ => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, + [.. SelectedNetworkInterface.IPv4Address.Select(x => $"{x.Item1}/{Subnetmask.ConvertSubnetmaskToCidr(x.Item2)}")], + Strings.IPv4Address + ); - customDialog.Content = new DropdownDialog - { - DataContext = dropdownViewModel - }; + childWindow.Title = Strings.RemoveIPv4Address; + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } #endregion @@ -1476,8 +1476,8 @@ private async Task OpenNetworkConnectionsAsync() } catch (Exception ex) { - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, ex.Message, - MessageDialogStyle.Affirmative, AppearanceManager.MetroDialog); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, ex.Message, + ChildWindowIcon.Error); } } diff --git a/Source/NETworkManager/ViewModels/PingMonitorHostViewModel.cs b/Source/NETworkManager/ViewModels/PingMonitorHostViewModel.cs index c2366c25dc..12918d0ba7 100644 --- a/Source/NETworkManager/ViewModels/PingMonitorHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/PingMonitorHostViewModel.cs @@ -1,5 +1,4 @@ using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; using NETworkManager.Controls; using NETworkManager.Localization.Resources; using NETworkManager.Models; @@ -30,7 +29,6 @@ public class PingMonitorHostViewModel : ViewModelBase, IProfileManager { #region Variables - private readonly IDialogCoordinator _dialogCoordinator; private CancellationTokenSource _cancellationTokenSource; private readonly DispatcherTimer _searchDispatcherTimer = new(); @@ -407,13 +405,10 @@ public GridLength ProfileWidth /// /// Initializes a new instance of the class. /// - /// The dialog coordinator instance. - public PingMonitorHostViewModel(IDialogCoordinator instance) + public PingMonitorHostViewModel() { _isLoading = true; - _dialogCoordinator = instance; - // Host history HostHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.PingMonitor_HostHistory); @@ -651,8 +646,8 @@ public bool SetHost(string host, string group = null) // Check if it is already running or canceling if (IsRunning || IsCanceling) { - _dialogCoordinator.ShowMessageAsync(this, Strings.Error, - Strings.CannotSetHostWhileRunningMessage); + DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + Strings.CannotSetHostWhileRunningMessage, ChildWindowIcon.Error); return false; } diff --git a/Source/NETworkManager/ViewModels/PingMonitorViewModel.cs b/Source/NETworkManager/ViewModels/PingMonitorViewModel.cs index b75affda55..db205fd8b3 100644 --- a/Source/NETworkManager/ViewModels/PingMonitorViewModel.cs +++ b/Source/NETworkManager/ViewModels/PingMonitorViewModel.cs @@ -2,7 +2,6 @@ using LiveCharts.Configurations; using LiveCharts.Wpf; using log4net; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; using NETworkManager.Localization.Resources; using NETworkManager.Models.Export; @@ -34,16 +33,13 @@ public class PingMonitorViewModel : ViewModelBase /// /// Initializes a new instance of the class. /// - /// The dialog coordinator instance. /// The unique identifier for the host. /// Action to remove the host by its GUID. /// Tuple containing the IP address and hostname. /// The group name the host belongs to. - public PingMonitorViewModel(IDialogCoordinator instance, Guid hostId, Action removeHostByGuid, + public PingMonitorViewModel(Guid hostId, Action removeHostByGuid, (IPAddress ipAddress, string hostname) host, string group) { - _dialogCoordinator = instance; - HostId = hostId; _removeHostByGuid = removeHostByGuid; @@ -63,7 +59,6 @@ public PingMonitorViewModel(IDialogCoordinator instance, Guid hostId, Action public class PortProfilesViewModel : ViewModelBase { - private string _search; - - private IList _selectedPortProfiles = new ArrayList(); + #region Constructor /// /// Initializes a new instance of the class. @@ -47,8 +46,16 @@ public PortProfilesViewModel(Action okCommand, Action -1 || info.Ports.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1; }; + + SelectedPortProfiles = new ArrayList { + PortProfiles.Cast().FirstOrDefault() + }; } + #endregion + + #region Variables + /// /// Gets the command to confirm the selection. /// @@ -59,6 +66,11 @@ public PortProfilesViewModel(Action okCommand, Action public ICommand CancelCommand { get; } + /// + /// Backing field for the Search property. + /// + private string _search; + /// /// Gets or sets the search text to filter the port profiles. /// @@ -74,6 +86,10 @@ public string Search PortProfiles.Refresh(); + SelectedPortProfiles = new ArrayList { + PortProfiles.Cast().FirstOrDefault() + }; + OnPropertyChanged(); } } @@ -83,6 +99,11 @@ public string Search /// public ICollectionView PortProfiles { get; } + /// + /// Backing field for the SelectedPortProfiles property. + /// + private IList _selectedPortProfiles = new ArrayList(); + /// /// Gets or sets the list of selected port profiles. /// @@ -98,13 +119,16 @@ public IList SelectedPortProfiles OnPropertyChanged(); } } + #endregion + #region Methods /// /// Gets the selected port profiles as a typed collection. /// /// A collection of selected . public IEnumerable GetSelectedPortProfiles() { - return new List(SelectedPortProfiles.Cast()); + return [.. SelectedPortProfiles.Cast()]; } + #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/PortScannerSettingsViewModel.cs b/Source/NETworkManager/ViewModels/PortScannerSettingsViewModel.cs index 8869701c0e..5f4ac96980 100644 --- a/Source/NETworkManager/ViewModels/PortScannerSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/PortScannerSettingsViewModel.cs @@ -1,5 +1,4 @@ -using MahApps.Metro.Controls.Dialogs; -using MahApps.Metro.SimpleChildWindow; +using MahApps.Metro.SimpleChildWindow; using NETworkManager.Localization.Resources; using NETworkManager.Models.Network; using NETworkManager.Settings; @@ -23,8 +22,6 @@ public class PortScannerSettingsViewModel : ViewModelBase private readonly bool _isLoading; - private readonly IDialogCoordinator _dialogCoordinator; - /// /// Gets the collection view of port profiles. /// @@ -160,13 +157,10 @@ public int MaxPortThreads /// /// Initializes a new instance of the class. /// - /// The dialog coordinator instance. - public PortScannerSettingsViewModel(IDialogCoordinator instance) + public PortScannerSettingsViewModel() { _isLoading = true; - _dialogCoordinator = instance; - PortProfiles = CollectionViewSource.GetDefaultView(SettingsManager.Current.PortScanner_PortProfiles); PortProfiles.SortDescriptions.Add( new SortDescription(nameof(PortProfileInfo.Name), ListSortDirection.Ascending)); @@ -216,56 +210,62 @@ private void DeletePortProfileAction() #region Methods - private async Task AddPortProfile() + private Task AddPortProfile() { - var customDialog = new CustomDialog - { - Title = Strings.AddPortProfile - }; + var childWindow = new PortProfileChildWindow(); - var viewModel = new PortProfileViewModel(async instance => + var childWindowViewModel = new PortProfileViewModel(async instance => { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; SettingsManager.Current.PortScanner_PortProfiles.Add(new PortProfileInfo(instance.Name, instance.Ports)); - }, async _ => { await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); }); - - customDialog.Content = new PortProfileDialog + }, async _ => { - DataContext = viewModel - }; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }); + + childWindow.Title = Strings.AddPortProfile; + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } - public async Task EditPortProfile() + public Task EditPortProfile() { - var customDialog = new CustomDialog - { - Title = Strings.EditPortProfile - }; + var childWindow = new PortProfileChildWindow(); - var viewModel = new PortProfileViewModel(async instance => - { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + var childWindowViewModel = new PortProfileViewModel(async instance => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - SettingsManager.Current.PortScanner_PortProfiles.Remove(SelectedPortProfile); - SettingsManager.Current.PortScanner_PortProfiles.Add(new PortProfileInfo(instance.Name, - instance.Ports)); - }, async _ => { await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); }, true, + SettingsManager.Current.PortScanner_PortProfiles.Remove(SelectedPortProfile); + SettingsManager.Current.PortScanner_PortProfiles.Add(new PortProfileInfo(instance.Name, + instance.Ports)); + }, async _ => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, true, SelectedPortProfile); - customDialog.Content = new PortProfileDialog - { - DataContext = viewModel - }; + childWindow.Title = Strings.EditPortProfile; + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } private async Task DeletePortProfile() { - var result = await DialogHelper.ShowOKCancelMessageAsync(Application.Current.MainWindow, + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, Strings.DeletePortProfile, Strings.DeletePortProfileMessage, ChildWindowIcon.Info, diff --git a/Source/NETworkManager/ViewModels/PortScannerViewModel.cs b/Source/NETworkManager/ViewModels/PortScannerViewModel.cs index 8a73c5ac6f..0143f57e31 100644 --- a/Source/NETworkManager/ViewModels/PortScannerViewModel.cs +++ b/Source/NETworkManager/ViewModels/PortScannerViewModel.cs @@ -1,6 +1,5 @@ using log4net; using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; using NETworkManager.Controls; using NETworkManager.Localization.Resources; @@ -33,8 +32,6 @@ public class PortScannerViewModel : ViewModelBase #region Variables private static readonly ILog Log = LogManager.GetLogger(typeof(PortScannerViewModel)); - private readonly IDialogCoordinator _dialogCoordinator; - private CancellationTokenSource _cancellationTokenSource; private readonly Guid _tabId; @@ -279,14 +276,11 @@ private set /// /// Initializes a new instance of the class. /// - /// The dialog coordinator instance. /// The unique identifier for the tab. /// The initial host to scan. /// The initial ports to scan. - public PortScannerViewModel(IDialogCoordinator instance, Guid tabId, string host, string port) + public PortScannerViewModel(Guid tabId, string host, string port) { - _dialogCoordinator = instance; - ConfigurationManager.Current.PortScannerTabCount++; _tabId = tabId; @@ -385,24 +379,27 @@ private async Task OpenPortProfileSelection() { var window = Application.Current.Windows.OfType().FirstOrDefault(x => x.IsActive); - var customDialog = new CustomDialog - { - Title = Strings.SelectPortProfile - }; + var childWindow = new PortProfilesChildWindow(window); - var viewModel = new PortProfilesViewModel(async instance => + var childWindowViewModel = new PortProfilesViewModel(async instance => { - await _dialogCoordinator.HideMetroDialogAsync(window, customDialog); + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; Ports = string.Join("; ", instance.GetSelectedPortProfiles().Select(x => x.Ports)); - }, async _ => { await _dialogCoordinator.HideMetroDialogAsync(window, customDialog); }); - - customDialog.Content = new PortProfilesDialog + }, async _ => { - DataContext = viewModel - }; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }); + + childWindow.Title = Strings.SelectPortProfile; + + childWindow.DataContext = childWindowViewModel; - await _dialogCoordinator.ShowMetroDialogAsync(window, customDialog); + ConfigurationManager.Current.IsChildWindowOpen = true; + + await window.ShowChildWindowAsync(childWindow); } private async Task Start() @@ -498,12 +495,9 @@ private Task Export() { Log.Error("Error while exporting data as " + instance.FileType, ex); - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(window, Strings.Error, - Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + - Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); + await DialogHelper.ShowMessageAsync(window, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); } SettingsManager.Current.PortScanner_ExportFileType = instance.FileType; diff --git a/Source/NETworkManager/ViewModels/PowerShellHostViewModel.cs b/Source/NETworkManager/ViewModels/PowerShellHostViewModel.cs index 428fc68383..80d632bab7 100644 --- a/Source/NETworkManager/ViewModels/PowerShellHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/PowerShellHostViewModel.cs @@ -1,6 +1,5 @@ using Dragablz; using log4net; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; using NETworkManager.Controls; using NETworkManager.Localization.Resources; @@ -699,7 +698,7 @@ private Task Connect(string host = null) ConfigurationManager.OnDialogOpen(); - return (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } private void ConnectProfile() diff --git a/Source/NETworkManager/ViewModels/PowerShellSettingsViewModel.cs b/Source/NETworkManager/ViewModels/PowerShellSettingsViewModel.cs index 27ebd5ae56..ee1d3a6deb 100644 --- a/Source/NETworkManager/ViewModels/PowerShellSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/PowerShellSettingsViewModel.cs @@ -6,7 +6,6 @@ using System.Threading.Tasks; using System.Windows.Forms; using System.Windows.Input; -using MahApps.Metro.Controls.Dialogs; using NETworkManager.Localization.Resources; using NETworkManager.Models.PowerShell; using NETworkManager.Settings; @@ -17,9 +16,6 @@ namespace NETworkManager.ViewModels; public class PowerShellSettingsViewModel : ViewModelBase { #region Variables - - private readonly IDialogCoordinator _dialogCoordinator; - private readonly bool _isLoading; private string _applicationFilePath; @@ -130,12 +126,10 @@ public bool IsConfigured #region Contructor, load settings - public PowerShellSettingsViewModel(IDialogCoordinator instance) + public PowerShellSettingsViewModel() { _isLoading = true; - _dialogCoordinator = instance; - LoadSettings(); _isLoading = false; @@ -194,12 +188,7 @@ private async Task Configure() } catch (Exception ex) { - var settings = AppearanceManager.MetroDialog; - - settings.AffirmativeButtonText = Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, ex.Message, - MessageDialogStyle.Affirmative, settings); + await DialogHelper.ShowMessageAsync(System.Windows.Application.Current.MainWindow, Strings.Error, ex.Message, ChildWindowIcon.Error); } } diff --git a/Source/NETworkManager/ViewModels/PuTTYHostViewModel.cs b/Source/NETworkManager/ViewModels/PuTTYHostViewModel.cs index 26f939c0c5..a3a8313eb7 100644 --- a/Source/NETworkManager/ViewModels/PuTTYHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/PuTTYHostViewModel.cs @@ -1,6 +1,5 @@ using Dragablz; using log4net; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; using NETworkManager.Controls; using NETworkManager.Localization.Resources; @@ -33,8 +32,6 @@ public class PuTTYHostViewModel : ViewModelBase, IProfileManager private static readonly ILog Log = LogManager.GetLogger(typeof(PuTTYHostViewModel)); - private readonly IDialogCoordinator _dialogCoordinator; - private readonly DispatcherTimer _searchDispatcherTimer = new(); private bool _searchDisabled; @@ -313,12 +310,10 @@ public bool ProfileContextMenuIsOpen #region Constructor, load settings - public PuTTYHostViewModel(IDialogCoordinator instance) + public PuTTYHostViewModel() { _isLoading = true; - _dialogCoordinator = instance; - // Check if PuTTY executable is configured CheckExecutable(); @@ -646,7 +641,7 @@ private Task Connect(string host = null) ConfigurationManager.OnDialogOpen(); - return (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } private void ConnectProfile() diff --git a/Source/NETworkManager/ViewModels/PuTTYSettingsViewModel.cs b/Source/NETworkManager/ViewModels/PuTTYSettingsViewModel.cs index ec9498dcc4..78ced6a3e9 100644 --- a/Source/NETworkManager/ViewModels/PuTTYSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/PuTTYSettingsViewModel.cs @@ -6,7 +6,6 @@ using System.Threading.Tasks; using System.Windows.Forms; using System.Windows.Input; -using MahApps.Metro.Controls.Dialogs; using NETworkManager.Localization.Resources; using NETworkManager.Models.PuTTY; using NETworkManager.Settings; @@ -18,9 +17,6 @@ namespace NETworkManager.ViewModels; public class PuTTYSettingsViewModel : ViewModelBase { #region Variables - - private readonly IDialogCoordinator _dialogCoordinator; - public bool IsPortable => ConfigurationManager.Current.IsPortable; public string PortableLogPath => PuTTY.PortableLogPath; @@ -393,12 +389,10 @@ public int RloginPort #region Contructor, load settings - public PuTTYSettingsViewModel(IDialogCoordinator instance) + public PuTTYSettingsViewModel() { _isLoading = true; - _dialogCoordinator = instance; - LoadSettings(); _isLoading = false; @@ -505,12 +499,7 @@ private async Task Configure() } catch (Exception ex) { - var settings = AppearanceManager.MetroDialog; - - settings.AffirmativeButtonText = Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, ex.Message, - MessageDialogStyle.Affirmative, settings); + await DialogHelper.ShowMessageAsync(System.Windows.Application.Current.MainWindow, Strings.Error, ex.Message, ChildWindowIcon.Error); } } diff --git a/Source/NETworkManager/ViewModels/RemoteDesktopHostViewModel.cs b/Source/NETworkManager/ViewModels/RemoteDesktopHostViewModel.cs index 686350506b..5a9a5b9612 100644 --- a/Source/NETworkManager/ViewModels/RemoteDesktopHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/RemoteDesktopHostViewModel.cs @@ -1,5 +1,4 @@ using Dragablz; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; using NETworkManager.Controls; using NETworkManager.Localization.Resources; @@ -28,8 +27,6 @@ public class RemoteDesktopHostViewModel : ViewModelBase, IProfileManager { #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - private readonly DispatcherTimer _searchDispatcherTimer = new(); private bool _searchDisabled; @@ -261,12 +258,10 @@ public GridLength ProfileWidth #region Constructor, load settings - public RemoteDesktopHostViewModel(IDialogCoordinator instance) + public RemoteDesktopHostViewModel() { _isLoading = true; - _dialogCoordinator = instance; - InterTabClient = new DragablzInterTabClient(ApplicationName.RemoteDesktop); InterTabPartition = nameof(ApplicationName.RemoteDesktop); @@ -378,8 +373,8 @@ private async void SendCtrlAltDelAction(object view) { ConfigurationManager.OnDialogOpen(); - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, - $"{Strings.CouldNotSendKeystroke}\n\nMessage:\n{ex.Message}"); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + $"{Strings.CouldNotSendKeystroke}\n\nMessage:\n{ex.Message}", ChildWindowIcon.Error); ConfigurationManager.OnDialogClose(); } @@ -586,7 +581,7 @@ private Task Connect(string host = null) ConfigurationManager.OnDialogOpen(); - return (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } // Connect via Profile @@ -648,7 +643,7 @@ private Task ConnectProfileAs() ConfigurationManager.OnDialogOpen(); - return (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } private void Connect(RemoteDesktopSessionInfo sessionInfo, string header = null) diff --git a/Source/NETworkManager/ViewModels/SNMPHostViewModel.cs b/Source/NETworkManager/ViewModels/SNMPHostViewModel.cs index 964b591278..972d7bfaa0 100644 --- a/Source/NETworkManager/ViewModels/SNMPHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/SNMPHostViewModel.cs @@ -1,5 +1,4 @@ using Dragablz; -using MahApps.Metro.Controls.Dialogs; using NETworkManager.Controls; using NETworkManager.Localization.Resources; using NETworkManager.Models; diff --git a/Source/NETworkManager/ViewModels/SNMPOIDProfilesViewModel.cs b/Source/NETworkManager/ViewModels/SNMPOIDProfilesViewModel.cs index a5dd9b983b..8eb692521d 100644 --- a/Source/NETworkManager/ViewModels/SNMPOIDProfilesViewModel.cs +++ b/Source/NETworkManager/ViewModels/SNMPOIDProfilesViewModel.cs @@ -1,5 +1,6 @@ using System; using System.ComponentModel; +using System.Linq; using System.Windows.Data; using System.Windows.Input; using NETworkManager.Models.Network; @@ -37,6 +38,8 @@ public SNMPOIDProfilesViewModel(Action okCommand, return info.Name.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1 || info.OID.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1; }; + + SelectedOIDProfile = OIDProfiles.Cast().FirstOrDefault(); } public ICommand OKCommand { get; } @@ -54,6 +57,8 @@ public string Search OIDProfiles.Refresh(); + SelectedOIDProfile = OIDProfiles.Cast().FirstOrDefault(); + OnPropertyChanged(); } } diff --git a/Source/NETworkManager/ViewModels/SNMPSettingsViewModel.cs b/Source/NETworkManager/ViewModels/SNMPSettingsViewModel.cs index 70b7c4d1f1..124ebcbbcb 100644 --- a/Source/NETworkManager/ViewModels/SNMPSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/SNMPSettingsViewModel.cs @@ -1,5 +1,4 @@ using Lextm.SharpSnmpLib.Messaging; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; using NETworkManager.Localization.Resources; using NETworkManager.Models.Network; @@ -23,8 +22,6 @@ public class SNMPSettingsViewModel : ViewModelBase private readonly bool _isLoading; - private readonly IDialogCoordinator _dialogCoordinator; - public ICollectionView OIDProfiles { get; } private SNMPOIDProfileInfo _selectedOIDProfile = new(); @@ -102,16 +99,16 @@ public int Port #region Contructor, load settings - public SNMPSettingsViewModel(IDialogCoordinator instance) + public SNMPSettingsViewModel() { _isLoading = true; - _dialogCoordinator = instance; - OIDProfiles = CollectionViewSource.GetDefaultView(SettingsManager.Current.SNMP_OidProfiles); OIDProfiles.SortDescriptions.Add(new SortDescription(nameof(SNMPOIDProfileInfo.Name), ListSortDirection.Ascending)); + SelectedOIDProfile = OIDProfiles.Cast().FirstOrDefault(); + LoadSettings(); _isLoading = false; @@ -156,54 +153,63 @@ private void DeleteOIDProfileAction() private async Task AddOIDProfile() { - var customDialog = new CustomDialog - { - Title = Strings.AddOIDProfile - }; + var childWindow = new SNMPOIDProfileChildWindow(); - var viewModel = new SNMPOIDProfileViewModel(async instance => + var childWindowViewModel = new SNMPOIDProfileViewModel(async instance => { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + SettingsManager.Current.SNMP_OidProfiles.Add(new SNMPOIDProfileInfo( + instance.Name, + instance.OID, + instance.Mode) + ); + }, async _ => + { + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }); - SettingsManager.Current.SNMP_OidProfiles.Add(new SNMPOIDProfileInfo(instance.Name, instance.OID, - instance.Mode)); - }, async _ => { await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); }); + childWindow.Title = Strings.AddOIDProfile; - customDialog.Content = new SNMPOIDProfileDialog - { - DataContext = viewModel - }; + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } public async Task EditOIDProfile() { - var customDialog = new CustomDialog - { - Title = Strings.EditOIDProfile - }; + var childWindow = new SNMPOIDProfileChildWindow(); - var viewModel = new SNMPOIDProfileViewModel(async instance => + var childWindowViewModel = new SNMPOIDProfileViewModel(async instance => { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; SettingsManager.Current.SNMP_OidProfiles.Remove(SelectedOIDProfile); SettingsManager.Current.SNMP_OidProfiles.Add(new SNMPOIDProfileInfo(instance.Name, instance.OID, instance.Mode)); - }, async _ => { await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); }, true, SelectedOIDProfile); - - customDialog.Content = new SNMPOIDProfileDialog + }, async _ => { - DataContext = viewModel - }; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, true, SelectedOIDProfile); + + childWindow.Title = Strings.EditOIDProfile; + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } private async Task DeleteOIDProfile() { - var result = await DialogHelper.ShowOKCancelMessageAsync(Application.Current.MainWindow, + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, Strings.DeleteOIDProfile, Strings.DeleteOIDProfileMessage, ChildWindowIcon.Info, diff --git a/Source/NETworkManager/ViewModels/SNMPViewModel.cs b/Source/NETworkManager/ViewModels/SNMPViewModel.cs index d4e1c2b442..b255d60b0e 100644 --- a/Source/NETworkManager/ViewModels/SNMPViewModel.cs +++ b/Source/NETworkManager/ViewModels/SNMPViewModel.cs @@ -1,6 +1,5 @@ using log4net; using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; using NETworkManager.Controls; using NETworkManager.Localization; @@ -31,12 +30,10 @@ public class SNMPViewModel : ViewModelBase { #region Contructor, load settings - public SNMPViewModel(IDialogCoordinator instance, Guid tabId, SNMPSessionInfo sessionInfo) + public SNMPViewModel(Guid tabId, SNMPSessionInfo sessionInfo) { _isLoading = true; - _dialogCoordinator = instance; - ConfigurationManager.Current.SNMPTabCount++; _tabId = tabId; @@ -57,11 +54,11 @@ public SNMPViewModel(IDialogCoordinator instance, Guid tabId, SNMPSessionInfo se Oid = sessionInfo?.OID; // Modes - Modes = new List { SNMPMode.Get, SNMPMode.Walk, SNMPMode.Set }; + Modes = [SNMPMode.Get, SNMPMode.Walk, SNMPMode.Set]; Mode = Modes.FirstOrDefault(x => x == sessionInfo?.Mode); // Versions (v1, v2c, v3) - Versions = Enum.GetValues(typeof(SNMPVersion)).Cast().ToList(); + Versions = Enum.GetValues().Cast().ToList(); Version = Versions.FirstOrDefault(x => x == sessionInfo?.Version); // Community @@ -69,8 +66,7 @@ public SNMPViewModel(IDialogCoordinator instance, Guid tabId, SNMPSessionInfo se Community = sessionInfo?.Community; // Security - Securities = new List - { SNMPV3Security.NoAuthNoPriv, SNMPV3Security.AuthNoPriv, SNMPV3Security.AuthPriv }; + Securities = [SNMPV3Security.NoAuthNoPriv, SNMPV3Security.AuthNoPriv, SNMPV3Security.AuthPriv]; Security = Securities.FirstOrDefault(x => x == sessionInfo?.Security); // Username @@ -78,15 +74,14 @@ public SNMPViewModel(IDialogCoordinator instance, Guid tabId, SNMPSessionInfo se Username = sessionInfo?.Username; // Auth - AuthenticationProviders = Enum.GetValues(typeof(SNMPV3AuthenticationProvider)) - .Cast().ToList(); + AuthenticationProviders = [.. Enum.GetValues().Cast()]; AuthenticationProvider = AuthenticationProviders.FirstOrDefault(x => x == sessionInfo?.AuthenticationProvider); if (Version == SNMPVersion.V3 && Security != SNMPV3Security.NoAuthNoPriv) Auth = sessionInfo?.Auth; // Priv - PrivacyProviders = Enum.GetValues(typeof(SNMPV3PrivacyProvider)).Cast().ToList(); + PrivacyProviders = [.. Enum.GetValues().Cast()]; PrivacyProvider = PrivacyProviders.FirstOrDefault(x => x == sessionInfo?.PrivacyProvider); if (Version == SNMPVersion.V3 && Security == SNMPV3Security.AuthPriv) @@ -100,8 +95,6 @@ public SNMPViewModel(IDialogCoordinator instance, Guid tabId, SNMPSessionInfo se #region Variables private static readonly ILog Log = LogManager.GetLogger(typeof(SNMPViewModel)); - private readonly IDialogCoordinator _dialogCoordinator; - private CancellationTokenSource _cancellationTokenSource; private readonly Guid _tabId; @@ -656,25 +649,31 @@ private async Task OpenOIDProfileSelection() { var window = Application.Current.Windows.OfType().FirstOrDefault(x => x.IsActive); - var customDialog = new CustomDialog - { - Title = Strings.SelectOIDProfile - }; + var childWindow = new SNMPOIDProfilesChildWindow(window); - var viewModel = new SNMPOIDProfilesViewModel(async instance => + var childWindowViewModel = new SNMPOIDProfilesViewModel(async instance => { - await _dialogCoordinator.HideMetroDialogAsync(window, customDialog); + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - Mode = instance.SelectedOIDProfile.Mode; - Oid = instance.SelectedOIDProfile.OID; - }, async _ => { await _dialogCoordinator.HideMetroDialogAsync(window, customDialog); }); + if (instance.SelectedOIDProfile == null) + return; - customDialog.Content = new SNMPOIDProfilesDialog + Mode = instance.SelectedOIDProfile.Mode; + Oid = instance.SelectedOIDProfile?.OID; + }, async _ => { - DataContext = viewModel - }; + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }); + + childWindow.Title = Strings.SelectOIDProfile; + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; - await _dialogCoordinator.ShowMetroDialogAsync(window, customDialog); + await window.ShowChildWindowAsync(childWindow); } private void AddHostToHistory(string host) @@ -727,12 +726,9 @@ private Task Export() { Log.Error("Error while exporting data as " + instance.FileType, ex); - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(window, Strings.Error, - Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + - Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); + await DialogHelper.ShowMessageAsync(window, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); } SettingsManager.Current.SNMP_ExportFileType = instance.FileType; diff --git a/Source/NETworkManager/ViewModels/SNTPLookupSettingsViewModel.cs b/Source/NETworkManager/ViewModels/SNTPLookupSettingsViewModel.cs index 70eae4e110..305dc0e105 100644 --- a/Source/NETworkManager/ViewModels/SNTPLookupSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/SNTPLookupSettingsViewModel.cs @@ -1,5 +1,4 @@ -using MahApps.Metro.Controls.Dialogs; -using MahApps.Metro.SimpleChildWindow; +using MahApps.Metro.SimpleChildWindow; using NETworkManager.Localization.Resources; using NETworkManager.Models.Network; using NETworkManager.Settings; @@ -24,8 +23,6 @@ public class SNTPLookupSettingsViewModel : ViewModelBase private readonly ServerConnectionInfo _profileDialogDefaultValues = new("time.example.com", 123, TransportProtocol.Tcp); - private readonly IDialogCoordinator _dialogCoordinator; - private readonly ICollectionView _sntpServers; public ICollectionView SNTPServers @@ -81,16 +78,16 @@ public int Timeout #region Constructor, load settings - public SNTPLookupSettingsViewModel(IDialogCoordinator instance) + public SNTPLookupSettingsViewModel() { _isLoading = true; - _dialogCoordinator = instance; - SNTPServers = CollectionViewSource.GetDefaultView(SettingsManager.Current.SNTPLookup_SNTPServers); SNTPServers.SortDescriptions.Add(new SortDescription(nameof(ServerConnectionInfoProfile.Name), ListSortDirection.Ascending)); + SelectedSNTPServer = SNTPServers.Cast().FirstOrDefault(); + LoadSettings(); _isLoading = false; @@ -160,7 +157,7 @@ private async Task AddServer() ConfigurationManager.Current.IsChildWindowOpen = true; - await (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } public async Task EditServer() @@ -189,12 +186,12 @@ public async Task EditServer() ConfigurationManager.Current.IsChildWindowOpen = true; - await (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } private async Task DeleteServer() { - var result = await DialogHelper.ShowOKCancelMessageAsync(Application.Current.MainWindow, + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, Strings.DeleteSNTPServer, Strings.DeleteSNTPServerMessage, ChildWindowIcon.Info, diff --git a/Source/NETworkManager/ViewModels/SNTPLookupViewModel.cs b/Source/NETworkManager/ViewModels/SNTPLookupViewModel.cs index 95da075989..dd0b8de56c 100644 --- a/Source/NETworkManager/ViewModels/SNTPLookupViewModel.cs +++ b/Source/NETworkManager/ViewModels/SNTPLookupViewModel.cs @@ -1,6 +1,5 @@ using log4net; using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; using NETworkManager.Controls; using NETworkManager.Localization.Resources; @@ -27,8 +26,6 @@ public class SNTPLookupViewModel : ViewModelBase #region Variables private static readonly ILog Log = LogManager.GetLogger(typeof(SNTPLookupViewModel)); - private readonly IDialogCoordinator _dialogCoordinator; - private readonly Guid _tabId; private readonly bool _isLoading; private bool _closed; @@ -148,11 +145,10 @@ private set #region Contructor, load settings - public SNTPLookupViewModel(IDialogCoordinator instance, Guid tabId) + public SNTPLookupViewModel(Guid tabId) { _isLoading = true; - _dialogCoordinator = instance; ConfigurationManager.Current.SNTPLookupTabCount++; _tabId = tabId; @@ -255,12 +251,9 @@ private Task Export() { Log.Error("Error while exporting data as " + instance.FileType, ex); - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(window, Strings.Error, - Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + - Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); + await DialogHelper.ShowMessageAsync(window, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); } SettingsManager.Current.SNTPLookup_ExportFileType = instance.FileType; diff --git a/Source/NETworkManager/ViewModels/SettingsAutostartViewModel.cs b/Source/NETworkManager/ViewModels/SettingsAutostartViewModel.cs index 4b17303ac0..55dc1a5b1d 100644 --- a/Source/NETworkManager/ViewModels/SettingsAutostartViewModel.cs +++ b/Source/NETworkManager/ViewModels/SettingsAutostartViewModel.cs @@ -1,8 +1,9 @@ using System; using System.Threading.Tasks; -using MahApps.Metro.Controls.Dialogs; +using System.Windows; using NETworkManager.Localization.Resources; using NETworkManager.Settings; +using NETworkManager.Utilities; namespace NETworkManager.ViewModels; @@ -10,12 +11,10 @@ public class SettingsAutostartViewModel : ViewModelBase { #region Constructor - public SettingsAutostartViewModel(IDialogCoordinator instance) + public SettingsAutostartViewModel() { _isLoading = true; - _dialogCoordinator = instance; - LoadSettings(); _isLoading = false; @@ -51,8 +50,8 @@ private async Task EnableDisableAutostart(bool enable) } catch (Exception ex) { - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, ex.Message, - MessageDialogStyle.Affirmative, AppearanceManager.MetroDialog); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + ex.Message, ChildWindowIcon.Error); } ConfiguringAutostart = false; @@ -61,9 +60,6 @@ await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, ex.Message, #endregion #region Variables - - private readonly IDialogCoordinator _dialogCoordinator; - private readonly bool _isLoading; private bool _startWithWindows; diff --git a/Source/NETworkManager/ViewModels/SettingsProfilesViewModel.cs b/Source/NETworkManager/ViewModels/SettingsProfilesViewModel.cs index f6bd5260f7..fd42c76821 100644 --- a/Source/NETworkManager/ViewModels/SettingsProfilesViewModel.cs +++ b/Source/NETworkManager/ViewModels/SettingsProfilesViewModel.cs @@ -1,5 +1,4 @@ -using MahApps.Metro.Controls.Dialogs; -using MahApps.Metro.SimpleChildWindow; +using MahApps.Metro.SimpleChildWindow; using NETworkManager.Localization.Resources; using NETworkManager.Profiles; using NETworkManager.Settings; @@ -21,8 +20,6 @@ public class SettingsProfilesViewModel : ViewModelBase { #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - public Action CloseAction { get; set; } private string _location; @@ -74,10 +71,8 @@ public ProfileFileInfo SelectedProfileFile #region Constructor, LoadSettings - public SettingsProfilesViewModel(IDialogCoordinator instance) + public SettingsProfilesViewModel() { - _dialogCoordinator = instance; - ProfileFiles = new CollectionViewSource { Source = ProfileManager.ProfileFiles }.View; ProfileFiles.SortDescriptions.Add( new SortDescription(nameof(ProfileFileInfo.Name), ListSortDirection.Ascending)); @@ -131,7 +126,7 @@ private async Task AddProfileFileAction() ConfigurationManager.Current.IsChildWindowOpen = true; - await (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); // Re-select the profile file if (string.IsNullOrEmpty(profileName)) @@ -141,7 +136,7 @@ private async Task AddProfileFileAction() .FirstOrDefault(p => p.Name.Equals(profileName, StringComparison.OrdinalIgnoreCase)); // Ask the user if they want to enable encryption for the new profile file - var result = await DialogHelper.ShowOKCancelMessageAsync(Application.Current.MainWindow, + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, Strings.EnableEncryptionQuestion, Strings.EnableEncryptionForProfileFileMessage); @@ -177,7 +172,7 @@ private async Task EditProfileFileAction() ConfigurationManager.Current.IsChildWindowOpen = true; - await (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); // Re-select the profile file if (string.IsNullOrEmpty(profileName)) @@ -197,7 +192,7 @@ private bool DeleteProfileFile_CanExecute(object obj) private async Task DeleteProfileFileAction() { - var result = await DialogHelper.ShowOKCancelMessageAsync(Application.Current.MainWindow, + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, Strings.DeleteProfileFile, string.Format(Strings.DeleteProfileFileXMessage, SelectedProfileFile.Name), ChildWindowIcon.Info, @@ -217,7 +212,7 @@ private async Task DeleteProfileFileAction() private async Task EnableEncryptionAction() { // Show encryption disclaimer - if (!await DialogHelper.ShowOKCancelMessageAsync(Application.Current.MainWindow, + if (!await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, Strings.Disclaimer, Strings.ProfileEncryptionDisclaimer)) return; @@ -237,7 +232,7 @@ private async Task EnableEncryptionAction() } catch (Exception ex) { - await DialogHelper.ShowOKMessageAsync(Application.Current.MainWindow, + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.EncryptionError, $"{Strings.EncryptionErrorMessage}\n\n{ex.Message}", ChildWindowIcon.Error).ConfigureAwait(false); @@ -254,7 +249,7 @@ await DialogHelper.ShowOKMessageAsync(Application.Current.MainWindow, ConfigurationManager.Current.IsChildWindowOpen = true; - await (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); // Re-select the profile file if (string.IsNullOrEmpty(profileFile)) @@ -283,14 +278,14 @@ private async Task ChangeMasterPasswordAction() } catch (CryptographicException) { - await DialogHelper.ShowOKMessageAsync(Application.Current.MainWindow, + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.WrongPassword, Strings.WrongPasswordDecryptionFailedMessage, ChildWindowIcon.Error).ConfigureAwait(false); } catch (Exception ex) { - await DialogHelper.ShowOKMessageAsync(Application.Current.MainWindow, + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.DecryptionError, $"{Strings.DecryptionErrorMessage}\n\n{ex.Message}", ChildWindowIcon.Error).ConfigureAwait(false); @@ -307,7 +302,7 @@ await DialogHelper.ShowOKMessageAsync(Application.Current.MainWindow, ConfigurationManager.Current.IsChildWindowOpen = true; - await (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); // Re-select the profile file if (string.IsNullOrEmpty(profileName)) @@ -336,14 +331,14 @@ private async Task DisableEncryptionAction() } catch (CryptographicException) { - await DialogHelper.ShowOKMessageAsync(Application.Current.MainWindow, + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.WrongPassword, Strings.WrongPasswordDecryptionFailedMessage, ChildWindowIcon.Error).ConfigureAwait(false); } catch (Exception ex) { - await DialogHelper.ShowOKMessageAsync(Application.Current.MainWindow, + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.DecryptionError, $"{Strings.DecryptionErrorMessage}\n\n{ex.Message}", ChildWindowIcon.Error).ConfigureAwait(false); @@ -361,7 +356,7 @@ await DialogHelper.ShowOKMessageAsync(Application.Current.MainWindow, ConfigurationManager.Current.IsChildWindowOpen = true; - await (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + await Application.Current.MainWindow.ShowChildWindowAsync(childWindow); // Re-select the profile file if (string.IsNullOrEmpty(profileName)) diff --git a/Source/NETworkManager/ViewModels/SettingsSettingsViewModel.cs b/Source/NETworkManager/ViewModels/SettingsSettingsViewModel.cs index d004a0d3bb..399ffb1e02 100644 --- a/Source/NETworkManager/ViewModels/SettingsSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/SettingsSettingsViewModel.cs @@ -68,7 +68,7 @@ private void ResetSettingsAction() private async Task ResetSettings() { - var result = await DialogHelper.ShowOKCancelMessageAsync(Application.Current.MainWindow, + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, Strings.ResetSettingsQuestion, Strings.SettingsAreResetAndApplicationWillBeRestartedMessage, ChildWindowIcon.Question, diff --git a/Source/NETworkManager/ViewModels/SubnetCalculatorSubnettingViewModel.cs b/Source/NETworkManager/ViewModels/SubnetCalculatorSubnettingViewModel.cs index 760c91ac70..b1845036f0 100644 --- a/Source/NETworkManager/ViewModels/SubnetCalculatorSubnettingViewModel.cs +++ b/Source/NETworkManager/ViewModels/SubnetCalculatorSubnettingViewModel.cs @@ -1,6 +1,5 @@ using log4net; using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; using NETworkManager.Localization.Resources; using NETworkManager.Models.Export; @@ -28,10 +27,8 @@ public class SubnetCalculatorSubnettingViewModel : ViewModelBase { #region Constructor, load settings - public SubnetCalculatorSubnettingViewModel(IDialogCoordinator instance) + public SubnetCalculatorSubnettingViewModel() { - _dialogCoordinator = instance; - // Set collection view SubnetHistoryView = CollectionViewSource.GetDefaultView(SettingsManager.Current.SubnetCalculator_Subnetting_SubnetHistory); @@ -48,8 +45,6 @@ public SubnetCalculatorSubnettingViewModel(IDialogCoordinator instance) #region Variables private static readonly ILog Log = LogManager.GetLogger(typeof(SubnetCalculatorSubnettingViewModel)); - private readonly IDialogCoordinator _dialogCoordinator; - private string _subnet; public string Subnet @@ -203,12 +198,9 @@ private Task ExportAction() { Log.Error("Error while exporting data as " + instance.FileType, ex); - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, - Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + - Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); } SettingsManager.Current.SubnetCalculator_Subnetting_ExportFileType = instance.FileType; @@ -228,7 +220,7 @@ await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, ConfigurationManager.Current.IsChildWindowOpen = true; - return (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } #endregion @@ -257,16 +249,7 @@ private async Task Calculate() if (65535 < Math.Pow(2, baseCidr - ipNetwork.Cidr) / Math.Pow(2, baseCidr - newCidr)) { - var settings = AppearanceManager.MetroDialog; - - settings.AffirmativeButtonText = Strings.Continue; - settings.NegativeButtonText = Strings.Cancel; - - settings.DefaultButtonFocus = MessageDialogResult.Affirmative; - - if (await _dialogCoordinator.ShowMessageAsync(this, Strings.AreYouSure, - Strings.TheProcessCanTakeUpSomeTimeAndResources, - MessageDialogStyle.AffirmativeAndNegative, settings) != MessageDialogResult.Affirmative) + if (!await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, Strings.AreYouSure, Strings.TheProcessCanTakeUpSomeTimeAndResources)) { IsRunning = false; diff --git a/Source/NETworkManager/ViewModels/TigerVNCHostViewModel.cs b/Source/NETworkManager/ViewModels/TigerVNCHostViewModel.cs index 35361e7417..5f348ad5bb 100644 --- a/Source/NETworkManager/ViewModels/TigerVNCHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/TigerVNCHostViewModel.cs @@ -1,5 +1,5 @@ using Dragablz; -using MahApps.Metro.Controls.Dialogs; +using MahApps.Metro.SimpleChildWindow; using NETworkManager.Controls; using NETworkManager.Localization.Resources; using NETworkManager.Models; @@ -28,8 +28,6 @@ namespace NETworkManager.ViewModels; public class TigerVNCHostViewModel : ViewModelBase, IProfileManager { #region Variables - - private readonly IDialogCoordinator _dialogCoordinator; private readonly DispatcherTimer _searchDispatcherTimer = new(); private bool _searchDisabled; @@ -276,12 +274,10 @@ public GridLength ProfileWidth #region Constructor, load settings - public TigerVNCHostViewModel(IDialogCoordinator instance) + public TigerVNCHostViewModel() { _isLoading = true; - _dialogCoordinator = instance; - CheckSettings(); InterTabClient = new DragablzInterTabClient(ApplicationName.TigerVNC); @@ -486,16 +482,15 @@ private void CheckSettings() File.Exists(SettingsManager.Current.TigerVNC_ApplicationFilePath); } - private async Task Connect(string host = null) + private Task Connect(string host = null) { - var customDialog = new CustomDialog - { - Title = Strings.Connect - }; + var childWindow = new TigerVNCConnectChildWindow(); - var connectViewModel = new TigerVNCConnectViewModel(async instance => + var childWindowViewModel = new TigerVNCConnectViewModel(async instance => { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + ConfigurationManager.OnDialogClose(); // Create profile info @@ -515,17 +510,22 @@ private async Task Connect(string host = null) Connect(sessionInfo); }, async _ => { - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + ConfigurationManager.OnDialogClose(); }, host); - customDialog.Content = new TigerVNCConnectDialog - { - DataContext = connectViewModel - }; + + childWindow.Title = Strings.Connect; + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; ConfigurationManager.OnDialogOpen(); - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); + + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } private void ConnectProfile() diff --git a/Source/NETworkManager/ViewModels/TigerVNCSettingsViewModel.cs b/Source/NETworkManager/ViewModels/TigerVNCSettingsViewModel.cs index e56be7b2d2..b2592bcc9b 100644 --- a/Source/NETworkManager/ViewModels/TigerVNCSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/TigerVNCSettingsViewModel.cs @@ -4,7 +4,6 @@ using System.Threading.Tasks; using System.Windows.Forms; using System.Windows.Input; -using MahApps.Metro.Controls.Dialogs; using NETworkManager.Localization.Resources; using NETworkManager.Settings; using NETworkManager.Utilities; @@ -15,8 +14,6 @@ public class TigerVNCSettingsViewModel : ViewModelBase { #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - private readonly bool _isLoading; private string _applicationFilePath; @@ -76,12 +73,10 @@ public int Port #region Contructor, load settings - public TigerVNCSettingsViewModel(IDialogCoordinator instance) + public TigerVNCSettingsViewModel() { _isLoading = true; - _dialogCoordinator = instance; - LoadSettings(); _isLoading = false; @@ -130,12 +125,7 @@ private async Task Configure() } catch (Exception ex) { - var settings = AppearanceManager.MetroDialog; - - settings.AffirmativeButtonText = Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, ex.Message, - MessageDialogStyle.Affirmative, settings); + await DialogHelper.ShowMessageAsync(System.Windows.Application.Current.MainWindow, Strings.Error, ex.Message, ChildWindowIcon.Error); } } diff --git a/Source/NETworkManager/ViewModels/TracerouteHostViewModel.cs b/Source/NETworkManager/ViewModels/TracerouteHostViewModel.cs index eb083d0dff..cd29d858ed 100644 --- a/Source/NETworkManager/ViewModels/TracerouteHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/TracerouteHostViewModel.cs @@ -1,5 +1,4 @@ using Dragablz; -using MahApps.Metro.Controls.Dialogs; using NETworkManager.Controls; using NETworkManager.Localization.Resources; using NETworkManager.Models; diff --git a/Source/NETworkManager/ViewModels/TracerouteViewModel.cs b/Source/NETworkManager/ViewModels/TracerouteViewModel.cs index b0f4a1f0b7..c6801843c6 100644 --- a/Source/NETworkManager/ViewModels/TracerouteViewModel.cs +++ b/Source/NETworkManager/ViewModels/TracerouteViewModel.cs @@ -1,6 +1,5 @@ using log4net; using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; using NETworkManager.Controls; using NETworkManager.Localization.Resources; @@ -34,7 +33,6 @@ public class TracerouteViewModel : ViewModelBase #region Variables private static readonly ILog Log = LogManager.GetLogger(typeof(TracerouteViewModel)); - private readonly IDialogCoordinator _dialogCoordinator; private CancellationTokenSource _cancellationTokenSource; private readonly Guid _tabId; @@ -203,13 +201,10 @@ private set /// /// Initializes a new instance of the class. /// - /// The dialog coordinator instance. /// The unique identifier for the tab. /// The initial host to trace. - public TracerouteViewModel(IDialogCoordinator instance, Guid tabId, string host) + public TracerouteViewModel(Guid tabId, string host) { - _dialogCoordinator = instance; - ConfigurationManager.Current.TracerouteTabCount++; _tabId = tabId; @@ -417,12 +412,9 @@ private Task Export() { Log.Error("Error while exporting data as " + instance.FileType, ex); - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(window, Strings.Error, - Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + - Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); + await DialogHelper.ShowMessageAsync(window, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); } SettingsManager.Current.Traceroute_ExportFileType = instance.FileType; diff --git a/Source/NETworkManager/ViewModels/WakeOnLANViewModel.cs b/Source/NETworkManager/ViewModels/WakeOnLANViewModel.cs index 33fb857215..e450f3aee9 100644 --- a/Source/NETworkManager/ViewModels/WakeOnLANViewModel.cs +++ b/Source/NETworkManager/ViewModels/WakeOnLANViewModel.cs @@ -1,5 +1,4 @@ using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; using NETworkManager.Localization.Resources; using NETworkManager.Models; using NETworkManager.Models.Network; diff --git a/Source/NETworkManager/ViewModels/WebConsoleHostViewModel.cs b/Source/NETworkManager/ViewModels/WebConsoleHostViewModel.cs index 40296f2522..9eecebcbf7 100644 --- a/Source/NETworkManager/ViewModels/WebConsoleHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/WebConsoleHostViewModel.cs @@ -1,5 +1,4 @@ using Dragablz; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; using Microsoft.Web.WebView2.Core; using NETworkManager.Controls; @@ -29,8 +28,6 @@ public class WebConsoleHostViewModel : ViewModelBase, IProfileManager { #region Variables - private readonly IDialogCoordinator _dialogCoordinator; - private readonly DispatcherTimer _searchDispatcherTimer = new(); private bool _searchDisabled; @@ -283,12 +280,10 @@ public GridLength ProfileWidth #region Constructor, load settings - public WebConsoleHostViewModel(IDialogCoordinator instance) + public WebConsoleHostViewModel() { _isLoading = true; - _dialogCoordinator = instance; - try { CoreWebView2Environment.GetAvailableBrowserVersionString(); @@ -525,7 +520,7 @@ private Task Connect() ConfigurationManager.OnDialogOpen(); - return (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } private void ConnectProfile() diff --git a/Source/NETworkManager/ViewModels/WebConsoleSettingsViewModel.cs b/Source/NETworkManager/ViewModels/WebConsoleSettingsViewModel.cs index fcde9483e5..b5f3b9230b 100644 --- a/Source/NETworkManager/ViewModels/WebConsoleSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/WebConsoleSettingsViewModel.cs @@ -108,7 +108,7 @@ private void DeleteBrowsingDataAction() private async Task DeleteBrowsingData() { - var result = await DialogHelper.ShowOKCancelMessageAsync(Application.Current.MainWindow, + var result = await DialogHelper.ShowConfirmationMessageAsync(Application.Current.MainWindow, Strings.DeleteBrowsingData, Strings.DeleteBrowsingDataMessage, ChildWindowIcon.Info, diff --git a/Source/NETworkManager/ViewModels/WhoisHostViewModel.cs b/Source/NETworkManager/ViewModels/WhoisHostViewModel.cs index 1dd3af13bc..d061001019 100644 --- a/Source/NETworkManager/ViewModels/WhoisHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/WhoisHostViewModel.cs @@ -1,5 +1,4 @@ using Dragablz; -using MahApps.Metro.Controls.Dialogs; using NETworkManager.Controls; using NETworkManager.Localization.Resources; using NETworkManager.Models; diff --git a/Source/NETworkManager/ViewModels/WhoisViewModel.cs b/Source/NETworkManager/ViewModels/WhoisViewModel.cs index 0a039b36bc..8740db96dc 100644 --- a/Source/NETworkManager/ViewModels/WhoisViewModel.cs +++ b/Source/NETworkManager/ViewModels/WhoisViewModel.cs @@ -1,6 +1,5 @@ using log4net; using MahApps.Metro.Controls; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; using NETworkManager.Controls; using NETworkManager.Localization.Resources; @@ -22,9 +21,7 @@ namespace NETworkManager.ViewModels; public class WhoisViewModel : ViewModelBase { #region Variables - private static readonly ILog Log = LogManager.GetLogger(typeof(IPScannerViewModel)); - - private readonly IDialogCoordinator _dialogCoordinator; + private static readonly ILog Log = LogManager.GetLogger(typeof(WhoisViewModel)); private readonly Guid _tabId; private bool _firstLoad = true; @@ -126,10 +123,8 @@ private set #region Contructor, load settings - public WhoisViewModel(IDialogCoordinator instance, Guid tabId, string domain) + public WhoisViewModel(Guid tabId, string domain) { - _dialogCoordinator = instance; - ConfigurationManager.Current.WhoisTabCount++; _tabId = tabId; @@ -265,12 +260,9 @@ private Task Export() { Log.Error("Error while exporting data as " + instance.FileType, ex); - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(window, Strings.Error, - Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + - ex.Message, MessageDialogStyle.Affirmative, settings); + await DialogHelper.ShowMessageAsync(window, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); } SettingsManager.Current.Whois_ExportFileType = instance.FileType; diff --git a/Source/NETworkManager/ViewModels/WiFiViewModel.cs b/Source/NETworkManager/ViewModels/WiFiViewModel.cs index b96a563fe5..f1c80913f4 100644 --- a/Source/NETworkManager/ViewModels/WiFiViewModel.cs +++ b/Source/NETworkManager/ViewModels/WiFiViewModel.cs @@ -1,7 +1,6 @@ using LiveCharts; using LiveCharts.Wpf; using log4net; -using MahApps.Metro.Controls.Dialogs; using MahApps.Metro.SimpleChildWindow; using NETworkManager.Localization; using NETworkManager.Localization.Resources; @@ -31,9 +30,6 @@ namespace NETworkManager.ViewModels; public class WiFiViewModel : ViewModelBase { #region Variables - - private readonly IDialogCoordinator _dialogCoordinator; - private static readonly ILog Log = LogManager.GetLogger(typeof(WiFiViewModel)); private readonly bool _isLoading; @@ -440,12 +436,10 @@ private set #region Constructor, load settings - public WiFiViewModel(IDialogCoordinator instance) + public WiFiViewModel() { _isLoading = true; - _dialogCoordinator = instance; - // Check if Microsoft.Windows.SDK.Contracts is available SdkContractAvailable = ApiInformation.IsTypePresent("Windows.Devices.WiFi.WiFiAdapter"); @@ -792,124 +786,129 @@ private LineSeries GetSeriesCollection(WiFiNetworkInfo network) }; } - private async void Connect() + private Task Connect() { var selectedAdapter = SelectedAdapter; var selectedNetwork = SelectedNetwork; var connectMode = WiFi.GetConnectMode(selectedNetwork.AvailableNetwork); - var customDialog = new CustomDialog + var childWindow = new WiFiConnectChildWindow(); + + var childWindowViewModel = new WiFiConnectViewModel(async instance => { - Title = selectedNetwork.IsHidden - ? Strings.HiddenNetwork - : string.Format(Strings.ConnectToXXX, selectedNetwork.AvailableNetwork.Ssid) - }; + // Connect Open/PSK/EAP + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + + var ssid = selectedNetwork.IsHidden ? instance.Ssid : selectedNetwork.AvailableNetwork.Ssid; + + // Show status message + IsConnecting = true; + ConnectionStatusMessage = string.Format(Strings.ConnectingToXXX, ssid); + IsConnectionStatusMessageDisplayed = true; + + // Connect to the network + var reconnectionKind = instance.ConnectAutomatically + ? WiFiReconnectionKind.Automatic + : WiFiReconnectionKind.Manual; + + PasswordCredential credential = new(); - var connectViewModel = new WiFiConnectViewModel(async instance => + switch (instance.ConnectMode) { - // Connect Open/PSK/EAP - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); + case WiFiConnectMode.Psk: + credential.Password = SecureStringHelper.ConvertToString(instance.PreSharedKey); + break; + case WiFiConnectMode.Eap: + credential.UserName = instance.Username; - var ssid = selectedNetwork.IsHidden ? instance.Ssid : selectedNetwork.AvailableNetwork.Ssid; + if (!string.IsNullOrEmpty(instance.Domain)) + credential.Resource = instance.Domain; - // Show status message - IsConnecting = true; - ConnectionStatusMessage = string.Format(Strings.ConnectingToXXX, ssid); - IsConnectionStatusMessageDisplayed = true; + credential.Password = SecureStringHelper.ConvertToString(instance.Password); + break; + } - // Connect to the network - var reconnectionKind = instance.ConnectAutomatically - ? WiFiReconnectionKind.Automatic - : WiFiReconnectionKind.Manual; + WiFiConnectionStatus connectionResult; - PasswordCredential credential = new(); + if (selectedNetwork.IsHidden) + connectionResult = await WiFi.ConnectAsync(instance.Options.AdapterInfo.WiFiAdapter, + instance.Options.NetworkInfo.AvailableNetwork, reconnectionKind, credential, instance.Ssid); + else + connectionResult = await WiFi.ConnectAsync(instance.Options.AdapterInfo.WiFiAdapter, + instance.Options.NetworkInfo.AvailableNetwork, reconnectionKind, credential); - switch (instance.ConnectMode) - { - case WiFiConnectMode.Psk: - credential.Password = SecureStringHelper.ConvertToString(instance.PreSharedKey); - break; - case WiFiConnectMode.Eap: - credential.UserName = instance.Username; + // Done connecting + IsConnecting = false; - if (!string.IsNullOrEmpty(instance.Domain)) - credential.Resource = instance.Domain; + // Get result + ConnectionStatusMessage = connectionResult == WiFiConnectionStatus.Success + ? string.Format(Strings.SuccessfullyConnectedToXXX, ssid) + : string.Format(Strings.CouldNotConnectToXXXReasonXXX, ssid, + ResourceTranslator.Translate(ResourceIdentifier.WiFiConnectionStatus, connectionResult)); - credential.Password = SecureStringHelper.ConvertToString(instance.Password); - break; - } + // Hide message automatically + _hideConnectionStatusMessageTimer.Start(); + + // Update the Wi-Fi networks. + // Wait because an error may occur if a refresh is done directly after connecting. + await ScanAsync(SelectedAdapter, true, 5000); + }, async instance => + { + // Connect WPS + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; - WiFiConnectionStatus connectionResult; + var ssid = selectedNetwork.IsHidden ? instance.Ssid : selectedNetwork.AvailableNetwork.Ssid; - if (selectedNetwork.IsHidden) - connectionResult = await WiFi.ConnectAsync(instance.Options.AdapterInfo.WiFiAdapter, - instance.Options.NetworkInfo.AvailableNetwork, reconnectionKind, credential, instance.Ssid); - else - connectionResult = await WiFi.ConnectAsync(instance.Options.AdapterInfo.WiFiAdapter, - instance.Options.NetworkInfo.AvailableNetwork, reconnectionKind, credential); + // Show status message + IsConnecting = true; + ConnectionStatusMessage = string.Format(Strings.ConnectingToXXX, ssid); + IsConnectionStatusMessageDisplayed = true; + + // Connect to the network + var reconnectionKind = instance.ConnectAutomatically + ? WiFiReconnectionKind.Automatic + : WiFiReconnectionKind.Manual; + + var connectionResult = await WiFi.ConnectWpsAsync( + instance.Options.AdapterInfo.WiFiAdapter, instance.Options.NetworkInfo.AvailableNetwork, + reconnectionKind); - // Done connecting - IsConnecting = false; + // Done connecting + IsConnecting = false; - // Get result - ConnectionStatusMessage = connectionResult == WiFiConnectionStatus.Success - ? string.Format(Strings.SuccessfullyConnectedToXXX, ssid) - : string.Format(Strings.CouldNotConnectToXXXReasonXXX, ssid, - ResourceTranslator.Translate(ResourceIdentifier.WiFiConnectionStatus, connectionResult)); + // Get result + ConnectionStatusMessage = connectionResult == WiFiConnectionStatus.Success + ? string.Format(Strings.SuccessfullyConnectedToXXX, ssid) + : string.Format(Strings.CouldNotConnectToXXXReasonXXX, ssid, + ResourceTranslator.Translate(ResourceIdentifier.WiFiConnectionStatus, connectionResult)); - // Hide message automatically - _hideConnectionStatusMessageTimer.Start(); + // Hide message automatically + _hideConnectionStatusMessageTimer.Start(); - // Update the Wi-Fi networks. - // Wait because an error may occur if a refresh is done directly after connecting. - await ScanAsync(SelectedAdapter, true, 5000); - }, async instance => + // Update the Wi-Fi networks. + // Wait because an error may occur if a refresh is done directly after connecting. + await ScanAsync(SelectedAdapter, true, 5000); + }, + _ => { - // Connect WPS - await _dialogCoordinator.HideMetroDialogAsync(this, customDialog); - - var ssid = selectedNetwork.IsHidden ? instance.Ssid : selectedNetwork.AvailableNetwork.Ssid; - - // Show status message - IsConnecting = true; - ConnectionStatusMessage = string.Format(Strings.ConnectingToXXX, ssid); - IsConnectionStatusMessageDisplayed = true; - - // Connect to the network - var reconnectionKind = instance.ConnectAutomatically - ? WiFiReconnectionKind.Automatic - : WiFiReconnectionKind.Manual; - - var connectionResult = await WiFi.ConnectWpsAsync( - instance.Options.AdapterInfo.WiFiAdapter, instance.Options.NetworkInfo.AvailableNetwork, - reconnectionKind); - - // Done connecting - IsConnecting = false; - - // Get result - ConnectionStatusMessage = connectionResult == WiFiConnectionStatus.Success - ? string.Format(Strings.SuccessfullyConnectedToXXX, ssid) - : string.Format(Strings.CouldNotConnectToXXXReasonXXX, ssid, - ResourceTranslator.Translate(ResourceIdentifier.WiFiConnectionStatus, connectionResult)); - - // Hide message automatically - _hideConnectionStatusMessageTimer.Start(); - - // Update the Wi-Fi networks. - // Wait because an error may occur if a refresh is done directly after connecting. - await ScanAsync(SelectedAdapter, true, 5000); - }, - _ => { _dialogCoordinator.HideMetroDialogAsync(this, customDialog); }, (selectedAdapter, selectedNetwork), + childWindow.IsOpen = false; + ConfigurationManager.Current.IsChildWindowOpen = false; + }, (selectedAdapter, selectedNetwork), connectMode); - customDialog.Content = new WiFiConnectDialog - { - DataContext = connectViewModel - }; - await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog); + childWindow.Title = selectedNetwork.IsHidden + ? Strings.HiddenNetwork + : string.Format(Strings.ConnectToXXX, selectedNetwork.AvailableNetwork.Ssid); + + childWindow.DataContext = childWindowViewModel; + + ConfigurationManager.Current.IsChildWindowOpen = true; + + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } private async void Disconnect() @@ -953,12 +952,9 @@ private Task Export() { Log.Error("Error while exporting data as " + instance.FileType, ex); - var settings = AppearanceManager.MetroDialog; - settings.AffirmativeButtonText = Strings.OK; - - await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, - Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + - Environment.NewLine + ex.Message, MessageDialogStyle.Affirmative, settings); + await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Error, + Strings.AnErrorOccurredWhileExportingTheData + Environment.NewLine + + Environment.NewLine + ex.Message, ChildWindowIcon.Error); } SettingsManager.Current.WiFi_ExportFileType = instance.FileType; @@ -978,7 +974,7 @@ await _dialogCoordinator.ShowMessageAsync(this, Strings.Error, ConfigurationManager.Current.IsChildWindowOpen = true; - return (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow); + return Application.Current.MainWindow.ShowChildWindowAsync(childWindow); } public void OnViewVisible() diff --git a/Source/NETworkManager/Views/ARPTableAddEntryDialog.xaml b/Source/NETworkManager/Views/ARPTableAddEntryChildWindow.xaml similarity index 77% rename from Source/NETworkManager/Views/ARPTableAddEntryDialog.xaml rename to Source/NETworkManager/Views/ARPTableAddEntryChildWindow.xaml index 691456a888..60bc100268 100644 --- a/Source/NETworkManager/Views/ARPTableAddEntryDialog.xaml +++ b/Source/NETworkManager/Views/ARPTableAddEntryChildWindow.xaml @@ -1,4 +1,4 @@ - - + xmlns:simpleChildWindow="clr-namespace:MahApps.Metro.SimpleChildWindow;assembly=MahApps.Metro.SimpleChildWindow" + xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" + CloseButtonCommand="{Binding Path=CancelCommand}" + Style="{StaticResource DefaultChildWindow}" + Loaded="ChildWindow_OnLoaded" + mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:ARPTableAddEntryViewModel}"> + @@ -32,7 +36,7 @@ + mah:TextBoxHelper.Watermark="{x:Static localization:StaticStrings.ExampleIPv4Address}"> @@ -44,7 +48,7 @@ + mah:TextBoxHelper.Watermark="{x:Static localization:StaticStrings.ExampleMACAddress}"> @@ -57,7 +61,7 @@ -