Merge branch 'master' of https://github.com/klamonte/jexer
[fanfix.git] / src / jexer / TProgressBar.java
1 /*
2 * Jexer - Java Text User Interface
3 *
4 * The MIT License (MIT)
5 *
6 * Copyright (C) 2017 Kevin Lamonte
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice shall be included in
16 * all copies or substantial portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24 * DEALINGS IN THE SOFTWARE.
25 *
26 * @author Kevin Lamonte [kevin.lamonte@gmail.com]
27 * @version 1
28 */
29 package jexer;
30
31 import jexer.bits.CellAttributes;
32 import jexer.bits.GraphicsChars;
33
34 /**
35 * TProgressBar implements a simple progress bar.
36 */
37 public final class TProgressBar extends TWidget {
38
39 // ------------------------------------------------------------------------
40 // Variables --------------------------------------------------------------
41 // ------------------------------------------------------------------------
42
43 /**
44 * Value that corresponds to 0% progress.
45 */
46 private int minValue = 0;
47
48 /**
49 * Value that corresponds to 100% progress.
50 */
51 private int maxValue = 100;
52
53 /**
54 * Current value of the progress.
55 */
56 private int value = 0;
57
58 // ------------------------------------------------------------------------
59 // Constructors -----------------------------------------------------------
60 // ------------------------------------------------------------------------
61
62 /**
63 * Public constructor.
64 *
65 * @param parent parent widget
66 * @param x column relative to parent
67 * @param y row relative to parent
68 * @param width width of progress bar
69 * @param value initial value of percent complete
70 */
71 public TProgressBar(final TWidget parent, final int x, final int y,
72 final int width, final int value) {
73
74 // Set parent and window
75 super(parent, false, x, y, width, 1);
76
77 this.value = value;
78 }
79
80 // ------------------------------------------------------------------------
81 // Event handlers ---------------------------------------------------------
82 // ------------------------------------------------------------------------
83
84
85 // ------------------------------------------------------------------------
86 // TWidget ----------------------------------------------------------------
87 // ------------------------------------------------------------------------
88
89 /**
90 * Draw a static progress bar.
91 */
92 @Override
93 public void draw() {
94 CellAttributes completeColor = getTheme().getColor("tprogressbar.complete");
95 CellAttributes incompleteColor = getTheme().getColor("tprogressbar.incomplete");
96
97 float progress = ((float)value - minValue) / ((float)maxValue - minValue);
98 int progressInt = (int)(progress * 100);
99 int progressUnit = 100 / (getWidth() - 2);
100
101 getScreen().putCharXY(0, 0, GraphicsChars.CP437[0xC3], incompleteColor);
102 for (int i = 0; i < getWidth() - 2; i++) {
103 float iProgress = (float)i / (getWidth() - 2);
104 int iProgressInt = (int)(iProgress * 100);
105 if (iProgressInt <= progressInt - progressUnit) {
106 getScreen().putCharXY(i + 1, 0, GraphicsChars.BOX,
107 completeColor);
108 } else {
109 getScreen().putCharXY(i + 1, 0, GraphicsChars.SINGLE_BAR,
110 incompleteColor);
111 }
112 }
113 if (value >= maxValue) {
114 getScreen().putCharXY(getWidth() - 2, 0, GraphicsChars.BOX,
115 completeColor);
116 } else {
117 getScreen().putCharXY(getWidth() - 2, 0, GraphicsChars.SINGLE_BAR,
118 incompleteColor);
119 }
120 getScreen().putCharXY(getWidth() - 1, 0, GraphicsChars.CP437[0xB4],
121 incompleteColor);
122 }
123
124 // ------------------------------------------------------------------------
125 // TProgressBar -----------------------------------------------------------
126 // ------------------------------------------------------------------------
127
128 /**
129 * Get the value that corresponds to 0% progress.
130 *
131 * @return the value that corresponds to 0% progress
132 */
133 public int getMinValue() {
134 return minValue;
135 }
136
137 /**
138 * Set the value that corresponds to 0% progress.
139 *
140 * @param minValue the value that corresponds to 0% progress
141 */
142 public void setMinValue(final int minValue) {
143 this.minValue = minValue;
144 }
145
146 /**
147 * Get the value that corresponds to 100% progress.
148 *
149 * @return the value that corresponds to 100% progress
150 */
151 public int getMaxValue() {
152 return maxValue;
153 }
154
155 /**
156 * Set the value that corresponds to 100% progress.
157 *
158 * @param maxValue the value that corresponds to 100% progress
159 */
160 public void setMaxValue(final int maxValue) {
161 this.maxValue = maxValue;
162 }
163
164 /**
165 * Get the current value of the progress.
166 *
167 * @return the current value of the progress
168 */
169 public int getValue() {
170 return value;
171 }
172
173 /**
174 * Set the current value of the progress.
175 *
176 * @param value the current value of the progress
177 */
178 public void setValue(final int value) {
179 this.value = value;
180 }
181
182 }