001: /*
002: * StatusBarProgressNotifier.java
003: *
004: * Copyright (C) 2000-2002 Peter Graves
005: * $Id: StatusBarProgressNotifier.java,v 1.1.1.1 2002/09/24 16:08:45 piso Exp $
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License
009: * as published by the Free Software Foundation; either version 2
010: * of the License, or (at your option) any later version.
011: *
012: * This program is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
015: * GNU General Public License for more details.
016: *
017: * You should have received a copy of the GNU General Public License
018: * along with this program; if not, write to the Free Software
019: * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
020: */
021:
022: package org.armedbear.j;
023:
024: import javax.swing.SwingUtilities;
025:
026: public class StatusBarProgressNotifier implements Cancellable,
027: ProgressNotifier, Runnable {
028: private Buffer buffer;
029: private Thread updaterThread;
030: private boolean go = true;
031: private long totalBytes;
032: private long fileSize;
033: private String prefix;
034: private boolean cancelled;
035: private String progressText;
036:
037: public StatusBarProgressNotifier(Buffer buffer) {
038: this .buffer = buffer;
039: }
040:
041: public void cancel() {
042: cancelled = true;
043: }
044:
045: public boolean cancelled() {
046: return cancelled;
047: }
048:
049: public void progressStart() {
050: if (updaterThread == null) {
051: updaterThread = new Thread(this );
052: updaterThread.setDaemon(true);
053: updaterThread.start();
054: }
055: }
056:
057: public void progressStop() {
058: go = false;
059: }
060:
061: public void progress(String prefix, long totalBytes, long fileSize) {
062: this .prefix = prefix;
063: this .totalBytes = totalBytes;
064: this .fileSize = fileSize;
065: }
066:
067: public void progress(String progressText) {
068: this .progressText = progressText;
069: }
070:
071: public void setText(final String s) {
072: progressText = s;
073: if (s != null)
074: update();
075: }
076:
077: private void update() {
078: Runnable r = new Runnable() {
079: public void run() {
080: for (EditorIterator it = new EditorIterator(); it
081: .hasNext();) {
082: Editor ed = it.nextEditor();
083: if (ed.getBuffer() == buffer)
084: ed.status(progressText);
085: }
086: }
087: };
088: SwingUtilities.invokeLater(r);
089: }
090:
091: public void run() {
092: long start = System.currentTimeMillis();
093: while (go) {
094: try {
095: Thread.sleep(500);
096: } catch (InterruptedException e) {
097: Log.error(e);
098: }
099: if (go) {
100: if (prefix != null && totalBytes != 0) {
101: long elapsed = System.currentTimeMillis() - start;
102: setText(getProgressText(elapsed));
103: } else
104: update();
105: }
106: }
107: }
108:
109: private String getProgressText(long elapsed) {
110: if (elapsed == 0)
111: return null;
112: FastStringBuffer sb = new FastStringBuffer(prefix);
113: if (fileSize > 0) {
114: final long percent = (totalBytes * 100) / fileSize;
115: if (percent >= 100)
116: return null;
117: final long rate = (totalBytes * 1000) / elapsed; // bytes per second
118: final long projected = (fileSize * elapsed) / totalBytes; // milliseconds
119: long seconds = (projected - elapsed) / 1000;
120: long minutes = seconds / 60;
121: if (minutes != 0)
122: seconds = seconds % 60;
123: final long hours = minutes / 60;
124: if (hours != 0)
125: minutes = minutes % 60;
126: long K = fileSize / 1000;
127: if (K == 0)
128: K = 1;
129: sb.append(percent);
130: sb.append("% of ");
131: sb.append(K);
132: sb.append("K (at ");
133: sb.append(rate);
134: sb.append(" bytes/sec, ");
135: if (hours != 0) {
136: sb.append(hours);
137: sb.append(':');
138: if (minutes < 10)
139: sb.append('0');
140: }
141: sb.append(minutes);
142: sb.append(':');
143: if (seconds < 10)
144: sb.append('0');
145: sb.append(seconds);
146: sb.append(" remaining)");
147: } else {
148: // We don't know the file size.
149: final long rate = (totalBytes * 1000) / elapsed; // bytes per second
150: sb.append(totalBytes);
151: sb.append(" bytes (at ");
152: sb.append(rate);
153: sb.append(" bytes/sec)");
154: }
155: return sb.toString();
156: }
157: }
|