001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.gui.progress;
003    
004    import java.awt.Component;
005    
006    import org.openstreetmap.josm.Main;
007    import org.openstreetmap.josm.gui.util.GuiHelper;
008    import 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     */
016    public 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                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                    public void run() {
055                        delegate.setValue(currentProgressValue);
056                    }
057                });
058            }
059        }
060    
061        @Override
062        protected void doSetCustomText(final String title) {
063            checkState(State.IN_TASK, State.IN_SUBTASK);
064            GuiHelper.runInEDT(new Runnable() {
065                public void run() {
066                    delegate.setCustomText(title);
067                }
068            });
069        }
070    
071        @Override
072        protected void doSetTitle(final String title) {
073            checkState(State.IN_TASK, State.IN_SUBTASK);
074            GuiHelper.runInEDT(new Runnable() {
075                public void run() {
076                    delegate.setTaskTitle(title);
077                }
078            });
079        }
080    
081        @Override
082        protected void doSetIntermediate(final boolean value) {
083            GuiHelper.runInEDT(new Runnable() {
084                public void run() {
085                    delegate.setIndeterminate(value);
086                }
087            });
088        }
089    
090        @Override
091        public void setProgressTaskId(ProgressTaskId taskId) {
092        }
093    
094        @Override
095        public ProgressTaskId getProgressTaskId() {
096            return null;
097        }
098    
099        @Override
100        public Component getWindowParent() {
101            return Main.parent;
102        }
103    }