/// <summary> /// Draws the HistoryViewItem, rendering it to the Canvas. /// </summary> /// <param name="next">The next chronological HistoryViewItem.</param> /// <param name="currentEvent">The current event in the machine's history.</param> public void Draw(HistoryViewItem next, HistoryEvent currentEvent) { for (int t = 0; t < Events.Count; t++) { Draw(Events[t], t, next, currentEvent); } }
/// <summary> /// Draws a given history event at the given position. /// </summary> /// <param name="historyEvent">The history event to draw.</param> /// <param name="x">The position at which to draw the event.</param> /// <param name="next">The next chronological HistoryViewItem.</param> /// <param name="currentEvent">The current event in the machine's history.</param> private void Draw(HistoryEvent historyEvent, int x, HistoryViewItem next, HistoryEvent currentEvent) { if (historyEvent == null) { return; } // Calculate the "centre" of the cell at position x. double cx = x + 0.5; double cy = 0.5; // If the history event isn't "ours", then draw it as a "passthrough" line. bool passthrough = (HistoryEvent != historyEvent); if (historyEvent.Parent != null) { // Draw a line from our parent. DrawLine(cx, 1, cx, cy, Brushes.DarkBlue); } BookmarkHistoryEvent bookmarkHistoryEvent = historyEvent as BookmarkHistoryEvent; if (bookmarkHistoryEvent != null && bookmarkHistoryEvent.Bookmark != null && !passthrough) { // User bookmarks are drawn as a red dot, system bookmarks as dark red. DrawDot(cx, bookmarkHistoryEvent.Bookmark.System ? Brushes.DarkRed : Brushes.Crimson, historyEvent != currentEvent); } if (passthrough) { // A "passthrough" event is drawn as a straight line. int childNextX = next.EventIndex(historyEvent); if (childNextX != -1) { DrawLine(cx, cy, childNextX + 0.5, 0, Brushes.DarkBlue); } } else if (next != null && historyEvent.Children.Count >= 1) { // For history events with children, draw a line from the centre of the cell to each child for (int c = 0; c < historyEvent.Children.Count; c++) { int childNextX = next.EventAncestorIndex(historyEvent.Children[c]); if (childNextX != -1) { DrawLine(cx, cy, childNextX + 0.5, 0, Brushes.DarkBlue); } } } else { // History events with no children are drawn as a terminating dot. DrawDot(cx, (bookmarkHistoryEvent != null) ? (bookmarkHistoryEvent.Bookmark.System ? Brushes.DarkRed : Brushes.Crimson) : Brushes.DarkBlue, historyEvent != currentEvent); } }