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.mediaeditor.action;
35
36 import info.magnolia.event.EventBus;
37 import info.magnolia.objectfactory.ComponentProvider;
38 import info.magnolia.ui.ValueContext;
39 import info.magnolia.ui.api.action.ActionExecutionException;
40 import info.magnolia.ui.availability.AvailabilityChecker;
41 import info.magnolia.ui.dialog.ActionButton;
42 import info.magnolia.ui.dialog.ActionExecution;
43 import info.magnolia.ui.mediaeditor.MediaEditorEventBus;
44 import info.magnolia.ui.mediaeditor.MediaEditorView;
45 import info.magnolia.ui.mediaeditor.data.MediaState;
46 import info.magnolia.ui.mediaeditor.field.MediaField;
47 import info.magnolia.ui.mediaeditor.provider.MediaEditorActionDefinition;
48
49 import java.util.Iterator;
50 import java.util.List;
51
52 import javax.inject.Named;
53
54 import org.slf4j.Logger;
55 import org.slf4j.LoggerFactory;
56
57 import com.vaadin.ui.Component;
58
59
60
61
62
63 public abstract class MediaEditorUIAction extends MediaEditorAction {
64 private static final Logger log = LoggerFactory.getLogger(MediaEditorUIAction.class);
65
66 protected MediaEditorView view;
67
68 public MediaEditorUIAction(MediaEditorActionDefinition definition,
69 MediaEditorView view,
70 ValueContext<MediaState> valueContext,
71 @Named(MediaEditorEventBus.NAME) EventBus eventBus) {
72 super(definition, valueContext, eventBus);
73 this.view = view;
74 }
75
76 @Override
77 public void execute() throws ActionExecutionException {
78 MediaField newMediaField = createMediaField();
79 if (newMediaField != null) {
80 view.clearActions();
81 view.setMediaContent(newMediaField);
82 view.setToolbar(getStatusControls());
83
84 List<ActionContext> actionContexts = getActionContextList();
85 Iterator<ActionContext> it = actionContexts.iterator();
86 boolean defaultIsSet = false;
87 while (it.hasNext()) {
88 ActionContext action = it.next();
89 ComponentProvider componentProvider = view.getComponentProvider();
90 final ValueContext<Object> valueContext = view.bindContext(ValueContext.class);
91 final ActionExecution<?> actionExecution = new ActionExecution<Object>(action.getDefinition(), componentProvider) {
92 @Override
93 public void execute() {
94 action.getListener().onActionFired(getDefinition().getName());
95 }
96 };
97 AvailabilityChecker<?> availabilityChecker = (anyDef, anyItems) -> true;
98 ActionButton<?> actionButton = componentProvider.newInstance(ActionButton.class, valueContext, actionExecution, availabilityChecker);
99 view.getEditorActionLayout().addPrimaryAction(actionButton);
100 if (!defaultIsSet) {
101 actionButton.addStyleNames("default commitState", "commit v-button-commit");
102 defaultIsSet = true;
103 }
104 }
105 newMediaField.setValue(valueContext.getSingleOrThrow().getState());
106 } else {
107 log.warn("Provider did not provide any content UI ");
108 }
109
110 }
111
112 protected abstract List<ActionContext> getActionContextList();
113
114 protected abstract Component getStatusControls();
115
116 protected abstract MediaField createMediaField();
117
118 }