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