OpenConcerto

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

svn://code.openconcerto.org/openconcerto

Rev

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

package org.openconcerto.modules.label;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.geom.Rectangle2D;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map.Entry;
import java.util.TreeMap;

import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.SwingWorker;

import org.openconcerto.erp.generationDoc.provider.AdresseFullClientValueProvider;
import org.openconcerto.erp.modules.AbstractModule;
import org.openconcerto.erp.modules.ComponentsContext;
import org.openconcerto.erp.modules.ModuleFactory;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLRowValuesListFetcher;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.IListeAction.IListeEvent;
import org.openconcerto.sql.view.list.RowAction.PredicateRowAction;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.FileUtils;
import org.openconcerto.utils.GestionDevise;
import org.openconcerto.utils.StringUtils;

public final class ModuleLabel extends AbstractModule {
    final LinkedHashMap<String, String> zplTemplates = new LinkedHashMap<String, String>();

    public ModuleLabel(ModuleFactory f) throws IOException {
        super(f);
    }

    @Override
    protected void setupComponents(ComponentsContext ctxt) {
        readTemplates(new File("Template/Labels"));
        readTemplates(new File("Configuration/Template/Labels"));

        final String actionName = "Imprimer les étiquettes";
        final PredicateRowAction aArticle = new PredicateRowAction(new AbstractAction(actionName) {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                final IListe list = IListe.get(arg0);
                final List<Integer> selectedIDs = list.getSelection().getSelectedIDs();
                final SQLTable tArticle = list.getSelectedRows().get(0).getTable();
                final SwingWorker<List<RowValuesLabel>, String> wworker = new SwingWorker<List<RowValuesLabel>, String>() {

                    @Override
                    protected List<RowValuesLabel> doInBackground() throws Exception {
                        final SQLRowValues graph = new SQLRowValues(tArticle);
                        graph.putNulls("NOM", "PV_TTC");
                        final SQLRowValuesListFetcher fetcher = SQLRowValuesListFetcher.create(graph);
                        final List<SQLRowValues> rows = fetcher.fetch(new Where(tArticle.getKey(), selectedIDs));
                        final List<RowValuesLabel> list = new ArrayList<>(rows.size());
                        for (SQLRowValues row : rows) {
                            list.add(new RowValuesLabel(row));
                        }
                        return list;
                    }

                    @Override
                    protected void done() {
                        try {
                            final List<RowValuesLabel> values = get();

                            final LabelFrame f = new LabelFrame(values, new LabelRenderer() {

                                @Override
                                public void paintLabel(Graphics g, Label label, int x, int y, int gridWith, int gridHeight, float fontSize) {
                                    g.setColor(Color.BLACK);
                                    g.setFont(g.getFont().deriveFont(fontSize));
                                    // Labels borders
                                    final int hBorder = 12;
                                    final int vBorder = 8;
                                    // Product name
                                    SQLRowValues row = ((RowValuesLabel) label).getSQLRowValues();
                                    final String text = row.getString("NOM");
                                    final List<String> l = StringUtils.wrap(text, g.getFontMetrics(), gridWith - 2 * hBorder);
                                    final int lineHeight = g.getFontMetrics().getHeight();
                                    int lineY = y;
                                    final int margin = gridHeight - l.size() * lineHeight;
                                    if (margin > 0) {
                                        lineY += margin / 2;
                                    }
                                    for (String line : l) {
                                        g.drawString(line, x + hBorder, lineY);
                                        lineY += lineHeight;
                                    }
                                    // Price
                                    g.setFont(g.getFont().deriveFont(fontSize + 2));
                                    final String price = GestionDevise.currencyToString(row.getBigDecimal("PV_TTC")) + " € TTC";
                                    final Rectangle2D r2 = g.getFont().getStringBounds(price, g.getFontMetrics().getFontRenderContext());
                                    g.drawString(price, x + (int) (gridWith - hBorder - r2.getWidth()), y + gridHeight - vBorder);

                                }
                            });
                            f.setTitle(actionName);
                            f.setLocationRelativeTo(null);
                            f.pack();
                            f.setResizable(false);
                            f.setVisible(true);
                        } catch (Exception e) {
                            ExceptionHandler.handle("Erreur d'impression", e);
                        }
                    }
                };
                wworker.execute();

            }
        }, true, false);
        final PredicateRowAction aClient = new PredicateRowAction(new AbstractAction(actionName) {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                final IListe list = IListe.get(arg0);
                final List<Integer> selectedIDs = list.getSelection().getSelectedIDs();
                final SQLTable tClient = list.getSelectedRows().get(0).getTable();
                final SwingWorker<List<RowValuesLabel>, String> wworker = new SwingWorker<List<RowValuesLabel>, String>() {

                    @Override
                    protected List<RowValuesLabel> doInBackground() throws Exception {
                        final SQLRowValues graph = new SQLRowValues(tClient);
                        graph.putNulls("NOM");
                        final SQLRowValues a1 = graph.putRowValues("ID_ADRESSE");
                        a1.putNulls(a1.getTable().getFieldsName());
                        final SQLRowValues a2 = graph.putRowValues("ID_ADRESSE_L");
                        a2.putNulls(a2.getTable().getFieldsName());
                        final SQLRowValuesListFetcher fetcher = SQLRowValuesListFetcher.create(graph);
                        final List<SQLRowValues> rows = fetcher.fetch(new Where(tClient.getKey(), selectedIDs));

                        final List<RowValuesLabel> list = new ArrayList<>(rows.size());
                        for (SQLRowValues row : rows) {
                            list.add(new RowValuesLabel(row));
                        }
                        return list;
                    }

                    @Override
                    protected void done() {
                        try {
                            final List<RowValuesLabel> values = get();
                            final LabelFrame f = new LabelFrame(values, new LabelRenderer() {

                                @Override
                                public void paintLabel(Graphics g, Label label, int x, int y, int gridWith, int gridHeight, float fontSize) {
                                    SQLRowValues row = ((RowValuesLabel) label).getSQLRowValues();
                                    SQLRowAccessor rAddr = row.getForeign("ID_ADRESSE_L");
                                    if (rAddr == null || rAddr.isUndefined()) {
                                        rAddr = row.getForeign("ID_ADRESSE");
                                    }
                                    if (rAddr == null || rAddr.isUndefined()) {
                                        return;
                                    }

                                    String text = AdresseFullClientValueProvider.getFormattedAddress(rAddr, row.getString("NOM") + "\n");

                                    // Default font at 10pt black
                                    g.setColor(Color.BLACK);
                                    g.setFont(g.getFont().deriveFont(fontSize));
                                    // Labels borders
                                    final int hBorder = 12;
                                    // Product name
                                    final List<String> l = StringUtils.wrap(text, g.getFontMetrics(), gridWith - 2 * hBorder);
                                    final int lineHeight = g.getFontMetrics().getHeight();
                                    int lineY = y + lineHeight + 4;
                                    for (String line : l) {
                                        g.drawString(line, x + hBorder, lineY);
                                        lineY += lineHeight;
                                    }

                                }
                            });
                            f.setTitle(actionName);
                            f.setLocationRelativeTo(null);
                            f.pack();
                            f.setResizable(false);
                            f.setVisible(true);

                        } catch (Exception e) {
                            ExceptionHandler.handle("Erreur d'impression", e);
                        }
                    }
                };
                wworker.execute();

            }
        }, true, false);

        aArticle.setPredicate(IListeEvent.createSelectionCountPredicate(1, Integer.MAX_VALUE));
        aClient.setPredicate(IListeEvent.createSelectionCountPredicate(1, Integer.MAX_VALUE));
        ctxt.getElement("ARTICLE").getRowActions().add(aArticle);
        ctxt.getElement("CLIENT").getRowActions().add(aClient);

        if (!this.zplTemplates.isEmpty()) {
            for (final Entry<String, String> entry : this.zplTemplates.entrySet()) {
                final String zpl = entry.getValue();
                final PredicateRowAction action = new PredicateRowAction(new AbstractAction("Imprimer l'étiquette " + entry.getKey()) {

                    @Override
                    public void actionPerformed(ActionEvent arg0) {
                        final ZPLPrinterPanel p = new ZPLPrinterPanel(zpl);
                        final JFrame f = new JFrame();
                        final IListe list = IListe.get(arg0);
                        final int idProduct = list.getSelection().getSelectedID();
                        final SQLTable tArticle = list.getSelectedRows().get(0).getTable();

                        final SwingWorker<SQLRowValues, String> wworker = new SwingWorker<SQLRowValues, String>() {

                            @Override
                            protected SQLRowValues doInBackground() throws Exception {
                                final SQLRow row = tArticle.getRow(idProduct);
                                row.fetchValues();
                                return row.asRowValues();
                            }

                            @Override
                            protected void done() {
                                try {
                                    final SQLRowValues values = get();
                                    p.initUI(values);
                                    f.setTitle(entry.getKey());
                                    f.setContentPane(p);
                                    f.pack();
                                    f.setLocationRelativeTo(null);
                                    f.setVisible(true);

                                } catch (Exception e) {
                                    ExceptionHandler.handle("Erreur d'impression", e);
                                }
                            }
                        };
                        wworker.execute();

                    }
                }, true, false);

                action.setPredicate(IListeEvent.createSelectionCountPredicate(1, 1));
                ctxt.getElement("ARTICLE").getRowActions().add(action);
            }
        }

    }

    @Override
    protected void start() {

    }

    private void readTemplates(File templatesDir) {
        System.out.println("ModuleLabel.readTemplates() " + templatesDir.getAbsolutePath());
        if (templatesDir.exists() && templatesDir.isDirectory()) {
            System.err.println("ModuleLabel.readTemplates() " + templatesDir.getAbsolutePath());
            File[] files = templatesDir.listFiles();
            if (files != null) {
                LinkedHashMap<String, String> map = new LinkedHashMap<>();
                for (File f : files) {
                    if (f.getName().endsWith(".zpl")) {
                        try {
                            String zpl = FileUtils.read(f, StandardCharsets.UTF_8);
                            String name = f.getName().substring(0, f.getName().length() - 4).trim();
                            map.put(name, zpl);
                            System.err.println("ModuleLabel.readTemplates() add " + name);
                        } catch (Exception e) {
                            System.err.println(this.getClass().getCanonicalName() + "start() cannot read zpl template : " + f.getAbsolutePath() + " : " + e.getMessage());
                        }
                    }
                }
                // Tri de la map par clef
                final TreeMap<String, String> copy = new TreeMap<>(map);
                this.zplTemplates.clear();
                this.zplTemplates.putAll(copy);
            }

        } else {
            System.err.println("ModuleLabel.readTemplates() " + templatesDir.getAbsolutePath() + " missing");
        }
    }

    @Override
    protected void stop() {
        // nothing
    }
}