OpenConcerto

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

svn://code.openconcerto.org/openconcerto

Rev

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

package org.openconcerto.modules.extensionbuilder.list;

import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.List;

import javax.swing.DefaultListCellRenderer;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreePath;

import org.openconcerto.modules.extensionbuilder.Extension;
import org.openconcerto.modules.extensionbuilder.table.FieldDescriptor;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.DefaultListModel;
import org.openconcerto.ui.JLabelBold;
import org.openconcerto.ui.list.ReorderableJList;

public class FieldDescSelector extends JPanel {
    private FieldTreeModel treeModel;
    private DefaultListModel listModel;
    private final JTree tree;
    private JList list;
    private ListDescriptor listDescriptor;

    FieldDescSelector(ListDescriptor desc, Extension extension) {
        this.listDescriptor = desc;
        this.setLayout(new GridBagLayout());
        GridBagConstraints c = new DefaultGridBagConstraints();
        this.add(new JLabelBold("Champs disponibles"), c);
        c.gridx += 2;
        this.add(new JLabelBold("Colonnes affichés"), c);

        // Col 0
        c.gridx = 0;
        c.gridy++;
        this.treeModel = new FieldTreeModel(extension);
        this.tree = new JTree(this.treeModel) {
            @Override
            public String convertValueToText(Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
                final Object userObject = ((DefaultMutableTreeNode) value).getUserObject();
                if (userObject == null)
                    return "null";
                FieldDescriptor d = (FieldDescriptor) userObject;

                if (d.getForeignTable() != null) {
                    return " " + d.getName() + " référence vers la table " + d.getForeignTable();
                }
                return " " + d.getName();
            }
        };
        this.tree.setRootVisible(false);
        this.tree.setShowsRootHandles(true);
        final DefaultTreeCellRenderer treeRenderer = new DefaultTreeCellRenderer();

        treeRenderer.setLeafIcon(null);
        treeRenderer.setOpenIcon(new ImageIcon(this.getClass().getResource("ref.png")));
        treeRenderer.setClosedIcon(new ImageIcon(this.getClass().getResource("ref.png")));
        this.tree.setCellRenderer(treeRenderer);
        c.gridheight = 2;
        c.weightx = 1;
        c.weighty = 1;
        c.fill = GridBagConstraints.BOTH;
        this.add(new JScrollPane(this.tree), c);
        // Col 1
        c.gridx = 1;
        c.gridheight = 1;
        c.weightx = 0;
        c.weighty = 0;
        c.fill = GridBagConstraints.NONE;
        c.anchor = GridBagConstraints.NORTH;
        final JButton buttonAdd = new JButton(">");
        this.add(buttonAdd, c);
        c.gridy++;
        final JButton buttonRemove = new JButton("<");
        this.add(buttonRemove, c);
        // Col 2
        c.gridx = 2;
        c.gridy--;
        c.gridheight = 2;
        c.weightx = 1;
        c.weighty = 1;
        c.fill = GridBagConstraints.BOTH;
        this.listModel = new DefaultListModel() {
            @Override
            public void addElement(Object obj) {
                if (!(obj instanceof ColumnDescriptor)) {
                    throw new IllegalArgumentException(obj + " is not a ColumnDescriptor");
                }
                super.addElement(obj);
            }

        };
        this.list = new ReorderableJList();
        this.list.setModel(this.listModel);
        this.list.setCellRenderer(new DefaultListCellRenderer() {
            @Override
            public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
                ColumnDescriptor f = (ColumnDescriptor) value;
                String label = f.getFieldsPaths();
                return super.getListCellRendererComponent(list, label, index, isSelected, cellHasFocus);
            }
        });
        this.add(new JScrollPane(this.list), c);
        // Listeners
        this.tree.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (e.getClickCount() > 1) {
                    addTreeSelectionToList();
                }
            }

        });
        buttonAdd.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                addTreeSelectionToList();

            }
        });
        buttonRemove.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                deleteSelectedInList();

            }
        });
        this.list.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_DELETE) {
                    deleteSelectedInList();
                }
                e.consume();
            }
        });

    }

    public void setMainTable(String table) {
        this.listDescriptor.setMainTable(table);
        this.treeModel.fillFromTable(table);
        this.listModel.removeAllElements();
        for (ColumnDescriptor d : this.listDescriptor.getColumns()) {
            this.listModel.addElement(d);
        }
    }

    private void deleteSelectedInList() {
        List<Object> vals = this.list.getSelectedValuesList();
        if (vals.isEmpty())
            return;
        for (Object object : vals) {
            boolean b = this.listModel.removeElement(object);
            if (!b) {
                throw new IllegalStateException("cannot remove " + object + " from list model " + this.listModel);
            }
            if (object instanceof ColumnDescriptor) {
                ColumnDescriptor c = (ColumnDescriptor) object;
                this.listDescriptor.remove(c);
            }
        }
        this.list.clearSelection();
    }

    private void addTreeSelectionToList() {
        final TreePath[] paths = this.tree.getSelectionPaths();
        if (paths == null)
            return;
        for (int i = 0; i < paths.length; i++) {
            TreePath treePath = paths[i];
            Object[] obj = treePath.getPath();
            FieldDescriptor d = null;
            FieldDescriptor root = null;
            for (int j = 0; j < obj.length; j++) {
                final Object object = obj[j];
                if (object != null) {
                    final FieldDescriptor f = (FieldDescriptor) (((DefaultMutableTreeNode) object).getUserObject());
                    if (f != null) {
                        final FieldDescriptor fieldDescriptor = new FieldDescriptor(f);
                        if (root == null) {
                            root = fieldDescriptor;

                        }
                        if (d != null) {
                            d.setLink(fieldDescriptor);
                        }
                        d = fieldDescriptor;
                    }
                }
            }

            // On ne met pas les foreigns keys
            if (d != null && root != null) {
                boolean add = true;
                final String extendedLabel = root.getPath();
                final int size = this.listModel.getSize();
                // Check if already in the list
                for (int j = 0; j < size; j++) {
                    if (((ColumnDescriptor) this.listModel.getElementAt(j)).getFieldsPaths().contains(extendedLabel)) {
                        add = false;
                        break;
                    }
                }
                if (add) {
                    final ColumnDescriptor colDesc = new ColumnDescriptor(root.getPath());
                    colDesc.setFieldsPaths(root.getPath());
                    this.listModel.addElement(colDesc);
                    this.listDescriptor.add(colDesc);
                }
            }
        }
        this.tree.clearSelection();
    }

}