wip
[fanfix.git] / src / be / nikiroo / fanfix / reader / tui / TuiReaderApplication.java
index 9e991e4c743e7f31b24f0fee0f7370fd52476d03..89034e485c5f9b6ff79f3d1d4b40c8994e505956 100644 (file)
@@ -10,6 +10,7 @@ import jexer.TCommand;
 import jexer.TKeypress;
 import jexer.TMessageBox;
 import jexer.TStatusBar;
+import jexer.TWidget;
 import jexer.TWindow;
 import jexer.event.TMenuEvent;
 import jexer.menu.TMenu;
@@ -34,34 +35,34 @@ class TuiReaderApplication extends TApplication implements Reader {
        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;
+       public static final int MENU_LIBRARY = 1029;
+       public static final int MENU_EXIT = 1030;
+
+       public static final TCommand CMD_EXIT = new TCommand(MENU_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);
 
-               MetaData meta = getMeta();
-
-               main = new TuiReaderMainWindow(this);
-               main.setMeta(meta);
-               if (meta != null) {
-                       read();
-               }
+               showMain(getMeta(), null, true);
        }
 
        public TuiReaderApplication(Reader reader, String source,
                        TApplication.BackendType backend) throws Exception {
                super(backend);
-
                init(reader);
 
-               main = new TuiReaderMainWindow(this);
-               main.setSource(source);
+               showMain(null, source, false);
        }
 
        @Override
@@ -74,9 +75,9 @@ class TuiReaderApplication extends TApplication implements Reader {
 
                // TODO: open in editor + external option
                if (!meta.isImageDocument()) {
-                       @SuppressWarnings("unused")
-                       Object discard = new TuiReaderStoryWindow(this, getLibrary(), meta,
+                       TWindow window = new TuiReaderStoryWindow(this, getLibrary(), meta,
                                        getChapter());
+                       window.maximize();
                } else {
                        try {
                                openExternal(getLibrary(), meta.getLuid());
@@ -137,6 +138,52 @@ class TuiReaderApplication extends TApplication implements Reader {
                reader.setChapter(chapter);
        }
 
+       /**
+        * Set the default status bar when this window appear.
+        * <p>
+        * Some shortcuts are always visible, and will be put here.
+        * <p>
+        * Note that shortcuts placed this way on menu won't work unless the menu
+        * also implement them.
+        * 
+        * @param window
+        *            the new window or menu on screen
+        * @param description
+        *            the description to show on the status ba
+        */
+       public TStatusBar setStatusBar(TWindow window, String description) {
+               TStatusBar statusBar = window.newStatusBar(description);
+               statusBar.addShortcutKeypress(TKeypress.kbF10, CMD_EXIT, "Exit");
+               return statusBar;
+
+       }
+
+       private void showMain(MetaData meta, String source, boolean useMeta)
+                       throws IOException {
+               // TODO: thread-safety
+               this.meta = meta;
+               this.source = source;
+               this.useMeta = useMeta;
+
+               if (main != null && main.isVisible()) {
+                       main.activate();
+               } else {
+                       if (main != null) {
+                               main.close();
+                       }
+                       main = new TuiReaderMainWindow(this);
+                       if (useMeta) {
+                               main.setMeta(meta);
+                               if (meta != null) {
+                                       read();
+                               }
+                       } else {
+                               main.setSource(source);
+                       }
+                       main.maximize();
+               }
+       }
+
        private void init(Reader reader) {
                this.reader = reader;
 
@@ -152,12 +199,12 @@ class TuiReaderApplication extends TApplication implements Reader {
                fileMenu.addItem(MENU_IMPORT_URL, "Import &URL...");
                fileMenu.addItem(MENU_IMPORT_FILE, "Import &file...");
                fileMenu.addSeparator();
+               fileMenu.addItem(MENU_LIBRARY, "Lib&rary");
+               fileMenu.addSeparator();
                fileMenu.addItem(MENU_EXIT, "E&xit");
 
-               TStatusBar statusBar = fileMenu.newStatusBar("File-management "
+               setStatusBar(fileMenu, "File-management "
                                + "commands (Open, Save, Print, etc.)");
-               // TODO: doesn't actually work:
-               statusBar.addShortcutKeypress(TKeypress.kbF10, TCommand.cmExit, "Exit");
 
                // TODO: Edit: re-download, delete
 
@@ -173,11 +220,7 @@ class TuiReaderApplication extends TApplication implements Reader {
                // TODO: i18n
                switch (menu.getId()) {
                case MENU_EXIT:
-                       if (messageBox("Confirmation", "(TODO: i18n) Exit application?",
-                                       TMessageBox.Type.YESNO).getResult() == TMessageBox.Result.YES) {
-                               // exit(false);
-                       }
-
+                       close(this);
                        return true;
                case MENU_IMPORT_URL:
                        String clipboard = "";
@@ -212,6 +255,14 @@ class TuiReaderApplication extends TApplication implements Reader {
                                e.printStackTrace();
                        }
 
+                       return true;
+               case MENU_LIBRARY:
+                       try {
+                               showMain(meta, source, useMeta);
+                       } catch (IOException e) {
+                               e.printStackTrace();
+                       }
+
                        return true;
                }
 
@@ -232,4 +283,33 @@ class TuiReaderApplication extends TApplication implements Reader {
        public void openExternal(BasicLibrary lib, String luid) throws IOException {
                reader.openExternal(lib, luid);
        }
+
+       /**
+        * Ask the user and, if confirmed, close the {@link TApplication} this
+        * {@link TWidget} is running on.
+        * <p>
+        * This should result in the program terminating.
+        * 
+        * @param widget
+        *            the {@link TWidget}
+        */
+       static public void close(TWidget widget) {
+               close(widget.getApplication());
+       }
+
+       /**
+        * Ask the user and, if confirmed, close the {@link TApplication}.
+        * <p>
+        * This should result in the program terminating.
+        * 
+        * @param app
+        *            the {@link TApplication}
+        */
+       static void close(TApplication app) {
+               // TODO: i18n
+               if (app.messageBox("Confirmation", "(TODO: i18n) Exit application?",
+                               TMessageBox.Type.YESNO).getResult() == TMessageBox.Result.YES) {
+                       app.exit();
+               }
+       }
 }