/*
 * Copyright (c) 2003-2012 Fred Hutchinson Cancer Research Center
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.fhcrc.cpl.viewer.gui;

import org.fhcrc.cpl.toolbox.TextProvider;
import org.fhcrc.cpl.toolbox.ApplicationContext;
import org.fhcrc.cpl.viewer.Localizer;
import org.fhcrc.cpl.viewer.Application;

import javax.swing.*;
import java.awt.*;
import java.io.File;
import java.util.prefs.Preferences;

/**
 * User: mbellew
 * Date: Sep 7, 2004
 * Time: 2:12:16 PM
 */
public class WorkbenchFileChooser extends JFileChooser
	{
	static File lastDirectory = null;
	static Preferences prefs = Preferences.userNodeForPackage(Application.class);

    public WorkbenchFileChooser()
    {
        super();
        setLocale(Localizer.getLocale());
        //translate as much text as JFileChooser allows
        setApproveButtonText(TextProvider.getText("OPEN"));
        setDialogTitle(TextProvider.getText("OPEN"));
        UIManager.put("FileChooser.acceptAllFileFilterText",
                      TextProvider.getText("ALL_FILES"));
        UIManager.put("FileChooser.lookInLabelText",
                      TextProvider.getText("LOOK_IN"));
        UIManager.put("FileChooser.cancelButtonText",
                      TextProvider.getText("CANCEL"));
        UIManager.put("FileChooser.fileNameLabelText",
                      TextProvider.getText("FILE_NAME_COLON"));
        UIManager.put("FileChooser.filesOfTypeLabelText",
                      TextProvider.getText("FILES_OF_TYPE_COLON"));        
    }

    public int showOpenDialog(Component component) throws HeadlessException
    {
        return showOpenDialog(component, null);
    }

    public int showOpenDialog(Component component, File directory) throws HeadlessException
    {
        boolean directorySet = false;
        if (directory != null)
        {
            if (directory.exists())
            {
                setCurrentDirectory(directory);
                directorySet = true;
            }
        }

        if (!directorySet)
        {
            try
            {
                if (null == lastDirectory)
                    lastDirectory = new File(prefs.get("lastDirectory", "."));
                if (lastDirectory.exists())
                    this.setCurrentDirectory(lastDirectory);
            }
            catch (Exception x)
            {
            }
        }


        int ret = super.showOpenDialog(component);
        if (APPROVE_OPTION == ret)
        {
            File f = getSelectedFile();
            lastDirectory = f.getParentFile();
            prefs.put("lastDirectory", lastDirectory.getPath());
        }
        return ret;
    }

    /**
     * utility method for choosing a file.  Check for file existence.  Display a
     * generic error message and return null if file doesn't exist
     * @param windowTitleText
     * @return
     */
    public static File chooseExistingFile(String windowTitleText)
        {
        WorkbenchFileChooser chooser = new WorkbenchFileChooser();
        if (windowTitleText != null)
            chooser.setDialogTitle(windowTitleText);
        int chooserStatus = chooser.showOpenDialog(ApplicationContext.getFrame());
        //if user didn't hit OK, ignore
        if (chooserStatus != JFileChooser.APPROVE_OPTION)
            return null;            
        File file = chooser.getSelectedFile();

        if (file == null)
            return null;
        if (!file.exists())
            {
            ApplicationContext.infoMessage(TextProvider.getText("FILE_FILE_DOES_NOT_EXIST",
                    file.getAbsolutePath()));
            return null;
            }
        return file;
        }
    }
