You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

DefaultFieldGroupFieldFactory.java 5.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. /*
  2. @VaadinApache2LicenseForJavaFiles@
  3. */
  4. package com.vaadin.data.fieldgroup;
  5. import java.util.EnumSet;
  6. import com.vaadin.data.Item;
  7. import com.vaadin.data.fieldgroup.FieldGroup.BindException;
  8. import com.vaadin.ui.AbstractSelect;
  9. import com.vaadin.ui.AbstractTextField;
  10. import com.vaadin.ui.CheckBox;
  11. import com.vaadin.ui.ComboBox;
  12. import com.vaadin.ui.Field;
  13. import com.vaadin.ui.ListSelect;
  14. import com.vaadin.ui.NativeSelect;
  15. import com.vaadin.ui.OptionGroup;
  16. import com.vaadin.ui.RichTextArea;
  17. import com.vaadin.ui.Table;
  18. import com.vaadin.ui.TextField;
  19. public class DefaultFieldGroupFieldFactory implements FieldGroupFieldFactory {
  20. public static final Object CAPTION_PROPERTY_ID = "Caption";
  21. @Override
  22. public <T extends Field> T createField(Class<?> type, Class<T> fieldType) {
  23. if (Enum.class.isAssignableFrom(type)) {
  24. return createEnumField(type, fieldType);
  25. } else if (Boolean.class.isAssignableFrom(type)
  26. || boolean.class.isAssignableFrom(type)) {
  27. return createBooleanField(fieldType);
  28. }
  29. if (AbstractTextField.class.isAssignableFrom(fieldType)) {
  30. return fieldType.cast(createAbstractTextField(fieldType
  31. .asSubclass(AbstractTextField.class)));
  32. } else if (fieldType == RichTextArea.class) {
  33. return fieldType.cast(createRichTextArea());
  34. }
  35. return createDefaultField(type, fieldType);
  36. }
  37. protected RichTextArea createRichTextArea() {
  38. RichTextArea rta = new RichTextArea();
  39. rta.setImmediate(true);
  40. return rta;
  41. }
  42. private <T extends Field> T createEnumField(Class<?> type,
  43. Class<T> fieldType) {
  44. if (AbstractSelect.class.isAssignableFrom(fieldType)) {
  45. AbstractSelect s = createCompatibleSelect((Class<? extends AbstractSelect>) fieldType);
  46. populateWithEnumData(s, (Class<? extends Enum>) type);
  47. return (T) s;
  48. }
  49. return null;
  50. }
  51. protected AbstractSelect createCompatibleSelect(
  52. Class<? extends AbstractSelect> fieldType) {
  53. AbstractSelect select;
  54. if (fieldType.isAssignableFrom(ListSelect.class)) {
  55. select = new ListSelect();
  56. select.setMultiSelect(false);
  57. } else if (fieldType.isAssignableFrom(NativeSelect.class)) {
  58. select = new NativeSelect();
  59. } else if (fieldType.isAssignableFrom(OptionGroup.class)) {
  60. select = new OptionGroup();
  61. select.setMultiSelect(false);
  62. } else if (fieldType.isAssignableFrom(Table.class)) {
  63. Table t = new Table();
  64. t.setSelectable(true);
  65. select = t;
  66. } else {
  67. select = new ComboBox(null);
  68. }
  69. select.setImmediate(true);
  70. select.setNullSelectionAllowed(false);
  71. return select;
  72. }
  73. protected <T extends Field> T createBooleanField(Class<T> fieldType) {
  74. if (fieldType.isAssignableFrom(CheckBox.class)) {
  75. CheckBox cb = new CheckBox(null);
  76. cb.setImmediate(true);
  77. return (T) cb;
  78. } else if (AbstractTextField.class.isAssignableFrom(fieldType)) {
  79. return (T) createAbstractTextField((Class<? extends AbstractTextField>) fieldType);
  80. }
  81. return null;
  82. }
  83. protected <T extends AbstractTextField> T createAbstractTextField(
  84. Class<T> fieldType) {
  85. if (fieldType == AbstractTextField.class) {
  86. fieldType = (Class<T>) TextField.class;
  87. }
  88. try {
  89. T field = fieldType.newInstance();
  90. field.setImmediate(true);
  91. return field;
  92. } catch (Exception e) {
  93. throw new BindException("Could not create a field of type "
  94. + fieldType, e);
  95. }
  96. }
  97. /**
  98. * Fallback when no specific field has been created. Typically returns a
  99. * TextField.
  100. *
  101. * @param <T>
  102. * The type of field to create
  103. * @param type
  104. * The type of data that should be edited
  105. * @param fieldType
  106. * The type of field to create
  107. * @return A field capable of editing the data or null if no field could be
  108. * created
  109. */
  110. protected <T extends Field> T createDefaultField(Class<?> type,
  111. Class<T> fieldType) {
  112. if (fieldType.isAssignableFrom(TextField.class)) {
  113. return fieldType.cast(createAbstractTextField(TextField.class));
  114. }
  115. return null;
  116. }
  117. /**
  118. * Populates the given select with all the enums in the given {@link Enum}
  119. * class. Uses {@link Enum}.toString() for caption.
  120. *
  121. * @param select
  122. * The select to populate
  123. * @param enumClass
  124. * The Enum class to use
  125. */
  126. protected void populateWithEnumData(AbstractSelect select,
  127. Class<? extends Enum> enumClass) {
  128. select.removeAllItems();
  129. for (Object p : select.getContainerPropertyIds()) {
  130. select.removeContainerProperty(p);
  131. }
  132. select.addContainerProperty(CAPTION_PROPERTY_ID, String.class, "");
  133. select.setItemCaptionPropertyId(CAPTION_PROPERTY_ID);
  134. @SuppressWarnings("unchecked")
  135. EnumSet<?> enumSet = EnumSet.allOf(enumClass);
  136. for (Object r : enumSet) {
  137. Item newItem = select.addItem(r);
  138. newItem.getItemProperty(CAPTION_PROPERTY_ID).setValue(r.toString());
  139. }
  140. }
  141. }