X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Freader%2Fui%2FGuiReaderMainPanel.java;h=2843a0519a82c6a6771c659b6805c5baf2f4171a;hb=d66deb8d8b30cff6b54db352eef34a3508939f84;hp=be523648739f9a4d80cdcf65eea2e2c95478af14;hpb=5bc9573be46f09ac92207e104915bd5babbd6d63;p=nikiroo-utils.git diff --git a/src/be/nikiroo/fanfix/reader/ui/GuiReaderMainPanel.java b/src/be/nikiroo/fanfix/reader/ui/GuiReaderMainPanel.java index be52364..2843a05 100644 --- a/src/be/nikiroo/fanfix/reader/ui/GuiReaderMainPanel.java +++ b/src/be/nikiroo/fanfix/reader/ui/GuiReaderMainPanel.java @@ -2,19 +2,22 @@ package be.nikiroo.fanfix.reader.ui; import java.awt.BorderLayout; import java.awt.Color; +import java.awt.Component; import java.awt.EventQueue; import java.awt.Frame; import java.awt.Toolkit; import java.awt.datatransfer.DataFlavor; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.event.MouseEvent; +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; import java.io.File; import java.io.IOException; 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; @@ -40,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; @@ -83,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 @@ -106,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); } /** @@ -136,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); @@ -179,6 +183,13 @@ class GuiReaderMainPanel extends JPanel { books = new TreeMap(); + addFocusListener(new FocusAdapter() { + @Override + public void focusGained(FocusEvent e) { + focus(); + } + }); + pane.setVisible(false); final Progress pg = new Progress(); final String typeF = type; @@ -188,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); } - pane.setVisible(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 @@ -246,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) { @@ -305,9 +323,10 @@ class GuiReaderMainPanel extends JPanel { } @Override - public void popupRequested(GuiReaderBook book, MouseEvent e) { + public void popupRequested(GuiReaderBook book, Component target, + int x, int y) { JPopupMenu popup = helper.createBookPopup(); - popup.show(e.getComponent(), e.getX(), e.getY()); + popup.show(target, x, y); } @Override @@ -315,6 +334,8 @@ class GuiReaderMainPanel extends JPanel { openBook(book); } }); + + focus(); } /** @@ -340,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.getListBySource(value); + } else { + metas = lib.getListByAuthor(value); + } + } catch (IOException e) { + error(e.getLocalizedMessage(), "IOException", e); + metas = new ArrayList(); } + for (MetaData meta : metas) { infos.add(GuiReaderBookInfo.fromMeta(meta)); } @@ -380,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() + .getListBySource(book.getInfo().getMainInfo())) { + luids.add(meta.getLuid()); + } + break; + case AUTHOR: + for (MetaData meta : helper.getReader().getLibrary() + .getListByAuthor(book.getInfo().getMainInfo())) { + 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); } @@ -461,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); } } } @@ -490,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 = ""; } @@ -521,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(); @@ -533,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; @@ -559,7 +651,7 @@ class GuiReaderMainPanel extends JPanel { } } else { if (onSuccess != null) { - onSuccess.run(story); + onSuccess.run(meta); } } pgOnSuccess.done(); @@ -635,9 +727,10 @@ class GuiReaderMainPanel extends JPanel { } @Override - public void popupRequested(GuiReaderBook book, MouseEvent e) { + public void popupRequested(GuiReaderBook book, Component target, + int x, int y) { JPopupMenu popup = helper.createSourceAuthorPopup(); - popup.show(e.getComponent(), e.getX(), e.getY()); + popup.show(target, x, y); } @Override @@ -647,6 +740,27 @@ class GuiReaderMainPanel extends JPanel { refreshBooks(); } }); + + focus(); + } + + /** + * Focus the first {@link GuiReaderGroup} we find. + */ + private void focus() { + GuiReaderGroup group = null; + Map books = this.books; + if (books.size() > 0) { + group = books.values().iterator().next(); + } + + if (group == null) { + group = bookPane; + } + + if (group != null) { + group.requestFocusInWindow(); + } } /** @@ -660,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() {