source: josm/trunk/src/org/openstreetmap/josm/gui/dialogs/layer/MergeGpxLayerDialog.java@ 16630

Last change on this file since 16630 was 16630, checked in by simon04, 4 years ago

see #19334 - https://errorprone.info/bugpattern/UnnecessaryParentheses

  • Property svn:eol-style set to native
File size: 7.1 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.dialogs.layer;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.Component;
7import java.awt.GridBagLayout;
8import java.awt.event.ActionEvent;
9import java.awt.event.ActionListener;
10import java.util.Collections;
11import java.util.List;
12
13import javax.swing.JButton;
14import javax.swing.JCheckBox;
15import javax.swing.JLabel;
16import javax.swing.JOptionPane;
17import javax.swing.JPanel;
18import javax.swing.JScrollPane;
19import javax.swing.JTable;
20import javax.swing.ListSelectionModel;
21import javax.swing.event.ListSelectionEvent;
22import javax.swing.event.ListSelectionListener;
23import javax.swing.table.AbstractTableModel;
24import javax.swing.table.TableColumnModel;
25
26import org.openstreetmap.josm.data.SystemOfMeasurement;
27import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
28import org.openstreetmap.josm.gui.ExtendedDialog;
29import org.openstreetmap.josm.gui.layer.GpxLayer;
30import org.openstreetmap.josm.spi.preferences.Config;
31import org.openstreetmap.josm.tools.GBC;
32import org.openstreetmap.josm.tools.ImageProvider;
33import org.openstreetmap.josm.tools.ImageProvider.ImageSizes;
34
35/**
36 * The Dialog asking the user to prioritize GPX layers when cutting overlapping tracks.
37 * Shows a checkbox asking whether to combine the tracks on cuts.
38 * @since 14338
39 */
40public class MergeGpxLayerDialog extends ExtendedDialog {
41
42 private final GpxLayersTableModel model;
43 private final JTable t;
44 private final JCheckBox c;
45 private final JButton btnUp;
46 private final JButton btnDown;
47
48 /**
49 * Constructs a new {@code MergeGpxLayerDialog}
50 * @param parent the parent
51 * @param layers the GpxLayers to choose from
52 */
53 public MergeGpxLayerDialog(Component parent, List<GpxLayer> layers) {
54 super(parent, tr("Merge GPX layers"), tr("Merge"), tr("Cancel"));
55 setButtonIcons("dialogs/mergedown", "cancel");
56
57 JPanel p = new JPanel(new GridBagLayout());
58 p.add(new JLabel("<html>" +
59 tr("Please select the order of the selected layers:<br>Tracks will be cut, when timestamps of higher layers are overlapping.") +
60 "</html>"), GBC.std(0, 0).fill(GBC.HORIZONTAL).span(2));
61
62 c = new JCheckBox(tr("Connect overlapping tracks on cuts"));
63 c.setSelected(Config.getPref().getBoolean("mergelayer.gpx.connect", true));
64 p.add(c, GBC.std(0, 1).fill(GBC.HORIZONTAL).span(2));
65
66 model = new GpxLayersTableModel(layers);
67 t = new JTable(model);
68 t.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
69 t.setRowSelectionInterval(0, 0);
70
71 JScrollPane sp = new JScrollPane(t);
72 p.add(sp, GBC.std(0, 2).fill().span(2));
73
74 t.getSelectionModel().addListSelectionListener(new RowSelectionChangedListener());
75 TableColumnModel cmodel = t.getColumnModel();
76 cmodel.getColumn(0).setPreferredWidth((int) (sp.getPreferredSize().getWidth() - 150));
77 cmodel.getColumn(1).setPreferredWidth(75);
78 cmodel.getColumn(2).setPreferredWidth(75);
79
80 btnUp = new JButton(tr("Move layer up"));
81 btnUp.setIcon(ImageProvider.get("dialogs", "up", ImageSizes.SMALLICON));
82 btnUp.setEnabled(false);
83
84 btnDown = new JButton(tr("Move layer down"));
85 btnDown.setIcon(ImageProvider.get("dialogs", "down", ImageSizes.SMALLICON));
86
87 p.add(btnUp, GBC.std(0, 3).fill(GBC.HORIZONTAL));
88 p.add(btnDown, GBC.std(1, 3).fill(GBC.HORIZONTAL));
89
90 btnUp.addActionListener(new MoveLayersActionListener(true));
91 btnDown.addActionListener(new MoveLayersActionListener(false));
92
93 setContent(p);
94 }
95
96 @Override
97 public MergeGpxLayerDialog showDialog() {
98 super.showDialog();
99 if (getValue() == 1) {
100 Config.getPref().putBoolean("mergelayer.gpx.connect", c.isSelected());
101 }
102 return this;
103 }
104
105 /**
106 * Whether the user chose to connect the tracks on cuts
107 * @return the checkbox state
108 */
109 public boolean connectCuts() {
110 return c.isSelected();
111 }
112
113 /**
114 * The {@code List<GpxLayer>} as sorted by the user
115 * @return the list
116 */
117 public List<GpxLayer> getSortedLayers() {
118 return model.getSortedLayers();
119 }
120
121 private class MoveLayersActionListener implements ActionListener {
122
123 private final boolean moveUp;
124
125 MoveLayersActionListener(boolean up) {
126 moveUp = up;
127 }
128
129 @Override
130 public void actionPerformed(ActionEvent e) {
131 int row = t.getSelectedRow();
132 int newRow = row + (moveUp ? -1 : 1);
133
134 if ((row == 0 || newRow == 0)
135 && !ConditionalOptionPaneUtil.showConfirmationDialog(
136 "gpx_target_change",
137 getParent(),
138 new JLabel("<html>" +
139 tr("This will change the target layer to \"{0}\".<br>Would you like to continue?",
140 model.getValueAt(1, 0).toString()) + "</html>"),
141 tr("Information"),
142 JOptionPane.OK_CANCEL_OPTION,
143 JOptionPane.INFORMATION_MESSAGE,
144 JOptionPane.OK_OPTION)) {
145 return;
146 }
147
148 model.moveRow(row, newRow);
149 t.getSelectionModel().setSelectionInterval(newRow, newRow);
150 t.repaint();
151 }
152 }
153
154 private class RowSelectionChangedListener implements ListSelectionListener {
155
156 @Override
157 public void valueChanged(ListSelectionEvent e) {
158 btnUp.setEnabled(t.getSelectedRow() > 0);
159 btnDown.setEnabled(t.getSelectedRow() < model.getRowCount() - 1);
160 }
161 }
162
163 private static class GpxLayersTableModel extends AbstractTableModel {
164
165 private final String[] cols = {tr("GPX layer"), tr("Length"), tr("Segments")};
166 private final List<GpxLayer> layers;
167
168 GpxLayersTableModel(List<GpxLayer> l) {
169 layers = l;
170 }
171
172 @Override
173 public String getColumnName(int column) {
174 return cols[column];
175 }
176
177 @Override
178 public int getColumnCount() {
179 return cols.length;
180 }
181
182 @Override
183 public int getRowCount() {
184 return layers.size();
185 }
186
187 void moveRow(int row, int newRow) {
188 Collections.swap(layers, row, newRow);
189 }
190
191 List<GpxLayer> getSortedLayers() {
192 return layers;
193 }
194
195 @Override
196 public Object getValueAt(int row, int col) {
197 switch (col) {
198 case 0:
199 String n = layers.get(row).getName();
200 if (row == 0) {
201 return tr("{0} (target layer)", n);
202 } else {
203 return n;
204 }
205 case 1:
206 return SystemOfMeasurement.getSystemOfMeasurement().getDistText(layers.get(row).data.length());
207 case 2:
208 return layers.get(row).data.getTrackSegsCount();
209 default:
210 throw new IndexOutOfBoundsException(Integer.toString(col));
211 }
212 }
213 }
214}
Note: See TracBrowser for help on using the repository browser.