//////////////////////////////////////////////////////////////////
package jalview.io;
-import jalview.bin.Cache;
-import jalview.gui.JvOptionPane;
-import jalview.util.MessageManager;
-import jalview.util.Platform;
-import jalview.util.dialogrunner.DialogRunnerI;
-
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.util.Vector;
import javax.swing.BoxLayout;
-import javax.swing.DefaultListCellRenderer;
import javax.swing.JCheckBox;
+import javax.swing.JDialog;
import javax.swing.JFileChooser;
+import javax.swing.JLabel;
import javax.swing.JList;
+import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
+import javax.swing.ListCellRenderer;
import javax.swing.SpringLayout;
+import javax.swing.SwingConstants;
+import javax.swing.SwingUtilities;
+import javax.swing.border.TitledBorder;
import javax.swing.filechooser.FileFilter;
import javax.swing.plaf.basic.BasicFileChooserUI;
+import jalview.bin.Cache;
+import jalview.gui.JvOptionPane;
+import jalview.util.ChannelProperties;
+import jalview.util.MessageManager;
+import jalview.util.Platform;
+import jalview.util.dialogrunner.DialogRunnerI;
+
/**
* Enhanced file chooser dialog box.
*
* @author AMW
*
*/
-public class JalviewFileChooser extends JFileChooser implements DialogRunnerI,
- PropertyChangeListener
+public class JalviewFileChooser extends JFileChooser
+ implements DialogRunnerI, PropertyChangeListener
{
private static final long serialVersionUID = 1L;
private Map<Object, Runnable> callbacks = new HashMap<>();
-
+
File selectedFile = null;
/**
}
else
{
- System.err.println("JalviewFileChooser arguments mismatch: "
+ jalview.bin.Console.errPrintln("JalviewFileChooser arguments mismatch: "
+ extensions + ", " + descs);
}
}
}
/**
- * Overridden for JalviewJS compatibility: only one thread in Javascript,
- * so we can't wait for user choice in another thread and then perform the
+ * Overridden for JalviewJS compatibility: only one thread in Javascript, so
+ * we can't wait for user choice in another thread and then perform the
* desired action
*/
@Override
public int showOpenDialog(Component parent)
{
int value = super.showOpenDialog(this);
-
+
if (!Platform.isJS())
/**
* Java only
// file filters to fix bug on Mac OSX
setAcceptAllFileFilterUsed(acceptAny);
+ // add a "All known alignment files" option
+ List<String> allExtensions = new ArrayList<>();
+ for (String[] format : formats)
+ {
+ String[] extensions = format[0].split(",");
+ for (String ext : extensions)
+ {
+ if (!allExtensions.contains(ext))
+ {
+ allExtensions.add(ext);
+ }
+ }
+ }
+ allExtensions.sort(null);
+ JalviewFileFilter alljvf = new JalviewFileFilter(
+ allExtensions.toArray(new String[] {}),
+ MessageManager.getString("label.all_known_alignment_files"));
+ alljvf.setExtensionListInDescription(false);
+ addChoosableFileFilter(alljvf);
+
+ if (selected == null)
+ {
+ chosen = alljvf;
+ }
+
for (String[] format : formats)
{
JalviewFileFilter jvf = new JalviewFileFilter(format[0], format[1]);
multi.setLayout(new BoxLayout(multi, BoxLayout.PAGE_AXIS));
if (backupfilesCheckBox == null)
{
- try {
+ try
+ {
includeBackupFiles = Boolean.parseBoolean(
Cache.getProperty(BackupFiles.NS + "_FC_INCLUDE"));
} catch (Exception e)
}
// fake the OK button changing (to force it to upate)
String s = jfc.getApproveButtonText();
- jfc.firePropertyChange(
- APPROVE_BUTTON_TEXT_CHANGED_PROPERTY, null, s);
+ jfc.firePropertyChange(APPROVE_BUTTON_TEXT_CHANGED_PROPERTY,
+ null, s);
// fake the file filter changing (its behaviour actually has)
jfc.firePropertyChange(FILE_FILTER_CHANGED_PROPERTY, null, f);
return FileFormats.getInstance().forName(format);
} catch (IllegalArgumentException e)
{
- System.err.println("Unexpected format: " + format);
+ jalview.bin.Console.errPrintln("Unexpected format: " + format);
}
}
return null;
}
} catch (Throwable x)
{
- System.err.println(
+ jalview.bin.Console.errPrintln(
"Unexpected exception when trying to get filename.");
x.printStackTrace();
}
if (selectedFile.exists())
{
- int confirm = JvOptionPane.showConfirmDialog(this,
- MessageManager.getString("label.overwrite_existing_file"),
- MessageManager.getString("label.file_already_exists"),
- JvOptionPane.YES_NO_OPTION);
+ int confirm = Cache.getDefault("CONFIRM_OVERWRITE_FILE", true)
+ ? JvOptionPane.showConfirmDialog(this,
+ MessageManager
+ .getString("label.overwrite_existing_file"),
+ MessageManager.getString("label.file_already_exists"),
+ JvOptionPane.YES_NO_OPTION)
+ : JOptionPane.YES_OPTION;
if (confirm != JvOptionPane.YES_OPTION)
{
}
}
+ if (!file.isAbsolute() && file.exists())
+ {
+ file = file.getAbsoluteFile();
+ }
+
setSelectedFile(file);
}
}
class RecentlyOpened extends JPanel
{
private static final long serialVersionUID = 1L;
+
JList<String> list;
RecentlyOpened()
{
- setPreferredSize(new Dimension(300,100));
+ setPreferredSize(new Dimension(300, 100));
String historyItems = Cache.getProperty("RECENT_FILE");
StringTokenizer st;
Vector<String> recent = new Vector<>();
}
list = new JList<>(recent);
-
- DefaultListCellRenderer dlcr = new DefaultListCellRenderer();
- dlcr.setHorizontalAlignment(DefaultListCellRenderer.RIGHT);
- list.setCellRenderer(dlcr);
+ list.setCellRenderer(new recentlyOpenedCellRenderer());
list.addMouseListener(new MouseAdapter()
{
}
});
- this.setBorder(new javax.swing.border.TitledBorder(
- MessageManager.getString("label.recently_opened")));
+ TitledBorder recentlyOpenedBorder = new TitledBorder(
+ MessageManager.getString("label.recently_opened"));
+ recentlyOpenedBorder.setTitleFont(
+ recentlyOpenedBorder.getTitleFont().deriveFont(10f));
+ this.setBorder(recentlyOpenedBorder);
final JScrollPane scroller = new JScrollPane(list);
layout.putConstraint(SpringLayout.NORTH, scroller, 5,
SpringLayout.NORTH, this);
- if (Platform.isAMacAndNotJS())
- {
- scroller.setPreferredSize(new Dimension(500, 100));
- }
- else
- {
- scroller.setPreferredSize(new Dimension(530, 200));
- }
-
+ // one size okay for all
+ scroller.setPreferredSize(new Dimension(280, 105));
this.add(scroller);
- javax.swing.SwingUtilities.invokeLater(new Runnable()
+ SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
}
+ class recentlyOpenedCellRenderer extends JLabel
+ implements ListCellRenderer<String>
+ {
+ private final static int maxChars = 46;
+
+ private final static String ellipsis = "...";
+
+ @Override
+ public Component getListCellRendererComponent(
+ JList<? extends String> list, String value, int index,
+ boolean isSelected, boolean cellHasFocus)
+ {
+ String filename = value.toString();
+ String displayFilename;
+ if (filename.length() > maxChars)
+ {
+ StringBuilder displayFileSB = new StringBuilder();
+ File file = new File(filename);
+ displayFileSB.append(file.getName());
+ if (file.getParent() != null)
+ {
+ File parent = file;
+ boolean spaceleft = true;
+ while (spaceleft && parent.getParent() != null)
+ {
+ parent = parent.getParentFile();
+ String name = parent.getName();
+ displayFileSB.insert(0, File.separator);
+ if (displayFileSB.length() + name.length() < maxChars - 1)
+ {
+ displayFileSB.insert(0, name);
+ }
+ else
+ {
+ displayFileSB.insert(0, ellipsis);
+ spaceleft = false;
+ }
+ }
+ if (spaceleft && filename.startsWith(File.separator)
+ && !(displayFileSB.charAt(0) == File.separatorChar))
+ {
+ displayFileSB.insert(0, File.separator);
+ }
+ }
+ displayFilename = displayFileSB.toString();
+ }
+ else
+ {
+ displayFilename = filename;
+ }
+ this.setText(displayFilename.toString());
+ this.setToolTipText(filename);
+ if (isSelected)
+ {
+ setBackground(list.getSelectionBackground());
+ setForeground(list.getSelectionForeground());
+ }
+ else
+ {
+ setBackground(list.getBackground());
+ setForeground(list.getForeground());
+ }
+ this.setHorizontalAlignment(SwingConstants.TRAILING);
+ this.setEnabled(list.isEnabled());
+ this.setFont(list.getFont().deriveFont(12f));
+ this.setOpaque(true);
+ return this;
+ }
+
+ }
+
+ /*
+ @Override
+ public JalviewFileChooser setResponseHandler(Object response,
+ Runnable action)
+ {
+ callbacks.put(response, new Callable<Void>()
+ {
+ @Override
+ public Void call()
+ {
+ action.run();
+ return null;
+ }
+ });
+ return this;
+ }
+ */
+
@Override
public DialogRunnerI setResponseHandler(Object response, Runnable action)
{
- callbacks.put(response, action);
- return this;
+ callbacks.put(response, action);
+ return this;
}
@Override
public void handleResponse(Object response)
{
/*
- * this test is for NaN in Chrome
- */
+ * this test is for NaN in Chrome
+ */
if (response != null && !response.equals(response))
{
return;
Runnable action = callbacks.get(response);
if (action != null)
{
- action.run();
+ try
+ {
+ action.run();
+ } catch (Exception e)
+ {
+ e.printStackTrace();
+ }
}
}
/**
- * JalviewJS signals file selection by a property change event
- * for property "SelectedFile". This methods responds to that by
- * running the response action for 'OK' in the dialog.
+ * JalviewJS signals file selection by a property change event for property
+ * "SelectedFile". This methods responds to that by running the response
+ * action for 'OK' in the dialog.
*
* @param evt
*/
/*
* property name here matches that used in JFileChooser.js
*/
- case "SelectedFile":
+ case "SelectedFile":
handleResponse(APPROVE_OPTION);
break;
}
}
+
+ @Override
+ protected JDialog createDialog(Component parent) throws HeadlessException
+ {
+ JDialog dialog = super.createDialog(parent);
+ dialog.setIconImages(ChannelProperties.getIconList());
+ return dialog;
+ }
+
}