b4c6be41c7123786a9d33bfbd9bb1bfa150a8a19
[fanfix.git] / src / be / nikiroo / fanfix_swing / gui / book / BookLine.java
1 package be.nikiroo.fanfix_swing.gui.book;
2
3 import java.awt.BorderLayout;
4 import java.awt.Color;
5 import java.awt.Dimension;
6 import java.awt.Graphics;
7
8 import javax.swing.JLabel;
9 import javax.swing.JPanel;
10
11 import be.nikiroo.fanfix.data.Story;
12 import be.nikiroo.fanfix_swing.gui.BooksPanel;
13
14 /**
15 * A book item presented in a {@link BooksPanel}.
16 * <p>
17 * Can be a story, or a comic or... a group.
18 *
19 * @author niki
20 */
21 public class BookLine extends JPanel {
22 private static final long serialVersionUID = 1L;
23
24 /** Colour used for the seconday item (author/word count). */
25 protected static final Color AUTHOR_COLOR = new Color(128, 128, 128);
26
27 private boolean selected;
28 private boolean hovered;
29
30 private BookInfo info;
31 private boolean seeWordCount;
32
33 private JLabel title;
34 private JLabel secondary;
35 private JLabel iconCached;
36 private JLabel iconNotCached;
37
38 /**
39 * Create a new {@link BookLine} item for the given {@link Story}.
40 *
41 * @param info the information about the story to represent
42 * @param seeWordCount TRUE to see word counts, FALSE to see authors
43 */
44 public BookLine(BookInfo info, boolean seeWordCount) {
45 this.info = info;
46 this.seeWordCount = seeWordCount;
47
48 init();
49 }
50
51 /**
52 * Initialise this {@link BookLine}.
53 */
54 protected void init() {
55 // TODO: image?
56 iconCached = new JLabel(" ");
57 iconNotCached = new JLabel(" * ");
58
59 iconNotCached.setForeground(BookCoverImager.UNCACHED_ICON_COLOR);
60 iconCached.setPreferredSize(iconNotCached.getPreferredSize());
61
62 title = new JLabel();
63 secondary = new JLabel();
64 secondary.setForeground(AUTHOR_COLOR);
65
66 setLayout(new BorderLayout());
67 add(title, BorderLayout.CENTER);
68 add(secondary, BorderLayout.EAST);
69
70 updateMeta();
71 }
72
73 /**
74 * The book current selection state.
75 *
76 * @return the selection state
77 */
78 public boolean isSelected() {
79 return selected;
80 }
81
82 /**
83 * The book current selection state,
84 *
85 * @param selected TRUE if it is selected
86 */
87 public void setSelected(boolean selected) {
88 if (this.selected != selected) {
89 this.selected = selected;
90 repaint();
91 }
92 }
93
94 /**
95 * The item mouse-hover state.
96 *
97 * @return TRUE if it is mouse-hovered
98 */
99 public boolean isHovered() {
100 return this.hovered;
101 }
102
103 /**
104 * The item mouse-hover state.
105 *
106 * @param hovered TRUE if it is mouse-hovered
107 */
108 public void setHovered(boolean hovered) {
109 if (this.hovered != hovered) {
110 this.hovered = hovered;
111 repaint();
112 }
113 }
114
115 /**
116 * The secondary value content: word count or author.
117 *
118 * @return TRUE to see word counts, FALSE to see authors
119 */
120 public boolean isSeeWordCount() {
121 return seeWordCount;
122 }
123
124 /**
125 * The secondary value content: word count or author.
126 *
127 * @param seeWordCount TRUE to see word counts, FALSE to see authors
128 */
129 public void setSeeWordCount(boolean seeWordCount) {
130 if (this.seeWordCount != seeWordCount) {
131 this.seeWordCount = seeWordCount;
132 repaint();
133 }
134 }
135
136 /**
137 * The information about the book represented by this item.
138 *
139 * @return the meta
140 */
141 public BookInfo getInfo() {
142 return info;
143 }
144
145 /**
146 * Update the title, paint the item.
147 */
148 @Override
149 public void paint(Graphics g) {
150 updateMeta();
151 super.paint(g);
152 }
153
154 /**
155 * Update the title with the currently registered information.
156 */
157 protected void updateMeta() {
158 String main = info.getMainInfo();
159 String optSecondary = info.getSecondaryInfo(seeWordCount);
160
161 // TODO: max size limit?
162 title.setText(main);
163 secondary.setText(optSecondary + " ");
164
165 setBackground(BookCoverImager.getBackground(isEnabled(), isSelected(), isHovered()));
166
167 remove(iconCached);
168 remove(iconNotCached);
169 add(getInfo().isCached() ? iconCached : iconNotCached, BorderLayout.WEST);
170 validate();
171 }
172 }