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)