Merge branch 'subtree'
[fanfix.git] / src / jexer / TSpinner.java
CommitLineData
daa4106c 1/*
7272e49f
KL
2 * Jexer - Java Text User Interface
3 *
e16dda65 4 * The MIT License (MIT)
7272e49f 5 *
a69ed767 6 * Copyright (C) 2019 Kevin Lamonte
7272e49f 7 *
e16dda65
KL
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:
7272e49f 14 *
e16dda65
KL
15 * The above copyright notice and this permission notice shall be included in
16 * all copies or substantial portions of the Software.
7272e49f 17 *
e16dda65
KL
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.
7272e49f
KL
25 *
26 * @author Kevin Lamonte [kevin.lamonte@gmail.com]
27 * @version 1
28 */
29package jexer;
30
31import jexer.bits.CellAttributes;
32import jexer.bits.GraphicsChars;
33import jexer.event.TKeypressEvent;
34import jexer.event.TMouseEvent;
051e2913 35import static jexer.TKeypress.*;
7272e49f
KL
36
37/**
382bc294 38 * TSpinner implements a simple up/down spinner.
7272e49f 39 */
051e2913 40public class TSpinner extends TWidget {
7272e49f 41
d36057df
KL
42 // ------------------------------------------------------------------------
43 // Variables --------------------------------------------------------------
44 // ------------------------------------------------------------------------
45
7272e49f 46 /**
051e2913 47 * The action to perform when the user clicks on the up arrow.
7272e49f 48 */
051e2913 49 private TAction upAction = null;
7272e49f
KL
50
51 /**
051e2913 52 * The action to perform when the user clicks on the down arrow.
7272e49f 53 */
051e2913 54 private TAction downAction = null;
7272e49f 55
d36057df
KL
56 // ------------------------------------------------------------------------
57 // Constructors -----------------------------------------------------------
58 // ------------------------------------------------------------------------
59
7272e49f
KL
60 /**
61 * Public constructor.
62 *
63 * @param parent parent widget
64 * @param x column relative to parent
65 * @param y row relative to parent
051e2913
KL
66 * @param upAction action to call when the up arrow is clicked or pressed
67 * @param downAction action to call when the down arrow is clicked or
68 * pressed
7272e49f 69 */
051e2913
KL
70 public TSpinner(final TWidget parent, final int x, final int y,
71 final TAction upAction, final TAction downAction) {
7272e49f
KL
72
73 // Set parent and window
051e2913 74 super(parent, x, y, 2, 1);
7272e49f 75
051e2913
KL
76 this.upAction = upAction;
77 this.downAction = downAction;
7272e49f
KL
78 }
79
d36057df
KL
80 // ------------------------------------------------------------------------
81 // Event handlers ---------------------------------------------------------
82 // ------------------------------------------------------------------------
83
7272e49f 84 /**
051e2913
KL
85 * Returns true if the mouse is currently on the up arrow.
86 *
87 * @param mouse mouse event
88 * @return true if the mouse is currently on the up arrow
89 */
90 private boolean mouseOnUpArrow(final TMouseEvent mouse) {
91 if ((mouse.getY() == 0)
e23ea538 92 && (mouse.getX() == getWidth() - 2)
051e2913
KL
93 ) {
94 return true;
95 }
96 return false;
97 }
98
99 /**
100 * Returns true if the mouse is currently on the down arrow.
7272e49f
KL
101 *
102 * @param mouse mouse event
051e2913 103 * @return true if the mouse is currently on the down arrow
7272e49f 104 */
051e2913 105 private boolean mouseOnDownArrow(final TMouseEvent mouse) {
00d2622b 106 if ((mouse.getY() == 0)
e23ea538 107 && (mouse.getX() == getWidth() - 1)
d36057df 108 ) {
7272e49f
KL
109 return true;
110 }
111 return false;
112 }
113
d36057df
KL
114 /**
115 * Handle mouse checkbox presses.
116 *
117 * @param mouse mouse button down event
118 */
119 @Override
120 public void onMouseDown(final TMouseEvent mouse) {
051e2913
KL
121 if ((mouseOnUpArrow(mouse)) && (mouse.isMouse1())) {
122 up();
123 } else if ((mouseOnDownArrow(mouse)) && (mouse.isMouse1())) {
124 down();
d36057df
KL
125 }
126 }
127
128 /**
129 * Handle keystrokes.
130 *
131 * @param keypress keystroke event
132 */
133 @Override
134 public void onKeypress(final TKeypressEvent keypress) {
051e2913
KL
135 if (keypress.equals(kbUp)) {
136 up();
137 return;
138 }
139 if (keypress.equals(kbDown)) {
140 down();
d36057df
KL
141 return;
142 }
143
144 // Pass to parent for the things we don't care about.
145 super.onKeypress(keypress);
146 }
147
148 // ------------------------------------------------------------------------
149 // TWidget ----------------------------------------------------------------
150 // ------------------------------------------------------------------------
151
7272e49f 152 /**
051e2913 153 * Draw the spinner arrows.
7272e49f
KL
154 */
155 @Override
156 public void draw() {
051e2913 157 CellAttributes spinnerColor;
7272e49f 158
7c870d89 159 if (isAbsoluteActive()) {
051e2913 160 spinnerColor = getTheme().getColor("tspinner.active");
7272e49f 161 } else {
051e2913 162 spinnerColor = getTheme().getColor("tspinner.inactive");
7272e49f
KL
163 }
164
a69ed767
KL
165 putCharXY(getWidth() - 2, 0, GraphicsChars.UPARROW, spinnerColor);
166 putCharXY(getWidth() - 1, 0, GraphicsChars.DOWNARROW, spinnerColor);
7272e49f
KL
167 }
168
d36057df 169 // ------------------------------------------------------------------------
051e2913 170 // TSpinner ---------------------------------------------------------------
d36057df
KL
171 // ------------------------------------------------------------------------
172
7272e49f 173 /**
051e2913 174 * Perform the "up" action.
7272e49f 175 */
051e2913
KL
176 private void up() {
177 if (upAction != null) {
a524aa2e 178 upAction.DO(this);
051e2913 179 }
7272e49f
KL
180 }
181
182 /**
051e2913 183 * Perform the "down" action.
7272e49f 184 */
051e2913
KL
185 private void down() {
186 if (downAction != null) {
a524aa2e 187 downAction.DO(this);
051e2913 188 }
7272e49f
KL
189 }
190
191}