package org.rr.jeborker.gui.action; import java.awt.event.ActionEvent; import java.io.FileNotFoundException; import java.util.List; import java.util.logging.Level; import javax.swing.Action; import javax.swing.JFileChooser; import org.rr.commons.log.LoggerFactory; import org.rr.commons.mufs.IResourceHandler; import org.rr.jeborker.db.item.EbookPropertyItem; import org.rr.jeborker.db.item.EbookPropertyItemUtils; import org.rr.jeborker.event.ApplicationEvent; import org.rr.jeborker.event.EventManager; import org.rr.jeborker.event.RefreshAbstractAction; import org.rr.jeborker.gui.MainController; import org.rr.jeborker.gui.model.EbookSheetPropertyModel; import org.rr.jeborker.gui.resources.ImageResourceBundle; import org.rr.jeborker.metadata.IMetadataReader; import org.rr.jeborker.metadata.MetadataProperty; import com.l2fprod.common.propertysheet.Property; abstract class SetCoverFrom<T> extends RefreshAbstractAction implements IDoOnlyOnceAction<T> { private static final long serialVersionUID = 4772310971481868593L; protected final IResourceHandler resourceHandler; private int dialogOption; //JFileChooser.APPROVE private IResourceHandler dialogResult; private int index; private int max; SetCoverFrom(IResourceHandler resourceHandler) { this.resourceHandler = resourceHandler; putValue(Action.NAME, Bundle.getString("SetCoverFromFileAction.name")); putValue(Action.SMALL_ICON, ImageResourceBundle.getResourceAsImageIcon("image_16.png")); putValue(Action.LARGE_ICON_KEY, ImageResourceBundle.getResourceAsImageIcon("image_22.png")); } @Override public void actionPerformed(ActionEvent evt) { final MainController controller = MainController.getController(); try { List<EbookPropertyItem> items = EbookPropertyItemUtils.getEbookPropertyItemByResource(resourceHandler); if(!items.isEmpty()) { final EbookPropertyItem item = items.get(0); this.doOnce(); if (this.dialogOption == JFileChooser.APPROVE_OPTION) { if(dialogResult != null) { controller.getProgressMonitor().monitorProgressStart(Bundle.getFormattedString("SetMetadataCoverAction.message", dialogResult.getName(), item.toString())); controller.getProgressMonitor().setProgress(index, max); byte[] content = dialogResult.getContent(); String imageFileName = dialogResult.getResourceString(); if(content != null) { setupCoverMetadataToModel(content, imageFileName, items); } MainController.getController().setImageViewerResource(dialogResult); } } } else { LoggerFactory.logInfo(this, "No database item found for " + resourceHandler.getName(), null); } } catch (FileNotFoundException e) { LoggerFactory.logWarning(this, "Cover file for " + resourceHandler.getName() + " couldn't be loaded.", e); } catch (Exception e) { LoggerFactory.logWarning(this, "Could not set cover for " + resourceHandler.getName(), e); } finally { controller.getProgressMonitor().monitorProgressStop(null); } } private void setupCoverMetadataToModel(byte[] content, String imageFileName, List<EbookPropertyItem> items) { final MainController controller = MainController.getController(); final EbookSheetPropertyModel model = controller.getPropertySheetHandler().getModel(); final IMetadataReader metadataReader = model.getMetadataReader(); boolean isNewCoverProperty = false; List<MetadataProperty> allMetadata = model.getAllMetadata(); List<MetadataProperty> coverMetadata = metadataReader.getMetadataByType(false, allMetadata, IMetadataReader.COMMON_METADATA_TYPES.COVER); if(coverMetadata.isEmpty()) { coverMetadata = metadataReader.getMetadataByType(true, model.getAllMetadata(), IMetadataReader.COMMON_METADATA_TYPES.COVER); isNewCoverProperty = true; } if(coverMetadata != null && !coverMetadata.isEmpty()) { MetadataProperty coverMetadataProperty = coverMetadata.get(0); if(this instanceof SetCoverFromEbook) { coverMetadataProperty.addHint(MetadataProperty.HINTS.COVER_FROM_EBOOK_FILE_NAME, imageFileName); } coverMetadataProperty.setValue(content, 0); if(isNewCoverProperty) { ActionUtils.addMetadataItem(coverMetadataProperty, items.get(0)); } else { Property coverProperty = model.getCoverProperty(); EventManager.fireEvent(EventManager.EVENT_TYPES.METADATA_SHEET_CONTENT_CHANGE, new ApplicationEvent(controller.getSelectedEbookPropertyItems(), coverProperty, this)); } model.setChanged(true); } else { LoggerFactory.getLogger().log(Level.INFO, "Seems tehere is no cover support for " + resourceHandler); } } @Override public void prepareFor(int index, int max) { this.index = index; this.max = max; } public int getDialogOption() { return dialogOption; } public void setDialogOption(int dialogOption) { this.dialogOption = dialogOption; } public IResourceHandler getDialogResult() { return dialogResult; } public void setDialogResult(IResourceHandler dialogResult) { this.dialogResult = dialogResult; } }