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.vaadin.gwt.client.richtext;
35
36 import java.util.ArrayList;
37 import java.util.Arrays;
38 import java.util.List;
39
40 import org.vaadin.openesignforms.ckeditor.widgetset.client.ui.CKEditorService;
41 import org.vaadin.openesignforms.ckeditor.widgetset.client.ui.VCKEditorTextField;
42
43 import com.google.gwt.core.client.JavaScriptObject;
44 import com.google.gwt.core.client.Scheduler.ScheduledCommand;
45 import com.vaadin.client.ApplicationConnection;
46 import com.vaadin.client.UIDL;
47 import com.vaadin.client.ValueMap;
48
49
50
51
52
53 public class VMagnoliaRichTextField extends VCKEditorTextField implements VMagnoliaRichTextEditor.Listener {
54 public static final String VAR_EVENTNAMES = "eventnames";
55 public static final String VAR_SERVERPLUGINS = "serverplugins";
56 public static final String VAR_EVENT_PREFIX = "pluginEvent:";
57 public static final String VAR_FIRE_PLUGIN_EVENT = "firePluginEvent";
58 public static final String VAR_FIRE_PLUGIN_EVENT_VALUE = "firePluginEventValue";
59 protected VMagnoliaRichTextEditor editor;
60 public List<String> pluginEvents;
61 ValueMap customPlugins = null;
62
63 public VMagnoliaRichTextField() {
64 super();
65 pluginEvents = new ArrayList<String>();
66 loadCKEditor();
67 }
68
69 @Override
70 public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
71 super.updateFromUIDL(uidl, client);
72
73
74
75
76
77
78
79
80 if (uidl.hasAttribute(VAR_SERVERPLUGINS)) {
81 customPlugins = uidl.getMapAttribute(VAR_SERVERPLUGINS);
82 }
83
84
85 if (uidl.hasAttribute(VAR_EVENTNAMES) && this.editor != null) {
86 pluginEvents = Arrays.asList(uidl.getStringArrayAttribute(VAR_EVENTNAMES));
87
88 for (String eventName : pluginEvents) {
89 this.editor.addListener(this, eventName);
90 }
91 }
92
93
94 if (uidl.hasAttribute(VAR_FIRE_PLUGIN_EVENT) && this.editor != null) {
95 this.editor.fire(
96 uidl.getStringAttribute(VAR_FIRE_PLUGIN_EVENT),
97 uidl.getStringAttribute(VAR_FIRE_PLUGIN_EVENT_VALUE)
98 );
99 }
100 }
101
102 private static native void loadExternalPlugin(String pluginName, String path)
103
104 ;
105
106
107
108
109 @Override
110 public void onPluginEvent(String eventName, String data) {
111 if (pluginEvents.contains(eventName)) {
112 clientToServer.updateVariable(
113 paintableId,
114 VAR_EVENT_PREFIX + eventName,
115 data == null ? "" : data,
116 true);
117 }
118 }
119
120
121
122
123
124 private void loadCKEditor() {
125 if (!CKEditorService.libraryReady()) {
126 CKEditorService.loadLibrary(new ScheduledCommand() {
127 @Override
128 public void execute() {
129 loadPlugins();
130 injectEditorTo(VMagnoliaRichTextField.this);
131 }
132 });
133 } else {
134 loadPlugins();
135 injectEditorTo(this);
136 }
137 }
138
139
140
141
142 private void loadPlugins() {
143 if (customPlugins != null) {
144 for (String key : customPlugins.getKeySet()) {
145 loadExternalPlugin(key, customPlugins.getString(key));
146 }
147 }
148 }
149
150 protected void setEditor(JavaScriptObject editor) {
151 this.editor = (VMagnoliaRichTextEditor) editor;
152 }
153
154
155
156
157
158
159
160
161
162
163 private static native void injectEditorTo(final VMagnoliaRichTextField listener)
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178 ;
179
180
181
182
183 private String getPaintableId() {
184 return paintableId;
185 }
186 }