1 package be
.nikiroo
.fanfix
.reader
.ui
;
3 import java
.awt
.BorderLayout
;
4 import java
.awt
.Component
;
5 import java
.awt
.EventQueue
;
6 import java
.awt
.event
.ActionEvent
;
7 import java
.awt
.event
.ActionListener
;
8 import java
.lang
.reflect
.InvocationTargetException
;
9 import java
.util
.ArrayList
;
10 import java
.util
.List
;
12 import javax
.swing
.JComboBox
;
13 import javax
.swing
.JFrame
;
14 import javax
.swing
.JLabel
;
15 import javax
.swing
.JPanel
;
16 import javax
.swing
.JScrollPane
;
18 import be
.nikiroo
.fanfix
.Instance
;
19 import be
.nikiroo
.fanfix
.data
.MetaData
;
20 import be
.nikiroo
.fanfix
.reader
.ui
.GuiReaderBook
.BookActionListener
;
21 import be
.nikiroo
.fanfix
.searchable
.BasicSearchable
;
22 import be
.nikiroo
.fanfix
.searchable
.SearchableTag
;
23 import be
.nikiroo
.fanfix
.supported
.SupportType
;
26 * This frame will allow you to search through the supported websites for new
31 // JCombobox<E> not 1.6 compatible
32 @SuppressWarnings({ "unchecked", "rawtypes" })
33 public class GuiReaderSearchFrame
extends JFrame
{
34 private static final long serialVersionUID
= 1L;
36 private List
<SupportType
> supportTypes
;
37 private SupportType supportType
;
41 private JComboBox comboSupportTypes
;
42 private GuiReaderSearchByPanel searchPanel
;
44 private boolean seeWordcount
;
45 private GuiReaderGroup books
;
47 public GuiReaderSearchFrame(final GuiReader reader
) {
48 super("Browse stories");
49 setLayout(new BorderLayout());
55 supportTypes
= new ArrayList
<SupportType
>();
56 for (SupportType type
: SupportType
.values()) {
57 if (BasicSearchable
.getSearchable(type
) != null) {
58 supportTypes
.add(type
);
61 supportType
= supportTypes
.isEmpty() ?
null : supportTypes
.get(0);
63 comboSupportTypes
= new JComboBox(
64 supportTypes
.toArray(new SupportType
[] {}));
65 comboSupportTypes
.addActionListener(new ActionListener() {
67 public void actionPerformed(ActionEvent e
) {
70 (SupportType
) comboSupportTypes
.getSelectedItem(),
79 JPanel searchSites
= new JPanel(new BorderLayout());
80 searchSites
.add(comboSupportTypes
, BorderLayout
.CENTER
);
81 searchSites
.add(new JLabel(" " + "Website : "), BorderLayout
.WEST
);
83 searchPanel
= new GuiReaderSearchByPanel(supportType
,
84 new GuiReaderSearchByPanel
.Waitable() {
86 public void setWaiting(boolean waiting
) {
87 GuiReaderSearchFrame
.this.setWaiting(waiting
);
91 searchPanel
.addActionListener(new ActionListener() {
93 public void actionPerformed(ActionEvent e
) {
94 updatePages(searchPanel
.getPage(), searchPanel
.getMaxPage());
95 List
<GuiReaderBookInfo
> infos
= new ArrayList
<GuiReaderBookInfo
>();
96 for (MetaData meta
: searchPanel
.getStories()) {
97 infos
.add(GuiReaderBookInfo
.fromMeta(meta
));
103 int item
= searchPanel
.getStoryItem();
104 if (item
> 0 && item
<= books
.getBooksCount()) {
105 // TODO: "click" on item ITEM
110 JPanel top
= new JPanel(new BorderLayout());
111 top
.add(searchSites
, BorderLayout
.NORTH
);
112 top
.add(searchPanel
, BorderLayout
.CENTER
);
114 add(top
, BorderLayout
.NORTH
);
116 books
= new GuiReaderGroup(reader
, null, null);
117 books
.setActionListener(new BookActionListener() {
119 public void select(GuiReaderBook book
) {
123 public void popupRequested(GuiReaderBook book
, Component target
,
128 public void action(GuiReaderBook book
) {
129 new GuiReaderSearchAction(reader
.getLibrary(), book
.getInfo())
133 JScrollPane scroll
= new JScrollPane(books
);
134 scroll
.getVerticalScrollBar().setUnitIncrement(16);
135 add(scroll
, BorderLayout
.CENTER
);
138 private void updateSupportType(final SupportType supportType
,
139 final Runnable inUi
) {
140 this.supportType
= supportType
;
141 comboSupportTypes
.setSelectedItem(supportType
);
144 new Thread(new Runnable() {
147 searchPanel
.setSupportType(supportType
);
153 private void updatePages(final int page
, final int maxPage
) {
154 inUi(new Runnable() {
157 GuiReaderSearchFrame
.this.page
= page
;
158 GuiReaderSearchFrame
.this.maxPage
= maxPage
;
161 System
.out
.println("page: " + page
);
162 System
.out
.println("max page: " + maxPage
);
167 private void updateBooks(final List
<GuiReaderBookInfo
> infos
) {
169 inUi(new Runnable() {
172 books
.refreshBooks(infos
, seeWordcount
);
178 // item 0 = no selection, else = default selection
179 public void search(final SupportType searchOn
, final String keywords
,
180 final int page
, final int item
) {
182 new Thread(new Runnable() {
185 searchPanel
.setSupportType(searchOn
);
186 searchPanel
.search(keywords
, page
, item
);
187 inUi(new Runnable() {
197 // tag: null = base tags
198 public void searchTag(final SupportType searchOn
, final int page
,
199 final int item
, final SearchableTag tag
) {
201 new Thread(new Runnable() {
204 searchPanel
.setSupportType(searchOn
);
205 searchPanel
.searchTag(tag
, page
, item
);
206 inUi(new Runnable() {
217 * Process the given action in the main Swing UI thread.
219 * The code will make sure the current thread is the main UI thread and, if
220 * not, will switch to it before executing the runnable.
222 * Synchronous operation.
227 static void inUi(final Runnable run
) {
228 if (EventQueue
.isDispatchThread()) {
232 EventQueue
.invokeAndWait(run
);
233 } catch (InterruptedException e
) {
235 } catch (InvocationTargetException e
) {
241 static void error(Exception e
) {
242 Instance
.getTraceHandler().error(e
);
245 static void error(String e
) {
246 Instance
.getTraceHandler().error(e
);
250 * Enables or disables this component, depending on the value of the
251 * parameter <code>b</code>. An enabled component can respond to user input
252 * and generate events. Components are enabled initially by default.
254 * Disabling this component will also affect its children.
257 * If <code>true</code>, this component is enabled; otherwise
258 * this component is disabled
261 public void setEnabled(boolean b
) {
264 searchPanel
.setEnabled(b
);
267 private void setWaiting(final boolean waiting
) {
268 inUi(new Runnable() {
271 GuiReaderSearchFrame
.this.setEnabled(!waiting
);