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.Main; 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 Main.parent; 088 } 089}