private static IList <IItemTrackSelectionInfo> SetAndAdjustFromSelection (IList <IItemTrackSelectionInfo> selected, IEnumerable <IActivity> activities, bool fromST) { if (selected == null || selected.Count == 0 || activities == null) { //Do not adjust selection return(selected); } bool singleSelection = selected.Count == 0 || selected.Count == 1 && !( selected[0].MarkedDistances != null && selected[0].MarkedDistances.Count > 1 || selected[0].MarkedTimes != null && selected[0].MarkedTimes.Count > 1); IList <IItemTrackSelectionInfo> results = new List <IItemTrackSelectionInfo>(); foreach (IItemTrackSelectionInfo sel in selected) { IActivity activity = null; if (sel is TrailsItemTrackSelectionInfo) { activity = ((TrailsItemTrackSelectionInfo)sel).Activity; } else { if (activities == null) { if (UnitUtil.GetApplication() == null || UnitUtil.GetApplication().Logbook == null) { activities = new List <IActivity>(); } else { activities = UnitUtil.GetApplication().Logbook.Activities; } } foreach (IActivity a in activities) { //In ST3.0.4068 (at least) only one activity is selected if (a != null && sel.ItemReferenceId == a.ReferenceId) { activity = a; break; } } } if (activity != null) { //The distance is in unstopped/unpaused format IDistanceDataTrack activityUnpausedDistanceMetersTrack = ActivityInfoCache.Instance.GetInfo(activity).ActualDistanceMetersTrack; TrailsItemTrackSelectionInfo tmpSel = new TrailsItemTrackSelectionInfo(); tmpSel.SetFromSelection(sel, activity); if (fromST) { //Set MarkedTimes (or SelectedTime), used internally. No need to clear "unused" if (sel.MarkedDistances != null && sel.MarkedDistances.Count > 0 && (sel.MarkedTimes == null || sel.MarkedTimes.Count == 0)) { try { foreach (ValueRange <double> t in sel.MarkedDistances) { DateTime d1 = activityUnpausedDistanceMetersTrack.GetTimeAtDistanceMeters(t.Lower); DateTime d2 = activityUnpausedDistanceMetersTrack.GetTimeAtDistanceMeters(t.Upper); AddMarkedOrSelectedTime(tmpSel, singleSelection, d1, d2); } tmpSel.MarkedDistances = null; } catch { } } if (sel.SelectedTime != null && sel.MarkedTimes == null) { try { AddMarkedOrSelectedTime(tmpSel, singleSelection, sel.SelectedTime.Lower, sel.SelectedTime.Upper); //tmpSel.SelectedTime = null; } catch { } } if (sel.SelectedDistance != null && sel.MarkedTimes == null) { tmpSel.MarkedTimes = new ValueRangeSeries <DateTime>(); try { DateTime d1 = activityUnpausedDistanceMetersTrack.GetTimeAtDistanceMeters(sel.SelectedDistance.Lower); DateTime d2 = activityUnpausedDistanceMetersTrack.GetTimeAtDistanceMeters(sel.SelectedDistance.Upper); AddMarkedOrSelectedTime(tmpSel, singleSelection, d1, d2); tmpSel.SelectedDistance = null; } catch { } } } else { //To ST //The standard in the plugin(time) to standard in ST core and omb's Track Coloring (unpaused distance) if (sel.MarkedDistances == null && sel.MarkedTimes != null && sel.MarkedTimes.Count > 0) { try { tmpSel.MarkedDistances = new ValueRangeSeries <double>(); foreach (ValueRange <DateTime> t in sel.MarkedTimes) { //If real time differs with a couple of seconds, use that const int maxTimeDiff = 2; DateTime start = t.Lower; if (start < activityUnpausedDistanceMetersTrack.StartTime && start > activityUnpausedDistanceMetersTrack.StartTime - TimeSpan.FromSeconds(maxTimeDiff)) { start = activityUnpausedDistanceMetersTrack.StartTime; } DateTime end = t.Upper; if (end > activityUnpausedDistanceMetersTrack.StartTime + TimeSpan.FromSeconds(activityUnpausedDistanceMetersTrack.TotalElapsedSeconds) && end < activityUnpausedDistanceMetersTrack.StartTime + TimeSpan.FromSeconds(activityUnpausedDistanceMetersTrack.TotalElapsedSeconds - maxTimeDiff)) { end = activityUnpausedDistanceMetersTrack.StartTime + TimeSpan.FromSeconds(activityUnpausedDistanceMetersTrack.TotalElapsedSeconds); } double d1 = activityUnpausedDistanceMetersTrack.GetInterpolatedValue(start).Value; double d2 = activityUnpausedDistanceMetersTrack.GetInterpolatedValue(end).Value; AddMarkedOrSelectedDistance(tmpSel, singleSelection, d1, d2); } tmpSel.MarkedTimes = null; } catch { } } if (sel.SelectedDistance == null && sel.SelectedTime != null) { try { tmpSel.SelectedDistance = new ValueRange <double>( activityUnpausedDistanceMetersTrack.GetInterpolatedValue(sel.SelectedTime.Lower).Value, activityUnpausedDistanceMetersTrack.GetInterpolatedValue(sel.SelectedTime.Upper).Value); tmpSel.SelectedTime = null; } catch { } } } results.Add(tmpSel); } } return(results); }
private static IList<IItemTrackSelectionInfo> SetAndAdjustFromSelection (IList<IItemTrackSelectionInfo> selected, IEnumerable<IActivity> activities, bool fromST) { if (selected == null || selected.Count == 0 || activities == null) { //Do not adjust selection return selected; } bool singleSelection = selected.Count == 0 || selected.Count == 1 && ! ( selected[0].MarkedDistances != null && selected[0].MarkedDistances.Count > 1 || selected[0].MarkedTimes != null && selected[0].MarkedTimes.Count > 1); IList<IItemTrackSelectionInfo> results = new List<IItemTrackSelectionInfo>(); foreach (IItemTrackSelectionInfo sel in selected) { IActivity activity = null; if (sel is TrailsItemTrackSelectionInfo) { activity = ((TrailsItemTrackSelectionInfo)sel).Activity; } else { if (activities == null) { activities = UnitUtil.GetApplication().Logbook.Activities; } foreach (IActivity a in activities) { //In ST3.0.4068 (at least) only one activity is selected if (a != null && sel.ItemReferenceId == a.ReferenceId) { activity = a; break; } } } if (activity != null) { //The distance is in unstopped/unpaused format IDistanceDataTrack activityUnpausedDistanceMetersTrack = ActivityInfoCache.Instance.GetInfo(activity).ActualDistanceMetersTrack; TrailsItemTrackSelectionInfo tmpSel = new TrailsItemTrackSelectionInfo(); tmpSel.SetFromSelection(sel, activity); if (fromST) { //Set MarkedTimes (or SelectedTime), used internally. No need to clear "unused" if (sel.MarkedDistances != null && sel.MarkedDistances.Count > 0 && (sel.MarkedTimes == null || sel.MarkedTimes.Count == 0)) { try { foreach (ValueRange<double> t in sel.MarkedDistances) { DateTime d1 = activityUnpausedDistanceMetersTrack.GetTimeAtDistanceMeters(t.Lower); DateTime d2 = activityUnpausedDistanceMetersTrack.GetTimeAtDistanceMeters(t.Upper); AddMarkedOrSelectedTime(tmpSel, singleSelection, d1, d2); } tmpSel.MarkedDistances = null; } catch { } } if (sel.SelectedTime != null && sel.MarkedTimes == null) { try { AddMarkedOrSelectedTime(tmpSel, singleSelection, sel.SelectedTime.Lower, sel.SelectedTime.Upper); tmpSel.SelectedTime = null; } catch { } } if (sel.SelectedDistance != null && sel.MarkedTimes == null) { tmpSel.MarkedTimes = new ValueRangeSeries<DateTime>(); try { DateTime d1 = activityUnpausedDistanceMetersTrack.GetTimeAtDistanceMeters(sel.SelectedDistance.Lower); DateTime d2 = activityUnpausedDistanceMetersTrack.GetTimeAtDistanceMeters(sel.SelectedDistance.Upper); AddMarkedOrSelectedTime(tmpSel, singleSelection, d1, d2); tmpSel.SelectedDistance = null; } catch { } } } else { //To ST //The standard in the plugin(time) to standard in ST core and omb's Track Coloring (unpaused distance) if (sel.MarkedDistances == null && sel.MarkedTimes != null && sel.MarkedTimes.Count > 0) { try { tmpSel.MarkedDistances = new ValueRangeSeries<double>(); foreach (ValueRange<DateTime> t in sel.MarkedTimes) { double d1 = activityUnpausedDistanceMetersTrack.GetInterpolatedValue(t.Lower).Value; double d2 = activityUnpausedDistanceMetersTrack.GetInterpolatedValue(t.Upper).Value; AddMarkedOrSelectedDistance(tmpSel, singleSelection, d1, d2); } tmpSel.MarkedTimes = null; } catch { } } if (sel.SelectedDistance == null && sel.SelectedTime != null) { try { tmpSel.SelectedDistance = new ValueRange<double>( activityUnpausedDistanceMetersTrack.GetInterpolatedValue(sel.SelectedTime.Lower).Value, activityUnpausedDistanceMetersTrack.GetInterpolatedValue(sel.SelectedTime.Upper).Value); tmpSel.SelectedTime = null; } catch { } } } results.Add(tmpSel); } } return results; }