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.framework.overlay;
35
36 import info.magnolia.ui.DialogBuilder;
37 import info.magnolia.ui.api.ioc.UiContextScoped;
38 import info.magnolia.ui.framework.chooser.Chooser;
39 import info.magnolia.ui.framework.chooser.definition.ChooserDefinition;
40 import info.magnolia.ui.framework.ioc.UiContextBoundComponentProvider;
41
42 import java.util.Arrays;
43 import java.util.Optional;
44 import java.util.concurrent.CompletableFuture;
45
46 import javax.inject.Inject;
47
48 import org.apache.commons.lang3.StringUtils;
49
50 import com.vaadin.ui.Button;
51 import com.vaadin.ui.Window;
52
53 import lombok.AccessLevel;
54 import lombok.AllArgsConstructor;
55
56
57
58
59 @UiContextScoped
60 public class ChooserController {
61
62 private final UiContextBoundComponentProvider parentComponentProvider;
63
64 @Inject
65 public ChooserController(UiContextBoundComponentProvider parentComponentProvider) {
66 this.parentComponentProvider = parentComponentProvider;
67 }
68
69 private <T> CompletableFuture<ChooseResult<T>> openChooser(Chooser<T> chooser) {
70 CompletableFuture<ChooseResult<T>> result = new CompletableFuture<>();
71
72 Button cancel = new Button("Cancel");
73 Button choose = new Button("Select");
74
75 cancel.addStyleName("v-button-secondary");
76 choose.addStyleName("v-button-commit");
77
78 Window chooserWindow = DialogBuilder.dialog()
79 .withTitle(StringUtils.defaultIfBlank(chooser.getTitle(), "Choose"))
80 .withContent(chooser.asVaadinComponent())
81 .withActions(Arrays.asList(cancel, choose))
82 .buildAndOpen();
83
84 chooserWindow.setWidth("500px");
85 chooserWindow.setHeight("500px");
86 chooserWindow.addCloseListener(e -> chooser.destroy());
87
88 cancel.addClickListener(e -> {
89 result.complete(ChooseResult.ofNoChoice());
90 chooserWindow.close();
91 });
92
93 choose.addClickListener(event -> {
94 result.complete(ChooseResult.ofChoice(chooser.getChoice()));
95 chooserWindow.close();
96 });
97
98 return result;
99 }
100
101 public <T, C extends Chooser<T>> CompletableFuture<ChooseResult<T>> openChooser(ChooserDefinition<T, C> definition) {
102 return this.openChooser(definition, null);
103 }
104
105 public <T, C extends Chooser<T>> CompletableFuture<ChooseResult<T>> openChooser(ChooserDefinition<T, C> definition, T initialChoice) {
106 Chooser<T> chooser = this.parentComponentProvider.inChildContext(definition).newInstance(definition.getImplementationClass());
107 chooser.setChoice(initialChoice);
108 return openChooser(chooser);
109 }
110
111
112
113
114
115
116
117 @AllArgsConstructor(access = AccessLevel.PRIVATE)
118 public static class ChooseResult<T> {
119 private boolean isChosen;
120 private T choice;
121
122 static <T> ChooseResult<T> ofNoChoice() {
123 return new ChooseResult<>(false, null);
124 }
125
126 static <T> ChooseResult<T> ofChoice(T choice) {
127 return new ChooseResult<>(true, choice);
128 }
129
130 public boolean isChosen() {
131 return this.isChosen;
132 }
133
134 public Optional<T> getChoice() {
135 return Optional.ofNullable(choice);
136 }
137 }
138 }