001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.io;
003
004import java.util.Locale;
005
006import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
007import org.openstreetmap.josm.gui.progress.ProgressMonitor;
008import org.openstreetmap.josm.tools.Utils;
009
010final class StreamProgressUpdater {
011
012    private final long size;
013    private final ProgressMonitor progressMonitor;
014    private final String taskTitle;
015    private int soFar;
016    private int lastDialogUpdate;
017
018    StreamProgressUpdater(long size, ProgressMonitor progressMonitor, String taskTitle) {
019        if (progressMonitor == null) {
020            progressMonitor = NullProgressMonitor.INSTANCE;
021        }
022        this.size = size;
023        this.progressMonitor = progressMonitor;
024        this.taskTitle = taskTitle;
025        initProgressMonitor();
026    }
027
028    private void initProgressMonitor() {
029        if (size > 0) {
030            progressMonitor.subTask(taskTitle);
031            progressMonitor.setTicksCount((int) size);
032        } else {
033            progressMonitor.indeterminateSubTask(taskTitle);
034        }
035    }
036
037    /**
038     * Increase ticker (progress counter and displayed text) by the given amount.
039     *
040     * @param amount number of ticks
041     */
042    void advanceTicker(int amount) {
043        soFar += amount;
044
045        if (soFar / 1024 != lastDialogUpdate) {
046            lastDialogUpdate++;
047            if (size > 0) {
048                progressMonitor.setTicks(soFar);
049            }
050            progressMonitor.setExtraText(Utils.getSizeString(soFar, Locale.getDefault()));
051        }
052    }
053
054    void finishTask() {
055        progressMonitor.finishTask();
056    }
057}