Merge branch 'releases/Release_2_11_1_Branch' into task/JAL-3608_and_JAL-3609_merged_...
authorBen Soares <b.soares@dundee.ac.uk>
Wed, 8 Jul 2020 13:37:24 +0000 (14:37 +0100)
committerBen Soares <b.soares@dundee.ac.uk>
Wed, 8 Jul 2020 13:37:24 +0000 (14:37 +0100)
RELEASE
build.gradle
help/help/html/index.html
help/help/html/keys.html
help/help/html/releases.html
help/help/html/webServices/AACon.html
help/help/html/webServices/msaclient.html
resources/lang/Messages_es.properties
src/jalview/gui/AlignFrame.java
src/jalview/gui/SeqPanel.java
test/jalview/gui/SeqCanvasTest.java

diff --git a/RELEASE b/RELEASE
index 5a89907..3600be2 100644 (file)
--- a/RELEASE
+++ b/RELEASE
@@ -1,2 +1,2 @@
 jalview.release=releases/Release_2_11_1_Branch
-jalview.version=2.11.1.0
+jalview.version=2.11.1.1
index 24f1fd9..2c7f138 100644 (file)
@@ -963,6 +963,11 @@ test {
     println("Setting Test LaF to '${testLaf}'")
     systemProperty "laf", testLaf
   }
+  def testHiDPIScale = project.findProperty("test_HiDPIScale")
+  if (testHiDPIScale != null) {
+    println("Setting Test HiDPI Scale to '${testHiDPIScale}'")
+    systemProperty "sun.java2d.uiScale", testHiDPIScale
+  }
   sourceCompatibility = compile_source_compatibility
   targetCompatibility = compile_target_compatibility
   jvmArgs += additional_compiler_args
