public override void LeftButtonDrag(Pane pane, PointF location, PointF locationStart, float pixelSize, ref bool displayUpdateNeeded) { Debug.Assert(pane == Pane.Map); // Get the new set of gaps. LegGap[] newGaps = LegGap.AddGap(courseObjStart.path, courseObjStart.gaps, startDrag, location); // Put the new gaps into the highlight. courseObjDrag = new LegCourseObj(courseObjStart.controlId, courseObjStart.courseControlId, courseObjStart.courseControlId2, courseObjStart.scaleRatio, courseObjStart.appearance, courseObjStart.path, newGaps); displayUpdateNeeded = true; }
// Create the objects associated with the leg from controlView1 to controlView2. Could be multiple because // a leg may be partly flagged, and so forth. Gaps do not create separate course objects. private static CourseObj[] CreateLeg(EventDB eventDB, float scaleRatio, CourseAppearance appearance, Id<CourseControl> courseControlId1, CourseView.ControlView controlView1, CourseView.ControlView controlView2, Id<Leg> legId) { ControlPoint control1 = eventDB.GetControl(controlView1.controlId); ControlPoint control2 = eventDB.GetControl(controlView2.controlId); Leg leg = (legId.IsNotNone) ? eventDB.GetLeg(legId) : null; List<SymPath> paths = new List<SymPath>(); // paths for each segment of the leg. List<LegGap[]> gapsList = new List<LegGap[]>(); // gaps for each segment of the leg. List<bool> isFlagged = new List<bool>(); // indicates if each segment is flagged or not. LegGap[] gaps; // What kind of gaps are present? Null array if none // Get the path of the line, and the gaps. SymPath legPath = GetLegPath(eventDB, control1.location, controlView1.hiddenControl ? ControlPointKind.None : control1.kind, controlView1.controlId, control2.location, controlView2.hiddenControl ? ControlPointKind.None : control2.kind, controlView2.controlId, scaleRatio, appearance, out gaps); if (legPath == null) return null; // What kind of flagging does this leg have (none/full/begin/end)? FlaggingKind flagging = QueryEvent.GetLegFlagging(eventDB, controlView1.controlId, controlView2.controlId, legId); // Based on flagging kind, set up the paths/isFlagged lists. Add in gaps as part of it. if (flagging == FlaggingKind.Begin || flagging == FlaggingKind.End) { // Flagging is partial. We need to split the path into two. SymPath beginPath, endPath; legPath.Split(leg.flagStartStop, out beginPath, out endPath); paths.Add(beginPath); gapsList.Add(gaps); isFlagged.Add(flagging == FlaggingKind.Begin); // Update gaps for the end part. if (gaps != null) { gaps = (LegGap[]) gaps.Clone(); for (int i = 0; i < gaps.Length; ++i) gaps[i].distanceFromStart -= beginPath.Length; } paths.Add(endPath); gapsList.Add(gaps); isFlagged.Add(flagging == FlaggingKind.End); } else { // flagging is not partial. A single path is OK. paths.Add(legPath); gapsList.Add(gaps); isFlagged.Add(flagging == FlaggingKind.All); } // Create course objects for this leg from the paths/isFlagged lists. CourseObj[] objs = new CourseObj[paths.Count]; for (int i = 0; i < paths.Count; ++i) { if (isFlagged[i]) objs[i] = new FlaggedLegCourseObj(controlView1.controlId, courseControlId1, controlView2.courseControlIds[0], scaleRatio, appearance, paths[i], gapsList[i]); else objs[i] = new LegCourseObj(controlView1.controlId, courseControlId1, controlView2.courseControlIds[0], scaleRatio, appearance, paths[i], gapsList[i]); } return objs; }
public AddLegGapMode(Controller controller, LegCourseObj courseObject) { this.controller = controller; this.courseObjStart = courseObject; this.courseObjDrag = (LegCourseObj) courseObject.Clone(); }