- [x] [e-Hentai](https://e-hentai.org/) requested
- [x] Find some FR comics/manga websites
- [ ] Find more FR thingies
+- [ ] Support videos (anime)?
- [x] A GUI library
- [x] Make one
- [x] Make it run when no args passed
if (searchOn == null) {
Instance.getTraceHandler().error(
"Website not known: <" + args[i] + ">");
- exitCode = 255;
+ exitCode = 41;
+ break;
}
if (BasicSearchable.getSearchable(searchOn) == null) {
Instance.getTraceHandler().error(
"Website not supported: " + searchOn);
- exitCode = 255;
+ exitCode = 42;
+ break;
}
} else if (search == null) {
search = args[i];
}
}
- if (exitCode != 255) {
+ if (exitCode == 0) {
switch (action) {
case IMPORT:
exitCode = imprt(urlString, pg);
break;
}
- if (searchOn == null) {
- // TODO: do on reader!!!
- for (SupportType type : SupportType.values()) {
- if (BasicSearchable.getSearchable(type) != null) {
- System.out.println(type);
- }
- }
- } else if (search != null) {
- try {
+ try {
+ if (searchOn == null) {
+ BasicReader.getReader().search(true);
+ } else if (search != null) {
+
BasicReader.getReader().search(searchOn, search, page,
item, true);
- } catch (IOException e1) {
- Instance.getTraceHandler().error(e1);
+ } else {
+ exitCode = 255;
}
- } else {
- exitCode = 255;
+ } catch (IOException e1) {
+ Instance.getTraceHandler().error(e1);
+ exitCode = 20;
}
break;
*/
public void browse(String source);
+ /**
+ * Display all supports that allow search operations.
+ *
+ * @param sync
+ * execute the process synchronously (wait until it is terminated
+ * before returning)
+ *
+ * @throws IOException
+ * in case of I/O error
+ */
+ public void search(boolean sync) throws IOException;
+
/**
* Search for the given terms and find stories that correspond if possible.
*
}
}
+ @Override
+ public void search(boolean sync) throws IOException {
+ for (SupportType type : SupportType.values()) {
+ if (BasicSearchable.getSearchable(type) != null) {
+ System.out.println(type);
+ }
+ }
+ }
+
@Override
public void search(SupportType searchOn, String keywords, int page,
int item, boolean sync) throws IOException {
displayStories(metas);
} else {
// ! 1-based index !
- if (item <= 0 | item > metas.size()) {
+ if (item <= 0 || item > metas.size()) {
throw new IOException("Index out of bounds: " + item);
}
}
}
+ @Override
+ public void search(boolean sync) throws IOException {
+ // TODO
+ if (sync) {
+ throw new java.lang.IllegalStateException("Not implemented yet.");
+ }
+ }
+
@Override
public void search(SupportType searchOn, String keywords, int page,
int item, boolean sync) {
reader.setChapter(chapter);
}
+ @Override
+ public void search(boolean sync) throws IOException {
+ reader.search(sync);
+ }
+
@Override
public void search(SupportType searchOn, String keywords, int page,
int item, boolean sync) throws IOException {
}
@Override
- public void search(SupportType searchOn, String keywords, int page,
- int item, boolean sync) {
+ public void search(boolean sync) throws IOException {
// TODO
if (sync) {
throw new java.lang.IllegalStateException("Not implemented yet.");
}
}
+ @Override
+ public void search(SupportType searchOn, String keywords, int page,
+ int item, boolean sync) {
+ // TODO: add parameters!
+ GuiReaderSearch search = new GuiReaderSearch(this);
+ if (sync) {
+ sync(search);
+ } else {
+ search.setVisible(true);
+ }
+ }
+
@Override
public void searchTag(SupportType searchOn, int page, int item,
boolean sync, Integer... tags) {
searchItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
- reader.search(type, "", 1, 0, false);
+ reader.search(type, null, 1, 0, false);
}
});
search.add(searchItem);
private List<GuiReaderBookInfo> infos;
private List<GuiReaderBook> books;
private JPanel pane;
+ private JLabel titleLabel;
private boolean words; // words or authors (secondary info on books)
private int itemsPerLine;
* the {@link GuiReaderBook} used to probe some information about
* the stories
* @param title
- * the title of this group
+ * the title of this group (can be NULL for "no title", an empty
+ * {@link String} will trigger a default title for empty groups)
* @param backgroundColor
* the background colour to use (or NULL for default)
*/
add(pane, BorderLayout.CENTER);
- if (title != null) {
- if (title.isEmpty()) {
- title = GuiReader.trans(StringIdGui.MENU_AUTHORS_UNKNOWN);
- }
-
- JLabel label = new JLabel();
- label.setText(String.format("<html>"
- + "<body style='text-align: center; color: gray;'><br><b>"
- + "%s" + "</b></body>" + "</html>", title));
- label.setHorizontalAlignment(JLabel.CENTER);
- add(label, BorderLayout.NORTH);
- }
+ titleLabel = new JLabel();
+ titleLabel.setHorizontalAlignment(JLabel.CENTER);
+ add(titleLabel, BorderLayout.NORTH);
+ setTitle(title);
// Compute the number of items per line at each resize
addComponentListener(new ComponentAdapter() {
});
}
+ /**
+ * The title of this group (can be NULL for "no title", an empty
+ * {@link String} will trigger a default title for empty groups)
+ *
+ * @param title
+ * the title or NULL
+ */
+ public void setTitle(String title) {
+ if (title != null) {
+ if (title.isEmpty()) {
+ title = GuiReader.trans(StringIdGui.MENU_AUTHORS_UNKNOWN);
+ }
+
+ titleLabel.setText(String.format("<html>"
+ + "<body style='text-align: center; color: gray;'><br><b>"
+ + "%s" + "</b></body>" + "</html>", title));
+ titleLabel.setVisible(true);
+ } else {
+ titleLabel.setVisible(false);
+ }
+ }
+
/**
* Compute how many items can fit in a line so UP and DOWN can be used to go
* up/down one line at a time.
if (infos != null) {
for (GuiReaderBookInfo info : infos) {
boolean isCached = false;
- if (info.getMeta() != null) {
+ if (info.getMeta() != null && info.getMeta().getLuid() != null) {
isCached = reader.isCached(info.getMeta().getLuid());
}
repaint();
}
+ /**
+ * The number of books in this group.
+ *
+ * @return the count
+ */
+ public int getBooksCount() {
+ return books.size();
+ }
+
/**
* Return the index of the currently selected book if any, -1 if none.
*
* @return the index or -1
*/
- private int getSelectedBookIndex() {
+ public int getSelectedBookIndex() {
int index = -1;
for (int i = 0; i < books.size(); i++) {
if (books.get(i).isSelected()) {
* TRUE to constraint the index to the first/last element, FALSE
* to unselect when outside the range
*/
- private void setSelectedBook(int index, boolean forceRange) {
+ public void setSelectedBook(int index, boolean forceRange) {
int previousIndex = getSelectedBookIndex();
if (index >= books.size()) {
* type, or NULL if it does not exist.
*
* @param type
- * the type, must not be NULL
+ * the type, can be NULL (will just return NULL, since we do not
+ * support it)
*
* @return an implementation that supports it, or NULL
*/
static public BasicSearchable getSearchable(SupportType type) {
BasicSearchable support = null;
- switch (type) {
- case FIMFICTION:
- // TODO
- break;
- case FANFICTION:
- support = new Fanfiction(type);
- break;
- case MANGAFOX:
- // TODO
- break;
- case E621:
- // TODO
- break;
- case YIFFSTAR:
- // TODO
- break;
- case E_HENTAI:
- // TODO
- break;
- case MANGA_LEL:
- support = new MangaLel();
- break;
- case CBZ:
- case HTML:
- case INFO_TEXT:
- case TEXT:
- case EPUB:
- break;
+ if (type != null) {
+ switch (type) {
+ case FIMFICTION:
+ // TODO
+ break;
+ case FANFICTION:
+ support = new Fanfiction(type);
+ break;
+ case MANGAFOX:
+ // TODO
+ break;
+ case E621:
+ // TODO
+ break;
+ case YIFFSTAR:
+ // TODO
+ break;
+ case E_HENTAI:
+ // TODO
+ break;
+ case MANGA_LEL:
+ support = new MangaLel();
+ break;
+ case CBZ:
+ case HTML:
+ case INFO_TEXT:
+ case TEXT:
+ case EPUB:
+ break;
+ }
}
return support;