Statistics
| Revision:

gvsig-projects-pool / org.gvsig.topology / trunk / org.gvsig.topology / org.gvsig.topology.swing / org.gvsig.topology.swing.impl / src / main / java / org / gvsig / topology / swing / impl / DefaultJTopologyReport.java @ 1284

History | View | Annotate | Download (26.6 KB)

1
package org.gvsig.topology.swing.impl;
2

    
3
import java.awt.BorderLayout;
4
import java.awt.Dimension;
5
import java.awt.event.ActionEvent;
6
import java.awt.event.ActionListener;
7
import java.awt.event.MouseAdapter;
8
import java.awt.event.MouseEvent;
9
import java.net.URL;
10
import java.util.ArrayList;
11
import java.util.HashSet;
12
import java.util.List;
13
import java.util.Set;
14
import javax.swing.DefaultComboBoxModel;
15
import javax.swing.DefaultListSelectionModel;
16
import javax.swing.ImageIcon;
17
import javax.swing.JComponent;
18
import javax.swing.JMenuItem;
19
import javax.swing.JPopupMenu;
20
import javax.swing.JTable;
21
import javax.swing.ListSelectionModel;
22
import javax.swing.SwingUtilities;
23
import javax.swing.event.ChangeEvent;
24
import javax.swing.event.ChangeListener;
25
import javax.swing.event.ListSelectionEvent;
26
import javax.swing.event.ListSelectionListener;
27
import javax.swing.event.TableModelEvent;
28
import javax.swing.event.TableModelListener;
29
import javax.swing.table.TableModel;
30
import org.apache.commons.io.FilenameUtils;
31
import org.apache.commons.lang3.StringUtils;
32
import org.gvsig.expressionevaluator.ExpressionBuilder;
33
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
34
import org.gvsig.expressionevaluator.GeometryExpressionBuilder;
35
import org.gvsig.expressionevaluator.GeometryExpressionUtils;
36
import org.gvsig.fmap.dal.feature.FeatureSelection;
37
import org.gvsig.fmap.geom.Geometry;
38
import org.gvsig.fmap.geom.primitive.Envelope;
39
import org.gvsig.tools.ToolsLocator;
40
import org.gvsig.tools.dynform.DynFormLocator;
41
import org.gvsig.tools.dynform.JDynForm;
42
import org.gvsig.tools.dynobject.DynObject;
43
import org.gvsig.tools.i18n.I18nManager;
44
import org.gvsig.tools.observer.Observable;
45
import org.gvsig.tools.observer.Observer;
46
import org.gvsig.tools.swing.api.ListElement;
47
import org.gvsig.tools.swing.api.ToolsSwingLocator;
48
import org.gvsig.tools.swing.api.ToolsSwingManager;
49
import org.gvsig.tools.swing.api.task.TaskStatusController;
50
import org.gvsig.tools.swing.icontheme.IconTheme;
51
import org.gvsig.tools.task.TaskStatus;
52
import org.gvsig.topology.lib.api.TopologyLocator;
53
import org.gvsig.topology.lib.api.TopologyPlan;
54
import org.gvsig.topology.lib.api.TopologyReport;
55
import org.gvsig.topology.lib.api.TopologyReportLine;
56
import org.gvsig.topology.lib.api.TopologyReportLineSet;
57
import org.gvsig.topology.lib.api.TopologyRule;
58
import org.gvsig.topology.lib.api.TopologyRuleAction;
59
import org.gvsig.topology.lib.api.TopologyRuleFactory;
60
import org.gvsig.topology.swing.api.JTopologyReport;
61
import org.gvsig.topology.swing.api.TopologySwingLocator;
62
import org.gvsig.topology.swing.api.TopologySwingServices;
63
import org.gvsig.topology.swing.api.TopologySwingServices.WorkingAreaChangedListener;
64
import org.slf4j.Logger;
65
import org.slf4j.LoggerFactory;
66

    
67
/**
68
 *
69
 * @author jjdelcerro
70
 */
71
@SuppressWarnings("UseSpecificCatch")
72
public class DefaultJTopologyReport
73
        extends DefaultJTopologyReportView
