diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/Activator.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/Activator.java index cf7c696192..6854889dc1 100644 --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/Activator.java +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/Activator.java @@ -7,18 +7,33 @@ ******************************************************************************/ package org.csstudio.trends.databrowser3; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import java.util.logging.Level; import java.util.logging.Logger; +import javafx.scene.Node; +import javafx.scene.control.DialogPane; +import javafx.scene.control.ScrollPane; +import javafx.stage.Window; +import javafx.util.Pair; +import org.csstudio.trends.databrowser3.model.AxisConfig; +import org.csstudio.trends.databrowser3.model.Model; +import org.csstudio.trends.databrowser3.ui.AddModelItemCommand; +import org.csstudio.trends.databrowser3.ui.AddPVDialog; import org.phoebus.framework.jobs.NamedThreadFactory; +import org.phoebus.ui.dialog.DialogHelper; import org.phoebus.ui.javafx.ImageCache; import javafx.scene.image.Image; import javafx.scene.image.ImageView; +import org.phoebus.ui.undo.UndoableActionManager; /** Global Data Browser helper * @author Kay Kasemir @@ -71,6 +86,53 @@ public static ImageView getIcon(final String base_name) return new ImageView(getImage(base_name)); } + public static void addPVsToPlotDialog(List pvNames, + UndoableActionManager undoableActionManager, + Model model, + Node nodeToPositionDialogOver) + { + // Offer potential PV name in dialog so user can edit/cancel + // sim://sine sim://ramp sim://noise + AddPVDialog addPVDialog = new AddPVDialog(pvNames.size(), model, false); + + { // Set layout of addPVDialog: + int addPVDialogWidth = 750; + int addPVDialogHeight = 600; + + Window addPVDialowWindow = addPVDialog.getDialogPane().getScene().getWindow(); + addPVDialowWindow.setWidth(addPVDialogWidth); + addPVDialowWindow.setHeight(addPVDialogHeight); + addPVDialog.setResizable(false); + + DialogPane dialogPane = addPVDialog.getDialogPane(); + dialogPane.setPrefWidth(addPVDialogWidth); + dialogPane.setPrefHeight(addPVDialogHeight); + dialogPane.setMaxWidth(Double.MAX_VALUE); + dialogPane.setMaxHeight(Double.MAX_VALUE); + + DialogHelper.positionDialog(addPVDialog, nodeToPositionDialogOver, (int) -addPVDialowWindow.getWidth()/2, (int) -addPVDialowWindow.getHeight()/2); + } + + for (int i=0; i optional_display_name, final double period, final AxisConfig axis, final ArchiveDataSource archive) @@ -52,6 +55,9 @@ public static AddModelItemCommand forPV( try { item = new PVItem(pv_name, period); + if (optional_display_name.isPresent()) { + item.setDisplayName(optional_display_name.get()); + } if (archive != null) item.addArchiveDataSource(archive); else diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/AddPVDialog.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/AddPVDialog.java index 7a371c1e0b..ee459d2601 100644 --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/AddPVDialog.java +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/AddPVDialog.java @@ -10,8 +10,25 @@ import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; +import javafx.scene.control.Button; +import javafx.scene.control.ButtonType; +import javafx.scene.control.CheckBox; +import javafx.scene.control.ChoiceBox; +import javafx.scene.control.Dialog; +import javafx.scene.control.Label; +import javafx.scene.control.RadioButton; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.Separator; +import javafx.scene.control.TextField; +import javafx.scene.control.ToggleGroup; +import javafx.scene.control.Tooltip; +import javafx.scene.layout.ColumnConstraints; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.Priority; +import javafx.util.Pair; import org.csstudio.trends.databrowser3.Messages; import org.csstudio.trends.databrowser3.model.AxisConfig; import org.csstudio.trends.databrowser3.model.Model; @@ -26,18 +43,6 @@ import javafx.collections.ObservableList; import javafx.event.ActionEvent; import javafx.scene.Node; -import javafx.scene.control.Button; -import javafx.scene.control.ButtonType; -import javafx.scene.control.CheckBox; -import javafx.scene.control.ChoiceBox; -import javafx.scene.control.Dialog; -import javafx.scene.control.Label; -import javafx.scene.control.Separator; -import javafx.scene.control.TextField; -import javafx.scene.control.Tooltip; -import javafx.scene.layout.ColumnConstraints; -import javafx.scene.layout.GridPane; -import javafx.scene.layout.Priority; /** Dialog for creating a new PV or Formula Item: Get name, axis. * For PV, also scan period. @@ -53,9 +58,12 @@ public class AddPVDialog extends Dialog { private final boolean formula; private final List existing_names; - private final List names = new ArrayList<>(); + private final List> nameAndDisplayNames = new ArrayList<>(); private final List periods = new ArrayList<>(); private final List monitors = new ArrayList<>(); + boolean useTheSameAxisForAllPVs = false; + private ChoiceBox axisForAllPVsChoiceBox = null; + private AxisConfig axisForAllPVs = null; private final List> axes = new ArrayList<>(); private ObservableList axis_options; @@ -69,7 +77,17 @@ public AddPVDialog(final int count, final Model model, final boolean formula) existing_names = model.getItems().stream().map(ModelItem::getName).collect(Collectors.toList()); - setTitle(formula ? Messages.AddFormula : Messages.AddPV); + if (formula) { + setTitle(Messages.AddFormula); + } + else { + if (count == 1) { + setTitle(Messages.AddPV); + } + else { + setTitle(Messages.AddPVs); + } + } setHeaderText(formula ? Messages.AddFormulaMsg : Messages.AddPVMsg); getDialogPane().setContent(createContent(model, count)); @@ -90,76 +108,152 @@ public AddPVDialog(final int count, final Model model, final boolean formula) { // Many names: Focus on OK to just confirm. // Otherwise focus on first name so it can be entered - if (names.size() > 1) + if (nameAndDisplayNames.size() > 1) ok.requestFocus(); else - names.get(0).requestFocus(); + nameAndDisplayNames.get(0).getKey().requestFocus(); })); } private Node createContent(final Model model, final int count) { - final GridPane layout = new GridPane(); - // layout.setGridLinesVisible(true); - layout.setHgap(5); - layout.setVgap(5); + final GridPane gridPane = new GridPane(); + gridPane.setHgap(5); + gridPane.setVgap(5); final ColumnConstraints stay = new ColumnConstraints(); final ColumnConstraints fill = new ColumnConstraints(); fill.setHgrow(Priority.ALWAYS); - layout.getColumnConstraints().addAll(stay, stay, fill); + gridPane.getColumnConstraints().addAll(stay, stay, fill); axis_options = FXCollections.observableArrayList(model.getAxes().stream().map(AxisConfig::getName).collect(Collectors.toList())); axis_options.add(0, Messages.AddPV_NewOrEmptyAxis); - int row = -1; + int row = 0; + if (count > 1) { + Label label_useTheSameQuestion = new Label(Messages.UseTheSameValueAxisForAllAddedPVs); + gridPane.add(label_useTheSameQuestion, 0, row); + + row += 1; + ToggleGroup toggleGroup = new ToggleGroup(); + RadioButton radioButton_useTheSame = new RadioButton(Messages.YesAllPVsAreAddedToTheAxis); + radioButton_useTheSame.setToggleGroup(toggleGroup); + + gridPane.add(radioButton_useTheSame, 0, row); + + axisForAllPVsChoiceBox = new ChoiceBox<>(axis_options); + axisForAllPVsChoiceBox.setTooltip(new Tooltip(Messages.AddPV_AxisTT)); + axisForAllPVsChoiceBox.getSelectionModel().select(0); + gridPane.add(axisForAllPVsChoiceBox, 1, row); + + radioButton_useTheSame.setOnAction(actionEvent -> { + axisForAllPVsChoiceBox.setDisable(false); + axes.forEach(axis -> axis.setDisable(true)); + useTheSameAxisForAllPVs = true; + }); + + row += 1; + RadioButton radioButton_useDifferent = new RadioButton(Messages.NoEachPVIsAssignedAnValueAxisIndividually); + radioButton_useDifferent.setToggleGroup(toggleGroup); + gridPane.add(radioButton_useDifferent, 0, row); + + radioButton_useDifferent.setOnAction(actionEvent -> { + axisForAllPVsChoiceBox.setDisable(true); + axes.forEach(axis -> axis.setDisable(false)); + useTheSameAxisForAllPVs = false; + }); + + row += 1; + Separator separator = new Separator(); + gridPane.add(separator, 0, row, 3, 1); + + useTheSameAxisForAllPVs = true; + radioButton_useTheSame.setSelected(true); + row += 1; + + if (Preferences.assign_pvs_from_clipboard_to_the_same_axis_by_default) { + radioButton_useTheSame.setSelected(true); + radioButton_useTheSame.getOnAction().handle(null); + } + else { + radioButton_useDifferent.setSelected(true); + radioButton_useDifferent.getOnAction().handle(null); + } + } + for (int i=0; i checkDuplicateName(name)); name.setTooltip(new Tooltip(formula ? Messages.AddFormula_NameTT : Messages.AddPV_NameTT)); if (! formula) PVAutocompleteMenu.INSTANCE.attachField(name); - names.add(name); - layout.add(name, 1, row, 2, 1); + gridPane.add(name, 1, row, 2, 1); + + if (!formula) { + row += 1; + String displayNameLabelText = Messages.TraceDisplayName; + Label displayNameLabel = new Label(displayNameLabelText); + gridPane.add(displayNameLabel, 0, row); + TextField displayNameTextField = new TextField(); + Tooltip displayNameTextFieldTooltip = new Tooltip(Messages.TraceDisplayNameTT); + displayNameTextField.setTooltip(displayNameTextFieldTooltip); + gridPane.add(displayNameTextField, 1, row, 2, 1); + nameAndDisplayNames.add(new Pair(name, displayNameTextField)); + } + else { + nameAndDisplayNames.add(new Pair(name, name)); + } if (! formula) { - layout.add(new Label(Messages.AddPV_Period), 0, ++row); + gridPane.add(new Label(Messages.AddPV_Period), 0, ++row); final TextField period = new TextField(Double.toString(Preferences.scan_period)); period.setTooltip(new Tooltip(Messages.AddPV_PeriodTT)); periods.add(period); period.setDisable(true); - layout.add(period, 1, row); + gridPane.add(period, 1, row); final CheckBox monitor = new CheckBox(Messages.AddPV_OnChange); monitor.setTooltip(new Tooltip(Messages.AddPV_OnChangeTT)); monitor.setSelected(true); monitors.add(monitor); monitor.setOnAction(event -> period.setDisable(monitor.isSelected())); - layout.add(monitors.get(i), 2, row); + gridPane.add(monitors.get(i), 2, row); } - layout.add(new Label(Messages.AddPV_Axis), 0, ++row); + gridPane.add(new Label(Messages.AddPV_Axis), 0, ++row); final ChoiceBox axis = new ChoiceBox<>(axis_options); axis.setTooltip(new Tooltip(Messages.AddPV_AxisTT)); axis.getSelectionModel().select(0); axes.add(axis); - layout.add(axes.get(i), 1, row); + gridPane.add(axes.get(i), 1, row); - layout.add(new Separator(), 0, ++row, 3, 1); + gridPane.add(new Separator(), 0, ++row, 3, 1); + row += 1; } - return layout; + ScrollPane scrollPane = new ScrollPane(gridPane); + scrollPane.setFitToWidth(true); + axes.forEach(axis -> axis.setDisable(useTheSameAxisForAllPVs)); // When the "use the same axis for all PVs" radio button is selected, then individual axes for each PV are disabled. Otherwise, they are enabled. + return scrollPane; } /** Set initial name. Only effective when called before dialog is opened. * @param i Index - * @param name Suggested name + * @param pvName Suggested name */ - public void setName(final int i, final String name) + public void setNameAndDisplayName(final int i, final String pvName) { - names.get(i).setText(name); + nameAndDisplayNames.get(i).getKey().setText(pvName); + nameAndDisplayNames.get(i).getValue().setText(""); + nameAndDisplayNames.get(i).getValue().setPromptText(Messages.DefaultDisplayName); } /** @param i Index @@ -167,7 +261,21 @@ public void setName(final int i, final String name) */ public String getName(final int i) { - return names.get(i).getText().trim(); + return nameAndDisplayNames.get(i).getKey().getText().trim(); + } + + /** @param i Index + * @return Optionally, the display name to be associated with the PV in the Data Browser + */ + public Optional getDisplayName(final int i) + { + String trimmedDisplayName = nameAndDisplayNames.get(i).getValue().getText().trim(); + if (trimmedDisplayName.isEmpty()) { + return Optional.empty(); + } + else { + return Optional.of(trimmedDisplayName); + } } /** @param i Index @@ -181,11 +289,22 @@ public double getScanPeriod(final int i) } /** @param i Index - * @return Index of Value Axis or -1 for 'create new' + * @return Index of Value Axis, or 0 for 'create new for an individual PV', or -1 for 'create one new axis to which all PVs are assigned'. */ public int getAxisIndex(final int i) { - return axes.get(i).getSelectionModel().getSelectedIndex(); + if (useTheSameAxisForAllPVs) { + int selectedIndex = axisForAllPVsChoiceBox.getSelectionModel().getSelectedIndex(); + if (selectedIndex == 0) { + return -1; + } + else { + return selectedIndex; + } + } + else { + return axes.get(i).getSelectionModel().getSelectedIndex(); + } } /** Helper for getting or creating an axis @@ -194,13 +313,28 @@ public int getAxisIndex(final int i) * @param axis_index Axis index from {@link AddPVDialog#getAxisIndex(int)} * @return Corresponding model axis, which might have been created as necessary */ - public static AxisConfig getOrCreateAxis(final Model model, final UndoableActionManager undo, final int axis_index) + public AxisConfig getOrCreateAxis(final Model model, final UndoableActionManager undo, final int axis_index) { // Did user select axis? - if (axis_index > 0) + if (axis_index > 0) { return model.getAxis(axis_index-1); - // Use first empty axis, or create a new one - return model.getEmptyAxis().orElseGet(() -> new AddAxisCommand(undo, model).getAxis()); + } + else if (axis_index == 0){ + // Use first empty axis, or create a new one + return model.getEmptyAxis().orElseGet(() -> new AddAxisCommand(undo, model).getAxis()); + } + else if (axis_index == -1) { + if (axisForAllPVs != null) { + return axisForAllPVs; + } + else { + axisForAllPVs = model.getEmptyAxis().orElseGet(() -> new AddAxisCommand(undo, model).getAxis()); + return axisForAllPVs; + } + } + else { + throw new RuntimeException("Unhandled case: " + axis_index); + } } private void checkDuplicateName(final TextField name) @@ -222,14 +356,14 @@ private void checkDuplicateName(final TextField name) */ private boolean updateAndValidate() { - for (int i=0; i names) { - // Offer potential PV name in dialog so user can edit/cancel - // sim://sine sim://ramp sim://noise - final AddPVDialog dlg = new AddPVDialog(names.size(), model, false); - DialogHelper.positionDialog(dlg, plot.getPlot(), -200, -200); - for (int i=0; i names, final AddPVDialog dlg = new AddPVDialog(names.size(), model, false); DialogHelper.positionDialog(dlg, plot.getPlot(), -200, -200); - for (int i=0; i=archives.size()) ? null : archives.get(i); AddModelItemCommand.forPV(undo, - model, dlg.getName(i), dlg.getScanPeriod(i), + model, dlg.getName(i), dlg.getDisplayName(i), dlg.getScanPeriod(i), axis, archive); } // return; diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/Perspective.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/Perspective.java index 71e4804cdb..5ee4cd789d 100644 --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/Perspective.java +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/Perspective.java @@ -20,6 +20,7 @@ import javafx.scene.image.ImageView; import javafx.scene.input.Dragboard; import javafx.scene.input.TransferMode; +import javafx.util.Pair; import org.csstudio.javafx.rtplot.internal.YAxisImpl; import org.csstudio.trends.databrowser3.Activator; import org.csstudio.trends.databrowser3.Messages; @@ -32,6 +33,7 @@ import org.csstudio.trends.databrowser3.ui.plot.ModelBasedPlot; import org.csstudio.trends.databrowser3.ui.plot.PlotListener; import org.csstudio.trends.databrowser3.ui.properties.AddPVorFormulaMenuItem; +import org.csstudio.trends.databrowser3.ui.properties.AddPVsFromTheClipboardMenuItem; import org.csstudio.trends.databrowser3.ui.properties.DeleteAxes; import org.csstudio.trends.databrowser3.ui.properties.MoveAxisToTheLeft; import org.csstudio.trends.databrowser3.ui.properties.MoveAxisToTheRight; @@ -152,6 +154,7 @@ private void createContextMenu() final List add_data = new ArrayList<>(); add_data.add(new AddPVorFormulaMenuItem(plot.getPlot(), model, undo, false)); add_data.add(new AddPVorFormulaMenuItem(plot.getPlot(), model, undo, true)); + add_data.add(new AddPVsFromTheClipboardMenuItem(undo, model, plot.getPlot())); for (String type : SampleImporters.getTypes()) add_data.add(new SampleImportAction(model, type, undo)); diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/plot/PlotListener.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/plot/PlotListener.java index 8c7d997051..437e68b2ca 100644 --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/plot/PlotListener.java +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/plot/PlotListener.java @@ -11,6 +11,7 @@ import java.time.Instant; import java.util.List; +import javafx.util.Pair; import org.csstudio.trends.databrowser3.model.AnnotationInfo; import org.csstudio.trends.databrowser3.model.ArchiveDataSource; import org.phoebus.core.types.ProcessVariable; diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/properties/AddPVorFormulaMenuItem.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/properties/AddPVorFormulaMenuItem.java index ddb8e8d382..3c35201179 100644 --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/properties/AddPVorFormulaMenuItem.java +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/properties/AddPVorFormulaMenuItem.java @@ -44,7 +44,7 @@ public AddPVorFormulaMenuItem(final Node node, if (! dlg.showAndWait().orElse(false)) return; - final AxisConfig axis = AddPVDialog.getOrCreateAxis(model, undo, dlg.getAxisIndex(0)); + final AxisConfig axis = dlg.getOrCreateAxis(model, undo, dlg.getAxisIndex(0)); if (formula) { @@ -54,7 +54,7 @@ public AddPVorFormulaMenuItem(final Node node, FormulaItemEditor.run(node, item, undo); } else - AddModelItemCommand.forPV(undo, model, dlg.getName(0), dlg.getScanPeriod(0), axis, null); + AddModelItemCommand.forPV(undo, model, dlg.getName(0), dlg.getDisplayName(0), dlg.getScanPeriod(0), axis, null); }); } } diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/properties/AddPVsFromTheClipboardMenuItem.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/properties/AddPVsFromTheClipboardMenuItem.java new file mode 100644 index 0000000000..59f411db5d --- /dev/null +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/properties/AddPVsFromTheClipboardMenuItem.java @@ -0,0 +1,58 @@ +package org.csstudio.trends.databrowser3.ui.properties; + +import javafx.scene.Node; +import javafx.scene.control.Alert; +import javafx.scene.control.MenuItem; +import javafx.scene.input.Clipboard; +import org.csstudio.trends.databrowser3.Activator; +import org.csstudio.trends.databrowser3.Messages; +import org.csstudio.trends.databrowser3.model.Model; +import org.csstudio.trends.databrowser3.ui.DroppedPVNameParser; +import org.phoebus.ui.dialog.DialogHelper; +import org.phoebus.ui.undo.UndoableActionManager; + +public class AddPVsFromTheClipboardMenuItem extends MenuItem { + Node nodeToPositionDialogOver; + public AddPVsFromTheClipboardMenuItem(UndoableActionManager undoableActionManager, + Model model, + Node nodeToPositionDialogOver) { + super(Messages.AddPVsFromTheClipboard, + Activator.getIcon("paste")); + + this.nodeToPositionDialogOver = nodeToPositionDialogOver; + + setOnAction(actionEvent -> { + Clipboard clipboard = Clipboard.getSystemClipboard(); + if (clipboard.hasString()) { + String clipboardContents = clipboard.getString(); + try { + var pvNameAndDisplayNames = DroppedPVNameParser.parseDroppedPVs(clipboardContents); + if (pvNameAndDisplayNames.size() > 0) { + Activator.addPVsToPlotDialog(pvNameAndDisplayNames, + undoableActionManager, + model, + nodeToPositionDialogOver); + } + else { + showNoPVsFoundInClipboardWarning(); + } + } + catch (Exception exception) { + showNoPVsFoundInClipboardWarning(); + } + } + else { + showNoPVsFoundInClipboardWarning(); + } + }); + } + + private void showNoPVsFoundInClipboardWarning() { + Alert warningAlert = new Alert(Alert.AlertType.INFORMATION, + Messages.TheClipboardDoesNotContainPVs); + warningAlert.setTitle(Messages.NoPVsFoundInTheClipboard); + warningAlert.setHeaderText(Messages.NoPVsFoundInTheClipboard); + DialogHelper.positionDialog(warningAlert, nodeToPositionDialogOver, 0, 0); + warningAlert.show(); + } +} diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/properties/TracesTab.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/properties/TracesTab.java index c8915e07fc..25888e768a 100644 --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/properties/TracesTab.java +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/properties/TracesTab.java @@ -711,12 +711,13 @@ private void createContextMenu() { final MenuItem add_pv = new AddPVorFormulaMenuItem(trace_table, model, undo, false); final MenuItem add_formula = new AddPVorFormulaMenuItem(trace_table, model, undo, true); + final MenuItem add_pvs_from_the_clipboard = new AddPVsFromTheClipboardMenuItem(undo, model, trace_table); final ContextMenu menu = new ContextMenu(); trace_table.setOnContextMenuRequested(event -> { final ObservableList items = menu.getItems(); - items.setAll(add_pv, add_formula); + items.setAll(add_pv, add_formula, add_pvs_from_the_clipboard); final List selection = trace_table.getSelectionModel().getSelectedItems(); diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/search/AddToPlotAction.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/search/AddToPlotAction.java index de3dc37687..fda16e0314 100644 --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/search/AddToPlotAction.java +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/search/AddToPlotAction.java @@ -8,7 +8,9 @@ package org.csstudio.trends.databrowser3.ui.search; import java.util.List; +import java.util.Optional; +import javafx.util.Pair; import org.csstudio.trends.databrowser3.Activator; import org.csstudio.trends.databrowser3.Messages; import org.csstudio.trends.databrowser3.model.AxisConfig; @@ -47,17 +49,20 @@ public AddToPlotAction(final Node node, final Model model, final UndoableActionM final AddPVDialog dlg = new AddPVDialog(channels.size(), model, false); DialogHelper.positionDialog(dlg, node, 200, -200); - for (int i=0; i