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 boolean isExecutingAction;
89
90 private Field<Object> field;
91
92 @Inject
93 public ChooseDialogPresenterImpl(
94 FieldFactoryFactory fieldFactoryFactory,
95 ComponentProvider componentProvider,
96 I18nContentSupport i18nContentSupport,
97 DialogActionExecutor executor,
98 ChooseDialogView view,
99 I18nizer i18nizer,
100 SimpleTranslator i18n,
101 ContentConnector contentConnector) {
102 super(componentProvider, executor, view, i18nizer, i18n);
103 this.fieldFactoryFactory = fieldFactoryFactory;
104 this.contentConnector = contentConnector;
105 this.componentProvider = componentProvider;
106 this.i18nContentSupport = i18nContentSupport;
107 }
108
109 @Override
110 public ChooseDialogView start(DialogDefinition definition, UiContext uiContext) {
111 getExecutor().setDialogDefinition(definition);
112 return (ChooseDialogView) super.start(definition, uiContext);
113 }
114
115 @Override
116 public ChooseDialogView start(ChooseDialogCallback callback, ChooseDialogDefinition definition, UiContext appContext, String selectedItemId) {
117 start(definition, appContext);
118 this.callback = callback;
119
120
121 if (callback != null) {
122 getView().addDialogCloseHandler(new DialogCloseHandler() {
123
124 @Override
125 public void onDialogClose(DialogView dialogView) {
126 if (!isExecutingAction) {
127 ChooseDialogPresenterImpl.this.callback.onCancel();
128 }
129 }
130 });
131 }
132
133 final FieldFactory formField = fieldFactoryFactory.createFieldFactory(definition.getField(), new NullItem());
134 formField.setComponentProvider(componentProvider);
135 this.field = (Field<Object>) formField.createField();
136 if (field instanceof AbstractComponent) {
137 ((AbstractComponent) field).setImmediate(true);
138 }
139 field.addValueChangeListener(new ValueChangeListener() {
140 @Override
141 public void valueChange(ValueChangeEvent event) {
142 chosenItemId = event.getProperty().getValue();
143 }
144 });
145 getView().setCaption(definition.getLabel());
146 getView().setContent(new View() {
147 @Override
148 public Component asVaadinComponent() {
149 return field;
150 }
151 });
152
153 if (StringUtils.isNotBlank(selectedItemId)) {
154 Object itemId = contentConnector.getItemIdByUrlFragment(selectedItemId);
155 if (itemId != null) {
156 field.setValue(itemId);
157 }
158 }
159
160 final OverlayCloser closer = appContext.openOverlay(getView(), getView().getModalityLevel());
161 getView().setCaption(definition.getLabel());
162 getView().addDialogCloseHandler(new DialogCloseHandler() {
163 @Override
164 public void onDialogClose(DialogView dialogView) {
165 closer.close();
166 }
167 });
168 getView().setClosable(true);
169 return getView();
170 }
171
172 @Override
173 public ChooseDialogView getView() {
174 return (ChooseDialogView) super.getView();
175 }
176
177 @Override
178 public Object[] getActionParameters(String actionName) {
179 Set<Object> selected = new HashSet<Object>();
180 if (chosenItemId == null) {
181 chosenItemId = contentConnector.getDefaultItemId();
182 }
183 selected.add(chosenItemId);
184 Item item = contentConnector.getItem(chosenItemId);
185 return new Object[] { actionName, item, ChooseDialogPresenterImpl.this, field, getView(), callback, selected };
186 }
187
188 @Override
189 protected void executeAction(String actionName, Object[] actionContextParams) {
190 isExecutingAction = true;
191 super.executeAction(actionName, actionContextParams);
192 isExecutingAction = false;
193 }
194
195 @Override
196 protected DialogActionExecutor getExecutor() {
197 return (DialogActionExecutor) super.getExecutor();
198 }
199 }