74
        implements JTopologyReport {
75

    
76
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultJTopologyReport.class);
77
    private ListSelectionModel selection;
78

    
79
    private class TopologyRuleActionParametersListener implements ActionListener {
80

    
81
        private final TopologyRule rule;
82
        private final List<TopologyReportLine> lines;
83
        private final TopologyRuleAction action;
84
        private final JDynForm form;
85

    
86
        public TopologyRuleActionParametersListener(
87
                TopologyRule rule,
88
                List<TopologyReportLine> lines,
89
                TopologyRuleAction action,
90
                JDynForm form
91
        ) {
92
            this.action = action;
93
            this.lines = lines;
94
            this.rule = rule;
95
            this.form = form;
96
        }
97

    
98
        @Override
99
        public void actionPerformed(ActionEvent e) {
100
            doExecuteRuleAction(rule, lines, action, form);
101
        }
102
    }
103

    
104
    private class TopologyRuleActionListener implements ActionListener {
105

    
106
        private final TopologyRule rule;
107
        private final List<TopologyReportLine> lines;
108
        private final TopologyRuleAction action;
109

    
110
        public TopologyRuleActionListener(
111
                TopologyRule rule,
112
                List<TopologyReportLine> lines,
113
                TopologyRuleAction action
114
        ) {
115
            this.action = action;
116
            this.lines = lines;
117
            this.rule = rule;
118
        }
119

    
120
        @Override
121
        public void actionPerformed(ActionEvent e) {
122
            if (this.action.hasParameters()) {
123
                doShowActionParametersPanel(this.rule, this.lines, this.action);
124
            } else {
125
                doExecuteRuleAction(rule, lines, action, null);
126
            }
127
        }
128
    }
129

    
130
    private ReportTable linesModel;
131
    private final TopologySwingServices services;
132
    private TaskStatusController taskStatusController;
133
    private TopologyPlan plan;
134
    private WorkingAreaChangedListener workingAreaChangedListener;
135

    
136
    public DefaultJTopologyReport(TopologyPlan plan) {
137
        this.services = TopologySwingLocator.getTopologySwingManager().getDefaultServices();
138
        this.initComponents();
139
    }
140

    
141
    private void initComponents() {
142
        I18nManager i18n = ToolsLocator.getI18nManager();
143
        this.selection = this.tblErrors.getSelectionModel();
144
        this.linesModel = new ReportTable();
145

    
146
        this.workingAreaChangedListener = new WorkingAreaChangedListener() {
147
            @Override
148
            public void workingAreaChanged(Envelope workingArea) {
149
                doUpdateFilter();
150
            }
151
        };
152
        this.tblErrors.setModel(this.linesModel);
153
        this.tblErrors.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
154

    
155
        this.btnZoomGeometry.addActionListener(new ActionListener() {
156
            @Override
157
            public void actionPerformed(ActionEvent e) {
158
                doZoomGeometry();
159
            }
160
        });
161
        this.btnZoomError.addActionListener(new ActionListener() {
162
            @Override
163
            public void actionPerformed(ActionEvent e) {
164
                doZoomError();
165
            }
166
        });
167
        this.btnCenterGeometry.addActionListener(new ActionListener() {
168
            @Override
169
            public void actionPerformed(ActionEvent e) {
170
                doCenterGeometry();
171
            }
172
        });
173
        this.btnCenterError.addActionListener(new ActionListener() {
174
            @Override
175
            public void actionPerformed(ActionEvent e) {
176
                doCenterError();
177
            }
178
        });
179
        this.btnRefresh.addActionListener(new ActionListener() {
180
            @Override
181
            public void actionPerformed(ActionEvent e) {
182
                doExecutePlan();
183
            }
184
        });
185
        this.tblErrors.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
186
            @Override
187
            public void valueChanged(ListSelectionEvent e) {
188
                doRowSelected();
189
            }
190
        });
191
        this.tblErrors.addMouseListener(new MouseAdapter() {
192
            @Override
193
            public void mouseClicked(MouseEvent e) {
194
                if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 2) {
195
                    doCenterError();
196
                }
197
            }
198
        });
