From 31cd8a3e13ad1eace5550480fe531b83027d4627 Mon Sep 17 00:00:00 2001 From: Rebecca Williams Date: Fri, 30 May 2025 18:23:05 +0100 Subject: [PATCH] Add a dedicated action to close the current display --- .../display/actions/CloseDisplayAction.java | 65 +++++++++++++++++ .../actions/CloseDisplayActionController.java | 33 +++++++++ .../actions/CloseDisplayActionEditor.java | 66 ++++++++++++++++++ .../csstudio/display/actions/Messages.java | 3 +- ...dio.display.builder.model.spi.ActionEditor | 1 + ...tudio.display.builder.model.spi.ActionInfo | 1 + .../display/actions/CloseDisplayAction.fxml | 29 ++++++++ .../display/actions/messages.properties | 1 + .../main/resources/icons/close_display.png | Bin 0 -> 768 bytes .../CloseDisplayActionHandler.java | 41 +++++++++++ ...io.display.builder.model.spi.ActionHandler | 3 +- 11 files changed, 241 insertions(+), 2 deletions(-) create mode 100644 app/display/actions/src/main/java/org/csstudio/display/actions/CloseDisplayAction.java create mode 100644 app/display/actions/src/main/java/org/csstudio/display/actions/CloseDisplayActionController.java create mode 100644 app/display/actions/src/main/java/org/csstudio/display/actions/CloseDisplayActionEditor.java create mode 100644 app/display/actions/src/main/resources/org/csstudio/display/actions/CloseDisplayAction.fxml create mode 100644 app/display/model/src/main/resources/icons/close_display.png create mode 100644 app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/actionhandlers/CloseDisplayActionHandler.java diff --git a/app/display/actions/src/main/java/org/csstudio/display/actions/CloseDisplayAction.java b/app/display/actions/src/main/java/org/csstudio/display/actions/CloseDisplayAction.java new file mode 100644 index 0000000000..cd677d3c52 --- /dev/null +++ b/app/display/actions/src/main/java/org/csstudio/display/actions/CloseDisplayAction.java @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2024 European Spallation Source ERIC. + */ + +package org.csstudio.display.actions; + +import javafx.scene.image.Image; +import org.csstudio.display.builder.model.persist.ModelReader; +import org.csstudio.display.builder.model.persist.ModelWriter; +import org.csstudio.display.builder.model.persist.XMLTags; +import org.csstudio.display.builder.model.properties.ActionInfoBase; +import org.csstudio.display.builder.representation.javafx.actionsdialog.ActionsDialog; +import org.phoebus.ui.javafx.ImageCache; +import org.w3c.dom.Element; + +import javax.xml.stream.XMLStreamWriter; + +public class CloseDisplayAction extends ActionInfoBase { + + public static final String CLOSE_DISPLAY = "close_display"; + private static final Integer PRIORITY = 10; + + @SuppressWarnings("unused") + /** + * Do not remove, needed by SPI framework. + */ + public CloseDisplayAction() { + this.description = Messages.ActionCloseDisplay; + this.type = CLOSE_DISPLAY; + } + + public CloseDisplayAction(String description) { + this.description = description; + this.type = CLOSE_DISPLAY; + } + + @Override + public Image getImage() { + return ImageCache.getImage(ActionsDialog.class, "/icons/close_display.png"); + } + + @Override + public Integer getPriority() { + return PRIORITY; + } + + @Override + public void readFromXML(ModelReader modelReader, Element actionXml) { + if (description.isEmpty()) + description = Messages.ActionCloseDisplay; + } + + @Override + public void writeToXML(ModelWriter modelWriter, XMLStreamWriter writer) throws Exception { + writer.writeAttribute(XMLTags.TYPE, CLOSE_DISPLAY); + writeDescriptionToXML(writer, description); + writer.writeStartElement(XMLTags.COMMAND); + writer.writeEndElement(); + } + + @Override + public boolean matchesAction(String actionId) { + return actionId.equalsIgnoreCase(CLOSE_DISPLAY); + } +} diff --git a/app/display/actions/src/main/java/org/csstudio/display/actions/CloseDisplayActionController.java b/app/display/actions/src/main/java/org/csstudio/display/actions/CloseDisplayActionController.java new file mode 100644 index 0000000000..1dcb7616f8 --- /dev/null +++ b/app/display/actions/src/main/java/org/csstudio/display/actions/CloseDisplayActionController.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2024 European Spallation Source ERIC. + */ + +package org.csstudio.display.actions; + +import org.csstudio.display.builder.model.ActionControllerBase; +import org.csstudio.display.builder.model.Widget; +import org.csstudio.display.builder.model.spi.ActionInfo; + +import javafx.fxml.FXML; + +/** + * FXML Controller for the close display action editor + */ +public class CloseDisplayActionController extends ActionControllerBase { + + public CloseDisplayActionController(Widget widget, CloseDisplayAction closeDisplayActionInfo){ + descriptionProperty.set(closeDisplayActionInfo.getDescription()); + } + + /** + * Init + */ + @FXML + public void initialize() { + super.initialize(); + } + + public ActionInfo getActionInfo(){ + return new CloseDisplayAction(descriptionProperty.get()); + } +} diff --git a/app/display/actions/src/main/java/org/csstudio/display/actions/CloseDisplayActionEditor.java b/app/display/actions/src/main/java/org/csstudio/display/actions/CloseDisplayActionEditor.java new file mode 100644 index 0000000000..96ebfbe532 --- /dev/null +++ b/app/display/actions/src/main/java/org/csstudio/display/actions/CloseDisplayActionEditor.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2024 European Spallation Source ERIC. + */ + +package org.csstudio.display.actions; + +import javafx.fxml.FXMLLoader; +import javafx.scene.Node; +import org.csstudio.display.builder.model.Widget; +import org.csstudio.display.builder.model.spi.ActionEditor; +import org.csstudio.display.builder.model.spi.ActionInfo; +import org.phoebus.framework.nls.NLS; + +import java.io.IOException; +import java.util.ResourceBundle; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Editor for {@link CloseDisplayAction}. + */ +public class CloseDisplayActionEditor implements ActionEditor { + + private CloseDisplayActionController closeDisplayActionController; + private Node editorUi; + + @Override + public boolean matchesAction(String type) { + return CloseDisplayAction.CLOSE_DISPLAY.equalsIgnoreCase(type); + } + + @Override + public ActionInfo getActionInfo() { + return closeDisplayActionController.getActionInfo(); + } + + @Override + public Node getEditorUi() { + return editorUi; + } + + @Override + public void configure(Widget widget, ActionInfo actionInfo) { + ResourceBundle resourceBundle = NLS.getMessages(Messages.class); + + FXMLLoader fxmlLoader = new FXMLLoader(); + fxmlLoader.setResources(resourceBundle); + fxmlLoader.setLocation(this.getClass().getResource("CloseDisplayAction.fxml")); + fxmlLoader.setControllerFactory(clazz -> { + try { + return clazz.getConstructor(Widget.class, CloseDisplayAction.class).newInstance(widget, actionInfo); + } catch (Exception e) { + Logger.getLogger(CloseDisplayActionEditor.class.getName()).log(Level.SEVERE, "Failed to construct CloseDisplayActionController", e); + } + return null; + }); + + try { + editorUi = fxmlLoader.load(); + closeDisplayActionController = fxmlLoader.getController(); + } catch (IOException e) { + Logger.getLogger(CloseDisplayActionEditor.class.getName()).log(Level.SEVERE, "Failed to load the CloseDisplayAction UI", e); + throw new RuntimeException(e); + } + } +} diff --git a/app/display/actions/src/main/java/org/csstudio/display/actions/Messages.java b/app/display/actions/src/main/java/org/csstudio/display/actions/Messages.java index 988bfec2cf..3361c61929 100644 --- a/app/display/actions/src/main/java/org/csstudio/display/actions/Messages.java +++ b/app/display/actions/src/main/java/org/csstudio/display/actions/Messages.java @@ -19,7 +19,8 @@ public class Messages { /** * Externalized Strings */ - public static String ActionExecuteCommand, + public static String ActionCloseDisplay, + ActionExecuteCommand, ActionExecuteScript, ActionOpenDisplay, ActionOpenFile, diff --git a/app/display/actions/src/main/resources/META-INF/services/org.csstudio.display.builder.model.spi.ActionEditor b/app/display/actions/src/main/resources/META-INF/services/org.csstudio.display.builder.model.spi.ActionEditor index a4a7b12057..b04d508548 100644 --- a/app/display/actions/src/main/resources/META-INF/services/org.csstudio.display.builder.model.spi.ActionEditor +++ b/app/display/actions/src/main/resources/META-INF/services/org.csstudio.display.builder.model.spi.ActionEditor @@ -4,3 +4,4 @@ org.csstudio.display.actions.ExecuteScriptActionEditor org.csstudio.display.actions.OpenDisplayActionEditor org.csstudio.display.actions.OpenFileActionEditor org.csstudio.display.actions.OpenWebPageActionEditor +org.csstudio.display.actions.CloseDisplayActionEditor diff --git a/app/display/actions/src/main/resources/META-INF/services/org.csstudio.display.builder.model.spi.ActionInfo b/app/display/actions/src/main/resources/META-INF/services/org.csstudio.display.builder.model.spi.ActionInfo index 252c3b1bc6..c05adaf60e 100644 --- a/app/display/actions/src/main/resources/META-INF/services/org.csstudio.display.builder.model.spi.ActionInfo +++ b/app/display/actions/src/main/resources/META-INF/services/org.csstudio.display.builder.model.spi.ActionInfo @@ -4,3 +4,4 @@ org.csstudio.display.actions.ExecuteScriptAction org.csstudio.display.actions.ExecuteCommandAction org.csstudio.display.actions.OpenFileAction org.csstudio.display.actions.OpenWebPageAction +org.csstudio.display.actions.CloseDisplayAction \ No newline at end of file diff --git a/app/display/actions/src/main/resources/org/csstudio/display/actions/CloseDisplayAction.fxml b/app/display/actions/src/main/resources/org/csstudio/display/actions/CloseDisplayAction.fxml new file mode 100644 index 0000000000..b3d1a0947b --- /dev/null +++ b/app/display/actions/src/main/resources/org/csstudio/display/actions/CloseDisplayAction.fxml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/display/actions/src/main/resources/org/csstudio/display/actions/messages.properties b/app/display/actions/src/main/resources/org/csstudio/display/actions/messages.properties index 5ad5b805cc..f0efc8e1f4 100644 --- a/app/display/actions/src/main/resources/org/csstudio/display/actions/messages.properties +++ b/app/display/actions/src/main/resources/org/csstudio/display/actions/messages.properties @@ -1,3 +1,4 @@ +ActionCloseDisplay=Close Display ActionExecuteCommand=Execute Command ActionExecuteScript=Execute Script ActionOpenDisplay=Open Display diff --git a/app/display/model/src/main/resources/icons/close_display.png b/app/display/model/src/main/resources/icons/close_display.png new file mode 100644 index 0000000000000000000000000000000000000000..63e0f817fe05c8afcb5f7cc937b13f0214db0da3 GIT binary patch literal 768 zcmV+b1ONPqP)y{D4^000SaNLh0L01FcU01FcV0GgZ_00007 zbV*G`2k8YK4-78;hDyi)00KlwL_t(I%bk!0CvTC52<$k-E*+#pU`Vn#Y|;C{jur|A25fJVhuJ8kYZwU@-Vvu`Ejg&}P&+ zZAN{i&8T&MvpvzIVVb5x5kjQTz6bbIoHLwVJ4fPJmStBm`fb2iigSk3Ch0m2RR{q< z{8TcW>NRGIfqj!qu@C}9N{JML)_2GKnHeOS^05zYAX5v{CYg{@qSzCLZDB5FrzVS)s^(Lmhea~ zI3U(~k6lz(TQ`AGI!G z8ym>Dfr!P4tZq|z<0eJ@ivT$Kj02nwQ3bHi{>JxljXZY|R%|cnLPhXB(8aBWJB0Ep z4h>OCiP{`7xcG7ok6Xu##`q7vSI(B^#1gSK`Yx}Iau(IHX2TM0BnU=e50 z+(x;7mrqZIX6q-uob(j9ZPuGn@yLiztrY3eY=iOf@vrJ|RUze(b$kte=7Ue0ubsUx y1u#-^;>wQZyd2%#o&Mb0*YnWWjAefSB>w=NbU;luZZ$0c0000 toolkit = ToolkitRepresentation.getToolkit(model); + toolkit.closeWindow(model); + } + catch (Throwable ex) + { + logger.log(Level.WARNING, action+" failed. Cannot close display", ex); + } + } + + @Override + public boolean matches(ActionInfo pluggableActionInfo) { + return pluggableActionInfo.getType().equalsIgnoreCase(CloseDisplayAction.CLOSE_DISPLAY); + } +} diff --git a/app/display/runtime/src/main/resources/META-INF/services/org.csstudio.display.builder.model.spi.ActionHandler b/app/display/runtime/src/main/resources/META-INF/services/org.csstudio.display.builder.model.spi.ActionHandler index 0161ac4f2f..805f05da1d 100644 --- a/app/display/runtime/src/main/resources/META-INF/services/org.csstudio.display.builder.model.spi.ActionHandler +++ b/app/display/runtime/src/main/resources/META-INF/services/org.csstudio.display.builder.model.spi.ActionHandler @@ -3,4 +3,5 @@ org.csstudio.display.builder.runtime.app.actionhandlers.WritePVActionHandler org.csstudio.display.builder.runtime.app.actionhandlers.ExecuteScriptActionHandler org.csstudio.display.builder.runtime.app.actionhandlers.ExecuteCommandActionHandler org.csstudio.display.builder.runtime.app.actionhandlers.OpenFileActionHandler -org.csstudio.display.builder.runtime.app.actionhandlers.OpenWebPageActionHandler \ No newline at end of file +org.csstudio.display.builder.runtime.app.actionhandlers.OpenWebPageActionHandler +org.csstudio.display.builder.runtime.app.actionhandlers.CloseDisplayActionHandler