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
37 import info.magnolia.context.MgnlContext;
38 import info.magnolia.ui.form.field.definition.BasicTextCodeFieldDefinition;
39
40 import org.slf4j.Logger;
41 import org.slf4j.LoggerFactory;
42 import org.vaadin.aceeditor.AceEditor;
43
44 import com.vaadin.data.Item;
45 import com.vaadin.event.FieldEvents.TextChangeEvent;
46 import com.vaadin.event.FieldEvents.TextChangeListener;
47 import com.vaadin.ui.Field;
48
49
50
51
52
53
54 public class BasicTextCodeFieldFactory<D extends BasicTextCodeFieldDefinition> extends AbstractFieldFactory<D, String> {
55
56 private static final Logger log = LoggerFactory.getLogger(BasicTextCodeFieldFactory.class);
57
58 public static final String FREEMARKER_LANGUAGE = "freemarker";
59
60 public static final String ACE_EDITOR_FTL_ID = "ftl";
61
62 public static final String ACE_EDITOR_RESOURCES = "/.resources/ace/";
63
64 private AceEditor field;
65
66 public BasicTextCodeFieldFactory(D 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 final 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 aceEditor.setMode(getModeType(definition.getLanguage()));
95 return aceEditor;
96 }
97
98
99
100
101 protected void setAceEditorMode() {
102 field.setMode(getModeType(definition.getLanguage()));
103 }
104
105
106
107
108 protected AceEditor getField() {
109 return field;
110 }
111
112
113
114
115
116 private TextChangeListener createTextChangeListener(final AceEditor field) {
117 return new TextChangeListener() {
118
119 @SuppressWarnings("unchecked")
120 @Override
121 public void textChange(TextChangeEvent event) {
122 field.getPropertyDataSource().setValue(event.getText());
123 }
124 };
125 }
126
127
128
129
130
131
132
133 private String getModeType(String language) {
134 return FREEMARKER_LANGUAGE.equals(language) ? ACE_EDITOR_FTL_ID : language;
135 }
136
137 }