441 lines
16 KiB
C#
441 lines
16 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.Text.RegularExpressions;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using System.Globalization;
|
|
using System.Resources;
|
|
|
|
|
|
namespace EduNetworkBuilder
|
|
{
|
|
public partial class ListBoxWindow : Form
|
|
{
|
|
protected LBContents MyMode = LBContents.messages;
|
|
protected DebugLevel WhatToDisplay = DebugLevel.info; //used when viewing packet-messages
|
|
NetworkDevice myNetDevice;
|
|
PacketMessage myPacketMessage;
|
|
int EditableCount = -1;
|
|
bool processing = false;
|
|
|
|
/// <summary>
|
|
/// Instantiate a ListBoxWindow for use in choosing a network to load
|
|
/// </summary>
|
|
public ListBoxWindow()
|
|
{
|
|
InitializeComponent();
|
|
LanguagifyComponents();
|
|
MyMode = LBContents.puzzles;
|
|
|
|
UpdateForm();
|
|
CheckBox newCB;
|
|
btnAdd.Visible = false;
|
|
int count = 0;
|
|
lblInstructions.Text = "Filter the puzzles by checking one the boxes.";
|
|
panelCheckboxes.SuspendLayout();
|
|
string SelectedTag = GetSelectedTag();
|
|
if (SelectedTag == "ALL")
|
|
Text = Text + "(All Solved)";
|
|
foreach (string str in NB.GetPuzzleTags())
|
|
{
|
|
newCB = AddCheckBox(count, str);
|
|
if (str == SelectedTag || (SelectedTag == "ALL" && Regex.IsMatch(str,"Level")))
|
|
{
|
|
newCB.Checked = true; //The first level with an unsolved puzzle starts checked
|
|
}
|
|
else
|
|
{
|
|
newCB.Checked = false;
|
|
}
|
|
count++;
|
|
}
|
|
panelCheckboxes.ResumeLayout();
|
|
btnOK.Text = "Load";
|
|
btnAdd.Text = "Cancel";
|
|
btnAdd.Visible = true;
|
|
cbLoadPuzzlesAtStart.Checked = Properties.Settings.Default.AutoStartPuzzles;
|
|
UpdateForm();
|
|
}
|
|
|
|
/// <summary>
|
|
/// We are doing a routing table or dhcp. We pass it the device and pull the data from that
|
|
/// </summary>
|
|
/// <param name="MasterDevice">The master device to edit/view the routing table of</param>
|
|
public ListBoxWindow(NetworkDevice MasterDevice, LBContents mode)
|
|
{
|
|
InitializeComponent();
|
|
LanguagifyComponents();
|
|
if (mode == LBContents.routes)
|
|
{
|
|
MyMode = LBContents.routes;
|
|
myNetDevice = MasterDevice;
|
|
lblInstructions.Text = "Double-click a route to change it.";
|
|
lbWindowData.Font = new System.Drawing.Font("Courier New", 8);
|
|
btnAdd.Visible = true;
|
|
}
|
|
if (mode == LBContents.dhcp)
|
|
{
|
|
MyMode = LBContents.dhcp;
|
|
myNetDevice = MasterDevice;
|
|
lblInstructions.Text = "Double-Click the interface to add/edit the range of DHCP to serve.";
|
|
lbWindowData.Font = new System.Drawing.Font("Courier New", 8);
|
|
btnAdd.Visible = false;
|
|
}
|
|
UpdateForm();
|
|
}
|
|
|
|
/// <summary>
|
|
/// We are doing a packet message detail look.
|
|
/// </summary>
|
|
/// <param name="Messages">The packet message to look at</param>
|
|
public ListBoxWindow(PacketMessage Messages)
|
|
{
|
|
InitializeComponent();
|
|
LanguagifyComponents();
|
|
MyMode = LBContents.messages;
|
|
myPacketMessage = Messages;
|
|
UpdateForm();
|
|
btnAdd.Visible = false;
|
|
int count=0;
|
|
lblInstructions.Text = "For greater detail, click on the check-boxes";
|
|
panelCheckboxes.SuspendLayout();
|
|
foreach (string str in Enum.GetNames(typeof(DebugLevel)))
|
|
{
|
|
AddCheckBox(count, str);
|
|
count++;
|
|
}
|
|
panelCheckboxes.ResumeLayout();
|
|
UpdateChecked();
|
|
}
|
|
|
|
private void LanguagifyComponents()
|
|
{
|
|
Text = NB.Translate("LBW_btnOK");
|
|
Text = NB.Translate("LBW_lblInstructions");
|
|
Text = NB.Translate("LBW_btnAdd");
|
|
Text = NB.Translate("LBW_cbLoadPuzzlesAtStart");
|
|
Text = NB.Translate("LBW_btnReset");
|
|
Text = NB.Translate("LBW_Form");
|
|
}
|
|
|
|
private CheckBox AddCheckBox(int count, string name)
|
|
{
|
|
int myY = 1;
|
|
int myX = 1;
|
|
int cdwidth = 70;
|
|
int cdHeight = 20;
|
|
int divisor = panelCheckboxes.Width / cdwidth;
|
|
myX = (cdwidth * count) % (divisor * cdwidth);
|
|
myY = ((cdwidth * count) / (divisor * cdwidth)) * cdHeight;
|
|
CheckBox newCB = new CheckBox();
|
|
newCB.Text = name;
|
|
Point mylocation = new Point(myX, myY);
|
|
newCB.AutoSize = true;
|
|
newCB.Name = "checkBox" + count.ToString();
|
|
newCB.Size = new System.Drawing.Size(98, 21);
|
|
newCB.TabIndex = count;
|
|
newCB.UseVisualStyleBackColor = true;
|
|
newCB.Location = mylocation;
|
|
newCB.CheckedChanged += genericCheckmarkChange;
|
|
panelCheckboxes.Controls.Add(newCB);
|
|
return newCB;
|
|
}
|
|
|
|
private string GetSelectedTag()
|
|
{
|
|
if (Properties.Settings.Default.ScoreList == null)
|
|
Properties.Settings.Default.ScoreList = new System.Collections.Specialized.StringCollection();
|
|
PuzzleInfo PI;
|
|
foreach (string str in NB.GetPuzzleNames())
|
|
{
|
|
if(!Properties.Settings.Default.ScoreList.Contains(str))
|
|
{
|
|
PI = NB.GetPuzzleInfoFromName(str);
|
|
return "Level_" + PI.Level;
|
|
}
|
|
}
|
|
return "ALL";
|
|
}
|
|
|
|
private void UpdateForm()
|
|
{
|
|
int selectedIndex = lbWindowData.SelectedIndex;
|
|
string selected = "";
|
|
if (lbWindowData.SelectedIndex != -1)
|
|
selected = lbWindowData.Items[lbWindowData.SelectedIndex].ToString();
|
|
lbWindowData.Items.Clear();
|
|
cbLoadPuzzlesAtStart.Visible = false;
|
|
btnReset.Visible = false;
|
|
List<string> itemstrings = new List<string>();
|
|
if (MyMode == LBContents.messages)
|
|
{
|
|
itemstrings.AddRange(myPacketMessage.GetMessagesSummary());
|
|
itemstrings.AddRange(myPacketMessage.GetMessagesLike(WhatToDisplay));
|
|
foreach (string str in itemstrings)
|
|
{
|
|
lbWindowData.Items.Add(str);
|
|
}
|
|
}
|
|
if(MyMode == LBContents.routes)
|
|
{
|
|
itemstrings.Add("--Static Routes (Read/Write)--");
|
|
itemstrings.AddRange(myNetDevice.DeviceRouteStrings());
|
|
EditableCount = itemstrings.Count();
|
|
itemstrings.Add("--Routes from NICs (Read-Only)--");
|
|
itemstrings.AddRange(myNetDevice.NICRouteStrings());
|
|
foreach (string str in itemstrings)
|
|
{
|
|
lbWindowData.Items.Add(str);
|
|
}
|
|
}
|
|
if (MyMode == LBContents.dhcp)
|
|
{
|
|
myNetDevice.CheckDHCPRangesAgainstInterfaces();
|
|
itemstrings.AddRange(myNetDevice.DHCPStrings());
|
|
foreach (string str in itemstrings)
|
|
{
|
|
lbWindowData.Items.Add(str);
|
|
}
|
|
}
|
|
if (MyMode == LBContents.puzzles)
|
|
{
|
|
cbLoadPuzzlesAtStart.Visible = true;
|
|
btnReset.Visible = true;
|
|
PuzzleInfo pi;
|
|
if (Properties.Settings.Default.ScoreList == null)
|
|
Properties.Settings.Default.ScoreList = new System.Collections.Specialized.StringCollection();
|
|
string shown_name;
|
|
List<string> Puzzles = NB.GetPuzzleNames();
|
|
if (Puzzles == null) return;
|
|
foreach (string str in Puzzles)
|
|
{
|
|
pi = NB.GetPuzzleInfoFromName(str);
|
|
shown_name = pi.PuzzleName;
|
|
if (Properties.Settings.Default.ScoreList.Contains(str))
|
|
shown_name = "* " + shown_name;
|
|
foreach(string tag in pi.PuzzleTags)
|
|
{
|
|
if(isChecked(tag))
|
|
{
|
|
lbWindowData.Items.Add(shown_name);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if(selected != null && selected != "")
|
|
{
|
|
if (lbWindowData.Items.Contains(selected))
|
|
lbWindowData.SelectedItem = selected;
|
|
}
|
|
if(lbWindowData.SelectedIndex != -1)
|
|
{
|
|
btnOK.Enabled = true;
|
|
}
|
|
else
|
|
{
|
|
btnOK.Enabled = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void btnOK_Click(object sender, EventArgs e)
|
|
{
|
|
if (MyMode == LBContents.puzzles && lbWindowData.SelectedItem != null)
|
|
{
|
|
string TheName = lbWindowData.SelectedItem.ToString();
|
|
TheName = Regex.Replace(TheName, @"^\* ", "");
|
|
Visible = false;
|
|
BuilderWindow myWin = (BuilderWindow)Application.OpenForms["BuilderWindow"];
|
|
if (myWin == null)
|
|
{
|
|
myWin.Activate();
|
|
}
|
|
if(Properties.Settings.Default.AutoStartPuzzles != cbLoadPuzzlesAtStart.Checked)
|
|
{
|
|
Properties.Settings.Default.AutoStartPuzzles = cbLoadPuzzlesAtStart.Checked;
|
|
Properties.Settings.Default.Save();
|
|
}
|
|
if (lbWindowData.SelectedItem != null)
|
|
NB.LoadNetworkFromResource(TheName);
|
|
}
|
|
Close();
|
|
}
|
|
|
|
/// <summary>
|
|
/// The checkmark was changed. Tally up everything
|
|
/// </summary>
|
|
/// <param name="sender">The checkmark that changed</param>
|
|
/// <param name="e"></param>
|
|
private void genericCheckmarkChange(object sender, EventArgs e)
|
|
{
|
|
if (processing) return;
|
|
CheckBox mybox = (CheckBox)sender;
|
|
if (MyMode == LBContents.messages)
|
|
{
|
|
if (mybox.Checked)
|
|
{
|
|
WhatToDisplay = WhatToDisplay | NB.ParseEnum<DebugLevel>(mybox.Text);
|
|
}
|
|
else
|
|
{
|
|
WhatToDisplay = WhatToDisplay ^ NB.ParseEnum<DebugLevel>(mybox.Text);
|
|
}
|
|
}
|
|
UpdateChecked();
|
|
}
|
|
|
|
private bool isChecked(string Name)
|
|
{
|
|
foreach (Control mycontrol in panelCheckboxes.Controls)
|
|
{
|
|
//pull out the name
|
|
CheckBox cb = (CheckBox)mycontrol;
|
|
//make an enum. See if that is set. If so, mark it as checked
|
|
if(cb.Text.ToLower() == Name.ToLower())
|
|
{
|
|
return cb.Checked;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private void UpdateChecked()
|
|
{
|
|
processing = true;
|
|
DebugLevel toFind;
|
|
if (MyMode == LBContents.messages)
|
|
{
|
|
foreach (Control mycontrol in panelCheckboxes.Controls)
|
|
{
|
|
//pull out the name
|
|
CheckBox cb = (CheckBox)mycontrol;
|
|
//make an enum. See if that is set. If so, mark it as checked
|
|
toFind = NB.ParseEnum<DebugLevel>(mycontrol.Text);
|
|
if ((toFind & WhatToDisplay) == toFind)
|
|
{
|
|
cb.Checked = true;
|
|
}
|
|
else //If not, mark it as not checked.
|
|
{
|
|
cb.Checked = false;
|
|
}
|
|
}
|
|
}
|
|
processing=false;
|
|
UpdateForm();
|
|
}
|
|
|
|
private void btnAdd_Click(object sender, EventArgs e)
|
|
{
|
|
if (MyMode == LBContents.routes)
|
|
{
|
|
AddRoute();
|
|
}
|
|
if(MyMode == LBContents.puzzles)
|
|
{
|
|
if (Properties.Settings.Default.AutoStartPuzzles != cbLoadPuzzlesAtStart.Checked)
|
|
{
|
|
Properties.Settings.Default.AutoStartPuzzles = cbLoadPuzzlesAtStart.Checked;
|
|
Properties.Settings.Default.Save();
|
|
}
|
|
Close();
|
|
}
|
|
}
|
|
private void AddRoute()
|
|
{
|
|
IPAddress newip = new IPAddress(NB.ZeroIPString, NB.ZeroIPString, NB.ZeroIPString);
|
|
newip.Edit(myNetDevice,"Create Route");
|
|
myNetDevice.AddRoute(newip);
|
|
UpdateForm();
|
|
}
|
|
|
|
private void lbWindowData_DoubleClick(object sender, EventArgs e)
|
|
{
|
|
|
|
if (MyMode == LBContents.routes)
|
|
{
|
|
if (lbWindowData.SelectedIndex >= EditableCount) return;
|
|
if (lbWindowData.SelectedIndex < 1) return;
|
|
//we always subtract 1 since we have added one line of comment to the list
|
|
myNetDevice.EditRoute(lbWindowData.SelectedIndex - 1);
|
|
}
|
|
if(MyMode == LBContents.dhcp)
|
|
{
|
|
//We always add one since we are skipping the loopback device
|
|
myNetDevice.EditDHCP(lbWindowData.SelectedIndex + 1);
|
|
}
|
|
if (MyMode == LBContents.puzzles)
|
|
{
|
|
//Just like pressing the OK button. We load the map
|
|
btnOK_Click(sender, e);
|
|
}
|
|
UpdateForm();
|
|
}
|
|
private void lbWindowData_Edit_Click(object sender, EventArgs e)
|
|
{
|
|
lbWindowData_DoubleClick(sender, e);
|
|
}
|
|
private void lbWindowData_Delete_Click(object sender, EventArgs e)
|
|
{
|
|
if (MyMode == LBContents.routes)
|
|
{
|
|
if (lbWindowData.SelectedIndex >= EditableCount) return;
|
|
if (lbWindowData.SelectedIndex < 1) return;
|
|
//we always subtract 1 since we have added one line of comment to the list
|
|
myNetDevice.DeleteRoute(lbWindowData.SelectedIndex - 1);
|
|
}
|
|
UpdateForm();
|
|
}
|
|
private void lbWindowData_RightMouseUp(object sender, MouseEventArgs e)
|
|
{
|
|
int index=0;
|
|
if(MyMode == LBContents.routes)
|
|
{
|
|
if (lbWindowData.ContextMenuStrip == null)
|
|
{
|
|
lbWindowData.ContextMenuStrip = new ContextMenuStrip();
|
|
}
|
|
lbWindowData.ContextMenuStrip.Items.Clear();
|
|
lbWindowData.ContextMenuStrip.Items.Add("Edit");
|
|
lbWindowData.ContextMenuStrip.Items[index++].Click += lbWindowData_Edit_Click;
|
|
lbWindowData.ContextMenuStrip.Items.Add("Delete");
|
|
lbWindowData.ContextMenuStrip.Items[index++].Click += lbWindowData_Delete_Click;
|
|
}
|
|
}
|
|
private void lbWindowData_MouseUp(object sender, MouseEventArgs e)
|
|
{
|
|
if (e.Button == System.Windows.Forms.MouseButtons.Right)
|
|
{
|
|
lbWindowData_RightMouseUp(sender, e);
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
if(MyMode == LBContents.puzzles)
|
|
{
|
|
UpdateForm();
|
|
}
|
|
}
|
|
}
|
|
|
|
private void btnReset_Click(object sender, EventArgs e)
|
|
{
|
|
if (Properties.Settings.Default.ScoreList == null)
|
|
Properties.Settings.Default.ScoreList = new System.Collections.Specialized.StringCollection();
|
|
DialogResult answer = MessageBox.Show("Are sure you want to forget what puzzles you have done?", "Forget Puzzles?", MessageBoxButtons.YesNo);
|
|
if (answer == System.Windows.Forms.DialogResult.Yes)
|
|
{
|
|
Properties.Settings.Default.ScoreList.Clear();
|
|
Properties.Settings.Default.Save();
|
|
UpdateForm();
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|