jdk/src/share/classes/javax/swing/JLayer.java
author alexp
Mon, 31 Aug 2009 18:39:41 +0400
changeset 3743 906063616ec2
parent 3737 83fb4621a129
child 3748 b88af44d77a8
permissions -rw-r--r--
6872503: JLayer event handling should be rewritten Reviewed-by: art
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3508
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
     1
/*
3733
af63479b67b8 6872492: JLayer sources contain wrong header
alexp
parents: 3508
diff changeset
     2
 * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
af63479b67b8 6872492: JLayer sources contain wrong header
alexp
parents: 3508
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
af63479b67b8 6872492: JLayer sources contain wrong header
alexp
parents: 3508
diff changeset
     4
 *
af63479b67b8 6872492: JLayer sources contain wrong header
alexp
parents: 3508
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
af63479b67b8 6872492: JLayer sources contain wrong header
alexp
parents: 3508
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
af63479b67b8 6872492: JLayer sources contain wrong header
alexp
parents: 3508
diff changeset
     7
 * published by the Free Software Foundation.  Sun designates this
af63479b67b8 6872492: JLayer sources contain wrong header
alexp
parents: 3508
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
af63479b67b8 6872492: JLayer sources contain wrong header
alexp
parents: 3508
diff changeset
     9
 * by Sun in the LICENSE file that accompanied this code.
af63479b67b8 6872492: JLayer sources contain wrong header
alexp
parents: 3508
diff changeset
    10
 *
af63479b67b8 6872492: JLayer sources contain wrong header
alexp
parents: 3508
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
af63479b67b8 6872492: JLayer sources contain wrong header
alexp
parents: 3508
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
af63479b67b8 6872492: JLayer sources contain wrong header
alexp
parents: 3508
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
af63479b67b8 6872492: JLayer sources contain wrong header
alexp
parents: 3508
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
af63479b67b8 6872492: JLayer sources contain wrong header
alexp
parents: 3508
diff changeset
    15
 * accompanied this code).
af63479b67b8 6872492: JLayer sources contain wrong header
alexp
parents: 3508
diff changeset
    16
 *
af63479b67b8 6872492: JLayer sources contain wrong header
alexp
parents: 3508
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
af63479b67b8 6872492: JLayer sources contain wrong header
alexp
parents: 3508
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
af63479b67b8 6872492: JLayer sources contain wrong header
alexp
parents: 3508
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
af63479b67b8 6872492: JLayer sources contain wrong header
alexp
parents: 3508
diff changeset
    20
 *
af63479b67b8 6872492: JLayer sources contain wrong header
alexp
parents: 3508
diff changeset
    21
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
af63479b67b8 6872492: JLayer sources contain wrong header
alexp
parents: 3508
diff changeset
    22
 * CA 95054 USA or visit www.sun.com if you need additional information or
af63479b67b8 6872492: JLayer sources contain wrong header
alexp
parents: 3508
diff changeset
    23
 * have any questions.
3508
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    24
 */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    25
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    26
package javax.swing;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    27
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    28
import javax.swing.plaf.LayerUI;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    29
import java.awt.*;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    30
import java.awt.event.*;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    31
import java.beans.PropertyChangeEvent;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    32
import java.beans.PropertyChangeListener;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    33
import java.io.IOException;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    34
import java.io.ObjectInputStream;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    35
import java.io.Serializable;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    36
import java.lang.ref.WeakReference;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    37
import java.util.ArrayList;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    38
import java.util.Iterator;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    39
import java.security.AccessController;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    40
import java.security.PrivilegedAction;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    41
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    42
/**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    43
 * {@code JLayer} is a universal decorator for Swing components
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    44
 * which enables you to implement various advanced painting effects as well as
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    45
 * receive notifications of all {@code AWTEvent}s generated within its borders.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    46
 * <p/>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    47
 * {@code JLayer} delegates the handling of painting and input events to a
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    48
 * {@link javax.swing.plaf.LayerUI} object, which performs the actual decoration.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    49
 * <p/>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    50
 * The custom painting implemented in the {@code LayerUI} and events notification
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    51
 * work for the JLayer itself and all its subcomponents.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    52
 * This combination enables you to enrich existing components
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    53
 * by adding new advanced functionality such as temporary locking of a hierarchy,
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    54
 * data tips for compound components, enhanced mouse scrolling etc and so on.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    55
 * <p/>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    56
 * {@code JLayer} is a good solution if you only need to do custom painting
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    57
 * over compound component or catch input events from its subcomponents.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    58
 * <pre>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    59
 *         // create a component to be decorated with the layer
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    60
 *        JPanel panel = new JPanel();
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    61
 *        panel.add(new JButton("JButton"));
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    62
 *        // This custom layerUI will fill the layer with translucent green
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    63
 *        // and print out all mouseMotion events generated within its borders
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    64
 *        LayerUI&lt;JPanel&gt; layerUI = new LayerUI&lt;JPanel&gt;() {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    65
 *            public void paint(Graphics g, JCompo  nent c) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    66
 *                // paint the layer as is
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    67
 *                super.paint(g, c);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    68
 *                // fill it with the translucent green
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    69
 *                g.setColor(new Color(0, 128, 0, 128));
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    70
 *                g.fillRect(0, 0, c.getWidth(), c.getHeight());
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    71
 *            }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    72
 *            // overridden method which catches MouseMotion events
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    73
 *            public void eventDispatched(AWTEvent e, JLayer&lt;JPanel&gt; l) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    74
 *                System.out.println("AWTEvent detected: " + e);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    75
 *            }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    76
 *        };
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    77
 *        // create the layer for the panel using our custom layerUI
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    78
 *        JLayer&lt;JPanel&gt; layer = new JLayer&lt;JPanel&gt;(panel, layerUI);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    79
 *        // work with the layer as with any other Swing component
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    80
 *        frame.add(layer);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    81
 * </pre>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    82
 *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    83
 * <b>Note:</b> {@code JLayer} doesn't support the following methods:
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    84
 * <ul>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    85
 * <li>{@link Container#add(java.awt.Component)}</li>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    86
 * <li>{@link Container#add(String, java.awt.Component)}</li>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    87
 * <li>{@link Container#add(java.awt.Component, int)}</li>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    88
 * <li>{@link Container#add(java.awt.Component, Object)}</li>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    89
 * <li>{@link Container#add(java.awt.Component, Object, int)}</li>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    90
 * </ul>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    91
 * using any of of them will cause {@code UnsupportedOperationException} to be thrown,
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    92
 * to add a component to {@code JLayer}
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    93
 * use {@link #setView(Component)} or {@link #setGlassPane(JPanel)}.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    94
 *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    95
 * @param <V> the type of {@code JLayer}'s view component
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    96
 *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    97
 * @see #JLayer(Component)
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    98
 * @see #setView(Component)
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
    99
 * @see #getView()
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   100
 * @see javax.swing.plaf.LayerUI
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   101
 * @see #JLayer(Component, LayerUI)
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   102
 * @see #setUI(javax.swing.plaf.LayerUI)
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   103
 * @see #getUI()
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   104
 * @since 1.7
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   105
 *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   106
 * @author Alexander Potochkin
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   107
 */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   108
