1 /*
2 * Copyright (c) 2013, 2015, 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 */
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 */
73 @Override public final Container getParent() { return null; }
74
75 @Override public Graphics getGraphics() { return null; }
76
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
82 @Override public final void setTitle(String title) {}
83 @Override public final void setIconImage(Image image) {}
84 @Override public final void setIconImages(java.util.List<? extends Image> icons) {}
85 @Override public final void setMenuBar(MenuBar mb) {}
86 @Override public final void setResizable(boolean resizable) {}
87 @Override public final void remove(MenuComponent m) {}
88 @Override public final void toFront() {}
89 @Override public final void toBack() {}
90
91 @SuppressWarnings("deprecation")
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
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</code>, activates the frame;
116 * otherwise, deactivates the frame
117 */
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 */
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 */
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 */
145 public abstract int getScaleFactor();
146
147 /**
148 * Called when display of the hosted frame is changed.
149 *
150 * @param scaleFactor the scale factor
151 */
152 public abstract void notifyDisplayChanged(int scaleFactor);
153
154 /**
155 * Host window absolute bounds.
156 */
157 private int hostX, hostY, hostW, hostH;
158
159 /**
160 * Returns the absolute bounds of the host (embedding) window.
161 *
162 * @return the host window bounds
163 */
164 public Rectangle getHostBounds() {
165 if (hostX == 0 && hostY == 0 && hostW == 0 && hostH == 0) {
166 // The client app is probably unaware of the setHostBounds.
167 // A safe fall-back:
168 return getBounds();
169 }
170 return new Rectangle(hostX, hostY, hostW, hostH);
171 }
172
173 /**
174 * Sets the absolute bounds of the host (embedding) window.
175 */
176 public void setHostBounds(int x, int y, int w, int h) {
177 hostX = x;
178 hostY = y;
179 hostW = w;
180 hostH = h;
181 }
182
183 /**
184 * Create a drag gesture recognizer for the lightweight frame.
185 */
186 public abstract <T extends DragGestureRecognizer> T createDragGestureRecognizer(
187 Class<T> abstractRecognizerClass,
188 DragSource ds, Component c, int srcActions,
189 DragGestureListener dgl);
190
191 /**
192 * Create a drag source context peer for the lightweight frame.
193 */
194 public abstract DragSourceContextPeer createDragSourceContextPeer(DragGestureEvent dge) throws InvalidDnDOperationException;
195
196 /**
197 * Adds a drop target to the lightweight frame.
198 */
199 public abstract void addDropTarget(DropTarget dt);
200
201 /**
202 * Removes a drop target from the lightweight frame.
203 */
204 public abstract void removeDropTarget(DropTarget dt);
205 }
--- EOF ---