Commit | Line | Data |
---|---|---|
333f0e7b NR |
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 | } |