Example #1
0
        public void MoveOneNeuron(Neuron n, Neuron nNewLocation)
        {
            n.AddUndoInfo();
            nNewLocation.AddUndoInfo();

            //copy the neuron attributes and delete them from the old neuron.
            n.Copy(nNewLocation);
            MainWindow.theNeuronArray.SetCompleteNeuron(nNewLocation);
            if (FiringHistory.NeuronIsInFiringHistory(n.id))
            {
                FiringHistory.RemoveNeuronFromHistoryWindow(n.id);
                FiringHistory.AddNeuronToHistoryWindow(nNewLocation.id);
            }

            //for all the synapses going out this neuron, change to going from new location
            //don't use a foreach here because the body of the loop may delete a list entry
            for (int k = 0; k < n.Synapses.Count; k++)
            {
                Synapse s = n.Synapses[k];
                if (s.targetNeuron != n.id)
                {
                    nNewLocation.AddSynapseWithUndo(s.targetNeuron, s.weight, s.model);
                }
                else
                {
                    nNewLocation.AddSynapseWithUndo(nNewLocation.id, s.weight, s.model);
                }
                n.DeleteSynapseWithUndo(n.synapses[k].targetNeuron);
            }

            //for all the synapses coming into this neuron, change the synapse target to new location
            for (int k = 0; k < n.SynapsesFrom.Count; k++)
            {
                Synapse reverseSynapse = n.SynapsesFrom[k]; //(from synapses are sort-of backward
                if (reverseSynapse.targetNeuron != -1)      //?
                {
                    Neuron sourceNeuron = MainWindow.theNeuronArray.GetNeuron(reverseSynapse.targetNeuron);
                    sourceNeuron.DeleteSynapseWithUndo(n.id);
                    if (sourceNeuron.id != n.id)
                    {
                        sourceNeuron.AddSynapseWithUndo(nNewLocation.id, reverseSynapse.weight, reverseSynapse.model);
                    }
                }
            }

            n.Clear();
        }
Example #2
0
        private static void SetValueInSelectedNeurons(Neuron n, string property)
        {
            bool neuronInSelection = NeuronInSelection(n.id);

            if (neuronInSelection)
            {
                List <int> theNeurons = theNeuronArrayView.theSelection.EnumSelectedNeurons();
                //special case for label because they are auto-incremented,
                //clear all the labels first to avoid collisions
                if (property == "label")
                {
                    for (int i = 0; i < theNeurons.Count; i++)
                    {
                        Neuron n1 = MainWindow.theNeuronArray.GetNeuron(theNeurons[i]);
                        if (n1.id != n.id)
                        {
                            n1.label = "";
                            n1.Update();
                        }
                    }
                }
                for (int i = 0; i < theNeurons.Count; i++)
                {
                    Neuron n1 = MainWindow.theNeuronArray.GetNeuron(theNeurons[i]);
                    n1.AddUndoInfo();
                    switch (property)
                    {
                    case "currentCharge":
                        if (n.model == Neuron.modelType.Color)
                        {
                            n1.SetValueInt(n.LastChargeInt);
                        }
                        else
                        {
                            n1.currentCharge = n.currentCharge;
                            n1.lastCharge    = n.currentCharge;
                        }
                        break;

                    case "leakRate": n1.leakRate = n.leakRate; break;

                    case "axonDelay": n1.axonDelay = n.axonDelay; break;

                    case "model": n1.model = n.model; break;

                    case "enable": n1.leakRate = n.leakRate; break;

                    case "history":
                        if (FiringHistory.NeuronIsInFiringHistory(n.id))
                        {
                            FiringHistory.AddNeuronToHistoryWindow(n1.id);
                            OpenHistoryWindow();
                        }
                        else
                        {
                            FiringHistory.RemoveNeuronFromHistoryWindow(n1.id);
                        }
                        break;

                    case "synapses":
                        if (MainWindow.arrayView.IsShowingSnapses(n.id))
                        {
                            MainWindow.arrayView.AddShowSynapses(n1.id);
                        }
                        else
                        {
                            MainWindow.arrayView.RemoveShowSynapses(n1.id);
                        }
                        break;

                    case "label":
                        if (n.label == "")
                        {
                            n1.label = "";
                        }
                        else if (n.id != n1.id)
                        {
                            string newLabel = n.label;
                            while (MainWindow.theNeuronArray.GetNeuron(newLabel) != null)
                            {
                                int num        = 0;
                                int digitCount = 0;
                                while (Char.IsDigit(newLabel[newLabel.Length - 1]))
                                {
                                    int.TryParse(newLabel[newLabel.Length - 1].ToString(), out int digit);
                                    num = num + (int)Math.Pow(10, digitCount) * digit;
                                    digitCount++;
                                    newLabel = newLabel.Substring(0, newLabel.Length - 1);
                                }
                                num++;
                                newLabel = newLabel + num.ToString();
                            }
                            n1.label = newLabel;
                        }
                        break;
                    }
                    n1.Update();
                }
            }
        }
