/* 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., 59 Temple Place, Suite 330, Boston, MA
02111-1307 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

