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
170 * Compute the position of the scroll box (a.k.a. grip, thumb).
172 * @return Y position of the box, between 1 and width - 2
174 private int boxPosition() {
175 return (getWidth() - 3) * (value
- leftValue
) / (rightValue
- leftValue
) + 1;
179 * Draw a horizontal scroll bar.
183 CellAttributes arrowColor
= getTheme().getColor("tscroller.arrows");
184 CellAttributes barColor
= getTheme().getColor("tscroller.bar");
185 getScreen().putCharXY(0, 0, GraphicsChars
.CP437
[0x11], arrowColor
);
186 getScreen().putCharXY(getWidth() - 1, 0, GraphicsChars
.CP437
[0x10],
190 if (rightValue
> leftValue
) {
191 getScreen().hLineXY(1, 0, getWidth() - 2, GraphicsChars
.CP437
[0xB1],
193 getScreen().putCharXY(boxPosition(), 0, GraphicsChars
.BOX
,
196 getScreen().hLineXY(1, 0, getWidth() - 2, GraphicsChars
.HATCH
,
203 * Perform a small step change left.
205 public void decrement() {
206 if (leftValue
== rightValue
) {
209 value
-= smallChange
;
210 if (value
< leftValue
) {
216 * Perform a small step change right.
218 public void increment() {
219 if (leftValue
== rightValue
) {
222 value
+= smallChange
;
223 if (value
> rightValue
) {
229 * Handle mouse button releases.
231 * @param mouse mouse button release event
234 public void onMouseUp(final TMouseEvent mouse
) {
241 if (rightValue
== leftValue
) {
245 if ((mouse
.getX() == 0)
246 && (mouse
.getY() == 0)
248 // Clicked on the left arrow
253 if ((mouse
.getY() == 0)
254 && (mouse
.getX() == getWidth() - 1)
256 // Clicked on the right arrow
261 if ((mouse
.getY() == 0)
262 && (mouse
.getX() > 0)
263 && (mouse
.getX() < boxPosition())
265 // Clicked between the left arrow and the box
267 if (value
< leftValue
) {
273 if ((mouse
.getY() == 0)
274 && (mouse
.getX() > boxPosition())
275 && (mouse
.getX() < getWidth() - 1)
277 // Clicked between the box and the right arrow
279 if (value
> rightValue
) {
287 * Handle mouse movement events.
289 * @param mouse mouse motion event
292 public void onMouseMotion(final TMouseEvent mouse
) {
294 if (rightValue
== leftValue
) {
299 if ((mouse
.getMouse1())
301 && (mouse
.getX() > 0)
302 && (mouse
.getX() < getWidth() - 1)
304 // Recompute value based on new box position
305 value
= (rightValue
- leftValue
) * (mouse
.getX()) / (getWidth() - 3) + leftValue
;
312 * Handle mouse button press events.
314 * @param mouse mouse button press event
317 public void onMouseDown(final TMouseEvent mouse
) {
318 if (rightValue
== leftValue
) {
323 if ((mouse
.getY() == 0)
324 && (mouse
.getX() == boxPosition())