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)