TUI: update (most menu functions working)
authorNiki Roo <niki@nikiroo.be>
Sat, 15 Jul 2017 07:53:45 +0000 (09:53 +0200)
committerNiki Roo <niki@nikiroo.be>
Sat, 15 Jul 2017 07:53:45 +0000 (09:53 +0200)
src/be/nikiroo/fanfix/reader/TuiReader.java
src/be/nikiroo/fanfix/reader/TuiReaderApplication.java
src/be/nikiroo/fanfix/reader/TuiReaderMainWindow.java

index 11640cf506302fddae46d4b07a68b8a1a3cbf1e2..c71cf95f5be244914eda25cd46e4d69493452852 100644 (file)
@@ -1,12 +1,10 @@
 package be.nikiroo.fanfix.reader;
 
 import java.io.IOException;
-import java.util.List;
 
 import jexer.TApplication;
 import jexer.TApplication.BackendType;
 import be.nikiroo.fanfix.Instance;
-import be.nikiroo.fanfix.data.MetaData;
 
 /**
  * This {@link Reader}is based upon the TUI widget library 'jexer'
@@ -62,9 +60,8 @@ class TuiReader extends BasicReader {
 
        @Override
        public void browse(String source) {
-               List<MetaData> metas = getLibrary().getListBySource(source);
                try {
-                       TuiReaderApplication app = new TuiReaderApplication(metas, this,
+                       TuiReaderApplication app = new TuiReaderApplication(this, source,
                                        guessBackendType());
                        new Thread(app).start();
                } catch (Exception e) {
index 3d6a949528630e4733f945eb19724977788c6859..384919ae2e2d067380e788b7e8d46917cf3cacea 100644 (file)
@@ -1,12 +1,18 @@
 package be.nikiroo.fanfix.reader;
 
+import java.awt.Toolkit;
+import java.awt.datatransfer.DataFlavor;
 import java.io.IOException;
 import java.net.URL;
-import java.util.List;
 
 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;
@@ -24,7 +30,14 @@ 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_EXIT = 1029;
+
        private Reader reader;
+       private TuiReaderMainWindow main;
 
        // start reading if meta present
        public TuiReaderApplication(Reader reader, BackendType backend)
@@ -34,22 +47,23 @@ class TuiReaderApplication extends TApplication implements Reader {
 
                MetaData meta = getMeta();
 
-               new TuiReaderMainWindow(this).setMeta(meta);
-
+               main = new TuiReaderMainWindow(this);
+               main.setMeta(meta);
                if (meta != null) {
                        read();
                }
        }
 
-       public TuiReaderApplication(List<MetaData> stories, Reader reader,
+       public TuiReaderApplication(Reader reader, String source,
                        TApplication.BackendType backend) throws Exception {
                super(backend);
+
                init(reader);
 
-               new TuiReaderMainWindow(this).setMetas(stories);
+               main = new TuiReaderMainWindow(this);
+               main.setSource(source);
        }
 
-       @SuppressWarnings("unused")
        @Override
        public void read() throws IOException {
                MetaData meta = getMeta();
@@ -60,7 +74,9 @@ class TuiReaderApplication extends TApplication implements Reader {
 
                // TODO: open in editor + external option
                if (!meta.isImageDocument()) {
-                       new TuiReaderStoryWindow(this, getLibrary(), meta, getChapter());
+                       @SuppressWarnings("unused")
+                       Object discard = new TuiReaderStoryWindow(this, getLibrary(), meta,
+                                       getChapter());
                } else {
                        try {
                                BasicReader.openExternal(getLibrary(), meta.getLuid());
@@ -140,12 +156,88 @@ class TuiReaderApplication extends TApplication implements Reader {
                });
                //
 
-               // Add the menus
-               addFileMenu();
-               addEditMenu();
+               // 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");
        }
+
+       @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 true;
+               }
+
+               return super.onMenu(menu);
+       }
+
+       private boolean imprt(String url) {
+               try {
+                       reader.getLibrary().imprt(BasicReader.getUrl(url), null);
+                       main.refreshStories();
+                       return true;
+               } catch (IOException e) {
+                       return false;
+               }
+       }
 }
index f0765809adb67b303eea69a1a07d3598bd8f3223..f32070cd79128da30f069ee6738f13140e9eba73 100644 (file)
@@ -6,12 +6,15 @@ import java.util.List;
 
 import jexer.TAction;
 import jexer.TCommand;
+import jexer.TFileOpenBox.Type;
 import jexer.TKeypress;
 import jexer.TList;
 import jexer.TWindow;
+import jexer.event.TMenuEvent;
 import be.nikiroo.fanfix.Instance;
 import be.nikiroo.fanfix.data.MetaData;
 import be.nikiroo.fanfix.library.BasicLibrary;
+import be.nikiroo.fanfix.output.BasicOutput.OutputType;
 
 /**
  * The library window, that will list all the (filtered) stories available in
@@ -24,23 +27,7 @@ class TuiReaderMainWindow extends TWindow {
        private List<MetaData> listKeys;
        private List<String> listItems;
        private Reader reader;
-
-       /**
-        * Create a new {@link TuiReaderMainWindow} with the given story in the
-        * list.
-        * 
-        * @param reader
-        *            the reader and main application
-        * @param meta
-        *            the story to display
-        */
-       public TuiReaderMainWindow(TuiReaderApplication reader, MetaData meta) {
-               this(reader);
-
-               List<MetaData> metas = new ArrayList<MetaData>();
-               metas.add(meta);
-               setMetas(metas);
-       }
+       private String source;
 
        /**
         * Create a new {@link TuiReaderMainWindow} without any stories in the list.
@@ -63,8 +50,9 @@ class TuiReaderMainWindow extends TWindow {
                list = addList(listItems, 0, 0, getWidth(), getHeight(), new TAction() {
                        @Override
                        public void DO() {
-                               if (list.getSelectedIndex() >= 0) {
-                                       enterOnStory(listKeys.get(list.getSelectedIndex()));
+                               MetaData meta = getSelectedMeta();
+                               if (meta != null) {
+                                       readStory(meta);
                                }
                        }
                });
@@ -98,6 +86,22 @@ class TuiReaderMainWindow extends TWindow {
                // root.addChild("child 2").addChild("sub child");
        }
 
+       /**
+        * Change the source filter and display all stories matching this source.
+        * 
+        * @param source
+        *            the new source or NULL for all sources
+        */
+       public void setSource(String source) {
+               this.source = source;
+               refreshStories();
+       }
+
+       public void refreshStories() {
+               List<MetaData> metas = reader.getLibrary().getListBySource(source);
+               setMetas(metas);
+       }
+
        /**
         * Update the list of stories displayed in this {@link TWindow}.
         * 
@@ -119,7 +123,7 @@ class TuiReaderMainWindow extends TWindow {
         * @param metas
         *            the new list of stories to display
         */
