Merge branch 'feature/JAL-4159_pasimap' into spike/JAL-4159_pasimap_2113_series
[jalview.git] / src / jalview / gui / PaSiMapPanel.java
index cd1dd5a..562605e 100644 (file)
@@ -32,7 +32,7 @@ import jalview.datamodel.HiddenColumns;
 import jalview.datamodel.SequenceI;
 import jalview.gui.ImageExporter.ImageWriterI;
 import jalview.gui.JalviewColourChooser.ColourChooserListener;
-import jalview.jbgui.GPCAPanel;
+import jalview.jbgui.GPaSiMapPanel;
 import jalview.math.RotatableMatrix.Axis;
 import jalview.util.ImageMaker;
 import jalview.util.MessageManager;
@@ -49,9 +49,12 @@ import java.awt.print.PageFormat;
 import java.awt.print.Printable;
 import java.awt.print.PrinterException;
 import java.awt.print.PrinterJob;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
 
 import javax.swing.ButtonGroup;
 import javax.swing.JMenuItem;
+import javax.swing.JProgressBar;
 import javax.swing.JRadioButtonMenuItem;
 import javax.swing.event.InternalFrameAdapter;
 import javax.swing.event.InternalFrameEvent;
@@ -59,13 +62,17 @@ import javax.swing.event.InternalFrameEvent;
 /**
  * The panel holding the Pairwise Similarity Map 3-D visualisation
  */
-public class PaSiMapPanel extends GPCAPanel
+public class PaSiMapPanel extends GPaSiMapPanel
         implements Runnable, IProgressIndicator
 {
   private static final int MIN_WIDTH = 470;
 
   private static final int MIN_HEIGHT = 250;
 
+  private final int GAP_OPEN_COST = 100;
+
+  private final int GAP_EXTEND_COST = 5;
+
   private RotatableCanvas rc;
 
   AlignmentPanel ap;
@@ -78,6 +85,8 @@ public class PaSiMapPanel extends GPCAPanel
 
   private IProgressIndicator progressBar;
 
+  private long progId;
+
   private boolean working;
 
   /**
@@ -91,12 +100,12 @@ public class PaSiMapPanel extends GPCAPanel
   public PaSiMapPanel(AlignmentPanel alignPanel, String modelName,
           SimilarityParamsI params)
   {
-    super(3);  // dim = 3
+    super(8);  // dim = 8
     this.av = alignPanel.av;
     this.ap = alignPanel;
     boolean nucleotide = av.getAlignment().isNucleotide();
 
-    progressBar = new ProgressBar(statusPanel, statusBar);
+    //progressBar = new ProgressBar(statusPanel, statusBar);
 
     addInternalFrameListener(new InternalFrameAdapter()
     {
@@ -122,7 +131,7 @@ public class PaSiMapPanel extends GPCAPanel
     ScoreModelI scoreModel = ScoreModels.getInstance()
             .getScoreModel(modelName, ap);
     setPasimapModel(
-            new PaSiMapModel(av, seqs, nucleotide, scoreModel, params));
+            new PaSiMapModel(av, seqs, nucleotide, scoreModel));
     PaintRefresher.Register(this, av.getSequenceSetId());
 
     setRotatableCanvas(new RotatableCanvas(alignPanel));
@@ -171,18 +180,31 @@ public class PaSiMapPanel extends GPCAPanel
   public void run()
   {
     working = true;
-    long progId = System.currentTimeMillis();
-    IProgressIndicator progress = this;
+    progId = System.currentTimeMillis();
+    progressBar = this;
     String message = MessageManager.getString("label.pasimap_recalculating");
     if (getParent() == null)
     {
-      progress = ap.alignFrame;
+      progressBar = ap.alignFrame;
       message = MessageManager.getString("label.pasimap_calculating");
     }
-    progress.setProgressBar(message, progId);
+    progressBar.setProgressBar(message, progId);
     try
     {
-      getPasimapModel().calculate();
+      //&! remove big seqs
+      for (SequenceI seq : av.getAlignment().getSequencesArray())
+      {
+       if (seq.getLength() > 20000)
+       {
+         //TODO add warning dialog
+         av.getAlignment().deleteSequence(seq);
+       }
+      }
+
+      PairwiseAlignPanel pap = new PairwiseAlignPanel(av, true, GAP_OPEN_COST, GAP_EXTEND_COST, false);
+System.out.println(pap != null);
+      setPairwiseAlignPanel(pap);
+      getPasimapModel().calculate(pap);
 
       xCombobox.setSelectedIndex(0);
       yCombobox.setSelectedIndex(1);
@@ -199,7 +221,7 @@ public class PaSiMapPanel extends GPCAPanel
       return;
     } finally
     {
-      progress.setProgressBar("", progId);
+      progressBar.setProgressBar("", progId);
     }
 
     repaint();
@@ -513,7 +535,7 @@ public class PaSiMapPanel extends GPCAPanel
    * (non-Javadoc)
    * 
    * @see
-   * jalview.jbgui.GPCAPanel#outputPoints_actionPerformed(java.awt.event.ActionEvent
+   * jalview.jbgui.GPaSiMapPanel#outputPoints_actionPerformed(java.awt.event.ActionEvent
    * )
    */
   @Override
@@ -539,7 +561,7 @@ public class PaSiMapPanel extends GPCAPanel
    * (non-Javadoc)
    * 
    * @see
-   * jalview.jbgui.GPCAPanel#outputProjPoints_actionPerformed(java.awt.event
+   * jalview.jbgui.GPaSiMapPanel#outputProjPoints_actionPerformed(java.awt.event
    * .ActionEvent)
    */
   @Override
