OpenConcerto

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

svn://code.openconcerto.org/openconcerto

Rev

Rev 174 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 174 Rev 182
Line 1... Line 1...
1
/*
1
/*
2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3
 * 
3
 * 
4
 * Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
4
 * Copyright 2011-2019 OpenConcerto, by ILM Informatique. All rights reserved.
5
 * 
5
 * 
6
 * The contents of this file are subject to the terms of the GNU General Public License Version 3
6
 * The contents of this file are subject to the terms of the GNU General Public License Version 3
7
 * only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
7
 * only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
8
 * copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
8
 * copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
9
 * language governing permissions and limitations under the License.
9
 * language governing permissions and limitations under the License.
Line 12... Line 12...
12
 */
12
 */
13
 
13
 
14
 package org.openconcerto.erp.model;
14
 package org.openconcerto.erp.model;
15
 
15
 
16
import org.openconcerto.erp.config.ComptaPropsConfiguration;
16
import org.openconcerto.erp.config.ComptaPropsConfiguration;
-
 
17
import org.openconcerto.erp.core.common.ui.PreviewFrame;
17
import org.openconcerto.erp.core.customerrelationship.mail.EmailTemplate;
18
import org.openconcerto.erp.core.customerrelationship.mail.EmailTemplate;
18
import org.openconcerto.erp.core.customerrelationship.mail.ValueListener;
19
import org.openconcerto.erp.core.customerrelationship.mail.ValueListener;
19
import org.openconcerto.erp.generationDoc.AbstractSheetXml;
20
import org.openconcerto.erp.generationDoc.AbstractSheetXml;
20
import org.openconcerto.sql.Configuration;
21
import org.openconcerto.sql.Configuration;
-
 
22
import org.openconcerto.sql.element.SQLComponent;
-
 
23
import org.openconcerto.sql.element.SQLElement;
21
import org.openconcerto.sql.model.SQLBase;
24
import org.openconcerto.sql.model.SQLBase;
22
import org.openconcerto.sql.model.SQLField;
25
import org.openconcerto.sql.model.SQLField;
23
import org.openconcerto.sql.model.SQLRow;
26
import org.openconcerto.sql.model.SQLRow;
24
import org.openconcerto.sql.model.SQLRowAccessor;
27
import org.openconcerto.sql.model.SQLRowAccessor;
25
import org.openconcerto.sql.model.SQLRowValues;
-
 
26
import org.openconcerto.sql.model.SQLTable;
28
import org.openconcerto.sql.model.SQLTable;
-
 
29
import org.openconcerto.sql.view.EditFrame;
-
 
30
import org.openconcerto.sql.view.EditPanel.EditMode;
27
import org.openconcerto.sql.view.list.IListe;
31
import org.openconcerto.sql.view.list.IListe;
28
import org.openconcerto.sql.view.list.RowAction;
32
import org.openconcerto.sql.view.list.RowAction;
-
 
33
import org.openconcerto.sql.view.list.action.ListEvent;
29
import org.openconcerto.ui.EmailComposer;
34
import org.openconcerto.ui.EmailComposer;
-
 
35
import org.openconcerto.ui.FrameUtil;
-
 
36
import org.openconcerto.utils.Action;
30
import org.openconcerto.utils.ExceptionHandler;
37
import org.openconcerto.utils.ExceptionHandler;
31
import org.openconcerto.utils.ListMap;
38
import org.openconcerto.utils.ListMap;
-
 
39
import org.openconcerto.utils.i18n.Grammar;
32
import org.openconcerto.utils.i18n.TranslationManager;
40
import org.openconcerto.utils.i18n.TranslationManager;
33
 
41
 
34
import java.awt.event.ActionEvent;
42
import java.awt.event.ActionEvent;
35
import java.io.File;
43
import java.io.File;
-
 
44
import java.io.FileInputStream;
-
 
45
import java.io.FileOutputStream;
-
 
46
import java.io.IOException;
-
 
47
import java.io.InputStream;
-
 
48
import java.io.OutputStream;
36
import java.lang.reflect.Constructor;
49
import java.lang.reflect.Constructor;
37
import java.util.ArrayList;
50
import java.util.ArrayList;
-
 
51
import java.util.Arrays;
-
 
