fr.univlorraine.mondossierweb.MainUI.java Source code

Java tutorial

Introduction

Here is the source code for fr.univlorraine.mondossierweb.MainUI.java

Source

/**
 *
 *  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()));
    }
}