OpenConcerto

Dépôt officiel du code source de l'ERP OpenConcerto
sonarqube

svn://code.openconcerto.org/openconcerto

Rev

Rev 182 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 * 
 * Copyright 2011-2019 OpenConcerto, by ILM Informatique. All rights reserved.
 * 
 * The contents of this file are subject to the terms of the GNU General Public License Version 3
 * only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
 * copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
 * language governing permissions and limitations under the License.
 * 
 * When distributing the software, include this License Header Notice in each file.
 */
 
 package org.openconcerto.erp.core.reports.history.ui;

import org.openconcerto.erp.core.common.ui.DeviseNiceTableCellRenderer;
import org.openconcerto.erp.core.common.ui.PanelFrame;
import org.openconcerto.erp.core.finance.accounting.element.MouvementSQLElement;
import org.openconcerto.erp.core.finance.accounting.ui.ListeGestCommEltPanel;
import org.openconcerto.erp.core.finance.accounting.ui.SuppressionEcrituresPanel;
import org.openconcerto.erp.core.sales.invoice.report.VenteFactureElementXmlSheet;
import org.openconcerto.erp.core.sales.quote.ui.EtatDevisRenderer;
import org.openconcerto.erp.core.supplychain.order.action.ImportProductsToOrder;
import org.openconcerto.erp.generationDoc.AbstractSheetXml;
import org.openconcerto.erp.model.MouseSheetXmlListeListener;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.element.SQLElementDirectory;
import org.openconcerto.sql.model.AliasedTable;
import org.openconcerto.sql.model.SQLField;
import org.openconcerto.sql.model.SQLFieldsSet;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowListRSH;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.request.ComboSQLRequest;
import org.openconcerto.sql.request.ListSQLRequest;
import org.openconcerto.sql.users.rights.JListSQLTablePanel;
import org.openconcerto.sql.view.IListPanel;
import org.openconcerto.sql.view.ListeAddPanel;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.IListeAction.IListeEvent;
import org.openconcerto.sql.view.list.ITableModel;
import org.openconcerto.sql.view.list.RowAction.PredicateRowAction;
import org.openconcerto.sql.view.list.SQLTableModelSourceOnline;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.FrameUtil;
import org.openconcerto.ui.SwingThreadUtils;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.cc.ITransformer;

import java.awt.Color;
import java.awt.Component;
import java.awt.FileDialog;
import java.awt.Font;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Vector;

import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.border.TitledBorder;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;

public class ListeHistoriquePanel extends JPanel {

    private final Vector<IListPanel> vectListePanel = new Vector<IListPanel>();
    private Map<Integer, List<TableModelListener>> mapListener = new HashMap<Integer, List<TableModelListener>>();
    private JListSQLTablePanel jListePanel;

    private Map<SQLTable, SQLField> listFieldMap = new HashMap<SQLTable, SQLField>();
    private Map<String, Where> whereList = new HashMap<String, Where>();
    private static Map<SQLElement, Class<? extends AbstractSheetXml>> elementSheet = new HashMap<SQLElement, Class<? extends AbstractSheetXml>>();
    private String undefinedLabel;
    private static final String REF_WHERE = "Historique";

    static {
        SQLElementDirectory dir = Configuration.getInstance().getDirectory();
        elementSheet.put(dir.getElement("SAISIE_VENTE_FACTURE_ELEMENT"), VenteFactureElementXmlSheet.class);
    }

