Skip to content

Commit a20ffff

Browse files
authored
Merge pull request #3267 from ControlSystemStudio/CSSTUDIO-2959
Updates for action dialog editor(s)
2 parents 9c75845 + 4169aad commit a20ffff

34 files changed

+917
-791
lines changed

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

Lines changed: 0 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,23 @@
44

55
package org.csstudio.display.actions;
66

7-
import javafx.fxml.FXMLLoader;
8-
import javafx.scene.Node;
97
import javafx.scene.image.Image;
10-
import org.csstudio.display.builder.model.Widget;
118
import org.csstudio.display.builder.model.persist.ModelReader;
129
import org.csstudio.display.builder.model.persist.ModelWriter;
1310
import org.csstudio.display.builder.model.persist.XMLTags;
1411
import org.csstudio.display.builder.model.properties.ActionInfoBase;
15-
import org.csstudio.display.builder.model.spi.ActionInfo;
1612
import org.csstudio.display.builder.representation.javafx.actionsdialog.ActionsDialog;
17-
import org.phoebus.framework.nls.NLS;
1813
import org.phoebus.framework.persistence.XMLUtil;
1914
import org.phoebus.ui.javafx.ImageCache;
2015
import org.w3c.dom.Element;
2116

2217
import javax.xml.stream.XMLStreamWriter;
23-
import java.io.IOException;
24-
import java.util.ResourceBundle;
25-
import java.util.logging.Level;
26-
import java.util.logging.Logger;
2718

