Use paintAlignment
[jalview.git] / src / jalview / gui / AlignFrame.java
index ae814c1..8c9246b 100755 (executable)
@@ -183,39 +183,36 @@ public class AlignFrame
             break;
 
           case KeyEvent.VK_DOWN:
-            if (viewport.cursorMode)
-            {
-              alignPanel.seqPanel.moveCursor(0, 1);
-            }
-            else
-            {
+             if (evt.isAltDown() || !viewport.cursorMode)
               moveSelectedSequences(false);
-            }
+            if(viewport.cursorMode)
+              alignPanel.seqPanel.moveCursor(0, 1);
             break;
 
           case KeyEvent.VK_UP:
-            if (viewport.cursorMode)
-            {
-              alignPanel.seqPanel.moveCursor(0, -1);
-            }
-            else
-            {
+            if (evt.isAltDown() || !viewport.cursorMode)
               moveSelectedSequences(true);
-            }
+            if(viewport.cursorMode)
+              alignPanel.seqPanel.moveCursor(0, -1);
+
             break;
 
           case KeyEvent.VK_LEFT:
-            if (viewport.cursorMode)
-            {
+            if (evt.isAltDown() || !viewport.cursorMode)
+              slideSequences(false,
+                             alignPanel.seqPanel.getKeyboardNo1());
+            else
               alignPanel.seqPanel.moveCursor( -1, 0);
-            }
+
+
             break;
 
           case KeyEvent.VK_RIGHT:
-            if (viewport.cursorMode)
-            {
-              alignPanel.seqPanel.moveCursor(1, 0);
-            }
+            if (evt.isAltDown() || !viewport.cursorMode)
+              slideSequences(true,
+                             alignPanel.seqPanel.getKeyboardNo1());
+            else
+              alignPanel.seqPanel.moveCursor( 1, 0);
             break;
 
           case KeyEvent.VK_SPACE:
@@ -376,6 +373,24 @@ public class AlignFrame
             break;
         }
       }
+
+      public void keyReleased(KeyEvent evt)
+      {
+        switch(evt.getKeyCode())
+        {
+          case KeyEvent.VK_LEFT:
+            if (evt.isAltDown() || !viewport.cursorMode)
+              viewport.firePropertyChange("alignment", null,
+                                          viewport.getAlignment().getSequences());
+            break;
+
+          case KeyEvent.VK_RIGHT:
+            if (evt.isAltDown() || !viewport.cursorMode)
+              viewport.firePropertyChange("alignment", null,
+                                          viewport.getAlignment().getSequences());
+            break;
+        }
+      }
     });
   }
 
@@ -1158,9 +1173,108 @@ public class AlignFrame
       }
     }
 
-    alignPanel.repaint();
+    alignPanel.paintAlignment(true);
   }
 
