Search in sources :

Example 1 with ArrayDataType

use of org.csstudio.opibuilder.widgets.model.ArrayModel.ArrayDataType in project yamcs-studio by yamcs.

the class ArrayEditPart method hookChild.

/**
 *Hook child with array index
 * @param editPart
 */
protected void hookChild(final EditPart editPart, final int indexOfArrayChild, boolean directChild) {
    if (editPart instanceof AbstractContainerEditpart) {
        for (Object grandChild : ((AbstractContainerEditpart) editPart).getChildren()) hookChild((EditPart) grandChild, indexOfArrayChild, false);
    }
    AbstractWidgetModel childModel = ((AbstractBaseEditPart) editPart).getWidgetModel();
    if (directChild) {
        if (getExecutionMode() == ExecutionMode.EDIT_MODE) {
            for (String propId : INVISIBLE_CHILD_PROPIDS) try {
                childModel.setPropertyVisibleAndSavable(propId, false, true);
            } catch (NonExistPropertyException e) {
            }
        }
        try {
            childModel.setScaleOptions(false, false, false);
            // $NON-NLS-1$
            childModel.setPropertyValue(IPVWidgetModel.PROP_PVNAME, "");
            childModel.setPropertyValue(IPVWidgetModel.PROP_BORDER_ALARMSENSITIVE, false);
        } catch (NonExistPropertyException e) {
        }
    }
    if (getExecutionMode() == ExecutionMode.RUN_MODE && editPart instanceof IPVWidgetEditpart) {
        ((IPVWidgetEditpart) editPart).addSetPVValueListener(new ISetPVValueListener() {

            // Capture set PV value event on children and write to the PV on
            // the array widget
            @Override
            public void beforeSetPVValue(String pvPropId, Object value) {
                int index = getArrayFigure().getIndex() + indexOfArrayChild;
                try {
                    ArrayDataType dataType = getWidgetModel().getDataType();
                    switch(dataType) {
                        case OBJECT_ARRAY:
                            ((Object[]) valueArray)[index] = value;
                            break;
                        case DOUBLE_ARRAY:
                            double doubleValue;
                            if (value instanceof Number)
                                doubleValue = ((Number) value).doubleValue();
                            else {
                                doubleValue = Double.valueOf(value.toString());
                            }
                            ((double[]) valueArray)[index] = doubleValue;
                            break;
                        case BYTE_ARRAY:
                            byte byteValue;
                            if (value instanceof Number)
                                byteValue = ((Number) value).byteValue();
                            else {
                                byteValue = Byte.valueOf(value.toString());
                            }
                            ((byte[]) valueArray)[index] = byteValue;
                            break;
                        case INT_ARRAY:
                            int intValue;
                            if (value instanceof Number)
                                intValue = ((Number) value).intValue();
                            else {
                                intValue = Byte.valueOf(value.toString());
                            }
                            ((int[]) valueArray)[index] = intValue;
                            break;
                        case SHORT_ARRAY:
                            short shortValue;
                            if (value instanceof Number)
                                shortValue = ((Number) value).shortValue();
                            else {
                                shortValue = Short.valueOf(value.toString());
                            }
                            ((short[]) valueArray)[index] = shortValue;
                            break;
                        case FLOAT_ARRAY:
                            float floatValue;
                            if (value instanceof Number)
                                floatValue = ((Number) value).floatValue();
                            else {
                                floatValue = Float.valueOf(value.toString());
                            }
                            ((float[]) valueArray)[index] = floatValue;
                            break;
                        case LONG_ARRAY:
                            long longValue;
                            if (value instanceof Number)
                                longValue = ((Number) value).longValue();
                            else {
                                longValue = Long.valueOf(value.toString());
                            }
                            ((long[]) valueArray)[index] = longValue;
                            break;
                        case STRING_ARRAY:
                            ((String[]) valueArray)[index] = value.toString();
                            break;
                        default:
                            break;
                    }
                    if (getPV() != null)
                        // but EPICS PV doesn't support write long[]. should be removed after switched to pv manager
                        if (valueArray instanceof long[]) {
                            int[] temp = new int[((long[]) valueArray).length];
                            for (int i = 0; i < ((long[]) valueArray).length; i++) temp[i] = (int) ((long[]) valueArray)[i];
                            setPVValue(ArrayModel.PROP_PVNAME, temp);
                        } else
                            setPVValue(ArrayModel.PROP_PVNAME, valueArray);
                } catch (NumberFormatException e) {
                    String msg = NLS.bind("Writing failed: The input data {0} is not compatible with array data type.", value.toString());
                    // recover the original data in children widgets.
                    setValue(getValue());
                    ErrorHandlerUtil.handleError(msg, e);
                }
            }
        });
    }
}
Also used : NonExistPropertyException(org.csstudio.opibuilder.model.NonExistPropertyException) AbstractBaseEditPart(org.csstudio.opibuilder.editparts.AbstractBaseEditPart) GraphicalEditPart(org.eclipse.gef.GraphicalEditPart) EditPart(org.eclipse.gef.EditPart) AbstractBaseEditPart(org.csstudio.opibuilder.editparts.AbstractBaseEditPart) VString(org.diirt.vtype.VString) IPVWidgetEditpart(org.csstudio.opibuilder.editparts.IPVWidgetEditpart) AbstractWidgetModel(org.csstudio.opibuilder.model.AbstractWidgetModel) AbstractContainerEditpart(org.csstudio.opibuilder.editparts.AbstractContainerEditpart) ArrayDataType(org.csstudio.opibuilder.widgets.model.ArrayModel.ArrayDataType)

Aggregations

AbstractBaseEditPart (org.csstudio.opibuilder.editparts.AbstractBaseEditPart)1 AbstractContainerEditpart (org.csstudio.opibuilder.editparts.AbstractContainerEditpart)1 IPVWidgetEditpart (org.csstudio.opibuilder.editparts.IPVWidgetEditpart)1 AbstractWidgetModel (org.csstudio.opibuilder.model.AbstractWidgetModel)1 NonExistPropertyException (org.csstudio.opibuilder.model.NonExistPropertyException)1 ArrayDataType (org.csstudio.opibuilder.widgets.model.ArrayModel.ArrayDataType)1 VString (org.diirt.vtype.VString)1 EditPart (org.eclipse.gef.EditPart)1 GraphicalEditPart (org.eclipse.gef.GraphicalEditPart)1