2819
public class ExecuteCommandAction extends ActionInfoBase {
2920

3021
public static final String EXECUTE_COMMAND = "command";
3122
private static final Integer PRIORITY = 40;
3223
private String command;
33-
private ExecuteCommandActionController executeCommandActionController;
3424

3525
@SuppressWarnings("unused")
3626
/**
@@ -109,45 +99,4 @@ public boolean matchesAction(String actionId) {
10999
public String getCommand() {
110100
return command;
111101
}
112-
113-
@Override
114-
public Node getEditor(Widget widget) {
115-
if (editorUi != null) {
116-
return editorUi;
117-
}
118-
ResourceBundle resourceBundle = NLS.getMessages(Messages.class);
119-
120-
FXMLLoader fxmlLoader = new FXMLLoader();
121-
fxmlLoader.setResources(resourceBundle);
122-
fxmlLoader.setLocation(this.getClass().getResource("ExecuteCommandAction.fxml"));
123-
fxmlLoader.setControllerFactory(clazz -> {
124-
try {
125-
return clazz.getConstructor(Widget.class, ActionInfo.class).newInstance(widget, this);
126-
} catch (Exception e) {
127-
Logger.getLogger(ExecuteCommandAction.class.getName()).log(Level.SEVERE, "Failed to construct ExecuteCommandActionDetailsController", e);
128-
}
129-
return null;
130-
});
131-
132-
try {
133-
editorUi = fxmlLoader.load();
134-
executeCommandActionController = fxmlLoader.getController();
135-
return editorUi;
136-
} catch (IOException e) {
137-
throw new RuntimeException(e);
138-
}
139-
}
140-
141-
@Override
142-
public void revert() {
143-
executeCommandActionController.setDescription(this.description);
144-
executeCommandActionController.setCommand(command);
145-
}
146-
147-
@Override
148-
public ActionInfo commit() {
149-
description = executeCommandActionController.getDescription();
150-
command = executeCommandActionController.getCommand();
151-
return this;
152-
}
153102
}

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

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,9 @@
2121
*/
2222
public class ExecuteCommandActionController extends ActionControllerBase {
2323

24-
private final ExecuteCommandAction executeCommandActionInfo;
25-
2624
private final Widget widget;
2725

26+
@SuppressWarnings("unused")
2827
@FXML
2928
private TextField command;
3029

@@ -33,14 +32,10 @@ public class ExecuteCommandActionController extends ActionControllerBase {
3332
private static final Logger logger =
3433
Logger.getLogger(ExecuteCommandActionController.class.getName());
3534

36-
/**
37-
* @param widget Widget
38-
* @param actionInfo {@link ActionInfo}
39-
*/
40-
public ExecuteCommandActionController(Widget widget, ActionInfo actionInfo) {
35+
public ExecuteCommandActionController(Widget widget, ExecuteCommandAction executeCommandActionInfo){
4136
this.widget = widget;
42-
this.executeCommandActionInfo = (ExecuteCommandAction) actionInfo;
43-
this.descriptionProperty.set(actionInfo.getDescription());
37+
descriptionProperty.set(executeCommandActionInfo.getDescription());
38+
commandProperty.set(executeCommandActionInfo.getCommand());
4439
}
4540

4641
/**
@@ -49,13 +44,13 @@ public ExecuteCommandActionController(Widget widget, ActionInfo actionInfo) {
4944
@FXML
5045
public void initialize() {
5146
super.initialize();
52-
commandProperty.set(executeCommandActionInfo.getCommand());
5347
command.textProperty().bindBidirectional(commandProperty);
5448
}
5549

5650
/**
5751
* Prompt for command to execute
5852
*/
53+
@SuppressWarnings("unused")
5954
@FXML
6055
public void selectCommand() {
6156
try {
@@ -68,11 +63,7 @@ public void selectCommand() {
6863
}
6964
}
7065

71-
public String getCommand(){
72-
return commandProperty.get();
73-
}
74-
75-
public void setCommand(String command){
76-
commandProperty.set(command);
66+
public ActionInfo getActionInfo(){
67+
return new ExecuteCommandAction(descriptionProperty.get(), commandProperty.get());
7768
}
7869
}
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 ExecuteCommandAction}.
21+
*/
22+
public class ExecuteCommandActionEditor implements ActionEditor {
23+
24+
private ExecuteCommandActionController executeCommandActionController;
25+
private Node editorUi;
26+
27+
@Override
28+
public boolean matchesAction(String type) {
29+
return ExecuteCommandAction.EXECUTE_COMMAND.equalsIgnoreCase(type);
30+
}
31+
32+
@Override
33+
public ActionInfo getActionInfo() {
34+
return executeCommandActionController.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("ExecuteCommandAction.fxml"));
49+
fxmlLoader.setControllerFactory(clazz -> {
50+
try {
51+
return clazz.getConstructor(Widget.class, ExecuteCommandAction.class).newInstance(widget, actionInfo);
52+
} catch (Exception e) {
53+
Logger.getLogger(ExecuteCommandActionEditor.class.getName()).log(Level.SEVERE, "Failed to construct ExecuteCommandActionDetailsController", e);
54+
}
55+
return null;
56+
});
57+
58+
try {
59+
editorUi = fxmlLoader.load();
60+
executeCommandActionController = fxmlLoader.getController();
61+
} catch (IOException e) {
62+
Logger.getLogger(ExecuteCommandActionEditor.class.getName()).log(Level.SEVERE, "Failed to load the ExecuteCommandAction UI", e);
63+
throw new RuntimeException(e);
64+
}
65+
}
66+
}

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

Lines changed: 9 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,19 @@
44

55
package org.csstudio.display.actions;
66

7-
import javafx.fxml.FXMLLoader;
8-
import javafx.scene.Node;
97
import javafx.scene.image.Image;
10-
import org.csstudio.display.builder.model.Widget;
118
import org.csstudio.display.builder.model.persist.ModelReader;
129
import org.csstudio.display.builder.model.persist.ModelWriter;
1310
import org.csstudio.display.builder.model.persist.XMLTags;
1411
import org.csstudio.display.builder.model.properties.ActionInfoBase;
1512
import org.csstudio.display.builder.model.properties.ScriptInfo;
16-
import org.csstudio.display.builder.model.spi.ActionInfo;
1713
import org.csstudio.display.builder.representation.javafx.actionsdialog.ActionsDialog;
18-
import org.phoebus.framework.nls.NLS;
1914
import org.phoebus.framework.persistence.XMLUtil;
2015
import org.phoebus.ui.javafx.ImageCache;
2116
import org.w3c.dom.Element;
2217

2318
import javax.xml.stream.XMLStreamWriter;
24-
import java.io.IOException;
2519
import java.util.Collections;
26-
import java.util.ResourceBundle;
27-
import java.util.logging.Level;
28-
import java.util.logging.Logger;
2920

3021
public class ExecuteScriptAction extends ActionInfoBase {
3122

@@ -39,9 +30,6 @@ public class ExecuteScriptAction extends ActionInfoBase {
3930
private String text;
4031
private String path;
4132

42-
private ExecuteScriptActionController executeScriptController;
43-
44-
4533
@SuppressWarnings("unused")
4634
/**
4735
* Do not remove, needed by SPI framework.
@@ -53,8 +41,6 @@ public ExecuteScriptAction() {
5341
ScriptInfo.EXAMPLE_PYTHON,
5442
false,
5543
Collections.emptyList());
56-
// this.text = scriptInfo.getText();
57-
// this.path = scriptInfo.getPath();
5844
}
5945

6046
public ExecuteScriptAction(String description, ScriptInfo scriptInfo) {
@@ -72,7 +58,7 @@ public Image getImage() {
7258

7359
@Override
7460
public void readFromXML(ModelReader modelReader, Element actionXml) throws Exception {
75-
if(type.equalsIgnoreCase(EXECUTE_SCRIPT)){
61+
if (type.equalsIgnoreCase(EXECUTE_SCRIPT)) {
7662
// <script file="EmbeddedPy">
7763
// <text> the embedded text </text>
7864
// </script>
@@ -81,17 +67,16 @@ public void readFromXML(ModelReader modelReader, Element actionXml) throws Excep
8167
throw new Exception("Missing <script..>");
8268
} else {
8369
path = el.getAttribute(XMLTags.FILE);
84-
if(ScriptInfo.EMBEDDED_PYTHON.equals(path) || ScriptInfo.EMBEDDED_JAVASCRIPT.equals(path)){
70+
if (ScriptInfo.EMBEDDED_PYTHON.equals(path) || ScriptInfo.EMBEDDED_JAVASCRIPT.equals(path)) {
8571
text = XMLUtil.getChildString(el, XMLTags.TEXT).orElse(null);
8672
}
8773
scriptInfo = new ScriptInfo(path, text, false, Collections.emptyList());
8874
if (description.isEmpty()) {
8975
description = Messages.ActionExecuteScript;
9076
}
9177
}
92-
}
93-
else if(type.equalsIgnoreCase(EXECUTE_JAVASCRIPT) ||
94-
type.equalsIgnoreCase(EXECUTE_PYTHONSCRIPT)){
78+
} else if (type.equalsIgnoreCase(EXECUTE_JAVASCRIPT) ||
79+
type.equalsIgnoreCase(EXECUTE_PYTHONSCRIPT)) {
9580
// Legacy XML:
9681
// <action type="EXECUTE_PYTHONSCRIPT"> .. or "EXECUTE_JAVASCRIPT"
9782
// <path>script.py</path>
@@ -102,15 +87,13 @@ else if(type.equalsIgnoreCase(EXECUTE_JAVASCRIPT) ||
10287
final boolean embed = Boolean.parseBoolean(XMLUtil.getChildString(actionXml, "embedded").orElse("false"));
10388
path = XMLUtil.getChildString(actionXml, XMLTags.PATH).orElse("");
10489
text = XMLUtil.getChildString(actionXml, "scriptText").orElse("");
105-
if (embed)
106-
{
90+
if (embed) {
10791
final String dialect = type.contains("PYTHON")
10892
? ScriptInfo.EMBEDDED_PYTHON : ScriptInfo.EMBEDDED_JAVASCRIPT;
10993
scriptInfo = new ScriptInfo(dialect, text, false, Collections.emptyList());
110-
}
111-
else
94+
} else
11295
scriptInfo = new ScriptInfo(path, null, false, Collections.emptyList());
113-
if (description.isEmpty()){
96+
if (description.isEmpty()) {
11497
description = Messages.ActionExecuteScript;
11598
}
11699
}
@@ -124,8 +107,8 @@ public void writeToXML(ModelWriter modelWriter, XMLStreamWriter writer) throws E
124107
writer.writeStartElement(XMLTags.SCRIPT);
125108
writer.writeAttribute(XMLTags.FILE, path);
126109
// The controller updates the text and path not the scriptInfo
127-
if( this.path.equals(ScriptInfo.EMBEDDED_PYTHON) ||
128-
this.path.equals(ScriptInfo.EMBEDDED_JAVASCRIPT)){
110+
if (this.path.equals(ScriptInfo.EMBEDDED_PYTHON) ||
111+
this.path.equals(ScriptInfo.EMBEDDED_JAVASCRIPT)) {
129112
final String text = this.text;
130113
if (text != null) {
131114
writer.writeStartElement(XMLTags.TEXT);
@@ -136,59 +119,10 @@ public void writeToXML(ModelWriter modelWriter, XMLStreamWriter writer) throws E
136119
writer.writeEndElement();
137120
}
138121

139-
@Override
140-
public boolean matchesAction(String actionId) {
141-
return actionId.equalsIgnoreCase(EXECUTE_SCRIPT) ||
142-
actionId.equalsIgnoreCase(EXECUTE_JAVASCRIPT) ||
143-
actionId.equalsIgnoreCase(EXECUTE_PYTHONSCRIPT);
144-
}
145-
146122
public ScriptInfo getScriptInfo() {
147123
return scriptInfo;
148124
}
149125

150-
@Override
151-
public Node getEditor(Widget widget){
152-
if(editorUi != null){
153-
return editorUi;
154-
}
155-
ResourceBundle resourceBundle = NLS.getMessages(Messages.class);
156-
FXMLLoader fxmlLoader = new FXMLLoader();
157-
fxmlLoader.setResources(resourceBundle);
158-
fxmlLoader.setLocation(this.getClass().getResource("ExecuteScriptActionDetails.fxml"));
159-
fxmlLoader.setControllerFactory(clazz -> {
160-
try {
161-
return clazz.getConstructor(Widget.class, ActionInfo.class).newInstance(widget, this);
162-
} catch (Exception e) {
163-
Logger.getLogger(ExecuteScriptAction.class.getName()).log(Level.SEVERE, "Failed to construct ExecuteScriptActionController", e);
164-
}
165-
return null;
166-
});
167-
168-
try {
169-
editorUi = fxmlLoader.load();
170-
executeScriptController = fxmlLoader.getController();
171-
return editorUi;
172-
} catch (IOException e) {
173-
throw new RuntimeException(e);
174-
}
175-
}
176-
177-
@Override
178-
public void revert(){
179-
executeScriptController.setScriptPath(path);
180-
executeScriptController.setScriptBody(text);
181-
executeScriptController.setDescription(description);
182-
}
183-
184-
@Override
185-
public ActionInfo commit(){
186-
path = executeScriptController.getScriptPath();
187-
text = executeScriptController.getScriptBody();
188-
description = executeScriptController.getDescription();
189-
return this;
190-
}
191-
192126
@Override
193127
public Integer getPriority() {
194128
return PRIORITY;

0 commit comments

Comments
 (0)