/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo 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 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo 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 OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.swing;
/**
* Widget allowing to edit a file with a popup
*
* @author sguerin
*
*/
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileFilter;
public class FileSelector extends TextFieldCustomPopup<File> {
public static final Font NORMAL_FONT = new Font("SansSerif", Font.PLAIN, 11);
private static final String EMPTY_STRING = "";
private File _oldValue;
FileChooserPanel fileChooserPanel;
private FileFilter _fileFilter;
int fileSelectionMode = JFileChooser.FILES_AND_DIRECTORIES;
int dialogType = JFileChooser.OPEN_DIALOG;
public FileSelector() {
this((File) null);
}
public FileSelector(FileFilter aFileFilter) {
this(null, aFileFilter);
}
public FileSelector(File aFile) {
super(aFile);
_oldValue = aFile;
}
public FileSelector(File aFile, FileFilter aFileFilter) {
this(aFile);
setFileFilter(aFileFilter);
}
public FileSelector(File aFile, FileFilter aFileFilter, int aFileSelectionMode) {
this(aFile);
setFileFilter(aFileFilter);
fileSelectionMode = aFileSelectionMode;
}
public FileSelector(File aFile, FileFilter aFileFilter, int aFileSelectionMode, int aDialogType) {
this(aFile);
setFileFilter(aFileFilter);
fileSelectionMode = aFileSelectionMode;
dialogType = aDialogType;
}
@Override
public void delete() {
super.delete();
_fileFilter = null;
fileChooserPanel = null;
}
public File getEditedFile() {
return getEditedObject();
}
public void setEditedFile(File aFile) {
setEditedObject(aFile);
}
public File getFile(Object currentEditedObject) {
return (File) currentEditedObject;
}
@Override
protected ResizablePanel createCustomPanel(File editedObject) {
fileChooserPanel = new FileChooserPanel(getFile(editedObject));
if (_fileFilter != null) {
fileChooserPanel.setFileFilter(_fileFilter);
}
return fileChooserPanel;
}
@Override
public void updateCustomPanel(File editedObject) {
if (fileChooserPanel != null) {
fileChooserPanel.update(getFile(editedObject));
}
}
@Override
public String renderedString(File editedObject) {
if (editedObject != null) {
return getFile(editedObject).getName();
} else {
return EMPTY_STRING;
}
}
public void setFileFilter(FileFilter aFilter) {
_fileFilter = aFilter;
if (fileChooserPanel != null) {
fileChooserPanel.setFileFilter(aFilter);
}
}
protected class FileChooserPanel extends ResizablePanel implements ActionListener {
private JFileChooser fileChooser;
private Dimension defaultDimension = new Dimension(500, 400);
void update(File aFile) {
fileChooser.setSelectedFile(aFile);
}
protected FileChooserPanel(File aFile) {
super();
fileChooser = FlexoFileChooser.getFileChooser(aFile != null ? aFile.getAbsolutePath() : null);
fileChooser.addActionListener(this);
fileChooser.setFileSelectionMode(fileSelectionMode);
fileChooser.setDialogType(dialogType);
// Build the calendar Panel
setLayout(new BorderLayout());
add(fileChooser, BorderLayout.CENTER);
fileChooserPanel = this;
fileChooser.setSize(defaultDimension);
fileChooser.setMinimumSize(defaultDimension);
fileChooser.setMaximumSize(defaultDimension);
}
public void setFileFilter(FileFilter aFilter) {
if (aFilter != null) {
fileChooser.setFileFilter(aFilter);
}
}
@Override
public Dimension getDefaultSize() {
return defaultDimension;
}
@Override
public void setPreferredSize(Dimension aDimension) {
fileChooser.setPreferredSize(aDimension);
}
/**
* Overrides
*
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
@Override
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals(JFileChooser.APPROVE_SELECTION)) {
setEditedFile(fileChooser.getSelectedFile());
apply();
} else if (e.getActionCommand().equals(JFileChooser.CANCEL_SELECTION)) {
cancel();
}
}
}
@Override
public void apply() {
setRevertValue(getEditedObject());
closePopup();
super.apply();
}
@Override
public void cancel() {
setEditedObject(_oldValue);
closePopup();
super.cancel();
}
@Override
public void setRevertValue(File oldValue) {
_oldValue = oldValue;
}
public File getRevertValue() {
return _oldValue;
}
}