public final class JLayer<V extends Component>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   109
        extends JComponent
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   110
        implements Scrollable, PropertyChangeListener {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   111
    private V view;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   112
    // this field is necessary because JComponent.ui is transient
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   113
    // when layerUI is serializable
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   114
    private LayerUI<? super V> layerUI;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   115
    private JPanel glassPane;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   116
    private boolean isPainting;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   117
    private static final DefaultLayerLayout sharedLayoutInstance =
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   118
            new DefaultLayerLayout();
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   119
    private long eventMask;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   120
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   121
    private static final LayerEventController eventController =
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   122
            new LayerEventController();
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   123
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   124
    private static final long ACCEPTED_EVENTS =
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   125
            AWTEvent.COMPONENT_EVENT_MASK |
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   126
                    AWTEvent.CONTAINER_EVENT_MASK |
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   127
                    AWTEvent.FOCUS_EVENT_MASK |
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   128
                    AWTEvent.KEY_EVENT_MASK |
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   129
                    AWTEvent.MOUSE_WHEEL_EVENT_MASK |
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   130
                    AWTEvent.MOUSE_MOTION_EVENT_MASK |
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   131
                    AWTEvent.MOUSE_EVENT_MASK |
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   132
                    AWTEvent.INPUT_METHOD_EVENT_MASK |
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   133
                    AWTEvent.HIERARCHY_EVENT_MASK |
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   134
                    AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   135
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   136
    /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   137
     * Creates a new {@code JLayer} object with a {@code null} view component
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   138
     * and {@code null} {@link javax.swing.plaf.LayerUI}.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   139
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   140
     * @see #setView
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   141
     * @see #setUI
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   142
     */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   143
    public JLayer() {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   144
        this(null);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   145
    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   146
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   147
    /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   148
     * Creates a new {@code JLayer} object
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   149
     * with {@code null} {@link javax.swing.plaf.LayerUI}.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   150
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   151
     * @param view the component to be decorated by this {@code JLayer}
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   152
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   153
     * @see #setUI
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   154
     */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   155
    public JLayer(V view) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   156
        this(view, null);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   157
    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   158
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   159
    /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   160
     * Creates a new {@code JLayer} object with the specified view component
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   161
     * and {@link javax.swing.plaf.LayerUI} object.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   162
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   163
     * @param view the component to be decorated
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   164
     * @param ui the {@link javax.swing.plaf.LayerUI} delegate
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   165
     * to be used by this {@code JLayer}
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   166
     */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   167
    public JLayer(V view, LayerUI<V> ui) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   168
        setLayout(sharedLayoutInstance);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   169
        setGlassPane(createGlassPane());
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   170
        setView(view);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   171
        setUI(ui);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   172
    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   173
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   174
    /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   175
     * Returns the {@code JLayer}'s view component or {@code null}.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   176
     * <br/>This is a bound property.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   177
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   178
     * @return the {@code JLayer}'s view component
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   179
     *         or {@code null} if none exists
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   180
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   181
     * @see #setView(V)
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   182
     */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   183
    public V getView() {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   184
        return view;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   185
    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   186
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   187
    /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   188
     * Sets the {@code JLayer}'s view component, which can be {@code null}.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   189
     * <br/>This is a bound property.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   190
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   191
     * @param view the view component for this {@code JLayer}
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   192
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   193
     * @see #getView()
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   194
     */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   195
    public void setView(V view) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   196
        Component oldView = getView();
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   197
        if (oldView != null) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   198
            super.remove(oldView);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   199
        }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   200
        if (view != null) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   201
            super.addImpl(view, null, getComponentCount());
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   202
        }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   203
        this.view = view;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   204
        firePropertyChange("view", oldView, view);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   205
        revalidate();
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   206
        repaint();
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   207
    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   208
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   209
    /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   210
     * Sets the {@link javax.swing.plaf.LayerUI} which will perform painting
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   211
     * and receive input events for this {@code JLayer}.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   212
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   213
     * @param ui the {@link javax.swing.plaf.LayerUI} for this {@code JLayer}
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   214
     */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   215
    public void setUI(LayerUI<? super V> ui) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   216
        this.layerUI = ui;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   217
        super.setUI(ui);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   218
    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   219
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   220
    /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   221
     * Returns the {@link javax.swing.plaf.LayerUI} for this {@code JLayer}.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   222
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   223
     * @return the {@code LayerUI} for this {@code JLayer}
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   224
     */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   225
    public LayerUI<? super V> getUI() {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   226
        return layerUI;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   227
    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   228
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   229
    /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   230
     * Returns the {@code JLayer}'s glassPane component or {@code null}.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   231
     * <br/>This is a bound property.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   232
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   233
     * @return the {@code JLayer}'s glassPane component
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   234
     *         or {@code null} if none exists
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   235
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   236
     * @see #setGlassPane(JPanel)
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   237
     */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   238
    public JPanel getGlassPane() {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   239
        return glassPane;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   240
    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   241
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   242
    /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   243
     * Sets the {@code JLayer}'s glassPane component, which can be {@code null}.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   244
     * <br/>This is a bound property.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   245
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   246
     * @param glassPane the glassPane component of this {@code JLayer}
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   247
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   248
     * @see #getGlassPane()
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   249
     */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   250
    public void setGlassPane(JPanel glassPane) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   251
        Component oldGlassPane = getGlassPane();
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   252
        if (oldGlassPane != null) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   253
            super.remove(oldGlassPane);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   254
        }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   255
        if (glassPane != null) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   256
            super.addImpl(glassPane, null, 0);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   257
        }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   258
        this.glassPane = glassPane;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   259
        firePropertyChange("glassPane", oldGlassPane, glassPane);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   260
        revalidate();
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   261
        repaint();
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   262
    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   263
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   264
    /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   265
     * Called by the constructor methods to create a default {@code glassPane}.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   266
     * By default this method creates a new JPanel with visibility set to true
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   267
     * and opacity set to false.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   268
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   269
     * @return the default {@code glassPane}
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   270
     */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   271
    public JPanel createGlassPane() {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   272
        return new DefaultLayerGlassPane();
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   273
    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   274
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   275
    /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   276
     * This method is not supported by {@code JLayer}
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   277
     * and always throws {@code UnsupportedOperationException}
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   278
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   279
     * @throws UnsupportedOperationException this method is not supported
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   280
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   281
     * @see #setView(Component)
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   282
     * @see #setGlassPane(Component)
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   283
     */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   284
    protected void addImpl(Component comp, Object constraints, int index) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   285
        throw new UnsupportedOperationException(
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   286
                "Adding components to JLayer is not supported, " +
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   287
                        "use setView() or setGlassPane() instead");
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   288
    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   289
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   290
    /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   291
     * {@inheritDoc}
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   292
     */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   293
    public void remove(Component comp) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   294
        if (comp == getView()) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   295
            setView(null);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   296
        } else if (comp == getGlassPane()) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   297
            setGlassPane(null);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   298
        } else {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   299
            super.remove(comp);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   300
        }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   301
    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   302
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   303
    /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   304
     * {@inheritDoc}
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   305
     */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   306
    public void removeAll() {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   307
        setView(null);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   308
        setGlassPane(null);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   309
    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   310
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   311
    /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   312
     * Delegates all painting to the {@link javax.swing.plaf.LayerUI} object.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   313
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   314
     * @param g the {@code Graphics} to render to
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   315
     */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   316
    public void paint(Graphics g) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   317
        if (!isPainting) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   318
            isPainting = true;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   319
            super.paintComponent(g);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   320
            isPainting = false;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   321
        } else {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   322
            super.paint(g);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   323
        }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   324
    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   325
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   326
    /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   327
     * This method is empty, because all painting is done by
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   328
     * {@link #paint(Graphics)} and
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   329
     * {@link javax.swing.plaf.LayerUI#update(Graphics, JComponent)} methods
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   330
     */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   331
    protected void paintComponent(Graphics g) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   332
    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   333
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   334
    /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   335
     * To enable the correct painting of the {@code glassPane} and view component,
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   336
     * the {@code JLayer} overrides the default implementation of
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   337
     * this method to return {@code false} when the {@code glassPane} is visible.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   338
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   339
     * @return false if {@code JLayer}'s {@code glassPane} is visible
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   340
     */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   341
    public boolean isOptimizedDrawingEnabled() {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   342
        return !glassPane.isVisible();
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   343
    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   344
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   345
    /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   346
     * {@inheritDoc}
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   347
     */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   348
    public void propertyChange(PropertyChangeEvent evt) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   349
        if (getUI() != null) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   350
            getUI().applyPropertyChange(evt, this);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   351
        }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   352
    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   353
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   354
    /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   355
     * Sets the bitmask of event types to receive by this {@code JLayer}.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   356
     * Here is the list of the supported event types:
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   357
     * <ul>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   358
     * <li>AWTEvent.COMPONENT_EVENT_MASK</li>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   359
     * <li>AWTEvent.CONTAINER_EVENT_MASK</li>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   360
     * <li>AWTEvent.FOCUS_EVENT_MASK</li>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   361
     * <li>AWTEvent.KEY_EVENT_MASK</li>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   362
     * <li>AWTEvent.MOUSE_WHEEL_EVENT_MASK</li>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   363
     * <li>AWTEvent.MOUSE_MOTION_EVENT_MASK</li>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   364
     * <li>AWTEvent.MOUSE_EVENT_MASK</li>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   365
     * <li>AWTEvent.INPUT_METHOD_EVENT_MASK</li>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   366
     * <li>AWTEvent.HIERARCHY_EVENT_MASK</li>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   367
     * <li>AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK</li>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   368
     * </ul>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   369
     * <p/>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   370
     * If {@code LayerUI} is installed,
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   371
     * {@link javax.swing.plaf.LayerUI#eventDispatched(AWTEvent, JLayer)} method
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   372
     * will only receive events that match the event mask.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   373
     * <p/>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   374
     * The following example shows how to correclty use this method
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   375
     * in the {@code LayerUI} implementations:
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   376
     * <pre>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   377
     *    public void installUI(JComponent c) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   378
     *       super.installUI(c);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   379
     *       JLayer l = (JLayer) c;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   380
     *       // this LayerUI will receive only key and focus events
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   381
     *       l.setLayerEventMask(AWTEvent.KEY_EVENT_MASK | AWTEvent.FOCUS_EVENT_MASK);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   382
     *    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   383
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   384
     *    public void uninstallUI(JComponent c) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   385
     *       super.uninstallUI(c);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   386
     *       JLayer l = (JLayer) c;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   387
     *       // JLayer must be returned to its initial state
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   388
     *       l.setLayerEventMask(0);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   389
     *    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   390
     * </pre>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   391
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   392
     * By default {@code JLayer} receives no events.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   393
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   394
     * @param layerEventMask the bitmask of event types to receive
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   395
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   396
     * @throws IllegalArgumentException if the {@code layerEventMask} parameter
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   397
     * contains unsupported event types
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   398
     * @see #getLayerEventMask()
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   399
     */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   400
    public void setLayerEventMask(long layerEventMask) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   401
        if (layerEventMask != (layerEventMask & ACCEPTED_EVENTS)) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   402
            throw new IllegalArgumentException(
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   403
                    "The event bitmask contains unsupported event types");
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   404
        }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   405
        long oldEventMask = getLayerEventMask();
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   406
        this.eventMask = layerEventMask;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   407
        firePropertyChange("layerEventMask", oldEventMask, layerEventMask);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   408
        if (layerEventMask != oldEventMask) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   409
            disableEvents(oldEventMask);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   410
            enableEvents(eventMask);
3743
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   411
            if (isDisplayable()) {
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   412
                eventController.updateAWTEventListener(
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   413
                        oldEventMask, layerEventMask);
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   414
            }
3508
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   415
        }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   416
    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   417
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   418
    /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   419
     * Returns the bitmap of event mask to receive by this {@code JLayer}
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   420
     * and its {@code LayerUI}.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   421
     * <p/>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   422
     * It means that {@link javax.swing.plaf.LayerUI#eventDispatched(AWTEvent, JLayer)} method
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   423
     * will only receive events that match the event mask.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   424
     * <p/>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   425
     * By default {@code JLayer} receives no events.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   426
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   427
     * @return the bitmask of event types to receive for this {@code JLayer}
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   428
     */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   429
    public long getLayerEventMask() {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   430
        return eventMask;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   431
    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   432
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   433
    /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   434
     * Delegates its functionality to the {@link javax.swing.plaf.LayerUI#updateUI(JLayer)} method,
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   435
     * if {@code LayerUI} is set.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   436
     */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   437
    public void updateUI() {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   438
        if (getUI() != null) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   439
            getUI().updateUI(this);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   440
        }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   441
    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   442
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   443
    /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   444
     * Returns the preferred size of the viewport for a view component.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   445
     * <p/>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   446
     * If the ui delegate of this layer is not {@code null}, this method delegates its
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   447
     * implementation to the {@code LayerUI.getPreferredScrollableViewportSize(JLayer)}
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   448
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   449
     * @return the preferred size of the viewport for a view component
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   450
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   451
     * @see Scrollable
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   452
     * @see LayerUI#getPreferredScrollableViewportSize(JLayer)
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   453
     */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   454
    public Dimension getPreferredScrollableViewportSize() {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   455
        if (getUI() != null) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   456
            return getUI().getPreferredScrollableViewportSize(this);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   457
        }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   458
        return getPreferredSize();
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   459
    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   460
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   461
    /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   462
     * Returns a scroll increment, which is required for components
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   463
     * that display logical rows or columns in order to completely expose
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   464
     * one block of rows or columns, depending on the value of orientation.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   465
     * <p/>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   466
     * If the ui delegate of this layer is not {@code null}, this method delegates its
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   467
     * implementation to the {@code LayerUI.getScrollableBlockIncrement(JLayer,Rectangle,int,int)}
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   468
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   469
     * @return the "block" increment for scrolling in the specified direction
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   470
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   471
     * @see Scrollable
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   472
     * @see LayerUI#getScrollableBlockIncrement(JLayer, Rectangle, int, int)
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   473
     */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   474
    public int getScrollableBlockIncrement(Rectangle visibleRect,
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   475
                                           int orientation, int direction) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   476
        if (getUI() != null) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   477
            return getUI().getScrollableBlockIncrement(this, visibleRect,
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   478
                    orientation, direction);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   479
        }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   480
        return (orientation == SwingConstants.VERTICAL) ? visibleRect.height :
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   481
                visibleRect.width;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   482
    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   483
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   484
    /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   485
     * Returns {@code false} to indicate that the height of the viewport does not
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   486
     * determine the height of the layer, unless the preferred height
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   487
     * of the layer is smaller than the height of the viewport.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   488
     * <p/>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   489
     * If the ui delegate of this layer is not null, this method delegates its
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   490
     * implementation to the {@code LayerUI.getScrollableTracksViewportHeight(JLayer)}
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   491
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   492
     * @return whether the layer should track the height of the viewport
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   493
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   494
     * @see Scrollable
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   495
     * @see LayerUI#getScrollableTracksViewportHeight(JLayer)
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   496
     */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   497
    public boolean getScrollableTracksViewportHeight() {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   498
        if (getUI() != null) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   499
            return getUI().getScrollableTracksViewportHeight(this);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   500
        }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   501
        return false;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   502
    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   503
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   504
    /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   505
     * Returns {@code false} to indicate that the width of the viewport does not
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   506
     * determine the width of the layer, unless the preferred width
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   507
     * of the layer is smaller than the width of the viewport.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   508
     * <p/>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   509
     * If the ui delegate of this layer is not null, this method delegates its
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   510
     * implementation to the {@code LayerUI.getScrollableTracksViewportWidth(JLayer)}
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   511
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   512
     * @return whether the layer should track the width of the viewport
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   513
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   514
     * @see Scrollable
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   515
     * @see LayerUI#getScrollableTracksViewportWidth(JLayer)
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   516
     */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   517
    public boolean getScrollableTracksViewportWidth() {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   518
        if (getUI() != null) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   519
            return getUI().getScrollableTracksViewportWidth(this);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   520
        }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   521
        return false;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   522
    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   523
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   524
    /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   525
     * Returns a scroll increment, which is required for components
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   526
     * that display logical rows or columns in order to completely expose
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   527
     * one new row or column, depending on the value of orientation.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   528
     * Ideally, components should handle a partially exposed row or column
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   529
     * by returning the distance required to completely expose the item.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   530
     * <p/>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   531
     * Scrolling containers, like {@code JScrollPane}, will use this method
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   532
     * each time the user requests a unit scroll.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   533
     * <p/>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   534
     * If the ui delegate of this layer is not {@code null}, this method delegates its
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   535
     * implementation to the {@code LayerUI.getScrollableUnitIncrement(JLayer,Rectangle,int,int)}
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   536
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   537
     * @return The "unit" increment for scrolling in the specified direction.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   538
     *         This value should always be positive.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   539
     *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   540
     * @see Scrollable
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   541
     * @see LayerUI#getScrollableUnitIncrement(JLayer, Rectangle, int, int)
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   542
     */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   543
    public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation,
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   544
                                          int direction) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   545
        if (getUI() != null) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   546
            return getUI().getScrollableUnitIncrement(
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   547
                    this, visibleRect, orientation, direction);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   548
        }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   549
        return 1;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   550
    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   551
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   552
    private void readObject(ObjectInputStream s)
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   553
            throws IOException, ClassNotFoundException {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   554
        s.defaultReadObject();
3743
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   555
        if (layerUI != null) {
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   556
            setUI(layerUI);
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   557
        }
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   558
        if (eventMask != 0) {
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   559
            eventController.updateAWTEventListener(0, eventMask);
3508
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   560
        }
3743
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   561
    }
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   562
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   563
    public void addNotify() {
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   564
        eventController.updateAWTEventListener(0, eventMask);
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   565
        super.addNotify();
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   566
    }
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   567
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   568
    public void removeNotify() {
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   569
        eventController.updateAWTEventListener(eventMask, 0);
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   570
        super.removeNotify();
3508
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   571
    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   572
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   573
    /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   574
     * static AWTEventListener to be shared with all AbstractLayerUIs
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   575
     */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   576
    private static class LayerEventController implements AWTEventListener {
3743
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   577
        private ArrayList<Long> layerMaskList =
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   578
                new ArrayList<Long>();
3508
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   579
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   580
        private long currentEventMask;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   581
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   582
        @SuppressWarnings("unchecked")
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   583
        public void eventDispatched(AWTEvent event) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   584
            Object source = event.getSource();
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   585
            if (source instanceof Component) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   586
                Component component = (Component) source;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   587
                while (component != null) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   588
                    if (component instanceof JLayer) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   589
                        JLayer l = (JLayer) component;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   590
                        LayerUI ui = l.getUI();
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   591
                        if (ui != null &&
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   592
                                isEventEnabled(l.getLayerEventMask(),
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   593
                                        event.getID())) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   594
                            ui.eventDispatched(event, l);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   595
                        }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   596
                    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   597
                    component = component.getParent();
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   598
                }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   599
            }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   600
        }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   601
