- /**
- * Searches selected sequences for xRef products and builds the Show
- * Cross-References menu (formerly called Show Products)
- *
- * @return true if Show Cross-references menu should be enabled.
- */
- public boolean canShowProducts()
- {
- SequenceI[] selection = viewport.getSequenceSelection();
- AlignmentI dataset = viewport.getAlignment().getDataset();
- boolean showp = false;
- try
- {
- showProducts.removeAll();
- final boolean dna = viewport.getAlignment().isNucleotide();
- String[] ptypes = (selection == null || selection.length == 0) ? null
- : CrossRef.findSequenceXrefTypes(dna, selection, dataset);
-
- for (int t = 0; ptypes != null && t < ptypes.length; t++)
- {
- showp = true;
- final AlignFrame af = this;
- final String source = ptypes[t];
- JMenuItem xtype = new JMenuItem(ptypes[t]);
- xtype.addActionListener(new ActionListener()
- {
-
- @Override
- public void actionPerformed(ActionEvent e)
- {
- showProductsFor(af.viewport.getSequenceSelection(), dna, source);
- }
-
- });
- showProducts.add(xtype);
- }
- showProducts.setVisible(showp);
- showProducts.setEnabled(showp);
- } catch (Exception e)
- {
- jalview.bin.Cache.log
- .warn("canShowProducts threw an exception - please report to help@jalview.org",
- e);
- return false;
- }
- return showp;
- }
-
- protected void showProductsFor(final SequenceI[] sel, final boolean dna,
- final String source)
- {
- Runnable foo = new Runnable()
- {
-
- @Override
- public void run()
- {
- final long sttime = System.currentTimeMillis();
- AlignFrame.this.setProgressBar(MessageManager.formatMessage(
- "status.searching_for_sequences_from",
- new Object[] { source }), sttime);
- try
- {
- /*
- * 'peer' sequences are any to add to this alignment, for example
- * alternative protein products for my protein's gene
- */
- List<SequenceI> addedPeers = new ArrayList<SequenceI>();
- AlignmentI alignment = AlignFrame.this.getViewport()
- .getAlignment();
- Alignment xrefs = CrossRef.findXrefSequences(sel, dna, source,
- alignment, addedPeers);
- if (xrefs != null)
- {
- /*
- * get display scheme (if any) to apply to features
- */
- FeatureSettingsModelI featureColourScheme = new SequenceFetcher()
- .getFeatureColourScheme(source);
-
- AlignmentI al = makeCrossReferencesAlignment(
- alignment.getDataset(), xrefs);
-
- AlignFrame newFrame = new AlignFrame(al, DEFAULT_WIDTH,
- DEFAULT_HEIGHT);
- String newtitle = String.format("%s %s %s",
- MessageManager.getString(dna ? "label.proteins"
- : "label.nucleotides"), MessageManager
- .getString("label.for"), getTitle());
- newFrame.setTitle(newtitle);
-
- boolean asSplitFrame = Cache.getDefault(
- Preferences.ENABLE_SPLIT_FRAME, true);
- if (asSplitFrame)
- {
- /*
- * Make a copy of this alignment (sharing the same dataset
- * sequences). If we are DNA, drop introns and update mappings
- */
- AlignmentI copyAlignment = null;
- final SequenceI[] sequenceSelection = AlignFrame.this.viewport
- .getSequenceSelection();
- List<AlignedCodonFrame> cf = xrefs.getCodonFrames();
- if (dna)
- {
- copyAlignment = AlignmentUtils.makeCdsAlignment(
- sequenceSelection, cf, alignment);
- if (copyAlignment.getHeight() == 0)
- {
- System.err.println("Failed to make CDS alignment");
- }
- al.getCodonFrames().clear();
- al.getCodonFrames().addAll(cf);
- }
- else
- {
- copyAlignment = new Alignment(new Alignment(
- sequenceSelection));
- copyAlignment.getCodonFrames().addAll(cf);
- }
- copyAlignment.setGapCharacter(AlignFrame.this.viewport
- .getGapCharacter());
- StructureSelectionManager ssm = StructureSelectionManager
- .getStructureSelectionManager(Desktop.instance);
- ssm.registerMappings(cf);
-
- /*
- * add in any extra 'peer' sequences discovered
- * (e.g. alternative protein products)
- */
- for (SequenceI peer : addedPeers)
- {
- copyAlignment.addSequence(peer);
- }
-
- if (copyAlignment.getHeight() > 0)
- {
- /*
- * align protein to dna
- */
- // FIXME what if the dna is not aligned :-O
- if (dna)
- {
- al.alignAs(copyAlignment);
- }
- else
- {
- /*
- * align cdna to protein - currently only if
- * fetching and aligning Ensembl transcripts!
- */
- if (DBRefSource.ENSEMBL.equalsIgnoreCase(source))
- {
- copyAlignment.alignAs(al);
- }
- }
-
- AlignFrame copyThis = new AlignFrame(copyAlignment,
- AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);
- copyThis.setTitle(AlignFrame.this.getTitle());