Skip to content

Commit 809e872

Browse files
committed
Ping - Start/End/Duration added, minor fixes
1 parent b457eb4 commit 809e872

9 files changed

Lines changed: 137 additions & 33 deletions

File tree

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using System;
2+
using System.Globalization;
3+
using System.Windows.Data;
4+
5+
namespace NETworkManager.Converters
6+
{
7+
public sealed class NullableDateTimeToStringConverter : IValueConverter
8+
{
9+
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
10+
{
11+
if(value is DateTime)
12+
{
13+
return ((DateTime)value);
14+
}
15+
16+
return "-/-";
17+
}
18+
19+
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
20+
{
21+
throw new NotImplementedException();
22+
}
23+
}
24+
}

Source/NETworkManager/MainWindow.xaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -497,8 +497,8 @@
497497
<RowDefinition Height="Auto" />
498498
<RowDefinition Height="*" />
499499
</Grid.RowDefinitions>
500-
<Border Grid.Row="0" Height="48" BorderBrush="{DynamicResource GrayBrush8}" BorderThickness="0,0,0,1" >
501-
<TextBlock VerticalAlignment="Center" TextAlignment="Center" Style="{StaticResource HeaderTextBlock}" Text="{Binding SelectedApplicationViewInfo.TranslatedName}" Foreground="{DynamicResource GrayBrush3}" Margin="10,0" />
500+
<Border Grid.Row="0" BorderBrush="{DynamicResource GrayBrush8}" BorderThickness="0,0,0,1" >
501+
<TextBlock VerticalAlignment="Center" Height="48" TextAlignment="Center" Style="{StaticResource HeaderTextBlock}" Text="{Binding SelectedApplicationViewInfo.TranslatedName}" Foreground="{DynamicResource GrayBrush3}" Margin="10,0" />
502502
</Border>
503503
<ContentControl x:Name="contentControlApplication" Grid.Row="1" Focusable="False" />
504504
</Grid>

Source/NETworkManager/NETworkManager.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@
9393
<Generator>MSBuild:Compile</Generator>
9494
<SubType>Designer</SubType>
9595
</ApplicationDefinition>
96+
<Compile Include="Converters\NullableDateTimeToStringConverter.cs" />
9697
<Compile Include="WpfHelper\ProtocolSettingsLayout.cs" />
9798
<Page Include="Resources\ContextMenu\ContextMenu.xaml">
9899
<Generator>MSBuild:Compile</Generator>

Source/NETworkManager/Resources/Localization/Resources.de-DE.xaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,10 @@
198198
<system:String x:Key="String_SearchedApplicationNotFound">Gesuchte Anwendung nicht gefunden!</system:String>
199199
<system:String x:Key="String_MagicPacketSuccessfulSended">Magic Packet erfolgreich gesendet!</system:String>
200200
<system:String x:Key="String_MagicPacketSuccessfulSendedToClients">Magic Paket erfolgreich an {0} Clients gesendet!</system:String>
201-
201+
<system:String x:Key="String_StartTime">Startzeit</system:String>
202+
<system:String x:Key="String_Duration">Dauer</system:String>
203+
<system:String x:Key="String_EndTime">Endzeit</system:String>
204+
202205
<!-- Buttons -->
203206
<system:String x:Key="String_Button_Change">Wechseln</system:String>
204207
<system:String x:Key="String_Button_Default">Standard</system:String>

Source/NETworkManager/Resources/Localization/Resources.en-US.xaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,9 @@
200200
<system:String x:Key="String_SearchedApplicationNotFound">Searched application not found!</system:String>
201201
<system:String x:Key="String_MagicPacketSuccessfulSended">Magic packet successful sended!</system:String>
202202
<system:String x:Key="String_MagicPacketSuccessfulSendedToClients">Magic packet successful sended to {0} clients!</system:String>
203+
<system:String x:Key="String_StartTime">Start time</system:String>
204+
<system:String x:Key="String_Duration">Duration</system:String>
205+
<system:String x:Key="String_EndTime">End time</system:String>
203206

204207
<!-- Buttons -->
205208
<system:String x:Key="String_Button_Change">Change</system:String>
@@ -354,7 +357,6 @@
354357
<system:String x:Key="String_IPStatus_TimedOut">Request timed out.</system:String>
355358
<system:String x:Key="String_IPStatus_TtlExpired">TTL expired in transit.</system:String>
356359

357-
358360
<!-- PortStatus -->
359361
<system:String x:Key="String_PortStatus_Closed">Closed</system:String>
360362
<system:String x:Key="String_PortStatus_Open">Open</system:String>

Source/NETworkManager/ViewModels/Applications/PingViewModel.cs

