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;
35
36 import info.magnolia.icons.MagnoliaIcons;
37 import info.magnolia.ui.contentapp.browser.Workbench.WorkbenchContext;
38 import info.magnolia.ui.contentapp.configuration.ContentViewDefinition;
39 import info.magnolia.ui.contentapp.configuration.ContentViewsDefinition;
40 import info.magnolia.ui.framework.UiFrameworkView;
41 import info.magnolia.ui.theme.ResurfaceTheme;
42
43 import java.util.HashMap;
44 import java.util.Map;
45 import java.util.Optional;
46
47 import javax.inject.Inject;
48
49 import com.vaadin.ui.Alignment;
50 import com.vaadin.ui.Button;
51 import com.vaadin.ui.Component;
52 import com.vaadin.ui.CssLayout;
53 import com.vaadin.ui.HorizontalLayout;
54 import com.vaadin.ui.VerticalLayout;
55
56 import lombok.AccessLevel;
57 import lombok.Getter;
58
59
60
61
62
63
64
65 public class ContentViews<T> extends VerticalLayout implements UiFrameworkView {
66
67 private final Map<String, Component> contentViewToggleControls = new HashMap<>();
68 @Getter(AccessLevel.PROTECTED)
69 private final ContentViewsDefinition<T> definition;
70 @Getter(AccessLevel.PROTECTED)
71 private final HorizontalLayout toolBar;
72
73 private ContentView currentActiveContentView;
74 private WorkbenchContext workbenchContext;
75
76 @Inject
77 public ContentViews(WorkbenchContext workbenchContext, ContentViewsDefinition<T> definition) {
78
79 this.workbenchContext = workbenchContext;
80 this.definition = definition;
81
82 setSizeFull();
83 setSpacing(false);
84 setMargin(false);
85 addStyleName("content-views");
86
87 toolBar = new HorizontalLayout();
88 toolBar.addStyleName("toolbar");
89 toolBar.setWidth(100, Unit.PERCENTAGE);
90
91 toolBar.setSpacing(true);
92 toolBar.setDefaultComponentAlignment(Alignment.BOTTOM_LEFT);
93
94
95 final CssLayout viewModes = new CssLayout();
96 viewModes.addStyleName("view-modes");
97 toolBar.addComponent(viewModes);
98 toolBar.setComponentAlignment(viewModes, Alignment.BOTTOM_RIGHT);
99
100 addComponents(toolBar);
101
102 definition.getViews().forEach((id, presenterDefinition) -> {
103 final Button contentViewIcon = createContentViewIcon(id, presenterDefinition.getIcon());
104 contentViewToggleControls.put(id, contentViewIcon);
105 viewModes.addComponent(contentViewIcon);
106 });
107
108 workbenchContext.displayedContentViewId().observe(viewId -> {
109 this.contentViewToggleControls.values().forEach(control -> control.removeStyleName("active"));
110 viewId.ifPresent(this::switchView);
111 });
112 }
113
114 private void switchView(String viewId) {
115 Optional.ofNullable(currentActiveContentView).ifPresent(UiFrameworkView::destroy);
116
117 final ContentViewDefinition<T> contentViewDefinition = definition.getViews().get(viewId);
118
119 this.currentActiveContentView = getViewProvider().create(contentViewDefinition);
120 this.contentViewToggleControls.get(viewId).addStyleName("active");
121
122 addComponent(currentActiveContentView.asVaadinComponent());
123 setExpandRatio(currentActiveContentView.asVaadinComponent(), 1f);
124 }
125
126 protected Button createContentViewIcon(final String viewType, final String icon) {
127 Button button = new Button(MagnoliaIcons.forCssClass(icon).orElse(MagnoliaIcons.VIEW_LIST),
128 clickEvent -> workbenchContext.displayedContentViewId().set(viewType));
129 button.addStyleName(ResurfaceTheme.BUTTON_ICON);
130 return button;
131 }
132
133 }