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.dialog.choosedialog;
35
36 import info.magnolia.cms.i18n.I18nContentSupport;
37 import info.magnolia.i18nsystem.I18nizer;
38 import info.magnolia.i18nsystem.SimpleTranslator;
39 import info.magnolia.objectfactory.ComponentProvider;
40 import info.magnolia.ui.api.app.ChooseDialogCallback;
41 import info.magnolia.ui.api.context.UiContext;
42 import info.magnolia.ui.api.overlay.OverlayCloser;
43 import info.magnolia.ui.api.view.View;
44 import info.magnolia.ui.dialog.BaseDialogPresenter;
45 import info.magnolia.ui.dialog.DialogCloseHandler;
46 import info.magnolia.ui.dialog.DialogView;
47 import info.magnolia.ui.dialog.actionarea.DialogActionExecutor;
48 import info.magnolia.ui.dialog.definition.ChooseDialogDefinition;
49 import info.magnolia.ui.dialog.definition.DialogDefinition;
50 import info.magnolia.ui.form.field.factory.FieldFactory;
51 import info.magnolia.ui.form.field.factory.FieldFactoryFactory;
52 import info.magnolia.ui.vaadin.integration.NullItem;
53 import info.magnolia.ui.vaadin.integration.contentconnector.ContentConnector;
54
55 import java.util.HashSet;
56 import java.util.Set;
57
58 import javax.inject.Inject;
59
60 import org.apache.commons.lang3.StringUtils;
61 import org.slf4j.Logger;
62 import org.slf4j.LoggerFactory;
63
64 import com.vaadin.data.Item;
65 import com.vaadin.data.Property.ValueChangeEvent;
66 import com.vaadin.data.Property.ValueChangeListener;
67 import com.vaadin.ui.AbstractComponent;
68 import com.vaadin.ui.Component;
69 import com.vaadin.ui.Field;
70
71
72
73
74 public class ChooseDialogPresenterImpl extends BaseDialogPresenter implements ChooseDialogPresenter {
75
76 private static final Logger log = LoggerFactory.getLogger(ChooseDialogPresenterImpl.class);
77
78 private FieldFactoryFactory fieldFactoryFactory;
79
80 private I18nContentSupport i18nContentSupport;
81
82 private ContentConnector contentConnector;
83
84 private Object chosenItemId;
85
86 private ChooseDialogCallback callback;
87
88 private Field<Object> field;
89
90 @Inject
91 public ChooseDialogPresenterImpl(
92 FieldFactoryFactory fieldFactoryFactory,
93 ComponentProvider componentProvider,
94 I18nContentSupport i18nContentSupport,
95 DialogActionExecutor executor,
96 ChooseDialogView view,
97 I18nizer i18nizer,
98 SimpleTranslator i18n,
99 ContentConnector contentConnector) {
100 super(componentProvider, executor, view, i18nizer, i18n);
101 this.fieldFactoryFactory = fieldFactoryFactory;
102 this.contentConnector = contentConnector;
103 this.componentProvider = componentProvider;
104 this.i18nContentSupport = i18nContentSupport;
105 }
106
107 @Override
108 public ChooseDialogView start(DialogDefinition definition, UiContext uiContext) {
109 getExecutor().setDialogDefinition(definition);
110 return (ChooseDialogView) super.start(definition, uiContext);
111 }
112
113 @Override
114 public ChooseDialogView start(ChooseDialogCallback callback, ChooseDialogDefinition definition, UiContext appContext, String selectedItemId) {
115 start(definition, appContext);
116 this.callback = callback;
117 final FieldFactory formField = fieldFactoryFactory.createFieldFactory(definition.getField(), new NullItem());
118 formField.setComponentProvider(componentProvider);
119 formField.setI18nContentSupport(i18nContentSupport);
120 this.field = (Field<Object>) formField.createField();
121 if (field instanceof AbstractComponent) {
122 ((AbstractComponent) field).setImmediate(true);
123 }
124 field.addValueChangeListener(new ValueChangeListener() {
125 @Override
126 public void valueChange(ValueChangeEvent event) {
127 chosenItemId = event.getProperty().getValue();
128 }
129 });
130 getView().setCaption(definition.getLabel());
131 getView().setContent(new View() {
132 @Override
133 public Component asVaadinComponent() {
134 return field;
135 }
136 });
137
138 if (StringUtils.isNotBlank(selectedItemId)) {
139 Object itemId = contentConnector.getItemIdByUrlFragment(selectedItemId);
140 if (itemId != null) {
141 field.setValue(itemId);
142 }
143 }
144
145 final OverlayCloser closer = appContext.openOverlay(getView(), getView().getModalityLevel());
146 getView().setCaption(definition.getLabel());
147 getView().addDialogCloseHandler(new DialogCloseHandler() {
148 @Override
149 public void onDialogClose(DialogView dialogView) {
150 closer.close();
151 }
152 });
153 getView().setClosable(true);
154 return getView();
155 }
156
157 @Override
158 public ChooseDialogView getView() {
159 return (ChooseDialogView) super.getView();
160 }
161
162 @Override
163 public Object[] getActionParameters(String actionName) {
164 Set<Object> selected = new HashSet<Object>();
165 selected.add(chosenItemId != null ? chosenItemId : new Object());
166 Item item = contentConnector.getItem(chosenItemId);
167 return new Object[] { actionName, item == null ? new NullItem() : item, ChooseDialogPresenterImpl.this, field, getView(), callback, selected};
168 }
169
170 @Override
171 protected DialogActionExecutor getExecutor() {
172 return (DialogActionExecutor) super.getExecutor();
173 }
174 }