1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.ui.field.factory;
35
36 import info.magnolia.objectfactory.ComponentProvider;
37 import info.magnolia.objectfactory.Components;
38 import info.magnolia.ui.datasource.ItemResolver;
39 import info.magnolia.ui.editor.ItemPreviewDefinition;
40 import info.magnolia.ui.field.LinkField;
41 import info.magnolia.ui.field.LinkFieldDefinition;
42 import info.magnolia.ui.field.SelectFieldSupport;
43 import info.magnolia.ui.framework.overlay.ChooserController;
44 import info.magnolia.ui.framework.overlay.ChooserController.ChooseResult;
45 import info.magnolia.ui.preview.ItemPreviewComponent;
46
47 import java.util.Optional;
48
49 import javax.inject.Inject;
50
51 import com.vaadin.data.HasValue;
52 import com.vaadin.ui.ComboBox;
53
54
55
56
57
58
59 public class LinkFieldFactory<T, D extends LinkFieldDefinition<T>> extends ComboBoxFieldFactory<T, LinkFieldDefinition<T>> {
60
61 private final ChooserController chooserController;
62
63 @Inject
64 public LinkFieldFactory(D definition, ComponentProvider componentProvider, ChooserController chooserController, SelectFieldSupport<T> selectFieldSupport) {
65 super(definition, componentProvider, selectFieldSupport);
66
67 if (definition.getChooser() == null) {
68 throw new IllegalArgumentException("Could not find a chooser dialog definition at LinkField definition " + definition.getName());
69 }
70
71 this.chooserController = chooserController;
72 }
73
74
75
76
77 @Deprecated
78 public LinkFieldFactory(LinkFieldDefinition<T> definition, ComponentProvider componentProvider, ItemResolver<T> itemResolver, ChooserController chooserController) {
79 this((D) definition, componentProvider, chooserController, Components.getComponent(SelectFieldSupport.class));
80 }
81
82 @Override
83 public HasValue<T> createField() {
84 LinkField<T> linkField = new LinkField<>((ComboBox<T>) super.createField());
85 linkField.setCaption(getDefinition().getLabel());
86 linkField.setButtonCaptionNew(getDefinition().getButtonSelectNewLabel());
87 linkField.setButtonCaptionOther(getDefinition().getButtonSelectOtherLabel());
88 linkField.setEditable(getDefinition().isEditable());
89 linkField.setDisableOnClick(true);
90 linkField.addClickListener(event -> chooserController.openChooser(getDefinition().getChooser(), null)
91 .whenComplete((ChooseResult<T> result, Throwable err) -> {
92
93 linkField.setEnabled(true);
94
95 if (err != null) {
96 throw new RuntimeException(err);
97 }
98
99 result.getChoice().ifPresent(linkField::setValue);
100 }));
101
102 newItemPreviewComponent().ifPresent(itemPreviewComponent -> {
103 linkField.addValueChangeListener(event -> {
104 T item = event.getValue();
105 itemPreviewComponent.onValueChange(item);
106 itemPreviewComponent.setVisible(item != null);
107 });
108 linkField.setContentPreview(itemPreviewComponent);
109 });
110
111 return linkField;
112 }
113
114 protected Optional<? extends ItemPreviewComponent<T>> newItemPreviewComponent() {
115 return Optional.ofNullable(getDefinition().getPreview())
116 .map(ItemPreviewDefinition::getImplementationClass)
117 .map(clazz -> componentProvider.newInstance(clazz));
118 }
119
120 }