Example #3
0
        public static void CreateContextMenu(int i, Neuron n, ContextMenu cm)
        {
            n = MainWindow.theNeuronArray.AddSynapses(n);
            cm.SetValue(NeuronIDProperty, n.Id);
            cm.Closed  += Cm_Closed;
            cmCancelled = false;
            StackPanel sp = new StackPanel {
                Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 3, 3)
            };

            sp.Children.Add(new Label {
                Content = "Charge: ", Padding = new Thickness(0)
            });
            if (n.Model == Neuron.modelType.FloatValue)
            {
                sp.Children.Add(new TextBox {
                    Text = n.CurrentCharge.ToString("f2"), Width = 60, Name = "CurrentCharge", VerticalAlignment = VerticalAlignment.Center
                });
            }
            else if (n.model == Neuron.modelType.Color)
            {
                sp.Children.Add(new TextBox {
                    Text = n.LastChargeInt.ToString("X"), Width = 60, Name = "CurrentCharge", VerticalAlignment = VerticalAlignment.Center
                });
            }
            else
            {
                sp.Children.Add(new TextBox {
                    Text = n.LastCharge.ToString("f2"), Width = 60, Name = "CurrentCharge", VerticalAlignment = VerticalAlignment.Center
                });
            }
            cm.Items.Add(sp);
            if (n.Model == Neuron.modelType.LIF || n.model == Neuron.modelType.Random)
            {
                sp = new StackPanel {
                    Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 3, 3)
                };
                sp.Children.Add(new Label {
                    Content = "Leak Rate: ", Padding = new Thickness(0)
                });
                sp.Children.Add(new TextBox {
                    Text = n.LeakRate.ToString("f4"), Width = 60, Name = "LeakRate", VerticalAlignment = VerticalAlignment.Center
                });
                cm.Items.Add(sp);
            }

            MenuItem mi = new MenuItem();

            mi.Header = "Neuron ID: " + n.Id;
            cm.Items.Add(mi);
            cm.Items.Add(new Separator());
            mi        = new MenuItem();
            mi.Header = "Always Fire";
            mi.Click += Mi_Click;
            cm.Items.Add(mi);
            mi        = new MenuItem();
            mi.Header = "Paste Here";
            mi.Click += Mi_Click;
            cm.Items.Add(mi);
            mi        = new MenuItem();
            mi.Header = "Clipboard";
            mi.Click += Mi_Click;
            mi.Items.Add(new MenuItem()
            {
                Header = "Paste Here"
            });
            ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click;
            mi.Items.Add(new MenuItem()
            {
                Header = "Move Here"
            });
            ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click;
            mi.Items.Add(new MenuItem()
            {
                Header = "Connect to Here"
            });
            ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click;
            mi.Items.Add(new MenuItem()
            {
                Header = "Connect from Here"
            });
            ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click;
            mi.Items.Add(new MenuItem()
            {
                Header = "Select as Target"
            });
            ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click;
            cm.Items.Add(mi);
            sp = new StackPanel {
                Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 3, 3)
            };
            sp.Children.Add(new Label {
                Content = "Label: ", Padding = new Thickness(0)
            });
            sp.Children.Add(new TextBox {
                Text = n.Label, Width = 150, Name = "Label", VerticalAlignment = VerticalAlignment.Center
            });
            cm.Items.Add(sp);

            sp = new StackPanel {
                Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 3, 3)
            };
            sp.Children.Add(new Label {
                Content = "Model: ", Padding = new Thickness(0)
            });
            ComboBox cb = new ComboBox()
            {
                Width = 100
            };

            for (int index = 0; index < Enum.GetValues(typeof(Neuron.modelType)).Length; index++)
            {
                Neuron.modelType model = (Neuron.modelType)index;
                cb.Items.Add(new ListBoxItem()
                {
                    Content = model.ToString(),
                    ToolTip = Neuron.modelToolTip[index],
                    Width   = 100,
                });
            }
            cb.SelectedIndex     = (int)n.Model;
            cb.SelectionChanged += Cb_SelectionChanged;
            sp.Children.Add(cb);
            cm.Items.Add(sp);
            CheckBox cbHistory = new CheckBox
            {
                IsChecked = FiringHistory.NeuronIsInFiringHistory(n.id),
                Content   = "Record Firing History",
                Name      = "History",
            };

            cbHistory.Checked   += CbHistory_Checked;
            cbHistory.Unchecked += CbHistory_Checked;
            cm.Items.Add(cbHistory);

            mi        = new MenuItem();
            mi.Header = "Synapses";
            foreach (Synapse s in n.Synapses)
            {
                string   targetLabel     = MainWindow.theNeuronArray.GetNeuron(s.targetNeuron).Label;
                MenuItem synapseMenuItem = new MenuItem()
                {
                    Header = s.targetNeuron.ToString().PadLeft(8) + s.Weight.ToString("F3").PadLeft(9) + " " + targetLabel, FontFamily = new FontFamily("Courier New")
                };
                synapseMenuItem.Click += Mi_Click;
                synapseMenuItem.PreviewMouseRightButtonDown += SynapseMenuItem_PreviewMouseRightButtonDown;
                synapseMenuItem.ToolTip = "L-click -> target neuron, R-Click -> edit synapse";
                mi.Items.Add(synapseMenuItem);
            }
            cm.Items.Add(mi);

            mi        = new MenuItem();
            mi.Header = "Synapses In";
            foreach (Synapse s in n.SynapsesFrom)
            {
                string   targetLabel     = MainWindow.theNeuronArray.GetNeuron(s.targetNeuron).Label;
                MenuItem synapseMenuItem = new MenuItem()
                {
                    Header = s.targetNeuron.ToString().PadLeft(8) + " " + s.Weight.ToString("F3").PadLeft(9) + " " + targetLabel, FontFamily = new FontFamily("Courier New")
                };
                synapseMenuItem.Click += Mi_Click;
                synapseMenuItem.PreviewMouseRightButtonDown += SynapseFromMenuItem_PreviewMouseRightButtonDown1;
                synapseMenuItem.ToolTip = "L-click -> source neuron, R-Click -> edit synapse";
                mi.Items.Add(synapseMenuItem);;
            }
            cm.Items.Add(mi);
        }
