/* FileDialog.java -- A filename selection dialog box
   Copyright (C) 1999, 2000, 2001, 2002, 2004, 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.FileDialogPeer;
import java.io.FilenameFilter;
import java.io.Serializable;

/**
  * This class implements a file selection dialog box widget.
  *
  * @author Aaron M. Renn (arenn@urbanophile.com)
  * @author Tom Tromey (tromey@redhat.com)
  */
public class FileDialog extends Dialog implements Serializable
{

/*
 * Static Variables
 */

/**
  * Indicates that the purpose of the dialog is for opening a file.
  */
public static final int LOAD = 0;

/**
  * Indicates that the purpose of the dialog is for saving a file.
  */
public static final int SAVE = 1;

// Serialization constant
private static final long serialVersionUID = 5035145889651310422L;

/*************************************************************************/

/*
 * Instance Variables
 */

/**
  * @serial The directory for this file dialog.
  */
private String dir;

/**
  * @serial The filename for this file dialog
  */
private String file;

/**
  * @serial The filter for selecting filenames to display
  */
private FilenameFilter filter;

/**
  * @serial The mode of this dialog, either <code>LOAD</code> or 
  * <code>SAVE</code>.
  */
private int mode;

/**
 * The number used to generate the name returned by getName.
 */
private static transient long next_file_dialog_number;

/*************************************************************************/

/*
 * Constructors
 */

  /**
   * Initializes a new instance of <code>FileDialog</code> with the specified
   * parent. This dialog will have no title and will be for loading a file.
   * 
   * @param parent The parent dialog for this.
   * 
   * @since 1.5
   */
  public FileDialog(Dialog parent)
  {
    this(parent, "", LOAD);
  }
  
  /**
   * Initialized a new instance of <code>FileDialog</code> with the
   * specified parent and title.  This dialog will be for opening a file.
   *
   * @param parent The parent dialog for this.
   * @param title The title for this dialog.
   * 
   * @since 1.5
   */
  public FileDialog(Dialog parent, String title)
  {
    this(parent, title, LOAD);
  }
  
  /**
   * Initialized a new instance of <code>FileDialog</code> with the specified
   * parent, title, and mode.
   * 
   * @param parent The parent dialog for this.
   * @param title The title for this dialog.
   * @param mode The mode of the dialog, either <code>LOAD</code> or
   *          <code>SAVE</code>.
   * @throws IllegalArgumentException - if illegal mode, if
   *           GraphicsEnvironment.isHeadless or if parent is null.
   *           
   * @since 1.5
   */
  public FileDialog(Dialog parent, String title, int mode)
  {
    super(parent, title, true);

    // Other IllegalArgumentException cases are taken care of in Window.java
    if (mode != LOAD && mode != SAVE)
      throw new IllegalArgumentException (
        "Mode argument must be either LOAD or SAVE");
    
    setMode(mode);
  }

/**
  * Initializes a new instance of <code>FileDialog</code> with the 
  * specified parent.  This dialog will have no title and will be for
  * loading a file.
  *
  * @param parent The parent frame for this dialog.
  */
public
FileDialog(Frame parent)
{
  this(parent, "", LOAD);
}

/*************************************************************************/

/**
  * Initialized a new instance of <code>FileDialog</code> with the
  * specified parent and title.  This dialog will be for opening a file.
  *
  * @param parent The parent frame for this dialog.
  * @param title The title for this dialog.
  */
public
FileDialog(Frame parent, String title)
{
  this(parent, title, LOAD);
}

/*************************************************************************/

/**
  * Initialized a new instance of <code>FileDialog</code> with the
  * specified parent, title, and mode.
  *
  * @param parent The parent frame for this dialog.
  * @param title The title for this dialog.
  * @param mode The mode of the dialog, either <code>LOAD</code> or
  * <code>SAVE</code>.
  *
  * @exception IllegalArgumentException If an illegal file dialog mode
  * is supplied.
  */
public
FileDialog(Frame parent, String title, int mode)
{
  super(parent, title, true);
  
  if ((mode != LOAD) && (mode != SAVE))
    throw new IllegalArgumentException (
      "Mode argument must be either LOAD or SAVE");

  setMode (mode);
}

/*************************************************************************/

/*
 * Instance Methods
 */

/**
  * Returns the mode of this dialog, either <code>LOAD</code> or
  * <code>SAVE</code>.
  *
  * @return The mode of this dialog.
  */
public int
getMode()
{
  return(mode);
}

/*************************************************************************/

/**
  * Sets the mode of this dialog to either <code>LOAD</code> or
  * <code>SAVE</code>.  This method is only effective before the native
  * peer is created.
  *
  * @param mode The new mode of this file dialog.
  *
  * @exception IllegalArgumentException If an illegal file dialog mode
  * is supplied.
  */
public void
setMode(int mode)
{
  if ((mode != LOAD) && (mode != SAVE))
    throw new IllegalArgumentException("Bad mode: " + mode);

  this.mode = mode;
}

/*************************************************************************/

/**
  * Returns the directory for this file dialog.
  *
  * @return The directory for this file dialog.
  */
public String
getDirectory()
{
  return(dir);
}

/*************************************************************************/

/**
  * Sets the directory for this file dialog.
  *
  * @param dir The new directory for this file dialog.
  */
public synchronized void
setDirectory(String dir)
{
  this.dir = dir;
  if (peer != null)
    {
      FileDialogPeer f = (FileDialogPeer) peer;
      f.setDirectory (dir);
    }
}

/*************************************************************************/

/**
  * Returns the file that is selected in this dialog.
  *
  * @return The file that is selected in this dialog.
  */
public String
getFile()
{
  return(file);
}

/*************************************************************************/

/**
  * Sets the selected file for this dialog.
  *
  * @param file The selected file for this dialog.
  */
public synchronized void
setFile(String file)
{
  if ("".equals(file))
    this.file = null;
  else
    this.file = file;
  
  if (peer != null)
    {
      FileDialogPeer f = (FileDialogPeer) peer;
      f.setFile (file);
    }
}

/*************************************************************************/

/**
  * Returns the filename filter being used by this dialog.
  *
  * @return The filename filter being used by this dialog.
  */
public FilenameFilter
getFilenameFilter()
{
  return(filter);
}

/*************************************************************************/

/**
  * Sets the filename filter used by this dialog.
  *
  * @param filter The new filename filter for this file dialog box.
  */
public synchronized void
setFilenameFilter(FilenameFilter filter)
{
  this.filter = filter;
  if (peer != null)
    {
      FileDialogPeer f = (FileDialogPeer) peer;
      f.setFilenameFilter (filter);
    }
}

/*************************************************************************/

/**
  * Creates the native peer for this file dialog box.
  */
public void
addNotify()
{
  if (peer == null)
    peer = getToolkit ().createFileDialog (this);
  super.addNotify ();
}

/*************************************************************************/

/**
  * Returns a debugging string for this object.
  *
  * @return A debugging string for this object.
  */
protected String
paramString()
{
  return ("dir=" + dir + ",file=" + file +
	  ",mode=" + mode + "," + super.paramString());
}

/**
 * Generate a unique name for this <code>FileDialog</code>.
 *
 * @return A unique name for this <code>FileDialog</code>.
 */
String 
generateName()
{
  return "filedlg" + getUniqueLong();
}

private static synchronized long 
getUniqueLong()
{
  return next_file_dialog_number++;
}

} // class FileDialog 

