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.pages.app.field;
35
36 import info.magnolia.config.registry.Registry;
37 import info.magnolia.i18nsystem.I18nizer;
38 import info.magnolia.objectfactory.Components;
39 import info.magnolia.pages.app.editor.PageEditorPresenter;
40 import info.magnolia.rendering.template.TemplateDefinition;
41 import info.magnolia.rendering.template.registry.TemplateDefinitionRegistry;
42 import info.magnolia.ui.api.context.UiContext;
43 import info.magnolia.ui.api.i18n.I18NAuthoringSupport;
44 import info.magnolia.ui.form.field.definition.SelectFieldOptionDefinition;
45 import info.magnolia.ui.form.field.factory.SelectFieldFactory;
46 import info.magnolia.ui.vaadin.gwt.client.shared.AreaElement;
47
48 import java.util.ArrayList;
49 import java.util.List;
50
51 import javax.inject.Inject;
52
53 import org.apache.commons.lang3.StringUtils;
54 import org.slf4j.Logger;
55 import org.slf4j.LoggerFactory;
56
57 import com.vaadin.data.Item;
58
59
60
61
62
63
64 public class ComponentSelectorFieldFactory extends SelectFieldFactory<ComponentSelectorDefinition> {
65
66 private static final Logger log = LoggerFactory.getLogger(ComponentSelectorFieldFactory.class);
67
68 private final TemplateDefinitionRegistry templateRegistry;
69 private final PageEditorPresenter pageEditorPresenter;
70 private final I18nizer i18nizer;
71
72 @Inject
73 public ComponentSelectorFieldFactory(ComponentSelectorDefinition definition, Item relatedFieldItem, UiContext uiContext, I18NAuthoringSupport i18nAuthoringSupport, TemplateDefinitionRegistry templateRegistry, PageEditorPresenter pageEditorPresenter, I18nizer i18nizer) {
74 super(definition, relatedFieldItem, uiContext, i18nAuthoringSupport);
75 this.templateRegistry = templateRegistry;
76 this.pageEditorPresenter = pageEditorPresenter;
77 this.i18nizer = i18nizer;
78 }
79
80
81
82
83 @Deprecated
84 public ComponentSelectorFieldFactory(ComponentSelectorDefinition definition, Item relatedFieldItem, TemplateDefinitionRegistry templateRegistry, PageEditorPresenter pageEditorPresenter, I18nizer i18nizer) {
85 this(definition, relatedFieldItem, null, Components.getComponent(I18NAuthoringSupport.class), templateRegistry, pageEditorPresenter, i18nizer);
86 }
87
88
89
90
91 @Deprecated
92 public ComponentSelectorFieldFactory(ComponentSelectorDefinition definition, Item relatedFieldItem, TemplateDefinitionRegistry templateRegistry, PageEditorPresenter pageEditorPresenter) {
93 this(definition, relatedFieldItem, null, Components.getComponent(I18NAuthoringSupport.class), templateRegistry, pageEditorPresenter, Components.getComponent(I18nizer.class));
94 }
95
96
97
98
99 @Deprecated
100 public ComponentSelectorFieldFactory(ComponentSelectorDefinition definition, Item relatedFieldItem) {
101 this(definition, relatedFieldItem, null, Components.getComponent(I18NAuthoringSupport.class), Components.getComponent(TemplateDefinitionRegistry.class), Components.getComponent(PageEditorPresenter.class), Components.getComponent(I18nizer.class));
102 }
103
104
105
106
107 @Override
108 public List<SelectFieldOptionDefinition> getSelectFieldOptionDefinition() {
109 List<SelectFieldOptionDefinition> res = new ArrayList<SelectFieldOptionDefinition>();
110
111 if (!(pageEditorPresenter.getSelectedElement() instanceof AreaElement)) {
112 log.warn("Cannot get available components, selected element {} is not an area.", pageEditorPresenter.getSelectedElement());
113 return res;
114 }
115
116 AreaElement area = (AreaElement) pageEditorPresenter.getSelectedElement();
117 String availableComponents = area.getAvailableComponents();
118
119 String[] tokens = availableComponents.split(",");
120 for (String token : tokens) {
121 try {
122 TemplateDefinition templateDefinition = templateRegistry.getProvider(token).get();
123 SelectFieldOptionDefinition option = new SelectFieldOptionDefinition();
124 option.setValue(templateDefinition.getId());
125 option.setLabel(this.getTranslatedTitle(templateDefinition));
126 res.add(option);
127 } catch (Registry.NoSuchDefinitionException e) {
128 log.error("Could not get TemplateDefinition for id '{}'.", token, e);
129 }
130 }
131
132 return res;
133 }
134
135 @Override
136 protected Class<?> getDefaultFieldType() {
137 return String.class;
138 }
139
140 private String getTranslatedTitle(TemplateDefinition definition) {
141 String translatedTitle = i18nizer.decorate(definition).getTitle();
142 if (isMessageKey(translatedTitle)) {
143 translatedTitle = TemplateSelectorFieldFactory.getI18nTitle(definition);
144 }
145 if (isMessageKey(translatedTitle)) {
146 translatedTitle = definition.getId();
147 }
148 return translatedTitle;
149 }
150
151 private boolean isMessageKey(String key) {
152 return !StringUtils.endsWith(key, ".") && StringUtils.contains(key, ".") && !StringUtils.contains(key, " ");
153 }
154
155 }