Ticket #18119: patch_remove_multiple_images.patch

File patch_remove_multiple_images.patch, 9.1 KB (added by francois2, 6 years ago)

Remove multiple images from the GeoImageLayer v2.1

  • src/org/openstreetmap/josm/data/ImageData.java

     
    262262    }
    263263
    264264    /**
     265     * Remove the current selected image from the list
     266     */
     267    public void removeSelectedImages() {
     268        List<ImageEntry> selected = getSelectedImages();
     269        if (selected.isEmpty()) {
     270            return;
     271        }
     272        for (ImageEntry img: getSelectedImages()) {
     273            data.remove(img);
     274        }
     275        setSelectedImageIndex(-1, true);
     276    }
     277
     278    /**
    265279     * Determines if the image is selected
    266280     * @param image the {@link ImageEntry} image
    267281     * @return {@code true} is the image is selected, {@code false} otherwise
  • src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java

     
    22package org.openstreetmap.josm.gui.layer.geoimage;
    33
    44import static org.openstreetmap.josm.tools.I18n.tr;
     5import static org.openstreetmap.josm.tools.I18n.trn;
    56
    67import java.awt.BorderLayout;
    78import java.awt.Component;
     
    288289
    289290    private class ImageRemoveAction extends JosmAction {
    290291        ImageRemoveAction() {
    291             super(null, new ImageProvider("dialogs", "delete"), tr("Remove photo from layer"), Shortcut.registerShortcut(
    292                     "geoimage:deleteimagefromlayer", tr("Geoimage: {0}", tr("Remove photo from layer")), KeyEvent.VK_DELETE, Shortcut.SHIFT),
     292            super(null, new ImageProvider("dialogs", "delete"), tr("Remove photo(s) from layer"), Shortcut.registerShortcut(
     293                    "geoimage:deleteimagefromlayer", tr("Geoimage: {0}", tr("Remove photo(s) from layer")), KeyEvent.VK_DELETE, Shortcut.SHIFT),
    293294                  false, null, false);
    294295        }
    295296
     
    296297        @Override
    297298        public void actionPerformed(ActionEvent e) {
    298299            if (currentData != null) {
    299                 currentData.removeSelectedImage();
     300                currentData.removeSelectedImages();
    300301            }
    301302        }
    302303    }
     
    303304
    304305    private class ImageRemoveFromDiskAction extends JosmAction {
    305306        ImageRemoveFromDiskAction() {
    306             super(null, new ImageProvider("dialogs", "geoimage/deletefromdisk"), tr("Delete image file from disk"),
     307            super(null, new ImageProvider("dialogs", "geoimage/deletefromdisk"), tr("Delete photo file(s) from disk"),
    307308                  Shortcut.registerShortcut(
    308                     "geoimage:deletefilefromdisk", tr("Geoimage: {0}", tr("Delete File from disk")), KeyEvent.VK_DELETE, Shortcut.CTRL_SHIFT),
     309                    "geoimage:deletefilefromdisk", tr("Geoimage: {0}", tr("Delete file(s) from disk")), KeyEvent.VK_DELETE, Shortcut.CTRL_SHIFT),
    309310                  false, null, false);
    310311        }
    311312
     
    312313        @Override
    313314        public void actionPerformed(ActionEvent e) {
    314315            if (currentData != null && currentData.getSelectedImage() != null) {
    315                 ImageEntry toDelete = currentData.getSelectedImage();
     316                List<ImageEntry> toDelete = currentData.getSelectedImages();
    316317
    317318                int result = new ExtendedDialog(
    318319                        MainApplication.getMainFrame(),
     
    319320                        tr("Delete image file from disk"),
    320321                        tr("Cancel"), tr("Delete"))
    321322                        .setButtonIcons("cancel", "dialogs/delete")
    322                         .setContent(new JLabel("<html><h3>" + tr("Delete the file {0} from disk?", toDelete.getFile().getName())
    323                                 + "<p>" + tr("The image file will be permanently lost!") + "</h3></html>",
     323                        .setContent(new JLabel("<html><h3>"
     324                                + trn("Delete the file from disk?",
     325                                      "Delete the {0} files from disk?", toDelete.size(), toDelete.size())
     326                                + "<p>" + trn("The image file will be permanently lost!",
     327                                              "The images files will be permanently lost!", toDelete.size()) + "</h3></html>",
    324328                                ImageProvider.get("dialogs/geoimage/deletefromdisk"), SwingConstants.LEFT))
    325329                        .toggleEnable("geoimage.deleteimagefromdisk")
    326330                        .setCancelButton(1)
     
    329333                        .getValue();
    330334
    331335                if (result == 2) {
    332                     currentData.removeSelectedImage();
    333 
    334                     if (Utils.deleteFile(toDelete.getFile())) {
    335                         Logging.info("File " + toDelete.getFile() + " deleted.");
    336                     } else {
    337                         JOptionPane.showMessageDialog(
    338                                 MainApplication.getMainFrame(),
    339                                 tr("Image file could not be deleted."),
    340                                 tr("Error"),
    341                                 JOptionPane.ERROR_MESSAGE
    342                                 );
     336                    currentData.removeSelectedImages();
     337                    for (ImageEntry delete: toDelete) {
     338                        if (Utils.deleteFile(delete.getFile())) {
     339                            Logging.info("File " + delete.getFile() + " deleted.");
     340                        } else {
     341                            JOptionPane.showMessageDialog(
     342                                    MainApplication.getMainFrame(),
     343                                    tr("Image file could not be deleted."),
     344                                    tr("Error"),
     345                                    JOptionPane.ERROR_MESSAGE
     346                                    );
     347                        }
    343348                    }
    344349                }
    345350            }
     
    496501
    497502            imgDisplay.setOsdText(osd.toString());
    498503        } else {
     504            boolean hasMultipleImages = entries != null && entries.size() > 1;
    499505            // if this method is called to reinitialize dialog content with a blank image,
    500506            // do not actually show the dialog again with a blank image if currently hidden (fix #10672)
    501507            setTitle(tr("Geotagged Images"));
     
    503509            imgDisplay.setOsdText("");
    504510            setNextEnabled(false);
    505511            setPreviousEnabled(false);
    506             btnDelete.setEnabled(false);
    507             btnDeleteFromDisk.setEnabled(false);
     512            btnDelete.setEnabled(hasMultipleImages);
     513            btnDeleteFromDisk.setEnabled(hasMultipleImages);
    508514            btnCopyPath.setEnabled(false);
    509             if (entries != null && entries.size() > 1) {
     515            if (hasMultipleImages) {
    510516                imgDisplay.setEmptyText(tr("Multiple images selected"));
    511517                btnFirst.setEnabled(!isFirstImageSelected(data));
    512518                btnLast.setEnabled(!isLastImageSelected(data));
  • test/unit/org/openstreetmap/josm/data/ImageDataTest.java

     
    182182    }
    183183
    184184    @Test
    185     public void testRemoveSelectedWithImageTriggerListener() {
     185    public void testRemoveSelectedImages() {
    186186        List<ImageEntry> list = getOneImage();
    187187        list.add(new ImageEntry());
     188
    188189        ImageData data = new ImageData(list);
     190        data.selectFirstImage();
     191        data.addImageToSelection(list.get(1));
     192        data.removeSelectedImages();
     193        assertEquals(0, data.getImages().size());
     194        assertEquals(0, data.getSelectedImages().size());
     195    }
     196
     197    @Test
     198    public void testRemoveSelectedImageTriggerListener() {
     199        List<ImageEntry> list = getOneImage();
     200        list.add(new ImageEntry());
     201        ImageData data = new ImageData(list);
    189202        ImageDataUpdateListener listener = new ImageDataUpdateListener() {
    190203            @Override
    191204            public void selectedImageChanged(ImageData data) {}
     
    202215    }
    203216
    204217    @Test
     218    public void testRemoveSelectedImagesTriggerListener() {
     219        List<ImageEntry> list = getOneImage();
     220        list.add(new ImageEntry());
     221        ImageData data = new ImageData(list);
     222        ImageDataUpdateListener listener = new ImageDataUpdateListener() {
     223            @Override
     224            public void selectedImageChanged(ImageData data) {}
     225
     226            @Override
     227            public void imageDataUpdated(ImageData data) {}
     228        };
     229        new Expectations(listener) {{
     230            listener.selectedImageChanged(data); times = 2;
     231        }};
     232        data.addImageDataUpdateListener(listener);
     233        data.selectFirstImage();
     234        data.removeSelectedImages();
     235    }
     236
     237    @Test
    205238    public void testRemoveImageAndTriggerListener() {
    206239        List<ImageEntry> list = getOneImage();
    207240        ImageData data = new ImageData(list);