private void btnSaveCrossingManager_Click(object sender, EventArgs e)
 {
     if (smform == null)
     {
         smform = new SavedManagerForm(manager);
     }
     if (smform.IsDisposed)
     {
         smform = new SavedManagerForm(manager);
     }
     smform.Show();
 }
        /// <summary>
        /// Initializes a new instance of the <see cref="MainForm"/> class.
        /// </summary>
        public MainForm()
        {
            InitializeComponent();
            smform = new SavedManagerForm(manager);
            state  = SystemState.None;
            ActionStack.OnRedoAltered += (actionsToRedo, actionRedone) =>
            {
                if (actionsToRedo > 0)
                {
                    ToggleControl(redoToolStripMenuItem1, true);
                    ToggleControl(redoBtn, true);
                }
                else
                {
                    ToggleControl(redoToolStripMenuItem1, false);
                    ToggleControl(redoBtn, false);
                }
                PopulateActionStackListbox();

                if (actionRedone is UpdateFlowAction && manager.CurrentActiveLane == (actionRedone as UpdateFlowAction).Lane)
                {
                    propertiesEditNUD.Value = manager.CurrentActiveLane.Flow;
                }
                else if (actionRedone is UpdateLightIntervalAction && manager.CurrentActiveTrafficLight == (actionRedone as UpdateLightIntervalAction).Light)
                {
                    propertiesEditNUD.Value = (decimal)manager.CurrentActiveTrafficLight.GreenSeconds;
                }
                else if (actionRedone is UpdateMultipleIntervalAction)
                {
                    if (manager.CurrentActiveTrafficLight != null)
                    {
                        if (!isApplying)
                        {
                            propertiesEditNUD.Value = (decimal)manager.CurrentActiveTrafficLight.GreenSeconds;
                        }

                        slotIDToPBoxLookup[(actionRedone as UpdateMultipleIntervalAction).Crossing.Column + (actionRedone as UpdateMultipleIntervalAction).Crossing.Row * 3].Invalidate();
                    }
                }
                else if (actionRedone is UpdateMultipleFlowAction)
                {
                    if (manager.CurrentActiveLane != null)
                    {
                        if (!isApplying)
                        {
                            propertiesEditNUD.Value = manager.CurrentActiveLane.Flow;
                        }
                        //if (manager.CurrentActiveLane.Owner.Owner.IsOnTheGrid)
                    }
                    slotIDToPBoxLookup[(actionRedone as UpdateMultipleFlowAction).Crossing.Column + (actionRedone as UpdateMultipleFlowAction).Crossing.Row * 3].Invalidate();
                }
            };

            ActionStack.OnUndoAltered += (actionsToUndo, actionUndone) =>
            {
                if (actionsToUndo > 0)
                {
                    ToggleControl(undoToolStripMenuItem1, true);
                    ToggleControl(undoBtn, true);
                }
                else
                {
                    ToggleControl(undoToolStripMenuItem1, false);
                    ToggleControl(undoBtn, false);
                }
                PopulateActionStackListbox();
                if (actionUndone is UpdateFlowAction && manager.CurrentActiveLane == (actionUndone as UpdateFlowAction).Lane)
                {
                    propertiesEditNUD.Value = manager.CurrentActiveLane.Flow;
                }
                else if (actionUndone is UpdateLightIntervalAction && manager.CurrentActiveTrafficLight == (actionUndone as UpdateLightIntervalAction).Light)
                {
                    propertiesEditNUD.Value = (decimal)manager.CurrentActiveTrafficLight.GreenSeconds;
                }
                else if (actionUndone is UpdateMultipleIntervalAction)
                {
                    if (manager.CurrentActiveTrafficLight != null)
                    {
                        if (!isApplying)
                        {
                            propertiesEditNUD.Value = (decimal)manager.CurrentActiveTrafficLight.GreenSeconds;
                        }

                        slotIDToPBoxLookup[(actionUndone as UpdateMultipleIntervalAction).Crossing.Column + (actionUndone as UpdateMultipleIntervalAction).Crossing.Row * 3].Invalidate();
                    }
                }
                else if (actionUndone is UpdateMultipleFlowAction)
                {
                    if (manager.CurrentActiveLane != null)
                    {
                        if (!isApplying)
                        {
                            propertiesEditNUD.Value = manager.CurrentActiveLane.Flow;
                        }
                        //if (manager.CurrentActiveLane.Owner.Owner.IsOnTheGrid)
                    }
                    slotIDToPBoxLookup[(actionUndone as UpdateMultipleFlowAction).Crossing.Column + (actionUndone as UpdateMultipleFlowAction).Crossing.Row * 3].Invalidate();
                }
            };

            ToggleControl(redoToolStripMenuItem1, false);
            ToggleControl(redoBtn, false);
            ToggleControl(undoToolStripMenuItem1, false);
            ToggleControl(undoBtn, false);

            manager.OnCurrentActiveComponentChanged += (x) =>
            {
                if (x == null)
                {
                    propertiesEditGBox.Visible = false;
                    return;
                }
                propertiesEditGBox.Visible = true;
                if (x is Trafficlight)
                {
                    propertiesLbl.Text      = "Green interval";
                    propertiesEditNUD.Value = (decimal)manager.CurrentActiveTrafficLight.GreenSeconds;
                }

                else if (x is Lane)
                {
                    propertiesLbl.Text      = "Car flow";
                    propertiesEditNUD.Value = manager.CurrentActiveLane.Flow;
                }
            };

            manager.CurrentActiveComponent = null;

            foreach (Control item in this.Controls)
            {
                if (item.Name.StartsWith("gridSlot"))
                {
                    int slotID = int.Parse(item.Name.Substring("gridSlot".Length)) - 1;
                    pBoxToSlotIDLookup.Add(item as PictureBox, slotID);
                    slotIDToPBoxLookup.Add(slotID, item as PictureBox);


                    item.Click += (x, y) =>
                    {
                        if (state != SystemState.None)
                        {
                            PlaceCrossing(x as PictureBox);
                            RemoveCrossing(x as PictureBox);

                            Form fc = Application.OpenForms["SavedManagerForm"];

                            if (fc != null)
                            {
                                int row    = pBoxToSlotIDLookup[x as PictureBox] / 3;
                                int column = pBoxToSlotIDLookup[x as PictureBox] % 3;
                                manager.SavedCrossingManager.Add(manager.Grid[row][column]);
                                smform.UpdatePanel();
                            }
                        }
                        else
                        {
                            SelectComponent(x as PictureBox, y as MouseEventArgs);
                        }
                    };

                    item.Paint += (x, y) =>
                    {
                        int      slot     = pBoxToSlotIDLookup[x as PictureBox];
                        Crossing crossing = manager.Grid.CrossingAt(slot);
                        if (crossing != null)
                        {
                            crossing.Draw(y.Graphics);
                        }
                    };
                }
            }

            foreach (Control item in this.Controls)
            {
                item.KeyDown += MainForm_KeyDown;
            }

            this.Click += MainForm_Click;

            PicBoxTypeA.Click += PicBoxTypeA_Click;
            PicBoxTypeA.Click += ClearToggles;
            PicBoxTypeB.Click += PicBoxTypeB_Click;
            PicBoxTypeB.Click += ClearToggles;
            PicBoxTypeC.Click += PicBoxTypeC_Click;
            PicBoxTypeC.Click += ClearToggles;

            PicBoxTypeA.Cursor = Cursors.Hand;
            PicBoxTypeB.Cursor = Cursors.Hand;
            PicBoxTypeC.Cursor = Cursors.Hand;

            // Attach the grid.
            this.AttachGrid();

            this.manager.GridLoaded += () =>
            {
                gridSlot1.Image = null;
                gridSlot2.Image = null;
                gridSlot3.Image = null;
                gridSlot4.Image = null;
                gridSlot5.Image = null;
                gridSlot6.Image = null;
                gridSlot7.Image = null;
                gridSlot8.Image = null;
                gridSlot9.Image = null;

                foreach (Crossing[] c in this.manager.Grid.Crossings)
                {
                    foreach (Crossing cr in c)
                    {
                        if (cr != null)
                        {
                            int id = cr.Row * 3 + cr.Column;
                            this.slotIDToPBoxLookup[id].Image = cr.Image;
                        }
                    }
                }
            };
            manager.CurrentSimulation.OnPauseStateChanged +=
                (isPaused) =>
            {
                timer.Enabled = !isPaused;
                ToggleControl(undoToolStripMenuItem1, isPaused);
                ToggleControl(redoToolStripMenuItem1, isPaused);
                ToggleControl(undoBtn, isPaused);
                ToggleControl(redoBtn, isPaused);

                ToggleControl(newSimulationToolStripMenuItem, isPaused);
                ToggleControl(openToolStripMenuItem, isPaused);
                ToggleControl(saveToolStripMenuItem1, isPaused);

                ToggleControl(btnSaveCrossingManager, isPaused);
                ToggleControl(button2, isPaused);
                ToggleControl(button1, isPaused);
                ToggleControl(updatePropertiesBtn, isPaused);

                ToggleControl(PicBoxTypeA, isPaused);
                ToggleControl(PicBoxTypeB, isPaused);
                ToggleControl(PicBoxTypeC, isPaused);

                if (!isPaused)
                {
                    manager.CurrentActiveComponent = null;

                    ChangeBorder(PicBoxTypeA, false);
                    ChangeBorder(PicBoxTypeB, false);
                    ChangeBorder(PicBoxTypeC, false);
                    ChangeGridSlotsCursor(false);
                    button2.FlatStyle = FlatStyle.Standard;
                    rmToggled         = false;
                    state             = SystemState.None;
                }
            };
            manager.CurrentSimulation.OnSpeedChanged += (x) => lblSpeed.Text = x + "x";
            manager.CurrentSimulation.OnCompleted    += (x) => {
                timer.Stop();

                listBox1.Items.Clear();

                x.SaveResults(x.SimulationSetup.TimePassed, x.SimulationSetup.TotalCars, x.SimulationSetup.GetXTimesCrossingsCrossed());

                listBox1.Items.Add("Date performed: ");
                listBox1.Items.Add(x.DatePerformed.ToString());

                listBox1.Items.Add("");

                listBox1.Items.Add("Time passed: ");
                listBox1.Items.Add(x.TimePassed.ToString());

                listBox1.Items.Add("");

                listBox1.Items.Add("Total cars: ");
                listBox1.Items.Add(x.TotalCars.ToString());

                listBox1.Items.Add("");

                listBox1.Items.Add("Successfully crossings of cars: ");
                listBox1.Items.Add(x.CarsCrossed.ToString());
            };
        }