    // Filtre à partir de la JList sur les IListe
    private final ListSelectionListener listListener = new ListSelectionListener() {

        public void valueChanged(ListSelectionEvent e) {
            if (e != null && e.getValueIsAdjusting()) {
                return;
            }
            int selectIndex = ListeHistoriquePanel.this.jListePanel.getSelectedIndex();

            SQLRowAccessor row = ListeHistoriquePanel.this.jListePanel.getModel().getRowAt(selectIndex);

            if ((row == null || row.isUndefined()) && ListeHistoriquePanel.this.undefinedLabel == null) {
                return;
            }

            int id = SQLRow.NONEXISTANT_ID;
            if (row != null) {
                id = row.getID();
            }

            final int size = ListeHistoriquePanel.this.vectListePanel.size();
            for (int i = 0; i < size; i++) {
                IListPanel liste = ListeHistoriquePanel.this.vectListePanel.get(i);
                // TODO : verifier la pertinence de remove / add
                // remove listener
                if (ListeHistoriquePanel.this.mapListener.get(i) != null) {
                    List<TableModelListener> l = ListeHistoriquePanel.this.mapListener.get(i);
                    for (TableModelListener listener : l) {
                        liste.getListe().getTableModel().removeTableModelListener(listener);
                    }
                }

                Where w = null;
                final SQLTable table = liste.getElement().getTable();
                for (final Where wTmp : ListeHistoriquePanel.this.whereList.values()) {
                    if (new SQLFieldsSet(wTmp.getFields()).getTables().contains(liste.getListe().getRequest().getPrimaryTable())) {
                        w = wTmp.and(w);
                    }
                }

                if (id > 1) {
                    if (ListeHistoriquePanel.this.listFieldMap != null && ListeHistoriquePanel.this.listFieldMap.get(table) != null) {
                        SQLField field = ListeHistoriquePanel.this.listFieldMap.get(table);
                        Where w2 = new Where(field, "=", table.getForeignTable(field.getName()).getKey());
                        w2 = w2.and(new Where(table.getForeignTable(field.getName()).getField("ID_" + ListeHistoriquePanel.this.jListePanel.getModel().getTable().getName()), "=", id));
                        liste.getListe().getRequest().putWhere(REF_WHERE, w2.and(w));
                    } else {
                        if (liste.getElement().getTable().equals(ListeHistoriquePanel.this.jListePanel.getModel().getTable())) {
                            final Where whereMatch = new Where(table.getField("ID_" + ListeHistoriquePanel.this.jListePanel.getModel().getTable().getName()), "=", id);
                            if ((table.getName().equals("COMMANDE_ELEMENT") || table.getName().equals("BON_RECEPTION_ELEMENT"))
                                    && ListeHistoriquePanel.this.jListePanel.getModel().getTable().getName().equals("AFFAIRE")) {

                                // FIXME alias forcé à la main, voir pour remplacer avec un
                                // selectTransformer
                                final String tablePere = table.getName().replaceAll("_ELEMENT", "");
                                AliasedTable tableAlias = new AliasedTable(table.getTable(tablePere), "tAlias__ID_" + tablePere + "__" + tablePere);
                                final int idAffaire = id;
                                Where wPere = new Where(tableAlias.getField("ID_AFFAIRE"), "=", idAffaire);
                                liste.getListe().getRequest().putWhere(REF_WHERE, whereMatch.or(wPere).and(w));
                                // whereMatch = whereMatch.or(new Where(new
                                // AliasedTable(table.getForeignTable("ID_"+tablePere),
                                // alias).getField("ID_AFFAIRE"), "=", id));

                            } else {
                                liste.getListe().getRequest().putWhere(REF_WHERE, whereMatch.and(w));
                            }
                        } else {
                            if ((table.getName().equals("MOUVEMENT_STOCK")) && ListeHistoriquePanel.this.jListePanel.getModel().getTable().getName().equals("AFFAIRE")) {

                                final String tableStock = "STOCK";
                                AliasedTable tableAlias = new AliasedTable(table.getTable(tableStock), "tAlias__ID_" + tableStock + "__" + tableStock);
                                final int idAffaire = table.getTable("AFFAIRE").getRow(id).getForeignID("ID_DEPOT_STOCK");
                                Where w2 = new Where(table.getField("REEL"), "=", Boolean.TRUE);
                                w2 = w2.and(new Where(table.getField("SOURCE"), "=", ""));
                                Where wPere = new Where(tableAlias.getField("ID_DEPOT_STOCK"), "=", idAffaire).and(w2);
                                liste.getListe().getRequest().putWhere(REF_WHERE, wPere);

                            } else {
                                final Where whereMatch = new Where(table.getField("ID_" + ListeHistoriquePanel.this.jListePanel.getModel().getTable().getName()), "=", id);
                                if ((table.getName().equals("FACTURE_FOURNISSEUR_ELEMENT") || table.getName().equals("COMMANDE_ELEMENT") || table.getName().equals("BON_RECEPTION_ELEMENT"))
                                        && ListeHistoriquePanel.this.jListePanel.getModel().getTable().getName().equals("AFFAIRE")) {

                                    // FIXME alias forcé à la main, voir pour remplacer avec un
                                    // selectTransformer
                                    final String tablePere = table.getName().replaceAll("_ELEMENT", "");
                                    AliasedTable tableAlias = new AliasedTable(table.getTable(tablePere), "tAlias__ID_" + tablePere + "__" + tablePere);
                                    final int idAffaire = id;
                                    Where wPere = new Where(tableAlias.getField("ID_AFFAIRE"), "=", idAffaire);
                                    liste.getListe().getRequest().putWhere(REF_WHERE, whereMatch.or(wPere).and(w).and(new Where(table.getField("PA_HT"), "!=", BigDecimal.ZERO)));

                                } else {
                                    liste.getListe().getRequest().putWhere(REF_WHERE, whereMatch.and(w));
                                }
                            }
                        }
                    }
                } else {
                    liste.getListe().getRequest().putWhere(REF_WHERE, w);
                }
                liste.getListe().getModel().setCellsEditable(false);
                // Set renderer
                setRenderer(liste);

                // Set listener
                if (ListeHistoriquePanel.this.mapListener.get(i) != null) {
                    List<TableModelListener> l = ListeHistoriquePanel.this.mapListener.get(i);
                    for (TableModelListener listener : l) {
                        liste.getListe().getTableModel().addTableModelListener(listener);
                        if (elementSheet.get(liste.getElement()) != null) {
                            liste.getListe().addIListeActions(new MouseSheetXmlListeListener(liste.getElement(), elementSheet.get(liste.getElement())).getRowActions());
                        }
                    }
                }

            }
        }
    };