index 36ed33a..442c508 100755 (executable)
@@ -45,7 +45,7 @@
   <p>
     For more information, you might also want to take a look at the
     documentation section of the Jalview website (<a
-      href="http://www-test.jalview.org/about/documentation">http://www.jalview.org/about/documentation</a>).
+      href="http://www.jalview.org/about/documentation">http://www.jalview.org/about/documentation</a>).
   </p>
   <p>
     If you are using the Jalview Desktop application and are looking for
index 1a5fc18..5f24a83 100755 (executable)
     </tr>
     <tr>
       <td><strong>Up Arrow</strong></td>
-      <td>Normal</td>
-      <td>Moves selected sequence(s) up the alignment</td>
+      <td>Both</td>
+      <td>Moves selected sequence(s) up the alignment.<br />In
+        Cursor mode press Alt key to move selection or sequence under
+        cursor.
+      </td>
     </tr>
     <tr>
       <td><strong>Down Arrow</strong></td>
-      <td>Normal</td>
-      <td>Moves selected sequence(s) down the alignment.</td>
+      <td>Both</td>
+      <td>Moves selected sequence(s) down the alignment.<br />In
+        Cursor mode press Alt key to move selection or sequence under
+        cursor.
+      </td>
     </tr>
     <tr>
       <td><strong>Left Arrow</strong></td>
       <td><strong>Cursor Keys<br> (Arrow Keys)
       </strong></td>
       <td>Cursor</td>
-      <td>Move cursor around alignment</td>
+      <td>Move cursor around alignment.<br /> Press SHIFT to move
+        cursor from an aligned region to next gap, or to the next
+        aligned region when at a gap.
+      </td>
     </tr>
     <tr>
       <td><strong>Page Up</strong></td>
index 5b6180d..83a9cc3 100755 (executable)
@@ -57,6 +57,37 @@ li:before {
     </tr>
     <tr>
       <td width="60" align="center" nowrap><strong><a
+          id="Jalview.2.11.1">2.11.1</a><a id="Jalview.2.11.1.1">.1</a><br />
+          <em>13/07/2020</em></strong></td>
+      <td align="left" valign="top">
+        <ul>
+          <!-- -->
+          <li>
+            <!-- JAL-3638 -->Shift+arrow keys navigate to next gap or
+            residue in cursor mode
+          </li>
+          <li></li>
+        </ul>
+      </td>
+      <td align="left" valign="top">
+        <ul>
+          <li>
+            <!-- JAL-3493 -->Escape does not clear highlights on the
+            alignment (Since Jalview 2.10.3)
+          </li>
+          <li>
+            <!--  JAL-3680 -->Alt+Left or Right arrow in cursor mode
+            doesn't slide selected sequences
+          </li>
+          <li>
+            <!-- JAL-3613 -->Peptide-to-CDS tracking broken when
+            multiple EMBL gene products shown for a single contig
+          </li>
+        </ul>
+      </td>
+    </tr>
+    <tr>
+      <td width="60" align="center" nowrap><strong><a
           id="Jalview.2.11.1">2.11.1</a><a id="Jalview.2.11.1.0">.0</a><br />
           <em>22/04/2020</em></strong></td>
       <td align="left" valign="top">
index 5cec67d..52cddb2 100644 (file)
@@ -32,7 +32,7 @@
       Function, and Genetics</em> 43(2): 227-241. <a
       href="http://www.ncbi.nlm.nih.gov/pubmed/12112692">PubMed</a>
     or available on the <a
-      href="http://valdarlab.unc.edu/publications.html">Valdar
+      href="http://valdarlab.unc.edu/publications">Valdar
       Group publications page</a>), but the SMERFs score was developed later
     and described by Manning et al. in 2008 (<a
       href="http://www.biomedcentral.com/1471-2105/9/51">BMC
index d627c66..472bda0 100644 (file)
@@ -58,7 +58,7 @@
     <ul>
       <li><a href="http://www.clustal.org/omega">Clustal Omega</a> (version 1.2.4)</li>
       <li><a href="http://www.clustal.org/clustal2">ClustalW</a> (version 2.1)</li>
-      <li><a href="http://align.bmr.kyushu-u.ac.jp/mafft/software/">Mafft</a> (version 7.310)</li>
+      <li><a href="https://mafft.cbrc.jp/alignment/software/index.html">Mafft</a> (version 7.310)</li>
       <li><a href="http://www.drive5.com/muscle">Muscle</a> (version 3.8.31)</li>
       <li><a href="http://www.tcoffee.org/Projects_home_page/t_coffee_home_page.html">T-coffee</a> (version 11.00.8cbe486)</li>
       <li><a href="http://probcons.stanford.edu/">Probcons</a> (version 1.12)</li>
index 707f1ba..25cca6b 100644 (file)
@@ -211,7 +211,7 @@ label.show_non_conserved = Mostrar no conservadas
 label.overview_window = Ventana resumen
 label.none = Ninguno
 label.above_identity_threshold = Por encima del umbral de identidad
-label.show_sequence_features = Mostrar las características de las secuencias
+label.show_sequence_features = Mostrar las características de secuencia
 label.nucleotide = Nucleótido
 label.to_new_alignment = A nuevo alineamiento
 label.to_this_alignment = Añadir a este alineamiento
@@ -693,7 +693,12 @@ label.annotations_for_params = Anotaciones de - {0}
 label.generating_features_for_params = Generando características de - {0}
 label.generating_annotations_for_params = Generando anotaciones de - {0}
 label.varna_params = VARNA - {0}
-label.sequence_feature_settings = Configuración de las características de la secuencia
+label.sequence_feature_settings = Configuración de las características de secuencia
+label.sequence_feature_settings_for = Configuración de las características de secuencia para {0}
+label.sequence_feature_settings_for_view = Configuración de las características de secuencia para vista "{0}"
+label.sequence_feature_settings_for_CDS_and_Protein = Configuración de las características de secuencia para CDS y Proteína 
+action.undo_changes_to_feature_settings = Deshacer todos los cambios no aplicados
+action.undo_changes_to_feature_settings_and_close_the_dialog = Deshacer cambios pendientes, cerrar diálogo
 label.pairwise_aligned_sequences = Secuencias alineadas a pares
 label.original_data_for_params = Datos originales de {0}
 label.points_for_params = Puntos de {0}
@@ -1191,6 +1196,7 @@ warn.urls_not_contacted=URLs que no pudieron ser contactados
 label.prot_alignment_colour=Color del Alineamiento Proteico
 info.associate_wit_sequence=Asociar con secuencia
 label.protein=Proteína
+label.CDS=CDS
 warn.oneseq_msainput_selection=La selección actual sólo contiene una única secuencia. ¿Quieres enviar todas las secuencias para la alineación en su lugar?
 label.use_rnaview=Usar RNAView para estructura secondaria
 label.search_all=Introducir uno o más valores de búsqueda separados por punto y coma ";" (Nota: buscará en toda la base de datos PDB)
index 99580ae..e4aa736 100644 (file)
@@ -538,7 +538,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           }
           if (viewport.cursorMode)
           {
-            alignPanel.getSeqPanel().moveCursor(0, 1);
+            alignPanel.getSeqPanel().moveCursor(0, 1,
+                    evt.isShiftDown() && !evt.isAltDown());
           }
           break;
 
@@ -549,9 +550,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           }
           if (viewport.cursorMode)
           {
-            alignPanel.getSeqPanel().moveCursor(0, -1);
+            alignPanel.getSeqPanel().moveCursor(0, -1,
+                    evt.isShiftDown() && !evt.isAltDown());
           }
