X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FChimeraViewFrame.java;h=83ea3792c28c2f35396e8bc6cf9bad159e0cae98;hb=8e82fa3fbc38ce89f59fde4440830a83bf95289e;hp=567a14cb80ecaf3d5819d21c9b66eedb5e424331;hpb=c66902a9536b10a5477b58aaf7c2d75772890a5d;p=jalview.git diff --git a/src/jalview/gui/ChimeraViewFrame.java b/src/jalview/gui/ChimeraViewFrame.java index 567a14c..83ea379 100644 --- a/src/jalview/gui/ChimeraViewFrame.java +++ b/src/jalview/gui/ChimeraViewFrame.java @@ -1,6 +1,6 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2) - * Copyright (C) 2014 The Jalview Authors + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors * * This file is part of Jalview. * @@ -27,11 +27,9 @@ import jalview.datamodel.ColumnSelection; import jalview.datamodel.PDBEntry; import jalview.datamodel.SequenceI; import jalview.ext.rbvi.chimera.JalviewChimeraBinding; -import jalview.gui.ViewSelectionMenu.ViewSetProvider; import jalview.io.AppletFormatAdapter; import jalview.io.JalviewFileChooser; import jalview.io.JalviewFileView; -import jalview.jbgui.GStructureViewer; import jalview.schemes.BuriedColourScheme; import jalview.schemes.ColourSchemeI; import jalview.schemes.HelixColourScheme; @@ -46,7 +44,6 @@ import jalview.util.MessageManager; import jalview.util.Platform; import jalview.ws.dbsources.Pdb; -import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; @@ -78,8 +75,7 @@ import javax.swing.event.MenuListener; * @author jprocter * */ -public class ChimeraViewFrame extends GStructureViewer implements Runnable, - ViewSetProvider +public class ChimeraViewFrame extends StructureViewerBase { private JalviewChimeraBinding jmb; @@ -87,8 +83,6 @@ public class ChimeraViewFrame extends GStructureViewer implements Runnable, private boolean alignAddedStructures = false; - AlignmentPanel ap; - /* * state flag for PDB retrieval thread */ @@ -103,6 +97,13 @@ public class ChimeraViewFrame extends GStructureViewer implements Runnable, */ private Thread worker = null; + /* + * Path to Chimera session file. This is set when an open Jalview/Chimera + * session is saved, or on restore from a Jalview project (if it holds the + * filename of any saved Chimera sessions). + */ + private String chimeraSessionFile = null; + /** * Initialise menu options. */ @@ -252,7 +253,7 @@ public class ChimeraViewFrame extends GStructureViewer implements Runnable, topView.addAlignmentPanel(ap); // add it to the set used for colouring topView.useAlignmentPanelForColourbyseq(ap); - topView.buildChimeraActionMenu(); + topView.buildActionMenu(); ap.getStructureSelectionManager() .sequenceColoursChanged(ap); break; @@ -311,12 +312,11 @@ public class ChimeraViewFrame extends GStructureViewer implements Runnable, jmb.setColourBySequence(true); setSize(400, 400); // probably should be a configurable/dynamic default here initMenus(); - worker = null; - { - addingStructures = false; - worker = new Thread(this); - worker.start(); - } + + addingStructures = false; + worker = new Thread(this); + worker.start(); + this.addInternalFrameListener(new InternalFrameAdapter() { public void internalFrameClosing(InternalFrameEvent internalFrameEvent) @@ -342,114 +342,37 @@ public class ChimeraViewFrame extends GStructureViewer implements Runnable, openNewChimera(ap, pe, seqs); } - public AlignmentPanel[] getAllAlignmentPanels() - { - AlignmentPanel[] t, list = new AlignmentPanel[0]; - for (String setid : _aps) - { - AlignmentPanel[] panels = PaintRefresher.getAssociatedPanels(setid); - if (panels != null) - { - t = new AlignmentPanel[list.length + panels.length]; - System.arraycopy(list, 0, t, 0, list.length); - System.arraycopy(panels, 0, t, list.length, panels.length); - list = t; - } - } - - return list; - } - /** - * set the primary alignmentPanel reference and add another alignPanel to the - * list of ones to use for colouring and aligning + * Create a new viewer from saved session state data including Chimera session + * file. * - * @param nap - */ - public void addAlignmentPanel(AlignmentPanel nap) - { - if (ap == null) - { - ap = nap; - } - if (!_aps.contains(nap.av.getSequenceSetId())) - { - _aps.add(nap.av.getSequenceSetId()); - } - } - - /** - * remove any references held to the given alignment panel + * @param chimeraSession * - * @param nap + * @param alignPanel + * @param pdbArray + * @param seqsArray + * @param colourByChimera + * @param colourBySequence */ - public void removeAlignmentPanel(AlignmentPanel nap) - { - try - { - _alignwith.remove(nap); - _colourwith.remove(nap); - if (ap == nap) - { - ap = null; - for (AlignmentPanel aps : getAllAlignmentPanels()) - { - if (aps != nap) - { - ap = aps; - break; - } - } - } - } catch (Exception ex) - { - } - if (ap != null) - { - buildChimeraActionMenu(); - } - } - - public void useAlignmentPanelForSuperposition(AlignmentPanel nap) - { - addAlignmentPanel(nap); - if (!_alignwith.contains(nap)) - { - _alignwith.add(nap); - } - } - - public void excludeAlignmentPanelForSuperposition(AlignmentPanel nap) + public ChimeraViewFrame(String chimeraSession, AlignmentPanel alignPanel, + PDBEntry[] pdbArray, + SequenceI[][] seqsArray, boolean colourByChimera, + boolean colourBySequence) { - if (_alignwith.contains(nap)) + super(); + this.chimeraSessionFile = chimeraSession; + openNewChimera(alignPanel, pdbArray, seqsArray); + if (colourByChimera) { - _alignwith.remove(nap); + jmb.setColourBySequence(false); + seqColour.setSelected(false); + viewerColour.setSelected(true); } - } - - public void useAlignmentPanelForColourbyseq(AlignmentPanel nap, - boolean enableColourBySeq) - { - useAlignmentPanelForColourbyseq(nap); - jmb.setColourBySequence(enableColourBySeq); - seqColour.setSelected(enableColourBySeq); - viewerColour.setSelected(!enableColourBySeq); - } - - public void useAlignmentPanelForColourbyseq(AlignmentPanel nap) - { - addAlignmentPanel(nap); - if (!_colourwith.contains(nap)) + else if (colourBySequence) { - _colourwith.add(nap); - } - } - - public void excludeAlignmentPanelForColourbyseq(AlignmentPanel nap) - { - if (_colourwith.contains(nap)) - { - _colourwith.remove(nap); + jmb.setColourBySequence(true); + seqColour.setSelected(true); + viewerColour.setSelected(false); } } @@ -518,7 +441,7 @@ public class ChimeraViewFrame extends GStructureViewer implements Runnable, { if (frame instanceof ChimeraViewFrame) { - if (((ChimeraViewFrame) frame).isLinkedWith(apanel)) + if (((StructureViewerBase) frame).isLinkedWith(apanel)) { result.add((ChimeraViewFrame) frame); } @@ -527,18 +450,31 @@ public class ChimeraViewFrame extends GStructureViewer implements Runnable, return result; } - void initChimera(String command) + /** + * Launch Chimera. If we have a chimera session file name, send Chimera the + * command to open its saved session file. + */ + void initChimera() { jmb.setFinishedInit(false); - // TODO: consider waiting until the structure/view is fully loaded before - // displaying jalview.gui.Desktop.addInternalFrame(this, jmb.getViewerTitle("Chimera", true), getBounds().width, getBounds().height); - if (command == null) + + /* + * Pass an empty 'command' to launch Chimera + */ + jmb.evalStateCommand("", false); + + if (this.chimeraSessionFile != null) { - command = ""; + boolean opened = jmb.openSession(chimeraSessionFile); + if (!opened) + { + System.err + .println("An error occurred opening Chimera session file " + + chimeraSessionFile); + } } - jmb.evalStateCommand(command, false); jmb.setFinishedInit(true); } @@ -623,7 +559,7 @@ public class ChimeraViewFrame extends GStructureViewer implements Runnable, JOptionPane.YES_NO_OPTION); jmb.closeViewer(confirm == JOptionPane.YES_OPTION); } - ap = null; + setAlignmentPanel(null); _aps.clear(); _alignwith.clear(); _colourwith.clear(); @@ -719,7 +655,7 @@ public class ChimeraViewFrame extends GStructureViewer implements Runnable, { try { - initChimera(""); + initChimera(); } catch (Exception ex) { Cache.log.error("Couldn't open Chimera viewer!", ex); @@ -959,16 +895,16 @@ public class ChimeraViewFrame extends GStructureViewer implements Runnable, { if (!jmb.isLoadingFromArchive()) { - if (_colourwith.size() == 0 && ap != null) + if (_colourwith.size() == 0 && getAlignmentPanel() != null) { // Make the currently displayed alignment panel the associated view - _colourwith.add(ap.alignFrame.alignPanel); + _colourwith.add(getAlignmentPanel().alignFrame.alignPanel); } } // Set the colour using the current view for the associated alignframe for (AlignmentPanel ap : _colourwith) { - jmb.colourBySequence(ap.av.showSequenceFeatures, ap); + jmb.colourBySequence(ap.av.isShowSequenceFeatures(), ap); } } } @@ -1080,7 +1016,7 @@ public class ChimeraViewFrame extends GStructureViewer implements Runnable, repaint(); return; } - setChainMenuItems(jmb.chainNames); + setChainMenuItems(jmb.getChainNames()); this.setTitle(jmb.getViewerTitle("Chimera", true)); if (jmb.getPdbFile().length > 1 && jmb.getSequence().length > 1) @@ -1093,26 +1029,6 @@ public class ChimeraViewFrame extends GStructureViewer implements Runnable, } } - protected void buildChimeraActionMenu() - { - if (_alignwith == null) - { - _alignwith = new Vector(); - } - if (_alignwith.size() == 0 && ap != null) - { - _alignwith.add(ap); - } - ; - for (Component c : viewerActionMenu.getMenuComponents()) - { - if (c != alignStructs) - { - viewerActionMenu.remove((JMenuItem) c); - } - } - } - /* * (non-Javadoc) * @@ -1128,14 +1044,14 @@ public class ChimeraViewFrame extends GStructureViewer implements Runnable, private void alignStructs_withAllAlignPanels() { - if (ap == null) + if (getAlignmentPanel() == null) { return; } ; if (_alignwith.size() == 0) { - _alignwith.add(ap); + _alignwith.add(getAlignmentPanel()); } ; try @@ -1187,7 +1103,7 @@ public class ChimeraViewFrame extends GStructureViewer implements Runnable, return ap; } } - return ap; + return getAlignmentPanel(); } @Override @@ -1201,9 +1117,26 @@ public class ChimeraViewFrame extends GStructureViewer implements Runnable, * if successful, else false. * * @param filepath + * @see getStateInfo */ public boolean saveSession(String filepath) { - return jmb.saveSession(filepath); + boolean result = jmb.saveSession(filepath); + if (result) + { + this.chimeraSessionFile = filepath; + } + return result; + } + + /** + * 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. + */ + @Override + public String getStateInfo() + { + return this.chimeraSessionFile; } }