199

    
200
        this.btnActions.addActionListener(new ActionListener() {
201
            @Override
202
            public void actionPerformed(ActionEvent e) {
203
                doSelectAction();
204
            }
205
        });
206
        this.btnParametersCancel.addActionListener(new ActionListener() {
207
            @Override
208
            public void actionPerformed(ActionEvent e) {
209
                tabData.setEnabledAt(0, true);
210
                tabData.setEnabledAt(1, false);
211
                tabData.setSelectedIndex(0);
212
                pnlParameters.removeAll();
213
            }
214
        });
215
        this.btnShowErrors.addActionListener(new ActionListener() {
216
            @Override
217
            public void actionPerformed(ActionEvent e) {
218
                doUpdateFilter();
219
            }
220
        });
221
        this.btnShowExceptions.addActionListener(new ActionListener() {
222
            @Override
223
            public void actionPerformed(ActionEvent e) {
224
                doUpdateFilter();
225
            }
226
        });
227
        this.btnVisibleExtentOnly.addActionListener(new ActionListener() {
228
            @Override
229
            public void actionPerformed(ActionEvent e) {
230
                doUpdateFilter();
231
            }
232
        });
233
        this.btnShowForm.addActionListener(new ActionListener() {
234
            @Override
235
            public void actionPerformed(ActionEvent e) {
236
                services.setShowFormWhenEdit(btnShowForm.isSelected());
237
            }
238
        });
239
        this.btnEraseErrorMarks.addActionListener(new ActionListener() {
240
            @Override
241
            public void actionPerformed(ActionEvent e) {
242
                services.addError(null);
243
            }
244
        });
245
        DefaultComboBoxModel<ListElement<TopologyRuleFactory>> modelRules = new DefaultComboBoxModel<>();
246
        modelRules.addElement(new ListElement<>(i18n.getTranslation("_Any_rule"), (TopologyRuleFactory) null));
247
        List<TopologyRuleFactory> factories = TopologyLocator.getTopologyManager().getRuleFactories();
248
        for (TopologyRuleFactory factory : factories) {
249
            modelRules.addElement(new ListElement<>(factory.getName(), factory));
250
        }
251
        this.cboRules.setModel(modelRules);
252
        this.cboRules.addActionListener(new ActionListener() {
253
            @Override
254
            public void actionPerformed(ActionEvent e) {
255
                // Llama al invokeLater para poder debugguear
256
                SwingUtilities.invokeLater(new Runnable() {
257
                    @Override
258
                    public void run() {
259
                        doUpdateFilter();
260
                    }
261
                });
262
            }
263
        });
264
        this.taskStatusController = ToolsSwingLocator.getTaskStatusSwingManager().createTaskStatusController(
265
                null,
266
                this.lblTaskStatusTitle,
267
                this.lblTaskStatusMessage,
268
                this.pbTaskStatusProgress,
269
                this.btnTaskStatusCancel,
270
                null
271
        );
272
        this.translate();
273
        this.setPreferredSize(new Dimension(700, 200));
274

    
275
        this.btnShowErrors.setSelected(false);
276
        this.btnShowExceptions.setSelected(false);
277
        this.btnVisibleExtentOnly.setSelected(false);
278

    
279
        this.tabData.setEnabledAt(1, false);
280

    
281
    }
282

    
283
    @Override
284
    public ImageIcon loadImage(String imageName) {
285
        String name = FilenameUtils.getBaseName(imageName);
286
        IconTheme theme = ToolsSwingLocator.getIconThemeManager().getDefault();
287
        if (theme.exists(name)) {
288
            return theme.get(name);
289
        }
290
        URL url = this.getClass().getResource("/" + imageName);
291
        if (url == null) {
292
            return null;
293
        }
294
        return new ImageIcon(url);
295
    }
