import jalview.util.MessageManager;
import jalview.util.Platform;
import jalview.util.UrlConstants;
-import jalview.util.dialogrunner.RunResponse;
import jalview.viewmodel.AlignmentViewport;
import jalview.ws.params.ParamManager;
import jalview.ws.utils.UrlDownloadClient;
import java.util.Hashtable;
import java.util.List;
import java.util.ListIterator;
-import java.util.StringTokenizer;
import java.util.Vector;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JProgressBar;
+import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.event.HyperlinkEvent;
*/
public Desktop()
{
+ super();
/**
* A note to implementors. It is ESSENTIAL that any activities that might block
* are spawned off as threads rather than waited for during this constructor.
boolean showjconsole = jalview.bin.Cache.getDefault("SHOW_JAVA_CONSOLE",
false);
desktop = new MyDesktopPane(selmemusage);
+
+
showMemusage.setSelected(selmemusage);
desktop.setBackground(Color.white);
getContentPane().setLayout(new BorderLayout());
// JScrollPane sp = new JScrollPane();
// sp.getViewport().setView(desktop);
// getContentPane().add(sp, BorderLayout.CENTER);
+
+ // BH 2018 - just an experiment to try unclipped JInternalFrames.
+ // Must set for all three to be active:
+ if (Jalview.isJS())
+ {
+ getRootPane().putClientProperty("swingjs.overflow.hidden", "false");
+ ((JComponent) getContentPane()).putClientProperty("swingjs.overflow.hidden", "false");
+ desktop.putClientProperty("swingjs.overflow.hidden", "false");
+ }
+
getContentPane().add(desktop, BorderLayout.CENTER);
desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
-
+
// This line prevents Windows Look&Feel resizing all new windows to maximum
// if previous window was maximised
desktop.setDesktopManager(new MyDesktopManager(
{
final Desktop me = this;
// Thread off the news reader, in case there are connection problems.
- addDialogThread(new Runnable()
+ new Thread(new Runnable()
{
@Override
public void run()
showNews.setVisible(true);
Cache.log.debug("Completed news thread.");
}
- });
+ }).start();
}
public void getIdentifiersOrgData()
{
// Thread off the identifiers fetcher
- addDialogThread(new Runnable()
+ new Thread(new Runnable()
{
@Override
public void run()
+ e.getMessage());
}
}
- });
+ }).start();
+ ;
}
@Override
MessageManager.getString("label.open_local_file"));
chooser.setToolTipText(MessageManager.getString("action.open"));
- chooser.response(new RunResponse(JalviewFileChooser.APPROVE_OPTION)
+ chooser.setResponseHandler(0, new Runnable()
{
-
@Override
public void run()
{
new FileLoader().LoadFile(viewport, selectedFile,
DataSourceType.FILE, format);
}
- }).openDialog(this);
+ });
+ chooser.showOpenDialog(this);
}
/**
- * DOCUMENT ME!
+ * Shows a dialog for input of a URL at which to retrieve alignment data
*
- * @param e
- * DOCUMENT ME!
+ * @param viewport
*/
@Override
public void inputURLMenuItem_actionPerformed(AlignViewport viewport)
JLabel label = new JLabel(
MessageManager.getString("label.input_file_url"));
- JComboBox history = new JComboBox();
JPanel panel = new JPanel(new GridLayout(2, 1));
panel.add(label);
- panel.add(history);
- history.setPreferredSize(new Dimension(400, 20));
- history.setEditable(true);
- history.addItem("http://www.");
-
- String historyItems = jalview.bin.Cache.getProperty("RECENT_URL");
-
- StringTokenizer st;
-
- if (historyItems != null)
+
+ /*
+ * the URL to fetch is
+ * Java: an editable combobox with history
+ * JS: (pending JAL-3038) a plain text field
+ */
+ JComponent history;
+ String urlBase = "http://www.";
+ if (Jalview.isJS())
{
- st = new StringTokenizer(historyItems, "\t");
-
- while (st.hasMoreTokens())
+ history = new JTextField(urlBase, 35);
+ }
+ else
+ {
+ JComboBox<String> asCombo = new JComboBox<>();
+ asCombo.setPreferredSize(new Dimension(400, 20));
+ asCombo.setEditable(true);
+ asCombo.addItem(urlBase);
+ String historyItems = Cache.getProperty("RECENT_URL");
+ if (historyItems != null)
{
- history.addItem(st.nextElement());
+ for (String token : historyItems.split("\\t"))
+ {
+ asCombo.addItem(token);
+ }
}
+ history = asCombo;
}
+ panel.add(history);
+
+ Object[] options = new Object[] { MessageManager.getString("action.ok"),
+ MessageManager.getString("action.cancel") };
+ Runnable action = new Runnable() {
+ @Override
+ public void run()
+ {
+ String url = Jalview.isJS() ? ((JTextField) history).getText()
+ : ((JComboBox<String>) history).getSelectedItem()
+ .toString();
- // BH 2018 -- providing a callback for SwingJS
- // dialogOption is just a simple way to provide
- // context for the modal-like response.
- // The only requirement is that desktop implement
- // PropertyChangeListener, which is used already in Java
- // for changes in input value and such within the dialogs.
+ if (url.toLowerCase().endsWith(".jar"))
+ {
+ if (viewport != null)
+ {
+ new FileLoader().LoadFile(viewport, url, DataSourceType.URL,
+ FileFormat.Jalview);
+ }
+ else
+ {
+ new FileLoader().LoadFile(url, DataSourceType.URL,
+ FileFormat.Jalview);
+ }
+ }
+ else
+ {
+ FileFormatI format = null;
+ try
+ {
+ format = new IdentifyFile().identify(url, DataSourceType.URL);
+ } catch (FileFormatException e)
+ {
+ // TODO revise error handling, distinguish between
+ // URL not found and response not valid
+ }
- String dialogOption = "label.input_alignment_from_url";
- desktop.dialogData = new Object[] { dialogOption, viewport, history };
- desktop.onDialogReturn(JvOptionPane.showInternalConfirmDialog(desktop,
- panel, MessageManager.getString(dialogOption),
- JvOptionPane.OK_CANCEL_OPTION));
+ if (format == null)
+ {
+ String msg = MessageManager.formatMessage("label.couldnt_locate", url);
+ JvOptionPane.showInternalMessageDialog(Desktop.desktop, msg,
+ MessageManager.getString("label.url_not_found"),
+ JvOptionPane.WARNING_MESSAGE);
- // no code may follow this, as SwingJS will not block
- // callback in JavaScript comes via a property change event,
- // thus going into desktop.onDialogReturn(int) just the same as
- // in Java.
+ return;
+ }
+ if (viewport != null)
+ {
+ new FileLoader().LoadFile(viewport, url, DataSourceType.URL,
+ format);
+ }
+ else
+ {
+ new FileLoader().LoadFile(url, DataSourceType.URL, format);
+ }
+ }
+ }};
+ String dialogOption = MessageManager
+ .getString("label.input_alignment_from_url");
+ JvOptionPane.newOptionDialog(desktop).setResponseHandler(0, action)
+ .showInternalDialog(panel, dialogOption,
+ JvOptionPane.YES_NO_CANCEL_OPTION,
+ JvOptionPane.PLAIN_MESSAGE, null, options,
+ MessageManager.getString("action.ok"));
}
/**
* Jalview project file
*/
@Override
- public void saveState_actionPerformed()
+ public void saveState_actionPerformed(boolean asCastor)
{
- JalviewFileChooser chooser = new JalviewFileChooser("jvp",
+ JalviewFileChooser chooser = new JalviewFileChooser(
+ asCastor ? "jvp" : "jvx",
"Jalview Project");
chooser.setFileView(new JalviewFileView());
chooser.setDialogTitle(MessageManager.getString("label.save_state"));
-
- int value = chooser.showSaveDialog(this);
-
- if (value == JalviewFileChooser.APPROVE_OPTION)
+ int option = chooser.showSaveDialog(this);
+ if (option == JalviewFileChooser.APPROVE_OPTION)
{
- final Desktop me = this;
- final java.io.File choice = chooser.getSelectedFile();
+ File choice = chooser.getSelectedFile();
setProjectFile(choice);
new Thread(new Runnable()
// TODO prevent user from messing with the Desktop whilst we're saving
try
{
- new Jalview2XML().saveState(choice);
+ if (asCastor)
+ {
+ new Jalview2XML().saveState(choice);
+ }
+ else
+ {
+ new jalview.project.Jalview2XML().saveState(choice);
+ }
} catch (OutOfMemoryError oom)
{
new OOMWarning(
Cache.log.error(
"Problems whilst trying to save to " + choice.getName(),
ex);
- JvOptionPane.showMessageDialog(me,
+ JvOptionPane.showMessageDialog(Desktop.this,
MessageManager.formatMessage(
"label.error_whilst_saving_current_state_to",
new Object[]
setProgressBar(null, choice.hashCode());
}
}).start();
- }
+ }
}
- private void setProjectFile(File choice)
+ void setProjectFile(File choice)
{
this.projectFile = choice;
}
* Prompts the user to choose a file and loads in as a Jalview project file
*/
@Override
- public void loadState_actionPerformed()
- {
+ public void loadState_actionPerformed(boolean asCastor)
+ {
+ // TODO: GET RID OF .JVX BEFORE RELEASE JIM!
+ final String[] suffix = asCastor ? new String[] { "jvp", "jar" }
+ : new String[]
+ { "jvx" };
+ final String[] desc = asCastor
+ ? new String[]
+ { "Jalview Project", "Jalview Project (old)" }
+ : new String[]
+ { "Jalview Project" };
JalviewFileChooser chooser = new JalviewFileChooser(
- Cache.getProperty("LAST_DIRECTORY"), new String[]
- { "jvp", "jar" },
- new String[]
- { "Jalview Project", "Jalview Project (old)" },
+ Cache.getProperty("LAST_DIRECTORY"), suffix,
+ desc,
"Jalview Project");
chooser.setFileView(new JalviewFileView());
chooser.setDialogTitle(MessageManager.getString("label.restore_state"));
-
- int value = chooser.showOpenDialog(this);
-
- if (value == JalviewFileChooser.APPROVE_OPTION)
+ chooser.setResponseHandler(0, new Runnable()
{
- final File selectedFile = chooser.getSelectedFile();
- setProjectFile(selectedFile);
- final String choice = selectedFile.getAbsolutePath();
- Cache.setProperty("LAST_DIRECTORY", selectedFile.getParent());
- new Thread(new Runnable()
+ @Override
+ public void run()
{
- @Override
- public void run()
+ File selectedFile = chooser.getSelectedFile();
+ setProjectFile(selectedFile);
+ final String choice = selectedFile.getAbsolutePath();
+ Cache.setProperty("LAST_DIRECTORY", selectedFile.getParent());
+ new Thread(new Runnable()
{
- setProgressBar(MessageManager.formatMessage(
- "label.loading_jalview_project", new Object[]
- { choice }), choice.hashCode());
- try
- {
- new Jalview2XML().loadJalviewAlign(choice);
- } catch (OutOfMemoryError oom)
+ @Override
+ public void run()
{
+ try {
+ if (asCastor)
+ {
+ new Jalview2XML().loadJalviewAlign(choice);
+ }
+ else
+ {
+ new jalview.project.Jalview2XML().loadJalviewAlign(choice);
+ }
+ } catch (OutOfMemoryError oom)
+ {
new OOMWarning("Whilst loading project from " + choice, oom);
- } catch (Exception ex)
- {
+ } catch (Exception ex)
+ {
Cache.log.error(
"Problems whilst loading project from " + choice, ex);
JvOptionPane.showMessageDialog(Desktop.desktop,
{ choice }),
MessageManager.getString("label.couldnt_load_project"),
JvOptionPane.WARNING_MESSAGE);
+ }
}
- setProgressBar(null, choice.hashCode());
- }
- }).start();
- }
+ }).start();
+ }
+ });
+
+ chooser.showOpenDialog(this);
}
@Override
* @author AMW
*/
public class MyDesktopPane extends JDesktopPane
- implements Runnable, PropertyChangeListener
+ implements Runnable
{
-
- public Object[] dialogData;
-
- // @Override
- @Override
- public void propertyChange(PropertyChangeEvent event)
- {
- // TODO this is obsolete with JAL-3048 - delete?
- Object val = event.getNewValue();
- String name = event.getPropertyName();
- System.out.println(name);
- switch (event.getSource().getClass().getName())
- {
- case "javax.swing.JOptionPane":
- switch (name)
- {
- case "inputValue":
- onDialogReturn(val);
- return;
- case "value":
- if (val instanceof Integer)
- {
- onDialogReturn(((Integer) val).intValue());
- }
- else
- {
- onDialogReturn(val);
- }
- return;
- }
- break;
- case "javax.swing.JFileChooser":
- switch (name)
- {
- case "SelectedFile":
- // in JavaScript, this File object will have a _bytes property,
- // because the file data has already been loaded
- onDialogReturn(new Object[] { (File) val });
- return;
- }
- break;
- }
- System.out.println(event.getSource().getClass().getName() + " "
- + event.getPropertyName() + ": " + event.getNewValue());
- }
-
- // JSCOmponent.DialogCaller interface
- void onDialogReturn(Object value)
- {
- switch ((String) dialogData[0])
- {
- case "SelectedFile":
- case "runnable":
- dialogData[0] = value;
- ((Runnable) dialogData[1]).run();
- break;
- default:
- }
- }
-
- // JSCOmponent.DialogCaller interface
- void onDialogReturn(int value)
- {
- if (value != Math.floor(value))
- {
- // in JavaScript, this will be NaN, oddly enough
- return;
- }
-
- switch ((String) dialogData[0])
- {
- case "runnable":
- dialogData[0] = Integer.valueOf(value);
- ((Runnable) dialogData[1]).run();
- break;
- case "label.input_alignment_from_url":
- // reconstruct the parameter data
- int reply = value;
- AlignViewport viewport = (AlignViewport) dialogData[1];
- JComboBox history = (JComboBox) dialogData[2];
- // the rest of this is unchangaed
- if (reply != JvOptionPane.OK_OPTION)
- {
- return;
- }
-
- String url = history.getSelectedItem().toString();
-
- if (url.toLowerCase().endsWith(".jar"))
- {
- if (viewport != null)
- {
- new FileLoader().LoadFile(viewport, url, DataSourceType.URL,
- FileFormat.Jalview);
- }
- else
- {
- new FileLoader().LoadFile(url, DataSourceType.URL,
- FileFormat.Jalview);
- }
- }
- else
- {
- FileFormatI format = null;
- try
- {
- format = new IdentifyFile().identify(url, DataSourceType.URL);
- } catch (FileFormatException e)
- {
- // TODO revise error handling, distinguish between
- // URL not found and response not valid
- }
-
- if (format == null)
- {
- JvOptionPane.showInternalMessageDialog(Desktop.desktop,
- MessageManager.formatMessage("label.couldnt_locate",
- new Object[]
- { url }),
- MessageManager.getString("label.url_not_found"),
- JvOptionPane.WARNING_MESSAGE);
-
- return;
- }
-
- if (viewport != null)
- {
- new FileLoader().LoadFile(viewport, url, DataSourceType.URL,
- format);
- }
- else
- {
- new FileLoader().LoadFile(url, DataSourceType.URL, format);
- }
- }
-
- break;
- }
-
- }
-
private static final float ONE_MB = 1048576f;
boolean showMemoryUsage = false;