/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package org.sleuthkit.autopsy.timeline.ui.filtering; import java.util.Arrays; import java.util.function.BiPredicate; import javafx.scene.control.TreeItem; import javafx.scene.control.TreeTableRow; import org.controlsfx.control.action.Action; import org.controlsfx.control.action.ActionGroup; import org.controlsfx.control.action.ActionUtils; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.timeline.filters.Filter; /** * */ class FilterTreeTableRow extends TreeTableRow<Filter> { @Override protected void updateItem(Filter item, boolean empty) { super.updateItem(item, empty); if (item == null || empty) { setContextMenu(null); } else { setContextMenu(ActionUtils.createContextMenu(Arrays.asList(new SelectActionsGroup(this)))); } } @NbBundle.Messages(value = { "Timeline.ui.filtering.menuItem.select=select", "Timeline.ui.filtering.menuItem.all=all", "Timeline.ui.filtering.menuItem.none=none", "Timeline.ui.filtering.menuItem.only=only", "Timeline.ui.filtering.menuItem.others=others"}) private static enum SelectionAction { ALL(Bundle.Timeline_ui_filtering_menuItem_all(), (treeItem, row) -> true), NONE(Bundle.Timeline_ui_filtering_menuItem_none(), (treeItem, row) -> false), ONLY(Bundle.Timeline_ui_filtering_menuItem_only(), (treeItem, row) -> treeItem == row.getTreeItem()), OTHER(Bundle.Timeline_ui_filtering_menuItem_others(), (treeItem, row) -> treeItem != row.getTreeItem()), SELECT(Bundle.Timeline_ui_filtering_menuItem_select(), (treeItem, row) -> false == row.getItem().isSelected()); private final BiPredicate<TreeItem<Filter>, TreeTableRow<Filter>> selectionPredicate; private final String displayName; private SelectionAction(String displayName, BiPredicate<TreeItem<Filter>, TreeTableRow<Filter>> predicate) { this.selectionPredicate = predicate; this.displayName = displayName; } public void doSelection(TreeItem<Filter> treeItem, TreeTableRow<Filter> row) { treeItem.getValue().setSelected(selectionPredicate.test(treeItem, row)); } public String getDisplayName() { return displayName; } } private static final class SelectActionsGroup extends ActionGroup { SelectActionsGroup(TreeTableRow<Filter> row) { super(Bundle.Timeline_ui_filtering_menuItem_select(), new Select(SelectionAction.ALL, row), new Select(SelectionAction.NONE, row), new Select(SelectionAction.ONLY, row), new Select(SelectionAction.OTHER, row)); setEventHandler(new Select(SelectionAction.SELECT, row)::handle); } } private static final class Select extends Action { public TreeTableRow<Filter> getRow() { return row; } private final TreeTableRow<Filter> row; private final SelectionAction selectionAction; Select(SelectionAction strategy, TreeTableRow<Filter> row) { super(strategy.getDisplayName()); this.row = row; this.selectionAction = strategy; setEventHandler(actionEvent -> row.getTreeItem().getParent().getChildren().forEach(this::doSelection)); } private void doSelection(TreeItem<Filter> treeItem) { selectionAction.doSelection(treeItem, getRow()); } } }