// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.turnlanes.gui; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.List; import javax.swing.Action; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.DefaultTableModel; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.actions.JosmAction; import org.openstreetmap.josm.gui.SideButton; import org.openstreetmap.josm.plugins.turnlanes.model.Issue; import org.openstreetmap.josm.plugins.turnlanes.model.Validator; class ValidationPanel extends JPanel { private static final long serialVersionUID = -1585778734201458665L; private static final String[] COLUMN_NAMES = { tr("Description"), tr("Type"), tr("Quick-Fix") }; private final Action refreshAction = new JosmAction(tr("Refresh"), "dialogs/refresh", tr("Revalidate all turnlanes-relations."), null, false) { private static final long serialVersionUID = -8110599654128234810L; @Override public void actionPerformed(ActionEvent e) { setIssues(new Validator().validate(Main.getLayerManager().getEditDataSet())); } }; private final Action fixAction = new JosmAction(tr("Fix"), "dialogs/fix", tr("Automatically fixes the issue."), null, false) { private static final long serialVersionUID = -8110599654128234810L; @Override public void actionPerformed(ActionEvent e) { if (selected.getQuickFix().perform()) { final int i = issues.indexOf(selected); issueModel.removeRow(i); issues.remove(i); } } }; private final Action selectAction = new JosmAction(tr("Select"), "dialogs/select", tr("Selects the offending relation."), null, false) { private static final long serialVersionUID = -8110599654128234810L; @Override public void actionPerformed(ActionEvent e) { if (selected.getRelation() == null) { Main.getLayerManager().getEditDataSet().setSelected(selected.getPrimitives()); } else { Main.getLayerManager().getEditDataSet().setSelected(selected.getRelation()); } } }; private final SideButton refreshButton = new SideButton(refreshAction); private final SideButton fixButton = new SideButton(fixAction); private final SideButton selectButton = new SideButton(selectAction); private final DefaultTableModel issueModel = new DefaultTableModel(COLUMN_NAMES, 0); private final List<Issue> issues = new ArrayList<>(); private final JTable issueTable = new JTable(issueModel) { private static final long serialVersionUID = 6323348290180585298L; @Override public boolean isCellEditable(int row, int column) { return false; } }; private Issue selected; ValidationPanel() { super(new BorderLayout(4, 4)); final JPanel buttonPanel = new JPanel(new GridLayout(1, 3, 4, 4)); buttonPanel.add(refreshButton); buttonPanel.add(fixButton); buttonPanel.add(selectButton); add(buttonPanel, BorderLayout.NORTH); add(new JScrollPane(issueTable), BorderLayout.CENTER); issueTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); issueTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { final int i = issueTable.getSelectedRow(); final Issue issue = i >= 0 ? issues.get(i) : null; setSelected(issue); } }); setSelected(null); } private void setIssues(List<Issue> issues) { issueModel.setRowCount(0); this.issues.clear(); for (Issue i : issues) { final String[] row = { i.getDescription(), // i.getRelation() == null ? tr("(none)") : i.getRelation().get("type"), // i.getQuickFix().getDescription() }; issueModel.addRow(row); this.issues.add(i); } } private void setSelected(Issue selected) { this.selected = selected; if (selected == null) { fixButton.setEnabled(false); selectButton.setEnabled(false); } else { fixButton.setEnabled(selected.getQuickFix() != Issue.QuickFix.NONE); selectButton.setEnabled(true); } } }