All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.csstudio.opibuilder.adl2boy.translator.MessageButton2Model Maven / Gradle / Ivy

/*************************************************************************\
* 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.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;

@SuppressWarnings("nls")
public class MessageButton2Model extends AbstractADL2Model {

    public MessageButton2Model(ADLWidget adlWidget, WidgetColor[] colorMap, Widget parentModel) throws Exception {
        super(adlWidget, colorMap, parentModel);
    }

    @Override
    public void processWidget(ADLWidget adlWidget) throws Exception {
        MessageButton messageButtonWidget = new MessageButton(adlWidget);
        setADLObjectProps(messageButtonWidget, widgetModel);
        setADLControlProps(messageButtonWidget, widgetModel);

        if (widgetModel instanceof BoolButtonWidget)
        {
            final BoolButtonWidget bool_button = (BoolButtonWidget) widgetModel;

            // Don't show LED.
            bool_button.propShowLED().setValue(false);

            // In either state, show the 'text' and 'background color'
            bool_button.propOnLabel().setValue(messageButtonWidget.getLabel());
            bool_button.propOffLabel().setValue(messageButtonWidget.getLabel());

            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);
            bool_button.propOnColor().setValue(color);
        }
        else
        {
            final ActionButtonWidget action_button = (ActionButtonWidget) widgetModel;
            action_button.propText().setValue(messageButtonWidget.getLabel());
            final List actions = new ArrayList<>();

            final String message;
            final String press_msg = messageButtonWidget.getPress_msg();
            final String release_msg = messageButtonWidget.getRelease_msg();
            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());
                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());
                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());;
                message = "";
            }
            actions.add(new WritePVActionInfo("Write", messageButtonWidget.getAdlControl().getChan(), message));

            widgetModel.propActions().setValue(new ActionInfos(actions));
        }
    }

    @Override
    public void makeModel(ADLWidget adlWidget,
            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))
        {
            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))
        {
            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();

        ChildrenProperty.getChildren(parentModel).addChild(widgetModel);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy