Java tutorial
/* * Copyright 2013-2018 Emmanuel BRUN (contact@amapj.fr) * * This file is part of AmapJ. * * AmapJ is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * AmapJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with AmapJ. If not, see <http://www.gnu.org/licenses/>. * * */ package fr.amapj.view.engine.menu; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.vaadin.navigator.Navigator; import com.vaadin.navigator.ViewChangeListener; import com.vaadin.server.FontAwesome; import com.vaadin.server.Page; import com.vaadin.shared.ui.label.ContentMode; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.Component; import com.vaadin.ui.CssLayout; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; import com.vaadin.ui.MenuBar; import com.vaadin.ui.MenuBar.MenuItem; import com.vaadin.ui.themes.ValoTheme; import fr.amapj.service.services.authentification.PasswordManager; import fr.amapj.service.services.parametres.ParametresService; import fr.amapj.service.services.session.SessionManager; import fr.amapj.service.services.session.SessionParameters; import fr.amapj.view.engine.ui.AmapUI; import fr.amapj.view.engine.ui.ValoMenuLayout; /** * Classe de gestion du menu */ public class MenuPart { private static final Logger logger = LogManager.getLogger(); // Correspondance entre les boutons et les vues private Map<String, Button> viewNameToMenuButton; public MenuPart() { } public void buildMainView(final AmapUI ui, ValoMenuLayout root) { root.prepareForMainPage(); viewNameToMenuButton = new HashMap<String, Button>(); CssLayout menu = new CssLayout(); CssLayout menuItemsLayout = new CssLayout(); if (ui.getPage().getWebBrowser().isIE() && ui.getPage().getWebBrowser().getBrowserMajorVersion() == 9) { menu.setWidth("320px"); } // Chargement de tous les menus accesibles par l'utilisateur // et cration du "navigator" List<MenuDescription> allMenus = MenuInfo.getInstance().getMenu(); Navigator nav = new Navigator(ui, root.getContentContainer()); nav.addViewChangeListener(new ViewChangeListener() { @Override public boolean beforeViewChange(ViewChangeEvent event) { logger.info("Entre dans l'cran {}", event.getViewName()); return true; } @Override public void afterViewChange(ViewChangeEvent event) { menu.removeStyleName("valo-menu-visible"); } }); if (allMenus.size() > 0) { MenuDescription first = allMenus.get(0); nav.setErrorView(first.getViewClass()); } for (MenuDescription mD : allMenus) { nav.addView("/" + mD.getMenuName().name().toLowerCase(), mD.getViewClass()); } // Cration du menu root.addMenu(buildMenu(menu, menuItemsLayout, allMenus, nav, ui)); } private CssLayout buildMenu(CssLayout menu, CssLayout menuItemsLayout, List<MenuDescription> allMenus, Navigator navigator, AmapUI ui) { final HorizontalLayout top = new HorizontalLayout(); top.setWidth("100%"); top.setDefaultComponentAlignment(Alignment.MIDDLE_LEFT); top.addStyleName("valo-menu-title"); menu.addComponent(top); final Button showMenu = new Button("Menu", new ClickListener() { @Override public void buttonClick(final ClickEvent event) { if (menu.getStyleName().contains("valo-menu-visible")) { menu.removeStyleName("valo-menu-visible"); } else { menu.addStyleName("valo-menu-visible"); } } }); showMenu.addStyleName(ValoTheme.BUTTON_PRIMARY); showMenu.addStyleName(ValoTheme.BUTTON_SMALL); showMenu.addStyleName("valo-menu-toggle"); showMenu.setIcon(FontAwesome.LIST); menu.addComponent(showMenu); String nomAmap = new ParametresService().getParametres().nomAmap; Label title = new Label("<h2>" + nomAmap + "</h2>", ContentMode.HTML); title.setSizeUndefined(); top.addComponent(title); top.setExpandRatio(title, 1); final MenuBar settings = new MenuBar(); settings.addStyleName("user-menu"); SessionParameters p = SessionManager.getSessionParameters(); MenuItem settingsItem = settings.addItem(p.userPrenom + " " + p.userNom, null, null); settingsItem.addItem("Se dconnecter", new MenuBar.Command() { @Override public void menuSelected(MenuItem selectedItem) { new PasswordManager().disconnect(); ui.buildLoginView(null, null, null); } }); menu.addComponent(settings); menuItemsLayout.setPrimaryStyleName("valo-menuitems"); menu.addComponent(menuItemsLayout); boolean first = true; String firstEntry = null; Button firstButton = null; for (MenuDescription menuDescription : allMenus) { final String view = menuDescription.getMenuName().name().toLowerCase(); final String titleView = menuDescription.getMenuName().getTitle(); if (menuDescription.getCategorie() != null) { Label l = new Label(menuDescription.getCategorie(), ContentMode.HTML); l.setPrimaryStyleName("valo-menu-subtitle"); l.addStyleName("h4"); l.setSizeUndefined(); menuItemsLayout.addComponent(l); } final Button b = new Button(titleView, new ClickListener() { @Override public void buttonClick(final ClickEvent event) { setSelected(event.getButton(), menuItemsLayout); navigator.navigateTo("/" + view); } }); b.setId("amapj.menu." + view); b.setHtmlContentAllowed(true); b.setPrimaryStyleName("valo-menu-item"); b.setIcon(menuDescription.getMenuName().getFont()); menuItemsLayout.addComponent(b); viewNameToMenuButton.put("/" + view, b); if (first) { first = false; firstButton = b; firstEntry = view; } } // Gestion de l'url String f = Page.getCurrent().getUriFragment(); if (f != null && f.startsWith("!")) { f = f.substring(1); } if (f == null || f.equals("") || f.equals("/")) { navigateWithProtect(navigator, "/" + firstEntry); setSelected(firstButton, menuItemsLayout); } else { navigateWithProtect(navigator, f); setSelected(viewNameToMenuButton.get(f), menuItemsLayout); } return menu; } /** * Voir https://vaadin.com/forum/#!/thread/4971527 * https://dev.vaadin.com/ticket/13476 * Ce patch permet d'eviter la propagation d'une erreur lors du chargement de la premire page * * Cette fonction doit tre appele uniquement lors du chargement de la premire page * * Ceci rsoud le problme dans tous les cas, sauf si le login et le mot de passe sont * saisis dans l'url (ce qui correspond un plantage avant la fin de la cration de l'UI) */ private void navigateWithProtect(Navigator navigator, String navigationState) { try { navigator.navigateTo(navigationState); } catch (Exception e) { logger.error("Erreur lors du chargement de la premire page", e); } } /** * * @param viewName du style /xxxx */ private void setSelected(Button b, CssLayout menuItemsLayout) { for (final Iterator<Component> it = menuItemsLayout.iterator(); it.hasNext();) { it.next().removeStyleName("selected"); } // b peut etre null dans le cas du error view provider if (b != null) { b.addStyleName("selected"); } } }