From 8b82150bbe5d0b358a10cc0c22c49d555ee63979 Mon Sep 17 00:00:00 2001
From: Tim Young <tim.young@lightsys.org>
Date: Mon, 14 May 2018 10:41:52 -0500
Subject: [PATCH] Adding devices is part of Actions

---
 EduNetworkBuilder/ActionClass.cs              | 29 +++++++-
 EduNetworkBuilder/NB.cs                       | 22 ++++++
 EduNetworkBuilder/Network.cs                  |  4 +-
 EduNetworkBuilder/NetworkBuilder.cs           | 74 +++++++++++--------
 .../Resources/languages/edustrings.resx       |  4 +-
 5 files changed, 93 insertions(+), 40 deletions(-)

diff --git a/EduNetworkBuilder/ActionClass.cs b/EduNetworkBuilder/ActionClass.cs
index 6b7b640..a349022 100644
--- a/EduNetworkBuilder/ActionClass.cs
+++ b/EduNetworkBuilder/ActionClass.cs
@@ -42,15 +42,15 @@ namespace EduNetworkBuilder
             }
         }
 
-        public bool RunAction(int WhichIndex)
+        public ActionClass RunAction(int WhichIndex)
         {
-            if (CurrentNetAction == null) return false;
+            if (CurrentNetAction == null) return null;
             if (WhichIndex < CurrentNetAction.Actions.Count)
             {
                 CurrentNetAction.Actions[WhichIndex].DoAction();
-                return true;
+                return CurrentNetAction.Actions[WhichIndex];
             }
-            return false;
+            return null;
         }
 
         /// <summary>
@@ -188,6 +188,27 @@ namespace EduNetworkBuilder
                     }
                     break;
                 case NBAction.newdevice:
+                    bool CanDo = true;
+                    Point tLoc = myNet.clickedPosCentered(Location);
+                    Point CenteredLocation = new Point(Location.X - (Location.X - tLoc.X), Location.Y - ((Location.Y - tLoc.Y)));
+                    Point TopLeft = Location;
+                    Point TopRight = new Point(TopLeft.X + myNet.itemsize, TopLeft.Y);
+                    Point BottomRight = new Point(TopLeft.X + myNet.itemsize, TopLeft.Y + myNet.itemsize);
+                    Point BottomLeft = new Point(TopLeft.X, TopLeft.Y + myNet.itemsize);
+                    ChangedDevice = null; //if we cannot place it, this = null for reference
+                    if (myNet.BlockedByTree(Location)) CanDo = false;
+                    if (myNet.BlockedByTree(TopLeft)) CanDo = false;
+                    if (myNet.BlockedByTree(TopRight)) CanDo = false;
+                    if (myNet.BlockedByTree(BottomRight)) CanDo = false;
+                    if (myNet.BlockedByTree(BottomLeft)) CanDo = false;
+                    if (CanDo)
+                    {
+                        ChangedDevice = (NetworkDevice)myNet.AddItem(newItemType, Location);
+                    }
+                    else
+                    {
+                        NB.SetBuilderWindowStatis(NB.Translate("NB_TreePlacementError"));
+                    }
                     break;
                 case NBAction.dhcp:
                     break;
diff --git a/EduNetworkBuilder/NB.cs b/EduNetworkBuilder/NB.cs
index 833d6d7..2ff4381 100644
--- a/EduNetworkBuilder/NB.cs
+++ b/EduNetworkBuilder/NB.cs
@@ -523,6 +523,13 @@ namespace EduNetworkBuilder
             return myWin;
         }
 
+        public static void SetBuilderWindowStatis(string text)
+        {
+            BuilderWindow myWin = GetBuilderWin();
+            if (myWin != null)
+                myWin.ChangeStatusText(text);
+        }
+
         public static PersonProfileForm GetProfileWin()
         {
             PersonProfileForm myWin = (PersonProfileForm)Application.OpenForms["PersonProfileForm"];
@@ -1389,6 +1396,21 @@ namespace EduNetworkBuilder
             AC.DoAction();
         }
 
