/**
* 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.bulkio.ui.internal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.omg.CORBA.Any;
import org.omg.CORBA.AnySeqHelper;
import org.omg.CORBA.TypeCode;
import BULKIO.StreamSRI;
import CF.DataType;
import CF.PropertiesHelper;
public class SriDataViewContentProvider implements ITreeContentProvider {
private String activeSriID;
@Override
public void dispose() {
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
public void setActiveSriID(String activeSriID) {
//Captures active SRI to use in getElements, passed from SRIView as part of the dropdown action
this.activeSriID = activeSriID;
}
@Override
@NonNull
public Object[] getElements(Object inputElement) {
if (inputElement instanceof Map< ? , ? >) {
@SuppressWarnings("unchecked")
Map<String, SriWrapper> streamMap = (Map<String, SriWrapper>) inputElement;
if (streamMap.size() == 0) {
return new Object[0];
}
//If activeSriID has not been set, grab the first item in the map
if (activeSriID == null) {
activeSriID = streamMap.entrySet().iterator().next().getKey();
}
SriWrapper sriWrapper = streamMap.get(activeSriID);
if (sriWrapper == null) {
activeSriID = streamMap.entrySet().iterator().next().getKey();
sriWrapper = streamMap.get(activeSriID);
}
StreamSRI sri = sriWrapper.getSri();
List<SriBuilder> attributes = new ArrayList<SriBuilder>();
if (sriWrapper.isEOS()) {
attributes.add(new SriBuilder("<End of Stream> streamID: ", sri.streamID, sriWrapper));
} else {
attributes.add(new SriBuilder("streamID: ", sri.streamID, sriWrapper));
}
attributes.add(new SriBuilder("Most recent push SRI: ", sriWrapper.getPushSriDate(), sriWrapper));
attributes.add(new SriBuilder("Most recent push packet: ", sriWrapper.getPrecisionTime(), sriWrapper));
attributes.add(new SriBuilder("blocking: ", sri.blocking, sriWrapper));
attributes.add(new SriBuilder("h version: ", sri.hversion, sriWrapper));
attributes.add(new SriBuilder("mode: ", sri.mode, sriWrapper));
attributes.add(new SriBuilder("subsize: ", sri.subsize, sriWrapper));
attributes.add(new SriBuilder("xdelta: ", sri.xdelta, sriWrapper));
attributes.add(new SriBuilder("xstart: ", sri.xstart, sriWrapper));
attributes.add(new SriBuilder("xunits: ", sri.xunits, sriWrapper));
attributes.add(new SriBuilder("ydelta: ", sri.ydelta, sriWrapper));
attributes.add(new SriBuilder("ystart: ", sri.ystart, sriWrapper));
attributes.add(new SriBuilder("yunits: ", sri.yunits, sriWrapper));
attributes.add(new SriBuilder("keywords: ", sri.keywords, sriWrapper));
return attributes.toArray();
}
return new Object[0];
}
@Override
@NonNull
public Object[] getChildren(Object parentElement) {
// parent is Root
if (parentElement instanceof SriBuilder) {
SriBuilder attribute = (SriBuilder) parentElement;
List<SriDataTypeWrapper> children = toWrapper(attribute.getValue(), parentElement);
return children.toArray();
}
// parent is Data Type wrappers of (Simples, Simple Sequences, Structs, Struct Sequences)
if (parentElement instanceof SriDataTypeWrapper) {
SriDataTypeWrapper attribute = (SriDataTypeWrapper) parentElement;
if (attribute.getDataType().value != null) {
TypeCode anyType = attribute.getDataType().value.type();
if (AnySeqHelper.type().equal(anyType)) {
// Struct Sequence return list of structs
Any[] elements = AnySeqHelper.extract(attribute.getDataType().value);
List<StructSequenceHelper> helperList = new ArrayList<StructSequenceHelper>();
int index = 0;
// Building Structs
for (Any any : elements) {
StructSequenceHelper helper = new StructSequenceHelper(attribute.getDataType().id, any, index++, attribute);
helperList.add(helper);
}
return helperList.toArray();
} else if (PropertiesHelper.type().equal(anyType)) {
// Structs return list of simples
return toWrapper(PropertiesHelper.extract(attribute.getDataType().value), attribute).toArray();
} else {
// Simples and simple sequences do not have children
return new Object[0];
}
}
}
// parent is Struct Sequence
if (parentElement instanceof StructSequenceHelper) {
StructSequenceHelper sequence = (StructSequenceHelper) parentElement;
// Get list of structs
List<SriDataTypeWrapper> children = toWrapper(sequence.getArray(), parentElement);
return children.toArray();
}
return new Object[0];
}
@NonNull
private List<SriDataTypeWrapper> toWrapper(final Object value, Object parentElement) {
if (value instanceof DataType[]) {
final DataType[] keywords = (DataType[]) value;
final List<SriDataTypeWrapper> result = new ArrayList<SriDataTypeWrapper>();
for (final DataType dt : keywords) {
result.add(new SriDataTypeWrapper(dt, parentElement));
}
return result;
}
return Collections.emptyList();
}
@Override
public Object getParent(Object element) {
if (element instanceof SriWrapper) {
return null;
} else if (element instanceof SriBuilder) {
return ((SriBuilder) element).getParent();
} else if (element instanceof SriDataTypeWrapper) {
return ((SriDataTypeWrapper) element).getParent();
} else if (element instanceof StructSequenceHelper) {
return ((StructSequenceHelper) element).getParent();
}
return null;
}
@Override
public boolean hasChildren(Object element) {
if (element instanceof SriBuilder) {
SriBuilder attribute = (SriBuilder) element;
return "keywords: ".equals(attribute.getName());
}
if (element instanceof SriDataTypeWrapper) {
SriDataTypeWrapper attribute = (SriDataTypeWrapper) element;
if (attribute.getDataType().value != null) {
TypeCode anyType = attribute.getDataType().value.type();
if (AnySeqHelper.type().equal(anyType) || PropertiesHelper.type().equal(anyType)) {
return true;
}
}
}
if (element instanceof StructSequenceHelper) {
StructSequenceHelper helper = (StructSequenceHelper) element;
if (helper.isArray()) {
return true;
}
}
return false;
}
}