/*
Wenity v1.5 - a Zenity clone written in Java
Copyright (c) 2012, 2013 Karoly Kalman http://kksw.zzl.org/
This file is part of Wenity v1.5.
Wenity v1.5 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.
Wenity v1.5 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 Wenity v1.5. If not, see <http://www.gnu.org/licenses/>.
*/
//
package wenity.modules.file;
import wenity.Constants;
import wenity.Logger;
import wenity.Utils;
import wenity.modules.common.AWenityModule;
import wenity.modules.common.ModuleRequest;
import wenity.modules.common.ModuleResponse;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.io.File;
import java.util.Iterator;
/**
* Module name: fileSelector <br>
* Function: show a file selector dialog and return selected file name <br>
* Accepted parameters: dialog_caption filter [no_file_error_message] <br>
* _ * if no_file_error_message is specified it's displayed when selected file is not valid <br>
* _ * filter values: <br>
* _ * all -> show all files <br>
* _ * dir -> show directories only <br>
* _ * ext1,ext2 -> show files having ext1, ext2 only (still accepts if a valid file is typed manually) <br>
* Remarks: <br>
*/
public class FileSelector extends AWenityModule
{
private static final String MODULE_NAME = "fileSelector";
private static final String NO_FILTER = "all"; // show all files
private static final String DIR_FILTER = "dir";
public FileSelector ()
{
super (MODULE_NAME);
}
@Override
public ModuleResponse process (final ModuleRequest moduleRequest) throws Exception
{
try
{
final Iterator<String> moduleParamsIter = moduleRequest.getModuleParams ();
final String dialogCaption = Utils.getIteratorValueEx (moduleParamsIter, "dialog_caption");
final String filter = Utils.getIteratorValueEx (moduleParamsIter, "filter");
final String noFileErrorMsg = Utils.getIteratorOptionalValue (moduleParamsIter);
ModuleResponse moduleResponse = null;
while (moduleResponse == null)
{
final JFileChooser fileChooser = createFileChooser (dialogCaption, filter); // always recreate
if (fileChooser.showOpenDialog (null) == JFileChooser.APPROVE_OPTION)
moduleResponse = checkModuleResponse (fileChooser, noFileErrorMsg);
else
moduleResponse = ModuleResponse.newCancelResponse ();
}
return moduleResponse;
}
catch (Exception ex)
{
throw new Exception ("An error occurred while executing module: " + MODULE_NAME +
". Did you specify all the correct arguments in the form of" +
" 'dialog_caption filter [no_file_error_message]'? Error: " + ex, ex);
}
}
private JFileChooser createFileChooser (final String dialogCaption, final String filter)
{
final JFileChooser fileChooser = new JFileChooser ();
fileChooser.setMultiSelectionEnabled (false);
fileChooser.setDialogTitle (dialogCaption);
final boolean dirOnly = DIR_FILTER.equalsIgnoreCase (filter); // TODO precompile filter into enum or sthing
fileChooser.setFileSelectionMode (dirOnly ? JFileChooser.DIRECTORIES_ONLY : JFileChooser.FILES_ONLY);
if (!dirOnly && !NO_FILTER.equalsIgnoreCase (filter))
{
final FileNameExtensionFilter extensionFilter = new FileNameExtensionFilter (filter, filter.split (Constants.ARGUMENT_SEPARATOR));
fileChooser.setAcceptAllFileFilterUsed (false);
fileChooser.setFileFilter (extensionFilter);
}
return fileChooser;
}
private ModuleResponse checkModuleResponse (final JFileChooser fileChooser, final String noFileErrorMsg)
{
final File selFile = fileChooser.getSelectedFile ();
Logger.debug ("Selected file is %s. Exists: %s", selFile.getPath (), selFile.exists ());
final boolean fileMustExist = !noFileErrorMsg.isEmpty (); // got error message->file must exist
if (fileMustExist && !selFile.exists ())
{
JOptionPane.showMessageDialog (null, noFileErrorMsg);
return null;
}
return ModuleResponse.newFileResponse (selFile.getPath ());
}
}