1 package be
.nikiroo
.fanfix
.reader
.ui
;
3 import java
.awt
.BorderLayout
;
4 import java
.awt
.event
.ActionEvent
;
5 import java
.awt
.event
.ActionListener
;
6 import java
.awt
.event
.KeyAdapter
;
7 import java
.awt
.event
.KeyEvent
;
8 import java
.io
.IOException
;
9 import java
.util
.ArrayList
;
10 import java
.util
.List
;
12 import javax
.swing
.JButton
;
13 import javax
.swing
.JPanel
;
14 import javax
.swing
.JTextField
;
16 import be
.nikiroo
.fanfix
.data
.MetaData
;
17 import be
.nikiroo
.fanfix
.searchable
.BasicSearchable
;
20 * This panel represents a search panel that works for keywords and tags based
25 public class GuiReaderSearchByNamePanel
extends JPanel
{
26 private static final long serialVersionUID
= 1L;
28 private BasicSearchable searchable
;
30 private JTextField keywordsField
;
31 private JButton submitKeywords
;
35 private List
<MetaData
> stories
= new ArrayList
<MetaData
>();
36 private int storyItem
;
38 public GuiReaderSearchByNamePanel(final Runnable fireEvent
) {
39 super(new BorderLayout());
41 keywordsField
= new JTextField();
42 add(keywordsField
, BorderLayout
.CENTER
);
44 submitKeywords
= new JButton("Search");
45 add(submitKeywords
, BorderLayout
.EAST
);
47 keywordsField
.addKeyListener(new KeyAdapter() {
49 public void keyReleased(KeyEvent e
) {
50 if (e
.getKeyCode() == KeyEvent
.VK_ENTER
) {
51 search(keywordsField
.getText(), 1, 0);
58 submitKeywords
.addActionListener(new ActionListener() {
60 public void actionPerformed(ActionEvent e
) {
61 new Thread(new Runnable() {
64 search(keywordsField
.getText(), 1, 0);
75 * The {@link BasicSearchable} object use for the searches themselves.
77 * Can be NULL, but no searches will work.
82 public void setSearchable(BasicSearchable searchable
) {
83 this.searchable
= searchable
;
87 stories
= new ArrayList
<MetaData
>();
91 public int getPage() {
95 public int getMaxPage() {
99 public String
getCurrentKeywords() {
100 return keywordsField
.getText();
103 public List
<MetaData
> getStories() {
107 // selected item or 0 if none ! one-based !
108 public int getStoryItem() {
113 private void updateKeywords(final String keywords
) {
114 if (!keywords
.equals(keywordsField
.getText())) {
115 GuiReaderSearchFrame
.inUi(new Runnable() {
118 keywordsField
.setText(keywords
);
124 // item 0 = no selection, else = default selection
125 // throw if page > max
126 public void search(String keywords
, int page
, int item
) {
127 List
<MetaData
> stories
= new ArrayList
<MetaData
>();
130 updateKeywords(keywords
);
134 maxPage
= searchable
.searchPages(keywords
);
135 } catch (IOException e
) {
136 GuiReaderSearchFrame
.error(e
);
140 if (maxPage
>= 0 && (page
<= 0 || page
> maxPage
)) {
141 throw new IndexOutOfBoundsException("Page " + page
+ " out of "
146 stories
= searchable
.search(keywords
, page
);
147 } catch (IOException e
) {
148 GuiReaderSearchFrame
.error(e
);
149 stories
= new ArrayList
<MetaData
>();
152 if (item
> 0 && item
<= stories
.size()) {
154 } else if (item
> 0) {
155 GuiReaderSearchFrame
.error(String
.format(
156 "Story item does not exist: Search [%s], item %d",
162 this.maxPage
= maxPage
;
163 this.stories
= stories
;
164 this.storyItem
= storyItem
;
168 * Enables or disables this component, depending on the value of the
169 * parameter <code>b</code>. An enabled component can respond to user input
170 * and generate events. Components are enabled initially by default.
172 * Disabling this component will also affect its children.
175 * If <code>true</code>, this component is enabled; otherwise
176 * this component is disabled
179 public void setEnabled(boolean b
) {
181 keywordsField
.setEnabled(b
);
182 submitKeywords
.setEnabled(b
);