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;
* @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)
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();
// 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());
});
//
- // 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;
+ }
+ }
}
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
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.
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);
}
}
});
// 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}.
*
* @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();
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);
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