void UpdateSelection()
{
// Check the selection validity.
if (!activeCourseDesignator.IsAllControls && !eventDB.IsCoursePresent(activeCourseDesignator.CourseId)) {
// Active course was deleted. Switch to all controls.
activeCourseDesignator = CourseDesignator.AllControls;
ClearSelection();
}
// Check that variation still exists.
if (activeCourseDesignator.IsVariation && QueryEvent.HasVariations(eventDB, activeCourseDesignator.CourseId)) {
IEnumerable<VariationInfo> variations = QueryEvent.GetAllVariations(eventDB, activeCourseDesignator.CourseId);
if (!variations.Any(v => v.Equals(activeCourseDesignator.VariationInfo)))
activeCourseDesignator = activeCourseDesignator.WithAllVariations();
}
// Does the current part still exist?
if (!activeCourseDesignator.IsAllControls && !activeCourseDesignator.AllParts && activeCourseDesignator.Part >= QueryEvent.CountCourseParts(eventDB, activeCourseDesignator.CourseId)) {
// No part that large any more.
int numberOfParts = QueryEvent.CountCourseParts(eventDB, activeCourseDesignator.CourseId);
if (numberOfParts > 1)
activeCourseDesignator = new CourseDesignator(activeCourseDesignator.CourseId, numberOfParts - 1);
else
activeCourseDesignator = new CourseDesignator(activeCourseDesignator.CourseId);
ClearSelection();
}
if (selectedCourseControl.IsNotNone && !eventDB.IsCourseControlPresent(selectedCourseControl)) {
// Selected course control is no longer there.
selectedCourseControl = Id<CourseControl>.None;
ClearSelection();
}
if (selectedCourseControl.IsNotNone && activeCourseDesignator.IsNotAllControls &&
(!activeCourseDesignator.AllParts || activeCourseDesignator.IsVariation) &&
!QueryEvent.IsCourseControlInPart(eventDB, activeCourseDesignator, selectedCourseControl)) {
// Selected course control is not in active part.
// Could be allowed if it's the finish.
Id<ControlPoint> controlId = eventDB.GetCourseControl(selectedCourseControl).control;
if (!(eventDB.IsControlPresent(controlId) &&
eventDB.GetControl(controlId).kind == ControlPointKind.Finish &&
QueryEvent.GetPartOptions(eventDB, activeCourseDesignator).ShowFinish))
{
selectedCourseControl = Id<CourseControl>.None;
ClearSelection();
}
}
if (selectedCourseControl2.IsNotNone && !eventDB.IsCourseControlPresent(selectedCourseControl2)) {
// Selected course control 2 is no longer there.
selectedCourseControl2 = Id<CourseControl>.None;
ClearSelection();
}
if (selectedCourseControl2.IsNotNone && activeCourseDesignator.IsNotAllControls && !activeCourseDesignator.AllParts &&
!QueryEvent.IsCourseControlInPart(eventDB, activeCourseDesignator, selectedCourseControl2)) {
// Selected course control 2 is not in active part.
selectedCourseControl2 = Id<CourseControl>.None;
ClearSelection();
}
if (selectedControl.IsNotNone && !eventDB.IsControlPresent(selectedControl)) {
// Selected control is no longer there.
ClearSelection();
}
if (selectedSpecial.IsNotNone && !eventDB.IsSpecialPresent(selectedSpecial)) {
// Selected special is no longer there.
ClearSelection();
}
if (selectedSpecial.IsNotNone && !(activeCourseDesignator.IsAllControls || QueryEvent.CourseContainsSpecial(eventDB, activeCourseDesignator, selectedSpecial))) {
// Selected special is not in current course
ClearSelection();
}
}