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.form.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.ui.form.field.definition.CodeFieldDefinition;
43
44 import org.vaadin.aceeditor.AceEditor;
45 import org.vaadin.aceeditor.AceMode;
46
47 import com.google.common.base.Optional;
48 import com.vaadin.data.Item;
49 import com.vaadin.data.Property;
50 import com.vaadin.event.FieldEvents.TextChangeEvent;
51 import com.vaadin.event.FieldEvents.TextChangeListener;
52 import com.vaadin.server.Sizeable.Unit;
53 import com.vaadin.ui.Field;
54
55
56
57
58 public class CodeFieldFactory extends AbstractFieldFactory<CodeFieldDefinition, String> {
59
60 private static final String FREEMARKER_LANGUAGE = "freemarker";
61 private static final String ACE_EDITOR_FTL_ID = "ftl";
62 private static final String ACE_EDITOR_RESOURCES = "/.resources/ace/";
63
64 private AceEditor field;
65
66 public CodeFieldFactory(CodeFieldDefinition definition, Item relatedFieldItem) {
67 super(definition, relatedFieldItem);
68 }
69
70 @Override
71 protected Field<String> createFieldComponent() {
72 field = newAceEditor();
73
74
75 field.addTextChangeListener(createTextChangeListener(field));
76
77 field.setStyleName("textcodefield");
78 field.setUseWorker(false);
79
80 return field;
81 }
82
83
84
85
86 protected AceEditor newAceEditor() {
87 AceEditor aceEditor = new AceEditor();
88 if (MgnlContext.isWebContext()) {
89 String aceEditorResourcePath = MgnlContext.getContextPath() + ACE_EDITOR_RESOURCES;
90 aceEditor.setModePath(aceEditorResourcePath);
91 aceEditor.setWorkerPath(aceEditorResourcePath);
92 aceEditor.setThemePath(aceEditorResourcePath);
93 }
94
95 if (isNotBlank(definition.getLanguage())) {
96 aceEditor.setMode(getModeType(definition.getLanguage()));
97 } else if (isNotBlank(definition.getFileNameProperty())) {
98 Property<?> fileNameProperty = item.getItemProperty(definition.getFileNameProperty());
99 if (fileNameProperty != null) {
100 String fileName = String.valueOf(fileNameProperty.getValue());
101 String extension = getExtension(fileName);
102 AceMode mode = getAceModeByFileExtension(extension);
103 if (mode != null) {
104 aceEditor.setMode(mode);
105 }
106 }
107 }
108 if (definition.getHeight() > 0) {
109 aceEditor.setHeight(definition.getHeight(), Unit.PIXELS);
110 }
111 return aceEditor;
112 }
113
114
115
116
117
118 private TextChangeListener createTextChangeListener(final AceEditor field) {
119 return new TextChangeListener() {
120
121 @SuppressWarnings("unchecked")
122 @Override
123 public void textChange(TextChangeEvent event) {
124 field.getPropertyDataSource().setValue(event.getText());
125 }
126 };
127 }
128
129
130
131
132
133
134
135 private String getModeType(String language) {
136 return FREEMARKER_LANGUAGE.equals(language) ? ACE_EDITOR_FTL_ID : language;
137 }
138
139
140
141
142
143
144 private AceMode getAceModeByFileExtension(String extension) {
145
146 Optional<AceMode> aceModeValue = getIfPresent(AceMode.class, extension);
147 if (aceModeValue.isPresent()) {
148 return aceModeValue.get();
149 } else {
150
151 AceMode aceMode = forFileEnding(extension);
152 return aceMode != null ? aceMode : null;
153 }
154 }
155
156 }