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.IO; using System.Xml; using System.Text.RegularExpressions; using System.Globalization; using System.Resources; using System.Threading; namespace EduNetworkBuilder { public partial class BuilderWindow : Form { public Random GameRandomGen = new Random(); public NBSettings OurSettings = new NBSettings(NB.IsRunningOnMono()); //This will auto-load the settings private int LastPacketID = 1; public DebugPausePoint DebugSetting = DebugPausePoint.none; // public DebugPausePoint DebugSetting = DebugPausePoint.all | DebugPausePoint.dump; public Network myNetwork = new Network(""); private Network InvisibleNetwork = null; private Network OrigNetworkAfterLoad = null; private List Buttons = new List(); private string selectedButton = ""; ToolTip myTooltip = new ToolTip(); private NetworkDevice MouseHoverOver = null; private Point ClickedLocation; private Point ClickedImageLocation; DateTime LastClick = DateTime.Now; DateTime LastMouseDown = DateTime.Now; private string LastPath = ""; private bool processing = false; private List PuzzleList = new List(); private ResourceManager LanguageResources = null; private CultureInfo LanguageCulture = null; public string ChosenLanguage = "en"; //The language to try to load private List HelpTopicButtons = new List(); private System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer(); public bool NeedsUpdate = false; //Do we do an update next tick //For mouse-move / dragging public DateTime LastMoveTime = DateTime.UtcNow; public bool MouseIsDown = false; //For tracking if we are dragging something public Image LastBackgroundImage = null; public Point LastMouseMovePos = new Point(-1, -1); private NetworkDevice ItemClickedOn = null; private List ItemsSelected = new List(); private Point OrigClickPoint = new Point(-1, -1); private NetShapeType CurrentShape = NetShapeType.none; private NetShape ShapeForEditing = null; private string InitialFileLoad = ""; public PersonClass CurrentUser; private List HelpURLs = new List(); private List storedNetworkStates = new List(); //for ctrl-z going back in time to past state private List ForwardstoredNetworkStates = new List(); //for ctrl-y going forward to a ctrl-y state public BuilderWindow(string FirstArg = "") { InitializeComponent(); InitialFileLoad = FirstArg; LastPath = OurSettings.LastPath; HelpURLs = NB.LoadObjectFromXmlFile>("URLs"); if (!OurSettings.LanguageHasBeenChosen) NB.ChangeLanguage(OurSettings); LanguagifyComponents(); //I never implimented cut/copy/paste/undo. So we will remove them since they do nothing anyway cutToolStripMenuItem.Visible = false; copyToolStripMenuItem.Visible = false; pasteToolStripMenuItem.Visible = false; undoToolStripMenuItem.Visible = false; forgetReplayStatusesToolStripMenuItem.Visible = false; 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(rbHelp1, NB.Translate("NB_BuildWindNone", OurSettings)); myTooltip.SetToolTip(rbHelp2, NB.Translate("NB_BuildWindColor", OurSettings)); myTooltip.SetToolTip(rbHelp3, NB.Translate("NB_BuildWindMinor", OurSettings)); myTooltip.SetToolTip(rbHelp4, NB.Translate("NB_BuildWindDecent", OurSettings)); myTooltip.SetToolTip(btnHelp, NB.Translate("NB_BuildWindMsg", OurSettings)); myTooltip.SetToolTip(btnCaptions, NB.Translate("NB_btnCaptions", OurSettings)); myTooltip.SetToolTip(cbFillColor, NB.Translate("NB_cbFillColor", OurSettings)); myTooltip.SetToolTip(cbLineColor, NB.Translate("NB_cbLineColor", OurSettings)); myTooltip.Popup += myTooltip_Popup; lblStatus.Text = ""; myNetwork.RegisterDisplayArea(pbNetworkView); List ColorNames = myNetwork.ColorNames; ColorNames.Sort(); cbFillColor.Items.Clear(); cbLineColor.Items.Clear(); foreach (string ColorName in ColorNames) { cbFillColor.Items.Add(ColorName); cbLineColor.Items.Add(ColorName); } cbFillColor.Text = "Empty"; cbLineColor.Text = "Empty"; BuildButtons(); LayoutButtons(); UpdateForm(); this.KeyPreview = true; this.KeyUp += GenericKeyDown; myTimer.Interval = 15; myTimer.Tick += Tick; myTimer.Start(); //Set this so we can intercept the esc key. We want to un-set the selected items if esc is pressed KeyPreview = true; CreateSolvedUnsolvedToolstripItems(); LoadPuzzleInfo(); } private void Tick(object sender, EventArgs e) { if (NeedsUpdate) { UpdateVisuals(); NeedsUpdate = false; } myNetwork.Tick(false); } private void LanguagifyComponents() { msMainMenuStrip.Text = NB.Translate("NB_msMainMenuStrip", OurSettings); fileToolStripMenuItem.Text = NB.Translate("NB_fileToolStripMenuItem", OurSettings); newToolStripMenuItem.Text = NB.Translate("LBW_btnAdd", OurSettings); loadToolStripMenuItem.Text = NB.Translate("_Load", OurSettings); reloadToolStripMenuItem.Text = NB.Translate("NB_reloadToolStripMenuItem", OurSettings); saveToolStripMenuItem.Text = NB.Translate("NB_saveToolStripMenuItem", OurSettings); exitToolStripMenuItem.Text = NB.Translate("NB_exitToolStripMenuItem", OurSettings); editToolStripMenuItem.Text = NB.Translate("_Edit", OurSettings); cutToolStripMenuItem.Text = NB.Translate("NB_cutToolStripMenuItem", OurSettings); copyToolStripMenuItem.Text = NB.Translate("NB_copyToolStripMenuItem", OurSettings); pasteToolStripMenuItem.Text = NB.Translate("NB_pasteToolStripMenuItem", OurSettings); undoToolStripMenuItem.Text = NB.Translate("NB_undoToolStripMenuItem", OurSettings); optionsToolStripMenuItem.Text = NB.Translate("NB_optionsToolStripMenuItem", OurSettings); classSetupToolStripMenuItem.Text = NB.Translate("NB_ClassSetup", OurSettings); allToolStripMenuItem.Text = NB.Translate("_All", OurSettings); dHCPRequestToolStripMenuItem.Text = NB.Translate("NB_NetViewDHCP", OurSettings); clearArpTableToolStripMenuItem.Text = NB.Translate("NB_NetViewClr", OurSettings); clearIPsToolStripMenuItem.Text = NB.Translate("NB_clearIPsToolStripMenuItem", OurSettings); pingToolStripMenuItem.Text = NB.Translate("_Ping", OurSettings); helpToolStripMenuItem.Text = NB.Translate("_Help", OurSettings); helpToolStripMenuItem1.Text = NB.Translate("_Help", OurSettings); aboutToolStripMenuItem.Text = NB.Translate("NB_aboutToolStripMenuItem", OurSettings); releaseNotesToolStripMenuItem.Text = NB.Translate("NB_releaseNotesToolStripMenuItem", OurSettings); checkForUpdatesToolStripMenuItem.Text = NB.Translate("NB_checkForUpdatesToolStripMenuItem", OurSettings); samplesToolStripMenuItem.Text = NB.Translate("NB_samplesToolStripMenuItem", OurSettings); puzzlesToolStripMenuItem.Text = NB.Translate("NB_puzzlesToolStripMenuItem", OurSettings); solvedToolStripMenuItem.Text = NB.Translate("_Solved", OurSettings); toSolveToolStripMenuItem.Text = NB.Translate("NB_toSolveToolStripMenuItem", OurSettings); lblStatus.Text = NB.Translate("NB_lblStatus", OurSettings); btnHelp.Text = NB.Translate("NB_btnHelp", OurSettings); addToClassworkToolStripMenuItem.Text = NB.Translate("NB_AddToClasswork"); changeLanguageToolStripMenuItem.Text = NB.Translate("NB_changeLanguageToolStripMenuItem", OurSettings); submitHomeworkToolStripMenuItem.Text = NB.Translate("NB_SubmitClasswork"); updateClassworkToolStripMenuItem.Text = NB.Translate("NB_UpdateClasswork"); markAsGradedToolStripMenuItem.Text = NB.Translate("NB_MarkGraded"); Text = NB.Translate("NB_Form", OurSettings); } public ResourceManager GetResource() { if (LanguageResources == null) { System.Reflection.Assembly MyAssembly; MyAssembly = this.GetType().Assembly; LanguageResources = new ResourceManager("EduNetworkBuilder.Resources.languages.edustrings", MyAssembly); } return LanguageResources; } public CultureInfo GetCulture() { if (LanguageCulture == null) { string CL = OurSettings.ChosenLanguage; if (CL != ChosenLanguage) ChosenLanguage = CL; LanguageCulture = CultureInfo.CreateSpecificCulture(ChosenLanguage); } return LanguageCulture; } /// /// Look up a translate key from the resx file. /// /// The string to look up /// The translated string public string Translate(string Key) { ResourceManager RM = GetResource(); CultureInfo CI = GetCulture(); string answer; answer = RM.GetString(Key, CI); if (answer == null) return ""; return answer; } private void GenericKeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Delete) { pbNetworkView_Delete_Click(sender, e); ItemClickedOn = null; } if (e.KeyCode == Keys.S && e.Modifiers == Keys.Control) { doSave(true); } if (e.KeyCode == Keys.Z && e.Modifiers == Keys.Control) { if (storedNetworkStates.Count > 0) { ForwardstoredNetworkStates.Insert(0, myNetwork);//So we can ctrl-y to this state. Undo the undo ChangeToPastState(storedNetworkStates[0]); storedNetworkStates.RemoveAt(0); } } if (e.KeyCode == Keys.Y && e.Modifiers == Keys.Control) { if (ForwardstoredNetworkStates.Count > 0) { storedNetworkStates.Insert(0, myNetwork); ChangeToPastState(ForwardstoredNetworkStates[0]); ForwardstoredNetworkStates.RemoveAt(0); } } //MessageBox.Show(e.KeyCode.ToString()); } public void StoreNetworkState(Network toStore) { if (storedNetworkStates.Count > 0 && toStore.Equals(storedNetworkStates[0])) return; //The states are identical. Do not store this state. storedNetworkStates.Insert(0, Network.DeepClone(toStore)); ForwardstoredNetworkStates.Clear(); int maxCount = 30; if (storedNetworkStates.Count > maxCount) { storedNetworkStates.RemoveRange(maxCount, storedNetworkStates.Count - maxCount); } } /// /// We do this every time we load a new network or create a network from scratch /// public void ClearStoredNetworkStates() { storedNetworkStates.Clear(); ForwardstoredNetworkStates.Clear(); } /// /// Store the new state after a change has been made. /// Do this before every change (add, delete, move) /// public void ProcessChange() { StoreNetworkState(myNetwork); } public void ChangeToPastState(Network OldNet) { if (OldNet != null) { myNetwork = OldNet; myNetwork.RegisterDisplayArea(pbNetworkView); UpdateMenu(); UpdateForm(); } } /// /// Return the control with the given name. Used primarily to color help buttons /// /// The name of the control to search for /// The control, or null if no control is found public Control GetControlNamed(string Name) { Control[] tList = Controls.Find(Name, true); if (tList.Count() > 0) return tList[0]; //return the first one return null; //return nothing } private void UpdateHelpTopicButtons() { Button tButton; this.SuspendLayout(); foreach (Control tCont in HelpTopicButtons) { tCont.Click -= btnRead_Click; Controls.Remove(tCont); //remove them all HelpPanel.Controls.Remove(tCont); //Remove from the panel tCont.Dispose(); } HelpTopicButtons.Clear(); //They are all gone. //Make a bunch of new buttons. int count = 0; int offset = btnHelp.Height + 3; if (myNetwork.NetURL.GetText() != "") { tButton = new Button(); tButton.Location = new Point(btnHelp.Location.X, rbHelp1.Location.Y + rbHelp1.Height + 5 + (offset * count)); //tButton.Text = (count + 1).ToString(); tButton.BackgroundImage = Properties.Resources.VidImage; tButton.BackgroundImageLayout = ImageLayout.Stretch; tButton.Width = btnHelp.Width; tButton.Height = btnHelp.Height; tButton.Click += btnRead_Click; tButton.Name = myNetwork.PuzzleName + "_URL"; tButton.Tag = myNetwork.NetURL.GetText(); HelpPanel.Controls.Add(tButton); myTooltip.SetToolTip(tButton, NB.Translate("_OpenURL") + " " + myNetwork.PuzzleName); HelpTopicButtons.Add(tButton); count++; } foreach (HelpTopics HT in myNetwork.SuggestedReadings) { tButton = new Button(); string URL = URLFromHelpTopic(HT); tButton.Location = new Point(btnHelp.Location.X, rbHelp1.Location.Y + rbHelp1.Height + 5 + (offset * count)); tButton.Text = (count + 1).ToString(); tButton.Width = btnHelp.Width; tButton.Height = btnHelp.Height; tButton.Click += btnRead_Click; tButton.Name = HT.ToString(); if (URL != "") { //We have a URL for this. tButton.BackgroundImage = Properties.Resources.VidImage; tButton.BackgroundImageLayout = ImageLayout.Stretch; tButton.Tag = URL; tButton.ForeColor = Color.White; } HelpPanel.Controls.Add(tButton); string ttip = NB.Translate("_ReadContext") + " " + NB.Translate(NB.GetHelpTopicTitle(HT)); if (URL != "") ttip += "\n" + NB.Translate("_HasURL"); myTooltip.SetToolTip(tButton, ttip); HelpTopicButtons.Add(tButton); count++; } foreach (NetTest nt in myNetwork.NetTests) { if (nt.TheTest == NetTestType.ReadContextHelp) { nt.ColorItemsIfNeeded(true); } } this.ResumeLayout(); } string URLFromHelpTopic(HelpTopics what, string lang = "") { string topic = what.ToString(); if (lang == "") lang = ChosenLanguage; foreach (HelpURL one in HelpURLs) { if (one.HelpTopicString == topic && one.LangTag == lang) { return one.URL; } } return ""; } /// /// Called by the context_read clicks /// /// /// private void btnRead_Click(object sender, EventArgs e) { Button me = (Button)sender; bool isURL = false; isURL = Regex.IsMatch(me.Name, "_URL$"); if (!isURL) { HelpTopics HT = NB.TryParseEnum(me.Name, HelpTopics.None); if (HT != HelpTopics.None) { if (ModifierKeys == Keys.Control && me.Tag != null) { //It should be a video URL string URL = (string)me.Tag; NB.OpenURLInExternalBrowser(URL); } else { myNetwork.NoteActionDone(NetTestType.ReadContextHelp, me.Name, NB.Translate("_Read")); NB.ReadContextHelp(HT); } } UpdateHelpTopicButtons(); UpdateForm(); UpdateMenu(); myNetwork.TestForCompletion(true); } else { if (me.Tag != null) { //It should be a video URL string URL = (string)me.Tag; NB.OpenURLInExternalBrowser(URL); } } } private void myTooltip_Popup(Object sender, PopupEventArgs e) { //In case we have a puzzle we are trying to solve if (MouseHoverOver == null) return; bool didsomething = myNetwork.NoteActionDone(NetTestType.HelpRequest, MouseHoverOver.hostname, myNetwork.HintsToDisplay.ToString()); if (didsomething) { UpdateVisuals(); myNetwork.TestForCompletion(true); } } private void BuildButton(string btnName, Image btnImage, string tooltipString) { int size = panelChoices.Width / 2; Button tButton; tButton = new Button(); tButton.Name = btnName; tButton.BackgroundImage = new Bitmap(btnImage); tButton.BackgroundImageLayout = ImageLayout.Zoom; tButton.Click += btnClick; tButton.Height = size; tButton.Width = size; tButton.Location = new Point(0, 0); Buttons.Add(tButton); panelChoices.Controls.Add(tButton); myTooltip.SetToolTip(tButton, tooltipString); } private void BuildButtons() { BuildButton("btnSwitch", Properties.Resources.Switch, NB.Translate("NB_BuildBtnSwitch")); BuildButton("btnHub", Properties.Resources.Hub, NB.Translate("NB_BuildBtnHub")); BuildButton("btnServer", Properties.Resources.Server, NB.Translate("NB_BuildBtnServer")); BuildButton("btnLaptop", Properties.Resources.Laptop, NB.Translate("NB_BuildBtnLaptop")); BuildButton("btnPC", Properties.Resources.PC, NB.Translate("NB_BuildBtnPC")); BuildButton("btnRouter", Properties.Resources.Router, NB.Translate("NB_BuildBtnRouter")); BuildButton("btnIPPhone", Properties.Resources.ip_phone, NB.Translate("NB_BuildBtnPhone")); BuildButton("btnFirewall", Properties.Resources.firewall, NB.Translate("NB_BuildBtnFirewall")); BuildButton("btnPrinter", Properties.Resources.Printer, NB.Translate("NB_BuildBtnPrinter")); BuildButton("btnCopier", Properties.Resources.Copier, NB.Translate("NB_BuildBtnCopier")); BuildButton("btnMicrowave", Properties.Resources.microwave, NB.Translate("NB_BuildBtnMicrowave")); BuildButton("btnFluorescent", Properties.Resources.fluorescent, NB.Translate("NB_BuildBtnLight")); BuildButton("btnWAP", Properties.Resources.wap, NB.Translate("NB_BuildBtnWAP")); BuildButton("btnWRouter", Properties.Resources.WRouter, NB.Translate("NB_BuildBtnWRouter")); BuildButton("btnWBridge", Properties.Resources.WBridge, NB.Translate("NB_BuildBtnBridge")); BuildButton("btnWRepeater", Properties.Resources.WRepeater, NB.Translate("NB_BuildBtnRepeat")); BuildButton("btnCellphone", Properties.Resources.cellphone, NB.Translate("NB_BuildBtnCell")); BuildButton("btnTablet", Properties.Resources.tablet, NB.Translate("NB_BuildBtnTablet")); BuildButton("btnLink", Properties.Resources.link, NB.Translate("NB_BuildBtnCable")); BuildButton("btnTree", Properties.Resources.tree, NB.Translate("NB_BuildBtnTree")); BuildButton("btnShapes", Properties.Resources.Shapes, NB.Translate("NB_BuildBtnShapes")); BuildButton("btnSelect", Properties.Resources.select, NB.Translate("NB_BuildBtnSelect")); } private void LayoutButtons(List what) { foreach (Button btn in Buttons) { btn.Visible = false; //Hide them all } //now we place them. int count = 0; int size = panelChoices.Width / 2; int x, y; foreach (Button btn in Buttons) { if (what.Contains(btn.Name)) { x = (count % 2) * size; y = (count / 2) * size; btn.Location = new Point(x, y); btn.Visible = true; count++; } } } public void UpdateMessages() { //redo this later lbMessages.Items.Clear(); List messages = myNetwork.GetMessageStrings(); foreach (string msg in messages) { lbMessages.Items.Add(msg); } if (lbMessages.Items.Count > 0) lbMessages.SelectedIndex = lbMessages.Items.Count - 1; } public void UpdateMenu() { if (myNetwork.NetworkFilename != "" || OrigNetworkAfterLoad != null) { reloadToolStripMenuItem.Enabled = true; } else { reloadToolStripMenuItem.Enabled = false; } //If we already have a class setup if (CurrentUser == null) { classSetupToolStripMenuItem.Visible = true; profileToolStripMenuItem.Visible = false; logoutToolStripMenuItem.Visible = false; this.Text = NB.Translate("NB_Form", OurSettings); //From up above } else { logoutToolStripMenuItem.Visible = true; profileToolStripMenuItem.Visible = true; classSetupToolStripMenuItem.Visible = false; this.Text = NB.Translate("NB_Form", OurSettings) + " : " + CurrentUser.FullName; } if (CurrentUser == null || !CurrentUser.isAdmin) { addToClassworkToolStripMenuItem.Visible = false; submitHomeworkToolStripMenuItem.Visible = false; updateClassworkToolStripMenuItem.Visible = false; } markAsGradedToolStripMenuItem.Visible = false; if (CurrentUser != null) { if (CurrentUser.isAdmin) { submitHomeworkToolStripMenuItem.Visible = false; if (myNetwork.WhatFrom == null) { //If this is not part of homework yet, we can add it addToClassworkToolStripMenuItem.Visible = true; updateClassworkToolStripMenuItem.Visible = false; } else { if (!myNetwork.WhatFrom.IsSumbitted) { //If this is homework, we can update it addToClassworkToolStripMenuItem.Visible = true; //We can create a new homework if we have changed it updateClassworkToolStripMenuItem.Visible = true; } else { markAsGradedToolStripMenuItem.Visible = true; } } } else if (myNetwork.WhatFrom != null) //we are a student doing homework submitHomeworkToolStripMenuItem.Visible = true; } List tLoadList = new List(); loadToolStripMenuItem.DropDownItems.Clear(); if (OurSettings != null) { foreach (string one in OurSettings.GetRecentFiles()) { if (tLoadList.Contains(one)) continue; string JustFile = Path.GetFileName(one); int i = loadToolStripMenuItem.DropDownItems.Count; loadToolStripMenuItem.DropDownItems.Add(JustFile, null, loadRecentFilename); loadToolStripMenuItem.DropDownItems[i].Name = one; tLoadList.Add(one); } } } public void UpdateLinks() { bool didanything = false; //Remove links if needed didanything = didanything || myNetwork.DoAllVerifyLinks(); //now, update wireless links if we can. didanything = myNetwork.DoAllAutoJoin() || didanything; //If we have done anything, check for tests being completed if (didanything) myNetwork.TestForCompletion(true); } /// /// Basically updae everything. Does UpdateMenu, UpdateMessages, UpdateVisuals and a few other things. /// public void UpdateForm() { UpdateMenu(); UpdateMessages(); UpdateVisuals(); btnUpdateShape(); if (selectedButton == "btnShapes") { cbFillColor.Visible = true; cbLineColor.Visible = true; } else { cbFillColor.Visible = false; cbLineColor.Visible = false; } if (myNetwork != null && myNetwork.LoadedFromResource) optionsToolStripMenuItem.Visible = false; else optionsToolStripMenuItem.Visible = true; processing = true; Text = NB.Translate("NB_UpdteFrmName", OurSettings); if (myNetwork.NetTitle.GetText() != "") Text += ": " + myNetwork.NetTitle.GetText(); if (myNetwork.NetMessage.GetText() != "") { btnHelp.Visible = true; } else { btnHelp.Visible = false; } if (myNetwork.NetTests.Count > 0) { rbHelp1.Visible = true; rbHelp2.Visible = true; rbHelp3.Visible = true; rbHelp4.Visible = true; } else { rbHelp1.Visible = false; rbHelp2.Visible = false; rbHelp3.Visible = false; rbHelp4.Visible = false; } switch (myNetwork.HintsToDisplay) { case NetTestVerbosity.full: rbHelp4.Checked = true; break; case NetTestVerbosity.hints: rbHelp3.Checked = true; break; case NetTestVerbosity.basic: rbHelp2.Checked = true; break; case NetTestVerbosity.none: rbHelp1.Checked = true; break; } UpdateHelpTopicButtons(); processing = false; } private void LayoutButtons() { List what = new List(); foreach (Button btn in Buttons) { what.Add(btn.Name); } LayoutButtons(what); } private void LoadPuzzleInfo() { XmlDocument xmlDoc = new XmlDocument(); System.Reflection.Assembly MyAssembly; System.String myString; MyAssembly = this.GetType().Assembly; PuzzleInfo newPuzzle; // Creates the ResourceManager. System.Resources.ResourceManager myManager = new System.Resources.ResourceManager("EduNetworkBuilder.Properties.Resources", MyAssembly); foreach (string str in Enum.GetNames(typeof(PuzzleNames))) { byte[] item = (byte[])myManager.GetObject(str); if (item == null) { MessageBox.Show(String.Format(NB.Translate("NB_LoadPuzInfo"), str)); continue; } myString = new StreamReader(new MemoryStream(item), true).ReadToEnd(); //myString = System.Text.Encoding.Default.GetString(item); xmlDoc.LoadXml(myString); newPuzzle = new PuzzleInfo(); newPuzzle.Load(xmlDoc, str); PuzzleList.Add(newPuzzle); //Console.WriteLine("Puzzle: " + str + " " + newPuzzle.PuzzleTitle); } PuzzleList = PuzzleList.OrderBy(c => c.Level).ThenBy(c => c.SortOrder).ThenBy(c => c.PuzzleName).ToList(); } public PuzzleInfo PuzzleInfoFromName(string PuzzleName) { foreach (PuzzleInfo pi in PuzzleList) { if (pi.PuzzleName == PuzzleName) return pi; } return null; } public bool PuzzleLevelHasUnsolved(string LevelName) { foreach (PuzzleInfo pi in PuzzleList) { if ("Level_" + pi.Level.ToString() == LevelName) { if (!OurSettings.CheckIfDone(pi.PuzzleName)) { return true; //We have one puzzle in the level which has not been solved } } } return false; } public int nextPacketID() { return LastPacketID++; } public List GetPuzzleTags() { List PuzzleTags = new List(); List LevelTags = new List(); foreach (PuzzleInfo pi in PuzzleList) { foreach (string str in pi.PuzzleTags) { //string What = NB.Translate("NB_Level"); string What = "^Level"; if (Regex.IsMatch(str, What)) { if (!LevelTags.Contains(str, StringComparer.OrdinalIgnoreCase)) LevelTags.Add(str); } else { //if (!PuzzleTags.Contains(str, StringComparer.OrdinalIgnoreCase)) // PuzzleTags.Add(str); } } } PuzzleTags.Sort(); LevelTags.Sort(); LevelTags.AddRange(PuzzleTags); return LevelTags; } public List GetPuzzleNames() { List PuzzleNames = new List(); foreach (PuzzleInfo pi in PuzzleList) { PuzzleNames.Add(pi.PuzzleName); } return PuzzleNames; } private void btnClick(object sender, EventArgs e) { bool doupdate = false; if (selectedButton == "btnShapes") doupdate = true; foreach (Control btn in Buttons) { if (btn == sender) { //This is the selected item btn.BackColor = Color.LightGreen; selectedButton = btn.Name; lblStatus.Text = myTooltip.GetToolTip(btn); myNetwork.InShapeEditMode = true; if (selectedButton == "btnShapes") { myNetwork.InShapeEditMode = true; if (CurrentShape == NetShapeType.none) CurrentShape = NetShapeType.rectangle; if (doupdate) { //The shape was already selected. Toggle it if (CurrentShape == NetShapeType.rectangle) CurrentShape = NetShapeType.circle; else CurrentShape = NetShapeType.rectangle; } if (CurrentShape == NetShapeType.rectangle) btn.BackgroundImage = Properties.Resources.Square; if (CurrentShape == NetShapeType.circle) btn.BackgroundImage = Properties.Resources.Circle; doupdate = true; } else { myNetwork.InShapeEditMode = false; CurrentShape = NetShapeType.none; } } else { btn.BackColor = Button.DefaultBackColor; } } if (doupdate) { UpdateForm(); } } private void btnReset() { foreach (Control btn in Buttons) { lblStatus.Text = ""; selectedButton = ""; CurrentShape = NetShapeType.none; btn.BackColor = Button.DefaultBackColor; if (btn.Name == "btnShapes") { if (CurrentShape == NetShapeType.rectangle) btn.BackgroundImage = Properties.Resources.Square; if (CurrentShape == NetShapeType.circle) btn.BackgroundImage = Properties.Resources.Circle; if (CurrentShape == NetShapeType.none) btn.BackgroundImage = Properties.Resources.Shapes; } } } private void btnUpdateShape() { foreach (Control btn in Buttons) { if (btn.Name == "btnShapes") { if (CurrentShape == NetShapeType.rectangle) btn.BackgroundImage = Properties.Resources.Square; if (CurrentShape == NetShapeType.circle) btn.BackgroundImage = Properties.Resources.Circle; if (CurrentShape == NetShapeType.none) btn.BackgroundImage = Properties.Resources.Shapes; } } } private void pbNetworkView_DoubleClick(object sender, EventArgs e) { } private void exitToolStripMenuItem_Click(object sender, EventArgs e) { Close(); } private void pbNetworkView_RightMouseUp(NetworkDevice ReleasedOn, MouseEventArgs e) { int index = 0; bool LockedOut = false; bool PoweredOff = false; if (pbNetworkView.ContextMenuStrip == null) { pbNetworkView.ContextMenuStrip = new ContextMenuStrip(); } if (ReleasedOn != null) LockedOut = ReleasedOn.DeviceIsLockedOutByVLANs(); if (ReleasedOn != null) PoweredOff = ReleasedOn.PowerOff; pbNetworkView.ContextMenuStrip.Items.Clear(); if (myNetwork.InShapeEditMode && ShapeForEditing != null) { //context menu for shape pbNetworkView.ContextMenuStrip.Items.Add(NB.Translate("_Delete")); pbNetworkView.ContextMenuStrip.Items[index++].Click += pbNetworkView_DeleteShape_Click; pbNetworkView.ContextMenuStrip.Items.Add(NB.Translate("_Edit")); pbNetworkView.ContextMenuStrip.Items[index++].Click += pbNetworkView_EditShape_Click; } if (ItemsSelected.Count > 0) { //We do not want to do the normal menu... LockedOut = false; ReleasedOn = null; //We need to make sure the item is not critical before we delete it. pbNetworkView.ContextMenuStrip.Items.Add(NB.Translate("_Delete")); pbNetworkView.ContextMenuStrip.Items[index++].Click += pbNetworkView_Delete_Click; //We can color-code multiple items if (myNetwork.VLANsEnabled) { int MenuIndex = pbNetworkView.ContextMenuStrip.Items.Count; pbNetworkView.ContextMenuStrip.Items.Add(NB.Translate("NB_ColorStr")); (pbNetworkView.ContextMenuStrip.Items[MenuIndex] as ToolStripMenuItem).DropDownItems.Add(NB.Translate("NB_Blue"), null, pbNetworkView_Color_Click); (pbNetworkView.ContextMenuStrip.Items[MenuIndex] as ToolStripMenuItem).DropDownItems.Add(NB.Translate("NB_Purple"), null, pbNetworkView_Color_Click); (pbNetworkView.ContextMenuStrip.Items[MenuIndex] as ToolStripMenuItem).DropDownItems.Add(NB.Translate("NB_Yellow"), null, pbNetworkView_Color_Click); (pbNetworkView.ContextMenuStrip.Items[MenuIndex] as ToolStripMenuItem).DropDownItems.Add(NB.Translate("NB_Green"), null, pbNetworkView_Color_Click); (pbNetworkView.ContextMenuStrip.Items[MenuIndex] as ToolStripMenuItem).DropDownItems.Add(NB.Translate("NB_Orange"), null, pbNetworkView_Color_Click); (pbNetworkView.ContextMenuStrip.Items[MenuIndex] as ToolStripMenuItem).DropDownItems.Add(NB.Translate("NB_Cyan"), null, pbNetworkView_Color_Click); } } if (!LockedOut) { if (ReleasedOn != null && ReleasedOn.IsNotNetDevice() && !ReleasedOn.IsBurned) { List DoneList = new List(); if (!PoweredOff && !ReleasedOn.isFrozen()) { foreach (string tStr in myNetwork.GetIncompleteTestDestinations(ReleasedOn.hostname, ContextTest.ping)) { if (!DoneList.Contains(tStr)) { pbNetworkView.ContextMenuStrip.Items.Add(string.Format(NB.Translate("_PingStr"), tStr)); pbNetworkView.ContextMenuStrip.Items[index].Click += pbNetworkView_Ping_Name_Click; pbNetworkView.ContextMenuStrip.Items[index++].Tag = tStr; DoneList.Add(tStr); } } DoneList.Clear(); foreach (string tStr in myNetwork.GetIncompleteTestDestinations(ReleasedOn.hostname, ContextTest.traceroute)) { if (!DoneList.Contains(tStr)) { pbNetworkView.ContextMenuStrip.Items.Add(string.Format(NB.Translate("_Traceroute") + " " + tStr)); pbNetworkView.ContextMenuStrip.Items[index].Click += pbNetworkView_Traceroute_Name_Click; pbNetworkView.ContextMenuStrip.Items[index++].Tag = tStr; DoneList.Add(tStr); } } DoneList.Clear(); foreach (string tStr in myNetwork.GetIncompleteTestDestinations(ReleasedOn.hostname, ContextTest.arp)) { if (!DoneList.Contains(tStr)) { pbNetworkView.ContextMenuStrip.Items.Add(string.Format(NB.Translate("H_ARP_TitleStr"), tStr)); pbNetworkView.ContextMenuStrip.Items[index].Click += pbNetworkView_Arp_Name_Click; pbNetworkView.ContextMenuStrip.Items[index++].Tag = tStr; DoneList.Add(tStr); } } } } if (ReleasedOn != null && ReleasedOn.IsNotNetDevice() && !ReleasedOn.IsBurned && !ReleasedOn.isFrozen()) { if (!PoweredOff) { pbNetworkView.ContextMenuStrip.Items.Add(NB.Translate("_Ping1")); pbNetworkView.ContextMenuStrip.Items[index++].Click += pbNetworkView_Ping_Click; pbNetworkView.ContextMenuStrip.Items.Add(NB.Translate("_Traceroute")); pbNetworkView.ContextMenuStrip.Items[index++].Click += pbNetworkView_Traceroute_Click; pbNetworkView.ContextMenuStrip.Items.Add(NB.Translate("H_ARP_Title")); pbNetworkView.ContextMenuStrip.Items[index++].Click += pbNetworkView_Arp_Click; pbNetworkView.ContextMenuStrip.Items.Add(NB.Translate("NB_NetViewClr")); pbNetworkView.ContextMenuStrip.Items[index++].Click += pbNetworkView_ArpClear_Click; } } if (ReleasedOn != null && !ReleasedOn.isFrozen()) { if (!myNetwork.ItemIsCritical(ReleasedOn.hostname)) { pbNetworkView.ContextMenuStrip.Items.Add(NB.Translate("_Delete")); pbNetworkView.ContextMenuStrip.Items[index++].Click += pbNetworkView_Delete_Click; } } if (ReleasedOn != null && ReleasedOn.IsNotNetDevice() && !PoweredOff && !ReleasedOn.IsBurned && !ReleasedOn.isFrozen()) { pbNetworkView.ContextMenuStrip.Items.Add(NB.Translate("_Edit")); pbNetworkView.ContextMenuStrip.Items[index++].Click += pbNetworkView_Edit_Click; } if (ReleasedOn != null) { ItemClickedOn = ReleasedOn; if (!PoweredOff && !ReleasedOn.IsBurned && !ReleasedOn.isFrozen()) { if (ReleasedOn.HasDHCPNic()) { pbNetworkView.ContextMenuStrip.Items.Add(NB.Translate("NB_NetViewDHCP")); pbNetworkView.ContextMenuStrip.Items[index++].Click += pbNetworkView_DHCPRequest_Click; } } foreach (string host in ReleasedOn.ListOfConnectedHosts()) { pbNetworkView.ContextMenuStrip.Items.Add(string.Format(NB.Translate("NB_NetViewRmLnkStr"), host)); pbNetworkView.ContextMenuStrip.Items[index++].Click += pbNetworkView_RemoveLink_Click; } if (ReleasedOn.PowerOff) { pbNetworkView.ContextMenuStrip.Items.Add(NB.Translate("NB_PowerOn")); pbNetworkView.ContextMenuStrip.Items[index++].Click += pbNetworkView_PowerOn_Click; } else if (ReleasedOn.ForwardsPackets() || ReleasedOn.RoutesPackets()) { pbNetworkView.ContextMenuStrip.Items.Add(NB.Translate("NB_PowerOff")); pbNetworkView.ContextMenuStrip.Items[index++].Click += pbNetworkView_PowerOff_Click; } if (myNetwork.ItemHasTest(ReleasedOn.hostname, NetTestType.DeviceBlowsUpWithPower) || myNetwork.ItemHasTest(ReleasedOn.hostname, NetTestType.DeviceNICSprays) || ReleasedOn.IsBurned) { bool toDo = false; if (ReleasedOn.IsBurned) toDo = true; if (myNetwork.ItemHasTest(ReleasedOn.hostname, NetTestType.DeviceBlowsUpWithPower)) toDo = !myNetwork.ItemTestIsComplete(ReleasedOn.hostname, NetTestType.DeviceBlowsUpWithPower); if (myNetwork.ItemHasTest(ReleasedOn.hostname, NetTestType.DeviceNICSprays)) { if (ReleasedOn.ForwardsPackets() && !myNetwork.ItemTestIsComplete(ReleasedOn.hostname, NetTestType.DeviceNICSprays)) toDo = true; //with PCs and the like, we replace the individual nic } if (toDo) { //If the item is bad and has not been replaced, then add a context menu to replace it pbNetworkView.ContextMenuStrip.Items.Add(NB.Translate("NB_Replace")); pbNetworkView.ContextMenuStrip.Items[index++].Click += pbNetworkView_Replace_Click; } } if (myNetwork.ItemHasTest(ReleasedOn.hostname, NetTestType.DeviceNeedsUPS)) { if (!myNetwork.ItemTestIsComplete(ReleasedOn.hostname, NetTestType.DeviceNeedsUPS)) { //If the item is bad and has not been replaced, then add a context menu to replace it pbNetworkView.ContextMenuStrip.Items.Add(NB.Translate("NB_AddUPS")); pbNetworkView.ContextMenuStrip.Items[index++].Click += pbNetworkView_AddUPS_Click; } } } } else //we are locked out. { pbNetworkView.ContextMenuStrip.Items.Add(string.Format(NB.Translate("NB_Reset"))); pbNetworkView.ContextMenuStrip.Items[index++].Click += pbNetworkView_Reset_Click; } if (ReleasedOn != null && (Form.ModifierKeys & Keys.Control) == Keys.Control) //We control-click on it { int MenuIndex = pbNetworkView.ContextMenuStrip.Items.Count; pbNetworkView.ContextMenuStrip.Items.Add(NB.Translate("NB_Hide")); pbNetworkView.ContextMenuStrip.Items[index++].Click += pbNetworkView_Hide_Click; } if (ReleasedOn != null && myNetwork.VLANsEnabled) { int MenuIndex = pbNetworkView.ContextMenuStrip.Items.Count; pbNetworkView.ContextMenuStrip.Items.Add(NB.Translate("NB_ColorStr")); (pbNetworkView.ContextMenuStrip.Items[MenuIndex] as ToolStripMenuItem).DropDownItems.Add(NB.Translate("NB_Blue"), null, pbNetworkView_Color_Click); (pbNetworkView.ContextMenuStrip.Items[MenuIndex] as ToolStripMenuItem).DropDownItems.Add(NB.Translate("NB_Purple"), null, pbNetworkView_Color_Click); (pbNetworkView.ContextMenuStrip.Items[MenuIndex] as ToolStripMenuItem).DropDownItems.Add(NB.Translate("NB_Yellow"), null, pbNetworkView_Color_Click); (pbNetworkView.ContextMenuStrip.Items[MenuIndex] as ToolStripMenuItem).DropDownItems.Add(NB.Translate("NB_Green"), null, pbNetworkView_Color_Click); (pbNetworkView.ContextMenuStrip.Items[MenuIndex] as ToolStripMenuItem).DropDownItems.Add(NB.Translate("NB_Orange"), null, pbNetworkView_Color_Click); (pbNetworkView.ContextMenuStrip.Items[MenuIndex] as ToolStripMenuItem).DropDownItems.Add(NB.Translate("NB_Cyan"), null, pbNetworkView_Color_Click); } if ((!myNetwork.InShapeEditMode && ReleasedOn == null && ItemsSelected.Count == 0) || (myNetwork.InShapeEditMode && ShapeForEditing == null)) { pbNetworkView.ContextMenuStrip.Visible = false; } else { pbNetworkView.ContextMenuStrip.Visible = true; pbNetworkView.ContextMenuStrip.Show(Cursor.Position); } } private void pbNetworkView_RightMouseUponLink(NetworkLink LinkReleasedOn, MouseEventArgs e) { if (LinkReleasedOn == null) return; if (pbNetworkView.ContextMenuStrip == null) { pbNetworkView.ContextMenuStrip = new ContextMenuStrip(); } pbNetworkView.ContextMenuStrip.Items.Clear(); int index = 0; //We need to make sure the item is not critical before we delete it. pbNetworkView.ContextMenuStrip.Items.Add(NB.Translate("_Delete")); pbNetworkView.ContextMenuStrip.Items[index].Tag = LinkReleasedOn; pbNetworkView.ContextMenuStrip.Items[index++].Click += pbNetworkView_RemoveNetLink_Click; if (LinkReleasedOn.theLinkType != LinkType.wireless) { pbNetworkView.ContextMenuStrip.Items.Add(NB.Translate("_Edit")); pbNetworkView.ContextMenuStrip.Items[index].Tag = LinkReleasedOn; pbNetworkView.ContextMenuStrip.Items[index++].Click += pbNetworkView_EditNetLink_Click; if (LinkReleasedOn.theLinkType == LinkType.broken) { pbNetworkView.ContextMenuStrip.Items.Add(NB.Translate("NB_Replace")); pbNetworkView.ContextMenuStrip.Items[index].Tag = LinkReleasedOn; pbNetworkView.ContextMenuStrip.Items[index++].Click += pbNetworkView_ReplaceNetLink_Click; } } pbNetworkView.ContextMenuStrip.Visible = true; pbNetworkView.ContextMenuStrip.Show(Cursor.Position); } private void pbNetworkView_Hide_Click(object sender, EventArgs e) { if (ItemClickedOn != null) { ItemClickedOn.Hide(); UpdateLinks(); UpdateVisuals(); } } private void pbNetworkView_PowerOn_Click(object sender, EventArgs e) { if (ItemClickedOn != null) { NB.DoActionPowerOn(ItemClickedOn.GetUniqueIdentifier); //ItemClickedOn.PowerOff = false; bool BlowUpOnce = myNetwork.ItemHasTest(ItemClickedOn.hostname, NetTestType.DeviceBlowsUpWithPower) && !myNetwork.ItemTestIsComplete(ItemClickedOn.hostname, NetTestType.DeviceBlowsUpWithPower); bool BlowUpMultiple = myNetwork.ItemHasTest(ItemClickedOn.hostname, NetTestType.DeviceNeedsUPS) && !myNetwork.ItemTestIsComplete(ItemClickedOn.hostname, NetTestType.DeviceNeedsUPS); if (BlowUpOnce || BlowUpMultiple) { Rectangle Where = new Rectangle(ItemClickedOn.myLocation().X, ItemClickedOn.myLocation().Y - ((ItemClickedOn.Size * 2) / 3), ItemClickedOn.Size, ItemClickedOn.Size); if (ItemClickedOn.IsBurned) { int which = GameRandomGen.Next(3); if (which == 0) myNetwork.AddAnimation(AnimationName.Spark1, Where); else if (which == 1) myNetwork.AddAnimation(AnimationName.Lightning1, Where); else myNetwork.AddAnimation(AnimationName.Smoke1, Where); } else { int which = GameRandomGen.Next(3); if (which == 0) myNetwork.AddAnimation(AnimationName.Explo1, Where); else myNetwork.AddAnimation(AnimationName.Fire1, Where); } ItemClickedOn.IsBurned = true; ItemClickedOn.PowerOff = true; //It remains off. } NB.DoActionChangeComponent(ItemClickedOn); UpdateLinks(); UpdateVisuals(); } } private void pbNetworkView_PowerOff_Click(object sender, EventArgs e) { if (ItemClickedOn != null) { ItemClickedOn.PowerOff = true; //Mark the replace test as "done" NB.DoActionPowerOff(ItemClickedOn.GetUniqueIdentifier); //myNetwork.RegisterDeviceReset(ItemClickedOn.hostname); UpdateLinks(); UpdateVisuals(); } } //We will still do this for devices that are spraying the network private void pbNetworkView_Replace_Click(object sender, EventArgs e) { if (ItemClickedOn != null) { //ItemClickedOn.ClearIPs(); //reset the device //ItemClickedOn.IsBurned = false; //If it had been burned before, it is no longer burned //ItemClickedOn.PowerOff = true; //ItemClickedOn.BadSprayCount = 0; //NB.DoActionChangeComponent(ItemClickedOn); ////Mark the replace test as "done" //myNetwork.RegisterDeviceReset(ItemClickedOn.hostname); //replacing something powers it off //myNetwork.RegisterDeviceReplaced(ItemClickedOn.hostname); //replace it. NB.DoActionReplaceDevice(ItemClickedOn.GetUniqueIdentifier); UpdateVisuals(); } } //We will still do this for devices that are spraying the network private void pbNetworkView_AddUPS_Click(object sender, EventArgs e) { if (ItemClickedOn != null) { if (ItemClickedOn == null) return; //Changing a UPS makes sure the power is off when done. //ItemClickedOn.PowerOff = true; NB.DoActionPowerOff(ItemClickedOn.GetUniqueIdentifier); //Mark the replace test as "done" //myNetwork.RegisterDeviceReset(ItemClickedOn.hostname); //replacing something powers it off NB.DoActionReplaceDeviceUPS(ItemClickedOn.GetUniqueIdentifier); //myNetwork.RegisterUPSAdded(ItemClickedOn.hostname); //Add the UPS. UpdateVisuals(); } } private void ColorizeDevice(NetworkDevice Item, string Text) { if (ItemClickedOn != null) { if (Text == NB.Translate("NB_Blue")) Item.ChangeColor(Color.Empty); if (Text == NB.Translate("NB_Purple")) Item.ChangeColor(Color.Purple); if (Text == NB.Translate("NB_Yellow")) Item.ChangeColor(Color.Yellow); if (Text == NB.Translate("NB_Green")) Item.ChangeColor(Color.Green); if (Text == NB.Translate("NB_Orange")) Item.ChangeColor(Color.Orange); if (Text == NB.Translate("NB_Cyan")) Item.ChangeColor(Color.Cyan); } } private void pbNetworkView_Color_Click(object sender, EventArgs e) { ToolStripMenuItem TSMI = (ToolStripMenuItem)sender; if (ItemsSelected.Count > 0) { foreach (NetworkDevice nd in ItemsSelected) { ColorizeDevice(nd, TSMI.Text); } } else ColorizeDevice(ItemClickedOn, TSMI.Text); UpdateVisuals(); } private void pbNetworkView_RemoveLink_Click(object sender, EventArgs e) { ToolStripItem thing = (ToolStripItem)sender; string released = thing.Text; released = Regex.Replace(released, ".* ", ""); if (ItemClickedOn != null) { //ItemClickedOn.RemoveLinkTo(released); NB.DoActionDeleteComponent(ItemClickedOn.GetUniqueIdentifier); } myNetwork.TestForCompletion(true); pbNetworkView.Update(); UpdateVisuals(); } private void pbNetworkView_EditNetLink_Click(object sender, EventArgs e) { ToolStripItem thing = (ToolStripItem)sender; if (thing.Tag != null) { NetworkLink NL = (NetworkLink)thing.Tag; NetworkLink oldLink = NetworkLink.Clone(NL); //This may delete the old link and make a new one LinkEditor LE = new LinkEditor(NL); LE.ShowDialog(); if (!NL.Equals(oldLink)) NB.DoActionChangeComponent(NL); } myNetwork.TestForCompletion(true); pbNetworkView.Update(); UpdateVisuals(); } private void pbNetworkView_ReplaceNetLink_Click(object sender, EventArgs e) { ToolStripItem thing = (ToolStripItem)sender; if (thing.Tag != null) { NetworkLink NL = (NetworkLink)thing.Tag; ////This may delete the old link and make a new one //if (NL.theLinkType != LinkType.wireless) //{ // HostNicID source = NL.Src; // HostNicID dest = NL.Dst; // myNetwork.RemoveComponent(NL); // NetworkLink nNL = new NetworkLink(source, dest, LinkType.normal); // myNetwork.AddItem(nNL); //} NB.DoActionReplaceDevice(NL.GetUniqueIdentifier); } myNetwork.TestForCompletion(true); pbNetworkView.Update(); UpdateVisuals(); } private void pbNetworkView_RemoveNetLink_Click(object sender, EventArgs e) { ToolStripItem thing = (ToolStripItem)sender; if (thing.Tag != null) { NetworkLink NL = (NetworkLink)thing.Tag; //myNetwork.RemoveComponent(NL); NB.DoActionDeleteComponent(NL.GetUniqueIdentifier); } myNetwork.TestForCompletion(true); pbNetworkView.Update(); UpdateVisuals(); } private void pbNetworkView_DHCPRequest_Click(object sender, EventArgs e) { //ItemClickedOn.DHCPRequestFromHere(); NB.DoActionDHCP(ItemClickedOn.GetUniqueIdentifier); myNetwork.ProcessPackets(); UpdateMessages(); pbNetworkView.Update(); UpdateVisuals(); myNetwork.TestForCompletion(true); } private void pbNetworkView_Reset_Click(object sender, EventArgs e) { if (ItemClickedOn == null) return; //ItemClickedOn.ClearIPs(); //reset the device NB.DoActionResetDevice(ItemClickedOn.GetUniqueIdentifier); UpdateVisuals(); } private void pbNetworkView_Edit_Click(object sender, EventArgs e) { if (ItemClickedOn == null) return; if (ItemClickedOn.DeviceIsLockedOutByVLANs()) return; //we cannot edit this if (ItemClickedOn.GetNetType() == NetworkComponentType.microwave || ItemClickedOn.GetNetType() == NetworkComponentType.fluorescent) return; if (ItemClickedOn != null) { NetworkDevice oldND = NetworkDevice.Clone(ItemClickedOn); DeviceConfig editwindow = new DeviceConfig(ItemClickedOn); editwindow.ShowDialog(); if (!ItemClickedOn.Equals(oldND)) NB.DoActionChangeComponent(ItemClickedOn); } UpdateLinks(); myNetwork.TestForCompletion(true); UpdateVisuals(); } private void TryDeleteOneItem(NetworkDevice Item) { //Deleting the item is easy, but we also need to delete any links to that item //List NicIDs = new List(); //if (Item != null) //{ // if (myNetwork.ItemIsCritical(Item.hostname)) // return; //we cannot delete this // NicIDs = Item.GetHostNicIDs(); // foreach (HostNicID nicID in NicIDs) // { // myNetwork.RemoveLinksToNic(nicID); // } // myNetwork.RemoveComponent(Item); //} NB.DoActionDeleteComponent(Item.GetUniqueIdentifier); } private void pbNetworkView_DeleteShape_Click(object sender, EventArgs e) { if (ShapeForEditing != null) { myNetwork.RemoveShape(ShapeForEditing); ShapeForEditing = null; UpdateForm(); } } private void pbNetworkView_EditShape_Click(object sender, EventArgs e) { if (ShapeForEditing != null) { ShapeEditor SE = new ShapeEditor(ShapeForEditing); SE.ShowDialog(); ShapeForEditing = null; UpdateForm(); } } private void pbNetworkView_Delete_Click(object sender, EventArgs e) { if (ItemsSelected.Count == 0) { TryDeleteOneItem(ItemClickedOn); } else { for (int i = ItemsSelected.Count - 1; i >= 0; i--) { TryDeleteOneItem(ItemsSelected[i]); } } pbNetworkView.Image = null; ItemsSelected.Clear(); UpdateLinks(); myNetwork.TestForCompletion(true); UpdateVisuals(); } private void pbNetworkView_Ping_Click(object sender, EventArgs e) { bool todo = true; if (ItemClickedOn == null) return; //we do not have something chosen to ping from NB_IPAddress destination = new NB_IPAddress(NB.ZeroIPString, NB.ZeroIPString, IPAddressType.ip_only); todo = destination.Edit(ItemClickedOn, this, NB.Translate("_Ping"), true); if (todo) { //ItemClickedOn.PingFromHere(destination); NB.DoActionPingDevice(ItemClickedOn.GetUniqueIdentifier, destination); myNetwork.ProcessPackets(); UpdateMessages(); } } private void pbNetworkView_Traceroute_Click(object sender, EventArgs e) { bool todo = true; if (ItemClickedOn == null) return; //we do not have something chosen to traceroute from NB_IPAddress destination = new NB_IPAddress(NB.ZeroIPString, NB.ZeroIPString, IPAddressType.ip_only); todo = destination.Edit(ItemClickedOn, this, NB.Translate("_Traceroute"), true); if (todo) { //ItemClickedOn.TracerouteFromHere(destination); NB.DoActionTracertDevice(ItemClickedOn.GetUniqueIdentifier, destination); myNetwork.ProcessPackets(); UpdateMessages(); } } private void pbNetworkView_Ping_Name_Click(object sender, EventArgs e) { if (ItemClickedOn == null) return; //we do not have something chosen to ping from ToolStripMenuItem Pressed = (ToolStripMenuItem)sender; string itemname = Pressed.Text; string dest = (string)Pressed.Tag; NB_IPAddress destination; destination = myNetwork.DNSLookup(ItemClickedOn, dest); if (destination == null || destination.GetIPString == NB.ZeroIPString) destination = new NB_IPAddress(dest); //ItemClickedOn.PingFromHere(destination); NB.DoActionPingDevice(ItemClickedOn.GetUniqueIdentifier, destination); myNetwork.ProcessPackets(); UpdateMessages(); } private void pbNetworkView_Traceroute_Name_Click(object sender, EventArgs e) { if (ItemClickedOn == null) return; //we do not have something chosen to ping from ToolStripMenuItem Pressed = (ToolStripMenuItem)sender; string itemname = Pressed.Text; string dest = (string)Pressed.Tag; NB_IPAddress destination; destination = myNetwork.DNSLookup(ItemClickedOn, dest); if (destination == null || destination.GetIPString == NB.ZeroIPString) destination = new NB_IPAddress(dest); //ItemClickedOn.TracerouteFromHere(destination); NB.DoActionTracertDevice(ItemClickedOn.GetUniqueIdentifier, destination); myNetwork.ProcessPackets(); UpdateMessages(); } private void pbNetworkView_Arp_Name_Click(object sender, EventArgs e) { if (ItemClickedOn == null) return; //we do not have something chosen to ping from ToolStripMenuItem Pressed = (ToolStripMenuItem)sender; string itemname = Pressed.Text; string dest = (string)Pressed.Tag; NB_IPAddress destination; destination = myNetwork.DNSLookup(ItemClickedOn, dest); if (destination == null || destination.GetIPString == NB.ZeroIPString) destination = new NB_IPAddress(dest); NB.DoActionArpDevice(ItemClickedOn.GetUniqueIdentifier, destination); //ItemClickedOn.AskArpFromHere(destination); myNetwork.ProcessPackets(); UpdateMessages(); } private void pbNetworkView_Arp_Click(object sender, EventArgs e) { bool todo = true; if (ItemClickedOn == null) return; //we do not have something chosen to arp request from NB_IPAddress destination = new NB_IPAddress(NB.ZeroIPString, "255.255.255.255", IPAddressType.ip_only); todo = destination.Edit(ItemClickedOn, this, NB.Translate("H_ARP_Title2")); if (todo) { //ItemClickedOn.AskArpFromHere(destination); NB.DoActionArpDevice(ItemClickedOn.GetUniqueIdentifier, destination); myNetwork.ProcessPackets(); UpdateMessages(); } } private void pbNetworkView_ArpClear_Click(object sender, EventArgs e) { if (ItemClickedOn == null) return; //we do not have something chosen to arp request from //ItemClickedOn.ClearArps(); NB.DoActionClearArpDevice(ItemClickedOn.GetUniqueIdentifier); } private void pbNetworkView_MouseUp(object sender, MouseEventArgs e) { lblStatus.Text = ""; //find where we were clicked Point CenteredLocation = myNetwork.clickedPosCentered(e.Location); Point ClickLocation = myNetwork.clickedPos(e.Location); NetworkDevice ReleasedOn = myNetwork.ItemAtPosition(ClickLocation); NetworkLink ReleasedOnLink = null; if (ReleasedOn == null && !myNetwork.InShapeEditMode) ReleasedOnLink = myNetwork.LinkAtPosition(ClickLocation); LastBackgroundImage = null; pbNetworkView.Image = null; //erase old highlight area LastMouseMovePos = new Point(-1, -1); //Do we have something selected that we should add? TimeSpan duration; duration = DateTime.Now - LastClick; if (ReleasedOnLink != null && e.Button == MouseButtons.Right) { //Right-click on a line. Make a special context menu for that. // delete // edit pbNetworkView_RightMouseUponLink(ReleasedOnLink, e); return; //We do not do the rest of this... } //Track size of area for the click/drag int sx; int sy; int swidth; int sheight; if (ClickedImageLocation.X > e.Location.X) { sx = e.Location.X; swidth = ClickedImageLocation.X - sx; } else { sx = ClickedImageLocation.X; swidth = e.Location.X - sx; } if (ClickedImageLocation.Y > e.Location.Y) { sy = e.Location.Y; sheight = ClickedImageLocation.Y - sy; } else { sy = ClickedImageLocation.Y; sheight = e.Location.Y - sy; } if (e.Button == System.Windows.Forms.MouseButtons.Right) { pbNetworkView_RightMouseUp(ReleasedOn, e); return; } if (duration.TotalMilliseconds < 250) { bool PoweredOff = false; //This mouse-up is part of a double-click operation. Do an edit. But only if we are powered on if (ItemClickedOn != null) PoweredOff = ItemClickedOn.PowerOff; if (!PoweredOff) { pbNetworkView_Edit_Click(sender, e); } } else { if (MouseIsDown && ItemsSelected.Count > 0) { //We were dragging stuff. All done now MouseIsDown = false; foreach (NetworkDevice nd in ItemsSelected) { //Do an action move to the new location. NB.DoActionMoveDevice(nd.GetUniqueIdentifier, nd.myLocation()); } ItemsSelected.Clear(); //clear it so we stop moving these ones UpdateLinks(); UpdateVisuals(); return; } if (MouseIsDown && ItemClickedOn == null && (swidth > 4 || sheight > 4)) { //We just finished dragging a select box //Put them all into the drag box. ItemsSelected.Clear(); //Now we have a rectangle, but need to exchange numbers for numbers on the image Point topCorner = myNetwork.clickedPos(new Point(sx, sy)); Point botCorner = myNetwork.clickedPos(new Point(sx + swidth, sy + sheight)); Rectangle selectbox = new Rectangle(topCorner.X, topCorner.Y, botCorner.X - topCorner.X, botCorner.Y - topCorner.Y); if (!myNetwork.InShapeEditMode) { ItemsSelected.AddRange(myNetwork.DevicesInRectangle(selectbox)); //Console.WriteLine("Selected " + ItemsSelected.Count + " items"); MouseIsDown = false; DrawHighlightBoxes(); pbNetworkView.Invalidate(); return; } else { //We just made a shape. try { string fColor = cbFillColor.Text; string lColor = cbLineColor.Text; if (fColor == "") fColor = "Empty"; if (lColor == "") lColor = "Empty"; Color FillColor = Color.FromName(fColor); Color LineColor = Color.FromName(lColor); if (LineColor.Name != "Empty" || FillColor.Name != "Empty") { if (ShapeForEditing == null) { NetShape NS = new NetShape(CurrentShape, selectbox, FillColor, LineColor); myNetwork.AddShape(NS); UpdateForm(); } else { ShapeForEditing.MyShape = CurrentShape; ShapeForEditing.InArea = selectbox; ShapeForEditing.FillColor = FillColor; ShapeForEditing.LineColor = LineColor; UpdateForm(); } } } catch { //Nothing to do. Something is wrong with the colors. } } } MouseIsDown = false; if (selectedButton == "btnLink") { //We are making a link LinkEditor myEditor = new LinkEditor(ItemClickedOn, ReleasedOn); myEditor.ShowDialog(); UpdateLinks(); UpdateVisuals(); //In case any changes have been made } else if (ItemClickedOn == null) { NetworkComponent NC = null; NetworkComponentType NCType = NetworkComponentType.none; switch (selectedButton) { case "btnSwitch": //NC = myNetwork.AddItem(NetworkComponentType.net_switch, CenteredLocation); NCType = NetworkComponentType.net_switch; break; case "btnHub": //NC = myNetwork.AddItem(NetworkComponentType.net_hub, CenteredLocation); NCType = NetworkComponentType.net_hub; break; case "btnLaptop": //NC = myNetwork.AddItem(NetworkComponentType.laptop, CenteredLocation); NCType = NetworkComponentType.laptop; break; case "btnServer": //NC = myNetwork.AddItem(NetworkComponentType.server, CenteredLocation); NCType = NetworkComponentType.server; break; case "btnPC": //NC = myNetwork.AddItem(NetworkComponentType.pc, CenteredLocation); NCType = NetworkComponentType.pc; break; case "btnRouter": //NC = myNetwork.AddItem(NetworkComponentType.router, CenteredLocation); NCType = NetworkComponentType.router; break; case "btnIPPhone": //NC = myNetwork.AddItem(NetworkComponentType.ip_phone, CenteredLocation); NCType = NetworkComponentType.ip_phone; break; case "btnFirewall": //NC = myNetwork.AddItem(NetworkComponentType.firewall, CenteredLocation); NCType = NetworkComponentType.firewall; break; case "btnPrinter": //NC = myNetwork.AddItem(NetworkComponentType.printer, CenteredLocation); NCType = NetworkComponentType.printer; break; case "btnCopier": //NC = myNetwork.AddItem(NetworkComponentType.copier, CenteredLocation); NCType = NetworkComponentType.copier; break; case "btnMicrowave": //NC = myNetwork.AddItem(NetworkComponentType.microwave, CenteredLocation); NCType = NetworkComponentType.microwave; break; case "btnFluorescent": //NC = myNetwork.AddItem(NetworkComponentType.fluorescent, CenteredLocation); NCType = NetworkComponentType.fluorescent; break; case "btnWAP": //NC = myNetwork.AddItem(NetworkComponentType.wap, CenteredLocation); NCType = NetworkComponentType.wap; break; case "btnWRouter": //NC = myNetwork.AddItem(NetworkComponentType.wrouter, CenteredLocation); NCType = NetworkComponentType.wrouter; break; case "btnCellphone": //NC = myNetwork.AddItem(NetworkComponentType.cellphone, CenteredLocation); NCType = NetworkComponentType.cellphone; break; case "btnTablet": //NC = myNetwork.AddItem(NetworkComponentType.tablet, CenteredLocation); NCType = NetworkComponentType.tablet; break; case "btnWBridge": //NC = myNetwork.AddItem(NetworkComponentType.wbridge, CenteredLocation); NCType = NetworkComponentType.wbridge; break; case "btnWRepeater": //NC = myNetwork.AddItem(NetworkComponentType.wrepeater, CenteredLocation); NCType = NetworkComponentType.wrepeater; break; case "btnTree": //NC = myNetwork.AddItem(NetworkComponentType.tree, CenteredLocation); NCType = NetworkComponentType.tree; break; } NC = NB.DoActionAddDevice(NCType, CenteredLocation); if (NC != null && NB.GetComponentType(NC) == GeneralComponentType.device) { ItemClickedOn = (NetworkDevice)NC; } UpdateVisuals(); } else //Drag the item { if (Math.Abs(ClickedLocation.X - ClickLocation.X) > 5 || Math.Abs(ClickedLocation.Y - ClickLocation.Y) > 5) { if (!ItemClickedOn.IsLockedInLocation()) { //ItemClickedOn.ChangeLocation(CenteredLocation); //ItemClickedOn.UnHide(); //If it was hidden, unhide it NB.DoActionMoveDevice(ItemClickedOn.GetUniqueIdentifier, CenteredLocation); UpdateLinks(); UpdateVisuals(); } } } } LastClick = DateTime.Now; } public void ChangeStatusText(string text) { lblStatus.Text = text; } private void UpdateVisuals() { myNetwork.Print(); pbNetworkView.Invalidate(); } private void pbNetworkView_MouseDown(object sender, MouseEventArgs e) { ProcessChange(); //Before anything happens, store this state if we need to. Point location = myNetwork.clickedPos(e.Location); ClickedLocation = location; OrigClickPoint = myNetwork.clickedPosCentered(e.Location); ClickedImageLocation = e.Location; //See if we have clicked on something if (!myNetwork.InShapeEditMode) { ItemClickedOn = myNetwork.ItemAtPosition(location); ShapeForEditing = null; } else { ItemClickedOn = null; ShapeForEditing = myNetwork.ShapeAtPoint(location); if (ShapeForEditing != null && e.Button == MouseButtons.Left) { //we set the drag-point for the opposite corner ClickedLocation = ShapeForEditing.OppositePoint(location); ClickedImageLocation = myNetwork.PictureBoxPoint(ClickedLocation); CurrentShape = ShapeForEditing.MyShape; cbFillColor.Text = ShapeForEditing.FillColor.Name; cbLineColor.Text = ShapeForEditing.LineColor.Name; btnUpdateShape(); //Change the shape to what we are editing } else if (ShapeForEditing != null && e.Button == MouseButtons.Right) { //Right-clicking the shape. Context menu to come at button release! } } if (e.Button == MouseButtons.Left) MouseIsDown = true; LastMouseDown = DateTime.UtcNow; //Make a duplicate of the old background image. LastBackgroundImage = new Bitmap(pbNetworkView.BackgroundImage); } private void DragItemToNewLocation(NetworkDevice toMove, Point NewPosition) { if (toMove == null) return; if (LastBackgroundImage == null) return; Size itemsize = new Size(toMove.Size, toMove.Size); Rectangle newrec = new Rectangle(NewPosition, itemsize); Point oldpoint = toMove.myLocation(); Rectangle oldrec = new Rectangle(oldpoint.X, oldpoint.Y, toMove.Size, toMove.Size); Graphics.FromImage(pbNetworkView.BackgroundImage).DrawImage(LastBackgroundImage, oldrec, oldrec, GraphicsUnit.Pixel); myNetwork.Invalidate(oldrec); //set it to the new pos toMove.ChangeLocationUnsnapped(NewPosition); //tell it to draw toMove.Print(pbNetworkView.BackgroundImage, CaptionType.none); //invalidate myNetwork.Invalidate(newrec); } private void DrawHighlightBoxes() { Image tImage = new Bitmap(pbNetworkView.BackgroundImage.Width, pbNetworkView.BackgroundImage.Height); Graphics tGraphics = Graphics.FromImage(tImage); tGraphics.Clear(Color.Transparent); //erase the whole thing Color tColor = Color.LightGreen; SolidBrush semiTransBrush = new SolidBrush(Color.FromArgb(128, tColor.R, tColor.G, tColor.B)); foreach (NetworkDevice nd in ItemsSelected) { tGraphics.FillRectangle(semiTransBrush, nd.GetMyRectangle()); } pbNetworkView.Image = tImage; pbNetworkView.Invalidate(); } private void pbNetworkView_MouseMove(object sender, MouseEventArgs e) { Image tImage; //Only do this 10 times a second if (DateTime.UtcNow - LastMoveTime < TimeSpan.FromMilliseconds(100)) return; Point CenteredLocation = myNetwork.clickedPosCentered(e.Location); Point MouseLocation = myNetwork.clickedPos(e.Location); //If we are dragging lines, do that first. if (selectedButton == "btnLink") { if (MouseIsDown) { //We are trying to do a link. Drag a line... if (ItemClickedOn != null) { Point OrigCenter = ItemClickedOn.GetCenter(); //Draw a line from the item-clicked on to the mouse tImage = new Bitmap(pbNetworkView.BackgroundImage.Width, pbNetworkView.BackgroundImage.Height); Graphics tGraphics = Graphics.FromImage(tImage); tGraphics.Clear(Color.Transparent); //erase the whole thing //draw the line //tGraphics.FillRectangle(semiTransBrush, selectbox); tGraphics.DrawLine(Pens.Black, OrigCenter, MouseLocation); pbNetworkView.Image = tImage; pbNetworkView.Invalidate(); } } } else if (MouseIsDown && LastBackgroundImage != null && ItemClickedOn != null && ItemsSelected.Count == 0) //We are trying to drag something { //find where we are TimeSpan HowLong = DateTime.UtcNow - LastMouseDown; if (HowLong.TotalMilliseconds > 100 && !ItemClickedOn.IsLockedInLocation()) DragItemToNewLocation(ItemClickedOn, CenteredLocation); } else if (MouseIsDown && ItemsSelected.Count > 0) //dragging multiple items around { //Track the difference between the last redraw and this re-draw //Move every item by that amount. int xdif = CenteredLocation.X - OrigClickPoint.X; int ydif = CenteredLocation.Y - OrigClickPoint.Y; if (xdif != 0 || ydif != 0) { foreach (NetworkDevice nd in ItemsSelected) { Point oPoint = nd.myLocation(); Point nPoint = new Point(oPoint.X + xdif, oPoint.Y + ydif); DragItemToNewLocation(nd, nPoint); } } //Now set the location so we do it from here next time OrigClickPoint = CenteredLocation; } else if (MouseIsDown && ItemClickedOn == null) //Dragging an empty area { //make a rectangle tImage = new Bitmap(pbNetworkView.BackgroundImage.Width, pbNetworkView.BackgroundImage.Height); Graphics tGraphics = Graphics.FromImage(tImage); tGraphics.Clear(Color.Transparent); //erase the whole thing int sx; int sy; int swidth; int sheight; if (ClickedLocation.X > MouseLocation.X) { sx = MouseLocation.X; swidth = ClickedLocation.X - sx; } else { sx = ClickedLocation.X; swidth = MouseLocation.X - sx; } if (ClickedLocation.Y > MouseLocation.Y) { sy = MouseLocation.Y; sheight = ClickedLocation.Y - sy; } else { sy = ClickedLocation.Y; sheight = MouseLocation.Y - sy; } Rectangle selectbox = new Rectangle(sx, sy, swidth, sheight); Color tColor = Color.LightGreen; SolidBrush semiTransBrush = new SolidBrush(Color.FromArgb(128, tColor.R, tColor.G, tColor.B)); tGraphics.FillRectangle(semiTransBrush, selectbox); pbNetworkView.Image = tImage; pbNetworkView.Invalidate(); } Point location = myNetwork.clickedPos(e.Location); NetworkDevice MouseOver = myNetwork.ItemAtPosition(location); MouseHoverOver = MouseOver; string oldtooltip = myTooltip.GetToolTip(pbNetworkView); string newtooltip = ""; if (MouseOver != null) { if (!MouseOver.DeviceIsLockedOutByVLANs()) newtooltip = MouseOver.TooltipString(); else newtooltip = NB.Translate("NB_LockedOut"); } if (oldtooltip != newtooltip) { myTooltip.SetToolTip(pbNetworkView, newtooltip); } } private void PrepForLoad() { processing = true; ClearStoredNetworkStates(); myNetwork = new Network(""); myNetwork.RegisterDisplayArea(pbNetworkView); GC.Collect(); RTFWindow myWin = (RTFWindow)Application.OpenForms["RTFWindow"]; if (myWin != null) { myWin.Close(); } myNetwork.Print(); UpdateMessages(); btnReset(); myNetwork.HintsToDisplay = NetTestVerbosity.none; rbHelp1.Checked = true; processing = false; } private void loadToolStripMenuItem_Click(object sender, EventArgs e) { OpenFileDialog mydialog = new OpenFileDialog(); mydialog.AddExtension = true; //If we have a user loaded, we can open homework files string filter = "EduNet File (*.enbx, *enbu)|*.enbx; *.enbu"; if (NB.GetUser() != null) filter = "EduNet File (*.enbx, *enbu, *enbh)|*.enbx; *.enbu; *.enbh"; mydialog.Filter = filter; mydialog.Multiselect = false; mydialog.ShowHelp = true; if (LastPath != null && LastPath != "") mydialog.FileName = LastPath; DialogResult result = mydialog.ShowDialog(); if (result == System.Windows.Forms.DialogResult.Cancel) return; string extension = Path.GetExtension(mydialog.FileName).ToString(); if (extension != ".enbx" && extension != ".enbu" && extension != ".enbh") { MessageBox.Show(NB.Translate("_LoadErr")); return; } LastPath = mydialog.FileName; if (!File.Exists(mydialog.FileName)) return; LoadInitialFile(mydialog.FileName); fileToolStripMenuItem.HideDropDown(); } private void reloadToolStripMenuItem_Click(object sender, EventArgs e) { string oldfile = myNetwork.NetworkFilename; if (oldfile != null && oldfile != "" && File.Exists(oldfile)) { PrepForLoad(); myNetwork.Load(oldfile); } else { if(OrigNetworkAfterLoad != null) { PrepForLoad(); LoadNetworkFromNetwork(OrigNetworkAfterLoad); } } if(OurSettings.ReplayMode) { //clear out the replay actions for this network ActionCollection AC = OurSettings.GetUserActionCollection(); if (AC != null) { NetworkAction NA = AC.GetCurrentNetAction(); if (NA != null) NA.Actions.Clear(); } } UpdateMenu(); UpdateForm(); } public void doSave(bool TrySkipPrompt = false) { if (TrySkipPrompt && myNetwork.NetworkFilename != null && File.Exists(myNetwork.NetworkFilename)) { //Just save over it myNetwork.Save(myNetwork.NetworkFilename); NB.PlaySound(NBSoundType.saved_ok); } else { SaveFileDialog mydialog = new SaveFileDialog(); mydialog.AddExtension = true; mydialog.Filter = "EduNet File (*.enbx)|*.enbx"; mydialog.FileName = myNetwork.NetworkFilename; string initialfolder = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); if (myNetwork.NetworkFilename != "") initialfolder = Path.GetDirectoryName(myNetwork.NetworkFilename); mydialog.CreatePrompt = true; mydialog.OverwritePrompt = true; mydialog.InitialDirectory = initialfolder; DialogResult result = mydialog.ShowDialog(); if (result == System.Windows.Forms.DialogResult.Cancel) { NB.PlaySound(NBSoundType.saved_failed); lblStatus.Text = NB.Translate("_Canceled"); return; } LastPath = mydialog.FileName; myNetwork.Save(mydialog.FileName); NB.PlaySound(NBSoundType.saved_ok); } lblStatus.Text = NB.Translate("_Saved"); } private void saveToolStripMenuItem_Click(object sender, EventArgs e) { doSave(false); } private void BuilderWindow_Resize(object sender, EventArgs e) { if (WindowState == FormWindowState.Normal) { //size limits go here int smallestX = 400; int smallestY = 300; if (Width < smallestX) Width = smallestX; if (Height < smallestY) Height = smallestY; } } private void BuilderWindow_ResizeEnd(object sender, EventArgs e) { UpdateVisuals(); } private void aboutToolStripMenuItem_Click(object sender, EventArgs e) { RTFWindow mywindow = new RTFWindow(RTFWindowContents.about); mywindow.ShowDialog(); } private void helpToolStripMenuItem1_Click(object sender, EventArgs e) { NB.ReadContextHelp(HelpTopics.None); } private void releaseNotesToolStripMenuItem_Click(object sender, EventArgs e) { RTFWindow mywindow = new RTFWindow(RTFWindowContents.release_notes); mywindow.ShowDialog(); } private void lbMessages_DoubleClick(object sender, EventArgs e) { if (lbMessages.SelectedIndex < 0) return; //nothing to do if (lbMessages.SelectedIndex > myNetwork.CountMessages()) return; //invalid. Do nothing PacketMessage newMessage = myNetwork.GetMessageAtIndex(lbMessages.SelectedIndex); if (newMessage == null) return; //Not sure how we could get to this, but break out just in case ListBoxWindow newwindow = new ListBoxWindow(newMessage); newwindow.ShowDialog(); } private void BuilderWindow_FormClosing(object sender, FormClosingEventArgs e) { //The values in the settings are all up-to-date. Just tell them to save. if (WindowState == FormWindowState.Normal) { OurSettings.MainWindowHeight = Height; OurSettings.MainWindowWidth = Width; OurSettings.MainWindowX = Location.X; OurSettings.MainWindowY = Location.Y; } OurSettings.Save(NB.IsRunningOnMono()); if (CurrentUser != null) CurrentUser.Save(true); //Save the person, making a backup of the person file } private void dHCPRequestToolStripMenuItem_Click(object sender, EventArgs e) { myNetwork.DoAllDHCP(); myNetwork.ProcessPackets(); UpdateMessages(); } private void clearArpTableToolStripMenuItem_Click(object sender, EventArgs e) { myNetwork.DoAllClearArp(); UpdateMessages(); } private void clearIPsToolStripMenuItem_Click(object sender, EventArgs e) { myNetwork.DoAllClearIPs(); UpdateMessages(); } private void pingToolStripMenuItem_Click(object sender, EventArgs e) { bool todo = true; NB_IPAddress destination = new NB_IPAddress(NB.ZeroIPString, NB.ZeroIPString, IPAddressType.ip_only); todo = destination.Edit(null, this, NB.Translate("NB_NetViewPng")); if (todo) { myNetwork.DoAllPing(destination); myNetwork.ProcessPackets(); UpdateMessages(); } } public void LoadNetworkFromResource(string resource, bool SkipOpeningWindows = false) { XmlDocument xmlDoc = new XmlDocument(); //Load(SavePath); System.Reflection.Assembly MyAssembly; MyAssembly = this.GetType().Assembly; // Creates the ResourceManager. System.Resources.ResourceManager myManager = new System.Resources.ResourceManager("EduNetworkBuilder.Properties.Resources", MyAssembly); // Retrieves String and Image resources. System.String myString; byte[] item = (byte[])myManager.GetObject(resource); myString = new StreamReader(new MemoryStream(item), true).ReadToEnd(); //myString = System.Text.Encoding.Default.GetString(item); xmlDoc.LoadXml(myString); PrepForLoad(); myNetwork.Load(xmlDoc, resource, true, SkipOpeningWindows);//Load it from resource. Set the bool saying it was from resource RegisterRecentlyLoadedNet(myNetwork); StoreNetworkState(myNetwork); //Store a clean state UpdateMenu(); UpdateForm(); } public void LoadNetworkFromNetwork(Network NewNet) { if (NewNet != null) { PrepForLoad(); Network.Clone(NewNet, myNetwork); //Push the settings myNetwork.OpenHelpIfNeeded(false); //Open it up, not skipping the help file (open help if the puzzle wants it) RegisterRecentlyLoadedNet(myNetwork); myNetwork.DoAllMarkAsLinked(); UpdateMenu(); UpdateLinks(); UpdateForm(); NBSettings ns = NB.GetSettings(); StoreNetworkState(myNetwork); //Store a clean state if (ns != null && ns.AutoDHCPAllMachinesAtNetworkLoad) myNetwork.DoAllDHCP(); } } private void LoadSolvedResource(string what) { PrepForLoad(); LoadNetworkFromResource(what); StoreNetworkState(myNetwork); //Store a clean state myNetwork.OverrideFromResources(); RegisterRecentlyLoadedNet(myNetwork); UpdateForm(); UpdateMessages(); } public void RegisterRecentlyLoadedNet(Network ToRegister) { OrigNetworkAfterLoad = Network.DeepClone(ToRegister); } private void LoadUnsolvedResource(string what) { //Load the puzzle & everything we need to do with it LoadSolvedResource(what); //Then "unsolve" it myNetwork.DoAllClearIPs(); myNetwork.OverrideFromResources(); StoreNetworkState(myNetwork); //Store a clean state RegisterRecentlyLoadedNet(myNetwork); UpdateForm(); UpdateMessages(); } private void CreateSolvedUnsolvedToolstripItems() { foreach (SolvedNetworkNames one in Enum.GetValues(typeof(SolvedNetworkNames))) { //add a solved one ToolStripMenuItem tsmi = new ToolStripMenuItem(NB.Translate("NB_" + one.ToString())); tsmi.Name = one.ToString(); tsmi.Click += MenuItemLoadSolved; solvedToolStripMenuItem.DropDownItems.Add(tsmi); //Add one for the unsolved tsmi = new ToolStripMenuItem(NB.Translate("NB_" + one.ToString())); tsmi.Name = one.ToString(); tsmi.Click += MenuItemLoadUnsolved; toSolveToolStripMenuItem.DropDownItems.Add(tsmi); } } private void MenuItemLoadSolved(object sender, EventArgs e) { ToolStripMenuItem tsmi = (ToolStripMenuItem)sender; LoadSolvedResource(tsmi.Name); } private void MenuItemLoadUnsolved(object sender, EventArgs e) { ToolStripMenuItem tsmi = (ToolStripMenuItem)sender; LoadUnsolvedResource(tsmi.Name); } private void newToolStripMenuItem_Click(object sender, EventArgs e) { PrepForLoad(); UpdateForm(); } private void optionsToolStripMenuItem_Click(object sender, EventArgs e) { ProcessChange(); //make sure we make an undo-point in case a change is made. OptionsWindow tWindow = new OptionsWindow(myNetwork); tWindow.ShowDialog(); myNetwork.UpdateDeviceSizes(); UpdateForm(); } private void LoadInitialFile(string filename) { if (filename == "") { MessageBox.Show(NB.Translate("NB_InvalidFile")); //Close(); return; } if (!File.Exists(filename)) { MessageBox.Show(string.Format(NB.Translate("NB_NoSuchFile"), filename)); //Close(); return; } //If it is a network file string extension = Path.GetExtension(filename).ToLower(); //MessageBox.Show(filename + " " +extension); try { if (extension == ".enbx") { PrepForLoad(); myNetwork.Load(filename); UpdateMenu(); UpdateForm(); } else if (extension == ".enbu") { if (CurrentUser != null && !CurrentUser.isAdmin) { MessageBox.Show(NB.Translate("NB_LogOutFirst")); return; } if (CurrentUser == null) { //Load a starting, or a new user int counter = 0; PersonClass tUser = null; while (counter < 4) { string tPass = ""; if (counter > 0) //First try an empty password tPass = NB.TextPromptBox("Enter a password", Properties.Resources.NBIco, true); string tUserName = Path.GetFileNameWithoutExtension(filename); string PasToUse = tUserName + tPass; tUser = PersonClass.TryLoad(filename, PasToUse); if (tUser != null) break; counter++; } if (tUser == null) { //failed to load. MessageBox.Show("Too many password failures. Exiting."); return; } CurrentUser = tUser; CurrentUser.filepath = Path.GetDirectoryName(filename); //store the directory OurSettings = NB.GetSettings(); //Grab the new settings from the user if (CurrentUser.ChangePassAtFirstLogin) CurrentUser.ChangePassword(); //change the password UpdateMenu(); //Now, open a new window to edit them. PersonProfileForm PPF = new PersonProfileForm(CurrentUser); CurrentUser = PPF.Edit(); //This does the form as dialog. When we come back, update the menu. UpdateMenu(); } else if (CurrentUser != null && CurrentUser.isAdmin) { //We want to import the student information for this one student string user = Path.GetFileNameWithoutExtension(filename); //Dig up the corresponding user. PersonClass CurrentStudentUser = CurrentUser.StudentWithTheUserName(user); if (CurrentStudentUser == null) { //This means we do not have a user with that name in this class. //More importantly, we do not have an alt-password set up so we can import them. MessageBox.Show(string.Format(NB.Translate("NB_TeacherUnableToLoadUserNoAcct"), user)); return; } //Use the alt password for that user to load the file PersonClass LoadedStudent = PersonClass.TryLoad(filename, CurrentStudentUser.AltPassword); if (LoadedStudent == null) { //This means our password did not work MessageBox.Show(string.Format(NB.Translate("NB_TeacherUnableToLoadUserInvalidPW"), user)); return; } //import their settings int HomeworkImported = CurrentUser.TeacherImportStudentHomework(LoadedStudent); //messagebox to show what we are doing MessageBox.Show(string.Format(NB.Translate("NB_TeacherSuccessImport"), HomeworkImported)); } } else if (extension == ".enbh") { if (NB.GetUser() == null || CurrentUser == null) { MessageBox.Show(NB.Translate("NB_LoadUserFirst")); return; } //Here we would load a homework file CurrentUser.LoadHomeworkFile(filename); } else { MessageBox.Show(NB.Translate("NB_InvalidFile")); Close(); return; //We return here so we do not register the filename... } if (OurSettings != null) OurSettings.RegisterFileAsLoaded(filename); } catch (Exception e) { MessageBox.Show("Error: " + e.ToString()); } } private void loadRecentFilename(object sender, EventArgs e) { //find the full filename & load that. ToolStripDropDownItem TSDDI = (ToolStripDropDownItem)sender; LoadInitialFile(TSDDI.Name); UpdateMenu(); } private void BuilderWindow_Load(object sender, EventArgs e) { if (OurSettings.MainWindowX != -1 && OurSettings.MainWindowY != -1) { Location = new Point(OurSettings.MainWindowX, OurSettings.MainWindowY); } if (OurSettings.MainWindowHeight != -1 && OurSettings.MainWindowWidth != -1) { Height = OurSettings.MainWindowHeight; Width = OurSettings.MainWindowWidth; } //If we started by clicking on a using a one_click installer, load that file if (AppDomain.CurrentDomain.SetupInformation.ActivationArguments != null && AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData != null && AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData.Any()) { string[] activationData = AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData; var uri = new Uri(activationData[0]); //MessageBox.Show("Trying Localpath: " + uri.LocalPath); //MessageBox.Show("isUNC: " + uri.IsUnc.ToString()); //MessageBox.Show("isFile: " + uri.IsFile.ToString()); if (uri.IsFile) { LoadInitialFile(uri.LocalPath); } } if (InitialFileLoad != "") //This is set when we are installed by msi and we click a file { if (File.Exists(InitialFileLoad)) { LoadInitialFile(InitialFileLoad); } } else { if (OurSettings.AutoStartPuzzles) { //We are supposed to start the puzzle-selection box puzzlesToolStripMenuItem_Click(null, null); } } } private void btnHelp_Click(object sender, EventArgs e) { OpenNetHelpWindow(); bool didsomething = myNetwork.NoteActionDone(NetTestType.HelpRequest, "", "?Button"); if (didsomething) { UpdateForm(); myNetwork.TestForCompletion(true); } } public Font GetFont() { return Font; } public void OpenNetHelpWindow() { RTFWindow rtwin = (RTFWindow)Application.OpenForms["RTFWindow"]; if (rtwin == null) { rtwin = new RTFWindow(NB.Translate("H_Help_Key ") + myNetwork.NetTitle.GetText(), myNetwork.NetMessage.GetText(), myNetwork.NetTests); rtwin.Show(); Activate(); } } private void rbHelp1_CheckedChanged(object sender, EventArgs e) { if (processing) return; if (rbHelp1.Checked) { myNetwork.HintsToDisplay = NetTestVerbosity.none; UpdateForm(); } } private void rbHelp2_CheckedChanged(object sender, EventArgs e) { if (processing) return; if (rbHelp2.Checked) { myNetwork.HintsToDisplay = NetTestVerbosity.basic; UpdateForm(); } } private void rbHelp3_CheckedChanged(object sender, EventArgs e) { if (processing) return; if (rbHelp3.Checked) { myNetwork.HintsToDisplay = NetTestVerbosity.hints; UpdateForm(); } } private void rbHelp4_CheckedChanged(object sender, EventArgs e) { if (processing) return; if (rbHelp4.Checked) { myNetwork.HintsToDisplay = NetTestVerbosity.full; UpdateForm(); } } private void puzzlesToolStripMenuItem_Click(object sender, EventArgs e) { ListBoxWindow LBW = new ListBoxWindow(); LBW.ShowDialog(); } private void firewallsToolStripMenuItem_Click(object sender, EventArgs e) { LoadNetworkFromResource("firewalls"); UpdateMessages(); } private void firewallsToolStripMenuItem1_Click(object sender, EventArgs e) { LoadNetworkFromResource("firewalls"); myNetwork.DoAllClearIPs(); UpdateMessages(); } public void SetProgress(double HowFar, double total) { int max = (int)(total * 100); myProgressBar.Maximum = max; int distance = (int)(HowFar * 100); if (distance > max) distance = max; myProgressBar.Value = distance; } private void changeLanguageToolStripMenuItem_Click(object sender, EventArgs e) { DialogResult answer = MessageBox.Show(NB.Translate("NB_ChngLngClose"), NB.Translate("NB_ChngLngSure"), MessageBoxButtons.YesNoCancel); if (answer == System.Windows.Forms.DialogResult.Yes) { OurSettings.LanguageHasBeenChosen = false; //So we choose the language on restart //System.Diagnostics.Process.Start(Application.ExecutablePath); // to start new instance of application this.Close(); //to turn off current app } } private void cbViewTitles_CheckedChanged(object sender, EventArgs e) { if (!processing) { //myNetwork.ShowLabelsHere = cbViewTitles.Checked; bool didsomething = myNetwork.NoteActionDone(NetTestType.HelpRequest, "", "ViewButton"); if (didsomething) { UpdateForm(); myNetwork.TestForCompletion(true); } UpdateVisuals(); } } private void BuilderWindow_Shown(object sender, EventArgs e) { //Console.WriteLine(this.DesktopLocation.X); //Console.WriteLine(Screen.FromControl(this).WorkingArea.ToString()); int x = this.DesktopLocation.X; int y = this.DesktopLocation.Y; if (x + this.Width > Screen.FromControl(this).WorkingArea.X) x = Screen.FromControl(this).WorkingArea.X - this.Width; if (x < 0) x = 0; if (x - 30 > Screen.FromControl(this).WorkingArea.Width) x = 100; if (y + this.Height > Screen.FromControl(this).WorkingArea.Y) y = Screen.FromControl(this).WorkingArea.Y - this.Height; if (y < 0) y = 0; if (y - 30 > Screen.FromControl(this).WorkingArea.Height) y = 100; this.DesktopLocation = new Point(x, y); } private void BuilderWindow_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Escape) { ItemsSelected.Clear(); pbNetworkView.Image = null; UpdateVisuals(); } } private void classSetupToolStripMenuItem_Click(object sender, EventArgs e) { PersonProfileForm PPF = new PersonProfileForm(); CurrentUser = PPF.Edit(); UpdateMenu(); } private void profileToolStripMenuItem_Click(object sender, EventArgs e) { if (CurrentUser == null) return; PersonProfileForm PPF = new PersonProfileForm(CurrentUser); CurrentUser = PPF.Edit(); UpdateMenu(); } private void addToClassworkToolStripMenuItem_Click(object sender, EventArgs e) { if (CurrentUser == null) return; if (!CurrentUser.isAdmin) return; PersonProfileForm PPF = new PersonProfileForm(CurrentUser); CurrentUser = PPF.AddSchoolwork(myNetwork); UpdateMenu(); } private void updateClassworkToolStripMenuItem_Click(object sender, EventArgs e) { if (CurrentUser == null) return; if (!CurrentUser.isAdmin) return; SchoolworkClass SC = myNetwork.WhatFrom; if (SC == null) return; SC.theProject = myNetwork.Clone(); PersonProfileForm PPF = new PersonProfileForm(CurrentUser); CurrentUser = PPF.Edit(); UpdateMenu(); } public void SubmitHomework() { if (myNetwork.WhatFrom == null) return; //We cannot submit it if (CurrentUser == null) return; //We need to have a user or we will blow up if (CurrentUser.isAdmin) return; //Admins should not submit PersonProfileForm PPF = new PersonProfileForm(CurrentUser); CurrentUser = PPF.SubmitSchoolwork(myNetwork); UpdateMenu(); } private void submitHomeworkToolStripMenuItem_Click(object sender, EventArgs e) { SubmitHomework(); } public void MarkAsGraded() { if (myNetwork.WhatFrom == null) return; //We cannot submit it if (CurrentUser == null) return; //We need to have a user or we will blow up if (!CurrentUser.isAdmin) return; //Only Admin can grade it myNetwork.WhatFrom.IsGraded = true; ReturnToProfile(); } private void markAsGradedToolStripMenuItem_Click(object sender, EventArgs e) { MarkAsGraded(); } public void ReturnToProfile() { if (CurrentUser == null) return; //We need to have a user or we will blow up PersonProfileForm PPF = new PersonProfileForm(CurrentUser); PPF.Edit(); UpdateMenu(); } private void logoutToolStripMenuItem_Click(object sender, EventArgs e) { if (CurrentUser == null) return; //Nobody to logout DialogResult answer = MessageBox.Show(NB.Translate("NB_Logout"), NB.Translate("NB_Logout"), MessageBoxButtons.YesNoCancel); if (answer != DialogResult.Yes) return; //Save current user CurrentUser.Save(true); //Save it and rotate it //Get rid of the current project. This way we keep them from logging out, and then exporting the homework PrepForLoad(); //set current user to null CurrentUser = null; //rebuild menu UpdateMenu(); } public Network GetNetwork() { if (InvisibleNetwork != null) return InvisibleNetwork; return myNetwork; } public void RegisterInvisibleNet(Network toRegister) { InvisibleNetwork = toRegister; } public void UnregisterInvisibleNet() { InvisibleNetwork = null; } public bool ProcessingInvisibleNet() { if (InvisibleNetwork == null) return false; return true; } //change how we view captions private void btnCaptions_Click(object sender, EventArgs e) { //we toggle the next int tmp = (int)myNetwork.ShowLabelsHere; tmp++; if (tmp >= Enum.GetNames(typeof(CaptionType)).Length) tmp = 0; myNetwork.ShowLabelsHere = (CaptionType)tmp; //For help bool didsomething = myNetwork.NoteActionDone(NetTestType.HelpRequest, "", "ViewButton"); if (didsomething) { UpdateForm(); myNetwork.TestForCompletion(true); } UpdateVisuals(); } #region Random Map Stuff private void randomToolStripMenuItem_Click(object sender, EventArgs e) { GenerateARandomMap(); } private void GenerateARandomMap() { RandomPuzzleChooser RPC = new RandomPuzzleChooser(OurSettings); RPC.ShowDialog(); if (RPC.Canceled) return; LoadSolvedRandomMap(RPC.Filename, RPC.IsResource, RPC.Difficulty); } private void LoadSolvedRandomMap(string what, bool FromResource, int difficulty) { if (FromResource) LoadSolvedResource(what); else LoadInitialFile(what); myNetwork.StartingHelpLevel = NetTestVerbosity.full; myNetwork.HintsToDisplay = NetTestVerbosity.full; myNetwork.IsRandomNetwork = true; myNetwork.PuzzleIsSolved = false; myNetwork.NonVisualDoDHCPOnAll(); List TraversalCollection = new List(); //Choose five sets of items from the network List Devices = NB.Randomize(myNetwork.GetHostnames()); int count = 0; while (Devices.Count > 2 && count < 5) { TraversalClass tc = myNetwork.NonVisualPingOneHost(Devices[0], Devices[1]); if (tc != null) TraversalCollection.Add(tc); Devices.RemoveAt(1); Devices.RemoveAt(0); count++; } TraversalCollection.Sort((a, b) => b.Count.CompareTo(a.Count)); List BreakList = new List() { }; foreach (HowToBreak one in Enum.GetValues(typeof(HowToBreak))) BreakList.Add(one); count = 0; int HowHard = 0; int TraversalIndex = 0; while (HowHard < difficulty && count < 10) { //loop through the traversalinfos //randomly choose a way to break it BreakList = NB.Randomize(BreakList); HowHard += myNetwork.BreakNetworkPath(TraversalCollection[TraversalIndex], BreakList[0]); count++; TraversalIndex++; if (TraversalIndex >= TraversalCollection.Count) TraversalIndex = 0; //loop back to the beginning } //for (int i = 0; i < TraversalCollection.Count; i++) //{ // Console.WriteLine(i + " " + TraversalCollection[i].Source()); // Console.WriteLine(i + " " + TraversalCollection[i].Destination()); //} //if (TraversalCollection.Count > 0) //{ // TraversalCollection[0].DumpPath(); //} myNetwork.OptionShowLabels = CaptionType.host; myNetwork.ShowLabelsHere = CaptionType.host; //If we broke the wireless, show as disconnected. myNetwork.DoAllVerifyLinks(); myNetwork.DoAllAutoJoin(); myNetwork.ClearMessages(); myNetwork.DoAllClearDHCP(); UpdateForm(); UpdateMessages(); } #endregion Random Map Stuff #region network replay stuff public void replayNetwork(string NetworkName, int delay_between, int Countdown=-1) { //Prepare for replay // reset to original map // Go through each step and do the actions again in order NBSettings ourSettings = NB.GetSettings(); if (OurSettings == null) return; //nothing to do if (OurSettings.ReplayMode == false) return; //We should never be here if we are false. ActionCollection actions = OurSettings.GetUserActionCollection(); if (actions == null) return; //nothing to do //Find the replay NetworkAction replay = actions.FindAction(NetworkName); if (replay == null) return; //No replay for this network //Loading the network automatically registers it as the current replay LoadNetworkFromResource(NetworkName, true); if(Countdown >=0) { Text = "(" + Countdown + ") " + Text; //How many more to do } //Make a boolean that says we are in a replaying state //make an index that shows the index we are to replay //make a time for when the next replay happens (.5 sec from now or after all packets are gone) // On tick. If we are in replay mode. // Check to see if we need to replay an action // If so, do it. // If not, keep ticking //Disable menuitems & right-click if in replay mode myNetwork.ReplayInProgress = true; myNetwork.NextReplayIndex = 0; myNetwork.NextReplayAction = DateTime.UtcNow.AddMilliseconds(delay_between); //Now we need to process it. NB.RegisterInvisibleNetwork(myNetwork); //while we have actions to do. while (myNetwork.ReplayInProgress) { myNetwork.Tick(true); myNetwork.NonVisualProcessPacketsMultipleTimes(); myNetwork.TestForCompletion(false); //Just in case it needs to be tested } NB.UnregisterInvisibleNetwork(); } private void replayToolStripMenuItem_Click(object sender, EventArgs e) { //Prepare for replay // reset to original map // Go through each step and do the actions again in order NBSettings ourSettings = NB.GetSettings(); if (OurSettings == null) return; //nothing to do if (OurSettings.ReplayMode == false) return; //We should never be here if we are false. ActionCollection actions = OurSettings.GetUserActionCollection(); if (actions == null) return; //nothing to do if (actions.GetNet == null) return; //Nothing to do //If we get here, we have a valid network in the current state. ChangeToPastState(actions.GetNet); //Make a boolean that says we are in a replaying state //make an index that shows the index we are to replay //make a time for when the next replay happens (.5 sec from now or after all packets are gone) // On tick. If we are in replay mode. // Check to see if we need to replay an action // If so, do it. // If not, keep ticking //Disable menuitems & right-click if in replay mode myNetwork.ReplayInProgress = true; myNetwork.NextReplayIndex = 0; myNetwork.NextReplayAction = DateTime.UtcNow.AddMilliseconds(NB.MillisecondsBetweenReplays); } private void fileToolStripMenuItem_DropDownOpening(object sender, EventArgs e) { NBSettings ourSettings = NB.GetSettings(); replayToolStripMenuItem.Visible = false; storeReplayToolStripMenuItem.Visible = false; saveReplayToolStripMenuItem.Visible = false; if (OurSettings.ReplayMode == false && ModifierKeys == Keys.Control) { if(CurrentUser == null || CurrentUser.isAdmin) OurSettings.LoadReplays(); //Only do this if we are an admin } if (OurSettings != null && OurSettings.ReplayMode) { forgetReplayStatusesToolStripMenuItem.Visible = true; ActionCollection AC = OurSettings.GetUserActionCollection(); if (AC != null) { if (AC.GetActionCount > 0) replayToolStripMenuItem.Visible = true; //Only visible if we have something to replay if (AC.CurrentNeedsStoring && AC.GetActionCount > 0) storeReplayToolStripMenuItem.Visible = true; if (AC.HasUnsavedChanges) saveReplayToolStripMenuItem.Visible = true; } } } void StoreReplay() { NBSettings ourSettings = NB.GetSettings(); if (OurSettings != null && OurSettings.ReplayMode) { ActionCollection AC = OurSettings.GetUserActionCollection(); if (AC.CurrentNeedsStoring) { AC.PushActionToList(); } } } private void storeReplayToolStripMenuItem_Click(object sender, EventArgs e) { StoreReplay(); } void SaveReplayFile() { NBSettings ourSettings = NB.GetSettings(); if (OurSettings != null && OurSettings.ReplayMode) { ActionCollection AC = OurSettings.GetUserActionCollection(); if (AC.HasUnsavedChanges) { ourSettings.SaveActions(); } } } private void saveReplayToolStripMenuItem_Click(object sender, EventArgs e) { SaveReplayFile(); } private void regressionTestingToolStripMenuItem_Click(object sender, EventArgs e) { ListBoxWindow LBW = new ListBoxWindow(null, LBContents.regressiontest); //We want to show dialog, but it needs to go to the background. After that, //It returns from the show dialog. So we need to loop continuously until //It is completed. DialogResult WhatHappened = DialogResult.Retry; while (!LBW.ClosingRegression) { WhatHappened = LBW.ShowDialog(); } } #endregion private void samplesToolStripMenuItem_DropDownOpening(object sender, EventArgs e) { if (OurSettings != null && OurSettings.ReplayMode) { regressionTestingToolStripMenuItem.Visible = true; } else { regressionTestingToolStripMenuItem.Visible = false; } } private void forgetReplayStatusesToolStripMenuItem_Click(object sender, EventArgs e) { OurSettings.ClearReplayStatus(); } } }