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 0000000000..63e0f817fe Binary files /dev/null and b/app/display/model/src/main/resources/icons/close_display.png differ diff --git a/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/actionhandlers/CloseDisplayActionHandler.java b/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/actionhandlers/CloseDisplayActionHandler.java new file mode 100644 index 0000000000..e267018f8c --- /dev/null +++ b/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/actionhandlers/CloseDisplayActionHandler.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2024 European Spallation Source ERIC. + */ + +package org.csstudio.display.builder.runtime.app.actionhandlers; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.csstudio.display.actions.CloseDisplayAction; +import org.csstudio.display.builder.model.DisplayModel; +import org.csstudio.display.builder.model.Widget; +import org.csstudio.display.builder.model.spi.ActionHandler; +import org.csstudio.display.builder.model.spi.ActionInfo; +import org.csstudio.display.builder.representation.ToolkitRepresentation; + +public class CloseDisplayActionHandler implements ActionHandler { + + private final Logger logger = Logger.getLogger(CloseDisplayActionHandler.class.getName()); + + @Override + public void handleAction(Widget sourceWidget, ActionInfo pluggableActionInfo) { + CloseDisplayAction action = (CloseDisplayAction) pluggableActionInfo; + + try + { + final DisplayModel model = sourceWidget.getTopDisplayModel(); + final ToolkitRepresentation 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