001 /* 002 * LAPIS lightweight structured text processing system 003 * 004 * Copyright (C) 1998-2002 Carnegie Mellon University, 005 * Copyright (C) 2003 Massachusetts Institute of Technology. 006 * All rights reserved. 007 * 008 * This library is free software; you can redistribute it 009 * and/or modify it under the terms of the GNU General 010 * Public License as published by the Free Software 011 * Foundation, version 2. 012 * 013 * LAPIS homepage: http://graphics.lcs.mit.edu/lapis/ 014 */ 015 016 package lapisx.progress; 017 018 import java.io.*; 019 import lapisx.util.Str; 020 021 public class StreamProgressBar implements ProgressListener { 022 PrintStream out; // output stream 023 int labelWidth; // width of label field in characters 024 int barWidth; // number of dots in progress bar 025 int dotsPrinted; // number of dots already printed 026 027 int maxLabelWidth; // label field will grow until it reaches this size 028 029 public StreamProgressBar () { 030 this (System.out); 031 } 032 033 public StreamProgressBar (OutputStream out) { 034 this (new PrintStream (out), 20, 20); 035 } 036 037 public StreamProgressBar (OutputStream out, int labelWidth, int barWidth) { 038 this.out = new PrintStream (out); 039 this.labelWidth = labelWidth; 040 this.barWidth = barWidth; 041 dotsPrinted = 0; 042 maxLabelWidth = 75 - barWidth; 043 } 044 045 public void startProgress (ProgressEvent event) { 046 String label = event.getLabel (); 047 048 int len = label.length(); 049 if (len > labelWidth) 050 labelWidth = Math.min (len, maxLabelWidth); 051 if (len > labelWidth) 052 label = label.substring (0, labelWidth-3) + "..."; 053 else 054 label = label + Str.repeat (" ", labelWidth - len); 055 056 out.print (label); 057 out.print (" ["); 058 059 dotsPrinted = 0; 060 printDots (event); 061 } 062 063 public void makeProgress (ProgressEvent event) { 064 printDots (event); 065 } 066 067 public void doneProgress (ProgressEvent event) { 068 printDots (event); 069 out.println ("]"); 070 } 071 072 void printDots (ProgressEvent event) { 073 // out.print (" {min=" + event.getMinimum () 074 // + ",max=" + event.getMaximum () 075 // + ",val=" + event.getValue () 076 // + ",pct=" + event.getPercentComplete () 077 // + "}"); 078 079 double percent = event.getPercentComplete (); 080 int dots = (int) (percent * barWidth); 081 if (dots > dotsPrinted) { 082 out.print (Str.repeat (".", dots - dotsPrinted)); 083 dotsPrinted = dots; 084 } 085 } 086 }