-
           break;
 
         case KeyEvent.VK_LEFT:
@@ -562,7 +563,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           }
           else
           {
-            alignPanel.getSeqPanel().moveCursor(-1, 0);
+            alignPanel.getSeqPanel().moveCursor(-1, 0, evt.isShiftDown());
           }
 
           break;
@@ -574,7 +575,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           }
           else
           {
-            alignPanel.getSeqPanel().moveCursor(1, 0);
+            alignPanel.getSeqPanel().moveCursor(1, 0, evt.isShiftDown());
           }
           break;
 
@@ -1769,19 +1770,19 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   synchronized void slideSequences(boolean right, int size)
   {
     List<SequenceI> sg = new ArrayList<>();
-    if (viewport.cursorMode)
-    {
-      sg.add(viewport.getAlignment()
-              .getSequenceAt(alignPanel.getSeqPanel().seqCanvas.cursorY));
-    }
-    else if (viewport.getSelectionGroup() != null
-            && viewport.getSelectionGroup().getSize() != viewport
-                    .getAlignment().getHeight())
+    if (viewport.getSelectionGroup() != null && viewport.getSelectionGroup()
+            .getSize() != viewport.getAlignment().getHeight())
     {
       sg = viewport.getSelectionGroup()
               .getSequences(viewport.getHiddenRepSequences());
     }
 
+    if (sg.size() == 0 && viewport.cursorMode)
+    {
+      sg.add(viewport.getAlignment()
+              .getSequenceAt(alignPanel.getSeqPanel().seqCanvas.cursorY));
+    }
+
     if (sg.size() < 1)
     {
       return;
@@ -2479,7 +2480,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     }
     viewport.setSelectionGroup(null);
     viewport.getColumnSelection().clear();
-    viewport.setSelectionGroup(null);
+    viewport.setSearchResults(null);
     alignPanel.getIdPanel().getIdCanvas().searchResults = null;
     // JAL-2034 - should delegate to
     // alignPanel to decide if overview needs
index def4be1..407acd6 100644 (file)
@@ -460,47 +460,80 @@ public class SeqPanel extends JPanel
 
   void moveCursor(int dx, int dy)
   {
-    seqCanvas.cursorX += dx;
-    seqCanvas.cursorY += dy;
-
+    moveCursor(dx, dy,false);
+  }
+  void moveCursor(int dx, int dy, boolean nextWord)
+  {
     HiddenColumns hidden = av.getAlignment().getHiddenColumns();
 
-    if (av.hasHiddenColumns() && !hidden.isVisible(seqCanvas.cursorX))
+    if (nextWord)
     {
-      int original = seqCanvas.cursorX - dx;
       int maxWidth = av.getAlignment().getWidth();
-
-      if (!hidden.isVisible(seqCanvas.cursorX))
-      {
-        int visx = hidden.absoluteToVisibleColumn(seqCanvas.cursorX - dx);
-        int[] region = hidden.getRegionWithEdgeAtRes(visx);
-
-        if (region != null) // just in case
+      int maxHeight=av.getAlignment().getHeight();
+      SequenceI seqAtRow = av.getAlignment().getSequenceAt(seqCanvas.cursorY);
+      // look for next gap or residue
+      boolean isGap = Comparison.isGap(seqAtRow.getCharAt(seqCanvas.cursorX));
+      int p = seqCanvas.cursorX,lastP,r=seqCanvas.cursorY,lastR;
+      do
+      {
+        lastP = p;
+        lastR = r;
+        if (dy != 0)
         {
-          if (dx == 1)
+          r += dy;
+          if (r < 0)
           {
-            // moving right
-            seqCanvas.cursorX = region[1] + 1;
+            r = 0;
           }
-          else if (dx == -1)
+          if (r >= maxHeight)
           {
-            // moving left
-            seqCanvas.cursorX = region[0] - 1;
+            r = maxHeight - 1;
           }
+          seqAtRow = av.getAlignment().getSequenceAt(r);
         }
-        seqCanvas.cursorX = (seqCanvas.cursorX < 0) ? 0 : seqCanvas.cursorX;
-      }
+        p = nextVisible(hidden, maxWidth, p, dx);
+      } while ((dx != 0 ? p != lastP : r != lastR)
+              && isGap == Comparison.isGap(seqAtRow.getCharAt(p)));
+      seqCanvas.cursorX=p;
+      seqCanvas.cursorY=r;
+    } else {
+      int maxWidth = av.getAlignment().getWidth();
+      seqCanvas.cursorX = nextVisible(hidden, maxWidth, seqCanvas.cursorX, dx);
+      seqCanvas.cursorY += dy;
+    }
+    scrollToVisible(false);
+  }
 
-      if (seqCanvas.cursorX >= maxWidth
-              || !hidden.isVisible(seqCanvas.cursorX))
+  private int nextVisible(HiddenColumns hidden,int maxWidth, int original, int dx)
+  {
+    int newCursorX=original+dx;
+    if (av.hasHiddenColumns() && !hidden.isVisible(newCursorX))
+    {
+      int visx = hidden.absoluteToVisibleColumn(newCursorX - dx);
+      int[] region = hidden.getRegionWithEdgeAtRes(visx);
+
+      if (region != null) // just in case
       {
-        seqCanvas.cursorX = original;
+        if (dx == 1)
+        {
+          // moving right
+          newCursorX = region[1] + 1;
+        }
+        else if (dx == -1)
+        {
+          // moving left
+          newCursorX = region[0] - 1;
+        }
       }
     }
-
-    scrollToVisible(false);
+    newCursorX = (newCursorX < 0) ? 0 : newCursorX;
+    if (newCursorX >= maxWidth
+            || !hidden.isVisible(newCursorX))
+    {
+      newCursorX = original;
+    }
+    return newCursorX;
   }
-
   /**
    * Scroll to make the cursor visible in the viewport.
    * 
index 73aeb79..213a1c9 100644 (file)
 package jalview.gui;
 
 import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
 
 import jalview.datamodel.AlignmentI;
+import jalview.datamodel.SearchResults;
+import jalview.datamodel.SearchResultsI;
 import jalview.io.DataSourceType;
 import jalview.io.FileLoader;
 
@@ -338,4 +344,27 @@ public class SeqCanvasTest
             "wrappedRepeatHeightPx");
     assertEquals(repeatingHeight, charHeight * (2 + al.getHeight()));
   }
+
+  @Test(groups = "Functional")
+  public void testClear_HighlightAndSelection()
+  {
+    AlignFrame af = new FileLoader().LoadFileWaitTillLoaded(
+            "examples/uniref50.fa", DataSourceType.FILE);
+    AlignViewport av = af.getViewport();
+    SearchResultsI highlight = new SearchResults();
+    highlight.addResult(
+            av.getAlignment().getSequenceAt(1).getDatasetSequence(), 50,
+            80);
+    af.alignPanel.highlightSearchResults(highlight);
+    af.avc.markHighlightedColumns(false, false, false);
+    assertNotNull(av.getSearchResults(),
+            "No highlight was created on alignment");
+    assertFalse(av.getColumnSelection().isEmpty(),
+            "No selection was created from highlight");
+    af.deselectAllSequenceMenuItem_actionPerformed(null);
+    assertTrue(av.getColumnSelection().isEmpty(),
+            "No Selection should be present after deselecting all.");
+    assertNull(av.getSearchResults(),
+            "No higlighted search results should be present after deselecting all.");
+  }
 }