jdk/src/share/classes/sun/swing/JLightweightFrame.java
author lana
Tue, 04 Feb 2014 16:24:39 -0800
changeset 23281 93c0a5484bb5
parent 23280 df31f522531f
parent 22618 927e4fe6cb24
child 25195 9de77f5b0df2
permissions -rw-r--r--
Merge
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15983
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
     1
/*
22618
927e4fe6cb24 8033221: Fix serial lint warnings in sun.swing.*
darcy
parents: 20136
diff changeset
     2
 * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
15983
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
     4
 *
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    10
 *
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    15
 * accompanied this code).
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    16
 *
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    20
 *
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    23
 * questions.
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    24
 */
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    25
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    26
package sun.swing;
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    27
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    28
import java.awt.BorderLayout;
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    29
import java.awt.Color;
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    30
import java.awt.Component;
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    31
import java.awt.Container;
19026
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
    32
import java.awt.Dimension;
15983
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    33
import java.awt.EventQueue;
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    34
import java.awt.Graphics;
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    35
import java.awt.Graphics2D;
20127
a3a34675d847 8024170: [SwingNode] Implement cursor change
pchelko
parents: 19026
diff changeset
    36
import java.awt.MouseInfo;
a3a34675d847 8024170: [SwingNode] Implement cursor change
pchelko
parents: 19026
diff changeset
    37
import java.awt.Point;
15983
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    38
import java.awt.Rectangle;
23280
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
    39
import java.awt.Window;
19026
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
    40
import java.awt.event.ContainerEvent;
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
    41
import java.awt.event.ContainerListener;
15983
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    42
import java.awt.image.BufferedImage;
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    43
import java.awt.image.DataBufferInt;
19026
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
    44
import java.beans.PropertyChangeEvent;
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
    45
import java.beans.PropertyChangeListener;
17415
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
    46
import java.security.AccessController;
23280
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
    47
import javax.swing.JComponent;
15983
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    48
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    49
import javax.swing.JLayeredPane;
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    50
import javax.swing.JPanel;
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    51
import javax.swing.JRootPane;
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    52
import javax.swing.LayoutFocusTraversalPolicy;
23280
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
    53
import javax.swing.RepaintManager;
15983
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    54
import javax.swing.RootPaneContainer;
20127
a3a34675d847 8024170: [SwingNode] Implement cursor change
pchelko
parents: 19026
diff changeset
    55
import javax.swing.SwingUtilities;
15983
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    56
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    57
import sun.awt.LightweightFrame;
17415
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
    58
import sun.security.action.GetPropertyAction;
23280
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
    59
import sun.swing.SwingUtilities2.RepaintListener;
15983
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    60
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    61
/**
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    62
 * The frame serves as a lightweight container which paints its content
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    63
 * to an offscreen image and provides access to the image's data via the
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    64
 * {@link LightweightContent} interface. Note, that it may not be shown
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    65
 * as a standalone toplevel frame. Its purpose is to provide functionality
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    66
 * for lightweight embedding.
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    67
 *
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    68
 * @author Artem Ananiev
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    69
 * @author Anton Tarasov
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    70
 */
22618
927e4fe6cb24 8033221: Fix serial lint warnings in sun.swing.*
darcy
parents: 20136
diff changeset
    71
