// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.gui.preferences.projection; import java.awt.GridBagLayout; import java.awt.event.ActionListener; import java.util.Collection; import java.util.Collections; import javax.swing.JLabel; import javax.swing.JPanel; import org.openstreetmap.josm.gui.widgets.JosmComboBox; import org.openstreetmap.josm.tools.GBC; import org.openstreetmap.josm.tools.Utils; /** * A projection choice, that offers a list of projections in a combo-box. */ public abstract class ListProjectionChoice extends AbstractProjectionChoice { protected int index; // 0-based index protected int defaultIndex; protected String[] entries; protected String label; /** * Constructs a new {@code ListProjectionChoice}. * * @param name the display name * @param id the unique id for this ProjectionChoice * @param entries the list of display entries for the combo-box * @param label a label shown left to the combo-box * @param defaultIndex the default index for the combo-box */ public ListProjectionChoice(String name, String id, String[] entries, String label, int defaultIndex) { super(name, id); this.entries = Utils.copyArray(entries); this.label = label; this.defaultIndex = defaultIndex; } /** * Constructs a new {@code ListProjectionChoice}. * @param name the display name * @param id the unique id for this ProjectionChoice * @param entries the list of display entries for the combo-box * @param label a label shown left to the combo-box */ public ListProjectionChoice(String name, String id, String[] entries, String label) { this(name, id, entries, label, 0); } /** * Convert 0-based index to preference value. * @param idx 0-based index * @return preference value * @see #zoneToIndex */ protected abstract String indexToZone(int idx); /** * Convert preference value to 0-based index. * @param zone preference value * @return 0-based index * @see #indexToZone */ protected abstract int zoneToIndex(String zone); @Override public void setPreferences(Collection<String> args) { String zone = null; if (args != null && !args.isEmpty()) { zone = args.iterator().next(); } int idx; if (zone == null) { idx = defaultIndex; } else { idx = zoneToIndex(zone); if (idx < 0 || idx >= entries.length) { idx = defaultIndex; } } this.index = idx; } protected static class CBPanel extends JPanel { public JosmComboBox<String> prefcb; public CBPanel(String[] entries, int initialIndex, String label, final ActionListener listener) { prefcb = new JosmComboBox<>(entries); prefcb.setSelectedIndex(initialIndex); this.setLayout(new GridBagLayout()); this.add(new JLabel(label), GBC.std().insets(5, 5, 0, 5)); this.add(GBC.glue(1, 0), GBC.std().fill(GBC.HORIZONTAL)); this.add(prefcb, GBC.eop().fill(GBC.HORIZONTAL)); this.add(GBC.glue(1, 1), GBC.eol().fill(GBC.BOTH)); if (listener != null) { prefcb.addActionListener(listener); } } } @Override public JPanel getPreferencePanel(ActionListener listener) { return new CBPanel(entries, index, label, listener); } @Override public Collection<String> getPreferences(JPanel panel) { if (!(panel instanceof CBPanel)) { throw new IllegalArgumentException("Unsupported panel: "+panel); } CBPanel p = (CBPanel) panel; int idx = p.prefcb.getSelectedIndex(); return Collections.singleton(indexToZone(idx)); } }