296

    
297
    private void translate() {
298
        ToolsSwingManager tsm = ToolsSwingLocator.getToolsSwingManager();
299
        tsm.translate(this.btnActions);
300
        tsm.translate(this.btnCenterError);
301
        tsm.translate(this.btnCenterGeometry);
302
        tsm.translate(this.btnRefresh);
303
        tsm.translate(this.btnShowErrors);
304
        tsm.translate(this.btnShowExceptions);
305
        tsm.translate(this.btnZoomError);
306
        tsm.translate(this.btnZoomGeometry);
307
        tsm.translate(this.btnEraseErrorMarks);
308
        tsm.translate(this.btnVisibleExtentOnly);
309
        tsm.translate(this.btnParametersAccept);
310
        tsm.translate(this.btnParametersCancel);
311
        tsm.translate(this.btnShowForm);
312
        tsm.translate(this.lblShow);
313
        tsm.translate(this.tabData);
314
    }
315

    
316
    @Override
317
    public void put(TopologyPlan plan) {
318
        this.plan = plan;
319
        this.taskStatusController.bind(this.plan.getTaskStatus());
320
        this.plan.getTaskStatus().addObserver(new Observer() {
321
            @Override
322
            public void update(Observable o, Object o1) {
323
                doTaskStatusUpdated(o, o1);
324
            }
325
        });
326
        this.linesModel.setReport(plan.getReport());
327
    }
328

    
329
    @Override
330
    public JComponent asJComponent() {
331
        return this;
332
    }
333

    
334
    private void doUpdateFilter() {
335
        this.linesModel.setFilter(this.getFilter());
336
    }
337

    
338
    private String getFilter() {
339
        GeometryExpressionBuilder builder = GeometryExpressionUtils.createExpressionBuilder();
340
        TopologyRuleFactory ruleFactory = (TopologyRuleFactory) ListElement.getSelected(cboRules);
341
        if (ruleFactory != null) {
342
            builder.set(
343
                    builder.eq(
344
                            builder.column(TopologyReport.RULE_ID),
345
                            builder.constant(ruleFactory.getId())
346
                    )
347
            );
348
        }
349
        if (this.btnShowErrors.isSelected()) {
350
            if (btnShowExceptions.isSelected()) {
351
                builder.and(
352
                        builder.or(
353
                                builder.column(TopologyReport.IS_ERROR),
354
                                builder.column(TopologyReport.IS_EXCEPTION)
355
                        )
356
                );
357
            } else {
358
                builder.and(
359
                        builder.column(TopologyReport.IS_ERROR)
360
                );
361
            }
362
        } else if (btnShowExceptions.isSelected()) {
363
            builder.and(
364
                    builder.column(TopologyReport.IS_EXCEPTION)
365
            );
366
        }
367
        if (this.btnVisibleExtentOnly.isSelected()) {
368
            Envelope workingArea = this.services.getWorkingArea();
369
            if (workingArea != null) {
370
                builder.and(
371
                        builder.ST_Intersects(
372
                                builder.column(TopologyReport.GEOMETRY),
373
                                builder.geometry(workingArea.getGeometry())
374
                        )
375
                );
376
            }
377
            this.services.addWorkingAreaChangedListener(this.workingAreaChangedListener);
378
        } else {
379
            this.services.removeWorkingAreaChangedListener(this.workingAreaChangedListener);
380
        }
381
        if (builder.value() == null) {
382
            return null;
383
        }
384
        return builder.toString();
385
    }
386

    
387
    private void doExecutePlan() {
388
        Thread th = new Thread(new Runnable() {
389
            @Override
390
            public void run() {
391
                plan.execute();
392
            }
393
        }, "TopologyPlan-" + plan.getName());
394
        th.start();
395
    }
