package org.rr.jeborker.gui.action; import java.awt.event.ActionEvent; import java.io.IOException; import java.util.List; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.JOptionPane; import org.rr.commons.log.LoggerFactory; import org.rr.commons.mufs.IResourceHandler; import org.rr.commons.mufs.ResourceHandlerFactory; import org.rr.commons.swing.SwingUtils; import org.rr.jeborker.app.FileWatchService; import org.rr.jeborker.db.item.EbookPropertyItem; import org.rr.jeborker.gui.MainController; import org.rr.jeborker.gui.resources.ImageResourceBundle; class DeleteFileAction extends AbstractAction implements IDoOnlyOnceAction<Integer>, IFinalizeAction { private static final long serialVersionUID = -6464113132395695332L; private Integer result = null; final IResourceHandler fileToDelete; DeleteFileAction(final String text) { this(ResourceHandlerFactory.getResourceHandler(text)); } public DeleteFileAction(final IResourceHandler resourceLoader) { this.fileToDelete = resourceLoader; String name = Bundle.getString("DeleteFileAction.name"); putValue(Action.NAME, SwingUtils.removeMnemonicMarker(name)); putValue(Action.SMALL_ICON, ImageResourceBundle.getResourceAsImageIcon("delete_16.png")); putValue(Action.LARGE_ICON_KEY, ImageResourceBundle.getResourceAsImageIcon("delete_22.png")); putValue(MNEMONIC_KEY, SwingUtils.getMnemonicKeyCode(name)); } @Override public void actionPerformed(ActionEvent e) { try { if(this.doOnce().intValue() == JOptionPane.YES_OPTION) { if(fileToDelete == null) { //delete selected files if no ones are specified List<EbookPropertyItem> selectedEbookPropertyItems = MainController.getController().getSelectedEbookPropertyItems(); if(!selectedEbookPropertyItems.isEmpty()) { for(EbookPropertyItem item : selectedEbookPropertyItems) { IResourceHandler resourceHandler = item.getResourceHandler(); doDelete(resourceHandler); } } else { List<IResourceHandler> selectedTreeItems = MainController.getController().getMainTreeHandler().getSelectedTreeItems(); for(IResourceHandler resourceHandler : selectedTreeItems) { doDelete(resourceHandler); } } } else { doDelete(fileToDelete); } } } catch (Exception e1) { LoggerFactory.logWarning(this, "could not delete file " + fileToDelete, e1); } } private void doDelete(IResourceHandler fileToDelete) throws IOException { try { if(fileToDelete.isDirectoryResource()) { if(!deleteFolderIfItIsNotEmpty(fileToDelete)) { return; } FileWatchService.removeWatchPath(fileToDelete.toString()); } if(!fileToDelete.moveToTrash()) { fileToDelete.delete(); if(fileToDelete.exists()) { LoggerFactory.logWarning(DeleteFileAction.class, "could not delete file " + fileToDelete); } else { ActionUtils.refreshEntry(fileToDelete); } } else { ActionUtils.refreshEntry(fileToDelete); } } catch(java.io.FileNotFoundException e) { LoggerFactory.logWarning(DeleteFileAction.class, "File is already deleted " + fileToDelete, e); } } /** * Asks the user if he really want to delete the folder if it's not empty. * @param folderToDelete The folder which should be tested if it's empty. * @return <code>true</code> if the folder is empty and <code>false</code> otherwise. */ private boolean deleteFolderIfItIsNotEmpty(IResourceHandler folderToDelete) { if(folderToDelete != null && !folderToDelete.isEmpty()) { String title = Bundle.getString("DeleteFileAction.dirNotEmpty.title"); String message = Bundle.getFormattedString("DeleteFileAction.dirNotEmpty.message", folderToDelete.toString()); int deleteFolder = MainController.getController().showMessageBox(message, title, JOptionPane.YES_NO_OPTION, "DeleteFolderActionKey", JOptionPane.YES_OPTION, true); if(deleteFolder == JOptionPane.YES_OPTION) { return true; } return false; } return true; } @Override public Integer doOnce() { if(this.result == null) { String message = Bundle.getString("DeleteFileAction.delete.message"); String title = Bundle.getString("DeleteFileAction.name"); int value = MainController.getController().showMessageBox(message, title, JOptionPane.YES_NO_OPTION, "DeleteFileActionKey", JOptionPane.YES_OPTION, true); this.result = Integer.valueOf(value); } return result; } @Override public void setDoOnceResult(Integer result) { this.result = result; } @Override public void prepareFor(int index, int size) { //Not needed } @Override public void finalizeAction(int count) { } }