fr.univlorraine.mondossierweb.views.RechercheArborescenteView.java Source code

Java tutorial

Introduction

Here is the source code for fr.univlorraine.mondossierweb.views.RechercheArborescenteView.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.views;

import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import com.vaadin.data.Item;
import com.vaadin.data.util.HierarchicalContainer;
import com.vaadin.event.ItemClickEvent;
import com.vaadin.event.ItemClickEvent.ItemClickListener;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.server.FontAwesome;
import com.vaadin.shared.ui.MarginInfo;
import com.vaadin.spring.annotation.SpringView;
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.ComboBox;
import com.vaadin.ui.FormLayout;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Notification;
import com.vaadin.ui.Table;
import com.vaadin.ui.Table.CellStyleGenerator;
import com.vaadin.ui.Tree.ExpandEvent;
import com.vaadin.ui.Tree.ExpandListener;
import com.vaadin.ui.TreeTable;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.themes.ValoTheme;

import fr.univlorraine.mondossierweb.MainUI;
import fr.univlorraine.mondossierweb.beans.CollectionDeGroupes;
import fr.univlorraine.mondossierweb.beans.ElpDeCollection;
import fr.univlorraine.mondossierweb.beans.Groupe;
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.UserController;
import fr.univlorraine.mondossierweb.entities.apogee.Composante;
import fr.univlorraine.mondossierweb.entities.apogee.ElementPedagogique;
import fr.univlorraine.mondossierweb.entities.apogee.VersionDiplome;
import fr.univlorraine.mondossierweb.entities.apogee.VersionEtape;
import fr.univlorraine.mondossierweb.entities.mdw.Favoris;
import fr.univlorraine.mondossierweb.entities.mdw.FavorisPK;
import fr.univlorraine.mondossierweb.entities.vaadin.ObjetBase;
import fr.univlorraine.mondossierweb.services.apogee.ComposanteService;
import fr.univlorraine.mondossierweb.services.apogee.ComposanteServiceImpl;
import fr.univlorraine.mondossierweb.utils.PropertyUtils;
import fr.univlorraine.mondossierweb.utils.Utils;
import fr.univlorraine.mondossierweb.utils.miscellaneous.ReferencedButton;

/**
 * Recherche arborescente
 */
@Component
@Scope("prototype")
@SpringView(name = RechercheArborescenteView.NAME)
public class RechercheArborescenteView extends VerticalLayout implements View {
    private static final long serialVersionUID = -2056224835347802529L;

    public static final String NAME = "rechercheArborescenteView";

    private static final String ID_PROPERTY = "id";

    private static final String TRUE_ID_PROPERTY = "trueObjectId";

    private static final String LIBELLE_PROPERTY = "libelle";

    private static final String DEPLIE_PROPERTY = "deplie";

    private static final String TYPE_PROPERTY = "type";

    /* les champs de la table */
    public static final String[] DETAIL_FIELDS_ORDER = { "libelle", "trueObjectId", "type" };
    /* les champs de la table */
    public static final String[] DETAIL_FIELDS_ORDER_ON_REFRESH = { "libelle", "trueObjectId", "type", "actions" };

    /* Injections */
    @Resource
    private transient ApplicationContext applicationContext;
    @Resource
    private transient UserController userController;
    @Resource
    private transient RechercheArborescenteController rechercheArborescenteController;
    @Resource
    private transient EtudiantController etudiantController;
    @Resource
    private transient FavorisController favorisController;
    /** {@link ComposanteServiceImpl} */
    @Resource
    private ComposanteService composanteService;
    @Resource
    private transient RechercheController rechercheController;
    @Resource
    private transient ListeInscritsController listeInscritsController;

    /** Thread pool  */
    ExecutorService executorService = Executors.newSingleThreadExecutor();

    private HierarchicalContainer hc;

    private TreeTable table;

    private List<String> markedRows;

    private List<String> liste_types_favoris;

    private List<String> liste_types_inscrits;

    private List<String> liste_types_deplier;

    private List<ReferencedButton> listeBoutonFavoris;

    private Label ligneSelectionneeLabel;

    private Label vetElpSelectionneLabel;

    private Label labelLigneSelectionneeLabel;

    private FormLayout elpLayout;

    private String annee;

    private ComboBox comboBoxAnneeUniv;

    private String code;

    private String type;

    private boolean initEffectue;

    private Button reinitButton;

    /**
     * liste des composantes actives
     */
    private List<Composante> lcomp;

