package be.nikiroo.fanfix.reader;
import java.awt.Desktop;
import java.awt.EventQueue;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import javax.swing.JEditorPane;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import be.nikiroo.fanfix.Instance;
import be.nikiroo.fanfix.Library;
import be.nikiroo.fanfix.VersionCheck;
import be.nikiroo.fanfix.bundles.UiConfig;
import be.nikiroo.fanfix.data.Story;
import be.nikiroo.fanfix.output.BasicOutput.OutputType;
import be.nikiroo.utils.Progress;
import be.nikiroo.utils.Version;
import be.nikiroo.utils.ui.UIUtils;
class LocalReader extends BasicReader {
static private boolean nativeLookLoaded;
private Library localLibrary;
public LocalReader() throws IOException {
if (!nativeLookLoaded) {
UIUtils.setLookAndFeel();
nativeLookLoaded = true;
}
File dir = Instance.getReaderDir();
dir.mkdirs();
if (!dir.exists()) {
throw new IOException(
"Cannote create cache directory for local reader: " + dir);
}
OutputType text = null;
OutputType images = null;
try {
text = OutputType.valueOfNullOkUC(Instance.getUiConfig().getString(
UiConfig.NON_IMAGES_DOCUMENT_TYPE));
if (text == null) {
text = OutputType.HTML;
}
images = OutputType.valueOfNullOkUC(Instance.getUiConfig()
.getString(UiConfig.IMAGES_DOCUMENT_TYPE));
if (images == null) {
images = OutputType.CBZ;
}
} catch (Exception e) {
UiConfig key = (text == null) ? UiConfig.NON_IMAGES_DOCUMENT_TYPE
: UiConfig.IMAGES_DOCUMENT_TYPE;
String value = Instance.getUiConfig().getString(key);
throw new IOException(
String.format(
"The configuration option %s is not valid: %s",
key, value), e);
}
localLibrary = new Library(dir, text, images);
}
@Override
public void read() throws IOException {
if (getStory() == null) {
throw new IOException("No story to read");
}
open(getStory().getMeta().getLuid(), null);
}
@Override
public void read(int chapter) throws IOException {
// TODO: show a special page?
read();
}
/**
* Import the story into the local reader library, and keep the same LUID.
*
* @param luid
* the Library UID
* @param pg
* the optional progress reporter
*
* @throws IOException
* in case of I/O error
*/
public void imprt(String luid, Progress pg) throws IOException {
Progress pgGetStory = new Progress();
Progress pgSave = new Progress();
if (pg != null) {
pg.setMax(2);
pg.addProgress(pgGetStory, 1);
pg.addProgress(pgSave, 1);
}
try {
Story story = Instance.getLibrary().getStory(luid, pgGetStory);
if (story != null) {
story = localLibrary.save(story, luid, pgSave);
} else {
throw new IOException("Cannot find story in Library: " + luid);
}
} catch (IOException e) {
throw new IOException(
"Cannot import story from library to LocalReader library: "
+ luid, e);
}
}
/**
* Check if the {@link Story} denoted by this Library UID is present in the
* {@link LocalReader} cache.
*
* @param luid
* the Library UID
*
* @return TRUE if it is
*/
public boolean isCached(String luid) {
return localLibrary.getInfo(luid) != null;
}
@Override
public void browse(String type) {
// TODO: improve presentation of update message
final VersionCheck updates = VersionCheck.check();
StringBuilder builder = new StringBuilder();
final JEditorPane updateMessage = new JEditorPane("text/html", "");
if (updates.isNewVersionAvailable()) {
builder.append("A new version of the program is available at https://github.com/nikiroo/fanfix/releases");
builder.append("
");
builder.append("
");
for (Version v : updates.getNewer()) {
builder.append("\tVersion " + v + "");
builder.append("
");
builder.append("