Lines changed: 76 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
using System.Windows.Input;
1313
using NETworkManager.Collections;
1414
using System.ComponentModel;
15+
using System.Diagnostics;
16+
using System.Windows.Threading;
1517

1618
namespace NETworkManager.ViewModels.Applications
1719
{
@@ -23,6 +25,8 @@ public class PingViewModel : ViewModelBase
2325

2426
CancellationTokenSource cancellationTokenSource;
2527

28+
DispatcherTimer dispatcherTimer = new DispatcherTimer();
29+
2630
private bool _isLoading = true;
2731

2832
private string _hostnameOrIPAddress;
@@ -180,6 +184,48 @@ public int AverageTime
180184
OnPropertyChanged();
181185
}
182186
}
187+
188+
private DateTime? _startTime;
189+
public DateTime? StartTime
190+
{
191+
get { return _startTime; }
192+
set
193+
{
194+
if (value == _startTime)
195+
return;
196+
197+
_startTime = value;
198+
OnPropertyChanged();
199+
}
200+
}
201+
202+
private TimeSpan _duration;
203+
public TimeSpan Duration
204+
{
205+
get { return _duration; }
206+
set
207+
{
208+
if (value == _duration)
209+
return;
210+
211+
_duration = value;
212+
OnPropertyChanged();
213+
}
214+
}
215+
216+
private DateTime? _endTime;
217+
public DateTime? EndTime
218+
{
219+
get { return _endTime; }
220+
set
221+
{
222+
if (value == _endTime)
223+
return;
224+
225+
_endTime = value;
226+
OnPropertyChanged();
227+
}
228+
}
183229
#endregion
184230

185231
#region Contructor
@@ -226,6 +272,12 @@ private async void StartPing()
226272
{
227273
IsPingRunning = true;
228274

275+
StartTime = DateTime.Now;
276+
Duration = new TimeSpan();
277+
dispatcherTimer.Tick += DispatcherTimer_Tick;
278+
dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 100);
279+
dispatcherTimer.Start();
280+
EndTime = null;
229281
PingResult.Clear();
230282
PingsTransmitted = 0;
231283
PingsReceived = 0;
@@ -270,10 +322,10 @@ private async void StartPing()
270322
}
271323
}
272324
catch (SocketException) // This will catch DNS resolve errors
273-
{
325+
{
274326
await dialogCoordinator.ShowMessageAsync(this, Application.Current.Resources["String_Header_DnsError"] as string, Application.Current.Resources["String_CouldNotResolveHostnameMessage"] as string, MessageDialogStyle.Affirmative, dialogSettings);
275327

276-
IsPingRunning = false;
328+
PingFinished();
277329

278330
return;
279331
}
@@ -302,14 +354,27 @@ private async void StartPing()
302354
ping.UserHasCanceled += Ping_UserHasCanceled;
303355

304356
ping.SendAsync(ipAddress, pingOptions, cancellationTokenSource.Token);
305-
}
357+
}
358+
359+
private void DispatcherTimer_Tick(object sender, EventArgs e)
360+
{
361+
Duration = (DateTime.Now - (DateTime)StartTime);
362+
}
306363

307364
private void StopPing()
308365
{
309366
CancelPing = true;
310367
cancellationTokenSource.Cancel();
311368
}
312369

370+
private void PingFinished()
371+
{
372+
IsPingRunning = false;
373+
dispatcherTimer.Stop();
374+
EndTime = DateTime.Now;
375+
Duration = (DateTime)EndTime - (DateTime)StartTime;
376+
}
377+
313378
public void OnShutdown()
314379
{
315380
if (IsPingRunning)
@@ -324,7 +389,7 @@ private void Ping_PingReceived(object sender, PingReceivedArgs e)
324389

325390
// Add the result to the collection
326391
PingResult.Add(pingInfo);
327-
392+
328393
// Calculate statistics
329394
PingsTransmitted++;
330395

@@ -354,10 +419,10 @@ private void Ping_PingReceived(object sender, PingReceivedArgs e)
354419
PingsLost++;
355420
}
356421
}
357-
422+
358423
private void Ping_PingCompleted(object sender, System.EventArgs e)
359424
{
360-
IsPingRunning = false;
425+
PingFinished();
361426
}
362427

363428
private async void Ping_PingException(object sender, PingExceptionArgs e)
@@ -367,7 +432,7 @@ private async void Ping_PingException(object sender, PingExceptionArgs e)
367432

368433
string errorMessage = string.Empty;
369434

