001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.progress;
003
004import java.awt.Component;
005
006import org.openstreetmap.josm.Main;
007import org.openstreetmap.josm.gui.util.GuiHelper;
008import org.openstreetmap.josm.tools.CheckParameterUtil;
009
010/**
011 * SwingRenderingProgressMonitor is progress monitor which delegates the rendering
012 * of progress information to a {@link ProgressRenderer}.
013 * Methods of the progress renderer are always called on the Swing EDT.
014 *
015 */
016public class SwingRenderingProgressMonitor extends AbstractProgressMonitor {
017    private static final int PROGRESS_BAR_MAX = 100;
018    private int currentProgressValue = 0;
019    private ProgressRenderer delegate;
020
021    /**
022     *
023     * @param delegate the delegate which renders the progress information. Must not be null.
024     * @throws IllegalArgumentException thrown if delegate is null
025     *
026     */
027    public SwingRenderingProgressMonitor(ProgressRenderer delegate) {
028        super(new CancelHandler());
029        CheckParameterUtil.ensureParameterNotNull(delegate, "delegate");
030        this.delegate = delegate;
031    }
032
033    @Override
034    public void doBeginTask() {
035        GuiHelper.runInEDT(new Runnable() {
036            @Override
037            public void run() {
038                delegate.setCustomText("");
039                delegate.setMaximum(PROGRESS_BAR_MAX);
040            }
041        });
042    }
043
044    @Override
045    public void doFinishTask() {
046        // do nothing
047    }
048
049    @Override
050    protected void updateProgress(double progressValue) {
051        final int newValue = (int)(progressValue * PROGRESS_BAR_MAX);
052        if (newValue != currentProgressValue) {
053            currentProgressValue = newValue;
054            GuiHelper.runInEDT(new Runnable() {
055                @Override
056                public void run() {
057                    delegate.setValue(currentProgressValue);
058                }
059            });
060        }
061    }
062
063    @Override
064    protected void doSetCustomText(final String title) {
065        checkState(State.IN_TASK, State.IN_SUBTASK);
066        GuiHelper.runInEDT(new Runnable() {
067            @Override
068            public void run() {
069                delegate.setCustomText(title);
070            }
071        });
072    }
073
074    @Override
075    protected void doSetTitle(final String title) {
076        checkState(State.IN_TASK, State.IN_SUBTASK);
077        GuiHelper.runInEDT(new Runnable() {
078            @Override
079            public void run() {
080                delegate.setTaskTitle(title);
081            }
082        });
083    }
084
085    @Override
086    protected void doSetIntermediate(final boolean value) {
087        GuiHelper.runInEDT(new Runnable() {
088            @Override
089            public void run() {
090                delegate.setIndeterminate(value);
091            }
092        });
093    }
094
095    @Override
096    public void setProgressTaskId(ProgressTaskId taskId) {
097    }
098
099    @Override
100    public ProgressTaskId getProgressTaskId() {
101        return null;
102    }
103
104    @Override
105    public Component getWindowParent() {
106        return Main.parent;
107    }
108}