Merge branch 'hardcode'
[jalview.git] / src / jalview / gui / CalculationChooser.java
index a41a998..816b537 100644 (file)
@@ -28,7 +28,7 @@ import jalview.api.analysis.SimilarityParamsI;
 import jalview.bin.Cache;
 import jalview.datamodel.SequenceGroup;
 import jalview.util.MessageManager;
-
+import jalview.viewmodel.AlignmentViewport;
 import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.Component;
@@ -61,6 +61,15 @@ import javax.swing.JRadioButton;
 import javax.swing.event.InternalFrameAdapter;
 import javax.swing.event.InternalFrameEvent;
 
+import jalview.analysis.TreeBuilder;
+import jalview.analysis.scoremodels.ScoreModels;
+import jalview.analysis.scoremodels.SimilarityParams;
+import jalview.api.analysis.ScoreModelI;
+import jalview.api.analysis.SimilarityParamsI;
+import jalview.bin.Cache;
+import jalview.datamodel.SequenceGroup;
+import jalview.util.MessageManager;
+
 /**
  * A dialog where a user can choose and action Tree or PCA calculation options
  */
@@ -80,10 +89,14 @@ public class CalculationChooser extends JPanel
 
   private static final int MIN_PCA_SELECTION = 4;
 
+  private static final int MIN_PASIMAP_SELECTION = 4; //&! <++>!! chekc how many
+
   AlignFrame af;
 
   JRadioButton pca;
 
+  JRadioButton pasimap;        //&! initialize JRadioButton object for pasimap
+
   JRadioButton neighbourJoining;
 
   JRadioButton averageDistance;
@@ -111,6 +124,9 @@ public class CalculationChooser extends JPanel
    */
   private PCAPanel pcaPanel;
 
+  //&! 
+  private PaSiMapPanel pasimapPanel;
+
   /**
    * Constructor
    * 
@@ -130,6 +146,7 @@ public class CalculationChooser extends JPanel
   {
     setLayout(new BorderLayout());
     frame = new JInternalFrame();
+    frame.setFrameIcon(null);
     frame.setContentPane(this);
     this.setBackground(Color.white);
     frame.addFocusListener(new FocusListener()
@@ -156,12 +173,19 @@ public class CalculationChooser extends JPanel
     pca = new JRadioButton(
             MessageManager.getString("label.principal_component_analysis"));
     pca.setOpaque(false);
+
+    pasimap = new JRadioButton(                        // create the JRadioButton for pasimap with label.pasimap as its text
+           MessageManager.getString("label.pasimap"));
+    pasimap.setOpaque(false);
+
     neighbourJoining = new JRadioButton(
             MessageManager.getString("label.tree_calc_nj"));
     neighbourJoining.setSelected(true);
+    neighbourJoining.setOpaque(false);
+
     averageDistance = new JRadioButton(
             MessageManager.getString("label.tree_calc_av"));
-    neighbourJoining.setOpaque(false);
+    averageDistance.setOpaque(false);
 
     JPanel calcChoicePanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
     calcChoicePanel.setOpaque(false);
@@ -183,6 +207,14 @@ public class CalculationChooser extends JPanel
     pcaBorderless.add(pca, FlowLayout.LEFT);
     calcChoicePanel.add(pcaBorderless, FlowLayout.LEFT);
 
+    //&! create pasimap panel
+    JPanel pasimapBorderless = new JPanel(new FlowLayout(FlowLayout.LEFT));    // create new JPanel (button) for pasimap
+    pasimapBorderless.setBorder(
+           BorderFactory.createEmptyBorder(2, b.left, 2, b.right));    // set border (margin) for button (same as treePanel and pca)
+    pasimapBorderless.setOpaque(false);                // false -> stops every pixel inside border from being painted
+    pasimapBorderless.add(pasimap, FlowLayout.LEFT);   // add pasimap button to the JPanel
+    calcChoicePanel.add(pasimapBorderless, FlowLayout.LEFT);   // add button with border and everything to the overall ChoicePanel
+
     treePanel.add(neighbourJoining);
     treePanel.add(averageDistance);
 
@@ -190,6 +222,7 @@ public class CalculationChooser extends JPanel
 
     ButtonGroup calcTypes = new ButtonGroup();
     calcTypes.add(pca);
+    calcTypes.add(pasimap);    //&! add pasimap to the calculation types
     calcTypes.add(neighbourJoining);
     calcTypes.add(averageDistance);
 
@@ -202,6 +235,7 @@ public class CalculationChooser extends JPanel
       }
     };
     pca.addActionListener(calcChanged);
+    pasimap.addActionListener(calcChanged);    // add the calcChanged ActionListener to pasimap --> <++> idk
     neighbourJoining.addActionListener(calcChanged);
     averageDistance.addActionListener(calcChanged);
 
@@ -271,9 +305,9 @@ public class CalculationChooser extends JPanel
 
     setMinimumSize(new Dimension(325, height - 10));
     String title = MessageManager.getString("label.choose_calculation");
-    if (af.getViewport().viewName != null)
+    if (af.getViewport().getViewName() != null)
     {
-      title = title + " (" + af.getViewport().viewName + ")";
+      title = title + " (" + af.getViewport().getViewName() + ")";
     }
 
     Desktop.addInternalFrame(frame, title, width, height, false);
@@ -291,6 +325,7 @@ public class CalculationChooser extends JPanel
       };
     });
 
+    validateCalcTypes();
     frame.setLayer(JLayeredPane.PALETTE_LAYER);
   }
 
@@ -310,12 +345,13 @@ public class CalculationChooser extends JPanel
      * return value of true means enabled and selected
      */
     boolean checkPca = checkEnabled(pca, size, MIN_PCA_SELECTION);
