X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Freader%2Ftui%2FTuiReaderApplication.java;h=f85f12fdb865ec1aaa25540a5cf131d6c6b0e910;hb=d66deb8d8b30cff6b54db352eef34a3508939f84;hp=56f0dc294338a0c6c1b8b0d2d63d440226df4e90;hpb=4f9478dce91ac4771d9d9fb96ae2b09bc04511cc;p=nikiroo-utils.git diff --git a/src/be/nikiroo/fanfix/reader/tui/TuiReaderApplication.java b/src/be/nikiroo/fanfix/reader/tui/TuiReaderApplication.java index 56f0dc2..f85f12f 100644 --- a/src/be/nikiroo/fanfix/reader/tui/TuiReaderApplication.java +++ b/src/be/nikiroo/fanfix/reader/tui/TuiReaderApplication.java @@ -10,9 +10,12 @@ import jexer.TApplication; import jexer.TCommand; import jexer.TKeypress; import jexer.TMessageBox; +import jexer.TMessageBox.Result; +import jexer.TMessageBox.Type; import jexer.TStatusBar; import jexer.TWidget; import jexer.TWindow; +import jexer.event.TCommandEvent; import jexer.event.TMenuEvent; import jexer.menu.TMenu; import be.nikiroo.fanfix.Instance; @@ -21,6 +24,8 @@ import be.nikiroo.fanfix.data.Story; import be.nikiroo.fanfix.library.BasicLibrary; import be.nikiroo.fanfix.reader.BasicReader; import be.nikiroo.fanfix.reader.Reader; +import be.nikiroo.fanfix.reader.tui.TuiReaderMainWindow.Mode; +import be.nikiroo.fanfix.supported.SupportType; import be.nikiroo.utils.Progress; /** @@ -32,61 +37,47 @@ import be.nikiroo.utils.Progress; * @author niki */ class TuiReaderApplication extends TApplication implements Reader { - public static final int MENU_OPEN = 1025; - public static final int MENU_IMPORT_URL = 1026; - public static final int MENU_IMPORT_FILE = 1027; - public static final int MENU_EXPORT = 1028; - public static final int MENU_LIBRARY = 1029; - public static final int MENU_EXIT = 1030; - - public static final TCommand CMD_EXIT = new TCommand(MENU_EXIT) { + public static final int MENU_FILE_OPEN = 1025; + public static final int MENU_FILE_IMPORT_URL = 1026; + public static final int MENU_FILE_IMPORT_FILE = 1027; + public static final int MENU_FILE_EXPORT = 1028; + public static final int MENU_FILE_DELETE = 1029; + public static final int MENU_FILE_LIBRARY = 1030; + public static final int MENU_FILE_EXIT = 1031; + // + public static final int MENU_OPT_FANFIX = 1032; + public static final int MENU_OPT_TUI = 1033; + + + public static final TCommand CMD_EXIT = new TCommand(MENU_FILE_EXIT) { }; private Reader reader; private TuiReaderMainWindow main; - private MetaData meta; - private String source; - private boolean useMeta; - // start reading if meta present public TuiReaderApplication(Reader reader, BackendType backend) throws Exception { super(backend); init(reader); - showMain(getMeta(), null, true); + if (getMeta() != null) { + read(false); + } } public TuiReaderApplication(Reader reader, String source, TApplication.BackendType backend) throws Exception { super(backend); init(reader); - - showMain(null, source, false); + + showMain(); + main.setMode(Mode.SOURCE, source); } @Override - public void read() throws IOException { - MetaData meta = getMeta(); - - if (meta == null) { - throw new IOException("No story to read"); - } - - // TODO: open in editor + external option - if (!meta.isImageDocument()) { - TWindow window = new TuiReaderStoryWindow(this, getLibrary(), meta, - getChapter()); - window.maximize(); - } else { - try { - openExternal(getLibrary(), meta.getLuid()); - } catch (IOException e) { - messageBox("Error when trying to open the story", - e.getMessage(), TMessageBox.Type.OK); - } - } + public void read(boolean sync) throws IOException { + read(getStory(null), sync); } @Override @@ -95,7 +86,7 @@ class TuiReaderApplication extends TApplication implements Reader { } @Override - public Story getStory(Progress pg) { + public Story getStory(Progress pg) throws IOException { return reader.getStory(pg); } @@ -126,7 +117,11 @@ class TuiReaderApplication extends TApplication implements Reader { @Override public void browse(String source) { - reader.browse(source); + try { + reader.browse(source); + } catch (IOException e) { + Instance.getInstance().getTraceHandler().error(e); + } } @Override @@ -139,6 +134,55 @@ class TuiReaderApplication extends TApplication implements Reader { 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 { + reader.search(searchOn, keywords, page, item, sync); + } + + @Override + public void searchTag(SupportType searchOn, int page, int item, + boolean sync, Integer... tags) throws IOException { + reader.searchTag(searchOn, page, item, sync, tags); + } + + /** + * Open the given {@link Story} for reading. This may or may not start an + * external program to read said {@link Story}. + * + * @param story + * the {@link Story} to read + * @param sync + * execute the process synchronously (wait until it is terminated + * before returning) + * + * @throws IOException + * in case of I/O errors + */ + public void read(Story story, boolean sync) throws IOException { + if (story == null) { + throw new IOException("No story to read"); + } + + // TODO: open in editor + external option + if (!story.getMeta().isImageDocument()) { + TWindow window = new TuiReaderStoryWindow(this, story, getChapter()); + window.maximize(); + } else { + try { + openExternal(getLibrary(), story.getMeta().getLuid(), sync); + } catch (IOException e) { + messageBox("Error when trying to open the story", + e.getMessage(), TMessageBox.Type.OK); + } + } + } + /** * Set the default status bar when this window appear. *

@@ -159,13 +203,7 @@ class TuiReaderApplication extends TApplication implements Reader { } - private void showMain(MetaData meta, String source, boolean useMeta) - throws IOException { - // TODO: thread-safety - this.meta = meta; - this.source = source; - this.useMeta = useMeta; - + private void showMain() { if (main != null && main.isVisible()) { main.activate(); } else { @@ -173,14 +211,6 @@ class TuiReaderApplication extends TApplication implements Reader { main.close(); } main = new TuiReaderMainWindow(this); - if (useMeta) { - main.setMeta(meta); - if (meta != null) { - read(); - } - } else { - main.setSource(source); - } main.maximize(); } } @@ -189,23 +219,29 @@ class TuiReaderApplication extends TApplication implements Reader { this.reader = reader; // TODO: traces/errors? - Instance.setTraceHandler(null); + Instance.getInstance().setTraceHandler(null); // Add the menus TODO: i18n TMenu fileMenu = addMenu("&File"); - fileMenu.addItem(MENU_OPEN, "&Open"); - fileMenu.addItem(MENU_EXPORT, "&Save as..."); + fileMenu.addItem(MENU_FILE_OPEN, "&Open..."); + fileMenu.addItem(MENU_FILE_EXPORT, "&Save as..."); + fileMenu.addItem(MENU_FILE_DELETE, "&Delete..."); // TODO: Move to... fileMenu.addSeparator(); - fileMenu.addItem(MENU_IMPORT_URL, "Import &URL..."); - fileMenu.addItem(MENU_IMPORT_FILE, "Import &file..."); + fileMenu.addItem(MENU_FILE_IMPORT_URL, "Import &URL..."); + fileMenu.addItem(MENU_FILE_IMPORT_FILE, "Import &file..."); fileMenu.addSeparator(); - fileMenu.addItem(MENU_LIBRARY, "Lib&rary"); + fileMenu.addItem(MENU_FILE_LIBRARY, "Lib&rary"); fileMenu.addSeparator(); - fileMenu.addItem(MENU_EXIT, "E&xit"); + fileMenu.addItem(MENU_FILE_EXIT, "E&xit"); + + TMenu OptionsMenu = addMenu("&Options"); + OptionsMenu.addItem(MENU_OPT_FANFIX, "&Fanfix Configuration"); + OptionsMenu.addItem(MENU_OPT_TUI, "&UI Configuration"); setStatusBar(fileMenu, "File-management " + "commands (Open, Save, Print, etc.)"); + // TODO: Edit: re-download, delete @@ -216,14 +252,66 @@ class TuiReaderApplication extends TApplication implements Reader { getBackend().setTitle("Fanfix"); } + @Override + protected boolean onCommand(TCommandEvent command) { + if (command.getCmd().equals(TuiReaderMainWindow.CMD_SEARCH)) { + messageBox("title", "caption"); + return true; + } + return super.onCommand(command); + } + @Override protected boolean onMenu(TMenuEvent menu) { // TODO: i18n switch (menu.getId()) { - case MENU_EXIT: + case MENU_FILE_EXIT: close(this); return true; - case MENU_IMPORT_URL: + case MENU_FILE_OPEN: + String openfile = null; + try { + openfile = fileOpenBox("."); + reader.setMeta(BasicReader.getUrl(openfile), null); + read(false); + } catch (IOException e) { + // TODO: i18n + error("Fail to open file" + + (openfile == null ? "" : ": " + openfile), + "Import error", e); + } + + return true; + case MENU_FILE_DELETE: + String luid = null; + String story = null; + MetaData meta = null; + if (main != null) { + meta = main.getSelectedMeta(); + } + if (meta != null) { + luid = meta.getLuid(); + story = luid + ": " + meta.getTitle(); + } + + // TODO: i18n + TMessageBox mbox = messageBox("Delete story", "Delete story \"" + + story + "\"", Type.OKCANCEL); + if (mbox.getResult() == Result.OK) { + try { + reader.getLibrary().delete(luid); + if (main != null) { + main.refreshStories(); + } + } catch (IOException e) { + // TODO: i18n + error("Fail to delete the story: \"" + story + "\"", + "Error", e); + } + } + + return true; + case MENU_FILE_IMPORT_URL: String clipboard = ""; try { clipboard = ("" + Toolkit.getDefaultToolkit() @@ -242,39 +330,42 @@ class TuiReaderApplication extends TApplication implements Reader { try { if (!imprt(url)) { - // TODO: i18n + error + // TODO: i18n error("URK not supported: " + url, "Import error"); } } catch (IOException e) { - // TODO: i18n + error + // TODO: i18n error("Fail to import URL: " + url, "Import error", e); } return true; - case MENU_IMPORT_FILE: + case MENU_FILE_IMPORT_FILE: String filename = null; try { filename = fileOpenBox("."); if (!imprt(filename)) { - // TODO: i18n + error + // TODO: i18n error("File not supported: " + filename, "Import error"); } } catch (IOException e) { - // TODO: i18n + error + // TODO: i18n error("Fail to import file" + (filename == null ? "" : ": " + filename), "Import error", e); } return true; - case MENU_LIBRARY: - try { - showMain(meta, source, useMeta); - } catch (IOException e) { - // i18n - error("Cannot show the library", "ERROR", e); - } - + case MENU_FILE_LIBRARY: + showMain(); + return true; + + case MENU_OPT_FANFIX: + new TuiReaderOptionWindow(this, false).maximize(); return true; + + case MENU_OPT_TUI: + new TuiReaderOptionWindow(this, true).maximize(); + return true; + } return super.onMenu(menu); @@ -303,8 +394,9 @@ class TuiReaderApplication extends TApplication implements Reader { } @Override - public void openExternal(BasicLibrary lib, String luid) throws IOException { - reader.openExternal(lib, luid); + public void openExternal(BasicLibrary lib, String luid, boolean sync) + throws IOException { + reader.openExternal(lib, luid, sync); } /** @@ -331,9 +423,9 @@ class TuiReaderApplication extends TApplication implements Reader { * the exception to log if any (can be NULL) */ private void error(String message, String title, Exception e) { - Instance.getTraceHandler().error(title + ": " + message); + Instance.getInstance().getTraceHandler().error(title + ": " + message); if (e != null) { - Instance.getTraceHandler().error(e); + Instance.getInstance().getTraceHandler().error(e); } if (e != null) {