Frames | No Frames |
1: /* JInternalFrame.java -- 2: Copyright (C) 2002, 2004, 2005, 2006, 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.BorderLayout; 42: import java.awt.Component; 43: import java.awt.Container; 44: import java.awt.Graphics; 45: import java.awt.IllegalComponentStateException; 46: import java.awt.KeyboardFocusManager; 47: import java.awt.LayoutManager; 48: import java.awt.Rectangle; 49: import java.beans.PropertyChangeEvent; 50: import java.beans.PropertyVetoException; 51: 52: import javax.accessibility.Accessible; 53: import javax.accessibility.AccessibleContext; 54: import javax.accessibility.AccessibleRole; 55: import javax.accessibility.AccessibleValue; 56: import javax.swing.event.InternalFrameEvent; 57: import javax.swing.event.InternalFrameListener; 58: import javax.swing.plaf.DesktopIconUI; 59: import javax.swing.plaf.InternalFrameUI; 60: 61: /** 62: * This class implements a Swing widget that looks and acts like a native 63: * frame. The frame can be dragged, resized, closed, etc. Typically, 64: * JInternalFrames are placed in JDesktopPanes. The actions that the 65: * JInternalFrame performs (maximizing, minimizing, etc.) are performed by a 66: * DesktopManager. As with regular frames, components are added by calling 67: * frame.getContentPane().add. 68: */ 69: public class JInternalFrame extends JComponent implements Accessible, 70: WindowConstants, 71: RootPaneContainer 72: { 73: 74: private static final long serialVersionUID = -5425177187760785402L; 75: 76: /** 77: * Provides the accessibility features for the <code>JInternalFrame</code> 78: * component. 79: */ 80: protected class AccessibleJInternalFrame extends AccessibleJComponent 81: implements AccessibleValue 82: { 83: private static final long serialVersionUID = 5931936924175476797L; 84: 85: /** 86: * Creates a new <code>AccessibleJInternalFrame</code> instance. 87: */ 88: protected AccessibleJInternalFrame() 89: { 90: super(); 91: } 92: 93: /** 94: * Returns the frame title. 95: * 96: * @return The frame title. 97: */ 98: public String getAccessibleName() 99: { 100: return getTitle(); 101: } 102: 103: /** 104: * Returns the accessible role for the <code>JInternalFrame</code> 105: * component. 106: * 107: * @return {@link AccessibleRole#INTERNAL_FRAME}. 108: */ 109: public AccessibleRole getAccessibleRole() 110: { 111: return AccessibleRole.INTERNAL_FRAME; 112: } 113: 114: /** 115: * Returns an object that provides access to the current, minimum and 116: * maximum values for the {@link JInternalFrame}. Since this class 117: * implements {@link AccessibleValue}, it returns itself. 118: * 119: * @return The accessible value. 120: */ 121: public AccessibleValue getAccessibleValue() 122: { 123: return this; 124: } 125: 126: /** 127: * Returns the current layer for the {@link JInternalFrame} component, 128: * as an {@link Integer}. 129: * 130: * @return The layer for the {@link JInternalFrame} component. 131: */ 132: public Number getCurrentAccessibleValue() 133: { 134: return new Integer(getLayer()); 135: } 136: 137: /** 138: * Returns the maximum permitted accessible value. 139: * 140: * @return <code>Integer(Integer.MAX_VALUE)</code>. 141: */ 142: public Number getMaximumAccessibleValue() 143: { 144: return new Integer(Integer.MAX_VALUE); 145: } 146: 147: /** 148: * Returns the minimum permitted accessible value. 149: * 150: * @return <code>Integer(Integer.MIN_VALUE)</code>. 151: */ 152: public Number getMinimumAccessibleValue() 153: { 154: return new Integer(Integer.MIN_VALUE); 155: } 156: 157: /** 158: * Sets the layer for the internal frame. 159: * 160: * @param n the layer (see the constants defined in {@link JLayeredPane}). 161: * 162: * @return <code>true</code> if the value is set, and <code>false</code> 163: * if it was not set. 164: */ 165: public boolean setCurrentAccessibleValue(Number n) 166: { 167: if (n == null) 168: return false; 169: setLayer(n.intValue()); 170: return true; 171: } 172: } 173: 174: /** 175: * This class represents the JInternalFrame while it is iconified. 176: */ 177: public static class JDesktopIcon extends JComponent implements Accessible 178: { 179: /** 180: * Provides the accessibility features for the <code>JDesktopIcon</code> 181: * component. 182: */ 183: protected class AccessibleJDesktopIcon extends AccessibleJComponent 184: implements AccessibleValue 185: { 186: private static final long serialVersionUID = 5035560458941637802L; 187: 188: /** 189: * Creates a new <code>AccessibleJDesktopIcon</code> instance. 190: */ 191: protected AccessibleJDesktopIcon() 192: { 193: super(); 194: } 195: 196: /** 197: * Returns the accessible role for the <code>JDesktopIcon</code> 198: * component. 199: * 200: * @return {@link AccessibleRole#DESKTOP_ICON}. 201: */ 202: public AccessibleRole getAccessibleRole() 203: { 204: return AccessibleRole.DESKTOP_ICON; 205: } 206: 207: /** 208: * Returns an object that provides access to the current, minimum and 209: * maximum values for the {@link JDesktopIcon}. Since this class 210: * implements {@link AccessibleValue}, it returns itself. 211: * 212: * @return The accessible value. 213: */ 214: public AccessibleValue getAccessibleValue() 215: { 216: return this; 217: } 218: 219: /** 220: * Returns the current layer for the {@link JInternalFrame} component 221: * represented by this <code>JDesktopIcon</code>, as an {@link Integer}. 222: * 223: * @return The layer. 224: */ 225: public Number getCurrentAccessibleValue() 226: { 227: return new Integer(frame.getLayer()); 228: } 229: 230: /** 231: * Returns the maximum permitted accessible value. 232: * 233: * @return <code>Integer(Integer.MAX_VALUE)</code>. 234: */ 235: public Number getMaximumAccessibleValue() 236: { 237: return new Integer(Integer.MAX_VALUE); 238: } 239: 240: /** 241: * Returns the minimum permitted accessible value. 242: * 243: * @return <code>Integer(Integer.MIN_VALUE)</code>. 244: */ 245: public Number getMinimumAccessibleValue() 246: { 247: return new Integer(Integer.MIN_VALUE); 248: } 249: 250: /** 251: * Sets the layer for the internal frame represented by this 252: * <code>JDesktopIcon</code> component. 253: * 254: * @param n the layer (see the constants defined in 255: * {@link JLayeredPane}). 256: * 257: * @return <code>true</code> if the value is set, and <code>false</code> 258: * if it was not set. 259: */ 260: public boolean setCurrentAccessibleValue(Number n) 261: { 262: if (n == null) 263: return false; 264: frame.setLayer(n.intValue()); 265: return true; 266: } 267: } 268: 269: private static final long serialVersionUID = 4672973344731387687L; 270: 271: /** The JInternalFrame this DesktopIcon represents. */ 272: JInternalFrame frame; 273: 274: /** 275: * Creates a new JDesktopIcon object for representing the given frame. 276: * 277: * @param f The JInternalFrame to represent. 278: */ 279: public JDesktopIcon(JInternalFrame f) 280: { 281: frame = f; 282: updateUI(); 283: } 284: 285: /** 286: * Returns the object that provides accessibility features for this 287: * <code>JDesktopIcon</code> component. 288: * 289: * @return The accessible context (an instance of 290: * {@link AccessibleJDesktopIcon}). 291: */ 292: public AccessibleContext getAccessibleContext() 293: { 294: if (accessibleContext == null) 295: accessibleContext = new AccessibleJDesktopIcon(); 296: return accessibleContext; 297: } 298: 299: /** 300: * This method returns the JDesktopPane this JDesktopIcon is in. 301: * 302: * @return The JDesktopPane this JDesktopIcon is in. 303: */ 304: public JDesktopPane getDesktopPane() 305: { 306: JDesktopPane p = (JDesktopPane) SwingUtilities.getAncestorOfClass(JDesktopPane.class, 307: this); 308: return p; 309: } 310: 311: /** 312: * This method returns the JInternalFrame this JDesktopIcon represents. 313: * 314: * @return The JInternalFrame this JDesktopIcon represents. 315: */ 316: public JInternalFrame getInternalFrame() 317: { 318: return frame; 319: } 320: 321: /** 322: * This method returns the UI that is responsible for the JDesktopIcon. 323: * 324: * @return The UI that is responsible for the JDesktopIcon. 325: */ 326: public DesktopIconUI getUI() 327: { 328: return (DesktopIconUI) ui; 329: } 330: 331: /** 332: * This method returns the String identifier that is used to determine 333: * which class is used for JDesktopIcon's UI. 334: * 335: * @return A String identifier for the UI class. 336: */ 337: public String getUIClassID() 338: { 339: return "DesktopIconUI"; 340: } 341: 342: /** 343: * This method sets the JInternalFrame that this JDesktopIcon represents. 344: * 345: * @param f The JInternalFrame that this JDesktopIcon represents. 346: */ 347: public void setInternalFrame(JInternalFrame f) 348: { 349: frame = f; 350: } 351: 352: /** 353: * This method sets the UI used for this JDesktopIcon. 354: * 355: * @param ui The UI to use. 356: */ 357: public void setUI(DesktopIconUI ui) 358: { 359: super.setUI(ui); 360: } 361: 362: /** 363: * This method restores the UI property to the defaults. 364: */ 365: public void updateUI() 366: { 367: setUI((DesktopIconUI) UIManager.getUI(this)); 368: } 369: } 370: 371: /** 372: * The property fired in a PropertyChangeEvent when the contentPane property 373: * changes. 374: */ 375: public static final String CONTENT_PANE_PROPERTY = "contentPane"; 376: 377: /** 378: * The property fired in a PropertyChangeEvent when the frameIcon property 379: * changes. 380: */ 381: public static final String FRAME_ICON_PROPERTY = "frameIcon"; 382: 383: /** 384: * The property fired in a PropertyChangeEvent when the glassPane property 385: * changes. 386: */ 387: public static final String GLASS_PANE_PROPERTY = "glassPane"; 388: 389: /** 390: * The property fired in a PropertyChangeEvent when the closed property 391: * changes. 392: */ 393: public static final String IS_CLOSED_PROPERTY = "closed"; 394: 395: /** 396: * The property fired in a PropertyChangeEvent when the icon property 397: * changes. 398: */ 399: public static final String IS_ICON_PROPERTY = "icon"; 400: 401: /** 402: * The property fired in a PropertyChangeEvent when the maximum property 403: * changes. 404: */ 405: public static final String IS_MAXIMUM_PROPERTY = "maximum"; 406: 407: /** 408: * The property fired in a PropertyChangeEvent when the selected property 409: * changes. 410: */ 411: public static final String IS_SELECTED_PROPERTY = "selected"; 412: 413: /** 414: * The property fired in a PropertyChangeEvent when the layeredPane property 415: * changes. 416: */ 417: public static final String LAYERED_PANE_PROPERTY = "layeredPane"; 418: 419: /** 420: * The property fired in a PropertyChangeEvent when the jMenuBar property 421: * changes. 422: */ 423: public static final String MENU_BAR_PROPERTY = "JMenuBar"; 424: 425: /** 426: * The property fired in a PropertyChangeEvent when the rootPane property 427: * changes. 428: */ 429: public static final String ROOT_PANE_PROPERTY = "rootPane"; 430: 431: /** 432: * The property fired in a PropertyChangeEvent when the title property 433: * changes. 434: */ 435: public static final String TITLE_PROPERTY = "title"; 436: 437: /** Whether the JInternalFrame is closable. */ 438: protected boolean closable; 439: 440: /** Whether the JInternalFrame can be iconified. */ 441: protected boolean iconable; 442: 443: /** Whether the JInternalFrame is closed. */ 444: protected boolean isClosed; 445: 446: /** Whether the JInternalFrame has been iconified. */ 447: protected boolean isIcon; 448: 449: /** Whether the JInternalFrame has been maximized. */ 450: protected boolean isMaximum; 451: 452: /** Whether the JInternalFrame is the active frame. */ 453: protected boolean isSelected; 454: 455: /** Whether the JInternalFrame can be maximized. */ 456: protected boolean maximizable; 457: 458: /** 459: * Whether the JInternalFrame has rootPaneChecking enabled. 460: * 461: * @specnote Should be false to comply with J2SE 5.0 462: */ 463: protected boolean rootPaneCheckingEnabled = false; 464: 465: /** Whether the JInternalFrame is resizable. */ 466: protected boolean resizable; 467: 468: /** 469: * The JDesktopIcon that represents the JInternalFrame while it is 470: * iconified. 471: */ 472: protected JDesktopIcon desktopIcon; 473: 474: /** The icon used in the JMenuBar in the TitlePane. */ 475: protected Icon frameIcon; 476: 477: /** The rootPane of the JInternalFrame. */ 478: protected JRootPane rootPane; 479: 480: /** The title on the TitlePane of the JInternalFrame. */ 481: protected String title; 482: 483: /** The bounds of the JInternalFrame before it was maximized. */ 484: private transient Rectangle storedBounds; 485: 486: /** The Component that receives focus by default. */ 487: private transient Component defaultFocus; 488: 489: /** The default close action taken, */ 490: private transient int defaultCloseOperation = DISPOSE_ON_CLOSE; 491: 492: /** Whether the JInternalFrame has become visible for the very first time. */ 493: private transient boolean isFirstTimeVisible = true; 494: 495: /** DOCUMENT ME! */ 496: private transient boolean wasIcon = false; 497: 498: /** 499: * Creates a new JInternalFrame object that has an empty string for its 500: * title, and is non-resizable, non-maximizable, non-iconifiable, and 501: * non-closable. 502: */ 503: public JInternalFrame() 504: { 505: this("", false, false, false, false); 506: } 507: 508: /** 509: * Creates a new JInternalFrame object with the given title and is 510: * non-resizable, non-maximizable, non-iconifiable, and non-closable. 511: * 512: * @param title The title displayed in the JInternalFrame. 513: */ 514: public JInternalFrame(String title) 515: { 516: this(title, false, false, false, false); 517: } 518: 519: /** 520: * Creates a new JInternalFrame object with the given title and resizable 521: * properties. The JInternalFrame is non-maximizable, non-iconifiable, and 522: * non-closable. 523: * 524: * @param title The title displayed in the JInternalFrame. 525: * @param resizable Whether the JInternalFrame is resizable. 526: */ 527: public JInternalFrame(String title, boolean resizable) 528: { 529: this(title, resizable, false, false, false); 530: } 531: 532: /** 533: * Creates a new JInternalFrame object with the given title, resizable, and 534: * closable properties. The JInternalFrame is non-maximizable and 535: * non-iconifiable. 536: * 537: * @param title The title displayed in the JInternalFrame. 538: * @param resizable Whether the JInternalFrame is resizable. 539: * @param closable Whether the JInternalFrame is closable. 540: */ 541: public JInternalFrame(String title, boolean resizable, boolean closable) 542: { 543: this(title, resizable, closable, false, false); 544: } 545: 546: /** 547: * Creates a new JInternalFrame object with the given title, resizable, 548: * closable and maximizable properties. The JInternalFrame is 549: * non-iconifiable. 550: * 551: * @param title The title displayed in the JInternalFrame. 552: * @param resizable Whether the JInternalFrame is resizable. 553: * @param closable Whether the JInternalFrame is closable. 554: * @param maximizable Whether the JInternalFrame is maximizable. 555: */ 556: public JInternalFrame(String title, boolean resizable, boolean closable, 557: boolean maximizable) 558: { 559: this(title, resizable, closable, maximizable, false); 560: } 561: 562: /** 563: * Creates a new JInternalFrame object with the given title, resizable, 564: * closable, maximizable and iconifiable properties. 565: * 566: * @param title The title displayed in the JInternalFrame. 567: * @param resizable Whether the JInternalFrame is resizable. 568: * @param closable Whether the JInternalFrame is closable. 569: * @param maximizable Whether the JInternalFrame is maximizable. 570: * @param iconifiable Whether the JInternalFrame is iconifiable. 571: */ 572: public JInternalFrame(String title, boolean resizable, boolean closable, 573: boolean maximizable, boolean iconifiable) 574: { 575: this.title = title; 576: this.resizable = resizable; 577: this.closable = closable; 578: this.maximizable = maximizable; 579: this.iconable = iconifiable; 580: isMaximum = false; 581: setRootPane(createRootPane()); 582: // JInternalFrames are invisible and opaque by default. 583: setVisible(false); 584: setOpaque(true); 585: desktopIcon = new JDesktopIcon(this); 586: updateUI(); 587: setRootPaneCheckingEnabled(true); // Done the init stage, now adds go to content pane. 588: } 589: 590: /** 591: * This method adds Components to this Container. For JInternalFrames, 592: * instead of calling add directly on the JInternalFrame, it should be 593: * called with JInternalFrame.getContentPane().add. If root pane checking 594: * is enabled, calling this method will cause an exception to be thrown. 595: * 596: * @param comp The Component to add. 597: * @param constraints The constraints on the Component added. 598: * @param index The position to place the Component. 599: * 600: * @throws Error DOCUMENT ME! 601: */ 602: protected void addImpl(Component comp, Object constraints, int index) 603: { 604: // If we're in the initialization stage use super.add. Here we add the 605: // rootPane as well as the title bar and other stuff. 606: // Otherwise pass the add onto the content pane. 607: if (isRootPaneCheckingEnabled()) 608: getContentPane().add(comp, constraints, index); 609: else 610: super.addImpl(comp,constraints, index); 611: } 612: 613: /** 614: * This method adds an InternalFrameListener to this JInternalFrame. 615: * 616: * @param l The listener to add. 617: */ 618: public void addInternalFrameListener(InternalFrameListener l) 619: { 620: listenerList.add(InternalFrameListener.class, l); 621: } 622: 623: /** 624: * This method is used to create a root pane for the JInternalFrame. This 625: * method is called by the constructors. 626: * 627: * @return A root pane for the JInternalFrame to use. 628: */ 629: protected JRootPane createRootPane() 630: { 631: return new JRootPane(); 632: } 633: 634: /** 635: * This method makes this JInternalFrame invisible, unselected and closed. 636: * If this JInternalFrame is not closed already, it will fire an 637: * INTERNAL_FRAME_CLoSED event. This method is similar to setClosed but it 638: * doesn't give vetoable listeners a chance to veto and it will not fire an 639: * INTERNAL_FRAME_CLOSING event. 640: */ 641: public void dispose() 642: { 643: if (isVisible()) 644: setVisible(false); 645: if (isSelected()) 646: { 647: try 648: { 649: setSelected(false); 650: } 651: catch (PropertyVetoException e) 652: { 653: // Do nothing if they don't want to be unselected. 654: } 655: } 656: if (! isClosed) 657: { 658: firePropertyChange(IS_CLOSED_PROPERTY, Boolean.FALSE, Boolean.TRUE); 659: isClosed = true; 660: } 661: fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_CLOSED); 662: } 663: 664: /** 665: * This method is used for closing this JInternalFrame. It fires an 666: * INTERNAL_FRAME_CLOSING event and then performs the action specified by 667: * the default close operation. 668: */ 669: public void doDefaultCloseAction() 670: { 671: fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_CLOSING); 672: switch (getDefaultCloseOperation()) 673: { 674: case HIDE_ON_CLOSE: 675: setVisible(false); 676: break; 677: case DISPOSE_ON_CLOSE: 678: dispose(); 679: break; 680: } 681: } 682: 683: /** 684: * This method fires an InternalFrameEvent to the listeners. 685: * 686: * @param id The type of event being fired. See InternalFrameEvent. 687: */ 688: protected void fireInternalFrameEvent(int id) 689: { 690: Object[] ifListeners = listenerList.getListenerList(); 691: InternalFrameEvent evt = new InternalFrameEvent(this, id); 692: switch (id) 693: { 694: case InternalFrameEvent.INTERNAL_FRAME_CLOSING: 695: for (int i = ifListeners.length - 2; i >= 0; i -= 2) 696: { 697: if (ifListeners[i] == InternalFrameListener.class) 698: ((InternalFrameListener) ifListeners[i + 1]) 699: .internalFrameClosing(evt); 700: } 701: break; 702: case InternalFrameEvent.INTERNAL_FRAME_ACTIVATED: 703: for (int i = ifListeners.length - 2; i >= 0; i -= 2) 704: { 705: if (ifListeners[i] == InternalFrameListener.class) 706: ((InternalFrameListener) ifListeners[i + 1]) 707: .internalFrameActivated(evt); 708: } 709: break; 710: case InternalFrameEvent.INTERNAL_FRAME_CLOSED: 711: for (int i = ifListeners.length - 2; i >= 0; i -= 2) 712: { 713: if (ifListeners[i] == InternalFrameListener.class) 714: ((InternalFrameListener) ifListeners[i + 1]).internalFrameClosed(evt); 715: } 716: break; 717: case InternalFrameEvent.INTERNAL_FRAME_DEACTIVATED: 718: for (int i = ifListeners.length - 2; i >= 0; i -= 2) 719: { 720: if (ifListeners[i] == InternalFrameListener.class) 721: ((InternalFrameListener) ifListeners[i + 1]) 722: .internalFrameDeactivated(evt); 723: } 724: break; 725: case InternalFrameEvent.INTERNAL_FRAME_DEICONIFIED: 726: for (int i = ifListeners.length - 2; i >= 0; i -= 2) 727: { 728: if (ifListeners[i] == InternalFrameListener.class) 729: ((InternalFrameListener) ifListeners[i + 1]) 730: .internalFrameDeiconified(evt); 731: } 732: break; 733: case InternalFrameEvent.INTERNAL_FRAME_ICONIFIED: 734: for (int i = ifListeners.length - 2; i >= 0; i -= 2) 735: { 736: if (ifListeners[i] == InternalFrameListener.class) 737: ((InternalFrameListener) ifListeners[i + 1]) 738: .internalFrameIconified(evt); 739: } 740: break; 741: case InternalFrameEvent.INTERNAL_FRAME_OPENED: 742: for (int i = ifListeners.length - 2; i >= 0; i -= 2) 743: { 744: if (ifListeners[i] == InternalFrameListener.class) 745: ((InternalFrameListener) ifListeners[i + 1]).internalFrameOpened(evt); 746: } 747: break; 748: } 749: } 750: 751: /** 752: * Returns the object that provides accessibility features for this 753: * <code>JInternalFrame</code> component. 754: * 755: * @return The accessible context (an instance of 756: * {@link AccessibleJInternalFrame}). 757: */ 758: public AccessibleContext getAccessibleContext() 759: { 760: if (accessibleContext == null) 761: accessibleContext = new AccessibleJInternalFrame(); 762: return accessibleContext; 763: } 764: 765: /** 766: * This method returns the Content Pane for this JInternalFrame. 767: * 768: * @return The Content Pane for this JInternalFrame. 769: */ 770: public Container getContentPane() 771: { 772: return getRootPane().getContentPane(); 773: } 774: 775: /** 776: * Returns a code for the default action taken when this 777: * <code>JInternalFrame</code> is closed. 778: * 779: * @return The action code (usually one of 780: * {@link WindowConstants#DO_NOTHING_ON_CLOSE}, 781: * {@link WindowConstants#HIDE_ON_CLOSE}, or 782: * {@link WindowConstants#DISPOSE_ON_CLOSE}). 783: * 784: * @see #setDefaultCloseOperation(int) 785: * @see #doDefaultCloseAction() 786: */ 787: public int getDefaultCloseOperation() 788: { 789: return defaultCloseOperation; 790: } 791: 792: /** 793: * Returns the <code>JDesktopIcon</code> that represents this 794: * <code>JInternalFrame</code> while it is iconified. 795: * 796: * @return The desktop icon component. 797: */ 798: public JDesktopIcon getDesktopIcon() 799: { 800: return desktopIcon; 801: } 802: 803: /** 804: * This method searches this JInternalFrame ancestors for an instance of 805: * JDesktopPane. If one is found, it is returned. If none is found, then it 806: * will search the JDesktopIcon for a JDesktopPane. 807: * 808: * @return The JDesktopPane that this JInternalFrame belongs to. 809: */ 810: public JDesktopPane getDesktopPane() 811: { 812: JDesktopPane value = (JDesktopPane) SwingUtilities.getAncestorOfClass(JDesktopPane.class, 813: this); 814: if (value == null && desktopIcon != null) 815: value = desktopIcon.getDesktopPane(); 816: return value; 817: } 818: 819: /** 820: * This method returns null because this must always be the root of a focus 821: * traversal. 822: * 823: * @return always null 824: * 825: * @since 1.4 826: */ 827: public final Container getFocusCycleRootAncestor() 828: { 829: // as defined. 830: return null; 831: } 832: 833: /** 834: * This method returns the child Component that will receive focus if this 835: * JInternalFrame is selected. 836: * 837: * @return The child Component that will receive focus. 838: */ 839: public Component getFocusOwner() 840: { 841: if (isSelected()) 842: { 843: Component focus = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(); 844: if (SwingUtilities.isDescendingFrom(focus, this)) 845: { 846: defaultFocus = focus; 847: return focus; 848: } 849: } 850: return null; 851: } 852: 853: /** 854: * This method returns the Frame Icon (the icon used in the JInternalFrame 855: * TitlePane and iconified frame). 856: * 857: * @return The Frame Icon. 858: */ 859: public Icon getFrameIcon() 860: { 861: return frameIcon; 862: } 863: 864: /** 865: * This method returns the Glass Pane used with this JInternalFrame. 866: * 867: * @return The Glass Pane used with this JInternalFrame. 868: */ 869: public Component getGlassPane() 870: { 871: return getRootPane().getGlassPane(); 872: } 873: 874: /** 875: * This method returns an array of InternalFrameListeners that are listening 876: * to this JInternalFrame. 877: * 878: * @return An array of InternalFrameListeners that are listening to this 879: * JInternalFrame. 880: */ 881: public InternalFrameListener[] getInternalFrameListeners() 882: { 883: return (InternalFrameListener[]) listenerList.getListeners(InternalFrameListener.class); 884: } 885: 886: /** 887: * This method returns the JMenuBar for this JInternalFrame. 888: * 889: * @return The JMenuBar for this JInternalFrame. 890: */ 891: public JMenuBar getJMenuBar() 892: { 893: return getRootPane().getJMenuBar(); 894: } 895: 896: /** 897: * This method returns the layer that this JInternalFrame resides in. 898: * 899: * @return The layer that this JInternalFrame resides in. 900: */ 901: public int getLayer() 902: { 903: return JLayeredPane.getLayer(this); 904: } 905: 906: /** 907: * This method returns the LayeredPane for this JInternalFrame. 908: * 909: * @return The LayeredPane for this JInternalFrame. 910: */ 911: public JLayeredPane getLayeredPane() 912: { 913: return getRootPane().getLayeredPane(); 914: } 915: 916: /** 917: * This method is deprecated. This method returns the JMenuBar for this 918: * JInternalFrame. 919: * 920: * @return The JMenuBar for this JInternalFrame. 921: * 922: * @deprecated 1.0.3 923: */ 924: public JMenuBar getMenuBar() 925: { 926: return getJMenuBar(); 927: } 928: 929: /** 930: * This method returns the child Component that will receive focus when the 931: * JInternalFrame is selected. If the JInternalFrame is selected, this 932: * method returns getFocusOwner(). Otherwise, it will return the child 933: * Component that most recently requested focus. If that is null, then the 934: * initial focus Component is returned. If that is null, then the default 935: * focus component is returned. 936: * 937: * @return The most recent focus owner. 938: */ 939: public Component getMostRecentFocusOwner() 940: { 941: if (isSelected()) 942: return getFocusOwner(); 943: else 944: return defaultFocus; 945: } 946: 947: /** 948: * This method returns the bounds of the JInternalFrame if it is not 949: * maximized. If it is maximized, it returns the bounds of the 950: * JInternalFrame before it was maximized (the bounds that it will be 951: * restored to). 952: * 953: * @return A Rectangle that contains this JInternalFrame's normal bounds (or 954: * just its bounds if it is not maximized). 955: */ 956: public Rectangle getNormalBounds() 957: { 958: if (storedBounds == null) 959: return getBounds(); 960: else 961: return storedBounds; 962: } 963: 964: /** 965: * This method returns the Root Pane for this JInternalFrame. 966: * 967: * @return The Root Pane for this JInternalFrame. 968: */ 969: public JRootPane getRootPane() 970: { 971: return rootPane; 972: } 973: 974: /** 975: * Returns the frame's title. 976: * 977: * @return The frame's title (can be <code>null</code>). 978: * 979: * @see #setTitle(String) 980: */ 981: public String getTitle() 982: { 983: return title; 984: } 985: 986: /** 987: * This method returns the UI used to represent the JInternalFrame. 988: * 989: * @return The UI used to represent the JInternalFrame. 990: */ 991: public InternalFrameUI getUI() 992: { 993: return (InternalFrameUI) ui; 994: } 995: 996: /** 997: * This method returns a String identifier that is used to determine which 998: * class acts as the JInternalFrame's UI. 999: * 1000: * @return A String identifier to determine a UI class. 1001: */ 1002: public String getUIClassID() 1003: { 1004: return "InternalFrameUI"; 1005: } 1006: 1007: /** 1008: * This method returns null. 1009: * 1010: * @return null. 1011: */ 1012: public final String getWarningString() 1013: { 1014: // as defined. 1015: return null; 1016: } 1017: 1018: /** 1019: * This method deselects this JInternalFrame and hides it. 1020: */ 1021: public void hide() 1022: { 1023: if (isIcon()) 1024: getDesktopIcon().hide(); 1025: super.hide(); 1026: } 1027: 1028: /** 1029: * This method returns whether this JInternalFrame is closable. 1030: * 1031: * @return Whether this JInternalFrame is closable. 1032: */ 1033: public boolean isClosable() 1034: { 1035: return closable; 1036: } 1037: 1038: /** 1039: * This method returns whether this JInternalFrame has been closed. 1040: * 1041: * @return Whether this JInternalFrame is closed. 1042: */ 1043: public boolean isClosed() 1044: { 1045: return isClosed; 1046: } 1047: 1048: /** 1049: * This must always return true. 1050: * 1051: * @return always true 1052: * 1053: * @since 1.4 1054: */ 1055: public final boolean isFocusCycleRoot() 1056: { 1057: return true; 1058: } 1059: 1060: /** 1061: * This method returns whether this JInternalFrame is currently iconified. 1062: * 1063: * @return Whether this JInternalFrame is currently iconified. 1064: */ 1065: public boolean isIcon() 1066: { 1067: return isIcon; 1068: } 1069: 1070: /** 1071: * This method returns whether the JInternalFrame can be iconified. 1072: * 1073: * @return Whether the JInternalFrame can be iconified. 1074: */ 1075: public boolean isIconifiable() 1076: { 1077: return iconable; 1078: } 1079: 1080: /** 1081: * This method returns whether this JInternalFrame can be maximized. 1082: * 1083: * @return Whether this JInternalFrame can be maximized. 1084: */ 1085: public boolean isMaximizable() 1086: { 1087: return maximizable; 1088: } 1089: 1090: /** 1091: * This method returns whether this JInternalFrame is currently maximized. 1092: * 1093: * @return Whether this JInternalFrame is maximized. 1094: */ 1095: public boolean isMaximum() 1096: { 1097: return isMaximum; 1098: } 1099: 1100: /** 1101: * This method returns whether this JInternalFrame is resizable. 1102: * 1103: * @return Whether this JInternalFrame is resizable. 1104: */ 1105: public boolean isResizable() 1106: { 1107: return resizable; 1108: } 1109: 1110: /** 1111: * This method returns whether root pane checking is enabled. If root pane 1112: * checking is enabled, then calls to addImpl and setLayout will throw 1113: * exceptions. 1114: * 1115: * @return Whether root pane checking is enabled. 1116: */ 1117: protected boolean isRootPaneCheckingEnabled() 1118: { 1119: return rootPaneCheckingEnabled; 1120: } 1121: 1122: /** 1123: * This method returns whether this JInternalFrame is selected. 1124: * 1125: * @return Whether this JInternalFrame is selected. 1126: */ 1127: public boolean isSelected() 1128: { 1129: return isSelected; 1130: } 1131: 1132: /** 1133: * A helper method that moves this JInternalFrame to the back if the parent 1134: * is a JLayeredPane. 1135: */ 1136: public void moveToBack() 1137: { 1138: Container p = getParent(); 1139: if (p instanceof JLayeredPane) 1140: ((JLayeredPane) p).moveToBack(this); 1141: } 1142: 1143: /** 1144: * A helper method that moves this JInternalFrame to the front if the parent 1145: * is a JLayeredPane. 1146: */ 1147: public void moveToFront() 1148: { 1149: Container p = getParent(); 1150: if (p != null && p instanceof JLayeredPane) 1151: ((JLayeredPane) p).moveToFront(this); 1152: } 1153: 1154: /** 1155: * This method causes the children of this JInternalFrame to be laid out. 1156: * Before it begins, if this JInternalFrame is an icon, then it will be 1157: * deiconified. If it is maximized, then it will be restored. If either 1158: * operation fails, then this method will return. 1159: */ 1160: public void pack() 1161: { 1162: try 1163: { 1164: if (isIcon()) 1165: setIcon(false); 1166: else if (isMaximum()) 1167: setMaximum(false); 1168: } 1169: catch (PropertyVetoException e) 1170: { 1171: // Do nothing if they don't want to be restored first. 1172: } 1173: setSize(getPreferredSize()); 1174: validate(); 1175: } 1176: 1177: /** 1178: * This method is overridden to allow for speedier painting while this 1179: * JInternalFramme is being dragged. 1180: * 1181: * @param g The Graphics object to paint with. 1182: */ 1183: protected void paintComponent(Graphics g) 1184: { 1185: super.paintComponent(g); 1186: } 1187: 1188: /** 1189: * An implementation dependent string describing the current state of this 1190: * <code>JInternalFrame</code> instance. 1191: * 1192: * @return A string describing the current state of this 1193: * <code>JInternalFrame</code> instance. 1194: */ 1195: protected String paramString() 1196: { 1197: return super.paramString() + ",title=" + getTitle(); 1198: } 1199: 1200: /** 1201: * This method removes the given Component from the Container. 1202: * 1203: * @param comp The Component to remove. 1204: */ 1205: public void remove(Component comp) 1206: { 1207: // If we're removing the root pane, use super.remove. Otherwise 1208: // pass it on to the content pane instead. 1209: if (comp==rootPane || ! isRootPaneCheckingEnabled()) 1210: super.remove(comp); 1211: else 1212: getContentPane().remove(comp); 1213: } 1214: 1215: /** 1216: * This method removes an InternalFrameListener from this JInternalFrame. 1217: * 1218: * @param l The listener to remove. 1219: */ 1220: public void removeInternalFrameListener(InternalFrameListener l) 1221: { 1222: listenerList.remove(InternalFrameListener.class, l); 1223: } 1224: 1225: /** 1226: * This method resizes and positions this JInternalFrame. It also forces a 1227: * relayout of the Container. 1228: * 1229: * @param x The x position of this JInternalFrame. 1230: * @param y The y position of this JInternalFrame. 1231: * @param width The width of this JInternalFrame. 1232: * @param height The height of this JInternalFrame. 1233: */ 1234: public void reshape(int x, int y, int width, int height) 1235: { 1236: super.reshape(x, y, width, height); 1237: revalidate(); 1238: } 1239: 1240: /** 1241: * This method gives focus to the last child Component that had focus. This 1242: * is used by the UI when this JInternalFrame is activated. 1243: */ 1244: public void restoreSubcomponentFocus() 1245: { 1246: Component c = getMostRecentFocusOwner(); 1247: if (c != null) 1248: c.requestFocus(); 1249: } 1250: 1251: /** 1252: * This method sets whether this JInternalFrame can be closed. 1253: * 1254: * @param b Whether this JInternalFrame can be closed. 1255: */ 1256: public void setClosable(boolean b) 1257: { 1258: if (closable != b) 1259: { 1260: closable = b; 1261: firePropertyChange("closable", ! closable, closable); 1262: } 1263: } 1264: 1265: /** 1266: * This method closes the JInternalFrame if the given boolean is true. If it 1267: * is false, then the result of this method is unspecified. If the 1268: * JInternalFrame is closed, this method does nothing. This method will 1269: * first fire an INTERNAL_FRAME_CLOSING event and give a chance for veto 1270: * listeners to cancel the close. If no listener vetoes the change, the 1271: * closed property is set to true and the JInternalFrame is hidden and 1272: * unselected. The method will finish by firing an INTERNAL_FRAME_CLOSED 1273: * event. 1274: * 1275: * @param b Whether the JInternalFrame will be closed. 1276: * 1277: * @throws PropertyVetoException If a VetoableChangeListener vetoes the change. 1278: */ 1279: public void setClosed(boolean b) throws PropertyVetoException 1280: { 1281: if (b && ! isClosed()) 1282: { 1283: fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_CLOSING); 1284: fireVetoableChange(IS_CLOSED_PROPERTY, false, true); 1285: 1286: isClosed = b; 1287: dispose(); 1288: 1289: firePropertyChange(IS_CLOSED_PROPERTY, false, true); 1290: } 1291: } 1292: 1293: /** 1294: * This method sets the Container to be used as a Content Pane for this 1295: * JInternalFrame. 1296: * 1297: * @param c The Container to use as a Content Pane. 1298: */ 1299: public void setContentPane(Container c) 1300: { 1301: if (c != getContentPane()) 1302: { 1303: Container old = getContentPane(); 1304: getRootPane().setContentPane(c); 1305: firePropertyChange(CONTENT_PANE_PROPERTY, old, c); 1306: } 1307: } 1308: 1309: /** 1310: * Sets a code for the action to be taken when this 1311: * <code>JInternalFrame</code> is closed. Note that no validation is 1312: * performed on the <code>operation</code> code, any integer will be 1313: * accepted (nevertheless, you should pass in one of the listed values). 1314: * 1315: * @param operation one of {@link WindowConstants#DO_NOTHING_ON_CLOSE}, 1316: * {@link WindowConstants#HIDE_ON_CLOSE} or 1317: * {@link WindowConstants#DISPOSE_ON_CLOSE}. 1318: * 1319: * @see #getDefaultCloseOperation() 1320: * @see #doDefaultCloseAction() 1321: */ 1322: public void setDefaultCloseOperation(int operation) 1323: { 1324: /* Reference implementation allows invalid operations to be specified. 1325: In that case, behaviour defaults to DO_NOTHING_ON_CLOSE. 1326: processWindowEvent handles the behaviour. getDefaultCloseOperation 1327: must return the invalid operator code. */ 1328: defaultCloseOperation = operation; 1329: } 1330: 1331: /** 1332: * Sets the <code>JDesktopIcon</code> instance that represents this 1333: * <code>JInternalFrame</code> while it is iconified and, if the new icon is 1334: * not the same instance as the existing icon, sends a 1335: * {@link PropertyChangeEvent} (with the property name 1336: * <code>"desktopIcon"</code>) to all registered listeners.. 1337: * 1338: * @param d the icon. 1339: * 1340: * @see #getDesktopIcon() 1341: */ 1342: public void setDesktopIcon(JDesktopIcon d) 1343: { 1344: if (desktopIcon != d) 1345: { 1346: JDesktopIcon oldIcon = desktopIcon; 1347: desktopIcon = d; 1348: firePropertyChange("desktopIcon", oldIcon, d); 1349: } 1350: } 1351: 1352: /** 1353: * This method does nothing because this must be the root of a focus 1354: * traversal cycle. 1355: * 1356: * @param focusCycleRoot Not used. 1357: */ 1358: public final void setFocusCycleRoot(boolean focusCycleRoot) 1359: { 1360: // Do nothing 1361: } 1362: 1363: /** 1364: * This method sets the Icon to be used in two places. The first is icon 1365: * that is painted at the top left corner of the JInternalFrame when it is 1366: * not iconified (clicking on that icon will activate the TitlePane 1367: * JMenuBar). When the JInternalFrame is iconified, it will be the icon 1368: * displayed in the JDesktopIcon. If no icon is set, the JInternalFrame 1369: * will use a Look and Feel default. 1370: * 1371: * @param icon The Icon used in the TitlePane JMenuBar and iconified frames. 1372: */ 1373: public void setFrameIcon(Icon icon) 1374: { 1375: if (icon != frameIcon) 1376: { 1377: Icon old = frameIcon; 1378: frameIcon = icon; 1379: firePropertyChange(FRAME_ICON_PROPERTY, old, frameIcon); 1380: } 1381: } 1382: 1383: /** 1384: * This method sets the Glass Pane used with this JInternalFrame. 1385: * 1386: * @param glass The Glass Pane to use with this JInternalFrame. 1387: */ 1388: public void setGlassPane(Component glass) 1389: { 1390: if (glass != getGlassPane()) 1391: { 1392: Component old = getGlassPane(); 1393: getRootPane().setGlassPane(glass); 1394: firePropertyChange(GLASS_PANE_PROPERTY, old, glass); 1395: } 1396: } 1397: 1398: /** 1399: * This method iconifies or deiconifies this JInternalFrame given the 1400: * boolean argument. If the JInternalFrame becomes iconified, it will fire 1401: * an INTERNAL_FRAME_ICONIFIED event. If the JInternalFrame becomes 1402: * deiconified, it will fire anINTERNAL_FRAME_DEICONIFIED event. 1403: * 1404: * @param b Whether this JInternalFrame is to be iconified or deiconified. 1405: * 1406: * @throws PropertyVetoException DOCUMENT ME! 1407: */ 1408: public void setIcon(boolean b) throws PropertyVetoException 1409: { 1410: if (b != isIcon()) 1411: { 1412: fireVetoableChange(IS_ICON_PROPERTY, b, isIcon); 1413: 1414: isIcon = b; 1415: 1416: firePropertyChange(IS_ICON_PROPERTY, ! isIcon, isIcon); 1417: if (b) 1418: fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_ICONIFIED); 1419: else 1420: fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_DEICONIFIED); 1421: } 1422: } 1423: 1424: /** 1425: * This method sets whether the JInternalFrame can be iconified. (This means 1426: * that the JInternalFrame can be turned into an icon if minimized). 1427: * 1428: * @param b Whether the JInternalFrame can be iconified. 1429: */ 1430: public void setIconifiable(boolean b) 1431: { 1432: if (iconable != b) 1433: { 1434: iconable = b; 1435: firePropertyChange("iconable", ! iconable, iconable); 1436: } 1437: } 1438: 1439: /** 1440: * This method sets the JMenuBar to be used with this JInternalFrame. 1441: * 1442: * @param b The JMenuBar to be used with this JInternalFrame. 1443: */ 1444: public void setJMenuBar(JMenuBar b) 1445: { 1446: JMenuBar old = getJMenuBar(); 1447: getRootPane().setJMenuBar(b); 1448: firePropertyChange(MENU_BAR_PROPERTY, old, b); 1449: } 1450: 1451: /** 1452: * A helper method that set the layer that this JInternalFrame resides in. 1453: * Using this version of the method means that the user should not set it 1454: * to values that are already defined in JLayeredPane. If predefined values 1455: * are to be used, the user should use the setLayer(Integer) version. 1456: * 1457: * @param layer The layer to place this JInternalFrame in. 1458: */ 1459: public void setLayer(int layer) 1460: { 1461: setLayer(new Integer(layer)); 1462: } 1463: 1464: /** 1465: * A helper method that sets the layer that this JInternalFrame resides in. 1466: * Calling this version of the method should use layer values that are 1467: * already defined in JLayeredPane. 1468: * 1469: * @param layer The layer to place this JInternalFrame in. 1470: */ 1471: public void setLayer(Integer layer) 1472: { 1473: Container p = getParent(); 1474: if (p instanceof JLayeredPane) 1475: { 1476: JLayeredPane lp = (JLayeredPane) p; 1477: lp.setLayer(this, layer.intValue(), lp.getPosition(this)); 1478: } 1479: else 1480: { 1481: JLayeredPane.putLayer(this, layer.intValue()); 1482: if (p != null) 1483: p.repaint(getX(), getY(), getWidth(), getHeight()); 1484: } 1485: } 1486: 1487: /** 1488: * This method sets the JLayeredPane to use with this JInternalFrame. 1489: * 1490: * @param layered The JLayeredPane to use as a layeredPane. 1491: */ 1492: public void setLayeredPane(JLayeredPane layered) 1493: { 1494: if (layered == null) 1495: throw new IllegalComponentStateException("LayeredPane must not be null"); 1496: 1497: if (layered != getLayeredPane()) 1498: { 1499: JLayeredPane old = getLayeredPane(); 1500: getRootPane().setLayeredPane(layered); 1501: firePropertyChange(LAYERED_PANE_PROPERTY, old, layered); 1502: } 1503: } 1504: 1505: /** 1506: * This method sets whether the JInternalFrame can be maximized. 1507: * 1508: * @param b Whether this JInternalFrame can be maximized. 1509: */ 1510: public void setMaximizable(boolean b) 1511: { 1512: if (maximizable != b) 1513: { 1514: maximizable = b; 1515: firePropertyChange("maximizable", ! maximizable, maximizable); 1516: } 1517: } 1518: 1519: /** 1520: * This method sets the Layout Manager used in the JInternalFrame. SetLayout 1521: * should not be called on the JInternalFrame directly. Instead, it should 1522: * be called with JInternalFrame.getContentPane().setLayout. Calls to this 1523: * method with root pane checking enabled will cause exceptions to be 1524: * thrown. 1525: * 1526: * @param manager The Layout Manager to be used with the JInternalFrame. 1527: * 1528: * @throws Error If rootPaneChecking is enabled. 1529: */ 1530: public void setLayout(LayoutManager manager) 1531: { 1532: // Check if we're in initialization stage. If so, call super.setLayout 1533: // otherwise, valid calls go to the content pane. 1534: if (isRootPaneCheckingEnabled()) 1535: getContentPane().setLayout(manager); 1536: else 1537: super.setLayout(manager); 1538: } 1539: 1540: /** 1541: * This method sets the JInternalFrame to maximized (if the given argument 1542: * is true) or restores the JInternalFrame to its normal bounds otherwise. 1543: * 1544: * @param b Whether this JInteralFrame will be maximized or restored. 1545: * 1546: * @throws PropertyVetoException If a VetoableChangeListener vetoes the change. 1547: */ 1548: public void setMaximum(boolean b) throws PropertyVetoException 1549: { 1550: if (b != isMaximum) 1551: { 1552: fireVetoableChange(IS_MAXIMUM_PROPERTY, isMaximum, b); 1553: isMaximum = b; 1554: firePropertyChange(IS_MAXIMUM_PROPERTY, ! isMaximum, isMaximum); 1555: } 1556: } 1557: 1558: /** 1559: * This method is deprecated. This method sets the JMenuBar used with this 1560: * JInternalFrame. 1561: * 1562: * @param m The JMenuBar to use with this JInternalFrame. 1563: * 1564: * @deprecated 1.0.3 1565: */ 1566: public void setMenuBar(JMenuBar m) 1567: { 1568: setJMenuBar(m); 1569: } 1570: 1571: /** 1572: * This method sets the bounds that this JInternalFrame will be restored to. 1573: * 1574: * @param r The bounds that this JInternalFrame will be restored to. 1575: */ 1576: public void setNormalBounds(Rectangle r) 1577: { 1578: storedBounds = r; 1579: } 1580: 1581: /** 1582: * This method sets whether the JInternalFrame can be resized by a user 1583: * action (like dragging at the frame borders). 1584: * 1585: * @param b Whether this JInternalFramer can be resized. 1586: */ 1587: public void setResizable(boolean b) 1588: { 1589: if (b != resizable) 1590: { 1591: resizable = b; 1592: firePropertyChange("resizable", ! resizable, resizable); 1593: } 1594: } 1595: 1596: /** 1597: * This method sets the Root Pane for this JInternalFrame. 1598: * 1599: * @param root The Root Pane for this JInternalFrame. 1600: */ 1601: protected void setRootPane(JRootPane root) 1602: { 1603: if (rootPane != null) 1604: remove(rootPane); 1605: 1606: JRootPane old = rootPane; 1607: rootPane = root; 1608: 1609: if (rootPane != null) 1610: { 1611: boolean checkingEnabled = isRootPaneCheckingEnabled(); 1612: try 1613: { 1614: setRootPaneCheckingEnabled(false); 1615: add(rootPane, BorderLayout.CENTER); 1616: } 1617: finally 1618: { 1619: setRootPaneCheckingEnabled(checkingEnabled); 1620: } 1621: } 1622: firePropertyChange(ROOT_PANE_PROPERTY, old, rootPane); 1623: } 1624: 1625: /** 1626: * This method sets whether root pane checking is enabled. If root pane 1627: * checking is enabled, then calls to addImpl and setLayout will throw 1628: * exceptions. 1629: * 1630: * @param enabled Whether root pane checking is enabled. 1631: */ 1632: protected void setRootPaneCheckingEnabled(boolean enabled) 1633: { 1634: rootPaneCheckingEnabled = enabled; 1635: } 1636: 1637: /** 1638: * This method sets whether this JInternalFrame is the selected frame in the 1639: * JDesktopPane (or other container). When selected, a JInternalFrame will 1640: * have focus and paint its TitlePane differently (usually a different 1641: * colour). If this method selects the frame, this JInternalFrame will fire 1642: * an INTERNAL_FRAME_ACTIVATED event. If it deselects this frame, it will 1643: * fire an INTERNAL_FRAME_DEACTIVATED event. 1644: * 1645: * @param selected Whether this JInternalFrame will become selected or 1646: * deselected. 1647: * 1648: * @throws PropertyVetoException If a VetoableChangeListener vetoes the change. 1649: */ 1650: public void setSelected(boolean selected) throws PropertyVetoException 1651: { 1652: if (selected != isSelected 1653: && (! selected || (isIcon ? desktopIcon.isShowing() : isShowing()))) 1654: { 1655: fireVetoableChange(IS_SELECTED_PROPERTY, isSelected, selected); 1656: 1657: if (! selected) 1658: defaultFocus = getMostRecentFocusOwner(); 1659: 1660: isSelected = selected; 1661: firePropertyChange(IS_SELECTED_PROPERTY, ! isSelected, isSelected); 1662: 1663: if (isSelected) 1664: fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_ACTIVATED); 1665: else 1666: fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_DEACTIVATED); 1667: 1668: if (selected) 1669: restoreSubcomponentFocus(); 1670: 1671: repaint(); 1672: } 1673: } 1674: 1675: /** 1676: * Sets the title for the <code>JInternalFrame</code> and sends a 1677: * {@link PropertyChangeEvent} (with the property name 1678: * {@link #TITLE_PROPERTY}) to all registered listeners. 1679: * 1680: * @param title the new title (<code>null</code> permitted). 1681: * 1682: * @see #getTitle() 1683: */ 1684: public void setTitle(String title) 1685: { 1686: String old = this.title; 1687: this.title = title; 1688: firePropertyChange(TITLE_PROPERTY, old, this.title); 1689: } 1690: 1691: /** 1692: * This method displays the JInternalFrame. If it is not visible, this 1693: * method will bring this JInternalFrame to the front, make it visible and 1694: * select it. If this is the first time this JInternalFrame is made 1695: * visible, an INTERNAL_FRAME_OPENED event will be fired. 1696: */ 1697: public void show() 1698: { 1699: if (! isVisible()) 1700: { 1701: if (isFirstTimeVisible) 1702: { 1703: isFirstTimeVisible = false; 1704: fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_OPENED); 1705: } 1706: 1707: getDesktopIcon().setVisible(true); 1708: 1709: toFront(); 1710: super.show(); 1711: 1712: if (isIcon()) 1713: return; 1714: 1715: if (! isSelected()) 1716: { 1717: try 1718: { 1719: setSelected(true); 1720: } 1721: catch (PropertyVetoException e) 1722: { 1723: // Do nothing. if they don't want to be selected. 1724: } 1725: } 1726: } 1727: } 1728: 1729: /** 1730: * This method is used to set the UI responsible for the JInternalFrame. 1731: * 1732: * @param ui The UI responsible for the JInternalFrame. 1733: */ 1734: public void setUI(InternalFrameUI ui) 1735: { 1736: // We must temporarily go into init mode so that the UI can directly 1737: // manipulate the JInternalFrame. 1738: boolean old = isRootPaneCheckingEnabled(); 1739: setRootPaneCheckingEnabled(false); 1740: super.setUI(ui); 1741: setRootPaneCheckingEnabled(old); 1742: } 1743: 1744: /** 1745: * This method causes the JInternalFrame to be brough to back in the 1746: * z-order. 1747: */ 1748: public void toBack() 1749: { 1750: moveToBack(); 1751: } 1752: 1753: /** 1754: * This method causes the JInternalFrame to be brought to front in the 1755: * z-order. 1756: */ 1757: public void toFront() 1758: { 1759: moveToFront(); 1760: } 1761: 1762: /** 1763: * This method resets the UI to the Look and Feel defaults. 1764: */ 1765: public void updateUI() 1766: { 1767: // We must go into the init stage when updating the UI, so the UI can 1768: // set layout and components directly on the internal frame, not its 1769: // content pane. 1770: boolean old = isRootPaneCheckingEnabled(); 1771: setRootPaneCheckingEnabled(false); 1772: setUI((InternalFrameUI) UIManager.getUI(this)); 1773: setRootPaneCheckingEnabled(old); 1774: } 1775: 1776: /** 1777: * This helper method allows JInternalFrames to signal that they were 1778: * iconned for the first time. 1779: * 1780: * @param b Whether the JInternalFrame was iconned. 1781: * @param ID The identifier of the property change event to fire if the 1782: * JInternalFrame is iconned for the first time. 1783: */ 1784: void setWasIcon(boolean b, String ID) 1785: { 1786: if (b && ! wasIcon) 1787: { 1788: wasIcon = b; 1789: firePropertyChange(ID, ! b, b); 1790: } 1791: } 1792: 1793: /** 1794: * This helper method returns whether the JInternalFrame has been iconned 1795: * once already. 1796: * 1797: * @return Whether the JInternalFrame has been iconned once already. 1798: */ 1799: boolean getWasIcon() 1800: { 1801: return wasIcon; 1802: } 1803: 1804: /** 1805: * This method is a convenience method to fire vetoable property changes. 1806: * 1807: * @param name The identifier of the property change. 1808: * @param oldValue The old value. 1809: * @param newValue The new value. 1810: * 1811: * @throws PropertyVetoException Fired if a vetoable change listener vetoes 1812: * the change. 1813: */ 1814: private void fireVetoableChange(String name, boolean oldValue, 1815: boolean newValue) 1816: throws PropertyVetoException 1817: { 1818: super.fireVetoableChange(name, Boolean.valueOf(oldValue), Boolean.valueOf(newValue)); 1819: } 1820: }