package de.saring.sportstracker.gui.dialogs;
import java.time.LocalDate;
import de.saring.sportstracker.data.EntryFilter;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import de.saring.sportstracker.data.Equipment;
import de.saring.sportstracker.data.Exercise;
import de.saring.sportstracker.data.SportSubType;
import de.saring.sportstracker.data.SportType;
import de.saring.util.StringUtils;
/**
* This ViewModel class provides JavaFX properties of all EntryFilter attributes to be edited in the
* Filter dialog. So they can be bound to the appropriate dialog view controls.
*
* @author Stefan Saring
*/
public class FilterViewModel {
public final ObjectProperty<LocalDate> dateStart;
public final ObjectProperty<LocalDate> dateEnd;
public final ObjectProperty<EntryFilter.EntryType> entryType;
public final ObjectProperty<SportType> sportType;
public final ObjectProperty<SportSubType> sportSubtype;
public final ObjectProperty<IntensityItem> intensity;
public final ObjectProperty<Equipment> equipment;
public final StringProperty commentSubString;
public final BooleanProperty regularExpressionMode;
public final BooleanProperty entryTypeSelectable;
/**
* Creates the FilterViewModel with JavaFX properties for the passed EntryFilter object.
*
* @param entryFilter filter to be edited
* @param entryTypeSelectable flag whether the filter entry type can be selected or not
*/
public FilterViewModel(final EntryFilter entryFilter, final boolean entryTypeSelectable) {
dateStart = new SimpleObjectProperty<>(entryFilter.getDateStart());
dateEnd = new SimpleObjectProperty<>(entryFilter.getDateEnd());
entryType = new SimpleObjectProperty<>(entryFilter.getEntryType());
sportType = new SimpleObjectProperty<>(entryFilter.getSportType());
sportSubtype = new SimpleObjectProperty<>(entryFilter.getSportSubType());
intensity = new SimpleObjectProperty<>(new IntensityItem(entryFilter.getIntensity()));
equipment = new SimpleObjectProperty<>(entryFilter.getEquipment());
commentSubString = new SimpleStringProperty(StringUtils.getTextOrEmptyString(
entryFilter.getCommentSubString()));
regularExpressionMode = new SimpleBooleanProperty(entryFilter.isRegularExpressionMode());
this.entryTypeSelectable = new SimpleBooleanProperty(entryTypeSelectable);
}
/**
* Creates a new EntryFilter domain object from the edited JavaFX properties.
*
* @return EntryFilter
*/
public EntryFilter getExerciseFilter() {
final EntryFilter entryFilter = new EntryFilter();
entryFilter.setDateStart(dateStart.get());
entryFilter.setDateEnd(dateEnd.get());
entryFilter.setEntryType(entryType.get());
entryFilter.setSportType(sportType.get());
entryFilter.setSportSubType(sportSubtype.get());
entryFilter.setIntensity(intensity.get().intensityType);
entryFilter.setEquipment(equipment.get());
entryFilter.setCommentSubString(StringUtils.getTrimmedTextOrNull(commentSubString.get()));
entryFilter.setRegularExpressionMode(regularExpressionMode.get());
return entryFilter;
}
/**
* Wrapper class for choicebox items for intensity type selection in the filter dialog. The choicebox
* can't contain IntensityType items, because the selection "all" is not available in the IntensityType
* enumeration.
*/
public static class IntensityItem {
/** The wrapped intensity type. The value null means "all intensities. */
public final Exercise.IntensityType intensityType;
/**
* Standard c'tor.
*
* @param intensityType intensity
*/
public IntensityItem(final Exercise.IntensityType intensityType) {
this.intensityType = intensityType;
}
@Override
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
final IntensityItem that = (IntensityItem) o;
if (intensityType != that.intensityType) {
return false;
}
return true;
}
@Override
public int hashCode() {
return intensityType != null ? intensityType.hashCode() : 0;
}
}
}