public DescriptionLine[] CreateDescription(bool createKey)
{
EventDB eventDB = courseView.EventDB;
CourseView.CourseViewKind kind = courseView.Kind;
int scoreColumn = courseView.ScoreColumn;
List<DescriptionLine> list = new List<DescriptionLine>(courseView.ControlViews.Count + 4);
string text;
DescriptionLine line;
DescriptionLine[] lines;
Dictionary<string, string> descriptionKey = new Dictionary<string, string>(); // dictionary for any symbols encountered with custom text.
// Get the first title line.
text = GetTitleLine1();
Debug.Assert(text != null);
lines = GetTitleLineFromText(DescriptionLineKind.Title, text);
list.AddRange(lines);
// Get the second title line.
text = GetTitleLine2();
if (text != null) {
lines = GetTitleLineFromText(DescriptionLineKind.SecondaryTitle, text);
list.AddRange(lines);
}
// Get the header line, depending on the kind of course.
switch (kind) {
case CourseView.CourseViewKind.Normal:
line = GetNormalHeaderLine(); break;
case CourseView.CourseViewKind.AllControls:
line = GetAllControlsHeaderLine(); break;
case CourseView.CourseViewKind.Score:
line = GetScoreHeaderLine(); break;
case CourseView.CourseViewKind.AllVariations:
line = GetAllVariationsHeaderLine(); break;
default:
Debug.Fail("unknown CourseViewKind"); line = null; break;
}
if (line != null)
list.Add(line);
// Do all the normal lines
for (int iLine = 0; iLine < courseView.ControlViews.Count; ++iLine) {
CourseView.ControlView controlView = courseView.ControlViews[iLine];
ControlPoint control = eventDB.GetControl(controlView.controlId);
CourseControl courseControl = controlView.courseControlIds[0].IsNone ? null : eventDB.GetCourseControl(controlView.courseControlIds[0]);
// CONSIDER: this might need to be updated for relay or split controls.
ControlPoint controlPrev = (iLine > 0) ? eventDB.GetControl(courseView.ControlViews[iLine - 1].controlId) : null;
ControlPoint controlNext = (iLine < courseView.ControlViews.Count - 1) ? eventDB.GetControl(courseView.ControlViews[iLine + 1].controlId) : null;
//Id<CourseControl> courseControlIdNext = (iLine < courseView.ControlViews.Count - 1) ? courseView.ControlViews[iLine + 1].courseControlId : Id<CourseControl>.None;
//CourseControl courseControlNext = courseControlIdNext.IsNotNone ? eventDB.GetCourseControl(coruseControlIdNext) : null;
// Do the control.control
if (FilterControl(kind, control, controlPrev, controlNext))
{
// Text associated with the course or course control (before)
AddTextLine(list, control.descTextBefore, controlView.courseControlIds[0], controlView.controlId, DescriptionLine.TextLineKind.BeforeControl);
if (courseControl != null)
AddTextLine(list, courseControl.descTextBefore, controlView.courseControlIds[0], controlView.controlId, DescriptionLine.TextLineKind.BeforeCourseControl);
// The control itself.
if (control.kind == ControlPointKind.Finish ||
control.kind == ControlPointKind.CrossingPoint)
{
line = GetDirectiveLine(kind, controlView, iLine > 0 ? courseView.ControlViews[iLine - 1] : null);
}
else {
line = GetRegularLine(kind, scoreColumn, controlView, descriptionKey);
}
Debug.Assert(line != null);
list.Add(line);
// Text associated with the course or course control (after)
if (courseControl != null)
AddTextLine(list, courseControl.descTextAfter, controlView.courseControlIds[0], controlView.controlId, DescriptionLine.TextLineKind.AfterCourseControl);
AddTextLine(list, control.descTextAfter, controlView.courseControlIds[0], controlView.controlId, DescriptionLine.TextLineKind.AfterControl);
}
// Add any map exchange lines.
if (courseView.Kind == CourseView.CourseViewKind.Normal || courseView.Kind == CourseView.CourseViewKind.AllVariations) {
if (controlNext != null && controlNext.kind == ControlPointKind.MapExchange) {
line = GetMapExchangeLine(controlView, courseView.ControlViews[controlView.legTo[0]]);
list.Add(line);
}
else if (courseControl != null && courseControl.exchange && control.kind != ControlPointKind.MapExchange && controlPrev != null) {
line = GetMapExchangeAtControlLine(controlView);
list.Add(line);
}
}
// Do the leg (if any).
if (controlView.legTo != null && controlView.legTo.Length > 0) {
Id<Leg> legId = controlView.legId[0];
Leg leg = (legId.IsNotNone) ? eventDB.GetLeg(legId) : null;
if (FilterLeg(kind, control, controlNext, leg)) {
line = GetMarkedRouteLine(controlView, courseView.ControlViews[controlView.legTo[0]], legId);
Debug.Assert(line != null);
list.Add(line);
}
}
}
// Add the key if desired.
if (createKey) {
foreach (string symbolId in descriptionKey.Keys) {
line = new DescriptionLine();
line.kind = DescriptionLineKind.Key;
line.boxes = new object[2];
line.boxes[0] = symbolDB[symbolId];
line.boxes[1] = descriptionKey[symbolId];
list.Add(line);
}
}
// And we're done!
return list.ToArray();
}