X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAlignFrame.java;h=3a0e3f504396c0839d55e5e136d8ee19bd97cfd5;hb=0b9d0f8eba1cec46c0b31fdd402a826e26244ff5;hp=d6eab59d1e7de02b763a26cdc1276f54124f17cb;hpb=27926214f361deaf6bd78500fa80ac7dd4478b6b;p=jalview.git diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index d6eab59..3a0e3f5 100755 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -1,42 +1,129 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4) - * Copyright (C) 2008 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7) + * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. + * This file is part of Jalview. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with Jalview. If not, see . */ 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.commands.*; -import jalview.datamodel.*; -import jalview.io.*; -import jalview.jbgui.*; -import jalview.schemes.*; -import jalview.ws.*; +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.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.io.TCoffeeScoreFile; +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.RNAHelicesColourChooser; +import jalview.schemes.ResidueProperties; +import jalview.schemes.StrandColourScheme; +import jalview.schemes.TCoffeeColourScheme; +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 jalview.ws.seqfetcher.DbSourceProxy; + +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.List; +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! @@ -59,7 +146,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, AlignViewport viewport; Vector alignPanels = new Vector(); - + /** * Last format used to load or save alignments in this window */ @@ -81,51 +168,66 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { this(al, null, width, height); } + /** - * Creates a new AlignFrame object with specific width, height and sequenceSetId + * Creates a new AlignFrame object with specific width, height and + * sequenceSetId + * * @param al * @param width * @param height * @param sequenceSetId */ - public AlignFrame(AlignmentI al, int width, int height, String sequenceSetId) + public AlignFrame(AlignmentI al, int width, int height, + String sequenceSetId) { this(al, null, width, height, sequenceSetId); } + /** - * Creates a new AlignFrame object with specific width, height and sequenceSetId + * Creates a new AlignFrame object with specific width, height and + * sequenceSetId + * * @param al * @param width * @param height * @param sequenceSetId * @param viewId */ - public AlignFrame(AlignmentI al, int width, int height, String sequenceSetId, String viewId) + public AlignFrame(AlignmentI al, int width, int height, + String sequenceSetId, String viewId) { this(al, null, width, height, sequenceSetId, viewId); } + /** * new alignment window with hidden columns * * @param al - * AlignmentI + * AlignmentI * @param hiddenColumns - * ColumnSelection or null - * @param width Width of alignment frame - * @param height height of frame. + * ColumnSelection or null + * @param width + * Width of alignment frame + * @param height + * height of frame. */ public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns, int width, int height) { this(al, hiddenColumns, width, height, null); } + /** - * Create alignment frame for al with hiddenColumns, a specific width and height, and specific sequenceId + * Create alignment frame for al with hiddenColumns, a specific width and + * height, and specific sequenceId + * * @param al * @param hiddenColumns * @param width * @param height - * @param sequenceSetId (may be null) + * @param sequenceSetId + * (may be null) */ public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns, int width, int height, String sequenceSetId) @@ -134,16 +236,20 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } /** - * Create alignment frame for al with hiddenColumns, a specific width and height, and specific sequenceId + * Create alignment frame for al with hiddenColumns, a specific width and + * height, and specific sequenceId + * * @param al * @param hiddenColumns * @param width * @param height - * @param sequenceSetId (may be null) - * @param viewId (may be null) + * @param sequenceSetId + * (may be null) + * @param viewId + * (may be null) */ - public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns, int width, int height, - String sequenceSetId, String viewId) + public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns, + int width, int height, String sequenceSetId, String viewId) { setSize(width, height); viewport = new AlignViewport(al, hiddenColumns, sequenceSetId, viewId); @@ -163,9 +269,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * Make a new AlignFrame from exisiting alignmentPanels * * @param ap - * AlignmentPanel + * AlignmentPanel * @param av - * AlignViewport + * AlignViewport */ public AlignFrame(AlignmentPanel ap) { @@ -174,12 +280,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, addAlignmentPanel(ap, false); init(); } + /** - * initalise the alignframe from the underlying viewport data and the configurations + * initalise the alignframe from the underlying viewport data and the + * configurations */ void init() { - if (viewport.conservation == null) + if (viewport.getAlignmentConservationAnnotation() == null) { BLOSUM62Colour.setEnabled(false); conservationMenuItem.setEnabled(false); @@ -205,7 +313,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { this.setDropTarget(new java.awt.dnd.DropTarget(this, this)); addServiceListeners(); - setGUINucleotide(viewport.alignment.isNucleotide()); + setGUINucleotide(viewport.getAlignment().isNucleotide()); } setMenusFromViewport(viewport); @@ -229,9 +337,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * button functionality. * * @param file - * valid filename + * valid filename * @param format - * format of file + * format of file */ public void setFileName(String file, String format) { @@ -299,6 +407,17 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } 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) @@ -385,39 +504,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { boolean toggleSeqs = !evt.isControlDown(); boolean toggleCols = !evt.isShiftDown(); - - boolean hide = false; - - SequenceGroup sg = viewport.getSelectionGroup(); - if (toggleSeqs) - { - if (sg != null - && sg.getSize() != viewport.alignment.getHeight()) - { - hideSelSequences_actionPerformed(null); - hide = true; - } - else if (!(toggleCols && viewport.colSel.getSelected().size() > 0)) - { - showAllSeqs_actionPerformed(null); - } - } - - if (toggleCols) - { - if (viewport.colSel.getSelected().size() > 0) - { - hideSelColumns_actionPerformed(null); - if (!toggleSeqs) - { - viewport.selectionGroup = sg; - } - } - else if (!hide) - { - showAllColumns_actionPerformed(null); - } - } + toggleHiddenRegions(toggleSeqs, toggleCols); break; } case KeyEvent.VK_PAGE_UP: @@ -497,12 +584,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (newPanel) { - if (ap.av.padGaps) + if (ap.av.isPadGaps()) { - ap.av.alignment.padGaps(); + ap.av.getAlignment().padGaps(); } ap.av.updateConservation(ap); ap.av.updateConsensus(ap); + ap.av.updateStrucConsensus(ap); } } @@ -525,32 +613,47 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, private void addServiceListeners() { final java.beans.PropertyChangeListener thisListener; - // Do this once to get current state - BuildWebServiceMenu(); - Desktop.discoverer - .addPropertyChangeListener(thisListener = new java.beans.PropertyChangeListener() + Desktop.instance.addJalviewPropertyChangeListener("services", + thisListener = new java.beans.PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { - // System.out.println("Discoverer property change."); - if (evt.getPropertyName().equals("services")) + // // System.out.println("Discoverer property change."); + // if (evt.getPropertyName().equals("services")) { - // System.out.println("Rebuilding web service menu"); - BuildWebServiceMenu(); + SwingUtilities.invokeLater(new Runnable() + { + + public void run() + { + System.err + .println("Rebuild WS Menu for service change"); + BuildWebServiceMenu(); + } + + }); } } }); - addInternalFrameListener(new javax.swing.event.InternalFrameAdapter() { public void internalFrameClosed( javax.swing.event.InternalFrameEvent evt) { - // System.out.println("deregistering discoverer listener"); - Desktop.discoverer.removePropertyChangeListener(thisListener); + System.out.println("deregistering discoverer listener"); + Desktop.instance.removeJalviewPropertyChangeListener("services", + thisListener); closeMenuItem_actionPerformed(true); }; }); + // Finally, build the menu once to get current service state + new Thread(new Runnable() + { + public void run() + { + BuildWebServiceMenu(); + } + }).start(); } public void setGUINucleotide(boolean nucleotide) @@ -558,12 +661,15 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, showTranslation.setVisible(nucleotide); conservationMenuItem.setEnabled(!nucleotide); modifyConservation.setEnabled(!nucleotide); - + showGroupConservation.setEnabled(!nucleotide); + rnahelicesColour.setEnabled(nucleotide); + purinePyrimidineColour.setEnabled(nucleotide); // Remember AlignFrame always starts as protein - if (!nucleotide) - { - calculateMenu.remove(calculateMenu.getItemCount() - 2); - } + // if (!nucleotide) + // { + // showTr + // calculateMenu.remove(calculateMenu.getItemCount() - 2); + // } } /** @@ -581,11 +687,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * loading from Jalview2XML.java * * @param av - * AlignViewport + * AlignViewport */ void setMenusFromViewport(AlignViewport av) { - padGapsMenuitem.setSelected(av.padGaps); + padGapsMenuitem.setSelected(av.isPadGaps()); colourTextMenuItem.setSelected(av.showColourText); abovePIDThreshold.setSelected(av.getAbovePIDThreshold()); conservationMenuItem.setSelected(av.getConservationSelected()); @@ -600,16 +706,27 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, annotationPanelMenuItem.setState(av.showAnnotation); viewBoxesMenuItem.setSelected(av.showBoxes); viewTextMenuItem.setSelected(av.showText); - showUnconservedMenuItem.setSelected(av.showUnconserved); + showNonconservedMenuItem.setSelected(av.getShowUnconserved()); + showGroupConsensus.setSelected(av.isShowGroupConsensus()); + showGroupConservation.setSelected(av.isShowGroupConservation()); + showConsensusHistogram.setSelected(av.isShowConsensusHistogram()); + showSequenceLogo.setSelected(av.isShowSequenceLogo()); + normaliseSequenceLogo.setSelected(av.isNormaliseSequenceLogo()); + setColourSelected(ColourSchemeProperty.getColourName(av .getGlobalColourScheme())); showSeqFeatures.setSelected(av.showSequenceFeatures); hiddenMarkers.setState(av.showHiddenMarkers); - applyToAllGroups.setState(av.colourAppliesToAllGroups); + applyToAllGroups.setState(av.getColourAppliesToAllGroups()); showNpFeatsMenuitem.setSelected(av.isShowNpFeats()); showDbRefsMenuitem.setSelected(av.isShowDbRefs()); - + autoCalculate.setSelected(av.autoCalculateConsensus); + sortByTree.setSelected(av.sortByTree); + listenToViewSelections.setSelected(av.followSelection); + rnahelicesColour.setEnabled(av.getAlignment().hasRNAStructure()); + rnahelicesColour + .setSelected(av.getGlobalColourScheme() instanceof jalview.schemes.RNAHelicesColour); setShowProductsEnabled(); updateEditMenuBar(); @@ -631,20 +748,21 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } JPanel progressPanel; + Long lId = new Long(id); GridLayout layout = (GridLayout) statusPanel.getLayout(); - if (progressBars.get(new Long(id)) != null) + if (progressBars.get(lId) != null) { progressPanel = (JPanel) progressBars.get(new Long(id)); statusPanel.remove(progressPanel); - progressBars.remove(progressPanel); + progressBars.remove(lId); progressPanel = null; if (message != null) { statusBar.setText(message); } - if (progressBarHandlers.contains(new Long(id))) + if (progressBarHandlers.contains(lId)) { - progressBarHandlers.remove(new Long(id)); + progressBarHandlers.remove(lId); } layout.setRows(layout.getRows() - 1); } @@ -661,35 +779,43 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, layout.setRows(layout.getRows() + 1); statusPanel.add(progressPanel); - progressBars.put(new Long(id), progressPanel); + progressBars.put(lId, progressPanel); } // update GUI - setMenusForViewport(); + // setMenusForViewport(); validate(); } - public void registerHandler(final long id, final IProgressIndicatorHandler handler) + + public void registerHandler(final long id, + final IProgressIndicatorHandler handler) { - if (progressBarHandlers==null || !progressBars.contains(new Long(id))) + if (progressBarHandlers == null || !progressBars.contains(new Long(id))) { - throw new Error("call setProgressBar before registering the progress bar's handler."); + throw new Error( + "call setProgressBar before registering the progress bar's handler."); } progressBarHandlers.put(new Long(id), handler); final JPanel progressPanel = (JPanel) progressBars.get(new Long(id)); if (handler.canCancel()) { JButton cancel = new JButton("Cancel"); - final IProgressIndicator us=this; - cancel.addActionListener(new ActionListener() { + final IProgressIndicator us = this; + cancel.addActionListener(new ActionListener() + { public void actionPerformed(ActionEvent e) { handler.cancelActivity(id); - us.setProgressBar("Cancelled "+((JLabel)progressPanel.getComponent(0)).getText(), id); + us.setProgressBar( + "Cancelled " + + ((JLabel) progressPanel.getComponent(0)) + .getText(), id); } }); progressPanel.add(cancel, BorderLayout.EAST); } } + /** * * @return true if any progress bars are still active @@ -730,6 +856,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { if (fileName != null) { + // TODO: JAL-1108 - ensure all associated frames are closed regardless of + // originating file's format + // TODO: work out how to recover feature settings for correct view(s) when + // file is reloaded. if (currentFileFormat.equals("Jalview")) { JInternalFrame[] frames = Desktop.desktop.getAllFrames(); @@ -764,7 +894,23 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, protocol, currentFileFormat); newframe.setBounds(bounds); - + if (featureSettings != null && featureSettings.isShowing()) + { + final Rectangle fspos = featureSettings.frame.getBounds(); + // TODO: need a 'show feature settings' function that takes bounds - + // need to refactor Desktop.addFrame + newframe.featureSettings_actionPerformed(null); + final FeatureSettings nfs = newframe.featureSettings; + SwingUtilities.invokeLater(new Runnable() + { + public void run() + { + nfs.frame.setBounds(fspos); + } + }); + this.featureSettings.close(); + this.featureSettings = null; + } this.closeMenuItem_actionPerformed(true); } } @@ -783,8 +929,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, public void save_actionPerformed(ActionEvent e) { if (fileName == null - || (currentFileFormat == null - || !jalview.io.FormatAdapter.isValidIOFormat(currentFileFormat, true)) + || (currentFileFormat == null || !jalview.io.FormatAdapter + .isValidIOFormat(currentFileFormat, true)) || fileName.startsWith("http")) { saveAs_actionPerformed(null); @@ -799,12 +945,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void saveAs_actionPerformed(ActionEvent e) { - JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache - .getProperty("LAST_DIRECTORY"), + JalviewFileChooser chooser = new JalviewFileChooser( + jalview.bin.Cache.getProperty("LAST_DIRECTORY"), jalview.io.AppletFormatAdapter.WRITABLE_EXTENSIONS, jalview.io.AppletFormatAdapter.WRITABLE_FNAMES, currentFileFormat, false); @@ -866,18 +1012,16 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { if (!jalview.io.AppletFormatAdapter.isValidFormat(format, true)) { - // JBPNote need to have a raise_gui flag here - JOptionPane.showInternalMessageDialog(this, "Cannot save file " - + fileName + " using format " + format, - "Alignment output format not supported", - JOptionPane.WARNING_MESSAGE); + warningMessage("Cannot save file " + fileName + " using format " + + format, "Alignment output format not supported"); saveAs_actionPerformed(null); + // JBPNote need to have a raise_gui flag here return false; } String[] omitHidden = null; - if (viewport.hasHiddenColumns) + if (viewport.hasHiddenColumns()) { int reply = JOptionPane .showInternalConfirmDialog( @@ -894,10 +1038,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } } FormatAdapter f = new FormatAdapter(); - String output = f.formatSequences(format, - (Alignment) viewport.alignment, // class cast exceptions will + String output = f.formatSequences( + format, + (Alignment) viewport.getAlignment(), // class cast exceptions will // occur in the distant future - omitHidden, f.getCacheSuffixDefault(format), viewport.colSel); + omitHidden, f.getCacheSuffixDefault(format), + viewport.getColumnSelection()); if (output == null) { @@ -932,17 +1078,32 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, return success; } + private void warningMessage(String warning, String title) + { + if (new jalview.util.Platform().isHeadless()) + { + System.err.println("Warning: " + title + "\nWarning: " + warning); + + } + else + { + JOptionPane.showInternalMessageDialog(this, warning, title, + JOptionPane.WARNING_MESSAGE); + } + return; + } + /** * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ protected void outputText_actionPerformed(ActionEvent e) { String[] omitHidden = null; - if (viewport.hasHiddenColumns) + if (viewport.hasHiddenColumns()) { int reply = JOptionPane .showInternalConfirmDialog( @@ -961,24 +1122,33 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, CutAndPasteTransfer cap = new CutAndPasteTransfer(); cap.setForInput(null); - Desktop.addInternalFrame(cap, "Alignment output - " - + e.getActionCommand(), 600, 500); - cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(), - viewport.alignment, omitHidden, viewport.colSel)); + try + { + cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(), + viewport.getAlignment(), omitHidden, + viewport.getColumnSelection())); + Desktop.addInternalFrame(cap, + "Alignment output - " + e.getActionCommand(), 600, 500); + } catch (OutOfMemoryError oom) + { + new OOMWarning("Outputting alignment as " + e.getActionCommand(), oom); + cap.dispose(); + } + } /** * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ protected void htmlMenuItem_actionPerformed(ActionEvent e) { - new HTMLOutput(alignPanel, alignPanel.seqPanel.seqCanvas - .getSequenceRenderer(), alignPanel.seqPanel.seqCanvas - .getFeatureRenderer()); + new HTMLOutput(alignPanel, + alignPanel.seqPanel.seqCanvas.getSequenceRenderer(), + alignPanel.seqPanel.seqCanvas.getFeatureRenderer()); } public void createImageMap(File file, String image) @@ -990,7 +1160,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void createPNG(File f) { @@ -1001,7 +1171,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void createEPS(File f) { @@ -1018,7 +1188,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void printMenuItem_actionPerformed(ActionEvent e) { @@ -1035,17 +1205,17 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, public void exportAnnotations_actionPerformed(ActionEvent e) { new AnnotationExporter().exportAnnotations(alignPanel, - viewport.showAnnotation ? viewport.alignment - .getAlignmentAnnotation() : null, viewport.alignment - .getGroups(), - ((Alignment) viewport.alignment).alignmentProperties); + viewport.showAnnotation ? viewport.getAlignment() + .getAlignmentAnnotation() : null, viewport + .getAlignment().getGroups(), ((Alignment) viewport + .getAlignment()).alignmentProperties); } public void associatedData_actionPerformed(ActionEvent e) { // Pick the tree file - JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache - .getProperty("LAST_DIRECTORY")); + JalviewFileChooser chooser = new JalviewFileChooser( + jalview.bin.Cache.getProperty("LAST_DIRECTORY")); chooser.setFileView(new JalviewFileView()); chooser.setDialogTitle("Load Jalview Annotations or Features File"); chooser.setToolTipText("Load Jalview Annotations / Features file"); @@ -1056,16 +1226,16 @@ 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); } } /** - * Close the current view or all views in the alignment frame. - * If the frame only contains one view then the alignment will be removed from memory. + * Close the current view or all views in the alignment frame. If the frame + * only contains one view then the alignment will be removed from memory. * - * @param closeAllTabs + * @param closeAllTabs */ public void closeMenuItem_actionPerformed(boolean closeAllTabs) { @@ -1080,24 +1250,20 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { if (closeAllTabs) { - for (int i = 0; i < alignPanels.size(); i++) + if (this.isClosed()) { - AlignmentPanel ap = (AlignmentPanel) alignPanels.elementAt(i); - jalview.structure.StructureSelectionManager ssm = - jalview.structure.StructureSelectionManager - .getStructureSelectionManager(); - ssm.removeStructureViewerListener(ap.seqPanel, null); - ssm.removeSelectionListener(ap.seqPanel); - PaintRefresher.RemoveComponent(ap.seqPanel.seqCanvas); - PaintRefresher.RemoveComponent(ap.idPanel.idCanvas); - PaintRefresher.RemoveComponent(ap); - ap.av.alignment = null; + // really close all the windows - otherwise wait till + // setClosed(true) is called + for (int i = 0; i < alignPanels.size(); i++) + { + AlignmentPanel ap = (AlignmentPanel) alignPanels.elementAt(i); + ap.closePanel(); + } } } else { closeView(alignPanel); - viewport = null; } } @@ -1111,22 +1277,24 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } } + /** + * close alignPanel2 and shuffle tabs appropriately. + * + * @param alignPanel2 + */ public void closeView(AlignmentPanel alignPanel2) { int index = tabbedPane.getSelectedIndex(); int closedindex = tabbedPane.indexOfComponent(alignPanel2); alignPanels.removeElement(alignPanel2); - PaintRefresher.RemoveComponent(alignPanel2.seqPanel.seqCanvas); - PaintRefresher.RemoveComponent(alignPanel2.idPanel.idCanvas); - PaintRefresher.RemoveComponent(alignPanel2); - alignPanel2.av.alignment = null; - - if (viewport == alignPanel2.av) - { - viewport = null; - } + // Unnecessary + // if (viewport == alignPanel2.av) + // { + // viewport = null; + // } + alignPanel2.closePanel(); alignPanel2 = null; - + tabbedPane.removeTabAt(closedindex); tabbedPane.validate(); @@ -1136,7 +1304,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, index--; } - this.tabSelectionChanged(index); + this.tabSelectionChanged(index); } /** @@ -1178,7 +1346,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, viewport.historyList.push(command); viewport.redoList.clear(); updateEditMenuBar(); - viewport.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null; + viewport.updateHiddenColumns(); + // viewport.hasHiddenColumns = (viewport.getColumnSelection() != null + // && viewport.getColumnSelection().getHiddenColumns() != null && + // viewport.getColumnSelection() + // .getHiddenColumns().size() > 0); } } @@ -1201,7 +1373,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (viewport != null) { return new AlignmentI[] - { viewport.alignment }; + { viewport.getAlignment() }; } return null; } @@ -1210,7 +1382,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ protected void undoMenuItem_actionPerformed(ActionEvent e) { @@ -1225,9 +1397,19 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (originalSource != null) { - originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null; - originalSource.firePropertyChange("alignment", null, - originalSource.alignment.getSequences()); + if (originalSource != viewport) + { + Cache.log + .warn("Implementation worry: mismatch of viewport origin for undo"); + } + originalSource.updateHiddenColumns(); + // originalSource.hasHiddenColumns = (viewport.getColumnSelection() != + // null + // && viewport.getColumnSelection().getHiddenColumns() != null && + // viewport.getColumnSelection() + // .getHiddenColumns().size() > 0); + originalSource.firePropertyChange("alignment", null, originalSource + .getAlignment().getSequences()); } } @@ -1235,7 +1417,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ protected void redoMenuItem_actionPerformed(ActionEvent e) { @@ -1253,9 +1435,20 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (originalSource != null) { - originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null; - originalSource.firePropertyChange("alignment", null, - originalSource.alignment.getSequences()); + + if (originalSource != viewport) + { + Cache.log + .warn("Implementation worry: mismatch of viewport origin for redo"); + } + originalSource.updateHiddenColumns(); + // originalSource.hasHiddenColumns = (viewport.getColumnSelection() != + // null + // && viewport.getColumnSelection().getHiddenColumns() != null && + // viewport.getColumnSelection() + // .getHiddenColumns().size() > 0); + originalSource.firePropertyChange("alignment", null, originalSource + .getAlignment().getSequences()); } } @@ -1277,7 +1470,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { if (comps.elementAt(i) instanceof AlignmentPanel) { - if (al == ((AlignmentPanel) comps.elementAt(i)).av.alignment) + if (al == ((AlignmentPanel) comps.elementAt(i)).av.getAlignment()) { originalSource = ((AlignmentPanel) comps.elementAt(i)).av; break; @@ -1292,7 +1485,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // the current view against the closed view first if (al != null) { - PaintRefresher.validateSequences(al, viewport.alignment); + PaintRefresher.validateSequences(al, viewport.getAlignment()); } originalSource = viewport; @@ -1305,7 +1498,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param up - * DOCUMENT ME! + * DOCUMENT ME! */ public void moveSelectedSequences(boolean up) { @@ -1318,46 +1511,46 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (up) { - for (int i = 1; i < viewport.alignment.getHeight(); i++) + for (int i = 1; i < viewport.getAlignment().getHeight(); i++) { - SequenceI seq = viewport.alignment.getSequenceAt(i); + SequenceI seq = viewport.getAlignment().getSequenceAt(i); if (!sg.getSequences(null).contains(seq)) { continue; } - SequenceI temp = viewport.alignment.getSequenceAt(i - 1); + SequenceI temp = viewport.getAlignment().getSequenceAt(i - 1); if (sg.getSequences(null).contains(temp)) { continue; } - viewport.alignment.getSequences().setElementAt(temp, i); - viewport.alignment.getSequences().setElementAt(seq, i - 1); + viewport.getAlignment().getSequences().setElementAt(temp, i); + viewport.getAlignment().getSequences().setElementAt(seq, i - 1); } } else { - for (int i = viewport.alignment.getHeight() - 2; i > -1; i--) + for (int i = viewport.getAlignment().getHeight() - 2; i > -1; i--) { - SequenceI seq = viewport.alignment.getSequenceAt(i); + SequenceI seq = viewport.getAlignment().getSequenceAt(i); if (!sg.getSequences(null).contains(seq)) { continue; } - SequenceI temp = viewport.alignment.getSequenceAt(i + 1); + SequenceI temp = viewport.getAlignment().getSequenceAt(i + 1); if (sg.getSequences(null).contains(temp)) { continue; } - viewport.alignment.getSequences().setElementAt(temp, i); - viewport.alignment.getSequences().setElementAt(seq, i + 1); + viewport.getAlignment().getSequences().setElementAt(temp, i); + viewport.getAlignment().getSequences().setElementAt(seq, i + 1); } } @@ -1366,18 +1559,18 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, synchronized void slideSequences(boolean right, int size) { - Vector sg = new Vector(); + List sg = new Vector(); if (viewport.cursorMode) { - sg.addElement(viewport.alignment - .getSequenceAt(alignPanel.seqPanel.seqCanvas.cursorY)); + sg.add(viewport.getAlignment().getSequenceAt( + alignPanel.seqPanel.seqCanvas.cursorY)); } else if (viewport.getSelectionGroup() != null - && viewport.getSelectionGroup().getSize() != viewport.alignment - .getHeight()) + && viewport.getSelectionGroup().getSize() != viewport + .getAlignment().getHeight()) { sg = viewport.getSelectionGroup().getSequences( - viewport.hiddenRepSequences); + viewport.getHiddenRepSequences()); } if (sg.size() < 1) @@ -1387,16 +1580,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, Vector invertGroup = new Vector(); - for (int i = 0; i < viewport.alignment.getHeight(); i++) + for (int i = 0; i < viewport.getAlignment().getHeight(); i++) { - if (!sg.contains(viewport.alignment.getSequenceAt(i))) - invertGroup.add(viewport.alignment.getSequenceAt(i)); + if (!sg.contains(viewport.getAlignment().getSequenceAt(i))) + invertGroup.add(viewport.getAlignment().getSequenceAt(i)); } - SequenceI[] seqs1 = new SequenceI[sg.size()]; - for (int i = 0; i < sg.size(); i++) - seqs1[i] = (SequenceI) sg.elementAt(i); - + SequenceI[] seqs1 = sg.toArray(new SequenceI[0]); + SequenceI[] seqs2 = new SequenceI[invertGroup.size()]; for (int i = 0; i < invertGroup.size(); i++) seqs2[i] = (SequenceI) invertGroup.elementAt(i); @@ -1452,7 +1643,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ protected void copy_actionPerformed(ActionEvent e) { @@ -1466,7 +1657,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, SequenceI[] seqs = viewport.getSelectionAsNewSequence(); String[] omitHidden = null; - if (viewport.hasHiddenColumns) + if (viewport.hasHiddenColumns()) { omitHidden = viewport.getViewAsString(true); } @@ -1481,11 +1672,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, jalview.gui.Desktop.internalCopy = true; // Its really worth setting the clipboard contents // to empty before setting the large StringSelection!! - Toolkit.getDefaultToolkit().getSystemClipboard().setContents( - new StringSelection(""), null); + Toolkit.getDefaultToolkit().getSystemClipboard() + .setContents(new StringSelection(""), null); - Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, - Desktop.instance); + Toolkit.getDefaultToolkit().getSystemClipboard() + .setContents(ss, Desktop.instance); } catch (OutOfMemoryError er) { new OOMWarning("copying region", er); @@ -1493,23 +1684,26 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } Vector hiddenColumns = null; - if (viewport.hasHiddenColumns) + if (viewport.hasHiddenColumns()) { hiddenColumns = new Vector(); - int hiddenOffset = viewport.getSelectionGroup().getStartRes(); + int hiddenOffset = viewport.getSelectionGroup().getStartRes(), hiddenCutoff = viewport + .getSelectionGroup().getEndRes(); for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns() .size(); i++) { int[] region = (int[]) viewport.getColumnSelection() .getHiddenColumns().elementAt(i); - - hiddenColumns.addElement(new int[] - { region[0] - hiddenOffset, region[1] - hiddenOffset }); + if (region[0] >= hiddenOffset && region[1] <= hiddenCutoff) + { + hiddenColumns.addElement(new int[] + { region[0] - hiddenOffset, region[1] - hiddenOffset }); + } } } Desktop.jalviewClipboard = new Object[] - { seqs, viewport.alignment.getDataset(), hiddenColumns }; + { seqs, viewport.getAlignment().getDataset(), hiddenColumns }; statusBar.setText("Copied " + seqs.length + " sequences to clipboard."); } @@ -1517,7 +1711,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ protected void pasteNew_actionPerformed(ActionEvent e) { @@ -1528,7 +1722,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ protected void pasteThis_actionPerformed(ActionEvent e) { @@ -1539,7 +1733,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * Paste contents of Jalview clipboard * * @param newAlignment - * true to paste to a new alignment, otherwise add to this. + * true to paste to a new alignment, otherwise add to this. */ void paste(boolean newAlignment) { @@ -1745,8 +1939,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } buildSortByAnnotationScoresMenu(); } - viewport.firePropertyChange("alignment", null, alignment - .getSequences()); + viewport.firePropertyChange("alignment", null, + alignment.getSequences()); } else @@ -1808,7 +2002,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ protected void cut_actionPerformed(ActionEvent e) { @@ -1820,7 +2014,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ protected void delete_actionPerformed(ActionEvent evt) { @@ -1840,7 +2034,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } // If the cut affects all sequences, remove highlighted columns - if (sg.getSize() == viewport.alignment.getHeight()) + if (sg.getSize() == viewport.getAlignment().getHeight()) { viewport.getColumnSelection().removeElements(sg.getStartRes(), sg.getEndRes() + 1); @@ -1857,11 +2051,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, */ addHistoryItem(new EditCommand("Cut Sequences", EditCommand.CUT, cut, sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1, - viewport.alignment)); + viewport.getAlignment())); viewport.setSelectionGroup(null); viewport.sendSelection(); - viewport.alignment.deleteGroup(sg); + viewport.getAlignment().deleteGroup(sg); viewport.firePropertyChange("alignment", null, viewport.getAlignment() .getSequences()); @@ -1880,14 +2074,15 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ protected void deleteGroups_actionPerformed(ActionEvent e) { - viewport.alignment.deleteAllGroups(); + viewport.getAlignment().deleteAllGroups(); viewport.sequenceColours = null; viewport.setSelectionGroup(null); PaintRefresher.Refresh(this, viewport.getSequenceSetId()); + alignPanel.updateAnnotation(); alignPanel.paintAlignment(true); } @@ -1895,7 +2090,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e) { @@ -1906,7 +2101,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, sg.addSequence(viewport.getAlignment().getSequenceAt(i), false); } - sg.setEndRes(viewport.alignment.getWidth() - 1); + sg.setEndRes(viewport.getAlignment().getWidth() - 1); viewport.setSelectionGroup(sg); viewport.sendSelection(); alignPanel.paintAlignment(true); @@ -1917,7 +2112,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e) { @@ -1933,13 +2128,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, alignPanel.idPanel.idCanvas.searchResults = null; alignPanel.paintAlignment(true); PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId()); + viewport.sendSelection(); } /** * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void invertSequenceMenuItem_actionPerformed(ActionEvent e) { @@ -1958,21 +2154,22 @@ 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(); } /** * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void remove2LeftMenuItem_actionPerformed(ActionEvent e) { @@ -1983,7 +2180,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void remove2RightMenuItem_actionPerformed(ActionEvent e) { @@ -2010,11 +2207,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (viewport.getSelectionGroup() != null) { seqs = viewport.getSelectionGroup().getSequencesAsArray( - viewport.hiddenRepSequences); + viewport.getHiddenRepSequences()); } else { - seqs = viewport.alignment.getSequencesArray(); + seqs = viewport.getAlignment().getSequencesArray(); } TrimRegionCommand trimRegion; @@ -2022,32 +2219,28 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { trimRegion = new TrimRegionCommand("Remove Left", TrimRegionCommand.TRIM_LEFT, seqs, column, - viewport.alignment, viewport.colSel, - viewport.selectionGroup); + viewport.getAlignment(), viewport.getColumnSelection(), + viewport.getSelectionGroup()); viewport.setStartRes(0); } else { trimRegion = new TrimRegionCommand("Remove Right", TrimRegionCommand.TRIM_RIGHT, seqs, column, - viewport.alignment, viewport.colSel, - viewport.selectionGroup); + viewport.getAlignment(), viewport.getColumnSelection(), + viewport.getSelectionGroup()); } statusBar.setText("Removed " + trimRegion.getSize() + " columns."); addHistoryItem(trimRegion); - Vector groups = viewport.alignment.getGroups(); - - for (int i = 0; i < groups.size(); i++) + for (SequenceGroup sg :viewport.getAlignment().getGroups()) { - SequenceGroup sg = (SequenceGroup) groups.get(i); - if ((trimLeft && !sg.adjustForRemoveLeft(column)) || (!trimLeft && !sg.adjustForRemoveRight(column))) { - viewport.alignment.deleteGroup(sg); + viewport.getAlignment().deleteGroup(sg); } } @@ -2060,27 +2253,28 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e) { - int start = 0, end = viewport.alignment.getWidth() - 1; + int start = 0, end = viewport.getAlignment().getWidth() - 1; SequenceI[] seqs; if (viewport.getSelectionGroup() != null) { seqs = viewport.getSelectionGroup().getSequencesAsArray( - viewport.hiddenRepSequences); + viewport.getHiddenRepSequences()); start = viewport.getSelectionGroup().getStartRes(); end = viewport.getSelectionGroup().getEndRes(); } else { - seqs = viewport.alignment.getSequencesArray(); + seqs = viewport.getAlignment().getSequencesArray(); } RemoveGapColCommand removeGapCols = new RemoveGapColCommand( - "Remove Gapped Columns", seqs, start, end, viewport.alignment); + "Remove Gapped Columns", seqs, start, end, + viewport.getAlignment()); addHistoryItem(removeGapCols); @@ -2089,7 +2283,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // This is to maintain viewport position on first residue // of first sequence - SequenceI seq = viewport.alignment.getSequenceAt(0); + SequenceI seq = viewport.getAlignment().getSequenceAt(0); int startRes = seq.findPosition(viewport.startRes); // ShiftList shifts; // viewport.getAlignment().removeGaps(shifts=new ShiftList()); @@ -2106,32 +2300,32 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void removeAllGapsMenuItem_actionPerformed(ActionEvent e) { - int start = 0, end = viewport.alignment.getWidth() - 1; + int start = 0, end = viewport.getAlignment().getWidth() - 1; SequenceI[] seqs; if (viewport.getSelectionGroup() != null) { seqs = viewport.getSelectionGroup().getSequencesAsArray( - viewport.hiddenRepSequences); + viewport.getHiddenRepSequences()); start = viewport.getSelectionGroup().getStartRes(); end = viewport.getSelectionGroup().getEndRes(); } else { - seqs = viewport.alignment.getSequencesArray(); + seqs = viewport.getAlignment().getSequencesArray(); } // This is to maintain viewport position on first residue // of first sequence - SequenceI seq = viewport.alignment.getSequenceAt(0); + SequenceI seq = viewport.getAlignment().getSequenceAt(0); int startRes = seq.findPosition(viewport.startRes); addHistoryItem(new RemoveGapsCommand("Remove Gaps", seqs, start, end, - viewport.alignment)); + viewport.getAlignment())); viewport.setStartRes(seq.findIndex(startRes) - 1); @@ -2144,29 +2338,30 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void padGapsMenuitem_actionPerformed(ActionEvent e) { - viewport.padGaps = padGapsMenuitem.isSelected(); + viewport.setPadGaps(padGapsMenuitem.isSelected()); viewport.firePropertyChange("alignment", null, viewport.getAlignment() .getSequences()); } - - //else + + // else { // if (justifySeqs>0) { // alignment.justify(justifySeqs!=RIGHT_JUSTIFY); } } - //} - + + // } + /** * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void findMenuItem_actionPerformed(ActionEvent e) { @@ -2175,8 +2370,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.getAlignment().deleteAllGroups(); + for (AlignmentAnnotation alan : newap.av.getAlignment() + .getAlignmentAnnotation()) + { + if (!alan.autoCalculated) + { + newap.av.getAlignment().deleteAnnotation(alan); + } + ; + } + } newap.av.gatherViewsHere = false; @@ -2189,8 +2433,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(); @@ -2208,7 +2463,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, while (existingNames.contains(newViewName)) { - newViewName = "View " + (++index); + newViewName = viewTitle + " " + (++index); } newap.av.viewName = newViewName; @@ -2220,6 +2475,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, viewport.gatherViewsHere = true; } tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1); + return newap; } public void expandViews_actionPerformed(ActionEvent e) @@ -2236,7 +2492,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void font_actionPerformed(ActionEvent e) { @@ -2247,7 +2503,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ protected void seqLimit_actionPerformed(ActionEvent e) { @@ -2269,14 +2525,18 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, viewport.centreColumnLabels = centreColumnLabelsMenuItem.getState(); alignPanel.paintAlignment(true); } - /* (non-Javadoc) + + /* + * (non-Javadoc) + * * @see jalview.jbgui.GAlignFrame#followHighlight_actionPerformed() */ protected void followHighlight_actionPerformed() { if (viewport.followHighlight = this.followHighlightMenuItem.getState()) { - alignPanel.scrollToPosition(alignPanel.seqPanel.seqCanvas.searchResults, false); + alignPanel.scrollToPosition( + alignPanel.seqPanel.seqCanvas.searchResults, false); } } @@ -2284,7 +2544,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ protected void colourTextMenuItem_actionPerformed(ActionEvent e) { @@ -2296,7 +2556,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void wrapMenuItem_actionPerformed(ActionEvent e) { @@ -2324,6 +2584,118 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, alignPanel.paintAlignment(true); } + /** + * called by key handler and the hide all/show all menu items + * + * @param toggleSeqs + * @param toggleCols + */ + private void toggleHiddenRegions(boolean toggleSeqs, boolean toggleCols) + { + + boolean hide = false; + SequenceGroup sg = viewport.getSelectionGroup(); + if (!toggleSeqs && !toggleCols) + { + // Hide everything by the current selection - this is a hack - we do the + // invert and then hide + // first check that there will be visible columns after the invert. + if ((viewport.getColumnSelection() != null + && viewport.getColumnSelection().getSelected() != null && viewport + .getColumnSelection().getSelected().size() > 0) + || (sg != null && sg.getSize() > 0 && sg.getStartRes() <= sg + .getEndRes())) + { + // now invert the sequence set, if required - empty selection implies + // that no hiding is required. + if (sg != null) + { + invertSequenceMenuItem_actionPerformed(null); + sg = viewport.getSelectionGroup(); + toggleSeqs = true; + + } + viewport.expandColSelection(sg, true); + // finally invert the column selection and get the new sequence + // selection. + invertColSel_actionPerformed(null); + toggleCols = true; + } + } + + if (toggleSeqs) + { + if (sg != null && sg.getSize() != viewport.getAlignment().getHeight()) + { + hideSelSequences_actionPerformed(null); + hide = true; + } + else if (!(toggleCols && viewport.getColumnSelection().getSelected() + .size() > 0)) + { + showAllSeqs_actionPerformed(null); + } + } + + if (toggleCols) + { + if (viewport.getColumnSelection().getSelected().size() > 0) + { + hideSelColumns_actionPerformed(null); + if (!toggleSeqs) + { + viewport.setSelectionGroup(sg); + } + } + else if (!hide) + { + showAllColumns_actionPerformed(null); + } + } + } + + /* + * (non-Javadoc) + * + * @see + * jalview.jbgui.GAlignFrame#hideAllButSelection_actionPerformed(java.awt. + * event.ActionEvent) + */ + public void hideAllButSelection_actionPerformed(ActionEvent e) + { + toggleHiddenRegions(false, false); + } + + /* + * (non-Javadoc) + * + * @see + * jalview.jbgui.GAlignFrame#hideAllSelection_actionPerformed(java.awt.event + * .ActionEvent) + */ + public void hideAllSelection_actionPerformed(ActionEvent e) + { + SequenceGroup sg = viewport.getSelectionGroup(); + viewport.expandColSelection(sg, false); + viewport.hideAllSelectedSeqs(); + viewport.hideSelectedColumns(); + alignPanel.paintAlignment(true); + } + + /* + * (non-Javadoc) + * + * @see + * jalview.jbgui.GAlignFrame#showAllhidden_actionPerformed(java.awt.event. + * ActionEvent) + */ + public void showAllhidden_actionPerformed(ActionEvent e) + { + viewport.showAllHiddenColumns(); + viewport.showAllHiddenSeqs(); + alignPanel.paintAlignment(true); + } + public void hideSelColumns_actionPerformed(ActionEvent e) { viewport.hideSelectedColumns(); @@ -2340,7 +2712,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ protected void scaleAbove_actionPerformed(ActionEvent e) { @@ -2352,7 +2724,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ protected void scaleLeft_actionPerformed(ActionEvent e) { @@ -2364,7 +2736,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ protected void scaleRight_actionPerformed(ActionEvent e) { @@ -2376,7 +2748,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void viewBoxesMenuItem_actionPerformed(ActionEvent e) { @@ -2388,7 +2760,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void viewTextMenuItem_actionPerformed(ActionEvent e) { @@ -2400,7 +2772,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ protected void renderGapsMenuItem_actionPerformed(ActionEvent e) { @@ -2417,6 +2789,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, featureSettings.close(); featureSettings = null; } + if (!showSeqFeatures.isSelected()) + { + // make sure features are actually displayed + showSeqFeatures.setSelected(true); + showSeqFeatures_actionPerformed(null); + } featureSettings = new FeatureSettings(this); } @@ -2424,7 +2802,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * Set or clear 'Show Sequence Features' * * @param evt - * DOCUMENT ME! + * DOCUMENT ME! */ public void showSeqFeatures_actionPerformed(ActionEvent evt) { @@ -2435,15 +2813,17 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, alignPanel.getOverviewPanel().updateOverviewImage(); } } + /** * Set or clear 'Show Sequence Features' * * @param evt - * DOCUMENT ME! + * DOCUMENT ME! */ public void showSeqFeaturesHeight_actionPerformed(ActionEvent evt) { - viewport.setShowSequenceFeaturesHeight(showSeqFeaturesHeight.isSelected()); + viewport.setShowSequenceFeaturesHeight(showSeqFeaturesHeight + .isSelected()); if (viewport.getShowSequenceFeaturesHeight()) { // ensure we're actually displaying features @@ -2461,7 +2841,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void annotationPanelMenuItem_actionPerformed(ActionEvent e) { @@ -2473,58 +2853,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.getAlignment()) + .formatAsHtml(); + editPane.setText("" + contents.toString() + ""); JInternalFrame frame = new JInternalFrame(); frame.getContentPane().add(new JScrollPane(editPane)); @@ -2536,7 +2867,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void overviewMenuItem_actionPerformed(ActionEvent e) { @@ -2548,19 +2879,18 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, JInternalFrame frame = new JInternalFrame(); OverviewPanel overview = new OverviewPanel(alignPanel); frame.setContentPane(overview); - Desktop.addInternalFrame(frame, "Overview " + this.getTitle(), frame - .getWidth(), frame.getHeight()); + Desktop.addInternalFrame(frame, "Overview " + this.getTitle(), + frame.getWidth(), frame.getHeight()); frame.pack(); frame.setLayer(JLayeredPane.PALETTE_LAYER); - frame - .addInternalFrameListener(new javax.swing.event.InternalFrameAdapter() - { - public void internalFrameClosed( - javax.swing.event.InternalFrameEvent evt) - { - alignPanel.setOverviewPanel(null); - }; - }); + frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter() + { + public void internalFrameClosed( + javax.swing.event.InternalFrameEvent evt) + { + alignPanel.setOverviewPanel(null); + }; + }); alignPanel.setOverviewPanel(overview); } @@ -2574,7 +2904,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ protected void noColourmenuItem_actionPerformed(ActionEvent e) { @@ -2585,20 +2915,18 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void clustalColour_actionPerformed(ActionEvent e) { - changeColour(new ClustalxColourScheme( - viewport.alignment.getSequences(), viewport.alignment - .getWidth())); + changeColour(new ClustalxColourScheme(viewport.getAlignment(), viewport.getHiddenRepSequences())); } /** * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void zappoColour_actionPerformed(ActionEvent e) { @@ -2609,7 +2937,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void taylorColour_actionPerformed(ActionEvent e) { @@ -2620,7 +2948,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void hydrophobicityColour_actionPerformed(ActionEvent e) { @@ -2631,7 +2959,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void helixColour_actionPerformed(ActionEvent e) { @@ -2642,7 +2970,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void strandColour_actionPerformed(ActionEvent e) { @@ -2653,7 +2981,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void turnColour_actionPerformed(ActionEvent e) { @@ -2664,7 +2992,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void buriedColour_actionPerformed(ActionEvent e) { @@ -2675,23 +3003,39 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void nucleotideColour_actionPerformed(ActionEvent e) { changeColour(new NucleotideColourScheme()); } + public void purinePyrimidineColour_actionPerformed(ActionEvent e) + { + changeColour(new PurinePyrimidineColourScheme()); + } + + /* + * public void covariationColour_actionPerformed(ActionEvent e) { + * changeColour(new + * CovariationColourScheme(viewport.getAlignment().getAlignmentAnnotation + * ()[0])); } + */ public void annotationColour_actionPerformed(ActionEvent e) { new AnnotationColourChooser(viewport, alignPanel); } + public void rnahelicesColour_actionPerformed(ActionEvent e) + { + new RNAHelicesColourChooser(viewport, alignPanel); + } + /** * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ protected void applyToAllGroups_actionPerformed(ActionEvent e) { @@ -2702,10 +3046,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param cs - * DOCUMENT ME! + * DOCUMENT ME! */ public void changeColour(ColourSchemeI cs) { + // TODO: compare with applet and pull up to model method int threshold = 0; if (cs != null) @@ -2727,13 +3072,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (viewport.getConservationSelected()) { - Alignment al = (Alignment) viewport.alignment; + Alignment al = (Alignment) viewport.getAlignment(); Conservation c = new Conservation("All", - ResidueProperties.propHash, 3, al.getSequences(), 0, al - .getWidth() - 1); + ResidueProperties.propHash, 3, al.getSequences(), 0, + al.getWidth() - 1); c.calculate(); - c.verdict(false, viewport.ConsPercGaps); + c.verdict(false, viewport.getConsPercGaps()); cs.setConservation(c); @@ -2745,19 +3090,17 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, cs.setConservation(null); } - cs.setConsensus(viewport.hconsensus); + cs.setConsensus(viewport.getSequenceConsensusHash()); } viewport.setGlobalColourScheme(cs); if (viewport.getColourAppliesToAllGroups()) { - Vector groups = viewport.alignment.getGroups(); - for (int i = 0; i < groups.size(); i++) - { - SequenceGroup sg = (SequenceGroup) groups.elementAt(i); + for (SequenceGroup sg:viewport.getAlignment().getGroups()) + { if (cs == null) { sg.cs = null; @@ -2766,8 +3109,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (cs instanceof ClustalxColourScheme) { - sg.cs = new ClustalxColourScheme(sg - .getSequences(viewport.hiddenRepSequences), sg.getWidth()); + sg.cs = new ClustalxColourScheme(sg, viewport + .getHiddenRepSequences()); } else if (cs instanceof UserColourScheme) { @@ -2777,7 +3120,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { try { - sg.cs = (ColourSchemeI) cs.getClass().newInstance(); + sg.cs = cs.getClass().newInstance(); } catch (Exception ex) { } @@ -2789,9 +3132,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus()); - sg.cs.setConsensus(AAFrequency.calculate(sg - .getSequences(viewport.hiddenRepSequences), sg - .getStartRes(), sg.getEndRes() + 1)); + sg.cs.setConsensus(AAFrequency.calculate( + sg.getSequences(viewport.getHiddenRepSequences()), + sg.getStartRes(), sg.getEndRes() + 1)); } else { @@ -2801,11 +3144,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (viewport.getConservationSelected()) { Conservation c = new Conservation("Group", - ResidueProperties.propHash, 3, sg - .getSequences(viewport.hiddenRepSequences), sg - .getStartRes(), sg.getEndRes() + 1); + ResidueProperties.propHash, 3, sg.getSequences(viewport + .getHiddenRepSequences()), sg.getStartRes(), + sg.getEndRes() + 1); c.calculate(); - c.verdict(false, viewport.ConsPercGaps); + c.verdict(false, viewport.getConsPercGaps()); sg.cs.setConservation(c); } else @@ -2827,15 +3170,15 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ protected void modifyPID_actionPerformed(ActionEvent e) { if (viewport.getAbovePIDThreshold() - && viewport.globalColourScheme != null) + && viewport.getGlobalColourScheme() != null) { - SliderPanel.setPIDSliderSource(alignPanel, viewport - .getGlobalColourScheme(), "Background"); + SliderPanel.setPIDSliderSource(alignPanel, + viewport.getGlobalColourScheme(), "Background"); SliderPanel.showPIDSlider(); } } @@ -2844,15 +3187,15 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ protected void modifyConservation_actionPerformed(ActionEvent e) { if (viewport.getConservationSelected() - && viewport.globalColourScheme != null) + && viewport.getGlobalColourScheme() != null) { SliderPanel.setConservationSlider(alignPanel, - viewport.globalColourScheme, "Background"); + viewport.getGlobalColourScheme(), "Background"); SliderPanel.showConservationSlider(); } } @@ -2861,7 +3204,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ protected void conservationMenuItem_actionPerformed(ActionEvent e) { @@ -2879,7 +3222,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void abovePIDThreshold_actionPerformed(ActionEvent e) { @@ -2897,7 +3240,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void userDefinedColour_actionPerformed(ActionEvent e) { @@ -2945,8 +3288,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (evt.isControlDown() || SwingUtilities.isRightMouseButton(evt)) { - radioItem - .removeActionListener(radioItem.getActionListeners()[0]); + radioItem.removeActionListener(radioItem.getActionListeners()[0]); int option = JOptionPane.showInternalConfirmDialog( jalview.gui.Desktop.desktop, @@ -2990,7 +3332,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void PIDColour_actionPerformed(ActionEvent e) { @@ -3001,7 +3343,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void BLOSUM62Colour_actionPerformed(ActionEvent e) { @@ -3012,7 +3354,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void sortPairwiseMenuItem_actionPerformed(ActionEvent e) { @@ -3020,7 +3362,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, AlignmentSorter.sortByPID(viewport.getAlignment(), viewport .getAlignment().getSequenceAt(0), null); addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder, - viewport.alignment)); + viewport.getAlignment())); alignPanel.paintAlignment(true); } @@ -3028,26 +3370,29 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void sortIDMenuItem_actionPerformed(ActionEvent e) { SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray(); AlignmentSorter.sortByID(viewport.getAlignment()); - addHistoryItem(new OrderCommand("ID Sort", oldOrder, viewport.alignment)); + addHistoryItem(new OrderCommand("ID Sort", oldOrder, + viewport.getAlignment())); alignPanel.paintAlignment(true); } + /** * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void sortLengthMenuItem_actionPerformed(ActionEvent e) { SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray(); AlignmentSorter.sortByLength(viewport.getAlignment()); - addHistoryItem(new OrderCommand("Length Sort", oldOrder, viewport.alignment)); + addHistoryItem(new OrderCommand("Length Sort", oldOrder, + viewport.getAlignment())); alignPanel.paintAlignment(true); } @@ -3055,14 +3400,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void sortGroupMenuItem_actionPerformed(ActionEvent e) { SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray(); AlignmentSorter.sortByGroup(viewport.getAlignment()); addHistoryItem(new OrderCommand("Group Sort", oldOrder, - viewport.alignment)); + viewport.getAlignment())); alignPanel.paintAlignment(true); } @@ -3071,7 +3416,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void removeRedundancyMenuItem_actionPerformed(ActionEvent e) { @@ -3082,7 +3427,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e) { @@ -3105,7 +3450,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void PCAMenuItem_actionPerformed(ActionEvent e) { @@ -3136,11 +3481,22 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } } + public void sortByTreeOption_actionPerformed(ActionEvent e) + { + viewport.sortByTree = sortByTree.isSelected(); + } + + @Override + protected void listenToViewSelections_actionPerformed(ActionEvent e) + { + viewport.followSelection = listenToViewSelections.isSelected(); + } + /** * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e) { @@ -3151,7 +3507,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ public void neighbourTreeMenuItem_actionPerformed(ActionEvent e) { @@ -3162,7 +3518,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e) { @@ -3173,7 +3529,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e) { @@ -3184,11 +3540,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param type - * DOCUMENT ME! + * DOCUMENT ME! * @param pwType - * DOCUMENT ME! + * DOCUMENT ME! * @param title - * DOCUMENT ME! + * DOCUMENT ME! */ void NewTreePanel(String type, String pwType, String title) { @@ -3206,13 +3562,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, return; } - int s = 0; SequenceGroup sg = viewport.getSelectionGroup(); /* Decide if the selection is a column region */ - while (s < sg.getSize()) + for (SequenceI _s:sg.getSequences()) { - if (((SequenceI) sg.getSequences(null).elementAt(s++)).getLength() < sg + if (_s.getLength() < sg .getEndRes()) { JOptionPane @@ -3233,8 +3588,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } else { - // are the sequences aligned? - if (!viewport.alignment.isAligned()) + // are the visible sequences aligned? + if (!viewport.getAlignment().isAligned(false)) { JOptionPane .showMessageDialog( @@ -3248,7 +3603,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, return; } - if (viewport.alignment.getHeight() < 2) + if (viewport.getAlignment().getHeight() < 2) { return; } @@ -3272,9 +3627,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param title - * DOCUMENT ME! + * DOCUMENT ME! * @param order - * DOCUMENT ME! + * DOCUMENT ME! */ public void addSortByOrderMenuItem(String title, final AlignmentOrder order) @@ -3291,8 +3646,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // pointers AlignmentSorter.sortBy(viewport.getAlignment(), order); - addHistoryItem(new OrderCommand(order.getName(), oldOrder, - viewport.alignment)); + addHistoryItem(new OrderCommand(order.getName(), oldOrder, viewport + .getAlignment())); alignPanel.paintAlignment(true); } @@ -3303,10 +3658,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * Add a new sort by annotation score menu item * * @param sort - * the menu to add the option to + * the menu to add the option to * @param scoreLabel - * the label used to retrieve scores for each sequence on the - * alignment + * the label used to retrieve scores for each sequence on the + * alignment */ public void addSortByAnnotScoreMenuItem(JMenu sort, final String scoreLabel) @@ -3318,10 +3673,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, public void actionPerformed(ActionEvent e) { SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray(); - AlignmentSorter.sortByAnnotationScore(scoreLabel, viewport - .getAlignment());// ,viewport.getSelectionGroup()); + AlignmentSorter.sortByAnnotationScore(scoreLabel, + viewport.getAlignment());// ,viewport.getSelectionGroup()); addHistoryItem(new OrderCommand("Sort by " + scoreLabel, oldOrder, - viewport.alignment)); + viewport.getAlignment())); alignPanel.paintAlignment(true); } }); @@ -3341,18 +3696,18 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, */ public void buildSortByAnnotationScoresMenu() { - if (viewport.alignment.getAlignmentAnnotation() == null) + if (viewport.getAlignment().getAlignmentAnnotation() == null) { return; } - if (viewport.alignment.getAlignmentAnnotation().hashCode() != _annotationScoreVectorHash) + if (viewport.getAlignment().getAlignmentAnnotation().hashCode() != _annotationScoreVectorHash) { sortByAnnotScore.removeAll(); // almost certainly a quicker way to do this - but we keep it simple Hashtable scoreSorts = new Hashtable(); AlignmentAnnotation aann[]; - Enumeration sq = viewport.alignment.getSequences().elements(); + Enumeration sq = viewport.getAlignment().getSequences().elements(); while (sq.hasMoreElements()) { aann = ((SequenceI) sq.nextElement()).getAnnotation(); @@ -3367,13 +3722,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, Enumeration labels = scoreSorts.keys(); while (labels.hasMoreElements()) { - addSortByAnnotScoreMenuItem(sortByAnnotScore, (String) labels - .nextElement()); + addSortByAnnotScoreMenuItem(sortByAnnotScore, + (String) labels.nextElement()); } sortByAnnotScore.setVisible(scoreSorts.size() > 0); scoreSorts.clear(); - _annotationScoreVectorHash = viewport.alignment + _annotationScoreVectorHash = viewport.getAlignment() .getAlignmentAnnotation().hashCode(); } } @@ -3386,9 +3741,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * modified. * * @param treePanel - * Displayed tree window. + * Displayed tree window. * @param title - * SortBy menu item title. + * SortBy menu item title. */ public void buildTreeMenu() { @@ -3418,21 +3773,16 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, for (i = 0; i < treePanels.size(); i++) { - TreePanel tp = (TreePanel) treePanels.elementAt(i); + final TreePanel tp = (TreePanel) treePanels.elementAt(i); final JMenuItem item = new JMenuItem(tp.getTitle()); final NJTree tree = ((TreePanel) treePanels.elementAt(i)).getTree(); item.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { - SequenceI[] oldOrder = viewport.getAlignment() - .getSequencesArray(); - AlignmentSorter.sortByTree(viewport.getAlignment(), tree); - - addHistoryItem(new OrderCommand("Tree Sort", oldOrder, - viewport.alignment)); + tp.sortByTree_actionPerformed(null); + addHistoryItem(tp.sortAlignmentIn(alignPanel)); - alignPanel.paintAlignment(true); } }); @@ -3440,6 +3790,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.getAlignment())); + } + alignPanel.paintAlignment(true); + return true; + } + /** * Work out whether the whole set of sequences or just the selected set will * be submitted for multiple alignment. @@ -3501,12 +3864,15 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } // limit sequences - JBPNote in future - could spawn multiple prediction // jobs - // TODO: viewport.alignment.isAligned is a global state - the local + // TODO: viewport.getAlignment().isAligned is a global state - the local // selection may well be aligned - we preserve 2.0.8 behaviour for moment. - if (!viewport.alignment.isAligned()) + if (!viewport.getAlignment().isAligned(false)) { seqs.setSequences(new SeqCigar[] { seqs.getSequences()[0] }); + // TODO: if seqs.getSequences().length>1 then should really have warned + // user! + } return seqs; } @@ -3515,13 +3881,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! * * @param e - * DOCUMENT ME! + * DOCUMENT ME! */ protected void LoadtreeMenuItem_actionPerformed(ActionEvent e) { // Pick the tree file - JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache - .getProperty("LAST_DIRECTORY")); + JalviewFileChooser chooser = new JalviewFileChooser( + jalview.bin.Cache.getProperty("LAST_DIRECTORY")); chooser.setFileView(new JalviewFileView()); chooser.setDialogTitle("Select a newick-like tree file"); chooser.setToolTipText("Load a tree file"); @@ -3545,13 +3911,19 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } if (fin != null && fin.hasWarningMessage()) { - JOptionPane.showMessageDialog(Desktop.desktop, fin - .getWarningMessage(), "Possible problem with tree file", + JOptionPane.showMessageDialog(Desktop.desktop, + fin.getWarningMessage(), "Possible problem with tree file", JOptionPane.WARNING_MESSAGE); } } } + @Override + protected void tcoffeeColorScheme_actionPerformed(ActionEvent e) + { + changeColour(new TCoffeeColourScheme(alignPanel.getAlignment())); + } + public TreePanel ShowNewickTree(NewickFile nf, String title) { return ShowNewickTree(nf, title, 600, 500, 4, 5); @@ -3574,19 +3946,19 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * current alignment view * * @param nf - * the tree + * the tree * @param title - * tree viewer title + * tree viewer title * @param input - * Associated alignment input data (or null) + * Associated alignment input data (or null) * @param w - * width + * width * @param h - * height + * height * @param x - * position + * position * @param y - * position + * position * @return TreePanel handle */ public TreePanel ShowNewickTree(NewickFile nf, String title, @@ -3619,98 +3991,232 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, return tp; } + private boolean buildingMenu = false; + /** * Generates menu items and listener event actions for web service clients * */ public void BuildWebServiceMenu() { - // TODO: add support for context dependent disabling of services based on - // alignment and current selection - // TODO: add additional serviceHandle parameter to specify abstract handler - // class independently of AbstractName - // TODO: add in rediscovery GUI function to restart discoverer - // TODO: group services by location as well as function and/or introduce - // object broker mechanism. - if ((Discoverer.services != null) && (Discoverer.services.size() > 0)) - { - // TODO: refactor to allow list of AbstractName/Handler bindings to be - // stored or retrieved from elsewhere - Vector msaws = (Vector) Discoverer.services.get("MsaWS"); - Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred"); - Vector seqsrch = (Vector) Discoverer.services.get("SeqSearch"); - // TODO: move GUI generation code onto service implementation - so a - // client instance attaches itself to the GUI with method call like - // jalview.ws.MsaWSClient.bind(servicehandle, Desktop.instance, - // alignframe) - Vector wsmenu = new Vector(); - final IProgressIndicator af = this; - if (msaws != null) + while (buildingMenu) + { + try { - // Add any Multiple Sequence Alignment Services - final JMenu msawsmenu = new JMenu("Alignment"); - for (int i = 0, j = msaws.size(); i < j; i++) - { - final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws - .get(i); - jalview.ws.WSClient impl = jalview.ws.Discoverer - .getServiceClient(sh); - impl.attachWSMenuEntry(msawsmenu, this); - - } - wsmenu.add(msawsmenu); - } - if (secstrpr != null) + System.err.println("Waiting for building menu to finish."); + Thread.sleep(10); + } catch (Exception e) { - // Add any secondary structure prediction services - final JMenu secstrmenu = new JMenu("Secondary Structure Prediction"); - for (int i = 0, j = secstrpr.size(); i < j; i++) - { - final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) secstrpr - .get(i); - jalview.ws.WSClient impl = jalview.ws.Discoverer - .getServiceClient(sh); - impl.attachWSMenuEntry(secstrmenu, this); - } - wsmenu.add(secstrmenu); } - if (seqsrch != null) + ; + } + final AlignFrame me = this; + buildingMenu = true; + new Thread(new Runnable() + { + public void run() { - // Add any sequence search services - final JMenu seqsrchmenu = new JMenu("Sequence Database Search"); - for (int i = 0, j = seqsrch.size(); i < j; i++) + try + { + System.err.println("Building ws menu again " + + Thread.currentThread()); + // TODO: add support for context dependent disabling of services based + // on + // alignment and current selection + // TODO: add additional serviceHandle parameter to specify abstract + // handler + // class independently of AbstractName + // TODO: add in rediscovery GUI function to restart discoverer + // TODO: group services by location as well as function and/or + // introduce + // object broker mechanism. + final Vector wsmenu = new Vector(); + final IProgressIndicator af = me; + final JMenu msawsmenu = new JMenu("Alignment"); + final JMenu secstrmenu = new JMenu( + "Secondary Structure Prediction"); + final JMenu seqsrchmenu = new JMenu("Sequence Database Search"); + final JMenu analymenu = new JMenu("Analysis"); + final JMenu dismenu = new JMenu("Disorder"); + // JAL-940 - only show secondary structure prediction services from + // the legacy server + if (// Cache.getDefault("SHOW_JWS1_SERVICES", true) + // && + Discoverer.services != null && (Discoverer.services.size() > 0)) + { + // TODO: refactor to allow list of AbstractName/Handler bindings to + // be + // stored or retrieved from elsewhere + Vector msaws = null; // (Vector) Discoverer.services.get("MsaWS"); + Vector secstrpr = (Vector) Discoverer.services + .get("SecStrPred"); + Vector seqsrch = null; // (Vector) + // Discoverer.services.get("SeqSearch"); + // TODO: move GUI generation code onto service implementation - so a + // client instance attaches itself to the GUI with method call like + // jalview.ws.MsaWSClient.bind(servicehandle, Desktop.instance, + // alignframe) + if (msaws != null) + { + // Add any Multiple Sequence Alignment Services + for (int i = 0, j = msaws.size(); i < j; i++) + { + final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws + .get(i); + jalview.ws.WSMenuEntryProviderI impl = jalview.ws.jws1.Discoverer + .getServiceClient(sh); + impl.attachWSMenuEntry(msawsmenu, me); + + } + } + if (secstrpr != null) + { + // Add any secondary structure prediction services + for (int i = 0, j = secstrpr.size(); i < j; i++) + { + final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) secstrpr + .get(i); + jalview.ws.WSMenuEntryProviderI impl = jalview.ws.jws1.Discoverer + .getServiceClient(sh); + impl.attachWSMenuEntry(secstrmenu, me); + } + } + if (seqsrch != null) + { + // Add any sequence search services + for (int i = 0, j = seqsrch.size(); i < j; i++) + { + final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) seqsrch + .elementAt(i); + jalview.ws.WSMenuEntryProviderI impl = jalview.ws.jws1.Discoverer + .getServiceClient(sh); + impl.attachWSMenuEntry(seqsrchmenu, me); + } + } + } + + // Add all submenus in the order they should appear on the web + // services menu + wsmenu.add(msawsmenu); + wsmenu.add(secstrmenu); + wsmenu.add(dismenu); + wsmenu.add(analymenu); + // final ArrayList submens=new ArrayList(); + // submens.add(msawsmenu); + // submens.add(secstrmenu); + // submens.add(dismenu); + // submens.add(analymenu); + + // No search services yet + // wsmenu.add(seqsrchmenu); + + javax.swing.SwingUtilities.invokeLater(new Runnable() + { + public void run() + { + try + { + webService.removeAll(); + // first, add discovered services onto the webservices menu + if (wsmenu.size() > 0) + { + for (int i = 0, j = wsmenu.size(); i < j; i++) + { + webService.add((JMenu) wsmenu.get(i)); + } + } + else + { + webService.add(me.webServiceNoServices); + } + // TODO: move into separate menu builder class. + if (Cache.getDefault("SHOW_JWS2_SERVICES", true)) + { + Jws2Discoverer jws2servs = Jws2Discoverer.getDiscoverer(); + if (jws2servs != null) + { + if (jws2servs.hasServices()) + { + jws2servs.attachWSMenuEntry(webService, me); + } + if (jws2servs.isRunning()) + { + JMenuItem tm = new JMenuItem( + "Still discovering JABA Services"); + tm.setEnabled(false); + webService.add(tm); + } + } + } + + build_urlServiceMenu(me.webService); + build_fetchdbmenu(webService); + for (JMenu item : wsmenu) + { + if (item.getItemCount() == 0) + { + item.setEnabled(false); + } + else + { + item.setEnabled(true); + } + } + } catch (Exception e) + { + } + ; + } + }); + } catch (Exception e) { - final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) seqsrch - .elementAt(i); - jalview.ws.WSClient impl = jalview.ws.Discoverer - .getServiceClient(sh); - impl.attachWSMenuEntry(seqsrchmenu, this); } - // finally, add the whole shebang onto the webservices menu - wsmenu.add(seqsrchmenu); - } - resetWebServiceMenu(); - for (int i = 0, j = wsmenu.size(); i < j; i++) - { - webService.add((JMenu) wsmenu.get(i)); + ; + + buildingMenu = false; } - } - else - { - resetWebServiceMenu(); - this.webService.add(this.webServiceNoServices); - } + }).start(); + } /** - * empty the web service menu and add any ad-hoc functions not dynamically - * discovered. + * construct any groupURL type service menu entries. * + * @param webService */ - private void resetWebServiceMenu() + private void build_urlServiceMenu(JMenu webService) { - webService.removeAll(); - build_fetchdbmenu(webService); + // 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.getAlignment(), + * af.viewport.getColumnSelection(), 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. + // DEBUG - alignmentView + + for (jalview.ws.rest.RestClient client : jalview.ws.rest.RestClient + .getRestClients()) + { + client.attachWSMenuEntry( + JvSwingUtils.findOrCreateMenu(webService, client.getAction()), + this); + } + + if (Cache.getDefault("SHOW_ENFIN_SERVICES", true)) + { + jalview.ws.EnfinEnvision2OneWay.getInstance().attachWSMenuEntry( + webService, this); + } } /* @@ -3764,9 +4270,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, showProducts.removeAll(); final boolean dna = viewport.getAlignment().isNucleotide(); final Alignment ds = dataset; - String[] ptypes = (selection==null || selection.length==0) ? null - : CrossRef.findSequenceXrefTypes(dna, selection, - dataset); + String[] ptypes = (selection == null || selection.length == 0) ? null + : CrossRef.findSequenceXrefTypes(dna, selection, dataset); // Object[] prods = // CrossRef.buildXProductsList(viewport.getAlignment().isNucleotide(), // selection, dataset, true); @@ -3796,8 +4301,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } catch (Exception e) { jalview.bin.Cache.log - .warn( - "canTranslate threw an exception - please report to help@jalview.org", + .warn("canTranslate threw an exception - please report to help@jalview.org", e); return false; } @@ -3821,7 +4325,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, ths.setProgressBar("Searching for sequences from " + fsrc, sttime); try { - Alignment ds = ths.getViewport().alignment.getDataset(); // update + Alignment ds = ths.getViewport().getAlignment().getDataset(); // update // our local // dataset // reference @@ -3887,13 +4391,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // old way try { - return (jalview.analysis.Dna.canTranslate(selection, viewport - .getViewAsVisibleContigs(true))); + return (jalview.analysis.Dna.canTranslate(selection, + viewport.getViewAsVisibleContigs(true))); } catch (Exception e) { jalview.bin.Cache.log - .warn( - "canTranslate threw an exception - please report to help@jalview.org", + .warn("canTranslate threw an exception - please report to help@jalview.org", e); return false; } @@ -3944,8 +4447,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { al = jalview.analysis.Dna.CdnaTranslate(selection, seqstring, viewport.getViewAsVisibleContigs(true), viewport - .getGapCharacter(), viewport.alignment - .getAlignmentAnnotation(), viewport.alignment + .getGapCharacter(), viewport.getAlignment() + .getAlignmentAnnotation(), viewport.getAlignment() .getWidth(), viewport.getAlignment().getDataset()); } catch (Exception ex) { @@ -3972,9 +4475,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * Try to load a features file onto the alignment. * * @param file - * contents or path to retrieve file + * contents or path to retrieve file * @param type - * access mode of file (see jalview.io.AlignFile) + * access mode of file (see jalview.io.AlignFile) * @return true if features file was parsed corectly. */ public boolean parseFeaturesFile(String file, String type) @@ -3982,9 +4485,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, boolean featuresFile = false; try { - featuresFile = new FeaturesFile(file, type).parse(viewport.alignment - .getDataset(), alignPanel.seqPanel.seqCanvas - .getFeatureRenderer().featureColours, false); + featuresFile = new FeaturesFile(file, type).parse(viewport + .getAlignment().getDataset(), alignPanel.seqPanel.seqCanvas + .getFeatureRenderer().featureColours, false, + jalview.bin.Cache.getDefault("RELAXEDSEQIDMATCHING", false)); } catch (Exception ex) { ex.printStackTrace(); @@ -3994,11 +4498,15 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { viewport.showSequenceFeatures = true; showSeqFeatures.setSelected(true); - if (alignPanel.seqPanel.seqCanvas.fr!=null) + if (alignPanel.seqPanel.seqCanvas.fr != null) { // update the min/max ranges where necessary alignPanel.seqPanel.seqCanvas.fr.findAllFeatures(true); } + if (featureSettings != null) + { + featureSettings.setTableData(); + } alignPanel.paintAlignment(true); } @@ -4054,8 +4562,17 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } java.net.URI uri = new java.net.URI(s); - java.io.File file = new java.io.File(uri); - files.add(file); + // 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()); + } } } } catch (Exception e) @@ -4066,10 +4583,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) { @@ -4079,54 +4713,119 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } /** - * Attempt to load a "dropped" file: First by testing whether it's and - * Annotation file, then a JNet file, and finally a features file. If all are - * false then the user may have dropped an alignment file onto this + * Attempt to load a "dropped" file or URL string: First by testing whether + * it's and Annotation file, then a JNet file, and finally a features file. If + * all are false then the user may have dropped an alignment file onto this * AlignFrame. * * @param file - * either a filename or a URL string. + * 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 = "File"; - - if (file.indexOf("http:") > -1 || file.indexOf("file:") > -1) + if (protocol == null) { - protocol = "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.getAlignment(), 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.equalsIgnoreCase("JnetFile")) + // first see if its a T-COFFEE score file + TCoffeeScoreFile tcf = null; + try { - jalview.io.JPredFile predictions = new jalview.io.JPredFile(file, - protocol); - new JnetAnnotationMaker().add_annotation(predictions, viewport - .getAlignment(), 0, false); - isAnnotation = true; + tcf = new TCoffeeScoreFile(file, protocol); + if (tcf.isValid()) + { + if (tcf.annotateAlignment(viewport.getAlignment(), true)) + { + tcoffeeColour.setEnabled(true); + tcoffeeColour.setSelected(true); + changeColour(new TCoffeeColourScheme(viewport.getAlignment())); + isAnnotation = true; + statusBar + .setText("Successfully pasted T-Coffee scores to alignment."); + } + else + { + // some problem - if no warning its probable that the ID matching process didn't work + JOptionPane.showMessageDialog(Desktop.desktop, + tcf.getWarningMessage()==null ? "Check that the file matches sequence IDs in the alignment." : tcf.getWarningMessage(), + "Problem reading T-COFFEE score file", + JOptionPane.WARNING_MESSAGE); + } + } + else + { + tcf = null; + } + } catch (Exception x) + { + Cache.log.debug("Exception when processing data source as T-COFFEE score file",x); + tcf = null; } - else + if (tcf == null) { + // try to see if its a JNet 'concise' style annotation file *before* + // we // 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 - // alignment file to load into the current view. - if (!isGroupsFile) + if (format == null) + { + format = new IdentifyFile().Identify(file, protocol); + } + if (format.equalsIgnoreCase("JnetFile")) { - new FileLoader().LoadFile(viewport, file, protocol, format); + jalview.io.JPredFile predictions = new jalview.io.JPredFile( + file, protocol); + new JnetAnnotationMaker().add_annotation(predictions, + viewport.getAlignment(), 0, false); + isAnnotation = true; } else { - alignPanel.paintAlignment(true); + /* + * 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 + // alignment file to load into the current view. + if (!isGroupsFile) + { + new FileLoader().LoadFile(viewport, file, protocol, format); + } + else + { + alignPanel.paintAlignment(true); + } } } } @@ -4181,7 +4880,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, protected void extractScores_actionPerformed(ActionEvent e) { ParseProperties pp = new jalview.analysis.ParseProperties( - viewport.alignment); + viewport.getAlignment()); // TODO: verify regex and introduce GUI dialog for version 2.5 // if (pp.getScoresFromDescription("col", "score column ", // "\\W*([-+]?\\d*\\.?\\d*e?-?\\d*)\\W+([-+]?\\d*\\.?\\d*e?-?\\d*)", @@ -4193,16 +4892,23 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } } - /* (non-Javadoc) - * @see jalview.jbgui.GAlignFrame#showDbRefs_actionPerformed(java.awt.event.ActionEvent) + /* + * (non-Javadoc) + * + * @see + * jalview.jbgui.GAlignFrame#showDbRefs_actionPerformed(java.awt.event.ActionEvent + * ) */ protected void showDbRefs_actionPerformed(ActionEvent e) { viewport.setShowDbRefs(showDbRefsMenuitem.isSelected()); } - /* (non-Javadoc) - * @see jalview.jbgui.GAlignFrame#showNpFeats_actionPerformed(java.awt.event.ActionEvent) + /* + * (non-Javadoc) + * + * @seejalview.jbgui.GAlignFrame#showNpFeats_actionPerformed(java.awt.event. + * ActionEvent) */ protected void showNpFeats_actionPerformed(ActionEvent e) { @@ -4210,7 +4916,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } /** - * find the viewport amongst the tabs in this alignment frame and close that tab + * find the viewport amongst the tabs in this alignment frame and close that + * tab + * * @param av */ public boolean closeView(AlignViewport av) @@ -4221,7 +4929,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, return true; } Component[] comp = tabbedPane.getComponents(); - for (int i=0;comp!=null && i0) - { - for (int i=0; i otherdb; + JMenu dfetch = new JMenu(); + JMenu ifetch = new JMenu(); + JMenuItem fetchr = null; + int comp = 0, icomp = 0, mcomp = 15; + String mname = null; + int dbi = 0; + for (String dbclass : dbclasses) { + otherdb = sf.getSourceProxy(dbclass); + // add a single entry for this class, or submenu allowing 'fetch + // all' or pick one + if (otherdb == null || otherdb.size() < 1) + { + continue; + } + // List dbs=otherdb; + // otherdb=new ArrayList(); + // for (DbSourceProxy db:dbs) + // { + // if (!db.isA(DBRefSource.ALIGNMENTDB) + // } + if (mname == null) + { + mname = "From " + dbclass; + } + if (otherdb.size() == 1) + { + final DbSourceProxy[] dassource = otherdb + .toArray(new DbSourceProxy[0]); + DbSourceProxy src = otherdb.get(0); + fetchr = new JMenuItem(src.getDbSource()); + fetchr.addActionListener(new ActionListener() + { + + public void actionPerformed(ActionEvent e) + { + new Thread(new Runnable() + { + + public void run() + { + new jalview.ws.DBRefFetcher(alignPanel.av + .getSequenceSelection(), + alignPanel.alignFrame, dassource) + .fetchDBRefs(false); + } + }).start(); + } - public void run() + }); + fetchr.setToolTipText("" + + JvSwingUtils.wrapTooltip("Retrieve from " + + src.getDbName()) + ""); + dfetch.add(fetchr); + comp++; + } + else { - new jalview.ws.DBRefFetcher(alignPanel.av - .getSequenceSelection(), alignPanel.alignFrame, dassource) - .fetchDBRefs(false); + final DbSourceProxy[] dassource = otherdb + .toArray(new DbSourceProxy[0]); + // fetch all entry + DbSourceProxy src = otherdb.get(0); + fetchr = new JMenuItem("Fetch All '" + src.getDbSource() + + "'"); + fetchr.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + new Thread(new Runnable() + { + + public void run() + { + new jalview.ws.DBRefFetcher(alignPanel.av + .getSequenceSelection(), + alignPanel.alignFrame, dassource) + .fetchDBRefs(false); + } + }).start(); + } + }); + + fetchr.setToolTipText("" + + JvSwingUtils.wrapTooltip("Retrieve from all " + + otherdb.size() + " sources in " + + src.getDbSource() + "
First is :" + + src.getDbName()) + ""); + dfetch.add(fetchr); + comp++; + // and then build the rest of the individual menus + ifetch = new JMenu("Sources from " + src.getDbSource()); + icomp = 0; + String imname = null; + int i = 0; + for (DbSourceProxy sproxy : otherdb) + { + String dbname = sproxy.getDbName(); + String sname = dbname.length() > 5 ? dbname.substring(0, + 5) + "..." : dbname; + String msname = dbname.length() > 10 ? dbname.substring( + 0, 10) + "..." : dbname; + if (imname == null) + { + imname = "from '" + sname + "'"; + } + fetchr = new JMenuItem(msname); + final DbSourceProxy[] dassrc = + { sproxy }; + fetchr.addActionListener(new ActionListener() + { + + public void actionPerformed(ActionEvent e) + { + new Thread(new Runnable() + { + + public void run() + { + new jalview.ws.DBRefFetcher(alignPanel.av + .getSequenceSelection(), + alignPanel.alignFrame, dassrc) + .fetchDBRefs(false); + } + }).start(); + } + + }); + fetchr.setToolTipText("" + + JvSwingUtils.wrapTooltip("Retrieve from " + + dbname) + ""); + ifetch.add(fetchr); + ++i; + if (++icomp >= mcomp || i == (otherdb.size())) + { + ifetch.setText(imname + " to '" + sname + "'"); + dfetch.add(ifetch); + ifetch = new JMenu(); + imname = null; + icomp = 0; + comp++; + } + } + } + ++dbi; + if (comp >= mcomp || dbi >= (dbclasses.length)) + { + dfetch.setText(mname + " to '" + dbclass + "'"); + rfetch.add(dfetch); + dfetch = new JMenu(); + mname = null; + comp = 0; } - }).start(); + } } - }); - fetchr.setToolTipText("Retrieve from "+dbname); - dfetch.add(fetchr); - if (comp++==mcomp || i==(otherdb.length-1)) - { - dfetch.setText(mname+" to '"+dbname+"'"); - rfetch.add(dfetch); - dfetch = new JMenu(); - mname = null; - comp=0; - } } - } + }).start(); + } + /** - * Left justify the whole alignment. + * Left justify the whole alignment. */ protected void justifyLeftMenuItem_actionPerformed(ActionEvent e) { @@ -4324,8 +5160,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, al.justify(false); viewport.firePropertyChange("alignment", null, al); } + /** - * Right justify the whole alignment. + * Right justify the whole alignment. */ protected void justifyRightMenuItem_actionPerformed(ActionEvent e) { @@ -4333,19 +5170,149 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, al.justify(true); viewport.firePropertyChange("alignment", null, al); } + public void setShowSeqFeatures(boolean b) { showSeqFeatures.setSelected(true); viewport.setShowSequenceFeatures(true); } - /* (non-Javadoc) - * @see jalview.jbgui.GAlignFrame#showUnconservedMenuItem_actionPerformed(java.awt.event.ActionEvent) + + /* + * (non-Javadoc) + * + * @see + * jalview.jbgui.GAlignFrame#showUnconservedMenuItem_actionPerformed(java. + * awt.event.ActionEvent) */ protected void showUnconservedMenuItem_actionPerformed(ActionEvent e) { - viewport.setShowUnconserved(showUnconservedMenuItem.getState()); + viewport.setShowUnconserved(showNonconservedMenuItem.getState()); alignPanel.paintAlignment(true); } + + /* + * (non-Javadoc) + * + * @see + * jalview.jbgui.GAlignFrame#showGroupConsensus_actionPerformed(java.awt.event + * .ActionEvent) + */ + protected void showGroupConsensus_actionPerformed(ActionEvent e) + { + viewport.setShowGroupConsensus(showGroupConsensus.getState()); + alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState()); + + } + + /* + * (non-Javadoc) + * + * @see + * jalview.jbgui.GAlignFrame#showGroupConservation_actionPerformed(java.awt + * .event.ActionEvent) + */ + protected void showGroupConservation_actionPerformed(ActionEvent e) + { + viewport.setShowGroupConservation(showGroupConservation.getState()); + alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState()); + } + + /* + * (non-Javadoc) + * + * @see + * jalview.jbgui.GAlignFrame#showConsensusHistogram_actionPerformed(java.awt + * .event.ActionEvent) + */ + protected void showConsensusHistogram_actionPerformed(ActionEvent e) + { + viewport.setShowConsensusHistogram(showConsensusHistogram.getState()); + alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState()); + } + + /* + * (non-Javadoc) + * + * @see + * jalview.jbgui.GAlignFrame#showConsensusProfile_actionPerformed(java.awt + * .event.ActionEvent) + */ + protected void showSequenceLogo_actionPerformed(ActionEvent e) + { + viewport.setShowSequenceLogo(showSequenceLogo.getState()); + alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState()); + } + + protected void normaliseSequenceLogo_actionPerformed(ActionEvent e) + { + viewport.setNormaliseSequenceLogo(normaliseSequenceLogo.getState()); + alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState()); + } + + protected void applyAutoAnnotationSettings_actionPerformed(ActionEvent e) + { + alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState()); + } + + /* + * (non-Javadoc) + * + * @see + * jalview.jbgui.GAlignFrame#makeGrpsFromSelection_actionPerformed(java.awt + * .event.ActionEvent) + */ + protected void makeGrpsFromSelection_actionPerformed(ActionEvent e) + { + if (viewport.getSelectionGroup() != null) + { + SequenceGroup[] gps = jalview.analysis.Grouping.makeGroupsFrom( + viewport.getSequenceSelection(), + viewport.getAlignmentView(true).getSequenceStrings( + viewport.getGapCharacter()), viewport.getAlignment() + .getGroups()); + viewport.getAlignment().deleteAllGroups(); + viewport.sequenceColours = null; + viewport.setSelectionGroup(null); + // set view properties for each group + for (int g = 0; g < gps.length; g++) + { + gps[g].setShowNonconserved(viewport.getShowUnconserved()); + gps[g].setshowSequenceLogo(viewport.isShowSequenceLogo()); + viewport.getAlignment().addGroup(gps[g]); + Color col = new Color((int) (Math.random() * 255), + (int) (Math.random() * 255), (int) (Math.random() * 255)); + col = col.brighter(); + for (SequenceI s:gps[g].getSequences()) + viewport.setSequenceColour( + s, col) + ; + } + PaintRefresher.Refresh(this, viewport.getSequenceSetId()); + alignPanel.updateAnnotation(); + 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