mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-14 17:06:16 +00:00
adjust EventClusterNode subbundle loading
This commit is contained in:
parent
09270a524a
commit
bd9c9109e4
@ -98,7 +98,7 @@ public abstract class EventBundleNodeBase<BundleType extends EventBundle<ParentT
|
||||
|
||||
protected final EventDetailChart chart;
|
||||
final SimpleObjectProperty<DescriptionLoD> descLOD = new SimpleObjectProperty<>();
|
||||
final SimpleObjectProperty<DescriptionVisibility> descVisibility= new SimpleObjectProperty<>(DescriptionVisibility.SHOWN);
|
||||
final SimpleObjectProperty<DescriptionVisibility> descVisibility = new SimpleObjectProperty<>(DescriptionVisibility.SHOWN);
|
||||
protected final BundleType eventBundle;
|
||||
|
||||
protected final ParentNodeType parentNode;
|
||||
@ -181,7 +181,7 @@ public abstract class EventBundleNodeBase<BundleType extends EventBundle<ParentT
|
||||
parentNode.showHoverControls(true);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
setDescriptionVisibility(DescriptionVisibility.SHOWN);
|
||||
descVisibility.addListener((ObservableValue<? extends DescriptionVisibility> observable, DescriptionVisibility oldValue, DescriptionVisibility newValue) -> {
|
||||
setDescriptionVisibility(newValue);
|
||||
@ -331,7 +331,7 @@ public abstract class EventBundleNodeBase<BundleType extends EventBundle<ParentT
|
||||
abstract void setDescriptionWidth(double w);
|
||||
|
||||
void setDescriptionVisibilityLevel(DescriptionVisibility get) {
|
||||
descVisibility.set(get);
|
||||
descVisibility.set(get);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -42,6 +42,7 @@ import javafx.scene.layout.Border;
|
||||
import javafx.scene.layout.BorderStroke;
|
||||
import javafx.scene.layout.BorderStrokeStyle;
|
||||
import javafx.scene.layout.BorderWidths;
|
||||
import javafx.scene.layout.VBox;
|
||||
import org.controlsfx.control.action.Action;
|
||||
import org.controlsfx.control.action.ActionUtils;
|
||||
import org.joda.time.DateTime;
|
||||
@ -92,6 +93,7 @@ final public class EventClusterNode extends EventBundleNodeBase<EventCluster, Ev
|
||||
setAlignment(Pos.CENTER_LEFT);
|
||||
infoHBox.getChildren().addAll(minusButton, plusButton);
|
||||
getChildren().addAll(subNodePane, infoHBox);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -138,90 +140,85 @@ final public class EventClusterNode extends EventBundleNodeBase<EventCluster, Ev
|
||||
*/
|
||||
@NbBundle.Messages(value = "EventStripeNode.loggedTask.name=Load sub clusters")
|
||||
private synchronized void loadSubBundles(DescriptionLoD.RelativeDetail relativeDetail) {
|
||||
chart.setCursor(Cursor.WAIT);
|
||||
chart.getEventBundles().removeIf(bundle ->
|
||||
subNodes.stream().anyMatch(subNode ->
|
||||
bundle.equals(subNode.getEventStripe()))
|
||||
);
|
||||
subNodePane.getChildren().clear();
|
||||
subNodes.clear();
|
||||
if (descLOD.get().withRelativeDetail(relativeDetail) == getEventBundle().getDescriptionLoD()) {
|
||||
countLabel.setVisible(true);
|
||||
descLOD.set(getEventBundle().getDescriptionLoD());
|
||||
chart.layoutPlotChildren();
|
||||
} else {
|
||||
/*
|
||||
* make new ZoomParams to query with
|
||||
*
|
||||
* We need to extend end time because for the query by one second,
|
||||
* because it is treated as an open interval but we want to include
|
||||
* events at exactly the time of the last event in this cluster
|
||||
*/
|
||||
final RootFilter subClusterFilter = getSubClusterFilter();
|
||||
final Interval subClusterSpan = new Interval(getStartMillis(), getEndMillis() + 1000);
|
||||
final EventTypeZoomLevel eventTypeZoomLevel = eventsModel.eventTypeZoomProperty().get();
|
||||
final ZoomParams zoomParams = new ZoomParams(subClusterSpan, eventTypeZoomLevel, subClusterFilter, getDescriptionLoD());
|
||||
|
||||
Task<Collection<EventStripe>> loggedTask = new Task<Collection<EventStripe>>() {
|
||||
/*
|
||||
* make new ZoomParams to query with
|
||||
*
|
||||
* We need to extend end time because for the query by one second,
|
||||
* because it is treated as an open interval but we want to include
|
||||
* events at exactly the time of the last event in this cluster
|
||||
*/
|
||||
final RootFilter subClusterFilter = getSubClusterFilter();
|
||||
final Interval subClusterSpan = new Interval(getStartMillis(), getEndMillis() + 1000);
|
||||
final EventTypeZoomLevel eventTypeZoomLevel = eventsModel.eventTypeZoomProperty().get();
|
||||
final ZoomParams zoomParams = new ZoomParams(subClusterSpan, eventTypeZoomLevel, subClusterFilter, getDescriptionLoD());
|
||||
|
||||
private volatile DescriptionLoD loadedDescriptionLoD = getDescriptionLoD().withRelativeDetail(relativeDetail);
|
||||
Task<Collection<EventStripe>> loggedTask = new Task<Collection<EventStripe>>() {
|
||||
|
||||
{
|
||||
updateTitle(Bundle.EventStripeNode_loggedTask_name());
|
||||
}
|
||||
private volatile DescriptionLoD loadedDescriptionLoD = getDescriptionLoD().withRelativeDetail(relativeDetail);
|
||||
|
||||
@Override
|
||||
protected Collection<EventStripe> call() throws Exception {
|
||||
Collection<EventStripe> bundles;
|
||||
DescriptionLoD next = loadedDescriptionLoD;
|
||||
do {
|
||||
loadedDescriptionLoD = next;
|
||||
if (loadedDescriptionLoD == getEventBundle().getDescriptionLoD()) {
|
||||
return Collections.emptySet();
|
||||
}
|
||||
bundles = eventsModel.getEventClusters(zoomParams.withDescrLOD(loadedDescriptionLoD)).stream()
|
||||
.collect(Collectors.toMap((eventCluster) -> eventCluster.getDescription(), //key
|
||||
(eventCluster) -> new EventStripe(eventCluster, getEventCluster()), //value
|
||||
EventStripe::merge) //merge method
|
||||
).values();
|
||||
next = loadedDescriptionLoD.withRelativeDetail(relativeDetail);
|
||||
} while (bundles.size() == 1 && nonNull(next));
|
||||
{
|
||||
updateTitle(Bundle.EventStripeNode_loggedTask_name());
|
||||
}
|
||||
|
||||
// return list of AbstractEventStripeNodes representing sub-bundles
|
||||
return bundles;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void succeeded() {
|
||||
chart.setCursor(Cursor.WAIT);
|
||||
try {
|
||||
Collection<EventStripe> bundles = get();
|
||||
|
||||
if (bundles.isEmpty()) {
|
||||
countLabel.setVisible(true);
|
||||
} else {
|
||||
countLabel.setVisible(false);
|
||||
chart.getEventBundles().addAll(bundles);
|
||||
subNodes.addAll(bundles.stream()
|
||||
.map(EventClusterNode.this::createStripeNode)
|
||||
.sorted(Comparator.comparing(EventStripeNode::getStartMillis))
|
||||
.collect(Collectors.toList()));
|
||||
subNodePane.getChildren().addAll(subNodes);
|
||||
}
|
||||
descLOD.set(loadedDescriptionLoD);
|
||||
//assign subNodes and request chart layout
|
||||
|
||||
} catch (InterruptedException | ExecutionException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Error loading subnodes", ex);
|
||||
@Override
|
||||
protected Collection<EventStripe> call() throws Exception {
|
||||
Collection<EventStripe> bundles;
|
||||
DescriptionLoD next = loadedDescriptionLoD;
|
||||
do {
|
||||
loadedDescriptionLoD = next;
|
||||
if (loadedDescriptionLoD == getEventBundle().getDescriptionLoD()) {
|
||||
return Collections.emptySet();
|
||||
}
|
||||
chart.layoutPlotChildren();
|
||||
chart.setCursor(null);
|
||||
}
|
||||
};
|
||||
bundles = eventsModel.getEventClusters(zoomParams.withDescrLOD(loadedDescriptionLoD)).stream()
|
||||
.collect(Collectors.toMap(EventCluster::getDescription, //key
|
||||
(eventCluster) -> new EventStripe(eventCluster, getEventCluster()), //value
|
||||
EventStripe::merge) //merge method
|
||||
).values();
|
||||
next = loadedDescriptionLoD.withRelativeDetail(relativeDetail);
|
||||
} while (bundles.size() == 1 && nonNull(next));
|
||||
|
||||
//start task
|
||||
chart.getController().monitorTask(loggedTask);
|
||||
}
|
||||
// return list of AbstractEventStripeNodes representing sub-bundles
|
||||
return bundles;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void succeeded() {
|
||||
|
||||
try {
|
||||
Collection<EventStripe> bundles = get();
|
||||
|
||||
if (bundles.isEmpty()) {
|
||||
subNodePane.getChildren().clear();
|
||||
getChildren().setAll(subNodePane, infoHBox);
|
||||
descLOD.set(getEventBundle().getDescriptionLoD());
|
||||
} else {
|
||||
chart.getEventBundles().addAll(bundles);
|
||||
subNodes.addAll(bundles.stream()
|
||||
.map(EventClusterNode.this::createStripeNode)
|
||||
.sorted(Comparator.comparing(EventStripeNode::getStartMillis))
|
||||
.collect(Collectors.toList()));
|
||||
subNodePane.getChildren().setAll(subNodes);
|
||||
getChildren().setAll(new VBox(infoHBox, subNodePane));
|
||||
descLOD.set(loadedDescriptionLoD);
|
||||
}
|
||||
} catch (InterruptedException | ExecutionException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Error loading subnodes", ex);
|
||||
}
|
||||
chart.layoutPlotChildren();
|
||||
chart.setCursor(null);
|
||||
}
|
||||
};
|
||||
|
||||
//start task
|
||||
chart.getController().monitorTask(loggedTask);
|
||||
}
|
||||
|
||||
private EventStripeNode createStripeNode(EventStripe stripe) {
|
||||
@ -249,7 +246,7 @@ final public class EventClusterNode extends EventBundleNodeBase<EventCluster, Ev
|
||||
RootFilter getSubClusterFilter() {
|
||||
RootFilter subClusterFilter = eventsModel.filterProperty().get().copyOf();
|
||||
subClusterFilter.getSubFilters().addAll(
|
||||
new DescriptionFilter(getDescriptionLoD(), getDescription(), DescriptionFilter.FilterMode.INCLUDE),
|
||||
new DescriptionFilter(getEventBundle().getDescriptionLoD(), getDescription(), DescriptionFilter.FilterMode.INCLUDE),
|
||||
new TypeFilter(getEventType()));
|
||||
return subClusterFilter;
|
||||
}
|
||||
@ -310,7 +307,6 @@ final public class EventClusterNode extends EventBundleNodeBase<EventCluster, Ev
|
||||
final DescriptionLoD next = descLOD.get().moreDetailed();
|
||||
if (next != null) {
|
||||
loadSubBundles(DescriptionLoD.RelativeDetail.MORE);
|
||||
|
||||
}
|
||||
});
|
||||
disabledProperty().bind(descLOD.isEqualTo(DescriptionLoD.FULL));
|
||||
|
@ -57,7 +57,6 @@ final public class EventStripeNode extends EventBundleNodeBase<EventStripe, Even
|
||||
super(chart, eventStripe, parentNode);
|
||||
|
||||
setMinHeight(48);
|
||||
// minWidthProperty().bind(subNodePane.widthProperty());
|
||||
|
||||
EventDetailChart.HideDescriptionAction hideClusterAction = chart.new HideDescriptionAction(getDescription(), eventBundle.getDescriptionLoD());
|
||||
hideButton = ActionUtils.createButton(hideClusterAction, ActionUtils.ActionTextBehavior.HIDE);
|
||||
@ -70,7 +69,6 @@ final public class EventStripeNode extends EventBundleNodeBase<EventStripe, Even
|
||||
descrLabel.setTextOverrun(OverrunStyle.CENTER_ELLIPSIS);
|
||||
descrLabel.setGraphic(eventTypeImageView);
|
||||
|
||||
// subNodePane.setPickOnBounds(false);
|
||||
setAlignment(subNodePane, Pos.BOTTOM_LEFT);
|
||||
for (EventCluster cluster : eventStripe.getClusters()) {
|
||||
EventClusterNode clusterNode = new EventClusterNode(chart, cluster, this);
|
||||
|
@ -43,7 +43,7 @@ public enum DescriptionLoD {
|
||||
try {
|
||||
return values()[ordinal() + 1];
|
||||
} catch (ArrayIndexOutOfBoundsException e) {
|
||||
return null;
|
||||
return FULL;
|
||||
}
|
||||
}
|
||||
|
||||
@ -51,7 +51,7 @@ public enum DescriptionLoD {
|
||||
try {
|
||||
return values()[ordinal() - 1];
|
||||
} catch (ArrayIndexOutOfBoundsException e) {
|
||||
return null;
|
||||
return SHORT;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user