+    boolean checkPasimap = checkEnabled(pasimap, size, MIN_PASIMAP_SELECTION);         // check if pasimap is enabled and min_size is fulfilled
     boolean checkNeighbourJoining = checkEnabled(neighbourJoining, size,
             MIN_TREE_SELECTION);
     boolean checkAverageDistance = checkEnabled(averageDistance, size,
             MIN_TREE_SELECTION);
 
-    if (checkPca || checkNeighbourJoining || checkAverageDistance)
+    if (checkPca || checkPasimap || checkNeighbourJoining || checkAverageDistance)
     {
       calculate.setToolTipText(null);
       calculate.setEnabled(true);
@@ -510,19 +546,24 @@ public class CalculationChooser extends JPanel
   protected void calculate_actionPerformed()
   {
     boolean doPCA = pca.isSelected();
+    boolean doPaSiMap = pasimap.isSelected();
     String modelName = modelNames.getSelectedItem().toString();
     SimilarityParamsI params = getSimilarityParameters(doPCA);
 
-    if (doPCA)
+    if (doPCA && !doPaSiMap)
     {
       openPcaPanel(modelName, params);
     }
+    else if (doPaSiMap && !doPCA)
+    {
+      openPasimapPanel(modelName, params);
+    }
     else
     {
       openTreePanel(modelName, params);
     }
 
-    // closeFrame();
+    closeFrame();
   }
 
   /**
@@ -594,6 +635,43 @@ public class CalculationChooser extends JPanel
   }
 
   /**
+   * Open a new PaSiMap panel on the desktop
+   * 
+   * @param modelName
+   * @param params
+   */
+  protected void openPasimapPanel(String modelName, SimilarityParamsI params)
+  {
+    AlignViewport viewport = af.getViewport();
+
+    /*
+     * gui validation shouldn't allow insufficient sequences here, but leave
+     * this check in in case this method gets exposed programmatically in future
+     */
+    if (((viewport.getSelectionGroup() != null)
+            && (viewport.getSelectionGroup().getSize() < MIN_PASIMAP_SELECTION)
+            && (viewport.getSelectionGroup().getSize() > 0))
+            || (viewport.getAlignment().getHeight() < MIN_PASIMAP_SELECTION))
+    {
+      JvOptionPane.showInternalMessageDialog(this,
+              MessageManager.formatMessage(
+                      "label.you_need_at_least_n_sequences",
+                      MIN_PASIMAP_SELECTION),
+              MessageManager
+                      .getString("label.sequence_selection_insufficient"),
+              JvOptionPane.WARNING_MESSAGE);
+      return;
+    }
+
+    /*
+     * construct the panel and kick off its calculation thread
+     */
+    pasimapPanel = new PaSiMapPanel(af.alignPanel, modelName, params);
+    new Thread(pasimapPanel).start();
+
+  }
+
+  /**
    * 
    */
   protected void closeFrame()