package org.rr.jeborker.gui.action;
import static org.rr.commons.utils.ListUtils.join;
import java.awt.event.ActionEvent;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import javax.swing.AbstractAction;
import javax.swing.Action;
import org.rr.commons.collection.TransformValueList;
import org.rr.commons.log.LoggerFactory;
import org.rr.commons.mufs.IResourceHandler;
import org.rr.commons.mufs.MimeUtils;
import org.rr.commons.mufs.ResourceHandlerFactory;
import org.rr.commons.swing.SwingUtils;
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.metadata.pdf.PDFUtils;
class MergeDocumentAction extends AbstractAction {
MergeDocumentAction(String text) {
String name = Bundle.getString("MergeDocumentAction.name");
if (text == null) {
putValue(Action.NAME, SwingUtils.removeMnemonicMarker(name));
} else {
putValue(Action.NAME, text);
}
putValue(MNEMONIC_KEY, SwingUtils.getMnemonicKeyCode(name));
}
@Override
public void actionPerformed(ActionEvent e) {
final MainController controller = MainController.getController();
final List<IResourceHandler> selectedEbookResources = new TransformValueList<EbookPropertyItem, IResourceHandler>(
controller.getSelectedEbookPropertyItems()) {
@Override
public IResourceHandler transform(EbookPropertyItem source) {
return source.getResourceHandler();
}
};
MainController.getController().getProgressMonitor().monitorProgressStart("Merging files");
if (!selectedEbookResources.isEmpty()) {
final IResourceHandler uniqueResourceHandler = ResourceHandlerFactory.getUniqueResourceHandler(selectedEbookResources.get(0), "merged", null);
try {
FileRefreshBackground.setDisabled(true);
if(uniqueResourceHandler.getMimeType(false).equals(MimeUtils.MIME_PDF)) {
PDFUtils.merge(selectedEbookResources, uniqueResourceHandler);
} else if(uniqueResourceHandler.getMimeType(false).equals(MimeUtils.MIME_CBZ)) {
PDFUtils.merge(selectedEbookResources, uniqueResourceHandler);
}
ActionUtils.refreshFileSystemResourceParent(uniqueResourceHandler.getParentResource());
String baseFolder = PreferenceStoreFactory.getPreferenceStore(PreferenceStoreFactory.DB_STORE).getBasePathFor(uniqueResourceHandler);
if(StringUtil.isNotEmpty(baseFolder)) {
addToDatabase(uniqueResourceHandler, ResourceHandlerFactory.getResourceHandler(baseFolder));
applyFilter(uniqueResourceHandler);
} else {
controller.changeToFileModel(Collections.singletonList(uniqueResourceHandler));
}
} catch (Exception ex) {
LoggerFactory.log(Level.WARNING, this, String.format("Failed to merge files %s", join(selectedEbookResources, ", ")), ex);
} finally {
MainController.getController().getProgressMonitor().monitorProgressStop("Files merged to " + uniqueResourceHandler);
FileRefreshBackground.setDisabled(false);
}
}
}
private void addToDatabase(IResourceHandler resource, IResourceHandler baseFolder) {
final EbookPropertyItem item = EbookPropertyItemUtils.createEbookPropertyItem(resource, baseFolder);
ActionUtils.addAndStoreEbookPropertyItem(item);
}
private void applyFilter(IResourceHandler uniqueResourceHandler) {
ActionUtils.applyFilter(uniqueResourceHandler.getName());
}
}