@@ -564,6 +586,29 @@ public class PaSiMapPanel extends GPCAPanel
   /*
    * (non-Javadoc)
    * 
+   * @see
+   * jalview.jbgui.GPaSiMapPanel#outputAlignment_actionPerformed(java.awt.event
+   * .ActionEvent)
+   */
+  @Override
+  protected void outputAlignment_actionPerformed()
+  {
+    CutAndPasteTransfer cap = new CutAndPasteTransfer();
+    try
+    {
+      cap.setText(getPasimapModel().getAlignmentOutput());
+      Desktop.addInternalFrame(cap, MessageManager.formatMessage(
+       "label.pairwise_alignment_for_params", new String[] { this.getTitle() }), 500, 500);
+    } catch (OutOfMemoryError oom)
+    {
+      new OOMWarning("exporting pairwise alignments", oom);
+      cap.dispose();
+    }
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
    * @see jalview.gui.IProgressIndicator#setProgressBar(java.lang.String, long)
    */
   @Override
@@ -615,6 +660,45 @@ public class PaSiMapPanel extends GPCAPanel
     // validate();
   }
 
+  /*
+   * make the progressBar determinate and update its progress
+  */
+  public void updateProgressBar(int lengthOfTask, int progress)
+  {
+    JProgressBar pBar = progressBar.getProgressBar(progId);
+    if (pBar.isIndeterminate())
+    {
+      pBar.setMaximum(lengthOfTask);
+      pBar.setValue(0);
+      pBar.setIndeterminate(false);
+    }
+    updateProgressBar(progress);
+  }
+  public void updateProgressBar(int progress)
+  {
+    JProgressBar pBar = progressBar.getProgressBar(progId);
+    pBar.setValue(progress);
+    pBar.repaint();
+  }
+
+  //&!
+  public void setPairwiseAlignPanel(PairwiseAlignPanel pap)
+  {
+    pap.addPropertyChangeListener(new PropertyChangeListener()
+    {
+      @Override
+      public void propertyChange(PropertyChangeEvent pcEvent)
+      {
+       if (PairwiseAlignPanel.PROGRESS.equals(pcEvent.getPropertyName()))
+       {
+         updateProgressBar((int) pcEvent.getNewValue());
+       } else if (PairwiseAlignPanel.TOTAL.equals(pcEvent.getPropertyName())) {
+         updateProgressBar((int) pcEvent.getNewValue(), 0);
+       }
+      }
+    });
+  }
+
   @Override
   public void registerHandler(final long id,
           final IProgressIndicatorHandler handler)
@@ -768,4 +852,10 @@ public class PaSiMapPanel extends GPCAPanel
     getRotatableCanvas().ap = panel;
     PaintRefresher.Register(PaSiMapPanel.this, panel.av.getSequenceSetId());
   }
+
+  @Override
+  public JProgressBar getProgressBar(long id)
+  {
+    return progressBar.getProgressBar(id);
+  }
 }