52
import java.util.Collections;
38
import java.util.List;
53
import java.util.List;
39
import java.util.Set;
54
import java.util.Set;
40
import java.util.StringJoiner;
55
import java.util.StringJoiner;
41
 
56
 
42
import javax.swing.AbstractAction;
57
import javax.swing.AbstractAction;
43
import javax.swing.Action;
58
import javax.swing.JFileChooser;
44
import javax.swing.JOptionPane;
59
import javax.swing.JOptionPane;
45
import javax.swing.SwingUtilities;
60
import javax.swing.SwingUtilities;
46
 
61
 
47
public class MouseSheetXmlListeListener {
62
public class MouseSheetXmlListeListener {
48
 
63
 
Line 54... Line 69...
54
    private boolean printIsVisible = true;
69
    private boolean printIsVisible = true;
55
    private boolean generateIsVisible = true;
70
    private boolean generateIsVisible = true;
56
    private boolean previewHeader = false;
71
    private boolean previewHeader = false;
57
    private boolean showHeader = false;
72
    private boolean showHeader = false;
58
    private boolean generateHeader = false;
73
    private boolean generateHeader = false;
-
 
74
    private SQLElement element;
59
 
75
 
60
    public MouseSheetXmlListeListener(Class<? extends AbstractSheetXml> clazz) {
76
    public MouseSheetXmlListeListener(SQLElement element, Class<? extends AbstractSheetXml> clazz) {
61
        this(clazz, true, true, true, true);
77
        this(element, clazz, true, true, true, true);
62
 
78
 
63
    }
79
    }
64
 
80
 
65
    public MouseSheetXmlListeListener(Class<? extends AbstractSheetXml> clazz, boolean show, boolean preview, boolean print, boolean generate) {
81
    public MouseSheetXmlListeListener(SQLElement element, Class<? extends AbstractSheetXml> clazz, boolean show, boolean preview, boolean print, boolean generate) {
-
 
82
        this.element = element;
66
        this.clazz = clazz;
83
        this.clazz = clazz;
67
        this.printIsVisible = print;
84
        this.printIsVisible = print;
68
        this.previewIsVisible = preview;
85
        this.previewIsVisible = preview;
69
        this.showIsVisible = show;
86
        this.showIsVisible = show;
70
        this.generateIsVisible = generate;
87
        this.generateIsVisible = generate;
Line 113... Line 130...
113
 
130
 
114
    public void setShowHeader(boolean showHeader) {
131
    public void setShowHeader(boolean showHeader) {
115
        this.showHeader = showHeader;
132
        this.showHeader = showHeader;
116
    }
133
    }
117
 
134
 
118
    protected void sendMail(EmailTemplate template, final AbstractSheetXml sheet, final boolean readOnly) {
135
    public void sendMail(EmailTemplate template, final AbstractSheetXml sheet, final boolean readOnly) {
119
        List<AbstractSheetXml> l = new ArrayList<>(1);
136
        List<AbstractSheetXml> l = new ArrayList<>(1);
120
        l.add(sheet);
137
        l.add(sheet);
121
        sendMail(template, l, readOnly);
138
        sendMail(template, l, readOnly);
122
    }
139
    }
123
 
140
 
Line 287... Line 304...
287
                    }
304
                    }
288
 
305
 
289
                }, this.previewHeader, "document.modify") {
306
                }, this.previewHeader, "document.modify") {
290
 
307
 
291
                    @Override
308
                    @Override
292
                    public boolean enabledFor(IListeEvent evt) {
309
                    public boolean enabledFor(ListEvent evt) {
293
                        // On ne teste pas l'existence du fichier génété car les IOs peuvent prendre
310
                        // On ne teste pas l'existence du fichier génété car les IOs peuvent prendre
294
                        // du temps
311
                        // du temps
295
                        return evt.getSelectedRow() != null && (evt.getTotalRowCount() >= 1);
312
                        return evt.getSelectedRow() != null && (evt.getTotalRowCount() >= 1);
296
                    }
313
                    }
297
 
314
 
Line 305... Line 322...
305
                l.add(new RowAction(new AbstractAction() {
322
                l.add(new RowAction(new AbstractAction() {
306
                    public void actionPerformed(ActionEvent ev) {
323
                    public void actionPerformed(ActionEvent ev) {
307
                        try {
324
                        try {
308
                            final AbstractSheetXml sheet = createAbstractSheet(IListe.get(ev).fetchSelectedRow());
325
                            final AbstractSheetXml sheet = createAbstractSheet(IListe.get(ev).fetchSelectedRow());
309
                            final SQLTable table = IListe.get(ev).getSource().getPrimaryTable();
326
                            final SQLTable table = IListe.get(ev).getSource().getPrimaryTable();
310
                            sheet.showPreviewDocument(TranslationManager.getInstance().getTranslationForAction("email"), new Runnable() {
327
                            final Action emailAction = new Action(TranslationManager.getInstance().getTranslationForAction("document.pdf.send.email")) {
311
 
328
 
312
                                @Override
329
                                @Override
313
                                public void run() {
330
                                public void run(Object source) {
314
                                    EmailTemplate.askTemplate(IListe.get(ev), table.getDBRoot(), new ValueListener() {
331
                                    EmailTemplate.askTemplate(IListe.get(ev), table.getDBRoot(), new ValueListener() {
315
 
332
 
316
                                        @Override
333
                                        @Override
317
                                        public void valueSelected(Object value) {
334
                                        public void valueSelected(Object value) {
318
                                            sendMail((EmailTemplate) value, sheet, true);
335
                                            sendMail((EmailTemplate) value, sheet, true);
319
                                        }
336
                                        }
320
                                    });
337
                                    });
321
 
338
 
322
                                }
339
                                }
323
                            });
340
                            };
-
 
341
                            final Action modifyAction = new Action(
-
 
342
                                    TranslationManager.getInstance().getTranslationForAction("modify") + " " + element.getName().getVariant(Grammar.DEFINITE_ARTICLE_SINGULAR)) {
-
 
343
 
-
 
344
                                @Override
-
 
345
                                public void run(Object source) {
-
 
346
                                    if (source instanceof PreviewFrame) {
-
 
347
                                        ((PreviewFrame) source).dispose();
-
 
348
                                    }
-
 
349
                                    final SQLComponent component = element.createDefaultComponent();
-
 
350
                                    final EditFrame f = new EditFrame(component, EditMode.MODIFICATION);
-
 
351
                                    f.selectionId(IListe.get(ev).getSelectedId());
-
 
352
                                    FrameUtil.show(f);
-
 
353
 
-
 
354
                                }
-
 
355
                            };
-
 
356
                            sheet.showPreviewDocument(Arrays.asList(emailAction, modifyAction));
324
                        } catch (Exception e) {
357
                        } catch (Exception e) {
325
                            ExceptionHandler.handle("Impossible d'ouvrir le fichier", e);
358
                            ExceptionHandler.handle("Impossible d'ouvrir le fichier", e);
326
                        }
359
                        }
327
                    }
360
                    }
328
 
361
 
329
                }, this.previewHeader, "document.preview") {
362
                }, this.previewHeader, "document.preview") {
330
 
363
 
331
                    @Override
364
                    @Override
332
                    public boolean enabledFor(IListeEvent evt) {
365
                    public boolean enabledFor(ListEvent evt) {
333
                        // On ne teste pas l'existence du fichier génété car les IOs peuvent prendre
366
                        // On ne teste pas l'existence du fichier génété car les IOs peuvent prendre
334
                        // du temps
367
                        // du temps
335
                        return evt.getSelectedRow() != null && evt.getTotalRowCount() >= 1;
368
                        return evt.getSelectedRow() != null && evt.getTotalRowCount() >= 1;
336
                    }
369
                    }
337
                });
370
                });
Line 357... Line 390...
357
                    }
