jdk/src/share/classes/javax/swing/plaf/basic/BasicScrollPaneUI.java
changeset 25763 51d1f910f68d
parent 23010 6dadb192ad81
equal deleted inserted replaced
25762:c4a3548120c6 25763:51d1f910f68d
     1 /*
     1 /*
     2  * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.  Oracle designates this
     7  * published by the Free Software Foundation.  Oracle designates this
    50  * @author Hans Muller
    50  * @author Hans Muller
    51  */
    51  */
    52 public class BasicScrollPaneUI
    52 public class BasicScrollPaneUI
    53     extends ScrollPaneUI implements ScrollPaneConstants
    53     extends ScrollPaneUI implements ScrollPaneConstants
    54 {
    54 {
       
    55     /**
       
    56      * The instance of {@code JScrollPane}.
       
    57      */
    55     protected JScrollPane scrollpane;
    58     protected JScrollPane scrollpane;
       
    59 
       
    60     /**
       
    61      * {@code ChangeListener} installed on the vertical scrollbar.
       
    62      */
    56     protected ChangeListener vsbChangeListener;
    63     protected ChangeListener vsbChangeListener;
       
    64 
       
    65     /**
       
    66      * {@code ChangeListener} installed on the horizontal scrollbar.
       
    67      */
    57     protected ChangeListener hsbChangeListener;
    68     protected ChangeListener hsbChangeListener;
       
    69 
       
    70     /**
       
    71      * {@code ChangeListener} installed on the viewport.
       
    72      */
    58     protected ChangeListener viewportChangeListener;
    73     protected ChangeListener viewportChangeListener;
       
    74 
       
    75     /**
       
    76      * {@code PropertyChangeListener} installed on the scroll pane.
       
    77      */
    59     protected PropertyChangeListener spPropertyChangeListener;
    78     protected PropertyChangeListener spPropertyChangeListener;
    60     private MouseWheelListener mouseScrollListener;
    79     private MouseWheelListener mouseScrollListener;
    61     private int oldExtent = Integer.MIN_VALUE;
    80     private int oldExtent = Integer.MIN_VALUE;
    62 
    81 
    63     /**
    82     /**
    64      * PropertyChangeListener installed on the vertical scrollbar.
    83      * {@code PropertyChangeListener} installed on the vertical scrollbar.
    65      */
    84      */
    66     private PropertyChangeListener vsbPropertyChangeListener;
    85     private PropertyChangeListener vsbPropertyChangeListener;
    67 
    86 
    68     /**
    87     /**
    69      * PropertyChangeListener installed on the horizontal scrollbar.
    88      * {@code PropertyChangeListener} installed on the horizontal scrollbar.
    70      */
    89      */
    71     private PropertyChangeListener hsbPropertyChangeListener;
    90     private PropertyChangeListener hsbPropertyChangeListener;
    72 
    91 
    73     private Handler handler;
    92     private Handler handler;
    74 
    93 
    77      * before the value of "extent" was set in right-to-left component
    96      * before the value of "extent" was set in right-to-left component
    78      * orientation.
    97      * orientation.
    79      */
    98      */
    80     private boolean setValueCalled = false;
    99     private boolean setValueCalled = false;
    81 
   100 
    82 
   101     /**
       
   102      * Returns a new instance of {@code BasicScrollPaneUI}.
       
   103      *
       
   104      * @param x a component.
       
   105      * @return a new instance of {@code BasicScrollPaneUI}
       
   106      */
    83     public static ComponentUI createUI(JComponent x) {
   107     public static ComponentUI createUI(JComponent x) {
    84         return new BasicScrollPaneUI();
   108         return new BasicScrollPaneUI();
    85     }
   109     }
    86 
   110 
    87     static void loadActionMap(LazyActionMap map) {
   111     static void loadActionMap(LazyActionMap map) {
   113      */
   137      */
   114     public Dimension getMaximumSize(JComponent c) {
   138     public Dimension getMaximumSize(JComponent c) {
   115         return new Dimension(Short.MAX_VALUE, Short.MAX_VALUE);
   139         return new Dimension(Short.MAX_VALUE, Short.MAX_VALUE);
   116     }
   140     }
   117 
   141 
   118 
   142     /**
       
   143      * Installs default properties.
       
   144      *
       
   145      * @param scrollpane an instance of {@code JScrollPane}
       
   146      */
   119     protected void installDefaults(JScrollPane scrollpane)
   147     protected void installDefaults(JScrollPane scrollpane)
   120     {
   148     {
   121         LookAndFeel.installBorder(scrollpane, "ScrollPane.border");
   149         LookAndFeel.installBorder(scrollpane, "ScrollPane.border");
   122         LookAndFeel.installColorsAndFont(scrollpane,
   150         LookAndFeel.installColorsAndFont(scrollpane,
   123             "ScrollPane.background",
   151             "ScrollPane.background",
   130             scrollpane.setViewportBorder(vpBorder);
   158             scrollpane.setViewportBorder(vpBorder);
   131         }
   159         }
   132         LookAndFeel.installProperty(scrollpane, "opaque", Boolean.TRUE);
   160         LookAndFeel.installProperty(scrollpane, "opaque", Boolean.TRUE);
   133     }
   161     }
   134 
   162 
   135 
   163     /**
       
   164      * Registers listeners.
       
   165      *
       
   166      * @param c an instance of {@code JScrollPane}
       
   167      */
   136     protected void installListeners(JScrollPane c)
   168     protected void installListeners(JScrollPane c)
   137     {
   169     {
   138         vsbChangeListener = createVSBChangeListener();
   170         vsbChangeListener = createVSBChangeListener();
   139         vsbPropertyChangeListener = createVSBPropertyChangeListener();
   171         vsbPropertyChangeListener = createVSBPropertyChangeListener();
   140         hsbChangeListener = createHSBChangeListener();
   172         hsbChangeListener = createHSBChangeListener();
   163     mouseScrollListener = createMouseWheelListener();
   195     mouseScrollListener = createMouseWheelListener();
   164     scrollpane.addMouseWheelListener(mouseScrollListener);
   196     scrollpane.addMouseWheelListener(mouseScrollListener);
   165 
   197 
   166     }
   198     }
   167 
   199 
       
   200     /**
       
   201      * Registers keyboard actions.
       
   202      *
       
   203      * @param c an instance of {@code JScrollPane}
       
   204      */
   168     protected void installKeyboardActions(JScrollPane c) {
   205     protected void installKeyboardActions(JScrollPane c) {
   169         InputMap inputMap = getInputMap(JComponent.
   206         InputMap inputMap = getInputMap(JComponent.
   170                                   WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
   207                                   WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
   171 
   208 
   172         SwingUtilities.replaceUIInputMap(c, JComponent.
   209         SwingUtilities.replaceUIInputMap(c, JComponent.
   199         installDefaults(scrollpane);
   236         installDefaults(scrollpane);
   200         installListeners(scrollpane);
   237         installListeners(scrollpane);
   201         installKeyboardActions(scrollpane);
   238         installKeyboardActions(scrollpane);
   202     }
   239     }
   203 
   240 
   204 
   241     /**
       
   242      * Uninstalls default properties.
       
   243      *
       
   244      * @param c an instance of {@code JScrollPane}
       
   245      */
   205     protected void uninstallDefaults(JScrollPane c) {
   246     protected void uninstallDefaults(JScrollPane c) {
   206         LookAndFeel.uninstallBorder(scrollpane);
   247         LookAndFeel.uninstallBorder(scrollpane);
   207 
   248 
   208         if (scrollpane.getViewportBorder() instanceof UIResource) {
   249         if (scrollpane.getViewportBorder() instanceof UIResource) {
   209             scrollpane.setViewportBorder(null);
   250             scrollpane.setViewportBorder(null);
   210         }
   251         }
   211     }
   252     }
   212 
   253 
   213 
   254     /**
       
   255      * Unregisters listeners.
       
   256      *
       
   257      * @param c a component
       
   258      */
   214     protected void uninstallListeners(JComponent c) {
   259     protected void uninstallListeners(JComponent c) {
   215         JViewport viewport = scrollpane.getViewport();
   260         JViewport viewport = scrollpane.getViewport();
   216         JScrollBar vsb = scrollpane.getVerticalScrollBar();
   261         JScrollBar vsb = scrollpane.getVerticalScrollBar();
   217         JScrollBar hsb = scrollpane.getHorizontalScrollBar();
   262         JScrollBar hsb = scrollpane.getHorizontalScrollBar();
   218 
   263 
   240         spPropertyChangeListener = null;
   285         spPropertyChangeListener = null;
   241         mouseScrollListener = null;
   286         mouseScrollListener = null;
   242         handler = null;
   287         handler = null;
   243     }
   288     }
   244 
   289 
   245 
   290     /**
       
   291      * Unregisters keyboard actions.
       
   292      *
       
   293      * @param c an instance of {@code JScrollPane}
       
   294      */
   246     protected void uninstallKeyboardActions(JScrollPane c) {
   295     protected void uninstallKeyboardActions(JScrollPane c) {
   247         SwingUtilities.replaceUIActionMap(c, null);
   296         SwingUtilities.replaceUIActionMap(c, null);
   248         SwingUtilities.replaceUIInputMap(c, JComponent.
   297         SwingUtilities.replaceUIInputMap(c, JComponent.
   249                            WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, null);
   298                            WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, null);
   250     }
   299     }
   262             handler = new Handler();
   311             handler = new Handler();
   263         }
   312         }
   264         return handler;
   313         return handler;
   265     }
   314     }
   266 
   315 
       
   316     /**
       
   317      * Synchronizes the {@code JScrollPane} with {@code Viewport}.
       
   318      */
   267     protected void syncScrollPaneWithViewport()
   319     protected void syncScrollPaneWithViewport()
   268     {
   320     {
   269         JViewport viewport = scrollpane.getViewport();
   321         JViewport viewport = scrollpane.getViewport();
   270         JScrollBar vsb = scrollpane.getVerticalScrollBar();
   322         JScrollBar vsb = scrollpane.getVerticalScrollBar();
   271         JScrollBar hsb = scrollpane.getHorizontalScrollBar();
   323         JScrollBar hsb = scrollpane.getHorizontalScrollBar();
   451         public void stateChanged(ChangeEvent e) {
   503         public void stateChanged(ChangeEvent e) {
   452             getHandler().stateChanged(e);
   504             getHandler().stateChanged(e);
   453         }
   505         }
   454     }
   506     }
   455 
   507 
       
   508     /**
       
   509      * Returns an instance of viewport {@code ChangeListener}.
       
   510      *
       
   511      * @return an instance of viewport {@code ChangeListener}
       
   512      */
   456     protected ChangeListener createViewportChangeListener() {
   513     protected ChangeListener createViewportChangeListener() {
   457         return getHandler();
   514         return getHandler();
   458     }
   515     }
   459 
   516 
   460 
   517 
   481      */
   538      */
   482     private PropertyChangeListener createHSBPropertyChangeListener() {
   539     private PropertyChangeListener createHSBPropertyChangeListener() {
   483         return getHandler();
   540         return getHandler();
   484     }
   541     }
   485 
   542 
       
   543     /**
       
   544      * Returns an instance of horizontal scroll bar {@code ChangeListener}.
       
   545      *
       
   546      * @return an instance of horizontal scroll bar {@code ChangeListener}
       
   547      */
   486     protected ChangeListener createHSBChangeListener() {
   548     protected ChangeListener createHSBChangeListener() {
   487         return getHandler();
   549         return getHandler();
   488     }
   550     }
   489 
   551 
   490 
   552 
   512      */
   574      */
   513     private PropertyChangeListener createVSBPropertyChangeListener() {
   575     private PropertyChangeListener createVSBPropertyChangeListener() {
   514         return getHandler();
   576         return getHandler();
   515     }
   577     }
   516 
   578 
       
   579     /**
       
   580      * Returns an instance of vertical scroll bar {@code ChangeListener}.
       
   581      *
       
   582      * @return an instance of vertical scroll bar {@code ChangeListener}
       
   583      */
   517     protected ChangeListener createVSBChangeListener() {
   584     protected ChangeListener createVSBChangeListener() {
   518         return getHandler();
   585         return getHandler();
   519     }
   586     }
   520 
   587 
   521     /**
   588     /**
   563      */
   630      */
   564     protected MouseWheelListener createMouseWheelListener() {
   631     protected MouseWheelListener createMouseWheelListener() {
   565         return getHandler();
   632         return getHandler();
   566     }
   633     }
   567 
   634 
       
   635     /**
       
   636      * Updates a scroll bar display policy.
       
   637      *
       
   638      * @param e the property change event
       
   639      */
   568     protected void updateScrollBarDisplayPolicy(PropertyChangeEvent e) {
   640     protected void updateScrollBarDisplayPolicy(PropertyChangeEvent e) {
   569         scrollpane.revalidate();
   641         scrollpane.revalidate();
   570         scrollpane.repaint();
   642         scrollpane.repaint();
   571     }
   643     }
   572 
   644 
   573 
   645     /**
       
   646      * Updates viewport.
       
   647      *
       
   648      * @param e the property change event
       
   649      */
   574     protected void updateViewport(PropertyChangeEvent e)
   650     protected void updateViewport(PropertyChangeEvent e)
   575     {
   651     {
   576         JViewport oldViewport = (JViewport)(e.getOldValue());
   652         JViewport oldViewport = (JViewport)(e.getOldValue());
   577         JViewport newViewport = (JViewport)(e.getNewValue());
   653         JViewport newViewport = (JViewport)(e.getNewValue());
   578 
   654 
   597             newViewport.setViewPosition(p);
   673             newViewport.setViewPosition(p);
   598             newViewport.addChangeListener(viewportChangeListener);
   674             newViewport.addChangeListener(viewportChangeListener);
   599         }
   675         }
   600     }
   676     }
   601 
   677 
   602 
   678     /**
       
   679      * Updates row header.
       
   680      *
       
   681      * @param e the property change event
       
   682      */
   603     protected void updateRowHeader(PropertyChangeEvent e)
   683     protected void updateRowHeader(PropertyChangeEvent e)
   604     {
   684     {
   605         JViewport newRowHead = (JViewport)(e.getNewValue());
   685         JViewport newRowHead = (JViewport)(e.getNewValue());
   606         if (newRowHead != null) {
   686         if (newRowHead != null) {
   607             JViewport viewport = scrollpane.getViewport();
   687             JViewport viewport = scrollpane.getViewport();
   609             p.y = (viewport != null) ? viewport.getViewPosition().y : 0;
   689             p.y = (viewport != null) ? viewport.getViewPosition().y : 0;
   610             newRowHead.setViewPosition(p);
   690             newRowHead.setViewPosition(p);
   611         }
   691         }
   612     }
   692     }
   613 
   693 
   614 
   694     /**
       
   695      * Updates column header.
       
   696      *
       
   697      * @param e the property change event
       
   698      */
   615     protected void updateColumnHeader(PropertyChangeEvent e)
   699     protected void updateColumnHeader(PropertyChangeEvent e)
   616     {
   700     {
   617         JViewport newColHead = (JViewport)(e.getNewValue());
   701         JViewport newColHead = (JViewport)(e.getNewValue());
   618         if (newColHead != null) {
   702         if (newColHead != null) {
   619             JViewport viewport = scrollpane.getViewport();
   703             JViewport viewport = scrollpane.getViewport();
   677     }
   761     }
   678 
   762 
   679 
   763 
   680 
   764 
   681     /**
   765     /**
   682      * Creates an instance of PropertyChangeListener that's added to
   766      * Creates an instance of {@code PropertyChangeListener} that's added to
   683      * the JScrollPane by installUI().  Subclasses can override this method
   767      * the {@code JScrollPane} by {@code installUI()}. Subclasses can override
   684      * to return a custom PropertyChangeListener, e.g.
   768      * this method to return a custom {@code PropertyChangeListener}, e.g.
   685      * <pre>
   769      * <pre>
   686      * class MyScrollPaneUI extends BasicScrollPaneUI {
   770      * class MyScrollPaneUI extends BasicScrollPaneUI {
   687      *    protected PropertyChangeListener <b>createPropertyChangeListener</b>() {
   771      *    protected PropertyChangeListener <b>createPropertyChangeListener</b>() {
   688      *        return new MyPropertyChangeListener();
   772      *        return new MyPropertyChangeListener();
   689      *    }
   773      *    }
   695      *            super.propertyChange(e);
   779      *            super.propertyChange(e);
   696      *        }
   780      *        }
   697      *    }
   781      *    }
   698      * }
   782      * }
   699      * </pre>
   783      * </pre>
       
   784      *
       
   785      * @return an instance of {@code PropertyChangeListener}
   700      *
   786      *
   701      * @see java.beans.PropertyChangeListener
   787      * @see java.beans.PropertyChangeListener
   702      * @see #installUI
   788      * @see #installUI
   703      */
   789      */
   704     protected PropertyChangeListener createPropertyChangeListener() {
   790     protected PropertyChangeListener createPropertyChangeListener() {