From 401877505292b8327007f4b14ec5291d0f672ee7 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Fri, 16 Feb 2024 11:20:11 +0100 Subject: [PATCH 01/36] CSSTUDIO-2072 Remove '\t', ',' ,';', and ' ' as separators from drag-and-dropped lists of PV names. --- .../csstudio/trends/databrowser3/ui/DroppedPVNameParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParser.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParser.java index 5f13ac786b..943f6b088f 100644 --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParser.java +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParser.java @@ -49,7 +49,7 @@ public static List parseDroppedPVs(String text) throws Exception pos = locateClosingQuote(text, pos+1); else if (c == '(') pos = locateClosingBrace(text, pos+1); - else if ("\r\n\t,; ".indexOf(c) >= 0) + else if ("\r\n".indexOf(c) >= 0) { // Found one of the separators final String name = text.substring(start, pos).trim(); if (! name.isEmpty()) From 1f74febc22b85e53d75947ed617a9ee1515ba5c5 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Mon, 19 Feb 2024 09:30:14 +0100 Subject: [PATCH 02/36] CSSTUDIO-2072 Add the functionality to parse display names to the function DroppedPVNameParser.parseDroppedPVs(). --- .../trends/databrowser3/ui/Controller.java | 5 ++-- .../databrowser3/ui/DroppedPVNameParser.java | 24 +++++++++++++++---- .../trends/databrowser3/ui/Perspective.java | 3 ++- .../databrowser3/ui/plot/PlotListener.java | 3 ++- 4 files changed, 27 insertions(+), 8 deletions(-) diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/Controller.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/Controller.java index 68d52c72a0..948ce4c29f 100644 --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/Controller.java +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/Controller.java @@ -20,6 +20,7 @@ import java.util.concurrent.TimeUnit; import java.util.logging.Level; +import javafx.util.Pair; import org.csstudio.javafx.rtplot.Trace; import org.csstudio.trends.databrowser3.Activator; import org.csstudio.trends.databrowser3.archive.ArchiveFetchJob; @@ -238,14 +239,14 @@ public void timeConfigRequested() } @Override - public void droppedNames(final List names) + public void droppedNames(final List> 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 parseDroppedPVs(String text) throws Exception + public static List> parseDroppedPVs(String text) throws Exception { text = text.trim(); // Remove optional 'array' wrapper if (text.startsWith("[") && text.endsWith("]")) text = text.substring(1, text.length()-2); - final List names = new ArrayList<>(); + final List> names = new ArrayList<>(); // Need to look for a separator, but skipping them inside quoted text and brackets final int len = text.length(); @@ -49,11 +51,25 @@ public static List parseDroppedPVs(String text) throws Exception pos = locateClosingQuote(text, pos+1); else if (c == '(') pos = locateClosingBrace(text, pos+1); + else if (c == ',') { + // Case: PV Name with a specified display name + String pvName = text.substring(start, pos).trim(); + if (!pvName.isEmpty()) { + // Parse display name until end-of-line: + String displayName = ""; + for (pos++; pos < len && "\r\n".indexOf(text.charAt(pos)) == -1; pos++) { + displayName = displayName + text.charAt(pos); + } + displayName = displayName.trim(); + names.add(new Pair<>(pvName, displayName)); + } + start = pos++; + } else if ("\r\n".indexOf(c) >= 0) { // Found one of the separators final String name = text.substring(start, pos).trim(); if (! name.isEmpty()) - names.add(name); + names.add(new Pair(name, name)); start = ++pos; } else @@ -64,7 +80,7 @@ else if ("\r\n".indexOf(c) >= 0) { final String name = text.substring(start, pos).trim(); if (! name.isEmpty()) - names.add(name); + names.add(new Pair(name, name)); } return names; } 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 f0c53d426d..d3c224ad82 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 @@ -18,6 +18,7 @@ import java.util.prefs.Preferences; import java.util.stream.Collectors; +import javafx.util.Pair; import org.csstudio.trends.databrowser3.Activator; import org.csstudio.trends.databrowser3.Messages; import org.csstudio.trends.databrowser3.imports.SampleImportAction; @@ -306,7 +307,7 @@ else if (db.hasString()) final String dropped = db.getString(); try { - final List pvs = DroppedPVNameParser.parseDroppedPVs(dropped); + final List> pvs = DroppedPVNameParser.parseDroppedPVs(dropped); if (pvs.size() > 0) Platform.runLater(() -> lst.droppedNames(pvs)); } 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..10dffeda2f 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; @@ -45,7 +46,7 @@ public interface PlotListener /** Received names, presumably for PVs, via drag and drop * @param name PV(?) names */ - public void droppedNames(List name); + public void droppedNames(List> name); /** Received PV names and/or archive data sources via drag and drop * From ab3a1af8259dd07a3fb26093ebfe8d090a5f7929 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Mon, 19 Feb 2024 09:34:28 +0100 Subject: [PATCH 03/36] CSSTUDIO-2072 Use Messages.PVName instead of Messages.Name, and remove Messages.Name (which now has no references). --- .../main/java/org/csstudio/trends/databrowser3/Messages.java | 1 - .../java/org/csstudio/trends/databrowser3/ui/AddPVDialog.java | 2 +- .../org/csstudio/trends/databrowser3/messages.properties | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/Messages.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/Messages.java index 6ae1f35e8f..6e1570db03 100644 --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/Messages.java +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/Messages.java @@ -210,7 +210,6 @@ public class Messages Model_Disconnected, MoveItemDown, MoveItemUp, - Name, NegErrColumn, NewPlot, NewPlotFailed, 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..ccc69bfde3 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 @@ -114,7 +114,7 @@ private Node createContent(final Model model, final int count) int row = -1; for (int i=0; i checkDuplicateName(name)); diff --git a/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties b/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties index da2e1c39eb..4996f643f3 100644 --- a/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties +++ b/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties @@ -190,7 +190,6 @@ Miscellaneous=Misc. Model_Disconnected=Disconnected MoveItemDown=Move Down MoveItemUp=Move Up -Name=Name NegErrColumn=Negative Error NewPlot=New plot NewPlotFailed=Failed to create new plot From 56e65b4ecfb669ef0bdf4bcb83efead5b0666bf2 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Mon, 19 Feb 2024 09:50:46 +0100 Subject: [PATCH 04/36] CSSTUDIO-2072 Bugfix: increment 'pos' before assignment to 'start'. --- .../csstudio/trends/databrowser3/ui/DroppedPVNameParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParser.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParser.java index cafa939878..3c8481597d 100644 --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParser.java +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParser.java @@ -63,7 +63,7 @@ else if (c == ',') { displayName = displayName.trim(); names.add(new Pair<>(pvName, displayName)); } - start = pos++; + start = ++pos; } else if ("\r\n".indexOf(c) >= 0) { // Found one of the separators From f1a5eab86e4909aa5594aa9ec3b9d6b5613c9b3b Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Mon, 19 Feb 2024 09:53:16 +0100 Subject: [PATCH 05/36] CSSTUDIO-2072 Add UI-elements for entering display names when adding PVs. --- .../org/csstudio/trends/databrowser3/ui/AddPVDialog.java | 9 +++++++++ 1 file changed, 9 insertions(+) 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 ccc69bfde3..6d48782dc8 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 @@ -124,6 +124,15 @@ private Node createContent(final Model model, final int count) names.add(name); layout.add(name, 1, row, 2, 1); + row += 1; + String displayNameLabelText = Messages.TraceDisplayName; + Label displayNameLabel = new Label(displayNameLabelText); + layout.add(displayNameLabel, 0, row); + TextField displayNameTextField = new TextField(); + Tooltip displayNameTextFieldTooltip = new Tooltip(Messages.TraceDisplayNameTT); + displayNameTextField.setTooltip(displayNameTextFieldTooltip); + layout.add(displayNameTextField, 1, row, 2, 1); + if (! formula) { layout.add(new Label(Messages.AddPV_Period), 0, ++row); From f97e9003617c9f61cc61166a5776c44e3850099d Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Mon, 19 Feb 2024 10:04:10 +0100 Subject: [PATCH 06/36] CSSTUDIO-2072 Add display names to UI when drag-and-dropping PV names with associated display names. --- .../trends/databrowser3/ui/AddPVDialog.java | 23 +++++++++++-------- .../trends/databrowser3/ui/Controller.java | 8 ++++--- .../ui/search/AddToPlotAction.java | 7 ++++-- 3 files changed, 23 insertions(+), 15 deletions(-) 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 6d48782dc8..1946f5b5e4 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 @@ -12,6 +12,7 @@ import java.util.List; import java.util.stream.Collectors; +import javafx.util.Pair; import org.csstudio.trends.databrowser3.Messages; import org.csstudio.trends.databrowser3.model.AxisConfig; import org.csstudio.trends.databrowser3.model.Model; @@ -53,7 +54,7 @@ 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<>(); private final List> axes = new ArrayList<>(); @@ -90,10 +91,10 @@ 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(); })); } @@ -121,7 +122,6 @@ private Node createContent(final Model model, final int count) 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); row += 1; @@ -133,6 +133,8 @@ private Node createContent(final Model model, final int count) displayNameTextField.setTooltip(displayNameTextFieldTooltip); layout.add(displayNameTextField, 1, row, 2, 1); + nameAndDisplayNames.add(new Pair(name, displayNameTextField)); + if (! formula) { layout.add(new Label(Messages.AddPV_Period), 0, ++row); @@ -164,11 +166,12 @@ private Node createContent(final Model model, final int count) /** Set initial name. Only effective when called before dialog is opened. * @param i Index - * @param name Suggested name + * @param nameAndDisplayName Suggested name */ - public void setName(final int i, final String name) + public void setNameAndDisplayName(final int i, final Pair nameAndDisplayName) { - names.get(i).setText(name); + nameAndDisplayNames.get(i).getKey().setText(nameAndDisplayName.getKey()); + nameAndDisplayNames.get(i).getValue().setText(nameAndDisplayName.getValue()); } /** @param i Index @@ -176,7 +179,7 @@ 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 @@ -231,14 +234,14 @@ private void checkDuplicateName(final TextField name) */ private boolean updateAndValidate() { - 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 names, final AddPVDialog dlg = new AddPVDialog(names.size(), model, false); DialogHelper.positionDialog(dlg, plot.getPlot(), -200, -200); - for (int i=0; i Date: Mon, 19 Feb 2024 10:23:29 +0100 Subject: [PATCH 07/36] CSSTUDIO-2072 Add display name to new traces when drag-and-dropping PV names with associated display names. --- .../trends/databrowser3/imports/SampleImportAction.java | 2 +- .../trends/databrowser3/ui/AddModelItemCommand.java | 2 ++ .../org/csstudio/trends/databrowser3/ui/AddPVDialog.java | 8 ++++++++ .../org/csstudio/trends/databrowser3/ui/Controller.java | 4 ++-- .../ui/properties/AddPVorFormulaMenuItem.java | 2 +- .../trends/databrowser3/ui/search/AddToPlotAction.java | 1 + 6 files changed, 15 insertions(+), 4 deletions(-) diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/imports/SampleImportAction.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/imports/SampleImportAction.java index 5807edae69..20b20a0310 100644 --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/imports/SampleImportAction.java +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/imports/SampleImportAction.java @@ -64,7 +64,7 @@ private void run() final ArchiveDataSource imported = new ArchiveDataSource(url, type); // Add PV Item with data to model AddModelItemCommand.forPV(op_manager, model, - type, Preferences.scan_period, axis, imported); + type, type, Preferences.scan_period, axis, imported); } catch (Exception ex) { diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/AddModelItemCommand.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/AddModelItemCommand.java index 138af3e53d..306288d0e2 100644 --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/AddModelItemCommand.java +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/AddModelItemCommand.java @@ -43,6 +43,7 @@ public static AddModelItemCommand forPV( final UndoableActionManager operations_manager, final Model model, final String pv_name, + final String display_name, final double period, final AxisConfig axis, final ArchiveDataSource archive) @@ -52,6 +53,7 @@ public static AddModelItemCommand forPV( try { item = new PVItem(pv_name, period); + item.setDisplayName(display_name); 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 1946f5b5e4..ef4daf312f 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 @@ -182,6 +182,14 @@ public String getName(final int i) return nameAndDisplayNames.get(i).getKey().getText().trim(); } + /** @param i Index + * @return Display name associated with PV + */ + public String getDisplayName(final int i) + { + return nameAndDisplayNames.get(i).getValue().getText().trim(); + } + /** @param i Index * @return Entered scan period in seconds. 0 for 'scan' */ diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/Controller.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/Controller.java index c729c13f8d..6803e1b9cc 100644 --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/Controller.java +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/Controller.java @@ -255,7 +255,7 @@ public void droppedNames(final List> names) { final AxisConfig axis = AddPVDialog.getOrCreateAxis(model, undo, dlg.getAxisIndex(i)); AddModelItemCommand.forPV(undo, - model, dlg.getName(i), dlg.getScanPeriod(i), + model, dlg.getName(i), dlg.getDisplayName(i), dlg.getScanPeriod(i), axis, null); } } @@ -306,7 +306,7 @@ public void droppedPVNames(List names, final ArchiveDataSource archive = (archives == null || 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/properties/AddPVorFormulaMenuItem.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/properties/AddPVorFormulaMenuItem.java index ddb8e8d382..63f17045ca 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 @@ -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/search/AddToPlotAction.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/search/AddToPlotAction.java index bcdb3f4c05..674c8c58cf 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 @@ -60,6 +60,7 @@ public AddToPlotAction(final Node node, final Model model, final UndoableActionM final ChannelInfo channel = channels.get(i); final AxisConfig axis = AddPVDialog.getOrCreateAxis(model, undo, dlg.getAxisIndex(i)); AddModelItemCommand.forPV(undo, model, + channel.getName(), channel.getName(), 0.0, axis, From 814bc26aeb6757822dcf0ae56182aad25985090e Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Tue, 20 Feb 2024 15:38:32 +0100 Subject: [PATCH 08/36] CSSTUDIO-2072 Add the class "AddPVsFromTheClipboardMenuItem". --- .../AddPVsFromTheClipboardMenuItem.java | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/properties/AddPVsFromTheClipboardMenuItem.java 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..ea45f84747 --- /dev/null +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/properties/AddPVsFromTheClipboardMenuItem.java @@ -0,0 +1,53 @@ +package org.csstudio.trends.databrowser3.ui.properties; + +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.ui.DroppedPVNameParser; +import org.csstudio.trends.databrowser3.ui.plot.ModelBasedPlot; +import org.csstudio.trends.databrowser3.ui.plot.PlotListener; +import org.phoebus.ui.dialog.DialogHelper; + +public class AddPVsFromTheClipboardMenuItem extends MenuItem { + ModelBasedPlot modelBasedPlot; + public AddPVsFromTheClipboardMenuItem(ModelBasedPlot modelBasedPlot) { + super("Add PV(s) from the Clipboard", + Activator.getIcon("paste")); + + this.modelBasedPlot = modelBasedPlot; + + setOnAction(actionEvent -> { + Clipboard clipboard = Clipboard.getSystemClipboard(); + if (clipboard.hasString()) { + String clipboardContents = clipboard.getString(); + try { + var pvNameAndDisplayNames = DroppedPVNameParser.parseDroppedPVs(clipboardContents); + if (pvNameAndDisplayNames.size() > 0) { + PlotListener plotListener = this.modelBasedPlot.getListener(); // Cannot call modelBasedPlot.getListener() in the constructor, because getListener() may return "null" at that stage. + if (plotListener != null) { + plotListener.droppedNames(pvNameAndDisplayNames); + } + } + else { + showNoPVsFoundInClipboardWarning(); + } + } + catch (Exception exception) { + showNoPVsFoundInClipboardWarning(); + } + } + else { + showNoPVsFoundInClipboardWarning(); + } + }); + } + + private void showNoPVsFoundInClipboardWarning() { + Alert warningAlert = new Alert(Alert.AlertType.INFORMATION, + "The clipboard doesn't contain a list of PV names separated by newline-characters:\n\n\n\n ⋮\n\nOptionally, display names can be specified after a comma following the PV name:\n\n,\n,\n ⋮"); + warningAlert.setHeaderText("No PVs found in the clipboard!"); + DialogHelper.positionDialog(warningAlert, modelBasedPlot.getPlot(), 0, 0); + warningAlert.show(); + } +} From 78cfe8a517075c230dc31497fc9d6558b81320e0 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Tue, 20 Feb 2024 15:39:23 +0100 Subject: [PATCH 09/36] Add "Add PV(s) from the Clipboard" to the context-menu in the Data Browser plot. --- .../java/org/csstudio/trends/databrowser3/ui/Perspective.java | 2 ++ 1 file changed, 2 insertions(+) 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 97a363057e..0a67f7b9e0 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 @@ -33,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; @@ -153,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(plot)); for (String type : SampleImporters.getTypes()) add_data.add(new SampleImportAction(model, type, undo)); From 3e9a01cdc6280b44e6255034493d5acf98a27eb7 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Wed, 21 Feb 2024 09:33:54 +0100 Subject: [PATCH 10/36] CSSTUDIO-2072 Refactor: Move implementation of droppedNames() into the class "Activator". --- .../trends/databrowser3/Activator.java | 39 +++++++++++++++++++ .../trends/databrowser3/ui/Controller.java | 18 +-------- .../trends/databrowser3/ui/Perspective.java | 2 +- .../AddPVsFromTheClipboardMenuItem.java | 23 ++++++----- 4 files changed, 54 insertions(+), 28 deletions(-) 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..1d05c7b51c 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,6 +7,7 @@ ******************************************************************************/ package org.csstudio.trends.databrowser3; +import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; @@ -14,11 +15,19 @@ import java.util.concurrent.TimeUnit; import java.util.logging.Logger; +import javafx.scene.Node; +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 +80,36 @@ public static ImageView getIcon(final String base_name) return new ImageView(getImage(base_name)); } + public static void droppedNames(List> names, + UndoableActionManager undoableActionManager, + Model model, + Node nodeToPositionDialogOver) + { + // Offer potential PV name in dialog so user can edit/cancel + // sim://sine sim://ramp sim://noise + AddPVDialog dlg = new AddPVDialog(names.size(), model, false); + DialogHelper.positionDialog(dlg, nodeToPositionDialogOver, 0, 0); + + 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 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(plot)); + 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/properties/AddPVsFromTheClipboardMenuItem.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/properties/AddPVsFromTheClipboardMenuItem.java index ea45f84747..2ffde59ea1 100644 --- 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 @@ -1,21 +1,24 @@ 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.model.Model; import org.csstudio.trends.databrowser3.ui.DroppedPVNameParser; -import org.csstudio.trends.databrowser3.ui.plot.ModelBasedPlot; -import org.csstudio.trends.databrowser3.ui.plot.PlotListener; import org.phoebus.ui.dialog.DialogHelper; +import org.phoebus.ui.undo.UndoableActionManager; public class AddPVsFromTheClipboardMenuItem extends MenuItem { - ModelBasedPlot modelBasedPlot; - public AddPVsFromTheClipboardMenuItem(ModelBasedPlot modelBasedPlot) { + Node nodeToPositionDialogOver; + public AddPVsFromTheClipboardMenuItem(UndoableActionManager undoableActionManager, + Model model, + Node nodeToPositionDialogOver) { super("Add PV(s) from the Clipboard", Activator.getIcon("paste")); - this.modelBasedPlot = modelBasedPlot; + this.nodeToPositionDialogOver = nodeToPositionDialogOver; setOnAction(actionEvent -> { Clipboard clipboard = Clipboard.getSystemClipboard(); @@ -24,10 +27,10 @@ public AddPVsFromTheClipboardMenuItem(ModelBasedPlot modelBasedPlot) { try { var pvNameAndDisplayNames = DroppedPVNameParser.parseDroppedPVs(clipboardContents); if (pvNameAndDisplayNames.size() > 0) { - PlotListener plotListener = this.modelBasedPlot.getListener(); // Cannot call modelBasedPlot.getListener() in the constructor, because getListener() may return "null" at that stage. - if (plotListener != null) { - plotListener.droppedNames(pvNameAndDisplayNames); - } + Activator.droppedNames(pvNameAndDisplayNames, + undoableActionManager, + model, + nodeToPositionDialogOver); } else { showNoPVsFoundInClipboardWarning(); @@ -47,7 +50,7 @@ private void showNoPVsFoundInClipboardWarning() { Alert warningAlert = new Alert(Alert.AlertType.INFORMATION, "The clipboard doesn't contain a list of PV names separated by newline-characters:\n\n\n\n ⋮\n\nOptionally, display names can be specified after a comma following the PV name:\n\n,\n,\n ⋮"); warningAlert.setHeaderText("No PVs found in the clipboard!"); - DialogHelper.positionDialog(warningAlert, modelBasedPlot.getPlot(), 0, 0); + DialogHelper.positionDialog(warningAlert, nodeToPositionDialogOver, 0, 0); warningAlert.show(); } } From 0aae04893744cde9e7332baef963fa5ee0303e03 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Wed, 21 Feb 2024 09:35:50 +0100 Subject: [PATCH 11/36] CSSTUDIO-2072 Rename Activator.droppedNames() -> Activator.addPVsToPlotDialog(). --- .../java/org/csstudio/trends/databrowser3/Activator.java | 8 ++++---- .../org/csstudio/trends/databrowser3/ui/Controller.java | 2 +- .../ui/properties/AddPVsFromTheClipboardMenuItem.java | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) 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 1d05c7b51c..7d085392ab 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 @@ -80,10 +80,10 @@ public static ImageView getIcon(final String base_name) return new ImageView(getImage(base_name)); } - public static void droppedNames(List> names, - UndoableActionManager undoableActionManager, - Model model, - Node nodeToPositionDialogOver) + public static void addPVsToPlotDialog(List> names, + UndoableActionManager undoableActionManager, + Model model, + Node nodeToPositionDialogOver) { // Offer potential PV name in dialog so user can edit/cancel // sim://sine sim://ramp sim://noise diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/Controller.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/Controller.java index cc899a12fc..218199caf6 100644 --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/Controller.java +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/Controller.java @@ -241,7 +241,7 @@ public void timeConfigRequested() @Override public void droppedNames(final List> names) { - Activator.droppedNames(names, plot.getPlot().getUndoableActionManager(), model, plot.getPlot()); + Activator.addPVsToPlotDialog(names, plot.getPlot().getUndoableActionManager(), model, plot.getPlot()); } @Override 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 index 2ffde59ea1..f09906aae5 100644 --- 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 @@ -27,10 +27,10 @@ public AddPVsFromTheClipboardMenuItem(UndoableActionManager undoableActionManage try { var pvNameAndDisplayNames = DroppedPVNameParser.parseDroppedPVs(clipboardContents); if (pvNameAndDisplayNames.size() > 0) { - Activator.droppedNames(pvNameAndDisplayNames, - undoableActionManager, - model, - nodeToPositionDialogOver); + Activator.addPVsToPlotDialog(pvNameAndDisplayNames, + undoableActionManager, + model, + nodeToPositionDialogOver); } else { showNoPVsFoundInClipboardWarning(); From b7f41e2ebb4a3f304f7edc03449a6e7192dbc63c Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Wed, 21 Feb 2024 10:47:16 +0100 Subject: [PATCH 12/36] CSSTUDIO-2072 Add an outermost ScrollPane to the contents of the "Add PV" window, and rename "layout" -> "gridPane". --- .../trends/databrowser3/ui/AddPVDialog.java | 50 ++++++++++--------- 1 file changed, 26 insertions(+), 24 deletions(-) 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 ef4daf312f..985d135f58 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 @@ -12,6 +12,16 @@ import java.util.List; 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.ScrollPane; +import javafx.scene.control.Separator; +import javafx.scene.control.TextField; +import javafx.scene.control.Tooltip; import javafx.util.Pair; import org.csstudio.trends.databrowser3.Messages; import org.csstudio.trends.databrowser3.model.AxisConfig; @@ -27,15 +37,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; @@ -100,14 +101,14 @@ public AddPVDialog(final int count, final Model model, final boolean formula) private Node createContent(final Model model, final int count) { - final GridPane layout = new GridPane(); + final GridPane gridPane = new GridPane(); // layout.setGridLinesVisible(true); - layout.setHgap(5); - layout.setVgap(5); + 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); @@ -116,52 +117,53 @@ private Node createContent(final Model model, final int count) for (int i=0; i checkDuplicateName(name)); name.setTooltip(new Tooltip(formula ? Messages.AddFormula_NameTT : Messages.AddPV_NameTT)); if (! formula) PVAutocompleteMenu.INSTANCE.attachField(name); - layout.add(name, 1, row, 2, 1); + gridPane.add(name, 1, row, 2, 1); row += 1; String displayNameLabelText = Messages.TraceDisplayName; Label displayNameLabel = new Label(displayNameLabelText); - layout.add(displayNameLabel, 0, row); + gridPane.add(displayNameLabel, 0, row); TextField displayNameTextField = new TextField(); Tooltip displayNameTextFieldTooltip = new Tooltip(Messages.TraceDisplayNameTT); displayNameTextField.setTooltip(displayNameTextFieldTooltip); - layout.add(displayNameTextField, 1, row, 2, 1); + gridPane.add(displayNameTextField, 1, row, 2, 1); nameAndDisplayNames.add(new Pair(name, displayNameTextField)); 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); } - return layout; + ScrollPane scrollPane = new ScrollPane(gridPane); + return scrollPane; } /** Set initial name. Only effective when called before dialog is opened. From dcf440cceafe296e72fed621b6a7fd6ed67b431a Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Wed, 21 Feb 2024 10:54:18 +0100 Subject: [PATCH 13/36] CSSTUDIO-2072 Set layout of the "Add PV" window, and rename "dlg" -> "addPVDialog". --- .../trends/databrowser3/Activator.java | 46 +++++++++++++++---- 1 file changed, 38 insertions(+), 8 deletions(-) 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 7d085392ab..8f809df822 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 @@ -13,9 +13,13 @@ 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; @@ -87,24 +91,50 @@ public static void addPVsToPlotDialog(List> names, { // Offer potential PV name in dialog so user can edit/cancel // sim://sine sim://ramp sim://noise - AddPVDialog dlg = new AddPVDialog(names.size(), model, false); - DialogHelper.positionDialog(dlg, nodeToPositionDialogOver, 0, 0); + AddPVDialog addPVDialog = new AddPVDialog(names.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); + + Node content = dialogPane.getContent(); + if (content instanceof ScrollPane) { + ScrollPane scrollPane = (ScrollPane) content; + scrollPane.setFitToWidth(true); + } + else { + logger.log(Level.WARNING, "Expected an instance of 'ScrollPane', but got an instance of '" + content.getClass().toString() + "'!"); + } + + DialogHelper.positionDialog(addPVDialog, nodeToPositionDialogOver, (int) -addPVDialowWindow.getWidth()/2, (int) -addPVDialowWindow.getHeight()/2); + } for (int i=0; i Date: Wed, 21 Feb 2024 11:23:11 +0100 Subject: [PATCH 14/36] CSSTUDIO-2072 Add "Add PV(s) from the Clipboard" to the context-menu in the "Traces" tab in the Data Browser. --- .../csstudio/trends/databrowser3/ui/properties/TracesTab.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 78a7437c42..bef8107d6e 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(); From 6462721ae0f18b7b2bb8f2801823bc4325b9dc12 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Wed, 21 Feb 2024 11:30:26 +0100 Subject: [PATCH 15/36] CSSTUDIO-2072 If several PVs are added, set title of dialog to "Add PVs". --- .../org/csstudio/trends/databrowser3/Messages.java | 1 + .../csstudio/trends/databrowser3/ui/AddPVDialog.java | 12 +++++++++++- .../csstudio/trends/databrowser3/messages.properties | 1 + 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/Messages.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/Messages.java index 7c95244829..06394cd622 100644 --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/Messages.java +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/Messages.java @@ -24,6 +24,7 @@ public class Messages AddFormula_NameTT, AddItemErrorFmt, AddPV, + AddPVs, AddPV_Axis, AddPV_AxisTT, AddPVMsg, 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 985d135f58..1badb81f6d 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 @@ -71,7 +71,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)); diff --git a/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties b/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties index 9d8eb1f3ec..365704c1bb 100644 --- a/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties +++ b/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties @@ -4,6 +4,7 @@ AddFormulaMsg=Enter name for the formula, then press 'OK' to configure the formu AddFormula_NameTT=Enter short name for the formula: 'sum', 'avg', ... AddItemErrorFmt=Error adding {0} AddPV=Add PV +AddPVs=Add PVs AddPV_Axis=Value Axis AddPV_AxisTT=Select value axis for new item AddPV_NameTT=Enter PV name including ? and * From 876c4a0b1f0c7418c5c826c3f29863e82c2b02c6 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Wed, 21 Feb 2024 12:46:17 +0100 Subject: [PATCH 16/36] CSSTUDIO-2072 Call scrollPane.setFitToWidth(true) in AddPVDialog instead of in Activator. --- .../java/org/csstudio/trends/databrowser3/Activator.java | 9 --------- .../org/csstudio/trends/databrowser3/ui/AddPVDialog.java | 1 + 2 files changed, 1 insertion(+), 9 deletions(-) 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 8f809df822..89b11b44ff 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 @@ -108,15 +108,6 @@ public static void addPVsToPlotDialog(List> names, dialogPane.setMaxWidth(Double.MAX_VALUE); dialogPane.setMaxHeight(Double.MAX_VALUE); - Node content = dialogPane.getContent(); - if (content instanceof ScrollPane) { - ScrollPane scrollPane = (ScrollPane) content; - scrollPane.setFitToWidth(true); - } - else { - logger.log(Level.WARNING, "Expected an instance of 'ScrollPane', but got an instance of '" + content.getClass().toString() + "'!"); - } - DialogHelper.positionDialog(addPVDialog, nodeToPositionDialogOver, (int) -addPVDialowWindow.getWidth()/2, (int) -addPVDialowWindow.getHeight()/2); } 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 1badb81f6d..fed8d2b32b 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 @@ -173,6 +173,7 @@ private Node createContent(final Model model, final int count) gridPane.add(new Separator(), 0, ++row, 3, 1); } ScrollPane scrollPane = new ScrollPane(gridPane); + scrollPane.setFitToWidth(true); return scrollPane; } From 624b27dda3de8903bb84ce05bd9273bd9a92f9c5 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Wed, 21 Feb 2024 12:47:12 +0100 Subject: [PATCH 17/36] CSSTUDIO-2072 When adding a formula, display "Name" instead of "PV Name", and do not display the UI-elements for entering "Display Name. --- .../trends/databrowser3/Messages.java | 1 + .../trends/databrowser3/ui/AddPVDialog.java | 32 ++++++++++++------- .../trends/databrowser3/messages.properties | 1 + 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/Messages.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/Messages.java index 06394cd622..01bfef95a6 100644 --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/Messages.java +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/Messages.java @@ -213,6 +213,7 @@ public class Messages MoveAxisToTheRight, MoveItemDown, MoveItemUp, + Name, NegErrColumn, NewPlot, NewPlotFailed, 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 fed8d2b32b..ad0cc8b4c1 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 @@ -126,7 +126,13 @@ private Node createContent(final Model model, final int count) int row = -1; for (int i=0; i checkDuplicateName(name)); @@ -135,16 +141,20 @@ private Node createContent(final Model model, final int count) PVAutocompleteMenu.INSTANCE.attachField(name); gridPane.add(name, 1, row, 2, 1); - 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)); + 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) { diff --git a/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties b/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties index 365704c1bb..5e43cf5b2d 100644 --- a/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties +++ b/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties @@ -193,6 +193,7 @@ MoveAxisToTheLeft=Move Axis to the Left MoveAxisToTheRight=Move Axis to the Right MoveItemDown=Move Down MoveItemUp=Move Up +Name=Name NegErrColumn=Negative Error NewPlot=New plot NewPlotFailed=Failed to create new plot From f4110d1923ff2c69045541715fdd9bbdd89f60ad Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Wed, 21 Feb 2024 13:28:58 +0100 Subject: [PATCH 18/36] CSSTUDIO-2072 Adjust tests for changed type of DroppedPVNameParser.parseDroppedPVs(). --- .../ui/DroppedPVNameParserTest.java | 53 ++++++++++--------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/app/databrowser/src/test/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParserTest.java b/app/databrowser/src/test/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParserTest.java index 85f4ebf43e..10391ae1bd 100644 --- a/app/databrowser/src/test/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParserTest.java +++ b/app/databrowser/src/test/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParserTest.java @@ -7,6 +7,7 @@ ******************************************************************************/ package org.csstudio.trends.databrowser3.ui; +import javafx.util.Pair; import org.junit.jupiter.api.Test; import java.util.List; @@ -20,96 +21,100 @@ @SuppressWarnings("nls") public class DroppedPVNameParserTest { + private static Pair duplicate(String string) { + return new Pair(string, string); + } + @Test public void testSingle() throws Exception { // Just one PV name seems to be the easiest case.. - List names = DroppedPVNameParser.parseDroppedPVs("SomePVName"); - assertThat(names, equalTo(List.of("SomePVName"))); + List> names = DroppedPVNameParser.parseDroppedPVs("SomePVName"); + assertThat(names, equalTo(List.of(duplicate("SomePVName")))); // .. but it depends on all the other cases being handled, // since the PV may contain commas or spaces // that need to be ignored when inside quoted text or argument lists names = DroppedPVNameParser.parseDroppedPVs("loc://array(1, 2, 3)"); - assertThat(names, equalTo(List.of("loc://array(1, 2, 3)"))); + assertThat(names, equalTo(List.of(duplicate("loc://array(1, 2, 3)")))); // loc://info("Text (with comma, spaces; and semicolon)") names = DroppedPVNameParser.parseDroppedPVs("loc://info(\"Text (with comma, spaces; and semicolon)\")"); - assertThat(names, equalTo(List.of("loc://info(\"Text (with comma, spaces; and semicolon)\")"))); + assertThat(names, equalTo(List.of(duplicate("loc://info(\"Text (with comma, spaces; and semicolon)\")")))); // loc://options(2, "A", "B (2)", "C") names = DroppedPVNameParser.parseDroppedPVs("loc://options(2, \"A\", \"B (2)\", \"C\")"); - assertThat(names, equalTo(List.of("loc://options(2, \"A\", \"B (2)\", \"C\")"))); + assertThat(names, equalTo(List.of(duplicate("loc://options(2, \"A\", \"B (2)\", \"C\")")))); } @Test public void testNewline() throws Exception { // Plain newline - List names = DroppedPVNameParser.parseDroppedPVs("pv1\npv2"); - assertThat(names, equalTo(List.of("pv1", "pv2"))); + List> names = DroppedPVNameParser.parseDroppedPVs("pv1\npv2"); + assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2")))); // Windows line ending names = DroppedPVNameParser.parseDroppedPVs("pv1\r\npv2"); - assertThat(names, equalTo(List.of("pv1", "pv2"))); + assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2")))); // Old Mac names = DroppedPVNameParser.parseDroppedPVs("pv1\rpv2"); - assertThat(names, equalTo(List.of("pv1", "pv2"))); + assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2")))); // Wrapped into 'array' brackets.. names = DroppedPVNameParser.parseDroppedPVs("[ pv1\npv2 ] "); - assertThat(names, equalTo(List.of("pv1", "pv2"))); + assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2")))); } @Test public void testTab() throws Exception { - List names = DroppedPVNameParser.parseDroppedPVs("pv1\tpv2"); - assertThat(names, equalTo(List.of("pv1", "pv2"))); + List> names = DroppedPVNameParser.parseDroppedPVs("pv1\tpv2"); + assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2")))); names = DroppedPVNameParser.parseDroppedPVs(" pv1 \t pv2 \t pv3"); - assertThat(names, equalTo(List.of("pv1", "pv2", "pv3"))); + assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2"), duplicate("pv3")))); } @Test public void testComma() throws Exception { - List names = DroppedPVNameParser.parseDroppedPVs("pv1,pv2"); - assertThat(names, equalTo(List.of("pv1", "pv2"))); + List> names = DroppedPVNameParser.parseDroppedPVs("pv1,pv2"); + assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2")))); names = DroppedPVNameParser.parseDroppedPVs(" pv1, pv2 , pv3"); - assertThat(names, equalTo(List.of("pv1", "pv2", "pv3"))); + assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2"), duplicate("pv3")))); // Ignore commata inside quoted text names = DroppedPVNameParser.parseDroppedPVs(" pv1, loc://txt(\"a, b, c\") , pv3"); - assertThat(names, equalTo(List.of("pv1", "loc://txt(\"a, b, c\")", "pv3"))); + assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("loc://txt(\"a, b, c\")"), duplicate("pv3")))); // Ignore commata inside round brackets names = DroppedPVNameParser.parseDroppedPVs(" pv1, sim://sine(1, 2, 3) , pv3"); - assertThat(names, equalTo(List.of("pv1", "sim://sine(1, 2, 3)", "pv3"))); + assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("sim://sine(1, 2, 3)"), duplicate("pv3")))); // Ignore closing brace inside quotes names = DroppedPVNameParser.parseDroppedPVs(" pv1, loc://names(\"Fred\", \"Ed (3rd)\") , pv3"); - assertThat(names, equalTo(List.of("pv1", "loc://names(\"Fred\", \"Ed (3rd)\")", "pv3"))); + assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("loc://names(\"Fred\", \"Ed (3rd)\")"), duplicate("pv3")))); // Also allow semicolons names = DroppedPVNameParser.parseDroppedPVs(" pv1; pv2 ; pv3"); - assertThat(names, equalTo(List.of("pv1", "pv2", "pv3"))); + assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2"), duplicate("pv3")))); } @Test public void testSpace() throws Exception { - List names = DroppedPVNameParser.parseDroppedPVs("pv1 pv2"); - assertThat(names, equalTo(List.of("pv1", "pv2"))); + List> names = DroppedPVNameParser.parseDroppedPVs("pv1 pv2"); + assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2")))); // Ignore spaces in brackets names = DroppedPVNameParser.parseDroppedPVs("pv1 sim://sine(1, 2, 3)"); - assertThat(names, equalTo(List.of("pv1", "sim://sine(1, 2, 3)"))); + assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("sim://sine(1, 2, 3)")))); // Ignore spaces in quotes names = DroppedPVNameParser.parseDroppedPVs(" pv1 loc://tag(\"You're it!\") "); - assertThat(names, equalTo(List.of("pv1", "loc://tag(\"You're it!\")"))); + assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("loc://tag(\"You're it!\")")))); } } From 7b27e25ef9f7c1264410b61818b819c2eb630c5a Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Wed, 6 Mar 2024 13:39:03 +0100 Subject: [PATCH 19/36] CSSTUDIO-2072 Add the choice "Use the same value axis for all added PVs?" when adding 2 or more PVs. --- .../trends/databrowser3/Activator.java | 2 +- .../trends/databrowser3/ui/AddPVDialog.java | 97 ++++++++++++++++--- .../trends/databrowser3/ui/Controller.java | 2 +- .../ui/properties/AddPVorFormulaMenuItem.java | 2 +- .../ui/search/AddToPlotAction.java | 2 +- 5 files changed, 90 insertions(+), 15 deletions(-) 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 89b11b44ff..3ba4d8b4b8 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 @@ -120,7 +120,7 @@ public static void addPVsToPlotDialog(List> names, } for (int i=0; i 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; @@ -123,7 +128,49 @@ private Node createContent(final Model model, final int count) 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("Use the same value axis for all added PVs?"); + gridPane.add(label_useTheSameQuestion, 0, row); + + row += 1; + ToggleGroup toggleGroup = new ToggleGroup(); + RadioButton radioButton_useTheSame = new RadioButton("Yes, all PVs are added to the axis:"); + 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("No, each PV is assigned an value axis individually."); + 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; + } + for (int i=0; i checkDuplicateName(name)); name.setTooltip(new Tooltip(formula ? Messages.AddFormula_NameTT : Messages.AddPV_NameTT)); @@ -181,9 +228,11 @@ private Node createContent(final Model model, final int count) gridPane.add(axes.get(i), 1, row); gridPane.add(new Separator(), 0, ++row, 3, 1); + row += 1; } ScrollPane scrollPane = new ScrollPane(gridPane); scrollPane.setFitToWidth(true); + axes.forEach(axis -> axis.setDisable(true)); // By default, the "yes" radio button is selected, and individual axes for each PV are disabled. return scrollPane; } @@ -224,11 +273,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 @@ -237,13 +297,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) diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/Controller.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/Controller.java index 218199caf6..48320610f9 100644 --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/Controller.java +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/Controller.java @@ -286,7 +286,7 @@ public void droppedPVNames(List names, for (int i=0; i=archives.size()) ? null : archives.get(i); AddModelItemCommand.forPV(undo, 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 63f17045ca..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) { 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 674c8c58cf..e8387775ab 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 @@ -58,7 +58,7 @@ public AddToPlotAction(final Node node, final Model model, final UndoableActionM for (int i=0; i Date: Wed, 6 Mar 2024 13:42:00 +0100 Subject: [PATCH 20/36] CSSTUDIO-2072 Remove commented-out code. --- .../java/org/csstudio/trends/databrowser3/ui/AddPVDialog.java | 1 - 1 file changed, 1 deletion(-) 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 737d8a3ef1..c4096eebdc 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 @@ -117,7 +117,6 @@ public AddPVDialog(final int count, final Model model, final boolean formula) private Node createContent(final Model model, final int count) { final GridPane gridPane = new GridPane(); - // layout.setGridLinesVisible(true); gridPane.setHgap(5); gridPane.setVgap(5); final ColumnConstraints stay = new ColumnConstraints(); From 891ad37952182a8c2b0b518ed617725d842b54ad Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Wed, 6 Mar 2024 13:48:03 +0100 Subject: [PATCH 21/36] CSSTUDIO-2072 Add labels to messages.properties. --- .../java/org/csstudio/trends/databrowser3/Messages.java | 5 ++++- .../org/csstudio/trends/databrowser3/ui/AddPVDialog.java | 6 +++--- .../org/csstudio/trends/databrowser3/messages.properties | 5 ++++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/Messages.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/Messages.java index 01bfef95a6..329345d7a2 100644 --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/Messages.java +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/Messages.java @@ -222,6 +222,7 @@ public class Messages NewPlotFileCreateFailed, NewPlotOverwriteExisting, NewPlotOverwriteExistingTitle, + NoEachPVIsAssignedAnValueAxisIndividually, NotApplicable, OpenExportView, OpenPropertiesView, @@ -305,6 +306,7 @@ public class Messages UseAxisName, UseLines, UsePoints, + UseTheSameValueAxisForAllAddedPVs, UseTraceNames, UseUnixTimeStamp, ValueAxes, @@ -317,7 +319,8 @@ public class Messages WaveformTimeSelector, WaveformTimestamp, WaveformView, - WaveformViewSelect; + WaveformViewSelect, + YesAllPVsAreAddedToTheAxis; // --- // --- Keep alphabetically sorted and 'in sync' with messages.properties! // --- 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 c4096eebdc..6e9046a290 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 @@ -129,12 +129,12 @@ private Node createContent(final Model model, final int count) int row = 0; if (count > 1) { - Label label_useTheSameQuestion = new Label("Use the same value axis for all added PVs?"); + Label label_useTheSameQuestion = new Label(Messages.UseTheSameValueAxisForAllAddedPVs); gridPane.add(label_useTheSameQuestion, 0, row); row += 1; ToggleGroup toggleGroup = new ToggleGroup(); - RadioButton radioButton_useTheSame = new RadioButton("Yes, all PVs are added to the axis:"); + RadioButton radioButton_useTheSame = new RadioButton(Messages.YesAllPVsAreAddedToTheAxis); radioButton_useTheSame.setToggleGroup(toggleGroup); gridPane.add(radioButton_useTheSame, 0, row); @@ -151,7 +151,7 @@ private Node createContent(final Model model, final int count) }); row += 1; - RadioButton radioButton_useDifferent = new RadioButton("No, each PV is assigned an value axis individually."); + RadioButton radioButton_useDifferent = new RadioButton(Messages.NoEachPVIsAssignedAnValueAxisIndividually); radioButton_useDifferent.setToggleGroup(toggleGroup); gridPane.add(radioButton_useDifferent, 0, row); diff --git a/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties b/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties index 5e43cf5b2d..5535e2e236 100644 --- a/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties +++ b/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties @@ -202,6 +202,7 @@ NewPlotSelectionEmpty=No target folder selected NewPlotOverwriteExisting=File {0} already exists in folder {1}.\nDo you wish to overwrite it? NewPlotOverwriteExistingTitle=File exists NewPlotFileCreateFailed=Failed to create new plt file +NoEachPVIsAssignedAnValueAxisIndividually=No, each PV is assigned an value axis individually. NotApplicable=- OpenExportView=Open Data Export Panel OpenSearchView=Open Archive Search Panel @@ -285,6 +286,7 @@ URL=URL UseAxisName=Axis Name? UseLines=Use lines UsePoints=Use points +UseTheSameValueAxisForAllAddedPVs=Use the same value axis for all added PVs? UseTraceNames=Trace Names? UseUnixTimeStamp=Use UNIX time stamp (in ms) ValueAxes=Value Axes @@ -297,4 +299,5 @@ WaveformStatus=Sevr./Status: WaveformTimeSelector=Select waveform by time WaveformTimestamp=Timestamp: WaveformView=Waveform View -WaveformViewSelect=Select Items... \ No newline at end of file +WaveformViewSelect=Select Items... +YesAllPVsAreAddedToTheAxis=Yes, all PVs are added to the axis: \ No newline at end of file From d63fbf8296ca6b7136de5b46b85c3eca66178ed5 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Wed, 6 Mar 2024 14:09:36 +0100 Subject: [PATCH 22/36] CSSTUDIO-2072 Update "AddPVMsg" in messages.properties. --- .../org/csstudio/trends/databrowser3/messages.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties b/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties index 5535e2e236..0e717a326c 100644 --- a/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties +++ b/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties @@ -13,7 +13,7 @@ AddPV_OnChange=on change AddPV_OnChangeTT=Sample PV on change instead of periodically? AddPV_Period=Scan Period [seconds] AddPV_PeriodTT=Enter scan period in seconds -AddPVMsg=Enter PV name, configure scan period +AddPVMsg=Enter PV name(s) and configure axis and scan period AppendSearchResults=Add... AppendSearchResultsTT=Append search results to list ArchiveFetchJobFmt=Read data: {0}, {1} - {2} From 3247b12af4c5c398147e4362be53c963af5ebf0f Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Wed, 24 Apr 2024 08:40:59 +0200 Subject: [PATCH 23/36] CSSTUDIO-2072 Remove tests for previously implemented drag'n'drop functionality. --- .../ui/DroppedPVNameParserTest.java | 51 ------------------- 1 file changed, 51 deletions(-) diff --git a/app/databrowser/src/test/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParserTest.java b/app/databrowser/src/test/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParserTest.java index 10391ae1bd..5fd69bba84 100644 --- a/app/databrowser/src/test/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParserTest.java +++ b/app/databrowser/src/test/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParserTest.java @@ -66,55 +66,4 @@ public void testNewline() throws Exception names = DroppedPVNameParser.parseDroppedPVs("[ pv1\npv2 ] "); assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2")))); } - - @Test - public void testTab() throws Exception - { - List> names = DroppedPVNameParser.parseDroppedPVs("pv1\tpv2"); - assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2")))); - - names = DroppedPVNameParser.parseDroppedPVs(" pv1 \t pv2 \t pv3"); - assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2"), duplicate("pv3")))); - } - - @Test - public void testComma() throws Exception - { - List> names = DroppedPVNameParser.parseDroppedPVs("pv1,pv2"); - assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2")))); - - names = DroppedPVNameParser.parseDroppedPVs(" pv1, pv2 , pv3"); - assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2"), duplicate("pv3")))); - - // Ignore commata inside quoted text - names = DroppedPVNameParser.parseDroppedPVs(" pv1, loc://txt(\"a, b, c\") , pv3"); - assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("loc://txt(\"a, b, c\")"), duplicate("pv3")))); - - // Ignore commata inside round brackets - names = DroppedPVNameParser.parseDroppedPVs(" pv1, sim://sine(1, 2, 3) , pv3"); - assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("sim://sine(1, 2, 3)"), duplicate("pv3")))); - - // Ignore closing brace inside quotes - names = DroppedPVNameParser.parseDroppedPVs(" pv1, loc://names(\"Fred\", \"Ed (3rd)\") , pv3"); - assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("loc://names(\"Fred\", \"Ed (3rd)\")"), duplicate("pv3")))); - - // Also allow semicolons - names = DroppedPVNameParser.parseDroppedPVs(" pv1; pv2 ; pv3"); - assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2"), duplicate("pv3")))); - } - - @Test - public void testSpace() throws Exception - { - List> names = DroppedPVNameParser.parseDroppedPVs("pv1 pv2"); - assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2")))); - - // Ignore spaces in brackets - names = DroppedPVNameParser.parseDroppedPVs("pv1 sim://sine(1, 2, 3)"); - assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("sim://sine(1, 2, 3)")))); - - // Ignore spaces in quotes - names = DroppedPVNameParser.parseDroppedPVs(" pv1 loc://tag(\"You're it!\") "); - assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("loc://tag(\"You're it!\")")))); - } } From 228d483fa007c04d9019fa77fdf1ef482c120f39 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Wed, 8 May 2024 13:15:16 +0200 Subject: [PATCH 24/36] CSSTUDIO-2072 Add labels to messages.properties. --- .../java/org/csstudio/trends/databrowser3/Messages.java | 3 +++ .../ui/properties/AddPVsFromTheClipboardMenuItem.java | 7 ++++--- .../org/csstudio/trends/databrowser3/messages.properties | 3 +++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/Messages.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/Messages.java index 329345d7a2..952f7f1a8a 100644 --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/Messages.java +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/Messages.java @@ -25,6 +25,7 @@ public class Messages AddItemErrorFmt, AddPV, AddPVs, + AddPVsFromTheClipboard, AddPV_Axis, AddPV_AxisTT, AddPVMsg, @@ -223,6 +224,7 @@ public class Messages NewPlotOverwriteExisting, NewPlotOverwriteExistingTitle, NoEachPVIsAssignedAnValueAxisIndividually, + NoPVsFoundInTheClipboard, NotApplicable, OpenExportView, OpenPropertiesView, @@ -284,6 +286,7 @@ public class Messages StatisticsSum, StatisticsSampleCount, StatusColumn, + TheClipboardDoesNotContainPVs, TimeAxis, TimeColumn, TitleFontLbl, 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 index f09906aae5..f7bf1860e7 100644 --- 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 @@ -5,6 +5,7 @@ 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; @@ -15,7 +16,7 @@ public class AddPVsFromTheClipboardMenuItem extends MenuItem { public AddPVsFromTheClipboardMenuItem(UndoableActionManager undoableActionManager, Model model, Node nodeToPositionDialogOver) { - super("Add PV(s) from the Clipboard", + super(Messages.AddPVsFromTheClipboard, Activator.getIcon("paste")); this.nodeToPositionDialogOver = nodeToPositionDialogOver; @@ -48,8 +49,8 @@ public AddPVsFromTheClipboardMenuItem(UndoableActionManager undoableActionManage private void showNoPVsFoundInClipboardWarning() { Alert warningAlert = new Alert(Alert.AlertType.INFORMATION, - "The clipboard doesn't contain a list of PV names separated by newline-characters:\n\n\n\n ⋮\n\nOptionally, display names can be specified after a comma following the PV name:\n\n,\n,\n ⋮"); - warningAlert.setHeaderText("No PVs found in the clipboard!"); + Messages.TheClipboardDoesNotContainPVs); + warningAlert.setHeaderText(Messages.NoPVsFoundInTheClipboard); DialogHelper.positionDialog(warningAlert, nodeToPositionDialogOver, 0, 0); warningAlert.show(); } diff --git a/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties b/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties index 0e717a326c..d8e40fa3ea 100644 --- a/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties +++ b/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties @@ -5,6 +5,7 @@ AddFormula_NameTT=Enter short name for the formula: 'sum', 'avg', ... AddItemErrorFmt=Error adding {0} AddPV=Add PV AddPVs=Add PVs +AddPVsFromTheClipboard=Add PV(s) from the Clipboard AddPV_Axis=Value Axis AddPV_AxisTT=Select value axis for new item AddPV_NameTT=Enter PV name including ? and * @@ -203,6 +204,7 @@ NewPlotOverwriteExisting=File {0} already exists in folder {1}.\nDo you wish to NewPlotOverwriteExistingTitle=File exists NewPlotFileCreateFailed=Failed to create new plt file NoEachPVIsAssignedAnValueAxisIndividually=No, each PV is assigned an value axis individually. +NoPVsFoundInTheClipboard=No PVs found in the clipboard! NotApplicable=- OpenExportView=Open Data Export Panel OpenSearchView=Open Archive Search Panel @@ -264,6 +266,7 @@ StatisticsMin=Min Value StatisticsMax=Max Value StatisticsSum=Sum StatusColumn=Status +TheClipboardDoesNotContainPVs=The clipboard doesn't contain a list of PV names separated by newline-characters:\n\n\n\n ...\n\nOptionally, display names can be specified after a comma following the PV name:\n\n,\n,\n ... TimeAxis=Time Axis TimeColumn=Time TitleFontLbl=Title Font: From ff62232791b54ed14d41e2478d0de79f746decde Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Wed, 8 May 2024 13:16:08 +0200 Subject: [PATCH 25/36] CSSTUDIO-2072 Add title to warning alert. --- .../ui/properties/AddPVsFromTheClipboardMenuItem.java | 1 + 1 file changed, 1 insertion(+) 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 index f7bf1860e7..59f411db5d 100644 --- 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 @@ -50,6 +50,7 @@ public AddPVsFromTheClipboardMenuItem(UndoableActionManager undoableActionManage 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(); From fb59efb5bca9f0df3c86e94ca5b7891ebd902445 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Tue, 30 Jul 2024 13:48:33 +0200 Subject: [PATCH 26/36] Revert "CSSTUDIO-2072 Remove tests for previously implemented drag'n'drop functionality." This reverts commit 3247b12af4c5c398147e4362be53c963af5ebf0f. --- .../ui/DroppedPVNameParserTest.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/app/databrowser/src/test/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParserTest.java b/app/databrowser/src/test/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParserTest.java index 5fd69bba84..10391ae1bd 100644 --- a/app/databrowser/src/test/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParserTest.java +++ b/app/databrowser/src/test/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParserTest.java @@ -66,4 +66,55 @@ public void testNewline() throws Exception names = DroppedPVNameParser.parseDroppedPVs("[ pv1\npv2 ] "); assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2")))); } + + @Test + public void testTab() throws Exception + { + List> names = DroppedPVNameParser.parseDroppedPVs("pv1\tpv2"); + assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2")))); + + names = DroppedPVNameParser.parseDroppedPVs(" pv1 \t pv2 \t pv3"); + assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2"), duplicate("pv3")))); + } + + @Test + public void testComma() throws Exception + { + List> names = DroppedPVNameParser.parseDroppedPVs("pv1,pv2"); + assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2")))); + + names = DroppedPVNameParser.parseDroppedPVs(" pv1, pv2 , pv3"); + assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2"), duplicate("pv3")))); + + // Ignore commata inside quoted text + names = DroppedPVNameParser.parseDroppedPVs(" pv1, loc://txt(\"a, b, c\") , pv3"); + assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("loc://txt(\"a, b, c\")"), duplicate("pv3")))); + + // Ignore commata inside round brackets + names = DroppedPVNameParser.parseDroppedPVs(" pv1, sim://sine(1, 2, 3) , pv3"); + assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("sim://sine(1, 2, 3)"), duplicate("pv3")))); + + // Ignore closing brace inside quotes + names = DroppedPVNameParser.parseDroppedPVs(" pv1, loc://names(\"Fred\", \"Ed (3rd)\") , pv3"); + assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("loc://names(\"Fred\", \"Ed (3rd)\")"), duplicate("pv3")))); + + // Also allow semicolons + names = DroppedPVNameParser.parseDroppedPVs(" pv1; pv2 ; pv3"); + assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2"), duplicate("pv3")))); + } + + @Test + public void testSpace() throws Exception + { + List> names = DroppedPVNameParser.parseDroppedPVs("pv1 pv2"); + assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2")))); + + // Ignore spaces in brackets + names = DroppedPVNameParser.parseDroppedPVs("pv1 sim://sine(1, 2, 3)"); + assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("sim://sine(1, 2, 3)")))); + + // Ignore spaces in quotes + names = DroppedPVNameParser.parseDroppedPVs(" pv1 loc://tag(\"You're it!\") "); + assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("loc://tag(\"You're it!\")")))); + } } From 3303c7c93fa54b965ded314b76dd14603befcdf1 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Tue, 30 Jul 2024 14:36:53 +0200 Subject: [PATCH 27/36] CSSTUDIO-2072 Change back to the original way of splitting PV names in DroppedPVNameParser.parseDroppedPVs(). Instead, interpret names that start and end with single quotes as names for the preceding PV name. --- .../trends/databrowser3/Activator.java | 31 ++++++++++++++++--- .../trends/databrowser3/ui/Controller.java | 2 +- .../databrowser3/ui/DroppedPVNameParser.java | 26 +++------------- .../trends/databrowser3/ui/Perspective.java | 2 +- .../databrowser3/ui/plot/PlotListener.java | 2 +- 5 files changed, 34 insertions(+), 29 deletions(-) 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 3ba4d8b4b8..50512d3cf6 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,7 +7,9 @@ ******************************************************************************/ 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; @@ -84,14 +86,33 @@ public static ImageView getIcon(final String base_name) return new ImageView(getImage(base_name)); } - public static void addPVsToPlotDialog(List> names, + public static void addPVsToPlotDialog(List names, UndoableActionManager undoableActionManager, Model model, Node nodeToPositionDialogOver) { + List> namesWithDisplayNames = new ArrayList<>(); + Optional currentPVName = Optional.empty(); + for (String name : names) { + if (name.startsWith("'") && name.endsWith("'") && name.length() >= 2) { + if (currentPVName.isPresent()) { + namesWithDisplayNames.add(new Pair<>(currentPVName.get(), name.substring(1,name.length()-1))); + currentPVName = Optional.empty(); + } + } + else { + if (currentPVName.isPresent()) { + namesWithDisplayNames.add(new Pair<>(currentPVName.get(), currentPVName.get())); + } + currentPVName = currentPVName.of(name); + } + } + if (currentPVName.isPresent()) { + namesWithDisplayNames.add(new Pair<>(currentPVName.get(), currentPVName.get())); + } // Offer potential PV name in dialog so user can edit/cancel // sim://sine sim://ramp sim://noise - AddPVDialog addPVDialog = new AddPVDialog(names.size(), model, false); + AddPVDialog addPVDialog = new AddPVDialog(namesWithDisplayNames.size(), model, false); { // Set layout of addPVDialog: int addPVDialogWidth = 750; @@ -111,15 +132,15 @@ public static void addPVsToPlotDialog(List> names, DialogHelper.positionDialog(addPVDialog, nodeToPositionDialogOver, (int) -addPVDialowWindow.getWidth()/2, (int) -addPVDialowWindow.getHeight()/2); } - for (int i=0; i> names) + public void droppedNames(final List names) { Activator.addPVsToPlotDialog(names, plot.getPlot().getUndoableActionManager(), model, plot.getPlot()); } diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParser.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParser.java index 3c8481597d..5f13ac786b 100644 --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParser.java +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParser.java @@ -7,8 +7,6 @@ ******************************************************************************/ package org.csstudio.trends.databrowser3.ui; -import javafx.util.Pair; - import java.util.ArrayList; import java.util.List; @@ -31,14 +29,14 @@ public class DroppedPVNameParser * @return List of PV names * @throws Exception on error */ - public static List> parseDroppedPVs(String text) throws Exception + public static List parseDroppedPVs(String text) throws Exception { text = text.trim(); // Remove optional 'array' wrapper if (text.startsWith("[") && text.endsWith("]")) text = text.substring(1, text.length()-2); - final List> names = new ArrayList<>(); + final List names = new ArrayList<>(); // Need to look for a separator, but skipping them inside quoted text and brackets final int len = text.length(); @@ -51,25 +49,11 @@ public static List> parseDroppedPVs(String text) throws Exc pos = locateClosingQuote(text, pos+1); else if (c == '(') pos = locateClosingBrace(text, pos+1); - else if (c == ',') { - // Case: PV Name with a specified display name - String pvName = text.substring(start, pos).trim(); - if (!pvName.isEmpty()) { - // Parse display name until end-of-line: - String displayName = ""; - for (pos++; pos < len && "\r\n".indexOf(text.charAt(pos)) == -1; pos++) { - displayName = displayName + text.charAt(pos); - } - displayName = displayName.trim(); - names.add(new Pair<>(pvName, displayName)); - } - start = ++pos; - } - else if ("\r\n".indexOf(c) >= 0) + else if ("\r\n\t,; ".indexOf(c) >= 0) { // Found one of the separators final String name = text.substring(start, pos).trim(); if (! name.isEmpty()) - names.add(new Pair(name, name)); + names.add(name); start = ++pos; } else @@ -80,7 +64,7 @@ else if ("\r\n".indexOf(c) >= 0) { final String name = text.substring(start, pos).trim(); if (! name.isEmpty()) - names.add(new Pair(name, name)); + names.add(name); } return names; } 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 f7a9702a0e..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 @@ -351,7 +351,7 @@ else if (db.hasString()) final String dropped = db.getString(); try { - final List> pvs = DroppedPVNameParser.parseDroppedPVs(dropped); + final List pvs = DroppedPVNameParser.parseDroppedPVs(dropped); if (pvs.size() > 0) Platform.runLater(() -> lst.droppedNames(pvs)); } 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 10dffeda2f..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 @@ -46,7 +46,7 @@ public interface PlotListener /** Received names, presumably for PVs, via drag and drop * @param name PV(?) names */ - public void droppedNames(List> name); + public void droppedNames(List name); /** Received PV names and/or archive data sources via drag and drop * From 07d4fcf83aea71c03ded3dd74a4d53f0a654283c Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Tue, 30 Jul 2024 14:53:43 +0200 Subject: [PATCH 28/36] CSSTUDIO-2072 Skip to closing single quote when parsing a single quote. This allows for spaces and other separators inside single quotes. --- .../databrowser3/ui/DroppedPVNameParser.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParser.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParser.java index 5f13ac786b..45d8d6c32c 100644 --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParser.java +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParser.java @@ -47,6 +47,9 @@ public static List parseDroppedPVs(String text) throws Exception final char c = text.charAt(pos); if (c == '"') pos = locateClosingQuote(text, pos+1); + else if (c == '\'') { + pos = locateClosingSingleQuote(text, pos+1); + } else if (c == '(') pos = locateClosingBrace(text, pos+1); else if ("\r\n\t,; ".indexOf(c) >= 0) @@ -85,6 +88,24 @@ private static int locateClosingQuote(final String text, int pos) throws Excepti return end + 1; } + /** Locate closing, non-escaped single quote + * @param text Text to search + * @param pos Position after opening single quote + * @return Position after the closing single quote, or -1 + * @throws Exception if there is no closing single quote + */ + private static int locateClosingSingleQuote(final String text, int pos) throws Exception + { + int end = text.indexOf('\'', pos); + while (end > pos && text.charAt(end-1) == '\\') { + end = text.indexOf('\'', end+1); + } + if (end < 0) { + throw new Exception("Missing closing single quote"); + } + return end + 1; + } + /** Locate closing brace, ignoring those inside quotes * @param text Text to search * @param pos Position after opening quote From 7af691924e6d978c2ecd6244ffbd40ffc3b1efc3 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Tue, 30 Jul 2024 15:05:25 +0200 Subject: [PATCH 29/36] Revert "CSSTUDIO-2072 Adjust tests for changed type of DroppedPVNameParser.parseDroppedPVs()." This reverts commit f4110d1923ff2c69045541715fdd9bbdd89f60ad. --- .../ui/DroppedPVNameParserTest.java | 53 +++++++++---------- 1 file changed, 24 insertions(+), 29 deletions(-) diff --git a/app/databrowser/src/test/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParserTest.java b/app/databrowser/src/test/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParserTest.java index 10391ae1bd..85f4ebf43e 100644 --- a/app/databrowser/src/test/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParserTest.java +++ b/app/databrowser/src/test/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParserTest.java @@ -7,7 +7,6 @@ ******************************************************************************/ package org.csstudio.trends.databrowser3.ui; -import javafx.util.Pair; import org.junit.jupiter.api.Test; import java.util.List; @@ -21,100 +20,96 @@ @SuppressWarnings("nls") public class DroppedPVNameParserTest { - private static Pair duplicate(String string) { - return new Pair(string, string); - } - @Test public void testSingle() throws Exception { // Just one PV name seems to be the easiest case.. - List> names = DroppedPVNameParser.parseDroppedPVs("SomePVName"); - assertThat(names, equalTo(List.of(duplicate("SomePVName")))); + List names = DroppedPVNameParser.parseDroppedPVs("SomePVName"); + assertThat(names, equalTo(List.of("SomePVName"))); // .. but it depends on all the other cases being handled, // since the PV may contain commas or spaces // that need to be ignored when inside quoted text or argument lists names = DroppedPVNameParser.parseDroppedPVs("loc://array(1, 2, 3)"); - assertThat(names, equalTo(List.of(duplicate("loc://array(1, 2, 3)")))); + assertThat(names, equalTo(List.of("loc://array(1, 2, 3)"))); // loc://info("Text (with comma, spaces; and semicolon)") names = DroppedPVNameParser.parseDroppedPVs("loc://info(\"Text (with comma, spaces; and semicolon)\")"); - assertThat(names, equalTo(List.of(duplicate("loc://info(\"Text (with comma, spaces; and semicolon)\")")))); + assertThat(names, equalTo(List.of("loc://info(\"Text (with comma, spaces; and semicolon)\")"))); // loc://options(2, "A", "B (2)", "C") names = DroppedPVNameParser.parseDroppedPVs("loc://options(2, \"A\", \"B (2)\", \"C\")"); - assertThat(names, equalTo(List.of(duplicate("loc://options(2, \"A\", \"B (2)\", \"C\")")))); + assertThat(names, equalTo(List.of("loc://options(2, \"A\", \"B (2)\", \"C\")"))); } @Test public void testNewline() throws Exception { // Plain newline - List> names = DroppedPVNameParser.parseDroppedPVs("pv1\npv2"); - assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2")))); + List names = DroppedPVNameParser.parseDroppedPVs("pv1\npv2"); + assertThat(names, equalTo(List.of("pv1", "pv2"))); // Windows line ending names = DroppedPVNameParser.parseDroppedPVs("pv1\r\npv2"); - assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2")))); + assertThat(names, equalTo(List.of("pv1", "pv2"))); // Old Mac names = DroppedPVNameParser.parseDroppedPVs("pv1\rpv2"); - assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2")))); + assertThat(names, equalTo(List.of("pv1", "pv2"))); // Wrapped into 'array' brackets.. names = DroppedPVNameParser.parseDroppedPVs("[ pv1\npv2 ] "); - assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2")))); + assertThat(names, equalTo(List.of("pv1", "pv2"))); } @Test public void testTab() throws Exception { - List> names = DroppedPVNameParser.parseDroppedPVs("pv1\tpv2"); - assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2")))); + List names = DroppedPVNameParser.parseDroppedPVs("pv1\tpv2"); + assertThat(names, equalTo(List.of("pv1", "pv2"))); names = DroppedPVNameParser.parseDroppedPVs(" pv1 \t pv2 \t pv3"); - assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2"), duplicate("pv3")))); + assertThat(names, equalTo(List.of("pv1", "pv2", "pv3"))); } @Test public void testComma() throws Exception { - List> names = DroppedPVNameParser.parseDroppedPVs("pv1,pv2"); - assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2")))); + List names = DroppedPVNameParser.parseDroppedPVs("pv1,pv2"); + assertThat(names, equalTo(List.of("pv1", "pv2"))); names = DroppedPVNameParser.parseDroppedPVs(" pv1, pv2 , pv3"); - assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2"), duplicate("pv3")))); + assertThat(names, equalTo(List.of("pv1", "pv2", "pv3"))); // Ignore commata inside quoted text names = DroppedPVNameParser.parseDroppedPVs(" pv1, loc://txt(\"a, b, c\") , pv3"); - assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("loc://txt(\"a, b, c\")"), duplicate("pv3")))); + assertThat(names, equalTo(List.of("pv1", "loc://txt(\"a, b, c\")", "pv3"))); // Ignore commata inside round brackets names = DroppedPVNameParser.parseDroppedPVs(" pv1, sim://sine(1, 2, 3) , pv3"); - assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("sim://sine(1, 2, 3)"), duplicate("pv3")))); + assertThat(names, equalTo(List.of("pv1", "sim://sine(1, 2, 3)", "pv3"))); // Ignore closing brace inside quotes names = DroppedPVNameParser.parseDroppedPVs(" pv1, loc://names(\"Fred\", \"Ed (3rd)\") , pv3"); - assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("loc://names(\"Fred\", \"Ed (3rd)\")"), duplicate("pv3")))); + assertThat(names, equalTo(List.of("pv1", "loc://names(\"Fred\", \"Ed (3rd)\")", "pv3"))); // Also allow semicolons names = DroppedPVNameParser.parseDroppedPVs(" pv1; pv2 ; pv3"); - assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2"), duplicate("pv3")))); + assertThat(names, equalTo(List.of("pv1", "pv2", "pv3"))); } @Test public void testSpace() throws Exception { - List> names = DroppedPVNameParser.parseDroppedPVs("pv1 pv2"); - assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("pv2")))); + List names = DroppedPVNameParser.parseDroppedPVs("pv1 pv2"); + assertThat(names, equalTo(List.of("pv1", "pv2"))); // Ignore spaces in brackets names = DroppedPVNameParser.parseDroppedPVs("pv1 sim://sine(1, 2, 3)"); - assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("sim://sine(1, 2, 3)")))); + assertThat(names, equalTo(List.of("pv1", "sim://sine(1, 2, 3)"))); // Ignore spaces in quotes names = DroppedPVNameParser.parseDroppedPVs(" pv1 loc://tag(\"You're it!\") "); - assertThat(names, equalTo(List.of(duplicate("pv1"), duplicate("loc://tag(\"You're it!\")")))); + assertThat(names, equalTo(List.of("pv1", "loc://tag(\"You're it!\")"))); } } From 27fa4b24298ad33b58f12a13f8d7718c8c40ec1a Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Tue, 30 Jul 2024 15:22:41 +0200 Subject: [PATCH 30/36] CSSTUDIO-2072 Update error message when no PVs are found in the clipboard when pasting PVs into the Data Browser. --- .../org/csstudio/trends/databrowser3/messages.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties b/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties index d8e40fa3ea..725259fcf2 100644 --- a/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties +++ b/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties @@ -266,7 +266,7 @@ StatisticsMin=Min Value StatisticsMax=Max Value StatisticsSum=Sum StatusColumn=Status -TheClipboardDoesNotContainPVs=The clipboard doesn't contain a list of PV names separated by newline-characters:\n\n\n\n ...\n\nOptionally, display names can be specified after a comma following the PV name:\n\n,\n,\n ... +TheClipboardDoesNotContainPVs=The clipboard doesn't contain a list of PV names:\n\n ...\n\nOptionally, a display name can be specified for a given PV name by putting the display name inside single quotes after a PV name:\n\n '' '' ... TimeAxis=Time Axis TimeColumn=Time TitleFontLbl=Title Font: From 6652661d14a8ce163e0a6e22db13706426e69a39 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Thu, 14 Nov 2024 09:43:54 +0100 Subject: [PATCH 31/36] Revert "CSSTUDIO-2072 Skip to closing single quote when parsing a single quote. This allows for spaces and other separators inside single quotes." This reverts commit 07d4fcf83aea71c03ded3dd74a4d53f0a654283c. --- .../databrowser3/ui/DroppedPVNameParser.java | 21 ------------------- 1 file changed, 21 deletions(-) diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParser.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParser.java index 45d8d6c32c..5f13ac786b 100644 --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParser.java +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/DroppedPVNameParser.java @@ -47,9 +47,6 @@ public static List parseDroppedPVs(String text) throws Exception final char c = text.charAt(pos); if (c == '"') pos = locateClosingQuote(text, pos+1); - else if (c == '\'') { - pos = locateClosingSingleQuote(text, pos+1); - } else if (c == '(') pos = locateClosingBrace(text, pos+1); else if ("\r\n\t,; ".indexOf(c) >= 0) @@ -88,24 +85,6 @@ private static int locateClosingQuote(final String text, int pos) throws Excepti return end + 1; } - /** Locate closing, non-escaped single quote - * @param text Text to search - * @param pos Position after opening single quote - * @return Position after the closing single quote, or -1 - * @throws Exception if there is no closing single quote - */ - private static int locateClosingSingleQuote(final String text, int pos) throws Exception - { - int end = text.indexOf('\'', pos); - while (end > pos && text.charAt(end-1) == '\\') { - end = text.indexOf('\'', end+1); - } - if (end < 0) { - throw new Exception("Missing closing single quote"); - } - return end + 1; - } - /** Locate closing brace, ignoring those inside quotes * @param text Text to search * @param pos Position after opening quote From 0ed44886409647f3ec119e4ae8c1478bf8a63889 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Thu, 14 Nov 2024 10:09:58 +0100 Subject: [PATCH 32/36] CSSTUDIO-2072 Remove the possibility to represent Display Names on the clipboard by surrounding them with sinqle-quote characters. If a Display Name is not entered, use the default for the Display Name. --- .../trends/databrowser3/Activator.java | 29 ++++--------------- .../imports/SampleImportAction.java | 3 +- .../databrowser3/ui/AddModelItemCommand.java | 8 +++-- .../trends/databrowser3/ui/AddPVDialog.java | 22 +++++++++----- .../trends/databrowser3/ui/Controller.java | 2 +- .../ui/search/AddToPlotAction.java | 5 ++-- 6 files changed, 32 insertions(+), 37 deletions(-) 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 50512d3cf6..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 @@ -86,33 +86,14 @@ public static ImageView getIcon(final String base_name) return new ImageView(getImage(base_name)); } - public static void addPVsToPlotDialog(List names, + public static void addPVsToPlotDialog(List pvNames, UndoableActionManager undoableActionManager, Model model, Node nodeToPositionDialogOver) { - List> namesWithDisplayNames = new ArrayList<>(); - Optional currentPVName = Optional.empty(); - for (String name : names) { - if (name.startsWith("'") && name.endsWith("'") && name.length() >= 2) { - if (currentPVName.isPresent()) { - namesWithDisplayNames.add(new Pair<>(currentPVName.get(), name.substring(1,name.length()-1))); - currentPVName = Optional.empty(); - } - } - else { - if (currentPVName.isPresent()) { - namesWithDisplayNames.add(new Pair<>(currentPVName.get(), currentPVName.get())); - } - currentPVName = currentPVName.of(name); - } - } - if (currentPVName.isPresent()) { - namesWithDisplayNames.add(new Pair<>(currentPVName.get(), currentPVName.get())); - } // Offer potential PV name in dialog so user can edit/cancel // sim://sine sim://ramp sim://noise - AddPVDialog addPVDialog = new AddPVDialog(namesWithDisplayNames.size(), model, false); + AddPVDialog addPVDialog = new AddPVDialog(pvNames.size(), model, false); { // Set layout of addPVDialog: int addPVDialogWidth = 750; @@ -132,15 +113,15 @@ public static void addPVsToPlotDialog(List names, 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) @@ -53,7 +55,9 @@ public static AddModelItemCommand forPV( try { item = new PVItem(pv_name, period); - item.setDisplayName(display_name); + 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 6e9046a290..f23a1e3d4e 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,6 +10,7 @@ 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; @@ -237,12 +238,13 @@ private Node createContent(final Model model, final int count) /** Set initial name. Only effective when called before dialog is opened. * @param i Index - * @param nameAndDisplayName Suggested name + * @param pvName Suggested name */ - public void setNameAndDisplayName(final int i, final Pair nameAndDisplayName) + public void setNameAndDisplayName(final int i, final String pvName) { - nameAndDisplayNames.get(i).getKey().setText(nameAndDisplayName.getKey()); - nameAndDisplayNames.get(i).getValue().setText(nameAndDisplayName.getValue()); + nameAndDisplayNames.get(i).getKey().setText(pvName); + nameAndDisplayNames.get(i).getValue().setText(""); + nameAndDisplayNames.get(i).getValue().setPromptText("Default"); } /** @param i Index @@ -254,11 +256,17 @@ public String getName(final int i) } /** @param i Index - * @return Display name associated with PV + * @return Optionally, the display name to be associated with the PV in the Data Browser */ - public String getDisplayName(final int i) + public Optional getDisplayName(final int i) { - return nameAndDisplayNames.get(i).getValue().getText().trim(); + String trimmedDisplayName = nameAndDisplayNames.get(i).getValue().getText().trim(); + if (trimmedDisplayName.isEmpty()) { + return Optional.empty(); + } + else { + return Optional.of(trimmedDisplayName); + } } /** @param i Index diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/Controller.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/Controller.java index dfc37ed8b0..6a34204ad9 100644 --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/Controller.java +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/Controller.java @@ -279,7 +279,7 @@ public void droppedPVNames(List names, DialogHelper.positionDialog(dlg, plot.getPlot(), -200, -200); for (int i=0; i Date: Fri, 15 Nov 2024 08:19:00 +0100 Subject: [PATCH 33/36] CSSTUDIO-2072 Add the configuration option 'org.csstudio.trends.databrowser3/assign_pvs_from_clipboard_to_the_same_axis_by_default'. --- .../trends/databrowser3/preferences/Preferences.java | 4 ++++ .../csstudio/trends/databrowser3/ui/AddPVDialog.java | 11 ++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/preferences/Preferences.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/preferences/Preferences.java index b1f236b4be..f57f13addd 100644 --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/preferences/Preferences.java +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/preferences/Preferences.java @@ -101,6 +101,10 @@ public static class TimePreset /** Setting */ @Preference public static boolean config_dialog_supported; + @Preference + public static boolean assign_pvs_from_clipboard_to_the_same_axis_by_default; + + @Preference public static String value_axis_label_policy; 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 f23a1e3d4e..8031ac531f 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 @@ -169,6 +169,15 @@ private Node createContent(final Model model, final int count) 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 axis.setDisable(true)); // By default, the "yes" radio button is selected, and individual axes for each PV are disabled. + 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; } From 78c86ca042c5797d8cae4a9931549658ffa5b489 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Fri, 15 Nov 2024 08:29:37 +0100 Subject: [PATCH 34/36] CSSTUDIO-2072 Update error message. --- .../org/csstudio/trends/databrowser3/messages.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties b/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties index f3b64e51c4..45ab0efd3f 100644 --- a/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties +++ b/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties @@ -268,7 +268,7 @@ StatisticsMin=Min Value StatisticsMax=Max Value StatisticsSum=Sum StatusColumn=Status -TheClipboardDoesNotContainPVs=The clipboard doesn't contain a list of PV names:\n\n ...\n\nOptionally, a display name can be specified for a given PV name by putting the display name inside single quotes after a PV name:\n\n '' '' ... +TheClipboardDoesNotContainPVs=The clipboard doesn't contain a list of PV names. TimeAxis=Time Axis TimeColumn=Time TitleFontLbl=Title Font: From 91b5de96b31a9a8080df6cb0e071db85ce7d9b12 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Fri, 15 Nov 2024 08:46:29 +0100 Subject: [PATCH 35/36] CSSTUDIO-2072 Add 'assign_pvs_from_clipboard_to_the_same_axis_by_default' to 'databrowser_preferences.properties'. --- .../src/main/resources/databrowser_preferences.properties | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/databrowser/src/main/resources/databrowser_preferences.properties b/app/databrowser/src/main/resources/databrowser_preferences.properties index 23162d4bb0..e5ecaaef69 100644 --- a/app/databrowser/src/main/resources/databrowser_preferences.properties +++ b/app/databrowser/src/main/resources/databrowser_preferences.properties @@ -155,4 +155,9 @@ config_dialog_supported=false # Determines default value axis label policy. Supported options: # pv-name: classic policy. Default if this property is not set or set to an unsupported value. # pv-desc: use DESC field, if available from PV and non-empty. Works only with pva. -value_axis_label_policy=pv-name \ No newline at end of file +value_axis_label_policy=pv-name + +# Determines whether, by default, in the "Add PV(s) from the Clipboard"-window, the option to add +# all PVs to the same axis is enabled (when 'true'), or whether the option to add all PVs to +# different axes is enabled (when 'false'). +assign_pvs_from_clipboard_to_the_same_axis_by_default=false From 652952d42da404a2923995fee9756697bf5f023f Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Fri, 15 Nov 2024 08:54:18 +0100 Subject: [PATCH 36/36] CSSTUDIO-2072 Add label "Messages.DefaultDisplayName". --- .../main/java/org/csstudio/trends/databrowser3/Messages.java | 1 + .../java/org/csstudio/trends/databrowser3/ui/AddPVDialog.java | 2 +- .../org/csstudio/trends/databrowser3/messages.properties | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/Messages.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/Messages.java index cdc3016287..c25c88cc3b 100644 --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/Messages.java +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/Messages.java @@ -65,6 +65,7 @@ public class Messages CursorValueTT, DataBrowser, DataBrowserMenuPath, + DefaultDisplayName, DeleteAxis, DeleteAxisWarningFmt, DeleteItem, 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 8031ac531f..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 @@ -253,7 +253,7 @@ public void setNameAndDisplayName(final int i, final String pvName) { nameAndDisplayNames.get(i).getKey().setText(pvName); nameAndDisplayNames.get(i).getValue().setText(""); - nameAndDisplayNames.get(i).getValue().setPromptText("Default"); + nameAndDisplayNames.get(i).getValue().setPromptText(Messages.DefaultDisplayName); } /** @param i Index diff --git a/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties b/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties index 45ab0efd3f..1685c9de68 100644 --- a/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties +++ b/app/databrowser/src/main/resources/org/csstudio/trends/databrowser3/messages.properties @@ -45,6 +45,7 @@ CursorValue=Cursor Value CursorValueTT=Value At Current Cursor Position DataBrowser=Data Browser DataBrowserMenuPath=Display +DefaultDisplayName=Default Display Name DeleteAxis=Delete Axis DeleteAxisWarningFmt=The value axis {0} is used to plot {1}.\nYou can only delete axes that are not in use. DeleteItem=Delete Item