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