X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Freader%2Fui%2FGuiReaderMainPanel.java;h=a5eb6916f5972b281d7b7237a3464e2f50ee7c55;hb=1387a30ab59dbf4071f2c5e5e0e08ca98c75b726;hp=cfd1e947013cbff6916b96f54a096e426e957422;hpb=574d709a282747a775b02fbaef01d26076cfec60;p=fanfix.git diff --git a/src/be/nikiroo/fanfix/reader/ui/GuiReaderMainPanel.java b/src/be/nikiroo/fanfix/reader/ui/GuiReaderMainPanel.java index cfd1e94..a5eb691 100644 --- a/src/be/nikiroo/fanfix/reader/ui/GuiReaderMainPanel.java +++ b/src/be/nikiroo/fanfix/reader/ui/GuiReaderMainPanel.java @@ -17,6 +17,7 @@ import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -42,6 +43,7 @@ import be.nikiroo.fanfix.library.BasicLibrary.Status; import be.nikiroo.fanfix.library.LocalLibrary; import be.nikiroo.fanfix.reader.BasicReader; import be.nikiroo.fanfix.reader.ui.GuiReaderBook.BookActionListener; +import be.nikiroo.fanfix.reader.ui.GuiReaderBookInfo.Type; import be.nikiroo.utils.Progress; import be.nikiroo.utils.ui.ProgressBar; @@ -85,10 +87,10 @@ class GuiReaderMainPanel extends JPanel { *

* Will invalidate the layout. * - * @param libOk - * the library can be queried + * @param status + * the library status, must not be NULL */ - public void createMenu(boolean libOk); + public void createMenu(Status status); /** * Create a popup menu for a {@link GuiReaderBook} that represents a @@ -108,18 +110,18 @@ class GuiReaderMainPanel extends JPanel { } /** - * A {@link Runnable} with a {@link Story} parameter. + * A {@link Runnable} with a {@link MetaData} parameter. * * @author niki */ - public interface StoryRunnable { + public interface MetaDataRunnable { /** * Run the action. * - * @param story - * the story + * @param meta + * the meta of the story */ - public void run(Story story); + public void run(MetaData meta); } /** @@ -138,16 +140,16 @@ class GuiReaderMainPanel extends JPanel { pane = new JPanel(); pane.setLayout(new BoxLayout(pane, BoxLayout.PAGE_AXIS)); + JScrollPane scroll = new JScrollPane(pane); - Integer icolor = Instance.getUiConfig().getColor( - UiConfig.BACKGROUND_COLOR); + Integer icolor = Instance.getInstance().getUiConfig().getColor(UiConfig.BACKGROUND_COLOR); if (icolor != null) { color = new Color(icolor); setBackground(color); pane.setBackground(color); + scroll.setBackground(color); } - JScrollPane scroll = new JScrollPane(pane); scroll.getVerticalScrollBar().setUnitIncrement(16); add(scroll, BorderLayout.CENTER); @@ -197,27 +199,31 @@ class GuiReaderMainPanel extends JPanel { final BasicLibrary lib = helper.getReader().getLibrary(); final Status status = lib.getStatus(); - if (status == Status.READY) { + if (status == Status.READ_WRITE) { lib.refresh(pg); } inUi(new Runnable() { @Override public void run() { - if (status == Status.READY) { - helper.createMenu(true); + if (status.isReady()) { + helper.createMenu(status); pane.setVisible(true); if (typeF == null) { - addBookPane(true, false); + try { + addBookPane(true, false); + } catch (IOException e) { + error(e.getLocalizedMessage(), + "IOException", e); + } } else { addBookPane(typeF, true); } } else { - helper.createMenu(false); + helper.createMenu(status); validate(); - String desc = Instance.getTransGui().getStringX( - StringIdGui.ERROR_LIB_STATUS, + String desc = Instance.getInstance().getTransGui().getStringX(StringIdGui.ERROR_LIB_STATUS, status.toString()); if (desc == null) { desc = GuiReader @@ -255,8 +261,11 @@ class GuiReaderMainPanel extends JPanel { * @param listMode * TRUE to get a listing of all the sources or authors, FALSE to * get one icon per source or author + * + * @throws IOException + * in case of I/O error */ - public void addBookPane(boolean type, boolean listMode) { + public void addBookPane(boolean type, boolean listMode) throws IOException { this.currentType = type; BasicLibrary lib = helper.getReader().getLibrary(); if (type) { @@ -352,11 +361,17 @@ class GuiReaderMainPanel extends JPanel { List infos = new ArrayList(); List metas; - if (currentType) { - metas = lib.getListBySource(value); - } else { - metas = lib.getListByAuthor(value); + try { + if (currentType) { + metas = lib.getList().filter(value, null, null); + } else { + metas = lib.getList().filter(null, value, null); + } + } catch (IOException e) { + error(e.getLocalizedMessage(), "IOException", e); + metas = new ArrayList(); } + for (MetaData meta : metas) { infos.add(GuiReaderBookInfo.fromMeta(meta)); } @@ -392,7 +407,71 @@ class GuiReaderMainPanel extends JPanel { } }); } catch (IOException e) { - Instance.getTraceHandler().error(e); + Instance.getInstance().getTraceHandler().error(e); + error(GuiReader.trans(StringIdGui.ERROR_CANNOT_OPEN), + GuiReader.trans(StringIdGui.TITLE_ERROR), e); + } + } + }); + } + + /** + * Prefetch a {@link GuiReaderBook} item (which can be a group, in which + * case we prefetch all its members). + * + * @param book + * the {@link GuiReaderBook} to open + */ + public void prefetchBook(final GuiReaderBook book) { + final List luids = new LinkedList(); + try { + switch (book.getInfo().getType()) { + case STORY: + luids.add(book.getInfo().getMeta().getLuid()); + break; + case SOURCE: + for (MetaData meta : helper.getReader().getLibrary() + .getList().filter(book.getInfo().getMainInfo(), null, null)) { + luids.add(meta.getLuid()); + } + break; + case AUTHOR: + for (MetaData meta : helper.getReader().getLibrary() + .getList().filter(null, book.getInfo().getMainInfo(), null)) { + luids.add(meta.getLuid()); + } + break; + } + } catch (IOException e) { + Instance.getInstance().getTraceHandler().error(e); + } + + final Progress pg = new Progress(); + pg.setMax(luids.size()); + + outOfUi(pg, false, new Runnable() { + @Override + public void run() { + try { + for (String luid : luids) { + Progress pgStep = new Progress(); + pg.addProgress(pgStep, 1); + + helper.getReader().prefetch(luid, pgStep); + } + + // TODO: also set the green button on sources/authors? + // requires to do the same when all stories inside are green + if (book.getInfo().getType() == Type.STORY) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + book.setCached(true); + } + }); + } + } catch (IOException e) { + Instance.getInstance().getTraceHandler().error(e); error(GuiReader.trans(StringIdGui.ERROR_CANNOT_OPEN), GuiReader.trans(StringIdGui.TITLE_ERROR), e); } @@ -473,9 +552,9 @@ class GuiReaderMainPanel extends JPanel { try { EventQueue.invokeAndWait(run); } catch (InterruptedException e) { - Instance.getTraceHandler().error(e); + Instance.getInstance().getTraceHandler().error(e); } catch (InvocationTargetException e) { - Instance.getTraceHandler().error(e); + Instance.getInstance().getTraceHandler().error(e); } } } @@ -502,7 +581,8 @@ class GuiReaderMainPanel extends JPanel { // No data will be handled } - if (clipboard == null || !clipboard.startsWith("http")) { + if (clipboard == null || !(clipboard.startsWith("http://") || // + clipboard.startsWith("https://"))) { clipboard = ""; } @@ -533,7 +613,7 @@ class GuiReaderMainPanel extends JPanel { * @param onSuccessPgName * the name to use for the onSuccess progress bar */ - public void imprt(final String url, final StoryRunnable onSuccess, + public void imprt(final String url, final MetaDataRunnable onSuccess, String onSuccessPgName) { final Progress pg = new Progress(); final Progress pgImprt = new Progress(); @@ -545,9 +625,9 @@ class GuiReaderMainPanel extends JPanel { @Override public void run() { Exception ex = null; - Story story = null; + MetaData meta = null; try { - story = helper.getReader().getLibrary() + meta = helper.getReader().getLibrary() .imprt(BasicReader.getUrl(url), pgImprt); } catch (IOException e) { ex = e; @@ -571,7 +651,7 @@ class GuiReaderMainPanel extends JPanel { } } else { if (onSuccess != null) { - onSuccess.run(story); + onSuccess.run(meta); } } pgOnSuccess.done(); @@ -694,9 +774,9 @@ class GuiReaderMainPanel extends JPanel { * the exception to log if any */ private void error(final String message, final String title, Exception e) { - Instance.getTraceHandler().error(title + ": " + message); + Instance.getInstance().getTraceHandler().error(title + ": " + message); if (e != null) { - Instance.getTraceHandler().error(e); + Instance.getInstance().getTraceHandler().error(e); } SwingUtilities.invokeLater(new Runnable() {