Frames | No Frames |
1: /* PopupFactory.java -- 2: Copyright (C) 2003 Free Software Foundation, Inc. 3: 4: This file is part of GNU Classpath. 5: 6: GNU Classpath is free software; you can redistribute it and/or modify 7: it under the terms of the GNU General Public License as published by 8: the Free Software Foundation; either version 2, or (at your option) 9: any later version. 10: 11: GNU Classpath is distributed in the hope that it will be useful, but 12: WITHOUT ANY WARRANTY; without even the implied warranty of 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14: General Public License for more details. 15: 16: You should have received a copy of the GNU General Public License 17: along with GNU Classpath; see the file COPYING. If not, write to the 18: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 19: 02110-1301 USA. 20: 21: Linking this library statically or dynamically with other modules is 22: making a combined work based on this library. Thus, the terms and 23: conditions of the GNU General Public License cover the whole 24: combination. 25: 26: As a special exception, the copyright holders of this library give you 27: permission to link this library with independent modules to produce an 28: executable, regardless of the license terms of these independent 29: modules, and to copy and distribute the resulting executable under 30: terms of your choice, provided that you also meet, for each linked 31: independent module, the terms and conditions of the license of that 32: module. An independent module is a module which is not derived from 33: or based on this library. If you modify this library, you may extend 34: this exception to your version of the library, but you are not 35: obligated to do so. If you do not wish to do so, delete this 36: exception statement from your version. */ 37: 38: 39: package javax.swing; 40: 41: import java.awt.Component; 42: import java.awt.Dimension; 43: import java.awt.Point; 44: 45: 46: /** 47: * A factory for <code>Popup</code> objects. These are used to 48: * managed little windows that float over everything else, 49: * typically containing a popup menu. 50: * 51: * @since 1.4 52: * 53: * @author Sascha Brawer (brawer@dandelis.ch) 54: */ 55: public class PopupFactory 56: { 57: /** 58: * The shared factory object. 59: * 60: * @see #getSharedInstance 61: * @see #setSharedInstance 62: */ 63: private static PopupFactory sharedFactory; 64: 65: 66: /** 67: * Constructs a new <code>PopupFactory</code>. Usually, a single 68: * <code>PopupFactory</code> is shared among multiple consumers 69: * of <code>Popup</code>. Use {@link #getSharedInstance} to retrieve 70: * the current factory. 71: */ 72: public PopupFactory() 73: { 74: // Nothing to do here. 75: } 76: 77: 78: /** 79: * Sets the shared factory. 80: * 81: * @param factory the PopupFactory that future invocations of 82: * {@link #getSharedInstance} will return. 83: * 84: * @throws IllegalArgumentException if <code>factory</code> 85: * is <code>null</code>. 86: */ 87: public static void setSharedInstance(PopupFactory factory) 88: { 89: if (factory == null) 90: throw new IllegalArgumentException(); 91: 92: /* Swing is not designed to be thread-safe, so there is no 93: * need to synchronize the access to the global variable. 94: */ 95: sharedFactory = factory; 96: } 97: 98: 99: /** 100: * Retrieves the shared factory, creating a new factory if 101: * necessary. 102: * 103: * @return a <code>PopupFactory</code> that can be used 104: * to create <code>Popup</code> objects. 105: */ 106: public static PopupFactory getSharedInstance() 107: { 108: /* Swing is not designed to be thread-safe, so there is no 109: * need to synchronize the access to the global variable. 110: */ 111: if (sharedFactory == null) 112: sharedFactory = new PopupFactory(); 113: 114: return sharedFactory; 115: } 116: 117: 118: /** 119: * Creates a new <code>Popup</code> given its owner, 120: * contents and the screen position where the popup 121: * will appear. 122: * 123: * @param owner the Component to which <code>x</code> and 124: * <code>y</code> are relative, or <code>null</code> for 125: * placing the popup relative to the origin of the screen. 126: * 127: * @param contents the contents that will be displayed inside 128: * the <code>Popup</code>. 129: * 130: * @param x the horizontal position where the Popup will appear. 131: * 132: * @param y the vertical position where the Popup will appear. 133: * 134: * @throws IllegalArgumentException if <code>contents</code> 135: * is <code>null</code>. 136: */ 137: public Popup getPopup(Component owner, Component contents, 138: int x, int y) 139: { 140: Popup popup = null; 141: // By default we enable lightweight popups since they are more efficient 142: // than heavyweight popups. 143: boolean lightweightEnabled = true; 144: // Special case JPopupMenu here, since it supports a lightweightEnabled 145: // flag that we must respect. 146: if (contents instanceof JPopupMenu) 147: { 148: JPopupMenu menu = (JPopupMenu) contents; 149: lightweightEnabled = menu.isLightWeightPopupEnabled(); 150: } 151: 152: // If we have a root pane and the contents fits within the root pane and 153: // lightweight popups are enabled, than we can use a lightweight popup. 154: JRootPane root = SwingUtilities.getRootPane(owner); 155: if (root != null) 156: { 157: Point rootLoc = root.getLocationOnScreen(); 158: Dimension contentsSize = contents.getSize(); 159: Dimension rootSize = root.getSize(); 160: if (x >= rootLoc.x && y > rootLoc.y 161: && (x - rootLoc.x) + contentsSize.width < rootSize.width 162: && (y - rootLoc.y) + contentsSize.height < rootSize.height) 163: popup = new Popup.LightweightPopup(owner, contents, x, y); 164: else 165: popup = new Popup.JWindowPopup(owner, contents, x, y); 166: } 167: else 168: popup = new Popup.JWindowPopup(owner, contents, x, y); 169: return popup; 170: } 171: }