@SuppressWarnings("serial") // JDK-implementation class
15983
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    72
public final class JLightweightFrame extends LightweightFrame implements RootPaneContainer {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    73
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    74
    private final JRootPane rootPane = new JRootPane();
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    75
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    76
    private LightweightContent content;
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    77
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    78
    private Component component;
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    79
    private JPanel contentPane;
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    80
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    81
    private BufferedImage bbImage;
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    82
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
    83
    /**
17415
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
    84
     * {@code copyBufferEnabled}, true by default, defines the following strategy.
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
    85
     * A duplicating (copy) buffer is created for the original pixel buffer.
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
    86
     * The copy buffer is synchronized with the original buffer every time the
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
    87
     * latter changes. {@code JLightweightFrame} passes the copy buffer array
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
    88
     * to the {@link LightweightContent#imageBufferReset} method. The code spot
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
    89
     * which synchronizes two buffers becomes the only critical section guarded
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
    90
     * by the lock (managed with the {@link LightweightContent#paintLock()},
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
    91
     * {@link LightweightContent#paintUnlock()} methods).
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
    92
     */
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
    93
    private boolean copyBufferEnabled;
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
    94
    private int[] copyBuffer;
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
    95
19026
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
    96
    private PropertyChangeListener layoutSizeListener;
23280
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
    97
    private RepaintListener repaintListener;
19026
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
    98
20127
a3a34675d847 8024170: [SwingNode] Implement cursor change
pchelko
parents: 19026
diff changeset
    99
    static {
a3a34675d847 8024170: [SwingNode] Implement cursor change
pchelko
parents: 19026
diff changeset
   100
        SwingAccessor.setJLightweightFrameAccessor(new SwingAccessor.JLightweightFrameAccessor() {
a3a34675d847 8024170: [SwingNode] Implement cursor change
pchelko
parents: 19026
diff changeset
   101
            @Override
a3a34675d847 8024170: [SwingNode] Implement cursor change
pchelko
parents: 19026
diff changeset
   102
            public void updateCursor(JLightweightFrame frame) {
a3a34675d847 8024170: [SwingNode] Implement cursor change
pchelko
parents: 19026
diff changeset
   103
                frame.updateClientCursor();
a3a34675d847 8024170: [SwingNode] Implement cursor change
pchelko
parents: 19026
diff changeset
   104
            }
a3a34675d847 8024170: [SwingNode] Implement cursor change
pchelko
parents: 19026
diff changeset
   105
        });
a3a34675d847 8024170: [SwingNode] Implement cursor change
pchelko
parents: 19026
diff changeset
   106
    }
a3a34675d847 8024170: [SwingNode] Implement cursor change
pchelko
parents: 19026
diff changeset
   107
17415
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   108
    /**
15983
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   109
     * Constructs a new, initially invisible {@code JLightweightFrame}
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   110
     * instance.
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   111
     */
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   112
    public JLightweightFrame() {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   113
        super();
17415
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   114
        copyBufferEnabled = "true".equals(AccessController.
20136
594c0830f18c 8022512: JLightweightFrame: the content pane should be transparent
ant
parents: 20127
diff changeset
   115
            doPrivileged(new GetPropertyAction("swing.jlf.copyBufferEnabled", "true")));
17415
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   116
15983
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   117
        add(rootPane, BorderLayout.CENTER);
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   118
        setFocusTraversalPolicy(new LayoutFocusTraversalPolicy());
16706
4b243017cd27 8010375: sun.swing.JLightweightFrame should be implemented for XToolkit
ant
parents: 15983
diff changeset
   119
        if (getGraphicsConfiguration().isTranslucencyCapable()) {
4b243017cd27 8010375: sun.swing.JLightweightFrame should be implemented for XToolkit
ant
parents: 15983
diff changeset
   120
            setBackground(new Color(0, 0, 0, 0));
4b243017cd27 8010375: sun.swing.JLightweightFrame should be implemented for XToolkit
ant
parents: 15983
diff changeset
   121
        }
19026
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   122
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   123
        layoutSizeListener = new PropertyChangeListener() {
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   124
            @Override
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   125
            public void propertyChange(PropertyChangeEvent e) {
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   126
                Dimension d = (Dimension)e.getNewValue();
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   127
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   128
                if ("preferredSize".equals(e.getPropertyName())) {
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   129
                    content.preferredSizeChanged(d.width, d.height);
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   130
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   131
                } else if ("maximumSize".equals(e.getPropertyName())) {
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   132
                    content.maximumSizeChanged(d.width, d.height);
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   133
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   134
                } else if ("minimumSize".equals(e.getPropertyName())) {
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   135
                    content.minimumSizeChanged(d.width, d.height);
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   136
                }
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   137
            }
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   138
        };
23280
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   139
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   140
        repaintListener = (JComponent c, int x, int y, int w, int h) -> {
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   141
            Window jlf = SwingUtilities.getWindowAncestor(c);
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   142
            if (jlf != JLightweightFrame.this) {
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   143
                return;
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   144
            }
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   145
            Point p = SwingUtilities.convertPoint(c, x, y, jlf);
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   146
            Rectangle r = new Rectangle(p.x, p.y, w, h).intersection(
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   147
                    new Rectangle(0, 0, bbImage.getWidth(), bbImage.getHeight()));
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   148
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   149
            if (!r.isEmpty()) {
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   150
                notifyImageUpdated(r.x, r.y, r.width, r.height);
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   151
            }
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   152
        };
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   153
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   154
        SwingAccessor.getRepaintManagerAccessor().addRepaintListener(
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   155
            RepaintManager.currentManager(this), repaintListener);
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   156
    }
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   157
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   158
    @Override
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   159
    public void dispose() {
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   160
        SwingAccessor.getRepaintManagerAccessor().removeRepaintListener(
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   161
            RepaintManager.currentManager(this), repaintListener);
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   162
        super.dispose();
15983
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   163
    }
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   164
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   165
    /**
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   166
     * Sets the {@link LightweightContent} instance for this frame.
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   167
     * The {@code JComponent} object returned by the
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   168
     * {@link LightweightContent#getComponent()} method is immediately
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   169
     * added to the frame's content pane.
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   170
     *
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   171
     * @param content the {@link LightweightContent} instance
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   172
     */
19026
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   173
    public void setContent(final LightweightContent content) {
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   174
        if (content == null) {
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   175
            System.err.println("JLightweightFrame.setContent: content may not be null!");
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   176
            return;
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   177
        }
15983
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   178
        this.content = content;
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   179
        this.component = content.getComponent();
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   180
19026
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   181
        Dimension d = this.component.getPreferredSize();
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   182
        content.preferredSizeChanged(d.width, d.height);
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   183
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   184
        d = this.component.getMaximumSize();
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   185
        content.maximumSizeChanged(d.width, d.height);
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   186
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   187
        d = this.component.getMinimumSize();
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   188
        content.minimumSizeChanged(d.width, d.height);
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   189
15983
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   190
        initInterior();
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   191
    }
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   192
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   193
    @Override
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   194
    public Graphics getGraphics() {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   195
        if (bbImage == null) return null;
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   196
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   197
        Graphics2D g = bbImage.createGraphics();
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   198
        g.setBackground(getBackground());
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   199
        g.setColor(getForeground());
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   200
        g.setFont(getFont());
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   201
        return g;
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   202
    }
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   203
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   204
    /**
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   205
     * {@inheritDoc}
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   206
     *
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   207
     * @see LightweightContent#focusGrabbed()
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   208
     */
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   209
    @Override
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   210
    public void grabFocus() {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   211
        if (content != null) content.focusGrabbed();
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   212
    }
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   213
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   214
    /**
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   215
     * {@inheritDoc}
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   216
     *
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   217
     * @see LightweightContent#focusUngrabbed()
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   218
     */
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   219
    @Override
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   220
    public void ungrabFocus() {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   221
        if (content != null) content.focusUngrabbed();
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   222
    }
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   223
17415
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   224
    private void syncCopyBuffer(boolean reset, int x, int y, int w, int h) {
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   225
        content.paintLock();
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   226
        try {
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   227
            int[] srcBuffer = ((DataBufferInt)bbImage.getRaster().getDataBuffer()).getData();
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   228
            if (reset) {
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   229
                copyBuffer = new int[srcBuffer.length];
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   230
            }
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   231
            int linestride = bbImage.getWidth();
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   232
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   233
            for (int i=0; i<h; i++) {
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   234
                int from = (y + i) * linestride + x;
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   235
                System.arraycopy(srcBuffer, from, copyBuffer, from, w);
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   236
            }
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   237
        } finally {
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   238
            content.paintUnlock();
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   239
        }
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   240
    }
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   241
23280
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   242
    private void notifyImageUpdated(int x, int y, int width, int height) {
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   243
        if (copyBufferEnabled) {
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   244
            syncCopyBuffer(false, x, y, width, height);
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   245
        }
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   246
        content.imageUpdated(x, y, width, height);
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   247
    }
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   248
22618
927e4fe6cb24 8033221: Fix serial lint warnings in sun.swing.*
darcy
parents: 20136
diff changeset
   249
    @SuppressWarnings("serial") // anonymous class inside
15983
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   250
    private void initInterior() {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   251
        contentPane = new JPanel() {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   252
            @Override
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   253
            public void paint(Graphics g) {
17415
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   254
                if (!copyBufferEnabled) {
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   255
                    content.paintLock();
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   256
                }
15983
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   257
                try {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   258
                    super.paint(g);
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   259
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   260
                    final Rectangle clip = g.getClipBounds() != null ?
17415
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   261
                            g.getClipBounds() :
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   262
                            new Rectangle(0, 0, contentPane.getWidth(), contentPane.getHeight());
15983
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   263
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   264
                    clip.x = Math.max(0, clip.x);
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   265
                    clip.y = Math.max(0, clip.y);
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   266
                    clip.width = Math.min(contentPane.getWidth(), clip.width);
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   267
                    clip.height = Math.min(contentPane.getHeight(), clip.height);
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   268
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   269
                    EventQueue.invokeLater(new Runnable() {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   270
                        @Override
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   271
                        public void run() {
23280
df31f522531f 8033233: [JLightweightFrame] support default JViewport BLIT_SCROLL_MODE
ant
parents: 20136
diff changeset
   272
                            notifyImageUpdated(clip.x, clip.y, clip.width, clip.height);
15983
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   273
                        }
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   274
                    });
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   275
                } finally {
17415
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   276
                    if (!copyBufferEnabled) {
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   277
                        content.paintUnlock();
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   278
                    }
15983
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   279
                }
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   280
            }
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   281
            @Override
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   282
            protected boolean isPaintingOrigin() {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   283
                return true;
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   284
            }
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   285
        };
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   286
        contentPane.setLayout(new BorderLayout());
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   287
        contentPane.add(component);
20136
594c0830f18c 8022512: JLightweightFrame: the content pane should be transparent
ant
parents: 20127
diff changeset
   288
        if ("true".equals(AccessController.
594c0830f18c 8022512: JLightweightFrame: the content pane should be transparent
ant
parents: 20127
diff changeset
   289
            doPrivileged(new GetPropertyAction("swing.jlf.contentPaneTransparent", "false"))))
594c0830f18c 8022512: JLightweightFrame: the content pane should be transparent
ant
parents: 20127
diff changeset
   290
        {
594c0830f18c 8022512: JLightweightFrame: the content pane should be transparent
ant
parents: 20127
diff changeset
   291
            contentPane.setOpaque(false);
594c0830f18c 8022512: JLightweightFrame: the content pane should be transparent
ant
parents: 20127
diff changeset
   292
        }
15983
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   293
        setContentPane(contentPane);
19026
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   294
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   295
        contentPane.addContainerListener(new ContainerListener() {
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   296
            @Override
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   297
            public void componentAdded(ContainerEvent e) {
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   298
                Component c = JLightweightFrame.this.component;
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   299
                if (e.getChild() == c) {
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   300
                    c.addPropertyChangeListener("preferredSize", layoutSizeListener);
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   301
                    c.addPropertyChangeListener("maximumSize", layoutSizeListener);
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   302
                    c.addPropertyChangeListener("minimumSize", layoutSizeListener);
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   303
                }
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   304
            }
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   305
            @Override
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   306
            public void componentRemoved(ContainerEvent e) {
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   307
                Component c = JLightweightFrame.this.component;
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   308
                if (e.getChild() == c) {
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   309
                    c.removePropertyChangeListener(layoutSizeListener);
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   310
                }
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   311
            }
96141cb8d7eb 8020927: JLightweightFrame API should export layout properties change notifications
ant
parents: 17415
diff changeset
   312
        });
15983
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   313
    }
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   314
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   315
    @SuppressWarnings("deprecation")
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   316
    @Override public void reshape(int x, int y, int width, int height) {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   317
        super.reshape(x, y, width, height);
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   318
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   319
        if (width == 0 || height == 0) {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   320
            return;
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   321
        }
17415
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   322
        if (!copyBufferEnabled) {
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   323
            content.paintLock();
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   324
        }
15983
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   325
        try {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   326
            if ((bbImage == null) || (width != bbImage.getWidth()) || (height != bbImage.getHeight())) {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   327
                boolean createBB = true;
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   328
                int newW = width;
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   329
                int newH = height;
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   330
                if (bbImage != null) {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   331
                    int oldW = bbImage.getWidth();
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   332
                    int oldH = bbImage.getHeight();
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   333
                    if ((oldW >= newW) && (oldH >= newH)) {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   334
                        createBB = false;
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   335
                    } else {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   336
                        if (oldW >= newW) {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   337
                            newW = oldW;
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   338
                        } else {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   339
                            newW = Math.max((int)(oldW * 1.2), width);
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   340
                        }
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   341
                        if (oldH >= newH) {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   342
                            newH = oldH;
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   343
                        } else {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   344
                            newH = Math.max((int)(oldH * 1.2), height);
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   345
                        }
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   346
                    }
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   347
                }
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   348
                if (createBB) {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   349
                    BufferedImage oldBB = bbImage;
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   350
                    bbImage = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_ARGB_PRE);
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   351
                    if (oldBB != null) {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   352
                        Graphics g = bbImage.getGraphics();
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   353
                        try {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   354
                            g.drawImage(oldBB, 0, 0, newW, newH, null);
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   355
                        } finally {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   356
                            g.dispose();
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   357
                            oldBB.flush();
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   358
                        }
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   359
                    }
17415
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   360
                    int[] pixels = ((DataBufferInt)bbImage.getRaster().getDataBuffer()).getData();
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   361
                    if (copyBufferEnabled) {
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   362
                        syncCopyBuffer(true, 0, 0, width, height);
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   363
                        pixels = copyBuffer;
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   364
                    }
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   365
                    content.imageBufferReset(pixels, 0, 0, width, height, bbImage.getWidth());
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   366
                    return;
15983
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   367
                }
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   368
            }
17415
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   369
            content.imageReshaped(0, 0, width, height);
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   370
15983
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   371
        } finally {
17415
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   372
            if (!copyBufferEnabled) {
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   373
                content.paintUnlock();
62b97a10da72 8014227: JLightweightFrame needs another synchronization policy
ant
parents: 16706
diff changeset
   374
            }
15983
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   375
        }
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   376
    }
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   377
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   378
    @Override
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   379
    public JRootPane getRootPane() {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   380
        return rootPane;
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   381
    }
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   382
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   383
    @Override
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   384
    public void setContentPane(Container contentPane) {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   385
        getRootPane().setContentPane(contentPane);
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   386
    }
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   387
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   388
    @Override
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   389
    public Container getContentPane() {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   390
        return getRootPane().getContentPane();
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   391
    }
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   392
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   393
    @Override
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   394
    public void setLayeredPane(JLayeredPane layeredPane) {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   395
        getRootPane().setLayeredPane(layeredPane);
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   396
    }
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   397
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   398
    @Override
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   399
    public JLayeredPane getLayeredPane() {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   400
        return getRootPane().getLayeredPane();
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   401
    }
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   402
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   403
    @Override
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   404
    public void setGlassPane(Component glassPane) {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   405
        getRootPane().setGlassPane(glassPane);
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   406
    }
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   407
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   408
    @Override
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   409
    public Component getGlassPane() {
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   410
        return getRootPane().getGlassPane();
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   411
    }