390
                    }
358
                }
391
                }
359
            }, this.showHeader, "document.modify") {
392
            }, this.showHeader, "document.modify") {
360
 
393
 
361
                @Override
394
                @Override
362
                public boolean enabledFor(IListeEvent evt) {
395
                public boolean enabledFor(ListEvent evt) {
363
                    // On ne teste pas l'existence du fichier génété car les IOs peuvent prendre
396
                    // On ne teste pas l'existence du fichier génété car les IOs peuvent prendre
364
                    // du temps
397
                    // du temps
365
                    return evt.getSelectedRow() != null && evt.getTotalRowCount() >= 1;
398
                    return evt.getSelectedRow() != null && evt.getTotalRowCount() >= 1;
366
                }
399
                }
367
            });
400
            });
368
 
401
 
369
        }
402
        }
370
 
403
 
-
 
404
        l.add(new RowAction(new AbstractAction() {
-
 
405
            public void actionPerformed(ActionEvent ev) {
-
 
406
                try {
-
 
407
                    File file = createAbstractSheet(IListe.get(ev).fetchSelectedRow()).getOrCreatePDFDocumentFile(true);
-
 
408
 
-
 
409
                    JFileChooser fileChooser = new JFileChooser();
-
 
410
                    fileChooser.setSelectedFile(file);
-
 
411
                    fileChooser.setDialogTitle(TranslationManager.getInstance().getTranslationForAction("document.saveToPDF"));
-
 
412
 
-
 
413
                    int userSelection = fileChooser.showSaveDialog(IListe.get(ev));
-
 
414
 
-
 
415
                    if (userSelection == JFileChooser.APPROVE_OPTION) {
-
 
416
                        File fileToSave = fileChooser.getSelectedFile();
-
 
417
                        InputStream is = null;
-
 
418
                        OutputStream os = null;
-
 
419
                        try {
-
 
420
                            is = new FileInputStream(file);
-
 
421
                            os = new FileOutputStream(fileToSave);
-
 
422
                            byte[] buffer = new byte[4096];
-
 
423
                            int length;
-
 
424
                            while ((length = is.read(buffer)) > 0) {
-
 
425
                                os.write(buffer, 0, length);
-
 
426
                            }
-
 
427
                        } catch (Exception ex) {
-
 
428
                            ex.printStackTrace();
-
 
429
                        } finally {
-
 
430
 
-
 
431
                            try {
-
 
432
                                if (is != null)
-
 
433
                                    is.close();
-
 
434
                            } catch (IOException e1) {
-
 
435
                                e1.printStackTrace();
-
 
436
                            }
-
 
437
                            try {
-
 
438
                                if (os != null)
-
 
439
                                    os.close();
-
 
440
                            } catch (IOException e1) {
-
 
441
                                e1.printStackTrace();
-
 
442
                            }
-
 
443
                        }
-
 
444
                    }
-
 
445
 
-
 
446
                } catch (Exception e) {
-
 
447
                    ExceptionHandler.handle("Impossible d'ouvrir le fichier", e);
-
 
448
                }
-
 
449
            }
-
 
450
        }, false, "document.saveToPDF") {
-
 
451
 
-
 
452
            @Override
-
 
453
            public boolean enabledFor(ListEvent evt) {
-
 
454
                // On ne teste pas l'existence du fichier génété car les IOs peuvent prendre
-
 
455
                // du temps
-
 
456
                return evt.getSelectedRow() != null && evt.getSelectedRowAccessors().size() == 1;
-
 
457
            }
-
 
458
        });
