/*
 * FileNameCellEditor.java
 *
 * Created on October 20, 2000, 1:55 AM
 */
package CITableTest;

import javax.swing.table.TableCellEditor;
import javax.swing.JTextField;
import javax.swing.JTable;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.AbstractAction;
import java.awt.event.ActionEvent;
import javax.swing.SwingConstants;
import java.awt.Component;
import java.awt.Dimension;
import java.io.File;
/**
 *
 * @author  Somchai LIMSIRORATANA, Nuntiya LIMSIRORATANA(Yawai)
 * @version 1.0
 */
public class FileNameCellEditor extends AbstractCellEditor implements TableCellEditor {

    protected JTextField textField;
    protected JPanel panel;
    /** Creates new FileNameCellEditor */
    public FileNameCellEditor() {
        panel = new JPanel();
        panel.setLayout(new javax.swing.BoxLayout(panel, 0));
        textField = new JTextField();
        textField.addActionListener(this);
        textField.setEditable(true);
        textField.setHorizontalAlignment(SwingConstants.CENTER);
        panel.add(textField);
        JButton button = new JButton("..");
        Dimension d = new Dimension(20,20);
        button.setPreferredSize(d);
        button.setMaximumSize(d);
        button.addActionListener(new AbstractAction() {
            boolean isDialogShow = false;
            public void actionPerformed(ActionEvent e) {
                if (isDialogShow == false) {
                    isDialogShow = true;
                    Object value = getCellEditorValue();
                    JFileChooser chooser = new JFileChooser();
                    // Note: source for ExtensionFileFilter can be found in the SwingSet demo
                    ExampleFileFilter filter = new ExampleFileFilter();
                    filter.addExtension("wrl");
                    filter.setDescription("VRML File");
                    chooser.setFileFilter(filter);
                    chooser.setCurrentDirectory(new File(getCellEditorValue().toString()));
                    int returnVal = chooser.showOpenDialog(panel);
                    if(returnVal == JFileChooser.APPROVE_OPTION) {
                        textField.setText(chooser.getSelectedFile().getAbsolutePath());
                    }
                    fireEditingStopped();
                    isDialogShow = false;
                }
            }
        });
        panel.add(button);
    }

    /** Sets an initial <I>value</I> for the editor.  This will cause
     * the editor to stopEditing and lose any partially edited value
     * if the editor is editing when this method is called. <p>
     *
     * Returns the component that should be added to the client's
     * Component hierarchy.  Once installed in the client's hierarchy
     * this component will then be able to draw and receive user input.
     *
     * @param   table       the JTable that is asking the editor to edit
     *              This parameter can be null.
     * @param   value       the value of the cell to be edited.  It is
     *              up to the specific editor to interpret
     *              and draw the value.  eg. if value is the
     *              String "true", it could be rendered as a
     *              string or it could be rendered as a check
     *              box that is checked.  null is a valid value.
     * @param   isSelected  true is the cell is to be renderer with
     *              selection highlighting
     * @param   row         the row of the cell being edited
     * @param   column      the column of the cell being edited
     * @return  the component for editing
     */
    public Component getTableCellEditorComponent(JTable table,Object value,boolean isSelected,int row,int column) {
        if (value instanceof FileName) {
            FileName filename = (FileName)value;
            textField.setText(filename.toString());
        }
        return panel;
    }
    /** Returns the value contained in the editor */
    public Object getCellEditorValue() {
        return new FileName(textField.getText());
    }
}