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 static com.google.common.base.Enums.getIfPresent;
37 import static org.apache.commons.io.FilenameUtils.getExtension;
38 import static org.apache.commons.lang3.StringUtils.isNotBlank;
39 import static org.vaadin.aceeditor.AceMode.forFileEnding;
40
41 import info.magnolia.context.MgnlContext;
42 import info.magnolia.objectfactory.ComponentProvider;
43 import info.magnolia.ui.api.i18n.I18NAuthoringSupport;
44 import info.magnolia.ui.field.CodeFieldDefinition;
45
46 import java.util.Locale;
47 import java.util.Optional;
48
49 import javax.inject.Inject;
50
51 import org.vaadin.aceeditor.AceEditor;
52 import org.vaadin.aceeditor.AceMode;
53
54 import com.vaadin.server.Sizeable;
55
56
57
58
59 public class CodeFieldFactory extends AbstractFieldFactory<CodeFieldDefinition, String, AceEditor> {
60
61 private static final String FREEMARKER_LANGUAGE = "freemarker";
62 private static final String ACE_EDITOR_FTL_ID = "ftl";
63 private static final String ACE_EDITOR_RESOURCES = "/.resources/ace/";
64
65 private AceEditor field;
66
67 private final CodeFieldDefinition definition;
68
69 @Inject
70 public CodeFieldFactory(CodeFieldDefinition definition, ComponentProvider componentProvider, Locale locale, I18NAuthoringSupport i18NAuthoringSupport) {
71 super(definition, componentProvider, locale, i18NAuthoringSupport);
72 this.definition = definition;
73 }
74
75 @Override
76 protected AceEditor createFieldComponent() {
77 field = newAceEditor();
78
79
80 field.setStyleName("textcodefield");
81 field.setUseWorker(false);
82
83 return field;
84 }
85
86
87
88
89 protected AceEditor newAceEditor() {
90 AceEditor aceEditor = new AceEditor();
91 if (MgnlContext.isWebContext()) {
92 String aceEditorResourcePath = MgnlContext.getContextPath() + ACE_EDITOR_RESOURCES;
93 aceEditor.setModePath(aceEditorResourcePath);
94 aceEditor.setWorkerPath(aceEditorResourcePath);
95 aceEditor.setThemePath(aceEditorResourcePath);
96 }
97
98
99 if (isNotBlank(definition.getLanguage())) {
100 aceEditor.setMode(getModeType(definition.getLanguage()));
101 } else if (isNotBlank(definition.getFileNameProperty())) {
102 String fileName = field.getValue();
103 if (fileName != null) {
104 String extension = getExtension(fileName);
105 AceMode mode = getAceModeByFileExtension(extension);
106 if (mode != null) {
107 aceEditor.setMode(mode);
108 }
109 }
110 }
111
112 if (definition.getHeight() > 0) {
113 aceEditor.setHeight(definition.getHeight(), Sizeable.Unit.PIXELS);
114 }
115
116 return aceEditor;
117 }
118
119
120
121
122
123
124
125 private String getModeType(String language) {
126 return FREEMARKER_LANGUAGE.equals(language) ? ACE_EDITOR_FTL_ID : language;
127 }
128
129
130
131
132
133
134 private AceMode getAceModeByFileExtension(String extension) {
135
136 Optional<AceMode> aceModeValue = getIfPresent(AceMode.class, extension).toJavaUtil();
137
138 return aceModeValue.orElseGet(() -> forFileEnding(extension));
139 }
140 }