    public ListeHistoriquePanel(final String title, final ComboSQLRequest req, Map<String, List<String>> listTableOnglet, JPanel panelBottom, Map<SQLTable, SQLField> listFieldMap, Where where) {
        this(title, req, listTableOnglet, panelBottom, listFieldMap, "Tous", where);
    }

    public ListeHistoriquePanel(final String title, final ComboSQLRequest req, Map<String, List<String>> listTableOnglet, JPanel panelBottom, Map<SQLTable, SQLField> listFieldMap,
            String undefinedLabel, Where where) {
        this(title, req, listTableOnglet, panelBottom, listFieldMap, undefinedLabel, false, where, null);
    }

    public ListeHistoriquePanel(final String title, final ComboSQLRequest req, Map<String, List<String>> listTableOnglet, JPanel panelBottom, Map<SQLTable, SQLField> listFieldMap,
            String undefinedLabel, final boolean sourceWithOutTransformer, Where where, SQLTableModelSourceOnline tableSource) {
        this(title, req, listTableOnglet, panelBottom, listFieldMap, undefinedLabel, sourceWithOutTransformer, where, tableSource, null);
    }

    // TODO verifier que les tables contiennent bien la clef etrangere
    /**
     * @param title titre de la JList
     * @param req table à afficher la JListSQLTablePanel
     * @param listTableOnglet liste des tables à afficher
     * @param panelBottom panel à afficher en bas de la frame
     * @param listFieldMap jointure d'une table pour utiliser le filtre si la table ne contient pas
     *        de foreignKey pointant sur tableList
     * @param undefinedLabel label pour l'indéfini permettant de tout sélectionner, null si
     *        l'undefined n'est pas à inclure.
     * @param where
     */
    public ListeHistoriquePanel(final String title, final ComboSQLRequest req, Map<String, List<String>> listTableOnglet, JPanel panelBottom, Map<SQLTable, SQLField> listFieldMap,
            String undefinedLabel, final boolean sourceWithOutTransformer, final Where where, SQLTableModelSourceOnline tableSource, Map<String, String> splitWithField) {
        super();
        this.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.insets = new Insets(2, 2, 1, 2);
        c.anchor = GridBagConstraints.WEST;
        c.fill = GridBagConstraints.BOTH;
        c.gridheight = 1;
        c.gridwidth = 1;
        c.gridx = 0;
        c.gridy = 0;
        c.weightx = 1;
        c.weighty = 1;

        this.listFieldMap = listFieldMap;

        // Onglet de IListe
        JTabbedPane tabbedPane = new JTabbedPane();

        for (String key : listTableOnglet.keySet()) {

            List<String> listPanelTable = listTableOnglet.get(key);

            JPanel tabbedPanel = new JPanel(new GridBagLayout());
            tabbedPanel.setOpaque(false);
            GridBagConstraints c2 = new DefaultGridBagConstraints();
            c2.fill = GridBagConstraints.BOTH;
            c2.weightx = 1;
            c2.weighty = 1;
            c2.gridy = GridBagConstraints.RELATIVE;

            for (int i = 0; i < listPanelTable.size(); i++) {
                final SQLElement elt = Configuration.getInstance().getDirectory().getElement(listPanelTable.get(i));

                List<SQLRow> splitter = new ArrayList<SQLRow>();

                final String splitField = (splitWithField == null ? null : splitWithField.get(elt.getTable().getName()));
                if (splitField != null) {
                    SQLTable tableSplit = elt.getTable().getForeignTable(splitField);
                    SQLSelect sel = new SQLSelect();
                    sel.addSelectStar(tableSplit);
                    List<SQLRow> result = SQLRowListRSH.execute(sel);
                    splitter.addAll(result);
                } else {
                    splitter.add(null);
                }
                JTabbedPane tabbed = new JTabbedPane();
                for (int splitIndex = 0; splitIndex < splitter.size(); splitIndex++) {
                    final SQLRow sqlRow = splitter.get(splitIndex);
                    IListPanel liste;
                    final SQLTableModelSourceOnline createTableSource;
                    if (tableSource == null) {
                        createTableSource = elt.getTableSource(true);
                    } else {
                        createTableSource = tableSource;
                    }
                    final ListSQLRequest request = createTableSource.getReq();
                    if (sourceWithOutTransformer) {
                        request.setSelectTransf(null);
                    }
                    if (sqlRow != null) {
                        if (splitIndex == 0) {
                            request.setSelectTransf(new ITransformer<SQLSelect, SQLSelect>() {

                                @Override
                                public SQLSelect transformChecked(SQLSelect input) {
                                    Where w = new Where(input.getTable(createTableSource.getPrimaryTable().getName()).getField(splitField), "=", sqlRow.getID());
                                    Where w2 = new Where(input.getTable(createTableSource.getPrimaryTable().getName()).getField(splitField), "=", sqlRow.getTable().getUndefinedID());
                                    w2 = w2.or(new Where(input.getTable(createTableSource.getPrimaryTable().getName()).getField(splitField), "=", (Object) null));
                                    input.setWhere(w.or(w2));
                                    return input;
                                }
                            });
                        } else {
                            request.setSelectTransf(new ITransformer<SQLSelect, SQLSelect>() {

                                @Override
                                public SQLSelect transformChecked(SQLSelect input) {
                                    Where w = new Where(input.getTable(createTableSource.getPrimaryTable().getName()).getField(splitField), "=", sqlRow.getID());
                                    input.setWhere(w);
                                    return input;
                                }
                            });
                        }
                    }
                    if (where != null) {
                        if (new SQLFieldsSet(where.getFields()).getTables().contains(request.getPrimaryTable())) {
                            request.setSelectTransf(new ITransformer<SQLSelect, SQLSelect>() {

                                @Override
                                public SQLSelect transformChecked(SQLSelect input) {
                                    input.setWhere(where);
                                    return input;
                                }
                            });
                            // request.setWhere(where);
                        }
                    }
                    // Evite de charger les listes completes à la création de la fenetre
                    request.putWhere(REF_WHERE, Where.FALSE);

                    if (elt.getTable().contains("ID_MOUVEMENT")) {

                        liste = new ListeGestCommEltPanel(elt, new IListe(createTableSource), "historique-" + title) {

                            protected void handleAction(JButton source, ActionEvent evt) {

                                if (elt.getTable().contains("ID_MOUVEMENT")) {
                                    SQLRow row = getListe().fetchSelectedRow();
                                    if (source == this.buttonModifier) {
                                        MouvementSQLElement.showSource(row.getInt("ID_MOUVEMENT"));
                                    } else {
                                        if (source == this.buttonEffacer) {
                                            PanelFrame f = new PanelFrame(new SuppressionEcrituresPanel(row.getInt("ID_MOUVEMENT")), "Suppresion d'une pièce");
                                            f.setLocationRelativeTo(null);
                                            f.setResizable(false);
                                            f.setVisible(true);
                                        } else {
                                            super.handleAction(source, evt);
                                        }
                                    }
                                } else {
                                    super.handleAction(source, evt);
                                }
                            }
                        };

                    } else

                    {

                        liste = new ListeAddPanel(elt, new IListe(createTableSource), "historique-" + title) {
                            @Override
                            protected void handleAction(JButton source, ActionEvent evt) {
                                if (source == this.buttonAjouter) {
                                    // toujours remplir la createFrame avec la ligne sélectionnée
                                    // car la frame écoute la sélection mais pas les modif, et se
                                    // reset
                                    // qd on la ferme
                                    // donc si on clic ajouter, on ferme, on modif la ligne, on clic
                                    // ajouter
                                    // on doit reremplir l'EditFrame
                                    int selectIndex = ListeHistoriquePanel.this.jListePanel.getSelectedIndex();
                                    SQLRowAccessor row = ListeHistoriquePanel.this.jListePanel.getModel().getRowAt(selectIndex);
                                    if (row != null && !row.isUndefined()) {
                                        SQLTable table = this.getCreateFrame().getSQLComponent().getElement().getTable();
                                        Set<SQLField> fields = table.getForeignKeys(ListeHistoriquePanel.this.jListePanel.getModel().getTable());
                                        if (fields != null && fields.size() > 0) {
                                            SQLRowValues rowVals = new SQLRowValues(table);
                                            rowVals.put(((SQLField) fields.toArray()[0]).getName(), row.getID());
                                            this.getCreateFrame().getSQLComponent().resetValue();
                                            this.getCreateFrame().getSQLComponent().select(rowVals);
                                        }
                                    }
                                    FrameUtil.show(this.getCreateFrame());
                                } else {
                                    super.handleAction(source, evt);
                                }
                            }
                        };
                        if (createTableSource.getPrimaryTable().getName().equals("DEMANDE_ACHAT_ELEMENT")) {
                            final ListeAddPanel listeDmd = (ListeAddPanel) liste;
                            PredicateRowAction actionDrop = new PredicateRowAction(new AbstractAction("Importer depuis Fichier Inventor") {

                                @Override
                                public void actionPerformed(ActionEvent e) {
                                    final Frame frame = SwingThreadUtils.getAncestorOrSelf(Frame.class, (Component) e.getSource());
                                    final FileDialog fd = new FileDialog(frame, "Import fichier inventor", FileDialog.LOAD);
                                    fd.setFilenameFilter(new FilenameFilter() {
                                        @Override
                                        public boolean accept(File dir, String name) {
                                            return name.endsWith(".xls");
                                        }
                                    });
                                    fd.setVisible(true);
                                    if (fd.getFile() != null) {

                                        ImportProductsToOrder importer = new ImportProductsToOrder();
                                        if (getSelectedRow() == null) {
                                            JOptionPane.showMessageDialog(frame, "Import impossible! Aucune affaire sélectionnée.");
                                        } else {
                                            int a = JOptionPane.showConfirmDialog(frame,
                                                    "Etes vous sûr de vouloir importer ces éléments dans l'affaire N°" + getSelectedRow().getString("NUMERO") + "?", "Import invertor",
                                                    JOptionPane.YES_NO_OPTION);
                                            if (a == JOptionPane.YES_OPTION) {
                                                importer.setRowAffaire(getSelectedRow());
                                                importer.setRowFamille(sqlRow);
                                                try {
                                                    importer.importFile(new File(fd.getDirectory(), fd.getFile()), createTableSource.getPrimaryTable().getDBRoot());
                                                    listeDmd.getListe().getModel().updateAll();
                                                } catch (IOException e1) {
                                                    ExceptionHandler.handle("Erreur lors de l'import du fichier!", e1);
                                                } catch (SQLException e1) {
                                                    ExceptionHandler.handle("Erreur lors de l'import du fichier!", e1);
                                                }
                                            }
                                        }
                                    }
                                }
                            }, true);
                            actionDrop.setPredicate(IListeEvent.createSelectionCountPredicate(0, Integer.MAX_VALUE));
                            liste.getListe().addIListeAction(actionDrop);
                        } else if (createTableSource.getPrimaryTable().getName().endsWith("_ELEMENT")) {
                            liste.setAddVisible(false);
                            liste.setShowReadOnlyFrameOnDoubleClick(false);
                            liste.setModifyVisible(false);
                            liste.setDeleteVisible(false);
                        }
                    }

                    this.vectListePanel.add(liste);

                    setRenderer(liste);
                    if (elementSheet.get(liste.getElement()) != null) {
                        liste.getListe().addIListeActions(new MouseSheetXmlListeListener(liste.getElement(), elementSheet.get(liste.getElement())).getRowActions());
                    }
                    liste.getListe().getModel().setCellsEditable(false);
                    liste.setOpaque(false);

                    liste.setBorder(null);
                    liste.getListe().getModel().setHibernateDelay(-1);

                    if (listPanelTable.size() > 1) {
                        Font f = UIManager.getFont("TitledBorder.font");
                        f = f.deriveFont(Font.BOLD);
                        Border b = UIManager.getBorder("TitledBorder.border");
                        b = BorderFactory.createLineBorder(Color.BLACK);
                        liste.setBorder(BorderFactory.createTitledBorder(b, elt.getPluralName(), TitledBorder.LEADING, TitledBorder.DEFAULT_POSITION, f));
                    }
                    if (sqlRow != null) {
                        String titleTab;
                        if (splitIndex == 0) {
                            titleTab = sqlRow.getString("NOM") + " et non classés";
                            tabbedPanel.add(tabbed, c2);
                        } else {
                            titleTab = sqlRow.getString("NOM");
                        }
                        tabbed.add(titleTab, liste);

                    } else {
                        tabbedPanel.add(liste, c2);
                    }
                }
            }

            tabbedPane.add(key, tabbedPanel);
        }

        // Left Panel
        this.undefinedLabel = undefinedLabel;
        this.jListePanel = new JListSQLTablePanel(req, undefinedLabel);

        // Right panel
        JPanel rightPanel = new JPanel();
        rightPanel.setLayout(new GridBagLayout());
        GridBagConstraints cRight = new DefaultGridBagConstraints();
        cRight.fill = GridBagConstraints.BOTH;
        cRight.weightx = 1;
        cRight.weighty = 1;
        rightPanel.add(tabbedPane, cRight);

        if (panelBottom != null) {
            cRight.fill = GridBagConstraints.HORIZONTAL;
            cRight.weightx = 1;
            cRight.weighty = 0;
            cRight.gridy++;
            panelBottom.setBorder(BorderFactory.createTitledBorder("Récapitulatif"));
            rightPanel.add(panelBottom, cRight);
        }
        JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, this.jListePanel, rightPanel);
        split.setBorder(null);
        split.setDividerLocation(275);
        this.add(split, c);

