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;
019    private final ProgressRenderer delegate;
020
021    /**
022     *
023     * @param delegate the delegate which renders the progress information. Must not be null.
024     * @throws IllegalArgumentException if delegate is null
025     */
026    public SwingRenderingProgressMonitor(ProgressRenderer delegate) {
027        super(new CancelHandler());
028        CheckParameterUtil.ensureParameterNotNull(delegate, "delegate");
029        this.delegate = delegate;
030    }
031
032    @Override
033    public void doBeginTask() {
034        GuiHelper.runInEDT(() -> {
035            delegate.setCustomText("");
036            delegate.setMaximum(PROGRESS_BAR_MAX);
037        });
038    }
039
040    @Override
041    public void doFinishTask() {
042        // do nothing
043    }
044
045    @Override
046    protected void updateProgress(double progressValue) {
047        final int newValue = (int) (progressValue * PROGRESS_BAR_MAX);
048        if (newValue != currentProgressValue) {
049            currentProgressValue = newValue;
050            GuiHelper.runInEDT(() -> delegate.setValue(currentProgressValue));
051        }
052    }
053
054    @Override
055    protected void doSetCustomText(final String title) {
056        checkState(State.IN_TASK, State.IN_SUBTASK);
057        GuiHelper.runInEDT(() -> delegate.setCustomText(title));
058    }
059
060    @Override
061    protected void doSetTitle(final String title) {
062        checkState(State.IN_TASK, State.IN_SUBTASK);
063        GuiHelper.runInEDT(() -> delegate.setTaskTitle(title));
064    }
065
066    @Override
067    protected void doSetIntermediate(final boolean value) {
068        GuiHelper.runInEDT(() -> delegate.setIndeterminate(value));
069    }
070
071    @Override
072    public void setProgressTaskId(ProgressTaskId taskId) {
073        // Do nothing
074    }
075
076    @Override
077    public ProgressTaskId getProgressTaskId() {
078        return null;
079    }
080
081    @Override
082    public Component getWindowParent() {
083        return Main.parent;
084    }
085}