/**
* 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.diagram.sheet.properties;
import gov.redhawk.model.sca.ScaAbstractProperty;
import gov.redhawk.model.sca.ScaComponent;
import gov.redhawk.model.sca.ScaFactory;
import gov.redhawk.model.sca.ScaSimpleProperty;
import gov.redhawk.model.sca.ScaSimpleSequenceProperty;
import gov.redhawk.model.sca.ScaStructProperty;
import gov.redhawk.model.sca.ScaStructSequenceProperty;
import mil.jpeojtrs.sca.partitioning.ComponentInstantiation;
import mil.jpeojtrs.sca.partitioning.ComponentProperties;
import mil.jpeojtrs.sca.partitioning.PartitioningFactory;
import mil.jpeojtrs.sca.partitioning.PartitioningPackage;
import mil.jpeojtrs.sca.prf.AbstractPropertyRef;
import mil.jpeojtrs.sca.prf.PrfPackage;
import mil.jpeojtrs.sca.prf.SimpleRef;
import mil.jpeojtrs.sca.prf.SimpleSequenceRef;
import mil.jpeojtrs.sca.prf.StructRef;
import mil.jpeojtrs.sca.prf.StructSequenceRef;
import mil.jpeojtrs.sca.spd.SoftPkg;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.util.EContentAdapter;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.util.FeatureMap.ValueListIterator;
import org.eclipse.emf.edit.command.SetCommand;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.domain.IEditingDomainProvider;
import org.eclipse.jface.viewers.TreeViewer;
/**
* @since 5.0
*/
public class ComponentInstantiationPropertyViewerAdapter {
private ComponentInstantiation input = null;
private final ScaComponent component = ScaFactory.eINSTANCE.createScaComponent();
private TreeViewer viewer;
private final IEditingDomainProvider editingDomainProvider;
private final Adapter contentAdapter = new EContentAdapter() {
@Override
public void notifyChanged(final Notification notification) {
super.notifyChanged(notification);
if (!notification.isTouch() && !ignore) {
mergeValues();
}
}
};
private boolean ignore = false;
public ComponentInstantiationPropertyViewerAdapter(final IEditingDomainProvider provider) {
editingDomainProvider = provider;
component.eAdapters().add(contentAdapter);
}
public void setViewer(final TreeViewer viewer) {
this.viewer = viewer;
if (this.viewer != null) {
this.viewer.setInput(component);
}
}
/**
* @since 6.0
*/
public TreeViewer getViewer() {
return viewer;
}
private void mergeValues() {
ComponentProperties cp = PartitioningFactory.eINSTANCE.createComponentProperties();
for (final ScaAbstractProperty< ? > prop : component.getProperties()) {
if (!prop.isDefaultValue()) {
AbstractPropertyRef< ? > propertyRef = prop.createPropertyRef();
switch (propertyRef.eClass().getClassifierID()) {
case PrfPackage.SIMPLE_REF:
cp.getSimpleRef().add((SimpleRef) propertyRef);
break;
case PrfPackage.SIMPLE_SEQUENCE_REF:
cp.getSimpleSequenceRef().add((SimpleSequenceRef) propertyRef);
break;
case PrfPackage.STRUCT_REF:
cp.getStructRef().add((StructRef) propertyRef);
break;
case PrfPackage.STRUCT_SEQUENCE_REF:
cp.getStructSequenceRef().add((StructSequenceRef) propertyRef);
break;
default:
throw new IllegalArgumentException("Invalid property");
}
}
}
if (cp.getProperties().isEmpty()) {
cp = null;
}
if (!EcoreUtil.equals(cp, input.getComponentProperties()) && getEditingDomain() != null && getEditingDomain().getCommandStack() != null) {
getEditingDomain().getCommandStack().execute(
SetCommand.create(getEditingDomain(), input, PartitioningPackage.Literals.COMPONENT_INSTANTIATION__COMPONENT_PROPERTIES, cp));
}
}
public EditingDomain getEditingDomain() {
return editingDomainProvider.getEditingDomain();
}
public final void setInput(final ComponentInstantiation inst) {
ignore = true;
input = inst;
if (input != null) {
final SoftPkg spd = input.getPlacement().getComponentFileRef().getFile().getSoftPkg();
component.unsetProfileObj();
component.setProfileObj(spd);
component.fetchProperties(null);
if (input.getComponentProperties() != null) {
for (final ValueListIterator<Object> iterator = input.getComponentProperties().getProperties().valueListIterator(); iterator.hasNext();) {
final Object obj = iterator.next();
if (obj instanceof AbstractPropertyRef< ? >) {
final AbstractPropertyRef< ? > ref = (AbstractPropertyRef< ? >) obj;
final ScaAbstractProperty< ? > prop = component.getProperty(ref.getRefID());
if (ref instanceof SimpleRef && prop instanceof ScaSimpleProperty) {
setValue(ref, prop);
} else if (ref instanceof SimpleSequenceRef && prop instanceof ScaSimpleSequenceProperty) {
setValue(ref, prop);
} else if (ref instanceof StructRef && prop instanceof ScaStructProperty) {
setValue(ref, prop);
} else if (ref instanceof StructSequenceRef && prop instanceof ScaStructSequenceProperty) {
setValue(ref, prop);
}
}
}
}
} else {
component.unsetProfileObj();
}
ignore = false;
viewer.refresh();
}
private void setValue(final AbstractPropertyRef< ? > ref, final ScaAbstractProperty< ? > prop) {
prop.fromAny(ref.toAny());
}
/**
* @since 7.0
*/
public void dispose() {
component.eAdapters().remove(contentAdapter);
component.dispose();
}
}