/// <summary>
 /// Update the display models with all trains in the document.
 /// </summary>
 public void UpdateTrainDisplays()
 {
     DownTrainsDisplay.TrainSegments.Clear();
     DownTrainsDisplay.CleanLocations();
     UpTrainsDisplay.TrainSegments.Clear();
     UpTrainsDisplay.CleanLocations();
     foreach (var train in TrainList)
     {
         ProcessTrain(train);
     }
 }
 private void TrainRemoveHandler(object sender, TrainEventArgs e)
 {
     if (DownTrainsDisplay.TrainSegments.RemoveAll(s => s.TrainId == e.Train.Id) > 0)
     {
         DownTrainsDisplay.CleanLocations();
     }
     if (UpTrainsDisplay.TrainSegments.RemoveAll(s => s.TrainId == e.Train.Id) > 0)
     {
         UpTrainsDisplay.CleanLocations();
     }
     OnTimetableDocumentChanged();
 }
        private void ProcessTrain(Train train)
        {
            Log.Trace(CultureInfo.CurrentCulture, Resources.LogMessage_ProcessTrain, train.Id);

            TrainSegmentModel currentSegment = new TrainSegmentModel(train, null);

            SetToWorkCellValue(currentSegment.ToWorkCell);
            SetToWorkCellValue(currentSegment.LocoToWorkCell);

            Direction?currentDirection = null;

            currentSegment.PageFootnotes.AddRange(GetFootnotesForTimingPoint(train.TrainTimes[0]));
            if (!string.IsNullOrWhiteSpace(train.TrainTimes[0].Path))
            {
                LocationEntryModel lem = new LocationEntryModel
                {
                    DisplayedText = train.TrainTimes[0].Path,
                    EntryType     = TrainLocationTimeEntryType.RoutingCode,
                    LocationId    = train.TrainTimes[0].Location.Id,
                    LocationKey   = train.TrainTimes[0].Location.Id + LocationIdSuffixes.Path,
                };
                currentSegment.Timings.Add(lem);
                currentSegment.TimingsIndex.Add(lem.LocationKey, lem);
            }
            if (train.TrainTimes[0].ArrivalTime?.Time != null)
            {
                var timeModel = train.TrainTimes[0].ArrivalTimeModel;
                currentSegment.Timings.Add(timeModel);
                currentSegment.TimingsIndex.Add(train.TrainTimes[0].Location.Id + LocationIdSuffixes.Arrival, timeModel);
            }
            if (!string.IsNullOrWhiteSpace(train.TrainTimes[0].Platform))
            {
                LocationEntryModel lem = new LocationEntryModel
                {
                    DisplayedText = train.TrainTimes[0].Platform,
                    EntryType     = TrainLocationTimeEntryType.RoutingCode,
                    LocationId    = train.TrainTimes[0].Location.Id,
                    LocationKey   = train.TrainTimes[0].Location.Id + LocationIdSuffixes.Platform,
                };
                currentSegment.Timings.Add(lem);
                currentSegment.TimingsIndex.Add(lem.LocationKey, lem);
            }
            if (train.TrainTimes[0].DepartureTime?.Time != null)
            {
                var timeModel = train.TrainTimes[0].DepartureTimeModel;
                currentSegment.Timings.Add(timeModel);
                currentSegment.TimingsIndex.Add(train.TrainTimes[0].Location.Id + LocationIdSuffixes.Departure, timeModel);
            }
            if (!string.IsNullOrWhiteSpace(train.TrainTimes[0].Line))
            {
                LocationEntryModel lem = new LocationEntryModel
                {
                    DisplayedText = train.TrainTimes[0].Line,
                    EntryType     = TrainLocationTimeEntryType.RoutingCode,
                    LocationId    = train.TrainTimes[0].Location.Id,
                    LocationKey   = train.TrainTimes[0].Location.Id + LocationIdSuffixes.Line,
                };
                currentSegment.Timings.Add(lem);
                currentSegment.TimingsIndex.Add(lem.LocationKey, lem);
            }
            for (int i = 1; i < train.TrainTimes.Count; ++i)
            {
                Direction newDirection = train.TrainTimes[i].Location > train.TrainTimes[i - 1].Location ? Direction.Down : Direction.Up;
                if (currentDirection == null)
                {
                    currentDirection = newDirection;
                }
                else if (currentDirection != newDirection)
                {
                    if (currentDirection == Direction.Down)
                    {
                        DownTrainsDisplay.Add(currentSegment);
                    }
                    else
                    {
                        UpTrainsDisplay.Add(currentSegment);
                    }
                    currentSegment   = new TrainSegmentModel(train, null);
                    currentDirection = newDirection;
                }
                currentSegment.PageFootnotes.AddRange(GetFootnotesForTimingPoint(train.TrainTimes[i]));
                if (!string.IsNullOrWhiteSpace(train.TrainTimes[i].Path))
                {
                    LocationEntryModel lem = new LocationEntryModel
                    {
                        DisplayedText = train.TrainTimes[i].Path,
                        EntryType     = TrainLocationTimeEntryType.RoutingCode,
                        LocationId    = train.TrainTimes[i].Location.Id,
                        LocationKey   = train.TrainTimes[i].Location.Id + LocationIdSuffixes.Path,
                    };
                    currentSegment.Timings.Add(lem);
                    currentSegment.TimingsIndex.Add(lem.LocationKey, lem);
                }
                if (train.TrainTimes[i].ArrivalTime?.Time != null)
                {
                    var timeModel = train.TrainTimes[i].ArrivalTimeModel;
                    currentSegment.Timings.Add(timeModel);
                    currentSegment.TimingsIndex.Add(train.TrainTimes[i].Location.Id + LocationIdSuffixes.Arrival, timeModel);
                }
                if (!string.IsNullOrWhiteSpace(train.TrainTimes[i].Platform))
                {
                    LocationEntryModel lem = new LocationEntryModel
                    {
                        DisplayedText = train.TrainTimes[i].Platform,
                        EntryType     = TrainLocationTimeEntryType.RoutingCode,
                        LocationId    = train.TrainTimes[i].Location.Id,
                        LocationKey   = train.TrainTimes[i].Location.Id + LocationIdSuffixes.Platform,
                    };
                    currentSegment.Timings.Add(lem);
                    currentSegment.TimingsIndex.Add(lem.LocationKey, lem);
                }
                if (train.TrainTimes[i].DepartureTime?.Time != null)
                {
                    var timeModel = train.TrainTimes[i].DepartureTimeModel;
                    currentSegment.Timings.Add(timeModel);
                    currentSegment.TimingsIndex.Add(train.TrainTimes[i].Location.Id + LocationIdSuffixes.Departure, timeModel);
                }
                if (!string.IsNullOrWhiteSpace(train.TrainTimes[i].Line))
                {
                    LocationEntryModel lem = new LocationEntryModel
                    {
                        DisplayedText = train.TrainTimes[i].Line,
                        EntryType     = TrainLocationTimeEntryType.RoutingCode,
                        LocationId    = train.TrainTimes[i].Location.Id,
                        LocationKey   = train.TrainTimes[i].Location.Id + LocationIdSuffixes.Line,
                    };
                    currentSegment.Timings.Add(lem);
                    currentSegment.TimingsIndex.Add(lem.LocationKey, lem);
                }
            }
            if (currentDirection == Direction.Down)
            {
                DownTrainsDisplay.Add(currentSegment);
            }
            else
            {
                UpTrainsDisplay.Add(currentSegment);
            }
        }