    public void refresh() {
        //On vrifie le droit d'accder  la vue
        if (UI.getCurrent() instanceof MainUI && userController.isEnseignant()) {
            //Actualiser de l'affiche du bouton de mise en favori
            if (table != null && hc != null) {

                recuperationDesfavoris();

                if (listeBoutonFavoris != null) {

                    for (ReferencedButton btnfav : listeBoutonFavoris) {

                        if (markedRows.contains(btnfav.getIdObj())) {
                            btnfav.getButton().setIcon(FontAwesome.TRASH_O);
                            btnfav.getButton().setStyleName(ValoTheme.BUTTON_DANGER);
                            btnfav.getButton().addStyleName("deletefavbutton");
                            btnfav.getButton().setDescription(
                                    applicationContext.getMessage(NAME + ".supprimerfavori", null, getLocale()));
                        } else {
                            btnfav.getButton().setIcon(FontAwesome.STAR_O);
                            btnfav.getButton().setStyleName(ValoTheme.BUTTON_PRIMARY);
                            btnfav.getButton().setDescription(
                                    applicationContext.getMessage(NAME + ".ajouterfavori", null, getLocale()));
                        }
                    }
                }
            }
        }
    }

    private void recuperationDesfavoris() {
        //Recuperation des favoris
        List<Favoris> lfav = favorisController.getFavorisFromLogin(userController.getCurrentUserName());
        markedRows = new LinkedList<String>();
        for (Favoris fav : lfav) {
            String idFav = fav.getId().getTypfav() + ":" + fav.getId().getIdfav();
            markedRows.add(idFav);
        }
    }

    /**
     * reinitialise la vue pour pointer sur les donnes en paramtres
     * @param parameterMap
     */
    public void initFromScratch() {
        removeAllComponents();
        initEffectue = false;
        annee = null;
        code = null;
        type = null;
        init();
    }

    /**
     * reinitialise la vue pour pointer sur les donnes en paramtres
     * @param parameterMap
     */
    public void initFromParameters(Map<String, String> parameterMap) {
        removeAllComponents();
        initEffectue = false;
        annee = null;
        code = parameterMap.get("code");
        type = parameterMap.get("type");
        init();
    }

