X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Freader%2FLocalReaderBook.java;h=0145559cd04d15ed189548cb6ef909e712e25a81;hb=68e2c6d20049d713de1bd31b749450b2f60d8340;hp=9a4290de201912ca0e12f6b0357e1ced2cbc1176;hpb=2284842831ea46e89b97dd22b6e294caad361f30;p=nikiroo-utils.git diff --git a/src/be/nikiroo/fanfix/reader/LocalReaderBook.java b/src/be/nikiroo/fanfix/reader/LocalReaderBook.java index 9a4290d..0145559 100644 --- a/src/be/nikiroo/fanfix/reader/LocalReaderBook.java +++ b/src/be/nikiroo/fanfix/reader/LocalReaderBook.java @@ -9,17 +9,25 @@ import java.awt.Rectangle; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; import java.util.ArrayList; import java.util.Date; import java.util.EventListener; import java.util.List; +import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JPanel; +import be.nikiroo.fanfix.Instance; import be.nikiroo.fanfix.data.MetaData; import be.nikiroo.fanfix.data.Story; +import be.nikiroo.utils.IOUtils; import be.nikiroo.utils.ui.UIUtils; /** @@ -95,18 +103,29 @@ class LocalReaderBook extends JPanel { * the story {@code}link MetaData} * @param cached * TRUE if it is locally cached + * @param seeWordcount + * TRUE to see word counts, FALSE to see authors */ - public LocalReaderBook(MetaData meta, boolean cached) { + public LocalReaderBook(MetaData meta, boolean cached, boolean seeWordCount) { this.cached = cached; this.meta = meta; - String optAuthor = meta.getAuthor(); - if (optAuthor != null && !optAuthor.isEmpty()) { - optAuthor = "(" + optAuthor + ")"; + String optSecondary = meta.getAuthor(); + if (seeWordCount) { + if (meta.getWords() >= 4000) { + optSecondary = (meta.getWords() / 1000) + "k words"; + } else if (meta.getWords() > 0) { + optSecondary = meta.getWords() + " words"; + } else { + optSecondary = ""; + } } - icon = new JLabel(generateCoverIcon(meta.getCover())); + if (optSecondary != null && !optSecondary.isEmpty()) { + optSecondary = "(" + optSecondary + ")"; + } + icon = new JLabel(generateCoverIcon(meta)); title = new JLabel( String.format( "" @@ -114,7 +133,7 @@ class LocalReaderBook extends JPanel { + "%s" + "
" + "" + "%s" + "" + "" + "", TEXT_WIDTH, TEXT_HEIGHT, meta.getTitle(), AUTHOR_COLOR, - optAuthor)); + optSecondary)); setLayout(new BorderLayout(10, 10)); add(icon, BorderLayout.CENTER); @@ -327,29 +346,64 @@ class LocalReaderBook extends JPanel { } /** - * Generate a cover icon based upon the given cover image (which may be - * NULL). + * Generate a cover icon based upon the given {@link MetaData}. * - * @param image - * the cover image, or NULL for none + * @param meta + * the {@link MetaData} about the target {@link Story} * * @return the icon */ - private ImageIcon generateCoverIcon(BufferedImage image) { - BufferedImage resizedImage = new BufferedImage(SPINE_WIDTH - + COVER_WIDTH, SPINE_HEIGHT + COVER_HEIGHT + HOFFSET, - BufferedImage.TYPE_4BYTE_ABGR); - Graphics2D g = resizedImage.createGraphics(); - g.setColor(Color.white); - g.fillRect(0, HOFFSET, COVER_WIDTH, COVER_HEIGHT); - if (image != null) { - g.drawImage(image, 0, HOFFSET, COVER_WIDTH, COVER_HEIGHT, null); - } else { - g.setColor(Color.black); - g.drawLine(0, HOFFSET, COVER_WIDTH, HOFFSET + COVER_HEIGHT); - g.drawLine(COVER_WIDTH, HOFFSET, 0, HOFFSET + COVER_HEIGHT); + private ImageIcon generateCoverIcon(MetaData meta) { + String id = meta.getUuid() + ".thumb_" + SPINE_WIDTH + "x" + + COVER_WIDTH + "+" + SPINE_HEIGHT + "+" + COVER_HEIGHT + "@" + + HOFFSET; + BufferedImage resizedImage = null; + + InputStream in = Instance.getCache().getFromCache(id); + if (in != null) { + try { + resizedImage = IOUtils.toImage(in); + in.close(); + in = null; + } catch (IOException e) { + Instance.syserr(e); + } + } + + if (resizedImage == null) { + try { + BufferedImage cover = Instance.getLibrary().getCover( + meta.getLuid()); + + resizedImage = new BufferedImage(SPINE_WIDTH + COVER_WIDTH, + SPINE_HEIGHT + COVER_HEIGHT + HOFFSET, + BufferedImage.TYPE_4BYTE_ABGR); + Graphics2D g = resizedImage.createGraphics(); + g.setColor(Color.white); + g.fillRect(0, HOFFSET, COVER_WIDTH, COVER_HEIGHT); + if (cover != null) { + g.drawImage(cover, 0, HOFFSET, COVER_WIDTH, COVER_HEIGHT, + null); + } else { + g.setColor(Color.black); + g.drawLine(0, HOFFSET, COVER_WIDTH, HOFFSET + COVER_HEIGHT); + g.drawLine(COVER_WIDTH, HOFFSET, 0, HOFFSET + COVER_HEIGHT); + } + g.dispose(); + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ImageIO.write(resizedImage, "png", out); + byte[] imageBytes = out.toByteArray(); + in = new ByteArrayInputStream(imageBytes); + Instance.getCache().addToCache(in, id); + in.close(); + in = null; + } catch (MalformedURLException e) { + Instance.syserr(e); + } catch (IOException e) { + Instance.syserr(e); + } } - g.dispose(); return new ImageIcon(resizedImage); }