package org.eclipse.jface.preference;

/*
 * (c) Copyright IBM Corp. 2000, 2001.
 * All Rights Reserved.
 */
import java.io.File;

import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.FileDialog;

/**
 * A field editor for a file path type preference. A standard file 
 * dialog appears when the user presses the change button.
 */
public class FileFieldEditor extends StringButtonFieldEditor {

	/**
	 * List of legal file extension suffixes, or <code>null</code>
	 * for system defaults.
	 */
	private String[] extensions = null;

	/**
	 * Indicates whether the path must be absolute;
	 * <code>false</code> by default.
	 */
	private boolean enforceAbsolute = false;
/**
 * Creates a new file field editor 
 */
protected FileFieldEditor() {
}
/**
 * Creates a file field editor.
 * 
 * @param name the name of the preference this field editor works on
 * @param labelText the label text of the field editor
 * @param parent the parent of the field editor's control
 */
public FileFieldEditor(String name, String labelText, Composite parent) {
	this(name, labelText, false, parent);
}
/**
 * Creates a file field editor.
 * 
 * @param name the name of the preference this field editor works on
 * @param labelText the label text of the field editor
 * @param enforceAbsolute <code>true</code> if the file path
 *  must be absolute, and <code>false</code> otherwise
 * @param parent the parent of the field editor's control
 */
public FileFieldEditor(String name, String labelText, boolean enforceAbsolute, Composite parent) {
	init(name, labelText);
	this.enforceAbsolute = enforceAbsolute;
	setErrorMessage(JFaceResources.getString("FileFieldEditor.errorMessage"));//$NON-NLS-1$
	setChangeButtonText(JFaceResources.getString("openBrowse"));//$NON-NLS-1$
	setValidateStrategy(VALIDATE_ON_FOCUS_LOST);
	createControl(parent);
}
/* (non-Javadoc)
 * Method declared on StringButtonFieldEditor.
 * Opens the file chooser dialog and returns the selected file.
 */
protected String changePressed() {
	File f = new File(getTextControl().getText());
	if (!f.exists())
		f = null;
	File d = getFile(f);
	if (d == null)
		return null;

	return d.getAbsolutePath();
}
/* (non-Javadoc)
 * Method declared on StringFieldEditor.
 * Checks whether the text input field specifies an existing file.
 */
protected boolean checkState() {

	String msg = null;

	String path = getTextControl().getText();
	if (path != null)
		path = path.trim();
	else
		path = "";//$NON-NLS-1$
	if (path.length() == 0) {
		if (!isEmptyStringAllowed())
			msg = getErrorMessage();
	} else {
		File file = new File(path);
		if (file.isFile()) {
			if (enforceAbsolute && !file.isAbsolute())
				msg = JFaceResources.getString("FileFieldEditor.errorMessage2");//$NON-NLS-1$
		} else {
			msg = getErrorMessage();
		}
	}

	if (msg != null) { // error
		showErrorMessage(msg);
		return false;
	}

	// OK!
	clearErrorMessage();
	return true;
}
/**
 * Helper to open the file chooser dialog.
 */
private File getFile(File startingDirectory) {

	FileDialog dialog = new FileDialog(getShell(), SWT.OPEN);
	if (startingDirectory != null)
		dialog.setFileName(startingDirectory.getPath());
	if (extensions != null)
		dialog.setFilterExtensions(extensions);
	String file = dialog.open();
	if (file != null) {
		file = file.trim();
		if (file.length() > 0)
			return new File(file);
	}

	return null;
}
/**
 * Sets this file field editor's file extension filter.
 *
 * @param extension a list of file extension, or <code>null</code> 
 * to set the filter to the system's default value
 */
public void setFileExtensions(String[] extensions) {
	this.extensions = extensions;
}
}
