2 * jSite - a tool for uploading websites into Freenet
3 * Copyright (C) 2006 David Roden
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 package de.todesbaum.jsite.gui;
22 import java.awt.BorderLayout;
24 import java.awt.GridBagConstraints;
25 import java.awt.GridBagLayout;
26 import java.awt.Insets;
27 import java.awt.Toolkit;
28 import java.awt.datatransfer.Clipboard;
29 import java.awt.datatransfer.ClipboardOwner;
30 import java.awt.datatransfer.StringSelection;
31 import java.awt.datatransfer.Transferable;
32 import java.awt.event.ActionEvent;
33 import java.awt.event.KeyEvent;
34 import java.text.DateFormat;
35 import java.text.MessageFormat;
36 import java.util.Date;
38 import javax.swing.AbstractAction;
39 import javax.swing.Action;
40 import javax.swing.JButton;
41 import javax.swing.JComponent;
42 import javax.swing.JLabel;
43 import javax.swing.JOptionPane;
44 import javax.swing.JPanel;
45 import javax.swing.JProgressBar;
46 import javax.swing.JTextField;
47 import javax.swing.SwingUtilities;
49 import de.todesbaum.jsite.application.Freenet7Interface;
50 import de.todesbaum.jsite.application.InsertListener;
51 import de.todesbaum.jsite.application.Project;
52 import de.todesbaum.jsite.application.ProjectInserter;
53 import de.todesbaum.jsite.i18n.I18n;
54 import de.todesbaum.jsite.i18n.I18nContainer;
55 import de.todesbaum.util.swing.TWizard;
56 import de.todesbaum.util.swing.TWizardPage;
59 * Wizard page that shows the progress of an insert.
61 * @author David ‘Bombe’ Roden <bombe@freenetproject.org>
63 public class ProjectInsertPage extends TWizardPage implements InsertListener, ClipboardOwner {
65 /** The project inserter. */
66 private ProjectInserter projectInserter;
68 /** The “copy URI” action. */
69 private Action copyURIAction;
71 /** The “request URI” textfield. */
72 private JTextField requestURITextField;
74 /** The “start time” label. */
75 private JLabel startTimeLabel;
77 /** The progress bar. */
78 private JProgressBar progressBar;
80 /** The start time of the insert. */
81 private long startTime = 0;
84 * Creates a new progress insert wizard page.
87 * The wizard this page belongs to
89 public ProjectInsertPage(final TWizard wizard) {
93 setHeading(I18n.getMessage("jsite.insert.heading"));
94 setDescription(I18n.getMessage("jsite.insert.description"));
95 I18nContainer.getInstance().registerRunnable(new Runnable() {
98 setHeading(I18n.getMessage("jsite.insert.heading"));
99 setDescription(I18n.getMessage("jsite.insert.description"));
102 projectInserter = new ProjectInserter();
103 projectInserter.addInsertListener(this);
107 * Creates all used actions.
109 private void createActions() {
110 copyURIAction = new AbstractAction(I18n.getMessage("jsite.project.action.copy-uri")) {
112 @SuppressWarnings("synthetic-access")
113 public void actionPerformed(ActionEvent actionEvent) {
117 copyURIAction.putValue(Action.SHORT_DESCRIPTION, I18n.getMessage("jsite.project.action.copy-uri.tooltip"));
118 copyURIAction.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_U);
119 copyURIAction.setEnabled(false);
121 I18nContainer.getInstance().registerRunnable(new Runnable() {
123 @SuppressWarnings("synthetic-access")
125 copyURIAction.putValue(Action.NAME, I18n.getMessage("jsite.project.action.copy-uri"));
126 copyURIAction.putValue(Action.SHORT_DESCRIPTION, I18n.getMessage("jsite.project.action.copy-uri.tooltip"));
132 * Initializes the page.
134 private void pageInit() {
135 setLayout(new BorderLayout(12, 12));
136 add(createProjectInsertPanel(), BorderLayout.CENTER);
140 * Creates the main panel.
142 * @return The main panel
144 private JComponent createProjectInsertPanel() {
145 JComponent projectInsertPanel = new JPanel(new GridBagLayout());
147 requestURITextField = new JTextField();
148 requestURITextField.setEditable(false);
150 startTimeLabel = new JLabel();
152 progressBar = new JProgressBar(0, 1);
153 progressBar.setStringPainted(true);
154 progressBar.setValue(0);
156 final JLabel projectInformationLabel = new JLabel("<html><b>" + I18n.getMessage("jsite.insert.project-information") + "</b></html>");
157 projectInsertPanel.add(projectInformationLabel, new GridBagConstraints(0, 0, 2, 1, 1.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
158 final JLabel requestURILabel = new JLabel(I18n.getMessage("jsite.insert.request-uri") + ":");
159 projectInsertPanel.add(requestURILabel, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL, new Insets(6, 18, 0, 0), 0, 0));
160 projectInsertPanel.add(requestURITextField, new GridBagConstraints(1, 1, 1, 1, 1.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL, new Insets(6, 6, 0, 0), 0, 0));
161 final JLabel startTimeLeftLabel = new JLabel(I18n.getMessage("jsite.insert.start-time") + ":");
162 projectInsertPanel.add(startTimeLeftLabel, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL, new Insets(6, 18, 0, 0), 0, 0));
163 projectInsertPanel.add(startTimeLabel, new GridBagConstraints(1, 2, 1, 1, 1.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL, new Insets(6, 6, 0, 0), 0, 0));
164 final JLabel progressLabel = new JLabel(I18n.getMessage("jsite.insert.progress") + ":");
165 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));
166 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));
167 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));
169 I18nContainer.getInstance().registerRunnable(new Runnable() {
171 @SuppressWarnings("synthetic-access")
173 projectInformationLabel.setText("<html><b>" + I18n.getMessage("jsite.insert.project-information") + "</b></html>");
174 requestURILabel.setText(I18n.getMessage("jsite.insert.request-uri") + ":");
175 startTimeLeftLabel.setText(I18n.getMessage("jsite.insert.start-time") + ":");
176 if (startTime != 0) {
177 startTimeLabel.setText(DateFormat.getDateTimeInstance().format(new Date(startTime)));
179 startTimeLabel.setText("");
181 progressLabel.setText(I18n.getMessage("jsite.insert.progress") + ":");
185 return projectInsertPanel;
192 public void pageAdded(TWizard wizard) {
193 this.wizard.setPreviousName(I18n.getMessage("jsite.wizard.previous"));
194 this.wizard.setPreviousEnabled(false);
195 this.wizard.setNextName(I18n.getMessage("jsite.wizard.next"));
196 this.wizard.setQuitName(I18n.getMessage("jsite.wizard.quit"));
202 public void startInsert() {
203 wizard.setNextEnabled(false);
204 copyURIAction.setEnabled(false);
205 progressBar.setValue(0);
206 progressBar.setString(I18n.getMessage("jsite.insert.starting"));
207 progressBar.setFont(progressBar.getFont().deriveFont(Font.PLAIN));
208 projectInserter.start();
212 * Sets whether to activate the debug mode.
215 * <code>true</code> to activate the debug mode,
216 * <code>false</code> to deactivate.
218 public void setDebug(boolean debug) {
219 projectInserter.setDebug(debug);
223 * Sets the project to insert.
226 * The project to insert
228 public void setProject(final Project project) {
229 projectInserter.setProject(project);
230 SwingUtilities.invokeLater(new Runnable() {
232 @SuppressWarnings("synthetic-access")
234 requestURITextField.setText(project.getFinalRequestURI(1));
240 * Sets the freenet interface to use.
242 * @param freenetInterface
243 * The freenet interface to use
245 public void setFreenetInterface(Freenet7Interface freenetInterface) {
246 projectInserter.setFreenetInterface(freenetInterface);
250 // INTERFACE InsertListener
256 public void projectInsertStarted(final Project project) {
257 startTime = System.currentTimeMillis();
258 SwingUtilities.invokeLater(new Runnable() {
260 @SuppressWarnings("synthetic-access")
262 startTimeLabel.setText(DateFormat.getDateTimeInstance().format(new Date(startTime)));
270 public void projectURIGenerated(Project project, final String uri) {
271 SwingUtilities.invokeLater(new Runnable() {
273 @SuppressWarnings("synthetic-access")
275 copyURIAction.setEnabled(true);
276 requestURITextField.setText(uri);
284 public void projectInsertProgress(Project project, final int succeeded, final int failed, final int fatal, final int total, final boolean finalized) {
285 SwingUtilities.invokeLater(new Runnable() {
287 @SuppressWarnings("synthetic-access")
289 progressBar.setMaximum(total);
290 progressBar.setValue(succeeded + failed + fatal);
291 int progress = (succeeded + failed + fatal) * 100 / total;
292 StringBuilder progressString = new StringBuilder();
293 progressString.append(progress).append("% (");
294 progressString.append(succeeded + failed + fatal).append('/').append(total);
295 progressString.append(") (");
296 progressString.append(formatNumber(succeeded * 32.0 / ((System.currentTimeMillis() - startTime) / 1000), 1));
297 progressString.append(' ').append(I18n.getMessage("jsite.insert.k-per-s")).append(')');
298 progressBar.setString(progressString.toString());
300 progressBar.setFont(progressBar.getFont().deriveFont(Font.BOLD));
309 public void projectInsertFinished(Project project, boolean success, Throwable cause) {
311 JOptionPane.showMessageDialog(this, I18n.getMessage("jsite.insert.inserted"), null, JOptionPane.INFORMATION_MESSAGE);
314 JOptionPane.showMessageDialog(this, I18n.getMessage("jsite.insert.insert-failed"), null, JOptionPane.ERROR_MESSAGE);
316 JOptionPane.showMessageDialog(this, MessageFormat.format(I18n.getMessage("jsite.insert.insert-failed-with-cause"), cause.getMessage()), null, JOptionPane.ERROR_MESSAGE);
319 SwingUtilities.invokeLater(new Runnable() {
321 @SuppressWarnings("synthetic-access")
323 progressBar.setValue(progressBar.getMaximum());
324 progressBar.setString(I18n.getMessage("jsite.insert.done"));
325 wizard.setNextEnabled(true);
326 wizard.setQuitEnabled(true);
336 * Copies the request URI of the project to the clipboard.
338 private void actionCopyURI() {
339 Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
340 clipboard.setContents(new StringSelection(requestURITextField.getText()), this);
344 * Formats the given number so that it always has the the given number of
348 * The number to format
350 * The number of fractional digits
351 * @return The formatted number
353 private String formatNumber(double number, int digits) {
354 int multiplier = (int) Math.pow(10, digits);
355 String formattedNumber = String.valueOf((int) (number * multiplier) / (double) multiplier);
356 if (formattedNumber.indexOf('.') == -1) {
357 formattedNumber += '.';
358 for (int digit = 0; digit < digits; digit++) {
359 formattedNumber += "0";
362 return formattedNumber;
366 // INTERFACE ClipboardOwner
372 public void lostOwnership(Clipboard clipboard, Transferable contents) {