Merge branch 'develop' into spike/JAL-4047/JAL-4048_columns_in_sequenceID
authorJames Procter <j.procter@dundee.ac.uk>
Sat, 15 Apr 2023 09:52:09 +0000 (10:52 +0100)
committerJames Procter <j.procter@dundee.ac.uk>
Sat, 15 Apr 2023 09:52:09 +0000 (10:52 +0100)
1  2 
src/jalview/api/AlignViewportI.java
src/jalview/gui/PopupMenu.java
src/jalview/viewmodel/AlignmentViewport.java

   */
  package jalview.api;
  
 +import java.awt.Color;
 +import java.awt.Font;
 +import java.util.Hashtable;
 +import java.util.Iterator;
 +import java.util.List;
 +import java.util.Map;
 +
  import jalview.analysis.Conservation;
  import jalview.analysis.TreeModel;
  import jalview.datamodel.AlignmentAnnotation;
@@@ -34,6 -27,8 +34,8 @@@ import jalview.datamodel.AlignmentExpor
  import jalview.datamodel.AlignmentI;
  import jalview.datamodel.AlignmentView;
  import jalview.datamodel.ColumnSelection;
+ import jalview.datamodel.ContactListI;
+ import jalview.datamodel.ContactMatrixI;
  import jalview.datamodel.ProfilesI;
  import jalview.datamodel.SearchResultsI;
  import jalview.datamodel.SequenceCollectionI;
@@@ -42,7 -37,13 +44,7 @@@ import jalview.datamodel.SequenceI
  import jalview.renderer.ResidueShaderI;
  import jalview.schemes.ColourSchemeI;
  import jalview.viewmodel.ViewportRanges;
 -
 -import java.awt.Color;
 -import java.awt.Font;
 -import java.util.Hashtable;
 -import java.util.Iterator;
 -import java.util.List;
 -import java.util.Map;
 +import jalview.viewmodel.seqfeatures.IdColumns;
  
  /**
   * @author jimp
@@@ -476,6 -477,8 +478,8 @@@ public interface AlignViewportI extend
     */
    SearchResultsI getSearchResults();
  
+   ContactListI getContactList(AlignmentAnnotation _aa, int column);
    /**
     * Updates view settings with the given font. You may need to call
     * AlignmentPanel.fontChanged to update the layout geometry.
     */
    Iterator<int[]> getViewAsVisibleContigs(boolean selectedRegionOnly);
  
 +  IdColumns getIdColumns();
++
+   ContactMatrixI getContactMatrix(AlignmentAnnotation alignmentAnnotation);
  }