-       public void setMetas(List<MetaData> metas) {
+       private void setMetas(List<MetaData> metas) {
                listKeys.clear();
                listItems.clear();
 
@@ -133,7 +137,15 @@ class TuiReaderMainWindow extends TWindow {
                list.setList(listItems);
        }
 
-       private void enterOnStory(MetaData meta) {
+       public MetaData getSelectedMeta() {
+               if (list.getSelectedIndex() >= 0) {
+                       return listKeys.get(list.getSelectedIndex());
+               }
+
+               return null;
+       }
+
+       public void readStory(MetaData meta) {
                try {
                        reader.setChapter(-1);
                        reader.setMeta(meta);
@@ -146,4 +158,41 @@ class TuiReaderMainWindow extends TWindow {
        private String desc(MetaData meta) {
                return String.format("%5s: %s", meta.getLuid(), meta.getTitle());
        }
-}
+
+       @Override
+       public void onMenu(TMenuEvent menu) {
+               MetaData meta = getSelectedMeta();
+               if (meta != null) {
+                       switch (menu.getId()) {
+                       case TuiReaderApplication.MENU_OPEN:
+                               readStory(meta);
+
+                               return;
+                       case TuiReaderApplication.MENU_EXPORT:
+
+                               try {
+                                       // TODO: choose type, pg, error
+                                       OutputType outputType = OutputType.EPUB;
+                                       String path = fileOpenBox(".", Type.SAVE);
+                                       reader.getLibrary().export(meta.getLuid(), outputType,
+                                                       path, null);
+                               } catch (IOException e) {
+                                       // TODO
+                                       e.printStackTrace();
+                               }
+
+                               return;
+                       case -1:
+                               try {
+                                       reader.getLibrary().delete(meta.getLuid());
+                               } catch (IOException e) {
+                                       // TODO
+                               }
+
+                               return;
+                       }
+               }
+
+               super.onMenu(menu);
+       }
+}
\ No newline at end of file