X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAlignFrame.java;h=5beebfd377c0006beb4f72811c44c7ff7579bd71;hb=be415b56e8ce1bc00f5004c64793ce5d0cb17be8;hp=ffb17d2f4f09ca2cd976f60c8de1474ed18ae613;hpb=575719bced1f26ed0eb72b99dd5af10ec05e8656;p=jalview.git diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index ffb17d2..5beebfd 100755 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -1,5 +1,5 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.5) + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6) * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle * * This file is part of Jalview. @@ -17,29 +17,109 @@ */ package jalview.gui; -import java.beans.*; -import java.io.*; -import java.util.*; - -import java.awt.*; -import java.awt.datatransfer.*; -import java.awt.dnd.*; -import java.awt.event.*; -import java.awt.print.*; -import javax.swing.*; -import javax.swing.event.MenuEvent; - -import jalview.analysis.*; +import jalview.analysis.AAFrequency; +import jalview.analysis.AlignmentSorter; +import jalview.analysis.Conservation; +import jalview.analysis.CrossRef; +import jalview.analysis.NJTree; +import jalview.analysis.ParseProperties; +import jalview.analysis.SequenceIdMatcher; import jalview.bin.Cache; -import jalview.commands.*; -import jalview.datamodel.*; -import jalview.io.*; -import jalview.jbgui.*; -import jalview.schemes.*; -import jalview.ws.*; +import jalview.commands.CommandI; +import jalview.commands.EditCommand; +import jalview.commands.OrderCommand; +import jalview.commands.RemoveGapColCommand; +import jalview.commands.RemoveGapsCommand; +import jalview.commands.SlideSequencesCommand; +import jalview.commands.TrimRegionCommand; +import jalview.datamodel.AlignedCodonFrame; +import jalview.datamodel.Alignment; +import jalview.datamodel.AlignmentAnnotation; +import jalview.datamodel.AlignmentI; +import jalview.datamodel.AlignmentOrder; +import jalview.datamodel.AlignmentView; +import jalview.datamodel.ColumnSelection; +import jalview.datamodel.PDBEntry; +import jalview.datamodel.SeqCigar; +import jalview.datamodel.Sequence; +import jalview.datamodel.SequenceGroup; +import jalview.datamodel.SequenceI; +import jalview.io.AlignmentProperties; +import jalview.io.AnnotationFile; +import jalview.io.FeaturesFile; +import jalview.io.FileLoader; +import jalview.io.FormatAdapter; +import jalview.io.HTMLOutput; +import jalview.io.IdentifyFile; +import jalview.io.JalviewFileChooser; +import jalview.io.JalviewFileView; +import jalview.io.JnetAnnotationMaker; +import jalview.io.NewickFile; +import jalview.jbgui.GAlignFrame; +import jalview.schemes.Blosum62ColourScheme; +import jalview.schemes.BuriedColourScheme; +import jalview.schemes.ClustalxColourScheme; +import jalview.schemes.ColourSchemeI; +import jalview.schemes.ColourSchemeProperty; +import jalview.schemes.HelixColourScheme; +import jalview.schemes.HydrophobicColourScheme; +import jalview.schemes.NucleotideColourScheme; +import jalview.schemes.PIDColourScheme; +import jalview.schemes.PurinePyrimidineColourScheme; +import jalview.schemes.ResidueProperties; +import jalview.schemes.StrandColourScheme; +import jalview.schemes.TaylorColourScheme; +import jalview.schemes.TurnColourScheme; +import jalview.schemes.UserColourScheme; +import jalview.schemes.ZappoColourScheme; import jalview.ws.jws1.Discoverer; import jalview.ws.jws2.Jws2Discoverer; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.GridLayout; +import java.awt.Rectangle; +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.StringSelection; +import java.awt.datatransfer.Transferable; +import java.awt.dnd.DnDConstants; +import java.awt.dnd.DropTargetDragEvent; +import java.awt.dnd.DropTargetDropEvent; +import java.awt.dnd.DropTargetEvent; +import java.awt.dnd.DropTargetListener; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.print.PageFormat; +import java.awt.print.PrinterJob; +import java.beans.PropertyChangeEvent; +import java.io.File; +import java.net.URL; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.Vector; + +import javax.swing.JButton; +import javax.swing.JEditorPane; +import javax.swing.JInternalFrame; +import javax.swing.JLabel; +import javax.swing.JLayeredPane; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JProgressBar; +import javax.swing.JRadioButtonMenuItem; +import javax.swing.JScrollPane; +import javax.swing.SwingUtilities; + /** * DOCUMENT ME! * @@ -321,7 +401,22 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, || evt.isShiftDown() || evt.isAltDown()); } break; - + + case KeyEvent.VK_A: + if (viewport.cursorMode) + { + alignPanel.seqPanel.insertNucAtCursor(false,"A"); + //System.out.println("A"); + } + break; + /* + case KeyEvent.VK_CLOSE_BRACKET: + if (viewport.cursorMode) + { + System.out.println("closing bracket"); + } + break; + */ case KeyEvent.VK_DELETE: case KeyEvent.VK_BACK_SPACE: if (!viewport.cursorMode) @@ -494,6 +589,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } ap.av.updateConservation(ap); ap.av.updateConsensus(ap); + ap.av.updateStrucConsensus(ap); } } @@ -675,7 +771,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, progressBars.put(lId, progressPanel); } // update GUI - setMenusForViewport(); + // setMenusForViewport(); validate(); } @@ -1115,7 +1211,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { String choice = chooser.getSelectedFile().getPath(); jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice); - loadJalviewDataFile(choice); + loadJalviewDataFile(choice, null, null, null); } } @@ -2000,6 +2096,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, alignPanel.idPanel.idCanvas.searchResults = null; alignPanel.paintAlignment(true); PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId()); + viewport.sendSelection(); } /** @@ -2025,14 +2122,15 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } alignPanel.paintAlignment(true); - viewport.sendSelection(); PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId()); + viewport.sendSelection(); } public void invertColSel_actionPerformed(ActionEvent e) { viewport.invertColumnSelection(); alignPanel.paintAlignment(true); + viewport.sendSelection(); } /** @@ -2243,8 +2341,57 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, public void newView_actionPerformed(ActionEvent e) { + newView(true); + } + + /** + * + * @param copyAnnotation + * if true then duplicate all annnotation, groups and settings + * @return new alignment panel, already displayed. + */ + public AlignmentPanel newView(boolean copyAnnotation) + { + return newView(null, copyAnnotation); + } + + /** + * + * @param viewTitle + * title of newly created view + * @return new alignment panel, already displayed. + */ + public AlignmentPanel newView(String viewTitle) + { + return newView(viewTitle, true); + } + + /** + * + * @param viewTitle + * title of newly created view + * @param copyAnnotation + * if true then duplicate all annnotation, groups and settings + * @return new alignment panel, already displayed. + */ + public AlignmentPanel newView(String viewTitle, boolean copyAnnotation) + { AlignmentPanel newap = new Jalview2XML().copyAlignPanel(alignPanel, true); + if (!copyAnnotation) + { + // just remove all the current annotation except for the automatic stuff + newap.av.alignment.deleteAllGroups(); + for (AlignmentAnnotation alan : newap.av.alignment + .getAlignmentAnnotation()) + { + if (!alan.autoCalculated) + { + newap.av.alignment.deleteAnnotation(alan); + } + ; + } + } newap.av.gatherViewsHere = false; @@ -2257,8 +2404,19 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, newap.av.redoList = viewport.redoList; int index = Desktop.getViewCount(viewport.getSequenceSetId()); - String newViewName = "View " + index; - + // make sure the new view has a unique name - this is essential for Jalview + // 2 archives + boolean addFirstIndex = false; + if (viewTitle == null || viewTitle.trim().length() == 0) + { + viewTitle = "View"; + addFirstIndex = true; + } + else + { + index = 1;// we count from 1 if given a specific name + } + String newViewName = viewTitle + ((addFirstIndex) ? " " + index : ""); Vector comps = (Vector) PaintRefresher.components.get(viewport .getSequenceSetId()); Vector existingNames = new Vector(); @@ -2276,7 +2434,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, while (existingNames.contains(newViewName)) { - newViewName = "View " + (++index); + newViewName = viewTitle + " " + (++index); } newap.av.viewName = newViewName; @@ -2288,6 +2446,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, viewport.gatherViewsHere = true; } tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1); + return newap; } public void expandViews_actionPerformed(ActionEvent e) @@ -2663,57 +2822,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { JEditorPane editPane = new JEditorPane("text/html", ""); editPane.setEditable(false); - StringBuffer contents = new StringBuffer(""); - - float avg = 0; - int min = Integer.MAX_VALUE, max = 0; - for (int i = 0; i < viewport.alignment.getHeight(); i++) - { - int size = viewport.alignment.getSequenceAt(i).getEnd() - - viewport.alignment.getSequenceAt(i).getStart(); - avg += size; - if (size > max) - max = size; - if (size < min) - min = size; - } - avg = avg / (float) viewport.alignment.getHeight(); - - contents.append("
Sequences: " + viewport.alignment.getHeight()); - contents.append("
Minimum Sequence Length: " + min); - contents.append("
Maximum Sequence Length: " + max); - contents.append("
Average Length: " + (int) avg); - - if (((Alignment) viewport.alignment).getProperties() != null) - { - Hashtable props = ((Alignment) viewport.alignment).getProperties(); - Enumeration en = props.keys(); - contents.append("

