1 package be
.nikiroo
.fanfix
.reader
;
3 import java
.awt
.BorderLayout
;
5 import java
.awt
.Desktop
;
6 import java
.awt
.event
.ActionEvent
;
7 import java
.awt
.event
.ActionListener
;
8 import java
.awt
.event
.KeyEvent
;
9 import java
.awt
.event
.WindowEvent
;
11 import java
.io
.IOException
;
12 import java
.util
.ArrayList
;
13 import java
.util
.List
;
15 import javax
.swing
.JFrame
;
16 import javax
.swing
.JMenu
;
17 import javax
.swing
.JMenuBar
;
18 import javax
.swing
.JMenuItem
;
19 import javax
.swing
.JOptionPane
;
20 import javax
.swing
.JPanel
;
21 import javax
.swing
.JScrollPane
;
22 import javax
.swing
.SwingUtilities
;
24 import be
.nikiroo
.fanfix
.Instance
;
25 import be
.nikiroo
.fanfix
.bundles
.UiConfig
;
26 import be
.nikiroo
.fanfix
.data
.MetaData
;
27 import be
.nikiroo
.fanfix
.reader
.LocalReaderBook
.BookActionListener
;
28 import be
.nikiroo
.utils
.Progress
;
29 import be
.nikiroo
.utils
.ui
.ProgressBar
;
30 import be
.nikiroo
.utils
.ui
.WrapLayout
;
32 class LocalReaderFrame
extends JFrame
{
33 private static final long serialVersionUID
= 1L;
34 private LocalReader reader
;
35 private List
<MetaData
> stories
;
36 private List
<LocalReaderBook
> books
;
37 private JPanel bookPane
;
40 private ProgressBar pgBar
;
43 public LocalReaderFrame(LocalReader reader
, String type
) {
44 super("Fanfix Library");
48 setDefaultCloseOperation(JFrame
.EXIT_ON_CLOSE
);
50 setLayout(new BorderLayout());
52 books
= new ArrayList
<LocalReaderBook
>();
53 bookPane
= new JPanel(new WrapLayout(WrapLayout
.LEADING
, 5, 5));
55 color
= Instance
.getUiConfig().getColor(UiConfig
.BACKGROUND_COLOR
);
59 bookPane
.setBackground(color
);
62 JScrollPane scroll
= new JScrollPane(bookPane
);
63 scroll
.getVerticalScrollBar().setUnitIncrement(16);
64 add(scroll
, BorderLayout
.CENTER
);
66 pgBar
= new ProgressBar();
67 add(pgBar
, BorderLayout
.SOUTH
);
70 setJMenuBar(createMenu());
75 private void refreshBooks(String type
) {
77 stories
= Instance
.getLibrary().getList(type
);
80 for (MetaData meta
: stories
) {
81 LocalReaderBook book
= new LocalReaderBook(meta
);
83 book
.setBackground(color
);
87 final String luid
= meta
.getLuid();
88 book
.addActionListener(new BookActionListener() {
89 public void select(LocalReaderBook book
) {
90 for (LocalReaderBook abook
: books
) {
91 abook
.setSelected(abook
== book
);
95 public void action(LocalReaderBook book
) {
96 final Progress pg
= new Progress();
97 outOfUi(pg
, new Runnable() {
100 File target
= LocalReaderFrame
.this.reader
101 .getTarget(luid
, pg
);
102 // TODO: allow custom programs, with
103 // Desktop/xdg-open fallback
105 Desktop
.getDesktop().browse(target
.toURI());
106 } catch (UnsupportedOperationException e
) {
107 String browsers
[] = new String
[] {
108 "xdg-open", "epiphany",
109 "konqueror", "firefox", "chrome",
110 "google-chrome", "mozilla" };
112 Runtime runtime
= Runtime
.getRuntime();
113 for (String browser
: browsers
) {
115 runtime
.exec(new String
[] {
117 target
.getAbsolutePath() });
120 } catch (IOException ioe
) {
121 // continue, try next browser
125 if (runtime
!= null) {
126 throw new IOException(
127 "Cannot find a working GUI browser...");
130 } catch (IOException e
) {
145 private JMenuBar
createMenu() {
146 bar
= new JMenuBar();
148 JMenu file
= new JMenu("File");
150 JMenuItem imprt
= new JMenuItem("Import", KeyEvent
.VK_I
);
151 imprt
.addActionListener(new ActionListener() {
152 public void actionPerformed(ActionEvent e
) {
153 final String url
= JOptionPane
.showInputDialog(
154 LocalReaderFrame
.this, "url of the story to import?",
155 "Importing from URL", JOptionPane
.QUESTION_MESSAGE
);
156 if (url
!= null && !url
.isEmpty()) {
157 final Progress pg
= new Progress("Importing " + url
);
158 outOfUi(pg
, new Runnable() {
162 Instance
.getLibrary().imprt(
163 BasicReader
.getUrl(url
), pg
);
164 } catch (IOException e
) {
168 final Exception e
= ex
;
170 final boolean ok
= (e
== null);
171 SwingUtilities
.invokeLater(new Runnable() {
174 JOptionPane
.showMessageDialog(
175 LocalReaderFrame
.this,
176 "Cannot import: " + url
,
178 JOptionPane
.ERROR_MESSAGE
);
191 JMenu types
= new JMenu("Type");
192 List
<String
> tt
= Instance
.getLibrary().getTypes();
194 for (final String type
: tt
) {
195 JMenuItem item
= new JMenuItem(type
== null ?
"[all]" : type
);
196 item
.addActionListener(new ActionListener() {
197 public void actionPerformed(ActionEvent e
) {
203 JMenuItem exit
= new JMenuItem("Exit", KeyEvent
.VK_X
);
204 exit
.addActionListener(new ActionListener() {
205 public void actionPerformed(ActionEvent e
) {
206 LocalReaderFrame
.this.dispatchEvent(new WindowEvent(
207 LocalReaderFrame
.this, WindowEvent
.WINDOW_CLOSING
));
221 private void outOfUi(final Progress pg
, final Runnable run
) {
222 pgBar
.setProgress(pg
);
224 SwingUtilities
.invokeLater(new Runnable() {
226 setAllEnabled(false);
227 pgBar
.addActioListener(new ActionListener() {
228 public void actionPerformed(ActionEvent e
) {
229 pgBar
.setProgress(null);
236 new Thread(new Runnable() {
240 pg
.setProgress(pg
.getMax());
246 public void setAllEnabled(boolean enabled
) {
247 for (LocalReaderBook book
: books
) {
248 book
.setEnabled(enabled
);
252 bar
.setEnabled(enabled
);
253 bookPane
.setEnabled(enabled
);