mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-15 09:17:42 +00:00
more fixes to tooltips
This commit is contained in:
parent
d7dc55cdd5
commit
e95e8b785e
@ -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);
|
||||||
|
|
||||||
@ -243,7 +247,7 @@ public abstract class AbstractVisualizationPane<X, Y, N, C extends XYChart<X, Y>
|
|||||||
update();
|
update();
|
||||||
});
|
});
|
||||||
|
|
||||||
hoverProperty().addListener((observable, oldActivated, newActivated) -> {
|
hoverProperty().addListener((observable, oldActivated, newActivated) -> {
|
||||||
if (newActivated) {
|
if (newActivated) {
|
||||||
controller.setStatus(DRAG_TOOLTIP.getText());
|
controller.setStatus(DRAG_TOOLTIP.getText());
|
||||||
} else {
|
} else {
|
||||||
|
@ -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() {
|
||||||
|
@ -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());
|
||||||
|
|
||||||
|
@ -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());
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user