    /**
     * Initialise la vue
     */
    @PostConstruct
    public void init() {

        //On vrifie le droit d'accder  la vue
        if (userController.isEnseignant()) {
            /* Style */
            setMargin(false);
            setSpacing(false);
            setSizeFull();

            if (listeBoutonFavoris != null) {
                listeBoutonFavoris.clear();
            } else {
                listeBoutonFavoris = new LinkedList<ReferencedButton>();
            }

            liste_types_favoris = new LinkedList<String>();
            liste_types_favoris.add(Utils.CMP);
            liste_types_favoris.add(Utils.ELP);
            liste_types_favoris.add(Utils.VET);

            liste_types_inscrits = new LinkedList<String>();
            liste_types_inscrits.add(Utils.ELP);
            liste_types_inscrits.add(Utils.VET);

            liste_types_deplier = new LinkedList<String>();
            liste_types_deplier.add(Utils.ELP);
            liste_types_deplier.add(Utils.VET);

            recuperationDesfavoris();

            HorizontalLayout btnLayout = new HorizontalLayout();
            btnLayout.setMargin(false);
            btnLayout.setSpacing(false);
            btnLayout.setWidth("100%");

            comboBoxAnneeUniv = new ComboBox(applicationContext.getMessage(NAME + ".anneeuniv", null, getLocale()));
            comboBoxAnneeUniv.setPageLength(5);
            comboBoxAnneeUniv.setTextInputAllowed(false);
            comboBoxAnneeUniv.setNullSelectionAllowed(false);
            //Initialisation de la liste des annes
            List<String> lanneeUniv = rechercheArborescenteController.recupererLesDernieresAnneeUniversitaire();
            if (lanneeUniv != null && lanneeUniv.size() > 0) {
                for (String anneeUniv : lanneeUniv) {
                    comboBoxAnneeUniv.addItem(anneeUniv);
                    int anneenplusun = Integer.parseInt(anneeUniv) + 1;
                    comboBoxAnneeUniv.setItemCaption(anneeUniv, anneeUniv + "/" + anneenplusun);
                }
                if (annee == null) {
                    annee = etudiantController.getAnneeUnivEnCours(MainUI.getCurrent());
                    //annee = lanneeUniv.get(0);
                }
            }
            comboBoxAnneeUniv.setValue(annee);
            comboBoxAnneeUniv.setStyleName(ValoTheme.COMBOBOX_SMALL);
            comboBoxAnneeUniv.addValueChangeListener(e -> changerAnnee((String) comboBoxAnneeUniv.getValue()));

            reinitButton = new Button();
            reinitButton.setDescription(
                    applicationContext.getMessage(NAME + ".reinitbutton.description", null, getLocale()));
            reinitButton.addClickListener(e -> {
                initFromScratch();
            });
            reinitButton.setStyleName(ValoTheme.BUTTON_DANGER);
            reinitButton.setIcon(FontAwesome.TIMES);
            if (!StringUtils.hasText(code)) {
                reinitButton.setVisible(false);
            }
            labelLigneSelectionneeLabel = new Label();
            labelLigneSelectionneeLabel
                    .setValue(applicationContext.getMessage(NAME + ".ligneselectionnee", null, getLocale()));
            labelLigneSelectionneeLabel.addStyleName("label-align-right");
            labelLigneSelectionneeLabel.setVisible(false);

            HorizontalLayout btnLeftLayout = new HorizontalLayout();
            btnLeftLayout.setWidth("100%");
            btnLeftLayout.setMargin(true);
            btnLeftLayout.addComponent(comboBoxAnneeUniv);
            btnLeftLayout.setComponentAlignment(comboBoxAnneeUniv, Alignment.MIDDLE_LEFT);
            /*btnLeftLayout.addComponent(reinitButton);
            btnLeftLayout.setComponentAlignment(reinitButton, Alignment.BOTTOM_RIGHT);*/
            btnLeftLayout.addComponent(labelLigneSelectionneeLabel);
            btnLeftLayout.setComponentAlignment(labelLigneSelectionneeLabel, Alignment.MIDDLE_CENTER);
            btnLayout.addComponent(btnLeftLayout);

            ligneSelectionneeLabel = new Label();
            //ligneSelectionneeLabel.setCaption(applicationContext.getMessage(NAME+".ligneselectionnee", null, getLocale()));
            ligneSelectionneeLabel.setVisible(false);
            elpLayout = new FormLayout();
            elpLayout.setMargin(false);
            vetElpSelectionneLabel = new Label();
            vetElpSelectionneLabel.setVisible(false);
            elpLayout.addComponent(vetElpSelectionneLabel);
            elpLayout.setVisible(false);
            VerticalLayout ligneLayout = new VerticalLayout();
            ligneLayout.addComponent(ligneSelectionneeLabel);
            ligneLayout.addComponent(elpLayout);

            HorizontalLayout rightLayout = new HorizontalLayout();
            rightLayout.setSizeFull();
            rightLayout.setSpacing(true);
            rightLayout.setMargin(true);
            rightLayout.addComponent(ligneLayout);
            rightLayout.setComponentAlignment(ligneLayout, Alignment.MIDDLE_LEFT);
            rightLayout.addComponent(reinitButton);
            rightLayout.setComponentAlignment(reinitButton, Alignment.MIDDLE_RIGHT);
            rightLayout.setExpandRatio(ligneLayout, 1);
            btnLayout.addComponent(rightLayout);
            btnLayout.setComponentAlignment(rightLayout, Alignment.MIDDLE_LEFT);

            addComponent(btnLayout);

            if (code != null && type != null) {
                Label elementRecherche = new Label(code + " " + type);
                elementRecherche.addStyleName(ValoTheme.LABEL_H1);
                //addComponent(elementRecherche);

            }

            table = new TreeTable();
            table.setSizeFull();
            table.setStyleName("scrollabletable");
            table.setSelectable(true);

            initComposantes();

            //gestion du style pour les lignes en favori
            table.setCellStyleGenerator(new CellStyleGenerator() {
                @Override
                public String getStyle(final Table source, final Object itemId, final Object propertyId) {
                    String style = null;
                    if (propertyId == null && markedRows.contains(itemId)) {
                        style = "marked";
                    }
                    return style;
                }
            });

            table.addItemClickListener(new ItemClickListener() {

                @Override
                public void itemClick(ItemClickEvent event) {
                    selectionnerLigne(event.getItemId());
                }

            });

            //gestion du clic sur la fleche pour dplier une entre
            table.addExpandListener(new ExpandListener() {
                private static final long serialVersionUID = 8532342540008245348L;

                @Override
                public void nodeExpand(ExpandEvent event) {
                    if (event != null && event.getItemId() != null && hc != null
                            && hc.getItem(event.getItemId()) != null
                            && hc.getItem(event.getItemId()).getItemProperty(TYPE_PROPERTY) != null) {
                        selectionnerLigne(event.getItemId());
                        deplierNoeud((String) event.getItemId(), true);
                    }
                }
            });

            VerticalLayout tableVerticalLayout = new VerticalLayout();
            tableVerticalLayout.setMargin(new MarginInfo(false, true, true, true));
            tableVerticalLayout.setSizeFull();
            tableVerticalLayout.addComponent(table);
            tableVerticalLayout.setExpandRatio(table, 1);
            addComponent(tableVerticalLayout);
            setExpandRatio(tableVerticalLayout, 1);

        }
    }

