19 package org.sleuthkit.autopsy.timeline.ui.filtering;
21 import java.util.Arrays;
22 import javafx.application.Platform;
23 import javafx.beans.InvalidationListener;
24 import javafx.beans.binding.Bindings;
25 import javafx.collections.FXCollections;
26 import javafx.collections.ObservableMap;
27 import javafx.fxml.FXML;
28 import javafx.scene.control.Button;
29 import javafx.scene.control.Cell;
30 import javafx.scene.control.ListCell;
31 import javafx.scene.control.ListView;
32 import javafx.scene.control.SplitPane;
33 import javafx.scene.control.TitledPane;
34 import javafx.scene.control.TreeTableColumn;
35 import javafx.scene.control.TreeTableView;
36 import javafx.scene.image.Image;
37 import javafx.scene.image.ImageView;
38 import javafx.scene.layout.BorderPane;
39 import org.controlsfx.control.action.Action;
40 import org.controlsfx.control.action.ActionUtils;
41 import org.openide.util.NbBundle;
58 private static final Image
TICK =
new Image(
"org/sleuthkit/autopsy/timeline/images/tick.png");
89 private final ObservableMap< Object, Boolean>
expansionMap = FXCollections.observableHashMap();
93 "FilterSetPanel.defaultButton.text=Default",
94 "FilsetSetPanel.hiddenDescriptionsPane.displayName=Hidden Descriptions"})
97 assert applyButton != null :
"fx:id=\"applyButton\" was not injected: check your FXML file 'FilterSetPanel.fxml'.";
99 ActionUtils.configureButton(
new ApplyFiltersAction(), applyButton);
100 ActionUtils.configureButton(
new ResetFilters(Bundle.FilterSetPanel_defaultButton_text(),
controller), defaultButton);
102 hiddenDescriptionsPane.setText(Bundle.FilsetSetPanel_hiddenDescriptionsPane_displayName());
104 filterTreeTable.getStylesheets().addAll(
FilterSetPanel.class.getResource(
"FilterTable.css").toExternalForm());
107 filterTreeTable.setRowFactory(ttv ->
new FilterTreeTableRow());
110 treeColumn.setCellValueFactory(cellDataFeatures -> cellDataFeatures.getValue().valueProperty());
111 treeColumn.setCellFactory(col ->
new FilterCheckBoxCellFactory<>().forTreeTable(col));
114 legendColumn.setCellValueFactory(cellDataFeatures -> cellDataFeatures.getValue().valueProperty());
115 legendColumn.setCellFactory(col ->
new LegendCell(this.controller));
118 expansionMap.put(filteredEvents.
getFilterState().getFilter(),
true);
121 InvalidationListener applyFiltersListener = observable ->
applyFilters();
139 dividerPosition = splitPane.getDividerPositions()[0];
140 splitPane.setDividerPositions(1);
141 hiddenDescriptionsPane.setExpanded(
false);
142 hiddenDescriptionsPane.setCollapsible(
false);
143 hiddenDescriptionsPane.setDisable(
true);
147 splitPane.setDividerPositions(dividerPosition);
148 hiddenDescriptionsPane.setDisable(
false);
149 hiddenDescriptionsPane.setCollapsible(
true);
150 hiddenDescriptionsPane.setExpanded(
true);
151 hiddenDescriptionsPane.setCollapsible(
false);
154 throw new UnsupportedOperationException(
"Unknown ViewMode: " + controller.
getViewMode());
171 Platform.runLater(() -> {
177 final ListCell<DescriptionFilterState> cell =
new FilterCheckBoxCellFactory< DescriptionFilterState>().forList();
178 cell.itemProperty().addListener(itemProperty -> {
179 if (cell.getItem() == null) {
180 cell.setContextMenu(null);
182 cell.setContextMenu(ActionUtils.createContextMenu(Arrays.asList(
190 @NbBundle.Messages({
"FilterSetPanel.applyButton.text=Apply",
191 "FilterSetPanel.applyButton.longText=(Re)Apply filters"})
195 super(Bundle.FilterSetPanel_applyButton_text());
196 setLongText(Bundle.FilterSetPanel_applyButton_longText());
197 setGraphic(
new ImageView(TICK));
203 "FilterSetPanel.hiddenDescriptionsListView.unhideAndRemove=Unhide and remove from list",
204 "FilterSetPanel.hiddenDescriptionsListView.remove=Remove from list",})
207 private static final Image SHOW =
new Image(
"/org/sleuthkit/autopsy/timeline/images/eye--plus.png");
211 setGraphic(
new ImageView(SHOW));
213 Bindings.when(cell.getItem().selectedProperty())
214 .then(Bundle.FilterSetPanel_hiddenDescriptionsListView_unhideAndRemove())
215 .otherwise(Bundle.FilterSetPanel_hiddenDescriptionsListView_remove()));
FilteredEventsModel getEventsModel()
synchronized ViewMode getViewMode()
FilterSetPanel(TimeLineController controller)
synchronized ReadOnlyObjectProperty< TimelineEventType.TypeLevel > eventTypeZoomProperty()
ListCell< DescriptionFilterState > getNewDiscriptionFilterListCell()
ListView< DescriptionFilterState > hiddenDescriptionsListView
TreeTableColumn< FilterState< ?>, FilterState<?> > treeColumn
synchronized ReadOnlyObjectProperty< TimelineEvent.DescriptionLevel > descriptionLODProperty()
CompoundFilterState< EventTypeFilter, EventTypeFilter > getEventTypeFilterState()
synchronized RootFilterState getFilterState()
synchronized void pushFilters(RootFilterState filter)
synchronized ReadOnlyObjectProperty< Interval > timeRangeProperty()
TitledPane hiddenDescriptionsPane
final TimeLineController controller
final FilteredEventsModel filteredEvents
synchronized ReadOnlyObjectProperty< ViewMode > viewModeProperty()
ObservableList< DescriptionFilterState > getQuickHideFilters()
final ObservableMap< Object, Boolean > expansionMap
synchronized ReadOnlyObjectProperty< RootFilterState > filterProperty()
static void construct(Node node, String fxmlFileName)
TreeTableView< FilterState<?> > filterTreeTable
TreeTableColumn< FilterState<?>, FilterState<?> > legendColumn