+        public static NetworkComponent DoActionAddDevice(NetworkComponentType WhatType, Point Location)
+        {
+            //Make an action for the location, register the action, and do the action
+            ActionClass AC = new ActionClass();
+            AC.Action = NBAction.newdevice;
+            AC.newItemType = WhatType;
+            AC.Location = Location;
+
+            RegisterAction(AC);
+
+            AC.DoAction();
+
+            return AC.ChangedDevice;
+        }
+
         public static void DoActionPingDevice(int HostID, NB_IPAddress Destination)
         {
             ActionClass AC = new ActionClass();
diff --git a/EduNetworkBuilder/Network.cs b/EduNetworkBuilder/Network.cs
index 0f9f857..586b8f3 100644
--- a/EduNetworkBuilder/Network.cs
+++ b/EduNetworkBuilder/Network.cs
@@ -1653,10 +1653,10 @@ namespace EduNetworkBuilder
                     //We are doing a replay and enough time has passed from the last replay...
                     NBSettings Settings = NB.GetSettings();
                     ActionCollection AC = Settings.GetUserActionCollection();
-                    bool Success = AC.RunAction(NextReplayIndex++);
+                    ActionClass Success = AC.RunAction(NextReplayIndex++);
                     
                     NextReplayAction = DateTime.UtcNow.AddMilliseconds(NB.MillisecondsBetweenReplays);
-                    if(Success)
+                    if(Success != null)
                     {
                         //we did something.  keep replaying
                         NB.MarkToUpdate();
diff --git a/EduNetworkBuilder/NetworkBuilder.cs b/EduNetworkBuilder/NetworkBuilder.cs
index 1a0ecaa..c634129 100644
--- a/EduNetworkBuilder/NetworkBuilder.cs
+++ b/EduNetworkBuilder/NetworkBuilder.cs
@@ -1668,82 +1668,87 @@ namespace EduNetworkBuilder
                 else if (ItemClickedOn == null)
                 {
                     NetworkComponent NC = null;
+                    NetworkComponentType NCType = NetworkComponentType.none;
                     switch (selectedButton)
                     {
                         case "btnSwitch":
-                            NC = myNetwork.AddItem(NetworkComponentType.net_switch, CenteredLocation);
+                            //NC = myNetwork.AddItem(NetworkComponentType.net_switch, CenteredLocation);
+                            NCType = NetworkComponentType.net_switch;
                             break;
                         case "btnHub":
-                            NC = myNetwork.AddItem(NetworkComponentType.net_hub, CenteredLocation);
+                            //NC = myNetwork.AddItem(NetworkComponentType.net_hub, CenteredLocation);
+                            NCType = NetworkComponentType.net_hub;
                             break;
                         case "btnLaptop":
-                            NC = myNetwork.AddItem(NetworkComponentType.laptop, CenteredLocation);
+                            //NC = myNetwork.AddItem(NetworkComponentType.laptop, CenteredLocation);
+                            NCType = NetworkComponentType.laptop;
                             break;
                         case "btnServer":
-                            NC = myNetwork.AddItem(NetworkComponentType.server, CenteredLocation);
+                            //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);
+                            //NC = myNetwork.AddItem(NetworkComponentType.router, CenteredLocation);
+                            NCType = NetworkComponentType.router;
                             break;
                         case "btnIPPhone":
-                            NC = myNetwork.AddItem(NetworkComponentType.ip_phone, CenteredLocation);
+                            //NC = myNetwork.AddItem(NetworkComponentType.ip_phone, CenteredLocation);
+                            NCType = NetworkComponentType.ip_phone;
                             break;
                         case "btnFirewall":
-                            NC = myNetwork.AddItem(NetworkComponentType.firewall, CenteredLocation);
+                            //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);
+                            //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);
+                            //NC = myNetwork.AddItem(NetworkComponentType.fluorescent, CenteredLocation);
+                            NCType = NetworkComponentType.fluorescent;
                             break;
                         case "btnWAP":
-                            NC = myNetwork.AddItem(NetworkComponentType.wap, CenteredLocation);
+                            //NC = myNetwork.AddItem(NetworkComponentType.wap, CenteredLocation);
+                            NCType = NetworkComponentType.wap;
                             break;
                         case "btnWRouter":
-                            NC = myNetwork.AddItem(NetworkComponentType.wrouter, CenteredLocation);
+                            //NC = myNetwork.AddItem(NetworkComponentType.wrouter, CenteredLocation);
+                            NCType = NetworkComponentType.wrouter;
                             break;
                         case "btnCellphone":
-                            NC = myNetwork.AddItem(NetworkComponentType.cellphone, CenteredLocation);
+                            //NC = myNetwork.AddItem(NetworkComponentType.cellphone, CenteredLocation);
+                            NCType = NetworkComponentType.cellphone;
                             break;
                         case "btnTablet":
-                            NC = myNetwork.AddItem(NetworkComponentType.tablet, CenteredLocation);
+                            //NC = myNetwork.AddItem(NetworkComponentType.tablet, CenteredLocation);
+                            NCType = NetworkComponentType.tablet;
                             break;
                         case "btnWBridge":
-                            NC = myNetwork.AddItem(NetworkComponentType.wbridge, CenteredLocation);
+                            //NC = myNetwork.AddItem(NetworkComponentType.wbridge, CenteredLocation);
+                            NCType = NetworkComponentType.wbridge;
                             break;
                         case "btnWRepeater":
-                            NC = myNetwork.AddItem(NetworkComponentType.wrepeater, CenteredLocation);
+                            //NC = myNetwork.AddItem(NetworkComponentType.wrepeater, CenteredLocation);
+                            NCType = NetworkComponentType.wrepeater;
                             break;
                         case "btnTree":
-                            bool CanDo = true;
-                            Point TopLeft = CenteredLocation;
-                            Point TopRight = new Point(TopLeft.X + myNetwork.itemsize, TopLeft.Y);
-                            Point BottomRight = new Point(TopLeft.X + myNetwork.itemsize, TopLeft.Y + myNetwork.itemsize);
-                            Point BottomLeft = new Point(TopLeft.X, TopLeft.Y + myNetwork.itemsize);
-                            if (myNetwork.BlockedByTree(ClickedLocation)) CanDo = false;
-                            if (myNetwork.BlockedByTree(TopLeft)) CanDo = false;
-                            if (myNetwork.BlockedByTree(TopRight)) CanDo = false;
-                            if (myNetwork.BlockedByTree(BottomRight)) CanDo = false;
-                            if (myNetwork.BlockedByTree(BottomLeft)) CanDo = false;
-                            if(CanDo)
-                                NC = myNetwork.AddItem(NetworkComponentType.tree, CenteredLocation);
-                            else
-                            {
-                                lblStatus.Text = NB.Translate("NB_TreePlacementError");
-                            }
+                            //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;
@@ -1768,6 +1773,11 @@ namespace EduNetworkBuilder
             LastClick = DateTime.Now;
         }
 
+        public void ChangeStatusText(string text)
+        {
+            lblStatus.Text = text;
+        }
+
         private void UpdateVisuals()
         {
             myNetwork.Print();
diff --git a/EduNetworkBuilder/Resources/languages/edustrings.resx b/EduNetworkBuilder/Resources/languages/edustrings.resx
index 0e48e84..0eb57cb 100644
--- a/EduNetworkBuilder/Resources/languages/edustrings.resx
+++ b/EduNetworkBuilder/Resources/languages/edustrings.resx
@@ -2046,8 +2046,8 @@
     <comment>NB_cbLineColor = Choose a color for the shape outline</comment>
   </data>
   <data name="NB_TreePlacementError" xml:space="preserve">
-    <value>Cannot place a tree on top of a tree.</value>
-    <comment>NB_TreePlacementError = Cannot place a tree on top of a tree.</comment>
+    <value>Cannot place an item on top of a tree.</value>
+    <comment>NB_TreePlacementError = Cannot place an item on top of a tree.</comment>
   </data>
   <data name="NT_TstDiscriptLockLocation" xml:space="preserve">
     <value>Device cannot be moved</value>