    private void initComposantes() {
        if (hc != null && hc.size() > 0) {
            hc.removeAllItems();
        }
        hc = new HierarchicalContainer();
        hc.addContainerProperty(ID_PROPERTY, String.class, "");
        hc.addContainerProperty(TRUE_ID_PROPERTY, String.class, "");
        hc.addContainerProperty(LIBELLE_PROPERTY, String.class, "");
        hc.addContainerProperty(TYPE_PROPERTY, String.class, "");
        hc.addContainerProperty(DEPLIE_PROPERTY, String.class, "");

        List<ObjetBase> lobj = new LinkedList<ObjetBase>();
        String rootItemId = null;
        //Si aucun code ni type spcifi on rcupre toutes les composantes
        if (!StringUtils.hasText(code) || !StringUtils.hasText(type)) {
            if (lcomp == null || lcomp.size() == 0) {
                lcomp = composanteService.findComposantesEnService();
            }

            for (Composante comp : lcomp) {
                ObjetBase obj = new ObjetBase();
                rechercheArborescenteController.renseigneObjFromCmp(obj, comp);
                lobj.add(obj);
                Item i = hc.addItem(obj.getId());
                renseignerItem(i, obj);
            }

        } else {

            //On ajoute l'objet racine et on dplira ci-dessous le premier niveau
            ObjetBase obj = rechercheArborescenteController.getObj(code, type);
            Item i = hc.addItem(obj.getId());
            renseignerItem(i, obj);
            rootItemId = (String) i.getItemProperty(ID_PROPERTY).getValue();

        }

        //Vrai si ce n'est pas la premiere initialisation de la table
        /*if(initEffectue){
           //table.removeAllItems();
        }*/
        table.setContainerDataSource(hc);
        if (!initEffectue) {
            table.addContainerProperty(TRUE_ID_PROPERTY, String.class, "");
            table.addContainerProperty(LIBELLE_PROPERTY, String.class, "");
            table.setVisibleColumns(DETAIL_FIELDS_ORDER);
            table.setColumnHeader(LIBELLE_PROPERTY,
                    applicationContext.getMessage(NAME + ".table.libelle", null, getLocale()));
            table.setColumnHeader(TRUE_ID_PROPERTY,
                    applicationContext.getMessage(NAME + ".table.trueObjectId", null, getLocale()));
            table.addGeneratedColumn("type", new DisplayTypeColumnGenerator());
            table.setColumnHeader("type", applicationContext.getMessage(NAME + ".table.type", null, getLocale()));
            table.addGeneratedColumn("actions", new ActionsColumnGenerator());
            table.setColumnHeader("actions",
                    applicationContext.getMessage(NAME + ".table.actions", null, getLocale()));
            initEffectue = true;
        } else {
            table.addContainerProperty(TRUE_ID_PROPERTY, String.class, "");
            table.addContainerProperty(LIBELLE_PROPERTY, String.class, "");
            table.setVisibleColumns(DETAIL_FIELDS_ORDER_ON_REFRESH);
        }

        //On dplie l'lment racine (quand la racine de la table n'est pas la totalit des composantes)
        if (StringUtils.hasText(rootItemId)) {
            selectionnerLigne(rootItemId);
            deplierNoeud(rootItemId, true);
            table.setCollapsed(rootItemId, false);
        }

    }

    private void renseignerItem(Item i, ObjetBase obj) {
        i.getItemProperty(LIBELLE_PROPERTY).setValue(obj.getLibelle());
        i.getItemProperty(ID_PROPERTY).setValue(obj.getId());
        i.getItemProperty(TRUE_ID_PROPERTY).setValue(obj.getTrueObjectId());
        i.getItemProperty(TYPE_PROPERTY).setValue(obj.getType());
        i.getItemProperty(DEPLIE_PROPERTY).setValue(obj.getDeplie());

    }

    private void changerAnnee(String value) {
        annee = value;
        initComposantes();
    }

    /**
     * @see com.vaadin.navigator.View#enter(com.vaadin.navigator.ViewChangeListener.ViewChangeEvent)
     */
    @Override
    public void enter(ViewChangeEvent event) {
        //LOG.debug("enter");
    }

