001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.progress.swing;
003
004import java.awt.Component;
005
006import org.openstreetmap.josm.gui.MainApplication;
007import org.openstreetmap.josm.gui.progress.AbstractProgressMonitor;
008import org.openstreetmap.josm.gui.progress.CancelHandler;
009import org.openstreetmap.josm.gui.progress.ProgressRenderer;
010import org.openstreetmap.josm.gui.progress.ProgressTaskId;
011import org.openstreetmap.josm.gui.util.GuiHelper;
012import org.openstreetmap.josm.tools.CheckParameterUtil;
013
014/**
015 * SwingRenderingProgressMonitor is progress monitor which delegates the rendering
016 * of progress information to a {@link ProgressRenderer}.
017 * Methods of the progress renderer are always called on the Swing EDT.
018 * @since 12675 (moved from {@code gui.progress} package}
019 */
020public class SwingRenderingProgressMonitor extends AbstractProgressMonitor {
021    private static final int PROGRESS_BAR_MAX = 100;
022    private int currentProgressValue;
023    private final ProgressRenderer delegate;
024
025    /**
026     *
027     * @param delegate the delegate which renders the progress information. Must not be null.
028     * @throws IllegalArgumentException if delegate is null
029     */
030    public SwingRenderingProgressMonitor(ProgressRenderer delegate) {
031        super(new CancelHandler());
032        CheckParameterUtil.ensureParameterNotNull(delegate, "delegate");
033        this.delegate = delegate;
034    }
035
036    @Override
037    public void doBeginTask() {
038        GuiHelper.runInEDT(() -> {
039            delegate.setCustomText("");
040            delegate.setMaximum(PROGRESS_BAR_MAX);
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(() -> delegate.setValue(currentProgressValue));
055        }
056    }
057
058    @Override
059    protected void doSetCustomText(final String title) {
060        checkState(State.IN_TASK, State.IN_SUBTASK);
061        GuiHelper.runInEDT(() -> delegate.setCustomText(title));
062    }
063
064    @Override
065    protected void doSetTitle(final String title) {
066        checkState(State.IN_TASK, State.IN_SUBTASK);
067        GuiHelper.runInEDT(() -> delegate.setTaskTitle(title));
068    }
069
070    @Override
071    protected void doSetIntermediate(final boolean value) {
072        GuiHelper.runInEDT(() -> delegate.setIndeterminate(value));
073    }
074
075    @Override
076    public void setProgressTaskId(ProgressTaskId taskId) {
077        // Do nothing
078    }
079
080    @Override
081    public ProgressTaskId getProgressTaskId() {
082        return null;
083    }
084
085    @Override
086    public Component getWindowParent() {
087        return MainApplication.getMainFrame();
088    }
089}