-
 
459
 
371
        if (this.printIsVisible) {
460
        if (this.printIsVisible) {
372
 
461
 
373
            // Impression rapide : imprime le ou les documents sélectionnés (les génère si besoin)
462
            // Impression rapide : imprime le ou les documents sélectionnés (les génère si besoin)
374
            // en proposant l'interface Java d'impression
463
            // en proposant l'interface Java d'impression
375
            l.add(new RowAction(new PrintDocumentAction(this), false, "document.print") {
464
            l.add(new RowAction(new PrintDocumentAction(this), false, "document.print") {
376
 
465
 
377
                @Override
466
                @Override
378
                public boolean enabledFor(IListeEvent evt) {
467
                public boolean enabledFor(ListEvent evt) {
379
                    return evt.getSelectedRow() != null && evt.getSelectedRows().size() > 0;
468
                    return evt.getSelectedRow() != null && evt.getTotalRowCount() > 0;
380
                }
469
                }
381
            });
470
            });
382
 
471
 
383
        }
472
        }
384
 
473
 
Line 392... Line 481...
392
 
481
 
393
        }
482
        }
394
        if (this.generateIsVisible) {
483
        if (this.generateIsVisible) {
395
            l.add(new RowAction(new AbstractAction() {
484
            l.add(new RowAction(new AbstractAction() {
396
                public void actionPerformed(ActionEvent ev) {
485
                public void actionPerformed(ActionEvent ev) {
-
 
486
 
397
                    List<SQLRowValues> l = IListe.get(ev).getSelectedRows();
487
                    List<SQLRowAccessor> l = IListe.get(ev).getSelectedRowAccessors();
398
 
488
 
399
                    if (l.size() == 1) {
489
                    if (l.size() == 1) {
400
                        createDocument(ev);
490
                        createDocument(ev);
401
                    } else {
491
                    } else {
402
                        createDocuments(l);
492
                        createDocuments(l);
403
                    }
493
                    }
404
                }
494
                }
405
            }, this.generateHeader, "document.create") {
495
            }, this.generateHeader, "document.create") {
406
 
496
 
407
                @Override
497
                @Override
408
                public boolean enabledFor(List<SQLRowValues> selection) {
498
                public boolean enabledFor(ListEvent selection) {
409
                    return selection != null && !selection.isEmpty();
499
                    return selection != null && selection.getTotalRowCount() > 0;
410
                }
500
                }
411
 
501
 
412
            });
502
            });
413
        }
503
        }
