Merge branch 'features/JAL-2388OverviewWindow' into develop
authorJim Procter <jprocter@issues.jalview.org>
Fri, 12 May 2017 14:09:45 +0000 (15:09 +0100)
committerJim Procter <jprocter@issues.jalview.org>
Fri, 12 May 2017 14:09:45 +0000 (15:09 +0100)
1  2 
help/help.jhm
help/helpTOC.xml
resources/lang/Messages.properties
resources/lang/Messages_es.properties
src/jalview/gui/AlignFrame.java
src/jalview/gui/SeqPanel.java
src/jalview/gui/SequenceRenderer.java

diff --combined help/help.jhm
     
     <mapID target="memory" url="html/memory.html" />
     <mapID target="groovy" url="html/features/groovy.html" />
 -   <mapID target="groovy.featurecounter" url="html/groovy/featureCounter.html" />
 +   <mapID target="groovy.featurescounter" url="html/groovy/featuresCounter.html" />
     <mapID target="privacy" url="html/privacy.html" />
     <mapID target="vamsas" url="html/vamsas/index.html"/>
     <mapID target="aminoAcids" url="html/misc/aminoAcids.html" />
     <mapID target="homeIcon" url="icons/Home.png" />
     <mapID target="printIcon" url="icons/print.png" />
     <mapID target="printSetupIcon" url="icons/setup.png" />
+    
+    <mapID target="overview" url="features/overview.html" />
  </map>
diff --combined help/helpTOC.xml
@@@ -24,7 -24,7 +24,8 @@@
        <tocitem text="Jalview Documentation" target="home" expand="true">
                        <tocitem text="What's new" target="new" expand="true">
                                <tocitem text="Latest Release Notes" target="release"/>
 +                              <tocitem text="Groovy Features Counter example" target="groovy.featurescounter"/>
+                               <tocitem text="Omit hidden regions in Overview" target="overview"/>
                </tocitem>
                
                <tocitem text="Editing Alignments" target="edit" />
                <tocitem text="Preferences" target="preferences" />
                <tocitem text="Memory Settings" target="memory" expand="false"/>
                <tocitem text="Scripting with Groovy" target="groovy">
 -                      <tocitem text="Groovy Feature Counter example" target="groovy.featurecounter"/>
 +                      <tocitem text="Groovy Features Counter example" target="groovy.featurescounter"/>
                </tocitem>
                <tocitem text="Command Line" target="commandline" expand="false">
                        <tocitem text="Command Line Arguments" target="clarguments" />
@@@ -381,8 -381,10 +381,8 @@@ label.remove_from_default_list = Remov
  label.remove_user_defined_colour = Remove user defined colour
  label.you_must_select_least_two_sequences = You must select at least 2 sequences.
  label.invalid_selection = Invalid Selection
 -label.principal_component_analysis_must_take_least_four_input_sequences = Principal component analysis must take\nat least 4 input sequences.
  label.sequence_selection_insufficient = Sequence selection insufficient
 -label.you_need_more_two_sequences_selected_build_tree = You need to have more than two sequences selected to build a tree!
 -label.you_need_more_than_n_sequences = You need to have more than {0} sequences
 +label.you_need_at_least_n_sequences = You need to select at least {0} sequences
  label.not_enough_sequences = Not enough sequences
  label.selected_region_to_tree_may_only_contain_residues_or_gaps =  The selected region to create a tree may\nonly contain residues or gaps.\nTry using the Pad function in the edit menu,\nor one of the multiple sequence alignment web services.
  label.sequences_selection_not_aligned = Sequences in selection are not aligned
@@@ -1300,9 -1302,10 +1300,10 @@@ warn.name_cannot_be_duplicate = User-de
  label.invalid_name = Invalid Name !
  label.output_seq_details = Output Sequence Details to list all database references
  label.urllinks = Links
+ label.togglehidden = Show hidden regions
  label.quality_descr = Alignment Quality based on Blosum62 scores
  label.conservation_descr = Conservation of total alignment less than {0}% gaps
  label.consensus_descr = PID
  label.complement_consensus_descr = PID for cDNA
  label.strucconsensus_descr = PID for base pairs
- label.occupancy_descr = Number of aligned positions 
+ label.occupancy_descr = Number of aligned positions 
@@@ -177,7 -177,7 +177,7 @@@ label.score_model_pid = % Identida
  label.score_model_blosum62 = BLOSUM62
  label.score_model_pam250 = PAM 250
  label.score_model_smithwatermanscore = Puntuación entre secuencias alineadas por Smith-Waterman con matriz por defecto proteica / nucleotídica
 -label.score_model_sequencefeaturesimilarity = Medida de distancia por cuenta promedia de características no compartidas at sequence positions 
 +label.score_model_sequencefeaturesimilarity = Medida de distancia por cuenta promedia de características no compartidas en posiciones de secuencia
  label.score_model_conservation = Conservación de las propiedades físico-químicas
  label.score_model_enhconservation = Conservación de las propiedades físico-químicas
  label.status_bar = Barra de estado
