JAL-2465 bugfix and rerefactor renamed getPdbFile() method to getStructureFile()
[jalview.git] / src / jalview / gui / StructureViewerBase.java
index 808150f..6e7936b 100644 (file)
@@ -309,6 +309,10 @@ public abstract class StructureViewerBase extends GStructureViewer
 
   public abstract ViewerType getViewerType();
 
+  protected abstract AAStructureBindingModel getBindingModel();
+
+  protected abstract IProgressIndicator getIProgressIndicator();
+
   /**
    * add a new structure (with associated sequences and chains) to this viewer,
    * retrieving it if necessary first.
@@ -457,7 +461,7 @@ public abstract class StructureViewerBase extends GStructureViewer
      * create the mappings
      */
     apanel.getStructureSelectionManager().setMapping(seq, chains,
-            pdbFilename, DataSourceType.FILE);
+            pdbFilename, DataSourceType.FILE, getIProgressIndicator());
 
     /*
      * alert the FeatureRenderer to show new (PDB RESNUM) features
@@ -749,14 +753,14 @@ public abstract class StructureViewerBase extends GStructureViewer
         alignStructs.setEnabled(!_alignwith.isEmpty());
         alignStructs.setToolTipText(MessageManager.formatMessage(
                 "label.align_structures_using_linked_alignment_views",
-                new String[] { String.valueOf(_alignwith.size()) }));
+                _alignwith.size()));
       }
     };
     viewSelectionMenu = new ViewSelectionMenu(
             MessageManager.getString("label.superpose_with"), this,
             _alignwith, handler);
     handler.itemStateChanged(null);
-    viewerActionMenu.add(viewSelectionMenu);
+    viewerActionMenu.add(viewSelectionMenu, 0);
     viewerActionMenu.addMenuListener(new MenuListener()
     {
       @Override
@@ -783,16 +787,24 @@ public abstract class StructureViewerBase extends GStructureViewer
   public void setJalviewColourScheme(ColourSchemeI cs) {
     getBinding().setJalviewColourScheme(cs);
   }
+
+  /**
+   * Sends commands to the structure viewer to superimpose structures based on
+   * currently associated alignments. May optionally return an error message for
+   * the operation.
+   */
   @Override
-  protected void alignStructs_actionPerformed(ActionEvent actionEvent)
+  protected String alignStructs_actionPerformed(
+          ActionEvent actionEvent)
   {
-    alignStructs_withAllAlignPanels();
+    return alignStructs_withAllAlignPanels();
   }
-  protected void alignStructs_withAllAlignPanels()
+
+  protected String alignStructs_withAllAlignPanels()
   {
     if (getAlignmentPanel() == null)
     {
-      return;
+      return null;
     }
   
     if (_alignwith.size() == 0)
@@ -800,6 +812,7 @@ public abstract class StructureViewerBase extends GStructureViewer
       _alignwith.add(getAlignmentPanel());
     }
   
+    String reply = null;
     try
     {
       AlignmentI[] als = new Alignment[_alignwith.size()];
@@ -813,7 +826,13 @@ public abstract class StructureViewerBase extends GStructureViewer
         alm[a] = -1;
         alc[a++] = ap.av.getColumnSelection();
       }
-      getBinding().superposeStructures(als, alm, alc);
+      reply = getBinding().superposeStructures(als, alm, alc);
+      if (reply != null)
+      {
+        String text = MessageManager.formatMessage(
+                "error.superposition_failed", reply);
+        statusBar.setText(text);
+      }
     } catch (Exception e)
     {
       StringBuffer sp = new StringBuffer();
@@ -824,7 +843,9 @@ public abstract class StructureViewerBase extends GStructureViewer
       Cache.log.info("Couldn't align structures with the " + sp.toString()
               + "associated alignment panels.", e);
     }
+    return reply;
   }
+
   @Override
   public void background_actionPerformed(ActionEvent actionEvent)
   {
@@ -902,7 +923,7 @@ public abstract class StructureViewerBase extends GStructureViewer
       {
         // TODO: cope with multiple PDB files in view
         in = new BufferedReader(
-                new FileReader(getBinding().getPdbFile()[0]));
+                new FileReader(getBinding().getStructureFiles()[0]));
         File outFile = chooser.getSelectedFile();
   
         PrintWriter out = new PrintWriter(new FileOutputStream(outFile));
@@ -954,6 +975,10 @@ public abstract class StructureViewerBase extends GStructureViewer
   }
 
   protected abstract String getViewerName();
+
+  /**
+   * Configures the title and menu items of the viewer panel.
+   */
   public void updateTitleAndMenus()
   {
     AAStructureBindingModel binding = getBinding();
@@ -965,10 +990,30 @@ public abstract class StructureViewerBase extends GStructureViewer
     setChainMenuItems(binding.getChainNames());
   
     this.setTitle(binding.getViewerTitle(getViewerName(), true));
-    if (binding.getPdbFile().length > 1 && binding.getSequence().length > 1)
+
+    /*
+     * enable 'Superpose with' if more than one mapped structure
+     */
+    viewSelectionMenu.setEnabled(false);
+    if (getBinding().getStructureFiles().length > 1
+            && getBinding().getSequence().length > 1)
+    {
+      viewSelectionMenu.setEnabled(true);
+    }
+
+    /*
+     * Show action menu if it has any enabled items
+     */
+    viewerActionMenu.setVisible(false);
+    for (int i = 0; i < viewerActionMenu.getItemCount(); i++)
     {
-      viewerActionMenu.setVisible(true);
+      if (viewerActionMenu.getItem(i).isEnabled())
+      {
+        viewerActionMenu.setVisible(true);
+        break;
+      }
     }
+
     if (!binding.isLoadingFromArchive())
     {
       seqColour_actionPerformed(null);