+ /**
+ * Value that corresponds to 100% progress.
+ */
+ private int maxValue = 100;
+
+ /**
+ * Current value of the progress.
+ */
+ private int value = 0;
+
+ /**
+ * The left border character.
+ */
+ private int leftBorderChar = GraphicsChars.CP437[0xC3];
+
+ /**
+ * The filled-in part of the bar.
+ */
+ private int completedChar = GraphicsChars.BOX;
+
+ /**
+ * The remaining to be filled in part of the bar.
+ */
+ private int remainingChar = GraphicsChars.SINGLE_BAR;
+
+ /**
+ * The right border character.
+ */
+ private int rightBorderChar = GraphicsChars.CP437[0xB4];
+
+ // ------------------------------------------------------------------------
+ // Constructors -----------------------------------------------------------
+ // ------------------------------------------------------------------------
+
+ /**
+ * Public constructor.
+ *
+ * @param parent parent widget
+ * @param x column relative to parent
+ * @param y row relative to parent
+ * @param width width of progress bar
+ * @param value initial value of percent complete
+ */
+ public TProgressBar(final TWidget parent, final int x, final int y,
+ final int width, final int value) {
+
+ // Set parent and window
+ super(parent, false, x, y, width, 1);
+
+ this.value = value;
+ }
+
+ // ------------------------------------------------------------------------
+ // Event handlers ---------------------------------------------------------
+ // ------------------------------------------------------------------------
+
+
+ // ------------------------------------------------------------------------
+ // TWidget ----------------------------------------------------------------
+ // ------------------------------------------------------------------------
+
+ /**
+ * Override TWidget's height: we can only set height at construction
+ * time.
+ *
+ * @param height new widget height (ignored)
+ */
+ @Override
+ public void setHeight(final int height) {
+ // Do nothing
+ }
+
+ /**
+ * Draw a static progress bar.
+ */
+ @Override
+ public void draw() {
+
+ if (getWidth() <= 2) {
+ // Bail out, we are too narrow to draw anything.
+ return;
+ }
+
+ CellAttributes completeColor = getTheme().getColor("tprogressbar.complete");
+ CellAttributes incompleteColor = getTheme().getColor("tprogressbar.incomplete");
+
+ float progress = ((float)value - minValue) / ((float)maxValue - minValue);
+ int progressInt = (int)(progress * 100);
+ int progressUnit = 100 / (getWidth() - 2);
+
+ putCharXY(0, 0, leftBorderChar, incompleteColor);
+ for (int i = StringUtils.width(leftBorderChar); i < getWidth() - 2;) {
+ float iProgress = (float)i / (getWidth() - 2);
+ int iProgressInt = (int)(iProgress * 100);
+ if (iProgressInt <= progressInt - progressUnit) {
+ putCharXY(i, 0, completedChar, completeColor);
+ i += StringUtils.width(completedChar);
+ } else {
+ putCharXY(i, 0, remainingChar, incompleteColor);
+ i += StringUtils.width(remainingChar);
+ }
+ }
+ if (value >= maxValue) {
+ putCharXY(getWidth() - StringUtils.width(leftBorderChar) -
+ StringUtils.width(rightBorderChar), 0, completedChar,
+ completeColor);
+ } else {
+ putCharXY(getWidth() - StringUtils.width(leftBorderChar) -
+ StringUtils.width(rightBorderChar), 0, remainingChar,
+ incompleteColor);
+ }
+ putCharXY(getWidth() - StringUtils.width(rightBorderChar), 0,
+ rightBorderChar, incompleteColor);
+ }
+
+ // ------------------------------------------------------------------------
+ // TProgressBar -----------------------------------------------------------
+ // ------------------------------------------------------------------------
+