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}