X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix_swing%2FActions.java;h=5df9b2eb84f64894d15bc8c98aba84eed9096a63;hb=af9d85e2a5024f9d408b5aa1cd236527e9562183;hp=dedf4bad4883dfc9a4f716d14b6ffb9c2c45fd2b;hpb=3cdf3fd8a60d22a592e1cd0634cb108faa1f5f9f;p=fanfix.git diff --git a/src/be/nikiroo/fanfix_swing/Actions.java b/src/be/nikiroo/fanfix_swing/Actions.java index dedf4ba..5df9b2e 100644 --- a/src/be/nikiroo/fanfix_swing/Actions.java +++ b/src/be/nikiroo/fanfix_swing/Actions.java @@ -2,28 +2,41 @@ package be.nikiroo.fanfix_swing; import java.awt.BorderLayout; import java.awt.Container; +import java.awt.Toolkit; import java.awt.Window; +import java.awt.datatransfer.DataFlavor; import java.io.File; import java.io.IOException; +import java.net.URL; +import java.net.UnknownHostException; import javax.swing.JDialog; +import javax.swing.JFileChooser; import javax.swing.JLabel; +import javax.swing.JOptionPane; import javax.swing.SwingWorker; import be.nikiroo.fanfix.Instance; +import be.nikiroo.fanfix.bundles.StringIdGui; import be.nikiroo.fanfix.bundles.UiConfig; import be.nikiroo.fanfix.data.MetaData; import be.nikiroo.fanfix.data.Story; import be.nikiroo.fanfix.library.BasicLibrary; +import be.nikiroo.fanfix.library.LocalLibrary; +import be.nikiroo.fanfix.reader.BasicReader; +import be.nikiroo.fanfix_swing.gui.utils.UiHelper; +import be.nikiroo.utils.Progress; public class Actions { - static public void openExternal(final BasicLibrary lib, MetaData meta, Container parent, final Runnable onDone) { - while (!(parent instanceof Window) && parent != null) { - parent = parent.getParent(); + static public void openExternal(final BasicLibrary lib, MetaData meta, final Container parent, + final Runnable onDone) { + Container parentWindow = parent; + while (!(parentWindow instanceof Window) && parentWindow != null) { + parentWindow = parentWindow.getParent(); } // TODO: UI - final JDialog wait = new JDialog((Window) parent); + final JDialog wait = new JDialog((Window) parentWindow); wait.setTitle("Opening story"); wait.setSize(400, 300); wait.setLayout(new BorderLayout()); @@ -65,10 +78,11 @@ public class Actions { @Override protected void done() { try { + get(); openExternal(target, isImageDocument); - } catch (IOException e) { - // TODO: error? - e.printStackTrace(); + } catch (Exception e) { + // TODO: i18n + UiHelper.error(parent, e.getLocalizedMessage(), "Cannot open the story", e); } synchronized (waitLock) { @@ -151,4 +165,102 @@ public class Actions { } } } + + /** + * Import a {@link Story} into the main {@link LocalLibrary}. + *

+ * Should be called inside the UI thread. + * + * @param askUrl TRUE for an {@link URL}, false for a {@link File} + */ + static public void imprt(final Container parent, boolean askUrl, final Runnable onSuccess) { + JFileChooser fc = new JFileChooser(); + + Object url; + if (askUrl) { + 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.startsWith("https://"))) { + clipboard = ""; + } + + url = JOptionPane.showInputDialog(parent, + Instance.getInstance().getTransGui().getString(StringIdGui.SUBTITLE_IMPORT_URL), + Instance.getInstance().getTransGui().getString(StringIdGui.TITLE_IMPORT_URL), + JOptionPane.QUESTION_MESSAGE, null, null, clipboard); + } else if (fc.showOpenDialog(parent) != JFileChooser.CANCEL_OPTION) { + url = fc.getSelectedFile().getAbsolutePath(); + } else { + url = null; + } + + if (url != null && !url.toString().isEmpty()) { + imprt(parent, url.toString(), null, null); + } + } + + /** + * Actually import the {@link Story} into the main {@link LocalLibrary}. + *

+ * Should be called inside the UI thread. + * + * @param url the {@link Story} to import by {@link URL} + * @param onSuccess Action to execute on success + * @param onSuccessPgName the name to use for the onSuccess progress bar + */ + static public void imprt(final Container parent, final String url, final Runnable onSuccess, + String onSuccessPgName) { + final Progress pg = new Progress(); + final Progress pgImprt = new Progress(); + final Progress pgOnSuccess = new Progress(onSuccessPgName); + pg.addProgress(pgImprt, 95); + pg.addProgress(pgOnSuccess, 5); + + new SwingWorker() { + @Override + protected Void doInBackground() throws Exception { + Exception ex = null; + MetaData meta = null; + try { + meta = Instance.getInstance().getLibrary().imprt(BasicReader.getUrl(url), pgImprt); + } catch (IOException e) { + e.printStackTrace(); + ex = e; + } + + final Exception e = ex; + + final boolean ok = (e == null); + + pgOnSuccess.setProgress(0); + if (!ok) { + if (e instanceof UnknownHostException) { + UiHelper.error(parent, + Instance.getInstance().getTransGui().getString(StringIdGui.ERROR_URL_NOT_SUPPORTED, + url), + Instance.getInstance().getTransGui().getString(StringIdGui.TITLE_ERROR), null); + } else { + UiHelper.error(parent, + Instance.getInstance().getTransGui().getString(StringIdGui.ERROR_URL_IMPORT_FAILED, url, + e.getMessage()), + Instance.getInstance().getTransGui().getString(StringIdGui.TITLE_ERROR), e); + } + } else { + if (onSuccess != null) { + onSuccess.run(); + } + } + pgOnSuccess.done(); + + return null; + } + }.execute(); + } }