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.contentapp.browser.actionbar;
35
36 import info.magnolia.i18nsystem.SimpleTranslator;
37 import info.magnolia.ui.actionbar.definition.ActionbarDefinition;
38 import info.magnolia.ui.contentapp.browser.context.ValueContext;
39 import info.magnolia.ui.contentapp.browser.preview.PreviewProvider;
40 import info.magnolia.ui.framework.UiFrameworkView;
41 import info.magnolia.ui.framework.datasource.DatasourceComponent;
42 import info.magnolia.ui.framework.datasource.components.SelectedItems;
43 import info.magnolia.ui.vaadin.actionbar.Actionbar;
44 import info.magnolia.util.OptionalConsumer;
45
46 import java.util.ArrayList;
47 import java.util.List;
48
49 import javax.inject.Inject;
50
51 import org.slf4j.Logger;
52 import org.slf4j.LoggerFactory;
53
54 import com.vaadin.server.Resource;
55 import com.vaadin.ui.CssLayout;
56
57
58
59
60
61
62
63
64 public class ActionbarView<T> extends CssLayout implements UiFrameworkView {
65
66 private static final String PREVIEW_SECTION_NAME = "preview";
67
68 private static final Logger log = LoggerFactory.getLogger(ActionbarView.class);
69
70 private final Actionbar actionbar = new Actionbar();
71 private final ActionbarPresenter<T> presenter;
72 private final ActionbarDefinition definition;
73 private final SimpleTranslator simpleTranslator;
74
75 @Inject
76 @SuppressWarnings("unchecked")
77 public ActionbarView(ValueContext<T> valueContext, ActionbarDefinition definition, SimpleTranslator simpleTranslator, @DatasourceComponent PreviewProvider<T> previewProvider) {
78 this.definition = definition;
79 this.simpleTranslator = simpleTranslator;
80 this.presenter = create(ActionbarPresenter.class);
81
82 setHeight(100, Unit.PERCENTAGE);
83 addStyleName("actionbar");
84
85 initialiseActionbar(definition);
86
87 valueContext.current().observe(items -> {
88 this.update();
89 OptionalConsumer.of(items.flatMap(SelectedItems::getFirst).flatMap(previewProvider::getResource))
90 .ifPresent(this::setPreview)
91 .ifNotPresent(() -> setPreview(null));
92 });
93 addComponent(actionbar);
94 }
95
96 private void setPreview(Resource previewResource) {
97 if (previewResource != null) {
98 if (!actionbar.getSections().containsKey(PREVIEW_SECTION_NAME)) {
99 actionbar.addSection(PREVIEW_SECTION_NAME, simpleTranslator.translate("actionbar.preview"));
100 }
101 actionbar.setSectionPreview(previewResource, PREVIEW_SECTION_NAME);
102 } else {
103 if (actionbar.getSections().containsKey(PREVIEW_SECTION_NAME)) {
104 actionbar.removeSection(PREVIEW_SECTION_NAME);
105 }
106 }
107 }
108
109 private void initialiseActionbar(ActionbarDefinition definition) {
110
111 definition.getSections().forEach(section -> {
112 actionbar.addSection(section.getName(), section.getLabel());
113 final List<String> usedActions = new ArrayList<>();
114 section.getGroups().forEach(group -> {
115
116 log.debug("Group actions: {}", group.getItems());
117
118 group.getItems().forEach(action -> {
119 if (usedActions.contains(action.getName())) {
120 log.warn("Action was not added: an action with name '{}' was already added to the section '{}'.", action.getName(), section.getName());
121 return;
122 }
123
124 usedActions.add(action.getName());
125 this.presenter
126 .createActionItem(action.getName(), group.getName())
127 .ifPresent(item -> {
128 actionbar.addAction(item, section.getName());
129 actionbar.setActionEnabled(action.getName(), this.presenter.isEnableAction(action.getName()));
130 });
131 });
132 });
133 });
134
135 this.actionbar.addActionTriggerListener(presenter::fireAction);
136 }
137
138 private void update() {
139 this.definition.getSections().forEach(section -> actionbar.setSectionVisible(section.getName(), false));
140 this.presenter
141 .getAvailableSection(definition.getSections())
142 .ifPresent(section -> {
143 actionbar.setSectionVisible(section.getName(), true);
144 section.getGroups().forEach(group -> group.getItems().forEach(action -> {
145 actionbar.setActionEnabled(action.getName(), this.presenter.isEnableAction(action.getName()));
146 }));
147 });
148 }
149 }