tui: better error messages
[fanfix.git] / src / be / nikiroo / fanfix / reader / tui / TuiReaderApplication.java
index 7dc1fd5919609b64e33e88466318f668ee9ba336..56f0dc294338a0c6c1b8b0d2d63d440226df4e90 100644 (file)
@@ -4,12 +4,14 @@ import java.awt.Toolkit;
 import java.awt.datatransfer.DataFlavor;
 import java.io.IOException;
 import java.net.URL;
+import java.net.UnknownHostException;
 
 import jexer.TApplication;
 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;
@@ -37,6 +39,9 @@ class TuiReaderApplication extends TApplication implements Reader {
        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;
 
@@ -71,9 +76,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());
@@ -149,7 +154,7 @@ class TuiReaderApplication extends TApplication implements Reader {
         */
        public TStatusBar setStatusBar(TWindow window, String description) {
                TStatusBar statusBar = window.newStatusBar(description);
-               statusBar.addShortcutKeypress(TKeypress.kbF10, TCommand.cmExit, "Exit");
+               statusBar.addShortcutKeypress(TKeypress.kbF10, CMD_EXIT, "Exit");
                return statusBar;
 
        }
@@ -176,6 +181,7 @@ class TuiReaderApplication extends TApplication implements Reader {
                        } else {
                                main.setSource(source);
                        }
+                       main.maximize();
                }
        }
 
@@ -215,11 +221,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(); // TODO: exit(false) for "no confirm box"
-                       }
-
+                       close(this);
                        return true;
                case MENU_IMPORT_URL:
                        String clipboard = "";
@@ -238,28 +240,38 @@ class TuiReaderApplication extends TApplication implements Reader {
                        String url = inputBox("Import story", "URL to import", clipboard)
                                        .getText();
 
-                       if (!imprt(url)) {
-                               // TODO: bad import
+                       try {
+                               if (!imprt(url)) {
+                                       // TODO: i18n + error
+                                       error("URK not supported: " + url, "Import error");
+                               }
+                       } catch (IOException e) {
+                               // TODO: i18n + error
+                               error("Fail to import URL: " + url, "Import error", e);
                        }
 
                        return true;
                case MENU_IMPORT_FILE:
+                       String filename = null;
                        try {
-                               String filename = fileOpenBox(".");
+                               filename = fileOpenBox(".");
                                if (!imprt(filename)) {
-                                       // TODO: bad import
+                                       // TODO: i18n + error
+                                       error("File not supported: " + filename, "Import error");
                                }
                        } catch (IOException e) {
-                               // TODO: bad file
-                               e.printStackTrace();
+                               // TODO: i18n + error
+                               error("Fail to import file"
+                                               + (filename == null ? "" : ": " + filename),
+                                               "Import error", e);
                        }
-
                        return true;
                case MENU_LIBRARY:
                        try {
                                showMain(meta, source, useMeta);
                        } catch (IOException e) {
-                               e.printStackTrace();
+                               // i18n
+                               error("Cannot show the library", "ERROR", e);
                        }
 
                        return true;
@@ -268,12 +280,24 @@ class TuiReaderApplication extends TApplication implements Reader {
                return super.onMenu(menu);
        }
 
-       private boolean imprt(String url) {
+       /**
+        * Import the given url.
+        * <p>
+        * Can fail if the host is not supported.
+        * 
+        * @param url
+        * 
+        * @return TRUE in case of success, FALSE if the host is not supported
+        * 
+        * @throws IOException
+        *             in case of I/O error
+        */
+       private boolean imprt(String url) throws IOException {
                try {
                        reader.getLibrary().imprt(BasicReader.getUrl(url), null);
                        main.refreshStories();
                        return true;
-               } catch (IOException e) {
+               } catch (UnknownHostException e) {
                        return false;
                }
        }
@@ -282,4 +306,70 @@ class TuiReaderApplication extends TApplication implements Reader {
        public void openExternal(BasicLibrary lib, String luid) throws IOException {
                reader.openExternal(lib, luid);
        }
+
+       /**
+        * Display an error message and log it.
+        * 
+        * @param message
+        *            the message
+        * @param title
+        *            the title of the error message
+        */
+       private void error(String message, String title) {
+               error(message, title, null);
+       }
+
+       /**
+        * Display an error message and log it, including the linked
+        * {@link Exception}.
+        * 
+        * @param message
+        *            the message
+        * @param title
+        *            the title of the error message
+        * @param e
+        *            the exception to log if any (can be NULL)
+        */
+       private void error(String message, String title, Exception e) {
+               Instance.getTraceHandler().error(title + ": " + message);
+               if (e != null) {
+                       Instance.getTraceHandler().error(e);
+               }
+
+               if (e != null) {
+                       messageBox(title, message //
+                                       + "\n" + e.getMessage());
+               } else {
+                       messageBox(title, message);
+               }
+       }
+
+       /**
+        * 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();
+               }
+       }
 }