package com.vividsolutions.jump.workbench.datasource; import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import javax.swing.JFileChooser; import javax.swing.filechooser.FileFilter; import com.vividsolutions.jump.util.Block; import com.vividsolutions.jump.util.CollectionUtil; import com.vividsolutions.jump.util.FileUtil; import com.vividsolutions.jump.workbench.WorkbenchContext; import com.vividsolutions.jump.workbench.ui.GUIUtil; import com.vividsolutions.jump.workbench.ui.plugin.PersistentBlackboardPlugIn; public abstract class LoadSaveDatasetFileMixin { protected void setSelectedFormat(String selectedFormat) { this.selectedFormat = selectedFormat; } private String selectedFormat = ""; protected String getSelectedFormat() { return selectedFormat; } protected Collection showDialog(JFileChooser fileChooser, Class fileDataSourceQueryChooserClass, WorkbenchContext context) { try { return showDialogProper(fileChooser, fileDataSourceQueryChooserClass, context); } catch (Exception e) { throw new RuntimeException(e); } } protected abstract String getName(); protected abstract String getLastDirectoryKey(); private Collection showDialogProper(final JFileChooser fileChooser, Class fileDataSourceQueryChooserClass, WorkbenchContext context) throws IOException { fileChooser.setDialogTitle(getName()); fileChooser.setCurrentDirectory(new File( (String) PersistentBlackboardPlugIn.get(context).get( getLastDirectoryKey(), fileChooser.getCurrentDirectory().getCanonicalPath()))); fileChooser.setSelectedFile(initiallySelectedFile(fileChooser.getCurrentDirectory())); fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); GUIUtil.removeChoosableFileFilters(fileChooser); final Map fileFilterToFileDataSourceQueryChooserMap = new HashMap(); for (Iterator i = CollectionUtil.concatenate( DataSourceQueryChooserManager.get( context.getWorkbench().getBlackboard()) .getLoadDataSourceQueryChoosers(), DataSourceQueryChooserManager.get( context.getWorkbench().getBlackboard()) .getSaveDataSourceQueryChoosers()).iterator(); i .hasNext();) { DataSourceQueryChooser dataSourceQueryChooser = (DataSourceQueryChooser) i .next(); if (!fileDataSourceQueryChooserClass .isInstance(dataSourceQueryChooser)) { continue; } FileDataSourceQueryChooser fileDataSourceQueryChooser = (FileDataSourceQueryChooser) dataSourceQueryChooser; fileChooser.addChoosableFileFilter(fileDataSourceQueryChooser .getFileFilter()); fileFilterToFileDataSourceQueryChooserMap.put( fileDataSourceQueryChooser.getFileFilter(), fileDataSourceQueryChooser); } for (Iterator i = fileFilterToFileDataSourceQueryChooserMap.keySet() .iterator(); i.hasNext();) { FileFilter fileFilter = (FileFilter) i.next(); if (fileFilter.getDescription().equals(selectedFormat)) { fileChooser.setFileFilter(fileFilter); } } if (JFileChooser.APPROVE_OPTION != fileChooser.showDialog(context .getWorkbench().getFrame(), null)) { return null; } PersistentBlackboardPlugIn.get(context).put(getLastDirectoryKey(), fileChooser.getCurrentDirectory().getCanonicalPath()); selectedFormat = fileChooser.getFileFilter().getDescription(); return CollectionUtil.collect(fileChooser.isMultiSelectionEnabled() ? Arrays.asList(fileChooser.getSelectedFiles()) : Collections.singletonList(fileChooser.getSelectedFile()), new Block() { public Object yield(Object file) { FileDataSourceQueryChooser fileDataSourceQueryChooser = ((FileDataSourceQueryChooser) fileFilterToFileDataSourceQueryChooserMap .get(fileChooser.getFileFilter())); return fileDataSourceQueryChooser .toDataSourceQuery(addExtensionIfRequested( (File) file, fileDataSourceQueryChooser .getExtensions()[0])); } }); } public abstract File initiallySelectedFile(File currentDirectory); private File addExtensionIfRequested(File file, String extension) { return isAddingExtensionIfRequested() ? FileUtil.addExtensionIfNone(file, extension) : file; } public abstract boolean isAddingExtensionIfRequested(); }