package com.yoursway.swt.inspector; import static com.google.common.collect.Maps.newHashMap; import java.lang.reflect.Field; import java.util.Map; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Control; public class ControlRegistry { private Map<Class<? extends Control>, ControlDescriptor> descriptors = newHashMap(); void register(Class<? extends Control> klass, String styles) { ControlDescriptor descriptor = lookup(klass); Class<SWT> swt = SWT.class; if (styles.length() == 0) descriptor.noStyles(); else for (String name : styles.split(",")) { name = name.trim(); try { Field field = swt.getDeclaredField(name); int value = (Integer) field.get(null); descriptor.addStyle(value, name); } catch (Exception e) { throw new AssertionError(e); } } } public ControlDescriptor lookup(Class<? extends Control> klass) { ControlDescriptor result = descriptors.get(klass); if (result == null) { result = createDescriptor(klass); descriptors.put(klass, result); } return result; } @SuppressWarnings("unchecked") private ControlDescriptor createDescriptor(Class<? extends Control> klass) { ControlDescriptor baseDescriptor; if (klass.equals(Control.class)) baseDescriptor = null; else baseDescriptor = lookup((Class<? extends Control>) klass.getSuperclass()); return new ControlDescriptor(klass, baseDescriptor); } }