2 * Jexer - Java Text User Interface
4 * License: LGPLv3 or later
6 * This module is licensed under the GNU Lesser General Public License
7 * Version 3. Please see the file "COPYING" in this directory for more
8 * information about the GNU Lesser General Public License Version 3.
10 * Copyright (C) 2015 Kevin Lamonte
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU Lesser General Public License
14 * as published by the Free Software Foundation; either version 3 of
15 * the License, or (at your option) any later version.
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * General Public License for more details.
22 * You should have received a copy of the GNU Lesser General Public
23 * License along with this program; if not, see
24 * http://www.gnu.org/licenses/, or write to the Free Software
25 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
28 * @author Kevin Lamonte [kevin.lamonte@gmail.com]
33 import jexer
.bits
.CellAttributes
;
34 import jexer
.bits
.GraphicsChars
;
35 import jexer
.event
.TMouseEvent
;
38 * THScroller implements a simple horizontal scroll bar.
40 public final class THScroller
extends TWidget
{
43 * Value that corresponds to being on the left edge of the scroll bar.
45 private int leftValue
= 0;
48 * Get the value that corresponds to being on the left edge of the scroll
51 * @return the scroll value
53 public int getLeftValue() {
58 * Set the value that corresponds to being on the left edge of the
61 * @param leftValue the new scroll value
63 public void setLeftValue(final int leftValue
) {
64 this.leftValue
= leftValue
;
68 * Value that corresponds to being on the right edge of the scroll bar.
70 private int rightValue
= 100;
73 * Get the value that corresponds to being on the right edge of the
76 * @return the scroll value
78 public int getRightValue() {
83 * Set the value that corresponds to being on the right edge of the
86 * @param rightValue the new scroll value
88 public void setRightValue(final int rightValue
) {
89 this.rightValue
= rightValue
;
93 * Current value of the scroll.
95 private int value
= 0;
98 * Get current value of the scroll.
100 * @return the scroll value
102 public int getValue() {
107 * Set current value of the scroll.
109 * @param value the new scroll value
111 public void setValue(final int value
) {
116 * The increment for clicking on an arrow.
118 private int smallChange
= 1;
121 * Set the increment for clicking on an arrow.
123 * @param smallChange the new increment value
125 public void setSmallChange(final int smallChange
) {
126 this.smallChange
= smallChange
;
130 * The increment for clicking in the bar between the box and an arrow.
132 private int bigChange
= 20;
135 * Set the increment for clicking in the bar between the box and an
138 * @param bigChange the new increment value
140 public void setBigChange(final int bigChange
) {
141 this.bigChange
= bigChange
;
145 * When true, the user is dragging the scroll box.
147 private boolean inScroll
= false;
150 * Public constructor.
152 * @param parent parent widget
153 * @param x column relative to parent
154 * @param y row relative to parent
155 * @param width height of scroll bar
157 public THScroller(final TWidget parent
, final int x
, final int y
,
160 // Set parent and window
161 super(parent
, x
, y
, width
, 1);
165 * Compute the position of the scroll box (a.k.a. grip, thumb).
167 * @return Y position of the box, between 1 and width - 2
169 private int boxPosition() {
170 return (getWidth() - 3) * (value
- leftValue
) / (rightValue
- leftValue
) + 1;
174 * Draw a horizontal scroll bar.
178 CellAttributes arrowColor
= getTheme().getColor("tscroller.arrows");
179 CellAttributes barColor
= getTheme().getColor("tscroller.bar");
180 getScreen().putCharXY(0, 0, GraphicsChars
.CP437
[0x11], arrowColor
);
181 getScreen().putCharXY(getWidth() - 1, 0, GraphicsChars
.CP437
[0x10],
185 if (rightValue
> leftValue
) {
186 getScreen().hLineXY(1, 0, getWidth() - 2, GraphicsChars
.CP437
[0xB1],
188 getScreen().putCharXY(boxPosition(), 0, GraphicsChars
.BOX
,
191 getScreen().hLineXY(1, 0, getWidth() - 2, GraphicsChars
.HATCH
,
198 * Perform a small step change left.
200 public void decrement() {
201 if (leftValue
== rightValue
) {
204 value
-= smallChange
;
205 if (value
< leftValue
) {
211 * Perform a small step change right.
213 public void increment() {
214 if (leftValue
== rightValue
) {
217 value
+= smallChange
;
218 if (value
> rightValue
) {
224 * Handle mouse button releases.
226 * @param mouse mouse button release event
229 public void onMouseUp(final TMouseEvent mouse
) {
236 if (rightValue
== leftValue
) {
240 if ((mouse
.getX() == 0)
241 && (mouse
.getY() == 0)
243 // Clicked on the left arrow
248 if ((mouse
.getY() == 0)
249 && (mouse
.getX() == getWidth() - 1)
251 // Clicked on the right arrow
256 if ((mouse
.getY() == 0)
257 && (mouse
.getX() > 0)
258 && (mouse
.getX() < boxPosition())
260 // Clicked between the left arrow and the box
262 if (value
< leftValue
) {
268 if ((mouse
.getY() == 0)
269 && (mouse
.getX() > boxPosition())
270 && (mouse
.getX() < getWidth() - 1)
272 // Clicked between the box and the right arrow
274 if (value
> rightValue
) {
282 * Handle mouse movement events.
284 * @param mouse mouse motion event
287 public void onMouseMotion(final TMouseEvent mouse
) {
289 if (rightValue
== leftValue
) {
294 if ((mouse
.isMouse1())
296 && (mouse
.getX() > 0)
297 && (mouse
.getX() < getWidth() - 1)
299 // Recompute value based on new box position
300 value
= (rightValue
- leftValue
) * (mouse
.getX()) / (getWidth() - 3) + leftValue
;
307 * Handle mouse button press events.
309 * @param mouse mouse button press event
312 public void onMouseDown(final TMouseEvent mouse
) {
313 if (rightValue
== leftValue
) {
318 if ((mouse
.getY() == 0)
319 && (mouse
.getX() == boxPosition())