19 package org.sleuthkit.autopsy.timeline.ui.filtering;
21 import java.util.Arrays;
22 import javafx.application.Platform;
23 import javafx.beans.Observable;
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;
59 private static final Image
TICK =
new Image(
"org/sleuthkit/autopsy/timeline/images/tick.png");
71 private TreeTableColumn<AbstractFilter, AbstractFilter>
treeColumn;
74 private TreeTableColumn<AbstractFilter, AbstractFilter>
legendColumn;
90 private final ObservableMap<Filter, Boolean>
expansionMap = FXCollections.observableHashMap();
94 "FilterSetPanel.defaultButton.text=Default",
95 "FilsetSetPanel.hiddenDescriptionsPane.displayName=Hidden Descriptions"})
98 assert applyButton != null :
"fx:id=\"applyButton\" was not injected: check your FXML file 'FilterSetPanel.fxml'.";
100 ActionUtils.configureButton(
new ApplyFiltersAction(), applyButton);
101 ActionUtils.configureButton(
new ResetFilters(Bundle.FilterSetPanel_defaultButton_text(),
controller), defaultButton);
103 hiddenDescriptionsPane.setText(Bundle.FilsetSetPanel_hiddenDescriptionsPane_displayName());
105 filterTreeTable.getStylesheets().addAll(
FilterSetPanel.class.getResource(
"FilterTable.css").toExternalForm());
108 filterTreeTable.setRowFactory(ttv ->
new FilterTreeTableRow());
111 treeColumn.setCellValueFactory(cellDataFeatures -> cellDataFeatures.getValue().valueProperty());
112 treeColumn.setCellFactory(col ->
new FilterCheckBoxCellFactory<>().forTreeTable(col));
115 legendColumn.setCellValueFactory(cellDataFeatures -> cellDataFeatures.getValue().valueProperty());
116 legendColumn.setCellFactory(col ->
new LegendCell(this.controller));
138 dividerPosition = splitPane.getDividerPositions()[0];
139 splitPane.setDividerPositions(1);
140 hiddenDescriptionsPane.setExpanded(
false);
141 hiddenDescriptionsPane.setCollapsible(
false);
142 hiddenDescriptionsPane.setDisable(
true);
146 splitPane.setDividerPositions(dividerPosition);
147 hiddenDescriptionsPane.setDisable(
false);
148 hiddenDescriptionsPane.setCollapsible(
true);
149 hiddenDescriptionsPane.setExpanded(
true);
150 hiddenDescriptionsPane.setCollapsible(
false);
153 throw new UnsupportedOperationException(
"Unknown ViewMode: " + controller.
getViewMode());
165 Platform.runLater(() -> {
171 Platform.runLater(() -> {
177 final ListCell<DescriptionFilter> cell =
new FilterCheckBoxCellFactory<DescriptionFilter>().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()));
ListView< DescriptionFilter > hiddenDescriptionsListView
ListCell< DescriptionFilter > getNewDiscriptionFilterListCell()
FilteredEventsModel getEventsModel()
synchronized ViewMode getViewMode()
FilterSetPanel(TimeLineController controller)
synchronized ReadOnlyObjectProperty< EventTypeZoomLevel > eventTypeZoomProperty()
synchronized ReadOnlyObjectProperty< RootFilter > filterProperty()
synchronized RootFilter getFilter()
TitledPane hiddenDescriptionsPane
synchronized void pushFilters(RootFilter filter)
final TimeLineController controller
final FilteredEventsModel filteredEvents
synchronized ReadOnlyObjectProperty< ViewMode > viewModeProperty()
synchronized ReadOnlyObjectProperty< DescriptionLoD > descriptionLODProperty()
TreeTableView< Filter > filterTreeTable
TypeFilter getTypeFilter()
static void construct(Node node, String fxmlFileName)
synchronized ReadOnlyObjectProperty< Interval > timeRangeProperty()
TreeTableColumn< AbstractFilter, AbstractFilter > treeColumn
ObservableList< DescriptionFilter > getQuickHideFilters()
final ObservableMap< Filter, Boolean > expansionMap
TreeTableColumn< AbstractFilter, AbstractFilter > legendColumn