package org.openstreetmap.josm.plugins.photoadjust; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.Component; import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.List; import javax.swing.AbstractAction; import javax.swing.JMenuItem; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.gui.dialogs.LayerListDialog; import org.openstreetmap.josm.gui.layer.Layer; import org.openstreetmap.josm.gui.layer.Layer.LayerAction; import org.openstreetmap.josm.gui.layer.geoimage.GeoImageLayer; import org.openstreetmap.josm.gui.layer.geoimage.ImageEntry; import org.openstreetmap.josm.tools.ImageProvider; /** * Create a new GeoImage layer and move the untagged photos to it. */ public class UntaggedGeoImageLayerAction extends AbstractAction implements LayerAction { /** Define menu entry (text and image). */ public UntaggedGeoImageLayerAction() { super(tr("New layer for untagged images"), ImageProvider.get("untaglayer")); } /** Get the layer this menu entry belongs to. */ private GeoImageLayer getSelectedLayer() { return (GeoImageLayer)LayerListDialog.getInstance().getModel() .getSelectedLayers().get(0); } /** This is called after the menu entry was selected. */ @Override public void actionPerformed(ActionEvent arg0) { GeoImageLayer layer = getSelectedLayer(); if (layer != null) { List<ImageEntry> untagged = new ArrayList<>(); List<ImageEntry> images = layer.getImages(); ImageEntry img; for (int idx = images.size() - 1; idx >= 0; idx--) { img = images.get(idx); if (img.getPos() == null) { // Move this image to the new layer and delete it // from the original layer. untagged.add(img); layer.removePhotoByIdx(idx); } } Main.getLayerManager().addLayer(new GeoImageLayer(untagged, layer.getGpxLayer(), tr("Untagged Images"), layer.isUseThumbs())); } } /** Check if there is any image without coordinates. */ private boolean enabled(GeoImageLayer layer) { if (layer != null) { for (ImageEntry img: layer.getImages()) { if (img.getPos() == null) { return true; } } } return false; } /** Create actual menu entry and define if it is enabled or not. */ @Override public Component createMenuComponent() { JMenuItem toggleItem = new JMenuItem(this); toggleItem.setEnabled(enabled(getSelectedLayer())); return toggleItem; } /** Check if the current layer is supported. */ @Override public boolean supportLayers(List<Layer> layers) { return layers.size() == 1 && layers.get(0) instanceof GeoImageLayer; } }