package org.opensextant.processing.progress; import java.util.ArrayList; import java.util.List; public class ProgressMonitorBase implements ProgressMonitor { private int steps; private double currentStepProgress = 0; private double totalProgress = 0; private int completedSteps = 0; private List<ProgressListener> listeners = new ArrayList<ProgressListener>(); public ProgressMonitorBase() { super(); } @Override public void setNumberOfSteps(int steps) { this.steps = steps; currentStepProgress = 0; totalProgress = 0; completedSteps = 0; } @Override public int getNumberOfSteps() { return this.steps; } @Override public void updateStepProgress(double progress) { this.currentStepProgress = progress; this.totalProgress = (int)((100.0/steps)*completedSteps + currentStepProgress); fireProgressChanged(); } @Override public void completeStep() { completedSteps++; this.currentStepProgress = 0; this.totalProgress = (int)((100.0/steps)*completedSteps); fireProgressChanged(); } @Override public void completeDocument() { this.totalProgress = 100; this.completedSteps = steps; this.currentStepProgress = 0; fireProgressChanged(); fireComplete(); } @Override public void addProgressListener(ProgressListener listener) { this.listeners.add(listener); } @Override public void removeProgressListener(ProgressListener listener) { this.listeners.remove(listener); } private void fireProgressChanged() { for (ProgressListener listener : listeners) { listener.updateProgress(this.totalProgress); } } private void fireComplete() { for (ProgressListener listener : listeners) { listener.markComplete(); } } }