@@@ -87,8 -87,6 +87,8 @@@ import jalview.util.Platform
  import jalview.util.StringUtils;
  import jalview.util.UrlLink;
  import jalview.viewmodel.seqfeatures.FeatureRendererModel;
 +import jalview.viewmodel.seqfeatures.IdColumn;
 +import jalview.viewmodel.seqfeatures.IdColumns;
  
  /**
   * The popup menu that is displayed on right-click on a sequence id, or in the
@@@ -728,37 -726,9 +728,37 @@@ public class PopupMenu extends JPopupMe
        rnaStructureMenu.setVisible(false);
      }
  
 +    if (forIdPanel)
 +    {
 +      addDisplayColumnsMenu();
 +    }
 +
      addLinksAndFeatures(seq, column);
    }
  
 +  void addDisplayColumnsMenu()
 +  {
 +    JMenu dis_cols = new JMenu(
 +            MessageManager.getString("action.displayed_columns"));
 +    final IdColumns id_cols = ap.av.getIdColumns();
 +    for (final IdColumn col : id_cols.getIdColumns())
 +    {
 +      JMenuItem col_entry = new JCheckBoxMenuItem(col.getLabel(),
 +              col.isVisible());
 +      col_entry.addActionListener(new ActionListener()
 +      {
 +
 +        @Override
 +        public void actionPerformed(ActionEvent e)
 +        {
 +          id_cols.toggleVisible(col.getLabel());
 +        }
 +      });
 +      dis_cols.add(col_entry);
 +    }
 +    add(dis_cols);
 +  }
 +
    /**
     * Adds
     * <ul>
              MessageManager.getString("label.group_description"));
      dialog.showDialog(ap.alignFrame,
              MessageManager.getString("label.edit_group_name_description"),
-             new Runnable()
-             {
-               @Override
-               public void run()
-               {
-                 sg.setName(dialog.getName());
-                 sg.setDescription(dialog.getDescription());
-                 refresh();
-               }
+             () -> {
+               sg.setName(dialog.getName());
+               sg.setDescription(dialog.getDescription());
+               refresh();
+               return null;
              });
    }
  
              sequence.getDescription(),
              MessageManager.getString("label.sequence_name"),
              MessageManager.getString("label.sequence_description"));
-     dialog.showDialog(ap.alignFrame, MessageManager.getString(
-             "label.edit_sequence_name_description"), new Runnable()
-             {
-               @Override
-               public void run()
+     dialog.showDialog(ap.alignFrame, MessageManager
+             .getString("label.edit_sequence_name_description"), () -> {
+               if (dialog.getName() != null)
                {
-                 if (dialog.getName() != null)
+                 if (dialog.getName().indexOf(" ") > -1)
                  {
-                   if (dialog.getName().indexOf(" ") > -1)
-                   {
-                     JvOptionPane.showMessageDialog(ap,
-                             MessageManager.getString(
-                                     "label.spaces_converted_to_underscores"),
-                             MessageManager.getString(
-                                     "label.no_spaces_allowed_sequence_name"),
-                             JvOptionPane.WARNING_MESSAGE);
-                   }
-                   sequence.setName(dialog.getName().replace(' ', '_'));
-                   ap.paintAlignment(false, false);
+                   JvOptionPane.showMessageDialog(ap,
+                           MessageManager.getString(
+                                   "label.spaces_converted_to_underscores"),
+                           MessageManager.getString(
+                                   "label.no_spaces_allowed_sequence_name"),
+                           JvOptionPane.WARNING_MESSAGE);
                  }
-                 sequence.setDescription(dialog.getDescription());
-                 ap.av.firePropertyChange("alignment", null,
-                         ap.av.getAlignment().getSequences());
+                 sequence.setName(dialog.getName().replace(' ', '_'));
+                 ap.paintAlignment(false, false);
                }
+               sequence.setDescription(dialog.getDescription());
+               ap.av.firePropertyChange("alignment", null,
+                       ap.av.getAlignment().getSequences());
+               return null;
              });
    }
  
                seq.getSequenceAsString(sg.getStartRes(), sg.getEndRes() + 1),
                null, MessageManager.getString("label.edit_sequence"), null);
        dialog.showDialog(ap.alignFrame,
-               MessageManager.getString("label.edit_sequence"),
-               new Runnable()
-               {
-                 @Override
-                 public void run()
-                 {
-                   EditCommand editCommand = new EditCommand(
-                           MessageManager.getString("label.edit_sequences"),
-                           Action.REPLACE,
-                           dialog.getName().replace(' ',
-                                   ap.av.getGapCharacter()),
-                           sg.getSequencesAsArray(
-                                   ap.av.getHiddenRepSequences()),
-                           sg.getStartRes(), sg.getEndRes() + 1,
-                           ap.av.getAlignment());
-                   ap.alignFrame.addHistoryItem(editCommand);
-                   ap.av.firePropertyChange("alignment", null,
-                           ap.av.getAlignment().getSequences());
-                 }
+               MessageManager.getString("label.edit_sequence"), () -> {
+                 EditCommand editCommand = new EditCommand(
+                         MessageManager.getString("label.edit_sequences"),
+                         Action.REPLACE,
+                         dialog.getName().replace(' ',
+                                 ap.av.getGapCharacter()),
+                         sg.getSequencesAsArray(
+                                 ap.av.getHiddenRepSequences()),
+                         sg.getStartRes(), sg.getEndRes() + 1,
+                         ap.av.getAlignment());
+                 ap.alignFrame.addHistoryItem(editCommand);
+                 ap.av.firePropertyChange("alignment", null,
+                         ap.av.getAlignment().getSequences());
+                 return null;
                });
      }
    }
@@@ -41,6 -41,7 +41,7 @@@ import jalview.api.AlignViewportI
  import jalview.api.AlignmentViewPanel;
  import jalview.api.FeaturesDisplayedI;
  import jalview.api.ViewStyleI;
+ import jalview.bin.Console;
  import jalview.commands.CommandI;
  import jalview.datamodel.AlignedCodonFrame;
  import jalview.datamodel.AlignmentAnnotation;
@@@ -49,6 -50,8 +50,8 @@@ import jalview.datamodel.AlignmentI
  import jalview.datamodel.AlignmentView;
  import jalview.datamodel.Annotation;
  import jalview.datamodel.ColumnSelection;
+ import jalview.datamodel.ContactListI;
+ import jalview.datamodel.ContactMatrixI;
  import jalview.datamodel.HiddenColumns;
  import jalview.datamodel.HiddenSequences;
  import jalview.datamodel.ProfilesI;
@@@ -57,6 -60,8 +60,8 @@@ import jalview.datamodel.Sequence
  import jalview.datamodel.SequenceCollectionI;
  import jalview.datamodel.SequenceGroup;
  import jalview.datamodel.SequenceI;
+ import jalview.gui.QuitHandler;
+ import jalview.project.Jalview2XML;
  import jalview.renderer.ResidueShader;
  import jalview.renderer.ResidueShaderI;
  import jalview.schemes.ColourSchemeI;
@@@ -67,7 -72,6 +72,7 @@@ import jalview.util.Comparison
  import jalview.util.MapList;
  import jalview.util.MappingUtils;
  import jalview.util.MessageManager;
 +import jalview.viewmodel.seqfeatures.IdColumns;
  import jalview.viewmodel.styles.ViewStyle;
  import jalview.workers.AlignCalcManager;
  import jalview.workers.ComplementConsensusThread;
@@@ -101,6 -105,11 +106,11 @@@ public abstract class AlignmentViewpor
    protected Deque<CommandI> redoList = new ArrayDeque<>();
  
    /**
+    * used to determine if quit should be confirmed
+    */
+   private boolean savedUpToDate = false;
+   /**
     * alignment displayed in the viewport. Please use get/setter
     */
    protected AlignmentI alignment;
      {
        this.historyList.push(command);
        broadcastCommand(command, false);
+       setSavedUpToDate(false);
+       Jalview2XML.setStateSavedUpToDate(false);
      }
    }
  
      return searchResults;
    }
  