414
 
504
 
Line 421... Line 511...
421
                sendMail(ev, false);
511
                sendMail(ev, false);
422
            }
512
            }
423
        }, false, "document.send.email") {
513
        }, false, "document.send.email") {
424
 
514
 
425
            @Override
515
            @Override
426
            public boolean enabledFor(IListeEvent evt) {
516
            public boolean enabledFor(ListEvent evt) {
427
                // On ne teste pas l'existence du fichier génété car les IOs peuvent prendre du
517
                // On ne teste pas l'existence du fichier génété car les IOs peuvent prendre du
428
                // temps
518
                // temps
429
                return evt.getSelectedRow() != null && evt.getTotalRowCount() >= 1;
519
                return evt.getSelectedRow() != null && evt.getTotalRowCount() >= 1;
430
            }
520
            }
431
 
521
 
Line 438... Line 528...
438
                sendMail(ev, true);
528
                sendMail(ev, true);
439
            }
529
            }
440
        }, false, "document.pdf.send.email") {
530
        }, false, "document.pdf.send.email") {
441
 
531
 
442
            @Override
532
            @Override
443
            public boolean enabledFor(IListeEvent evt) {
533
            public boolean enabledFor(ListEvent evt) {
444
                // On ne teste pas l'existence du fichier génété car les IOs peuvent prendre du
534
                // On ne teste pas l'existence du fichier génété car les IOs peuvent prendre du
445
                // temps
535
                // temps
446
                return evt.getSelectedRow() != null && evt.getTotalRowCount() >= 1;
536
                return evt.getSelectedRow() != null && evt.getTotalRowCount() >= 1;
447
            }
537
            }
448
 
538
 
Line 454... Line 544...
454
        int a = JOptionPane.showConfirmDialog(null, "Voulez vous recréer l'ensemble des documents sélectionnés?", "Génération de documents", JOptionPane.YES_NO_OPTION);
544
        int a = JOptionPane.showConfirmDialog(null, "Voulez vous recréer l'ensemble des documents sélectionnés?", "Génération de documents", JOptionPane.YES_NO_OPTION);
455
        if (a == JOptionPane.YES_OPTION) {
545
        if (a == JOptionPane.YES_OPTION) {
456
            for (SQLRowAccessor sqlRowAccessor : selection) {
546
            for (SQLRowAccessor sqlRowAccessor : selection) {
457
                final AbstractSheetXml sheet = createAbstractSheet(sqlRowAccessor.getTable().getRow(sqlRowAccessor.getID()));
547
                final AbstractSheetXml sheet = createAbstractSheet(sqlRowAccessor.getTable().getRow(sqlRowAccessor.getID()));
458
                sheet.createDocumentAsynchronous();
548
                sheet.createDocumentAsynchronous();
459
                sheet.showPrintAndExportAsynchronous(false, false, true);
549
                sheet.showPrintAndExportAsynchronous(false, false, true, Collections.emptyList());
460
            }
550
            }
461
        }
551
        }
462
    }
552
    }
463
 
553
 
