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}