package de.saring.sportstracker.gui.views.calendarview; import java.time.LocalDate; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import de.saring.sportstracker.data.Exercise; import de.saring.sportstracker.data.Note; import de.saring.sportstracker.data.Weight; import de.saring.sportstracker.gui.STContext; import de.saring.sportstracker.gui.STDocument; import de.saring.util.AppResources; import de.saring.util.StringUtils; import de.saring.util.gui.javafx.control.calendar.CalendarEntry; import de.saring.util.gui.javafx.control.calendar.CalendarDataProvider; import de.saring.util.unitcalc.FormatUtils; /** * Provides the note, weight and exercise entries to be shown in the calendar. * * @author Stefan Saring */ public class CalendarDataProviderImpl implements CalendarDataProvider { private final STContext context; private final STDocument document; /** * Standard c'tor for dependency injection. * * @param context the SportsTracker UI context * @param document the SportsTracker document / model */ public CalendarDataProviderImpl(final STContext context, final STDocument document) { this.context = context; this.document = document; } /** * Provides the note, weight and exercise entries to be shown in the calendar for the specified date. * * @param date date * @return list of calendar entries */ @Override public List<CalendarEntry> getCalendarEntriesForDate(final LocalDate date) { final List<Note> notes = document.getFilterableNoteList().getEntriesInDateRange(date, date); final List<CalendarEntry> calendarEntries = notes.stream() // .map(note -> createCalendarEntryForNote(note)) // .collect(Collectors.toList()); final List<Weight> weights = document.getFilterableWeightList().getEntriesInDateRange(date, date); calendarEntries.addAll(weights.stream() // .map(weight -> createCalendarEntryForWeight(weight)) // .collect(Collectors.toList())); final List<Exercise> exercises = document.getFilterableExerciseList().getEntriesInDateRange(date, date); calendarEntries.addAll(exercises.stream() // .map(exercise -> createCalendarEntryForExercise(exercise)) // .collect(Collectors.toList())); return calendarEntries; } @Override public List<String> getSummaryForDateRange(final LocalDate dateStart, final LocalDate dateEnd) { final List<String> summaryLines = new ArrayList<>(); // calculate summary distance and duration for all exercises in range final List<Exercise> exersisesInRange = document.getFilterableExerciseList().getEntriesInDateRange( // dateStart, dateEnd); if (exersisesInRange.size() > 0) { float summaryDistance = 0; int summaryDuration = 0; for (Exercise exercise : exersisesInRange) { summaryDistance += exercise.getDistance(); summaryDuration += exercise.getDuration(); } // add formatted distance and duration strings final FormatUtils formatUtils = context.getFormatUtils(); summaryLines.add(formatUtils.distanceToString(summaryDistance, 2)); summaryLines.add(formatUtils.seconds2TimeString(summaryDuration)); } return summaryLines; } private CalendarEntry createCalendarEntryForNote(final Note note) { final StringBuilder sbText = new StringBuilder(); sbText.append(context.getResources().getString("st.calview.note_short")) // .append(" ") // .append(StringUtils.getFirstLineOfText(note.getComment())); return new CalendarEntry(note, sbText.toString(), note.getComment(), null); } private CalendarEntry createCalendarEntryForWeight(final Weight weight) { final String strWeightValue = context.getFormatUtils().weightToString(weight.getValue(), 2); final StringBuilder sbText = new StringBuilder(); sbText.append(context.getResources().getString("st.calview.weight_short")) // .append(" ") // .append(strWeightValue); final StringBuilder sbToolTip = new StringBuilder(); sbToolTip.append(context.getResources().getString("st.calview.weight_tooltip.weight")) // .append(" ") // .append(strWeightValue); return new CalendarEntry(weight, sbText.toString(), sbToolTip.toString(), null); } private CalendarEntry createCalendarEntryForExercise(final Exercise exercise) { final AppResources resources = context.getResources(); final FormatUtils formatUtils = context.getFormatUtils(); final StringBuilder sbText = new StringBuilder(); sbText.append(exercise.getSportType().getName().charAt(0)).append(": "); if (exercise.getSportType().isRecordDistance()) { sbText.append(formatUtils.distanceToString(exercise.getDistance(), 2)).append(", "); } sbText.append(formatUtils.minutes2TimeString(exercise.getDuration() / 60)); final StringBuilder sbToolTip = new StringBuilder(); sbToolTip.append(resources.getString("st.calview.exe_tooltip.sport_type")) // .append(" ").append(exercise.getSportType().getName()) // .append(" (").append(exercise.getSportSubType().getName()).append(")\n"); if (exercise.getSportType().isRecordDistance()) { sbToolTip.append(resources.getString("st.calview.exe_tooltip.distance")) // .append(" ").append(formatUtils.distanceToString(exercise.getDistance(), 2)).append("\n"); sbToolTip.append(resources.getString("st.calview.exe_tooltip.avg_speed")) // .append(" ").append(formatUtils.speedToString(exercise.getAvgSpeed(), 2)).append("\n"); } sbToolTip.append(resources.getString("st.calview.exe_tooltip.duration")) // .append(" ").append(formatUtils.seconds2TimeString(exercise.getDuration())); return new CalendarEntry(exercise, sbText.toString(), sbToolTip.toString(), exercise.getSportType().getColor()); } }