Skip to content

Commit 2b7805e

Browse files
committed
SubnetCalculator improved, code cleanup
1 parent 18c59d8 commit 2b7805e

17 files changed

Lines changed: 208 additions & 181 deletions

Source/NETworkManager/Models/Settings/SettingsInfo.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1003,6 +1003,22 @@ public bool DNSLookup_ExpandStatistics
10031003
}
10041004
}
10051005
#endregion
1006+
1007+
#region Calculator
1008+
private List<string> _subnetCalculator_SubnetHistory = new List<string>();
1009+
public List<string> SubnetCalculator_SubnetHistory
1010+
{
1011+
get { return _subnetCalculator_SubnetHistory; }
1012+
set
1013+
{
1014+
if (value == _subnetCalculator_SubnetHistory)
1015+
return;
1016+
1017+
_subnetCalculator_SubnetHistory = value;
1018+
SettingsChanged = true;
1019+
}
1020+
}
1021+
#endregion
10061022
#endregion
10071023

10081024
#region Constructor

Source/NETworkManager/NETworkManager.csproj

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@
177177
<Compile Include="Models\Settings\NetworkInterfaceProfileManager.cs" />
178178
<Compile Include="Validators\IPAddressValidator.cs" />
179179
<Compile Include="Validators\EmptyOrIPv4AddressValidator.cs" />
180+
<Compile Include="Validators\SubnetValidator.cs" />
180181
<Compile Include="Validators\OpacityTextboxValidator.cs" />
181182
<Compile Include="ViewModels\Applications\DNSLookupViewModel.cs" />
182183
<Compile Include="ViewModels\Applications\WikiOUILookupViewModel.cs" />
@@ -186,8 +187,8 @@
186187
<Compile Include="Views\Applications\WikiOUILookupView.xaml.cs">
187188
<DependentUpon>WikiOUILookupView.xaml</DependentUpon>
188189
</Compile>
189-
<Compile Include="Views\Applications\WikiPortView.xaml.cs">
190-
<DependentUpon>WikiPortView.xaml</DependentUpon>
190+
<Compile Include="Views\Applications\WikiPortLookupView.xaml.cs">
191+
<DependentUpon>WikiPortLookupView.xaml</DependentUpon>
191192
</Compile>
192193
<Compile Include="Views\Settings\UpdateView.xaml.cs">
193194
<DependentUpon>UpdateView.xaml</DependentUpon>
@@ -246,7 +247,7 @@
246247
<Generator>MSBuild:Compile</Generator>
247248
<SubType>Designer</SubType>
248249
</Page>
249-
<Page Include="Views\Applications\WikiPortView.xaml">
250+
<Page Include="Views\Applications\WikiPortLookupView.xaml">
250251
<Generator>MSBuild:Compile</Generator>
251252
<SubType>Designer</SubType>
252253
</Page>

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
<system:String x:Key="String_Header_Client">Client</system:String>
1111
<system:String x:Key="String_Header_MACAddress">MAC-Adresse</system:String>
1212
<system:String x:Key="String_Header_Details">Details</system:String>
13-
<system:String x:Key="String_Header_Input">Eingabe</system:String>
1413
<system:String x:Key="String_Header_Interface">Interface</system:String>
1514
<system:String x:Key="String_Header_Information">Informationen</system:String>
1615
<system:String x:Key="String_Header_Configure">Konfigurieren</system:String>
@@ -62,6 +61,7 @@
6261
<system:String x:Key="String_Header_Search">Suche</system:String>
6362
<system:String x:Key="String_Header_Scan">Scannen</system:String>
6463
<system:String x:Key="String_Header_Lookup">Lookup</system:String>
64+
<system:String x:Key="String_Header_Subnet">Subnetz</system:String>
6565

