001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.plugins.streetside.gui.dialog; 003 004import java.awt.BorderLayout; 005import java.awt.Component; 006import java.awt.Container; 007import java.awt.FlowLayout; 008import java.util.ArrayList; 009import java.util.List; 010 011import javax.swing.AbstractListModel; 012import javax.swing.JButton; 013import javax.swing.JDialog; 014import javax.swing.JLabel; 015import javax.swing.JList; 016import javax.swing.JPanel; 017import javax.swing.ListCellRenderer; 018import javax.swing.ListSelectionModel; 019import javax.swing.SwingConstants; 020import javax.swing.UIManager; 021 022import org.openstreetmap.josm.gui.layer.geoimage.GeoImageLayer; 023import org.openstreetmap.josm.gui.util.GuiHelper; 024import org.openstreetmap.josm.tools.I18n; 025import org.openstreetmap.josm.tools.ImageProvider; 026 027public class ChooseGeoImageLayersDialog extends JDialog { 028 private static final long serialVersionUID = -1793622345412435234L; 029 private static final String QUESTION = I18n.marktr("Which image layers do you want to import into the Streetside layer?"); 030 031 public ChooseGeoImageLayersDialog(final Component parent, final List<GeoImageLayer> layers) { 032 super(GuiHelper.getFrameForComponent(parent), I18n.tr(QUESTION)); 033 final Container c = getContentPane(); 034 c.setLayout(new BorderLayout(10, 10)); 035 036 final JPanel questionPanel = new JPanel(new FlowLayout(FlowLayout.LEADING, 10, 10)); 037 questionPanel.add(new JLabel(I18n.tr(QUESTION))); 038 c.add(questionPanel, BorderLayout.NORTH); 039 040 final JList<GeoImageLayer> list = new JList<>(); 041 list.setModel(new BasicListModel<>(layers)); 042 list.setCellRenderer(new GeoImageLayerListCellRenderer()); 043 list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); 044 c.add(list, BorderLayout.CENTER); 045 046 final JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 10)); 047 final JButton cancelButton = new JButton(I18n.tr("Cancel"), new ImageProvider("cancel").get()); 048 cancelButton.addActionListener(e -> dispose()); 049 cancelButton.requestFocus(); 050 buttonPanel.add(cancelButton); 051 final JButton importButton = new JButton(I18n.tr("Import"), new ImageProvider("copy").get()); 052 053 // Streetside does not support importing images (Mapillary relic) 054 importButton.setEnabled(false); 055 056 buttonPanel.add(importButton); 057 c.add(buttonPanel, BorderLayout.SOUTH); 058 059 setModal(true); 060 pack(); 061 setLocationRelativeTo(parent); 062 } 063 064 protected static class GeoImageLayerListCellRenderer implements ListCellRenderer<GeoImageLayer> { 065 @Override 066 public Component getListCellRendererComponent( 067 JList<? extends GeoImageLayer> list, GeoImageLayer value, int index, boolean isSelected, boolean cellHasFocus 068 ) { 069 final JLabel result = value == null 070 ? null 071 /* i18n: {0} is the layer name, {1} the number of images in it */ 072 : new JLabel(I18n.tr("{0} ({1} images)", value.getName(), value.getImages().size()), value.getIcon(), SwingConstants.LEADING); 073 if (result != null) { 074 result.setOpaque(true); 075 result.setBackground(isSelected ? UIManager.getColor("List.selectionBackground") : UIManager.getColor("List.background")); 076 } 077 return result; 078 } 079 } 080 081 private static class BasicListModel<T> extends AbstractListModel<T> { 082 private static final long serialVersionUID = 3107247955341855290L; 083 private final List<T> list; 084 085 public BasicListModel(List<T> list) { 086 this.list = list == null ? new ArrayList<>() : list; 087 } 088 089 @Override 090 public int getSize() { 091 return list.size(); 092 } 093 094 @Override 095 public T getElementAt(int index) { 096 return list.get(index); 097 } 098 } 099}