package gov.nih.nci.cagrid.common.portal;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
/**
* @author <A HREF="MAILTO:langella@bmi.osu.edu">Stephen Langella</A>
* @author <A HREF="MAILTO:oster@bmi.osu.edu">Scott Oster</A>
* @author <A HREF="MAILTO:hastings@bmi.osu.edu">Shannon Hastings</A>
* @author <A HREF="MAILTO:ervin@bmi.osu.edu">David W. Ervin</A>
*
* @version $Id: GridGrouperBaseTreeNode.java,v 1.1 2006/08/04 03:49:26 langella
* Exp $
*/
public class MultiEventProgressBar extends JProgressBar {
private Map<Integer, String> events;
private int id;
private boolean hideWhenComplete;
public MultiEventProgressBar(boolean onlyShowWhenWorking) {
this.events = new HashMap<Integer, String>();
this.id = 0;
this.hideWhenComplete = onlyShowWhenWorking;
this.setVisible(!onlyShowWhenWorking);
setString("");
setStringPainted(true);
}
public synchronized int startEvent(String message) {
this.setVisible(true);
id = id + 1;
Integer bid = new Integer(id);
events.put(bid, message);
if (events.size() == 1) {
updateProgress(true, message);
}
return id;
}
public void updateProgress(final String message, final int min, final int max, final int current) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
MultiEventProgressBar.this.setIndeterminate(false);
MultiEventProgressBar.this.setString(message);
MultiEventProgressBar.this.setStringPainted(true);
MultiEventProgressBar.this.setMinimum(min);
MultiEventProgressBar.this.setMaximum(max);
MultiEventProgressBar.this.setValue(current);
}
});
}
public synchronized void stopEvent(int eventID, String message) {
Integer bid = new Integer(eventID);
events.remove(bid);
if (events.size() == 0) {
updateProgress(false, message);
this.setVisible(!this.hideWhenComplete);
} else {
Integer min = null;
Iterator itr = events.keySet().iterator();
while (itr.hasNext()) {
Integer num = (Integer) itr.next();
if ((min == null) || (num.intValue() < min.intValue())) {
min = num;
}
}
String s = events.get(min);
updateProgress(true, s);
}
}
public synchronized void stopAll(String message) {
events.clear();
updateProgress(false, message);
this.setVisible(!this.hideWhenComplete);
}
private void updateProgress(final boolean working, final String s) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
if (s != null && !s.trim().equals("")) {
MultiEventProgressBar.this.setString(s);
MultiEventProgressBar.this.setStringPainted(true);
} else {
MultiEventProgressBar.this.setStringPainted(false);
}
setIndeterminate(working);
}
});
}
}