6666
<!-- Normal strings -->
6767
<system:String x:Key="String_ProductName">NETworkManager</system:String>
@@ -295,7 +295,8 @@
295295
<system:String x:Key="String_Watermark_ExampleIPv4Gateway">192.168.178.1</system:String>
296296
<system:String x:Key="String_Watermark_ExampleIPv4DNSServer">8.8.8.8</system:String>
297297
<system:String x:Key="String_Watermark_EamplePortPortRangeOrService">22; 80; https; ldaps; 777 - 999; 8080</system:String>
298-
298+
<system:String x:Key="String_Watermark_ExampleSubnet">192.168.178.133/26</system:String>
299+
299300
<!-- ShowProgress -->
300301
<system:String x:Key="String_ProgessHeader_ConfigureNetworkInterface">Konfiguriere Netzwerkinterface</system:String>
301302
<system:String x:Key="String_Progress_SetStaticIPAddress">Setze statische IP-Adresse und Gateway...</system:String>
@@ -319,7 +320,8 @@
319320
<system:String x:Key="String_ValidateError_OnlyNumbersCanBeEntered">Es dürfen nur Zahlen eingegeben werden!</system:String>
320321
<system:String x:Key="String_ValidateError_EnterValidValueBetween10and100">Geben Sie einen gültigen Wert ein zwischen 10 und 100!</system:String>
321322
<system:String x:Key="String_ValidateError_EnterValidIPAddress">Geben Sie eine gültige IP-Adresse ein!</system:String>
322-
323+
<system:String x:Key="String_ValidateError_EnterValidSubnet">Geben Sie ein gültiges Subnetz ein (z.B. 192.168.178.133/26)</system:String>
324+
323325
<!-- ApplicationInfo.Name -->
324326
<system:String x:Key="String_ApplicationName_IPScanner">IP-Scanner</system:String>
325327
<system:String x:Key="String_ApplicationName_NetworkInterface">Netzwerkinterface</system:String>

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
<system:String x:Key="String_Header_Client">Clients</system:String>
1111
<system:String x:Key="String_Header_MACAddress">MAC-Address</system:String>
1212
<system:String x:Key="String_Header_Details">Details</system:String>
13-
<system:String x:Key="String_Header_Input">Input</system:String>
1413
<system:String x:Key="String_Header_Interface">Interface</system:String>
1514
<system:String x:Key="String_Header_Information">Information</system:String>
1615
<system:String x:Key="String_Header_Configure">Configure</system:String>
@@ -62,6 +61,7 @@
6261
<system:String x:Key="String_Header_Search">Search</system:String>
6362
<system:String x:Key="String_Header_Scan">Scan</system:String>
6463
<system:String x:Key="String_Header_Lookup">Lookup</system:String>
64+
<system:String x:Key="String_Header_Subnet">Subnet</system:String>
6565

6666
<!-- Normal strings -->
6767
<system:String x:Key="String_ProductName">NETworkManager</system:String>
@@ -295,6 +295,7 @@
295295
<system:String x:Key="String_Watermark_ExampleIPv4Gateway">192.168.178.1</system:String>
296296
<system:String x:Key="String_Watermark_ExampleIPv4DNSServer">8.8.8.8</system:String>
297297
<system:String x:Key="String_Watermark_EamplePortPortRangeOrService">22; 80; https; ldaps; 777 - 999; 8080</system:String>
298+
<system:String x:Key="String_Watermark_ExampleSubnet">192.168.178.133/26</system:String>
298299

299300
<!-- ShowProgress -->
300301
<system:String x:Key="String_ProgessHeader_ConfigureNetworkInterface">Configure Network Interface</system:String>
@@ -319,6 +320,7 @@
319320
<system:String x:Key="String_ValidateError_OnlyNumbersCanBeEntered">Only numbers can be entered!</system:String>
320321
<system:String x:Key="String_ValidateError_EnterValidValueBetween10and100">Enter a valid value between 10 and 100!</system:String>
321322
<system:String x:Key="String_ValidateError_EnterValidIPAddress">Enter a valid IP-Address!</system:String>
323+
<system:String x:Key="String_ValidateError_EnterValidSubnet">Enter a valid subnet (like 192.168.178.133/26)</system:String>
322324

323325
<!-- ApplicationView.Name -->
324326
<system:String x:Key="String_ApplicationName_IPScanner">IP-Scanner</system:String>
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using System.Globalization;
2+
using System.Text.RegularExpressions;
3+
using System.Windows;
4+
using System.Windows.Controls;
5+
using NETworkManager.Helpers;
6+
7+
namespace NETworkManager.Validators
8+
{
9+
public class SubnetValidator : ValidationRule
10+
{
11+
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
12+
{
13+
string subnet = (value as string).Trim();
14+
15+
if (Regex.IsMatch(subnet, RegexHelper.IPv4AddressCidrRegex))
16+
return ValidationResult.ValidResult;
17+
18+
if (Regex.IsMatch(subnet, RegexHelper.IPv4AddressSubnetmaskRegex))
19+
return ValidationResult.ValidResult;
20+
21+
return new ValidationResult(false, Application.Current.Resources["String_ValidateError_EnterValidSubnet"] as string);
22+
}
23+
}
24+
}

Source/NETworkManager/ViewModels/Applications/DNSLookupViewModel.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using MahApps.Metro.Controls.Dialogs;
2-
using NETworkManager.Models.Network;
1+
using NETworkManager.Models.Network;
32
using NETworkManager.Models.Settings;
43
using NETworkManager.Helpers;
54
using System;