@@@ -349,8 -349,9 +349,8 @@@ label.remove_from_default_list = elimin
  label.remove_user_defined_colour = Eliminar el color definido por el usuario
  label.you_must_select_least_two_sequences = Debes seleccionar al menos 2 secuencias.
  label.invalid_selection = Selección inválida
 -label.principal_component_analysis_must_take_least_four_input_sequences = El an\u00E1lisis de la componente principal debe tomar\nal menos 4 secuencias de entrada.
  label.sequence_selection_insufficient = Selección de secuencias insuficiente
 -label.you_need_more_two_sequences_selected_build_tree = necesitas seleccionar más de dos secuencias para construir un árbol!
 +label.you_need_at_least_n_sequences = Necesitas seleccionar al menos {0} secuencias
  label.not_enough_sequences = No suficientes secuencias
  label.selected_region_to_tree_may_only_contain_residues_or_gaps = La regi\u00F3n seleccionada para construir un \u00E1rbol puede\ncontener s\u00F3lo residuos o espacios.\nPrueba usando la funci\u00F3n Pad en el men\u00FA de edici\u00F3n,\n o uno de los m\u00FAltiples servicios web de alineamiento de secuencias.
  label.sequences_selection_not_aligned = Las secuencias seleccionadas no están alineadas
@@@ -1300,9 -1301,4 +1300,10 @@@ warn.name_cannot_be_duplicate = Los nom
  label.invalid_name = Nombre inválido !
  label.output_seq_details = Seleccionar Detalles de la secuencia para ver todas
  label.urllinks = Enlaces
 -label.togglehidden = Show hidden regions
 +label.quality_descr = Calidad de alineamiento basándose en puntuación Blosum62
 +label.conservation_descr = Conservación del alineamiento total menos de {0}% huecos
 +label.consensus_descr = % Identidad
 +label.complement_consensus_descr = % Identidad para cDNA
 +label.strucconsensus_descr = % Identidad para pares de bases
 +label.occupancy_descr = Número de posiciones alineadas
++label.togglehidden = Show hidden regions
@@@ -53,6 -53,7 +53,7 @@@ import jalview.datamodel.AlignmentI
  import jalview.datamodel.AlignmentOrder;
  import jalview.datamodel.AlignmentView;
  import jalview.datamodel.ColumnSelection;
+ import jalview.datamodel.HiddenColumns;
  import jalview.datamodel.HiddenSequences;
  import jalview.datamodel.PDBEntry;
  import jalview.datamodel.SeqCigar;
@@@ -233,7 -234,7 +234,7 @@@ public class AlignFrame extends GAlignF
     * @param height
     *          height of frame.
     */
-   public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns,
+   public AlignFrame(AlignmentI al, HiddenColumns hiddenColumns,
            int width, int height)
    {
      this(al, hiddenColumns, width, height, null);
     * @param sequenceSetId
     *          (may be null)
     */
-   public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns,
+   public AlignFrame(AlignmentI al, HiddenColumns hiddenColumns,
            int width, int height, String sequenceSetId)
    {
      this(al, hiddenColumns, width, height, sequenceSetId, null);
     * @param viewId
     *          (may be null)
     */
-   public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns,
+   public AlignFrame(AlignmentI al, HiddenColumns hiddenColumns,
            int width, int height, String sequenceSetId, String viewId)
    {
      setSize(width, height);
    }
  
    public AlignFrame(AlignmentI al, SequenceI[] hiddenSeqs,
-           ColumnSelection hiddenColumns, int width, int height)
+           HiddenColumns hiddenColumns, int width, int height)
    {
      setSize(width, height);
  
                exportData.getAlignment(), // class cast exceptions will
                // occur in the distant future
                exportData.getOmitHidden(), exportData.getStartEndPostions(),
-               f.getCacheSuffixDefault(format),
-               viewport.getColumnSelection());
+               f.getCacheSuffixDefault(format), viewport.getAlignment()
+                       .getHiddenColumns());
  
        if (output == null)
        {
        cap.setText(new FormatAdapter(alignPanel, exportData.getSettings())
                .formatSequences(format, exportData.getAlignment(),
                        exportData.getOmitHidden(),
-                       exportData.getStartEndPostions(),
-                       viewport.getColumnSelection()));
+  exportData
+                               .getStartEndPostions(), viewport
+                               .getAlignment().getHiddenColumns()));
        Desktop.addInternalFrame(cap, MessageManager.formatMessage(
                "label.alignment_output_command",
                new Object[] { e.getActionCommand() }), 600, 500);
        alignmentToExport = viewport.getAlignment();
      }
      alignmentStartEnd = alignmentToExport
