X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fde%2Ftodesbaum%2Fjsite%2Fgui%2FProjectInsertPage.java;h=d9ee6c0d78c71ba410c84e92fafd1f8e6e874841;hb=0d836f53d354fa0332c6a955720e6fc67fe0615f;hp=315b89f871909a496025dbd4ad82111069ee4e23;hpb=1996f683a8e4101e7f3d57e2137cc4f22a342f09;p=jSite.git diff --git a/src/de/todesbaum/jsite/gui/ProjectInsertPage.java b/src/de/todesbaum/jsite/gui/ProjectInsertPage.java index 315b89f..d9ee6c0 100644 --- a/src/de/todesbaum/jsite/gui/ProjectInsertPage.java +++ b/src/de/todesbaum/jsite/gui/ProjectInsertPage.java @@ -1,6 +1,5 @@ /* - * jSite - a tool for uploading websites into Freenet - * Copyright (C) 2006 David Roden + * jSite - ProjectInsertPage.java - Copyright © 2006–2012 David Roden * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -34,6 +33,8 @@ import java.awt.event.KeyEvent; import java.text.DateFormat; import java.text.MessageFormat; import java.util.Date; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.swing.AbstractAction; import javax.swing.Action; @@ -46,12 +47,14 @@ import javax.swing.JProgressBar; import javax.swing.JTextField; import javax.swing.SwingUtilities; +import de.todesbaum.jsite.application.AbortedException; import de.todesbaum.jsite.application.Freenet7Interface; import de.todesbaum.jsite.application.InsertListener; import de.todesbaum.jsite.application.Project; import de.todesbaum.jsite.application.ProjectInserter; import de.todesbaum.jsite.i18n.I18n; import de.todesbaum.jsite.i18n.I18nContainer; +import de.todesbaum.util.io.StreamCopier.ProgressListener; import de.todesbaum.util.swing.TWizard; import de.todesbaum.util.swing.TWizardPage; @@ -62,6 +65,9 @@ import de.todesbaum.util.swing.TWizardPage; */ public class ProjectInsertPage extends TWizardPage implements InsertListener, ClipboardOwner { + /** The logger. */ + private static final Logger logger = Logger.getLogger(ProjectInsertPage.class.getName()); + /** The project inserter. */ private ProjectInserter projectInserter; @@ -80,6 +86,15 @@ public class ProjectInsertPage extends TWizardPage implements InsertListener, Cl /** The start time of the insert. */ private long startTime = 0; + /** The number of inserted blocks. */ + private volatile int insertedBlocks; + + /** Whether the “copy URI to clipboard” button was used. */ + private boolean uriCopied; + + /** Whether the insert is currently running. */ + private volatile boolean running = false; + /** * Creates a new progress insert wizard page. * @@ -164,7 +179,7 @@ public class ProjectInsertPage extends TWizardPage implements InsertListener, Cl final JLabel progressLabel = new JLabel(I18n.getMessage("jsite.insert.progress") + ":"); projectInsertPanel.add(progressLabel, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL, new Insets(6, 18, 0, 0), 0, 0)); projectInsertPanel.add(progressBar, new GridBagConstraints(1, 3, 1, 1, 1.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL, new Insets(6, 6, 0, 0), 0, 0)); - projectInsertPanel.add(new JButton(copyURIAction), new GridBagConstraints(0, 4, 2, 1, 0.0, 0.0, GridBagConstraints.LINE_END, GridBagConstraints.NONE, new Insets(6, 18, 0, 0), 0, 0)); + projectInsertPanel.add(new JButton(copyURIAction), new GridBagConstraints(0, 4, 2, 1, 0.0, 0.0, GridBagConstraints.LINE_END, GridBagConstraints.NONE, new Insets(12, 18, 0, 0), 0, 0)); I18nContainer.getInstance().registerRunnable(new Runnable() { @@ -192,7 +207,7 @@ public class ProjectInsertPage extends TWizardPage implements InsertListener, Cl public void pageAdded(TWizard wizard) { this.wizard.setPreviousName(I18n.getMessage("jsite.wizard.previous")); this.wizard.setPreviousEnabled(false); - this.wizard.setNextName(I18n.getMessage("jsite.wizard.next")); + this.wizard.setNextName(I18n.getMessage("jsite.general.cancel")); this.wizard.setQuitName(I18n.getMessage("jsite.wizard.quit")); } @@ -200,23 +215,52 @@ public class ProjectInsertPage extends TWizardPage implements InsertListener, Cl * Starts the insert. */ public void startInsert() { - wizard.setNextEnabled(false); + running = true; copyURIAction.setEnabled(false); progressBar.setValue(0); progressBar.setString(I18n.getMessage("jsite.insert.starting")); progressBar.setFont(progressBar.getFont().deriveFont(Font.PLAIN)); - projectInserter.start(); + projectInserter.start(new ProgressListener() { + + public void onProgress(final long copied, final long length) { + SwingUtilities.invokeLater(new Runnable() { + + /** + * {@inheritDoc} + */ + @SuppressWarnings("synthetic-access") + public void run() { + int divisor = 1; + while (((copied / divisor) > Integer.MAX_VALUE) || ((length / divisor) > Integer.MAX_VALUE)) { + divisor *= 10; + } + progressBar.setMaximum((int) (length / divisor)); + progressBar.setValue((int) (copied / divisor)); + progressBar.setString("Uploaded: " + copied + " / " + length); + } + }); + } + }); } /** - * Sets whether to activate the debug mode. + * Stops the currently running insert. + */ + public void stopInsert() { + if (running) { + wizard.setNextEnabled(false); + projectInserter.stop(); + } + } + + /** + * Returns whether the insert is currently running. * - * @param debug - * true to activate the debug mode, - * false to deactivate. + * @return {@code true} if the insert is currently running, {@code false} + * otherwise */ - public void setDebug(boolean debug) { - projectInserter.setDebug(debug); + public boolean isRunning() { + return running; } /** @@ -246,6 +290,39 @@ public class ProjectInsertPage extends TWizardPage implements InsertListener, Cl projectInserter.setFreenetInterface(freenetInterface); } + /** + * Sets the project inserter’s temp directory. + * + * @see ProjectInserter#setTempDirectory(String) + * @param tempDirectory + * The temp directory to use, or {@code null} to use the system + * default + */ + public void setTempDirectory(String tempDirectory) { + projectInserter.setTempDirectory(tempDirectory); + } + + /** + * Returns whether the “copy URI to clipboard” button was used. + * + * @return {@code true} if an URI was copied to clipboard, {@code false} + * otherwise + */ + public boolean wasUriCopied() { + return uriCopied; + } + + /** + * Sets whether to use the “early encode“ flag for the insert. + * + * @param useEarlyEncode + * {@code true} to set the “early encode” flag for the insert, + * {@code false} otherwise + */ + public void setUseEarlyEncode(boolean useEarlyEncode) { + projectInserter.setUseEarlyEncode(useEarlyEncode); + } + // // INTERFACE InsertListener // @@ -254,12 +331,27 @@ public class ProjectInsertPage extends TWizardPage implements InsertListener, Cl * {@inheritDoc} */ public void projectInsertStarted(final Project project) { + + SwingUtilities.invokeLater(new Runnable() { + + @SuppressWarnings("synthetic-access") + public void run() { + startTimeLabel.setText(DateFormat.getDateTimeInstance().format(new Date())); + } + }); + } + + /** + * {@inheritDoc} + */ + public void projectUploadFinished(Project project) { startTime = System.currentTimeMillis(); SwingUtilities.invokeLater(new Runnable() { @SuppressWarnings("synthetic-access") public void run() { - startTimeLabel.setText(DateFormat.getDateTimeInstance().format(new Date(startTime))); + progressBar.setString(I18n.getMessage("jsite.insert.starting")); + progressBar.setValue(0); } }); } @@ -276,16 +368,39 @@ public class ProjectInsertPage extends TWizardPage implements InsertListener, Cl requestURITextField.setText(uri); } }); + logger.log(Level.FINEST, "Insert generated URI: " + uri); + int slash = uri.indexOf('/'); + slash = uri.indexOf('/', slash + 1); + int secondSlash = uri.indexOf('/', slash + 1); + if (secondSlash == -1) { + secondSlash = uri.length(); + } + String editionNumber = uri.substring(slash + 1, secondSlash); + logger.log(Level.FINEST, "Extracted edition number: " + editionNumber); + int edition = -1; + try { + edition = Integer.valueOf(editionNumber); + } catch (NumberFormatException nfe1) { + /* ignore. */ + } + logger.log(Level.FINEST, "Insert edition: " + edition + ", Project edition: " + project.getEdition()); + if ((edition != -1) && (edition == project.getEdition())) { + JOptionPane.showMessageDialog(this, I18n.getMessage("jsite.insert.reinserted-edition"), I18n.getMessage("jsite.insert.reinserted-edition.title"), JOptionPane.INFORMATION_MESSAGE); + } } /** * {@inheritDoc} */ public void projectInsertProgress(Project project, final int succeeded, final int failed, final int fatal, final int total, final boolean finalized) { + insertedBlocks = succeeded; SwingUtilities.invokeLater(new Runnable() { @SuppressWarnings("synthetic-access") public void run() { + if (total == 0) { + return; + } progressBar.setMaximum(total); progressBar.setValue(succeeded + failed + fatal); int progress = (succeeded + failed + fatal) * 100 / total; @@ -293,7 +408,7 @@ public class ProjectInsertPage extends TWizardPage implements InsertListener, Cl progressString.append(progress).append("% ("); progressString.append(succeeded + failed + fatal).append('/').append(total); progressString.append(") ("); - progressString.append(formatNumber(succeeded * 32.0 / ((System.currentTimeMillis() - startTime) / 1000), 1)); + progressString.append(getTransferRate()); progressString.append(' ').append(I18n.getMessage("jsite.insert.k-per-s")).append(')'); progressBar.setString(progressString.toString()); if (finalized) { @@ -307,13 +422,22 @@ public class ProjectInsertPage extends TWizardPage implements InsertListener, Cl * {@inheritDoc} */ public void projectInsertFinished(Project project, boolean success, Throwable cause) { + running = false; if (success) { - JOptionPane.showMessageDialog(this, I18n.getMessage("jsite.insert.inserted"), null, JOptionPane.INFORMATION_MESSAGE); + String copyURILabel = I18n.getMessage("jsite.insert.okay-copy-uri"); + int selectedValue = JOptionPane.showOptionDialog(this, I18n.getMessage("jsite.insert.inserted"), I18n.getMessage("jsite.insert.done.title"), 0, JOptionPane.INFORMATION_MESSAGE, null, new Object[] { I18n.getMessage("jsite.general.ok"), copyURILabel }, copyURILabel); + if (selectedValue == 1) { + actionCopyURI(); + } } else { if (cause == null) { - JOptionPane.showMessageDialog(this, I18n.getMessage("jsite.insert.insert-failed"), null, JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(this, I18n.getMessage("jsite.insert.insert-failed"), I18n.getMessage("jsite.insert.insert-failed.title"), JOptionPane.ERROR_MESSAGE); } else { - JOptionPane.showMessageDialog(this, MessageFormat.format(I18n.getMessage("jsite.insert.insert-failed-with-cause"), cause.getMessage()), null, JOptionPane.ERROR_MESSAGE); + if (cause instanceof AbortedException) { + JOptionPane.showMessageDialog(this, I18n.getMessage("jsite.insert.insert-aborted"), I18n.getMessage("jsite.insert.insert-aborted.title"), JOptionPane.INFORMATION_MESSAGE); + } else { + JOptionPane.showMessageDialog(this, MessageFormat.format(I18n.getMessage("jsite.insert.insert-failed-with-cause"), cause.getMessage()), I18n.getMessage("jsite.insert.insert-failed.title"), JOptionPane.ERROR_MESSAGE); + } } } SwingUtilities.invokeLater(new Runnable() { @@ -321,7 +445,8 @@ public class ProjectInsertPage extends TWizardPage implements InsertListener, Cl @SuppressWarnings("synthetic-access") public void run() { progressBar.setValue(progressBar.getMaximum()); - progressBar.setString(I18n.getMessage("jsite.insert.done")); + progressBar.setString(I18n.getMessage("jsite.insert.done") + " (" + getTransferRate() + " " + I18n.getMessage("jsite.insert.k-per-s") + ")"); + wizard.setNextName(I18n.getMessage("jsite.wizard.next")); wizard.setNextEnabled(true); wizard.setQuitEnabled(true); } @@ -336,6 +461,7 @@ public class ProjectInsertPage extends TWizardPage implements InsertListener, Cl * Copies the request URI of the project to the clipboard. */ private void actionCopyURI() { + uriCopied = true; Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); clipboard.setContents(new StringSelection(requestURITextField.getText()), this); } @@ -362,6 +488,15 @@ public class ProjectInsertPage extends TWizardPage implements InsertListener, Cl return formattedNumber; } + /** + * Returns the formatted transfer rate at this point. + * + * @return The formatted transfer rate + */ + private String getTransferRate() { + return formatNumber(insertedBlocks * 32.0 / ((System.currentTimeMillis() - startTime) / 1000), 1); + } + // // INTERFACE ClipboardOwner //