GNU Classpath (0.95) | |
Frames | No Frames |
1: /* JDesktopPane.java -- 2: Copyright (C) 2002, 2004 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.beans.PropertyVetoException; 43: 44: import javax.accessibility.Accessible; 45: import javax.accessibility.AccessibleContext; 46: import javax.accessibility.AccessibleRole; 47: import javax.swing.plaf.DesktopPaneUI; 48: 49: /** 50: * JDesktopPane is a container (usually for JInternalFrames) that simulates a 51: * desktop. Typically, the user will create JInternalFrames and place them in 52: * a JDesktopPane. The user can then interact with JInternalFrames like they 53: * usually would with JFrames. The actions (minimize, maximize, close, etc) 54: * are done by using a DesktopManager that is associated with the 55: * JDesktopPane. 56: */ 57: public class JDesktopPane extends JLayeredPane implements Accessible 58: { 59: private static final long serialVersionUID = 766333777224038726L; 60: 61: /** 62: * This specifies that when dragged, a JInternalFrame should be completely 63: * visible. 64: * 65: * @specnote final since 1.5.0. 66: */ 67: public static final int LIVE_DRAG_MODE = 0; 68: 69: /** 70: * This specifies that when dragged, a JInternalFrame should only be visible 71: * as an outline. 72: * 73: * @specnote final since 1.5.0. 74: */ 75: public static final int OUTLINE_DRAG_MODE = 1; 76: 77: /** The selected frame in the JDesktopPane. */ 78: private transient JInternalFrame selectedFrame; 79: 80: /** The JDesktopManager to use for acting on JInternalFrames. */ 81: transient DesktopManager desktopManager; 82: 83: /** The drag mode used by the JDesktopPane. */ 84: private transient int dragMode = LIVE_DRAG_MODE; 85: 86: /** 87: * Indicates if the dragMode property has been set by a client 88: * program or by the UI. 89: * 90: * @see #setUIProperty(String, Object) 91: * @see LookAndFeel#installProperty(JComponent, String, Object) 92: */ 93: private boolean clientDragModeSet = false; 94: 95: /** 96: * Provides the accessibility features for the <code>JDesktopPane</code> 97: * component. 98: */ 99: protected class AccessibleJDesktopPane extends AccessibleJComponent 100: { 101: private static final long serialVersionUID = 6079388927946077570L; 102: 103: /** 104: * Creates a new <code>AccessibleJDesktopPane</code> instance. 105: */ 106: protected AccessibleJDesktopPane() 107: { 108: // Nothing to do here. 109: } 110: 111: /** 112: * Returns the accessible role for the <code>JSlider</code> component. 113: * 114: * @return {@link AccessibleRole#DESKTOP_PANE}. 115: */ 116: public AccessibleRole getAccessibleRole() 117: { 118: return AccessibleRole.DESKTOP_PANE; 119: } 120: } 121: 122: /** 123: * Creates a new JDesktopPane object. 124: */ 125: public JDesktopPane() 126: { 127: setLayout(null); 128: updateUI(); 129: } 130: 131: /** 132: * This method returns the UI used with the JDesktopPane. 133: * 134: * @return The UI used with the JDesktopPane. 135: */ 136: public DesktopPaneUI getUI() 137: { 138: return (DesktopPaneUI) ui; 139: } 140: 141: /** 142: * This method sets the UI used with the JDesktopPane. 143: * 144: * @param ui The UI to use with the JDesktopPane. 145: */ 146: public void setUI(DesktopPaneUI ui) 147: { 148: super.setUI(ui); 149: } 150: 151: /** 152: * This method sets the drag mode to use with the JDesktopPane. 153: * 154: * @param mode The drag mode to use. 155: * 156: * @throws IllegalArgumentException If the drag mode given is not 157: * LIVE_DRAG_MODE or OUTLINE_DRAG_MODE. 158: */ 159: public void setDragMode(int mode) 160: { 161: if ((mode != LIVE_DRAG_MODE) && (mode != OUTLINE_DRAG_MODE)) 162: throw new IllegalArgumentException("Drag mode not valid."); 163: 164: clientDragModeSet = true; 165: 166: // FIXME: Unsupported mode. 167: if (mode == OUTLINE_DRAG_MODE) 168: // throw new IllegalArgumentException("Outline drag modes are 169: // unsupported."); 170: mode = LIVE_DRAG_MODE; 171: 172: dragMode = mode; 173: } 174: 175: /** 176: * This method returns the drag mode used with the JDesktopPane. 177: * 178: * @return The drag mode used with the JDesktopPane. 179: */ 180: public int getDragMode() 181: { 182: return dragMode; 183: } 184: 185: /** 186: * This method returns the DesktopManager used with the JDesktopPane. 187: * 188: * @return The DesktopManager to use with the JDesktopPane. 189: */ 190: public DesktopManager getDesktopManager() 191: { 192: return desktopManager; 193: } 194: 195: /** 196: * This method sets the DesktopManager to use with the JDesktopPane. 197: * 198: * @param manager The DesktopManager to use with the JDesktopPane. 199: */ 200: public void setDesktopManager(DesktopManager manager) 201: { 202: desktopManager = manager; 203: } 204: 205: /** 206: * This method restores the UI used with the JDesktopPane to the default. 207: */ 208: public void updateUI() 209: { 210: setUI((DesktopPaneUI) UIManager.getUI(this)); 211: } 212: 213: /** 214: * This method returns a String identifier that allows the UIManager to know 215: * which class will act as JDesktopPane's UI. 216: * 217: * @return A String identifier for the UI class to use. 218: */ 219: public String getUIClassID() 220: { 221: return "DesktopPaneUI"; 222: } 223: 224: /** 225: * This method returns all JInternalFrames that are in the JDesktopPane. 226: * 227: * @return All JInternalFrames that are in the JDesktopPane. 228: */ 229: public JInternalFrame[] getAllFrames() 230: { 231: return getFramesFromComponents(getComponents()); 232: } 233: 234: /** 235: * This method returns the currently selected frame in the JDesktopPane. 236: * 237: * @return The currently selected frame in the JDesktopPane. 238: */ 239: public JInternalFrame getSelectedFrame() 240: { 241: return selectedFrame; 242: } 243: 244: /** 245: * This method sets the selected frame in the JDesktopPane. 246: * 247: * @param frame The selected frame in the JDesktopPane. 248: */ 249: public void setSelectedFrame(JInternalFrame frame) 250: { 251: if (selectedFrame != null) 252: { 253: try 254: { 255: selectedFrame.setSelected(false); 256: } 257: catch (PropertyVetoException e) 258: { 259: // We do nothing when the attempt is vetoed. 260: } 261: } 262: selectedFrame = null; 263: 264: try 265: { 266: if (frame != null) 267: frame.setSelected(true); 268: 269: selectedFrame = frame; 270: } 271: catch (PropertyVetoException e) 272: { 273: // We do nothing when the attempt is vetoed. 274: } 275: } 276: 277: /** 278: * This method returns all the JInternalFrames in the given layer. 279: * 280: * @param layer The layer to grab frames in. 281: * 282: * @return All JInternalFrames in the given layer. 283: */ 284: public JInternalFrame[] getAllFramesInLayer(int layer) 285: { 286: return getFramesFromComponents(getComponentsInLayer(layer)); 287: } 288: 289: /** 290: * This method always returns true to indicate that it is not transparent. 291: * 292: * @return true. 293: */ 294: public boolean isOpaque() 295: { 296: return true; 297: } 298: 299: /** 300: * Returns an implementation-dependent string describing the attributes of 301: * this <code>JDesktopPane</code>. 302: * 303: * @return A string describing the attributes of this <code>JDesktopPane</code> 304: * (never <code>null</code>). 305: */ 306: protected String paramString() 307: { 308: String superParamStr = super.paramString(); 309: StringBuffer sb = new StringBuffer(); 310: sb.append(",isOptimizedDrawingPossible="); 311: sb.append(isOptimizedDrawingEnabled()); 312: sb.append(",desktopManager="); 313: if (desktopManager != null) 314: sb.append(desktopManager); 315: return superParamStr + sb.toString(); 316: } 317: 318: /** 319: * This method returns all the JInternalFrames in the given Component array. 320: * 321: * @param components An array to search for JInternalFrames in. 322: * 323: * @return An array of JInternalFrames found in the Component array. 324: */ 325: private static JInternalFrame[] getFramesFromComponents(Component[] components) 326: { 327: int count = 0; 328: 329: for (int i = 0; i < components.length; i++) 330: if (components[i] instanceof JInternalFrame) 331: count++; 332: 333: JInternalFrame[] value = new JInternalFrame[count]; 334: for (int i = 0, j = 0; i < components.length && j != count; i++) 335: if (components[i] instanceof JInternalFrame) 336: value[j++] = (JInternalFrame) components[i]; 337: return value; 338: } 339: 340: /** 341: * Returns the object that provides accessibility features for this 342: * <code>JDesktopPane</code> component. 343: * 344: * @return The accessible context (an instance of 345: * {@link AccessibleJDesktopPane}). 346: */ 347: public AccessibleContext getAccessibleContext() 348: { 349: if (accessibleContext == null) 350: accessibleContext = new AccessibleJDesktopPane(); 351: 352: return accessibleContext; 353: } 354: 355: /** 356: * Helper method for 357: * {@link LookAndFeel#installProperty(JComponent, String, Object)}. 358: * 359: * @param propertyName the name of the property 360: * @param value the value of the property 361: * 362: * @throws IllegalArgumentException if the specified property cannot be set 363: * by this method 364: * @throws ClassCastException if the property value does not match the 365: * property type 366: * @throws NullPointerException if <code>c</code> or 367: * <code>propertyValue</code> is <code>null</code> 368: */ 369: void setUIProperty(String propertyName, Object value) 370: { 371: if (propertyName.equals("dragMode")) 372: { 373: if (! clientDragModeSet) 374: { 375: setDragMode(((Integer) value).intValue()); 376: clientDragModeSet = false; 377: } 378: } 379: else 380: { 381: super.setUIProperty(propertyName, value); 382: } 383: } 384: }
GNU Classpath (0.95) |