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    }