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 }