X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Freader%2Fui%2FGuiReaderSearchFrame.java;h=11d45e41fc6374ae2e46af973b9d1e9478bfa44b;hb=dc3b0033126c7f8158499b8ae9759a22f29d78ac;hp=1c8802a510f286e44cbe7b0897f2fad8c08e566a;hpb=7cc1e74322fcf0e1b53ea7042db852a119fa99a6;p=fanfix.git diff --git a/src/be/nikiroo/fanfix/reader/ui/GuiReaderSearchFrame.java b/src/be/nikiroo/fanfix/reader/ui/GuiReaderSearchFrame.java index 1c8802a..11d45e4 100644 --- a/src/be/nikiroo/fanfix/reader/ui/GuiReaderSearchFrame.java +++ b/src/be/nikiroo/fanfix/reader/ui/GuiReaderSearchFrame.java @@ -34,12 +34,12 @@ public class GuiReaderSearchFrame extends JFrame { private static final long serialVersionUID = 1L; private List supportTypes; - private SupportType supportType; private int page; private int maxPage; private JComboBox comboSupportTypes; - private GuiReaderSearchByNamePanel searchPanel; + private ActionListener comboSupportTypesListener; + private GuiReaderSearchByPanel searchPanel; private boolean seeWordcount; private GuiReaderGroup books; @@ -53,59 +53,65 @@ public class GuiReaderSearchFrame extends JFrame { maxPage = -1; supportTypes = new ArrayList(); + supportTypes.add(null); for (SupportType type : SupportType.values()) { if (BasicSearchable.getSearchable(type) != null) { supportTypes.add(type); } } - supportType = supportTypes.isEmpty() ? null : supportTypes.get(0); comboSupportTypes = new JComboBox( supportTypes.toArray(new SupportType[] {})); - comboSupportTypes.addActionListener(new ActionListener() { + + comboSupportTypesListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - setWaitingScreen(true); - updateSupportType( - (SupportType) comboSupportTypes.getSelectedItem(), - new Runnable() { - @Override - public void run() { - setWaitingScreen(false); - } - }); + final SupportType support = (SupportType) comboSupportTypes + .getSelectedItem(); + setWaiting(true); + new Thread(new Runnable() { + @Override + public void run() { + try { + updateSupportType(support); + } finally { + setWaiting(false); + } + } + }).start(); } - }); + }; + comboSupportTypes.addActionListener(comboSupportTypesListener); + JPanel searchSites = new JPanel(new BorderLayout()); searchSites.add(comboSupportTypes, BorderLayout.CENTER); searchSites.add(new JLabel(" " + "Website : "), BorderLayout.WEST); - searchPanel = new GuiReaderSearchByNamePanel(supportType, - new Runnable() { + searchPanel = new GuiReaderSearchByPanel( + new GuiReaderSearchByPanel.Waitable() { @Override - public void run() { - setWaitingScreen(false); + public void setWaiting(boolean waiting) { + GuiReaderSearchFrame.this.setWaiting(waiting); } - }); - searchPanel.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - updateMaxPage(searchPanel.getMaxPage()); - List infos = new ArrayList(); - for (MetaData meta : searchPanel.getStories()) { - infos.add(GuiReaderBookInfo.fromMeta(meta)); - } + @Override + public void fireEvent() { + updatePages(searchPanel.getPage(), + searchPanel.getMaxPage()); + List infos = new ArrayList(); + for (MetaData meta : searchPanel.getStories()) { + infos.add(GuiReaderBookInfo.fromMeta(meta)); + } - updateBooks(infos); + updateBooks(infos); - // ! 1-based index ! - int item = searchPanel.getStoryItem(); - if (item > 0 && item <= books.getBooksCount()) { - // TODO: "click" on item ITEM - } - } - }); + // ! 1-based index ! + int item = searchPanel.getStoryItem(); + if (item > 0 && item <= books.getBooksCount()) { + books.setSelectedBook(item - 1, false); + } + } + }); JPanel top = new JPanel(new BorderLayout()); top.add(searchSites, BorderLayout.NORTH); @@ -133,98 +139,137 @@ public class GuiReaderSearchFrame extends JFrame { JScrollPane scroll = new JScrollPane(books); scroll.getVerticalScrollBar().setUnitIncrement(16); add(scroll, BorderLayout.CENTER); - - setWaitingScreen(true); } - private void updateSupportType(SupportType supportType, Runnable inUi) { - if (supportType != this.supportType) { - this.supportType = supportType; - comboSupportTypes.setSelectedItem(supportType); - books.clear(); - searchPanel.setSupportType(supportType, inUi); - } - } - - private void updatePage(final int page) { + /** + * Update the {@link SupportType} currently displayed to the user. + *

+ * Will also cause a search for the new base tags of the given support if + * not NULL. + *

+ * This operation can be long and should be run outside the UI thread. + * + * @param supportType + * the new {@link SupportType} + */ + private void updateSupportType(final SupportType supportType) { inUi(new Runnable() { @Override public void run() { - GuiReaderSearchFrame.this.page = page; + books.clear(); + + comboSupportTypes + .removeActionListener(comboSupportTypesListener); + comboSupportTypes.setSelectedItem(supportType); + comboSupportTypes.addActionListener(comboSupportTypesListener); - // TODO: gui - System.out.println("page: " + page); } }); + + searchPanel.setSupportType(supportType); } - private void updateMaxPage(final int maxPage) { + /** + * Update the pages and the lined buttons currently displayed on screen. + *

+ * Those are the same pages and maximum pages used by + * {@link GuiReaderSearchByPanel#search(String, int, int)} and + * {@link GuiReaderSearchByPanel#searchTag(SearchableTag, int, int)}. + * + * @param page + * the current page of results + * @param maxPage + * the maximum number of pages of results + */ + private void updatePages(final int page, final int maxPage) { inUi(new Runnable() { @Override public void run() { + GuiReaderSearchFrame.this.page = page; GuiReaderSearchFrame.this.maxPage = maxPage; // TODO: gui + System.out.println("page: " + page); System.out.println("max page: " + maxPage); } }); } + /** + * Update the currently displayed books. + * + * @param infos + * the new books + */ private void updateBooks(final List infos) { - setWaitingScreen(true); inUi(new Runnable() { @Override public void run() { books.refreshBooks(infos, seeWordcount); - setWaitingScreen(false); } }); } - // item 0 = no selection, else = default selection + /** + * Search for the given terms on the currently selected searchable. This + * will update the displayed books if needed. + *

+ * This operation is asynchronous. + * + * @param keywords + * the keywords to search for + * @param page + * the page of results to load + * @param item + * the item to select (or 0 for none by default) + */ public void search(final SupportType searchOn, final String keywords, final int page, final int item) { - - setWaitingScreen(true); - - searchPanel.setSupportType(searchOn, new Runnable() { + setWaiting(true); + new Thread(new Runnable() { @Override public void run() { - if (keywords != null) { - setWaitingScreen(true); - searchPanel.search(keywords, page, item, new Runnable() { - @Override - public void run() { - updateMaxPage(searchPanel.getMaxPage()); - updatePage(page); - setWaitingScreen(false); - } - }); + try { + updateSupportType(searchOn); + searchPanel.search(keywords, page, item); + } finally { + setWaiting(false); } } - }); + }).start(); } - // tag: null = base tags + /** + * Search for the given tag on the currently selected searchable. This will + * update the displayed books if needed. + *

+ * If the tag contains children tags, those will be displayed so you can + * select them; if the tag is a leaf tag, the linked stories will be + * displayed. + *

+ * This operation is asynchronous. + * + * @param tag + * the tag to search for, or NULL for base tags + * @param page + * the page of results to load + * @param item + * the item to select (or 0 for none by default) + */ public void searchTag(final SupportType searchOn, final int page, final int item, final SearchableTag tag) { - - setWaitingScreen(true); - - searchPanel.setSupportType(searchOn, new Runnable() { + setWaiting(true); + new Thread(new Runnable() { @Override public void run() { - setWaitingScreen(true); - searchPanel.searchTag(tag, page, item, new Runnable() { - @Override - public void run() { - updateMaxPage(searchPanel.getMaxPage()); - updatePage(page); - setWaitingScreen(false); - } - }); + try { + updateSupportType(searchOn); + searchPanel.searchTag(tag, page, item); + } finally { + setWaiting(false); + } } - }); + }).start(); } /** @@ -252,21 +297,55 @@ public class GuiReaderSearchFrame extends JFrame { } } + /** + * An error occurred, inform the user and/or log the error. + * + * @param e + * the error + */ static void error(Exception e) { Instance.getTraceHandler().error(e); } + /** + * An error occurred, inform the user and/or log the error. + * + * @param e + * the error message + */ static void error(String e) { Instance.getTraceHandler().error(e); } - private void setWaitingScreen(final boolean waiting) { + /** + * Enables or disables this component, depending on the value of the + * parameter b. An enabled component can respond to user input + * and generate events. Components are enabled initially by default. + *

+ * Disabling this component will also affect its children. + * + * @param b + * If true, this component is enabled; otherwise + * this component is disabled + */ + @Override + public void setEnabled(boolean b) { + super.setEnabled(b); + books.setEnabled(b); + searchPanel.setEnabled(b); + } + + /** + * Set the item in wait mode, blocking it from accepting UI input. + * + * @param waiting + * TRUE for wait more, FALSE to restore normal mode + */ + private void setWaiting(final boolean waiting) { inUi(new Runnable() { @Override public void run() { GuiReaderSearchFrame.this.setEnabled(!waiting); - books.setEnabled(!waiting); - searchPanel.setEnabled(!waiting); } }); }