20127
a3a34675d847 8024170: [SwingNode] Implement cursor change
pchelko
parents: 19026
diff changeset
   412
a3a34675d847 8024170: [SwingNode] Implement cursor change
pchelko
parents: 19026
diff changeset
   413
a3a34675d847 8024170: [SwingNode] Implement cursor change
pchelko
parents: 19026
diff changeset
   414
    /*
a3a34675d847 8024170: [SwingNode] Implement cursor change
pchelko
parents: 19026
diff changeset
   415
     * Notifies client toolkit that it should change a cursor.
a3a34675d847 8024170: [SwingNode] Implement cursor change
pchelko
parents: 19026
diff changeset
   416
     *
a3a34675d847 8024170: [SwingNode] Implement cursor change
pchelko
parents: 19026
diff changeset
   417
     * Called from the peer via SwingAccessor, because the
a3a34675d847 8024170: [SwingNode] Implement cursor change
pchelko
parents: 19026
diff changeset
   418
     * Component.updateCursorImmediately method is final
a3a34675d847 8024170: [SwingNode] Implement cursor change
pchelko
parents: 19026
diff changeset
   419
     * and could not be overridden.
a3a34675d847 8024170: [SwingNode] Implement cursor change
pchelko
parents: 19026
diff changeset
   420
     */
