import jalview.gui.JvOptionPane;
import jalview.util.MessageManager;
import jalview.util.Platform;
-import jalview.util.dialogrunner.DialogRunner;
import jalview.util.dialogrunner.DialogRunnerI;
-import jalview.util.dialogrunner.RunResponse;
import java.awt.Component;
import java.awt.Dimension;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.StringTokenizer;
import java.util.Vector;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SpringLayout;
-import javax.swing.SwingUtilities;
-import javax.swing.border.TitledBorder;
import javax.swing.plaf.basic.BasicFileChooserUI;
/**
{
private static final long serialVersionUID = 1L;
- private DialogRunnerI runner = new DialogRunner();
+ private Map<Object, Runnable> callbacks = new HashMap<>();
File selectedFile = null;
@Override
public int showOpenDialog(Component parent)
{
- // runner.resetResponses();
int value = super.showOpenDialog(this);
+
if (!Jalview.isJS())
{
- runner.handleResponse(value);
+ /*
+ * code here is not run in JalviewJS, instead
+ * propertyChange() is called for dialog action
+ */
+ handleResponse(value);
}
return value;
}
return f == null ? selectedFile : f;
}
- /**
- * 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 showSaveDialog(Component parent) throws HeadlessException
{
this.setAccessory(null);
+ // Java 9,10,11 on OSX - clear selected file so name isn't auto populated
this.setSelectedFile(null);
+
return super.showSaveDialog(parent);
}
}
}
- /**
- * A panel to set as the 'accessory' component to the file chooser dialog,
- * holding a list of recently opened files (if any). These are held as a
- * tab-separated list of file paths under key <code>RECENT_FILE</code> in
- * <code>.jalview_properties</code>. A click in the list calls a method in
- * JalviewFileChooser to set the chosen file as the selection.
- */
class RecentlyOpened extends JPanel
{
private static final long serialVersionUID = 1L;
-
JList<String> list;
RecentlyOpened()
if (historyItems != null)
{
st = new StringTokenizer(historyItems, "\t");
+
while (st.hasMoreTokens())
{
recent.addElement(st.nextToken());
}
});
- this.setBorder(new TitledBorder(
+ this.setBorder(new javax.swing.border.TitledBorder(
MessageManager.getString("label.recently_opened")));
final JScrollPane scroller = new JScrollPane(list);
this.add(scroller);
- SwingUtilities.invokeLater(new Runnable()
+ javax.swing.SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
.setValue(scroller.getHorizontalScrollBar().getMaximum());
}
});
+
}
+
}
@Override
- public DialogRunnerI addResponse(Object response, RunResponse action)
+ public DialogRunnerI setResponseHandler(Object response, Runnable action)
{
- return runner.addResponse(response, action);
+ callbacks.put(response, action);
+ return this;
+ }
+
+ @Override
+ public void handleResponse(Object response)
+ {
+ /*
+ * this test is for NaN in Chrome
+ */
+ if (response != null && !response.equals(response))
+ {
+ return;
+ }
+ Runnable action = callbacks.get(response);
+ if (action != null)
+ {
+ action.run();
+ }
}
/**
// TODO other properties need runners...
switch (evt.getPropertyName())
{
+ /*
+ * property name here matches that used in JFileChooser.js
+ */
case "SelectedFile":
- runner.handleResponse(APPROVE_OPTION);
+ handleResponse(APPROVE_OPTION);
break;
}
}