*/
package jalview.gui;
+import jalview.bin.Cache;
+import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.PDBEntry;
+import jalview.datamodel.SequenceI;
+import jalview.ext.rbvi.chimera.JalviewChimeraBinding;
+import jalview.gui.StructureViewer.ViewerType;
+import jalview.io.AppletFormatAdapter;
+import jalview.io.JalviewFileChooser;
+import jalview.io.JalviewFileView;
+import jalview.schemes.BuriedColourScheme;
+import jalview.schemes.ColourSchemeI;
+import jalview.schemes.HelixColourScheme;
+import jalview.schemes.HydrophobicColourScheme;
+import jalview.schemes.PurinePyrimidineColourScheme;
+import jalview.schemes.StrandColourScheme;
+import jalview.schemes.TaylorColourScheme;
+import jalview.schemes.TurnColourScheme;
+import jalview.schemes.ZappoColourScheme;
+import jalview.structures.models.AAStructureBindingModel;
+import jalview.util.BrowserLauncher;
+import jalview.util.MessageManager;
+import jalview.util.Platform;
+import jalview.ws.dbsources.Pdb;
+
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.BufferedReader;
import java.io.File;
+import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
+import java.io.InputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import javax.swing.event.MenuEvent;
import javax.swing.event.MenuListener;
-import jalview.bin.Cache;
-import jalview.datamodel.Alignment;
-import jalview.datamodel.AlignmentI;
-import jalview.datamodel.ColumnSelection;
-import jalview.datamodel.PDBEntry;
-import jalview.datamodel.SequenceI;
-import jalview.ext.rbvi.chimera.JalviewChimeraBinding;
-import jalview.io.AppletFormatAdapter;
-import jalview.io.JalviewFileChooser;
-import jalview.io.JalviewFileView;
-import jalview.schemes.BuriedColourScheme;
-import jalview.schemes.ColourSchemeI;
-import jalview.schemes.HelixColourScheme;
-import jalview.schemes.HydrophobicColourScheme;
-import jalview.schemes.PurinePyrimidineColourScheme;
-import jalview.schemes.StrandColourScheme;
-import jalview.schemes.TaylorColourScheme;
-import jalview.schemes.TurnColourScheme;
-import jalview.schemes.ZappoColourScheme;
-import jalview.structures.models.AAStructureBindingModel;
-import jalview.util.MessageManager;
-import jalview.util.Platform;
-import jalview.ws.dbsources.Pdb;
-
/**
* GUI elements for handling an external chimera display
*
/**
* Create a new viewer from saved session state data including Chimera session
- * file.
- *
- * @param chimeraSession
+ * file
*
+ * @param chimeraSessionFile
* @param alignPanel
* @param pdbArray
* @param seqsArray
* @param colourByChimera
* @param colourBySequence
+ * @param newViewId
*/
- public ChimeraViewFrame(String chimeraSession, AlignmentPanel alignPanel,
+ public ChimeraViewFrame(String chimeraSessionFile,
+ AlignmentPanel alignPanel,
PDBEntry[] pdbArray,
SequenceI[][] seqsArray, boolean colourByChimera,
- boolean colourBySequence)
+ boolean colourBySequence, String newViewId)
{
super();
- this.chimeraSessionFile = chimeraSession;
+ setViewId(newViewId);
+ this.chimeraSessionFile = chimeraSessionFile;
openNewChimera(alignPanel, pdbArray, seqsArray);
if (colourByChimera)
{
void initChimera()
{
jmb.setFinishedInit(false);
- jalview.gui.Desktop.addInternalFrame(this, jmb.getViewerTitle("Chimera", true),
+ Desktop.addInternalFrame(this, jmb.getViewerTitle("Chimera", true),
getBounds().width, getBounds().height);
- jmb.launchChimera();
+ if (!jmb.launchChimera())
+ {
+ JOptionPane
+ .showMessageDialog(
+ Desktop.desktop,
+ MessageManager.getString("label.chimera_failed"),
+ MessageManager.getString("label.error_loading_file"),
+ JOptionPane.ERROR_MESSAGE);
+ this.dispose();
+ return;
+ }
if (this.chimeraSessionFile != null)
{
public void pdbFile_actionPerformed(ActionEvent actionEvent)
{
JalviewFileChooser chooser = new JalviewFileChooser(
- jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
+ Cache.getProperty("LAST_DIRECTORY"));
chooser.setFileView(new JalviewFileView());
chooser.setDialogTitle(MessageManager.getString("label.save_pdb_file"));
@Override
public void viewMapping_actionPerformed(ActionEvent actionEvent)
{
- jalview.gui.CutAndPasteTransfer cap = new jalview.gui.CutAndPasteTransfer();
+ CutAndPasteTransfer cap = new CutAndPasteTransfer();
try
{
cap.appendText(jmb.printMappings());
cap.dispose();
return;
}
- jalview.gui.Desktop.addInternalFrame(cap,
+ Desktop.addInternalFrame(cap,
MessageManager.getString("label.pdb_sequence_mapping"), 550,
600);
}
{
try
{
- jalview.util.BrowserLauncher
+ BrowserLauncher
.openURL("https://www.cgl.ucsf.edu/chimera/docs/UsersGuide");
} catch (Exception ex)
{
}
/**
- * Ask Chimera to save its session to the designated file path. Returns true
- * if successful, else false.
+ * Ask Chimera to save its session to the designated file path, or to a
+ * temporary file if the path is null. Returns the file path if successful,
+ * else null.
*
* @param filepath
* @see getStateInfo
*/
- public boolean saveSession(String filepath)
+ protected String saveSession(String filepath)
{
- boolean result = jmb.saveSession(filepath);
- if (result)
+ String pathUsed = filepath;
+ try
+ {
+ if (pathUsed == null)
+ {
+ File tempFile = File.createTempFile("chimera", ".py");
+ tempFile.deleteOnExit();
+ pathUsed = tempFile.getPath();
+ }
+ boolean result = jmb.saveSession(pathUsed);
+ if (result)
+ {
+ this.chimeraSessionFile = pathUsed;
+ return pathUsed;
+ }
+ } catch (IOException e)
{
- this.chimeraSessionFile = filepath;
}
- return result;
+ return null;
}
/**
- * Returns the file path of the Chimera session file the last time it was
- * saved. If it was never saved, returns an empty string. There is no
- * guarantee that the Chimera session has not changed since it was saved.
+ * Returns a string representing the state of the Chimera session. This is
+ * done by requesting Chimera to save its session to a temporary file, then
+ * reading the file contents. Returns an empty string on any error.
*/
@Override
public String getStateInfo()
{
- return this.chimeraSessionFile == null ? "" : chimeraSessionFile;
+ String sessionFile = saveSession(null);
+ if (sessionFile == null)
+ {
+ return "";
+ }
+ InputStream is = null;
+ try
+ {
+ File f = new File(sessionFile);
+ byte[] bytes = new byte[(int) f.length()];
+ is = new FileInputStream(sessionFile);
+ is.read(bytes);
+ return new String(bytes);
+ } catch (IOException e)
+ {
+ return "";
+ } finally
+ {
+ if (is != null)
+ {
+ try
+ {
+ is.close();
+ } catch (IOException e)
+ {
+ // ignore
+ }
+ }
+ }
}
@Override
{
jmb.focusView();
}
+
+ @Override
+ public ViewerType getViewerType()
+ {
+ return ViewerType.CHIMERA;
+ }
}