1 package net.sf.openrocket.util;
3 import java.io.BufferedInputStream;
5 import java.io.FileInputStream;
6 import java.io.FilterInputStream;
7 import java.io.IOException;
8 import java.io.InputStream;
9 import java.io.InterruptedIOException;
11 import javax.swing.SwingWorker;
13 import net.sf.openrocket.document.OpenRocketDocument;
14 import net.sf.openrocket.file.GeneralRocketLoader;
15 import net.sf.openrocket.file.RocketLoader;
19 * A SwingWorker thread that opens a rocket design file.
21 * @author Sampo Niskanen <sampo.niskanen@iki.fi>
23 public class OpenFileWorker extends SwingWorker<OpenRocketDocument, Void> {
25 private static final RocketLoader ROCKET_LOADER = new GeneralRocketLoader();
27 private final File file;
29 public OpenFileWorker(File file) {
35 protected OpenRocketDocument doInBackground() throws Exception {
36 ProgressInputStream is = new ProgressInputStream(
37 new BufferedInputStream(new FileInputStream(file)));
39 return ROCKET_LOADER.load(is);
43 } catch (Exception e) {
44 System.err.println("Error closing file: ");
53 private class ProgressInputStream extends FilterInputStream {
55 private final int size;
56 private int readBytes = 0;
57 private int progress = -1;
59 protected ProgressInputStream(InputStream in) {
64 } catch (IOException e) {
65 System.err.println("ERROR estimating available bytes!");
74 public int read() throws IOException {
81 throw new InterruptedIOException("OpenFileWorker was cancelled");
87 public int read(byte[] b, int off, int len) throws IOException {
88 int n = in.read(b, off, len);
94 throw new InterruptedIOException("OpenFileWorker was cancelled");
100 public int read(byte[] b) throws IOException {
107 throw new InterruptedIOException("OpenFileWorker was cancelled");
113 public long skip(long n) throws IOException {
114 long nr = in.skip(n);
120 throw new InterruptedIOException("OpenFileWorker was cancelled");
126 public synchronized void reset() throws IOException {
128 readBytes = size - in.available();
131 throw new InterruptedIOException("OpenFileWorker was cancelled");
137 private void setProgress() {
138 int p = MathUtil.clamp(readBytes * 100 / size, 0, 100);
141 OpenFileWorker.this.setProgress(progress);