import java.awt.Container;
import java.awt.Dimension;
+import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Rectangle;
+import java.io.File;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import jalview.datamodel.SearchResultsI;
import jalview.datamodel.SequenceGroup;
import jalview.datamodel.SequenceI;
+import jalview.io.AppletFormatAdapter;
+import jalview.io.DataSourceType;
+import jalview.io.FileFormatException;
+import jalview.io.FileFormatI;
+import jalview.io.FileFormats;
+import jalview.io.FileLoader;
+import jalview.io.IdentifyFile;
import jalview.renderer.ResidueShader;
import jalview.schemes.ColourSchemeI;
import jalview.schemes.ColourSchemeProperty;
}
/**
+ * Load a File into this AlignViewport attempting to detect format if not
+ * given or given as null.
+ *
+ * @param file
+ * @param format
+ */
+ public void addFile(File file, FileFormatI format)
+ {
+ addFile(file, format, true);
+ }
+
+ public void addFile(File file, FileFormatI format, boolean async)
+ {
+ DataSourceType protocol = AppletFormatAdapter.checkProtocol(file);
+
+ if (format == null)
+ {
+ try
+ {
+ format = new IdentifyFile().identify(file, protocol);
+ } catch (FileFormatException e1)
+ {
+ jalview.bin.Console.error("Unknown file format for '" + file + "'");
+ }
+ }
+ else if (FileFormats.getInstance().isIdentifiable(format))
+ {
+ try
+ {
+ format = new IdentifyFile().identify(file, protocol);
+ } catch (FileFormatException e)
+ {
+ jalview.bin.Console.error("Unknown file format for '" + file + "'",
+ e);
+ }
+ }
+
+ new FileLoader().LoadFile(this, file, DataSourceType.FILE, format,
+ async);
+ }
+
+ public void addFile(File file)
+ {
+ addFile(file, null);
+ }
+
+ /**
* Show a dialog with the option to open and link (cDNA <-> protein) as a new
* 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
protected void openLinkedAlignment(AlignmentI al, String title)
{
String[] options = new String[] { MessageManager.getString("action.no"),
- MessageManager.getString("label.split_window"),
- MessageManager.getString("label.new_window"), };
+ MessageManager.getString("label.split_window")
+ + "(update new alignment)",
+ MessageManager.getString("label.new_window"),
+ MessageManager.getString(
+ "label.split_window") + "(update this alignment)",
+ MessageManager.getString(
+ "label.split_window") + "(leave both unchanged)" };
final String question = JvSwingUtils.wrapTooltip(true,
MessageManager.getString("label.open_split_window?"));
final AlignViewport us = this;
JvOptionPane dialog = JvOptionPane.newOptionDialog(Desktop.desktop)
.setResponseHandler(0, () -> {
addDataToAlignment(al);
- return null;
}).setResponseHandler(1, () -> {
- us.openLinkedAlignmentAs(al, title, true);
- return null;
+ us.openLinkedAlignmentAs(al, title, true, 1);
}).setResponseHandler(2, () -> {
- us.openLinkedAlignmentAs(al, title, false);
- return null;
+ us.openLinkedAlignmentAs(al, title, false, 1);
+ }).setResponseHandler(3, () -> {
+ us.openLinkedAlignmentAs(al, title, true, 2);
+ }).setResponseHandler(4, () -> {
+ us.openLinkedAlignmentAs(al, title, true, 0);
});
+ dialog.setLayout(new FlowLayout(FlowLayout.CENTER));
+ dialog.setPreferredSize(new Dimension(350,300));
dialog.showDialog(question,
MessageManager.getString("label.open_split_window"),
JvOptionPane.DEFAULT_OPTION, JvOptionPane.PLAIN_MESSAGE, null,
options, options[0]);
}
- protected void openLinkedAlignmentAs(AlignmentI al, String title,
- boolean newWindowOrSplitPane)
+ /**
+ * link given alignment to the alignment in this viewport and open
+ * @param al - alignment containing sequences to link to this alignment
+ * @param title
+ * @param newWindowOrSplitPane
+ * @param alignAs TODO
+ * @param alignAs - 0 - don't modify either alignment, 1 - align al according to us, 2- align us according to al
+ * @return alignFrame holding al
+ */
+ protected AlignFrame openLinkedAlignmentAs(AlignmentI al, String title,
+ boolean newWindowOrSplitPane, int alignAs)
{
/*
* Identify protein and dna alignments. Make a copy of this one if opening
AlignmentI thisAlignment = newWindowOrSplitPane
? new Alignment(getAlignment())
: getAlignment();
- AlignmentI protein = al.isNucleotide() ? thisAlignment : al;
- final AlignmentI cdna = al.isNucleotide() ? al : thisAlignment;
+
+
+ if (!al.isNucleotide() && !thisAlignment.isNucleotide())
+ {
+ // link AA to 3di or other kind of 'alternative' 1:1 mapping alignment
+ if (al.getDataset()==null)
+ {
+ al.setDataset(thisAlignment.getDataset());
+ }
+ AlignmentUtils.map3diPeptideToProteinAligment(thisAlignment,al);
+ if (thisAlignment.getCodonFrames().isEmpty()) {thisAlignment.getCodonFrames().addAll(al.getCodonFrames()); }
+ else {al.getCodonFrames().addAll(thisAlignment.getCodonFrames()); };
- /*
- * 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.mapProteinAlignmentToCdna(protein, cdna);
+ }
+ else
+ {
+ // shouldn't we be merging dataset here ?
+ // always create dataset for imported alignment before doing anything else..
+ al.setDataset(null);
+ // link CODON triplets to Protein
+ 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.
+ */
+ AlignmentUtils.mapProteinAlignmentToCdna(protein, cdna);
+ }
+
/*
* Create the AlignFrame for the added alignment. If it is protein, mappings
* are registered with StructureSelectionManager as a side-effect.
if (newWindowOrSplitPane)
{
- al.alignAs(thisAlignment);
- protein = openSplitFrame(newAlignFrame, thisAlignment);
+ if (alignAs==1) {
+ al.alignAs(thisAlignment);
+ }
+ if (alignAs==2) {
+ thisAlignment.alignAs(al);
+ }
+ AlignmentI mapped = openSplitFrame(newAlignFrame, thisAlignment);
}
+ return newAlignFrame;
}
/**
*/
protected boolean noReferencesTo(AlignedCodonFrame acf)
{
- AlignFrame[] frames = Desktop.getAlignFrames();
+ AlignFrame[] frames = Desktop.getDesktopAlignFrames();
if (frames == null)
{
return true;
{
this.viewName = viewName;
}
+
}