1 /*
2  * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
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
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 package com.sun.java.swing.plaf.motif;
27 
28 import javax.swing.*;
29 import javax.swing.border.*;
30 import javax.swing.plaf.*;
31 import javax.swing.plaf.basic.BasicScrollPaneUI;
32 
33 import java.beans.PropertyChangeEvent;
34 import java.beans.PropertyChangeListener;
35 
36 /**
37  * A CDE/Motif {@code L&F} implementation of ScrollPaneUI.
38  * <p>
39  * <strong>Warning:</strong>
40  * Serialized objects of this class will not be compatible with
41  * future Swing releases.  The current serialization support is appropriate
42  * for short term storage or RMI between applications running the same
43  * version of Swing.  A future release of Swing will provide support for
44  * long term persistence.
45  *
46  * @author Hans Muller
47  */
48 public class MotifScrollPaneUI extends BasicScrollPaneUI
49 {
50     private static final Border vsbMarginBorderR = new EmptyBorder(0, 4, 0, 0);
51     private static final Border vsbMarginBorderL = new EmptyBorder(0, 0, 0, 4);
52     private static final Border hsbMarginBorder = new EmptyBorder(4, 0, 0, 0);
53 
54     private CompoundBorder vsbBorder;
55     private CompoundBorder hsbBorder;
56 
57     private PropertyChangeListener propertyChangeHandler;
58 
59     @Override
installListeners(JScrollPane scrollPane)60     protected void installListeners(JScrollPane scrollPane) {
61         super.installListeners(scrollPane);
62         propertyChangeHandler = createPropertyChangeHandler();
63         scrollPane.addPropertyChangeListener(propertyChangeHandler);
64     }
65 
66     @Override
uninstallListeners(JComponent scrollPane)67     protected void uninstallListeners(JComponent scrollPane) {
68         super.uninstallListeners(scrollPane);
69         scrollPane.removePropertyChangeListener(propertyChangeHandler);
70     }
71 
createPropertyChangeHandler()72     private PropertyChangeListener createPropertyChangeHandler() {
73         return new PropertyChangeListener() {
74             @Override
75             public void propertyChange(PropertyChangeEvent e) {
76                   String propertyName = e.getPropertyName();
77 
78                   if (propertyName.equals("componentOrientation")) {
79                         JScrollPane pane = (JScrollPane)e.getSource();
80                         JScrollBar vsb = pane.getVerticalScrollBar();
81                         if (vsb != null && vsbBorder != null &&
82                             vsb.getBorder() == vsbBorder) {
83                             // The Border on the verticall scrollbar matches
84                             // what we installed, reset it.
85                             if (pane.getComponentOrientation().isLeftToRight()) {
86                                 vsbBorder = new CompoundBorder(vsbMarginBorderR,
87                                                 vsbBorder.getInsideBorder());
88                             } else {
89                                 vsbBorder = new CompoundBorder(vsbMarginBorderL,
90                                                 vsbBorder.getInsideBorder());
91                             }
92                             vsb.setBorder(vsbBorder);
93                         }
94                   }
95         }};
96     }
97 
98     @Override
99     protected void installDefaults(JScrollPane scrollpane) {
100         super.installDefaults(scrollpane);
101 
102         JScrollBar vsb = scrollpane.getVerticalScrollBar();
103         if (vsb != null) {
104             if (scrollpane.getComponentOrientation().isLeftToRight()) {
105                 vsbBorder = new CompoundBorder(vsbMarginBorderR,
106                                                vsb.getBorder());
107             }
108             else {
109                 vsbBorder = new CompoundBorder(vsbMarginBorderL,
110                                                vsb.getBorder());
111             }
112             vsb.setBorder(vsbBorder);
113         }
114 
115         JScrollBar hsb = scrollpane.getHorizontalScrollBar();
116         if (hsb != null) {
117             hsbBorder = new CompoundBorder(hsbMarginBorder, hsb.getBorder());
118             hsb.setBorder(hsbBorder);
119         }
120     }
121 
122     @Override
123     protected void uninstallDefaults(JScrollPane c) {
124         super.uninstallDefaults(c);
125 
126         JScrollBar vsb = scrollpane.getVerticalScrollBar();
127         if (vsb != null) {
128             if (vsb.getBorder() == vsbBorder) {
129                 vsb.setBorder(null);
130             }
131             vsbBorder = null;
132         }
133 
134         JScrollBar hsb = scrollpane.getHorizontalScrollBar();
135         if (hsb != null) {
136             if (hsb.getBorder() == hsbBorder) {
137                 hsb.setBorder(null);
138             }
139             hsbBorder = null;
140         }
141     }
142 
143 
144     public static ComponentUI createUI(JComponent x) {
145         return new MotifScrollPaneUI();
146     }
147 }
148