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.table;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Set;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JViewport;
import javax.swing.Scrollable;
import javax.swing.SwingConstants;

import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.modules.extensionbuilder.ClickableLabel;
import org.openconcerto.modules.extensionbuilder.Extension;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLField;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.DefaultListModel;
import org.openconcerto.ui.JLabelBold;
import org.openconcerto.utils.Tuple2;

public class TableModifyInfoPanel extends JPanel implements Scrollable {
    private Extension extension;

    // TODO: tooltip sur un champs pour indiquer quelles extensions l'utilisent

    public TableModifyInfoPanel(Extension extension, SQLTable t, final TableDescritor desc, final TableModifyLeftPanel leftPanel) {
        this.extension = extension;
        this.setLayout(new GridBagLayout());
        this.setBackground(Color.WHITE);
        GridBagConstraints c = new DefaultGridBagConstraints();
        c.weightx = 1;

        Set<SQLField> fields = t.getFields();
        List<SQLField> allFields = new ArrayList<SQLField>();
        for (SQLField sqlField : fields) {
            final String fName = sqlField.getName();
            if (!fName.equalsIgnoreCase("ARCHIVE") && !fName.equalsIgnoreCase("ORDRE")) {
                allFields.add(sqlField);
            }
        }
        Collections.sort(allFields, new Comparator<SQLField>() {

            @Override
            public int compare(SQLField o1, SQLField o2) {

                return o1.getName().compareTo(o2.getName());
            }
        });

        List<SQLTable> lt = new ArrayList<SQLTable>(t.getDBSystemRoot().getGraph().getReferentTables(t));
        Collections.sort(lt, new Comparator<SQLTable>() {

            @Override
            public int compare(SQLTable o1, SQLTable o2) {

                return o1.getName().compareTo(o2.getName());
            }
        });
        if (lt.size() > 0) {
            this.add(new JLabel(lt.size() + " champs des tables suivantes référencent la table " + t.getName() + " :"), c);
            c.gridy++;
            c.weightx = 0;
            for (final SQLTable sqlTable : lt) {
                this.add(new ClickableLabel(sqlTable.getName(), new Runnable() {

                    @Override
                    public void run() {
                        leftPanel.selectTable(sqlTable.getName());

                    }
                }), c);
                c.gridy++;
            }
            c.gridy++;
            c.weightx = 1;
            this.add(new JLabel(" "), c);
            c.gridy++;
        }
        this.add(new JLabel("Cette table contient " + allFields.size() + " champs :"), c);

        c.gridy++;
        for (SQLField sqlField : allFields) {
            String str = "";

            JPanel line = new JPanel();
            line.add(new JLabelBold(sqlField.getName()));
            line.setOpaque(false);
            line.setLayout(new FlowLayout(FlowLayout.LEADING, 0, 0));
            try {
                String label = ComptaPropsConfiguration.getTranslator(t).getLabelFor(sqlField);
                if (label != null) {
                    str += " (" + label + ")";
                }
            } catch (Exception e) {
                // No label...
            }
            String type = sqlField.getTypeDecl().toLowerCase();
            if (type.contains("double") || type.contains("real") || type.contains("float")) {
                type = "nombre décimal";
            } else if (type.contains("int")) {
                type = "nombre entier";
            } else if (type.contains("text") || type.contains("varchar")) {
                type = "texte";
            } else if (type.contains("boolean")) {
                type = "booléen";
            } else if (type.contains("timestamp")) {
                type = "date et heure";
            }
            if (sqlField.isKey() && sqlField.getForeignTable() != null) {
                final SQLTable foreignTable = sqlField.getForeignTable();
                str += " référence vers la table ";
                line.add(new JLabel(str));
                if (foreignTable.getDBRoot().equals(t.getDBRoot())) {
                    line.add(new ClickableLabel(foreignTable.getName(), new Runnable() {
                        @Override
                        public void run() {
                            leftPanel.selectTable(foreignTable.getName());
                        }
                    }));
                } else {
                    line.add(new JLabel(foreignTable.getName()));
                }
                SQLElement e = ComptaPropsConfiguration.getInstanceCompta().getDirectory().getElement(foreignTable);
                if (e != null) {
                    line.add(new JLabel(" (cad " + e.getSingularName() + ")"));
                }

            } else if (sqlField.isPrimaryKey()) {
                str += " clef primaire";
                line.add(new JLabel(str));
            } else {
                str += " de type " + type;
                line.add(new JLabel(str));
            }

            this.add(line, c);
            c.gridy++;
        }

        final JPanel spacer = new JPanel();
        spacer.setOpaque(false);
        c.weighty = 1;
        c.gridy++;
        this.add(spacer, c);

    }

    Tuple2<JPanel, GridBagConstraints> createEditorList(final TableDescritor desc) {
        JPanel p = new JPanel();
        p.setLayout(new GridBagLayout());
        GridBagConstraints c = new DefaultGridBagConstraints();
        List<FieldDescriptor> fields = desc.getFields();
        for (final FieldDescriptor field : fields) {
            addField(desc, p, c, field);
        }
        Tuple2<JPanel, GridBagConstraints> result = Tuple2.create(p, c);
        return result;

    }

    private void addField(final TableDescritor desc, final JPanel p, GridBagConstraints c, final FieldDescriptor field) {
        c.weightx = 1;
        c.gridx = 0;
        final FieldDescriptorEditor editor = new FieldDescriptorEditor(this.extension, field);
        p.add(editor, c);

        c.gridx++;
        c.weightx = 0;
        final JButton close = new JButton(new ImageIcon(DefaultListModel.class.getResource("close_popup.png")));

        p.add(close, c);
        close.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                desc.remove(field);
                p.remove(editor);
                p.remove(close);
                p.revalidate();
            }
        });
        c.gridy++;
    }

    public Dimension getPreferredScrollableViewportSize() {
        return getPreferredSize();
    }

    public int getScrollableUnitIncrement(final Rectangle visibleRect, final int orientation, final int direction) {
        switch (orientation) {
        case SwingConstants.VERTICAL:
            return visibleRect.height / 10;
        case SwingConstants.HORIZONTAL:
            return visibleRect.width / 10;
        default:
            throw new IllegalArgumentException("Invalid orientation: " + orientation);
        }
    }

    public int getScrollableBlockIncrement(final Rectangle visibleRect, final int orientation, final int direction) {
        switch (orientation) {
        case SwingConstants.VERTICAL:
            return visibleRect.height;
        case SwingConstants.HORIZONTAL:
            return visibleRect.width;
        default:
            throw new IllegalArgumentException("Invalid orientation: " + orientation);
        }
    }

    public boolean getScrollableTracksViewportWidth() {
        if (getParent() instanceof JViewport) {
            return ((JViewport) getParent()).getWidth() > getPreferredSize().width;
        }
        return false;
    }

    public boolean getScrollableTracksViewportHeight() {
        if (getParent() instanceof JViewport) {
            return ((JViewport) getParent()).getHeight() > getPreferredSize().height;
        }
        return false;
    }

}