package org.rr.jeborker.gui.action;
import java.awt.event.ActionEvent;
import java.util.logging.Level;
import javax.swing.AbstractAction;
import javax.swing.Action;
import org.rr.commons.log.LoggerFactory;
import org.rr.commons.mufs.IResourceHandler;
import org.rr.commons.mufs.ResourceHandlerFactory;
import org.rr.jeborker.converter.ConverterFactory;
import org.rr.jeborker.converter.IEBookConverter;
import org.rr.jeborker.db.item.EbookPropertyItem;
import org.rr.jeborker.db.item.EbookPropertyItemUtils;
import org.rr.jeborker.gui.ConverterPreferenceController;
import org.rr.jeborker.gui.MainController;
import org.rr.jeborker.gui.resources.ImageResourceBundle;
class ConvertEbookAction extends AbstractAction implements IFinalizeAction, IDoOnlyOnceAction<ConverterPreferenceController> {
private static final long serialVersionUID = -6464113132395695332L;
private String book;
private IResourceHandler bookResourceHandler;
private EbookPropertyItem newEbookPropertyItem;
private int row = 0;
private ConverterPreferenceController converterPreferenceController;
ConvertEbookAction(String text) {
this.book = text;
this.bookResourceHandler = ResourceHandlerFactory.getResourceHandler(book);
putValue(Action.SMALL_ICON, ImageResourceBundle.getResourceAsImageIcon("convert_16.png"));
putValue(Action.LARGE_ICON_KEY, ImageResourceBundle.getResourceAsImageIcon("convert_16.png"));
}
@Override
public void actionPerformed(ActionEvent e) {
final MainController controller = MainController.getController();
final Class<?> converterClass = (Class<?>) getValue("converterClass");
final IEBookConverter converter = ConverterFactory.getConverterbyClass(converterClass, bookResourceHandler);
final int[] selectedRowsToRefresh = (int[]) getValue(MultiActionWrapper.SELECTED_ROWS_TO_REFRESH_KEY);
try {
if(!this.converterPreferenceController.isConfirmed()) {
return;
}
controller.getProgressMonitor().monitorProgressStart(Bundle.getFormattedString("ConvertEbookAction.message", bookResourceHandler.getName()), false);
converter.setConverterPreferenceController(this.converterPreferenceController);
IResourceHandler targetResourceHandler = converter.convert();
if(targetResourceHandler != null) {
EbookPropertyItem sourceItem = null;
for(int rowIndex : selectedRowsToRefresh) {
EbookPropertyItem ebookPropertyItemAt = controller.getModel().getEbookPropertyItemAt(rowIndex);
if(ebookPropertyItemAt.getResourceHandler().equals(bookResourceHandler)) {
sourceItem = ebookPropertyItemAt;
row = rowIndex;
break;
}
}
if(sourceItem != null) {
IResourceHandler resourceHandler = ResourceHandlerFactory.getResourceHandler(sourceItem.getBasePath());
this.newEbookPropertyItem = EbookPropertyItemUtils.createEbookPropertyItem(targetResourceHandler, resourceHandler);
controller.getMainTreeHandler().refreshFileSystemTreeEntry(resourceHandler.getParentResource());
} else {
LoggerFactory.getLogger(this).log(Level.SEVERE, "Failed to find " + bookResourceHandler + " in table.");
}
} else {
LoggerFactory.getLogger(this).log(Level.INFO, "Converting " + bookResourceHandler + " aborted.");
}
} catch (Exception ex) {
LoggerFactory.logWarning((Object) this, "Converting " + bookResourceHandler + " has failed.", ex);
} finally {
controller.getProgressMonitor().monitorProgressStop();
}
}
@Override
public void finalizeAction(int count) {
if(newEbookPropertyItem != null) {
ActionUtils.addAndStoreEbookPropertyItem(newEbookPropertyItem, row + 1 + count);
}
}
@Override
public ConverterPreferenceController doOnce() {
final Class<?> converterClass = (Class<?>) getValue("converterClass");
final IEBookConverter converter = ConverterFactory.getConverterbyClass(converterClass, bookResourceHandler);
this.converterPreferenceController = converter.createConverterPreferenceController();
if(converterPreferenceController != null && !this.converterPreferenceController.hasShown()) {
this.converterPreferenceController.showPreferenceDialog();
}
return this.converterPreferenceController;
}
@Override
public void setDoOnceResult(ConverterPreferenceController controller) {
this.converterPreferenceController = controller;
}
@Override
public void prepareFor(int index, int size) {
}
}