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.awt.GraphicsEnvironment;
009import java.util.ArrayList;
010import java.util.List;
011import java.util.Objects;
012import java.util.stream.Collectors;
013
014import javax.swing.AbstractListModel;
015import javax.swing.JButton;
016import javax.swing.JDialog;
017import javax.swing.JLabel;
018import javax.swing.JList;
019import javax.swing.JPanel;
020import javax.swing.ListCellRenderer;
021import javax.swing.ListSelectionModel;
022import javax.swing.SwingConstants;
023import javax.swing.UIManager;
024
025import org.openstreetmap.josm.gui.Notification;
026import org.openstreetmap.josm.gui.layer.geoimage.GeoImageLayer;
027import org.openstreetmap.josm.gui.util.GuiHelper;
028import org.openstreetmap.josm.plugins.streetside.StreetsideImportedImage;
029import org.openstreetmap.josm.plugins.streetside.StreetsideLayer;
030import org.openstreetmap.josm.plugins.streetside.StreetsidePlugin;
031import org.openstreetmap.josm.plugins.streetside.StreetsideSequence;
032import org.openstreetmap.josm.tools.I18n;
033import org.openstreetmap.josm.tools.ImageProvider;
034import org.openstreetmap.josm.tools.Logging;
035
036public class ChooseGeoImageLayersDialog extends JDialog {
037  private static final long serialVersionUID = -1793622345412435234L;
038  private static final String QUESTION = I18n.marktr("Which image layers do you want to import into the Streetside layer?");
039
040  public ChooseGeoImageLayersDialog(final Component parent, final List<GeoImageLayer> layers) {
041      super(GuiHelper.getFrameForComponent(parent), I18n.tr(QUESTION));
042    final Container c = getContentPane();
043    c.setLayout(new BorderLayout(10, 10));
044
045    final JPanel questionPanel = new JPanel(new FlowLayout(FlowLayout.LEADING, 10, 10));
046    questionPanel.add(new JLabel(I18n.tr(QUESTION)));
047    c.add(questionPanel, BorderLayout.NORTH);
048
049    final JList<GeoImageLayer> list = new JList<>();
050    list.setModel(new BasicListModel<>(layers));
051    list.setCellRenderer(new GeoImageLayerListCellRenderer());
052    list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
053    c.add(list, BorderLayout.CENTER);
054
055    final JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 10));
056    final JButton cancelButton = new JButton(I18n.tr("Cancel"), new ImageProvider("cancel").get());
057    cancelButton.addActionListener(e -> dispose());
058    cancelButton.requestFocus();
059    buttonPanel.add(cancelButton);
060    final JButton importButton = new JButton(I18n.tr("Import"), new ImageProvider("copy").get());
061    /*importButton.addActionListener(e -> {
062      list.getSelectedValuesList().parallelStream().map(gil -> {
063        StreetsideSequence seq = new StreetsideSequence();
064        seq.add(
065          gil.getImages().parallelStream()
066            .map(img -> {
067              try {
068                return StreetsideImportedImage.createInstance(img);
069              } catch (IllegalArgumentException iae) {
070                final String message = I18n.tr("Could not import a geotagged image to the Streetside layer!");
071                Logging.log(Logging.LEVEL_WARN, message, iae);
072                if (!GraphicsEnvironment.isHeadless()) {
073                  new Notification(message).setIcon(StreetsidePlugin.LOGO.get()).show();
074                }
075                return null;
076              }
077            })
078            .filter(Objects::nonNull)
079            .sorted((o1, o2) -> (int) Math.signum(o1.getCd() - o2.getCd())) // order by capture date timestamp (ascending)
080            .collect(Collectors.toList())
081        );
082        return seq;
083      }).forEach(seq -> {
084        StreetsideLayer.getInstance().getData().addAll(seq.getImages(), false);
085        // TODO: @rrh
086        //StreetsideImportAction.recordChanges(seq.getImages());
087      });
088      StreetsideLayer.invalidateInstance();
089      dispose();
090    });*/
091    buttonPanel.add(importButton);
092    c.add(buttonPanel, BorderLayout.SOUTH);
093
094    setModal(true);
095    pack();
096    setLocationRelativeTo(parent);
097  }
098
099  protected static class GeoImageLayerListCellRenderer implements ListCellRenderer<GeoImageLayer> {
100    @Override
101    public Component getListCellRendererComponent(
102      JList<? extends GeoImageLayer> list, GeoImageLayer value, int index, boolean isSelected, boolean cellHasFocus
103    ) {
104      final JLabel result = value == null
105          ? null
106          /* i18n: {0} is the layer name, {1} the number of images in it */
107          : new JLabel(I18n.tr("{0} ({1} images)", value.getName(), value.getImages().size()), value.getIcon(), SwingConstants.LEADING);
108      if (result != null) {
109        result.setOpaque(true);
110        result.setBackground(isSelected ? UIManager.getColor("List.selectionBackground") : UIManager.getColor("List.background"));
111      }
112      return result;
113    }
114  }
115
116  private static class BasicListModel<T> extends AbstractListModel<T> {
117    private static final long serialVersionUID = 3107247955341855290L;
118    private final List<T> list;
119
120    public BasicListModel(List<T> list) {
121      this.list = list == null ? new ArrayList<>() : list;
122    }
123
124    @Override
125    public int getSize() {
126      return list.size();
127    }
128
129    @Override
130    public T getElementAt(int index) {
131      return list.get(index);
132    }
133  }
134}