// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.gui.progress; import javax.swing.SwingUtilities; import org.openstreetmap.josm.tools.CheckParameterUtil; /** * SwingRenderingProgressMonitor is progress monitor which delegates the rendering * of progress information to a {@see ProgressRenderer}. * Methods of the progress renderer are always called on the Swing EDT. * */ public class SwingRenderingProgressMonitor extends AbstractProgressMonitor { private static final int PROGRESS_BAR_MAX = 100; private int currentProgressValue = 0; private ProgressRenderer delegate; /** * * @param delegate the delegate which renders the progress information. Must not be null. * @throws IllegalArgumentException thrown if delegate is null * */ public SwingRenderingProgressMonitor(ProgressRenderer delegate) { super(new CancelHandler()); CheckParameterUtil.ensureParameterNotNull(delegate, "delegate"); this.delegate = delegate; } private void doInEDT(Runnable runnable) { if (SwingUtilities.isEventDispatchThread()) { runnable.run(); } else { SwingUtilities.invokeLater(runnable); } } @Override public void doBeginTask() { doInEDT(new Runnable() { public void run() { delegate.setCustomText(""); delegate.setMaximum(PROGRESS_BAR_MAX); } }); } @Override public void doFinishTask() { // do nothing } @Override protected void updateProgress(double progressValue) { final int newValue = (int)(progressValue * PROGRESS_BAR_MAX); if (newValue != currentProgressValue) { currentProgressValue = newValue; doInEDT(new Runnable() { public void run() { delegate.setValue(currentProgressValue); } }); } } @Override protected void doSetCustomText(final String title) { checkState(State.IN_TASK, State.IN_SUBTASK); doInEDT(new Runnable() { public void run() { delegate.setCustomText(title); } }); } @Override protected void doSetTitle(final String title) { checkState(State.IN_TASK, State.IN_SUBTASK); doInEDT(new Runnable() { public void run() { delegate.setTaskTitle(title); } }); } @Override protected void doSetIntermediate(final boolean value) { doInEDT(new Runnable() { public void run() { delegate.setIndeterminate(value); } }); } }