396

    
397
    private void doTaskStatusUpdated(final Observable observable, final Object notification) {
398
        if (observable != null && !(observable instanceof TaskStatus)) {
399
            return;
400
        }
401
        if (!SwingUtilities.isEventDispatchThread()) {
402
            SwingUtilities.invokeLater(new Runnable() {
403
                public void run() {
404
                    doTaskStatusUpdated(observable, notification);
405
                }
406
            });
407
            return;
408
        }
409
        TaskStatus taskStatus = (TaskStatus) observable;
410
        if (taskStatus == null || !taskStatus.isRunning()) {
411
            this.lblTaskStatusTitle.setVisible(false);
412
            this.lblTaskStatusMessage.setVisible(false);
413
            this.pbTaskStatusProgress.setVisible(false);
414
            this.btnTaskStatusCancel.setVisible(false);
415
            this.btnRefresh.setEnabled(true);
416
            I18nManager i18n = ToolsLocator.getI18nManager();
417
            message(i18n.getTranslation("_Errors") + ": " + this.linesModel.getRowCount());
418
            return;
419
        }
420
        if (!this.pbTaskStatusProgress.isVisible()) {
421
            this.lblTaskStatusTitle.setVisible(true);
422
            this.lblTaskStatusMessage.setVisible(true);
423
            this.pbTaskStatusProgress.setVisible(true);
424
            this.btnTaskStatusCancel.setVisible(true);
425
            this.btnRefresh.setEnabled(false);
426
        }
427
    }
428

    
429
    private void message(String msg) {
430
        this.lblTaskStatusTitle.setText(msg);
431
        this.lblTaskStatusTitle.setVisible(true);
432
    }
433

    
434
    private void doSelectAction() {
435
        int n = this.tblErrors.getSelectedRow();
436
        if (n < 0) {
437
            return;
438
        }
439
        int[] selectedRows = this.tblErrors.getSelectedRows();
440
        TopologyRule rule = this.linesModel.getLine(selectedRows[0]).getRule();
441
        List<TopologyRuleAction> actions = rule.getActions();
442
        if (actions == null || actions.isEmpty()) {
443
            return;
444
        }
445
        List<TopologyReportLine> lines = new ArrayList<>();
446
        for (int selectedRow : selectedRows) {
447
            TopologyReportLine line = this.linesModel.getLine(selectedRow);
448
            if (line.getRule() == rule) {
449
                lines.add(line);
450
            }
451
        }
452
        JPopupMenu menu = new JPopupMenu();
453
        for (TopologyRuleAction action : actions) {
454
            JMenuItem item;
455
            if (action.hasParameters()) {
456
                item = new JMenuItem(action.getName() + "...");
457
            } else {
458
                item = new JMenuItem(action.getName());
459
            }
460
            item.addActionListener(new TopologyRuleActionListener(rule, lines, action));
461
            if (lines.size() > 1 && action.hasParameters()) {
462
                item.setEnabled(false);
463
            }
464
            menu.add(item);
465
        }
466
        menu.show(this.btnActions, 0, this.btnActions.getHeight());
467
    }
468

    
469
    private void doExecuteRuleAction(
470
            TopologyRule rule,
471
            List<TopologyReportLine> lines,
472
            TopologyRuleAction action,
473
            JDynForm form
474
    ) {
475
        DynObject parameters = null;
476
        if (form != null) {
477
            parameters = action.createParameters();
478
            if (parameters != null) {
479
                form.getValues(parameters);
480
            }
481
        }
482
        for (TopologyReportLine line : lines) {
483
            action.execute(rule, line, parameters);
484
        }
485
        this.tabData.setEnabledAt(0, true);
486
        this.tabData.setEnabledAt(1, false);
487
        this.tabData.setSelectedIndex(0);
488
        this.pnlParameters.removeAll();
489
        this.services.addError(null);
490
    }
