1 package be
.nikiroo
.fanfix
.reader
;
3 import java
.awt
.BorderLayout
;
5 import java
.awt
.Graphics
;
6 import java
.awt
.Graphics2D
;
7 import java
.awt
.Rectangle
;
8 import java
.awt
.event
.MouseEvent
;
9 import java
.awt
.event
.MouseListener
;
10 import java
.awt
.image
.BufferedImage
;
11 import java
.util
.ArrayList
;
12 import java
.util
.Date
;
13 import java
.util
.EventListener
;
14 import java
.util
.List
;
16 import javax
.swing
.ImageIcon
;
17 import javax
.swing
.JLabel
;
18 import javax
.swing
.JPanel
;
19 import javax
.swing
.JTextArea
;
21 import be
.nikiroo
.fanfix
.data
.MetaData
;
24 * A book item presented in a {@link LocalReaderFrame}.
28 class LocalReaderBook
extends JPanel
{
30 * Action on a book item.
34 interface BookActionListner
extends EventListener
{
36 * The book was selected (single click).
39 * the {@link LocalReaderBook} itself
41 public void select(LocalReaderBook book
);
44 * The book was double-clicked.
47 * the {@link LocalReaderBook} itself
49 public void action(LocalReaderBook book
);
52 private static final long serialVersionUID
= 1L;
54 private JTextArea title
;
55 private JTextArea author
;
56 private boolean selected
;
57 private boolean hovered
;
58 private Date lastClick
;
59 private long doubleClickDelay
= 200; // in ms
60 private List
<BookActionListner
> listeners
;
62 public LocalReaderBook(MetaData meta
) {
63 if (meta
.getCover() != null) {
64 BufferedImage resizedImage
= new BufferedImage(100, 150,
65 BufferedImage
.TYPE_4BYTE_ABGR
);
66 Graphics2D g
= resizedImage
.createGraphics();
67 g
.drawImage(meta
.getCover(), 0, 0, 100, 150, null);
70 icon
= new JLabel(new ImageIcon(resizedImage
));
72 icon
= new JLabel(" [ no cover ] ");
75 title
= new JTextArea(meta
.getTitle());
76 title
.setWrapStyleWord(true);
77 title
.setLineWrap(true);
78 title
.setEditable(false);
79 title
.setBackground(new Color(0, true));
80 author
= new JTextArea("by " + meta
.getAuthor());
82 this.setLayout(new BorderLayout());
83 this.add(icon
, BorderLayout
.CENTER
);
84 this.add(title
, BorderLayout
.SOUTH
);
91 * The book current selection state.
93 * @return the selected
95 public boolean isSelected() {
100 * The book current selection state.
103 * the selected to set
105 public void setSelected(boolean selected
) {
106 this.selected
= selected
;
110 private void setHovered(boolean hovered
) {
111 this.hovered
= hovered
;
115 private void setupListeners() {
116 listeners
= new ArrayList
<LocalReaderBook
.BookActionListner
>();
117 addMouseListener(new MouseListener() {
118 public void mouseReleased(MouseEvent e
) {
121 public void mousePressed(MouseEvent e
) {
124 public void mouseExited(MouseEvent e
) {
128 public void mouseEntered(MouseEvent e
) {
132 public void mouseClicked(MouseEvent e
) {
133 Date now
= new Date();
134 if (lastClick
!= null
135 && now
.getTime() - lastClick
.getTime() < doubleClickDelay
) {
145 private void click(boolean doubleClick
) {
146 for (BookActionListner listener
: listeners
) {
148 listener
.action(this);
150 listener
.select(this);
155 public void addActionListener(BookActionListner listener
) {
156 listeners
.add(listener
);
160 public void paint(Graphics g
) {
163 Color color
= new Color(255, 255, 255, 0);
164 if (selected
&& !hovered
) {
165 color
= new Color(80, 80, 100, 40);
166 } else if (!selected
&& hovered
) {
167 color
= new Color(230, 230, 255, 100);
168 } else if (selected
&& hovered
) {
169 color
= new Color(200, 200, 255, 100);
172 Rectangle clip
= g
.getClipBounds();
174 g
.fillRect(clip
.x
, clip
.y
, clip
.width
, clip
.height
);