Java tutorial
/** * * ESUP-Portail MONDOSSIERWEB - Copyright (c) 2016 ESUP-Portail consortium * * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package fr.univlorraine.mondossierweb; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import lombok.Getter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.bridge.SLF4JBridgeHandler; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Scope; import org.springframework.core.env.Environment; import org.springframework.security.access.AccessDeniedException; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import com.vaadin.annotations.StyleSheet; import com.vaadin.annotations.Theme; import com.vaadin.navigator.Navigator; import com.vaadin.navigator.View; import com.vaadin.navigator.ViewChangeListener; import com.vaadin.navigator.ViewProvider; import com.vaadin.server.ExternalResource; import com.vaadin.server.FontAwesome; import com.vaadin.server.Page; import com.vaadin.server.Page.UriFragmentChangedEvent; import com.vaadin.server.Page.UriFragmentChangedListener; import com.vaadin.server.VaadinRequest; import com.vaadin.server.VaadinSession; import com.vaadin.shared.ui.label.ContentMode; import com.vaadin.shared.ui.ui.Transport; import com.vaadin.spring.annotation.SpringUI; import com.vaadin.spring.navigator.SpringViewProvider; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.CssLayout; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Image; import com.vaadin.ui.Label; import com.vaadin.ui.Notification; import com.vaadin.ui.Notification.Type; import com.vaadin.ui.TabSheet; import com.vaadin.ui.TabSheet.SelectedTabChangeEvent; import com.vaadin.ui.TabSheet.Tab; import com.vaadin.ui.UI; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.themes.ValoTheme; import fr.univlorraine.mondossierweb.beans.Etudiant; import fr.univlorraine.mondossierweb.controllers.ConfigController; import fr.univlorraine.mondossierweb.controllers.EtudiantController; import fr.univlorraine.mondossierweb.controllers.FavorisController; import fr.univlorraine.mondossierweb.controllers.ListeInscritsController; import fr.univlorraine.mondossierweb.controllers.RechercheArborescenteController; import fr.univlorraine.mondossierweb.controllers.RechercheController; import fr.univlorraine.mondossierweb.controllers.UiController; import fr.univlorraine.mondossierweb.controllers.UserController; import fr.univlorraine.mondossierweb.entities.mdw.Favoris; import fr.univlorraine.mondossierweb.utils.PropertyUtils; import fr.univlorraine.mondossierweb.utils.Utils; import fr.univlorraine.mondossierweb.views.AccesBloqueView; import fr.univlorraine.mondossierweb.views.AccesRefuseView; import fr.univlorraine.mondossierweb.views.AdminView; import fr.univlorraine.mondossierweb.views.AdressesView; import fr.univlorraine.mondossierweb.views.AssistanceView; import fr.univlorraine.mondossierweb.views.CalendrierView; import fr.univlorraine.mondossierweb.views.ErreurView; import fr.univlorraine.mondossierweb.views.EtatCivilView; import fr.univlorraine.mondossierweb.views.FavorisView; import fr.univlorraine.mondossierweb.views.InformationsAnnuellesView; import fr.univlorraine.mondossierweb.views.InscriptionsView; import fr.univlorraine.mondossierweb.views.ListeInscritsView; import fr.univlorraine.mondossierweb.views.NotesView; import fr.univlorraine.mondossierweb.views.RechercheArborescenteView; import fr.univlorraine.mondossierweb.views.RechercheRapideView; import fr.univlorraine.mondossierweb.views.windows.HelpBasicWindow; import fr.univlorraine.mondossierweb.views.windows.HelpWindow; import fr.univlorraine.mondossierweb.views.windows.LoadingIndicatorWindow; import fr.univlorraine.tools.vaadin.GoogleAnalyticsTracker; import fr.univlorraine.tools.vaadin.LogAnalyticsTracker; import fr.univlorraine.tools.vaadin.PiwikAnalyticsTracker; /** * Application Vaadin * * */ @Scope("prototype") @Component @Theme("valo-ul") @StyleSheet("mainView.css") @SuppressWarnings("serial") public class MainUI extends GenericUI { private Logger LOG = LoggerFactory.getLogger(MainUI.class); /** * Nombre maximum de tentatives de reconnexion lors d'une dconnexion. */ private static final int TENTATIVES_RECO = 3; /* Redirige java.util.logging vers SLF4j */ static { SLF4JBridgeHandler.install(); } /* Injections */ @Resource private transient ApplicationContext applicationContext; @Resource private transient Environment environment; @Resource private transient UserController userController; @Resource private transient UiController uiController; @Resource private transient RechercheArborescenteController rechercheArborescenteController; @Resource private transient EtudiantController etudiantController; @Resource private transient ListeInscritsController listeInscritsController; @Resource private transient FavorisController favorisController; @Resource private transient RechercheController rechercheController; @Resource private transient ConfigController configController; @Resource private AdminView adminView; @Resource private AssistanceView assistanceView; @Resource private RechercheRapideView rechercheRapideView; @Resource private RechercheArborescenteView rechercheArborescenteView; @Resource private ListeInscritsView listeInscritsView; @Resource private FavorisView favorisView; private LoadingIndicatorWindow loadingIndicatorWindow = new LoadingIndicatorWindow(); //rang de l'onglet contenant le dossier etudiant dans le conteneur principal private int rangTabDossierEtudiant; //tab Dossier Etudiant private Tab tabDossierEtu; //rang de l'onglet contenant la recherche dans le conteneur principal private int rangTabRecherche; //Le composant principal de la page (contient tabSheetGlobal ou layoutDossierEtudiant en fonction du type de l'utilisateur) private VerticalLayout mainVerticalLayout = new VerticalLayout(); //Le menu de la partie "dossier tudiant" private CssLayout mainMenu = new CssLayout(); //Le layout contenant le menu private CssLayout menuLayout = new CssLayout(mainMenu); //Contenu de la partie "dossier tudiant" contentLayout affiche la vue afficher dans le dossier via le "navigator" private CssLayout contentLayout = new CssLayout(); //Layout principal de la partie "dossier tudiant" : contient le menu et le contentlayout private HorizontalLayout layoutDossierEtudiant = new HorizontalLayout(menuLayout, contentLayout); //le tabSheet global affich aux enseignants (contient les onglets Recherche et Dossier) private TabSheet tabSheetGlobal = new TabSheet(); //Layout de l'onglet Recherche de tabSheetGlobal private VerticalLayout layoutOngletRecherche; //Le sous menu Recherche affich aux enseignants (affiche les onglets recherche rapide, rechercher arbo, liste inscrits, favoris) private TabSheet tabSheetEnseignant = new TabSheet(); /** The view provider. */ @Resource private SpringViewProvider viewProvider; /** Gestionnaire de vues tudiant*/ @Getter private final Navigator navigator = new Navigator(this, contentLayout); // Noms des vues et boutons du menu associs private Map<String, Button> viewButtons = new HashMap<>(); // Noms des vues et index du tab associ private Map<String, Integer> viewEnseignantTab = new HashMap<>(); /** * @see com.vaadin.ui.UI#getCurrent() */ public static MainUI getCurrent() { return (MainUI) UI.getCurrent(); } /** * @see com.vaadin.ui.UI#init(com.vaadin.server.VaadinRequest) */ @Override protected void init(VaadinRequest request) { LOG.debug("init(); mainUI"); if (PropertyUtils.isPushEnabled() && !PropertyUtils.isWebSocketPushEnabled()) { getPushConfiguration().setTransport(Transport.LONG_POLLING); } //Gestion des erreurs VaadinSession.getCurrent().setErrorHandler(e -> { Throwable cause = e.getThrowable(); while (cause instanceof Throwable) { /* Gre les accs non autoriss */ if (cause instanceof AccessDeniedException) { Notification.show(cause.getMessage(), Type.ERROR_MESSAGE); displayViewFullScreen(AccesRefuseView.NAME); return; } if (cause != null && cause.getClass() != null) { String simpleName = cause.getClass().getSimpleName(); if (PropertyUtils.getListeErreursAIgnorer().contains(simpleName)) { Notification.show(cause.getMessage(), Type.ERROR_MESSAGE); displayViewFullScreen(ErreurView.NAME); return; } } cause = cause.getCause(); } // Traite les autres erreurs normalement LOG.error(e.getThrowable().toString(), e.getThrowable()); // Affiche de la vue d'erreur displayViewFullScreen(ErreurView.NAME); //DefaultErrorHandler.doDefault(e); }); // Affiche le nom de l'application dans l'onglet du navigateur getPage().setTitle(environment.getRequiredProperty("app.name")); //Gestion de l'acces a un dossier prcis via url deepLinking (ne peut pas tre fait dans navigator //car le fragment ne correspond pas une vue existante) getPage().addUriFragmentChangedListener(new UriFragmentChangedListener() { public void uriFragmentChanged(UriFragmentChangedEvent source) { //Si l'application est en maintenance on bloque l'accs if (!applicationActive() && !source.getUriFragment().contains(AccesBloqueView.NAME) && !(source.getUriFragment().contains(AdminView.NAME) && userController.isAdmin())) { displayViewFullScreen(AccesBloqueView.NAME); } else { if (source.getUriFragment().contains("accesDossierEtudiant") && userController.isEnseignant()) { rechercheController.accessToDossierEtudiantDeepLinking(source.getUriFragment()); } /*else{ if(source.getUriFragment().contains("accesNotesEtudiant") && userController.isEnseignant()){ rechercheController.accessToDossierEtudiantDeepLinking(source.getUriFragment()); navigator.navigateTo(NotesView.NAME); } }*/ } } }); //Paramtrage du comportement en cas de perte de connexion configReconnectDialog(); /* Construit le gestionnaire de vues utilis par la barre d'adresse et pour naviguer dans le dossier d'un tudiant */ navigator.addProvider(viewProvider); navigator.setErrorProvider(new ViewProvider() { @Override public String getViewName(final String viewAndParameters) { return ErreurView.NAME; } @Override public View getView(final String viewName) { return viewProvider.getView(ErreurView.NAME); } }); navigator.addViewChangeListener(new ViewChangeListener() { private static final long serialVersionUID = 7905379446201794289L; private static final String SELECTED_ITEM = "selected"; @Override public boolean beforeViewChange(ViewChangeEvent event) { //Avant de se rendre sur une vue, on supprime le style "selected" des objets du menu viewButtons.values().forEach(button -> button.removeStyleName(SELECTED_ITEM)); //Si on tente d'accder la vue admin et que l'utilisateur est admin if (event.getViewName().equals(AdminView.NAME) && userController.userCanAccessAdminView()) { //Afficher la vue admin setContent(adminView); return true; } //Si l'application est en maintenance on bloque l'accs if (!applicationActive() && !event.getViewName().equals(AccesBloqueView.NAME)) { displayViewFullScreen(AccesBloqueView.NAME); return false; } //On bloque l'accs aux vues mobile if (!Utils.isViewDesktop(event.getViewName())) { return false; } //On bloque l'accs aux vues enseignants if (Utils.isViewEnseignant(event.getViewName())) { //Si utilisateur n'est pas enseignant if (!userController.isEnseignant()) { //acces bloque return false; } else { //Affichage de la vue enseignant demande if (event.getViewName().equals(FavorisView.NAME)) { navigateToFavoris(); return true; } if (event.getViewName().equals(ListeInscritsView.NAME)) { navigateToListeInscrits(null); return true; } if (event.getViewName().equals(RechercheRapideView.NAME)) { navigateToRechercheRapide(); return true; } if (event.getViewName().equals(RechercheArborescenteView.NAME)) { navigateToRechercheArborescente(null); return true; } return false; //la vue enseignant demande n'est pas gr (ex :vue mobile appele depuis la version desktop) } } return true; } @Override public void afterViewChange(ViewChangeEvent event) { //On rcupre l'lment du menu concern par la vue afficher Button button = viewButtons.get(event.getViewName()); if (button instanceof Button) { //on applique le style "selected" sur l'objet du menu concern par la vue affiche button.addStyleName(SELECTED_ITEM); } } }); //init du tracker initAnalyticsTracker(); //mainVerticalLayout est le contenu principal de la page setContent(mainVerticalLayout); //Si utilisateur enseignant ou tudiant if (userController.isEnseignant() || userController.isEtudiant()) { if (!applicationActive()) { displayViewFullScreen(AccesBloqueView.NAME); } else { //On rcupre l'IP du client GenericUI.getCurrent().getIpClient(); /* Parametre le layoutDossierEtudiant */ menuLayout.setPrimaryStyleName(ValoTheme.MENU_ROOT); //Le contentLayout est scrollable si besoin contentLayout.addStyleName("v-scrollable"); //contentLayout prend toute la place possible contentLayout.setSizeFull(); //le contentLayout prend toute la place disponible dans le layoutDossierEtudiant layoutDossierEtudiant.setExpandRatio(contentLayout, 1); //layoutDossierEtudiant prend toute la place possible layoutDossierEtudiant.setSizeFull(); //Si user enseignant if (userController.isEnseignant()) { //On consultera les notes en vue enseignant vueEnseignantNotesEtResultats = true; //Construit le menu horizontal pour les enseignants tabSheetGlobal.setSizeFull(); tabSheetGlobal.addStyleName(ValoTheme.TABSHEET_FRAMED); rangTabRecherche = 0; rangTabDossierEtudiant = 1; //ajout de l'onglet principal 'recherche' layoutOngletRecherche = new VerticalLayout(); ajoutOngletRecherche(); layoutOngletRecherche.setSizeFull(); tabSheetGlobal.addTab(layoutOngletRecherche, applicationContext.getMessage("mainUI.recherche.title", null, getLocale()), FontAwesome.SEARCH); //ajout de l'onglet principal 'assistance' tabSheetGlobal.addTab(assistanceView, applicationContext.getMessage(assistanceView.NAME + ".title", null, getLocale()), FontAwesome.SUPPORT); //ajout de l'onglet dossier tudiant addTabDossierEtudiant(); //Ce tabSheet sera align droite tabSheetGlobal.addStyleName("right-aligned-tabs"); //Le menu horizontal pour les enseignants est dfinit comme tant le contenu de la page mainVerticalLayout.addComponent(tabSheetGlobal); mainVerticalLayout.setSizeFull(); mainVerticalLayout.setExpandRatio(tabSheetGlobal, 1); } else { //On consultera les notes en vue etudiant vueEnseignantNotesEtResultats = false; //User Etudiant //Le Dossier est dfinit comme tant le contenu de la page mainVerticalLayout.addComponent(layoutDossierEtudiant); mainVerticalLayout.setSizeFull(); mainVerticalLayout.setExpandRatio(layoutDossierEtudiant, 1); //On renseigne l'tudiant dont on consulte le dossier //Rcupration du cod_etu etudiant = new Etudiant( daoCodeLoginEtudiant.getCodEtuFromLogin(userController.getCurrentUserName())); LOG.debug("MainUI etudiant : " + MainUI.getCurrent().getEtudiant().getCod_etu()); //Rcupration de l'tat-civil (et les adresses) etudiantController.recupererEtatCivil(); //On construit le menu affich l'tudiant buildMainMenuEtudiant(); } /* Enregistre l'UI pour la rception de notifications */ uiController.registerUI(this); boolean navigationComplete = false; String fragment = Page.getCurrent().getUriFragment(); if (fragment != null && !fragment.isEmpty()) { //Cas de l'appel initial de l'application via l'url vers la vue admin (sinon le cas est grer dans le listener du navigator if (fragment.contains("adminView") && userController.userCanAccessAdminView()) { //Afficher la vue admin navigator.navigateTo(AdminView.NAME); navigationComplete = true; } if (fragment.contains("accesDossierEtudiant") && userController.isEnseignant()) { rechercheController.accessToDossierEtudiantDeepLinking(fragment); navigationComplete = true; } /*if(fragment.contains("accesNotesEtudiant") && userController.isEnseignant()){ rechercheController.accessToDossierEtudiantDeepLinking(fragment); navigator.navigateTo(NotesView.NAME); navigationComplete=true; }*/ } if (!navigationComplete) { //PROBLEME DU F5 : on passe ici (init()) que quand on reinitialise l'UI ou en cas d'erreur. //On ne peut donc pas rediriger vers des vues qui utilisent des variables non initialises (ex : Main.getCurrent.getEtudiant) if (!applicationActive()) { displayViewFullScreen(AccesBloqueView.NAME); } else { //Si utilisateur enseignant if (userController.isEnseignant()) { //Rcupration des favoris pour l'utilisateur List<Favoris> lfav = favorisController.getFavoris(); if (lfav != null && lfav.size() > 0) { //On affiche la vue des favoris navigator.navigateTo(FavorisView.NAME); } else { //On affiche la vue de recherche rapide navigator.navigateTo(RechercheRapideView.NAME); } //Affichage du message d'intro si besoin afficherMessageIntroEnseignants(false, true); } else { //Si utilisateur tudiant if (userController.isEtudiant()) { //On affiche la vue de l'tat-civil navigator.navigateTo(EtatCivilView.NAME); //Affichage du message d'intro si besoin afficherMessageIntroEtudiants(); } else { //On affiche la vue d'erreur displayViewFullScreen(ErreurView.NAME); } } } } } } else { //Si utilisateur n'est ni enseignant, ni tudiant //On affiche la vue accs refus displayViewFullScreen(AccesRefuseView.NAME); } } /** * Affichage d'une vue en full-screen * @param view */ private void displayViewFullScreen(String view) { setContent(contentLayout); navigator.navigateTo(view); } /** * Affichage du message d'intro aux tudiants */ public void afficherErreurView() { navigator.navigateTo(ErreurView.NAME); //displayViewFullScreen(ErreurView.NAME); } /** * Affichage du message d'intro aux tudiants */ private void afficherMessageIntroEtudiants() { afficherMessageIntro(applicationContext.getMessage("helpWindow.text.etudiant", null, getLocale()), false, true); } /** * Affichage du message d'intro aux enseignants */ public void afficherMessageIntroEnseignants(boolean displayForced, boolean displayCheckBox) { afficherMessageIntro(applicationContext.getMessage("helpWindow.text.enseignant", null, getLocale()), displayForced, displayCheckBox); } /** * Affichage d'un message d'intro * @param text */ private void afficherMessageIntro(String text, boolean displayForced, boolean displayCheckBox) { //On Recupere dans la base si l'utilisateur a indiqu une prfrence pour l'affichage du message d'introduction String val = userController.getPreference(Utils.SHOW_MESSAGE_INTRO_PREFERENCE); //Par dfaut, on affiche le message boolean afficherMessage = true; //Si on a une prfrence indique par l'utilisateur en ce qui concerne l'affichage du message d'intro if (StringUtils.hasText(val)) { //On rcupre ce choix dans afficherMessage afficherMessage = Boolean.valueOf(val); } //Si on doit afficher le message if (displayForced || afficherMessage) { //Cration de la pop-pup contenant le message HelpWindow hbw = new HelpWindow(text, applicationContext.getMessage("helpWindow.defaultTitle", null, getLocale()), displayCheckBox); //Sur la fermeture de la fentre hbw.addCloseListener(g -> { //On va enregistrer en base que l'utilisateur ne souhaite plus afficher le message si la checkbox propose par la pop-up a t coche boolean choix = hbw.getCheckBox().getValue(); //Test si l'utilisateur a coch la case pour ne plus afficher le message if (choix) { //mettre a jour dans la base de donnes userController.updatePreference(Utils.SHOW_MESSAGE_INTRO_PREFERENCE, "false"); } }); //Affichage de la pop_up UI.getCurrent().addWindow(hbw); } } /** * Cration des onglets pour l'enseignant */ private void ajoutOngletRecherche() { tabSheetEnseignant.setSizeFull(); //Onglet recherche rapide tabSheetEnseignant.addTab(rechercheRapideView, applicationContext.getMessage("mainUI.rechercherapide.title", null, getLocale()), FontAwesome.SEARCH); viewEnseignantTab.put(rechercheRapideView.NAME, 0); //Onglet recherche arborescente tabSheetEnseignant.addTab(rechercheArborescenteView, applicationContext.getMessage("mainUI.recherchearbo.title", null, getLocale()), FontAwesome.SITEMAP); viewEnseignantTab.put(rechercheArborescenteView.NAME, 1); //Onglet favoris tabSheetEnseignant.addTab(favorisView, "Favoris", FontAwesome.STAR_O); viewEnseignantTab.put(favorisView.NAME, 2); //On gre le changement d'onglet effectu par l'utilisateur tabSheetEnseignant.addSelectedTabChangeListener(new TabSheet.SelectedTabChangeListener() { public void selectedTabChange(SelectedTabChangeEvent event) { //On rcupre le tabSheet TabSheet tabsheet = event.getTabSheet(); //On rcupre la vue afficher View vue = (View) tabsheet.getSelectedTab(); //Si l'utilisateur veut afficher la vue des favoris if (vue instanceof FavorisView) { //On initialise la vue favorisView.init(); } //Si l'utilisateur veut afficher la vue de la liste des inscrits if (vue instanceof ListeInscritsView) { //On refresh la vue listeInscritsView.refresh(); } //Si l'utilisateur veut afficher la vue de la recherche arborescente if (vue instanceof RechercheArborescenteView) { //On refresh la vue rechercheArborescenteView.refresh(); } } }); //Ajout de l'onglet contenant la liste des inscrits addTabListeInscrits(); //Ajout du tabSheet dans le layout layoutOngletRecherche.addComponent(tabSheetEnseignant); //On passe le layout en sizeFull layoutOngletRecherche.setSizeFull(); //Le tabSheet prend toute la place disponible dans le layout layoutOngletRecherche.setExpandRatio(tabSheetEnseignant, 1); } /** * Ajout de l'onglet contenant la liste des inscrits */ private void addTabListeInscrits() { //Ajout de l'onglet au tabSheet tabSheetEnseignant.addTab(listeInscritsView, applicationContext.getMessage("mainUI.listeinscrits.title", null, getLocale()) + " ", FontAwesome.USERS); //test si c'est la premiere fois qu'on ajoute l'onglet if (!viewEnseignantTab.containsKey(listeInscritsView.NAME)) { //On enregistre que l'onglet de la liste des inscrit est en 4em position (on compte partir de 0) viewEnseignantTab.put(listeInscritsView.NAME, 3); } //On masque l'onglet par dfaut tabSheetEnseignant.getTab(3).setVisible(false); //L'onglet possible une croix pour tre ferm tabSheetEnseignant.getTab(3).setClosable(true); } /** * Ajout de l'onglet principal "dossier" contenant le dossier de l'tudiant */ private void addTabDossierEtudiant() { //Ajout de l'onglet "Dossier" tabDossierEtu = tabSheetGlobal.addTab(layoutDossierEtudiant, applicationContext.getMessage("mainUI.dossier.title", null, getLocale()), FontAwesome.USER); tabSheetGlobal.setTabPosition(tabDossierEtu, rangTabDossierEtudiant); //On cache l'onglet par dfaut tabSheetGlobal.getTab(rangTabDossierEtudiant).setVisible(false); //L'onglet possible une croix pour tre ferm tabSheetGlobal.getTab(rangTabDossierEtudiant).setClosable(true); } /** * Pour se rendre la vue de rechercheArborescente */ /*public void navigateToRechercheArborescenteTab(){ tabSheetEnseignant.setSelectedTab(2); }*/ /** * Construction du menu tudiant */ private void buildMainMenuEtudiant() { //Si l'tudiant dont on affiche le dossier est renseign if (etudiant != null) { //Ajout du style au menu mainMenu.setPrimaryStyleName(ValoTheme.MENU_PART); //On fixe la largeur du menu mainMenu.setWidth("233px"); //Si on a une url pour la photo de l'tudiant if (etudiant.getPhoto() != null) { //Layout contenant la photo HorizontalLayout photoLayout = new HorizontalLayout(); //Ajout du style au layout photoLayout.addStyleName(ValoTheme.MENU_SUBTITLE); //On fixe la largeur du layout photoLayout.setWidth(213, Unit.PIXELS); //La layout a des marges photoLayout.setMargin(true); //Bouton qui indique, en fonction de l'icone, si l'tudiant est inscrit pour l'anne en cours. Par dfaut, icone indiquant que l'tudiant est inscrit Button etuInscritBtn = new Button("", FontAwesome.CHECK_CIRCLE); //Ajout du style au bouton etuInscritBtn.setPrimaryStyleName(ValoTheme.BUTTON_BORDERLESS); //Si l'tudiant est inscrit pour l'anne en cours if (etudiant.isInscritPourAnneeEnCours()) { //On fixe la description du bouton etuInscritBtn.setDescription("Inscrit pour l'anne universitaire " + Utils.getAnneeUniversitaireEnCours(etudiantController.getAnneeUnivEnCours(this))); } else { //On change l'icone du bouton pour indiquer que l'tudiant n'est pas inscrit etuInscritBtn.setIcon(FontAwesome.EXCLAMATION_CIRCLE); //On fixe la description du bouton etuInscritBtn.setDescription("Non Inscrit pour l'anne universitaire " + Utils.getAnneeUniversitaireEnCours(etudiantController.getAnneeUnivEnCours(this))); } //Ajout d'un lment vide dans le layout photoLayout.addComponent(new HorizontalLayout()); //Cration de l'image contenant la photo Image fotoEtudiant = new Image(null, new ExternalResource(etudiant.getPhoto())); fotoEtudiant.setWidth("120px"); //Ajout de la photo au layout photoLayout.addComponent(fotoEtudiant); //Alignement de la photo photoLayout.setComponentAlignment(fotoEtudiant, Alignment.MIDDLE_CENTER); //La photo prend toute la place disponible dans son layout photoLayout.setExpandRatio(fotoEtudiant, 1); //Ajout au layout du bouton, qui indique, en fonction de l'icone, si l'tudiant est inscrit pour l'anne en cours photoLayout.addComponent(etuInscritBtn); //Ajout du layout de la photo au menu mainMenu.addComponent(photoLayout); } //Ajout du Prnom/Nom et codetu de l'tudiant dans le menu Label usernameLabel = new Label(etudiant.getNom() + "<br />" + etudiant.getCod_etu(), ContentMode.HTML); usernameLabel.addStyleName(ValoTheme.MENU_SUBTITLE); usernameLabel.addStyleName("retourALaLigneAutomatique"); usernameLabel.setSizeUndefined(); mainMenu.addComponent(usernameLabel); /* Etat Civil */ addItemMenu("Etat-civil", EtatCivilView.NAME, FontAwesome.USER); //info annuelles visibles que si tudiant inscrit pour l'anne en cours if (etudiant.isInscritPourAnneeEnCours()) { addItemMenu("Informations annuelles", InformationsAnnuellesView.NAME, FontAwesome.INFO_CIRCLE); } /* Adresses */ addItemMenu(applicationContext.getMessage(AdressesView.NAME + ".title", null, getLocale()), AdressesView.NAME, FontAwesome.HOME); /* Inscriptions */ addItemMenu("Inscriptions", InscriptionsView.NAME, FontAwesome.FILE_TEXT); /* Calendrier */ addItemMenu("Calendrier des preuves", CalendrierView.NAME, FontAwesome.CALENDAR); /* Notes et Rsultats */ addItemMenu(applicationContext.getMessage(NotesView.NAME + ".title", null, getLocale()), NotesView.NAME, FontAwesome.LIST); /* Sparation avant Bouton "Aide" */ CssLayout bottomMainMenu1 = new CssLayout(); bottomMainMenu1.setStyleName(ValoTheme.MENU_SUBTITLE); bottomMainMenu1.setSizeUndefined(); mainMenu.addComponent(bottomMainMenu1); /* Aide */ Button helpBtn = new Button(applicationContext.getMessage("helpWindow.defaultTitle", null, getLocale()), FontAwesome.SUPPORT); helpBtn.setPrimaryStyleName(ValoTheme.MENU_ITEM); helpBtn.addClickListener(e -> { UI.getCurrent() .addWindow(new HelpBasicWindow( applicationContext.getMessage("helpWindow.text.etudiant", null, getLocale()), applicationContext.getMessage("helpWindow.defaultTitle", null, getLocale()), true)); }); mainMenu.addComponent(helpBtn); /* Deconnexion */ //Voir si on peut accder l'appli hors ENT, le dtecter, et afficher le bouton dconnexion if (configController.isLogoutCasPropose() && userController.isEtudiant()) { Button decoBtn = new Button("Dconnexion", FontAwesome.SIGN_OUT); decoBtn.setPrimaryStyleName(ValoTheme.MENU_ITEM); decoBtn.addClickListener(e -> { getUI().getPage().setLocation("j_spring_security_logout"); }); mainMenu.addComponent(decoBtn); } /* Sparation */ CssLayout bottomMainMenu = new CssLayout(); bottomMainMenu.setStyleName(ValoTheme.MENU_SUBTITLE); bottomMainMenu.setSizeUndefined(); mainMenu.addComponent(bottomMainMenu); } } /** * Ajout d'un item dans le menu tudiant * @param caption * @param viewName * @param icon */ private void addItemMenu(String caption, String viewName, com.vaadin.server.Resource icon) { //Cration du bouton Button itemBtn = new Button(caption, icon); itemBtn.setPrimaryStyleName(ValoTheme.MENU_ITEM); //Gestion du clic sur le bouton itemBtn.addClickListener(e -> navigator.navigateTo(viewName)); viewButtons.put(viewName, itemBtn); //Ajout du bouton au menu mainMenu.addComponent(itemBtn); } /** * @see com.vaadin.ui.UI#detach() */ @Override public void detach() { /* Se dsinscrit de la rception de notifications (utile en cas d'utilisation du push) */ uiController.unregisterUI(this); super.detach(); } /** * Affichage de la vue Recherche Arborescente * @param parameterMap */ public void navigateToRechercheArborescente(Map<String, String> parameterMap) { LOG.debug("MainUI " + userController.getCurrentUserName() + " navigateToRechercheArborescente"); //rcupration de l'onglet qui affiche la vue RechercheArborescente int numtab = viewEnseignantTab.get(rechercheArborescenteView.NAME); //Si on a des paramtres renseigns if (parameterMap != null) { //initialisation de la vue avec les paramtres (on se place sur un lment prcis de l'arborescence) rechercheArborescenteView.initFromParameters(parameterMap); } //On slectionne l'onglet pour afficher la vue tabSheetEnseignant.setSelectedTab(numtab); } /** * Affichage de la vue Liste Inscrits * @param parameterMap */ public void navigateToListeInscrits(Map<String, String> parameterMap) { LOG.debug("MainUI " + userController.getCurrentUserName() + " navigateToListeInscrits"); //rcupration de l'onglet qui affiche la vue ListeInscrits int numtab = viewEnseignantTab.get(listeInscritsView.NAME); //Si on a des paramtres renseigns if (parameterMap != null) { //Rcupation de la liste des inscrits des inscrits en fonction des paramtres listeInscritsController.recupererLaListeDesInscrits(parameterMap, null, this); //initialisation de la vue avec la liste des inscrits listeInscritsView.initListe(); } //Si l'onglet a t closed if (tabSheetEnseignant.getTab(numtab) == null) { //On recr l'onglet addTabListeInscrits(); } //On affiche l'onglet tabSheetEnseignant.getTab(numtab).setVisible(true); //On se rend sur l'onglet pour afficher la vue ListeInscrits tabSheetEnseignant.setSelectedTab(numtab); } /** * Affichage de la vue des favoris */ public void navigateToFavoris() { LOG.debug("MainUI " + userController.getCurrentUserName() + " navigateToFavoris"); //rcupration de l'onglet qui affiche la vue des favoris int numtab = viewEnseignantTab.get(favorisView.NAME); //On affiche l'onglet tabSheetEnseignant.getTab(numtab).setVisible(true); //On se rend sur l'onglet pour afficher la vue des favoris tabSheetEnseignant.setSelectedTab(numtab); //On se rend sur l'onglet Recherche dans le tabSheet principal au cas o on vienne du dossier d'un tudiant tabSheetGlobal.setSelectedTab(rangTabRecherche); } /** * Affichage de la vue RechercheRapide */ public void navigateToRechercheRapide() { LOG.debug("MainUI " + userController.getCurrentUserName() + " navigateToRechercheRapide"); //rcupration de l'onglet qui affiche la vue RechercheRapide int numtab = viewEnseignantTab.get(rechercheRapideView.NAME); //On affiche l'onglet tabSheetEnseignant.getTab(numtab).setVisible(true); //On se rend sur l'onglet pour afficher la vue RechercheRapide tabSheetEnseignant.setSelectedTab(numtab); //On se rend sur l'onglet Recherche dans le tabSheet principal au cas o on vienne du dossier d'un tudiant tabSheetGlobal.setSelectedTab(rangTabRecherche); } /** * Affichage du dossier d'un tudiant * @param parameterMap */ public void navigateToDossierEtudiant(Map<String, String> parameterMap) { LOG.debug("MainUI " + userController.getCurrentUserName() + " navigateToDossierEtudiant : " + etudiant.getCod_etu()); //Si l'onglet a t closed if (tabDossierEtu == null || tabSheetGlobal.getTabPosition(tabDossierEtu) < 0) { //On recr l'onglet addTabDossierEtudiant(); } //Si le menu a dj t initialis if (mainMenu != null) { //On supprime le contenu du menu mainMenu.removeAllComponents(); } //On reconstruit le menu pour l'tudiant concern buildMainMenuEtudiant(); //On rend visible l'onglet "Dossier" dans le tabSheet principal tabSheetGlobal.getTab(rangTabDossierEtudiant).setVisible(true); //On se rend sur l'onglet "Dossier" dans le tabSheet principal tabSheetGlobal.setSelectedTab(rangTabDossierEtudiant); //par dfaut on affiche la vue tat-civil navigator.navigateTo(EtatCivilView.NAME); } public void startBusyIndicator() { addWindow(loadingIndicatorWindow); } public void stopBusyIndicator() { loadingIndicatorWindow.close(); } private boolean applicationActive() { return configController.isApplicationActive() && ((userController.isEtudiant() && configController.isPartieEtudiantActive()) || (!userController.isEnseignant() && !userController.isEtudiant()) || (userController.isEnseignant() && configController.isPartieEnseignantActive())); } /** * Initialise le tracker d'activit. */ private void initAnalyticsTracker() { if (environment.getProperty("piwik.tracker.url") instanceof String && environment.getProperty("piwik.site.id") instanceof String) { analyticsTracker = new PiwikAnalyticsTracker(this, environment.getProperty("piwik.tracker.url"), environment.getProperty("piwik.site.id")); } else if (environment.getProperty("google.analytics.account") instanceof String) { analyticsTracker = new GoogleAnalyticsTracker(this, environment.getProperty("google.analytics.account")); } else { analyticsTracker = new LogAnalyticsTracker(); } analyticsTracker.trackNavigator(navigator); } /** * Configure la reconnexion en cas de dconnexion. */ private void configReconnectDialog() { getReconnectDialogConfiguration().setDialogModal(true); getReconnectDialogConfiguration().setReconnectAttempts(TENTATIVES_RECO); getReconnectDialogConfiguration() .setDialogText(applicationContext.getMessage("vaadin.reconnectDialog.text", null, getLocale())); getReconnectDialogConfiguration().setDialogTextGaveUp( applicationContext.getMessage("vaadin.reconnectDialog.textGaveUp", null, getLocale())); } }