3743
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   602
        private void updateAWTEventListener(long oldEventMask, long newEventMask) {
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   603
            if (oldEventMask != 0) {
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   604
                layerMaskList.remove(oldEventMask);
3508
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   605
            }
3743
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   606
            if (newEventMask != 0) {
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   607
                layerMaskList.add(newEventMask);
3508
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   608
            }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   609
            long combinedMask = 0;
3743
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   610
            for (Long mask : layerMaskList) {
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   611
                combinedMask |= mask;
3508
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   612
            }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   613
            if (combinedMask == 0) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   614
                removeAWTEventListener();
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   615
            } else if (getCurrentEventMask() != combinedMask) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   616
                removeAWTEventListener();
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   617
                addAWTEventListener(combinedMask);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   618
            }
3743
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   619
            currentEventMask = combinedMask;
3508
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   620
        }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   621
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   622
        private long getCurrentEventMask() {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   623
            return currentEventMask;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   624
        }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   625
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   626
        private void addAWTEventListener(final long eventMask) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   627
            AccessController.doPrivileged(new PrivilegedAction<Void>() {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   628
                public Void run() {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   629
                    Toolkit.getDefaultToolkit().
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   630
                            addAWTEventListener(LayerEventController.this, eventMask);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   631
                    return null;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   632
                }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   633
            });