+   @Override
+   public ContactListI getContactList(AlignmentAnnotation _aa, int column)
+   {
+     return alignment.getContactListFor(_aa, column);
+   }
+   @Override
+   public ContactMatrixI getContactMatrix(
+           AlignmentAnnotation alignmentAnnotation)
+   {
+     return alignment.getContactMatrixFor(alignmentAnnotation);
+   }
    /**
     * get the consensus sequence as displayed under the PID consensus annotation
     * row.
              false));
    }
  
 +  /**
 +   * ordered list of annotation values displayed per sequence in ID panel
 +   */
 +  private IdColumns id_columns = null;
 +
 +  /**
 +   * available and currently visible columns for this view
 +   */
 +  @Override
 +  public IdColumns getIdColumns()
 +  {
 +    if (alignment == null)
 +    {
 +      return null;
 +    }
 +    if (id_columns == null)
 +    {
 +      id_columns = new IdColumns(alignment);
 +    }
 +    return id_columns;
 +  }
 +
+   public void setSavedUpToDate(boolean s)
+   {
+     setSavedUpToDate(s, QuitHandler.Message.UNSAVED_CHANGES);
+   }
+   public void setSavedUpToDate(boolean s, QuitHandler.Message m)
+   {
+     Console.debug(
+             "Setting " + this.getViewId() + " setSavedUpToDate to " + s);
+     savedUpToDate = s;
+     QuitHandler.setMessage(m);
+   }
+   public boolean savedUpToDate()
+   {
+     Console.debug("Returning " + this.getViewId() + " savedUpToDate value: "
+             + savedUpToDate);
+     return savedUpToDate;
+   }
  }