491

    
492
    private void doShowActionParametersPanel(
493
            TopologyRule rule,
494
            List<TopologyReportLine> lines,
495
            TopologyRuleAction action
496
    ) {
497
        I18nManager i18n = ToolsLocator.getI18nManager();
498
        this.tabData.setEnabledAt(0, false);
499
        this.tabData.setEnabledAt(1, true);
500
        this.tabData.setSelectedIndex(1);
501

    
502
        try {
503
            JDynForm form = null;
504
            this.lblActionTitle.setText(
505
                    "<html>"
506
                    + i18n.getTranslation("_Rule") + ": <b>"
507
                    + rule.getName() + "</b>, "
508
                    + i18n.getTranslation("_Action") + ": <b>"
509
                    + action.getName() + "</b></html>"
510
            );
511
            this.lblActionDescription.setText("<html>" + action.getShortDescription() + "</html>");
512
            DynObject parameters = action.createParameters();
513
            if (parameters != null) {
514
                form = DynFormLocator.getDynFormManager().createJDynForm(parameters);
515
                if (form != null) {
516
                    this.pnlParameters.setLayout(new BorderLayout());
517
                    this.pnlParameters.removeAll();
518
                    this.pnlParameters.add(form.asJComponent(), BorderLayout.CENTER);
519
                    this.pnlParameters.revalidate();
520
                    this.pnlParameters.repaint();
521
                }
522
            }
523
            this.btnParametersAccept.addActionListener(
524
                    new TopologyRuleActionParametersListener(rule, lines, action, form)
525
            );
526
        } catch (Exception ex) {
527
            LOGGER.warn("Can't show action parameters panel.", ex);
528
        }
529
    }
530

    
531
    private void doZoomGeometry() {
532
        int n = this.tblErrors.getSelectedRow();
533
        if (n < 0) {
534
            return;
535
        }
536
        TopologyReportLine line = this.linesModel.getLine(n);
537
        Geometry geom = line.getGeometry();
538
        this.services.zoomTo(geom.getEnvelope());
539
    }
540

    
541
    private void doZoomError() {
542
        int n = this.tblErrors.getSelectedRow();
543
        if (n < 0) {
544
            return;
545
        }
546
        TopologyReportLine line = this.linesModel.getLine(n);
547
        Geometry geom = line.getError();
548
        if (geom == null) {
549
            geom = line.getGeometry();
550
            services.addError(null);
551
        } else {
552
            services.addError(geom);
553
        }
554
        this.services.zoomTo(geom.getEnvelope());
555
    }
556

    
557
    private void doCenterGeometry() {
558
        try {
559
            int n = this.tblErrors.getSelectedRow();
560
            if (n < 0) {
561
                return;
562
            }
563
            TopologyReportLine line = this.linesModel.getLine(n);
564
            Geometry geom = line.getGeometry();
565
            this.services.centerTo(geom.centroid());
566
        } catch (Exception ex) {
567
            LOGGER.warn("Can't center topology error", ex);
568
        }
569
    }
570

    
571
    private void doCenterError() {
572
        try {
573
            int n = this.tblErrors.getSelectedRow();
574
            if (n < 0) {
575
                return;
576
            }
577
            TopologyReportLine line = this.linesModel.getLine(n);
578
            Geometry geom = line.getError();
579
            if (geom == null) {
580
                geom = line.getGeometry();
581
                services.addError(null);
582
            } else {
583
                services.addError(geom);
584
            }
585
            this.services.centerTo(geom.centroid());
586
        } catch (Exception ex) {
587
            LOGGER.warn("Can't center topology error", ex);
588
        }
589
    }
590

    
591
    private void doRowSelected() {
592
        try {
593
            int n = this.tblErrors.getSelectedRow();
594
            if (n < 0) {
595
                return;
596
            }
597
            TopologyReportLine line = this.linesModel.getLine(n);
598
            if (line.getFeature1() == null) {
599
                return;
600
            }
601
            this.services.addError(null);
602
            FeatureSelection selection = line.getDataSet1().getFeatureStore().getFeatureSelection();
603
            selection.deselectAll();
604
            selection.select(line.getFeature1());
605
        } catch (Exception ex) {
606
            LOGGER.warn("Can't select topology error", ex);
607
        }
608
    }
