Skip to content
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.GridPane;

import javafx.util.Duration;
import org.phoebus.applications.alarm.AlarmSystem;
import org.phoebus.applications.alarm.logging.ui.AlarmLogTableQueryUtil.Keys;
Expand All @@ -44,6 +45,7 @@
import org.phoebus.framework.selection.SelectionService;
import org.phoebus.ui.application.ContextMenuHelper;
import org.phoebus.ui.dialog.ExceptionDetailsErrorDialog;
import org.phoebus.ui.focus.FocusUtility;
import org.phoebus.ui.javafx.ImageCache;
import org.phoebus.ui.javafx.JFXUtil;
import org.phoebus.util.time.TimeParser;
Expand Down Expand Up @@ -569,7 +571,8 @@ public void createContextMenu() {

// search for other context menu actions registered for AlarmLogTableType
SelectionService.getInstance().setSelection("AlarmLogTable", tableView.getSelectionModel().getSelectedItems());
ContextMenuHelper.addSupportedEntries(tableView, contextMenu);

ContextMenuHelper.addSupportedEntries(FocusUtility.setFocusOn(tableView), contextMenu);

tableView.setContextMenu(contextMenu);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +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 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;
Expand All @@ -24,13 +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 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
Expand Down Expand Up @@ -132,13 +132,13 @@ public void addSupportedEntries(final Node node,
{
menu_items.add(new SeparatorMenuItem());
SelectionService.getInstance().setSelection("AlarmUI", pvnames);
ContextMenuHelper.addSupportedEntries(node, menu);
ContextMenuHelper.addSupportedEntries(FocusUtility.setFocusOn(node), menu);
}
else
{
// search for other context menu actions registered for AlarmTreeItem
SelectionService.getInstance().setSelection("AlarmUI", selection);
ContextMenuHelper.addSupportedEntries(node, menu);
ContextMenuHelper.addSupportedEntries(FocusUtility.setFocusOn(node), menu);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.logging.Level;
import java.util.stream.Collectors;

import org.csstudio.javafx.rtplot.LineStyle;
Expand All @@ -36,6 +37,7 @@
import org.phoebus.ui.application.ContextMenuHelper;
import org.phoebus.ui.dialog.AlertWithToggle;
import org.phoebus.ui.dialog.DialogHelper;
import org.phoebus.ui.focus.FocusUtility;
import org.phoebus.ui.undo.UndoableActionManager;
import org.phoebus.util.time.SecondsParser;

Expand Down Expand Up @@ -740,7 +742,7 @@ private void createContextMenu()
if (pvs.size() > 0)
{
SelectionService.getInstance().setSelection(this, pvs);
ContextMenuHelper.addSupportedEntries(trace_table, menu);
ContextMenuHelper.addSupportedEntries(FocusUtility.setFocusOn(trace_table), menu);
}

menu.show(trace_table.getScene().getWindow(), event.getScreenX(), event.getScreenY());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import org.phoebus.framework.selection.SelectionService;
import org.phoebus.ui.application.ContextMenuHelper;
import org.phoebus.ui.dialog.ExceptionDetailsErrorDialog;
import org.phoebus.ui.focus.FocusUtility;
import org.phoebus.ui.undo.UndoableActionManager;

import javafx.application.Platform;
Expand Down Expand Up @@ -52,6 +53,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
*/
Expand Down Expand Up @@ -161,9 +164,8 @@ private void updateContextMenu(final ContextMenuEvent event)
{
menu.getItems().setAll(new AddToPlotAction(channel_table, model, undo, selection),
new SeparatorMenuItem());

SelectionService.getInstance().setSelection(channel_table, selection);
ContextMenuHelper.addSupportedEntries(channel_table, menu);
ContextMenuHelper.addSupportedEntries(FocusUtility.setFocusOn(channel_table), menu);
menu.show(channel_table.getScene().getWindow(), event.getScreenX(), event.getScreenY());
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -79,7 +81,25 @@ class ContextMenuSupport {
@Override
public void handleContextMenu(final Widget widget, final int screen_x, final int screen_y) {
final Node node = JFXBaseRepresentation.getJFXNode(widget);
fillMenu(node, widget);

Runnable setFocus;
{
// 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();
setFocus = () -> DockPane.setActiveDockPane(dockPane);
}

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
Expand All @@ -95,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<MenuItem> items = menu.getItems();
items.setAll(new WidgetInfoAction(widget));
Expand Down Expand Up @@ -189,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());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
import javafx.scene.control.TablePosition;
import javafx.scene.control.TableView;
import javafx.scene.layout.BorderPane;
import org.phoebus.ui.focus.FocusUtility;

/** GUI for PACE {@link Model}
* @author Kay Kasemir
Expand Down Expand Up @@ -200,7 +201,7 @@ private void createContextMenu()
{
items.add(new SeparatorMenuItem());
SelectionService.getInstance().setSelection("AlarmUI", pvnames);
ContextMenuHelper.addSupportedEntries(table, menu);
ContextMenuHelper.addSupportedEntries(FocusUtility.setFocusOn(table), menu);
}
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -21,6 +23,10 @@
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.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;
Expand Down Expand Up @@ -172,7 +178,8 @@ public void initialize() {
SelectionService.getInstance().setSelection("Probe",
List.of(new ProcessVariable(txtPVName.getText().trim())));
}
ContextMenuHelper.addSupportedEntries(txtPVName, menu);

ContextMenuHelper.addSupportedEntries(FocusUtility.setFocusOn(txtAlarm), menu);
menu.show(txtPVName.getScene().getWindow(), event.getScreenX(), event.getScreenY());
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import org.phoebus.ui.dialog.DialogHelper;
import org.phoebus.ui.dialog.NumericInputDialog;
import org.phoebus.ui.dnd.DataFormats;
import org.phoebus.ui.focus.FocusUtility;
import org.phoebus.ui.javafx.PrintAction;
import org.phoebus.ui.javafx.Screenshot;
import org.phoebus.ui.javafx.ToolbarHelper;
Expand Down Expand Up @@ -82,6 +83,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
Expand Down Expand Up @@ -689,7 +692,7 @@ private void createContextMenu()
}

// Add PV entries
if (ContextMenuHelper.addSupportedEntries(table, menu))
if (ContextMenuHelper.addSupportedEntries(FocusUtility.setFocusOn(table), menu))
menu.getItems().add(new SeparatorMenuItem());

menu.getItems().add(new PrintAction(this));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import org.phoebus.ui.application.ContextMenuHelper;
import org.phoebus.ui.application.ContextMenuService;
import org.phoebus.ui.application.SaveSnapshotAction;
import org.phoebus.ui.focus.FocusUtility;
import org.phoebus.ui.javafx.PrintAction;
import org.phoebus.ui.javafx.Screenshot;
import org.phoebus.ui.javafx.TreeHelper;
Expand Down Expand Up @@ -137,7 +138,8 @@ private void createContextMenu()
tree_view.setOnContextMenuRequested(event ->
{
menu.getItems().clear();
if (ContextMenuHelper.addSupportedEntries(tree_view, 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));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.util.Callback;

import org.phoebus.applications.saveandrestore.Messages;
import org.phoebus.applications.saveandrestore.SaveAndRestoreApplication;
import org.phoebus.applications.saveandrestore.model.*;
Expand All @@ -44,6 +45,7 @@
import org.phoebus.framework.selection.SelectionService;
import org.phoebus.ui.application.ContextMenuHelper;
import org.phoebus.ui.dialog.ExceptionDetailsErrorDialog;
import org.phoebus.ui.focus.FocusUtility;
import org.phoebus.ui.javafx.ImageCache;
import org.phoebus.util.time.TimestampFormats;

Expand Down Expand Up @@ -188,7 +190,8 @@ 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);

ContextMenuHelper.addSupportedEntries(FocusUtility.setFocusOn(cell), pvNameContextMenu);
}
pvNameContextMenu.show(cell, event.getScreenX(), event.getScreenY());
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import javafx.scene.input.MouseEvent;
import javafx.scene.text.Font;
import javafx.scene.text.Text;

import org.epics.vtype.VType;
import org.phoebus.applications.saveandrestore.Messages;
import org.phoebus.applications.saveandrestore.SaveAndRestoreApplication;
Expand All @@ -38,6 +39,7 @@
import org.phoebus.core.types.TimeStampedProcessVariable;
import org.phoebus.framework.selection.SelectionService;
import org.phoebus.ui.application.ContextMenuHelper;
import org.phoebus.ui.focus.FocusUtility;
import org.phoebus.util.time.TimestampFormats;

import java.lang.reflect.Field;
Expand All @@ -46,9 +48,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.
Expand Down Expand Up @@ -193,7 +198,8 @@ protected void updateItem(TableEntry item, boolean empty) {
contextMenu.hide();
contextMenu.getItems().clear();
SelectionService.getInstance().setSelection(SaveAndRestoreApplication.NAME, selectedPVList);
ContextMenuHelper.addSupportedEntries(this, 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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,24 +41,12 @@ 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 <code>true</code> 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 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<ContextMenuEntry> entries = ContextMenuService.getInstance().listSupportedContextMenuEntries();
if (entries.isEmpty())
return false;
Expand All @@ -72,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<Object> selection = new ArrayList<>();
Expand Down
Loading