WellDone ought to default to "false" so that canceling the form does not return a true. However, that then means that the validating (particularly for DHCP) needs to be handled differently. Otherwise validation would ONLY occur when you press OK. (Not a terrible thing, but also not ideal.) In any case, this is a solution I found on the internet. It seems to work nicely. Validating still runs unless the form is closing (via ESC, Cancel, or X), including when moving from textbox to textbox, or tabbing to OK. I think this also solves a lingering problem where DHCP couldn't X out without attempting to validate. So it feels like an all-around winner. Step to reproduce: Level0 ping test 1.) on net_switch0, try to ping pc0. -tab through and notice that pc0 resolves to 192.168.1.2 on OK button. 2.) close with form window using X -notice that the ping happens anyway. Same is true for arp and traceroute.
310 lines
11 KiB
C#
310 lines
11 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using System.Globalization;
|
|
using System.Resources;
|
|
|
|
|
|
namespace EduNetworkBuilder
|
|
{
|
|
public partial class IPAddressEntry : Form
|
|
{
|
|
NB_IPAddress WhatToEdit;
|
|
NB_IPAddress DHCPInterface=null;
|
|
bool WellDone = false;
|
|
NetworkDevice ParentDevice = null;
|
|
Point StartLocation = new Point (50,50);
|
|
|
|
NB_IPAddress SavedIPAddress = null;
|
|
ToolTip myTooltip = new ToolTip();
|
|
|
|
//variable to hold true if the for is closing
|
|
private bool isFormClosing = false;
|
|
// Contant for the close message
|
|
private const int WM_CLOSE = 16;
|
|
//override the WndProc msg to trap the WM_CLOSE message
|
|
protected override void WndProc(ref Message m)
|
|
{
|
|
if (m.Msg == WM_CLOSE)
|
|
isFormClosing = true;
|
|
base.WndProc(ref m);
|
|
}
|
|
|
|
public IPAddressEntry(NB_IPAddress toEdit, NetworkDevice ToEdit, Form ParentForm, bool JustPinging=false)
|
|
{
|
|
InitializeComponent();
|
|
LanguagifyComponents();
|
|
if(ParentForm != null)
|
|
{
|
|
Point NewPoint = new Point(ParentForm.Location.X + (ParentForm.Width / 2), ParentForm.Location.Y + (ParentForm.Height / 2));
|
|
StartLocation = NewPoint;
|
|
}
|
|
ParentDevice = ToEdit;
|
|
Network myNet = NB.GetNetwork();
|
|
NB_IPAddress lastIP = myNet.RetrieveLastIP();
|
|
SavedIPAddress = new NB_IPAddress(toEdit);
|
|
WhatToEdit = toEdit;
|
|
string hostname = "";
|
|
if (ToEdit != null)
|
|
hostname = ToEdit.hostname;
|
|
if (toEdit.GetIP.ToIpString() == NB.ZeroIPString)
|
|
{
|
|
string lIP = lastIP.GetIP.ToIpString();
|
|
string lNM = lastIP.GetMask.ToIpString();
|
|
string lGW = lastIP.GetGateway.ToIpString();
|
|
switch (WhatToEdit.GetAddressType)
|
|
{
|
|
case IPAddressType.gw:
|
|
lNM = NB.ZeroIPString;
|
|
lGW = NB.ZeroIPString;
|
|
break;
|
|
case IPAddressType.ip:
|
|
case IPAddressType.ip_only:
|
|
if (!lNM.Contains("255"))
|
|
lNM = "255.255.255.0";
|
|
lGW = NB.ZeroIPString;
|
|
break;
|
|
case IPAddressType.route:
|
|
break;
|
|
}
|
|
WhatToEdit.Reparse(lIP, lNM, lGW);
|
|
}
|
|
UpdateFieldsFromAddress();
|
|
switch (WhatToEdit.GetAddressType)
|
|
{
|
|
case IPAddressType.gw:
|
|
tbGateway.Enabled = false;
|
|
tbGateway.Visible = false; //This just confuses people
|
|
tbIPAddress.Enabled = true;
|
|
tbNetmask.Enabled = false;
|
|
lblGateway.Visible = false;
|
|
break;
|
|
case IPAddressType.ip:
|
|
tbGateway.Enabled = false;
|
|
tbIPAddress.Enabled = true;
|
|
tbNetmask.Enabled = true;
|
|
break;
|
|
case IPAddressType.route:
|
|
tbGateway.Enabled = true;
|
|
tbIPAddress.Enabled = true;
|
|
tbNetmask.Enabled = true;
|
|
break;
|
|
case IPAddressType.ip_only:
|
|
tbGateway.Enabled = false;
|
|
tbIPAddress.Enabled = true;
|
|
tbNetmask.Enabled = false;
|
|
break;
|
|
}
|
|
|
|
//Disable anythingthatis locked
|
|
switch (WhatToEdit.GetAddressType)
|
|
{
|
|
case IPAddressType.gw:
|
|
if (myNet.ItemIsLocked(hostname, tbIPAddress.Text, NetTestType.LockGateway))
|
|
{
|
|
tbGateway.Enabled = false;
|
|
tbIPAddress.Enabled = false;
|
|
tbNetmask.Enabled = false;
|
|
}
|
|
break;
|
|
case IPAddressType.ip:
|
|
if (myNet.ItemIsLocked(hostname, tbIPAddress.Text, NetTestType.LockIP))
|
|
{
|
|
tbGateway.Enabled = false;
|
|
tbIPAddress.Enabled = false;
|
|
tbNetmask.Enabled = false;
|
|
}
|
|
break;
|
|
case IPAddressType.route:
|
|
if (myNet.ItemIsLocked(hostname, tbIPAddress.Text, NetTestType.LockRoute))
|
|
{
|
|
tbGateway.Enabled = false;
|
|
tbIPAddress.Enabled = false;
|
|
tbNetmask.Enabled = false;
|
|
}
|
|
break;
|
|
case IPAddressType.ip_only:
|
|
if (!JustPinging && myNet.ItemIsLocked(hostname, tbIPAddress.Text, NetTestType.LockIP))
|
|
{
|
|
tbIPAddress.Enabled = false;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void LanguagifyComponents()
|
|
{
|
|
//ResourceManager RM = NB.GetResource();
|
|
//CultureInfo CI = NB.GetCulture();
|
|
Text = NB.Translate("IPAE_lblIP");
|
|
Text = NB.Translate("IPAE_lblNetmask");
|
|
Text = NB.Translate("IPAE_lblGateway");
|
|
Text = NB.Translate("_Cancel");
|
|
Text = NB.Translate("_OK");
|
|
Text = NB.Translate("IPAE_Form");
|
|
}
|
|
|
|
|
|
private void UpdateFieldsFromAddress()
|
|
{
|
|
tbIPAddress.Text = WhatToEdit.GetIP.ToIpString();
|
|
tbNetmask.Text = WhatToEdit.GetMask.ToIpString();
|
|
tbGateway.Text = WhatToEdit.GetGateway.ToIpString();
|
|
}
|
|
|
|
private void btnOK_Click(object sender, EventArgs e)
|
|
{
|
|
WhatToEdit.Reparse(tbIPAddress.Text, tbNetmask.Text, tbGateway.Text);
|
|
Network myNet = NB.GetNetwork();
|
|
myNet.StoreLastIP(WhatToEdit);
|
|
WellDone = true;
|
|
Close();
|
|
}
|
|
|
|
public bool Edit()
|
|
{
|
|
Location = StartLocation;
|
|
ShowDialog();
|
|
return WellDone;
|
|
}
|
|
|
|
public bool Edit(NetworkDevice ToEdit, NB_IPAddress DHCPif)
|
|
{
|
|
DHCPInterface = DHCPif;
|
|
lblIP.Text = NB.Translate("IPAE_EditIf");
|
|
lblNetmask.Text = NB.Translate("IPAE_EditStart");
|
|
lblGateway.Text = NB.Translate("IPAE_EditEnd");
|
|
tbIPAddress.Enabled = false;
|
|
tbGateway.Enabled = true;
|
|
tbNetmask.Enabled = true;
|
|
Network myNet = NB.GetNetwork();
|
|
if (myNet.ItemIsLocked(ToEdit.hostname, tbIPAddress.Text, NetTestType.LockDHCP))
|
|
{
|
|
tbGateway.Enabled = false;
|
|
tbIPAddress.Enabled = false;
|
|
tbNetmask.Enabled = false;
|
|
}
|
|
Location = StartLocation;
|
|
ShowDialog();
|
|
return WellDone;
|
|
}
|
|
|
|
|
|
private void btnCancel_Click(object sender, EventArgs e)
|
|
{
|
|
if(SavedIPAddress != null)
|
|
WhatToEdit.Reparse(SavedIPAddress.GetIPString, SavedIPAddress.GetMaskString, SavedIPAddress.GetGateway.ToIpString());
|
|
UpdateFieldsFromAddress();
|
|
Close();
|
|
}
|
|
|
|
private void tbGateway_Validating(object sender, CancelEventArgs e)
|
|
{
|
|
if (isFormClosing) return;
|
|
|
|
Network mynet = NB.GetNetwork();
|
|
if (ParentDevice != null)
|
|
{
|
|
NB_IPAddress tAddress = mynet.DNSLookup(ParentDevice, tbGateway.Text);
|
|
}
|
|
|
|
UInt32 taddress = tbGateway.Text.ParseIp();
|
|
UInt32 startaddress = tbNetmask.Text.ParseIp();
|
|
tbGateway.Text = taddress.ToIpString();
|
|
if (DHCPInterface != null)
|
|
{
|
|
//We also check to verify that the address is in the correct range
|
|
if (!DHCPInterface.IsLocal(new NB_IPAddress(tbGateway.Text)))
|
|
{
|
|
e.Cancel = true;
|
|
MessageBox.Show(NB.Translate("IPAE_tbGateValEndIPRange"));
|
|
}
|
|
if (taddress < startaddress)
|
|
{
|
|
e.Cancel = true;
|
|
MessageBox.Show(NB.Translate("IPAE_tbGateValIPEqualLarger"));
|
|
}
|
|
}
|
|
}
|
|
|
|
private void tbNetmask_Validating(object sender, CancelEventArgs e)
|
|
{
|
|
if (isFormClosing) return;
|
|
|
|
UInt32 taddress = tbNetmask.Text.ParseIp();
|
|
tbNetmask.Text = taddress.ToIpString();
|
|
if (DHCPInterface != null)
|
|
{
|
|
//We also check to verify that the address is in the correct range
|
|
if (!DHCPInterface.IsLocal(new NB_IPAddress(tbNetmask.Text)))
|
|
{
|
|
e.Cancel = true;
|
|
MessageBox.Show(NB.Translate("IPAE_tbNtmskValEndIPRange"));
|
|
}
|
|
}
|
|
}
|
|
|
|
private void tbIPAddress_Validating(object sender, CancelEventArgs e)
|
|
{
|
|
if (isFormClosing) return;
|
|
|
|
UInt32 taddress;
|
|
Network mynet = NB.GetNetwork();
|
|
NB_IPAddress tIPAddress = null;
|
|
if (ParentDevice != null)
|
|
{
|
|
tIPAddress = mynet.DNSLookup(ParentDevice, tbIPAddress.Text);
|
|
}
|
|
if (tIPAddress != null) //device name used, convert to IP address and netmask
|
|
{
|
|
taddress = tIPAddress.GetIP;
|
|
if (DHCPInterface == null)
|
|
tbNetmask.Text = tIPAddress.GetMaskString;
|
|
}
|
|
else
|
|
taddress = tbIPAddress.Text.ParseIp();
|
|
tbIPAddress.Text = taddress.ToIpString();
|
|
}
|
|
|
|
public void SetText(string text)
|
|
{
|
|
this.Text = text;
|
|
}
|
|
|
|
private void IPAddressEntry_Shown(object sender, EventArgs e)
|
|
{
|
|
Point tLocation = new Point (StartLocation.X - Width, StartLocation.Y - Height);
|
|
if (tLocation.X < 0 || tLocation.Y < 0) tLocation = new Point(50, 50);
|
|
Location = tLocation;
|
|
}
|
|
|
|
public void ShowAsSubnetGateway()
|
|
{
|
|
lblIP.Text = NB.Translate("IPE_Network");
|
|
Text = NB.Translate("NB_Subnet");
|
|
|
|
myTooltip.AutoPopDelay = 5000;
|
|
myTooltip.InitialDelay = 1000;
|
|
myTooltip.ReshowDelay = 500;
|
|
// Force the ToolTip text to be displayed whether or not the form is active.
|
|
myTooltip.ShowAlways = true;
|
|
|
|
myTooltip.SetToolTip(tbIPAddress, NB.Translate("IPE_NetworkTooltip"));
|
|
myTooltip.SetToolTip(tbGateway, NB.Translate("IPE_GatewayTooltip"));
|
|
myTooltip.SetToolTip(tbNetmask, NB.Translate("IPE_NetmaskTooltip"));
|
|
|
|
myTooltip.SetToolTip(lblIP, NB.Translate("IPE_NetworkTooltip"));
|
|
myTooltip.SetToolTip(lblGateway, NB.Translate("IPE_GatewayTooltip"));
|
|
myTooltip.SetToolTip(lblNetmask, NB.Translate("IPE_NetmaskTooltip"));
|
|
|
|
ShowDialog();
|
|
}
|
|
}
|
|
}
|