/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.gui.utils.common.configuration;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.ui.views.properties.ColorPropertyDescriptor;
import org.eclipse.ui.views.properties.IPropertyDescriptor;
import org.eclipse.ui.views.properties.TextPropertyDescriptor;
/**
* A factory providing easy means to create {@link IPropertyDescriptor} instances to represent
* properties of registered types, whereas property types for standard types (<code>Boolean, String,
* Number, Enum</code>) are already provided.
*
* @author Christian Weiss
*/
public final class PropertyDescriptorFactory {
private static final Map<Class<?>, Class<? extends IPropertyDescriptor>> MAPPING =
new HashMap<Class<?>, Class<? extends IPropertyDescriptor>>();
static {
MAPPING.put(Boolean.class, BooleanPropertyDescriptor.class);
MAPPING.put(String.class, TextPropertyDescriptor.class);
MAPPING.put(Number.class, TextPropertyDescriptor.class);
MAPPING.put(Enum.class, EnumPropertyDescriptor.class);
MAPPING.put(org.eclipse.swt.graphics.Color.class,
ColorPropertyDescriptor.class);
MAPPING.put(org.eclipse.swt.graphics.RGB.class,
ColorPropertyDescriptor.class);
}
private PropertyDescriptorFactory() {
//
}
/**
* Creates a new {@link IPropertyDescriptor> instance for the given property type.
*
* @param propertyType the property type
* @param name the name of the property
* @param displayName the display name of the property
* @return the {@link IPropertyDescriptor> instance
*/
public static IPropertyDescriptor createPropertyDescriptor(
final Class<?> propertyType, final String name,
final String displayName) {
for (Map.Entry<Class<?>, Class<? extends IPropertyDescriptor>> entry : MAPPING
.entrySet()) {
final Class<?> baseClass = entry.getKey();
if (baseClass.isAssignableFrom(propertyType)) {
final Class<? extends IPropertyDescriptor> descriptorClass = entry
.getValue();
try {
try {
final Constructor<? extends IPropertyDescriptor> constructor = descriptorClass
.getConstructor(Class.class, Object.class,
String.class);
final IPropertyDescriptor descriptor = constructor
.newInstance(propertyType, name, displayName);
return descriptor;
} catch (NoSuchMethodException e) {
final Constructor<? extends IPropertyDescriptor> constructor = descriptorClass
.getConstructor(Object.class, String.class);
final IPropertyDescriptor descriptor = constructor
.newInstance(name, displayName);
return descriptor;
}
} catch (SecurityException e) {
throw new RuntimeException(e);
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
} catch (IllegalArgumentException e) {
throw new RuntimeException(e);
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
throw new RuntimeException(e);
}
}
}
final IPropertyDescriptor result;
if (String.class.equals(propertyType)
|| Number.class.isAssignableFrom(propertyType)) {
result = new TextPropertyDescriptor(name, displayName);
} else if (Boolean.class.equals(propertyType)
|| boolean.class.equals(propertyType)) {
result = new BooleanPropertyDescriptor(name, displayName);
} else if (propertyType.isPrimitive()) {
result = new TextPropertyDescriptor(name, displayName);
} else {
result = null;
}
return result;
}
}