    class DisplayTypeColumnGenerator implements Table.ColumnGenerator {

        public Object generateCell(Table source, Object itemId, Object columnId) {

            Item item = source.getItem(itemId);
            String typeObj = (String) item.getItemProperty(TYPE_PROPERTY).getValue();
            String idObj = (String) item.getItemProperty(TRUE_ID_PROPERTY).getValue();

            return rechercheArborescenteController.getTypeObj(typeObj, idObj);
        }
    }

    /** Formats the position in a column containing Date objects. */
    class ActionsColumnGenerator implements Table.ColumnGenerator {
        /**
         * Generates the cell containing the value. The column is
         * irrelevant in this use case.
         */
        public Object generateCell(Table source, Object itemId, Object columnId) {

            Item item = source.getItem(itemId);
            String typeObj = (String) item.getItemProperty(TYPE_PROPERTY).getValue();
            String idObj = (String) item.getItemProperty(TRUE_ID_PROPERTY).getValue();

            String idFav = typeObj + ":" + idObj;

            HorizontalLayout boutonActionLayout = new HorizontalLayout();

            //Si c'est un objet qui peut tre mis en favori
            if (typeObj != null && liste_types_favoris != null && liste_types_favoris.contains(typeObj)) {
                Button btnfav = new Button();
                if (markedRows.contains(idFav)) {
                    btnfav.setIcon(FontAwesome.TRASH_O);
                    btnfav.setStyleName(ValoTheme.BUTTON_DANGER);
                    btnfav.addStyleName("deletefavbutton");
                    btnfav.setDescription(
                            applicationContext.getMessage(NAME + ".supprimerfavori", null, getLocale()));
                } else {
                    btnfav.setIcon(FontAwesome.STAR_O);
                    btnfav.setStyleName(ValoTheme.BUTTON_PRIMARY);
                    btnfav.setDescription(
                            applicationContext.getMessage(NAME + ".ajouterfavori", null, getLocale()));
                }

                //Gestion du clic sur le bouton favori
                btnfav.addClickListener(new ClickListener() {
                    @Override
                    public void buttonClick(ClickEvent event) {
                        //if(markedRows.contains((String)itemId)){
                        if (markedRows.contains(idFav)) {
                            //creation du favori
                            FavorisPK fpk = new FavorisPK();
                            fpk.setLogin(userController.getCurrentUserName());
                            fpk.setTypfav(typeObj);
                            fpk.setIdfav(idObj);
                            //suppression du favori en base
                            favorisController.removeFavori(fpk);
                            //mise  jour de la liste des favoris de la vue
                            //markedRows.remove((String)itemId);
                            markedRows.remove(idFav);
                            btnfav.setIcon(FontAwesome.STAR_O);
                            btnfav.setStyleName(ValoTheme.BUTTON_PRIMARY);
                            event.getButton().setIcon(FontAwesome.STAR_O);
                        } else {
                            //creation du favori
                            FavorisPK fpk = new FavorisPK();
                            fpk.setLogin(userController.getCurrentUserName());
                            fpk.setTypfav(typeObj);
                            fpk.setIdfav(idObj);
                            Favoris favori = new Favoris();
                            favori.setId(fpk);
                            //aout du favori en base
                            favorisController.saveFavori(favori);
                            //mise  jour de la liste des favoris de la vue
                            //markedRows.add((String)itemId);
                            markedRows.add(idFav);
                            btnfav.setIcon(FontAwesome.TRASH_O);
                            btnfav.setStyleName(ValoTheme.BUTTON_DANGER);
                            btnfav.addStyleName("deletefavbutton");
                            event.getButton().setIcon(FontAwesome.TRASH_O);
                        }
                        table.markAsDirtyRecursive();
                        //btonFavori.markAsDirty();
                    }
                });
                ReferencedButton rb = new ReferencedButton();
                rb.setButton(btnfav);
                rb.setIdObj(idFav);
                listeBoutonFavoris.add(rb);
                boutonActionLayout.addComponent(btnfav);
            }

            if (typeObj != null && liste_types_deplier != null && liste_types_deplier.contains(typeObj)) {
                Button btnDeplier = new Button();
                btnDeplier.setIcon(FontAwesome.SITEMAP);
                btnDeplier.setDescription(applicationContext.getMessage(NAME + ".deplierarbo", null, getLocale()));
                btnDeplier.addClickListener(e -> {

                    if (PropertyUtils.isPushEnabled() && PropertyUtils.isShowLoadingIndicator()) {
                        //affichage de la pop-up de loading
                        MainUI.getCurrent().startBusyIndicator();

                        //Execution de la mthode en parallle dans un thread
                        executorService.execute(new Runnable() {
                            public void run() {
                                MainUI.getCurrent().access(new Runnable() {
                                    @Override
                                    public void run() {
                                        deplierNoeudComplet((String) itemId);
                                        selectionnerLigne((String) itemId);
                                        table.setCurrentPageFirstItemId((String) itemId);
                                        //close de la pop-up de loading
                                        MainUI.getCurrent().stopBusyIndicator();
                                    }
                                });
                            }
                        });

                    } else {
                        deplierNoeudComplet((String) itemId);
                        selectionnerLigne((String) itemId);
                        table.setCurrentPageFirstItemId((String) itemId);
                    }
                });
                boutonActionLayout.addComponent(btnDeplier);
            }
            if (typeObj != null && liste_types_inscrits != null && liste_types_inscrits.contains(typeObj)) {
                Button btnListeInscrits = new Button();
                btnListeInscrits.setIcon(FontAwesome.USERS);
                btnListeInscrits.addStyleName(ValoTheme.BUTTON_FRIENDLY);
                btnListeInscrits.setDescription(
                        applicationContext.getMessage(NAME + ".acceslisteinscrits", null, getLocale()));
                btnListeInscrits.addClickListener(e -> {
                    rechercheController.accessToDetail(idObj, typeObj, (String) comboBoxAnneeUniv.getValue());
                });

                boutonActionLayout.addComponent(btnListeInscrits);
            }

            return boutonActionLayout;
        }
    }

