/*
 * @(#)ZFileFilter.java
 *
 * Copyright 2001 by Intelligent Technology Inc. All rights reserved.
 */
package jp.co.iti.fagot.util;

import java.io.File;
import java.util.Hashtable;
import java.util.Enumeration;

import javax.swing.filechooser.FileFilter;

/**
 * ファイルフィルタ簡易バージョン
 *
 * 【例】 - gif,jpg ファイルを選ぶ場合
 *
 *     JFileChooser chooser = new JFileChooser();
 *     FuFileFilter filter = new ZFileFilter(
 *                   new String{"gif", "jpg"}, "JPEG & GIF Images")
 *     chooser.addChoosableFileFilter(filter);
 *     chooser.showOpenDialog(this);
 *
 * @author  福島康治
 * @version 1.01 2000/10/12
 */
public class ZFileFilter extends FileFilter {

    private static String TYPE_UNKNOWN = "Type Unknown";
    private static String HIDDEN_FILE = "Hidden File";

    private Hashtable sFilters = null;
    private String description = null;
    private String fullDescription = null;
    private boolean useExtensionsInDescription = true;

	/**
	 * コンストラクタ（全てのファイルタイプを選択）
	 * @see #addExtension
	 */
	public ZFileFilter() {
	sFilters = new Hashtable();
	}

	/**
	 * コンストラクタ（単一のファイルタイプを選択）
	 * @see #addExtension
	 */
	public ZFileFilter(String extension) {
	this(extension,null);
	}

	/**
	 * コンストラクタ（単一のファイルタイプ（名称付き）を選択）
	 * 【例】: new FuFileFilter("jpg", "JPEG Image Images");
	 * @see #addExtension
	 */
	public ZFileFilter(String extension, String description) {
	this();
	if(extension!=null) {
		addExtension(extension);
	}
 	if(description!=null) {
		 setDescription(description);
	}
	}

	/**
	 * コンストラクタ（複数のファイルタイプを選択）
	 * 【例】: new FuFileFilter(String {"gif", "jpg"});
	 * @see #addExtension
	 */
	public ZFileFilter(String[] filters) {
	this(filters, null);
	}

	/**
	 * コンストラクタ（複数のファイルタイプ（名称付き）を選択）
	 * 【例】: new FuFileFilter(String {"gif", "jpg"}, "Gif and JPG Images");
	 * @see #addExtension
	 */
	public ZFileFilter(String[] filters, String description) {
	this();
	for (int nIndex = 0; nIndex < filters.length; nIndex++) {
	    addExtension(filters[nIndex]);
	}
 	if(description!=null) {
		setDescription(description);
    }
	}

	/**
	 * 受け付けられるファイルタイプか？
	 */
	public boolean accept(File f) {
	if(f != null) {
	    if(f.isDirectory()) {
			return true;
	    }
	    String extension = ZFile.getExt(f.getName());
	    if ( extension != null ) {
			extension = extension.toLowerCase();
			if ( sFilters.get(extension) != null ) {
				return true;
			}
	    }
	}
	return false;
	}

	/**
	 * ファイルタイプを追加
	 * 【例】: new FuFileFilter("jpg", "JPEG Image Images");
	 *   FuFileFilter filter = new FuFileFilter();
	 *   filter.addExtension("jpg");
	 *   filter.addExtension("tif");
	 */
	public void addExtension(String extension) {
	if(sFilters == null) {
	    sFilters = new Hashtable(5);
	}
	sFilters.put(extension.toLowerCase(), this);
	fullDescription = null;
	}

	/**
	 * ファイル名称を取得
	 */
	public String getDescription() {
	if(fullDescription == null) {
	    if(description == null || isExtensionListInDescription()) {
 		fullDescription = description==null ? "(" : description + " (";
		// build the description from the extension list
		Enumeration extensions = sFilters.keys();
		if(extensions != null) {
		    fullDescription += "." + (String) extensions.nextElement();
		    while (extensions.hasMoreElements()) {
			fullDescription += ", " + (String) extensions.nextElement();
		    }
		}
		fullDescription += ")";
	    } else {
		fullDescription = description;
	    }
	}
	return fullDescription;
	}

	/**
	 * ファイル名称を設定
	 * 【例】: filter.setDescription("Gif and JPG Images");
	 */
	public void setDescription(String description) {
	this.description = description;
	fullDescription = null;
	}

	/**
	 * Determines whether the extension list (.jpg, .gif, etc) should
	 * show up in the human readable description.
	 *
	 * Only relevent if a description was provided in the constructor
	 * or using setDescription();
	 */
	public void setExtensionListInDescription(boolean b) {
	useExtensionsInDescription = b;
	fullDescription = null;
	}

	/**
	 * Returns whether the extension list (.jpg, .gif, etc) should
	 * show up in the human readable description.
	 *
	 * Only relevent if a description was provided in the constructor
	 * or using setDescription();
	 */
	public boolean isExtensionListInDescription() {
	return useExtensionsInDescription;
	}
}

