1 /* JDialog.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.AWTEvent; 42 import java.awt.Component; 43 import java.awt.Container; 44 import java.awt.Dialog; 45 import java.awt.Dimension; 46 import java.awt.Frame; 47 import java.awt.Graphics; 48 import java.awt.GraphicsConfiguration; 49 import java.awt.IllegalComponentStateException; 50 import java.awt.LayoutManager; 51 import java.awt.event.WindowEvent; 52 53 import javax.accessibility.Accessible; 54 import javax.accessibility.AccessibleContext; 55 56 /** 57 * A dialog window. This is an extension of {@link java.awt.Dialog} that 58 * provides support for the Swing architecture. Most importantly it contains a 59 * {@link JRootPane} as it's only top-level child, that manages the content 60 * pane, the menu and a glass pane. 61 * 62 * Also, unlike <code>java.awt.Dialog</code>s, JDialogs support the 63 * Swing Pluggable Look & Feel architecture. 64 * 65 * @author Ronald Veldema (rveldema@cs.vu.nl) 66 */ 67 public class JDialog extends Dialog implements Accessible, WindowConstants, 68 RootPaneContainer 69 { 70 /** 71 * Provides accessibility support for <code>JDialog</code>s. 72 */ 73 protected class AccessibleJDialog extends Dialog.AccessibleAWTDialog 74 { 75 /** 76 * Creates a new instance of <code>AccessibleJDialog</code>. 77 */ AccessibleJDialog()78 protected AccessibleJDialog() 79 { 80 super(); 81 // Nothing to do here. 82 } 83 } 84 85 private static final long serialVersionUID = -864070866424508218L; 86 87 /** DOCUMENT ME! */ 88 protected AccessibleContext accessibleContext; 89 90 /** The single RootPane in the Dialog. */ 91 protected JRootPane rootPane; 92 93 /** 94 * Whether checking is enabled on the RootPane. 95 * 96 * @specnote Should be false to comply with J2SE 5.0 97 */ 98 protected boolean rootPaneCheckingEnabled = false; 99 100 /** The default action taken when closed. */ 101 private int closeAction = HIDE_ON_CLOSE; 102 103 /** Whether JDialogs are decorated by the Look and Feel. */ 104 private static boolean decorated; 105 106 /* Creates a new non-modal JDialog with no title 107 * using a shared Frame as the owner. 108 */ JDialog()109 public JDialog() 110 { 111 this((Frame) SwingUtilities.getOwnerFrame(null), "", false, null); 112 } 113 114 /** 115 * Creates a new non-modal JDialog with no title 116 * using the given owner. 117 * 118 * @param owner The owner of the JDialog. 119 */ JDialog(Dialog owner)120 public JDialog(Dialog owner) 121 { 122 this(owner, "", false, null); 123 } 124 125 /** 126 * Creates a new JDialog with no title using the 127 * given modal setting and owner. 128 * 129 * @param owner The owner of the JDialog. 130 * @param modal Whether the JDialog is modal. 131 */ JDialog(Dialog owner, boolean modal)132 public JDialog(Dialog owner, boolean modal) 133 { 134 this(owner, "", modal, null); 135 } 136 137 /** 138 * Creates a new non-modal JDialog using the 139 * given title and owner. 140 * 141 * @param owner The owner of the JDialog. 142 * @param title The title of the JDialog. 143 */ JDialog(Dialog owner, String title)144 public JDialog(Dialog owner, String title) 145 { 146 this(owner, title, false, null); 147 } 148 149 /** 150 * Creates a new JDialog using the given modal 151 * settings, title, and owner. 152 * 153 * @param owner The owner of the JDialog. 154 * @param title The title of the JDialog. 155 * @param modal Whether the JDialog is modal. 156 */ JDialog(Dialog owner, String title, boolean modal)157 public JDialog(Dialog owner, String title, boolean modal) 158 { 159 this(owner, title, modal, null); 160 } 161 162 /** 163 * Creates a new JDialog using the given modal 164 * settings, title, owner and graphics configuration. 165 * 166 * @param owner The owner of the JDialog. 167 * @param title The title of the JDialog. 168 * @param modal Whether the JDialog is modal. 169 * @param gc The Graphics Configuration to use. 170 */ JDialog(Dialog owner, String title, boolean modal, GraphicsConfiguration gc)171 public JDialog(Dialog owner, String title, boolean modal, 172 GraphicsConfiguration gc) 173 { 174 super(owner, title, modal, gc); 175 dialogInit(); 176 } 177 178 /** 179 * Creates a new non-modal JDialog with no title 180 * using the given owner. 181 * 182 * @param owner The owner of the JDialog. 183 */ JDialog(Frame owner)184 public JDialog(Frame owner) 185 { 186 this(owner, "", false, null); 187 } 188 189 /** 190 * Creates a new JDialog with no title using the 191 * given modal setting and owner. 192 * 193 * @param owner The owner of the JDialog. 194 * @param modal Whether the JDialog is modal. 195 */ JDialog(Frame owner, boolean modal)196 public JDialog(Frame owner, boolean modal) 197 { 198 this(owner, "", modal, null); 199 } 200 201 /** 202 * Creates a new non-modal JDialog using the 203 * given title and owner. 204 * 205 * @param owner The owner of the JDialog. 206 * @param title The title of the JDialog. 207 */ JDialog(Frame owner, String title)208 public JDialog(Frame owner, String title) 209 { 210 this(owner, title, false, null); 211 } 212 213 /** 214 * Creates a new JDialog using the given modal 215 * settings, title, and owner. 216 * 217 * @param owner The owner of the JDialog. 218 * @param title The title of the JDialog. 219 * @param modal Whether the JDialog is modal. 220 */ JDialog(Frame owner, String title, boolean modal)221 public JDialog(Frame owner, String title, boolean modal) 222 { 223 this(owner, title, modal, null); 224 } 225 226 /** 227 * Creates a new JDialog using the given modal 228 * settings, title, owner and graphics configuration. 229 * 230 * @param owner The owner of the JDialog. 231 * @param title The title of the JDialog. 232 * @param modal Whether the JDialog is modal. 233 * @param gc The Graphics Configuration to use. 234 */ JDialog(Frame owner, String title, boolean modal, GraphicsConfiguration gc)235 public JDialog(Frame owner, String title, boolean modal, 236 GraphicsConfiguration gc) 237 { 238 super((Frame) SwingUtilities.getOwnerFrame(owner), title, modal, gc); 239 dialogInit(); 240 } 241 242 /** 243 * This method is called to initialize the 244 * JDialog. It sets the layout used, the locale, 245 * and creates the RootPane. 246 */ dialogInit()247 protected void dialogInit() 248 { 249 // We need to explicitly enable events here so that our processKeyEvent() 250 // and processWindowEvent() gets called. 251 enableEvents(AWTEvent.WINDOW_EVENT_MASK); 252 253 // FIXME: Do a check on GraphicsEnvironment.isHeadless() 254 setLocale(JComponent.getDefaultLocale()); 255 getRootPane(); // Will do set/create. 256 invalidate(); 257 // Now that initStageDone is true, adds and layouts apply to contentPane, 258 // not top-level. 259 setRootPaneCheckingEnabled(true); 260 } 261 262 /** 263 * This method returns whether JDialogs will have their 264 * window decorations provided by the Look and Feel. 265 * 266 * @return Whether the window decorations are Look and Feel provided. 267 */ isDefaultLookAndFeelDecorated()268 public static boolean isDefaultLookAndFeelDecorated() 269 { 270 return decorated; 271 } 272 273 /** 274 * This method sets whether JDialogs will have their 275 * window decorations provided by the Look and Feel. 276 * 277 * @param defaultLookAndFeelDecorated Whether the window 278 * decorations are Look and Feel provided. 279 */ setDefaultLookAndFeelDecorated(boolean defaultLookAndFeelDecorated)280 public static void setDefaultLookAndFeelDecorated(boolean defaultLookAndFeelDecorated) 281 { 282 decorated = defaultLookAndFeelDecorated; 283 } 284 285 /** 286 * This method returns the preferred size of 287 * the JDialog. 288 * 289 * @return The preferred size. 290 */ getPreferredSize()291 public Dimension getPreferredSize() 292 { 293 Dimension d = super.getPreferredSize(); 294 return d; 295 } 296 297 /** 298 * This method returns the JMenuBar used 299 * in this JDialog. 300 * 301 * @return The JMenuBar in the JDialog. 302 */ getJMenuBar()303 public JMenuBar getJMenuBar() 304 { 305 return getRootPane().getJMenuBar(); 306 } 307 308 /** 309 * This method sets the JMenuBar used 310 * in this JDialog. 311 * 312 * @param menubar The JMenuBar to use. 313 */ setJMenuBar(JMenuBar menubar)314 public void setJMenuBar(JMenuBar menubar) 315 { 316 getRootPane().setJMenuBar(menubar); 317 } 318 319 /** 320 * This method sets the LayoutManager used in the JDialog. 321 * This method will throw an Error if rootPaneChecking is 322 * enabled. 323 * 324 * @param manager The LayoutManager to use. 325 */ setLayout(LayoutManager manager)326 public void setLayout(LayoutManager manager) 327 { 328 // Check if we're in initialization stage. If so, call super.setLayout 329 // otherwise, valid calls go to the content pane. 330 if (isRootPaneCheckingEnabled()) 331 getContentPane().setLayout(manager); 332 else 333 super.setLayout(manager); 334 } 335 336 /** 337 * This method sets the JLayeredPane used in the JDialog. 338 * If the given JLayeredPane is null, then this method 339 * will throw an Error. 340 * 341 * @param layeredPane The JLayeredPane to use. 342 */ setLayeredPane(JLayeredPane layeredPane)343 public void setLayeredPane(JLayeredPane layeredPane) 344 { 345 if (layeredPane == null) 346 throw new IllegalComponentStateException("layeredPane cannot be null."); 347 getRootPane().setLayeredPane(layeredPane); 348 } 349 350 /** 351 * This method returns the JLayeredPane used with this JDialog. 352 * 353 * @return The JLayeredPane used with this JDialog. 354 */ getLayeredPane()355 public JLayeredPane getLayeredPane() 356 { 357 return getRootPane().getLayeredPane(); 358 } 359 360 /** 361 * This method returns the JRootPane used with this JDialog. 362 * 363 * @return The JRootPane used with this JDialog. 364 */ getRootPane()365 public JRootPane getRootPane() 366 { 367 if (rootPane == null) 368 setRootPane(createRootPane()); 369 return rootPane; 370 } 371 372 /** 373 * This method sets the JRootPane used with this JDialog. 374 * 375 * @param root The JRootPane to use. 376 */ setRootPane(JRootPane root)377 protected void setRootPane(JRootPane root) 378 { 379 if (rootPane != null) 380 remove(rootPane); 381 382 rootPane = root; 383 rootPane.show(); 384 add(rootPane); 385 } 386 387 /** 388 * This method creates a new JRootPane. 389 * 390 * @return A new JRootPane. 391 */ createRootPane()392 protected JRootPane createRootPane() 393 { 394 return new JRootPane(); 395 } 396 397 /** 398 * This method returns the ContentPane 399 * in the JRootPane. 400 * 401 * @return The ContentPane in the JRootPane. 402 */ getContentPane()403 public Container getContentPane() 404 { 405 return getRootPane().getContentPane(); 406 } 407 408 /** 409 * This method sets the ContentPane to use with this 410 * JDialog. If the ContentPane given is null, this method 411 * will throw an exception. 412 * 413 * @param contentPane The ContentPane to use with the JDialog. 414 */ setContentPane(Container contentPane)415 public void setContentPane(Container contentPane) 416 { 417 if (contentPane == null) 418 throw new IllegalComponentStateException("contentPane cannot be null."); 419 getRootPane().setContentPane(contentPane); 420 } 421 422 /** 423 * This method returns the GlassPane for this JDialog. 424 * 425 * @return The GlassPane for this JDialog. 426 */ getGlassPane()427 public Component getGlassPane() 428 { 429 return getRootPane().getGlassPane(); 430 } 431 432 /** 433 * This method sets the GlassPane for this JDialog. 434 * 435 * @param glassPane The GlassPane for this JDialog. 436 */ setGlassPane(Component glassPane)437 public void setGlassPane(Component glassPane) 438 { 439 getRootPane().setGlassPane(glassPane); 440 } 441 442 /** 443 * This method is called when a component is added to the 444 * the JDialog. Calling this method with rootPaneCheckingEnabled 445 * will cause an Error to be thrown. 446 * 447 * @param comp The component to add. 448 * @param constraints The constraints. 449 * @param index The position of the component. 450 */ addImpl(Component comp, Object constraints, int index)451 protected void addImpl(Component comp, Object constraints, int index) 452 { 453 // If we're adding in the initialization stage use super.add. 454 // Otherwise pass the add onto the content pane. 455 if (isRootPaneCheckingEnabled()) 456 getContentPane().add(comp, constraints, index); 457 else 458 super.addImpl(comp, constraints, index); 459 } 460 461 /** 462 * This method removes a component from the JDialog. 463 * 464 * @param comp The component to remove. 465 */ remove(Component comp)466 public void remove(Component comp) 467 { 468 // If we're removing the root pane, use super.remove. Otherwise 469 // pass it on to the content pane instead. 470 if (comp == rootPane) 471 super.remove(rootPane); 472 else 473 getContentPane().remove(comp); 474 } 475 476 /** 477 * This method returns whether rootPane checking is enabled. 478 * 479 * @return Whether rootPane checking is enabled. 480 */ isRootPaneCheckingEnabled()481 protected boolean isRootPaneCheckingEnabled() 482 { 483 return rootPaneCheckingEnabled; 484 } 485 486 /** 487 * This method sets whether rootPane checking is enabled. 488 * 489 * @param enabled Whether rootPane checking is enabled. 490 */ setRootPaneCheckingEnabled(boolean enabled)491 protected void setRootPaneCheckingEnabled(boolean enabled) 492 { 493 rootPaneCheckingEnabled = enabled; 494 } 495 496 /** 497 * This method simply calls paint and returns. 498 * 499 * @param g The Graphics object to paint with. 500 */ update(Graphics g)501 public void update(Graphics g) 502 { 503 paint(g); 504 } 505 506 507 /** 508 * This method handles window events. This allows the JDialog 509 * to honour its default close operation. 510 * 511 * @param e The WindowEvent. 512 */ processWindowEvent(WindowEvent e)513 protected void processWindowEvent(WindowEvent e) 514 { 515 super.processWindowEvent(e); 516 if (e.getID() == WindowEvent.WINDOW_CLOSING) 517 { 518 switch (closeAction) 519 { 520 case EXIT_ON_CLOSE: 521 System.exit(0); 522 break; 523 case DISPOSE_ON_CLOSE: 524 dispose(); 525 break; 526 case HIDE_ON_CLOSE: 527 setVisible(false); 528 break; 529 case DO_NOTHING_ON_CLOSE: 530 break; 531 } 532 } 533 } 534 535 /** 536 * This method sets the action to take 537 * when the JDialog is closed. 538 * 539 * @param operation The action to take. 540 */ setDefaultCloseOperation(int operation)541 public void setDefaultCloseOperation(int operation) 542 { 543 /* Reference implementation allows invalid operations 544 to be specified. If so, getDefaultCloseOperation 545 must return the invalid code, and the behaviour 546 defaults to DO_NOTHING_ON_CLOSE. processWindowEvent 547 above handles this */ 548 closeAction = operation; 549 } 550 551 /** 552 * This method returns the action taken when 553 * the JDialog is closed. 554 * 555 * @return The action to take. 556 */ getDefaultCloseOperation()557 public int getDefaultCloseOperation() 558 { 559 return closeAction; 560 } 561 562 /** 563 * This method returns a String describing the JDialog. 564 * 565 * @return A String describing the JDialog. 566 */ paramString()567 protected String paramString() 568 { 569 return "JDialog"; 570 } 571 572 /** 573 * DOCUMENT ME! 574 * 575 * @return DOCUMENT ME! 576 */ getAccessibleContext()577 public AccessibleContext getAccessibleContext() 578 { 579 if (accessibleContext == null) 580 accessibleContext = new AccessibleJDialog(); 581 return accessibleContext; 582 } 583 } 584