+
+  synchronized void slideSequences(boolean right, int size)
+  {
+    if(viewport.hasHiddenColumns)
+    {
+      JOptionPane.showInternalMessageDialog(Desktop.desktop,
+          "Slide Sequences not available with hidden columns",
+          "Slide Sequence not Available",
+          JOptionPane.WARNING_MESSAGE);
+      return;
+    }
+    Vector sg = new Vector();
+    if(viewport.cursorMode)
+    {
+      sg.addElement(viewport.alignment.getSequenceAt(
+          alignPanel.seqPanel.seqCanvas.cursorY));
+    }
+    else if(viewport.getSelectionGroup()!=null
+        && viewport.getSelectionGroup().getSize()!=viewport.alignment.getHeight())
+   {
+     sg = viewport.getSelectionGroup().getSequences(
+         viewport.hiddenRepSequences);
+   }
+
+    if(sg.size()<1)
+    {
+      return;
+    }
+
+    Vector invertGroup = new Vector();
+
+    for (int i = 0; i < viewport.alignment.getHeight(); i++)
+    {
+      if(!sg.contains(viewport.alignment.getSequenceAt(i)))
+         invertGroup.add(viewport.alignment.getSequenceAt(i));
+    }
+
+    SequenceI[] seqs1 = new SequenceI[sg.size()];
+    for (int i = 0; i < sg.size(); i++)
+      seqs1[i] = (SequenceI) sg.elementAt(i);
+
+    SequenceI[] seqs2 = new SequenceI[invertGroup.size()];
+    for (int i = 0; i < invertGroup.size(); i++)
+      seqs2[i] = (SequenceI) invertGroup.elementAt(i);
+
+    SlideSequencesCommand ssc;
+    if (right)
+      ssc = new SlideSequencesCommand("Slide Sequences",
+                                      seqs2, seqs1, size,
+                                      viewport.getGapCharacter()
+          );
+    else
+      ssc = new SlideSequencesCommand("Slide Sequences",
+                                      seqs1, seqs2, size,
+                                      viewport.getGapCharacter()
+          );
+
+    int groupAdjustment = 0;
+    if (ssc.getGapsInsertedBegin() && right)
+    {
+      if (viewport.cursorMode)
+        alignPanel.seqPanel.moveCursor(size, 0);
+      else
+        groupAdjustment = size;
+    }
+    else if (!ssc.getGapsInsertedBegin() && !right)
+    {
+      if (viewport.cursorMode)
+        alignPanel.seqPanel.moveCursor( -size, 0);
+      else
+        groupAdjustment = -size;
+    }
+
+    if (groupAdjustment != 0)
+    {
+      viewport.getSelectionGroup().setStartRes(
+          viewport.getSelectionGroup().getStartRes() + groupAdjustment);
+      viewport.getSelectionGroup().setEndRes(
+          viewport.getSelectionGroup().getEndRes() + groupAdjustment);
+    }
+
+
+    boolean appendHistoryItem = false;
+    if(viewport.historyList!=null
+       && viewport.historyList.size()>0
+      && viewport.historyList.peek() instanceof SlideSequencesCommand)
+    {
+      appendHistoryItem = ssc.appendSlideCommand(
+          (SlideSequencesCommand)viewport.historyList.peek())
+          ;
+    }
+
+    if(!appendHistoryItem)
+      addHistoryItem(ssc);
+
+    repaint();
+  }
+
+
   /**
    * DOCUMENT ME!
    *
@@ -1531,7 +1645,7 @@ public class AlignFrame
     viewport.sequenceColours = null;
     viewport.setSelectionGroup(null);
     PaintRefresher.Refresh(this, viewport.getSequenceSetId());
-    alignPanel.repaint();
+    alignPanel.paintAlignment(true);
   }
 
   /**
@@ -1551,7 +1665,7 @@ public class AlignFrame
 
     sg.setEndRes(viewport.alignment.getWidth() - 1);
     viewport.setSelectionGroup(sg);
-    alignPanel.repaint();
+    alignPanel.paintAlignment(true);
     PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
   }
 
@@ -1572,7 +1686,7 @@ public class AlignFrame
     viewport.setSelectionGroup(null);
     alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
     alignPanel.idPanel.idCanvas.searchResults = null;
-    alignPanel.repaint();
+    alignPanel.paintAlignment(true);
     PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
   }
 
@@ -1598,7 +1712,7 @@ public class AlignFrame
       sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
     }
 
-    alignPanel.repaint();
+    alignPanel.paintAlignment(true);
 
     PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
   }
@@ -1606,7 +1720,7 @@ public class AlignFrame
   public void invertColSel_actionPerformed(ActionEvent e)
   {
     viewport.invertColumnSelection();
-    alignPanel.repaint();
+    alignPanel.paintAlignment(true);
   }
 
   /**
@@ -1888,13 +2002,13 @@ public class AlignFrame
     viewport.setShowJVSuffix(seqLimits.isSelected());
 
     alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
-    alignPanel.repaint();
+    alignPanel.paintAlignment(true);
   }
 
   public void idRightAlign_actionPerformed(ActionEvent e)
   {
     viewport.rightAlignIds = idRightAlign.isSelected();
-    alignPanel.repaint();
+    alignPanel.paintAlignment(true);
   }
 
   /**
@@ -1905,7 +2019,7 @@ public class AlignFrame
   protected void colourTextMenuItem_actionPerformed(ActionEvent e)
   {
     viewport.setColourText(colourTextMenuItem.isSelected());
-    alignPanel.repaint();
+    alignPanel.paintAlignment(true);
   }
 
   /**
@@ -1936,13 +2050,13 @@ public class AlignFrame
   public void hideSelSequences_actionPerformed(ActionEvent e)
   {
     viewport.hideAllSelectedSeqs();
-    alignPanel.repaint();
+    alignPanel.paintAlignment(true);
   }
 
   public void hideSelColumns_actionPerformed(ActionEvent e)
   {
     viewport.hideSelectedColumns();
-    alignPanel.repaint();
+    alignPanel.paintAlignment(true);
   }
 
   public void hiddenMarkers_actionPerformed(ActionEvent e)
@@ -1959,7 +2073,7 @@ public class AlignFrame
   protected void scaleAbove_actionPerformed(ActionEvent e)
   {
     viewport.setScaleAboveWrapped(scaleAbove.isSelected());
-    alignPanel.repaint();
+    alignPanel.paintAlignment(true);
   }
 
   /**
@@ -1970,7 +2084,7 @@ public class AlignFrame
   protected void scaleLeft_actionPerformed(ActionEvent e)
   {
     viewport.setScaleLeftWrapped(scaleLeft.isSelected());
-    alignPanel.repaint();
+    alignPanel.paintAlignment(true);
   }
 
   /**
@@ -1981,7 +2095,7 @@ public class AlignFrame
   protected void scaleRight_actionPerformed(ActionEvent e)
   {
     viewport.setScaleRightWrapped(scaleRight.isSelected());
-    alignPanel.repaint();
+    alignPanel.paintAlignment(true);
   }
 
   /**
@@ -1992,7 +2106,7 @@ public class AlignFrame
   public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
   {
     viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
-    alignPanel.repaint();
+    alignPanel.paintAlignment(true);
   }
 
   /**
@@ -2003,7 +2117,7 @@ public class AlignFrame
   public void viewTextMenuItem_actionPerformed(ActionEvent e)
   {
     viewport.setShowText(viewTextMenuItem.isSelected());
-    alignPanel.repaint();
+    alignPanel.paintAlignment(true);
   }
 
   /**
@@ -2014,7 +2128,7 @@ public class AlignFrame
   protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
   {
     viewport.setRenderGaps(renderGapsMenuItem.isSelected());
-    alignPanel.repaint();
+    alignPanel.paintAlignment(true);
   }
 
   public FeatureSettings featureSettings;
@@ -2036,7 +2150,7 @@ public class AlignFrame
   public void showSeqFeatures_actionPerformed(ActionEvent evt)
   {
     viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
-    alignPanel.repaint();
+    alignPanel.paintAlignment(true);
     if (alignPanel.getOverviewPanel() != null)
     {
       alignPanel.getOverviewPanel().updateOverviewImage();
@@ -2334,7 +2448,10 @@ public class AlignFrame
       alignPanel.getOverviewPanel().updateOverviewImage();
     }
 
-    alignPanel.repaint();
+
+
+
+    alignPanel.paintAlignment(true);
   }
 
   /**
@@ -2526,7 +2643,7 @@ public class AlignFrame
                               viewport.getAlignment().getSequenceAt(0));
     addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder,
                                     viewport.alignment));
-    alignPanel.repaint();
+    alignPanel.paintAlignment(true);
   }
 
   /**
@@ -2539,7 +2656,7 @@ public class AlignFrame
     SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
     AlignmentSorter.sortByID(viewport.getAlignment());
     addHistoryItem(new OrderCommand("ID Sort", oldOrder, viewport.alignment));
-    alignPanel.repaint();
+    alignPanel.paintAlignment(true);
   }
 
   /**
@@ -2553,7 +2670,7 @@ public class AlignFrame
     AlignmentSorter.sortByGroup(viewport.getAlignment());
     addHistoryItem(new OrderCommand("Group Sort", oldOrder, viewport.alignment));
 
-    alignPanel.repaint();
+    alignPanel.paintAlignment(true);
   }
 
   /**
@@ -2766,7 +2883,7 @@ public class AlignFrame
         addHistoryItem(new OrderCommand(order.getName(), oldOrder,
                                         viewport.alignment));
 
-        alignPanel.repaint();
+        alignPanel.paintAlignment(true);
       }
     });
   }
@@ -2822,7 +2939,7 @@ public class AlignFrame
                                           oldOrder,
                                           viewport.alignment));
 
-          alignPanel.repaint();
+          alignPanel.paintAlignment(true);
         }
       });
 
@@ -3254,7 +3371,7 @@ public class AlignFrame
     {
       viewport.showSequenceFeatures = true;
       showSeqFeatures.setSelected(true);
-      alignPanel.repaint();
+      alignPanel.paintAlignment(true);
     }
 
     return featuresFile;
@@ -3366,7 +3483,7 @@ public class AlignFrame
                 viewport.getAlignment(),
                 0, false);
             alignPanel.adjustAnnotationHeight();
-            alignPanel.repaint();
+            alignPanel.paintAlignment(true);
           }
           else
           {