563 lines
21 KiB
C#
563 lines
21 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;
|
|
string FilterString = "";
|
|
|
|
/// <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 = NB.Translate("LBW_LBWFilter");
|
|
panelCheckboxes.SuspendLayout();
|
|
string SelectedTag = GetSelectedTag();
|
|
tbSearchBox.Visible = true;
|
|
if (SelectedTag == NB.Translate("_All"))
|
|
Text = Text + NB.Translate("_AllS");
|
|
|
|
NBSettings oursettings = NB.GetSettings();
|
|
|
|
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 = NB.Translate("_Load");
|
|
btnAdd.Text = NB.Translate("_Cancel");
|
|
btnAdd.Visible = true;
|
|
cbLoadPuzzlesAtStart.Checked = oursettings.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();
|
|
tbSearchBox.Visible = false;
|
|
if (mode == LBContents.routes)
|
|
{
|
|
MyMode = LBContents.routes;
|
|
myNetDevice = MasterDevice;
|
|
lblInstructions.Text = NB.Translate("LBW_LBWDblClckRout");
|
|
lbWindowData.Font = new System.Drawing.Font("Courier New", 8);
|
|
btnAdd.Visible = true;
|
|
}
|
|
if (mode == LBContents.dhcp)
|
|
{
|
|
MyMode = LBContents.dhcp;
|
|
myNetDevice = MasterDevice;
|
|
lblInstructions.Text = NB.Translate("LBW_LBWDblClckIf");
|
|
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 = NB.Translate("LBW_LBWDetail");
|
|
panelCheckboxes.SuspendLayout();
|
|
foreach (string str in Enum.GetNames(typeof(DebugLevel)))
|
|
{
|
|
AddCheckBox(count, str);
|
|
count++;
|
|
}
|
|
panelCheckboxes.ResumeLayout();
|
|
UpdateChecked();
|
|
}
|
|
|
|
private void LanguagifyComponents()
|
|
{
|
|
Text = NB.Translate("_OK");
|
|
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()
|
|
{
|
|
PuzzleInfo PI;
|
|
string first = "";
|
|
NBSettings oursettings = NB.GetSettings();
|
|
|
|
string OriginalChoice = oursettings.ProcessingLevel;
|
|
if(OriginalChoice != null)
|
|
{
|
|
if (NB.PuzzleLevelHasUnsolved(OriginalChoice))
|
|
return OriginalChoice;
|
|
}
|
|
|
|
foreach (string str in NB.GetPuzzleNames())
|
|
{
|
|
if(!oursettings.ScoreList.Contains(str))
|
|
{
|
|
PI = NB.GetPuzzleInfoFromName(str);
|
|
first = "Level_" + PI.Level;
|
|
break;
|
|
}
|
|
}
|
|
if (first != "")
|
|
return first;
|
|
return NB.Translate("_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(NB.Translate("LBW_UpdateFormStatRout"));
|
|
itemstrings.AddRange(myNetDevice.DeviceRouteStrings());
|
|
EditableCount = itemstrings.Count();
|
|
itemstrings.Add(NB.Translate("LBW_UpdateFormNICRout"));
|
|
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;
|
|
string shown_name;
|
|
List<string> Puzzles = NB.GetPuzzleNames();
|
|
NBSettings oursettings = NB.GetSettings();
|
|
if (Puzzles == null) return;
|
|
bool wasfinished = false;
|
|
foreach (string str in Puzzles)
|
|
{
|
|
wasfinished = false;
|
|
if (FilterString == "")
|
|
{
|
|
pi = NB.GetPuzzleInfoFromName(str);
|
|
shown_name = pi.PuzzleName;
|
|
if (oursettings.CheckIfDone(str))
|
|
{
|
|
shown_name = "* " + shown_name;
|
|
wasfinished = true;
|
|
}
|
|
foreach (string tag in pi.PuzzleTags)
|
|
{
|
|
if (isChecked(tag))
|
|
{
|
|
if(selected == "" && !wasfinished) selected = shown_name; //Select the first unfinished puzzle
|
|
lbWindowData.Items.Add(shown_name);
|
|
break;
|
|
}
|
|
}
|
|
}else
|
|
{
|
|
//We are filtering stuff
|
|
pi = NB.GetPuzzleInfoFromName(str);
|
|
shown_name = pi.PuzzleName;
|
|
bool added = false;
|
|
string localFilter = ".*" + FilterString + ".*";
|
|
if (oursettings.ScoreList.Contains(str))
|
|
{
|
|
shown_name = "* " + shown_name;
|
|
wasfinished = true;
|
|
}
|
|
if (!added && pi.PuzzleName != null && Regex.IsMatch(pi.PuzzleName, localFilter, RegexOptions.IgnoreCase))
|
|
{
|
|
added = true;
|
|
lbWindowData.Items.Add(shown_name);
|
|
}
|
|
if (!added && pi.PuzzleDescription!= null && Regex.IsMatch(pi.PuzzleDescription, localFilter, RegexOptions.IgnoreCase))
|
|
{
|
|
added = true;
|
|
lbWindowData.Items.Add(shown_name);
|
|
}
|
|
if (!added && pi.PuzzleTitle != null && Regex.IsMatch(pi.PuzzleTitle, localFilter,RegexOptions.IgnoreCase))
|
|
{
|
|
added = true;
|
|
lbWindowData.Items.Add(shown_name);
|
|
}
|
|
foreach (string tag in pi.PuzzleTags)
|
|
{
|
|
if (!added && pi.PuzzleTitle != null && Regex.IsMatch(tag, localFilter, RegexOptions.IgnoreCase))
|
|
{
|
|
if (selected == "" && !wasfinished) selected = shown_name; //Select the first unfinished puzzle
|
|
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)
|
|
{
|
|
NBSettings oursettings = NB.GetSettings();
|
|
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(oursettings.AutoStartPuzzles != cbLoadPuzzlesAtStart.Checked)
|
|
{
|
|
oursettings.AutoStartPuzzles = cbLoadPuzzlesAtStart.Checked;
|
|
// oursettings.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;
|
|
int mycount = 0;
|
|
string labelname = "";
|
|
NBSettings oursettings = NB.GetSettings();
|
|
if (MyMode == LBContents.puzzles)
|
|
{
|
|
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.Checked)
|
|
{
|
|
mycount++;
|
|
labelname = mycontrol.Text;
|
|
}
|
|
}
|
|
if (mycount == 1)
|
|
{
|
|
//We only have one item checked. Store this value for later
|
|
oursettings.ProcessingLevel = labelname;
|
|
// oursettings.Save();
|
|
}
|
|
}
|
|
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;
|
|
labelname = mycontrol.Text;
|
|
mycount++;
|
|
}
|
|
else //If not, mark it as not checked.
|
|
{
|
|
cb.Checked = false;
|
|
}
|
|
}
|
|
}
|
|
processing=false;
|
|
UpdateForm();
|
|
}
|
|
|
|
private void btnAdd_Click(object sender, EventArgs e)
|
|
{
|
|
NBSettings oursettings = NB.GetSettings();
|
|
if (MyMode == LBContents.routes)
|
|
{
|
|
AddRoute();
|
|
}
|
|
if(MyMode == LBContents.puzzles)
|
|
{
|
|
if (oursettings.AutoStartPuzzles != cbLoadPuzzlesAtStart.Checked)
|
|
{
|
|
oursettings.AutoStartPuzzles = cbLoadPuzzlesAtStart.Checked;
|
|
// oursettings.Save();
|
|
}
|
|
Close();
|
|
}
|
|
}
|
|
private void AddRoute()
|
|
{
|
|
IPAddress newip = new IPAddress(NB.ZeroIPString, NB.ZeroIPString, NB.ZeroIPString);
|
|
newip.Edit(myNetDevice, this, NB.Translate("LBW_AddRouteCreate"));
|
|
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, this);
|
|
}
|
|
if(MyMode == LBContents.dhcp)
|
|
{
|
|
//We always add one since we are skipping the loopback device
|
|
myNetDevice.EditDHCP(lbWindowData.SelectedIndex + 1, this);
|
|
}
|
|
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(NB.Translate("_Edit"));
|
|
lbWindowData.ContextMenuStrip.Items[index++].Click += lbWindowData_Edit_Click;
|
|
lbWindowData.ContextMenuStrip.Items.Add(NB.Translate("_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)
|
|
{
|
|
if ((Form.ModifierKeys & Keys.Control) == Keys.Control && (Form.ModifierKeys & Keys.Alt) == Keys.Alt)
|
|
{
|
|
//We are control + alt clicking on something
|
|
if (lbWindowData.SelectedItem != null)
|
|
{
|
|
string TheName = lbWindowData.SelectedItem.ToString();
|
|
TheName = Regex.Replace(TheName, @"^\* ", "");
|
|
//If the puzzle is solved, mark it as unsolved.
|
|
//If it is unsolved, mark it as solved.
|
|
NBSettings oursettings = NB.GetSettings();
|
|
if(oursettings != null)
|
|
{
|
|
if (oursettings.ScoreList.Contains(TheName))
|
|
{
|
|
oursettings.ScoreList.Remove(TheName);
|
|
}
|
|
else
|
|
oursettings.ScoreList.Add(TheName);
|
|
}
|
|
}
|
|
}
|
|
UpdateForm();
|
|
}
|
|
}
|
|
}
|
|
|
|
private void btnReset_Click(object sender, EventArgs e)
|
|
{
|
|
DialogResult answer = MessageBox.Show(NB.Translate("LBW_btnResetYouSure"), NB.Translate("LBW_btnResetForget"), MessageBoxButtons.YesNo);
|
|
if (answer == System.Windows.Forms.DialogResult.Yes)
|
|
{
|
|
NBSettings oursettings = NB.GetSettings();
|
|
oursettings.ScoreList.Clear();
|
|
UpdateForm();
|
|
}
|
|
}
|
|
|
|
private void tbSearchBox_TextChanged(object sender, EventArgs e)
|
|
{
|
|
//If there are more than 2 characters, then we start to see if we can filter it
|
|
if (tbSearchBox.Text.Length > 2)
|
|
{
|
|
//Now we filter the results
|
|
FilterString = tbSearchBox.Text;
|
|
UpdateForm();
|
|
}
|
|
else
|
|
{
|
|
FilterString = "";
|
|
UpdateForm();
|
|
}
|
|
}
|
|
}
|
|
}
|