/*******************************************************************************
* 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.ide.sad.internal.ui.properties;
import gov.redhawk.ide.sad.internal.ui.properties.model.SadProperty;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import mil.jpeojtrs.sca.prf.AbstractProperty;
import mil.jpeojtrs.sca.prf.ConfigurationKind;
import mil.jpeojtrs.sca.prf.Enumeration;
import mil.jpeojtrs.sca.prf.Kind;
import mil.jpeojtrs.sca.prf.Simple;
import mil.jpeojtrs.sca.prf.SimpleSequence;
import mil.jpeojtrs.sca.prf.provider.PrfItemProviderAdapterFactory;
import mil.jpeojtrs.sca.sad.SadComponentInstantiation;
import mil.jpeojtrs.sca.sad.provider.SadItemProviderAdapterFactory;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.nebula.widgets.xviewer.XViewer;
import org.eclipse.nebula.widgets.xviewer.XViewerLabelProvider;
import org.eclipse.nebula.widgets.xviewer.core.model.XViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.PlatformUI;
public class PropertiesViewerLabelProvider extends XViewerLabelProvider {
private ComposedAdapterFactory adapterFactory;
private AdapterFactoryLabelProvider labelProvider;
public PropertiesViewerLabelProvider(XViewer viewer) {
super(viewer);
adapterFactory = new ComposedAdapterFactory();
adapterFactory.addAdapterFactory(new SadItemProviderAdapterFactory());
adapterFactory.addAdapterFactory(new PrfItemProviderAdapterFactory());
labelProvider = new AdapterFactoryLabelProvider(adapterFactory);
}
@Override
public boolean isLabelProperty(Object element, String property) {
return false;
}
@Override
public void addListener(ILabelProviderListener listener) {
// do nothing
}
@Override
public void removeListener(ILabelProviderListener listener) {
// do nothing
}
@Override
public void dispose() {
adapterFactory.dispose();
}
@Override
public Image getColumnImage(Object element, XViewerColumn xCol, int columnIndex) throws Exception {
if (columnIndex == 0) {
if (element instanceof SadProperty) {
SadProperty prop = (SadProperty) element;
return labelProvider.getImage(prop.getDefinition());
} else {
return labelProvider.getImage(element);
}
}
return null;
}
@Override
public String getColumnText(Object element, XViewerColumn xCol, int columnIndex) throws Exception {
String retVal = internalGetColumnText(element, xCol, columnIndex);
if (retVal == null) {
return "";
}
return retVal;
}
private String internalGetColumnText(Object element, XViewerColumn xCol, int columnIndex) throws Exception {
if (xCol.equals(PropertiesViewerFactory.ID)) {
return getID(element);
} else if (xCol.equals(PropertiesViewerFactory.NAME)) {
return getName(element);
} else if (xCol.equals(PropertiesViewerFactory.PRF_VALUE)) {
return getPrfValue(element);
} else if (xCol.equals(PropertiesViewerFactory.SAD_VALUE)) {
return getSadValue(element);
} else if (xCol.equals(PropertiesViewerFactory.EXTERNAL)) {
return getExternalValue(element);
} else if (xCol.equals(PropertiesViewerFactory.KIND)) {
return getKind(element);
} else if (xCol.equals(PropertiesViewerFactory.MODE)) {
return getMode(element);
} else if (xCol.equals(PropertiesViewerFactory.TYPE)) {
return getType(element);
} else if (xCol.equals(PropertiesViewerFactory.DESCRIPTION)) {
return getDescription(element);
} else if (xCol.equals(PropertiesViewerFactory.ACTION)) {
return getAction(element);
} else if (xCol.equals(PropertiesViewerFactory.ENUMERATIONS)) {
return getEnumerations(element);
} else if (xCol.equals(PropertiesViewerFactory.RANGE)) {
return getRange(element);
} else if (xCol.equals(PropertiesViewerFactory.UNITS)) {
return getUnits(element);
}
return "";
}
private String getAction(Object element) {
if (element instanceof SadProperty) {
SadProperty prop = (SadProperty) element;
return getAction(prop.getDefinition());
} else if (element instanceof Simple) {
Simple simple = (Simple) element;
if (simple.getAction() != null && simple.getAction().getType() != null) {
return simple.getAction().getType().getLiteral();
}
} else if (element instanceof SimpleSequence) {
SimpleSequence seq = (SimpleSequence) element;
if (seq.getAction() != null && seq.getAction().getType() != null) {
return seq.getAction().getType().getLiteral();
}
}
return "";
}
public String getEnumerations(Object element) {
if (element instanceof SadProperty) {
SadProperty prop = (SadProperty) element;
return getEnumerations(prop.getDefinition());
} else if (element instanceof Simple) {
Simple simple = (Simple) element;
if (simple.getEnumerations() != null) {
List<String> retVal = new ArrayList<String>();
for (Enumeration en : simple.getEnumerations().getEnumeration()) {
retVal.add(en.getLabel() + "=" + en.getValue());
}
return retVal.toString();
} else {
return "";
}
}
return "";
}
public String getRange(Object element) {
if (element instanceof SadProperty) {
SadProperty prop = (SadProperty) element;
return getRange(prop.getDefinition());
} else if (element instanceof Simple) {
Simple simple = (Simple) element;
if (simple.getRange() != null) {
return "[" + simple.getRange().getMin() + ", " + simple.getRange().getMax() + "]";
} else {
return "";
}
} else if (element instanceof SimpleSequence) {
SimpleSequence seq = (SimpleSequence) element;
if (seq.getRange() != null) {
return "[" + seq.getRange().getMin() + ", " + seq.getRange().getMax() + "]";
} else {
return "";
}
}
return "";
}
public String getUnits(Object element) {
if (element instanceof SadProperty) {
SadProperty prop = (SadProperty) element;
return getUnits(prop.getDefinition());
} else if (element instanceof Simple) {
Simple simple = (Simple) element;
return simple.getUnits();
} else if (element instanceof SimpleSequence) {
SimpleSequence seq = (SimpleSequence) element;
return seq.getUnits();
}
return "";
}
public String getExternalValue(Object element) {
if (element instanceof SadProperty) {
SadProperty prop = (SadProperty) element;
if (prop.isAssemblyControllerProperty()) {
String value = prop.getExternalID();
if (value != null) {
return value;
}
return prop.getID();
}
return prop.getExternalID();
}
return "";
}
@Override
public Color getForeground(Object element, XViewerColumn xCol, int columnIndex) {
if (xCol.equals(PropertiesViewerFactory.EXTERNAL)) {
if (element instanceof SadProperty) {
SadProperty prop = (SadProperty) element;
if (prop.isAssemblyControllerProperty() && prop.getExternalID() == null) {
return PlatformUI.getWorkbench().getDisplay().getSystemColor(SWT.COLOR_GRAY);
}
}
}
return super.getForeground(element, xCol, columnIndex);
}
public String getDescription(Object element) {
if (element instanceof SadProperty) {
SadProperty prop = (SadProperty) element;
return prop.getDefinition().getDescription();
}
return "";
}
public String getType(Object element) {
if (element instanceof SadProperty) {
SadProperty prop = (SadProperty) element;
AbstractProperty def = prop.getDefinition();
if (def instanceof Simple) {
Simple simple = (Simple) def;
if (simple.isComplex()) {
return "complex " + simple.getType().getLiteral();
} else {
return simple.getType().getLiteral();
}
} else if (def instanceof SimpleSequence) {
SimpleSequence seq = (SimpleSequence) def;
if (seq.isComplex()) {
return "complex " + seq.getType().getLiteral();
} else {
return seq.getType().getLiteral();
}
}
}
return "";
}
public String getMode(Object element) {
if (element instanceof SadProperty) {
SadProperty prop = (SadProperty) element;
return prop.getDefinition().getMode().getLiteral();
}
return null;
}
public String getKind(Object element) {
if (element instanceof SadProperty) {
final Collection< ? > kinds = ((SadProperty) element).getKinds();
return toKindString(kinds);
}
return null;
}
private String toKindString(Collection< ? > kinds) {
List<String> retVal = new ArrayList<String>(kinds.size());
for (Object kind : kinds) {
if (kind instanceof Kind) {
retVal.add(((Kind) kind).getType().getLiteral());
} else if (kind instanceof ConfigurationKind) {
retVal.add(((ConfigurationKind) kind).getType().getLiteral());
}
}
return Arrays.toString(retVal.toArray());
}
public String getID(Object element) {
if (element instanceof SadComponentInstantiation) {
return ((SadComponentInstantiation) element).getId();
} else if (element instanceof SadProperty) {
return ((SadProperty) element).getDefinition().getId();
}
return "";
}
public String getName(Object element) {
if (element instanceof SadComponentInstantiation) {
return ((SadComponentInstantiation) element).getUsageName();
} else if (element instanceof SadProperty) {
AbstractProperty prop = ((SadProperty) element).getDefinition();
return (prop.getName() != null) ? prop.getName() : prop.getId();
}
return "";
}
public String getPrfValue(Object element) {
if (element instanceof SadProperty) {
SadProperty property = (SadProperty) element;
Object value = property.getPrfValue();
return property.getLabelProvider().getText(value);
}
return "";
}
public String getSadValue(Object element) {
if (element instanceof SadProperty) {
SadProperty property = (SadProperty) element;
Object value = property.getSadValue();
return property.getLabelProvider().getText(value);
}
return "";
}
}