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