more fixes to tooltips

This commit is contained in:
jmillman 2015-10-16 15:35:47 -04:00
parent d7dc55cdd5
commit e95e8b785e
6 changed files with 40 additions and 23 deletions

View File

@ -77,8 +77,12 @@ import org.sleuthkit.autopsy.timeline.events.RefreshRequestedEvent;
*/ */
public abstract class AbstractVisualizationPane<X, Y, N, C extends XYChart<X, Y> & TimeLineChart<X>> extends BorderPane implements TimeLineView { public abstract class AbstractVisualizationPane<X, Y, N, C extends XYChart<X, Y> & TimeLineChart<X>> extends BorderPane implements TimeLineView {
@NbBundle.Messages("AbstractVisualizationPane.Drag_Tooltip.text=Drag the mouse to select a time interval to zoom into.") @NbBundle.Messages("AbstractVisualization.Drag_Tooltip.text=Drag the mouse to select a time interval to zoom into.")
protected static final Tooltip DRAG_TOOLTIP = new Tooltip(Bundle.AbstractVisualizationPane_Drag_Tooltip_text()); private static final Tooltip DRAG_TOOLTIP = new Tooltip(Bundle.AbstractVisualization_Drag_Tooltip_text());
public static Tooltip getDragTooltip() {
return DRAG_TOOLTIP;
}
protected final SimpleBooleanProperty hasEvents = new SimpleBooleanProperty(true); protected final SimpleBooleanProperty hasEvents = new SimpleBooleanProperty(true);

View File

@ -91,11 +91,8 @@ import org.sleuthkit.autopsy.timeline.utils.RangeDivisionInfo;
/** /**
* A Container for an {@link AbstractVisualizationPane}, has a toolbar on top to * A Container for an {@link AbstractVisualizationPane}, has a toolbar on top to
* hold settings widgets supplied by contained {@link AbstractVisualizationPane}, * hold settings widgets supplied by contained {@link AbstAbstractVisualization* and the histogram / timeselection on bottom. Also supplies containers for
* and the histogram / timeselection on bottom. Also supplies containers for * replacement axis to contained {@link AbstractAbstractVisualizationTODO: refactor common code out of histogram and CountsView? -jm
* replacement axis to contained {@link AbstractVisualizationPane}
*
* TODO: refactor common code out of histogram and CountsView? -jm
*/ */
public class VisualizationPanel extends BorderPane implements TimeLineView { public class VisualizationPanel extends BorderPane implements TimeLineView {
@ -109,7 +106,7 @@ public class VisualizationPanel extends BorderPane implements TimeLineView {
private final NavPanel navPanel; private final NavPanel navPanel;
private AbstractVisualizationPane<?, ?, ?, ?> visualization; private AbstractVisualizationPane visualization;
//// range slider and histogram componenets //// range slider and histogram componenets
@FXML @FXML
@ -178,8 +175,8 @@ public class VisualizationPanel extends BorderPane implements TimeLineView {
private FilteredEventsModel filteredEvents; private FilteredEventsModel filteredEvents;
private final ChangeListener<Object> rangeSliderListener private final ChangeListener<Object> rangeSliderListener =
= (observable1, oldValue, newValue) -> { (observable1, oldValue, newValue) -> {
if (rangeSlider.isHighValueChanging() == false && rangeSlider.isLowValueChanging() == false) { if (rangeSlider.isHighValueChanging() == false && rangeSlider.isLowValueChanging() == false) {
Long minTime = filteredEvents.getMinTime() * 1000; Long minTime = filteredEvents.getMinTime() * 1000;
controller.pushTimeRange(new Interval( controller.pushTimeRange(new Interval(
@ -377,7 +374,7 @@ public class VisualizationPanel extends BorderPane implements TimeLineView {
if (visualization instanceof DetailViewPane) { if (visualization instanceof DetailViewPane) {
navPanel.setDetailViewPane((DetailViewPane) visualization); navPanel.setDetailViewPane((DetailViewPane) visualization);
} }
visualization.hasEvents.addListener((ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) -> { visualization.hasEvents.addListener((observable, oldValue, newValue) -> {
if (newValue == false) { if (newValue == false) {
notificationPane.setContent(new StackPane(visualization, new Region() { notificationPane.setContent(new StackPane(visualization, new Region() {

View File

@ -285,7 +285,8 @@ public class CountsViewPane extends AbstractVisualizationPane<String, Number, No
setChartClickHandler(); setChartClickHandler();
chart.setData(dataSets); chart.setData(dataSets);
setCenter(chart); setCenter(chart);
Tooltip.install(chart, DRAG_TOOLTIP);
Tooltip.install(chart, getDragTooltip());
settingsNodes = new ArrayList<>(new CountsViewSettingsPane().getChildrenUnmodifiable()); settingsNodes = new ArrayList<>(new CountsViewSettingsPane().getChildrenUnmodifiable());

View File

@ -120,7 +120,7 @@ public class DetailViewPane extends AbstractVisualizationPane<DateTime, EventClu
chart.setData(dataSets); chart.setData(dataSets);
setCenter(chart); setCenter(chart);
// Tooltip.install(chart, DRAG_TOOLTIP);
chart.setPrefHeight(USE_COMPUTED_SIZE); chart.setPrefHeight(USE_COMPUTED_SIZE);
settingsNodes = new ArrayList<>(new DetailViewSettingsPane().getChildrenUnmodifiable()); settingsNodes = new ArrayList<>(new DetailViewSettingsPane().getChildrenUnmodifiable());

View File

@ -64,6 +64,7 @@ import org.sleuthkit.autopsy.timeline.datamodel.EventBundle;
import org.sleuthkit.autopsy.timeline.datamodel.FilteredEventsModel; import org.sleuthkit.autopsy.timeline.datamodel.FilteredEventsModel;
import org.sleuthkit.autopsy.timeline.datamodel.TimeLineEvent; import org.sleuthkit.autopsy.timeline.datamodel.TimeLineEvent;
import org.sleuthkit.autopsy.timeline.datamodel.eventtype.EventType; import org.sleuthkit.autopsy.timeline.datamodel.eventtype.EventType;
import org.sleuthkit.autopsy.timeline.ui.AbstractVisualizationPane;
import static org.sleuthkit.autopsy.timeline.ui.detailview.EventBundleNodeBase.show; import static org.sleuthkit.autopsy.timeline.ui.detailview.EventBundleNodeBase.show;
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD; import org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD;
import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.SleuthkitCase;
@ -169,19 +170,29 @@ public abstract class EventBundleNodeBase<BundleType extends EventBundle<ParentT
//set up mouse hover effect and tooltip //set up mouse hover effect and tooltip
setOnMouseEntered((MouseEvent e) -> { setOnMouseEntered((MouseEvent e) -> {
/* /*
* defer tooltip creation till needed, this had a surprisingly large * defer tooltip content creation till needed, this had a
* impact on speed of loading the chart * surprisingly large impact on speed of loading the chart
*/ */
installTooltip(); installTooltip();
Tooltip.uninstall(chart, AbstractVisualizationPane.getDragTooltip());
showHoverControls(true); showHoverControls(true);
toFront(); toFront();
}); });
setOnMouseExited((MouseEvent event) -> {
showHoverControls(false);
if (parentNode != null) {
parentNode.showHoverControls(true);
} else {
Tooltip.install(chart, AbstractVisualizationPane.getDragTooltip());
}
});
setDescriptionVisibility(DescriptionVisibility.SHOWN);
descVisibility.addListener((ObservableValue<? extends DescriptionVisibility> observable, DescriptionVisibility oldValue, DescriptionVisibility newValue) -> { descVisibility.addListener((ObservableValue<? extends DescriptionVisibility> observable, DescriptionVisibility oldValue, DescriptionVisibility newValue) -> {
setDescriptionVisibility(newValue); setDescriptionVisibility(newValue);
}); });
setDescriptionVisibility(DescriptionVisibility.SHOWN);
} }
final DescriptionLoD getDescriptionLoD() { final DescriptionLoD getDescriptionLoD() {
@ -284,7 +295,7 @@ public abstract class EventBundleNodeBase<BundleType extends EventBundle<ParentT
return subNodes; return subNodes;
} }
abstract void setDescriptionVisibility(DescriptionVisibility get); abstract void setDescriptionVisibiltiyImpl(DescriptionVisibility get);
void showHoverControls(final boolean showControls) { void showHoverControls(final boolean showControls) {
Effect dropShadow = dropShadowMap.computeIfAbsent(getEventType(), Effect dropShadow = dropShadowMap.computeIfAbsent(getEventType(),
@ -295,6 +306,7 @@ public abstract class EventBundleNodeBase<BundleType extends EventBundle<ParentT
parentNode.enableTooltip(false); parentNode.enableTooltip(false);
parentNode.showHoverControls(false); parentNode.showHoverControls(false);
} }
} }
final EventType getEventType() { final EventType getEventType() {
@ -328,16 +340,15 @@ public abstract class EventBundleNodeBase<BundleType extends EventBundle<ParentT
*/ */
abstract void setDescriptionWidth(double w); abstract void setDescriptionWidth(double w);
void setDescriptionVisibilityLevel(DescriptionVisibility get) { void setDescriptionVisibility(DescriptionVisibility get) {
descVisibility.set(get); descVisibility.set(get);
} }
void enableTooltip(boolean b) { void enableTooltip(boolean toolTipEnabled) {
if (b) { if (toolTipEnabled) {
Tooltip.install(this, tooltip); Tooltip.install(this, tooltip);
} else { } else {
Tooltip.uninstall(this, tooltip); Tooltip.uninstall(this, tooltip);
} }
} }
} }

View File

@ -53,6 +53,7 @@ import javafx.scene.chart.Axis;
import javafx.scene.chart.NumberAxis; import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart; import javafx.scene.chart.XYChart;
import javafx.scene.control.ContextMenu; import javafx.scene.control.ContextMenu;
import javafx.scene.control.Tooltip;
import javafx.scene.image.Image; import javafx.scene.image.Image;
import javafx.scene.image.ImageView; import javafx.scene.image.ImageView;
import javafx.scene.input.MouseButton; import javafx.scene.input.MouseButton;
@ -74,6 +75,7 @@ import org.sleuthkit.autopsy.timeline.datamodel.FilteredEventsModel;
import org.sleuthkit.autopsy.timeline.datamodel.eventtype.EventType; import org.sleuthkit.autopsy.timeline.datamodel.eventtype.EventType;
import org.sleuthkit.autopsy.timeline.filters.AbstractFilter; import org.sleuthkit.autopsy.timeline.filters.AbstractFilter;
import org.sleuthkit.autopsy.timeline.filters.DescriptionFilter; import org.sleuthkit.autopsy.timeline.filters.DescriptionFilter;
import org.sleuthkit.autopsy.timeline.ui.AbstractVisualizationPane;
import org.sleuthkit.autopsy.timeline.ui.IntervalSelector; import org.sleuthkit.autopsy.timeline.ui.IntervalSelector;
import org.sleuthkit.autopsy.timeline.ui.TimeLineChart; import org.sleuthkit.autopsy.timeline.ui.TimeLineChart;
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD; import org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD;
@ -184,6 +186,8 @@ public final class EventDetailChart extends XYChart<DateTime, EventCluster> impl
EventDetailChart(DateAxis dateAxis, final Axis<EventCluster> verticalAxis, ObservableList<EventBundleNodeBase<?, ?, ?>> selectedNodes) { EventDetailChart(DateAxis dateAxis, final Axis<EventCluster> verticalAxis, ObservableList<EventBundleNodeBase<?, ?, ?>> selectedNodes) {
super(dateAxis, verticalAxis); super(dateAxis, verticalAxis);
Tooltip.install(this, AbstractVisualizationPane.getDragTooltip());
dateAxis.setAutoRanging(false); dateAxis.setAutoRanging(false);
verticalAxis.setVisible(false);//TODO: why doesn't this hide the vertical axis, instead we have to turn off all parts individually? -jm verticalAxis.setVisible(false);//TODO: why doesn't this hide the vertical axis, instead we have to turn off all parts individually? -jm
@ -496,7 +500,7 @@ public final class EventDetailChart extends XYChart<DateTime, EventCluster> impl
bundleNode.setVisible(true); bundleNode.setVisible(true);
bundleNode.setManaged(true); bundleNode.setManaged(true);
//apply advanced layout description visibility options //apply advanced layout description visibility options
bundleNode.setDescriptionVisibilityLevel(descrVisibility.get()); bundleNode.setDescriptionVisibility(descrVisibility.get());
bundleNode.setDescriptionWidth(truncateAll.get() ? truncateWidth.get() : USE_PREF_SIZE); bundleNode.setDescriptionWidth(truncateAll.get() ? truncateWidth.get() : USE_PREF_SIZE);
//do recursive layout //do recursive layout