1/*
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.
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
26package com.sun.java.swing.plaf.motif;
27
28import javax.swing.*;
29import javax.swing.border.*;
30import javax.swing.plaf.*;
31import javax.swing.plaf.basic.BasicScrollPaneUI;
32
33import java.beans.PropertyChangeEvent;
34import 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 */
48public 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
60    protected void installListeners(JScrollPane scrollPane) {
61        super.installListeners(scrollPane);
62        propertyChangeHandler = createPropertyChangeHandler();
63        scrollPane.addPropertyChangeListener(propertyChangeHandler);
64    }
65
66    @Override
67    protected void uninstallListeners(JComponent scrollPane) {
68        super.uninstallListeners(scrollPane);
69        scrollPane.removePropertyChangeListener(propertyChangeHandler);
70    }
71
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 (MotifGraphicsUtils.isLeftToRight(pane)) {
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 (MotifGraphicsUtils.isLeftToRight(scrollpane)) {
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