    private void selectionnerLigne(Object itemId) {

        table.setValue(itemId);
        String typeItemSelected = (String) hc.getItem(itemId).getItemProperty(TYPE_PROPERTY).getValue();
        ligneSelectionneeLabel.setValue((String) hc.getItem(itemId).getItemProperty(LIBELLE_PROPERTY).getValue()
                + " (" + typeItemSelected + ")");
        //Si c'est un ELP qui est selectionne
        if (typeItemSelected.equals(Utils.ELP) || typeItemSelected.equals(Utils.COL)
                || typeItemSelected.equals(Utils.GRP)) {
            //On va chercher le premier element pere non ELP pour l'afficher en rappel
            String idItemSelected = (String) hc.getItem(itemId).getItemProperty(ID_PROPERTY).getValue();
            //On recupere l'id complet de l'ELP et on le split pour en parcourir l'arborescence
            String[] elps = idItemSelected.split("_");
            boolean vetTrouvee = false;
            String idsElp = "";
            String idVet = "";
            for (int i = 0; i < elps.length; i++) {
                if (!vetTrouvee) {
                    //Si le type est different de ELP , GRP et COL
                    String typeItem = elps[i].substring(0, 3);
                    if (!typeItem.equals(Utils.ELP) && !typeItem.equals(Utils.COL) && !typeItem.equals(Utils.GRP)) {
                        vetTrouvee = true;
                        idVet = idItemSelected.replaceAll(idsElp + "_", "");
                    } else {
                        //tant qu'on n'a pas trouve la VET on reconstitue la partie gauche de l'id
                        if (StringUtils.hasText(idsElp)) {
                            idsElp = idsElp + "_";
                        }
                        idsElp = idsElp + elps[i];
                    }
                }
            }
            if (vetTrouvee && StringUtils.hasText(idVet) && hc.getItem(idVet) != null) {
                //afficher le lib de la VET pour rappel
                String typeVet = (String) hc.getItem(idVet).getItemProperty(TYPE_PROPERTY).getValue();
                //On passe l'ELP dans le label du bas
                vetElpSelectionneLabel.setCaption(ligneSelectionneeLabel.getValue());
                vetElpSelectionneLabel.setIcon(FontAwesome.ARROW_RIGHT);
                vetElpSelectionneLabel.setVisible(true);
                elpLayout.setVisible(true);
                vetElpSelectionneLabel.setHeight("20px");
                //La VET est affiche dans le label du haut
                ligneSelectionneeLabel
                        .setValue((String) hc.getItem(idVet).getItemProperty(LIBELLE_PROPERTY).getValue() + " ("
                                + typeVet + ")");

            }
        } else {
            vetElpSelectionneLabel.setVisible(false);
            elpLayout.setVisible(false);
        }
        ligneSelectionneeLabel.setVisible(true);
        labelLigneSelectionneeLabel.setVisible(true);
    }

