19 package org.sleuthkit.autopsy.timeline.ui.filtering;
21 import javafx.application.Platform;
22 import javafx.beans.Observable;
23 import javafx.beans.property.SimpleBooleanProperty;
24 import javafx.collections.FXCollections;
25 import javafx.collections.ObservableMap;
26 import javafx.fxml.FXML;
27 import javafx.scene.control.Button;
28 import javafx.scene.control.CheckBox;
29 import javafx.scene.control.ContextMenu;
30 import javafx.scene.control.Menu;
31 import javafx.scene.control.MenuItem;
32 import javafx.scene.control.TreeItem;
33 import javafx.scene.control.TreeTableCell;
34 import javafx.scene.control.TreeTableColumn;
35 import javafx.scene.control.TreeTableRow;
36 import javafx.scene.control.TreeTableView;
37 import javafx.scene.layout.BorderPane;
38 import org.controlsfx.control.action.Action;
39 import org.openide.util.NbBundle;
65 private TreeTableColumn<AbstractFilter, AbstractFilter>
treeColumn;
68 private TreeTableColumn<AbstractFilter, AbstractFilter>
legendColumn;
74 private final ObservableMap<String, Boolean>
expansionMap = FXCollections.observableHashMap();
78 assert applyButton != null :
"fx:id=\"applyButton\" was not injected: check your FXML file 'FilterSetPanel.fxml'.";
80 applyButton.setOnAction(e -> {
81 controller.
pushFilters(filterTreeTable.getRoot().getValue().copyOf());
83 applyButton.setText(NbBundle.getMessage(
this.getClass(),
"FilterSetPanel.applyButton.text"));
84 defaultButton.setText(NbBundle.getMessage(
this.getClass(),
"FilterSetPanel.defaultButton.text"));
87 filterTreeTable.getStylesheets().addAll(getClass().getResource(
"FilterTable.css").toExternalForm());
90 filterTreeTable.setRowFactory((TreeTableView<Filter> param) -> {
91 final TreeTableRow<Filter> row =
new TreeTableRow<>();
93 MenuItem all =
new MenuItem(NbBundle.getMessage(
this.getClass(),
"Timeline.ui.filtering.menuItem.all"));
94 all.setOnAction(e -> {
95 row.getTreeItem().getParent().getChildren().forEach((TreeItem<Filter> t) -> {
96 t.getValue().setActive(Boolean.TRUE);
99 MenuItem none =
new MenuItem(NbBundle.getMessage(
this.getClass(),
"Timeline.ui.filtering.menuItem.none"));
100 none.setOnAction(e -> {
101 row.getTreeItem().getParent().getChildren().forEach((TreeItem<Filter> t) -> {
102 t.getValue().setActive(Boolean.FALSE);
106 MenuItem only =
new MenuItem(NbBundle.getMessage(
this.getClass(),
"Timeline.ui.filtering.menuItem.only"));
107 only.setOnAction(e -> {
108 row.getTreeItem().getParent().getChildren().forEach((TreeItem<Filter> t) -> {
109 if (t == row.getTreeItem()) {
110 t.getValue().setActive(Boolean.TRUE);
112 t.getValue().setActive(Boolean.FALSE);
116 MenuItem others =
new MenuItem(NbBundle.getMessage(
this.getClass(),
"Timeline.ui.filtering.menuItem.others"));
117 others.setOnAction(e -> {
118 row.getTreeItem().getParent().getChildren().forEach((TreeItem<Filter> t) -> {
119 if (t == row.getTreeItem()) {
120 t.getValue().setActive(Boolean.FALSE);
122 t.getValue().setActive(Boolean.TRUE);
126 final ContextMenu rowMenu =
new ContextMenu();
127 Menu select =
new Menu(NbBundle.getMessage(
this.getClass(),
"Timeline.ui.filtering.menuItem.select"));
128 select.setOnAction(e -> {
129 row.getItem().setActive(!row.getItem().isActive());
131 select.getItems().addAll(all, none, only, others);
132 rowMenu.getItems().addAll(select);
133 row.setContextMenu(rowMenu);
139 treeColumn.setCellValueFactory(param -> param.getValue().valueProperty());
141 treeColumn.setText(NbBundle.getMessage(
this.getClass(),
"FilterSetPanel.treeColumn.text"));
144 legendColumn.setCellValueFactory(param -> param.getValue().valueProperty());
145 legendColumn.setCellFactory(col ->
new LegendCell(this.controller));
146 legendColumn.setText(NbBundle.getMessage(
this.getClass(),
"FilterSetPanel.legendColumn.text"));
151 expansionMap.put(NbBundle.getMessage(
this.getClass(),
"FilterSetPanel.eventTypeFilter.title"), Boolean.TRUE);
156 this.controller = timeLineController;
158 defaultButton.setOnAction(defaultFiltersAction);
159 defaultButton.disableProperty().bind(defaultFiltersAction.disabledProperty());
167 this.filteredEvents.
filter().addListener((Observable o) -> {
187 super.updateItem(item, empty);
188 Platform.runLater(() -> {
189 if (activeProperty != null) {
190 checkBox.selectedProperty().unbindBidirectional(activeProperty);
192 checkBox.disableProperty().unbind();
200 checkBox.selectedProperty().bindBidirectional(activeProperty);
202 setGraphic(checkBox);
FilteredEventsModel getEventsModel()
final ObservableMap< String, Boolean > expansionMap
SimpleBooleanProperty getDisabledProperty()
synchronized ReadOnlyObjectProperty< Filter > filter()
void updateItem(AbstractFilter item, boolean empty)
SimpleBooleanProperty activeProperty
static void construct(Node n, String fxmlFileName)
void setController(TimeLineController timeLineController)
FilteredEventsModel filteredEvents
SimpleBooleanProperty getActiveProperty()
TimeLineController controller
TreeTableView< Filter > filterTreeTable
void setModel(FilteredEventsModel filteredEvents)
TreeTableColumn< AbstractFilter, AbstractFilter > treeColumn
synchronized void pushFilters(Filter filter)
TreeTableColumn< AbstractFilter, AbstractFilter > legendColumn