1 /*
2  * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 package sun.awt;
27 
28 import java.awt.Component;
29 import java.awt.Container;
30 import java.awt.Frame;
31 import java.awt.Graphics;
32 import java.awt.Image;
33 import java.awt.MenuBar;
34 import java.awt.MenuComponent;
35 import java.awt.Rectangle;
36 import java.awt.Toolkit;
37 import java.awt.dnd.DragGestureEvent;
38 import java.awt.dnd.DragGestureListener;
39 import java.awt.dnd.DragGestureRecognizer;
40 import java.awt.dnd.DragSource;
41 import java.awt.dnd.DropTarget;
42 import java.awt.dnd.InvalidDnDOperationException;
43 import java.awt.dnd.peer.DragSourceContextPeer;
44 import java.awt.peer.FramePeer;
45 
46 /**
47  * The class provides basic functionality for a lightweight frame
48  * implementation. A subclass is expected to provide painting to an
49  * offscreen image and access to it. Thus it can be used for lightweight
50  * embedding.
51  *
52  * @author Artem Ananiev
53  * @author Anton Tarasov
54  */
55 @SuppressWarnings("serial")
56 public abstract class LightweightFrame extends Frame {
57 
58     /**
59      * Constructs a new, initially invisible {@code LightweightFrame}
60      * instance.
61      */
LightweightFrame()62     public LightweightFrame() {
63         setUndecorated(true);
64         setResizable(true);
65         setEnabled(true);
66     }
67 
68     /**
69      * Blocks introspection of a parent window by this child.
70      *
71      * @return null
72      */
getParent()73     @Override public final Container getParent() { return null; }
74 
getGraphics()75     @Override public Graphics getGraphics() { return null; }
76 
isResizable()77     @Override public final boolean isResizable() { return true; }
78 
79     // Block modification of any frame attributes, since they aren't
80     // applicable for a lightweight frame.
81 
setTitle(String title)82     @Override public final void setTitle(String title) {}
setIconImage(Image image)83     @Override public final void setIconImage(Image image) {}
setIconImages(java.util.List<? extends Image> icons)84     @Override public final void setIconImages(java.util.List<? extends Image> icons) {}
setMenuBar(MenuBar mb)85     @Override public final void setMenuBar(MenuBar mb) {}
setResizable(boolean resizable)86     @Override public final void setResizable(boolean resizable) {}
remove(MenuComponent m)87     @Override public final void remove(MenuComponent m) {}
toFront()88     @Override public final void toFront() {}
toBack()89     @Override public final void toBack() {}
90 
91     @SuppressWarnings("deprecation")
addNotify()92     @Override public void addNotify() {
93         synchronized (getTreeLock()) {
94             if (!isDisplayable()) {
95                 SunToolkit stk = (SunToolkit)Toolkit.getDefaultToolkit();
96                 try {
97                     setPeer(stk.createLightweightFrame(this));
98                 } catch (Exception e) {
99                     throw new RuntimeException(e);
100                 }
101             }
102             super.addNotify();
103         }
104     }
105 
setPeer(final FramePeer p)106     private void setPeer(final FramePeer p) {
107         AWTAccessor.getComponentAccessor().setPeer(this, p);
108     }
109 
110     /**
111      * Requests the peer to emulate activation or deactivation of the
112      * frame. Peers should override this method if they are to implement
113      * this functionality.
114      *
115      * @param activate if {@code true}, activates the frame;
116      *                 otherwise, deactivates the frame
117      */
emulateActivation(boolean activate)118     public void emulateActivation(boolean activate) {
119         final FramePeer peer = AWTAccessor.getComponentAccessor().getPeer(this);
120         peer.emulateActivation(activate);
121     }
122 
123     /**
124      * Delegates the focus grab action to the client (embedding) application.
125      * The method is called by the AWT grab machinery.
126      *
127      * @see SunToolkit#grab(java.awt.Window)
128      */
grabFocus()129     public abstract void grabFocus();
130 
131     /**
132      * Delegates the focus ungrab action to the client (embedding) application.
133      * The method is called by the AWT grab machinery.
134      *
135      * @see SunToolkit#ungrab(java.awt.Window)
136      */
ungrabFocus()137     public abstract void ungrabFocus();
138 
139     /**
140      * Returns the scale factor of this frame. The default value is 1.
141      *
142      * @return the scale factor
143      * @see #notifyDisplayChanged(int)
144      * @Depricated replaced by {@link #getScaleFactorX()} and
145      * {@link #getScaleFactorY}
146      */
147     @Deprecated(since = "9")
getScaleFactor()148     public abstract int getScaleFactor();
149 
150     /**
151      * Returns the scale factor of this frame along x coordinate. The default
152      * value is 1.
153      *
154      * @return the x coordinate scale factor
155      * @see #notifyDisplayChanged(double, double)
156      * @since 9
157      */
getScaleFactorX()158     public abstract double getScaleFactorX();
159 
160     /**
161      * Returns the scale factor of this frame along y coordinate. The default
162      * value is 1.
163      *
164      * @return the y coordinate scale factor
165      * @see #notifyDisplayChanged(double, double)
166      * @since 9
167      */
getScaleFactorY()168     public abstract double getScaleFactorY();
169 
170     /**
171      * Called when display of the hosted frame is changed.
172      *
173      * @param scaleFactor the scale factor
174      * @Depricated replaced by {@link #notifyDisplayChanged(double, double)}
175      */
176     @Deprecated(since = "9")
notifyDisplayChanged(int scaleFactor)177     public abstract void notifyDisplayChanged(int scaleFactor);
178 
179     /**
180      * Called when display of the hosted frame is changed.
181      *
182      * @param scaleFactorX the scale factor
183      * @param scaleFactorY the scale factor
184      * @since 9
185      */
notifyDisplayChanged(double scaleFactorX, double scaleFactorY)186     public abstract void notifyDisplayChanged(double scaleFactorX,
187                                               double scaleFactorY);
188 
189     /**
190      * Host window absolute bounds.
191      */
192     private int hostX, hostY, hostW, hostH;
193 
194     /**
195      * Returns the absolute bounds of the host (embedding) window.
196      *
197      * @return the host window bounds
198      */
getHostBounds()199     public Rectangle getHostBounds() {
200         if (hostX == 0 && hostY == 0 && hostW == 0 && hostH == 0) {
201             // The client app is probably unaware of the setHostBounds.
202             // A safe fall-back:
203             return getBounds();
204         }
205         return new Rectangle(hostX, hostY, hostW, hostH);
206     }
207 
208     /**
209      * Sets the absolute bounds of the host (embedding) window.
210      */
setHostBounds(int x, int y, int w, int h)211     public void setHostBounds(int x, int y, int w, int h) {
212         hostX = x;
213         hostY = y;
214         hostW = w;
215         hostH = h;
216     }
217 
218     /**
219      * Create a drag gesture recognizer for the lightweight frame.
220      */
createDragGestureRecognizer( Class<T> abstractRecognizerClass, DragSource ds, Component c, int srcActions, DragGestureListener dgl)221     public abstract <T extends DragGestureRecognizer> T createDragGestureRecognizer(
222             Class<T> abstractRecognizerClass,
223             DragSource ds, Component c, int srcActions,
224             DragGestureListener dgl);
225 
226     /**
227      * Create a drag source context peer for the lightweight frame.
228      */
createDragSourceContextPeer(DragGestureEvent dge)229     public abstract DragSourceContextPeer createDragSourceContextPeer(DragGestureEvent dge) throws InvalidDnDOperationException;
230 
231     /**
232      * Adds a drop target to the lightweight frame.
233      */
addDropTarget(DropTarget dt)234     public abstract void addDropTarget(DropTarget dt);
235 
236     /**
237      * Removes a drop target from the lightweight frame.
238      */
removeDropTarget(DropTarget dt)239     public abstract void removeDropTarget(DropTarget dt);
240 
241 }
242