//////////////////////////////////////////////////////////////////
package jalview.io;
+import jalview.gui.JvOptionPane;
import jalview.util.MessageManager;
import jalview.util.Platform;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
import java.util.StringTokenizer;
import java.util.Vector;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JFileChooser;
import javax.swing.JList;
-import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SpringLayout;
+import javax.swing.filechooser.FileView;
+import javax.swing.plaf.basic.BasicFileChooserUI;
/**
* Enhanced file chooser dialog box.
*/
public class JalviewFileChooser extends JFileChooser
{
- public JalviewFileChooser(String dir)
+ /**
+ * Factory method to return a file chooser that offers readable alignment file
+ * formats
+ *
+ * @param directory
+ * @param selected
+ * @param selectAll
+ * @return
+ */
+ public static JalviewFileChooser forRead(String directory,
+ String selected, boolean selectAll)
{
- super(safePath(dir));
- setAccessory(new RecentlyOpened());
+ List<String> extensions = new ArrayList<String>();
+ List<String> descs = new ArrayList<String>();
+ for (FileFormatI format : FileFormat.values())
+ {
+ if (format.isReadable())
+ {
+ extensions.add(format.getExtensions());
+ descs.add(format.toString());
+ }
+ }
+ return new JalviewFileChooser(directory,
+ extensions.toArray(new String[extensions.size()]),
+ descs.toArray(new String[descs.size()]),
+ selected);
}
- private static File safePath(String dir)
+ /**
+ * Factory method to return a file chooser that offers writable alignment file
+ * formats
+ *
+ * @param directory
+ * @param selected
+ * @param selectAll
+ * @return
+ */
+ public static JalviewFileChooser forWrite(String directory,
+ String selected, boolean selectAll)
{
- if (dir == null)
+ // TODO in Java 8, forRead and forWrite can be a single method
+ // with a lambda expression parameter for isReadable/isWritable
+ List<String> extensions = new ArrayList<String>();
+ List<String> descs = new ArrayList<String>();
+ for (FileFormatI format : FileFormat.values())
{
- return null;
+ if (format.isWritable())
+ {
+ extensions.add(format.getExtensions());
+ descs.add(format.toString());
+ }
}
+ return new JalviewFileChooser(directory,
+ extensions.toArray(new String[extensions.size()]),
+ descs.toArray(new String[descs.size()]), selected);
+ }
- File f = new File(dir);
- if (f.getName().indexOf(':') > -1)
- {
- return null;
- }
- return f;
+ public JalviewFileChooser(String dir)
+ {
+ super(safePath(dir));
+ setAccessory(new RecentlyOpened());
}
- public JalviewFileChooser(String dir, String[] suffix, String[] desc,
- String selected, boolean selectAll)
+ public JalviewFileChooser(String dir, String extension, String desc,
+ String selected)
{
super(safePath(dir));
- init(suffix, desc, selected, selectAll);
+ init(Collections.singletonList(new String[] { extension, desc }),
+ selected);
}
- public JalviewFileChooser(String dir, String[] suffix, String[] desc,
+ public JalviewFileChooser(String dir, String[] extensions, String[] descs,
String selected)
{
super(safePath(dir));
- init(suffix, desc, selected, true);
+ if (extensions.length == descs.length)
+ {
+ List<String[]> formats = new ArrayList<String[]>();
+ for (int i = 0; i < extensions.length; i++)
+ {
+ formats.add(new String[] { extensions[i], descs[i] });
+ }
+ init(formats, selected);
+ }
+ else
+ {
+ System.err.println("JalviewFileChooser arguments mismatch: "
+ + extensions + ", " + descs);
+ }
}
- public JalviewFileChooser(String property, FileFormatI currentFileFormat,
- boolean b)
+ private static File safePath(String dir)
{
- todo write this
- // TODO Auto-generated constructor stub
+ if (dir == null)
+ {
+ return null;
+ }
+
+ File f = new File(dir);
+ if (f.getName().indexOf(':') > -1)
+ {
+ return null;
+ }
+ return f;
}
- void init(String[] suffix, String[] desc, String selected,
- boolean selectAll)
+ /**
+ *
+ * @param formats
+ * a list of {extensions, description} for each file format
+ * @param selected
+ */
+ void init(List<String[]> formats, String selected)
{
JalviewFileFilter chosen = null;
// SelectAllFilter needs to be set first before adding further
// file filters to fix bug on Mac OSX
- setAcceptAllFileFilterUsed(selectAll);
+ setAcceptAllFileFilterUsed(true);
- for (int i = 0; i < suffix.length; i++)
+ for (String[] format : formats)
{
- JalviewFileFilter jvf = new JalviewFileFilter(suffix[i], desc[i]);
+ JalviewFileFilter jvf = new JalviewFileFilter(format[0], format[1]);
addChoosableFileFilter(jvf);
- if ((selected != null) && selected.equalsIgnoreCase(desc[i]))
+ if ((selected != null) && selected.equalsIgnoreCase(format[1]))
{
chosen = jvf;
}
try
{
- if (getUI() instanceof javax.swing.plaf.basic.BasicFileChooserUI)
+ if (getUI() instanceof BasicFileChooserUI)
{
- final javax.swing.plaf.basic.BasicFileChooserUI ui = (javax.swing.plaf.basic.BasicFileChooserUI) getUI();
- final String name = ui.getFileName().trim();
+ final BasicFileChooserUI fcui = (BasicFileChooserUI) getUI();
+ final String name = fcui.getFileName().trim();
if ((name == null) || (name.length() == 0))
{
@Override
public void run()
{
- String currentName = ui.getFileName();
+ String currentName = fcui.getFileName();
if ((currentName == null) || (currentName.length() == 0))
{
- ui.setFileName(name);
+ fcui.setFileName(name);
}
}
});
}
}
- public FileFormat getSelectedFormat()
+ /**
+ * Returns the selected file format, or null if none selected
+ *
+ * @return
+ */
+ public FileFormatI getSelectedFormat()
{
if (getFileFilter() == null)
{
return null;
}
+ /*
+ * logic here depends on option description being formatted as
+ * formatName (extension, extension...)
+ * or the 'no option selected' value
+ * All Files
+ * @see JalviewFileFilter.getDescription
+ */
String format = getFileFilter().getDescription();
- return FileFormat.valueOf(format);
+ int parenPos = format.indexOf("(");
+ if (parenPos > 0)
+ {
+ format = format.substring(0, parenPos).trim();
+ try
+ {
+ return FileFormat.valueOf(format);
+ } catch (IllegalArgumentException e)
+ {
+ System.err.println("Unexpected format: " + format);
+ }
+ }
+ return null;
}
@Override
if ((ret == JalviewFileChooser.APPROVE_OPTION)
&& getSelectedFile().exists())
{
- int confirm = JOptionPane.showConfirmDialog(parent,
+ int confirm = JvOptionPane.showConfirmDialog(parent,
MessageManager.getString("label.overwrite_existing_file"),
MessageManager.getString("label.file_already_exists"),
- JOptionPane.YES_NO_OPTION);
+ JvOptionPane.YES_NO_OPTION);
- if (confirm != JOptionPane.YES_OPTION)
+ if (confirm != JvOptionPane.YES_OPTION)
{
ret = JalviewFileChooser.CANCEL_OPTION;
}