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.datasource.locale;
35
36 import info.magnolia.context.Context;
37 import info.magnolia.icons.MagnoliaIcons;
38 import info.magnolia.ui.editor.LocaleContext;
39 import info.magnolia.ui.field.SelectFieldSupport;
40
41 import java.util.Locale;
42 import java.util.Optional;
43 import java.util.stream.Stream;
44
45 import javax.inject.Inject;
46
47 import com.vaadin.data.Converter;
48 import com.vaadin.data.Result;
49 import com.vaadin.data.ValueContext;
50 import com.vaadin.data.provider.AbstractDataProvider;
51 import com.vaadin.data.provider.Query;
52 import com.vaadin.ui.IconGenerator;
53 import com.vaadin.ui.ItemCaptionGenerator;
54
55
56
57
58
59 public class LocaleSelectFieldSupport implements SelectFieldSupport<Locale> {
60
61 private final LocaleContext localeContext;
62 private final Context context;
63
64 @Inject
65 public LocaleSelectFieldSupport(LocaleContext localeContext, Context context) {
66 this.localeContext = localeContext;
67 this.context = context;
68 }
69
70 @Override
71 public LocaleListProvider getDataProvider() {
72 return new LocaleListProvider(localeContext);
73 }
74
75 @Override
76 public ItemCaptionGenerator<Locale> getItemCaptionGenerator() {
77 return locale -> {
78 String label = locale.getDisplayLanguage(context.getLocale());
79 String displayCountry = locale.getDisplayCountry(context.getLocale());
80
81 return displayCountry.isEmpty() ? label : label + " (" + displayCountry + ")";
82 };
83 }
84
85 @Override
86 public IconGenerator<Locale> getIconGenerator() {
87 return locale -> MagnoliaIcons.LANGUAGE_APP;
88 }
89
90 @Override
91 public Converter<Locale, String> defaultConverter() {
92 return new Converter<Locale, String>() {
93 @Override
94 public Result<String> convertToModel(Locale value, ValueContext context) {
95 return Result.ok(
96 Optional.ofNullable(value)
97 .map(Locale::toLanguageTag)
98 .orElse(null));
99 }
100
101 @Override
102 public Locale convertToPresentation(String value, ValueContext context) {
103 return Optional.ofNullable(value)
104 .map(Locale::forLanguageTag)
105 .orElse(null);
106 }
107 };
108 }
109
110 private static class LocaleListProvider extends AbstractDataProvider<Locale, String> {
111
112 private final LocaleContext localeContext;
113
114 public LocaleListProvider(LocaleContext localeContext) {
115 this.localeContext = localeContext;
116
117 localeContext.availableLocales().observe(locales -> this.refreshAll());
118 }
119
120 @Override
121 public boolean isInMemory() {
122 return true;
123 }
124
125 @Override
126 public int size(Query<Locale, String> query) {
127 return (int) fetch(query).count();
128 }
129
130 @Override
131 public Stream<Locale> fetch(Query<Locale, String> query) {
132 return localeContext.getAvailableLocales().skip(query.getOffset()).limit(query.getLimit());
133 }
134 }
135
136 }