Ticket #18119: patch_remove_multiple_images.patch
File patch_remove_multiple_images.patch, 9.1 KB (added by , 6 years ago) |
---|
-
src/org/openstreetmap/josm/data/ImageData.java
262 262 } 263 263 264 264 /** 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 /** 265 279 * Determines if the image is selected 266 280 * @param image the {@link ImageEntry} image 267 281 * @return {@code true} is the image is selected, {@code false} otherwise -
src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
2 2 package org.openstreetmap.josm.gui.layer.geoimage; 3 3 4 4 import static org.openstreetmap.josm.tools.I18n.tr; 5 import static org.openstreetmap.josm.tools.I18n.trn; 5 6 6 7 import java.awt.BorderLayout; 7 8 import java.awt.Component; … … 288 289 289 290 private class ImageRemoveAction extends JosmAction { 290 291 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), 293 294 false, null, false); 294 295 } 295 296 … … 296 297 @Override 297 298 public void actionPerformed(ActionEvent e) { 298 299 if (currentData != null) { 299 currentData.removeSelectedImage ();300 currentData.removeSelectedImages(); 300 301 } 301 302 } 302 303 } … … 303 304 304 305 private class ImageRemoveFromDiskAction extends JosmAction { 305 306 ImageRemoveFromDiskAction() { 306 super(null, new ImageProvider("dialogs", "geoimage/deletefromdisk"), tr("Delete image filefrom disk"),307 super(null, new ImageProvider("dialogs", "geoimage/deletefromdisk"), tr("Delete photo file(s) from disk"), 307 308 Shortcut.registerShortcut( 308 "geoimage:deletefilefromdisk", tr("Geoimage: {0}", tr("Delete Filefrom 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), 309 310 false, null, false); 310 311 } 311 312 … … 312 313 @Override 313 314 public void actionPerformed(ActionEvent e) { 314 315 if (currentData != null && currentData.getSelectedImage() != null) { 315 ImageEntry toDelete = currentData.getSelectedImage();316 List<ImageEntry> toDelete = currentData.getSelectedImages(); 316 317 317 318 int result = new ExtendedDialog( 318 319 MainApplication.getMainFrame(), … … 319 320 tr("Delete image file from disk"), 320 321 tr("Cancel"), tr("Delete")) 321 322 .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>", 324 328 ImageProvider.get("dialogs/geoimage/deletefromdisk"), SwingConstants.LEFT)) 325 329 .toggleEnable("geoimage.deleteimagefromdisk") 326 330 .setCancelButton(1) … … 329 333 .getValue(); 330 334 331 335 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 } 343 348 } 344 349 } 345 350 } … … 496 501 497 502 imgDisplay.setOsdText(osd.toString()); 498 503 } else { 504 boolean hasMultipleImages = entries != null && entries.size() > 1; 499 505 // if this method is called to reinitialize dialog content with a blank image, 500 506 // do not actually show the dialog again with a blank image if currently hidden (fix #10672) 501 507 setTitle(tr("Geotagged Images")); … … 503 509 imgDisplay.setOsdText(""); 504 510 setNextEnabled(false); 505 511 setPreviousEnabled(false); 506 btnDelete.setEnabled( false);507 btnDeleteFromDisk.setEnabled( false);512 btnDelete.setEnabled(hasMultipleImages); 513 btnDeleteFromDisk.setEnabled(hasMultipleImages); 508 514 btnCopyPath.setEnabled(false); 509 if ( entries != null && entries.size() > 1) {515 if (hasMultipleImages) { 510 516 imgDisplay.setEmptyText(tr("Multiple images selected")); 511 517 btnFirst.setEnabled(!isFirstImageSelected(data)); 512 518 btnLast.setEnabled(!isLastImageSelected(data)); -
test/unit/org/openstreetmap/josm/data/ImageDataTest.java
182 182 } 183 183 184 184 @Test 185 public void testRemoveSelected WithImageTriggerListener() {185 public void testRemoveSelectedImages() { 186 186 List<ImageEntry> list = getOneImage(); 187 187 list.add(new ImageEntry()); 188 188 189 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); 189 202 ImageDataUpdateListener listener = new ImageDataUpdateListener() { 190 203 @Override 191 204 public void selectedImageChanged(ImageData data) {} … … 202 215 } 203 216 204 217 @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 205 238 public void testRemoveImageAndTriggerListener() { 206 239 List<ImageEntry> list = getOneImage(); 207 240 ImageData data = new ImageData(list);