package au.com.langdale.cimtoole.properties;
import org.eclipse.core.runtime.IAdapterFactory;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.views.properties.IPropertyDescriptor;
import org.eclipse.ui.views.properties.IPropertySource;
import au.com.langdale.kena.OntResource;
import au.com.langdale.jena.TreeModelBase.Node;
import au.com.langdale.jena.JenaTreeModelBase.ModelNode;
import au.com.langdale.profiles.ProfileModel.NaturalNode.ElementNode;
import au.com.langdale.ui.util.IconCache;
public class PropertySupport implements IAdapterFactory {
public Object getAdapter(Object adaptableObject, Class adapterType) {
if( adapterType.equals(IPropertySource.class)) {
if( adaptableObject instanceof Node) {
return new PropertySource((Node)adaptableObject);
}
}
return null;
}
public Class[] getAdapterList() {
return new Class[] {IPropertySource.class};
}
public static abstract class Descriptor implements IPropertyDescriptor {
private String name, description;
public Descriptor(String name, String description) {
this.name = name;
this.description = description;
}
public Object getId() {
return this;
}
public boolean isCompatibleWith(IPropertyDescriptor anotherProperty) {
return equals(anotherProperty);
}
public String getDisplayName() {
return name;
}
public String getDescription() {
return description;
}
public abstract Object getValueFrom(Node node);
public CellEditor createPropertyEditor(Composite parent) {
return null;
}
public String getCategory() {
return "Info";
}
public String[] getFilterFlags() {
return null;
}
public Object getHelpContextIds() {
return null;
}
public ILabelProvider getLabelProvider() {
return null;
}
}
public static abstract class ModelDescriptor extends Descriptor {
public ModelDescriptor(String name, String description) {
super(name, description);
}
@Override
public Object getValueFrom(Node node) {
if( node instanceof ModelNode)
return getValueFrom((ModelNode)node);
else
return "";
}
public abstract Object getValueFrom(ModelNode node);
}
public static abstract class PropertyDescriptor extends Descriptor {
public PropertyDescriptor(String name, String description) {
super(name, description);
}
@Override
public Object getValueFrom(Node node) {
if( node instanceof ElementNode)
return getValueFrom((ElementNode)node );
else
return "";
}
@Override
public String getCategory() {
return "Property";
}
public abstract Object getValueFrom(ElementNode node);
}
public static abstract class ProfileDescriptor extends Descriptor {
public ProfileDescriptor(String name, String description) {
super(name, description);
}
@Override
public Object getValueFrom(Node node) {
if( node instanceof ModelNode && ! node.getBase().equals(node.getSubject()))
return getValueFrom((ModelNode)node);
else
return "";
}
@Override
public String getCategory() {
return "Profile";
}
public abstract Object getValueFrom(ModelNode node);
}
private static Descriptor[] basicDescriptors = {
new Descriptor("Name", "Canonical name of definition") {
@Override
public Object getValueFrom(Node node) {
return node.getName();
}
},
new ModelDescriptor("Package", "Package or document containing definition") {
@Override
public Object getValueFrom(ModelNode node) {
return node.getPackageName();
}
},
new Descriptor("Type", "Type of definition") {
@Override
public Object getValueFrom(Node node) {
return IconCache.getIcons().getName( node.getIconClass());
}
},
new Descriptor("URI", "Full URI of defintion") {
@Override
public Object getValueFrom(Node node) {
OntResource subject = node.getSubject();
if( subject != null && subject.isURIResource())
return subject.getURI();
else
return "anonymous";
}
},
new ProfileDescriptor("Based on", "Name in information model") {
@Override
public Object getValueFrom(ModelNode node) {
return node.getBase().isAnon()? "" : node.getBase().getLocalName();
}
},
new ProfileDescriptor("Base namespace", "Namespace in information model") {
@Override
public Object getValueFrom(ModelNode node) {
return node.getBase().isAnon()? "" : node.getBase().getNameSpace();
}
},
new PropertyDescriptor("Cardinality", "Property cardinality") {
@Override
public Object getValueFrom(ElementNode node) {
return node.getCardString();
}
},
};
public static void copy(Descriptor[] a, Descriptor[] b, int offset) {
for(int ix = 0; ix < a.length; ix++)
b[ix + offset] = a[ix];
}
public static Descriptor[] concat(Descriptor[] a, Descriptor[] b) {
Descriptor[] c = new Descriptor[a.length + b.length];
copy(a, c, 0);
copy(b, c, a.length);
return c;
}
public static class PropertySource implements IPropertySource {
private Node node;
public PropertySource(Node node) {
this.node = node;
}
public IPropertyDescriptor[] getPropertyDescriptors() {
return basicDescriptors;
}
public Object getPropertyValue(Object id) {
if(id instanceof Descriptor) {
Descriptor desc = (Descriptor) id;
return desc.getValueFrom(node);
}
return null;
}
public Object getEditableValue() {
// not editable
return null;
}
public boolean isPropertySet(Object id) {
// default value not applicable therefore this is false
return false;
}
public void resetPropertyValue(Object id) {
// no action
}
public void setPropertyValue(Object id, Object value) {
// no action
}
}
public static String getDescription(Node node) {
StringBuffer result = new StringBuffer();
for(int ix = 0; ix < basicDescriptors.length; ix++) {
Descriptor line = basicDescriptors[ix];
result.append(line.getDisplayName());
result.append(": ");
result.append(line.getValueFrom(node));
result.append('\n');
}
return result.toString();
}
}