JAL-1742 don't offer to align another chain to the same structure
[jalview.git] / src / jalview / gui / ChimeraViewFrame.java
index 4b8fe50..4372617 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2b1)
- * 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.
  * 
  */
 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.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;
-
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.ItemEvent;
@@ -69,6 +45,30 @@ import javax.swing.event.InternalFrameEvent;
 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 handlnig an external chimera display
  * 
@@ -272,6 +272,14 @@ public class ChimeraViewFrame extends StructureViewerBase
     for (ChimeraViewFrame topView : existingViews)
     {
       // TODO: highlight topView in view somehow
+      /*
+       * JAL-1742 exclude view with this structure already mapped (don't offer
+       * to align chain B to chain A of the same structure)
+       */
+      if (topView.hasPdbId(pdbentry.getId()))
+      {
+        continue;
+      }
       int option = JOptionPane.showInternalConfirmDialog(Desktop.desktop,
               MessageManager.formatMessage("label.add_pdbentry_to_view",
                       new Object[]
@@ -296,6 +304,11 @@ public class ChimeraViewFrame extends StructureViewerBase
     { seq });
   }
 
+  protected boolean hasPdbId(String pdbId)
+  {
+    return jmb.hasPdbId(pdbId);
+  }
+
   private void openNewChimera(AlignmentPanel ap, PDBEntry[] pdbentrys,
           SequenceI[][] seqs)
   {
@@ -321,7 +334,7 @@ public class ChimeraViewFrame extends StructureViewerBase
     {
       public void internalFrameClosing(InternalFrameEvent internalFrameEvent)
       {
-        closeViewer();
+        closeViewer(false);
       }
     });
 
@@ -476,6 +489,8 @@ public class ChimeraViewFrame extends StructureViewerBase
       }
     }
     jmb.setFinishedInit(true);
+
+    jmb.startChimeraListener();
   }
 
   void setChainMenuItems(List<String> chainNames)
@@ -545,19 +560,26 @@ public class ChimeraViewFrame extends StructureViewerBase
    * Close down this instance of Jalview's Chimera viewer, giving the user the
    * option to close the associated Chimera window (process). They may wish to
    * keep it open until they have had an opportunity to save any work.
+   * 
+   * @param closeChimera
+   *          if true, close any linked Chimera process; if false, prompt first
    */
-  public void closeViewer()
+  public void closeViewer(boolean closeChimera)
   {
     if (jmb.isChimeraRunning())
     {
-      String prompt = MessageManager
-              .formatMessage("label.confirm_close_chimera", new Object[]
-              { jmb.getViewerTitle("Chimera", false) });
-      prompt = JvSwingUtils.wrapTooltip(true, prompt);
-      int confirm = JOptionPane.showConfirmDialog(this, prompt,
-              MessageManager.getString("label.close_viewer"),
-              JOptionPane.YES_NO_OPTION);
-      jmb.closeViewer(confirm == JOptionPane.YES_OPTION);
+      if (!closeChimera)
+      {
+        String prompt = MessageManager.formatMessage(
+                "label.confirm_close_chimera", new Object[]
+                { jmb.getViewerTitle("Chimera", false) });
+        prompt = JvSwingUtils.wrapTooltip(true, prompt);
+        int confirm = JOptionPane.showConfirmDialog(this, prompt,
+                MessageManager.getString("label.close_viewer"),
+                JOptionPane.YES_NO_OPTION);
+        closeChimera = confirm == JOptionPane.YES_OPTION;
+      }
+      jmb.closeViewer(closeChimera);
     }
     setAlignmentPanel(null);
     _aps.clear();
@@ -776,8 +798,8 @@ public class ChimeraViewFrame extends StructureViewerBase
     if (pdbseq != null && pdbseq.getHeight() > 0)
     {
       // just use the file name from the first sequence's first PDBEntry
-      filePath = new File(((PDBEntry) pdbseq.getSequenceAt(0).getPDBId()
-              .elementAt(0)).getFile()).getAbsolutePath();
+      filePath = new File(pdbseq.getSequenceAt(0).getPDBId()
+              .elementAt(0).getFile()).getAbsolutePath();
       processingEntry.setFile(filePath);
     }
     return filePath;