a3a34675d847 8024170: [SwingNode] Implement cursor change
pchelko
parents: 19026
diff changeset
   421
    private void updateClientCursor() {
a3a34675d847 8024170: [SwingNode] Implement cursor change
pchelko
parents: 19026
diff changeset
   422
        Point p = MouseInfo.getPointerInfo().getLocation();
a3a34675d847 8024170: [SwingNode] Implement cursor change
pchelko
parents: 19026
diff changeset
   423
        SwingUtilities.convertPointFromScreen(p, this);
a3a34675d847 8024170: [SwingNode] Implement cursor change
pchelko
parents: 19026
diff changeset
   424
        Component target = SwingUtilities.getDeepestComponentAt(this, p.x, p.y);
a3a34675d847 8024170: [SwingNode] Implement cursor change
pchelko
parents: 19026
diff changeset
   425
        if (target != null) {
a3a34675d847 8024170: [SwingNode] Implement cursor change
pchelko
parents: 19026
diff changeset
   426
            content.setCursor(target.getCursor());
a3a34675d847 8024170: [SwingNode] Implement cursor change
pchelko
parents: 19026
diff changeset
   427
        }
a3a34675d847 8024170: [SwingNode] Implement cursor change
pchelko
parents: 19026
diff changeset
   428
    }
15983
26a673dec5b2 8006406: lightweight embedding in other Java UI toolkits
ant
parents:
diff changeset
   429
}