/** * This file is protected by Copyright. * Please refer to the COPYRIGHT file distributed with this source distribution. * * This file is part of REDHAWK IDE. * * All rights reserved. This program and the accompanying materials are made available under * the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html. * */ package gov.redhawk.sca.internal.ui.wizards; import gov.redhawk.sca.util.PluginUtil; import java.util.Arrays; import java.util.List; import mil.jpeojtrs.sca.partitioning.ComponentInstantiation; import mil.jpeojtrs.sca.prf.AbstractProperty; import mil.jpeojtrs.sca.prf.Enumeration; import mil.jpeojtrs.sca.prf.Enumerations; import mil.jpeojtrs.sca.prf.PropertyValueType; import mil.jpeojtrs.sca.prf.Simple; import mil.jpeojtrs.sca.prf.SimpleRef; import mil.jpeojtrs.sca.prf.SimpleSequence; import mil.jpeojtrs.sca.prf.SimpleSequenceRef; import mil.jpeojtrs.sca.prf.util.PropertiesUtil; import mil.jpeojtrs.sca.util.AnyUtils; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.ColumnViewer; import org.eclipse.jface.viewers.ComboBoxViewerCellEditor; import org.eclipse.jface.viewers.EditingSupport; import org.eclipse.jface.viewers.ICellEditorValidator; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import CF.DataType; /** * */ public class ValueEditingSupport extends EditingSupport { private final List<DataType> overwrittenProps; /** * @param viewer * @param componentPropertiesPropertySection */ public ValueEditingSupport(final ColumnViewer viewer, final List<DataType> overwrittenProps) { super(viewer); this.overwrittenProps = overwrittenProps; } @Override protected boolean canEdit(final Object element) { if (element instanceof AbstractProperty) { return PropertiesUtil.canOverride((AbstractProperty) element); } return false; } @Override protected CellEditor getCellEditor(final Object element) { if (element instanceof Simple) { final Simple simple = (Simple) element; if (simple.getEnumerations() != null) { final Enumerations enumList = simple.getEnumerations(); final ComboBoxViewerCellEditor editor = new ComboBoxViewerCellEditor((Composite) getViewer().getControl(), SWT.READ_ONLY); editor.setContentProvider(new ArrayContentProvider()); editor.setLabelProvider(new LabelProvider() { @Override public String getText(final Object element) { return ((Enumeration) element).getLabel(); } }); editor.setInput(enumList.getEnumeration()); return editor; } else if (simple.getType() == PropertyValueType.BOOLEAN) { final ComboBoxViewerCellEditor editor = new ComboBoxViewerCellEditor((Composite) getViewer().getControl(), SWT.READ_ONLY); editor.setContentProvider(new ArrayContentProvider()); editor.setLabelProvider(new LabelProvider()); editor.setInput(new Object[] { true, false }); return editor; } else { final TextCellEditor editor = new TextCellEditor((Composite) getViewer().getControl()); editor.setValidator(new ICellEditorValidator() { @Override public String isValid(final Object value) { try { AnyUtils.convertString(value.toString(), simple.getType().getLiteral(), simple.isComplex()); return null; } catch (final Exception e) { // SUPPRESS CHECKSTYLE Logged Error return e.getMessage(); } } }); return editor; } } else if (element instanceof SimpleSequence) { final SimpleSequence ss = (SimpleSequence) element; return new ValuesDialogEditor((Composite) getViewer().getControl(), ss.getType(), ss.isComplex()); } // TODO Auto-generated method stub return null; } private ComponentInstantiation getComponentInstantiation() { return (ComponentInstantiation) getViewer().getInput(); } @Override protected Object getValue(final Object element) { if (element instanceof Simple) { final Simple simple = (Simple) element; final SimpleRef ref = Util.getRef(simple, getComponentInstantiation()); final DataType override = getOverride(simple.getId()); if (override != null) { return AnyUtils.convertAny(override.value).toString(); } else if (ref != null) { return getValue(simple.getEnumerations(), ref.getValue()).toString(); } else { return getValue(simple.getEnumerations(), simple.getValue()).toString(); } } else if (element instanceof SimpleSequence) { final SimpleSequence simple = (SimpleSequence) element; final SimpleSequenceRef ref = Util.getRef(simple, getComponentInstantiation()); final DataType override = getOverride(simple.getId()); if (override != null) { return Arrays.toString((Object[]) AnyUtils.convertAny(override.value)); } else if (ref != null) { if (ref.getValues() != null) { return ref.getValues().getValue().toArray(new String[ref.getValues().getValue().size()]); } } else { if (simple.getValues() != null) { return simple.getValues().getValue().toArray(new String[simple.getValues().getValue().size()]); } } } return null; } @Override protected void setValue(final Object element, Object value) { final ComponentInstantiation inst = getComponentInstantiation(); inst.getComponentProperties(); if (element instanceof Simple) { final Simple simple = (Simple) element; final SimpleRef ref = Util.getRef(simple, inst); String defaultValue = simple.getValue(); if (ref != null) { defaultValue = ref.getValue(); } DataType override = getOverride(simple.getId()); if (override == null) { if (value instanceof Enumeration) { value = ((Enumeration) value).getValue(); } if (!(value == null || "".equals(value.toString()) || value.equals(defaultValue))) { // Create new component property override = new DataType(simple.getId(), AnyUtils.toAny(value, simple.getType().toString(), simple.isComplex())); this.overwrittenProps.add(override); } } else { if (value == null || "".equals(value.toString()) || value.equals(defaultValue)) { // Revert to default this.overwrittenProps.remove(override); } else { override.value = AnyUtils.toAny(value, simple.getType().toString(), simple.isComplex()); } } } else if (element instanceof SimpleSequence) { final SimpleSequence seq = (SimpleSequence) element; final SimpleSequenceRef ref = Util.getRef(seq, inst.getComponentProperties()); String[] valuesArray = new String[0]; if (value instanceof String[]) { valuesArray = (String[]) value; } else if (value instanceof String) { valuesArray = ((String) value).substring(1, ((String) value).length() - 1).split(", "); } final String[] defaultArray = new String[0]; if ((seq.getValues() != null) && (ref == null)) { seq.getValues().getValue().toArray(new String[seq.getValues().getValue().size()]); } else if (ref != null) { if (ref.getValues() != null) { ref.getValues().getValue().toArray(new String[ref.getValues().getValue().size()]); } } DataType override = getOverride(seq.getId()); if (override == null) { if (value instanceof Enumeration) { value = ((Enumeration) value).getValue(); } if (!(value == null || valuesArray.length == 0 || Arrays.deepEquals(valuesArray, defaultArray))) { // Create new component property override = new DataType(seq.getId(), AnyUtils.toAny(valuesArray, seq.getType().toString(), seq.isComplex())); this.overwrittenProps.add(override); } } else { if (value == null || valuesArray.length == 0 || Arrays.deepEquals(valuesArray, defaultArray)) { // Revert to default this.overwrittenProps.remove(override); } else { override.value = AnyUtils.toAny(valuesArray, seq.getType().toString(), seq.isComplex()); } } } final ColumnViewer myViewer = getViewer(); if (myViewer != null) { myViewer.refresh(); } } private Object getValue(final Enumerations enumerations, final String value) { if (enumerations != null) { for (final Enumeration enumeration : enumerations.getEnumeration()) { if (PluginUtil.equals(enumeration.getValue(), value)) { return enumeration; } } } return (value == null) ? "" : value; // SUPPRESS CHECKSTYLE AvoidInLine } private DataType getOverride(final String id) { for (final DataType dt : this.overwrittenProps) { if (dt.id.equals(id)) { return dt; } } return null; } }