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 }