X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAlignFrame.java;h=1554631df62cdf8574ebcce1b7c4e4e7af0083ee;hb=230fac58c5afe1843bf7177834fe1bd1d7e6f9d5;hp=d161cfd4fcd59170d418679ffe009e54300eb8f0;hpb=586612d94f3a257f5d1dcb0ca20dc9eb5d97a004;p=jalview.git diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index d161cfd..1554631 100644 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -65,15 +65,20 @@ import jalview.gui.ViewSelectionMenu.ViewSetProvider; import jalview.io.AlignmentProperties; import jalview.io.AnnotationFile; import jalview.io.BioJsHTMLOutput; +import jalview.io.DataSourceType; +import jalview.io.FileFormat; +import jalview.io.FileFormatI; import jalview.io.FileLoader; import jalview.io.FormatAdapter; import jalview.io.HtmlSvgOutput; import jalview.io.IdentifyFile; +import jalview.io.JPredFile; import jalview.io.JalviewFileChooser; import jalview.io.JalviewFileView; import jalview.io.JnetAnnotationMaker; import jalview.io.NewickFile; import jalview.io.TCoffeeScoreFile; +import jalview.io.gff.SequenceOntologyI; import jalview.jbgui.GAlignFrame; import jalview.schemes.Blosum62ColourScheme; import jalview.schemes.BuriedColourScheme; @@ -112,13 +117,14 @@ 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.FocusAdapter; +import java.awt.event.FocusEvent; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyAdapter; @@ -177,7 +183,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * Last format used to load or save alignments in this window */ - String currentFileFormat = null; + FileFormatI currentFileFormat = null; /** * Current filename for this alignment @@ -466,6 +472,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { formatMenu.add(vsel); } + addFocusListener(new FocusAdapter() + { + @Override + public void focusGained(FocusEvent e) + { + Jalview.setCurrentAlignFrame(AlignFrame.this); + } + }); } @@ -478,7 +492,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * @param format * format of file */ - public void setFileName(String file, String format) + public void setFileName(String file, FileFormatI format) { fileName = file; setFileFormat(format); @@ -911,10 +925,21 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, .setSelected(av.getGlobalColourScheme() instanceof jalview.schemes.RNAHelicesColour); showProducts.setEnabled(canShowProducts()); + setGroovyEnabled(Desktop.getGroovyConsole() != null); updateEditMenuBar(); } + /** + * Set the enabled state of the 'Run Groovy' option in the Calculate menu + * + * @param b + */ + public void setGroovyEnabled(boolean b) + { + runGroovy.setEnabled(b); + } + private IProgressIndicator progressBar; /* @@ -985,7 +1010,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // originating file's format // TODO: work out how to recover feature settings for correct view(s) when // file is reloaded. - if (currentFileFormat.equals("Jalview")) + if (currentFileFormat == FileFormat.Jalview) { JInternalFrame[] frames = Desktop.desktop.getAllFrames(); for (int i = 0; i < frames.length; i++) @@ -1007,7 +1032,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, Desktop.instance.closeAssociatedWindows(); FileLoader loader = new FileLoader(); - String protocol = fileName.startsWith("http:") ? "URL" : "File"; + DataSourceType protocol = fileName.startsWith("http:") ? DataSourceType.URL + : DataSourceType.FILE; loader.LoadFile(viewport, fileName, protocol, currentFileFormat); } else @@ -1015,7 +1041,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, Rectangle bounds = this.getBounds(); FileLoader loader = new FileLoader(); - String protocol = fileName.startsWith("http:") ? "URL" : "File"; + DataSourceType protocol = fileName.startsWith("http:") ? DataSourceType.URL + : DataSourceType.FILE; AlignFrame newframe = loader.LoadFileWaitTillLoaded(fileName, protocol, currentFileFormat); @@ -1059,9 +1086,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void save_actionPerformed(ActionEvent e) { - if (fileName == null - || (currentFileFormat == null || !jalview.io.FormatAdapter - .isValidIOFormat(currentFileFormat, true)) + if (fileName == null || (currentFileFormat == null) || fileName.startsWith("http")) { saveAs_actionPerformed(null); @@ -1082,9 +1107,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, public void saveAs_actionPerformed(ActionEvent e) { JalviewFileChooser chooser = new JalviewFileChooser( - jalview.bin.Cache.getProperty("LAST_DIRECTORY"), - jalview.io.AppletFormatAdapter.WRITABLE_EXTENSIONS, - jalview.io.AppletFormatAdapter.WRITABLE_FNAMES, + Cache.getProperty("LAST_DIRECTORY"), + // AppletFormatAdapter.WRITABLE_EXTENSIONS, + // AppletFormatAdapter.WRITABLE_FNAMES, currentFileFormat, false); chooser.setFileView(new JalviewFileView()); @@ -1117,24 +1142,19 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, fileName = chooser.getSelectedFile().getPath(); - jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT", - currentFileFormat); + Cache.setProperty("DEFAULT_FILE_FORMAT", + currentFileFormat.toString()); - jalview.bin.Cache.setProperty("LAST_DIRECTORY", fileName); - if (currentFileFormat.indexOf(" ") > -1) - { - currentFileFormat = currentFileFormat.substring(0, - currentFileFormat.indexOf(" ")); - } + Cache.setProperty("LAST_DIRECTORY", fileName); saveAlignment(fileName, currentFileFormat); } } - public boolean saveAlignment(String file, String format) + public boolean saveAlignment(String file, FileFormatI format) { boolean success = true; - if (format.equalsIgnoreCase("Jalview")) + if (format == FileFormat.Jalview) { String shortName = title; @@ -1153,16 +1173,16 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } else { - if (!jalview.io.AppletFormatAdapter.isValidFormat(format, true)) - { - warningMessage("Cannot save file " + fileName + " using format " - + format, "Alignment output format not supported"); - if (!Jalview.isHeadlessMode()) - { - saveAs_actionPerformed(null); - } - return false; - } + // if (!jalview.io.AppletFormatAdapter.isValidFormat(format, true)) + // { + // warningMessage("Cannot save file " + fileName + " using format " + // + format, "Alignment output format not supported"); + // if (!Jalview.isHeadlessMode()) + // { + // saveAs_actionPerformed(null); + // } + // return false; + // } AlignmentExportData exportData = getAlignmentForExport(format, viewport, null); @@ -1242,8 +1262,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, protected void outputText_actionPerformed(ActionEvent e) { + FileFormat fileFormat = FileFormat.valueOf(e.getActionCommand()); AlignmentExportData exportData = getAlignmentForExport( - e.getActionCommand(), viewport, null); +fileFormat, + viewport, null); if (exportData.getSettings().isCancelled()) { return; @@ -1252,8 +1274,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, cap.setForInput(null); try { + FileFormatI format = fileFormat; cap.setText(new FormatAdapter(alignPanel, exportData.getSettings()) - .formatSequences(e.getActionCommand(), + .formatSequences(format, exportData.getAlignment(), exportData.getOmitHidden(), exportData.getStartEndPostions(), @@ -1270,33 +1293,33 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } public static AlignmentExportData getAlignmentForExport( - String exportFormat, AlignViewportI viewport, + FileFormatI format, AlignViewportI viewport, AlignExportSettingI exportSettings) { AlignmentI alignmentToExport = null; AlignExportSettingI settings = exportSettings; String[] omitHidden = null; - int[] alignmentStartEnd = new int[2]; HiddenSequences hiddenSeqs = viewport.getAlignment() .getHiddenSequences(); alignmentToExport = viewport.getAlignment(); - alignmentStartEnd = new int[] { 0, alignmentToExport.getWidth() - 1 }; boolean hasHiddenSeqs = hiddenSeqs.getSize() > 0; if (settings == null) { settings = new AlignExportSettings(hasHiddenSeqs, - viewport.hasHiddenColumns(), exportFormat); + viewport.hasHiddenColumns(), format); } // settings.isExportAnnotations(); if (viewport.hasHiddenColumns() && !settings.isExportHiddenColumns()) { - omitHidden = viewport.getViewAsString(false); + omitHidden = viewport.getViewAsString(false, + settings.isExportHiddenSequences()); } + int[] alignmentStartEnd = new int[2]; if (hasHiddenSeqs && settings.isExportHiddenSequences()) { alignmentToExport = hiddenSeqs.getFullAlignment(); @@ -1304,64 +1327,15 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, else { alignmentToExport = viewport.getAlignment(); - alignmentStartEnd = getStartEnd(alignmentStartEnd, viewport - .getColumnSelection().getHiddenColumns()); } + alignmentStartEnd = alignmentToExport + .getVisibleStartAndEndIndex(viewport.getColumnSelection() + .getHiddenColumns()); AlignmentExportData ed = new AlignmentExportData(alignmentToExport, omitHidden, alignmentStartEnd, settings); return ed; } - public static int[] getStartEnd(int[] aligmentStartEnd, - List hiddenCols) - { - int startPos = aligmentStartEnd[0]; - int endPos = aligmentStartEnd[1]; - - int[] lowestRange = new int[] { -1, -1 }; - int[] higestRange = new int[] { -1, -1 }; - - for (int[] hiddenCol : hiddenCols) - { - lowestRange = (hiddenCol[0] <= startPos) ? hiddenCol : lowestRange; - higestRange = (hiddenCol[1] >= endPos) ? hiddenCol : higestRange; - } - - if (lowestRange[0] == -1 && lowestRange[1] == -1) - { - startPos = aligmentStartEnd[0]; - } - else - { - startPos = lowestRange[1] + 1; - } - - if (higestRange[0] == -1 && higestRange[1] == -1) - { - endPos = aligmentStartEnd[1]; - } - else - { - endPos = higestRange[0] - 1; - } - - // System.out.println("Export range : " + startPos + " - " + endPos); - return new int[] { startPos, endPos }; - } - - public static void main(String[] args) - { - ArrayList hiddenCols = new ArrayList(); - hiddenCols.add(new int[] { 0, 0 }); - hiddenCols.add(new int[] { 6, 9 }); - hiddenCols.add(new int[] { 11, 12 }); - hiddenCols.add(new int[] { 33, 33 }); - hiddenCols.add(new int[] { 50, 50 }); - - int[] x = getStartEnd(new int[] { 0, 50 }, hiddenCols); - // System.out.println("Export range : " + x[0] + " - " + x[1]); - } - /** * DOCUMENT ME! * @@ -1979,7 +1953,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, return; } - String str, format; + String str; + FileFormatI format; try { str = (String) contents.getTransferData(DataFlavor.stringFlavor); @@ -1988,7 +1963,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, return; } - format = new IdentifyFile().identify(str, "Paste"); + format = new IdentifyFile().identify(str, DataSourceType.PASTE); } catch (OutOfMemoryError er) { @@ -2018,7 +1993,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, else { // parse the clipboard as an alignment. - alignment = new FormatAdapter().readFile(str, "Paste", format); + alignment = new FormatAdapter().readFile(str, DataSourceType.PASTE, + format); sequences = alignment.getSequencesArray(); } @@ -3667,8 +3643,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void mousePressed(MouseEvent evt) { - if (evt.isControlDown() - || SwingUtilities.isRightMouseButton(evt)) + if (evt.isPopupTrigger()) { radioItem.removeActionListener(radioItem.getActionListeners()[0]); @@ -4172,7 +4147,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { JMenuItem tm = new JMenuItem(); ScoreModelI sm = ResidueProperties.scoreMatrices.get(pwtype); - if (sm.isProtein() == !viewport.getAlignment().isNucleotide()) + if (sm.isDNA() == viewport.getAlignment().isNucleotide() + || sm.isProtein() == !viewport.getAlignment() + .isNucleotide()) { String smn = MessageManager.getStringOrReturn( "label.score_model_", sm.getName()); @@ -4347,7 +4324,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, jalview.io.NewickFile fin = null; try { - fin = new jalview.io.NewickFile(choice, "File"); + fin = new NewickFile(choice, DataSourceType.FILE); viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree()); } catch (Exception ex) { @@ -4707,6 +4684,17 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, return showp; } + /** + * Finds and displays cross-references for the selected sequences (protein + * products for nucleotide sequences, dna coding sequences for peptides). + * + * @param sel + * the sequences to show cross-references for + * @param dna + * true if from a nucleotide alignment (so showing proteins) + * @param source + * the database to show cross-references for + */ protected void showProductsFor(final SequenceI[] sel, final boolean dna, final String source) { @@ -4739,6 +4727,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, AlignFrame newFrame = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT); + if (Cache.getDefault("HIDE_INTRONS", true)) + { + newFrame.hideFeatureColumns(SequenceOntologyI.EXON, false); + } String newtitle = String.format("%s %s %s", MessageManager.getString(dna ? "label.proteins" : "label.nucleotides"), MessageManager @@ -4773,14 +4765,16 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, System.err.println("Failed to make CDS alignment"); } al.getCodonFrames().clear(); - al.getCodonFrames().addAll(copyAlignment.getCodonFrames()); + al.addCodonFrames(copyAlignment.getCodonFrames()); + al.addCodonFrames(cf); /* * pending getting Embl transcripts to 'align', * we are only doing this for Ensembl */ - // TODO want to do this also when fetching UNIPROT for Ensembl - if (DBRefSource.ENSEMBL.equalsIgnoreCase(source)) + // TODO proper criteria for 'can align as cdna' + if (DBRefSource.ENSEMBL.equalsIgnoreCase(source) + || AlignmentUtils.looksLikeEnsembl(alignment)) { copyAlignment.alignAs(alignment); copyAlignmentIsAligned = true; @@ -4790,7 +4784,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { copyAlignment = AlignmentUtils.makeCopyAlignment( sequenceSelection, xrefs.getSequencesArray()); - copyAlignment.getCodonFrames().addAll(cf); + copyAlignment.addCodonFrames(cf); + al.addCodonFrames(copyAlignment.getCodonFrames()); + al.addCodonFrames(cf); } copyAlignment.setGapCharacter(AlignFrame.this.viewport .getGapCharacter()); @@ -4865,15 +4861,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } } catch (Exception e) { - Cache.log.error( - "Exception when finding crossreferences", e); + Cache.log.error("Exception when finding crossreferences", e); } catch (OutOfMemoryError e) { new OOMWarning("whilst fetching crossreferences", e); } catch (Throwable e) { - Cache.log.error("Error when finding crossreferences", - e); + Cache.log.error("Error when finding crossreferences", e); } finally { AlignFrame.this.setProgressBar(MessageManager.formatMessage( @@ -4951,7 +4945,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, .getString("label.error_when_translating_sequences_submit_bug_report"); final String errorTitle = MessageManager .getString("label.implementation_error") - + MessageManager.getString("translation_failed"); + + MessageManager.getString("label.translation_failed"); JOptionPane.showMessageDialog(Desktop.desktop, msg, errorTitle, JOptionPane.ERROR_MESSAGE); return; @@ -4989,11 +4983,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * Set the file format * - * @param fileFormat + * @param format */ - public void setFileFormat(String fileFormat) + public void setFileFormat(FileFormatI format) { - this.currentFileFormat = fileFormat; + this.currentFileFormat = format; } /** @@ -5001,14 +4995,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * * @param file * contents or path to retrieve file - * @param type + * @param sourceType * access mode of file (see jalview.io.AlignFile) * @return true if features file was parsed correctly. */ - public boolean parseFeaturesFile(String file, String type) + public boolean parseFeaturesFile(String file, DataSourceType sourceType) { - return avc.parseFeaturesFile(file, type, - jalview.bin.Cache.getDefault("RELAXEDSEQIDMATCHING", false)); + return avc.parseFeaturesFile(file, sourceType, + Cache.getDefault("RELAXEDSEQIDMATCHING", false)); } @@ -5050,49 +5044,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, public void drop(DropTargetDropEvent evt) { Transferable t = evt.getTransferable(); - java.util.List files = null; + List files = new ArrayList(); + List protocols = new ArrayList(); try { - DataFlavor uriListFlavor = new DataFlavor( - "text/uri-list;class=java.lang.String"); - if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) - { - // Works on Windows and MacOSX - evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); - files = (java.util.List) t - .getTransferData(DataFlavor.javaFileListFlavor); - } - else if (t.isDataFlavorSupported(uriListFlavor)) - { - // This is used by Unix drag system - evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); - String data = (String) t.getTransferData(uriListFlavor); - files = new java.util.ArrayList(1); - for (java.util.StringTokenizer st = new java.util.StringTokenizer( - data, "\r\n"); st.hasMoreTokens();) - { - String s = st.nextToken(); - if (s.startsWith("#")) - { - // the line is a comment (as per the RFC 2483) - continue; - } - - java.net.URI uri = new java.net.URI(s); - // check to see if we can handle this kind of URI - if (uri.getScheme().toLowerCase().startsWith("http")) - { - files.add(uri.toString()); - } - else - { - // otherwise preserve old behaviour: catch all for file objects - java.io.File file = new java.io.File(uri); - files.add(file.toString()); - } - } - } + Desktop.transferFromDropTarget(files, protocols, evt, t); } catch (Exception e) { e.printStackTrace(); @@ -5114,13 +5071,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { String file = files.get(i).toString(); String pdbfn = ""; - String protocol = FormatAdapter.checkProtocol(file); - if (protocol == jalview.io.FormatAdapter.FILE) + DataSourceType protocol = FormatAdapter.checkProtocol(file); + if (protocol == DataSourceType.FILE) { File fl = new File(file); pdbfn = fl.getName(); } - else if (protocol == jalview.io.FormatAdapter.URL) + else if (protocol == DataSourceType.URL) { URL url = new URL(file); pdbfn = url.getFile(); @@ -5144,7 +5101,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } if (mtch != null) { - String type = null; + FileFormatI type = null; try { type = new IdentifyFile().identify(file, protocol); @@ -5154,7 +5111,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } if (type != null) { - if (type.equalsIgnoreCase("PDB")) + if (type == FileFormat.PDB) { filesmatched.add(new Object[] { file, protocol, mtch }); continue; @@ -5194,7 +5151,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { PDBEntry pe = new AssociatePdbFileWithSeq() .associatePdbWithSeq((String) fm[0], - (String) fm[1], toassoc, false, + (DataSourceType) fm[1], toassoc, false, Desktop.instance); if (pe != null) { @@ -5253,21 +5210,20 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * @param file * either a filename or a URL string. */ - public void loadJalviewDataFile(String file, String protocol, - String format, SequenceI assocSeq) + public void loadJalviewDataFile(String file, DataSourceType sourceType, + FileFormatI format, SequenceI assocSeq) { try { - if (protocol == null) + if (sourceType == null) { - protocol = FormatAdapter.checkProtocol(file); + sourceType = FormatAdapter.checkProtocol(file); } // 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() - .annotateAlignmentView(viewport, file, protocol) : false; + boolean isAnnotation = (format == null || format == FileFormat.Pfam) ? new AnnotationFile() + .annotateAlignmentView(viewport, file, sourceType) : false; if (!isAnnotation) { @@ -5275,7 +5231,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, TCoffeeScoreFile tcf = null; try { - tcf = new TCoffeeScoreFile(file, protocol); + tcf = new TCoffeeScoreFile(file, sourceType); if (tcf.isValid()) { if (tcf.annotateAlignment(viewport.getAlignment(), true)) @@ -5321,12 +5277,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // try to parse it as a features file if (format == null) { - format = new IdentifyFile().identify(file, protocol); + format = new IdentifyFile().identify(file, sourceType); } - if (format.equalsIgnoreCase("JnetFile")) + if (format == FileFormat.Jnet) { - jalview.io.JPredFile predictions = new jalview.io.JPredFile( - file, protocol); + JPredFile predictions = new JPredFile( + file, sourceType); new JnetAnnotationMaker(); JnetAnnotationMaker.add_annotation(predictions, viewport.getAlignment(), 0, false); @@ -5339,14 +5295,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } else if (IdentifyFile.FeaturesFile.equals(format)) { - if (parseFeaturesFile(file, protocol)) + if (parseFeaturesFile(file, sourceType)) { alignPanel.paintAlignment(true); } } else { - new FileLoader().LoadFile(viewport, file, protocol, format); + new FileLoader().LoadFile(viewport, file, sourceType, format); } } } @@ -5371,8 +5327,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } new OOMWarning( "loading data " - + (protocol != null ? (protocol.equals(FormatAdapter.PASTE) ? "from clipboard." - : "using " + protocol + " from " + file) + + (sourceType != null ? (sourceType == DataSourceType.PASTE ? "from clipboard." + : "using " + sourceType + " from " + file) : ".") + (format != null ? "(parsing as '" + format + "' file)" : ""), oom, Desktop.desktop); @@ -5418,7 +5374,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void tabbedPane_mousePressed(MouseEvent e) { - if (SwingUtilities.isRightMouseButton(e)) + if (e.isPopupTrigger()) { String msg = MessageManager.getString("label.enter_view_name"); String reply = JOptionPane.showInternalInputDialog(this, msg, msg, @@ -5567,8 +5523,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, AlignFrame.this.setMenusForViewport(); } }); - dbRefFetcher - .fetchDBRefs(false); + dbRefFetcher.fetchDBRefs(false); } }).start(); @@ -6009,8 +5964,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, protected void setAnnotationsVisibility(boolean visible, boolean forSequences, boolean forAlignment) { - for (AlignmentAnnotation aa : alignPanel.getAlignment() - .getAlignmentAnnotation()) + AlignmentAnnotation[] anns = alignPanel.getAlignment() + .getAlignmentAnnotation(); + if (anns == null) + { + return; + } + for (AlignmentAnnotation aa : anns) { /* * don't display non-positional annotations on an alignment @@ -6126,15 +6086,75 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, try { Dna dna = new Dna(viewport, viewport.getViewAsVisibleContigs(true)); - al = dna.reverseCdna(complement); viewport.addAlignment(al, ""); + addHistoryItem(new EditCommand( + MessageManager.getString("label.add_sequences"), + Action.PASTE, al.getSequencesArray(), 0, al.getWidth(), + viewport.getAlignment())); } catch (Exception ex) { System.err.println(ex.getMessage()); return; } } + + /** + * Try to run a script in the Groovy console, having first ensured that this + * AlignFrame is set as currentAlignFrame in Desktop, to allow the script to + * be targeted at this alignment. + */ + @Override + protected void runGroovy_actionPerformed() + { + Jalview.setCurrentAlignFrame(this); + groovy.ui.Console console = Desktop.getGroovyConsole(); + if (console != null) + { + try + { + console.runScript(); + } catch (Exception ex) + { + System.err.println((ex.toString())); + JOptionPane + .showInternalMessageDialog(Desktop.desktop, MessageManager + .getString("label.couldnt_run_groovy_script"), + MessageManager + .getString("label.groovy_support_failed"), + JOptionPane.ERROR_MESSAGE); + } + } + else + { + System.err.println("Can't run Groovy script as console not found"); + } + } + + /** + * Hides columns containing (or not containing) a specified feature, provided + * that would not leave all columns hidden + * + * @param featureType + * @param columnsContaining + * @return + */ + public boolean hideFeatureColumns(String featureType, + boolean columnsContaining) + { + boolean notForHiding = avc.markColumnsContainingFeatures( + columnsContaining, false, false, featureType); + if (notForHiding) + { + if (avc.markColumnsContainingFeatures(!columnsContaining, false, + false, featureType)) + { + getViewport().hideSelectedColumns(); + return true; + } + } + return false; + } } class PrintThread extends Thread