// Copyright © 2011-2013, Esko Luontola <www.orfjackal.net> // This software is released under the Apache License 2.0. // The license text is at http://www.apache.org/licenses/LICENSE-2.0 package fi.jumi.launcher.ui; import javax.annotation.concurrent.NotThreadSafe; @NotThreadSafe public class TextProgressBar { private final int startLength; private final int middleLength; private final String foreground; private final String background; private double progress = 0; private boolean indeterminate = true; private boolean complete = false; private int incrementallyPrinted = 0; public TextProgressBar(String start, String middle, String end) { startLength = start.length(); middleLength = middle.length(); foreground = start + middle; background = start + repeat(' ', middle.length()) + end; } private static String repeat(char c, int length) { StringBuilder sb = new StringBuilder(length); for (int i = 0; i < length; i++) { sb.append(c); } return sb.toString(); } public TextProgressBar setProgress(double progress) { this.progress = progress; return this; } public TextProgressBar setIndeterminate(boolean indeterminate) { this.indeterminate = indeterminate; return this; } public TextProgressBar setComplete(boolean complete) { this.complete = complete; return this; } public void resetIncrementalPrinting() { incrementallyPrinted = 0; } @Override public String toString() { if (indeterminate) { return ""; } int len = startLength + (int) Math.round(middleLength * progress); String s = foreground.substring(0, len); if (complete) { s += background.substring(len, background.length()); } return s; } public String toStringIncremental() { String whole = toString(); if (incrementallyPrinted > whole.length()) { return ""; } String increment = whole.substring(incrementallyPrinted); incrementallyPrinted = whole.length(); return increment; } }