PurplePen.DescriptionFormatter.CreateDescription C# (CSharp) Method

CreateDescription() public method

public CreateDescription ( bool createKey ) : PurplePen.DescriptionLine[]
createKey bool
return PurplePen.DescriptionLine[]
        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();
        }

Usage Example

コード例 #1
0
        // Get a description renderer for rendering the description from a course view.
        private DescriptionRenderer GetRenderer(CourseView courseView)
        {
            DescriptionFormatter descFormatter = new DescriptionFormatter(courseView, symbolDB, DescriptionFormatter.Purpose.ForPrinting);
            DescriptionKind      descKind      = GetDescriptionKind(courseView);

            DescriptionLine[]   description = descFormatter.CreateDescription(descKind == DescriptionKind.Symbols);
            DescriptionRenderer renderer    = new DescriptionRenderer(symbolDB);

            renderer.CellSize        = descPrintSettings.BoxSize / 0.254F;
            renderer.Description     = description;
            renderer.DescriptionKind = descKind;
            renderer.Margin          = 0;

            return(renderer);
        }
All Usage Examples Of PurplePen.DescriptionFormatter::CreateDescription