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 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(new Runnable() {
035            @Override
036            public void run() {
037                delegate.setCustomText("");
038                delegate.setMaximum(PROGRESS_BAR_MAX);
039            }
040        });
041    }
042
043    @Override
044    public void doFinishTask() {
045        // do nothing
046    }
047
048    @Override
049    protected void updateProgress(double progressValue) {
050        final int newValue = (int) (progressValue * PROGRESS_BAR_MAX);
051        if (newValue != currentProgressValue) {
052            currentProgressValue = newValue;
053            GuiHelper.runInEDT(new Runnable() {
054                @Override
055                public void run() {
056                    delegate.setValue(currentProgressValue);
057                }
058            });
059        }
060    }
061
062    @Override
063    protected void doSetCustomText(final String title) {
064        checkState(State.IN_TASK, State.IN_SUBTASK);
065        GuiHelper.runInEDT(new Runnable() {
066            @Override
067            public void run() {
068                delegate.setCustomText(title);
069            }
070        });
071    }
072
073    @Override
074    protected void doSetTitle(final String title) {
075        checkState(State.IN_TASK, State.IN_SUBTASK);
076        GuiHelper.runInEDT(new Runnable() {
077            @Override
078            public void run() {
079                delegate.setTaskTitle(title);
080            }
081        });
082    }
083
084    @Override
085    protected void doSetIntermediate(final boolean value) {
086        GuiHelper.runInEDT(new Runnable() {
087            @Override
088            public void run() {
089                delegate.setIndeterminate(value);
090            }
091        });
092    }
093
094    @Override
095    public void setProgressTaskId(ProgressTaskId taskId) {
096    }
097
098    @Override
099    public ProgressTaskId getProgressTaskId() {
100        return null;
101    }
102
103    @Override
104    public Component getWindowParent() {
105        return Main.parent;
106    }
107}