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.framework.overlay;
35
36 import info.magnolia.objectfactory.Classes;
37 import info.magnolia.ui.api.overlay.AlertCallback;
38 import info.magnolia.ui.api.overlay.ConfirmationCallback;
39 import info.magnolia.ui.api.overlay.MessageStyleType;
40 import info.magnolia.ui.api.overlay.NotificationCallback;
41 import info.magnolia.ui.api.overlay.OverlayCloser;
42 import info.magnolia.ui.api.overlay.OverlayLayer;
43 import info.magnolia.ui.api.view.View;
44 import info.magnolia.ui.vaadin.dialog.BaseDialog;
45 import info.magnolia.ui.vaadin.dialog.ConfirmationDialog;
46 import info.magnolia.ui.vaadin.dialog.ConfirmationDialog.ConfirmationEvent;
47 import info.magnolia.ui.vaadin.dialog.LightDialog;
48 import info.magnolia.ui.vaadin.dialog.Notification;
49 import info.magnolia.ui.vaadin.icon.CompositeIcon;
50
51 import com.vaadin.event.LayoutEvents;
52 import com.vaadin.event.ShortcutAction;
53 import com.vaadin.event.ShortcutListener;
54 import com.vaadin.server.Sizeable.Unit;
55 import com.vaadin.shared.ui.label.ContentMode;
56 import com.vaadin.ui.Button;
57 import com.vaadin.ui.Button.ClickEvent;
58 import com.vaadin.ui.Button.ClickListener;
59 import com.vaadin.ui.CssLayout;
60 import com.vaadin.ui.HorizontalLayout;
61 import com.vaadin.ui.Label;
62 import com.vaadin.ui.Panel;
63 import com.vaadin.ui.themes.BaseTheme;
64
65
66
67
68 public abstract class OverlayPresenter implements OverlayLayer {
69
70 public static final int TIMEOUT_SECONDS_DEFAULT = 3;
71
72
73
74
75 @Override
76 public OverlayCloser openOverlay(View view) {
77 return openOverlay(view, ModalityLevel.STRONG);
78 }
79
80
81
82
83
84
85
86
87
88 @Override
89 public void openAlert(MessageStyleType type, View body, String okButton, AlertCallback callback) {
90 openAlert(type, null, body, okButton, callback);
91 }
92
93
94
95
96
97
98
99
100
101
102 @Override
103 public void openAlert(MessageStyleType type, String title, String body, String okButton, AlertCallback callback) {
104 openAlert(type, title, new ViewAdapter(new Label(body, ContentMode.HTML)), okButton, callback);
105 }
106
107
108
109
110
111
112
113
114
115
116 public void openAlert(MessageStyleType type, String title, View body, String okButton, final AlertCallback callback) {
117
118 final BaseDialog dialog = new LightDialog();
119 dialog.addStyleName(type.getCssClass());
120 dialog.addStyleName("alert");
121
122 dialog.setCaption(title);
123 CompositeIcon icon = (CompositeIcon) Classes.getClassFactory().newInstance(type.getIconClass());
124 icon.setStyleName("dialog-icon");
125 dialog.setHeaderToolbar(icon);
126 dialog.showCloseButton();
127
128 dialog.setContent(body.asVaadinComponent());
129
130 Panel shortcutPanel = new Panel();
131 shortcutPanel.setStyleName("shortcut-panel");
132 shortcutPanel.setHeight(100, Unit.PERCENTAGE);
133 shortcutPanel.setWidth(100, Unit.PERCENTAGE);
134 shortcutPanel.setContent(dialog);
135
136 final OverlayCloser overlayCloser = openOverlay(new ViewAdapter(shortcutPanel), ModalityLevel.LIGHT);
137 final ShortcutListener escapeShortcut = new ShortcutListener("Escape shortcut", ShortcutAction.KeyCode.ESCAPE, null) {
138 @Override
139 public void handleAction(Object sender, Object target) {
140 callback.onOk();
141 dialog.closeSelf();
142 }
143 };
144 shortcutPanel.addShortcutListener(escapeShortcut);
145 addOkHandler(dialog, okButton, overlayCloser, callback);
146 dialog.addDialogCloseHandler(createCloseHandler(overlayCloser));
147 }
148
149 private void addOkHandler(BaseDialog dialog, String okButtonText, final OverlayCloser overlayCloser, final AlertCallback cb) {
150 CssLayout footer = new CssLayout();
151 footer.setWidth(100, Unit.PERCENTAGE);
152 footer.addStyleName("v-align-right");
153 Button okButton = new Button(okButtonText, new ClickListener() {
154 @Override
155 public void buttonClick(ClickEvent event) {
156 cb.onOk();
157 overlayCloser.close();
158 }
159 });
160 okButton.focus();
161 footer.addComponent(okButton);
162 dialog.setFooterToolbar(footer);
163 }
164
165
166
167
168
169
170
171
172
173
174
175 @Override
176 public void openConfirmation(MessageStyleType type, View body, String confirmButton, String cancelButton, boolean cancelIsDefault, ConfirmationCallback callback) {
177 openConfirmation(type, null, body, confirmButton, cancelButton, cancelIsDefault, callback);
178 }
179
180
181
182
183
184
185
186
187
188
189
190
191 @Override
192 public void openConfirmation(MessageStyleType type, String title, String body, String confirmButton, String cancelButton, boolean cancelIsDefault, ConfirmationCallback callback) {
193 openConfirmation(type, title, new ViewAdapter(new Label(body, ContentMode.HTML)), confirmButton, cancelButton, cancelIsDefault, callback);
194 }
195
196
197
198
199
200
201
202
203
204
205
206
207 public void openConfirmation(MessageStyleType type, String title, View body, String confirmButton, String cancelButton, boolean cancelIsDefault, final ConfirmationCallback callback) {
208 final ConfirmationDialog dialog = new ConfirmationDialog(body.asVaadinComponent(), confirmButton, cancelButton, cancelIsDefault);
209 dialog.addStyleName(type.getCssClass());
210 dialog.addStyleName("confirmation");
211
212 dialog.setCaption(title);
213 CompositeIcon icon = (CompositeIcon) Classes.getClassFactory().newInstance(type.getIconClass());
214 icon.setStyleName("dialog-icon");
215 dialog.setHeaderToolbar(icon);
216 dialog.showCloseButton();
217
218 dialog.setContent(body.asVaadinComponent());
219
220 Panel shortcutPanel = new Panel();
221 shortcutPanel.setStyleName("shortcut-panel");
222 shortcutPanel.setHeight(100, Unit.PERCENTAGE);
223 shortcutPanel.setWidth(100, Unit.PERCENTAGE);
224 shortcutPanel.setContent(dialog);
225
226 final OverlayCloser overlayCloser = openOverlay(new ViewAdapter(shortcutPanel), ModalityLevel.LIGHT);
227
228 final ShortcutListener escapeShortcut = new ShortcutListener("Escape shortcut", ShortcutAction.KeyCode.ESCAPE, null) {
229 @Override
230 public void handleAction(Object sender, Object target) {
231 callback.onCancel();
232 dialog.closeSelf();
233 }
234 };
235 shortcutPanel.addShortcutListener(escapeShortcut);
236 dialog.addConfirmationHandler(
237 new ConfirmationDialog.ConfirmationEvent.Handler() {
238 @Override
239 public void onConfirmation(ConfirmationEvent event) {
240 if (event.isConfirmed()) {
241 callback.onSuccess();
242 } else {
243 callback.onCancel();
244 }
245 overlayCloser.close();
246 }
247 });
248 dialog.addDialogCloseHandler(createCloseHandler(overlayCloser));
249 }
250
251 private BaseDialog.DialogCloseEvent.Handler createCloseHandler(final OverlayCloser overlayCloser) {
252 return new BaseDialog.DialogCloseEvent.Handler() {
253 @Override
254 public void onClose(BaseDialog.DialogCloseEvent event) {
255 overlayCloser.close();
256 }
257 };
258 }
259
260
261
262
263 @Override
264 public void openNotification(final MessageStyleType type, boolean doesTimeout, View viewToShow) {
265 final Notification notification = new Notification(type);
266 notification.setContent(viewToShow.asVaadinComponent());
267
268 Panel shortcutPanel = new Panel();
269 shortcutPanel.setStyleName("shortcut-panel");
270 shortcutPanel.setWidth(null);
271 shortcutPanel.setContent(notification.asVaadinComponent());
272 final OverlayCloser closer = openOverlay(new ViewAdapter(shortcutPanel), ModalityLevel.NON_MODAL);
273
274 final ShortcutListener escapeShortcut = new ShortcutListener("Escape shortcut", ShortcutAction.KeyCode.ESCAPE, null) {
275 @Override
276 public void handleAction(Object sender, Object target) {
277 closer.close();
278 }
279 };
280 shortcutPanel.addShortcutListener(escapeShortcut);
281
282 notification.addCloseButtonListener(new ClickListener() {
283 @Override
284 public void buttonClick(ClickEvent clickEvent) {
285 closer.close();
286 }
287 });
288
289 notification.addNotificationBodyClickListener(new LayoutEvents.LayoutClickListener() {
290 @Override
291 public void layoutClick(LayoutEvents.LayoutClickEvent layoutClickEvent) {
292 closer.setCloseTimeout(-1);
293 }
294 });
295
296 if (doesTimeout) {
297 closer.setCloseTimeout(TIMEOUT_SECONDS_DEFAULT);
298 }
299
300 }
301
302
303
304
305 @Override
306 public void openNotification(MessageStyleType type, boolean doesTimeout, final String title) {
307 openNotification(type, doesTimeout, new ViewAdapter(new Label(title, ContentMode.HTML)));
308
309 }
310
311
312
313
314 @Override
315 public void openNotification(MessageStyleType type, boolean doesTimeout, String title, String linkText, final NotificationCallback callback) {
316 HorizontalLayout layout = new HorizontalLayout();
317 layout.setSpacing(true);
318 layout.addComponent(new Label(title, ContentMode.HTML));
319
320 Button button = new Button(linkText, new ClickListener() {
321 @Override
322 public void buttonClick(ClickEvent event) {
323 callback.onLinkClicked();
324 }
325 });
326 button.setStyleName(BaseTheme.BUTTON_LINK);
327
328 layout.addComponent(button);
329 openNotification(type, doesTimeout, new ViewAdapter(layout));
330 }
331
332 }