/*  Copyright (C) 2003-2011 JabRef contributors.
    This program 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 of the License, or
    (at your option) any later version.

    This program 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 this program; if not, write to the Free Software Foundation, Inc.,
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package net.sf.jabref;

import java.io.File;
import java.io.FilenameFilter;
import java.util.HashSet;

public class OpenFileFilter extends javax.swing.filechooser.FileFilter implements FilenameFilter {

  HashSet<String> extSet = new HashSet<String>();
  String desc;

  public OpenFileFilter(String[] extensions) {
    StringBuffer buf = new StringBuffer();
    int numExt = extensions.length;

    if (numExt>0) {
      buf.append('*');
      buf.append(extensions[0]);

      extSet.add(extensions[0]);
    }

    for(int curExt = 1; curExt<numExt; curExt++) {
      buf.append(", *");
      buf.append(extensions[curExt]);

      extSet.add(extensions[curExt]);
    }

    desc = buf.toString();
  }

  public OpenFileFilter() {
    this( new String[] {
      ".bib",
      ".dat",  // silverplatter ending
      ".txt",  // windows puts ".txt" extentions and for scifinder
      ".ris",
      ".ref",  // refer/endnote format
      ".fcgi", // default for pubmed
      ".bibx", // default for BibTeXML
      ".xml"
    });
  }

  public OpenFileFilter(String s) {
    this(s.split("[, ]+",0));
  }

  public boolean accept(File file){
    if (file.isDirectory())
      return true;

    return accept(file.getName());
  }

  public boolean accept(String filenm){

    filenm = filenm.toLowerCase();
    int dotPos = filenm.lastIndexOf(".");

    if (dotPos==-1)
      return false;

    int dotDotPos = filenm.lastIndexOf(".", dotPos-1); // for dot.dot extensions

    return extSet.contains(filenm.substring(dotPos)) ||
      (dotDotPos>=0 && extSet.contains(filenm.substring(dotDotPos)));
  }

  public String getSuffix(String filenm) {

    int dotPos;
    String suffix;
    
    dotPos = filenm.lastIndexOf(".");
    if (dotPos==-1)
      return null;

    suffix = filenm.substring(dotPos);
    if (extSet.contains(suffix))
      return suffix;

    dotPos = filenm.lastIndexOf(".", dotPos-1); // for dot.dot extensions
    if (dotPos==-1)
      return null;

    suffix = filenm.substring(dotPos);
    if (extSet.contains(suffix))
      return suffix;

    return null;
  }

  public String getDescription(){
    return desc;
  }

  public boolean accept(File dir, String name) {
    return accept(new File(dir.getPath()+name));
  }
}
