Lot of fixes + first (bad, ugly) working GUI
[fanfix.git] / src / be / nikiroo / fanfix / reader / LocalReaderBook.java
1 package be.nikiroo.fanfix.reader;
2
3 import java.awt.BorderLayout;
4 import java.awt.Color;
5 import java.awt.Graphics2D;
6 import java.awt.event.MouseEvent;
7 import java.awt.event.MouseListener;
8 import java.awt.image.BufferedImage;
9 import java.util.ArrayList;
10 import java.util.Date;
11 import java.util.EventListener;
12 import java.util.List;
13
14 import javax.swing.ImageIcon;
15 import javax.swing.JLabel;
16 import javax.swing.JPanel;
17
18 import be.nikiroo.fanfix.data.MetaData;
19
20 /**
21 * A book item presented in a {@link LocalReaderFrame}.
22 *
23 * @author niki
24 */
25 class LocalReaderBook extends JPanel {
26 /**
27 * Action on a book item.
28 *
29 * @author niki
30 */
31 interface BookActionListner extends EventListener {
32 /**
33 * The book was selected (single click).
34 *
35 * @param book
36 * the {@link LocalReaderBook} itself
37 */
38 public void select(LocalReaderBook book);
39
40 /**
41 * The book was double-clicked.
42 *
43 * @param book
44 * the {@link LocalReaderBook} itself
45 */
46 public void action(LocalReaderBook book);
47 }
48
49 private static final long serialVersionUID = 1L;
50 private JLabel icon;
51 private JLabel title;
52 private JLabel author;
53 private boolean selected;
54 private boolean hovered;
55 private Date lastClick;
56 private long doubleClickDelay = 200; // in ms
57 private List<BookActionListner> listeners;
58
59 public LocalReaderBook(MetaData meta) {
60 if (meta.getCover() != null) {
61 BufferedImage resizedImage = new BufferedImage(100, 150,
62 BufferedImage.TYPE_4BYTE_ABGR);
63 Graphics2D g = resizedImage.createGraphics();
64 g.drawImage(meta.getCover(), 0, 0, 100, 150, null);
65 g.dispose();
66
67 icon = new JLabel(new ImageIcon(resizedImage));
68 } else {
69 icon = new JLabel(" [ no cover ] ");
70 }
71
72 title = new JLabel(meta.getTitle());
73 author = new JLabel("by " + meta.getAuthor());
74
75 this.setLayout(new BorderLayout());
76 this.add(icon, BorderLayout.CENTER);
77 this.add(title, BorderLayout.SOUTH);
78
79 setupListeners();
80 setSelected(false);
81 }
82
83 /**
84 * The book current selection state.
85 *
86 * @return the selected
87 */
88 public boolean isSelected() {
89 return selected;
90 }
91
92 /**
93 * The book current selection state.
94 *
95 * @param selected
96 * the selected to set
97 */
98 public void setSelected(boolean selected) {
99 this.selected = selected;
100 fixColor();
101 }
102
103 private void setHovered(boolean hovered) {
104 this.hovered = hovered;
105 fixColor();
106 }
107
108 private void fixColor() {
109 if (selected && !hovered) {
110 setBackground(new Color(180, 180, 255));
111 } else if (!selected && hovered) {
112 setBackground(new Color(230, 230, 255));
113 } else if (selected && hovered) {
114 setBackground(new Color(200, 200, 255));
115 } else {
116 setBackground(new Color(255, 255, 255));
117 }
118 }
119
120 private void setupListeners() {
121 listeners = new ArrayList<LocalReaderBook.BookActionListner>();
122 addMouseListener(new MouseListener() {
123 public void mouseReleased(MouseEvent e) {
124 }
125
126 public void mousePressed(MouseEvent e) {
127 }
128
129 public void mouseExited(MouseEvent e) {
130 setHovered(false);
131 }
132
133 public void mouseEntered(MouseEvent e) {
134 setHovered(true);
135 }
136
137 public void mouseClicked(MouseEvent e) {
138 Date now = new Date();
139 if (lastClick != null
140 && now.getTime() - lastClick.getTime() < doubleClickDelay) {
141 click(true);
142 } else {
143 click(false);
144 }
145 lastClick = now;
146 }
147 });
148 }
149
150 private void click(boolean doubleClick) {
151 for (BookActionListner listener : listeners) {
152 if (doubleClick) {
153 listener.action(this);
154 } else {
155 listener.select(this);
156 }
157 }
158 }
159
160 public void addActionListener(BookActionListner listener) {
161 listeners.add(listener);
162 }
163 }