        JButton buttonClose = new JButton("Fermer");
        c.gridy++;
        c.weightx = 0;
        c.weighty = 0;
        c.fill = GridBagConstraints.NONE;
        c.anchor = GridBagConstraints.EAST;
        this.add(buttonClose, c);

        buttonClose.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                ((JFrame) SwingUtilities.getRoot(ListeHistoriquePanel.this)).dispose();
            }
        });

        this.addAncestorListener(new AncestorListener() {
            @Override
            public void ancestorAdded(AncestorEvent event) {
                ListeHistoriquePanel.this.jListePanel.addListSelectionListener(ListeHistoriquePanel.this.listListener);
            }

            @Override
            public void ancestorMoved(AncestorEvent event) {

            }

            @Override
            public void ancestorRemoved(AncestorEvent event) {
                ListeHistoriquePanel.this.vectListePanel.clear();
                ListeHistoriquePanel.this.mapListener = null;
                ListeHistoriquePanel.this.jListePanel.removeListSelectionListener(ListeHistoriquePanel.this.listListener);
                ListeHistoriquePanel.this.jListePanel.removeAllTableListener();
                ListeHistoriquePanel.this.jListePanel = null;
                ListeHistoriquePanel.this.listFieldMap = null;
                ListeHistoriquePanel.this.whereList = null;
            }
        });

    }

    public void selectIDinJList(int id) {
        this.jListePanel.selectID(id);
    }

    public void selectFirstIDinJList() {
        this.jListePanel.selectFirstID();
    }

    private void setRenderer(IListPanel liste) {

        SQLElement propositionItemElement = Configuration.getInstance().getDirectory().getElement("PROPOSITION_ELEMENT");
        SQLElement devisElement = Configuration.getInstance().getDirectory().getElement("DEVIS");
        JTable table = liste.getListe().getJTable();
        TableCellRenderer rend = null;
        if (liste.getElement().getClass() == devisElement.getClass()) {
            rend = new EtatDevisRenderer();
        } else {
                rend = new DeviseNiceTableCellRenderer();
        }
        for (int j = 0; j < table.getColumnCount(); j++) {
            if (rend instanceof EtatDevisRenderer) {
                table.getColumnModel().getColumn(j).setCellRenderer(rend);
            } else {
                if (table.getColumnClass(j) == Long.class || table.getColumnClass(j) == BigInteger.class) {
                    table.getColumnModel().getColumn(j).setCellRenderer(rend);
                }
            }
        }
    }

    public void addListSelectionListener(ListSelectionListener l) {
        this.jListePanel.addListSelectionListener(l);
        System.out.println("ListeHistoriquePanel.addListSelectionListener()" + this.jListePanel);
    }

    public void removeListSelectionListener(ListSelectionListener l) {
        this.jListePanel.removeListSelectionListener(l);
    }

    public SQLRowAccessor getSelectedRow() {
        // FIXME null pointer avec historique client frame, surement un pb de garbage
        if (this.jListePanel == null) {
            return null;
        }
        if (this.jListePanel.getModel() == null) {
            return null;
        }

        return this.jListePanel.getModel().getRowAt(this.jListePanel.getSelectedIndex());
    }

    public void addWhere(String key, Where w) {
        this.whereList.put(key, w);
        this.listListener.valueChanged(null);
    }

    public void removeWhere(String key) {
        this.whereList.remove(key);
        this.listListener.valueChanged(null);
    }

    public void removeAllWhere() {
        for (String key : this.whereList.keySet()) {
            this.whereList.remove(key);
        }
        this.listListener.valueChanged(null);
    }

    public Map<String, Where> getWhere() {
        return this.whereList;
    }

    public List<Integer> getListId(String tableName) {
        IListe liste = getIListeFromTableName(tableName);
        List<Integer> listeIds = null;
        if (liste != null) {
            ITableModel m = liste.getModel();
            int size = m.getRowCount();
            listeIds = new ArrayList<>(size);
            for (int i = 0; i < size; i++) {
                try {
                    listeIds.add(m.idFromIndex(i));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

        } else {
            listeIds = Collections.emptyList();
        }
        return listeIds;
    }

    public void removeAllTableListener() {
        this.jListePanel.removeAllTableListener();
        for (Integer i : this.mapListener.keySet()) {
            IListPanel panel = this.vectListePanel.get(i);
            List<TableModelListener> l = this.mapListener.get(i);
            for (TableModelListener tableModelListener : l) {
                final IListe liste = panel.getListe();
                if (liste != null) {
                    final TableModel tableModel = liste.getTableModel();
                    if (tableModel != null) {
                        tableModel.removeTableModelListener(tableModelListener);
                    }
                }
            }

        }
    }

    public void addListenerTable(TableModelListener listener, String tableName) {
        IListe liste = getIListeFromTableName(tableName);
        int index = getIndexFromTableName(tableName);
        if (liste != null) {
            liste.getModel().addTableModelListener(listener);
            List<TableModelListener> l = this.mapListener.get(index);
            if (l == null) {
                l = new ArrayList<TableModelListener>();
                this.mapListener.put(index, l);
            }
            l.add(listener);
        }
    }

    /**
     * Permet d'obtenir la IListe correspondant au nom d'une table
     * 
     * @param tableName nom de la table
     * @return la Iliste associée, dans le cas échéant null
     */

    public IListe getIListeFromTableName(String tableName) {
        IListPanel liste = getIListePanelFromTableName(tableName);
        if (liste == null) {
            return null;
        } else {
            return liste.getListe();
        }
    }

    /**
     * Permet d'obtenir la IListe correspondant au nom d'une table
     * 
     * @param tableName nom de la table
     * @return la Iliste associée, dans le cas échéant null
     */

    public IListPanel getIListePanelFromTableName(String tableName) {
        IListPanel liste = null;
        final int size = this.vectListePanel.size();
        for (int i = 0; i < size; i++) {
            IListPanel listeTmp = this.vectListePanel.get(i);
            // FIXME Null pointer Exception when client deleted
            if (listeTmp != null) {
                IListe list = listeTmp.getListe();
                if (list != null) {
                    final ITableModel model = list.getModel();
                    if (model != null) {
                        if (model.getTable().getName().equalsIgnoreCase(tableName)) {
                            liste = listeTmp;
                        }
                    }
                }
            }
        }
        return liste;
    }

    /**
     * Permet d'obtenir la IListe correspondant au nom d'une table
     * 
     * @param tableName nom de la table
     * @return la Iliste associée, dans le cas échéant null
     */

    public List<IListPanel> getAllIListePanelFromTableName(String tableName) {
        List<IListPanel> liste = new ArrayList<IListPanel>();
        final int size = this.vectListePanel.size();
        for (int i = 0; i < size; i++) {
            IListPanel listeTmp = this.vectListePanel.get(i);
            // FIXME Null pointer Exception when client deleted
            if (listeTmp != null) {
                IListe list = listeTmp.getListe();
                if (list != null) {
                    final ITableModel model = list.getModel();
                    if (model != null) {
                        if (model.getTable().getName().equalsIgnoreCase(tableName)) {
                            liste.add(listeTmp);
                        }
                    }
                }
            }
        }
        return liste;
    }

    /**
     * Permet d'obtenir la position dans le vecteur correspondant au nom d'une table
     * 
     * @param tableName nom de la table
     * @return -1 si la table n'est pas dans le vecteur
     */
    private int getIndexFromTableName(String tableName) {
        final int size = this.vectListePanel.size();
        for (int i = 0; i < size; i++) {
            final IListPanel listeTmp = this.vectListePanel.get(i);
            final String name = listeTmp.getListe().getModel().getTable().getName();
            if (name.equalsIgnoreCase(tableName)) {
                return i;
            }
        }
        return -1;
    }

    public IListe getListe(int index) {
        return this.vectListePanel.get(index).getListe();
    }

    public IListPanel getListePanel(int index) {
        return this.vectListePanel.get(index);
    }

    public void fireListesChanged() {
        final int size = this.vectListePanel.size();
        for (int i = 0; i < size; i++) {
            final IListPanel listeTmp = this.vectListePanel.get(i);
            final ITableModel model = listeTmp.getListe().getModel();
            model.fireTableDataChanged();
            model.fireTableStructureChanged();
        }

    }

}