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
;
23 import be
.nikiroo
.fanfix
.Instance
;
24 import be
.nikiroo
.fanfix
.Main
;
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
.WrapLayout
;
30 class LocalReaderFrame
extends JFrame
{
31 private static final long serialVersionUID
= 1L;
32 private LocalReader reader
;
33 private List
<MetaData
> stories
;
34 private List
<LocalReaderBook
> books
;
35 private JPanel bookPane
;
39 public LocalReaderFrame(LocalReader reader
, String type
) {
40 super("Fanfix Library");
44 setDefaultCloseOperation(JFrame
.EXIT_ON_CLOSE
);
46 setLayout(new BorderLayout());
48 books
= new ArrayList
<LocalReaderBook
>();
49 bookPane
= new JPanel(new WrapLayout(WrapLayout
.LEADING
, 5, 5));
52 String bg
= Instance
.getUiConfig().getString(UiConfig
.BACKGROUND_COLOR
);
53 if (bg
.startsWith("#") && bg
.length() == 7) {
55 color
= new Color(Integer
.parseInt(bg
.substring(1, 3), 16),
56 Integer
.parseInt(bg
.substring(3, 5), 16),
57 Integer
.parseInt(bg
.substring(5, 7), 16));
58 } catch (NumberFormatException e
) {
59 color
= null; // no changes
66 bookPane
.setBackground(color
);
69 JScrollPane scroll
= new JScrollPane(bookPane
);
70 scroll
.getVerticalScrollBar().setUnitIncrement(16);
71 add(scroll
, BorderLayout
.CENTER
);
74 setJMenuBar(createMenu());
79 private void refreshBooks(String type
) {
81 stories
= Instance
.getLibrary().getList(type
);
84 for (MetaData meta
: stories
) {
85 LocalReaderBook book
= new LocalReaderBook(meta
);
87 book
.setBackground(color
);
91 final String luid
= meta
.getLuid();
92 book
.addActionListener(new BookActionListener() {
93 public void select(LocalReaderBook book
) {
94 for (LocalReaderBook abook
: books
) {
95 abook
.setSelected(abook
== book
);
99 public void action(LocalReaderBook book
) {
101 File target
= LocalReaderFrame
.this.reader
.getTarget(
103 Desktop
.getDesktop().browse(target
.toURI());
104 } catch (IOException e
) {
117 private JMenuBar
createMenu() {
118 JMenuBar bar
= new JMenuBar();
120 JMenu file
= new JMenu("File");
122 JMenuItem imprt
= new JMenuItem("Import", KeyEvent
.VK_I
);
123 imprt
.addActionListener(new ActionListener() {
124 public void actionPerformed(ActionEvent e
) {
125 String url
= JOptionPane
.showInputDialog(LocalReaderFrame
.this,
126 "url of the story to import?\n" + "\n"
127 + "Note: it will currently make the UI \n"
128 + "unresponsive until it is downloaded...",
129 "Importing from URL", JOptionPane
.QUESTION_MESSAGE
);
130 if (url
!= null && !url
.isEmpty()) {
131 if (Main
.imprt(url
, null) != 0) {
132 JOptionPane
.showMessageDialog(LocalReaderFrame
.this,
133 "Cannot import: " + url
, "Imort error",
134 JOptionPane
.ERROR_MESSAGE
);
141 JMenu types
= new JMenu("Type");
142 List
<String
> tt
= Instance
.getLibrary().getTypes();
144 for (final String type
: tt
) {
145 JMenuItem item
= new JMenuItem(type
== null ?
"[all]" : type
);
146 item
.addActionListener(new ActionListener() {
147 public void actionPerformed(ActionEvent e
) {
153 JMenuItem exit
= new JMenuItem("Exit", KeyEvent
.VK_X
);
154 exit
.addActionListener(new ActionListener() {
155 public void actionPerformed(ActionEvent e
) {
156 LocalReaderFrame
.this.dispatchEvent(new WindowEvent(
157 LocalReaderFrame
.this, WindowEvent
.WINDOW_CLOSING
));