X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Freader%2FTuiReaderApplication.java;h=c1bba5a8220b49d0dfacdef1cca777a2e31ac5e8;hb=581d42c09b2673025e719a25477565362ebf4482;hp=94ecfd52104b636e6ad2a4af5bd6c77541403afb;hpb=396e924c2cf7e7a6fe41e95a6395c9f9faf401f1;p=nikiroo-utils.git diff --git a/src/be/nikiroo/fanfix/reader/TuiReaderApplication.java b/src/be/nikiroo/fanfix/reader/TuiReaderApplication.java index 94ecfd5..c1bba5a 100644 --- a/src/be/nikiroo/fanfix/reader/TuiReaderApplication.java +++ b/src/be/nikiroo/fanfix/reader/TuiReaderApplication.java @@ -1,75 +1,228 @@ package be.nikiroo.fanfix.reader; +import java.awt.Toolkit; +import java.awt.datatransfer.DataFlavor; import java.io.IOException; -import java.util.List; +import java.net.URL; import jexer.TApplication; +import jexer.TCommand; +import jexer.TKeypress; import jexer.TMessageBox; +import jexer.TStatusBar; +import jexer.TWindow; +import jexer.event.TMenuEvent; +import jexer.menu.TMenu; import be.nikiroo.fanfix.Instance; import be.nikiroo.fanfix.data.MetaData; +import be.nikiroo.fanfix.data.Story; +import be.nikiroo.fanfix.library.BasicLibrary; +import be.nikiroo.utils.Progress; -public class TuiReaderApplication extends TApplication { - private BasicReader reader; +/** + * Manages the TUI general mode and links and manages the {@link TWindow}s. + *

+ * It will also enclose a {@link Reader} and simply handle the reading part + * differently (it will create the required sub-windows and display them). + * + * @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_EXIT = 1029; - private static BackendType guessBackendType() { - // Swing is the default backend on Windows unless explicitly - // overridden by jexer.Swing. - TApplication.BackendType backendType = TApplication.BackendType.XTERM; - if (System.getProperty("os.name").startsWith("Windows")) { - backendType = TApplication.BackendType.SWING; + private Reader reader; + private TuiReaderMainWindow main; + + // start reading if meta present + public TuiReaderApplication(Reader reader, BackendType backend) + throws Exception { + super(backend); + init(reader); + + MetaData meta = getMeta(); + + main = new TuiReaderMainWindow(this); + main.setMeta(meta); + if (meta != null) { + read(); } - if (System.getProperty("os.name").startsWith("Mac")) { - backendType = TApplication.BackendType.SWING; + } + + public TuiReaderApplication(Reader reader, String source, + TApplication.BackendType backend) throws Exception { + super(backend); + + init(reader); + + main = new TuiReaderMainWindow(this); + main.setSource(source); + } + + @Override + public void read() throws IOException { + MetaData meta = getMeta(); + + if (meta == null) { + throw new IOException("No story to read"); } - if (System.getProperty("jexer.Swing") != null) { - if (System.getProperty("jexer.Swing", "false").equals("true")) { - backendType = TApplication.BackendType.SWING; - } else { - backendType = TApplication.BackendType.XTERM; + + // TODO: open in editor + external option + if (!meta.isImageDocument()) { + @SuppressWarnings("unused") + Object discard = new TuiReaderStoryWindow(this, getLibrary(), meta, + getChapter()); + } else { + try { + BasicReader.openExternal(getLibrary(), meta.getLuid()); + } catch (IOException e) { + messageBox("Error when trying to open the story", + e.getMessage(), TMessageBox.Type.OK); } } - return backendType; } - public TuiReaderApplication(List stories, BasicReader reader) - throws Exception { - this(stories, reader, guessBackendType()); + @Override + public MetaData getMeta() { + return reader.getMeta(); } - public TuiReaderApplication(List stories, BasicReader reader, - TApplication.BackendType backend) throws Exception { - super(backend); + @Override + public Story getStory(Progress pg) { + return reader.getStory(pg); + } + + @Override + public BasicLibrary getLibrary() { + return reader.getLibrary(); + } + + @Override + public void setLibrary(BasicLibrary lib) { + reader.setLibrary(lib); + } + + @Override + public void setMeta(MetaData meta) throws IOException { + reader.setMeta(meta); + } + + @Override + public void setMeta(String luid) throws IOException { + reader.setMeta(luid); + } + @Override + public void setMeta(URL source, Progress pg) throws IOException { + reader.setMeta(source, pg); + } + + @Override + public void browse(String source) { + reader.browse(source); + } + + @Override + public int getChapter() { + return reader.getChapter(); + } + + @Override + public void setChapter(int chapter) { + reader.setChapter(chapter); + } + + private void init(Reader reader) { this.reader = reader; - // Add the menus - addFileMenu(); - addEditMenu(); + // TODO: traces/errors? + Instance.setTraceHandler(null); + + // Add the menus TODO: i18n + TMenu fileMenu = addMenu("&File"); + fileMenu.addItem(MENU_OPEN, "&Open"); + fileMenu.addItem(MENU_EXPORT, "&Save as..."); + // TODO: Move to... + fileMenu.addSeparator(); + fileMenu.addItem(MENU_IMPORT_URL, "Import &URL..."); + fileMenu.addItem(MENU_IMPORT_FILE, "Import &file..."); + fileMenu.addSeparator(); + fileMenu.addItem(MENU_EXIT, "E&xit"); + + TStatusBar statusBar = fileMenu.newStatusBar("File-management " + + "commands (Open, Save, Print, etc.)"); + // TODO: doesn't actually work: + statusBar.addShortcutKeypress(TKeypress.kbF10, TCommand.cmExit, "Exit"); + + // TODO: Edit: re-download, delete + + // + addWindowMenu(); - addHelpMenu(); getBackend().setTitle("Fanfix"); - - new TuiReaderMainWindow(this, stories); } - public void open(MetaData meta) { - // TODO: open in editor + external option - if (true) { - if (!meta.isImageDocument()) { - new TuiReaderStoryWindow(this, meta); - } else { - messageBox("Error when trying to open the story", - "Images document not yet supported.", - TMessageBox.Type.OK); + @Override + protected boolean onMenu(TMenuEvent menu) { + // TODO: i18n + switch (menu.getId()) { + case MENU_EXIT: + if (messageBox("Confirmation", "(TODO: i18n) Exit application?", + TMessageBox.Type.YESNO).getResult() == TMessageBox.Result.YES) { + // exit(false); + } + + return true; + case MENU_IMPORT_URL: + String clipboard = ""; + try { + clipboard = ("" + Toolkit.getDefaultToolkit() + .getSystemClipboard().getData(DataFlavor.stringFlavor)) + .trim(); + } catch (Exception e) { + // No data will be handled + } + + if (clipboard == null || !clipboard.startsWith("http")) { + clipboard = ""; + } + + String url = inputBox("Import story", "URL to import", clipboard) + .getText(); + + if (!imprt(url)) { + // TODO: bad import + } + + return true; + case MENU_IMPORT_FILE: + try { + String filename = fileOpenBox("."); + if (!imprt(filename)) { + // TODO: bad import + } + } catch (IOException e) { + // TODO: bad file + e.printStackTrace(); } - return; + + return true; } + + return super.onMenu(menu); + } + + private boolean imprt(String url) { try { - reader.open(meta.getLuid()); + reader.getLibrary().imprt(BasicReader.getUrl(url), null); + main.refreshStories(); + return true; } catch (IOException e) { - messageBox("Error when trying to open the story", e.getMessage(), - TMessageBox.Type.OK); + return false; } } }