Merge branch 'subtree'
[fanfix.git] / src / jexer / TScrollableWindow.java
index 8935ac349298ebed6fb4840467dcdec802e4b217..1e260b3f86e00c7a7cc07409e28e0e1aa646fe03 100644 (file)
@@ -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() - 3);
-            hScroller.setBigChange(getWidth() - 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;
+    }
+
 }