    private void deplierNoeudComplet(String itemId) {
        deplierNoeud(itemId, false);
        table.setCollapsed(itemId, false);
        //parcourir les fils, pour chaque fils faire deplierNoeudComplet
        Collection<String> lfils = (Collection<String>) hc.getChildren(itemId);
        if (lfils != null && lfils.size() > 0) {
            for (String fils : lfils) {
                deplierNoeudComplet(fils);
            }
        }
    }

    private void deplierNoeud(String itemId, boolean afficherMessage) {
        if (!table.hasChildren(itemId)) {

            String type = (String) hc.getItem(itemId).getItemProperty(TYPE_PROPERTY).getValue();
            String deplie = (String) hc.getItem(itemId).getItemProperty(DEPLIE_PROPERTY).getValue();
            String trueObjectId = (String) hc.getItem(itemId).getItemProperty(TRUE_ID_PROPERTY).getValue();
            String objectId = (String) hc.getItem(itemId).getItemProperty(ID_PROPERTY).getValue();

            //Si on n'a pas dj dpli ou tent de dplier cette lment
            if (deplie.equals("false")) {
                if (type.equals(Utils.CMP)) {
                    //recuperation des vdi

                    List<VersionDiplome> lvdi = composanteService.findVdiFromComposante(annee, trueObjectId);
                    List<ObjetBase> lobj = new LinkedList<ObjetBase>();
                    if (lvdi != null && lvdi.size() > 0) {
                        for (VersionDiplome vdi : lvdi) {

                            ObjetBase obj = new ObjetBase();
                            obj.setType(Utils.VDI);
                            obj.setId(Utils.VDI + ":" + vdi.getId().getCod_dip() + "/"
                                    + vdi.getId().getCod_vrs_vdi() + "_" + itemId);
                            obj.setTrueObjectId(vdi.getId().getCod_dip() + "/" + vdi.getId().getCod_vrs_vdi());
                            obj.setLibelle(vdi.getLib_web_vdi());
                            obj.setDeplie("false");
                            lobj.add(obj);

                            Item i = hc.addItem(obj.getId());
                            if (i != null) {
                                renseignerItem(i, obj);

                                table.setParent(obj.getId(), itemId);
                            } else {
                                //LOG.debug("attention : element non cr !");
                            }

                        }
                    } else {
                        table.setChildrenAllowed(itemId, false);
                    }
                    //maj du Deplie pour la composante
                    hc.getItem(itemId).getItemProperty(DEPLIE_PROPERTY).setValue("true");

                } else {
                    if (type.equals(Utils.VDI)) {

                        //recuperation des vet
                        String[] tabs = trueObjectId.split("/");
                        String codDip = tabs[0];
                        String vrsDip = tabs[1];

                        String[] tabs2 = objectId.split("CMP:");
                        String codCmp = tabs2[1];

                        List<VersionEtape> lvet = composanteService.findVetFromVdiAndCmp(annee, codDip, vrsDip,
                                codCmp);
                        List<ObjetBase> lobj = new LinkedList<ObjetBase>();
                        if (lvet != null && lvet.size() > 0) {
                            for (VersionEtape vet : lvet) {

                                ObjetBase obj = new ObjetBase();
                                rechercheArborescenteController.renseigneObjFromVet(obj, vet, itemId);
                                lobj.add(obj);

                                Item i = hc.addItem(obj.getId());
                                if (i != null) {
                                    renseignerItem(i, obj);

                                    table.setParent(obj.getId(), itemId);
                                }

                            }
                        } else {
                            table.setChildrenAllowed(itemId, false);
                        }

                        //maj du Deplie pour la VDI
                        hc.getItem(itemId).getItemProperty(DEPLIE_PROPERTY).setValue("true");
                    } else {
                        if (type.equals(Utils.VET) || type.equals(Utils.ELP)) {

                            List<ElementPedagogique> lelp = new LinkedList<ElementPedagogique>();
                            if (type.equals(Utils.VET)) {
                                //recuperation des elp
                                String[] tabs = trueObjectId.split("/");
                                String codEtp = tabs[0];
                                String vrsEtp = tabs[1];
                                lelp = composanteService.findElpFromVet(codEtp, vrsEtp);
                            }
                            //true si on est sur un ELP pour lequel on rcupre des groupes, false sinon
                            boolean elpAvecGroupe = false;
                            if (type.equals(Utils.ELP)) {
                                //recuperation des elp
                                lelp = composanteService.findElpFromElp(trueObjectId);

                                //Si ELP n'a pas de fils , on cherche les groupes
                                if (lelp == null || lelp.size() == 0) {
                                    //On tente de rcuprer les groupes de l'ELP
                                    List<ElpDeCollection> lgroupes = listeInscritsController.recupererGroupes(annee,
                                            trueObjectId);
                                    //Si on a rcupr des groupes
                                    if (lgroupes != null && lgroupes.size() > 0) {
                                        //Vrai si on a plusieurs collection (dans ce cas on affiche les collections dans l'arbo)
                                        boolean plsrsCollection = false;
                                        //On parcourt l'ELP (un seul ELP dans la liste en vrit)
                                        for (ElpDeCollection edc : lgroupes) {
                                            //Si plusieurs collection
                                            if (edc.getListeCollection().size() > 1) {
                                                plsrsCollection = true;
                                            }
                                            for (CollectionDeGroupes cdg : edc.getListeCollection()) {
                                                String itemIdPourGroupe = itemId;
                                                //Si plusieurs collection on ajoute la collection dans la table
                                                if (plsrsCollection) {
                                                    //On cr un nouvel objet basique  insr dans le tableau
                                                    ObjetBase obj = new ObjetBase();
                                                    //On value l'objet obj  partir de l'ELP en cours
                                                    rechercheArborescenteController.renseigneObjFromCollection(obj,
                                                            cdg, itemId);
                                                    //On ajout l'objet au tableau
                                                    Item i = hc.addItem(obj.getId());
                                                    if (i != null) {
                                                        //On value l'item du tableau  partir de l'objet
                                                        renseignerItem(i, obj);
                                                        //On branche correctement l'item avec son pre
                                                        table.setParent(obj.getId(), itemId);
                                                        //On dplie la collection automatiquement
                                                        table.setCollapsed(obj.getId(), false);
                                                        //On remet le focus sur l'ELP
                                                        selectionnerLigne(itemId);
                                                        //Le pere des groupes sera la collection et non l'elp
                                                        itemIdPourGroupe = obj.getId();
                                                    }
                                                }
                                                //Pour chaque groupe
                                                for (Groupe groupe : cdg.getListeGroupes()) {
                                                    elpAvecGroupe = true;
                                                    //On ajoute le groupe
                                                    //On cr un nouvel objet basique  insr dans le tableau
                                                    ObjetBase obj = new ObjetBase();
                                                    //On value l'objet obj  partir de l'ELP en cours
                                                    rechercheArborescenteController.renseigneObjFromGroupe(obj,
                                                            groupe, itemIdPourGroupe);
                                                    //On ajout l'objet au tableau
                                                    Item i = hc.addItem(obj.getId());
                                                    if (i != null) {
                                                        //On value l'item du tableau  partir de l'objet
                                                        renseignerItem(i, obj);
                                                        //On branche correctement l'item avec son pre
                                                        table.setParent(obj.getId(), itemIdPourGroupe);
                                                        //On fait disparaitre la fleche  gauche de l'lment sans fils
                                                        table.setChildrenAllowed(obj.getId(), false);
                                                    }

                                                }
                                            }
                                        }
                                    }
                                }
                            }

                            //List<ObjetBase> lobj = new LinkedList<ObjetBase>();
                            //Si on a rcupr des ELP
                            if (lelp != null && lelp.size() > 0) {
                                //On parcourt les ELP
                                for (ElementPedagogique elp : lelp) {
                                    //On cr un nouvel objet basique  insr dans le tableau
                                    ObjetBase obj = new ObjetBase();
                                    //On value l'objet obj  partir de l'ELP en cours
                                    rechercheArborescenteController.renseigneObjFromElp(obj, elp, itemId);
                                    //On ajoute l'objet  la liste
                                    //lobj.add(obj);
                                    //On ajout l'objet au tableau
                                    Item i = hc.addItem(obj.getId());
                                    if (i != null) {
                                        //On value l'item du tableau  partir de l'objet
                                        renseignerItem(i, obj);
                                        //On branche correcetement l'item avec son pre
                                        table.setParent(obj.getId(), itemId);
                                    }
                                }
                            } else {
                                //Si on n'est pas sur un ELP avec des groupes
                                if (!elpAvecGroupe) {
                                    //Si aucun elp rcupr et qu'on doit afficher le message
                                    if (afficherMessage) {
                                        //On affiche le message de notification
                                        Notification.show("Aucun sous lment pour cet lment");
                                    }
                                    //On fait disparaitre la fleche  gauche de l'lment sans fils
                                    table.setChildrenAllowed(itemId, false);
                                }
                            }

                            //maj du Deplie pour l'element ou la vet
                            hc.getItem(itemId).getItemProperty(DEPLIE_PROPERTY).setValue("true");
                        }
                    }
                }
            }

        }
    }

}