--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/javax/swing/ProgressMonitorInputStream.java Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,188 @@
+/*
+ * Copyright 1997-1999 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+
+
+package javax.swing;
+
+
+
+import java.io.*;
+import java.awt.Component;
+
+
+
+/**
+ * Monitors the progress of reading from some InputStream. This ProgressMonitor
+ * is normally invoked in roughly this form:
+ * <pre>
+ * InputStream in = new BufferedInputStream(
+ * new ProgressMonitorInputStream(
+ * parentComponent,
+ * "Reading " + fileName,
+ * new FileInputStream(fileName)));
+ * </pre><p>
+ * This creates a progress monitor to monitor the progress of reading
+ * the input stream. If it's taking a while, a ProgressDialog will
+ * be popped up to inform the user. If the user hits the Cancel button
+ * an InterruptedIOException will be thrown on the next read.
+ * All the right cleanup is done when the stream is closed.
+ *
+ *
+ * <p>
+ *
+ * For further documentation and examples see
+ * <a href="http://java.sun.com/docs/books/tutorial/uiswing/components/progress.html">How to Monitor Progress</a>,
+ * a section in <em>The Java Tutorial.</em>
+ *
+ * @see ProgressMonitor
+ * @see JOptionPane
+ * @author James Gosling
+ */
+public class ProgressMonitorInputStream extends FilterInputStream
+{
+ private ProgressMonitor monitor;
+ private int nread = 0;
+ private int size = 0;
+
+
+ /**
+ * Constructs an object to monitor the progress of an input stream.
+ *
+ * @param message Descriptive text to be placed in the dialog box
+ * if one is popped up.
+ * @param parentComponent The component triggering the operation
+ * being monitored.
+ * @param in The input stream to be monitored.
+ */
+ public ProgressMonitorInputStream(Component parentComponent,
+ Object message,
+ InputStream in) {
+ super(in);
+ try {
+ size = in.available();
+ }
+ catch(IOException ioe) {
+ size = 0;
+ }
+ monitor = new ProgressMonitor(parentComponent, message, null, 0, size);
+ }
+
+
+ /**
+ * Get the ProgressMonitor object being used by this stream. Normally
+ * this isn't needed unless you want to do something like change the
+ * descriptive text partway through reading the file.
+ * @return the ProgressMonitor object used by this object
+ */
+ public ProgressMonitor getProgressMonitor() {
+ return monitor;
+ }
+
+
+ /**
+ * Overrides <code>FilterInputStream.read</code>
+ * to update the progress monitor after the read.
+ */
+ public int read() throws IOException {
+ int c = in.read();
+ if (c >= 0) monitor.setProgress(++nread);
+ if (monitor.isCanceled()) {
+ InterruptedIOException exc =
+ new InterruptedIOException("progress");
+ exc.bytesTransferred = nread;
+ throw exc;
+ }
+ return c;
+ }
+
+
+ /**
+ * Overrides <code>FilterInputStream.read</code>
+ * to update the progress monitor after the read.
+ */
+ public int read(byte b[]) throws IOException {
+ int nr = in.read(b);
+ if (nr > 0) monitor.setProgress(nread += nr);
+ if (monitor.isCanceled()) {
+ InterruptedIOException exc =
+ new InterruptedIOException("progress");
+ exc.bytesTransferred = nread;
+ throw exc;
+ }
+ return nr;
+ }
+
+
+ /**
+ * Overrides <code>FilterInputStream.read</code>
+ * to update the progress monitor after the read.
+ */
+ public int read(byte b[],
+ int off,
+ int len) throws IOException {
+ int nr = in.read(b, off, len);
+ if (nr > 0) monitor.setProgress(nread += nr);
+ if (monitor.isCanceled()) {
+ InterruptedIOException exc =
+ new InterruptedIOException("progress");
+ exc.bytesTransferred = nread;
+ throw exc;
+ }
+ return nr;
+ }
+
+
+ /**
+ * Overrides <code>FilterInputStream.skip</code>
+ * to update the progress monitor after the skip.
+ */
+ public long skip(long n) throws IOException {
+ long nr = in.skip(n);
+ if (nr > 0) monitor.setProgress(nread += nr);
+ return nr;
+ }
+
+
+ /**
+ * Overrides <code>FilterInputStream.close</code>
+ * to close the progress monitor as well as the stream.
+ */
+ public void close() throws IOException {
+ in.close();
+ monitor.close();
+ }
+
+
+ /**
+ * Overrides <code>FilterInputStream.reset</code>
+ * to reset the progress monitor as well as the stream.
+ */
+ public synchronized void reset() throws IOException {
+ in.reset();
+ nread = size - in.available();
+ monitor.setProgress(nread);
+ }
+}