X-Git-Url: http://git.nikiroo.be/?p=fanfix.git;a=blobdiff_plain;f=src%2Fjexer%2FTVScroller.java;h=444e058542c8d566be5395f2f51ee1e88ff57a28;hp=459ef4fbe25986af4984cca3284eef368ad47ea9;hb=HEAD;hpb=cc99cba8bdfb594d4606949f1763898a420e7f34 diff --git a/src/jexer/TVScroller.java b/src/jexer/TVScroller.java index 459ef4f..444e058 100644 --- a/src/jexer/TVScroller.java +++ b/src/jexer/TVScroller.java @@ -1,29 +1,27 @@ -/** +/* * Jexer - Java Text User Interface * - * License: LGPLv3 or later - * - * This module is licensed under the GNU Lesser General Public License - * Version 3. Please see the file "COPYING" in this directory for more - * information about the GNU Lesser General Public License Version 3. + * The MIT License (MIT) * - * Copyright (C) 2015 Kevin Lamonte + * Copyright (C) 2019 Kevin Lamonte * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see - * http://www.gnu.org/licenses/, or write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA - * 02110-1301 USA + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. * * @author Kevin Lamonte [kevin.lamonte@gmail.com] * @version 1 @@ -37,13 +35,199 @@ import jexer.event.TMouseEvent; /** * TVScroller implements a simple vertical scroll bar. */ -public final class TVScroller extends TWidget { +public class TVScroller extends TWidget { + + // ------------------------------------------------------------------------ + // Variables -------------------------------------------------------------- + // ------------------------------------------------------------------------ /** * Value that corresponds to being on the top edge of the scroll bar. */ private int topValue = 0; + /** + * Value that corresponds to being on the bottom edge of the scroll bar. + */ + private int bottomValue = 100; + + /** + * Current value of the scroll. + */ + private int value = 0; + + /** + * The increment for clicking on an arrow. + */ + private int smallChange = 1; + + /** + * The increment for clicking in the bar between the box and an arrow. + */ + private int bigChange = 20; + + /** + * When true, the user is dragging the scroll box. + */ + private boolean inScroll = false; + + // ------------------------------------------------------------------------ + // Constructors ----------------------------------------------------------- + // ------------------------------------------------------------------------ + + /** + * Public constructor. + * + * @param parent parent widget + * @param x column relative to parent + * @param y row relative to parent + * @param height height of scroll bar + */ + public TVScroller(final TWidget parent, final int x, final int y, + final int height) { + + // Set parent and window + super(parent, x, y, 1, height); + } + + // ------------------------------------------------------------------------ + // Event handlers --------------------------------------------------------- + // ------------------------------------------------------------------------ + + /** + * Handle mouse button releases. + * + * @param mouse mouse button release event + */ + @Override + public void onMouseUp(final TMouseEvent mouse) { + if (bottomValue == topValue) { + return; + } + + if (inScroll) { + inScroll = false; + return; + } + + if ((mouse.getX() == 0) + && (mouse.getY() == 0) + ) { + // Clicked on the top arrow + decrement(); + return; + } + + if ((mouse.getX() == 0) + && (mouse.getY() == getHeight() - 1) + ) { + // Clicked on the bottom arrow + increment(); + return; + } + + if ((mouse.getX() == 0) + && (mouse.getY() > 0) + && (mouse.getY() < boxPosition()) + ) { + // Clicked between the top arrow and the box + value -= bigChange; + if (value < topValue) { + value = topValue; + } + return; + } + + if ((mouse.getX() == 0) + && (mouse.getY() > boxPosition()) + && (mouse.getY() < getHeight() - 1) + ) { + // Clicked between the box and the bottom arrow + value += bigChange; + if (value > bottomValue) { + value = bottomValue; + } + return; + } + } + + /** + * Handle mouse movement events. + * + * @param mouse mouse motion event + */ + @Override + public void onMouseMotion(final TMouseEvent mouse) { + if (bottomValue == topValue) { + return; + } + + if ((mouse.isMouse1()) + && (inScroll) + && (mouse.getY() > 0) + && (mouse.getY() < getHeight() - 1) + ) { + // Recompute value based on new box position + value = (bottomValue - topValue) + * (mouse.getY()) / (getHeight() - 3) + topValue; + if (value > bottomValue) { + value = bottomValue; + } + if (value < topValue) { + value = topValue; + } + return; + } + + inScroll = false; + } + + /** + * Handle mouse press events. + * + * @param mouse mouse button press event + */ + @Override + public void onMouseDown(final TMouseEvent mouse) { + if (bottomValue == topValue) { + return; + } + + if ((mouse.getX() == 0) + && (mouse.getY() == boxPosition()) + ) { + inScroll = true; + return; + } + } + + // ------------------------------------------------------------------------ + // TWidget ---------------------------------------------------------------- + // ------------------------------------------------------------------------ + + /** + * Draw a vertical scroll bar. + */ + @Override + public void draw() { + CellAttributes arrowColor = getTheme().getColor("tscroller.arrows"); + CellAttributes barColor = getTheme().getColor("tscroller.bar"); + putCharXY(0, 0, GraphicsChars.CP437[0x1E], arrowColor); + putCharXY(0, getHeight() - 1, GraphicsChars.CP437[0x1F], arrowColor); + + // Place the box + if (bottomValue > topValue) { + vLineXY(0, 1, getHeight() - 2, GraphicsChars.CP437[0xB1], barColor); + putCharXY(0, boxPosition(), GraphicsChars.BOX, arrowColor); + } else { + vLineXY(0, 1, getHeight() - 2, GraphicsChars.HATCH, barColor); + } + } + + // ------------------------------------------------------------------------ + // TVScroller ------------------------------------------------------------- + // ------------------------------------------------------------------------ + /** * Get the value that corresponds to being on the top edge of the scroll * bar. @@ -64,11 +248,6 @@ public final class TVScroller extends TWidget { this.topValue = topValue; } - /** - * Value that corresponds to being on the bottom edge of the scroll bar. - */ - private int bottomValue = 100; - /** * Get the value that corresponds to being on the bottom edge of the * scroll bar. @@ -89,11 +268,6 @@ public final class TVScroller extends TWidget { this.bottomValue = bottomValue; } - /** - * Current value of the scroll. - */ - private int value = 0; - /** * Get current value of the scroll. * @@ -113,9 +287,13 @@ public final class TVScroller extends TWidget { } /** - * The increment for clicking on an arrow. + * Get the increment for clicking on an arrow. + * + * @return the increment value */ - private int smallChange = 1; + public int getSmallChange() { + return smallChange; + } /** * Set the increment for clicking on an arrow. @@ -127,9 +305,14 @@ public final class TVScroller extends TWidget { } /** - * The increment for clicking in the bar between the box and an arrow. + * Set the increment for clicking in the bar between the box and an + * arrow. + * + * @return the increment value */ - private int bigChange = 20; + public int getBigChange() { + return bigChange; + } /** * Set the increment for clicking in the bar between the box and an @@ -141,64 +324,15 @@ public final class TVScroller extends TWidget { this.bigChange = bigChange; } - /** - * When true, the user is dragging the scroll box. - */ - private boolean inScroll = false; - - /** - * Public constructor. - * - * @param parent parent widget - * @param x column relative to parent - * @param y row relative to parent - * @param width height of scroll bar - */ - public TVScroller(final TWidget parent, final int x, final int y, - final int height) { - - // Set parent and window - super(parent); - - setX(x); - setY(y); - setHeight(height); - setWidth(1); - } - /** * Compute the position of the scroll box (a.k.a. grip, thumb). * - * @param Y position of the box, between 1 and height - 2 + * @return Y position of the box, between 1 and height - 2 */ private int boxPosition() { return (getHeight() - 3) * (value - topValue) / (bottomValue - topValue) + 1; } - /** - * Draw a vertical scroll bar. - */ - @Override - public void draw() { - CellAttributes arrowColor = getTheme().getColor("tscroller.arrows"); - CellAttributes barColor = getTheme().getColor("tscroller.bar"); - getScreen().putCharXY(0, 0, GraphicsChars.CP437[0x1E], arrowColor); - getScreen().putCharXY(0, getHeight() - 1, GraphicsChars.CP437[0x1F], - arrowColor); - - // Place the box - if (bottomValue > topValue) { - getScreen().vLineXY(0, 1, getHeight() - 2, - GraphicsChars.CP437[0xB1], barColor); - getScreen().putCharXY(0, boxPosition(), GraphicsChars.BOX, - arrowColor); - } else { - getScreen().vLineXY(0, 1, getHeight() - 2, GraphicsChars.HATCH, - barColor); - } - - } - /** * Perform a small step change up. */ @@ -265,104 +399,4 @@ public final class TVScroller extends TWidget { value = bottomValue; } - /** - * Handle mouse button releases. - * - * @param mouse mouse button release event - */ - @Override - public void onMouseUp(final TMouseEvent mouse) { - if (bottomValue == topValue) { - return; - } - - if (inScroll) { - inScroll = false; - return; - } - - if ((mouse.getX() == 0) - && (mouse.getY() == 0) - ) { - // Clicked on the top arrow - decrement(); - return; - } - - if ((mouse.getX() == 0) - && (mouse.getY() == getHeight() - 1) - ) { - // Clicked on the bottom arrow - increment(); - return; - } - - if ((mouse.getX() == 0) - && (mouse.getY() > 0) - && (mouse.getY() < boxPosition()) - ) { - // Clicked between the top arrow and the box - value -= bigChange; - if (value < topValue) { - value = topValue; - } - return; - } - - if ((mouse.getX() == 0) - && (mouse.getY() > boxPosition()) - && (mouse.getY() < getHeight() - 1) - ) { - // Clicked between the box and the bottom arrow - value += bigChange; - if (value > bottomValue) { - value = bottomValue; - } - return; - } - } - - /** - * Handle mouse movement events. - * - * @param mouse mouse motion event - */ - @Override - public void onMouseMotion(final TMouseEvent mouse) { - if (bottomValue == topValue) { - return; - } - - if ((mouse.getMouse1()) && - (inScroll) && - (mouse.getY() > 0) && - (mouse.getY() < getHeight() - 1) - ) { - // Recompute value based on new box position - value = (bottomValue - topValue) * (mouse.getY()) / (getHeight() - 3) + topValue; - return; - } - - inScroll = false; - } - - /** - * Handle mouse press events. - * - * @param mouse mouse button press event - */ - @Override - public void onMouseDown(final TMouseEvent mouse) { - if (bottomValue == topValue) { - return; - } - - if ((mouse.getX() == 0) - && (mouse.getY() == boxPosition()) - ) { - inScroll = true; - return; - } - } - }