use of org.controlsfx.control.action.Action in project qupath by qupath.
the class TMASummaryViewer method getCustomizeTablePane.
private Pane getCustomizeTablePane() {
TableView<TreeTableColumn<TMAEntry, ?>> tableColumns = new TableView<>();
tableColumns.setPlaceholder(new Text("No columns available"));
tableColumns.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
tableColumns.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
SortedList<TreeTableColumn<TMAEntry, ?>> sortedColumns = new SortedList<>(table.getColumns().filtered(p -> !p.getText().trim().isEmpty()));
sortedColumns.setComparator((c1, c2) -> c1.getText().compareTo(c2.getText()));
tableColumns.setItems(sortedColumns);
sortedColumns.comparatorProperty().bind(tableColumns.comparatorProperty());
// sortedColumns.comparatorProperty().bind(tableColumns.comparatorProperty());
TableColumn<TreeTableColumn<TMAEntry, ?>, String> columnName = new TableColumn<>("Column");
columnName.setCellValueFactory(v -> v.getValue().textProperty());
TableColumn<TreeTableColumn<TMAEntry, ?>, Boolean> columnVisible = new TableColumn<>("Visible");
columnVisible.setCellValueFactory(v -> v.getValue().visibleProperty());
// columnVisible.setCellValueFactory(col -> {
// SimpleBooleanProperty prop = new SimpleBooleanProperty(col.getValue().isVisible());
// prop.addListener((v, o, n) -> col.getValue().setVisible(n));
// return prop;
// });
tableColumns.setEditable(true);
columnVisible.setCellFactory(v -> new CheckBoxTableCell<>());
tableColumns.getColumns().add(columnName);
tableColumns.getColumns().add(columnVisible);
ContextMenu contextMenu = new ContextMenu();
Action actionShowSelected = new Action("Show selected", e -> {
for (TreeTableColumn<?, ?> col : tableColumns.getSelectionModel().getSelectedItems()) {
if (col != null)
col.setVisible(true);
else {
// Not sure why this happens...?
logger.trace("Selected column is null!");
}
}
});
Action actionHideSelected = new Action("Hide selected", e -> {
for (TreeTableColumn<?, ?> col : tableColumns.getSelectionModel().getSelectedItems()) {
if (col != null)
col.setVisible(false);
else {
// Not sure why this happens...?
logger.trace("Selected column is null!");
}
}
});
contextMenu.getItems().addAll(ActionUtils.createMenuItem(actionShowSelected), ActionUtils.createMenuItem(actionHideSelected));
tableColumns.setContextMenu(contextMenu);
tableColumns.setTooltip(new Tooltip("Show or hide table columns - right-click to change multiple columns at once"));
BorderPane paneColumns = new BorderPane(tableColumns);
paneColumns.setBottom(PaneTools.createColumnGridControls(ActionUtils.createButton(actionShowSelected), ActionUtils.createButton(actionHideSelected)));
VBox paneRows = new VBox();
// Create a box to filter on some metadata text
ComboBox<String> comboMetadata = new ComboBox<>();
comboMetadata.setItems(metadataNames);
comboMetadata.getSelectionModel().getSelectedItem();
comboMetadata.setPromptText("Select column");
TextField tfFilter = new TextField();
CheckBox cbExact = new CheckBox("Exact");
// Set listeners
cbExact.selectedProperty().addListener((v, o, n) -> setMetadataTextPredicate(comboMetadata.getSelectionModel().getSelectedItem(), tfFilter.getText(), cbExact.isSelected(), !cbExact.isSelected()));
tfFilter.textProperty().addListener((v, o, n) -> setMetadataTextPredicate(comboMetadata.getSelectionModel().getSelectedItem(), tfFilter.getText(), cbExact.isSelected(), !cbExact.isSelected()));
comboMetadata.getSelectionModel().selectedItemProperty().addListener((v, o, n) -> setMetadataTextPredicate(comboMetadata.getSelectionModel().getSelectedItem(), tfFilter.getText(), cbExact.isSelected(), !cbExact.isSelected()));
GridPane paneMetadata = new GridPane();
paneMetadata.add(comboMetadata, 0, 0);
paneMetadata.add(tfFilter, 1, 0);
paneMetadata.add(cbExact, 2, 0);
paneMetadata.setPadding(new Insets(10, 10, 10, 10));
paneMetadata.setVgap(2);
paneMetadata.setHgap(5);
comboMetadata.setMaxWidth(Double.MAX_VALUE);
GridPane.setHgrow(tfFilter, Priority.ALWAYS);
GridPane.setFillWidth(comboMetadata, Boolean.TRUE);
GridPane.setFillWidth(tfFilter, Boolean.TRUE);
TitledPane tpMetadata = new TitledPane("Metadata filter", paneMetadata);
tpMetadata.setExpanded(false);
// tpMetadata.setCollapsible(false);
Tooltip tooltipMetadata = new Tooltip("Enter text to filter entries according to a selected metadata column");
Tooltip.install(paneMetadata, tooltipMetadata);
tpMetadata.setTooltip(tooltipMetadata);
paneRows.getChildren().add(tpMetadata);
// Add measurement predicate
TextField tfCommand = new TextField();
tfCommand.setTooltip(new Tooltip("Predicate used to filter entries for inclusion"));
TextFields.bindAutoCompletion(tfCommand, e -> {
int ind = tfCommand.getText().lastIndexOf("\"");
if (ind < 0)
return Collections.emptyList();
String part = tfCommand.getText().substring(ind + 1);
return measurementNames.stream().filter(n -> n.startsWith(part)).map(n -> "\"" + n + "\" ").collect(Collectors.toList());
});
String instructions = "Enter a predicate to filter entries.\n" + "Only entries passing the test will be included in any results.\n" + "Examples of predicates include:\n" + " \"Num Tumor\" > 200\n" + " \"Num Tumor\" > 100 && \"Num Stroma\" < 1000";
// labelInstructions.setTooltip(new Tooltip("Note: measurement names must be in \"inverted commands\" and\n" +
// "&& indicates 'and', while || indicates 'or'."));
BorderPane paneMeasurementFilter = new BorderPane(tfCommand);
Label label = new Label("Predicate: ");
label.setAlignment(Pos.CENTER);
label.setMaxHeight(Double.MAX_VALUE);
paneMeasurementFilter.setLeft(label);
Button btnApply = new Button("Apply");
btnApply.setOnAction(e -> {
TablePredicate predicateNew = new TablePredicate(tfCommand.getText());
if (predicateNew.isValid()) {
predicateMeasurements.set(predicateNew);
} else {
Dialogs.showErrorMessage("Invalid predicate", "Current predicate '" + tfCommand.getText() + "' is invalid!");
}
e.consume();
});
TitledPane tpMeasurementFilter = new TitledPane("Measurement filter", paneMeasurementFilter);
tpMeasurementFilter.setExpanded(false);
Tooltip tooltipInstructions = new Tooltip(instructions);
tpMeasurementFilter.setTooltip(tooltipInstructions);
Tooltip.install(paneMeasurementFilter, tooltipInstructions);
paneMeasurementFilter.setRight(btnApply);
paneRows.getChildren().add(tpMeasurementFilter);
logger.info("Predicate set to: {}", predicateMeasurements.get());
VBox pane = new VBox();
// TitledPane tpColumns = new TitledPane("Select column", paneColumns);
// tpColumns.setMaxHeight(Double.MAX_VALUE);
// tpColumns.setCollapsible(false);
pane.getChildren().addAll(paneColumns, new Separator(), paneRows);
VBox.setVgrow(paneColumns, Priority.ALWAYS);
return pane;
}
use of org.controlsfx.control.action.Action in project qupath by qupath.
the class DefaultScriptEditor method createInsertAction.
Action createInsertAction(final String name) {
Action action = new Action(name, e -> {
var control = getCurrentTextComponent();
String join = "," + System.lineSeparator() + " ";
String listFormat = "[" + System.lineSeparator() + " %s" + System.lineSeparator() + "]";
if (name.toLowerCase().equals("pixel classifiers")) {
try {
String classifiers = qupath.getProject().getPixelClassifiers().getNames().stream().map(classifierName -> "\"" + classifierName + "\"").collect(Collectors.joining(join));
String s = classifiers.isEmpty() ? "[]" : String.format(listFormat, classifiers);
control.paste(s);
} catch (IOException ex) {
logger.error("Could not fetch classifiers", ex.getLocalizedMessage());
}
} else if (name.toLowerCase().equals("object classifiers")) {
try {
String classifiers = qupath.getProject().getObjectClassifiers().getNames().stream().map(classifierName -> "\"" + classifierName + "\"").collect(Collectors.joining(join));
String s = classifiers.isEmpty() ? "[]" : String.format(listFormat, classifiers);
control.paste(s);
} catch (IOException ex) {
logger.error("Could not fetch classifiers", ex.getLocalizedMessage());
}
} else if (name.toLowerCase().equals("detection")) {
var imageData = qupath.getImageData();
String measurements = "";
if (imageData != null) {
measurements = imageData.getHierarchy().getDetectionObjects().stream().flatMap(d -> d.getMeasurementList().getMeasurementNames().stream()).distinct().map(m -> "\"" + m + "\"").collect(Collectors.joining(join));
}
String s = measurements.isEmpty() ? "[]" : String.format(listFormat, measurements);
control.paste(s);
} else if (name.toLowerCase().equals(GeneralTools.SYMBOL_MU + ""))
control.paste(GeneralTools.SYMBOL_MU + "");
else {
// TODO: fix
// // Imports (end with a new line)
// if (name.toLowerCase().equals("qpex"))
// control.insertText(0, "import static qupath.lib.gui.scripting.QPEx.*");
// else if (name.toLowerCase().equals("qp"))
// control.insertText(0, "import static qupath.lib.gui.scripting.QP.*");
// else if (name.toLowerCase().equals("all default"))
// control.insertText(0, QPEx.getDefaultImports(false));
// currentLanguage.get().getSyntax().handleNewLine(control, smartEditing.get());
}
e.consume();
});
if (name.equals(GeneralTools.SYMBOL_MU + ""))
action.setAccelerator(new KeyCodeCombination(KeyCode.M, KeyCombination.SHORTCUT_DOWN, KeyCombination.SHIFT_DOWN));
else if (name.toLowerCase().equals("pixel classifiers") || name.toLowerCase().equals("object classifiers"))
action.disabledProperty().bind(qupath.projectProperty().isNull());
else if (name.toLowerCase().equals("detection"))
action.disabledProperty().bind(qupath.imageDataProperty().isNull());
return action;
}
use of org.controlsfx.control.action.Action in project qupath by qupath.
the class DefaultScriptEditor method createOpenAction.
Action createOpenAction(final String name) {
Action action = new Action(name, e -> {
String dirPath = PathPrefs.scriptsPathProperty().get();
File dir = null;
if (dirPath != null)
dir = new File(dirPath);
// File file = Dialogs.promptForFile("Choose script file", dir, "Known script files", SCRIPT_EXTENSIONS);
File file = Dialogs.promptForFile("Choose script file", dir, "Groovy script", ".groovy");
if (file == null)
return;
try {
addScript(file, true);
PathPrefs.scriptsPathProperty().set(file.getParent());
} catch (Exception ex) {
logger.error("Unable to open script file: {}", ex);
ex.printStackTrace();
}
});
action.setAccelerator(new KeyCodeCombination(KeyCode.O, KeyCombination.SHORTCUT_DOWN));
return action;
}
use of org.controlsfx.control.action.Action in project qupath by qupath.
the class DefaultScriptEditor method createFindAction.
Action createFindAction(final String name) {
ScriptFindCommand findCommand = new ScriptFindCommand(this);
Action action = new Action(name, e -> {
findCommand.run();
e.consume();
});
action.setAccelerator(new KeyCodeCombination(KeyCode.F, KeyCombination.SHORTCUT_DOWN));
return action;
}
use of org.controlsfx.control.action.Action in project qupath by qupath.
the class DefaultScriptEditor method createRevertAction.
Action createRevertAction(final String name) {
Action action = new Action(name, e -> {
ScriptTab tab = getCurrentScriptObject();
if (tab != null) {
tab.refreshFileContents();
setToggle(tab.getLanguage());
}
});
return action;
}
Aggregations