Skip to content

Commit 5315227

Browse files
authored
Merge pull request #3437 from rjwills28/issue3384-close-display-action
Add a 'Close Display' action
2 parents 718af74 + 33db2bf commit 5315227

File tree

11 files changed

+241
-2
lines changed

11 files changed

+241
-2
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/*
2+
* Copyright (C) 2024 European Spallation Source ERIC.
3+
*/
4+
5+
package org.csstudio.display.actions;
6+
7+
import javafx.scene.image.Image;
8+
import org.csstudio.display.builder.model.persist.ModelReader;
9+
import org.csstudio.display.builder.model.persist.ModelWriter;
10+
import org.csstudio.display.builder.model.persist.XMLTags;
11+
import org.csstudio.display.builder.model.properties.ActionInfoBase;
12+
import org.csstudio.display.builder.representation.javafx.actionsdialog.ActionsDialog;
13+
import org.phoebus.ui.javafx.ImageCache;
14+
import org.w3c.dom.Element;
15+
16+
import javax.xml.stream.XMLStreamWriter;
17+
18+
public class CloseDisplayAction extends ActionInfoBase {
19+
20+
public static final String CLOSE_DISPLAY = "close_display";
21+
private static final Integer PRIORITY = 10;
22+
23+
@SuppressWarnings("unused")
24+
/**
25+
* Do not remove, needed by SPI framework.
26+
*/
27+
public CloseDisplayAction() {
28+
this.description = Messages.ActionCloseDisplay;
29+
this.type = CLOSE_DISPLAY;
30+
}
31+
32+
public CloseDisplayAction(String description) {
33+
this.description = description;
34+
this.type = CLOSE_DISPLAY;
35+
}
36+
37+
@Override
38+
public Image getImage() {
39+
return ImageCache.getImage(ActionsDialog.class, "/icons/close_display.png");
40+
}
41+
42+
@Override
43+
public Integer getPriority() {
44+
return PRIORITY;
45+
}
46+
47+
@Override
48+
public void readFromXML(ModelReader modelReader, Element actionXml) {
49+
if (description.isEmpty())
50+
description = Messages.ActionCloseDisplay;
51+
}
52+
53+
@Override
54+
public void writeToXML(ModelWriter modelWriter, XMLStreamWriter writer) throws Exception {
55+
writer.writeAttribute(XMLTags.TYPE, CLOSE_DISPLAY);
56+
writeDescriptionToXML(writer, description);
57+
writer.writeStartElement(XMLTags.COMMAND);
58+
writer.writeEndElement();
59+
}
60+
61+
@Override
62+
public boolean matchesAction(String actionId) {
63+
return actionId.equalsIgnoreCase(CLOSE_DISPLAY);
64+
}
65+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
* Copyright (C) 2024 European Spallation Source ERIC.
3+
*/
4+
5+
package org.csstudio.display.actions;
6+
7+
import org.csstudio.display.builder.model.ActionControllerBase;
8+
import org.csstudio.display.builder.model.Widget;
9+
import org.csstudio.display.builder.model.spi.ActionInfo;
10+
11+
import javafx.fxml.FXML;
12+
13+
/**
14+
* FXML Controller for the close display action editor
15+
*/
16+
public class CloseDisplayActionController extends ActionControllerBase {
17+
18+
public CloseDisplayActionController(Widget widget, CloseDisplayAction closeDisplayActionInfo){
19+
descriptionProperty.set(closeDisplayActionInfo.getDescription());
20+
}
21+
22+
/**
23+
* Init
24+
*/
25+
@FXML
26+
public void initialize() {
27+
super.initialize();
28+
}
29+
30+
public ActionInfo getActionInfo(){
31+
return new CloseDisplayAction(descriptionProperty.get());
32+
}
33+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/*
2+
* Copyright (C) 2024 European Spallation Source ERIC.
3+
*/
4+
5+
package org.csstudio.display.actions;
6+
7+
import javafx.fxml.FXMLLoader;
8+
import javafx.scene.Node;
9+
import org.csstudio.display.builder.model.Widget;
10+
import org.csstudio.display.builder.model.spi.ActionEditor;
11+
import org.csstudio.display.builder.model.spi.ActionInfo;
12+
import org.phoebus.framework.nls.NLS;
13+
14+
import java.io.IOException;
15+
import java.util.ResourceBundle;
16+
import java.util.logging.Level;
17+
import java.util.logging.Logger;
18+
19+
/**
20+
* Editor for {@link CloseDisplayAction}.
21+
*/
22+
public class CloseDisplayActionEditor implements ActionEditor {
23+
24+
private CloseDisplayActionController closeDisplayActionController;
25+
private Node editorUi;
26+
27+
@Override
28+
public boolean matchesAction(String type) {
29+
return CloseDisplayAction.CLOSE_DISPLAY.equalsIgnoreCase(type);
30+
}
31+
32+
@Override
33+
public ActionInfo getActionInfo() {
34+
return closeDisplayActionController.getActionInfo();
35+
}
36+
37+
@Override
38+
public Node getEditorUi() {
39+
return editorUi;
40+
}
41+
42+
@Override
43+
public void configure(Widget widget, ActionInfo actionInfo) {
44+
ResourceBundle resourceBundle = NLS.getMessages(Messages.class);
45+
46+
FXMLLoader fxmlLoader = new FXMLLoader();
47+
fxmlLoader.setResources(resourceBundle);
48+
fxmlLoader.setLocation(this.getClass().getResource("CloseDisplayAction.fxml"));
49+
fxmlLoader.setControllerFactory(clazz -> {
50+
try {
51+
return clazz.getConstructor(Widget.class, CloseDisplayAction.class).newInstance(widget, actionInfo);
52+
} catch (Exception e) {
53+
Logger.getLogger(CloseDisplayActionEditor.class.getName()).log(Level.SEVERE, "Failed to construct CloseDisplayActionController", e);
54+
}
55+
return null;
56+
});
57+
58+
try {
59+
editorUi = fxmlLoader.load();
60+
closeDisplayActionController = fxmlLoader.getController();
61+
} catch (IOException e) {
62+
Logger.getLogger(CloseDisplayActionEditor.class.getName()).log(Level.SEVERE, "Failed to load the CloseDisplayAction UI", e);
63+
throw new RuntimeException(e);
64+
}
65+
}
66+
}

app/display/actions/src/main/java/org/csstudio/display/actions/Messages.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ public class Messages {
1919
/**
2020
* Externalized Strings
2121
*/
22-
public static String ActionExecuteCommand,
22+
public static String ActionCloseDisplay,
23+
ActionExecuteCommand,
2324
ActionExecuteScript,
2425
ActionOpenDisplay,
2526
ActionOpenFile,

app/display/actions/src/main/resources/META-INF/services/org.csstudio.display.builder.model.spi.ActionEditor

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ org.csstudio.display.actions.ExecuteScriptActionEditor
44
org.csstudio.display.actions.OpenDisplayActionEditor
55
org.csstudio.display.actions.OpenFileActionEditor
66
org.csstudio.display.actions.OpenWebPageActionEditor
7+
org.csstudio.display.actions.CloseDisplayActionEditor

app/display/actions/src/main/resources/META-INF/services/org.csstudio.display.builder.model.spi.ActionInfo

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ org.csstudio.display.actions.ExecuteScriptAction
44
org.csstudio.display.actions.ExecuteCommandAction
55
org.csstudio.display.actions.OpenFileAction
66
org.csstudio.display.actions.OpenWebPageAction
7+
org.csstudio.display.actions.CloseDisplayAction
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
3+
<?import javafx.scene.control.*?>
4+
<?import javafx.scene.layout.*?>
5+
6+
<!--
7+
~ Copyright (C) 2024 European Spallation Source ERIC.
8+
-->
9+
10+
<GridPane hgap="10.0" vgap="10.0" xmlns="http://javafx.com/javafx/11.0.1"
11+
xmlns:fx="http://javafx.com/fxml/1"
12+
fx:controller="org.csstudio.display.actions.CloseDisplayActionController">
13+
<children>
14+
<Label text="%ActionsDialog_Description" />
15+
<TextField fx:id="description" text="Close Display" GridPane.columnIndex="1" GridPane.columnSpan="2" GridPane.hgrow="ALWAYS" />
16+
</children>
17+
<columnConstraints>
18+
<ColumnConstraints />
19+
<ColumnConstraints />
20+
<ColumnConstraints />
21+
</columnConstraints>
22+
<rowConstraints>
23+
<RowConstraints />
24+
<RowConstraints />
25+
<RowConstraints />
26+
<RowConstraints />
27+
<RowConstraints />
28+
</rowConstraints>
29+
</GridPane>

app/display/actions/src/main/resources/org/csstudio/display/actions/messages.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
ActionCloseDisplay=Close Display
12
ActionExecuteCommand=Execute Command
23
ActionExecuteScript=Execute Script
34
ActionOpenDisplay=Open Display
768 Bytes
Loading
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright (C) 2024 European Spallation Source ERIC.
3+
*/
4+
5+
package org.csstudio.display.builder.runtime.app.actionhandlers;
6+
7+
import java.util.logging.Level;
8+
import java.util.logging.Logger;
9+
10+
import org.csstudio.display.actions.CloseDisplayAction;
11+
import org.csstudio.display.builder.model.DisplayModel;
12+
import org.csstudio.display.builder.model.Widget;
13+
import org.csstudio.display.builder.model.spi.ActionHandler;
14+
import org.csstudio.display.builder.model.spi.ActionInfo;
15+
import org.csstudio.display.builder.representation.ToolkitRepresentation;
16+
17+
public class CloseDisplayActionHandler implements ActionHandler {
18+
19+
private final Logger logger = Logger.getLogger(CloseDisplayActionHandler.class.getName());
20+
21+
@Override
22+
public void handleAction(Widget sourceWidget, ActionInfo pluggableActionInfo) {
23+
CloseDisplayAction action = (CloseDisplayAction) pluggableActionInfo;
24+
25+
try
26+
{
27+
final DisplayModel model = sourceWidget.getTopDisplayModel();
28+
final ToolkitRepresentation<Object, Object> toolkit = ToolkitRepresentation.getToolkit(model);
29+
toolkit.closeWindow(model);
30+
}
31+
catch (Throwable ex)
32+
{
33+
logger.log(Level.WARNING, action+" failed. Cannot close display", ex);
34+
}
35+
}
36+
37+
@Override
38+
public boolean matches(ActionInfo pluggableActionInfo) {
39+
return pluggableActionInfo.getType().equalsIgnoreCase(CloseDisplayAction.CLOSE_DISPLAY);
40+
}
41+
}

0 commit comments

Comments
 (0)