370-
switch(w32ex.NativeErrorCode)
435+
switch (w32ex.NativeErrorCode)
371436
{
372437
case 1231:
373438
errorMessage = Application.Current.Resources["String_NetworkLocationCannotBeReached"] as string;
@@ -377,15 +442,16 @@ private async void Ping_PingException(object sender, PingExceptionArgs e)
377442
break;
378443
}
379444

380-
await dialogCoordinator.ShowMessageAsync(this, Application.Current.Resources["String_Header_PingError"] as string, errorMessage , MessageDialogStyle.Affirmative, dialogSettings);
445+
await dialogCoordinator.ShowMessageAsync(this, Application.Current.Resources["String_Header_PingError"] as string, errorMessage, MessageDialogStyle.Affirmative, dialogSettings);
381446

382-
IsPingRunning = false;
447+
PingFinished();
383448
}
384449

385450
private void Ping_UserHasCanceled(object sender, EventArgs e)
386451
{
387452
CancelPing = false;
388-
IsPingRunning = false;
453+
454+
PingFinished();
389455
}
390456
#endregion
391457
}

Source/NETworkManager/Views/Applications/PingView.xaml

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
mc:Ignorable="d">
1515
<UserControl.Resources>
1616
<Converter:BooleanReverseConverter x:Key="BooleanReverseConverter" />
17+
<Converter:NullableDateTimeToStringConverter x:Key="NullableDateTimeToStringConverter" />
1718
<Converter:IntToStringConverter x:Key="IntToStringConverter" />
1819
<Converter:IPStatusToStringConverter x:Key="IPStatusToStringConverter" />
1920
<Converter:PercentConverter x:Key="PercentConverter" />
@@ -111,7 +112,7 @@
111112
</Style>
112113
</Controls:MetroProgressBar.Style>
113114
</Controls:MetroProgressBar>
114-
</Grid>
115+
</Grid>
115116
<TextBlock Grid.Row="2" Text="{DynamicResource String_Header_Status}" Style="{StaticResource HeaderTextBlock}" />
116117
<Control:ScrollingDataGrid Grid.Row="3" CanUserSortColumns="False" CanUserReorderColumns="False" Style="{StaticResource MetroDataGrid}" FontSize="14" mah:ControlsHelper.ContentCharacterCasing="Normal" ItemsSource="{Binding PingResult}" CanUserAddRows="False" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" AutoGenerateColumns="False" IsReadOnly="True" Margin="0,0,0,20">
117118
<Control:ScrollingDataGrid.Resources>
@@ -136,10 +137,13 @@
136137
<TextBlock Text="{DynamicResource String_Header_Statistics}" Style="{StaticResource HeaderTextBlock}" />
137138
<Grid>
138139
<Grid.ColumnDefinitions>
139-
<ColumnDefinition Width="2*" />
140+
<ColumnDefinition Width="1*" />
140141
<ColumnDefinition Width="1*" />
141142
<ColumnDefinition Width="10" />
142-
<ColumnDefinition Width="2*" />
143+
<ColumnDefinition Width="1*" />
144+
<ColumnDefinition Width="1*" />
145+
<ColumnDefinition Width="10" />
146+
<ColumnDefinition Width="1*" />
143147
<ColumnDefinition Width="1*" />
144148
</Grid.ColumnDefinitions>
145149
<Grid.RowDefinitions>
@@ -156,32 +160,38 @@
156160
<Setter Property="ContextMenu" Value="{StaticResource CopyContextMenu}" />
157161
</Style>
158162
</Grid.Resources>
159-
<TextBlock Grid.Column="0" Grid.Row="0" Text="{DynamicResource String_PacketsTransmitted}" />
160-
<TextBox Grid.Column="1" Grid.Row="0" Text="{Binding PingsTransmitted}" />
161-
<TextBlock Grid.Column="0" Grid.Row="2" Text="{DynamicResource String_ReceivedLost}" VerticalAlignment="Bottom" />
162-
<TextBox Grid.Column="1" Grid.Row="2">
163+
<TextBlock Grid.Column="0" Grid.Row="0" Text="{DynamicResource String_StartTime}" />
164+
<TextBox Grid.Column="1" Grid.Row="0" Text="{Binding StartTime, Converter={StaticResource NullableDateTimeToStringConverter}}" />
165+
<TextBlock Grid.Column="0" Grid.Row="2" Text="{DynamicResource String_Duration}" />
166+
<TextBox Grid.Column="1" Grid.Row="2" Text="{Binding Duration, StringFormat={}{0:hh}:{0:mm}:{0:ss}:{0:ff}}" />
167+
<TextBlock Grid.Column="0" Grid.Row="4" Text="{DynamicResource String_EndTime}" />
168+
<TextBox Grid.Column="1" Grid.Row="4" Text="{Binding EndTime, Converter={StaticResource NullableDateTimeToStringConverter}}" />
169+
<TextBlock Grid.Column="3" Grid.Row="0" Text="{DynamicResource String_PacketsTransmitted}" />
170+
<TextBox Grid.Column="4" Grid.Row="0" Text="{Binding PingsTransmitted}" />
171+
<TextBlock Grid.Column="3" Grid.Row="2" Text="{DynamicResource String_ReceivedLost}" VerticalAlignment="Bottom" />
172+
<TextBox Grid.Column="4" Grid.Row="2">
163173
<TextBox.Text>
164174
<MultiBinding StringFormat="{}{0} / {1}">
165175
<Binding Path="PingsReceived" />
166176
<Binding Path="PingsLost" />
167177
</MultiBinding>
168178
</TextBox.Text>
169179
</TextBox>
170-
<TextBlock Grid.Column="0" Grid.Row="4" Text="{DynamicResource String_PacketLoss}" />
171-
<TextBox Grid.Column="1" Grid.Row="4">
180+
<TextBlock Grid.Column="3" Grid.Row="4" Text="{DynamicResource String_PacketLoss}" />
181+
<TextBox Grid.Column="4" Grid.Row="4">
172182
<TextBox.Text>
173183
<MultiBinding Converter="{StaticResource PercentConverter}" StringFormat="{}{0} %">
174184
<Binding Path="PingsTransmitted" />
175185
<Binding Path="PingsLost" />
176186
</MultiBinding>
177187
</TextBox.Text>
178188
</TextBox>
179-
<TextBlock Grid.Column="3" Grid.Row="0" Text="{DynamicResource String_AverageTime}" />
180-
<TextBox Grid.Column="4" Grid.Row="0" Text="{Binding AverageTime, StringFormat={}{0} ms}" />
181-
<TextBlock Grid.Column="3" Grid.Row="2" Text="{DynamicResource String_Minimum}" />
182-
<TextBox Grid.Column="4" Grid.Row="2" Text="{Binding MinimumTime, StringFormat={}{0} ms}" />
183-
<TextBlock Grid.Column="3" Grid.Row="4" Text="{DynamicResource String_Maximum}" />
184-
<TextBox Grid.Column="4" Grid.Row="4" Text="{Binding MaximumTime, StringFormat={}{0} ms}" />
189+
<TextBlock Grid.Column="6" Grid.Row="0" Text="{DynamicResource String_AverageTime}" />
190+
<TextBox Grid.Column="7" Grid.Row="0" Text="{Binding AverageTime, StringFormat={}{0} ms}" />
191+
<TextBlock Grid.Column="6" Grid.Row="2" Text="{DynamicResource String_Minimum}" />
192+
<TextBox Grid.Column="7" Grid.Row="2" Text="{Binding MinimumTime, StringFormat={}{0} ms}" />
193+
<TextBlock Grid.Column="6" Grid.Row="4" Text="{DynamicResource String_Maximum}" />
194+
<TextBox Grid.Column="7" Grid.Row="4" Text="{Binding MaximumTime, StringFormat={}{0} ms}" />
185195
</Grid>
186196
</StackPanel>
187197
</Grid>

