*
* 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"),
*/
package jexer;
+import jexer.event.TMouseEvent;
import jexer.event.TResizeEvent;
/**
*/
public class TScrollableWindow extends TWindow implements Scrollable {
+ // ------------------------------------------------------------------------
+ // Variables --------------------------------------------------------------
+ // ------------------------------------------------------------------------
+
/**
* The horizontal scrollbar.
*/
*/
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).
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.
}
}
+ /**
+ * 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;
+ }
+
}