X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FPopupMenu.java;h=2c4eb7aceb922e904ef1fa2f1825af2558a776a7;hb=58962a97c9819d186ce347072e8750dbcae16f0f;hp=38f409f8591be137da9b0bd18b11a0efcdc1e1a8;hpb=d1707d4c26db76cfeb640f0dbeb3e3427fd40eb7;p=jalview.git diff --git a/src/jalview/gui/PopupMenu.java b/src/jalview/gui/PopupMenu.java index 38f409f..2c4eb7a 100644 --- a/src/jalview/gui/PopupMenu.java +++ b/src/jalview/gui/PopupMenu.java @@ -55,7 +55,9 @@ import jalview.util.UrlLink; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.ArrayList; import java.util.Arrays; +import java.util.BitSet; import java.util.Collection; import java.util.Collections; import java.util.Hashtable; @@ -450,7 +452,7 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener buildGroupURLMenu(sg, groupLinks); } // Add a 'show all structures' for the current selection - Hashtable pdbe = new Hashtable(), reppdb = new Hashtable(); + Hashtable pdbe = new Hashtable<>(), reppdb = new Hashtable<>(); SequenceI sqass = null; for (SequenceI sq : ap.av.getSequenceSelection()) { @@ -517,7 +519,7 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener void addFeatureLinks(final SequenceI seq, List links) { JMenu linkMenu = new JMenu(MessageManager.getString("action.link")); - Map> linkset = new LinkedHashMap>(); + Map> linkset = new LinkedHashMap<>(); for (String link : links) { @@ -601,8 +603,8 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener * the insertion order, which is the order of the annotations on the * alignment. */ - Map>> shownTypes = new LinkedHashMap>>(); - Map>> hiddenTypes = new LinkedHashMap>>(); + Map>> shownTypes = new LinkedHashMap<>(); + Map>> hiddenTypes = new LinkedHashMap<>(); AlignmentAnnotationUtils.getShownHiddenTypes(shownTypes, hiddenTypes, AlignmentAnnotationUtils.asList(annotations), forSequences); @@ -708,7 +710,7 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener SequenceI[] seqs = ap.av.getSelectionAsNewSequence(); String[][] idandseqs = GroupUrlLink.formStrings(seqs); - Hashtable commonDbrefs = new Hashtable(); + Hashtable commonDbrefs = new Hashtable<>(); for (int sq = 0; sq < seqs.length; sq++) { @@ -1367,8 +1369,8 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener * Temporary store to hold distinct calcId / type pairs for the tooltip. * Using TreeMap means calcIds are shown in alphabetical order. */ - SortedMap tipEntries = new TreeMap(); - final Map> candidates = new LinkedHashMap>(); + SortedMap tipEntries = new TreeMap<>(); + final Map> candidates = new LinkedHashMap<>(); AlignmentI al = this.ap.av.getAlignment(); AlignmentUtils.findAddableReferenceAnnotations(forSequences, tipEntries, candidates, al); @@ -1443,24 +1445,59 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener protected void hideInsertions_actionPerformed(ActionEvent actionEvent) { - if (sequence != null) + + HiddenColumns hidden = new HiddenColumns(); + BitSet inserts = new BitSet(), mask = new BitSet(); + + // set mask to preserve existing hidden columns outside selected group + if (ap.av.hasHiddenColumns()) { - /* ColumnSelection cs = ap.av.getColumnSelection(); - if (cs == null) - { - cs = new ColumnSelection(); - } - cs.hideInsertionsFor(sequence); - ap.av.setColumnSelection(cs);*/ + ap.av.getAlignment().getHiddenColumns().markHiddenRegions(mask); + } + + boolean markedPopup = false; + // mark inserts in current selection + if (ap.av.getSelectionGroup() != null) + { + // mark just the columns in the selection group to be hidden + inserts.set(ap.av.getSelectionGroup().getStartRes(), ap.av + .getSelectionGroup().getEndRes() + 1); + + // and clear that part of the mask + mask.andNot(inserts); - HiddenColumns hidden = ap.av.getAlignment().getHiddenColumns(); - if (hidden == null) + // now clear columns without gaps + for (SequenceI sq : ap.av.getSelectionGroup().getSequences()) { - hidden = new HiddenColumns(); + if (sq == sequence) + { + markedPopup = true; + } + inserts.and(sq.getInsertionsAsBits()); } - hidden.hideInsertionsFor(sequence); - ap.av.getAlignment().setHiddenColumns(hidden); } + else + { + // initially, mark all columns to be hidden + inserts.set(0, ap.av.getAlignment().getWidth()); + + // and clear out old hidden regions completely + mask.clear(); + } + + // now mark for sequence under popup if we haven't already done it + if (!markedPopup && sequence != null) + { + inserts.and(sequence.getInsertionsAsBits()); + } + + // finally, preserve hidden regions outside selection + inserts.or(mask); + + // and set hidden columns accordingly + hidden.hideMarkedBits(inserts); + + ap.av.getAlignment().setHiddenColumns(hidden); refresh(); } @@ -1519,7 +1556,9 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener void refresh() { ap.updateAnnotation(); - ap.paintAlignment(true); + // removed paintAlignment(true) here: + // updateAnnotation calls paintAlignment already, so don't need to call + // again PaintRefresher.Refresh(this, ap.av.getSequenceSetId()); } @@ -1888,33 +1927,36 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener return; } - int rsize = 0, gSize = sg.getSize(); - SequenceI[] rseqs, seqs = new SequenceI[gSize]; - SequenceFeature[] tfeatures, features = new SequenceFeature[gSize]; + List seqs = new ArrayList<>(); + List features = new ArrayList<>(); + /* + * assemble dataset sequences, and template new sequence features, + * for the amend features dialog + */ + int gSize = sg.getSize(); for (int i = 0; i < gSize; i++) { int start = sg.getSequenceAt(i).findPosition(sg.getStartRes()); int end = sg.findEndRes(sg.getSequenceAt(i)); if (start <= end) { - seqs[rsize] = sg.getSequenceAt(i).getDatasetSequence(); - features[rsize] = new SequenceFeature(null, null, null, start, end, - "Jalview"); - rsize++; + seqs.add(sg.getSequenceAt(i).getDatasetSequence()); + features.add(new SequenceFeature(null, null, null, start, end, null)); } } - rseqs = new SequenceI[rsize]; - tfeatures = new SequenceFeature[rsize]; - System.arraycopy(seqs, 0, rseqs, 0, rsize); - System.arraycopy(features, 0, tfeatures, 0, rsize); - features = tfeatures; - seqs = rseqs; - if (ap.getSeqPanel().seqCanvas.getFeatureRenderer().amendFeatures(seqs, - features, true, ap)) - { - ap.alignFrame.setShowSeqFeatures(true); - ap.highlightSearchResults(null); + + /* + * an entirely gapped region will generate empty lists of sequence / features + */ + if (!seqs.isEmpty()) + { + if (ap.getSeqPanel().seqCanvas.getFeatureRenderer().amendFeatures( + seqs, features, true, ap)) + { + ap.alignFrame.setShowSeqFeatures(true); + ap.highlightSearchResults(null); + } } }