"); - while (en.hasMoreElements()) - { - String key = en.nextElement().toString(); - StringBuffer val = new StringBuffer(); - String vals = props.get(key).toString(); - int pos = 0, npos; - do - { - npos = vals.indexOf("\n", pos); - if (npos == -1) - { - val.append(vals.substring(pos)); - } - else - { - val.append(vals.substring(pos, npos)); - val.append("
"); - } - pos = npos + 1; - } while (npos != -1); - contents.append(""); - } - contents.append("
" + key + "" + val + "
"); - } - editPane.setText(contents.toString() + ""); + StringBuffer contents = new AlignmentProperties(viewport.alignment) + .formatAsHtml(); + editPane.setText("" + contents.toString() + ""); JInternalFrame frame = new JInternalFrame(); frame.getContentPane().add(new JScrollPane(editPane)); @@ -2870,10 +2981,25 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, changeColour(new NucleotideColourScheme()); } + public void purinePyrimidineColour_actionPerformed(ActionEvent e) + { + changeColour(new PurinePyrimidineColourScheme()); + } + /* + public void covariationColour_actionPerformed(ActionEvent e) + { + changeColour(new CovariationColourScheme(viewport.alignment.getAlignmentAnnotation()[0])); + } + */ public void annotationColour_actionPerformed(ActionEvent e) { new AnnotationColourChooser(viewport, alignPanel); } + + public void rnahelicesColour_actionPerformed(ActionEvent e) + { + new RNAHelicesColourChooser(viewport, alignPanel); + } /** * DOCUMENT ME! @@ -3630,6 +3756,19 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } } + public boolean sortBy(AlignmentOrder alorder, String undoname) + { + SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray(); + AlignmentSorter.sortBy(viewport.getAlignment(), alorder); + if (undoname != null) + { + addHistoryItem(new OrderCommand(undoname, oldOrder, + viewport.alignment)); + } + alignPanel.paintAlignment(true); + return true; + } + /** * Work out whether the whole set of sequences or just the selected set will * be submitted for multiple alignment. @@ -3994,6 +4133,24 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, jalview.ws.EnfinEnvision2OneWay.getInstance().attachWSMenuEntry( webService, this); } + // TODO: remove this code when 2.7 is released + // DEBUG - alignmentView + /* + * JMenuItem testAlView = new JMenuItem("Test AlignmentView"); final + * AlignFrame af = this; testAlView.addActionListener(new ActionListener() { + * + * @Override public void actionPerformed(ActionEvent e) { + * jalview.datamodel.AlignmentView.testSelectionViews(af.viewport.alignment, + * af.viewport.colSel, af.viewport.selectionGroup); } + * + * }); webService.add(testAlView); + */ + // TODO: refactor to RestClient discoverer and merge menu entries for + // rest-style services with other types of analysis/calculation service + // SHmmr test client - still being implemented. + jalview.ws.rest.RestClient.makeShmmrRestClient().attachWSMenuEntry( + webService, this); + // DEBUG - alignmentView } /* @@ -4265,7 +4422,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, featuresFile = new FeaturesFile(file, type) .parse(viewport.alignment.getDataset(), alignPanel.seqPanel.seqCanvas.getFeatureRenderer().featureColours, - false); + false, jalview.bin.Cache.getDefault( + "RELAXEDSEQIDMATCHING", false)); } catch (Exception ex) { ex.printStackTrace(); @@ -4360,10 +4518,127 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { try { - + // check to see if any of these files have names matching sequences in + // the alignment + SequenceIdMatcher idm = new SequenceIdMatcher(viewport + .getAlignment().getSequencesArray()); + /** + * Object[] { String,SequenceI} + */ + ArrayList filesmatched = new ArrayList(); + ArrayList filesnotmatched = new ArrayList(); for (int i = 0; i < files.size(); i++) { - loadJalviewDataFile(files.get(i).toString()); + String file = files.get(i).toString(); + String pdbfn = ""; + String protocol = FormatAdapter.checkProtocol(file); + if (protocol == jalview.io.FormatAdapter.FILE) + { + File fl = new File(file); + pdbfn = fl.getName(); + } + else if (protocol == jalview.io.FormatAdapter.URL) + { + URL url = new URL(file); + pdbfn = url.getFile(); + } + if (pdbfn.length() > 0) + { + // attempt to find a match in the alignment + SequenceI[] mtch = idm.findAllIdMatches(pdbfn); + int l = 0, c = pdbfn.indexOf("."); + while (mtch == null && c != -1) + { + do + { + l = c; + } while ((c = pdbfn.indexOf(".", l)) > l); + if (l > -1) + { + pdbfn = pdbfn.substring(0, l); + } + mtch = idm.findAllIdMatches(pdbfn); + } + if (mtch != null) + { + String type = null; + try + { + type = new IdentifyFile().Identify(file, protocol); + } catch (Exception ex) + { + type = null; + } + if (type != null) + { + if (type.equalsIgnoreCase("PDB")) + { + filesmatched.add(new Object[] + { file, protocol, mtch }); + continue; + } + } + } + // File wasn't named like one of the sequences or wasn't a PDB file. + filesnotmatched.add(file); + } + } + int assocfiles = 0; + if (filesmatched.size() > 0) + { + if (Cache.getDefault("AUTOASSOCIATE_PDBANDSEQS", false) + || JOptionPane + .showConfirmDialog( + this, + "Do you want to automatically associate the " + + filesmatched.size() + + " PDB files with sequences in the alignment that have the same name ?", + "Automatically Associate PDB files by name", + JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) + + { + for (Object[] fm : filesmatched) + { + // try and associate + // TODO: may want to set a standard ID naming formalism for + // associating PDB files which have no IDs. + for (SequenceI toassoc: (SequenceI[])fm[2]) { + PDBEntry pe = new AssociatePdbFileWithSeq() + .associatePdbWithSeq((String) fm[0], (String) fm[1], + toassoc, false); + if (pe != null) + { + System.err + .println("Associated file : " + ((String) fm[0]) + + " with " + + toassoc.getDisplayId(true)); + assocfiles++; + } + } + alignPanel.paintAlignment(true); + } + } + } + if (filesnotmatched.size() > 0) + { + if (assocfiles > 0 + && (Cache.getDefault( + "AUTOASSOCIATE_PDBANDSEQS_IGNOREOTHERS", false) || JOptionPane + .showConfirmDialog( + this, + "Do you want to ignore the " + + filesnotmatched.size() + + " files whose names did not match any sequence IDs ?", + "Ignore unmatched dropped files ?", + JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)) + { + return; + } + for (String fn : filesnotmatched) + { + loadJalviewDataFile(fn, null, null, null); + } + } } catch (Exception ex) { @@ -4381,26 +4656,31 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * @param file * either a filename or a URL string. */ - public void loadJalviewDataFile(String file) + public void loadJalviewDataFile(String file, String protocol, + String format, SequenceI assocSeq) { try { - String protocol = jalview.io.FormatAdapter.FILE; - String f = file.toLowerCase(); - if (f.indexOf("http:") == 0 || f.indexOf("https:") == 0 - || f.indexOf("file:") == 0) + if (protocol == null) { - protocol = jalview.io.FormatAdapter.URL; + protocol = jalview.io.FormatAdapter.checkProtocol(file); } - - boolean isAnnotation = new AnnotationFile().readAnnotationFile( - viewport.alignment, file, protocol); + // if the file isn't identified, or not positively identified as some + // other filetype (PFAM is default unidentified alignment file type) then + // try to parse as annotation. + boolean isAnnotation = (format == null || format + .equalsIgnoreCase("PFAM")) ? new AnnotationFile() + .readAnnotationFile(viewport.alignment, file, protocol) + : false; if (!isAnnotation) { // try to see if its a JNet 'concise' style annotation file *before* we // try to parse it as a features file - String format = new IdentifyFile().Identify(file, protocol); + if (format == null) + { + format = new IdentifyFile().Identify(file, protocol); + } if (format.equalsIgnoreCase("JnetFile")) { jalview.io.JPredFile predictions = new jalview.io.JPredFile(file, @@ -4411,6 +4691,27 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } else { + /* + * if (format.equalsIgnoreCase("PDB")) { + * + * String pdbfn = ""; // try to match up filename with sequence id try + * { if (protocol == jalview.io.FormatAdapter.FILE) { File fl = new + * File(file); pdbfn = fl.getName(); } else if (protocol == + * jalview.io.FormatAdapter.URL) { URL url = new URL(file); pdbfn = + * url.getFile(); } } catch (Exception e) { } ; if (assocSeq == null) + * { SequenceIdMatcher idm = new SequenceIdMatcher(viewport + * .getAlignment().getSequencesArray()); if (pdbfn.length() > 0) { // + * attempt to find a match in the alignment SequenceI mtch = + * idm.findIdMatch(pdbfn); int l = 0, c = pdbfn.indexOf("."); while + * (mtch == null && c != -1) { while ((c = pdbfn.indexOf(".", l)) > l) + * { l = c; } if (l > -1) { pdbfn = pdbfn.substring(0, l); } mtch = + * idm.findIdMatch(pdbfn); } if (mtch != null) { // try and associate + * // prompt ? PDBEntry pe = new AssociatePdbFileWithSeq() + * .associatePdbWithSeq(file, protocol, mtch, true); if (pe != null) { + * System.err.println("Associated file : " + file + " with " + + * mtch.getDisplayId(true)); alignPanel.paintAlignment(true); } } // + * TODO: maybe need to load as normal otherwise return; } } + */ // try to parse it as a features file boolean isGroupsFile = parseFeaturesFile(file, protocol); // if it wasn't a features file then we just treat it as a general @@ -4432,6 +4733,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, viewport.updateSequenceIdColours(); buildSortByAnnotationScoresMenu(); alignPanel.paintAlignment(true); + System.out.println("Hallo"); } } catch (Exception ex) { @@ -4572,7 +4874,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, }); rfetch.add(fetchr); - final AlignFrame me=this; + final AlignFrame me = this; new Thread(new Runnable() { public void run() @@ -4777,6 +5079,26 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, alignPanel.paintAlignment(true); } } + + /** + * make the given alignmentPanel the currently selected tab + * + * @param alignmentPanel + */ + public void setDisplayedView(AlignmentPanel alignmentPanel) + { + if (!viewport.getSequenceSetId().equals( + alignmentPanel.av.getSequenceSetId())) + { + throw new Error( + "Implementation error: cannot show a view from another alignment in an AlignFrame."); + } + if (tabbedPane != null + & alignPanels.indexOf(alignmentPanel) != tabbedPane.getSelectedIndex()) + { + tabbedPane.setSelectedIndex(alignPanels.indexOf(alignmentPanel)); + } + } } class PrintThread extends Thread