Source/NETworkManager/ViewModels/Applications/SubnetCalculatorViewModel.cs

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
using NETworkManager.Models.Network;
2+
using NETworkManager.Models.Settings;
3+
using System.Collections.Generic;
24
using System.Net;
35
using System.Windows.Input;
46

@@ -7,45 +9,50 @@ namespace NETworkManager.ViewModels.Applications
79
public class SubnetCalculatorViewModel : ViewModelBase
810
{
911
#region Variables
10-
private bool _isDetailsVisible;
11-
public bool IsDetailsVisible
12+
private bool _isLoading = true;
13+
14+
private string _subnet;
15+
public string Subnet
1216
{
13-
get { return _isDetailsVisible; }
17+
get { return _subnet; }
1418
set
1519
{
16-
if (value == _isDetailsVisible)
20+
if (value == _subnet)
1721
return;
1822

19-
_isDetailsVisible = value;
23+
_subnet = value;
2024
OnPropertyChanged();
2125
}
2226
}
2327

24-
private string _ipv4Address;
25-
26-
public string IPv4Address
28+
private List<string> _subnetHistory = new List<string>();
29+
public List<string> SubnetHistory
2730
{
28-
get { return _ipv4Address; }
31+
get { return _subnetHistory; }
2932
set
3033
{
31-
if (value == _ipv4Address)
34+
if (value == _subnetHistory)
3235
return;
3336

34-
_ipv4Address = value;
37+
if (!_isLoading)
38+
SettingsManager.Current.SubnetCalculator_SubnetHistory = value;
39+
40+
_subnetHistory = value;
3541
OnPropertyChanged();
3642
}
3743
}
3844

39-
private string _subnetmaskOrCidr;
40-
public string SubnetmaskOrCidr
45+
private bool _isDetailsVisible;
46+
public bool IsDetailsVisible
4147
{
42-
get { return _subnetmaskOrCidr; }
48+
get { return _isDetailsVisible; }
4349
set
4450
{
45-
if (value == _subnetmaskOrCidr)
51+
if (value == _isDetailsVisible)
4652
return;
4753

48-
_subnetmaskOrCidr = value;
54+
55+
_isDetailsVisible = value;
4956
OnPropertyChanged();
5057
}
5158
}
@@ -159,12 +166,17 @@ public ICommand CalculateIPv4SubnetCommand
159166
#region Methods
160167
private void CalculateIPv4SubnetAction()
161168
{
162-
string subnetmask = SubnetmaskOrCidr;
169+
IsDetailsVisible = false;
163170

164-
if (SubnetmaskOrCidr.StartsWith("/"))
165-
subnetmask = Subnetmask.GetFromCidr(int.Parse(SubnetmaskOrCidr.TrimStart('/'))).Subnetmask;
171+
string[] subnet = Subnet.Trim().Split('/');
166172

167-
SubnetInfo subnetInfo = Subnet.CalculateIPv4Subnet(IPAddress.Parse(IPv4Address), IPAddress.Parse(subnetmask));
173+
string subnetmask = subnet[1];
174+
175+
// Convert CIDR to subnetmask
176+
if (subnetmask.Length < 3)
177+
subnetmask = Subnetmask.GetFromCidr(int.Parse(subnet[1])).Subnetmask;
178+
179+
SubnetInfo subnetInfo = Models.Network.Subnet.CalculateIPv4Subnet(IPAddress.Parse(subnet[0]), IPAddress.Parse(subnetmask));
168180

169181
DetailsNetworkAddress = subnetInfo.NetworkAddress;
170182
DetailsBroadcast = subnetInfo.Broadcast;

Source/NETworkManager/ViewModels/Applications/WikiPortViewModel.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
namespace NETworkManager.ViewModels.Applications
1010
{
11-
public class WikiPortViewModel : ViewModelBase
11+
public class WikiPortLookupViewModel : ViewModelBase
1212
{
1313
#region Variables
1414
private IDialogCoordinator dialogCoordinator;
@@ -102,7 +102,7 @@ public bool NoPortsFound
102102
#endregion
103103

104104
#region Constructor, Load settings
105-
public WikiPortViewModel(IDialogCoordinator instance)
105+
public WikiPortLookupViewModel(IDialogCoordinator instance)
106106
{
107107
dialogCoordinator = instance;
108108

Source/NETworkManager/Views/Applications/DNSLookupView.xaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
<Grid Grid.Row="0">
3636
<Grid.ColumnDefinitions>
3737
<ColumnDefinition Width="*" />
38+
<ColumnDefinition Width="10" />
3839
<ColumnDefinition Width="Auto" />
3940
</Grid.ColumnDefinitions>
4041
<ComboBox Grid.Column="0" x:Name="txtHostnameOrIPAddress" ItemsSource="{Binding HostnameOrIPAddressHistory}" mah:TextBoxHelper.Watermark="{DynamicResource String_Watermark_HostnameOrIPAddress}" Validation.ErrorTemplate="{StaticResource DefaultErrorTemplate}" IsEnabled="{Binding IsLookupRunning, Converter={StaticResource BooleanReverseConverter}}" Style="{StaticResource HistoryComboBox}">
@@ -46,7 +47,7 @@
4647
</Binding>
4748
</ComboBox.Text>
4849
</ComboBox>
49-
<Button Grid.Column="1" Command="{Binding LookupCommand}" IsDefault="{Binding IsLookupRunning, Converter={StaticResource BooleanReverseConverter}}" HorizontalAlignment="Right" Margin="10,0,0,0">
50+
<Button Grid.Column="2" Command="{Binding LookupCommand}" IsDefault="{Binding IsLookupRunning, Converter={StaticResource BooleanReverseConverter}}" HorizontalAlignment="Right">
5051
<Button.Resources>
5152
<Style TargetType="{x:Type Button}" BasedOn="{StaticResource ImageWithTextButton}">
5253
<Setter Property="IsEnabled" Value="True" />

Source/NETworkManager/Views/Applications/IPScannerView.xaml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,10 @@
3737
<Grid Grid.Row="0">
3838
<Grid.ColumnDefinitions>
3939
<ColumnDefinition Width="*" />
40+
<ColumnDefinition Width="10" />
4041
<ColumnDefinition Width="Auto" />
4142
</Grid.ColumnDefinitions>
42-
<ComboBox Grid.Column="0" x:Name="txtIPRange" ItemsSource="{Binding IPRangeHistory}" mah:TextBoxHelper.Watermark="{DynamicResource String_Watermark_EampleIPScanRange}" Validation.ErrorTemplate="{StaticResource DefaultErrorTemplate}" IsEnabled="{Binding IsScanRunning, Converter={StaticResource BooleanReverseConverter}}" Style="{StaticResource HistoryComboBox}">
43+
<ComboBox Grid.Column="0" x:Name="cbIPRange" ItemsSource="{Binding IPRangeHistory}" mah:TextBoxHelper.Watermark="{DynamicResource String_Watermark_EampleIPScanRange}" Validation.ErrorTemplate="{StaticResource DefaultErrorTemplate}" IsEnabled="{Binding IsScanRunning, Converter={StaticResource BooleanReverseConverter}}" Style="{StaticResource HistoryComboBox}">
4344
<ComboBox.Text>
4445
<Binding Path="IPRange" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
4546
<Binding.ValidationRules>
@@ -49,12 +50,12 @@
4950
</Binding>
5051
</ComboBox.Text>
5152
</ComboBox>
52-
<Button Grid.Column="1" Command="{Binding ScanCommand}" IsDefault="{Binding IsScanRunning, Converter={StaticResource BooleanReverseConverter}}" IsCancel="{Binding IsScanRunning}" Margin="10,0,0,0">
53+
<Button Grid.Column="2" Command="{Binding ScanCommand}" IsDefault="{Binding IsScanRunning, Converter={StaticResource BooleanReverseConverter}}" IsCancel="{Binding IsScanRunning}">
5354
<Button.Resources>
5455
<Style TargetType="{x:Type Button}" BasedOn="{StaticResource ImageWithTextButton}">
5556
<Setter Property="IsEnabled" Value="True" />
5657
<Style.Triggers>
57-
<DataTrigger Binding="{Binding Path=(Validation.HasError), ElementName=txtIPRange}" Value="True" >
58+
<DataTrigger Binding="{Binding Path=(Validation.HasError), ElementName=cbIPRange}" Value="True" >
5859
<Setter Property="IsEnabled" Value="False" />
5960
</DataTrigger>
6061
<DataTrigger Binding="{Binding CancelScan}" Value="True">
@@ -66,7 +67,7 @@
6667
<Button.Content>
6768
<Grid>
6869
<Grid.ColumnDefinitions>
69-
<ColumnDefinition Width="Auto" />
70+
<ColumnDefinition Width="Auto" />
7071
<ColumnDefinition Width="*" />
7172
</Grid.ColumnDefinitions>
7273
<Rectangle Width="20" Height="20" Margin="10,5,0,5">

0 commit comments

Comments
 (0)