TUI: update (most menu functions working)
[fanfix.git] / src / be / nikiroo / fanfix / reader / TuiReaderApplication.java
index 94ecfd52104b636e6ad2a4af5bd6c77541403afb..384919ae2e2d067380e788b7e8d46917cf3cacea 100644 (file)
 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.Instance.SyserrHandler;
+import be.nikiroo.fanfix.Instance.TraceHandler;
 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.
+ * <p>
+ * 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<MetaData> stories, BasicReader reader)
-                       throws Exception {
-               this(stories, reader, guessBackendType());
+       @Override
+       public MetaData getMeta() {
+               return reader.getMeta();
        }
 
-       public TuiReaderApplication(List<MetaData> 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();
+               // Do not allow traces/debug to pollute the screen:
+               Instance.setSyserrHandler(new SyserrHandler() {
+                       @Override
+                       public void notify(Exception e, boolean showDetails) {
+                               // TODO
+                       }
+               });
+
+               Instance.setTraceHandler(new TraceHandler() {
+                       @Override
+                       public void trace(String message) {
+                               // TODO
+                       }
+               });
+               //
+
+               // 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
                        }
-                       return;
+
+                       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 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;
                }
        }
 }