diff --git a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ui/SmartScroller.java b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ui/SmartScroller.java index f83f5b3b..1a52cd42 100644 --- a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ui/SmartScroller.java +++ b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ui/SmartScroller.java @@ -1,41 +1,43 @@ package ee.carlrobert.codegpt.toolwindow.chat.ui; -import javax.swing.*; -import javax.swing.text.DefaultCaret; -import javax.swing.text.JTextComponent; -import java.awt.*; +import java.awt.Component; import java.awt.event.AdjustmentEvent; import java.awt.event.AdjustmentListener; +import javax.swing.BoundedRangeModel; +import javax.swing.JScrollBar; +import javax.swing.JScrollPane; +import javax.swing.SwingUtilities; +import javax.swing.text.DefaultCaret; +import javax.swing.text.JTextComponent; /** - * SmartScroller taken from http://tips4java.wordpress.com/2013/03/03/smart-scrolling/ + * SmartScroller taken from http://tips4java.wordpress.com/2013/03/03/smart-scrolling/ * - * The SmartScroller will attempt to keep the viewport positioned based on - * the users interaction with the scrollbar. The normal behaviour is to keep - * the viewport positioned to see new data as it is dynamically added. + *
The SmartScroller will attempt to keep the viewport positioned based on the users interaction + * with the scrollbar. The normal behaviour is to keep the viewport positioned to see new data as it + * is dynamically added. * - * Assuming vertical scrolling and data is added to the bottom: + *
Assuming vertical scrolling and data is added to the bottom: * - * - when the viewport is at the bottom and new data is added, - * then automatically scroll the viewport to the bottom - * - when the viewport is not at the bottom and new data is added, - * then do nothing with the viewport + *
- when the viewport is at the bottom and new data is added, then automatically scroll the + * viewport to the bottom + * - when the viewport is not at the bottom and new data is added, then do nothing with the viewport * - * Assuming vertical scrolling and data is added to the top: + *
Assuming vertical scrolling and data is added to the top: * - * - when the viewport is at the top and new data is added, - * then do nothing with the viewport - * - when the viewport is not at the top and new data is added, then adjust - * the viewport to the relative position it was at before the data was added + *
- when the viewport is at the top and new data is added, then do nothing with the viewport + * - when the viewport is not at the top and new data is added, then adjust the viewport to the + * relative position it was at before the data was added * - * Similiar logic would apply for horizontal scrolling. + *
Similar logic would apply for horizontal scrolling. */ public class SmartScroller implements AdjustmentListener { - public final static int HORIZONTAL = 0; - public final static int VERTICAL = 1; - public final static int START = 0; - public final static int END = 1; + public static final int HORIZONTAL = 0; + public static final int VERTICAL = 1; + + public static final int START = 0; + public static final int END = 1; private int viewportPosition; @@ -46,8 +48,7 @@ public class SmartScroller implements AdjustmentListener { private int previousMaximum = -1; /** - * Convenience constructor. - * Scroll direction is VERTICAL and viewport position is at the END. + * Convenience constructor. Scroll direction is VERTICAL and viewport position is at the END. * * @param scrollPane the scroll pane to monitor */ @@ -56,8 +57,7 @@ public class SmartScroller implements AdjustmentListener { } /** - * Convenience constructor. - * Scroll direction is VERTICAL. + * Convenience constructor. Scroll direction is VERTICAL. * * @param scrollPane the scroll pane to monitor * @param viewportPosition valid values are START and END @@ -70,27 +70,29 @@ public class SmartScroller implements AdjustmentListener { * Specify how the SmartScroller will function. * * @param scrollPane the scroll pane to monitor - * @param scrollDirection indicates which JScrollBar to monitor. - * Valid values are HORIZONTAL and VERTICAL. - * @param viewportPosition indicates where the viewport will normally be - * positioned as data is added. - * Valid values are START and END + * @param scrollDirection indicates which JScrollBar to monitor. Valid values are HORIZONTAL and + * VERTICAL. + * @param viewportPosition indicates where the viewport will normally be positioned as data is + * added. Valid values are START and END */ public SmartScroller(JScrollPane scrollPane, int scrollDirection, int viewportPosition) { if (scrollDirection != HORIZONTAL - && scrollDirection != VERTICAL) + && scrollDirection != VERTICAL) { throw new IllegalArgumentException("invalid scroll direction specified"); + } if (viewportPosition != START - && viewportPosition != END) + && viewportPosition != END) { throw new IllegalArgumentException("invalid viewport position specified"); + } this.viewportPosition = viewportPosition; - if (scrollDirection == HORIZONTAL) + if (scrollDirection == HORIZONTAL) { scrollBar = scrollPane.getHorizontalScrollBar(); - else + } else { scrollBar = scrollPane.getVerticalScrollBar(); + } scrollBar.addAdjustmentListener(this); @@ -134,10 +136,11 @@ public class SmartScroller implements AdjustmentListener { // Check if the user has manually repositioned the scrollbar if (valueChanged && !maximumChanged) { - if (viewportPosition == START) + if (viewportPosition == START) { adjustScrollBar = value != 0; - else + } else { adjustScrollBar = value + extent >= maximum; + } } // Reset the "value" so we can reposition the viewport and