private void FindClickDetails(TimetableEventArgs e)
 {
     _clickTime = e.Time;
     if (Timetable == null)
     {
         _clickSession = null;
         _clickUnavail = null;
     }
     else
     {
         _clickSession = Timetable.FindClassAt(_clickTime, true);
         _clickUnavail = Timetable.FindUnavailableAt(_clickTime);
     }
 }
        private void TimetableControl1TimetableMouseClick(object sender, TimetableEventArgs e)
        {
            FindClickDetails(e);

            switch (e.Button)
            {
            case MouseButtons.Right:
                if (Timetable == null)
                {
                    findClassHereToolStripMenuItem.Enabled  = false;
                    unavailabilityToolStripMenuItem.Enabled = false;
                    timeMenu.Show(timetableControl, e.Location);
                }

                // right clicked empty space?
                else if (_clickSession == null && _clickUnavail == null)
                {
                    findClassHereToolStripMenuItem.DropDownItems.Clear();

                    // populate list of options at this time
                    var required = new List <ToolStripItem>();
                    var ignored  = new List <ToolStripItem>();
                    foreach (var subject in Timetable.SubjectList)
                    {
                        foreach (var type in subject.Types)
                        {
                            foreach (var stream in type.UniqueStreams)
                            {
                                var atTime =
                                    stream.Classes.Any(
                                        session => _clickTime >= session.Start && _clickTime <= session.End);
                                if (!atTime)
                                {
                                    continue;
                                }

                                var item =
                                    new ToolStripMenuItem(stream.Type.Subject + " " + stream);
                                var stream1 = stream;
                                item.MouseEnter += delegate { timetableControl.PreviewAlt(stream1); };
                                item.MouseLeave += delegate { timetableControl.EndPreviewStream(); };
                                var stream2 = stream;
                                item.Click += delegate
                                {
                                    if (!Timetable.SelectStream(stream2))
                                    {
                                        return;
                                    }
                                    MadeChanges(true);
                                };
                                if (!Timetable.Fits(stream))
                                {
                                    item.ForeColor = Color.Gray;
                                }

                                if (type.Required)
                                {
                                    required.Add(item);
                                }
                                else
                                {
                                    ignored.Add(item);
                                }
                            }
                        }
                    }
                    if (required.Count > 0)
                    {
                        findClassHereToolStripMenuItem.DropDownItems.AddRange(required.ToArray());
                        if (ignored.Count > 0)
                        {
                            findClassHereToolStripMenuItem.DropDownItems.Add(new ToolStripSeparator());
                        }
                    }
                    if (ignored.Count > 0)
                    {
                        findClassHereToolStripMenuItem.DropDownItems.AddRange(ignored.ToArray());
                    }
                    findClassHereToolStripMenuItem.Enabled  = (required.Count > 0 || ignored.Count > 0);
                    unavailabilityToolStripMenuItem.Enabled = true;

                    timeMenu.Show(timetableControl, e.Location);
                }

                // right clicked a session
                else if (_clickSession != null)
                {
                    alternativeToolStripMenuItem.DropDownItems.Clear();
                    equivalentToolStripMenuItem.DropDownItems.Clear();

                    timetableControl.SetActive(_clickSession.Stream);

                    // populate alternative options menu
                    // NOTE: lambda-style delegates do not work with foreach
                    var n = 0;
                    foreach (var alt in _clickSession.Stream.Type.UniqueStreams)
                    {
                        if (alt == _clickSession.Stream || _clickSession.Stream.Equivalent.Contains(alt))
                        {
                            continue;
                        }
                        var item = new ToolStripMenuItem(alt.ToString());
                        var alt1 = alt;
                        item.MouseEnter += delegate { timetableControl.PreviewAlt(alt1); };
                        item.MouseLeave += delegate { timetableControl.EndPreviewStream(); };
                        var alt2 = alt;
                        item.Click += delegate
                        {
                            if (!Timetable.SelectStream(alt2))
                            {
                                return;
                            }
                            MadeChanges(true);
                        };
                        if (!Timetable.Fits(alt))
                        {
                            item.ForeColor = Color.Gray;
                        }

                        alternativeToolStripMenuItem.DropDownItems.Add(item);
                        n++;
                    }
                    alternativeToolStripMenuItem.Enabled = (n != 0);

                    // populate equivalent options menu
                    n = 0;
                    foreach (var equiv in _clickSession.Stream.Equivalent)
                    {
                        var item   = new ToolStripMenuItem(equiv.ToString());
                        var equiv1 = equiv;
                        item.MouseEnter += delegate { timetableControl.PreviewEquiv(equiv1); };
                        item.MouseLeave += delegate { timetableControl.EndPreviewStream(); };
                        var equiv2 = equiv;
                        item.Click += delegate
                        {
                            if (!Timetable.SelectStream(equiv2))
                            {
                                return;
                            }
                            MadeChanges(true);
                        };
                        equivalentToolStripMenuItem.DropDownItems.Add(item);
                        n++;
                    }
                    equivalentToolStripMenuItem.Enabled = (n != 0);
                    streamMenu.Show(timetableControl, e.Location);
                }

                // right clicked an unavailability
                else
                {
                    timetableControl.SetActive(_clickUnavail);

                    unavailableMenu.Show(timetableControl, e.Location);
                }
                break;

            case MouseButtons.Middle:
                break;
            }
        }