464
    private void createDocument(ActionEvent ev) {
554
    private void createDocument(ActionEvent ev) {
465
        final AbstractSheetXml sheet = createAbstractSheet(IListe.get(ev).fetchSelectedRow());
555
        final AbstractSheetXml sheet = createAbstractSheet(IListe.get(ev).fetchSelectedRow());
466
        if (sheet.getGeneratedFile().exists()) {
556
        if (sheet.getGeneratedFile().exists()) {
467
            int a = JOptionPane.showConfirmDialog(null, "Voulez vous remplacer le document existant?", "Génération de documents", JOptionPane.YES_NO_OPTION);
557
            int a = JOptionPane.showConfirmDialog(null, "Voulez vous remplacer le document existant?", "Génération de documents", JOptionPane.YES_NO_OPTION);
468
            if (a == JOptionPane.YES_OPTION) {
558
            if (a == JOptionPane.YES_OPTION) {
469
                sheet.createDocumentAsynchronous();
559
                sheet.createDocumentAsynchronous();
470
                sheet.showPrintAndExportAsynchronous(true, false, true);
560
                sheet.showPrintAndExportAsynchronous(true, false, true, Collections.emptyList());
471
                return;
561
                return;
472
            }
562
            }
473
        }
563
        }
474
 
564
 
475
        try {
565
        try {
476
            sheet.getOrCreateDocumentFile();
566
            sheet.getOrCreateDocumentFile();
477
            sheet.showPrintAndExportAsynchronous(true, false, false);
567
            sheet.showPrintAndExportAsynchronous(true, false, false, Collections.emptyList());
478
        } catch (Exception exn) {
568
        } catch (Exception exn) {
479
            exn.printStackTrace();
569
            exn.printStackTrace();
480
        }
570
        }
481
 
571
 
482
    }
572
    }
Line 490... Line 580...
490
        return new RowAction(new AbstractAction() {
580
        return new RowAction(new AbstractAction() {
491
            public void actionPerformed(ActionEvent ev) {
581
            public void actionPerformed(ActionEvent ev) {
492
                final AbstractSheetXml sheet = createAbstractSheet(IListe.get(ev).fetchSelectedRow().asRow());
582
                final AbstractSheetXml sheet = createAbstractSheet(IListe.get(ev).fetchSelectedRow().asRow());
493
                try {
583
                try {
494
                    sheet.getOrCreateDocumentFile();
584
                    sheet.getOrCreateDocumentFile();
495
                    sheet.showPrintAndExportAsynchronous(true, false, true);
585
                    sheet.showPrintAndExportAsynchronous(true, false, true, Collections.emptyList());
496
                } catch (Exception exn) {
586
                } catch (Exception exn) {
497
                    ExceptionHandler.handle("Une erreur est survenue lors de la création du document.", exn);
587
                    ExceptionHandler.handle("Une erreur est survenue lors de la création du document.", exn);
498
                }
588
                }
499
            }
589
            }
500
        }, false, false, "document.create") {
590
        }, false, false, "document.create") {
501
 
591
 
502
            @Override
592
            @Override
503
            public boolean enabledFor(List<SQLRowValues> selection) {
593
            public boolean enabledFor(ListEvent selection) {
504
                return selection != null && selection.size() == 1;
594
                return selection != null && selection.getTotalRowCount() == 1;
505
            }
595
            }
506
 
596
 
507
            @Override
597
            @Override
508
            public Action getDefaultAction(final IListeEvent evt) {
598
            public javax.swing.Action getDefaultAction(final ListEvent evt) {
509
                return this.getAction();
599
                return this.getAction();
510
            }
600
            }
511
        };
601
        };
512
    }
602
    }
513
 
603
 
514
    private void sendMail(ActionEvent ev, boolean pdf) {
604
    protected void sendMail(ActionEvent ev, boolean pdf) {
515
        final List<SQLRowValues> selectedRows = IListe.get(ev).getSelectedRows();
605
        final List<SQLRowAccessor> selectedRows = IListe.get(ev).getSelectedRowAccessors();
-
 
606
 
516
        final SQLTable table = IListe.get(ev).getSource().getPrimaryTable();
607
        final SQLTable table = IListe.get(ev).getSource().getPrimaryTable();
517
        final List<SQLRow> rows = new ArrayList<>();
608
        final List<SQLRow> rows = new ArrayList<>();
518
        for (SQLRowValues r : selectedRows) {
609
        for (SQLRowAccessor r : selectedRows) {
519
            rows.add(table.getRow(r.getID()));
610
            rows.add(table.getRow(r.getID()));
520
        }
611
        }
521
 
612
 
522
        EmailTemplate.askTemplate(IListe.get(ev), table.getDBRoot(), new ValueListener() {
613
        EmailTemplate.askTemplate(IListe.get(ev), table.getDBRoot(), new ValueListener() {
523
 
614