X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fjexer%2FTVScroller.java;h=459ef4fbe25986af4984cca3284eef368ad47ea9;hb=cc99cba8bdfb594d4606949f1763898a420e7f34;hp=a0a591540fe4bcb68d66cd0857a0b84fdb36380f;hpb=128e5be1ffb65d047d8461ea1cfb65c22686ec91;p=fanfix.git diff --git a/src/jexer/TVScroller.java b/src/jexer/TVScroller.java index a0a5915..459ef4f 100644 --- a/src/jexer/TVScroller.java +++ b/src/jexer/TVScroller.java @@ -30,9 +30,339 @@ */ package jexer; +import jexer.bits.CellAttributes; +import jexer.bits.GraphicsChars; +import jexer.event.TMouseEvent; + /** * TVScroller implements a simple vertical scroll bar. */ public final class TVScroller extends TWidget { + /** + * Value that corresponds to being on the top edge of the scroll bar. + */ + private int topValue = 0; + + /** + * Get the value that corresponds to being on the top edge of the scroll + * bar. + * + * @return the scroll value + */ + public int getTopValue() { + return topValue; + } + + /** + * Set the value that corresponds to being on the top edge of the scroll + * bar. + * + * @param topValue the new scroll value + */ + public void setTopValue(final int topValue) { + 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. + * + * @return the scroll value + */ + public int getBottomValue() { + return bottomValue; + } + + /** + * Set the value that corresponds to being on the bottom edge of the + * scroll bar. + * + * @param bottomValue the new scroll value + */ + public void setBottomValue(final int bottomValue) { + this.bottomValue = bottomValue; + } + + /** + * Current value of the scroll. + */ + private int value = 0; + + /** + * Get current value of the scroll. + * + * @return the scroll value + */ + public int getValue() { + return value; + } + + /** + * Set current value of the scroll. + * + * @param value the new scroll value + */ + public void setValue(final int value) { + this.value = value; + } + + /** + * The increment for clicking on an arrow. + */ + private int smallChange = 1; + + /** + * Set the increment for clicking on an arrow. + * + * @param smallChange the new increment value + */ + public void setSmallChange(final int smallChange) { + this.smallChange = smallChange; + } + + /** + * The increment for clicking in the bar between the box and an arrow. + */ + private int bigChange = 20; + + /** + * Set the increment for clicking in the bar between the box and an + * arrow. + * + * @param bigChange the new increment value + */ + public void setBigChange(final int bigChange) { + 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 + */ + 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. + */ + public void decrement() { + if (bottomValue == topValue) { + return; + } + value -= smallChange; + if (value < topValue) { + value = topValue; + } + } + + /** + * Perform a small step change down. + */ + public void increment() { + if (bottomValue == topValue) { + return; + } + value += smallChange; + if (value > bottomValue) { + value = bottomValue; + } + } + + /** + * Perform a big step change up. + */ + public void bigDecrement() { + if (bottomValue == topValue) { + return; + } + value -= bigChange; + if (value < topValue) { + value = topValue; + } + } + + /** + * Perform a big step change down. + */ + public void bigIncrement() { + if (bottomValue == topValue) { + return; + } + value += bigChange; + if (value > bottomValue) { + value = bottomValue; + } + } + + /** + * Go to the top edge of the scroller. + */ + public void toTop() { + value = topValue; + } + + /** + * Go to the bottom edge of the scroller. + */ + public void toBottom() { + 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; + } + } + }