609

    
610
    private class ReportTable implements TableModel {
611

    
612
        private TopologyReport report;
613
        private TopologyReportLineSet lines;
614
        private final String[] columnNames;
615
        private final Class[] columnClasses;
616
        private final Set<TableModelListener> tableListeners;
617
        private final ChangeListener reportListener;
618
        private String lastFilter;
619

    
620
        public ReportTable() {
621
            I18nManager i18n = ToolsLocator.getI18nManager();
622
            this.report = null;
623
            this.lines = null;
624
            this.tableListeners = new HashSet<>();
625
            this.columnNames = new String[]{
626
                i18n.getTranslation("_Rule"),
627
                i18n.getTranslation("_Dataset1"),
628
                i18n.getTranslation("_Dataset2"),
629
                i18n.getTranslation("_Exception"),
630
                i18n.getTranslation("_Description")
631
            };
632
            this.columnClasses = new Class[]{
633
                String.class,
634
                String.class,
635
                String.class,
636
                Boolean.class,
637
                String.class
638
            };
639
            this.reportListener = new ChangeListener() {
640
                @Override
641
                public void stateChanged(final ChangeEvent e) {
642
                    if (!SwingUtilities.isEventDispatchThread()) {
643
                        SwingUtilities.invokeLater(new Runnable() {
644
                            @Override
645
                            public void run() {
646
                                stateChanged(e);
647
                            }
648
                        });
649
                        return;
650
                    }
651
                    fireTableChanged();
652
                }
653
            };
654
        }
655

    
656
        public void setReport(TopologyReport report) {
657
            if (this.report != null) {
658
                this.report.removeChangeListener(this.reportListener);
659
            }
660
            this.report = report;
661
            this.lines = this.report;
662
            this.lines.addChangeListener(this.reportListener);
663
        }
664

    
665
        public void setFilter(String filter) {
666
            if (StringUtils.equals(filter, this.lastFilter)) {
667
                return;
668
            }
669
            this.lines = this.report.getLineSet(filter);
670
            this.lines.addChangeListener(this.reportListener);
671
            this.lastFilter = filter;
672
            this.fireTableChanged();
673
        }
674

    
675
        public TopologyReport getReport() {
676
            return this.report;
677
        }
678

    
679
        @Override
680
        public int getRowCount() {
681
            if (this.lines == null) {
682
                return 0;
683
            }
684
            return this.lines.size();
685
        }
686

    
687
        @Override
688
        public int getColumnCount() {
689
            return 5;
690
        }
691

    
692
        @Override
693
        public String getColumnName(int columnIndex) {
694
            return this.columnNames[columnIndex];
695
        }
696

    
697
        @Override
698
        public Class<?> getColumnClass(int columnIndex) {
699
            return this.columnClasses[columnIndex];
700
        }
701

    
702
        @Override
703
        public boolean isCellEditable(int rowIndex, int columnIndex) {
704
            return false;
705
        }
706

    
707
        @Override
708
        public Object getValueAt(int rowIndex, int columnIndex) {
709
            if (this.lines == null) {
710
                return "";
711
            }
712
            TopologyReportLine line = this.lines.get(rowIndex);
713
            switch (columnIndex) {
714
                case 0:
715
                    return line.getRule().getName();
716
                case 1:
717
                    return line.getDataSet1().getName();
718
                case 2:
719
                    if (line.getDataSet2() == null) {
720
                        return "";
721
                    }
722
                    return line.getDataSet2().getName();
723
                case 3:
724
                    return line.isException();
725
                case 4:
726
                    return line.getDescription();
727
                default:
728
                    return "???";
729
            }
730
        }
731

    
732
        @Override
733
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
734
        }
735

    
736
        @Override
737
        public void addTableModelListener(TableModelListener l) {
738
            this.tableListeners.add(l);
739
        }
740

    
741
        @Override
742
        public void removeTableModelListener(TableModelListener l) {
743
            this.tableListeners.remove(l);
744
        }
745

    
746
        private void fireTableChanged() {
747
            saveCurrentSelection();
748
            for (TableModelListener tableListener : this.tableListeners) {
749
                tableListener.tableChanged(new TableModelEvent(this));
750
            }
751
            restoreCurrentSelection();
752
        }
753

    
754
        public TopologyReportLine getLine(int lineNum) {
755
            return this.lines.get(lineNum);
756
        }
757

    
758
    }
759

    
760
    private void saveCurrentSelection() {
761
        this.tblErrors.setSelectionModel(new DefaultListSelectionModel());
762
    }
763

    
764
    private void restoreCurrentSelection() {
765
        this.tblErrors.setSelectionModel(this.selection);
766
    }
767
}