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.admincentral;
35
36 import static com.vaadin.event.ShortcutAction.ModifierKey.*;
37 import static com.vaadin.server.Sizeable.Unit.*;
38 import static com.vaadin.ui.Alignment.TOP_LEFT;
39
40 import info.magnolia.admincentral.badge.NotificationBadge;
41 import info.magnolia.admincentral.badge.TaskBadge;
42 import info.magnolia.admincentral.banner.BannerContainer;
43 import info.magnolia.admincentral.components.InstanceInfo;
44 import info.magnolia.admincentral.findbar.FindBar;
45 import info.magnolia.admincentral.usermenu.UserMenu;
46 import info.magnolia.objectfactory.ComponentProvider;
47 import info.magnolia.ui.api.ioc.AdmincentralScoped;
48
49 import javax.inject.Inject;
50
51 import org.vaadin.jonatan.contexthelp.ContextHelp;
52
53 import com.vaadin.event.ShortcutListener;
54 import com.vaadin.server.Responsive;
55 import com.vaadin.server.ThemeResource;
56 import com.vaadin.ui.Component;
57 import com.vaadin.ui.HorizontalLayout;
58 import com.vaadin.ui.Image;
59 import com.vaadin.ui.UI;
60 import com.vaadin.ui.VerticalLayout;
61
62
63
64
65 @AdmincentralScoped
66 public class ResurfaceUILayout extends VerticalLayout {
67
68 private static final int FORWARD_SLASH = 191;
69
70 @Inject
71 public ResurfaceUILayout(ComponentProvider componentProvider, NotificationBadge notificationBadge, TaskBadge taskBadge,
72 BannerContainer bannerContainer, InstanceInfo instanceInfo, UserMenu userMenu,
73 ViewportLayout viewportLayout) {
74 setSizeFull();
75 setMargin(true);
76 setSpacing(true);
77 addStyleName("shell");
78
79
80 Image logo = new Image(null, new ThemeResource("img/logo-magnolia.svg"));
81 logo.setAlternateText("Magnolia logo");
82 logo.addStyleName("logo");
83
84 Component findBar = prepareFindBar(componentProvider, viewportLayout);
85
86 HorizontalLayout header = new HorizontalLayout();
87 header.setWidth(100, PERCENTAGE);
88 header.setHeight(70, PIXELS);
89 header.setSpacing(true);
90 header.addStyleName("header");
91 header.addComponents(logo, findBar, taskBadge, notificationBadge, instanceInfo, userMenu);
92 header.setComponentAlignment(logo, TOP_LEFT);
93 header.setExpandRatio(findBar, 1f);
94
95 addComponents(header);
96 setExpandRatio(header, 0f);
97
98 VerticalLayout contentContainer = new VerticalLayout();
99 contentContainer.setSpacing(false);
100 contentContainer.setMargin(false);
101 contentContainer.setSizeFull();
102 contentContainer.addComponent(bannerContainer);
103 contentContainer.setExpandRatio(bannerContainer, 0f);
104 contentContainer.addComponent(viewportLayout);
105 contentContainer.setExpandRatio(viewportLayout, 1f);
106
107 addComponent(contentContainer);
108 setExpandRatio(contentContainer, 1f);
109
110
111 Responsive.makeResponsive(this);
112 new ContextHelp().extend(UI.getCurrent());
113 }
114
115 public Component prepareFindBar(ComponentProvider componentProvider, ViewportLayout viewportLayout) {
116 FindBar findBar = componentProvider.newInstance(FindBar.class, viewportLayout);
117 addFocusFindBarShortcut(findBar);
118 return findBar.asVaadinComponent();
119 }
120
121 private void addFocusFindBarShortcut(FindBar findBar) {
122 addShortcutListener(new ShortcutListener("Focus FindBar", FORWARD_SLASH, new int[] { isMacOSX() ? META : CTRL }) {
123 @Override
124 public void handleAction(Object sender, Object target) {
125 findBar.asVaadinComponent().focus();
126 }
127 });
128 }
129
130 static boolean isMacOSX() {
131 return UI.getCurrent().getPage().getWebBrowser().isMacOSX();
132 }
133 }