package be.nikiroo.fanfix.reader;
+import java.awt.BorderLayout;
+import java.awt.Color;
import java.awt.Desktop;
-import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.SwingUtilities;
import be.nikiroo.fanfix.Instance;
-import be.nikiroo.fanfix.Main;
+import be.nikiroo.fanfix.bundles.UiConfig;
import be.nikiroo.fanfix.data.MetaData;
-import be.nikiroo.fanfix.reader.LocalReaderBook.BookActionListner;
+import be.nikiroo.fanfix.reader.LocalReaderBook.BookActionListener;
+import be.nikiroo.utils.Progress;
+import be.nikiroo.utils.ui.ProgressBar;
+import be.nikiroo.utils.ui.WrapLayout;
class LocalReaderFrame extends JFrame {
private static final long serialVersionUID = 1L;
private List<LocalReaderBook> books;
private JPanel bookPane;
private String type;
+ private Color color;
+ private ProgressBar pgBar;
+ private JMenuBar bar;
public LocalReaderFrame(LocalReader reader, String type) {
- super("HTML reader");
+ super("Fanfix Library");
this.reader = reader;
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(800, 600);
- setLayout(new FlowLayout());
+ setLayout(new BorderLayout());
books = new ArrayList<LocalReaderBook>();
- bookPane = new JPanel();
- add(bookPane);
+ bookPane = new JPanel(new WrapLayout(WrapLayout.LEADING, 5, 5));
+
+ color = Instance.getUiConfig().getColor(UiConfig.BACKGROUND_COLOR);
+
+ if (color != null) {
+ setBackground(color);
+ bookPane.setBackground(color);
+ }
+
+ JScrollPane scroll = new JScrollPane(bookPane);
+ scroll.getVerticalScrollBar().setUnitIncrement(16);
+ add(scroll, BorderLayout.CENTER);
+
+ pgBar = new ProgressBar();
+ add(pgBar, BorderLayout.SOUTH);
refreshBooks(type);
setJMenuBar(createMenu());
bookPane.removeAll();
for (MetaData meta : stories) {
LocalReaderBook book = new LocalReaderBook(meta);
+ if (color != null) {
+ book.setBackground(color);
+ }
+
books.add(book);
final String luid = meta.getLuid();
- book.addActionListener(new BookActionListner() {
+ book.addActionListener(new BookActionListener() {
public void select(LocalReaderBook book) {
for (LocalReaderBook abook : books) {
abook.setSelected(abook == book);
}
public void action(LocalReaderBook book) {
- try {
- File target = LocalReaderFrame.this.reader
- .getTarget(luid);
- Desktop.getDesktop().browse(target.toURI());
- } catch (IOException e) {
- Instance.syserr(e);
- }
+ final Progress pg = new Progress();
+ outOfUi(pg, new Runnable() {
+ public void run() {
+ try {
+ File target = LocalReaderFrame.this.reader
+ .getTarget(luid, pg);
+ Desktop.getDesktop().browse(target.toURI());
+ } catch (IOException e) {
+ Instance.syserr(e);
+ }
+ }
+ });
}
});
}
private JMenuBar createMenu() {
- JMenuBar bar = new JMenuBar();
+ bar = new JMenuBar();
JMenu file = new JMenu("File");
JMenuItem imprt = new JMenuItem("Import", KeyEvent.VK_I);
imprt.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
- String url = JOptionPane.showInputDialog(LocalReaderFrame.this,
- "url?");
- if (Main.imprt(url) != 0) {
- JOptionPane.showMessageDialog(LocalReaderFrame.this,
- "Cannot import", "Imort error",
- JOptionPane.ERROR_MESSAGE);
- } else {
- refreshBooks(type);
+ final String url = JOptionPane.showInputDialog(
+ LocalReaderFrame.this, "url of the story to import?",
+ "Importing from URL", JOptionPane.QUESTION_MESSAGE);
+ if (url != null && !url.isEmpty()) {
+ final Progress pg = new Progress("Importing " + url);
+ outOfUi(pg, new Runnable() {
+ public void run() {
+ Exception ex = null;
+ try {
+ Instance.getLibrary().imprt(
+ BasicReader.getUrl(url), pg);
+ } catch (IOException e) {
+ ex = e;
+ }
+
+ final Exception e = ex;
+
+ final boolean ok = (e == null);
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ if (!ok) {
+ JOptionPane.showMessageDialog(
+ LocalReaderFrame.this,
+ "Cannot import: " + url,
+ e.getMessage(),
+ JOptionPane.ERROR_MESSAGE);
+
+ setAllEnabled(true);
+ } else {
+ refreshBooks(type);
+ }
+ }
+ });
+ }
+ });
}
}
});
return bar;
}
+
+ private void outOfUi(final Progress pg, final Runnable run) {
+ pgBar.setProgress(pg);
+
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ setAllEnabled(false);
+ pgBar.addActioListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ pgBar.setProgress(null);
+ setAllEnabled(true);
+ }
+ });
+ }
+ });
+
+ new Thread(new Runnable() {
+ public void run() {
+ run.run();
+ if (!pg.isDone()) {
+ pg.setProgress(pg.getMax());
+ }
+ }
+ }).start();
+ }
+
+ public void setAllEnabled(boolean enabled) {
+ for (LocalReaderBook book : books) {
+ book.setEnabled(enabled);
+ book.validate();
+ book.repaint();
+ }
+ bar.setEnabled(enabled);
+ bookPane.setEnabled(enabled);
+ bookPane.validate();
+ bookPane.repaint();
+ setEnabled(enabled);
+ validate();
+ repaint();
+ }
}