19 package org.sleuthkit.autopsy.timeline.ui.countsview;
 
   21 import java.util.Arrays;
 
   22 import java.util.Collections;
 
   23 import javafx.scene.chart.Axis;
 
   24 import javafx.scene.chart.CategoryAxis;
 
   25 import javafx.scene.chart.NumberAxis;
 
   26 import javafx.scene.chart.StackedBarChart;
 
   27 import javafx.scene.control.ContextMenu;
 
   28 import javafx.scene.input.MouseButton;
 
   29 import javafx.scene.input.MouseEvent;
 
   30 import javafx.util.StringConverter;
 
   31 import org.controlsfx.control.action.ActionGroup;
 
   32 import org.controlsfx.control.action.ActionUtils;
 
   33 import org.joda.time.DateTime;
 
   34 import org.joda.time.Interval;
 
   35 import org.openide.util.NbBundle;
 
   45 class EventCountsChart 
extends StackedBarChart<String, Number> implements TimeLineChart<String> {
 
   47     private ContextMenu contextMenu;
 
   49     private TimeLineController controller;
 
   51     private IntervalSelector<? extends String> intervalSelector;
 
   57     private RangeDivisionInfo rangeInfo;
 
   59     EventCountsChart(CategoryAxis dateAxis, NumberAxis countAxis) {
 
   60         super(dateAxis, countAxis);
 
   62         dateAxis.setAnimated(
true);
 
   63         dateAxis.setLabel(null);
 
   64         dateAxis.setTickLabelsVisible(
false);
 
   65         dateAxis.setTickLabelGap(0);
 
   67         countAxis.setLabel(NbBundle.getMessage(CountsViewPane.class, 
"CountsChartPane.numberOfEvents"));
 
   68         countAxis.setAutoRanging(
false);
 
   69         countAxis.setLowerBound(0);
 
   70         countAxis.setAnimated(
true);
 
   71         countAxis.setMinorTickCount(0);
 
   72         countAxis.setTickLabelFormatter(
new IntegerOnlyStringConverter());
 
   74         setAlternativeRowFillVisible(
true);
 
   76         setLegendVisible(
false);
 
   81         ChartDragHandler<String, EventCountsChart> dragHandler = 
new ChartDragHandler<>(
this, getXAxis());
 
   82         setOnMousePressed(dragHandler);
 
   83         setOnMouseReleased(dragHandler);
 
   84         setOnMouseDragged(dragHandler);
 
   86         setOnMouseClicked((MouseEvent clickEvent) -> {
 
   88             if (clickEvent.getButton() == MouseButton.SECONDARY && clickEvent.isStillSincePress()) {
 
   89                 contextMenu.show(EventCountsChart.this, clickEvent.getScreenX(), clickEvent.getScreenY());
 
   96     public void clearIntervalSelector() {
 
   97         getChartChildren().remove(intervalSelector);
 
   98         intervalSelector = null;
 
  102     public final synchronized void setController(TimeLineController controller) {
 
  103         this.controller = controller;
 
  104         setModel(this.controller.getEventsModel());
 
  106         contextMenu = ActionUtils.createContextMenu(
 
  107                 Arrays.asList(
new ActionGroup(
 
  108                         NbBundle.getMessage(
this.getClass(), 
"EventCountsChart.contextMenu.zoomHistory.name"),
 
  109                         new Back(controller),
 
  110                         new Forward(controller))));
 
  111         contextMenu.setAutoHide(
true);
 
  115     public IntervalSelector<? extends String> getIntervalSelector() {
 
  116         return intervalSelector;
 
  121         intervalSelector = newIntervalSelector;
 
  122         getChartChildren().add(getIntervalSelector());
 
  126     public void setModel(FilteredEventsModel filteredEvents) {
 
  127         filteredEvents.getRequestedZoomParamters().addListener(o -> {
 
  128             clearIntervalSelector();
 
  129             controller.selectEventIDs(Collections.emptyList());
 
  134     public CountsIntervalSelector newIntervalSelector(
double x, Axis<String> dateAxis) {
 
  135         return new CountsIntervalSelector(x, getHeight() - dateAxis.getHeight() - dateAxis.getTickLength(), dateAxis, controller);
 
  142     ContextMenu getContextMenu() {
 
  146     void setRangeInfo(RangeDivisionInfo rangeInfo) {
 
  147         this.rangeInfo = rangeInfo;
 
  158             return n.intValue() == n.doubleValue()
 
  159                    ? Integer.toString(n.intValue()) : 
"";
 
  165             return Double.valueOf(
string).intValue();
 
  174             super(x, height, axis, controller);
 
  191             return new Interval(lowerDate, upperDate.plus(rangeInfo.getPeriodSize().getPeriod()));
 
  196             return date == null ? 
new DateTime(rangeInfo.getLowerBound()) : rangeInfo.getTickFormatter().parseDateTime(date);
 
CountsIntervalSelector(double x, double height, Axis< String > axis, TimeLineController controller)
 
Number fromString(String string)
 
String formatSpan(String date)
 
static RangeDivisionInfo getRangeDivisionInfo(Interval timeRange)
 
Interval adjustInterval(Interval i)
 
void setModel(final FilteredEventsModel filteredEvents)
 
String toString(Number n)
 
static DateTimeZone getJodaTimeZone()
 
DateTime parseDateTime(String date)
 
void setIntervalSelector(IntervalSelector<?extends X > newIntervalSelector)