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; /// /// Instantiate a ListBoxWindow for use in choosing a network to load /// 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(); } /// /// We are doing a routing table or dhcp. We pass it the device and pull the data from that /// /// The master device to edit/view the routing table of 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(); } /// /// We are doing a packet message detail look. /// /// The packet message to look at 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 itemstrings = new List(); 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 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(); } /// /// The checkmark was changed. Tally up everything /// /// The checkmark that changed /// 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(mybox.Text); } else { WhatToDisplay = WhatToDisplay ^ NB.ParseEnum(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(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(); } } } }