Fix the traces handler system
[nikiroo-utils.git] / src / be / nikiroo / fanfix / reader / TuiReaderApplication.java
CommitLineData
c1873e56
NR
1package be.nikiroo.fanfix.reader;
2
e2d017a3
NR
3import java.awt.Toolkit;
4import java.awt.datatransfer.DataFlavor;
c1873e56 5import java.io.IOException;
6322ab64 6import java.net.URL;
c1873e56
NR
7
8import jexer.TApplication;
e2d017a3
NR
9import jexer.TCommand;
10import jexer.TKeypress;
c1873e56 11import jexer.TMessageBox;
e2d017a3 12import jexer.TStatusBar;
6322ab64 13import jexer.TWindow;
e2d017a3
NR
14import jexer.event.TMenuEvent;
15import jexer.menu.TMenu;
a8209dd0 16import be.nikiroo.fanfix.Instance;
c1873e56 17import be.nikiroo.fanfix.data.MetaData;
6322ab64
NR
18import be.nikiroo.fanfix.data.Story;
19import be.nikiroo.fanfix.library.BasicLibrary;
6322ab64 20import be.nikiroo.utils.Progress;
c1873e56 21
6322ab64 22/**
bc2ea776
NR
23 * Manages the TUI general mode and links and manages the {@link TWindow}s.
24 * <p>
25 * It will also enclose a {@link Reader} and simply handle the reading part
26 * differently (it will create the required sub-windows and display them).
6322ab64
NR
27 *
28 * @author niki
29 */
30class TuiReaderApplication extends TApplication implements Reader {
e2d017a3
NR
31 public static final int MENU_OPEN = 1025;
32 public static final int MENU_IMPORT_URL = 1026;
33 public static final int MENU_IMPORT_FILE = 1027;
34 public static final int MENU_EXPORT = 1028;
35 public static final int MENU_EXIT = 1029;
36
6322ab64 37 private Reader reader;
e2d017a3 38 private TuiReaderMainWindow main;
c1873e56 39
bc2ea776
NR
40 // start reading if meta present
41 public TuiReaderApplication(Reader reader, BackendType backend)
42 throws Exception {
43 super(backend);
44 init(reader);
c1873e56 45
bc2ea776 46 MetaData meta = getMeta();
c1873e56 47
e2d017a3
NR
48 main = new TuiReaderMainWindow(this);
49 main.setMeta(meta);
bc2ea776
NR
50 if (meta != null) {
51 read();
52 }
6322ab64
NR
53 }
54
e2d017a3 55 public TuiReaderApplication(Reader reader, String source,
bc2ea776 56 TApplication.BackendType backend) throws Exception {
c1873e56 57 super(backend);
e2d017a3 58
bc2ea776 59 init(reader);
c1873e56 60
e2d017a3
NR
61 main = new TuiReaderMainWindow(this);
62 main.setSource(source);
6322ab64 63 }
c1873e56 64
211f7ddb 65 @Override
6322ab64 66 public void read() throws IOException {
bc2ea776 67 MetaData meta = getMeta();
c1873e56 68
bc2ea776
NR
69 if (meta == null) {
70 throw new IOException("No story to read");
71 }
6322ab64 72
c1873e56 73 // TODO: open in editor + external option
b0e88ebd 74 if (!meta.isImageDocument()) {
e2d017a3
NR
75 @SuppressWarnings("unused")
76 Object discard = new TuiReaderStoryWindow(this, getLibrary(), meta,
77 getChapter());
b0e88ebd
NR
78 } else {
79 try {
6322ab64 80 BasicReader.openExternal(getLibrary(), meta.getLuid());
b0e88ebd 81 } catch (IOException e) {
c1873e56 82 messageBox("Error when trying to open the story",
b0e88ebd 83 e.getMessage(), TMessageBox.Type.OK);
c1873e56 84 }
c1873e56
NR
85 }
86 }
6322ab64 87
211f7ddb 88 @Override
bc2ea776
NR
89 public MetaData getMeta() {
90 return reader.getMeta();
91 }
92
211f7ddb 93 @Override
bc2ea776
NR
94 public Story getStory(Progress pg) {
95 return reader.getStory(pg);
6322ab64
NR
96 }
97
211f7ddb 98 @Override
6322ab64
NR
99 public BasicLibrary getLibrary() {
100 return reader.getLibrary();
101 }
102
211f7ddb 103 @Override
bc2ea776 104 public void setLibrary(BasicLibrary lib) {
6322ab64
NR
105 reader.setLibrary(lib);
106 }
107
211f7ddb 108 @Override
bc2ea776
NR
109 public void setMeta(MetaData meta) throws IOException {
110 reader.setMeta(meta);
111 }
112
211f7ddb 113 @Override
bc2ea776
NR
114 public void setMeta(String luid) throws IOException {
115 reader.setMeta(luid);
6322ab64
NR
116 }
117
211f7ddb 118 @Override
bc2ea776
NR
119 public void setMeta(URL source, Progress pg) throws IOException {
120 reader.setMeta(source, pg);
6322ab64
NR
121 }
122
211f7ddb 123 @Override
6322ab64
NR
124 public void browse(String source) {
125 reader.browse(source);
126 }
bc2ea776 127
211f7ddb 128 @Override
bc2ea776
NR
129 public int getChapter() {
130 return reader.getChapter();
131 }
132
211f7ddb 133 @Override
bc2ea776
NR
134 public void setChapter(int chapter) {
135 reader.setChapter(chapter);
136 }
137
138 private void init(Reader reader) {
139 this.reader = reader;
140
581d42c0
NR
141 // TODO: traces/errors?
142 Instance.setTraceHandler(null);
a8209dd0 143
e2d017a3
NR
144 // Add the menus TODO: i18n
145 TMenu fileMenu = addMenu("&File");
146 fileMenu.addItem(MENU_OPEN, "&Open");
147 fileMenu.addItem(MENU_EXPORT, "&Save as...");
148 // TODO: Move to...
149 fileMenu.addSeparator();
150 fileMenu.addItem(MENU_IMPORT_URL, "Import &URL...");
151 fileMenu.addItem(MENU_IMPORT_FILE, "Import &file...");
152 fileMenu.addSeparator();
153 fileMenu.addItem(MENU_EXIT, "E&xit");
154
155 TStatusBar statusBar = fileMenu.newStatusBar("File-management "
156 + "commands (Open, Save, Print, etc.)");
157 // TODO: doesn't actually work:
158 statusBar.addShortcutKeypress(TKeypress.kbF10, TCommand.cmExit, "Exit");
159
160 // TODO: Edit: re-download, delete
161
162 //
163
bc2ea776 164 addWindowMenu();
bc2ea776
NR
165
166 getBackend().setTitle("Fanfix");
167 }
e2d017a3
NR
168
169 @Override
170 protected boolean onMenu(TMenuEvent menu) {
171 // TODO: i18n
172 switch (menu.getId()) {
173 case MENU_EXIT:
174 if (messageBox("Confirmation", "(TODO: i18n) Exit application?",
175 TMessageBox.Type.YESNO).getResult() == TMessageBox.Result.YES) {
581d42c0 176 // exit(false);
e2d017a3
NR
177 }
178
179 return true;
180 case MENU_IMPORT_URL:
181 String clipboard = "";
182 try {
183 clipboard = ("" + Toolkit.getDefaultToolkit()
184 .getSystemClipboard().getData(DataFlavor.stringFlavor))
185 .trim();
186 } catch (Exception e) {
187 // No data will be handled
188 }
189
190 if (clipboard == null || !clipboard.startsWith("http")) {
191 clipboard = "";
192 }
193
194 String url = inputBox("Import story", "URL to import", clipboard)
195 .getText();
196
197 if (!imprt(url)) {
198 // TODO: bad import
199 }
200
201 return true;
202 case MENU_IMPORT_FILE:
203 try {
204 String filename = fileOpenBox(".");
205 if (!imprt(filename)) {
206 // TODO: bad import
207 }
208 } catch (IOException e) {
209 // TODO: bad file
210 e.printStackTrace();
211 }
212
213 return true;
214 }
215
216 return super.onMenu(menu);
217 }
218
219 private boolean imprt(String url) {
220 try {
221 reader.getLibrary().imprt(BasicReader.getUrl(url), null);
222 main.refreshStories();
223 return true;
224 } catch (IOException e) {
225 return false;
226 }
227 }
c1873e56 228}