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.util.*;
019 //import lapisx.util.Thr;
020
021 public class BasicProgressGenerator extends ProgressEvent implements ProgressGenerator {
022 boolean killThreadOnInterrupt = false;
023 Vector listeners = new Vector ();
024 double delta = 0.1;
025 boolean inprogress = false;
026
027 public BasicProgressGenerator (Object source) {
028 this (source, false);
029 }
030
031 public BasicProgressGenerator (Object source, boolean killThreadOnInterrupt) {
032 super (source);
033 this.killThreadOnInterrupt = killThreadOnInterrupt;
034 }
035
036 public void addProgressListener (ProgressListener listener) {
037 listeners.addElement (listener);
038 }
039
040 public void removeProgressListener (ProgressListener listener) {
041 listeners.removeElement (listener);
042 }
043
044 public void fireStartProgress (String label) {
045 fireStartProgress (label, 1000);
046 }
047
048 public void fireStartProgress (String label, int max) {
049 if (inprogress)
050 push ();
051
052 setLabel (label);
053 setMaximum (Math.max (max, 1));
054 setValue (0);
055
056 for (Enumeration l = listeners.elements (); l.hasMoreElements (); )
057 ((ProgressListener)l.nextElement ()).startProgress (this);
058 inprogress = true;
059 }
060
061 public void fireProgress (int value) {
062 if (killThreadOnInterrupt && Thread.currentThread ().isInterrupted ())
063 throw new ThreadDeath ();
064
065 if (!inprogress)
066 return;
067
068 setValue (value);
069 for (Enumeration l = listeners.elements (); l.hasMoreElements (); )
070 ((ProgressListener)l.nextElement ()).makeProgress (this);
071 }
072
073 public void fireAddProgress (int increment) {
074 fireProgress (getValue () + increment);
075 }
076
077 public void fireProgress () {
078 double delta = getDelta ();
079 int value = getValue ();
080 int remaining = getMaximum () - value;
081 int newValue = value + (int)(delta*remaining);
082 fireProgress (newValue);
083 }
084
085 public double getDelta () {
086 return delta;
087 }
088
089 public void setDelta (double delta) {
090 this.delta = delta;
091 }
092
093 public void fireDoneProgress () {
094 if (!inprogress)
095 return;
096
097 setValue (getMaximum ());
098
099 for (Enumeration l = listeners.elements (); l.hasMoreElements (); )
100 ((ProgressListener)l.nextElement ()).doneProgress (this);
101
102 if (pop ())
103 fireProgress (getValue ());
104 else
105 inprogress = false;
106 }
107
108 Stack stack;
109
110 void push () {
111 if (stack == null)
112 stack = new Stack ();
113 ProgressEvent pe = new ProgressEvent (getSource ());
114 pe.setLabel (getLabel ());
115 pe.setMinimum (getMinimum ());
116 pe.setMaximum (getMaximum ());
117 pe.setValue (getValue ());
118 stack.push (pe);
119 }
120
121 boolean pop () {
122 if (stack == null || stack.isEmpty ())
123 return false;
124 ProgressEvent pe = (ProgressEvent) stack.pop ();
125 setLabel (pe.getLabel ());
126 setMinimum (pe.getMinimum ());
127 setMaximum (pe.getMaximum ());
128 setValue (pe.getValue ());
129 return true;
130 }
131 }