X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fgui%2FAlignViewport.java;h=c18c989dce5b5299d1c0f9d8698695310099ebea;hb=e373651097c72eb6c9ca6009fb70d47341e8f405;hp=5e477c7f8cd29991a627c5fe73eae606f029b551;hpb=ed2283c5f54da377a2a2fdbdb7aec75ed7041714;p=jalview.git diff --git a/src/jalview/gui/AlignViewport.java b/src/jalview/gui/AlignViewport.java index 5e477c7..c18c989 100644 --- a/src/jalview/gui/AlignViewport.java +++ b/src/jalview/gui/AlignViewport.java @@ -38,18 +38,6 @@ */ package jalview.gui; -import java.awt.Container; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.Rectangle; -import java.util.ArrayList; -import java.util.Hashtable; -import java.util.Set; -import java.util.Vector; - -import javax.swing.JInternalFrame; -import javax.swing.JOptionPane; - import jalview.analysis.AlignmentUtils; import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder; import jalview.analysis.NJTree; @@ -76,6 +64,19 @@ import jalview.util.MessageManager; import jalview.viewmodel.AlignmentViewport; import jalview.ws.params.AutoCalcSetting; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Rectangle; +import java.util.ArrayList; +import java.util.Hashtable; +import java.util.List; +import java.util.Set; +import java.util.Vector; + +import javax.swing.JInternalFrame; +import javax.swing.JOptionPane; + /** * DOCUMENT ME! * @@ -83,7 +84,7 @@ import jalview.ws.params.AutoCalcSetting; * @version $Revision: 1.141 $ */ public class AlignViewport extends AlignmentViewport implements - SelectionSource, AlignViewportI, CommandListener + SelectionSource, CommandListener { Font font; @@ -243,7 +244,7 @@ public class AlignViewport extends AlignmentViewport implements showAutocalculatedAbove = Cache.getDefault( Preferences.SHOW_AUTOCALC_ABOVE, false); viewStyle.setScaleProteinAsCdna(Cache.getDefault( - Preferences.SCALE_PROTEIN_TO_CDNA, false)); + Preferences.SCALE_PROTEIN_TO_CDNA, true)); } void init() @@ -656,35 +657,32 @@ public class AlignViewport extends AlignmentViewport implements /** * * @param pdbEntries - * @return a series of SequenceI arrays, one for each PDBEntry, listing which - * sequence in the alignment holds a reference to it + * @return an array of SequenceI arrays, one for each PDBEntry, listing which + * sequences in the alignment hold a reference to it */ public SequenceI[][] collateForPDB(PDBEntry[] pdbEntries) { - ArrayList seqvectors = new ArrayList(); + List seqvectors = new ArrayList(); for (PDBEntry pdb : pdbEntries) { - ArrayList seqs = new ArrayList(); - for (int i = 0; i < alignment.getHeight(); i++) + List seqs = new ArrayList(); + for (SequenceI sq : alignment.getSequences()) { - Vector pdbs = alignment.getSequenceAt(i).getDatasetSequence() - .getPDBId(); + Vector pdbs = sq + .getDatasetSequence().getPDBId(); if (pdbs == null) { continue; } - SequenceI sq; - for (int p = 0; p < pdbs.size(); p++) + for (PDBEntry p1 : pdbs) { - PDBEntry p1 = (PDBEntry) pdbs.elementAt(p); if (p1.getId().equals(pdb.getId())) { - if (!seqs.contains(sq = alignment.getSequenceAt(i))) + if (!seqs.contains(sq)) { seqs.add(sq); + continue; } - - continue; } } } @@ -798,16 +796,23 @@ public class AlignViewport extends AlignmentViewport implements // TODO: create undo object for this JAL-1101 /* - * If one alignment is protein and one nucleotide, with at least one - * sequence name in common, offer to open a linked alignment. + * If any cDNA/protein mappings can be made between the alignments, offer to + * open a linked alignment with split frame option. */ - if (AlignmentUtils.isMappable(al, getAlignment())) + if (Cache.getDefault(Preferences.ENABLE_SPLIT_FRAME, true)) { - if (openLinkedAlignment(al, title)) + if (AlignmentUtils.isMappable(al, getAlignment())) { - return; + if (openLinkedAlignment(al, title)) + { + return; + } } } + + /* + * No mappings, or offer declined - add sequences to this alignment + */ // TODO: JAL-407 regardless of above - identical sequences (based on ID and // provenance) should share the same dataset sequence @@ -815,19 +820,18 @@ public class AlignViewport extends AlignmentViewport implements { getAlignment().addSequence(al.getSequenceAt(i)); } - // TODO this call was done by SequenceFetcher but not FileLoader or - // CutAndPasteTransfer. Is it needed? - // JBPComment: this repositions the view to show the new sequences - // JBPComment: so it is needed for UX + setEndSeq(getAlignment().getHeight()); firePropertyChange("alignment", null, getAlignment().getSequences()); } /** * Show a dialog with the option to open and link (cDNA <-> protein) as a new - * alignment. Returns true if the new alignment was opened, false if not, - * because the user declined the offer. + * alignment, either as a standalone alignment or in a split frame. Returns + * true if the new alignment was opened, false if not, because the user + * declined the offer. * + * @param al * @param title */ protected boolean openLinkedAlignment(AlignmentI al, String title) @@ -851,14 +855,6 @@ public class AlignViewport extends AlignmentViewport implements final boolean openInNewWindow = (response == 2); /* - * Create the AlignFrame first (which creates the new alignment's datasets), - * before attempting sequence mapping. - */ - AlignFrame newAlignFrame = new AlignFrame(al, AlignFrame.DEFAULT_WIDTH, - AlignFrame.DEFAULT_HEIGHT); - newAlignFrame.setTitle(title); - - /* * Identify protein and dna alignments. Make a copy of this one if opening * in a new split pane. */ @@ -867,6 +863,23 @@ public class AlignViewport extends AlignmentViewport implements AlignmentI protein = al.isNucleotide() ? thisAlignment : al; final AlignmentI cdna = al.isNucleotide() ? al : thisAlignment; + /* + * Map sequences. At least one should get mapped as we have already passed + * the test for 'mappability'. Any mappings made will be added to the + * protein alignment. Note creating dataset sequences on the new alignment + * is a pre-requisite for building mappings. + */ + al.setDataset(null); + AlignmentUtils.mapProteinToCdna(protein, cdna); + + /* + * Create the AlignFrame for the added alignment. Note this will include the + * cDNA consensus annotation if it is protein (because the alignment holds + * mappings to nucleotide) + */ + AlignFrame newAlignFrame = new AlignFrame(al, AlignFrame.DEFAULT_WIDTH, + AlignFrame.DEFAULT_HEIGHT); + newAlignFrame.setTitle(title); newAlignFrame.statusBar.setText(MessageManager.formatMessage( "label.successfully_loaded_file", new Object[] { title })); @@ -885,13 +898,6 @@ public class AlignViewport extends AlignmentViewport implements AlignFrame.DEFAULT_HEIGHT); } - /* - * Map sequences. At least one should get mapped as we have already passed - * the test for 'mappability'. Any mappings made will be added to the - * protein alignment. - */ - AlignmentUtils.mapProteinToCdna(protein, cdna); - try { newAlignFrame.setMaximum(jalview.bin.Cache.getDefault( @@ -903,6 +909,7 @@ public class AlignViewport extends AlignmentViewport implements if (openSplitPane) { + al.alignAs(thisAlignment); protein = openSplitFrame(newAlignFrame, thisAlignment, protein.getCodonFrames()); } @@ -933,7 +940,9 @@ public class AlignViewport extends AlignmentViewport implements AlignmentI complement, Set mappings) { /* - * Open in split pane. DNA sequence above, protein below. + * Make a new frame with a copy of the alignment we are adding to. If this + * is protein, the new frame will have a cDNA consensus annotation row + * added. */ AlignFrame copyMe = new AlignFrame(complement, AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT); @@ -951,6 +960,10 @@ public class AlignViewport extends AlignmentViewport implements proteinFrame.setVisible(true); String linkedTitle = MessageManager .getString("label.linked_view_title"); + + /* + * Open in split pane. DNA sequence above, protein below. + */ JInternalFrame splitFrame = new SplitFrame(cdnaFrame, proteinFrame); Desktop.addInternalFrame(splitFrame, linkedTitle, -1, -1); @@ -1015,13 +1028,14 @@ public class AlignViewport extends AlignmentViewport implements * is found, the result will be empty. */ SearchResults sr = new SearchResults(); - int seqOffset = findComplementScrollTarget(sr); + int verticalOffset = findComplementScrollTarget(sr); if (!sr.isEmpty()) { // TODO would like next line without cast but needs more refactoring... final AlignmentPanel complementPanel = ((AlignViewport) getCodingComplement()).getAlignPanel(); complementPanel.setFollowingComplementScroll(true); - complementPanel.scrollToCentre(sr, seqOffset); + complementPanel.scrollToCentre(sr, verticalOffset); } } + }