Fix CBZ importer, improve GUI
[fanfix.git] / src / be / nikiroo / fanfix / reader / LocalReaderFrame.java
1 package be.nikiroo.fanfix.reader;
2
3 import java.awt.BorderLayout;
4 import java.awt.Desktop;
5 import java.awt.event.ActionEvent;
6 import java.awt.event.ActionListener;
7 import java.awt.event.KeyEvent;
8 import java.awt.event.WindowEvent;
9 import java.io.File;
10 import java.io.IOException;
11 import java.util.ArrayList;
12 import java.util.List;
13
14 import javax.swing.JFrame;
15 import javax.swing.JMenu;
16 import javax.swing.JMenuBar;
17 import javax.swing.JMenuItem;
18 import javax.swing.JOptionPane;
19 import javax.swing.JPanel;
20 import javax.swing.JScrollPane;
21
22 import be.nikiroo.fanfix.Instance;
23 import be.nikiroo.fanfix.Main;
24 import be.nikiroo.fanfix.data.MetaData;
25 import be.nikiroo.fanfix.reader.LocalReaderBook.BookActionListner;
26
27 class LocalReaderFrame extends JFrame {
28 private static final long serialVersionUID = 1L;
29 private LocalReader reader;
30 private List<MetaData> stories;
31 private List<LocalReaderBook> books;
32 private JPanel bookPane;
33 private String type;
34
35 public LocalReaderFrame(LocalReader reader, String type) {
36 super("HTML reader");
37
38 this.reader = reader;
39
40 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
41 setSize(800, 600);
42 setLayout(new BorderLayout());
43
44 books = new ArrayList<LocalReaderBook>();
45 bookPane = new JPanel(new WrapLayout(WrapLayout.LEADING));
46
47 add(new JScrollPane(bookPane), BorderLayout.CENTER);
48
49 refreshBooks(type);
50 setJMenuBar(createMenu());
51
52 setVisible(true);
53 }
54
55 private void refreshBooks(String type) {
56 this.type = type;
57 stories = Instance.getLibrary().getList(type);
58 books.clear();
59 bookPane.removeAll();
60 for (MetaData meta : stories) {
61 LocalReaderBook book = new LocalReaderBook(meta);
62 books.add(book);
63 final String luid = meta.getLuid();
64 book.addActionListener(new BookActionListner() {
65 public void select(LocalReaderBook book) {
66 for (LocalReaderBook abook : books) {
67 abook.setSelected(abook == book);
68 }
69 }
70
71 public void action(LocalReaderBook book) {
72 try {
73 File target = LocalReaderFrame.this.reader
74 .getTarget(luid);
75 Desktop.getDesktop().browse(target.toURI());
76 } catch (IOException e) {
77 Instance.syserr(e);
78 }
79 }
80 });
81
82 bookPane.add(book);
83 }
84
85 bookPane.validate();
86 bookPane.repaint();
87 }
88
89 private JMenuBar createMenu() {
90 JMenuBar bar = new JMenuBar();
91
92 JMenu file = new JMenu("File");
93
94 JMenuItem imprt = new JMenuItem("Import", KeyEvent.VK_I);
95 imprt.addActionListener(new ActionListener() {
96 public void actionPerformed(ActionEvent e) {
97 String url = JOptionPane.showInputDialog(LocalReaderFrame.this,
98 "url?");
99 if (Main.imprt(url) != 0) {
100 JOptionPane.showMessageDialog(LocalReaderFrame.this,
101 "Cannot import", "Imort error",
102 JOptionPane.ERROR_MESSAGE);
103 } else {
104 refreshBooks(type);
105 }
106 }
107 });
108 JMenu types = new JMenu("Type");
109 List<String> tt = Instance.getLibrary().getTypes();
110 tt.add(0, null);
111 for (final String type : tt) {
112 JMenuItem item = new JMenuItem(type == null ? "[all]" : type);
113 item.addActionListener(new ActionListener() {
114 public void actionPerformed(ActionEvent e) {
115 refreshBooks(type);
116 }
117 });
118 types.add(item);
119 }
120 JMenuItem exit = new JMenuItem("Exit", KeyEvent.VK_X);
121 exit.addActionListener(new ActionListener() {
122 public void actionPerformed(ActionEvent e) {
123 LocalReaderFrame.this.dispatchEvent(new WindowEvent(
124 LocalReaderFrame.this, WindowEvent.WINDOW_CLOSING));
125 }
126 });
127
128 file.add(imprt);
129 file.add(types);
130 file.addSeparator();
131 file.add(exit);
132
133 bar.add(file);
134
135 return bar;
136 }
137 }