2 * Jexer - Java Text User Interface
4 * The MIT License (MIT)
6 * Copyright (C) 2017 Kevin Lamonte
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:
15 * The above copyright notice and this permission notice shall be included in
16 * all copies or substantial portions of the Software.
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.
26 * @author Kevin Lamonte [kevin.lamonte@gmail.com]
31 import jexer
.bits
.CellAttributes
;
32 import jexer
.bits
.GraphicsChars
;
33 import jexer
.event
.TMouseEvent
;
36 * THScroller implements a simple horizontal scroll bar.
38 public final class THScroller
extends TWidget
{
41 * Value that corresponds to being on the left edge of the scroll bar.
43 private int leftValue
= 0;
46 * Get the value that corresponds to being on the left edge of the scroll
49 * @return the scroll value
51 public int getLeftValue() {
56 * Set the value that corresponds to being on the left edge of the
59 * @param leftValue the new scroll value
61 public void setLeftValue(final int leftValue
) {
62 this.leftValue
= leftValue
;
66 * Value that corresponds to being on the right edge of the scroll bar.
68 private int rightValue
= 100;
71 * Get the value that corresponds to being on the right edge of the
74 * @return the scroll value
76 public int getRightValue() {
81 * Set the value that corresponds to being on the right edge of the
84 * @param rightValue the new scroll value
86 public void setRightValue(final int rightValue
) {
87 this.rightValue
= rightValue
;
91 * Current value of the scroll.
93 private int value
= 0;
96 * Get current value of the scroll.
98 * @return the scroll value
100 public int getValue() {
105 * Set current value of the scroll.
107 * @param value the new scroll value
109 public void setValue(final int value
) {
114 * The increment for clicking on an arrow.
116 private int smallChange
= 1;
119 * Get the increment for clicking on an arrow.
121 * @return the increment value
123 public int getSmallChange() {
128 * Set the increment for clicking on an arrow.
130 * @param smallChange the new increment value
132 public void setSmallChange(final int smallChange
) {
133 this.smallChange
= smallChange
;
137 * The increment for clicking in the bar between the box and an arrow.
139 private int bigChange
= 20;
142 * Set the increment for clicking in the bar between the box and an
145 * @return the increment value
147 public int getBigChange() {
152 * Set the increment for clicking in the bar between the box and an
155 * @param bigChange the new increment value
157 public void setBigChange(final int bigChange
) {
158 this.bigChange
= bigChange
;
162 * When true, the user is dragging the scroll box.
164 private boolean inScroll
= false;
167 * Public constructor.
169 * @param parent parent widget
170 * @param x column relative to parent
171 * @param y row relative to parent
172 * @param width height of scroll bar
174 public THScroller(final TWidget parent
, final int x
, final int y
,
177 // Set parent and window
178 super(parent
, x
, y
, width
, 1);
182 * Compute the position of the scroll box (a.k.a. grip, thumb).
184 * @return Y position of the box, between 1 and width - 2
186 private int boxPosition() {
187 return (getWidth() - 3) * (value
- leftValue
) / (rightValue
- leftValue
) + 1;
191 * Draw a horizontal scroll bar.
195 CellAttributes arrowColor
= getTheme().getColor("tscroller.arrows");
196 CellAttributes barColor
= getTheme().getColor("tscroller.bar");
197 getScreen().putCharXY(0, 0, GraphicsChars
.CP437
[0x11], arrowColor
);
198 getScreen().putCharXY(getWidth() - 1, 0, GraphicsChars
.CP437
[0x10],
202 if (rightValue
> leftValue
) {
203 getScreen().hLineXY(1, 0, getWidth() - 2, GraphicsChars
.CP437
[0xB1],
205 getScreen().putCharXY(boxPosition(), 0, GraphicsChars
.BOX
,
208 getScreen().hLineXY(1, 0, getWidth() - 2, GraphicsChars
.HATCH
,
215 * Perform a small step change left.
217 public void decrement() {
218 if (leftValue
== rightValue
) {
221 value
-= smallChange
;
222 if (value
< leftValue
) {
228 * Perform a small step change right.
230 public void increment() {
231 if (leftValue
== rightValue
) {
234 value
+= smallChange
;
235 if (value
> rightValue
) {
241 * Perform a big step change left.
243 public void bigDecrement() {
244 if (leftValue
== rightValue
) {
248 if (value
< leftValue
) {
254 * Perform a big step change right.
256 public void bigIncrement() {
257 if (rightValue
== leftValue
) {
261 if (value
> rightValue
) {
267 * Go to the left edge of the scroller.
269 public void toLeft() {
274 * Go to the right edge of the scroller.
276 public void toRight() {
281 * Handle mouse button releases.
283 * @param mouse mouse button release event
286 public void onMouseUp(final TMouseEvent mouse
) {
293 if (rightValue
== leftValue
) {
297 if ((mouse
.getX() == 0)
298 && (mouse
.getY() == 0)
300 // Clicked on the left arrow
305 if ((mouse
.getY() == 0)
306 && (mouse
.getX() == getWidth() - 1)
308 // Clicked on the right arrow
313 if ((mouse
.getY() == 0)
314 && (mouse
.getX() > 0)
315 && (mouse
.getX() < boxPosition())
317 // Clicked between the left arrow and the box
319 if (value
< leftValue
) {
325 if ((mouse
.getY() == 0)
326 && (mouse
.getX() > boxPosition())
327 && (mouse
.getX() < getWidth() - 1)
329 // Clicked between the box and the right arrow
331 if (value
> rightValue
) {
339 * Handle mouse movement events.
341 * @param mouse mouse motion event
344 public void onMouseMotion(final TMouseEvent mouse
) {
346 if (rightValue
== leftValue
) {
351 if ((mouse
.isMouse1())
353 && (mouse
.getX() > 0)
354 && (mouse
.getX() < getWidth() - 1)
356 // Recompute value based on new box position
357 value
= (rightValue
- leftValue
)
358 * (mouse
.getX()) / (getWidth() - 3) + leftValue
;
365 * Handle mouse button press events.
367 * @param mouse mouse button press event
370 public void onMouseDown(final TMouseEvent mouse
) {
371 if (rightValue
== leftValue
) {
376 if ((mouse
.getY() == 0)
377 && (mouse
.getX() == boxPosition())