package bd.amazed.docscissors.model; import java.awt.Component; import java.io.File; import java.util.Collections; import java.util.concurrent.ExecutionException; import java.util.logging.Level; import javax.swing.JOptionPane; import javax.swing.ProgressMonitor; import javax.swing.SwingWorker; import org.rr.commons.log.LoggerFactory; import org.rr.commons.mufs.IResourceHandler; import org.rr.commons.mufs.ResourceHandlerFactory; import org.rr.commons.utils.StringUtil; import org.rr.jeborker.app.FileRefreshBackground; import org.rr.jeborker.app.preferences.PreferenceStoreFactory; import org.rr.jeborker.db.item.EbookPropertyItem; import org.rr.jeborker.db.item.EbookPropertyItemUtils; import org.rr.jeborker.gui.MainController; import org.rr.jeborker.gui.MainMonitor; import org.rr.jeborker.gui.action.ActionUtils; import bd.amazed.docscissors.doc.DocumentCropper; import bd.amazed.docscissors.doc.DocumentInfo; public class TaskDocSave extends SwingWorker<Boolean, Void> { private DocumentInfo docFile; private File targetFile; PageRectsMap pageRectsMap; private int viewWidth; private int viewHeight; private Component owner; private boolean targetFileExists; ProgressMonitor progressMonitor; public TaskDocSave(DocumentInfo docFile, File targetFile, PageRectsMap pageRectsMap, int viewWidth, int viewHeight, Component owner) { this.docFile = docFile; this.targetFile = targetFile; this.pageRectsMap = pageRectsMap; this.owner = owner; this.viewWidth = viewWidth; this.viewHeight = viewHeight; this.targetFileExists = targetFile.exists(); progressMonitor = new ProgressMonitor(owner, "Saving " + targetFile.getName() + "...", "", 0, 100); } @Override protected Boolean doInBackground() throws Exception { debug("Cropping to " + targetFile + "..."); try { FileRefreshBackground.setDisabled(true); DocumentCropper.getCropper(docFile.getOriginalFile()).crop(docFile, targetFile, pageRectsMap, viewWidth, viewHeight, progressMonitor); } finally { FileRefreshBackground.setDisabled(false); } debug("Cropping success : " + targetFile); return true; } @Override protected void done() { super.done(); progressMonitor.close(); if (!progressMonitor.isCanceled()) { try { if (this.get()) { MainMonitor progressMonitor = MainController.getController().getProgressMonitor(); try { progressMonitor.blockMainFrame(true).setMessage("Saving file " + targetFile.getName()); IResourceHandler resourceHandler = ResourceHandlerFactory.getResourceHandler(targetFile); String baseFolder = PreferenceStoreFactory.getPreferenceStore(PreferenceStoreFactory.DB_STORE).getBasePathFor(resourceHandler); if (StringUtil.isNotEmpty(baseFolder)) { if (!this.targetFileExists) { // Do not add again addToDatabase(resourceHandler, ResourceHandlerFactory.getResourceHandler(baseFolder)); } applyFilter(resourceHandler); } else { MainController.getController().changeToFileModel(Collections.singletonList(resourceHandler)); } ActionUtils.refreshFileSystemResourceParent(resourceHandler.getParentResource()); } finally { progressMonitor.blockMainFrame(false); } } } catch (InterruptedException e) { LoggerFactory.getLogger().log(Level.WARNING, "", e); } catch (ExecutionException e) { JOptionPane.showMessageDialog(owner, "Failed to save image ...\nDetails:" + e.getCause()); LoggerFactory.getLogger().log(Level.WARNING, "Failed to save image ...\nDetails:" + e.getCause(), e); } } } private void applyFilter(IResourceHandler targetResourceHandler) { ActionUtils.applyFilter(docFile.getOriginalFile().getName()); } private void addToDatabase(IResourceHandler resource, IResourceHandler baseFolder) { EbookPropertyItem item = EbookPropertyItemUtils.createEbookPropertyItem(resource, baseFolder); ActionUtils.addAndStoreEbookPropertyItem(item); } private void debug(String string) { LoggerFactory.getLogger(TaskDocSave.class).log(Level.INFO, string); } }