JAL-728 offer choice of substitution matrix for Quality calculation
[jalview.git] / src / jalview / gui / AlignFrame.java
index de1d003..c45167c 100644 (file)
@@ -26,6 +26,10 @@ import jalview.analysis.CrossRef;
 import jalview.analysis.Dna;
 import jalview.analysis.ParseProperties;
 import jalview.analysis.SequenceIdMatcher;
+import jalview.analysis.scoremodels.ScoreMatrix;
+import jalview.analysis.scoremodels.ScoreModels;
+import jalview.api.AlignCalcManagerI;
+import jalview.api.AlignCalcWorkerI;
 import jalview.api.AlignExportSettingI;
 import jalview.api.AlignViewControllerGuiI;
 import jalview.api.AlignViewControllerI;
@@ -89,6 +93,7 @@ import jalview.schemes.TCoffeeColourScheme;
 import jalview.util.MessageManager;
 import jalview.viewmodel.AlignmentViewport;
 import jalview.viewmodel.ViewportRanges;
+import jalview.workers.ConservationThread;
 import jalview.ws.DBRefFetcher;
 import jalview.ws.DBRefFetcher.FetchFinishedListenerI;
 import jalview.ws.jws1.Discoverer;
@@ -864,6 +869,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     modifyConservation.setEnabled(!nucleotide
             && conservationMenuItem.isSelected());
     showGroupConservation.setEnabled(!nucleotide);
+    qualityScoreModel.setEnabled(!nucleotide);
 
     showComplementMenuItem.setText(nucleotide ? MessageManager
             .getString("label.protein") : MessageManager
@@ -5639,6 +5645,76 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
     ColourMenuHelper.setColourSelected(colourMenu, schemeName);
   }
+
+  /**
+   * Repopulates the sub-menu with choice of score matrices each time the menu
+   * is selected, in case matrices have been added dynamically
+   */
+  @Override
+  protected void scoreModel_menuSelected()
+  {
+    qualityScoreModel.removeAll();
+    boolean nucleotide = getViewport().getAlignment().isNucleotide();
+    final AlignCalcManagerI calcManager = getViewport().getCalcManager();
+
+    /*
+     * which model is currently selected?
+     */
+    String modelName = null;
+    final List<AlignCalcWorkerI> cons = calcManager
+            .getRegisteredWorkersOfClass(ConservationThread.class);
+    if (cons == null || cons.isEmpty())
+    {
+      return;
+    }
+    for (AlignCalcWorkerI worker : cons)
+    {
+      modelName = ((ConservationThread) worker).getScoreModel().getName();
+    }
+    
+    /*
+     * repopulate menu
+     */
+    final ScoreModels scoreModels = ScoreModels.getInstance();
+    for (final ScoreModelI sm : scoreModels.getModels())
+    {
+      final String name = sm.getName();
+      JCheckBoxMenuItem menuItem = new JCheckBoxMenuItem(name);
+
+      /*
+       * if the score model doesn't provide a description, try to look one
+       * up in the text bundle, falling back on its name
+       * TODO push this inside ScoreModels?
+       */
+      String tooltip = sm.getDescription();
+      if (tooltip == null)
+      {
+        tooltip = MessageManager.getStringOrReturn("label.score_model_",
+                name);
+      }
+      menuItem.setToolTipText(tooltip);
+      menuItem.setSelected(modelName.equals(name));
+      if (sm.isProtein() && (sm instanceof ScoreMatrix))
+      {
+        menuItem.addActionListener(new ActionListener()
+        {
+          @Override
+          public void actionPerformed(ActionEvent e)
+          {
+            // set model on ConservationThread, restart thread
+            for (AlignCalcWorkerI worker : cons)
+            {
+              ((ConservationThread) worker)
+                      .setScoreModel((ScoreMatrix) scoreModels
+                      .forName(name));
+            }
+            getViewport().alignmentChanged(alignPanel);
+          }
+        });
+        qualityScoreModel.add(menuItem);
+      }
+    }
+  }
 }
 
 class PrintThread extends Thread