package bd.amazed.docscissors.model;
import java.awt.image.BufferedImage;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
import javax.swing.SwingWorker;
import org.rr.commons.log.LoggerFactory;
import org.rr.commons.mufs.IResourceHandler;
import bd.amazed.docscissors.doc.DocumentCropper;
import bd.amazed.docscissors.doc.DocumentInfo;
public class TaskDocOpen extends SwingWorker<List<PageGroup>, Void> {
private DocumentInfo docFile;
private IResourceHandler originalFile;
private int groupType;
private boolean isCancelled;
private DocumentCropper cropper = null;
private boolean shouldCreateStackView;
public TaskDocOpen(IResourceHandler file, int groupType, boolean shouldCreateStackView) {
this.originalFile = file;
isCancelled = false;
this.groupType = groupType;
this.shouldCreateStackView = shouldCreateStackView;
}
@Override
protected List<PageGroup> doInBackground() throws Exception {
cropper = DocumentCropper.getCropper(originalFile);
docFile = cropper.getDocumentInfo();
List<PageGroup> pageGroups = PageGroup.createGroup(groupType, docFile.getPageCount());
if (shouldCreateStackView && groupType != PageGroup.GROUP_TYPE_INDIVIDUAL) {
setProgress(0);
PropertyChangeListener propertyChangeListener = new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
firePropertyChange(evt.getPropertyName(), evt.getOldValue(), evt.getNewValue());
}
};
for (int i = 0; i < pageGroups.size(); i++) {
PageGroup pageGroup = pageGroups.get(i);
BufferedImage image = cropper.getNormalizedImage(docFile, propertyChangeListener, pageGroup);
if (image == null) {
debug("Ups.. null image for " + docFile.getOriginalFile());
} else {
debug("Document loaded " + pageGroup + " from " + docFile.getOriginalFile());
}
pageGroup.setStackImage(image);
}
setProgress(100);
}
return pageGroups;
}
public void cancel() {
isCancelled = true;
if (this.cropper != null) {
cropper.cancel();
}
}
@Override
protected void done() {
super.done();
setProgress(100);
firePropertyChange("done", false, true);
if (!isCancelled) {
List<PageGroup> pageGroups = null;
try {
pageGroups = this.get();
if (pageGroups != null && !isCancelled) {
Model.getInstance().setDoc(docFile, pageGroups);
} else {
Model.getInstance().setDocLoadFailed(originalFile, new bd.amazed.docscissors.doc.ScissorsDocumentException("Failed to extract image. Check if PDF is password protected or corrupted."));
}
} catch (InterruptedException e) {
e.printStackTrace(); // ignore
} catch (ExecutionException e) {
Model.getInstance().setDocLoadFailed(originalFile, e.getCause());
}
}
}
private void debug(String string) {
LoggerFactory.getLogger(TaskDocOpen.class).log(Level.INFO, string);
}
}