From 4a9e59eb2ad79aa255b8f4ca64e949aaa825b90a Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Thu, 8 Feb 2024 15:35:31 +0100 Subject: [PATCH 1/6] CSSTUDIO-2037 Target the current DockPane when opening applications from the context menu. --- .../runtime/app/ContextMenuSupport.java | 19 +++++++++++++++++++ .../ui/application/ContextMenuHelper.java | 12 ------------ 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/ContextMenuSupport.java b/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/ContextMenuSupport.java index 29839538f4..a5f2c724ba 100644 --- a/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/ContextMenuSupport.java +++ b/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/ContextMenuSupport.java @@ -43,6 +43,8 @@ import org.phoebus.ui.application.ContextMenuHelper; import org.phoebus.ui.application.ContextMenuService; import org.phoebus.ui.application.SaveSnapshotAction; +import org.phoebus.ui.docking.DockItem; +import org.phoebus.ui.docking.DockPane; import org.phoebus.ui.javafx.ImageCache; import org.phoebus.ui.javafx.PrintAction; import org.phoebus.ui.spi.ContextMenuEntry; @@ -79,6 +81,23 @@ class ContextMenuSupport { @Override public void handleContextMenu(final Widget widget, final int screen_x, final int screen_y) { final Node node = JFXBaseRepresentation.getJFXNode(widget); + + { + // Set the DockPane that contains 'widget' as the active + // DockPane, so that applications are launched in the + // same DockPane: + DisplayModel displayModel; + try { + displayModel = widget.getTopDisplayModel(); + } catch (Exception e) { + throw new RuntimeException(e); + } + DisplayRuntimeInstance displayRuntimeInstance = DisplayRuntimeInstance.ofDisplayModel(displayModel); + DockItem dockItem = displayRuntimeInstance.getDockItem(); + DockPane dockPane = dockItem.getDockPane(); + DockPane.setActiveDockPane(dockPane); + } + fillMenu(node, widget); // Use window, not node, to show menu for two reasons: // 1) menu.show(node, ..) means menu is attached to node, diff --git a/core/ui/src/main/java/org/phoebus/ui/application/ContextMenuHelper.java b/core/ui/src/main/java/org/phoebus/ui/application/ContextMenuHelper.java index a80006efcd..2bc5605e97 100644 --- a/core/ui/src/main/java/org/phoebus/ui/application/ContextMenuHelper.java +++ b/core/ui/src/main/java/org/phoebus/ui/application/ContextMenuHelper.java @@ -47,18 +47,6 @@ public class ContextMenuHelper */ public static boolean addSupportedEntries(final Node parent_node, final ContextMenu menu) { - final Window window = parent_node.getScene().getWindow(); - if (! (window instanceof Stage)) - { - logger.log(Level.WARNING, "Expected 'Stage' for context menu, got " + window); - return false; - } - final Stage stage = (Stage) window; - // Assert that this window's dock pane is the active one. - // (on Mac and Linux, invoking the context menu will not - // always activate the stage) - DockStage.setActiveDockStage(stage); - final List entries = ContextMenuService.getInstance().listSupportedContextMenuEntries(); if (entries.isEmpty()) return false; From a79a072543b4b1a954ad76e7b4a6f50d1f72da15 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Fri, 9 Feb 2024 11:04:39 +0100 Subject: [PATCH 2/6] CSSTUDIO-2037 Change the parameter "Node parent_node" of ContextMenuHelper.addSupportedEntries() to "Runnable setFocus". --- .../logging/ui/AlarmLogTableController.java | 21 ++++++++++++++++- .../alarm/ui/AlarmContextMenuHelper.java | 23 +++++++++++++++++-- .../databrowser3/ui/properties/TracesTab.java | 23 ++++++++++++++++++- .../databrowser3/ui/search/SearchView.java | 21 ++++++++++++++++- .../runtime/app/ContextMenuSupport.java | 11 +++++---- .../org/csstudio/display/pace/gui/GUI.java | 21 ++++++++++++++++- .../probe/view/ProbeController.java | 21 ++++++++++++++++- .../applications/pvtable/ui/PVTable.java | 21 ++++++++++++++++- .../applications/pvtree/ui/FXTree.java | 21 ++++++++++++++++- .../ConfigurationController.java | 22 +++++++++++++++++- .../BaseSnapshotTableViewController.java | 23 ++++++++++++++++++- .../ui/application/ContextMenuHelper.java | 5 ++-- .../main/java/org/phoebus/ui/pv/PVList.java | 23 ++++++++++++++++++- 13 files changed, 237 insertions(+), 19 deletions(-) diff --git a/app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTableController.java b/app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTableController.java index 21abe8c271..1f2d31ce0c 100644 --- a/app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTableController.java +++ b/app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTableController.java @@ -35,6 +35,8 @@ import javafx.scene.image.ImageView; import javafx.scene.input.KeyCode; import javafx.scene.layout.GridPane; +import javafx.stage.Stage; +import javafx.stage.Window; import javafx.util.Duration; import org.phoebus.applications.alarm.AlarmSystem; import org.phoebus.applications.alarm.logging.ui.AlarmLogTableQueryUtil.Keys; @@ -43,7 +45,9 @@ import org.phoebus.framework.jobs.Job; import org.phoebus.framework.selection.SelectionService; import org.phoebus.ui.application.ContextMenuHelper; +import org.phoebus.ui.application.PhoebusApplication; import org.phoebus.ui.dialog.ExceptionDetailsErrorDialog; +import org.phoebus.ui.docking.DockStage; import org.phoebus.ui.javafx.ImageCache; import org.phoebus.ui.javafx.JFXUtil; import org.phoebus.util.time.TimeParser; @@ -569,7 +573,22 @@ public void createContextMenu() { // search for other context menu actions registered for AlarmLogTableType SelectionService.getInstance().setSelection("AlarmLogTable", tableView.getSelectionModel().getSelectedItems()); - ContextMenuHelper.addSupportedEntries(tableView, contextMenu); + + Runnable setFocus; + { + Window window = tableView.getScene().getWindow().getScene().getWindow(); + if (window instanceof Stage) + { + final Stage stage = (Stage) window; + setFocus = () -> DockStage.setActiveDockStage(stage); + } + else { + PhoebusApplication.logger.log(Level.WARNING, "Expected 'Stage' for context menu, got " + window); + return; + } + } + + ContextMenuHelper.addSupportedEntries(setFocus, contextMenu); tableView.setContextMenu(contextMenu); diff --git a/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/AlarmContextMenuHelper.java b/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/AlarmContextMenuHelper.java index cffca22e08..bbaffe33d2 100644 --- a/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/AlarmContextMenuHelper.java +++ b/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/AlarmContextMenuHelper.java @@ -12,7 +12,10 @@ import java.util.List; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import javafx.stage.Stage; +import javafx.stage.Window; import org.phoebus.applications.alarm.AlarmSystem; import org.phoebus.applications.alarm.client.AlarmClient; import org.phoebus.applications.alarm.client.AlarmClientLeaf; @@ -31,6 +34,9 @@ import javafx.scene.control.ContextMenu; import javafx.scene.control.MenuItem; import javafx.scene.control.SeparatorMenuItem; +import org.phoebus.ui.docking.DockStage; + +import static org.phoebus.ui.application.PhoebusApplication.logger; /** Helper for adding guidance, displays, commands to context menu * @author Kay Kasemir @@ -128,17 +134,30 @@ public void addSupportedEntries(final Node node, menu_items.add(0, new UnAcknowledgeAction(model, acked)); } // Add context menu actions for PVs + Runnable setFocus; + { + Window window = node.getScene().getWindow().getScene().getWindow(); + if (window instanceof Stage) + { + final Stage stage = (Stage) window; + setFocus = () -> DockStage.setActiveDockStage(stage); + } + else { + logger.log(Level.WARNING, "Expected 'Stage' for context menu, got " + window); + return; + } + } if (pvnames.size() > 0) { menu_items.add(new SeparatorMenuItem()); SelectionService.getInstance().setSelection("AlarmUI", pvnames); - ContextMenuHelper.addSupportedEntries(node, menu); + ContextMenuHelper.addSupportedEntries(setFocus, menu); } else { // search for other context menu actions registered for AlarmTreeItem SelectionService.getInstance().setSelection("AlarmUI", selection); - ContextMenuHelper.addSupportedEntries(node, menu); + ContextMenuHelper.addSupportedEntries(setFocus, menu); } } 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 327b558063..69f88e6c66 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 @@ -13,8 +13,11 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.logging.Level; import java.util.stream.Collectors; +import javafx.stage.Stage; +import javafx.stage.Window; import org.csstudio.javafx.rtplot.LineStyle; import org.csstudio.javafx.rtplot.PointType; import org.csstudio.javafx.rtplot.TraceType; @@ -36,6 +39,7 @@ import org.phoebus.ui.application.ContextMenuHelper; import org.phoebus.ui.dialog.AlertWithToggle; import org.phoebus.ui.dialog.DialogHelper; +import org.phoebus.ui.docking.DockStage; import org.phoebus.ui.undo.UndoableActionManager; import org.phoebus.util.time.SecondsParser; @@ -76,6 +80,8 @@ import javafx.scene.paint.Color; import javafx.util.converter.DefaultStringConverter; +import static org.phoebus.ui.application.PhoebusApplication.logger; + /** Property tab for traces (items, archives) * @author Kay Kasemir */ @@ -740,7 +746,22 @@ private void createContextMenu() if (pvs.size() > 0) { SelectionService.getInstance().setSelection(this, pvs); - ContextMenuHelper.addSupportedEntries(trace_table, menu); + + Runnable setFocus; + { + Window window = trace_table.getScene().getWindow().getScene().getWindow(); + if (window instanceof Stage) + { + final Stage stage = (Stage) window; + setFocus = () -> DockStage.setActiveDockStage(stage); + } + else { + logger.log(Level.WARNING, "Expected 'Stage' for context menu, got " + window); + return; + } + } + + ContextMenuHelper.addSupportedEntries(setFocus, menu); } menu.show(trace_table.getScene().getWindow(), event.getScreenX(), event.getScreenY()); diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/search/SearchView.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/search/SearchView.java index 910339b921..beffbc543c 100644 --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/search/SearchView.java +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/search/SearchView.java @@ -10,8 +10,11 @@ import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; +import java.util.logging.Level; import java.util.stream.Collectors; +import javafx.stage.Stage; +import javafx.stage.Window; import org.csstudio.trends.databrowser3.Messages; import org.csstudio.trends.databrowser3.archive.SearchJob; import org.csstudio.trends.databrowser3.model.ArchiveDataSource; @@ -22,6 +25,7 @@ import org.phoebus.framework.selection.SelectionService; import org.phoebus.ui.application.ContextMenuHelper; import org.phoebus.ui.dialog.ExceptionDetailsErrorDialog; +import org.phoebus.ui.docking.DockStage; import org.phoebus.ui.undo.UndoableActionManager; import javafx.application.Platform; @@ -52,6 +56,8 @@ import javafx.scene.layout.Priority; import javafx.scene.layout.VBox; +import static org.phoebus.ui.application.PhoebusApplication.logger; + /** Panel for searching the archive * @author Kay Kasemir */ @@ -161,9 +167,22 @@ private void updateContextMenu(final ContextMenuEvent event) { menu.getItems().setAll(new AddToPlotAction(channel_table, model, undo, selection), new SeparatorMenuItem()); + Runnable setFocus; + { + Window window = channel_table.getScene().getWindow().getScene().getWindow(); + if (window instanceof Stage) + { + final Stage stage = (Stage) window; + setFocus = () -> DockStage.setActiveDockStage(stage); + } + else { + logger.log(Level.WARNING, "Expected 'Stage' for context menu, got " + window); + return; + } + } SelectionService.getInstance().setSelection(channel_table, selection); - ContextMenuHelper.addSupportedEntries(channel_table, menu); + ContextMenuHelper.addSupportedEntries(setFocus, menu); menu.show(channel_table.getScene().getWindow(), event.getScreenX(), event.getScreenY()); } } diff --git a/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/ContextMenuSupport.java b/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/ContextMenuSupport.java index a5f2c724ba..9bd21e5c90 100644 --- a/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/ContextMenuSupport.java +++ b/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/ContextMenuSupport.java @@ -82,6 +82,7 @@ class ContextMenuSupport { public void handleContextMenu(final Widget widget, final int screen_x, final int screen_y) { final Node node = JFXBaseRepresentation.getJFXNode(widget); + Runnable setFocus; { // Set the DockPane that contains 'widget' as the active // DockPane, so that applications are launched in the @@ -95,10 +96,10 @@ public void handleContextMenu(final Widget widget, final int screen_x, final int DisplayRuntimeInstance displayRuntimeInstance = DisplayRuntimeInstance.ofDisplayModel(displayModel); DockItem dockItem = displayRuntimeInstance.getDockItem(); DockPane dockPane = dockItem.getDockPane(); - DockPane.setActiveDockPane(dockPane); + setFocus = () -> DockPane.setActiveDockPane(dockPane); } - fillMenu(node, widget); + fillMenu(setFocus, widget); // Use window, not node, to show menu for two reasons: // 1) menu.show(node, ..) means menu is attached to node, // inheriting styles of nodes. For widgets that change background color @@ -114,10 +115,10 @@ public void handleContextMenu(final Widget widget, final int screen_x, final int /** Fill context menu with items for widget * - * @param node + * @param setFocus * @param widget */ - private void fillMenu(final Node node, final Widget widget) + private void fillMenu(Runnable setFocus, final Widget widget) { final ObservableList items = menu.getItems(); items.setAll(new WidgetInfoAction(widget)); @@ -208,7 +209,7 @@ private void fillMenu(final Node node, final Widget widget) // Set the 'selection' to the PV of this widget SelectionService.getInstance().setSelection(DisplayRuntimeApplication.NAME, processVariables); // Add PV-based menu entries - ContextMenuHelper.addSupportedEntries(node, menu); + ContextMenuHelper.addSupportedEntries(setFocus, menu); items.add(new SeparatorMenuItem()); } diff --git a/app/pace/src/main/java/org/csstudio/display/pace/gui/GUI.java b/app/pace/src/main/java/org/csstudio/display/pace/gui/GUI.java index 4ff58f1806..69e6bf4d59 100644 --- a/app/pace/src/main/java/org/csstudio/display/pace/gui/GUI.java +++ b/app/pace/src/main/java/org/csstudio/display/pace/gui/GUI.java @@ -15,6 +15,8 @@ import java.util.function.Consumer; import java.util.logging.Level; +import javafx.stage.Stage; +import javafx.stage.Window; import org.csstudio.display.pace.Messages; import org.csstudio.display.pace.PACEApp; import org.csstudio.display.pace.model.Cell; @@ -38,6 +40,8 @@ import javafx.scene.control.TablePosition; import javafx.scene.control.TableView; import javafx.scene.layout.BorderPane; +import org.phoebus.ui.application.PhoebusApplication; +import org.phoebus.ui.docking.DockStage; /** GUI for PACE {@link Model} * @author Kay Kasemir @@ -200,7 +204,22 @@ private void createContextMenu() { items.add(new SeparatorMenuItem()); SelectionService.getInstance().setSelection("AlarmUI", pvnames); - ContextMenuHelper.addSupportedEntries(table, menu); + + Runnable setFocus; + { + Window window = table.getScene().getWindow().getScene().getWindow(); + if (window instanceof Stage) + { + final Stage stage = (Stage) window; + setFocus = () -> DockStage.setActiveDockStage(stage); + } + else { + PhoebusApplication.logger.log(Level.WARNING, "Expected 'Stage' for context menu, got " + window); + return; + } + } + + ContextMenuHelper.addSupportedEntries(setFocus, menu); } }); diff --git a/app/probe/src/main/java/org/phoebus/applications/probe/view/ProbeController.java b/app/probe/src/main/java/org/phoebus/applications/probe/view/ProbeController.java index 21bf79ced3..73ea4f430e 100644 --- a/app/probe/src/main/java/org/phoebus/applications/probe/view/ProbeController.java +++ b/app/probe/src/main/java/org/phoebus/applications/probe/view/ProbeController.java @@ -8,6 +8,8 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.logging.Level; +import javafx.stage.Stage; +import javafx.stage.Window; import org.epics.vtype.Alarm; import org.epics.vtype.AlarmSeverity; import org.epics.vtype.Display; @@ -21,6 +23,8 @@ import org.phoebus.pv.PV; import org.phoebus.pv.PVPool; import org.phoebus.ui.application.ContextMenuHelper; +import org.phoebus.ui.application.PhoebusApplication; +import org.phoebus.ui.docking.DockStage; import org.phoebus.ui.javafx.JFXUtil; import org.phoebus.ui.pv.SeverityColors; import org.phoebus.ui.vtype.FormatOption; @@ -172,7 +176,22 @@ public void initialize() { SelectionService.getInstance().setSelection("Probe", List.of(new ProcessVariable(txtPVName.getText().trim()))); } - ContextMenuHelper.addSupportedEntries(txtPVName, menu); + + Runnable setFocus; + { + Window window = txtPVName.getScene().getWindow().getScene().getWindow(); + if (window instanceof Stage) + { + final Stage stage = (Stage) window; + setFocus = () -> DockStage.setActiveDockStage(stage); + } + else { + PhoebusApplication.logger.log(Level.WARNING, "Expected 'Stage' for context menu, got " + window); + return; + } + } + + ContextMenuHelper.addSupportedEntries(setFocus, menu); menu.show(txtPVName.getScene().getWindow(), event.getScreenX(), event.getScreenY()); }); diff --git a/app/pvtable/src/main/java/org/phoebus/applications/pvtable/ui/PVTable.java b/app/pvtable/src/main/java/org/phoebus/applications/pvtable/ui/PVTable.java index e0b25f0a32..c1670c4fbf 100644 --- a/app/pvtable/src/main/java/org/phoebus/applications/pvtable/ui/PVTable.java +++ b/app/pvtable/src/main/java/org/phoebus/applications/pvtable/ui/PVTable.java @@ -16,6 +16,8 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import javafx.stage.Stage; +import javafx.stage.Window; import org.epics.vtype.VEnum; import org.epics.vtype.VType; import org.phoebus.applications.pvtable.PVTableApplication; @@ -35,6 +37,7 @@ import org.phoebus.ui.dialog.DialogHelper; import org.phoebus.ui.dialog.NumericInputDialog; import org.phoebus.ui.dnd.DataFormats; +import org.phoebus.ui.docking.DockStage; import org.phoebus.ui.javafx.PrintAction; import org.phoebus.ui.javafx.Screenshot; import org.phoebus.ui.javafx.ToolbarHelper; @@ -82,6 +85,8 @@ import javafx.scene.paint.Color; import javafx.util.converter.DefaultStringConverter; +import static org.phoebus.ui.application.PhoebusApplication.logger; + /** PV Table and its toolbar * @author Kay Kasemir @@ -688,8 +693,22 @@ private void createContextMenu() menu.getItems().addAll(disableSaveRestore, new SeparatorMenuItem()); } + Runnable setFocus; + { + Window window = table.getScene().getWindow().getScene().getWindow(); + if (window instanceof Stage) + { + final Stage stage = (Stage) window; + setFocus = () -> DockStage.setActiveDockStage(stage); + } + else { + logger.log(Level.WARNING, "Expected 'Stage' for context menu, got " + window); + return; + } + } + // Add PV entries - if (ContextMenuHelper.addSupportedEntries(table, menu)) + if (ContextMenuHelper.addSupportedEntries(setFocus, menu)) menu.getItems().add(new SeparatorMenuItem()); menu.getItems().add(new PrintAction(this)); diff --git a/app/pvtree/src/main/java/org/phoebus/applications/pvtree/ui/FXTree.java b/app/pvtree/src/main/java/org/phoebus/applications/pvtree/ui/FXTree.java index c9bc60fbcf..3559ad9a47 100644 --- a/app/pvtree/src/main/java/org/phoebus/applications/pvtree/ui/FXTree.java +++ b/app/pvtree/src/main/java/org/phoebus/applications/pvtree/ui/FXTree.java @@ -18,6 +18,8 @@ import javafx.scene.control.MenuItem; import javafx.scene.image.ImageView; +import javafx.stage.Stage; +import javafx.stage.Window; import org.phoebus.applications.pvtree.PVTreeApplication; import org.phoebus.applications.pvtree.model.TreeModel; import org.phoebus.applications.pvtree.model.TreeModelItem; @@ -27,7 +29,9 @@ import org.phoebus.framework.selection.SelectionService; import org.phoebus.ui.application.ContextMenuHelper; import org.phoebus.ui.application.ContextMenuService; +import org.phoebus.ui.application.PhoebusApplication; import org.phoebus.ui.application.SaveSnapshotAction; +import org.phoebus.ui.docking.DockStage; import org.phoebus.ui.javafx.PrintAction; import org.phoebus.ui.javafx.Screenshot; import org.phoebus.ui.javafx.TreeHelper; @@ -137,7 +141,22 @@ private void createContextMenu() tree_view.setOnContextMenuRequested(event -> { menu.getItems().clear(); - if (ContextMenuHelper.addSupportedEntries(tree_view, menu)) + + Runnable setFocus; + { + Window window = tree_view.getScene().getWindow().getScene().getWindow(); + if (window instanceof Stage) + { + final Stage stage = (Stage) window; + setFocus = () -> DockStage.setActiveDockStage(stage); + } + else { + PhoebusApplication.logger.log(Level.WARNING, "Expected 'Stage' for context menu, got " + window); + return; + } + } + + if (ContextMenuHelper.addSupportedEntries(setFocus, menu)) menu.getItems().add(new SeparatorMenuItem()); menu.getItems().add(new PrintAction(tree_view)); menu.getItems().add(new SaveSnapshotAction(tree_view)); diff --git a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/configuration/ConfigurationController.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/configuration/ConfigurationController.java index 11587af979..13ab537ea9 100644 --- a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/configuration/ConfigurationController.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/configuration/ConfigurationController.java @@ -33,6 +33,8 @@ import javafx.scene.image.ImageView; import javafx.scene.layout.BorderPane; import javafx.scene.layout.Pane; +import javafx.stage.Stage; +import javafx.stage.Window; import javafx.util.Callback; import org.phoebus.applications.saveandrestore.Messages; import org.phoebus.applications.saveandrestore.SaveAndRestoreApplication; @@ -44,6 +46,7 @@ import org.phoebus.framework.selection.SelectionService; import org.phoebus.ui.application.ContextMenuHelper; import org.phoebus.ui.dialog.ExceptionDetailsErrorDialog; +import org.phoebus.ui.docking.DockStage; import org.phoebus.ui.javafx.ImageCache; import org.phoebus.util.time.TimestampFormats; @@ -57,6 +60,8 @@ import java.util.logging.Logger; import java.util.stream.Collectors; +import static org.phoebus.ui.application.PhoebusApplication.logger; + public class ConfigurationController extends SaveAndRestoreBaseController implements NodeChangedListener { @FXML @@ -188,7 +193,22 @@ public void updateItem(String item, boolean empty) { .map(tableEntry -> new ProcessVariable(tableEntry.getPvName())) .collect(Collectors.toList()); SelectionService.getInstance().setSelection(SaveAndRestoreApplication.NAME, selectedPVList); - ContextMenuHelper.addSupportedEntries(cell, pvNameContextMenu); + + Runnable setFocus; + { + Window window = cell.getScene().getWindow().getScene().getWindow(); + if (window instanceof Stage) + { + final Stage stage = (Stage) window; + setFocus = () -> DockStage.setActiveDockStage(stage); + } + else { + logger.log(Level.WARNING, "Expected 'Stage' for context menu, got " + window); + return; + } + } + + ContextMenuHelper.addSupportedEntries(setFocus, pvNameContextMenu); } pvNameContextMenu.show(cell, event.getScreenX(), event.getScreenY()); }); diff --git a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/BaseSnapshotTableViewController.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/BaseSnapshotTableViewController.java index 730371fb1a..0f3c59d0ee 100644 --- a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/BaseSnapshotTableViewController.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/BaseSnapshotTableViewController.java @@ -30,6 +30,8 @@ import javafx.scene.input.MouseEvent; import javafx.scene.text.Font; import javafx.scene.text.Text; +import javafx.stage.Stage; +import javafx.stage.Window; import org.epics.vtype.VType; import org.phoebus.applications.saveandrestore.Messages; import org.phoebus.applications.saveandrestore.SaveAndRestoreApplication; @@ -38,6 +40,7 @@ import org.phoebus.core.types.TimeStampedProcessVariable; import org.phoebus.framework.selection.SelectionService; import org.phoebus.ui.application.ContextMenuHelper; +import org.phoebus.ui.docking.DockStage; import org.phoebus.util.time.TimestampFormats; import java.lang.reflect.Field; @@ -46,9 +49,12 @@ import java.time.Instant; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; +import static org.phoebus.ui.application.PhoebusApplication.logger; + /** * Base controller class for the snapshot table view. It handles common items (UI components, methods) needed * by all subclasses. @@ -193,7 +199,22 @@ protected void updateItem(TableEntry item, boolean empty) { contextMenu.hide(); contextMenu.getItems().clear(); SelectionService.getInstance().setSelection(SaveAndRestoreApplication.NAME, selectedPVList); - ContextMenuHelper.addSupportedEntries(this, contextMenu); + + Runnable setFocus; + { + Window window = getScene().getWindow().getScene().getWindow(); + if (window instanceof Stage) + { + final Stage stage = (Stage) window; + setFocus = () -> DockStage.setActiveDockStage(stage); + } + else { + logger.log(Level.WARNING, "Expected 'Stage' for context menu, got " + window); + return; + } + } + + ContextMenuHelper.addSupportedEntries(setFocus, contextMenu); contextMenu.getItems().add(new SeparatorMenuItem()); MenuItem toggle = new MenuItem(); toggle.setText(item.readOnlyProperty().get() ? Messages.makeRestorable : Messages.makeReadOnly); diff --git a/core/ui/src/main/java/org/phoebus/ui/application/ContextMenuHelper.java b/core/ui/src/main/java/org/phoebus/ui/application/ContextMenuHelper.java index 2bc5605e97..58e4baebb3 100644 --- a/core/ui/src/main/java/org/phoebus/ui/application/ContextMenuHelper.java +++ b/core/ui/src/main/java/org/phoebus/ui/application/ContextMenuHelper.java @@ -41,11 +41,11 @@ public class ContextMenuHelper * after adding application specific menu entries, * to add entries based on the current selection. * - * @param parent_node Parent node, usually owner of the context menu + * @param setFocus Sets the correct focus (typically on a DockPane or Window) before running the action associated with a menu entry * @param menu Menu where selection-based entries will be added * @return true if a supported entry was added. */ - public static boolean addSupportedEntries(final Node parent_node, final ContextMenu menu) + public static boolean addSupportedEntries(Runnable setFocus, final ContextMenu menu) { final List entries = ContextMenuService.getInstance().listSupportedContextMenuEntries(); if (entries.isEmpty()) @@ -60,6 +60,7 @@ public static boolean addSupportedEntries(final Node parent_node, final ContextM item.setGraphic(new ImageView(icon)); item.setOnAction(e -> { + setFocus.run(); try { List selection = new ArrayList<>(); diff --git a/core/ui/src/main/java/org/phoebus/ui/pv/PVList.java b/core/ui/src/main/java/org/phoebus/ui/pv/PVList.java index 6957ba77ce..366b1db32b 100644 --- a/core/ui/src/main/java/org/phoebus/ui/pv/PVList.java +++ b/core/ui/src/main/java/org/phoebus/ui/pv/PVList.java @@ -9,9 +9,12 @@ import java.util.Collection; import java.util.List; +import java.util.logging.Level; import java.util.stream.Collectors; import javafx.beans.property.SimpleObjectProperty; +import javafx.stage.Stage; +import javafx.stage.Window; import org.epics.vtype.Alarm; import org.epics.vtype.AlarmSeverity; import org.epics.vtype.VNumberArray; @@ -25,6 +28,7 @@ import org.phoebus.pv.RefCountMap.ReferencedEntry; import org.phoebus.ui.application.ContextMenuHelper; import org.phoebus.ui.application.Messages; +import org.phoebus.ui.docking.DockStage; import org.phoebus.ui.javafx.ImageCache; import javafx.application.Platform; @@ -55,6 +59,8 @@ import org.phoebus.ui.vtype.FormatOption; import org.phoebus.ui.vtype.FormatOptionHandler; +import static org.phoebus.ui.application.PhoebusApplication.logger; + /** Table that lists PVs, their reference count etc. * @author Kay Kasemir */ @@ -187,7 +193,22 @@ private void createContextMenu() table.setOnContextMenuRequested(event -> { menu.getItems().clear(); - ContextMenuHelper.addSupportedEntries(table, menu); + + Runnable setFocus; + { + Window window = table.getScene().getWindow().getScene().getWindow(); + if (window instanceof Stage) + { + final Stage stage = (Stage) window; + setFocus = () -> DockStage.setActiveDockStage(stage); + } + else { + logger.log(Level.WARNING, "Expected 'Stage' for context menu, got " + window); + return; + } + } + + ContextMenuHelper.addSupportedEntries(setFocus, menu); menu.show(table.getScene().getWindow()); }); table.setContextMenu(menu); From bea0f522eb05b6da8bb2716dc10d6d0dcab430b3 Mon Sep 17 00:00:00 2001 From: Kunal Shroff Date: Fri, 9 Feb 2024 10:44:18 -0500 Subject: [PATCH 3/6] Add utility class for helping create a setFocus runnable for given Node --- .../probe/view/ProbeController.java | 18 ++---------- .../org/phoebus/ui/focus/FocusUtility.java | 28 +++++++++++++++++++ 2 files changed, 31 insertions(+), 15 deletions(-) create mode 100644 core/ui/src/main/java/org/phoebus/ui/focus/FocusUtility.java diff --git a/app/probe/src/main/java/org/phoebus/applications/probe/view/ProbeController.java b/app/probe/src/main/java/org/phoebus/applications/probe/view/ProbeController.java index 73ea4f430e..51103248da 100644 --- a/app/probe/src/main/java/org/phoebus/applications/probe/view/ProbeController.java +++ b/app/probe/src/main/java/org/phoebus/applications/probe/view/ProbeController.java @@ -25,6 +25,8 @@ import org.phoebus.ui.application.ContextMenuHelper; import org.phoebus.ui.application.PhoebusApplication; import org.phoebus.ui.docking.DockStage; +import org.phoebus.ui.focus.FocusUtility; +import org.phoebus.ui.javafx.FocusUtil; import org.phoebus.ui.javafx.JFXUtil; import org.phoebus.ui.pv.SeverityColors; import org.phoebus.ui.vtype.FormatOption; @@ -177,21 +179,7 @@ public void initialize() { List.of(new ProcessVariable(txtPVName.getText().trim()))); } - Runnable setFocus; - { - Window window = txtPVName.getScene().getWindow().getScene().getWindow(); - if (window instanceof Stage) - { - final Stage stage = (Stage) window; - setFocus = () -> DockStage.setActiveDockStage(stage); - } - else { - PhoebusApplication.logger.log(Level.WARNING, "Expected 'Stage' for context menu, got " + window); - return; - } - } - - ContextMenuHelper.addSupportedEntries(setFocus, menu); + ContextMenuHelper.addSupportedEntries(FocusUtility.setFocusOn(txtAlarm), menu); menu.show(txtPVName.getScene().getWindow(), event.getScreenX(), event.getScreenY()); }); diff --git a/core/ui/src/main/java/org/phoebus/ui/focus/FocusUtility.java b/core/ui/src/main/java/org/phoebus/ui/focus/FocusUtility.java new file mode 100644 index 0000000000..980177fc90 --- /dev/null +++ b/core/ui/src/main/java/org/phoebus/ui/focus/FocusUtility.java @@ -0,0 +1,28 @@ +package org.phoebus.ui.focus; + +import javafx.scene.Node; +import javafx.stage.Stage; +import javafx.stage.Window; +import org.phoebus.ui.application.PhoebusApplication; +import org.phoebus.ui.docking.DockStage; + +import java.util.logging.Level; + +public class FocusUtility { + + public static Runnable setFocusOn(final Node node){ + { + Window window = node.getScene().getWindow().getScene().getWindow(); + if (window instanceof Stage) + { + final Stage stage = (Stage) window; + return () -> DockStage.setActiveDockStage(stage); + } else + { + PhoebusApplication.logger.log(Level.WARNING, "Expected 'Stage' for context menu, got " + window); + return () -> { + }; + } + } + } +} From c612387408b992b0af1c3ec1d78c52457ca9b06e Mon Sep 17 00:00:00 2001 From: Kunal Shroff Date: Fri, 9 Feb 2024 11:31:46 -0500 Subject: [PATCH 4/6] use the FocusUtility when populating the context menu actions --- .../logging/ui/AlarmLogTableController.java | 22 ++------- .../alarm/ui/AlarmContextMenuHelper.java | 47 ++++++------------- .../databrowser3/ui/properties/TracesTab.java | 23 +-------- .../databrowser3/ui/search/SearchView.java | 21 +-------- .../org/csstudio/display/pace/gui/GUI.java | 22 +-------- .../applications/pvtable/ui/PVTable.java | 20 +------- .../applications/pvtree/ui/FXTree.java | 21 +-------- .../ConfigurationController.java | 23 ++------- .../BaseSnapshotTableViewController.java | 21 ++------- .../org/phoebus/ui/focus/FocusUtility.java | 8 ++++ .../main/java/org/phoebus/ui/pv/PVList.java | 21 +-------- 11 files changed, 43 insertions(+), 206 deletions(-) diff --git a/app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTableController.java b/app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTableController.java index 1f2d31ce0c..8843345dbe 100644 --- a/app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTableController.java +++ b/app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTableController.java @@ -35,8 +35,7 @@ import javafx.scene.image.ImageView; import javafx.scene.input.KeyCode; import javafx.scene.layout.GridPane; -import javafx.stage.Stage; -import javafx.stage.Window; + import javafx.util.Duration; import org.phoebus.applications.alarm.AlarmSystem; import org.phoebus.applications.alarm.logging.ui.AlarmLogTableQueryUtil.Keys; @@ -45,9 +44,8 @@ import org.phoebus.framework.jobs.Job; import org.phoebus.framework.selection.SelectionService; import org.phoebus.ui.application.ContextMenuHelper; -import org.phoebus.ui.application.PhoebusApplication; import org.phoebus.ui.dialog.ExceptionDetailsErrorDialog; -import org.phoebus.ui.docking.DockStage; +import org.phoebus.ui.focus.FocusUtility; import org.phoebus.ui.javafx.ImageCache; import org.phoebus.ui.javafx.JFXUtil; import org.phoebus.util.time.TimeParser; @@ -574,21 +572,7 @@ public void createContextMenu() { // search for other context menu actions registered for AlarmLogTableType SelectionService.getInstance().setSelection("AlarmLogTable", tableView.getSelectionModel().getSelectedItems()); - Runnable setFocus; - { - Window window = tableView.getScene().getWindow().getScene().getWindow(); - if (window instanceof Stage) - { - final Stage stage = (Stage) window; - setFocus = () -> DockStage.setActiveDockStage(stage); - } - else { - PhoebusApplication.logger.log(Level.WARNING, "Expected 'Stage' for context menu, got " + window); - return; - } - } - - ContextMenuHelper.addSupportedEntries(setFocus, contextMenu); + ContextMenuHelper.addSupportedEntries(FocusUtility.setFocusOn(tableView), contextMenu); tableView.setContextMenu(contextMenu); diff --git a/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/AlarmContextMenuHelper.java b/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/AlarmContextMenuHelper.java index bbaffe33d2..d37ffb0047 100644 --- a/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/AlarmContextMenuHelper.java +++ b/app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/AlarmContextMenuHelper.java @@ -7,15 +7,12 @@ *******************************************************************************/ package org.phoebus.applications.alarm.ui; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; - -import javafx.stage.Stage; -import javafx.stage.Window; +import javafx.scene.Node; +import javafx.scene.control.Alert; +import javafx.scene.control.Alert.AlertType; +import javafx.scene.control.ContextMenu; +import javafx.scene.control.MenuItem; +import javafx.scene.control.SeparatorMenuItem; import org.phoebus.applications.alarm.AlarmSystem; import org.phoebus.applications.alarm.client.AlarmClient; import org.phoebus.applications.alarm.client.AlarmClientLeaf; @@ -27,16 +24,13 @@ import org.phoebus.framework.selection.SelectionService; import org.phoebus.ui.application.ContextMenuHelper; import org.phoebus.ui.dialog.DialogHelper; +import org.phoebus.ui.focus.FocusUtility; -import javafx.scene.Node; -import javafx.scene.control.Alert; -import javafx.scene.control.Alert.AlertType; -import javafx.scene.control.ContextMenu; -import javafx.scene.control.MenuItem; -import javafx.scene.control.SeparatorMenuItem; -import org.phoebus.ui.docking.DockStage; - -import static org.phoebus.ui.application.PhoebusApplication.logger; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; /** Helper for adding guidance, displays, commands to context menu * @author Kay Kasemir @@ -134,30 +128,17 @@ public void addSupportedEntries(final Node node, menu_items.add(0, new UnAcknowledgeAction(model, acked)); } // Add context menu actions for PVs - Runnable setFocus; - { - Window window = node.getScene().getWindow().getScene().getWindow(); - if (window instanceof Stage) - { - final Stage stage = (Stage) window; - setFocus = () -> DockStage.setActiveDockStage(stage); - } - else { - logger.log(Level.WARNING, "Expected 'Stage' for context menu, got " + window); - return; - } - } if (pvnames.size() > 0) { menu_items.add(new SeparatorMenuItem()); SelectionService.getInstance().setSelection("AlarmUI", pvnames); - ContextMenuHelper.addSupportedEntries(setFocus, menu); + ContextMenuHelper.addSupportedEntries(FocusUtility.setFocusOn(node), menu); } else { // search for other context menu actions registered for AlarmTreeItem SelectionService.getInstance().setSelection("AlarmUI", selection); - ContextMenuHelper.addSupportedEntries(setFocus, menu); + ContextMenuHelper.addSupportedEntries(FocusUtility.setFocusOn(node), menu); } } 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 69f88e6c66..78a7437c42 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 @@ -16,8 +16,6 @@ import java.util.logging.Level; import java.util.stream.Collectors; -import javafx.stage.Stage; -import javafx.stage.Window; import org.csstudio.javafx.rtplot.LineStyle; import org.csstudio.javafx.rtplot.PointType; import org.csstudio.javafx.rtplot.TraceType; @@ -39,7 +37,7 @@ import org.phoebus.ui.application.ContextMenuHelper; import org.phoebus.ui.dialog.AlertWithToggle; import org.phoebus.ui.dialog.DialogHelper; -import org.phoebus.ui.docking.DockStage; +import org.phoebus.ui.focus.FocusUtility; import org.phoebus.ui.undo.UndoableActionManager; import org.phoebus.util.time.SecondsParser; @@ -80,8 +78,6 @@ import javafx.scene.paint.Color; import javafx.util.converter.DefaultStringConverter; -import static org.phoebus.ui.application.PhoebusApplication.logger; - /** Property tab for traces (items, archives) * @author Kay Kasemir */ @@ -746,22 +742,7 @@ private void createContextMenu() if (pvs.size() > 0) { SelectionService.getInstance().setSelection(this, pvs); - - Runnable setFocus; - { - Window window = trace_table.getScene().getWindow().getScene().getWindow(); - if (window instanceof Stage) - { - final Stage stage = (Stage) window; - setFocus = () -> DockStage.setActiveDockStage(stage); - } - else { - logger.log(Level.WARNING, "Expected 'Stage' for context menu, got " + window); - return; - } - } - - ContextMenuHelper.addSupportedEntries(setFocus, menu); + ContextMenuHelper.addSupportedEntries(FocusUtility.setFocusOn(trace_table), menu); } menu.show(trace_table.getScene().getWindow(), event.getScreenX(), event.getScreenY()); diff --git a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/search/SearchView.java b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/search/SearchView.java index beffbc543c..a58f3d108d 100644 --- a/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/search/SearchView.java +++ b/app/databrowser/src/main/java/org/csstudio/trends/databrowser3/ui/search/SearchView.java @@ -10,11 +10,8 @@ import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; -import java.util.logging.Level; import java.util.stream.Collectors; -import javafx.stage.Stage; -import javafx.stage.Window; import org.csstudio.trends.databrowser3.Messages; import org.csstudio.trends.databrowser3.archive.SearchJob; import org.csstudio.trends.databrowser3.model.ArchiveDataSource; @@ -25,7 +22,7 @@ import org.phoebus.framework.selection.SelectionService; import org.phoebus.ui.application.ContextMenuHelper; import org.phoebus.ui.dialog.ExceptionDetailsErrorDialog; -import org.phoebus.ui.docking.DockStage; +import org.phoebus.ui.focus.FocusUtility; import org.phoebus.ui.undo.UndoableActionManager; import javafx.application.Platform; @@ -167,22 +164,8 @@ private void updateContextMenu(final ContextMenuEvent event) { menu.getItems().setAll(new AddToPlotAction(channel_table, model, undo, selection), new SeparatorMenuItem()); - Runnable setFocus; - { - Window window = channel_table.getScene().getWindow().getScene().getWindow(); - if (window instanceof Stage) - { - final Stage stage = (Stage) window; - setFocus = () -> DockStage.setActiveDockStage(stage); - } - else { - logger.log(Level.WARNING, "Expected 'Stage' for context menu, got " + window); - return; - } - } - SelectionService.getInstance().setSelection(channel_table, selection); - ContextMenuHelper.addSupportedEntries(setFocus, menu); + ContextMenuHelper.addSupportedEntries(FocusUtility.setFocusOn(channel_table), menu); menu.show(channel_table.getScene().getWindow(), event.getScreenX(), event.getScreenY()); } } diff --git a/app/pace/src/main/java/org/csstudio/display/pace/gui/GUI.java b/app/pace/src/main/java/org/csstudio/display/pace/gui/GUI.java index 69e6bf4d59..2a1c323ea6 100644 --- a/app/pace/src/main/java/org/csstudio/display/pace/gui/GUI.java +++ b/app/pace/src/main/java/org/csstudio/display/pace/gui/GUI.java @@ -15,8 +15,6 @@ import java.util.function.Consumer; import java.util.logging.Level; -import javafx.stage.Stage; -import javafx.stage.Window; import org.csstudio.display.pace.Messages; import org.csstudio.display.pace.PACEApp; import org.csstudio.display.pace.model.Cell; @@ -40,8 +38,7 @@ import javafx.scene.control.TablePosition; import javafx.scene.control.TableView; import javafx.scene.layout.BorderPane; -import org.phoebus.ui.application.PhoebusApplication; -import org.phoebus.ui.docking.DockStage; +import org.phoebus.ui.focus.FocusUtility; /** GUI for PACE {@link Model} * @author Kay Kasemir @@ -204,22 +201,7 @@ private void createContextMenu() { items.add(new SeparatorMenuItem()); SelectionService.getInstance().setSelection("AlarmUI", pvnames); - - Runnable setFocus; - { - Window window = table.getScene().getWindow().getScene().getWindow(); - if (window instanceof Stage) - { - final Stage stage = (Stage) window; - setFocus = () -> DockStage.setActiveDockStage(stage); - } - else { - PhoebusApplication.logger.log(Level.WARNING, "Expected 'Stage' for context menu, got " + window); - return; - } - } - - ContextMenuHelper.addSupportedEntries(setFocus, menu); + ContextMenuHelper.addSupportedEntries(FocusUtility.setFocusOn(table), menu); } }); diff --git a/app/pvtable/src/main/java/org/phoebus/applications/pvtable/ui/PVTable.java b/app/pvtable/src/main/java/org/phoebus/applications/pvtable/ui/PVTable.java index c1670c4fbf..b4d448cd46 100644 --- a/app/pvtable/src/main/java/org/phoebus/applications/pvtable/ui/PVTable.java +++ b/app/pvtable/src/main/java/org/phoebus/applications/pvtable/ui/PVTable.java @@ -16,8 +16,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import javafx.stage.Stage; -import javafx.stage.Window; import org.epics.vtype.VEnum; import org.epics.vtype.VType; import org.phoebus.applications.pvtable.PVTableApplication; @@ -37,7 +35,7 @@ import org.phoebus.ui.dialog.DialogHelper; import org.phoebus.ui.dialog.NumericInputDialog; import org.phoebus.ui.dnd.DataFormats; -import org.phoebus.ui.docking.DockStage; +import org.phoebus.ui.focus.FocusUtility; import org.phoebus.ui.javafx.PrintAction; import org.phoebus.ui.javafx.Screenshot; import org.phoebus.ui.javafx.ToolbarHelper; @@ -693,22 +691,8 @@ private void createContextMenu() menu.getItems().addAll(disableSaveRestore, new SeparatorMenuItem()); } - Runnable setFocus; - { - Window window = table.getScene().getWindow().getScene().getWindow(); - if (window instanceof Stage) - { - final Stage stage = (Stage) window; - setFocus = () -> DockStage.setActiveDockStage(stage); - } - else { - logger.log(Level.WARNING, "Expected 'Stage' for context menu, got " + window); - return; - } - } - // Add PV entries - if (ContextMenuHelper.addSupportedEntries(setFocus, menu)) + if (ContextMenuHelper.addSupportedEntries(FocusUtility.setFocusOn(table), menu)) menu.getItems().add(new SeparatorMenuItem()); menu.getItems().add(new PrintAction(this)); diff --git a/app/pvtree/src/main/java/org/phoebus/applications/pvtree/ui/FXTree.java b/app/pvtree/src/main/java/org/phoebus/applications/pvtree/ui/FXTree.java index 3559ad9a47..030c02b95b 100644 --- a/app/pvtree/src/main/java/org/phoebus/applications/pvtree/ui/FXTree.java +++ b/app/pvtree/src/main/java/org/phoebus/applications/pvtree/ui/FXTree.java @@ -18,8 +18,6 @@ import javafx.scene.control.MenuItem; import javafx.scene.image.ImageView; -import javafx.stage.Stage; -import javafx.stage.Window; import org.phoebus.applications.pvtree.PVTreeApplication; import org.phoebus.applications.pvtree.model.TreeModel; import org.phoebus.applications.pvtree.model.TreeModelItem; @@ -29,9 +27,8 @@ import org.phoebus.framework.selection.SelectionService; import org.phoebus.ui.application.ContextMenuHelper; import org.phoebus.ui.application.ContextMenuService; -import org.phoebus.ui.application.PhoebusApplication; import org.phoebus.ui.application.SaveSnapshotAction; -import org.phoebus.ui.docking.DockStage; +import org.phoebus.ui.focus.FocusUtility; import org.phoebus.ui.javafx.PrintAction; import org.phoebus.ui.javafx.Screenshot; import org.phoebus.ui.javafx.TreeHelper; @@ -142,21 +139,7 @@ private void createContextMenu() { menu.getItems().clear(); - Runnable setFocus; - { - Window window = tree_view.getScene().getWindow().getScene().getWindow(); - if (window instanceof Stage) - { - final Stage stage = (Stage) window; - setFocus = () -> DockStage.setActiveDockStage(stage); - } - else { - PhoebusApplication.logger.log(Level.WARNING, "Expected 'Stage' for context menu, got " + window); - return; - } - } - - if (ContextMenuHelper.addSupportedEntries(setFocus, menu)) + if (ContextMenuHelper.addSupportedEntries(FocusUtility.setFocusOn(tree_view), menu)) menu.getItems().add(new SeparatorMenuItem()); menu.getItems().add(new PrintAction(tree_view)); menu.getItems().add(new SaveSnapshotAction(tree_view)); diff --git a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/configuration/ConfigurationController.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/configuration/ConfigurationController.java index 13ab537ea9..b1667d607d 100644 --- a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/configuration/ConfigurationController.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/configuration/ConfigurationController.java @@ -33,9 +33,8 @@ import javafx.scene.image.ImageView; import javafx.scene.layout.BorderPane; import javafx.scene.layout.Pane; -import javafx.stage.Stage; -import javafx.stage.Window; import javafx.util.Callback; + import org.phoebus.applications.saveandrestore.Messages; import org.phoebus.applications.saveandrestore.SaveAndRestoreApplication; import org.phoebus.applications.saveandrestore.model.*; @@ -46,7 +45,7 @@ import org.phoebus.framework.selection.SelectionService; import org.phoebus.ui.application.ContextMenuHelper; import org.phoebus.ui.dialog.ExceptionDetailsErrorDialog; -import org.phoebus.ui.docking.DockStage; +import org.phoebus.ui.focus.FocusUtility; import org.phoebus.ui.javafx.ImageCache; import org.phoebus.util.time.TimestampFormats; @@ -60,8 +59,6 @@ import java.util.logging.Logger; import java.util.stream.Collectors; -import static org.phoebus.ui.application.PhoebusApplication.logger; - public class ConfigurationController extends SaveAndRestoreBaseController implements NodeChangedListener { @FXML @@ -194,21 +191,7 @@ public void updateItem(String item, boolean empty) { .collect(Collectors.toList()); SelectionService.getInstance().setSelection(SaveAndRestoreApplication.NAME, selectedPVList); - Runnable setFocus; - { - Window window = cell.getScene().getWindow().getScene().getWindow(); - if (window instanceof Stage) - { - final Stage stage = (Stage) window; - setFocus = () -> DockStage.setActiveDockStage(stage); - } - else { - logger.log(Level.WARNING, "Expected 'Stage' for context menu, got " + window); - return; - } - } - - ContextMenuHelper.addSupportedEntries(setFocus, pvNameContextMenu); + ContextMenuHelper.addSupportedEntries(FocusUtility.setFocusOn(cell), pvNameContextMenu); } pvNameContextMenu.show(cell, event.getScreenX(), event.getScreenY()); }); diff --git a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/BaseSnapshotTableViewController.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/BaseSnapshotTableViewController.java index 0f3c59d0ee..57b91e1c94 100644 --- a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/BaseSnapshotTableViewController.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/BaseSnapshotTableViewController.java @@ -30,8 +30,7 @@ import javafx.scene.input.MouseEvent; import javafx.scene.text.Font; import javafx.scene.text.Text; -import javafx.stage.Stage; -import javafx.stage.Window; + import org.epics.vtype.VType; import org.phoebus.applications.saveandrestore.Messages; import org.phoebus.applications.saveandrestore.SaveAndRestoreApplication; @@ -40,7 +39,7 @@ import org.phoebus.core.types.TimeStampedProcessVariable; import org.phoebus.framework.selection.SelectionService; import org.phoebus.ui.application.ContextMenuHelper; -import org.phoebus.ui.docking.DockStage; +import org.phoebus.ui.focus.FocusUtility; import org.phoebus.util.time.TimestampFormats; import java.lang.reflect.Field; @@ -200,21 +199,7 @@ protected void updateItem(TableEntry item, boolean empty) { contextMenu.getItems().clear(); SelectionService.getInstance().setSelection(SaveAndRestoreApplication.NAME, selectedPVList); - Runnable setFocus; - { - Window window = getScene().getWindow().getScene().getWindow(); - if (window instanceof Stage) - { - final Stage stage = (Stage) window; - setFocus = () -> DockStage.setActiveDockStage(stage); - } - else { - logger.log(Level.WARNING, "Expected 'Stage' for context menu, got " + window); - return; - } - } - - ContextMenuHelper.addSupportedEntries(setFocus, contextMenu); + ContextMenuHelper.addSupportedEntries(FocusUtility.setFocusOn(this), contextMenu); contextMenu.getItems().add(new SeparatorMenuItem()); MenuItem toggle = new MenuItem(); toggle.setText(item.readOnlyProperty().get() ? Messages.makeRestorable : Messages.makeReadOnly); diff --git a/core/ui/src/main/java/org/phoebus/ui/focus/FocusUtility.java b/core/ui/src/main/java/org/phoebus/ui/focus/FocusUtility.java index 980177fc90..ce67ace164 100644 --- a/core/ui/src/main/java/org/phoebus/ui/focus/FocusUtility.java +++ b/core/ui/src/main/java/org/phoebus/ui/focus/FocusUtility.java @@ -8,8 +8,16 @@ import java.util.logging.Level; +/** + * A utility class which provides support for handling Focus + */ public class FocusUtility { + /** + * Create a Runnable which when called sets the focus on the DockPane hosting the provided Node + * @param node A node + * @return A Runnable to set the Focus on the Pane which holds the Node + */ public static Runnable setFocusOn(final Node node){ { Window window = node.getScene().getWindow().getScene().getWindow(); diff --git a/core/ui/src/main/java/org/phoebus/ui/pv/PVList.java b/core/ui/src/main/java/org/phoebus/ui/pv/PVList.java index 366b1db32b..94999d105e 100644 --- a/core/ui/src/main/java/org/phoebus/ui/pv/PVList.java +++ b/core/ui/src/main/java/org/phoebus/ui/pv/PVList.java @@ -9,12 +9,9 @@ import java.util.Collection; import java.util.List; -import java.util.logging.Level; import java.util.stream.Collectors; import javafx.beans.property.SimpleObjectProperty; -import javafx.stage.Stage; -import javafx.stage.Window; import org.epics.vtype.Alarm; import org.epics.vtype.AlarmSeverity; import org.epics.vtype.VNumberArray; @@ -28,7 +25,7 @@ import org.phoebus.pv.RefCountMap.ReferencedEntry; import org.phoebus.ui.application.ContextMenuHelper; import org.phoebus.ui.application.Messages; -import org.phoebus.ui.docking.DockStage; +import org.phoebus.ui.focus.FocusUtility; import org.phoebus.ui.javafx.ImageCache; import javafx.application.Platform; @@ -194,21 +191,7 @@ private void createContextMenu() { menu.getItems().clear(); - Runnable setFocus; - { - Window window = table.getScene().getWindow().getScene().getWindow(); - if (window instanceof Stage) - { - final Stage stage = (Stage) window; - setFocus = () -> DockStage.setActiveDockStage(stage); - } - else { - logger.log(Level.WARNING, "Expected 'Stage' for context menu, got " + window); - return; - } - } - - ContextMenuHelper.addSupportedEntries(setFocus, menu); + ContextMenuHelper.addSupportedEntries(FocusUtility.setFocusOn(table), menu); menu.show(table.getScene().getWindow()); }); table.setContextMenu(menu); From bcdc94130d0df2c0a1d93f20eb8ee7b78c82cb46 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Tue, 13 Feb 2024 08:41:21 +0100 Subject: [PATCH 5/6] Simplify expression. --- core/ui/src/main/java/org/phoebus/ui/focus/FocusUtility.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/src/main/java/org/phoebus/ui/focus/FocusUtility.java b/core/ui/src/main/java/org/phoebus/ui/focus/FocusUtility.java index ce67ace164..f78b17f2d5 100644 --- a/core/ui/src/main/java/org/phoebus/ui/focus/FocusUtility.java +++ b/core/ui/src/main/java/org/phoebus/ui/focus/FocusUtility.java @@ -20,7 +20,7 @@ public class FocusUtility { */ public static Runnable setFocusOn(final Node node){ { - Window window = node.getScene().getWindow().getScene().getWindow(); + Window window = node.getScene().getWindow(); if (window instanceof Stage) { final Stage stage = (Stage) window; From 5559da2b4fe231689c6ddde8bcc2cfce9b5f2884 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Tue, 13 Feb 2024 08:43:27 +0100 Subject: [PATCH 6/6] Fix description of the function setFocusOn(). --- core/ui/src/main/java/org/phoebus/ui/focus/FocusUtility.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/ui/src/main/java/org/phoebus/ui/focus/FocusUtility.java b/core/ui/src/main/java/org/phoebus/ui/focus/FocusUtility.java index f78b17f2d5..9ad58d6226 100644 --- a/core/ui/src/main/java/org/phoebus/ui/focus/FocusUtility.java +++ b/core/ui/src/main/java/org/phoebus/ui/focus/FocusUtility.java @@ -14,9 +14,9 @@ public class FocusUtility { /** - * Create a Runnable which when called sets the focus on the DockPane hosting the provided Node + * Create a Runnable which when called sets the focus on the first DockPane of the Stage hosting the provided Node * @param node A node - * @return A Runnable to set the Focus on the Pane which holds the Node + * @return A Runnable to set the Focus on the first DockPane of the Stage which holds the Node */ public static Runnable setFocusOn(final Node node){ {