19 package org.sleuthkit.autopsy.timeline.zooming;
21 import java.lang.reflect.InvocationTargetException;
22 import java.util.function.Function;
23 import java.util.logging.Level;
24 import javafx.application.Platform;
25 import javafx.beans.InvalidationListener;
26 import javafx.beans.binding.BooleanBinding;
27 import javafx.beans.property.ReadOnlyObjectProperty;
28 import javafx.fxml.FXML;
29 import javafx.scene.control.Label;
30 import javafx.scene.control.Slider;
31 import javafx.scene.control.TitledPane;
32 import javafx.util.StringConverter;
33 import org.controlsfx.control.Notifications;
34 import org.openide.util.NbBundle;
88 "ZoomSettingsPane.descrLODLabel.text=Description Detail:",
89 "ZoomSettingsPane.typeZoomLabel.text=Event Type:",
90 "ZoomSettingsPane.timeUnitLabel.text=Time Units:",
91 "ZoomSettingsPane.zoomLabel.text=Zoom"})
93 zoomLabel.setText(Bundle.ZoomSettingsPane_zoomLabel_text());
95 typeZoomSlider.setMin(1);
96 typeZoomSlider.setMax(TimelineEventType.TypeLevel.values().length - 1);
97 configureSliderListeners(typeZoomSlider,
98 controller::pushEventTypeZoom,
100 TimelineEventType.TypeLevel.class,
101 TimelineEventType.TypeLevel::ordinal,
102 Function.identity());
103 typeZoomLabel.setText(Bundle.ZoomSettingsPane_typeZoomLabel_text());
105 descrLODSlider.setMax(TimelineEvent.DescriptionLevel.values().length - 1);
106 configureSliderListeners(descrLODSlider,
107 controller::pushDescrLOD,
109 TimelineEvent.DescriptionLevel.class,
110 TimelineEvent.DescriptionLevel::ordinal,
111 Function.identity());
112 descrLODLabel.setText(Bundle.ZoomSettingsPane_descrLODLabel_text());
123 timeUnitSlider.setMax(
TimeUnits.values().length - 2);
124 configureSliderListeners(timeUnitSlider,
125 controller::pushTimeUnit,
131 timeUnitLabel.setText(Bundle.ZoomSettingsPane_timeUnitLabel_text());
135 visibleProperty().bind(notListMode);
136 managedProperty().bind(notListMode);
177 @NbBundle.Messages({
"ZoomSettingsPane.sliderChange.errorText=Error responding to slider value change."})
179 private <DriverType, EnumType extends Enum<EnumType>>
void configureSliderListeners(
181 CheckedConsumer<EnumType> sliderValueConsumer,
182 ReadOnlyObjectProperty<DriverType> modelProperty,
183 Class<EnumType> enumClass,
184 Function<DriverType, Integer> driverValueMapper,
185 Function<Integer, Integer> labelIndexMapper) {
188 slider.setLabelFormatter(
new EnumSliderLabelFormatter<>(enumClass, labelIndexMapper));
191 final InvalidationListener sliderListener = observable -> {
193 if (slider.isValueChanging() ==
false) {
195 EnumType sliderValueAsEnum = enumClass.getEnumConstants()[Math.round((
float) slider.getValue())];
197 sliderValueConsumer.accept(sliderValueAsEnum);
198 }
catch (TskCoreException exception) {
199 logger.log(Level.SEVERE,
"Error responding to slider value change.", exception);
200 Notifications.create().owner(getScene().getWindow())
201 .text(Bundle.ZoomSettingsPane_sliderChange_errorText())
207 slider.valueProperty().addListener(sliderListener);
208 slider.valueChangingProperty().addListener(sliderListener);
211 slider.setValue(driverValueMapper.apply(modelProperty.get()));
214 modelProperty.addListener(modelProp -> {
216 slider.valueProperty().removeListener(sliderListener);
217 slider.valueChangingProperty().removeListener(sliderListener);
219 Platform.runLater(() -> {
221 slider.setValue(driverValueMapper.apply(modelProperty.get()));
224 slider.valueProperty().addListener(sliderListener);
225 slider.valueChangingProperty().addListener(sliderListener);
243 private final Class<EnumType>
clazz;
252 this.clazz = enumClass;
253 this.indexAdjsuter = indexMapper;
264 EnumType enumConstant = clazz.getEnumConstants()[indexAdjsuter.apply(dbl.intValue())];
266 return (String) clazz.getMethod(
"getDisplayName", (Class<?>[]) null).invoke(enumConstant, (Object[]) null);
267 }
catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
268 return enumConstant.toString();
274 throw new UnsupportedOperationException(
"This method should not be used. This EnumSliderLabelFormatter is being used in an unintended way.");
286 void accept(T input)
throws TskCoreException;
FilteredEventsModel getEventsModel()
synchronized ReadOnlyObjectProperty< TimelineEventType.TypeLevel > eventTypeZoomProperty()
static final Logger logger
final FilteredEventsModel filteredEvents
synchronized ReadOnlyObjectProperty< TimelineEvent.DescriptionLevel > descriptionLODProperty()
final TimeLineController controller
ZoomSettingsPane(TimeLineController controller)
static DateTimeZone getJodaTimeZone()
synchronized ReadOnlyObjectProperty< Interval > timeRangeProperty()
synchronized ReadOnlyObjectProperty< ViewMode > viewModeProperty()
synchronized static Logger getLogger(String name)
static void construct(Node node, String fxmlFileName)
static RangeDivision getRangeDivision(Interval timeRange, DateTimeZone timeZone)