3743
906063616ec2 6872503: JLayer event handling should be rewritten
alexp
parents: 3737
diff changeset
   634
3508
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   635
        }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   636
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   637
        private void removeAWTEventListener() {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   638
            AccessController.doPrivileged(new PrivilegedAction<Void>() {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   639
                public Void run() {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   640
                    Toolkit.getDefaultToolkit().
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   641
                            removeAWTEventListener(LayerEventController.this);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   642
                    return null;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   643
                }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   644
            });
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   645
        }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   646
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   647
        private boolean isEventEnabled(long eventMask, int id) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   648
            return (((eventMask & AWTEvent.COMPONENT_EVENT_MASK) != 0 &&
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   649
                    id >= ComponentEvent.COMPONENT_FIRST &&
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   650
                    id <= ComponentEvent.COMPONENT_LAST)
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   651
                    || ((eventMask & AWTEvent.CONTAINER_EVENT_MASK) != 0 &&
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   652
                    id >= ContainerEvent.CONTAINER_FIRST &&
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   653
                    id <= ContainerEvent.CONTAINER_LAST)
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   654
                    || ((eventMask & AWTEvent.FOCUS_EVENT_MASK) != 0 &&
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   655
                    id >= FocusEvent.FOCUS_FIRST &&
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   656
                    id <= FocusEvent.FOCUS_LAST)
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   657
                    || ((eventMask & AWTEvent.KEY_EVENT_MASK) != 0 &&
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   658
                    id >= KeyEvent.KEY_FIRST &&
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   659
                    id <= KeyEvent.KEY_LAST)
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   660
                    || ((eventMask & AWTEvent.MOUSE_WHEEL_EVENT_MASK) != 0 &&
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   661
                    id == MouseEvent.MOUSE_WHEEL)
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   662
                    || ((eventMask & AWTEvent.MOUSE_MOTION_EVENT_MASK) != 0 &&
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   663
                    (id == MouseEvent.MOUSE_MOVED ||
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   664
                            id == MouseEvent.MOUSE_DRAGGED))
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   665
                    || ((eventMask & AWTEvent.MOUSE_EVENT_MASK) != 0 &&
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   666
                    id != MouseEvent.MOUSE_MOVED &&
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   667
                    id != MouseEvent.MOUSE_DRAGGED &&
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   668
                    id != MouseEvent.MOUSE_WHEEL &&
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   669
                    id >= MouseEvent.MOUSE_FIRST &&
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   670
                    id <= MouseEvent.MOUSE_LAST)
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   671
                    || ((eventMask & AWTEvent.INPUT_METHOD_EVENT_MASK) != 0 &&
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   672
                    id >= InputMethodEvent.INPUT_METHOD_FIRST &&
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   673
                    id <= InputMethodEvent.INPUT_METHOD_LAST)
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   674
                    || ((eventMask & AWTEvent.HIERARCHY_EVENT_MASK) != 0 &&
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   675
                    id == HierarchyEvent.HIERARCHY_CHANGED)
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   676
                    || ((eventMask & AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK) != 0 &&
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   677
                    (id == HierarchyEvent.ANCESTOR_MOVED ||
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   678
                            id == HierarchyEvent.ANCESTOR_RESIZED)));
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   679
        }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   680
    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   681
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   682
    /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   683
     * The default glassPane for the {@link javax.swing.JLayer}.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   684
     * It is a subclass of {@code JPanel} which is non opaque by default.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   685
     */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   686
    private static class DefaultLayerGlassPane extends JPanel {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   687
        /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   688
         * Creates a new {@link DefaultLayerGlassPane}
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   689
         */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   690
        public DefaultLayerGlassPane() {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   691
            setOpaque(false);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   692
        }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   693
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   694
        /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   695
         * First, implementatation of this method iterates through
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   696
         * glassPane's child components and returns {@code true}
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   697
         * if any of them is visible and contains passed x,y point.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   698
         * After that it checks if no mouseListeners is attached to this component
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   699
         * and no mouse cursor is set, then it returns {@code false},
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   700
         * otherwise calls the super implementation of this method.
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   701
         *
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   702
         * @param x the <i>x</i> coordinate of the point
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   703
         * @param y the <i>y</i> coordinate of the point
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   704
         * @return true if this component logically contains x,y
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   705
         */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   706
        public boolean contains(int x, int y) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   707
            for (int i = 0; i < getComponentCount(); i++) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   708
                Component c = getComponent(i);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   709
                Point point = SwingUtilities.convertPoint(this, new Point(x, y), c);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   710
                if(c.isVisible() && c.contains(point)){
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   711
                    return true;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   712
                }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   713
            }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   714
            if (getMouseListeners().length == 0
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   715
                    && getMouseMotionListeners().length == 0
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   716
                    && getMouseWheelListeners().length == 0
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   717
                    && !isCursorSet()) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   718
                return false;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   719
            }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   720
            return super.contains(x, y);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   721
        }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   722
    }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   723
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   724
    /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   725
     * The default layout manager for the {@link javax.swing.JLayer}.<br/>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   726
     * It places the glassPane on top of the view component
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   727
     * and makes it the same size as {@code JLayer},
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   728
     * it also makes the view component the same size but minus layer's insets<br/>
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   729
     */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   730
    private static class DefaultLayerLayout implements LayoutManager, Serializable {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   731
        /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   732
         * {@inheritDoc}
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   733
         */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   734
        public void layoutContainer(Container parent) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   735
            JLayer layer = (JLayer) parent;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   736
            Component view = layer.getView();
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   737
            Component glassPane = layer.getGlassPane();
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   738
            if (view != null) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   739
                Insets insets = layer.getInsets();
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   740
                view.setLocation(insets.left, insets.top);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   741
                view.setSize(layer.getWidth() - insets.left - insets.right,
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   742
                        layer.getHeight() - insets.top - insets.bottom);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   743
            }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   744
            if (glassPane != null) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   745
                glassPane.setLocation(0, 0);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   746
                glassPane.setSize(layer.getWidth(), layer.getHeight());
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   747
            }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   748
        }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   749
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   750
        /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   751
         * {@inheritDoc}
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   752
         */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   753
        public Dimension minimumLayoutSize(Container parent) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   754
            JLayer layer = (JLayer) parent;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   755
            Insets insets = layer.getInsets();
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   756
            Dimension ret = new Dimension(insets.left + insets.right,
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   757
                    insets.top + insets.bottom);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   758
            Component view = layer.getView();
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   759
            if (view != null) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   760
                Dimension size = view.getMinimumSize();
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   761
                ret.width += size.width;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   762
                ret.height += size.height;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   763
            }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   764
            if (ret.width == 0 || ret.height == 0) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   765
                ret.width = ret.height = 4;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   766
            }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   767
            return ret;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   768
        }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   769
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   770
        /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   771
         * {@inheritDoc}
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   772
         */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   773
        public Dimension preferredLayoutSize(Container parent) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   774
            JLayer layer = (JLayer) parent;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   775
            Insets insets = layer.getInsets();
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   776
            Dimension ret = new Dimension(insets.left + insets.right,
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   777
                    insets.top + insets.bottom);
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   778
            Component view = layer.getView();
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   779
            if (view != null) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   780
                Dimension size = view.getPreferredSize();
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   781
                if (size.width > 0 && size.height > 0) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   782
                    ret.width += size.width;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   783
                    ret.height += size.height;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   784
                }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   785
            }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   786
            return ret;
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   787
        }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   788
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   789
        /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   790
         * {@inheritDoc}
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   791
         */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   792
        public void addLayoutComponent(String name, Component comp) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   793
        }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   794
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   795
        /**
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   796
         * {@inheritDoc}
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   797
         */
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   798
        public void removeLayoutComponent(Component comp) {
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   799
        }
defe8eec9251 6822696: Integrating JXLayer component to Swing library
alexp
parents:
diff changeset
   800
    }
3733
af63479b67b8 6872492: JLayer sources contain wrong header
alexp
parents: 3508
diff changeset
   801
}