X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fjexer%2FTScrollableWindow.java;h=1e260b3f86e00c7a7cc07409e28e0e1aa646fe03;hb=12b90437b5f22c2ae6e9b9b14c3b62b60f6143e5;hp=ce20df7df9f5d1f9d68cbccaa38345277feea2e7;hpb=71a389c9810382e014682dde52e94d3f34e385fa;p=fanfix.git diff --git a/src/jexer/TScrollableWindow.java b/src/jexer/TScrollableWindow.java index ce20df7..1e260b3 100644 --- a/src/jexer/TScrollableWindow.java +++ b/src/jexer/TScrollableWindow.java @@ -3,7 +3,7 @@ * * The MIT License (MIT) * - * Copyright (C) 2017 Kevin Lamonte + * Copyright (C) 2019 Kevin Lamonte * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -28,6 +28,7 @@ */ package jexer; +import jexer.event.TMouseEvent; import jexer.event.TResizeEvent; /** @@ -36,6 +37,10 @@ import jexer.event.TResizeEvent; */ public class TScrollableWindow extends TWindow implements Scrollable { + // ------------------------------------------------------------------------ + // Variables -------------------------------------------------------------- + // ------------------------------------------------------------------------ + /** * The horizontal scrollbar. */ @@ -46,45 +51,9 @@ public class TScrollableWindow extends TWindow implements Scrollable { */ protected TVScroller vScroller = null; - /** - * Place the scrollbars on the edge of this widget, and adjust bigChange - * to match the new size. This is called by onResize(). - */ - protected void placeScrollbars() { - if (hScroller != null) { - hScroller.setY(getHeight() - 2); - hScroller.setWidth(getWidth() - hScroller.getX() - 3); - hScroller.setBigChange(getWidth() - hScroller.getX() - 3); - } - if (vScroller != null) { - vScroller.setX(getWidth() - 2); - vScroller.setHeight(getHeight() - 2); - vScroller.setBigChange(getHeight() - 2); - } - } - - /** - * Recompute whatever data is displayed by this widget. - */ - public void reflowData() { - // Default: nothing to do - } - - /** - * Handle window/screen resize events. - * - * @param event resize event - */ - @Override - public void onResize(final TResizeEvent event) { - if (event.getType() == TResizeEvent.Type.WIDGET) { - reflowData(); - placeScrollbars(); - return; - } else { - super.onResize(event); - } - } + // ------------------------------------------------------------------------ + // Constructors ----------------------------------------------------------- + // ------------------------------------------------------------------------ /** * Public constructor. Window will be located at (0, 0). @@ -149,6 +118,73 @@ public class TScrollableWindow extends TWindow implements Scrollable { super(application, title, x, y, width, height, flags); } + // ------------------------------------------------------------------------ + // TWindow ---------------------------------------------------------------- + // ------------------------------------------------------------------------ + + /** + * Handle window/screen resize events. + * + * @param event resize event + */ + @Override + public void onResize(final TResizeEvent event) { + if (event.getType() == TResizeEvent.Type.WIDGET) { + reflowData(); + placeScrollbars(); + return; + } else { + super.onResize(event); + } + } + + /** + * Maximize window. + */ + @Override + public void maximize() { + super.maximize(); + placeScrollbars(); + } + + /** + * Restore (unmaximize) window. + */ + @Override + public void restore() { + super.restore(); + placeScrollbars(); + } + + // ------------------------------------------------------------------------ + // TScrollableWindow ------------------------------------------------------ + // ------------------------------------------------------------------------ + + /** + * Place the scrollbars on the edge of this widget, and adjust bigChange + * to match the new size. This is called by onResize(). + */ + protected void placeScrollbars() { + if (hScroller != null) { + hScroller.setX(Math.min(Math.max(0, getWidth() - 17), 17)); + hScroller.setY(getHeight() - 2); + hScroller.setWidth(getWidth() - hScroller.getX() - 3); + hScroller.setBigChange(getWidth() - hScroller.getX() - 3); + } + if (vScroller != null) { + vScroller.setX(getWidth() - 2); + vScroller.setHeight(getHeight() - 2); + vScroller.setBigChange(getHeight() - 2); + } + } + + /** + * Recompute whatever data is displayed by this widget. + */ + public void reflowData() { + // Default: nothing to do + } + /** * Get the horizontal scrollbar, or null if this Viewport does not * support horizontal scrolling. @@ -599,4 +635,46 @@ public class TScrollableWindow extends TWindow implements Scrollable { } } + /** + * Check if a mouse press/release/motion event coordinate is over the + * vertical scrollbar. + * + * @param mouse a mouse-based event + * @return whether or not the mouse is on the scrollbar + */ + protected final boolean mouseOnVerticalScroller(final TMouseEvent mouse) { + if (vScroller == null) { + return false; + } + if ((mouse.getAbsoluteX() == vScroller.getAbsoluteX()) + && (mouse.getAbsoluteY() >= vScroller.getAbsoluteY()) + && (mouse.getAbsoluteY() < vScroller.getAbsoluteY() + + vScroller.getHeight()) + ) { + return true; + } + return false; + } + + /** + * Check if a mouse press/release/motion event coordinate is over the + * horizontal scrollbar. + * + * @param mouse a mouse-based event + * @return whether or not the mouse is on the scrollbar + */ + protected final boolean mouseOnHorizontalScroller(final TMouseEvent mouse) { + if (hScroller == null) { + return false; + } + if ((mouse.getAbsoluteY() == hScroller.getAbsoluteY()) + && (mouse.getAbsoluteX() >= hScroller.getAbsoluteX()) + && (mouse.getAbsoluteX() < hScroller.getAbsoluteX() + + hScroller.getWidth()) + ) { + return true; + } + return false; + } + }