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; } }