-             .getVisibleStartAndEndIndex(viewport.getColumnSelection()
-                     .getHiddenColumns());
+             .getVisibleStartAndEndIndex(viewport.getAlignment()
+                     .getHiddenColumns()
+                     .getHiddenRegions());
      AlignmentExportData ed = new AlignmentExportData(alignmentToExport,
              omitHidden, alignmentStartEnd, settings);
      return ed;
        hiddenColumns = new ArrayList<int[]>();
        int hiddenOffset = viewport.getSelectionGroup().getStartRes(), hiddenCutoff = viewport
                .getSelectionGroup().getEndRes();
-       for (int[] region : viewport.getColumnSelection().getHiddenColumns())
+       for (int[] region : viewport.getAlignment().getHiddenColumns()
+               .getHiddenRegions())
        {
          if (region[0] >= hiddenOffset && region[1] <= hiddenCutoff)
          {
      if (viewport.getSelectionGroup() != null
              && viewport.getSelectionGroup().getSize() > 0)
      {
 -      if (viewport.getSelectionGroup().getSize() < 3)
 -      {
 -        JvOptionPane
 -                .showMessageDialog(
 -                        Desktop.desktop,
 -                        MessageManager
 -                                .getString("label.you_need_more_two_sequences_selected_build_tree"),
 -                        MessageManager
 -                                .getString("label.not_enough_sequences"),
 -                        JvOptionPane.WARNING_MESSAGE);
 -        return;
 -      }
 -
        SequenceGroup sg = viewport.getSelectionGroup();
  
        /* Decide if the selection is a column region */
                      viewport.getAlignment(), 0, false);
              SequenceI repseq = viewport.getAlignment().getSequenceAt(0);
              viewport.getAlignment().setSeqrep(repseq);
-             ColumnSelection cs = new ColumnSelection();
+             HiddenColumns cs = new HiddenColumns();
              cs.hideInsertionsFor(repseq);
-             viewport.setColumnSelection(cs);
+             viewport.getAlignment().setHiddenColumns(cs);
              isAnnotation = true;
            }
            // else if (IdentifyFile.FeaturesFile.equals(format))
@@@ -27,6 -27,7 +27,7 @@@ import jalview.commands.EditCommand.Act
  import jalview.commands.EditCommand.Edit;
  import jalview.datamodel.AlignmentI;
  import jalview.datamodel.ColumnSelection;
+ import jalview.datamodel.HiddenColumns;
  import jalview.datamodel.SearchResultMatchI;
  import jalview.datamodel.SearchResults;
  import jalview.datamodel.SearchResultsI;
@@@ -233,7 -234,8 +234,8 @@@ public class SeqPanel extends JPanel im
  
      if (av.hasHiddenColumns())
      {
-       res = av.getColumnSelection().adjustForHiddenColumns(res);
+       res = av.getAlignment().getHiddenColumns()
+               .adjustForHiddenColumns(res);
      }
  
      return res;
    {
      seqCanvas.cursorX += dx;
      seqCanvas.cursorY += dy;
+     HiddenColumns hidden = av.getAlignment().getHiddenColumns();
      if (av.hasHiddenColumns()
-             && !av.getColumnSelection().isVisible(seqCanvas.cursorX))
+  && !hidden.isVisible(seqCanvas.cursorX))
      {
        int original = seqCanvas.cursorX - dx;
        int maxWidth = av.getAlignment().getWidth();
  
-       while (!av.getColumnSelection().isVisible(seqCanvas.cursorX)
+       while (!hidden.isVisible(seqCanvas.cursorX)
                && seqCanvas.cursorX < maxWidth && seqCanvas.cursorX > 0)
        {
          seqCanvas.cursorX += dx;
        }
  
        if (seqCanvas.cursorX >= maxWidth
-               || !av.getColumnSelection().isVisible(seqCanvas.cursorX))
+               || !hidden.isVisible(seqCanvas.cursorX))
        {
          seqCanvas.cursorX = original;
        }
        {
          ap.scrollUp(true);
        }
 -      while (seqCanvas.cursorY + 1 > av.getRanges().getEndSeq())
 +      while (seqCanvas.cursorY > av.getRanges().getEndSeq())
        {
          ap.scrollUp(false);
        }
        if (!av.getWrapAlignment())
        {
-         while (seqCanvas.cursorX < av.getColumnSelection()
-                 .adjustForHiddenColumns(av.getRanges().getStartRes()))
+         HiddenColumns hidden = av.getAlignment().getHiddenColumns();
+         while (seqCanvas.cursorX < hidden.adjustForHiddenColumns(av
+                 .getRanges().getStartRes()))
          {
            if (!ap.scrollRight(false))
            {
              break;
            }
          }
-         while (seqCanvas.cursorX > av.getColumnSelection()
-                 .adjustForHiddenColumns(av.getRanges().getEndRes()))
+         while (seqCanvas.cursorX > hidden.adjustForHiddenColumns(av
+                 .getRanges().getEndRes()))
          {
            if (!ap.scrollRight(true))
            {
      if (av.hasHiddenColumns())
      {
        fixedColumns = true;
-       int y1 = av.getColumnSelection().getHiddenBoundaryLeft(startres);
-       int y2 = av.getColumnSelection().getHiddenBoundaryRight(startres);
+       int y1 = av.getAlignment().getHiddenColumns()
+               .getHiddenBoundaryLeft(startres);
+       int y2 = av.getAlignment().getHiddenColumns()
+               .getHiddenBoundaryRight(startres);
  
        if ((insertGap && startres > y1 && lastres < y1)
                || (!insertGap && startres < y2 && lastres > y2))
          {
            if (sg.getSize() == av.getAlignment().getHeight())
            {
-             if ((av.hasHiddenColumns() && startres < av
-                     .getColumnSelection().getHiddenBoundaryRight(startres)))
+             if ((av.hasHiddenColumns() && startres < av.getAlignment()
+                     .getHiddenColumns().getHiddenBoundaryRight(startres)))
              {
                endEditing();
                return;
     */
    @Override
    public void selection(SequenceGroup seqsel, ColumnSelection colsel,
-           SelectionSource source)
+           HiddenColumns hidden, SelectionSource source)
    {
      // TODO: fix this hack - source of messages is align viewport, but SeqPanel
      // handles selection messages...
       * Check for selection in a view of which this one is a dna/protein
       * complement.
       */
-     if (selectionFromTranslation(seqsel, colsel, source))
+     if (selectionFromTranslation(seqsel, colsel, hidden, source))
      {
        return;
      }
          }
          else
          {
-           av.getColumnSelection().setElementsFrom(colsel);
+           av.getColumnSelection().setElementsFrom(colsel,
+                   av.getAlignment().getHiddenColumns());
          }
        }
        av.isColSelChanged(true);
  
      if (copycolsel
              && av.hasHiddenColumns()
-             && (av.getColumnSelection() == null || av.getColumnSelection()
-                     .getHiddenColumns() == null))
+             && (av.getAlignment().getHiddenColumns() == null || av
+                     .getAlignment().getHiddenColumns().getHiddenRegions() == null))
      {
        System.err.println("Bad things");
      }
     * @param source
     */
    protected boolean selectionFromTranslation(SequenceGroup seqsel,
-           ColumnSelection colsel, SelectionSource source)
+           ColumnSelection colsel, HiddenColumns hidden,
+           SelectionSource source)
    {
      if (!(source instanceof AlignViewportI))
      {
      /*
       * Map column selection
       */
-     ColumnSelection cs = MappingUtils.mapColumnSelection(colsel, sourceAv,
-             av);
+     // ColumnSelection cs = MappingUtils.mapColumnSelection(colsel, sourceAv,
+     // av);
+     ColumnSelection cs = new ColumnSelection();
+     HiddenColumns hs = new HiddenColumns();
+     MappingUtils.mapColumnSelection(colsel, hidden, sourceAv, av, cs, hs);
      av.setColumnSelection(cs);
+     av.getAlignment().setHiddenColumns(hs);
  
      // lastly, update any dependent dialogs
      if (ap.getCalculationDialog() != null)
@@@ -20,6 -20,7 +20,7 @@@
   */
  package jalview.gui;
  
+ import jalview.api.AlignViewportI;
  import jalview.datamodel.SequenceGroup;
  import jalview.datamodel.SequenceI;
  import jalview.renderer.ResidueShaderI;
@@@ -34,7 -35,7 +35,7 @@@ public class SequenceRenderer implement
  {
    final static int CHAR_TO_UPPER = 'A' - 'a';
  
-   AlignViewport av;
+   AlignViewportI av;
  
    FontMetrics fm;
  
@@@ -57,7 -58,7 +58,7 @@@
     * 
     * @param viewport
     */
-   public SequenceRenderer(AlignViewport viewport)
+   public SequenceRenderer(AlignViewportI viewport)
    {
      this.av = viewport;
    }
     */
    void getBoxColour(ResidueShaderI shader, SequenceI seq, int i)
    {
 -    if (shader != null)
 +    if (shader.getColourScheme() != null)
      {
        resBoxColour = shader.findColour(seq.getCharAt(i),
                i, seq);
  
      drawBoxes(seq, start, end, y1);
  
-     if (av.validCharWidth)
+     if (av.isValidCharWidth())
      {
        drawText(seq, start, end, y1);
      }