JAL-4386 Drop down for secondary structure sources in calculate window
[jalview.git] / src / jalview / gui / CalculationChooser.java
index b7bb58f..d126cc3 100644 (file)
@@ -60,7 +60,6 @@ import jalview.api.analysis.SimilarityParamsI;
 import jalview.bin.Cache;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.SequenceGroup;
-import jalview.datamodel.SequenceI;
 import jalview.util.MessageManager;
 
 /**
@@ -81,6 +80,10 @@ public class CalculationChooser extends JPanel
   private static final int MIN_TREE_SELECTION = 3;
 
   private static final int MIN_PCA_SELECTION = 4;
+  
+  private static final String SS_ANNOTATION_LABEL = "Secondary Structure";
+  
+  private static final String SS_ANNOTATION_FROM_JPRED_LABEL = "jnetpred";
 
   AlignFrame af;
 
@@ -91,6 +94,8 @@ public class CalculationChooser extends JPanel
   JRadioButton averageDistance;
 
   JComboBox<String> modelNames;
+  
+  JComboBox<String> ssSourceDropdown;
 
   JButton calculate;
 
@@ -210,16 +215,34 @@ public class CalculationChooser extends JPanel
     pca.addActionListener(calcChanged);
     neighbourJoining.addActionListener(calcChanged);
     averageDistance.addActionListener(calcChanged);
+    
+    
+    //to do    
+    ssSourceDropdown = buildSSSourcesOptionsList();
+    ssSourceDropdown.setVisible(false); // Initially hide the dropdown
 
     /*
      * score models drop-down - with added tooltips!
      */
     modelNames = buildModelOptionsList();
+    // Step 3: Show or Hide Dropdown Based on Selection
+    modelNames.addActionListener(new ActionListener() {
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            String selectedModel = modelNames.getSelectedItem().toString();
+            if (selectedModel.equals("Secondary Structure Similarity")) {
+              ssSourceDropdown.setVisible(true);
+            } else {
+              ssSourceDropdown.setVisible(false);
+            }
+        }
+    });
 
     JPanel scoreModelPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
     scoreModelPanel.setOpaque(false);
     scoreModelPanel.add(modelNames);
-
+    scoreModelPanel.add(ssSourceDropdown);
+    
     /*
      * score model parameters
      */
@@ -234,7 +257,7 @@ public class CalculationChooser extends JPanel
     paramsPanel.add(matchGaps);
     paramsPanel.add(includeGappedColumns);
     paramsPanel.add(shorterSequence);
-
+    
     /*
      * OK / Cancel buttons
      */
@@ -272,7 +295,7 @@ public class CalculationChooser extends JPanel
     }
     this.add(actionPanel, BorderLayout.SOUTH);
 
-    int width = 350;
+    int width = 365;
     int height = includeParams ? 420 : 240;
 
     setMinimumSize(new Dimension(325, height - 10));
@@ -420,7 +443,38 @@ public class CalculationChooser extends JPanel
 
     return scoreModelsCombo;
   }
+  
 
+  private JComboBox<String> buildSSSourcesOptionsList()
+  {
+    final JComboBox<String> comboBox = new JComboBox<>();
+    Object curSel = comboBox.getSelectedItem();
+    DefaultComboBoxModel<String> sourcesModel = new DefaultComboBoxModel<>();
+
+    List<String> ssSources = getApplicableSecondaryStructureSources();
+
+    boolean selectedIsPresent = false;
+    for (String source : ssSources)
+    {
+      if (curSel != null && source.equals(curSel))
+      {
+        selectedIsPresent = true;
+        curSel = source;
+      }
+      sourcesModel.addElement(source);
+      
+    }
+
+    if (selectedIsPresent)
+    {
+      sourcesModel.setSelectedItem(curSel);
+    }
+    comboBox.setModel(sourcesModel);
+    
+    return comboBox;
+  }
+  
+  
   private void updateScoreModels(JComboBox<String> comboBox,
           List<String> toolTips)
   {
@@ -531,6 +585,31 @@ public class CalculationChooser extends JPanel
     return filtered;
   }
 
+  
+  protected List<String> getApplicableSecondaryStructureSources()
+  {
+    List<String> ssSources = new ArrayList<>();
+    
+    AlignmentAnnotation[] annotations = af.getViewport().getAlignment().getAlignmentAnnotation();
+    boolean has3DStructure = false, hasJPred = false;
+    if(annotations.length > 0) {
+      
+      for (AlignmentAnnotation annotation : annotations) {
+        has3DStructure |= SS_ANNOTATION_LABEL.equals(annotation.label);
+        hasJPred |= SS_ANNOTATION_FROM_JPRED_LABEL.equals(annotation.label);
+        
+        if (has3DStructure && hasJPred)
+          break;
+      }
+    }
+    if(has3DStructure)
+      ssSources.add("3D Structures");
+    if(hasJPred)
+      ssSources.add("JPred");
+                 
+    return ssSources;
+  }
+  
   /**
    * Open and calculate the selected tree or PCA on 'OK'
    */
@@ -538,8 +617,10 @@ public class CalculationChooser extends JPanel
   {
     boolean doPCA = pca.isSelected();
     String modelName = modelNames.getSelectedItem().toString();
-    SimilarityParamsI params = getSimilarityParameters(doPCA);
-
+    String ssSource = ssSourceDropdown.getSelectedItem().toString();
+    SimilarityParams params = getSimilarityParameters(doPCA);
+    if(ssSource.length()>0)
+      params.setSecondaryStructureSource(ssSource);
     if (doPCA)
     {
       openPcaPanel(modelName, params);
@@ -640,7 +721,7 @@ public class CalculationChooser extends JPanel
    * @param doPCA
    * @return
    */
-  protected SimilarityParamsI getSimilarityParameters(boolean doPCA)
+  protected SimilarityParams getSimilarityParameters(boolean doPCA)
   {
     // commented out: parameter choices read from gui widgets
     // SimilarityParamsI params = new SimilarityParams(