BaseControl (final Type type, final GenericDomValue<?> element, boolean commitOnEveryChange) { final DomStringWrapper stringWrapper = new DomStringWrapper(element); final Class rawType = ClassUtil.getRawType(type); if (type instanceof Class && Enum.class.isAssignableFrom(rawType)) { return new ComboControl(stringWrapper, rawType); } if (DomElement.class.isAssignableFrom(rawType)) { final ComboControl control = new ComboControl(element); final Required annotation = element.getAnnotation(Required.class); if (annotation == null || !annotation.value() || !annotation.nonEmpty()) { control.setNullable(true); } return control; } final DomFixedWrapper wrapper = new DomFixedWrapper(element); if (type.equals(boolean.class) || type.equals(Boolean.class)) { return new BooleanControl(wrapper); } if (type.equals(String.class)) { return getDomUIFactory().createTextControl(wrapper, commitOnEveryChange); } final BaseControl customControl = getDomUIFactory().createCustomControl(type, stringWrapper, commitOnEveryChange); if (customControl != null) return customControl; return getDomUIFactory().createTextControl(stringWrapper, commitOnEveryChange); }