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;
        }