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 GuiReaderSearchByNamePanel 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
) {
68 updateSupportType((SupportType
) comboSupportTypes
72 JPanel searchSites
= new JPanel(new BorderLayout());
73 searchSites
.add(comboSupportTypes
, BorderLayout
.CENTER
);
74 searchSites
.add(new JLabel(" " + "Website : "), BorderLayout
.WEST
);
76 searchPanel
= new GuiReaderSearchByNamePanel(supportType
);
77 searchPanel
.addActionListener(new ActionListener() {
79 public void actionPerformed(ActionEvent e
) {
80 updatePages(0, maxPage
);
81 List
<GuiReaderBookInfo
> infos
= new ArrayList
<GuiReaderBookInfo
>();
82 for (MetaData meta
: searchPanel
.getStories()) {
83 infos
.add(GuiReaderBookInfo
.fromMeta(meta
));
89 int item
= searchPanel
.getStoryItem();
90 if (item
> 0 && item
<= books
.getBooksCount()) {
91 // TODO: "click" on item ITEM
96 JPanel top
= new JPanel(new BorderLayout());
97 top
.add(searchSites
, BorderLayout
.NORTH
);
98 top
.add(searchPanel
, BorderLayout
.CENTER
);
100 add(top
, BorderLayout
.NORTH
);
102 books
= new GuiReaderGroup(reader
, null, null);
103 books
.setActionListener(new BookActionListener() {
105 public void select(GuiReaderBook book
) {
109 public void popupRequested(GuiReaderBook book
, Component target
,
114 public void action(GuiReaderBook book
) {
115 new GuiReaderSearchAction(reader
.getLibrary(), book
.getInfo())
119 JScrollPane scroll
= new JScrollPane(books
);
120 scroll
.getVerticalScrollBar().setUnitIncrement(16);
121 add(scroll
, BorderLayout
.CENTER
);
124 private void updateSupportType(SupportType supportType
) {
125 if (supportType
!= this.supportType
) {
126 this.supportType
= supportType
;
127 comboSupportTypes
.setSelectedItem(supportType
);
129 searchPanel
.setSupportType(supportType
);
133 private void updatePages(final int page
, final Integer maxPage
) {
134 inUi(new Runnable() {
137 GuiReaderSearchFrame
.this.page
= page
;
138 GuiReaderSearchFrame
.this.maxPage
= maxPage
;
140 searchPanel
.setPage(page
);
143 System
.out
.println("page: " + page
);
144 System
.out
.println("max page: " + maxPage
);
149 private void updateBooks(final List
<GuiReaderBookInfo
> infos
) {
150 setWaitingScreen(true);
151 inUi(new Runnable() {
154 books
.refreshBooks(infos
, seeWordcount
);
155 setWaitingScreen(false);
160 // item 0 = no selection, else = default selection
161 public void search(final SupportType searchOn
, final String keywords
,
162 final int page
, final int item
) {
164 updatePages(page
, maxPage
);
165 searchPanel
.setSupportType(searchOn
);
167 if (keywords
!= null) {
168 setWaitingScreen(true);
169 searchPanel
.search(keywords
, item
, new Runnable() {
172 setWaitingScreen(false);
178 // tag: null = base tags
179 public void searchTag(final SupportType searchOn
, final int page
,
180 final int item
, final SearchableTag tag
) {
182 setWaitingScreen(true);
183 updatePages(page
, maxPage
);
184 searchPanel
.setSupportType(searchOn
);
185 searchPanel
.searchTag(tag
, item
, new Runnable() {
188 setWaitingScreen(false);
194 * Process the given action in the main Swing UI thread.
196 * The code will make sure the current thread is the main UI thread and, if
197 * not, will switch to it before executing the runnable.
199 * Synchronous operation.
204 static void inUi(final Runnable run
) {
205 if (EventQueue
.isDispatchThread()) {
209 EventQueue
.invokeAndWait(run
);
210 } catch (InterruptedException e
) {
212 } catch (InvocationTargetException e
) {
218 static void error(Exception e
) {
219 Instance
.getTraceHandler().error(e
);
222 static void error(String e
) {
223 Instance
.getTraceHandler().error(e
);
226 private void setWaitingScreen(final boolean waiting
) {
227 inUi(new Runnable() {
230 GuiReaderSearchFrame
.this.setEnabled(!waiting
);
231 books
.setEnabled(!waiting
);
232 searchPanel
.setEnabled(!waiting
);