diff options
Diffstat (limited to 'libjava/classpath/java/awt/Dialog.java')
-rw-r--r-- | libjava/classpath/java/awt/Dialog.java | 553 |
1 files changed, 553 insertions, 0 deletions
diff --git a/libjava/classpath/java/awt/Dialog.java b/libjava/classpath/java/awt/Dialog.java new file mode 100644 index 00000000000..d3eb975a86d --- /dev/null +++ b/libjava/classpath/java/awt/Dialog.java @@ -0,0 +1,553 @@ +/* Dialog.java -- An AWT dialog box + Copyright (C) 1999, 2000, 2001, 2002, 2005 Free Software Foundation, Inc. + +This file is part of GNU Classpath. + +GNU Classpath is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Classpath is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ + + +package java.awt; + +import java.awt.peer.DialogPeer; + +import javax.accessibility.AccessibleContext; +import javax.accessibility.AccessibleRole; +import javax.accessibility.AccessibleState; +import javax.accessibility.AccessibleStateSet; + +/** + * A dialog box widget class. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Tom Tromey (tromey@redhat.com) + */ +public class Dialog extends Window +{ + +/* + * Static Variables + */ + +// Serialization constant +private static final long serialVersionUID = 5920926903803293709L; + +/*************************************************************************/ + +/* + * Instance Variables + */ + +/** + * @serial Indicates whether or not this dialog box is modal. + */ +private boolean modal; + +/** + * @serial Indicates whether or not this dialog box is resizable. + */ +private boolean resizable = true; + +/** + * @serial The title string for this dialog box, which can be + * <code>null</code>. + */ +private String title; + +/** + * This field indicates whether the dialog is undecorated or not. + */ +private boolean undecorated = false; + +/** + * Indicates that we are blocked for modality in show + */ +private boolean blocked = false; + +/** + * Secondary EventQueue to handle AWT events while + * we are blocked for modality in show + */ +private EventQueue eq2 = null; + +/*************************************************************************/ + +/* + * Constructors + */ + +/** + * Initializes a new instance of <code>Dialog</code> with the specified + * parent, that is resizable and not modal, and which has no title. + * + * @param parent The parent frame of this dialog box. + * + * @exception IllegalArgumentException If the owner's GraphicsConfiguration + * is not from a screen device, or if owner is null. This exception is always + * thrown when GraphicsEnvironment.isHeadless() returns true. + */ +public +Dialog(Frame parent) +{ + this(parent, "", false); +} + +/*************************************************************************/ + +/** + * Initializes a new instance of <code>Dialog</code> with the specified + * parent and modality, that is resizable and which has no title. + * + * @param parent The parent frame of this dialog box. + * @param modal <code>true</code> if this dialog box is modal, + * <code>false</code> otherwise. + * + * @exception IllegalArgumentException If the owner's GraphicsConfiguration + * is not from a screen device, or if owner is null. This exception is always + * thrown when GraphicsEnvironment.isHeadless() returns true. + */ +public +Dialog(Frame parent, boolean modal) +{ + this(parent, "", modal); +} + +/*************************************************************************/ + +/** + * Initializes a new instance of <code>Dialog</code> with the specified + * parent, that is resizable and not modal, and which has the specified + * title. + * + * @param parent The parent frame of this dialog box. + * @param title The title string for this dialog box. + * + * @exception IllegalArgumentException If the owner's GraphicsConfiguration + * is not from a screen device, or if owner is null. This exception is always + * thrown when GraphicsEnvironment.isHeadless() returns true. + */ +public +Dialog(Frame parent, String title) +{ + this(parent, title, false); +} + +/*************************************************************************/ + +/** + * Initializes a new instance of <code>Dialog</code> with the specified, + * parent, title, and modality, that is resizable. + * + * @param parent The parent frame of this dialog box. + * @param title The title string for this dialog box. + * @param modal <code>true</code> if this dialog box is modal, + * <code>false</code> otherwise. + * + * @exception IllegalArgumentException If owner is null or + * GraphicsEnvironment.isHeadless() returns true. + */ +public +Dialog(Frame parent, String title, boolean modal) +{ + this (parent, title, modal, parent.getGraphicsConfiguration ()); +} + +/** + * Initializes a new instance of <code>Dialog</code> with the specified, + * parent, title, modality and <code>GraphicsConfiguration</code>, + * that is resizable. + * + * @param parent The parent frame of this dialog box. + * @param title The title string for this dialog box. + * @param modal <code>true</code> if this dialog box is modal, + * <code>false</code> otherwise. + * @param gc The <code>GraphicsConfiguration</code> object to use. + * + * @exception IllegalArgumentException If owner is null, the + * GraphicsConfiguration is not a screen device or + * GraphicsEnvironment.isHeadless() returns true. + * + * @since 1.4 + */ +public +Dialog (Frame parent, String title, boolean modal, GraphicsConfiguration gc) +{ + super (parent, gc); + + // A null title is equivalent to an empty title + this.title = (title != null) ? title : ""; + this.modal = modal; + visible = false; + + setLayout(new BorderLayout()); +} + +/** + * Initializes a new instance of <code>Dialog</code> with the specified, + * parent, that is resizable. + * + * @exception IllegalArgumentException If parent is null. This exception is + * always thrown when GraphicsEnvironment.isHeadless() returns true. + * + * @since 1.2 + */ +public +Dialog (Dialog owner) +{ + this (owner, "", false, owner.getGraphicsConfiguration ()); +} + +/** + * Initializes a new instance of <code>Dialog</code> with the specified, + * parent and title, that is resizable. + * + * @exception IllegalArgumentException If parent is null. This exception is + * always thrown when GraphicsEnvironment.isHeadless() returns true. + * + * @since 1.2 + */ +public +Dialog (Dialog owner, String title) +{ + this (owner, title, false, owner.getGraphicsConfiguration ()); +} + +/** + * Initializes a new instance of <code>Dialog</code> with the specified, + * parent, title and modality, that is resizable. + * + * @exception IllegalArgumentException If parent is null. This exception is + * always thrown when GraphicsEnvironment.isHeadless() returns true. + * + * @since 1.2 + */ +public +Dialog (Dialog owner, String title, boolean modal) +{ + this (owner, title, modal, owner.getGraphicsConfiguration ()); +} + +/** + * Initializes a new instance of <code>Dialog</code> with the specified, + * parent, title, modality and <code>GraphicsConfiguration</code>, + * that is resizable. + * + * @exception IllegalArgumentException If parent is null, the + * GraphicsConfiguration is not a screen device or + * GraphicsEnvironment.isHeadless() returns true. + * + * @since 1.4 + */ +public +Dialog (Dialog parent, String title, boolean modal, GraphicsConfiguration gc) +{ + super (parent, parent.getGraphicsConfiguration ()); + + // A null title is equivalent to an empty title + this.title = (title != null) ? title : ""; + this.modal = modal; + visible = false; + + setLayout (new BorderLayout ()); +} + +/*************************************************************************/ + +/* + * Instance Variables + */ + +/** + * Returns the title of this dialog box. + * + * @return The title of this dialog box. + */ +public String +getTitle() +{ + return(title); +} + +/*************************************************************************/ + +/** + * Sets the title of this dialog box to the specified string. + * + * @param title The new title. + */ +public synchronized void +setTitle(String title) +{ + // A null title is equivalent to an empty title + this.title = (title != null) ? title : ""; + + if (peer != null) + { + DialogPeer d = (DialogPeer) peer; + d.setTitle (title); + } +} + +/*************************************************************************/ + +/** + * Tests whether or not this dialog box is modal. + * + * @return <code>true</code> if this dialog box is modal, + * <code>false</code> otherwise. + */ +public boolean +isModal() +{ + return(modal); +} + +/*************************************************************************/ + +/** + * Changes the modality of this dialog box. This can only be done before + * the peer is created. + * + * @param modal <code>true</code> to make this dialog box modal, + * <code>false</code> to make it non-modal. + */ +public void +setModal(boolean modal) +{ + this.modal = modal; +} + +/*************************************************************************/ + +/** + * Tests whether or not this dialog box is resizable. + * + * @return <code>true</code> if this dialog is resizable, <code>false</code>, + * otherwise. + */ +public boolean +isResizable() +{ + return(resizable); +} + +/*************************************************************************/ + +/** + * Changes the resizability of this dialog box. + * + * @param resizable <code>true</code> to make this dialog resizable, + * <code>false</code> to make it non-resizable. + */ +public synchronized void +setResizable(boolean resizable) +{ + this.resizable = resizable; + if (peer != null) + { + DialogPeer d = (DialogPeer) peer; + d.setResizable (resizable); + } +} + +/*************************************************************************/ + +/** + * Creates this object's native peer. + */ +public synchronized void +addNotify() +{ + if (peer == null) + peer = getToolkit ().createDialog (this); + super.addNotify (); +} + +/*************************************************************************/ + +/** + * Makes this dialog visible and brings it to the front. + * If the dialog is modal and is not already visible, this call will not + * return until the dialog is hidden by someone calling hide or dispose. + * If this is the event dispatching thread we must ensure that another event + * thread runs while the one which invoked this method is blocked. + */ +public synchronized void +show() +{ + super.show(); + + if (isModal()) + { + // If already shown (and blocked) just return + if (blocked) + return; + + /* If show is called in the dispatch thread for a modal dialog it will + block so we must run another thread so the events keep being + dispatched.*/ + if (EventQueue.isDispatchThread ()) + { + EventQueue eq = Toolkit.getDefaultToolkit().getSystemEventQueue(); + eq2 = new EventQueue (); + eq.push (eq2); + } + + try + { + blocked = true; + wait (); + blocked = false; + } + catch (InterruptedException e) + { + blocked = false; + } + + if (eq2 != null) + { + eq2.pop (); + eq2 = null; + } + } +} + +/*************************************************************************/ + +/** + * Hides the Dialog and then + * causes show() to return if it is currently blocked. + */ + +public synchronized void +hide () +{ + if (blocked) + { + notifyAll (); + } + + super.hide(); +} + +/*************************************************************************/ + +/** + * Disposes the Dialog and then causes show() to return + * if it is currently blocked. + */ + +public synchronized void +dispose () +{ + if (blocked) + { + notifyAll (); + } + + super.dispose(); +} + +/*************************************************************************/ + +/** + * Returns a debugging string for this component. + * + * @return A debugging string for this component. + */ +protected String +paramString() +{ + return ("title+" + title + ",modal=" + modal + + ",resizable=" + resizable + "," + super.paramString()); +} + + /** + * Returns whether this frame is undecorated or not. + * + * @since 1.4 + */ + public boolean isUndecorated () + { + return undecorated; + } + + /** + * Disables or enables decorations for this frame. This method can only be + * called while the frame is not displayable. + * + * @exception IllegalComponentStateException If this frame is displayable. + * + * @since 1.4 + */ + public void setUndecorated (boolean undecorated) + { + if (isDisplayable ()) + throw new IllegalComponentStateException (); + + this.undecorated = undecorated; + } + + protected class AccessibleAWTDialog extends AccessibleAWTWindow + { + public AccessibleRole getAccessibleRole() + { + return AccessibleRole.DIALOG; + } + + public AccessibleStateSet getAccessibleState() + { + AccessibleStateSet states = super.getAccessibleStateSet(); + if (isResizable()) + states.add(AccessibleState.RESIZABLE); + if (isModal()) + states.add(AccessibleState.MODAL); + return states; + } + } + + /** + * Gets the AccessibleContext associated with this <code>Dialog</code>. + * The context is created, if necessary. + * + * @return the associated context + */ + public AccessibleContext getAccessibleContext() + { + /* Create the context if this is the first request */ + if (accessibleContext == null) + accessibleContext = new AccessibleAWTDialog(); + return accessibleContext; + } + +} // class Dialog + |