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;
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;
// 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());
*/
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;
}
} else {
main.setSource(source);
}
+ main.maximize();
}
}
// 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 = "";
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;
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;
}
}
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();
+ }
+ }
}