Example #4
0
        public static void CreateContextMenu(int i, Neuron n, ContextMenu cm)
        {
            cmCancelled = false;

            labelChanged     = false;
            modelChanged     = false;
            enabledChanged   = false;
            historyChanged   = false;
            synapsesChanged  = false;
            chargeChanged    = false;
            leakRateChanged  = false;
            axonDelayChanged = false;

            n = MainWindow.theNeuronArray.AddSynapses(n);
            cm.SetValue(NeuronIDProperty, n.Id);
            cm.Closed         += Cm_Closed;
            cm.Opened         += Cm_Opened;
            cm.PreviewKeyDown += Cm_PreviewKeyDown;
            cmCancelled        = false;
            cm.StaysOpen       = true;

            //The neuron label
            StackPanel sp = new StackPanel {
                Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 3, 3)
            };

            sp.Children.Add(new Label {
                Content = "ID: " + n.id + "   Label: ", VerticalAlignment = VerticalAlignment.Center, Padding = new Thickness(0)
            });
            TextBox tb = Utils.ContextMenuTextBox(n.Label, "Label", 150);

            tb.TextChanged += Tb_TextChanged;
            sp.Children.Add(tb);
            sp.Children.Add(new Label {
                Content = "Warning:\rDuplicate Label", FontSize = 8, Name = "DupWarn", Visibility = Visibility.Hidden
            });
            //            cm.Items.Add(sp);
            //MenuItem mi = new MenuItem { StaysOpenOnClick = true, Header = new TextBox { Text = "Harry" } };
            cm.Items.Add(new MenuItem {
                StaysOpenOnClick = true, Header = sp
            });

            //The neuron model
            sp = new StackPanel {
                Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 3, 3)
            };
            sp.Children.Add(new Label {
                Content = "Model: ", Padding = new Thickness(0)
            });
            ComboBox cb = new ComboBox()
            {
                Width = 100, Name = "Model"
            };

            for (int index = 0; index < Enum.GetValues(typeof(Neuron.modelType)).Length; index++)
            {
                Neuron.modelType model = (Neuron.modelType)index;
                cb.Items.Add(new ListBoxItem()
                {
                    Content = model.ToString(),
                    ToolTip = Neuron.modelToolTip[index],
                    Width   = 100,
                });
            }
            cb.SelectedIndex     = (int)n.Model;
            cb.SelectionChanged += Cb_SelectionChanged;
            sp.Children.Add(cb);
            cm.Items.Add(new MenuItem {
                StaysOpenOnClick = true, Header = sp
            });

            cm.Items.Add(new Separator());

            MenuItem mi             = new MenuItem();
            CheckBox cbShowSynapses = new CheckBox
            {
                IsChecked = (n.leakRate > 0) || float.IsPositiveInfinity(1.0f / n.leakRate),
                Content   = "Enabled",
                Name      = "Enabled",
            };

            cbShowSynapses.Checked   += CbCheckedChanged;
            cbShowSynapses.Unchecked += CbCheckedChanged;
            cm.Items.Add(new MenuItem {
                StaysOpenOnClick = true, Header = cbShowSynapses
            });

            cbShowSynapses = new CheckBox
            {
                IsChecked = MainWindow.arrayView.IsShowingSnapses(n.id),
                Content   = "Show Synapses",
                Name      = "Synapses",
            };
            cbShowSynapses.Checked   += CbCheckedChanged;
            cbShowSynapses.Unchecked += CbCheckedChanged;
            cm.Items.Add(new MenuItem {
                StaysOpenOnClick = true, Header = cbShowSynapses
            });

            mi = new MenuItem();
            CheckBox cbHistory = new CheckBox
            {
                IsChecked = FiringHistory.NeuronIsInFiringHistory(n.id),
                Content   = "Record Firing History",
                Name      = "History",
            };

            cbHistory.Checked   += CbCheckedChanged;
            cbHistory.Unchecked += CbCheckedChanged;
            cm.Items.Add(new MenuItem {
                StaysOpenOnClick = true, Header = cbHistory
            });

            mi        = new MenuItem();
            mi.Header = "Synapses Out";
            foreach (Synapse s in n.Synapses)
            {
                string   targetLabel     = MainWindow.theNeuronArray.GetNeuron(s.targetNeuron).Label;
                MenuItem synapseMenuItem = new MenuItem()
                {
                    Header = s.targetNeuron.ToString().PadLeft(8) + s.Weight.ToString("F3").PadLeft(9) + " " + targetLabel, FontFamily = new FontFamily("Courier New")
                };
                synapseMenuItem.Click += Mi_Click;
                synapseMenuItem.PreviewMouseRightButtonDown += SynapseMenuItem_PreviewMouseRightButtonDown;
                synapseMenuItem.ToolTip = "L-click -> target neuron, R-Click -> edit synapse";
                mi.Items.Add(synapseMenuItem);
            }
            cm.Items.Add(mi);

            mi        = new MenuItem();
            mi.Header = "Synapses In";
            foreach (Synapse s in n.SynapsesFrom)
            {
                string   targetLabel     = MainWindow.theNeuronArray.GetNeuron(s.targetNeuron).Label;
                MenuItem synapseMenuItem = new MenuItem()
                {
                    Header = s.targetNeuron.ToString().PadLeft(8) + " " + s.Weight.ToString("F3").PadLeft(9) + " " + targetLabel, FontFamily = new FontFamily("Courier New")
                };
                synapseMenuItem.Click += Mi_Click;
                synapseMenuItem.PreviewMouseRightButtonDown += SynapseFromMenuItem_PreviewMouseRightButtonDown1;
                synapseMenuItem.ToolTip = "L-click -> source neuron, R-Click -> edit synapse";
                mi.Items.Add(synapseMenuItem);;
            }
            cm.Items.Add(mi);

            mi = new MenuItem {
                Header = "Paste Here"
            };
            if (MainWindow.myClipBoard == null)
            {
                mi.IsEnabled = false;
            }
            mi.Click += Mi_Click;
            cm.Items.Add(mi);
            mi = new MenuItem {
                Header = "Move Here"
            };
            if (MainWindow.arrayView.theSelection.selectedRectangles.Count == 0)
            {
                mi.IsEnabled = false;
            }
            mi.Click += Mi_Click;
            cm.Items.Add(mi);


            mi        = new MenuItem();
            mi.Header = "Connect Multiple Synapses";
            mi.Click += Mi_Click;
            mi.Items.Add(new MenuItem()
            {
                Header = "From Selection to Here"
            });
            ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click;
            mi.Items.Add(new MenuItem()
            {
                Header = "From Here to Selection"
            });
            ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click;
            mi.Items.Add(new MenuItem()
            {
                Header = "Mutual Suppression"
            });
            ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click;
            cm.Items.Add(mi);

            if (NeuronInSelection(n.id))
            {
                cbShowSynapses = new CheckBox
                {
                    IsChecked = true,
                    Content   = "Apply changes to all neurons in selection",
                    Name      = "ApplyToSelection",
                };
                cbShowSynapses.Checked   += CbCheckedChanged;
                cbShowSynapses.Unchecked += CbCheckedChanged;
                cm.Items.Add(new MenuItem {
                    StaysOpenOnClick = true, Header = cbShowSynapses
                });
            }


            sp = new StackPanel {
                Orientation = Orientation.Horizontal
            };
            Button b0 = new Button {
                Content = "OK", Width = 100, Height = 25, Margin = new Thickness(10)
            };

            b0.Click += B0_Click;
            sp.Children.Add(b0);
            b0 = new Button {
                Content = "Cancel", Width = 100, Height = 25, Margin = new Thickness(10)
            };
            b0.Click += B0_Click;
            sp.Children.Add(b0);

            cm.Items.Add(new MenuItem {
                Header = sp, StaysOpenOnClick = true
            });

            SetCustomCMItems(cm, n, n.model);
        }
        public static ContextMenu CreateContextMenu(int i, Neuron n, ContextMenu cm)
        {
            cmCancelled = false;

            labelChanged     = false;
            toolTipChanged   = false;
            modelChanged     = false;
            enabledChanged   = false;
            historyChanged   = false;
            synapsesChanged  = false;
            chargeChanged    = false;
            leakRateChanged  = false;
            axonDelayChanged = false;

            n = MainWindow.theNeuronArray.AddSynapses(n);
            cm.SetValue(NeuronIDProperty, n.Id);
            cm.Closed         += Cm_Closed;
            cm.Opened         += Cm_Opened;
            cm.PreviewKeyDown += Cm_PreviewKeyDown;
            cmCancelled        = false;
            cm.StaysOpen       = true;
            cm.Width           = 300;

            //The neuron label
            MenuItem mi1 = new MenuItem {
                Header = "ID: " + n.id, Padding = new Thickness(0)
            };

            cm.Items.Add(mi1);

            //apply to all in selection
            CheckBox cbApplyToSelection = new CheckBox
            {
                IsChecked = true,
                Content   = "Apply changes to all neurons in selection",
                Name      = "ApplyToSelection",
            };

            cbApplyToSelection.Checked   += CbCheckedChanged;
            cbApplyToSelection.Unchecked += CbCheckedChanged;
            cm.Items.Add(new MenuItem {
                StaysOpenOnClick = true, Header = cbApplyToSelection
            });
            if (MainWindow.arrayView.theSelection.selectedRectangles.Count > 0)
            {
                cbApplyToSelection.IsEnabled = true;
                cbApplyToSelection.IsChecked = NeuronInSelection(n.id);
            }
            else
            {
                cbApplyToSelection.IsChecked = false;
                cbApplyToSelection.IsEnabled = false;
            }

            //label
            StackPanel sp = new StackPanel {
                Orientation = Orientation.Horizontal,
            };

            sp.Children.Add(new Label {
                Content = "Label: ", Padding = new Thickness(0), VerticalAlignment = VerticalAlignment.Center,
            });;
            TextBox tb = Utils.ContextMenuTextBox(n.Label, "Label", 170);

            tb.TextChanged += Tb_TextChanged;
            sp.Children.Add(tb);
            sp.Children.Add(new Label {
                Content = "Warning: Duplicate Label", FontSize = 8, Name = "DupWarn", Visibility = Visibility.Hidden
            });
            mi1 = new MenuItem {
                StaysOpenOnClick = true, Header = sp
            };
            cm.Items.Add(mi1);

            //tooltip
            if (n.Label != "" || n.ToolTip != "") //add the tooltip textbox if needed
            {
                sp = new StackPanel {
                    Orientation = Orientation.Horizontal
                };
                sp.Children.Add(new Label {
                    Content = "Tooltip: ", VerticalAlignment = VerticalAlignment.Center, Padding = new Thickness(0)
                });
                tb              = Utils.ContextMenuTextBox(n.ToolTip, "ToolTip", 150);
                tb.TextChanged += Tb_TextChanged;
                sp.Children.Add(tb);
                cm.Items.Add(sp);
            }

            //The neuron model
            sp = new StackPanel {
                Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 3, 3)
            };
            sp.Children.Add(new Label {
                Content = "Model: ", Padding = new Thickness(0)
            });
            ComboBox cb = new ComboBox()
            {
                Width = 80, Name = "Model"
            };

            for (int index = 0; index < Enum.GetValues(typeof(Neuron.modelType)).Length; index++)
            {
                Neuron.modelType model = (Neuron.modelType)index;
                cb.Items.Add(new ListBoxItem()
                {
                    Content = model.ToString(),
                    ToolTip = Neuron.modelToolTip[index],
                    Width   = 100,
                });
            }
            cb.SelectedIndex     = (int)n.Model;
            cb.SelectionChanged += Cb_SelectionChanged;
            sp.Children.Add(cb);
            cm.Items.Add(new MenuItem {
                StaysOpenOnClick = true, Header = sp
            });

            cm.Items.Add(new Separator {
                Visibility = Visibility.Collapsed
            });
            cm.Items.Add(new Separator {
                Visibility = Visibility.Collapsed
            });


            MenuItem mi             = new MenuItem();
            CheckBox cbEnableNeuron = new CheckBox
            {
                IsChecked = (n.leakRate > 0) || float.IsPositiveInfinity(1.0f / n.leakRate),
                Content   = "Enabled",
                Name      = "Enabled",
            };

            cbEnableNeuron.Checked   += CbCheckedChanged;
            cbEnableNeuron.Unchecked += CbCheckedChanged;
            cm.Items.Add(new MenuItem {
                StaysOpenOnClick = true, Header = cbEnableNeuron
            });

            CheckBox cbShowSynapses = new CheckBox
            {
                IsChecked = MainWindow.arrayView.IsShowingSynapses(n.id),
                Content   = "Show Synapses",
                Name      = "Synapses",
            };

            cbShowSynapses.Checked   += CbCheckedChanged;
            cbShowSynapses.Unchecked += CbCheckedChanged;
            cm.Items.Add(new MenuItem {
                StaysOpenOnClick = true, Header = cbShowSynapses
            });

            mi = new MenuItem();
            CheckBox cbHistory = new CheckBox
            {
                IsChecked = FiringHistory.NeuronIsInFiringHistory(n.id),
                Content   = "Record Firing History",
                Name      = "History",
            };

            cbHistory.Checked   += CbCheckedChanged;
            cbHistory.Unchecked += CbCheckedChanged;
            cm.Items.Add(new MenuItem {
                StaysOpenOnClick = true, Header = cbHistory
            });

            mi = new MenuItem {
                Header = "Clear Synapses"
            };
            mi.Click += Mi_Click;
            cm.Items.Add(mi);

            cm.Items.Add(new Separator());
            cm.Items.Add(new Separator());

            mi        = new MenuItem();
            mi.Header = "Synapses Out";
            mi.Width  = 250;
            mi.HorizontalAlignment = HorizontalAlignment.Left;
            foreach (Synapse s in n.Synapses)
            {
                AddSynapseEntryToMenu(mi, s);
            }
            cm.Items.Add(mi);

            mi        = new MenuItem();
            mi.Header = "Synapses In";
            mi.Width  = 250;
            mi.HorizontalAlignment = HorizontalAlignment.Left;
            foreach (Synapse s in n.SynapsesFrom)
            {
                AddSynapseEntryToMenu(mi, s);
            }
            cm.Items.Add(mi);

            mi = new MenuItem {
                Header = "Paste Here"
            };
            if (!XmlFile.WindowsClipboardContainsNeuronArray())
            {
                mi.IsEnabled = false;
            }
            mi.Click += Mi_Click;
            cm.Items.Add(mi);

            mi = new MenuItem {
                Header = "Move Here"
            };
            if (MainWindow.arrayView.theSelection.selectedRectangles.Count == 0)
            {
                mi.IsEnabled = false;
            }
            mi.Click += Mi_Click;
            cm.Items.Add(mi);


            mi        = new MenuItem();
            mi.Header = "Connect Multiple Synapses";
            mi.Width  = 250;
            mi.HorizontalAlignment = HorizontalAlignment.Left;
            mi.Click += Mi_Click;
            mi.Items.Add(new MenuItem()
            {
                Header = "From Selection to Here"
            });
            ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click;
            mi.Items.Add(new MenuItem()
            {
                Header = "From Here to Selection"
            });
            ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click;
            mi.Items.Add(new MenuItem()
            {
                Header = "Mutual Suppression"
            });
            ((MenuItem)mi.Items[mi.Items.Count - 1]).Click += Mi_Click;
            cm.Items.Add(mi);

            sp = new StackPanel {
                Orientation = Orientation.Horizontal
            };
            Button b0 = new Button {
                Content = "OK", Width = 100, Height = 25, Margin = new Thickness(10)
            };

            b0.Click += B0_Click;
            sp.Children.Add(b0);
            b0 = new Button {
                Content = "Cancel", Width = 100, Height = 25, Margin = new Thickness(10)
            };
            b0.Click += B0_Click;
            sp.Children.Add(b0);

            cm.Items.Add(new MenuItem {
                Header = sp, StaysOpenOnClick = true
            });

            SetCustomCMItems(cm, n, n.model);

            return(cm);
        }