linked_displays = new HashSet<>();
- /** Parse EDL input and convert into {@link DisplayModel}
+ /**
+ * Parse EDL input and convert into {@link DisplayModel}
*
- * Optional {@link AssetLocator} allows for example image
- * widgets to locate their images, automatically downloading
- * it from a http:/.. search path.
+ *
Optional {@link AssetLocator} allows for example image
+ * widgets to locate their images, automatically downloading
+ * it from a http:/.. search path.
*
- * @param input EDL input file
- * @param asset_locator Optional {@link AssetLocator} or null
- * @throws Exception on error
+ * @param input EDL input file
+ * @param asset_locator Optional {@link AssetLocator} or null
+ * @throws Exception on error
*/
- public EdmConverter(final File input, final AssetLocator asset_locator) throws Exception
- {
+ public EdmConverter(final File input, final AssetLocator asset_locator) throws Exception {
this.asset_locator = asset_locator;
logger.log(Level.FINE, "Parsing EDM " + input);
@@ -85,8 +85,8 @@ public EdmConverter(final File input, final AssetLocator asset_locator) throws E
// Create Display Model
final String name = input.getName()
- .replace(".edl", "")
- .replace('_', ' ');
+ .replace(".edl", "")
+ .replace('_', ' ');
model.propName().setValue(name);
model.propX().setValue(edm.getX());
model.propY().setValue(edm.getY());
@@ -99,8 +99,7 @@ public EdmConverter(final File input, final AssetLocator asset_locator) throws E
model.propName().setValue(edm.getTitle());
model.propGridVisible().setValue(edm.isShowGrid());
- if (edm.getGridSize() > 0)
- {
+ if (edm.getGridSize() > 0) {
model.propGridStepX().setValue(edm.getGridSize());
model.propGridStepY().setValue(edm.getGridSize());
}
@@ -111,89 +110,93 @@ public EdmConverter(final File input, final AssetLocator asset_locator) throws E
correctChildWidgets(model);
}
- /** @return {@link DisplayModel} */
- public DisplayModel getDisplayModel()
- {
+ /**
+ * @return {@link DisplayModel}
+ */
+ public DisplayModel getDisplayModel() {
return model;
}
- /** @param output File to write with Display Builder model
- * @throws Exception on error
+ /**
+ * @param output File to write with Display Builder model
+ * @throws Exception on error
*/
- public void write(final File output) throws Exception
- {
+ public void write(final File output) throws Exception {
logger.log(Level.FINE, "Writing " + output);
final ModelWriter writer = new ModelWriter(new FileOutputStream(output));
writer.writeModel(model);
writer.close();
}
- /** @return Number of next group */
- public int nextGroup()
- {
+ /**
+ * @return Number of next group
+ */
+ public int nextGroup() {
return next_group.getAndIncrement();
}
- /** Request download of asset.
+ /**
+ * Request download of asset.
*
- *
NOP when this converter doesn't have an {@link AssetLocator}.
+ *
NOP when this converter doesn't have an {@link AssetLocator}.
*
- * @param asset Asset of a widget, for example PNG file for Image widget
- * @throws Exception
+ * @param asset Asset of a widget, for example PNG file for Image widget
+ * @throws Exception
*/
- public void downloadAsset(final String asset) throws Exception
- {
+ public void downloadAsset(final String asset) throws Exception {
if (asset_locator != null)
asset_locator.locate(asset);
}
- /** @return Displays that were included by this display (embedded, symbol) */
- public Collection getIncludedDisplays()
- {
+ /**
+ * @return Displays that were included by this display (embedded, symbol)
+ */
+ public Collection getIncludedDisplays() {
return included_displays.stream().sorted().collect(Collectors.toList());
}
- /** @return Displays that were linked from this display (related display) */
- public Collection getLinkedDisplays()
- {
+ /**
+ * @return Displays that were linked from this display (related display)
+ */
+ public Collection getLinkedDisplays() {
return linked_displays.stream().sorted().collect(Collectors.toList());
}
- /** @param x X offset and
- * @param y Y offset of widgets within currently handled container
+ /**
+ * @param x X offset and
+ * @param y Y offset of widgets within currently handled container
*/
- public void addPositionOffset(final int x, final int y)
- {
+ public void addPositionOffset(final int x, final int y) {
offset_x += x;
offset_y += y;
}
- /** @return X offset of widgets within currently handled container */
- public int getOffsetX()
- {
+ /**
+ * @return X offset of widgets within currently handled container
+ */
+ public int getOffsetX() {
return offset_x;
}
- /** @return Y offset of widgets within currently handled container */
- public int getOffsetY()
- {
+ /**
+ * @return Y offset of widgets within currently handled container
+ */
+ public int getOffsetY() {
return offset_y;
}
- /** Convert one widget
- * @param parent Parent
- * @param edm EDM widget to convert
+ /**
+ * Convert one widget
+ *
+ * @param parent Parent
+ * @param edm EDM widget to convert
*/
- public void convertWidget(final Widget parent, final EdmEntity edm)
- {
- if (edm instanceof EdmWidget)
- {
- final EdmWidget w = (EdmWidget) edm;
- if (w.getX() + w.getW() <= 0 ||
- w.getY() + w.getH() <= 0)
- {
+ public void convertWidget(final Widget parent, final EdmEntity edm) {
+ if (edm instanceof EdmWidget w) {
+ if (w.getX() + w.getW() <= 0 ||
+ w.getY() + w.getH() <= 0) {
logger.log(Level.WARNING, "Skipping off-screen widget " + edm.getType() +
- " @ " + w.getX() + "," + w.getY() + " sized " + w.getW() + " x " + w.getH());
+ " @ " + w.getX() + "," + w.getY() + " sized " + w.getW() + " x " + w.getH());
return;
}
}
@@ -201,82 +204,71 @@ public void convertWidget(final Widget parent, final EdmEntity edm)
// Given an EDM Widget type like "activeXTextClass",
// locate the matching "Convert_activeXTextClass"
final Class> clazz;
- try
- {
+ try {
final String wc_name = ConverterBase.class.getPackageName() +
- ".Convert_" +
- edm.getType().replace(':', '_');
+ ".Convert_" +
+ edm.getType().replace(':', '_');
clazz = Class.forName(wc_name);
- }
- catch (ClassNotFoundException ex)
- {
+ } catch (ClassNotFoundException ex) {
logger.log(Level.WARNING, "No converter for EDM " + edm.getType());
return;
}
- try
- {
- for (Constructor> c : clazz.getConstructors())
- { // Look for suitable constructor
+ try {
+ for (Constructor> c : clazz.getConstructors()) { // Look for suitable constructor
final Class>[] parms = c.getParameterTypes();
- if (parms.length == 3 &&
- parms[0] == EdmConverter.class &&
- parms[1] == Widget.class &&
- EdmWidget.class.isAssignableFrom(parms[2]))
- {
+ if (parms.length == 3 &&
+ parms[0] == EdmConverter.class &&
+ parms[1] == Widget.class &&
+ EdmWidget.class.isAssignableFrom(parms[2])) {
// Simply constructing the converter will perform the conversion
c.newInstance(this, parent, edm);
return;
}
}
throw new Exception(clazz.getSimpleName() + " lacks required constructor");
- }
- catch (Exception ex)
- {
+ } catch (Exception ex) {
logger.log(Level.WARNING, "Cannot convert " + edm.getType(), ex);
}
}
- /** Correct widget issues
+ /**
+ * Correct widget issues
+ *
+ * Called after all widgets have been added to a parent
*
- *
Called after all widgets have been added to a parent
- * @param parent
+ * @param parent
*/
- public void correctChildWidgets(final Widget parent)
- {
+ public void correctChildWidgets(final Widget parent) {
final ChildrenProperty children = ChildrenProperty.getChildren(parent);
mergeButtons(children);
fixCoveredButtons(children);
raiseTransparentButtons(children);
}
- /** Merge action buttons that are overlapping into one button.
- * EDM supports 'invisible' buttons which react to left or
- * right mouse button to occupy the same space.
- * In display builder, only the left button triggers an action.
- * The right button opens the context menu.
- * So merge actions from all overlapping buttons into one.
+ /**
+ * Merge action buttons that are overlapping into one button.
+ * EDM supports 'invisible' buttons which react to left or
+ * right mouse button to occupy the same space.
+ * In display builder, only the left button triggers an action.
+ * The right button opens the context menu.
+ * So merge actions from all overlapping buttons into one.
*
- * @param children Child widgets to correct
+ * @param children Child widgets to correct
*/
- private void mergeButtons(final ChildrenProperty children)
- {
+ private void mergeButtons(final ChildrenProperty children) {
// Start with the topmost button, i.e. end of list
final List copy = new ArrayList<>(children.getValue());
- for (int i=copy.size()-1; i>=0; --i)
- {
+ for (int i = copy.size() - 1; i >= 0; --i) {
final Widget widget = copy.get(i);
- if (! (widget instanceof ActionButtonWidget))
+ if (!(widget instanceof ActionButtonWidget bw))
continue;
- final ActionButtonWidget bw = (ActionButtonWidget) widget;
// Look for buttons below that occupy roughly the same space
- for (int o=i-1; o>=0; --o)
- {
+ for (int o = i - 1; o >= 0; --o) {
final Widget other = copy.get(o);
- if (! (other instanceof ActionButtonWidget && doWidgetsOverlap(widget, other)))
+ if (!(other instanceof ActionButtonWidget ob && doWidgetsOverlap(widget, other)))
continue;
- final ActionButtonWidget ob = (ActionButtonWidget) other;
logger.log(Level.INFO, "Merging actions from overlapping " + widget + " and " + other + " into one:");
logger.log(Level.INFO, "1) " + widget.propActions().getValue());
@@ -287,8 +279,7 @@ private void mergeButtons(final ChildrenProperty children)
// When merging buttons, as soon as one button is visible.
// the remaining (merged) button must be visible
- if (! ob.propTransparent().getValue())
- {
+ if (!ob.propTransparent().getValue()) {
bw.propTransparent().setValue(false);
bw.propText().setValue(ob.propText().getValue());
bw.propForegroundColor().setValue(ob.propForegroundColor().getValue());
@@ -305,69 +296,67 @@ private void mergeButtons(final ChildrenProperty children)
}
}
- /** Do two widgets overlap, no matter which one covers the other?
- * @param widget
- * @param other
- * @return Do the widgets overlap by a considerable amount?
+ /**
+ * Do two widgets overlap, no matter which one covers the other?
+ *
+ * @param widget
+ * @param other
+ * @return Do the widgets overlap by a considerable amount?
*/
- private boolean doWidgetsOverlap(final Widget widget, final Widget other)
- {
+ private boolean doWidgetsOverlap(final Widget widget, final Widget other) {
final Rectangle2D w = new Rectangle2D.Double(widget.propX().getValue(),
- widget.propY().getValue(),
- widget.propWidth().getValue(),
- widget.propHeight().getValue());
+ widget.propY().getValue(),
+ widget.propWidth().getValue(),
+ widget.propHeight().getValue());
final Rectangle2D o = new Rectangle2D.Double(other.propX().getValue(),
- other.propY().getValue(),
- other.propWidth().getValue(),
- other.propHeight().getValue());
+ other.propY().getValue(),
+ other.propWidth().getValue(),
+ other.propHeight().getValue());
final Rectangle2D common = w.createIntersection(o);
- if (common.getWidth() <= 0 || common.getHeight() <= 0)
+ if (common.getWidth() <= 0 || common.getHeight() <= 0)
return false;
final int overlap = (int) (common.getWidth() * common.getHeight());
final int avg_area = (int) (w.getWidth() * w.getHeight() +
- o.getWidth() * o.getHeight()) / 2;
+ o.getWidth() * o.getHeight()) / 2;
// Overlap by at least a 5th??
return overlap > avg_area / 5;
}
- /** Make covered buttons 'transparent'.
- * EDM supports buttons in the back of rectangles etc.
- * They're not visible, but they react to mouse clicks.
- * In display builder, covered buttons are, well, covered.
- * Make them 'transparent', and a follow-up operation then raises
- * all transparent buttons to the top so they get mouse clicks.
+ /**
+ * Make covered buttons 'transparent'.
+ * EDM supports buttons in the back of rectangles etc.
+ * They're not visible, but they react to mouse clicks.
+ * In display builder, covered buttons are, well, covered.
+ * Make them 'transparent', and a follow-up operation then raises
+ * all transparent buttons to the top so they get mouse clicks.
*
- * @param children Child widgets to correct
+ * @param children Child widgets to correct
*/
- private void fixCoveredButtons(final ChildrenProperty children)
- {
+ private void fixCoveredButtons(final ChildrenProperty children) {
final List list = children.getValue();
// Start of list = lowest widget
- for (int i=0; i> check = other.checkProperty(CommonWidgetProperties.propTransparent);
- if (check.isPresent() && check.get().getValue())
+ if (check.isPresent() && check.get().getValue())
continue;
// .. or invisible widgets
check = other.checkProperty(CommonWidgetProperties.propVisible);
- if (check.isPresent() && !check.get().getValue())
+ if (check.isPresent() && !check.get().getValue())
continue;
// Does other widget cover this one?
- if (! isWidgetCovered(bottom, other))
+ if (!isWidgetCovered(bottom, other))
continue;
logger.log(Level.INFO, bottom + " is covered by " + other + ". Making it 'transparent' so it'll be raised.");
@@ -379,23 +368,24 @@ private void fixCoveredButtons(final ChildrenProperty children)
}
}
- /** Does one widget cover the other?
- * @param bottom
- * @param top
- * @return Does top widget cover the one at the bottom by a considerable amount?
+ /**
+ * Does one widget cover the other?
+ *
+ * @param bottom
+ * @param top
+ * @return Does top widget cover the one at the bottom by a considerable amount?
*/
- private boolean isWidgetCovered(final Widget bottom, final Widget top)
- {
+ private boolean isWidgetCovered(final Widget bottom, final Widget top) {
final Rectangle2D w = new Rectangle2D.Double(bottom.propX().getValue(),
- bottom.propY().getValue(),
- bottom.propWidth().getValue(),
- bottom.propHeight().getValue());
+ bottom.propY().getValue(),
+ bottom.propWidth().getValue(),
+ bottom.propHeight().getValue());
final Rectangle2D o = new Rectangle2D.Double(top.propX().getValue(),
- top.propY().getValue(),
- top.propWidth().getValue(),
- top.propHeight().getValue());
+ top.propY().getValue(),
+ top.propWidth().getValue(),
+ top.propHeight().getValue());
final Rectangle2D common = w.createIntersection(o);
- if (common.getWidth() <= 0 || common.getHeight() <= 0)
+ if (common.getWidth() <= 0 || common.getHeight() <= 0)
return false;
final int overlap = (int) (common.getWidth() * common.getHeight());
@@ -404,24 +394,20 @@ private boolean isWidgetCovered(final Widget bottom, final Widget top)
return overlap > bottom_area / 2;
}
- /** Move transparent buttons to front.
- * In EDM, transparent buttons may be placed behind text etc.
- * In display builder, normal widget order would
- * then have text block mouse events from button.
- * @param children Child widgets to correct
+ /**
+ * Move transparent buttons to front.
+ * In EDM, transparent buttons may be placed behind text etc.
+ * In display builder, normal widget order would
+ * then have text block mouse events from button.
+ *
+ * @param children Child widgets to correct
*/
- private void raiseTransparentButtons(final ChildrenProperty children)
- {
+ private void raiseTransparentButtons(final ChildrenProperty children) {
final List copy = new ArrayList<>(children.getValue());
- for (Widget widget : copy)
- {
- if (widget instanceof ActionButtonWidget)
- {
- final ActionButtonWidget b = (ActionButtonWidget) widget;
- if (b.propTransparent().getValue())
- {
- try
- {
+ for (Widget widget : copy) {
+ if (widget instanceof ActionButtonWidget b) {
+ if (b.propTransparent().getValue()) {
+ try {
// Get absolute widget coords and check if widget is inside a group
final DisplayModel display = widget.getDisplayModel();
final javafx.geometry.Rectangle2D bounds = GeometryTools.getDisplayBounds(widget);
@@ -431,18 +417,15 @@ private void raiseTransparentButtons(final ChildrenProperty children)
// If it was a top-level widget, just add back to display
if (top_level)
logger.log(Level.INFO, "Raising transparent " + b);
- else
- { // If widget was in group, raising it within the group could still mean
+ else { // If widget was in group, raising it within the group could still mean
// that group is covered by something else.
// So place at absolute coords and then place in display, not original group
logger.log(Level.INFO, "Raising transparent " + b + " and moving from group to top");
- widget.propX().setValue((int)bounds.getMinX());
- widget.propY().setValue((int)bounds.getMinY());
+ widget.propX().setValue((int) bounds.getMinX());
+ widget.propY().setValue((int) bounds.getMinY());
}
display.runtimeChildren().addChild(widget);
- }
- catch (Exception ex)
- {
+ } catch (Exception ex) {
logger.log(Level.WARNING, "Failed to raise transparent " + b, ex);
}
}
@@ -450,15 +433,17 @@ private void raiseTransparentButtons(final ChildrenProperty children)
}
}
- /** @param included_display Register a display that's included by the currently converted file */
- public void addIncludedDisplay(final String included_display)
- {
+ /**
+ * @param included_display Register a display that's included by the currently converted file
+ */
+ public void addIncludedDisplay(final String included_display) {
included_displays.add(included_display);
}
- /** @param linked_display Register a display that was linked from the currently converted file */
- public void addLinkedDisplay(final String linked_display)
- {
+ /**
+ * @param linked_display Register a display that was linked from the currently converted file
+ */
+ public void addLinkedDisplay(final String linked_display) {
linked_displays.add(linked_display);
}
}
diff --git a/app/display/convert-edm/src/main/java/org/csstudio/display/converter/edm/widgets/Convert_activeExitButtonClass.java b/app/display/convert-edm/src/main/java/org/csstudio/display/converter/edm/widgets/Convert_activeExitButtonClass.java
index d82c8816ff..2a55f5f48f 100644
--- a/app/display/convert-edm/src/main/java/org/csstudio/display/converter/edm/widgets/Convert_activeExitButtonClass.java
+++ b/app/display/convert-edm/src/main/java/org/csstudio/display/converter/edm/widgets/Convert_activeExitButtonClass.java
@@ -7,43 +7,42 @@
*******************************************************************************/
package org.csstudio.display.converter.edm.widgets;
-import java.util.Collections;
-import java.util.List;
-
import org.csstudio.display.builder.model.Widget;
import org.csstudio.display.builder.model.properties.ActionInfos;
-import org.csstudio.display.builder.model.properties.ExecuteScriptActionInfo;
import org.csstudio.display.builder.model.properties.ScriptInfo;
import org.csstudio.display.builder.model.widgets.ActionButtonWidget;
import org.csstudio.display.converter.edm.EdmConverter;
import org.csstudio.opibuilder.converter.model.EdmWidget;
import org.csstudio.opibuilder.converter.model.Edm_activeExitButtonClass;
+import org.csstudio.display.actions.ExecuteScriptAction;
+
+import java.util.Collections;
+import java.util.List;
-/** Convert an EDM widget into Display Builder counterpart
- * @author Kay Kasemir
- * @author Matevz, Lei Hu, Xihui Chen et al - Original logic in Opi_.. converter
+/**
+ * Convert an EDM widget into Display Builder counterpart
+ *
+ * @author Kay Kasemir
+ * @author Matevz, Lei Hu, Xihui Chen et al - Original logic in Opi_.. converter
*/
@SuppressWarnings("nls")
-public class Convert_activeExitButtonClass extends ConverterBase
-{
+public class Convert_activeExitButtonClass extends ConverterBase {
private static final String exit =
- "from org.csstudio.display.builder.runtime.script import ScriptUtil\n" +
- "ScriptUtil.closeDisplay(widget)\n";
+ "from org.csstudio.display.builder.runtime.script import ScriptUtil\n" +
+ "ScriptUtil.closeDisplay(widget)\n";
private static final ScriptInfo script = new ScriptInfo(ScriptInfo.EMBEDDED_PYTHON, exit, false, Collections.emptyList());
- public Convert_activeExitButtonClass(final EdmConverter converter, final Widget parent, final Edm_activeExitButtonClass t)
- {
+ public Convert_activeExitButtonClass(final EdmConverter converter, final Widget parent, final Edm_activeExitButtonClass t) {
super(converter, parent, t);
convertColor(t.getBgColor(), widget.propBackgroundColor());
convertColor(t.getFgColor(), widget.propForegroundColor());
convertFont(t.getFont(), widget.propFont());
widget.propText().setValue(t.getLabel());
- widget.propActions().setValue(new ActionInfos(List.of(new ExecuteScriptActionInfo("close", script))));
+ widget.propActions().setValue(new ActionInfos(List.of(new ExecuteScriptAction("close", script))));
}
@Override
- protected ActionButtonWidget createWidget(final EdmWidget edm)
- {
+ protected ActionButtonWidget createWidget(final EdmWidget edm) {
return new ActionButtonWidget();
}
}
diff --git a/app/display/convert-edm/src/main/java/org/csstudio/display/converter/edm/widgets/Convert_activeMessageButtonClass.java b/app/display/convert-edm/src/main/java/org/csstudio/display/converter/edm/widgets/Convert_activeMessageButtonClass.java
index c0fdb02853..32e5a5a521 100644
--- a/app/display/convert-edm/src/main/java/org/csstudio/display/converter/edm/widgets/Convert_activeMessageButtonClass.java
+++ b/app/display/convert-edm/src/main/java/org/csstudio/display/converter/edm/widgets/Convert_activeMessageButtonClass.java
@@ -7,29 +7,30 @@
*******************************************************************************/
package org.csstudio.display.converter.edm.widgets;
-import static org.csstudio.display.converter.edm.Converter.logger;
-
-import java.util.List;
-import java.util.logging.Level;
-
import org.csstudio.display.builder.model.Widget;
import org.csstudio.display.builder.model.persist.NamedWidgetColors;
-import org.csstudio.display.builder.model.properties.ActionInfos;
import org.csstudio.display.builder.model.properties.ConfirmDialog;
-import org.csstudio.display.builder.model.properties.WritePVActionInfo;
+import org.csstudio.display.builder.model.properties.ActionInfos;
import org.csstudio.display.builder.model.widgets.ActionButtonWidget;
import org.csstudio.display.builder.model.widgets.BoolButtonWidget;
import org.csstudio.display.converter.edm.EdmConverter;
import org.csstudio.opibuilder.converter.model.EdmWidget;
import org.csstudio.opibuilder.converter.model.Edm_activeMessageButtonClass;
+import org.csstudio.display.actions.WritePVAction;
+
+import java.util.List;
+import java.util.logging.Level;
-/** Convert an EDM widget into Display Builder counterpart
- * @author Kay Kasemir
- * @author Matevz, Lei Hu, Xihui Chen et al - Original logic in Opi_.. converter
+import static org.csstudio.display.converter.edm.Converter.logger;
+
+/**
+ * Convert an EDM widget into Display Builder counterpart
+ *
+ * @author Kay Kasemir
+ * @author Matevz, Lei Hu, Xihui Chen et al - Original logic in Opi_.. converter
*/
@SuppressWarnings("nls")
-public class Convert_activeMessageButtonClass extends ConverterBase
-{
+public class Convert_activeMessageButtonClass extends ConverterBase {
// No perfect match.
//
// When EDM message button is 'toggle', we use a BoolButtonWidget that writes 0, 1.
@@ -37,12 +38,10 @@ public class Convert_activeMessageButtonClass extends ConverterBase
//
// When EDM message button is 'push', we use ActionButtonWidget that writes the 'push' value,
// falling back to the 'release' value, but can't write both.
- public Convert_activeMessageButtonClass(final EdmConverter converter, final Widget parent, final Edm_activeMessageButtonClass mb)
- {
+ public Convert_activeMessageButtonClass(final EdmConverter converter, final Widget parent, final Edm_activeMessageButtonClass mb) {
super(converter, parent, mb);
- if (is_boolean(mb))
- {
+ if (is_boolean(mb)) {
// Create bool button that writes 0/1
final BoolButtonWidget b = (BoolButtonWidget) widget;
b.propShowLED().setValue(false);
@@ -56,8 +55,7 @@ public Convert_activeMessageButtonClass(final EdmConverter converter, final Widg
// EDM MB has no alarms sensitive border
b.propBorderAlarmSensitive().setValue(false);
- if (mb.getPassword() != null)
- {
+ if (mb.getPassword() != null) {
b.propConfirmDialog().setValue(ConfirmDialog.BOTH);
b.propPassword().setValue(mb.getPassword());
}
@@ -65,28 +63,22 @@ public Convert_activeMessageButtonClass(final EdmConverter converter, final Widg
final String pv = convertPVName(mb.getControlPv());
b.propPVName().setValue(pv);
- if (mb.isToggle())
- {
+ if (mb.isToggle()) {
b.propMode().setValue(BoolButtonWidget.Mode.TOGGLE);
// Toggle will always write 1 in 'on', 0 in 'off' state.
// If EDM widget reversed 1/0, swap the labels and colors.
- if ("0".equals(mb.getPressValue()))
- {
+ if ("0".equals(mb.getPressValue())) {
b.propOffLabel().setValue(mb.getOnLabel());
b.propOnLabel().setValue(mb.getOffLabel());
convertColor(mb.getOffColor(), b.propOnColor());
convertColor(mb.getOnColor(), b.propOffColor());
}
- }
- else
- if ("0".equals(mb.getPressValue()) &&
+ } else if ("0".equals(mb.getPressValue()) &&
"1".equals(mb.getReleaseValue()))
- b.propMode().setValue(BoolButtonWidget.Mode.PUSH_INVERTED);
- else
- b.propMode().setValue(BoolButtonWidget.Mode.PUSH);
- }
- else
- {
+ b.propMode().setValue(BoolButtonWidget.Mode.PUSH_INVERTED);
+ else
+ b.propMode().setValue(BoolButtonWidget.Mode.PUSH);
+ } else {
// Create action button that writes a value on 'click'
final ActionButtonWidget b = (ActionButtonWidget) widget;
convertColor(mb.getOnColor(), b.propBackgroundColor());
@@ -103,49 +95,43 @@ public Convert_activeMessageButtonClass(final EdmConverter converter, final Widg
if (mb.getControlPv() == null)
logger.log(Level.WARNING, "Message button '" + desc + "' without PV");
- else
- {
+ else {
final String pv = convertPVName(mb.getControlPv());
// Write a value when clicked.
// Ordinarily, that's the 'press' value.
// Could also be the 'release' value,
// but can only be one of them.
- final boolean have_press_value = mb.getPressValue() != null && !mb.getPressValue().isEmpty();
- final boolean have_release_value = mb.getReleaseValue() != null && !mb.getReleaseValue().isEmpty();
+ final boolean have_press_value = mb.getPressValue() != null && !mb.getPressValue().isEmpty();
+ final boolean have_release_value = mb.getReleaseValue() != null && !mb.getReleaseValue().isEmpty();
final String value;
- if (have_press_value)
- {
+ if (have_press_value) {
value = mb.getPressValue();
// If there is a release value, warn that it's ignored.
// OK to skip a release value that matches the press value,
// since we wrote it on press.
- if (have_release_value && !mb.getReleaseValue().equals(mb.getPressValue()))
+ if (have_release_value && !mb.getReleaseValue().equals(mb.getPressValue()))
logger.log(Level.WARNING, "Cannot convert EDM message 'push' button '" + desc + "' for release message '" + mb.getReleaseValue() +
"', will only write the 'press' message " + pv + " = '" + mb.getPressValue() + "'");
- }
- else if (have_release_value)
+ } else if (have_release_value)
value = mb.getReleaseValue();
- else
- {
+ else {
value = "";
logger.log(Level.WARNING, "EDM message 'push' button '" + desc + "' lacks both 'press' and 'release'; writing empty string");
}
// Set the button's $(pv_name) macro to the PV name, and use that within the write-PV action
b.propPVName().setValue(pv);
- b.propActions().setValue(new ActionInfos(List.of(new WritePVActionInfo(desc, "$(pv_name)", value))));
+ b.propActions().setValue(new ActionInfos(List.of(new WritePVAction(desc, "$(pv_name)", value))));
}
- if (mb.getPassword() != null)
- {
+ if (mb.getPassword() != null) {
b.propConfirmDialog().setValue(true);
b.propPassword().setValue(mb.getPassword());
}
// Turn invisible EDM button into transparent, no text action button
- if (mb.isInvisible())
- {
+ if (mb.isInvisible()) {
b.propBackgroundColor().setValue(NamedWidgetColors.TRANSPARENT);
b.propText().setValue("");
b.propTransparent().setValue(true);
@@ -154,8 +140,7 @@ else if (have_release_value)
}
@Override
- protected Widget createWidget(final EdmWidget edm)
- {
+ protected Widget createWidget(final EdmWidget edm) {
final Edm_activeMessageButtonClass mb = (Edm_activeMessageButtonClass) edm;
if (is_boolean(mb))
return new BoolButtonWidget();
@@ -163,11 +148,10 @@ protected Widget createWidget(final EdmWidget edm)
return new ActionButtonWidget();
}
- private boolean is_boolean(final Edm_activeMessageButtonClass mb)
- {
+ private boolean is_boolean(final Edm_activeMessageButtonClass mb) {
// When EDM button writes 1/0 or 0/1, use a BoolButtonWidget
return ("1".equals(mb.getPressValue()) && "0".equals(mb.getReleaseValue()))
- ||
- ("0".equals(mb.getPressValue()) && "1".equals(mb.getReleaseValue()));
+ ||
+ ("0".equals(mb.getPressValue()) && "1".equals(mb.getReleaseValue()));
}
}
diff --git a/app/display/convert-edm/src/main/java/org/csstudio/display/converter/edm/widgets/Convert_relatedDisplayClass.java b/app/display/convert-edm/src/main/java/org/csstudio/display/converter/edm/widgets/Convert_relatedDisplayClass.java
index 684b877f27..155fd092b2 100644
--- a/app/display/convert-edm/src/main/java/org/csstudio/display/converter/edm/widgets/Convert_relatedDisplayClass.java
+++ b/app/display/convert-edm/src/main/java/org/csstudio/display/converter/edm/widgets/Convert_relatedDisplayClass.java
@@ -7,50 +7,46 @@
*******************************************************************************/
package org.csstudio.display.converter.edm.widgets;
-import static org.csstudio.display.converter.edm.Converter.logger;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.logging.Level;
-
import org.csstudio.display.builder.model.Widget;
import org.csstudio.display.builder.model.persist.NamedWidgetColors;
-import org.csstudio.display.builder.model.properties.ActionInfo;
import org.csstudio.display.builder.model.properties.ActionInfos;
-import org.csstudio.display.builder.model.properties.OpenDisplayActionInfo;
-import org.csstudio.display.builder.model.properties.OpenDisplayActionInfo.Target;
+import org.csstudio.display.builder.model.spi.ActionInfo;
import org.csstudio.display.builder.model.widgets.ActionButtonWidget;
import org.csstudio.display.converter.edm.EdmConverter;
import org.csstudio.opibuilder.converter.model.EdmBoolean;
import org.csstudio.opibuilder.converter.model.EdmString;
import org.csstudio.opibuilder.converter.model.EdmWidget;
import org.csstudio.opibuilder.converter.model.Edm_relatedDisplayClass;
+import org.csstudio.display.actions.OpenDisplayAction;
import org.phoebus.framework.macros.Macros;
-/** Convert an EDM widget into Display Builder counterpart
- * @author Kay Kasemir
- * @author Matevz, Lei Hu, Xihui Chen et al - Original logic in Opi_.. converter
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+
+import static org.csstudio.display.converter.edm.Converter.logger;
+
+/**
+ * Convert an EDM widget into Display Builder counterpart
+ *
+ * @author Kay Kasemir
+ * @author Matevz, Lei Hu, Xihui Chen et al - Original logic in Opi_.. converter
*/
@SuppressWarnings("nls")
-public class Convert_relatedDisplayClass extends ConverterBase
-{
- public Convert_relatedDisplayClass(final EdmConverter converter, final Widget parent, final Edm_relatedDisplayClass t)
- {
+public class Convert_relatedDisplayClass extends ConverterBase {
+ public Convert_relatedDisplayClass(final EdmConverter converter, final Widget parent, final Edm_relatedDisplayClass t) {
super(converter, parent, t);
- if (t.isInvisible())
- {
+ if (t.isInvisible()) {
widget.propBackgroundColor().setValue(NamedWidgetColors.TRANSPARENT);
widget.propTransparent().setValue(true);
- }
- else
+ } else
convertColor(t.getBgColor(), widget.propBackgroundColor());
convertColor(t.getFgColor(), widget.propForegroundColor());
convertFont(t.getFont(), widget.propFont());
List actions = new ArrayList<>();
- for (int i=0; i
-{
- public Convert_shellCmdClass(final EdmConverter converter, final Widget parent, final Edm_shellCmdClass t)
- {
+public class Convert_shellCmdClass extends ConverterBase {
+ public Convert_shellCmdClass(final EdmConverter converter, final Widget parent, final Edm_shellCmdClass t) {
super(converter, parent, t);
- if (t.isInvisible())
- {
+ if (t.isInvisible()) {
widget.propBackgroundColor().setValue(NamedWidgetColors.TRANSPARENT);
widget.propTransparent().setValue(true);
- }
- else
+ } else
convertColor(t.getBgColor(), widget.propBackgroundColor());
convertColor(t.getFgColor(), widget.propForegroundColor());
convertFont(t.getFont(), widget.propFont());
List actions = new ArrayList<>();
- for (int i=0; i
+
diff --git a/app/display/convert-medm/pom.xml b/app/display/convert-medm/pom.xml
index da116c3361..9b5e63c52e 100644
--- a/app/display/convert-medm/pom.xml
+++ b/app/display/convert-medm/pom.xml
@@ -29,5 +29,10 @@
app-display-model
4.7.4-SNAPSHOT
+
+ org.phoebus
+ app-display-actions
+ 4.7.4-SNAPSHOT
+
diff --git a/app/display/convert-medm/src/main/java/org/csstudio/opibuilder/adl2boy/translator/MessageButton2Model.java b/app/display/convert-medm/src/main/java/org/csstudio/opibuilder/adl2boy/translator/MessageButton2Model.java
index 1d6b2f6065..6df8392c03 100644
--- a/app/display/convert-medm/src/main/java/org/csstudio/opibuilder/adl2boy/translator/MessageButton2Model.java
+++ b/app/display/convert-medm/src/main/java/org/csstudio/opibuilder/adl2boy/translator/MessageButton2Model.java
@@ -1,29 +1,28 @@
/*************************************************************************\
-* Copyright (c) 2010 UChicago Argonne, LLC
-* This file is distributed subject to a Software License Agreement found
-* in the file LICENSE that is included with this distribution.
-/*************************************************************************/
+ * Copyright (c) 2010 UChicago Argonne, LLC
+ * This file is distributed subject to a Software License Agreement found
+ * in the file LICENSE that is included with this distribution.
+ /*************************************************************************/
package org.csstudio.opibuilder.adl2boy.translator;
-import static org.csstudio.display.converter.medm.Converter.logger;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.logging.Level;
-
import org.csstudio.display.builder.model.ChildrenProperty;
import org.csstudio.display.builder.model.Widget;
-import org.csstudio.display.builder.model.properties.ActionInfo;
-import org.csstudio.display.builder.model.properties.ActionInfos;
import org.csstudio.display.builder.model.properties.WidgetColor;
-import org.csstudio.display.builder.model.properties.WritePVActionInfo;
+import org.csstudio.display.builder.model.spi.ActionInfo;
import org.csstudio.display.builder.model.widgets.ActionButtonWidget;
import org.csstudio.display.builder.model.widgets.BoolButtonWidget;
import org.csstudio.display.builder.model.widgets.BoolButtonWidget.Mode;
import org.csstudio.display.builder.model.widgets.VisibleWidget;
import org.csstudio.utility.adlparser.fileParser.ADLWidget;
import org.csstudio.utility.adlparser.fileParser.widgets.MessageButton;
+import org.csstudio.display.actions.WritePVAction;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+
+import static org.csstudio.display.converter.medm.Converter.logger;
@SuppressWarnings("nls")
public class MessageButton2Model extends AbstractADL2Model {
@@ -38,8 +37,7 @@ public void processWidget(ADLWidget adlWidget) throws Exception {
setADLObjectProps(messageButtonWidget, widgetModel);
setADLControlProps(messageButtonWidget, widgetModel);
- if (widgetModel instanceof BoolButtonWidget)
- {
+ if (widgetModel instanceof BoolButtonWidget) {
final BoolButtonWidget bool_button = (BoolButtonWidget) widgetModel;
// Don't show LED.
@@ -52,11 +50,9 @@ public void processWidget(ADLWidget adlWidget) throws Exception {
WidgetColor color = bool_button.propBackgroundColor().getValue();
bool_button.propOffColor().setValue(color);
// Darken for 'pressed' state
- color = new WidgetColor(color.getRed()*80/100, color.getGreen()*80/100, color.getBlue()*80/100);
+ color = new WidgetColor(color.getRed() * 80 / 100, color.getGreen() * 80 / 100, color.getBlue() * 80 / 100);
bool_button.propOnColor().setValue(color);
- }
- else
- {
+ } else {
final ActionButtonWidget action_button = (ActionButtonWidget) widgetModel;
action_button.propText().setValue(messageButtonWidget.getLabel());
final List actions = new ArrayList<>();
@@ -64,53 +60,43 @@ public void processWidget(ADLWidget adlWidget) throws Exception {
final String message;
final String press_msg = messageButtonWidget.getPress_msg();
final String release_msg = messageButtonWidget.getRelease_msg();
- if (!press_msg.isEmpty() && release_msg.isEmpty())
+ if (!press_msg.isEmpty() && release_msg.isEmpty())
message = press_msg;
- else if (press_msg.isEmpty() && !release_msg.isEmpty())
- {
- logger.log(Level.FINE, "Message Button '" + messageButtonWidget.getLabel() + "' has no press_msg, so release_msg='" + release_msg + "' is written to " + messageButtonWidget.getAdlControl().getChan());
+ else if (press_msg.isEmpty() && !release_msg.isEmpty()) {
+ logger.log(Level.FINE, "Message Button '" + messageButtonWidget.getLabel() + "' has no press_msg, so release_msg='" + release_msg + "' is written to " + messageButtonWidget.getAdlControl().getChan());
message = release_msg;
- }
- else if (!press_msg.isEmpty() && !release_msg.isEmpty())
- {
- logger.log(Level.WARNING, "Message Button '" + messageButtonWidget.getLabel() + "' release_msg='" + release_msg + "' is ignored. Only writing press_msg='" + press_msg + "' to " + messageButtonWidget.getAdlControl().getChan());
+ } else if (!press_msg.isEmpty() && !release_msg.isEmpty()) {
+ logger.log(Level.WARNING, "Message Button '" + messageButtonWidget.getLabel() + "' release_msg='" + release_msg + "' is ignored. Only writing press_msg='" + press_msg + "' to " + messageButtonWidget.getAdlControl().getChan());
message = press_msg;
- }
- else
- {
- logger.log(Level.WARNING, "Message Button '" + messageButtonWidget.getLabel() + "' has neither press_msg nor release_msg, writing empty string to " + messageButtonWidget.getAdlControl().getChan());;
+ } else {
+ logger.log(Level.WARNING, "Message Button '" + messageButtonWidget.getLabel() + "' has neither press_msg nor release_msg, writing empty string to " + messageButtonWidget.getAdlControl().getChan());
+ ;
message = "";
}
- actions.add(new WritePVActionInfo("Write", messageButtonWidget.getAdlControl().getChan(), message));
-
- widgetModel.propActions().setValue(new ActionInfos(actions));
+ actions.add(new WritePVAction("Write", messageButtonWidget.getAdlControl().getChan(), message));
}
}
@Override
public void makeModel(ADLWidget adlWidget,
- Widget parentModel) {
+ Widget parentModel) {
// Turn 'message' button that writes 0/1 into 'bool' button
MessageButton messageButtonWidget = new MessageButton(adlWidget);
String press_msg = messageButtonWidget.getPress_msg();
String release_msg = messageButtonWidget.getRelease_msg();
- if ("1".equals(press_msg) && "0".equals(release_msg))
- {
+ if ("1".equals(press_msg) && "0".equals(release_msg)) {
final BoolButtonWidget bool_button = new BoolButtonWidget();
bool_button.propMode().setValue(Mode.PUSH);
logger.log(Level.FINE, "Message button for press=1, release=0 converted into boolean push button");
widgetModel = bool_button;
- }
- else if ("0".equals(press_msg) && "1".equals(release_msg))
- {
+ } else if ("0".equals(press_msg) && "1".equals(release_msg)) {
final BoolButtonWidget bool_button = new BoolButtonWidget();
bool_button.propMode().setValue(Mode.PUSH_INVERTED);
logger.log(Level.FINE, "Message button for press=0, release=1 converted into inverted boolean push button");
widgetModel = bool_button;
- }
- else // Messages other than 0,1 need action button
- widgetModel = new ActionButtonWidget();
+ } else // Messages other than 0,1 need action button
+ widgetModel = new ActionButtonWidget();
ChildrenProperty.getChildren(parentModel).addChild(widgetModel);
}
diff --git a/app/display/convert-medm/src/main/java/org/csstudio/opibuilder/adl2boy/translator/RelatedDisplay2Model.java b/app/display/convert-medm/src/main/java/org/csstudio/opibuilder/adl2boy/translator/RelatedDisplay2Model.java
index 5ddb0f613d..4531eaaefb 100644
--- a/app/display/convert-medm/src/main/java/org/csstudio/opibuilder/adl2boy/translator/RelatedDisplay2Model.java
+++ b/app/display/convert-medm/src/main/java/org/csstudio/opibuilder/adl2boy/translator/RelatedDisplay2Model.java
@@ -11,15 +11,14 @@
import org.csstudio.display.builder.model.ChildrenProperty;
import org.csstudio.display.builder.model.Widget;
-import org.csstudio.display.builder.model.properties.ActionInfo;
import org.csstudio.display.builder.model.properties.ActionInfos;
-import org.csstudio.display.builder.model.properties.OpenDisplayActionInfo;
-import org.csstudio.display.builder.model.properties.OpenDisplayActionInfo.Target;
import org.csstudio.display.builder.model.properties.WidgetColor;
+import org.csstudio.display.builder.model.spi.ActionInfo;
import org.csstudio.display.builder.model.widgets.ActionButtonWidget;
import org.csstudio.utility.adlparser.fileParser.ADLWidget;
import org.csstudio.utility.adlparser.fileParser.widgetParts.RelatedDisplayItem;
import org.csstudio.utility.adlparser.fileParser.widgets.RelatedDisplay;
+import org.csstudio.display.actions.OpenDisplayAction;
import org.phoebus.framework.macros.Macros;
/**
@@ -60,7 +59,7 @@ public void processWidget(ADLWidget adlWidget) throws Exception {
// allow user to use 'Ctrl' etc at runtime.
// Users can always close the new tab, but have no other way
// to get new tab.
- final Target target = displays.length == 1 ? Target.REPLACE : Target.TAB;
+ final OpenDisplayAction.Target target = displays.length == 1 ? OpenDisplayAction.Target.REPLACE : OpenDisplayAction.Target.TAB;
for (RelatedDisplayItem display : displays)
{
final ActionInfo action = createOpenDisplayAction(display, target);
@@ -88,7 +87,7 @@ public void processWidget(ADLWidget adlWidget) throws Exception {
* @param target
* @return ActionInfo
*/
- public ActionInfo createOpenDisplayAction(final RelatedDisplayItem rdDisplay, Target target)
+ public ActionInfo createOpenDisplayAction(final RelatedDisplayItem rdDisplay, OpenDisplayAction.Target target)
{
final String file = rdDisplay.getFileName()
.replaceAll("\"", "")
@@ -108,7 +107,7 @@ public ActionInfo createOpenDisplayAction(final RelatedDisplayItem rdDisplay, Ta
target = target.TAB;
}
- return new OpenDisplayActionInfo(description, file, getMacros(rdDisplay), target);
+ return new OpenDisplayAction(description, file, getMacros(rdDisplay), target);
}
public Macros getMacros(RelatedDisplayItem rdDisplay)
diff --git a/app/display/convert-medm/src/main/java/org/csstudio/opibuilder/adl2boy/translator/ShellCommand2Model.java b/app/display/convert-medm/src/main/java/org/csstudio/opibuilder/adl2boy/translator/ShellCommand2Model.java
index c70fdfc13c..49ea35506e 100644
--- a/app/display/convert-medm/src/main/java/org/csstudio/opibuilder/adl2boy/translator/ShellCommand2Model.java
+++ b/app/display/convert-medm/src/main/java/org/csstudio/opibuilder/adl2boy/translator/ShellCommand2Model.java
@@ -5,14 +5,13 @@
import org.csstudio.display.builder.model.ChildrenProperty;
import org.csstudio.display.builder.model.Widget;
-import org.csstudio.display.builder.model.properties.ActionInfo;
-import org.csstudio.display.builder.model.properties.ActionInfos;
-import org.csstudio.display.builder.model.properties.ExecuteCommandActionInfo;
import org.csstudio.display.builder.model.properties.WidgetColor;
+import org.csstudio.display.builder.model.spi.ActionInfo;
import org.csstudio.display.builder.model.widgets.ActionButtonWidget;
import org.csstudio.utility.adlparser.fileParser.ADLWidget;
import org.csstudio.utility.adlparser.fileParser.widgetParts.CommandItem;
import org.csstudio.utility.adlparser.fileParser.widgets.ShellCommand;
+import org.csstudio.display.actions.ExecuteCommandAction;
public class ShellCommand2Model extends AbstractADL2Model {
@@ -32,11 +31,10 @@ public void processWidget(ADLWidget adlWidget) throws Exception {
if (! cmd.getCommandName().replaceAll("\"", "").isEmpty())
{
final String command = cmd.getCommandName() + " " + cmd.getArgs();
- actions.add(new ExecuteCommandActionInfo(cmd.getLabel(), command));
+ actions.add(new ExecuteCommandAction(cmd.getLabel(), command));
}
widgetModel.propText().setValue(commandWidget.getLabel());
- widgetModel.propActions().setValue(new ActionInfos(actions));
}
@Override
diff --git a/app/display/editor/src/main/java/org/csstudio/display/builder/editor/properties/ActionsPropertyBinding.java b/app/display/editor/src/main/java/org/csstudio/display/builder/editor/properties/ActionsPropertyBinding.java
index a743f0b02c..150ab0f0d0 100644
--- a/app/display/editor/src/main/java/org/csstudio/display/builder/editor/properties/ActionsPropertyBinding.java
+++ b/app/display/editor/src/main/java/org/csstudio/display/builder/editor/properties/ActionsPropertyBinding.java
@@ -7,9 +7,9 @@
*******************************************************************************/
package org.csstudio.display.builder.editor.properties;
-import java.util.List;
-import java.util.Optional;
-
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
+import javafx.scene.control.Button;
import org.csstudio.display.builder.editor.undo.SetWidgetPropertyAction;
import org.csstudio.display.builder.model.Widget;
import org.csstudio.display.builder.model.WidgetPropertyListener;
@@ -18,40 +18,43 @@
import org.csstudio.display.builder.representation.javafx.actionsdialog.ActionsDialog;
import org.phoebus.ui.undo.UndoableActionManager;
-import javafx.event.ActionEvent;
-import javafx.event.EventHandler;
-import javafx.scene.control.Button;
+import java.util.List;
+import java.util.Optional;
-/** Bidirectional binding between an actions property in model and Java FX Node in the property panel
- * @author Kay Kasemir
+/**
+ * Bidirectional binding between an actions property in model and Java FX Node in the property panel
+ *
+ * @author Kay Kasemir
*/
@SuppressWarnings("nls")
public class ActionsPropertyBinding
- extends WidgetPropertyBinding