jdk/src/share/classes/javax/swing/ProgressMonitorInputStream.java
changeset 2 90ce3da70b43
child 5506 202f599c92aa
--- /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);
+    }
+}