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