Source/NETworkManager/Views/Settings/SettingsWindow.xaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<ColumnDefinition Width="*" />
2020
</Grid.ColumnDefinitions>
2121
<Border Grid.Column="0" BorderBrush="{DynamicResource GrayBrush8}" BorderThickness="0,0,1,0">
22-
<ListBox Background="Transparent" ItemsSource="{Binding SettingsGeneralViews}" SelectedItem="{Binding SelectedSettingsView}">
22+
<ListBox Background="Transparent" ItemsSource="{Binding SettingsGeneralViews}" SelectedItem="{Binding SelectedSettingsView}" Margin="0,0,10,0">
2323
<ListBox.Resources>
2424
<Style TargetType="{x:Type ScrollViewer}" BasedOn="{StaticResource DefaulScrollViewer}" />
2525
</ListBox.Resources>

Source/NETworkManager/WpfHelper/ProtocolSettingsLayout.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,7 @@ private static DependencyPropertyDescriptor GetHasErrorDescriptor(DependencyObje
5757

5858
private static void OnHasErrorChanged(object sender, EventArgs e)
5959
{
60-
DependencyObject dependencyObject = sender as DependencyObject;
61-
62-
if (dependencyObject != null)
60+
if (sender is DependencyObject dependencyObject)
6361
{
6462
dependencyObject.SetValue(MVVMHasErrorProperty, dependencyObject.GetValue(Validation.HasErrorProperty));
6563
}

0 commit comments

Comments
 (0)