X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAlignFrame.java;h=d161cfd4fcd59170d418679ffe009e54300eb8f0;hb=424f6f03e8fb5e40cceca09fc8ffd72b41e3a9e4;hp=b19e54fd440c9baa78150c791862361439faffbc;hpb=8d6b113f475c6b5916f7685cfd289e054d95a9ee;p=jalview.git diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index b19e54f..cf6a901 100644 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -1,6 +1,6 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2) - * Copyright (C) 2014 The Jalview Authors + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors * * This file is part of Jalview. * @@ -20,19 +20,23 @@ */ package jalview.gui; -import jalview.analysis.AAFrequency; import jalview.analysis.AlignmentSorter; import jalview.analysis.AlignmentUtils; -import jalview.analysis.Conservation; import jalview.analysis.CrossRef; -import jalview.analysis.NJTree; +import jalview.analysis.Dna; import jalview.analysis.ParseProperties; import jalview.analysis.SequenceIdMatcher; +import jalview.api.AlignExportSettingI; import jalview.api.AlignViewControllerGuiI; import jalview.api.AlignViewControllerI; +import jalview.api.AlignViewportI; import jalview.api.AlignmentViewPanel; +import jalview.api.FeatureSettingsControllerI; +import jalview.api.SplitContainerI; +import jalview.api.ViewStyleI; import jalview.api.analysis.ScoreModelI; import jalview.bin.Cache; +import jalview.bin.Jalview; import jalview.commands.CommandI; import jalview.commands.EditCommand; import jalview.commands.EditCommand.Action; @@ -44,48 +48,46 @@ import jalview.commands.TrimRegionCommand; import jalview.datamodel.AlignedCodonFrame; import jalview.datamodel.Alignment; import jalview.datamodel.AlignmentAnnotation; +import jalview.datamodel.AlignmentExportData; import jalview.datamodel.AlignmentI; import jalview.datamodel.AlignmentOrder; import jalview.datamodel.AlignmentView; import jalview.datamodel.ColumnSelection; +import jalview.datamodel.HiddenSequences; import jalview.datamodel.PDBEntry; import jalview.datamodel.SeqCigar; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceGroup; import jalview.datamodel.SequenceI; +import jalview.gui.ColourMenuHelper.ColourChangeListener; +import jalview.gui.ViewSelectionMenu.ViewSetProvider; import jalview.io.AlignmentProperties; import jalview.io.AnnotationFile; import jalview.io.BioJsHTMLOutput; -import jalview.io.FeaturesFile; +import jalview.io.DataSourceType; +import jalview.io.FileFormat; +import jalview.io.FileFormatI; +import jalview.io.FileFormats; import jalview.io.FileLoader; import jalview.io.FormatAdapter; import jalview.io.HtmlSvgOutput; import jalview.io.IdentifyFile; +import jalview.io.JPredFile; import jalview.io.JalviewFileChooser; import jalview.io.JalviewFileView; import jalview.io.JnetAnnotationMaker; import jalview.io.NewickFile; import jalview.io.TCoffeeScoreFile; import jalview.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.ColourSchemes; +import jalview.schemes.ResidueColourScheme; 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.util.MessageManager; +import jalview.viewmodel.AlignmentViewport; +import jalview.ws.DBRefFetcher; +import jalview.ws.DBRefFetcher.FetchFinishedListenerI; import jalview.ws.jws1.Discoverer; import jalview.ws.jws2.Jws2Discoverer; import jalview.ws.jws2.jabaws2.Jws2Instance; @@ -93,7 +95,6 @@ import jalview.ws.seqfetcher.DbSourceProxy; import java.awt.BorderLayout; import java.awt.Component; -import java.awt.GridLayout; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; @@ -107,34 +108,34 @@ import java.awt.dnd.DropTargetEvent; import java.awt.dnd.DropTargetListener; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; import java.awt.event.KeyAdapter; 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.io.FileWriter; +import java.io.PrintWriter; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; +import java.util.Deque; import java.util.Enumeration; import java.util.Hashtable; import java.util.List; import java.util.Vector; -import javax.swing.JButton; import javax.swing.JCheckBoxMenuItem; 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; @@ -145,27 +146,28 @@ import javax.swing.SwingUtilities; * @version $Revision$ */ public class AlignFrame extends GAlignFrame implements DropTargetListener, - IProgressIndicator, AlignViewControllerGuiI + IProgressIndicator, AlignViewControllerGuiI, ColourChangeListener { - /** DOCUMENT ME!! */ public static final int DEFAULT_WIDTH = 700; - /** DOCUMENT ME!! */ public static final int DEFAULT_HEIGHT = 500; + /* + * The currently displayed panel (selected tabbed view if more than one) + */ public AlignmentPanel alignPanel; AlignViewport viewport; public AlignViewControllerI avc; - Vector alignPanels = new Vector(); + List alignPanels = new ArrayList(); /** * Last format used to load or save alignments in this window */ - String currentFileFormat = null; + FileFormatI currentFileFormat = null; /** * Current filename for this alignment @@ -277,7 +279,27 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, alignPanel = new AlignmentPanel(this, viewport); + addAlignmentPanel(alignPanel, true); + init(); + } + + public AlignFrame(AlignmentI al, SequenceI[] hiddenSeqs, + ColumnSelection hiddenColumns, int width, int height) + { + setSize(width, height); + + if (al.getDataset() == null) + { + al.setDataset(null); + } + + viewport = new AlignViewport(al, hiddenColumns); + if (hiddenSeqs != null && hiddenSeqs.length > 0) + { + viewport.hideSequence(hiddenSeqs); + } + alignPanel = new AlignmentPanel(this, viewport); addAlignmentPanel(alignPanel, true); init(); } @@ -304,11 +326,16 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, */ void init() { + if (!Jalview.isHeadlessMode()) + { + progressBar = new ProgressBar(this.statusPanel, this.statusBar); + } + avc = new jalview.controller.AlignViewController(this, viewport, alignPanel); if (viewport.getAlignmentConservationAnnotation() == null) { - BLOSUM62Colour.setEnabled(false); + // BLOSUM62Colour.setEnabled(false); conservationMenuItem.setEnabled(false); modifyConservation.setEnabled(false); // PIDColour.setEnabled(false); @@ -328,18 +355,22 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, sortPairwiseMenuItem_actionPerformed(null); } + this.alignPanel.av + .setShowAutocalculatedAbove(isShowAutoCalculatedAbove()); + + setMenusFromViewport(viewport); + buildSortByAnnotationScoresMenu(); + buildTreeMenu(); + buildColourMenu(); + if (Desktop.desktop != null) { this.setDropTarget(new java.awt.dnd.DropTarget(this, this)); addServiceListeners(); - setGUINucleotide(viewport.getAlignment().isNucleotide()); + setGUINucleotide(); } - setMenusFromViewport(viewport); - buildSortByAnnotationScoresMenu(); - buildTreeMenu(); - - if (viewport.wrapAlignment) + if (viewport.getWrapAlignment()) { wrapMenuItem_actionPerformed(null); } @@ -351,6 +382,90 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, addKeyListener(); + final List selviews = new ArrayList(); + final List origview = new ArrayList(); + final String menuLabel = MessageManager + .getString("label.copy_format_from"); + ViewSelectionMenu vsel = new ViewSelectionMenu(menuLabel, + new ViewSetProvider() + { + + @Override + public AlignmentPanel[] getAllAlignmentPanels() + { + origview.clear(); + origview.add(alignPanel); + // make an array of all alignment panels except for this one + List aps = new ArrayList( + Arrays.asList(Desktop.getAlignmentPanels(null))); + aps.remove(AlignFrame.this.alignPanel); + return aps.toArray(new AlignmentPanel[aps.size()]); + } + }, selviews, new ItemListener() + { + + @Override + public void itemStateChanged(ItemEvent e) + { + if (origview.size() > 0) + { + final AlignmentPanel ap = origview.get(0); + + /* + * Copy the ViewStyle of the selected panel to 'this one'. + * Don't change value of 'scaleProteinAsCdna' unless copying + * from a SplitFrame. + */ + ViewStyleI vs = selviews.get(0).getAlignViewport() + .getViewStyle(); + boolean fromSplitFrame = selviews.get(0) + .getAlignViewport().getCodingComplement() != null; + if (!fromSplitFrame) + { + vs.setScaleProteinAsCdna(ap.getAlignViewport() + .getViewStyle().isScaleProteinAsCdna()); + } + ap.getAlignViewport().setViewStyle(vs); + + /* + * Also rescale ViewStyle of SplitFrame complement if there is + * one _and_ it is set to 'scaledProteinAsCdna'; we don't copy + * the whole ViewStyle (allow cDNA protein to have different + * fonts) + */ + AlignViewportI complement = ap.getAlignViewport() + .getCodingComplement(); + if (complement != null && vs.isScaleProteinAsCdna()) + { + AlignFrame af = Desktop.getAlignFrameFor(complement); + ((SplitFrame) af.getSplitViewContainer()) + .adjustLayout(); + af.setMenusForViewport(); + } + + ap.updateLayout(); + ap.setSelected(true); + ap.alignFrame.setMenusForViewport(); + + } + } + }); + if (Cache.getDefault("VERSION", "DEVELOPMENT").toLowerCase() + .indexOf("devel") > -1 + || Cache.getDefault("VERSION", "DEVELOPMENT").toLowerCase() + .indexOf("test") > -1) + { + formatMenu.add(vsel); + } + addFocusListener(new FocusAdapter() + { + @Override + public void focusGained(FocusEvent e) + { + Jalview.setCurrentAlignFrame(AlignFrame.this); + } + }); + } /** @@ -362,13 +477,17 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * @param format * format of file */ - public void setFileName(String file, String format) + public void setFileName(String file, FileFormatI format) { fileName = file; - currentFileFormat = format; + setFileFormat(format); reload.setEnabled(true); } + /** + * Add a KeyListener with handlers for various KeyPressed and KeyReleased + * events + */ void addKeyListener() { addKeyListener(new KeyAdapter() @@ -442,8 +561,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, case KeyEvent.VK_SPACE: if (viewport.cursorMode) { - alignPanel.getSeqPanel().insertGapAtCursor(evt.isControlDown() - || evt.isShiftDown() || evt.isAltDown()); + alignPanel.getSeqPanel().insertGapAtCursor( + evt.isControlDown() || evt.isShiftDown() + || evt.isAltDown()); } break; @@ -466,8 +586,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } else { - alignPanel.getSeqPanel().deleteGapAtCursor(evt.isControlDown() - || evt.isShiftDown() || evt.isAltDown()); + alignPanel.getSeqPanel().deleteGapAtCursor( + evt.isControlDown() || evt.isShiftDown() + || evt.isAltDown()); } break; @@ -515,8 +636,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, case KeyEvent.VK_F2: viewport.cursorMode = !viewport.cursorMode; statusBar.setText(MessageManager.formatMessage( - "label.keyboard_editing_mode", new String[] - { (viewport.cursorMode ? "on" : "off") })); + "label.keyboard_editing_mode", + new String[] { (viewport.cursorMode ? "on" : "off") })); if (viewport.cursorMode) { alignPanel.getSeqPanel().seqCanvas.cursorX = viewport.startRes; @@ -541,8 +662,18 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, toggleHiddenRegions(toggleSeqs, toggleCols); break; } + case KeyEvent.VK_B: + { + boolean toggleSel = evt.isControlDown() || evt.isMetaDown(); + boolean modifyExisting = true; // always modify, don't clear + // evt.isShiftDown(); + boolean invertHighlighted = evt.isAltDown(); + avc.markHighlightedColumns(invertHighlighted, modifyExisting, + toggleSel); + break; + } case KeyEvent.VK_PAGE_UP: - if (viewport.wrapAlignment) + if (viewport.getWrapAlignment()) { alignPanel.scrollUp(true); } @@ -553,7 +684,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } break; case KeyEvent.VK_PAGE_DOWN: - if (viewport.wrapAlignment) + if (viewport.getWrapAlignment()) { alignPanel.scrollUp(false); } @@ -597,7 +728,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, avc = new jalview.controller.AlignViewController(this, viewport, alignPanel); - alignPanels.addElement(ap); + alignPanels.add(ap); PaintRefresher.Register(ap, ap.av.getSequenceSetId()); @@ -640,7 +771,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, expandViews.setEnabled(true); gatherViews.setEnabled(true); tabbedPane.setVisible(true); - AlignmentPanel first = (AlignmentPanel) alignPanels.firstElement(); + AlignmentPanel first = alignPanels.get(0); tabbedPane.addTab(first.av.viewName, first); this.getContentPane().add(tabbedPane, BorderLayout.CENTER); } @@ -684,7 +815,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, public void internalFrameClosed( javax.swing.event.InternalFrameEvent evt) { - System.out.println("deregistering discoverer listener"); + // System.out.println("deregistering discoverer listener"); Desktop.instance.removeJalviewPropertyChangeListener("services", thisListener); closeMenuItem_actionPerformed(true); @@ -701,27 +832,34 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, }).start(); } - public void setGUINucleotide(boolean nucleotide) + /** + * Configure menu items that vary according to whether the alignment is + * nucleotide or protein + */ + public void setGUINucleotide() { + AlignmentI al = getViewport().getAlignment(); + boolean nucleotide = al.isNucleotide(); + showTranslation.setVisible(nucleotide); + showReverse.setVisible(nucleotide); + showReverseComplement.setVisible(nucleotide); conservationMenuItem.setEnabled(!nucleotide); - modifyConservation.setEnabled(!nucleotide); + modifyConservation.setEnabled(!nucleotide + && conservationMenuItem.isSelected()); showGroupConservation.setEnabled(!nucleotide); - rnahelicesColour.setEnabled(nucleotide); - purinePyrimidineColour.setEnabled(nucleotide); - // Remember AlignFrame always starts as protein - // if (!nucleotide) - // { - // showTr - // calculateMenu.remove(calculateMenu.getItemCount() - 2); - // } + + showComplementMenuItem.setText(nucleotide ? MessageManager + .getString("label.protein") : MessageManager + .getString("label.nucleotide")); } /** - * set up menus for the currently viewport. This may be called after any + * set up menus for the current viewport. This may be called after any * operation that affects the data in the current view (selection changed, * etc) to update the menus to reflect the new state. */ + @Override public void setMenusForViewport() { setMenusFromViewport(viewport); @@ -737,17 +875,19 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, void setMenusFromViewport(AlignViewport av) { padGapsMenuitem.setSelected(av.isPadGaps()); - colourTextMenuItem.setSelected(av.showColourText); + colourTextMenuItem.setSelected(av.isShowColourText()); abovePIDThreshold.setSelected(av.getAbovePIDThreshold()); + modifyPID.setEnabled(abovePIDThreshold.isSelected()); conservationMenuItem.setSelected(av.getConservationSelected()); + modifyConservation.setEnabled(conservationMenuItem.isSelected()); seqLimits.setSelected(av.getShowJVSuffix()); idRightAlign.setSelected(av.isRightAlignIds()); - centreColumnLabelsMenuItem.setState(av.centreColumnLabels); - renderGapsMenuItem.setSelected(av.renderGaps); - wrapMenuItem.setSelected(av.wrapAlignment); - scaleAbove.setVisible(av.wrapAlignment); - scaleLeft.setVisible(av.wrapAlignment); - scaleRight.setVisible(av.wrapAlignment); + centreColumnLabelsMenuItem.setState(av.isCentreColumnLabels()); + renderGapsMenuItem.setSelected(av.isRenderGaps()); + wrapMenuItem.setSelected(av.getWrapAlignment()); + scaleAbove.setVisible(av.getWrapAlignment()); + scaleLeft.setVisible(av.getWrapAlignment()); + scaleRight.setVisible(av.getWrapAlignment()); annotationPanelMenuItem.setState(av.isShowAnnotation()); /* * Show/hide annotations only enabled if annotation panel is shown @@ -756,8 +896,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, hideAllSeqAnnotations.setEnabled(annotationPanelMenuItem.getState()); showAllAlAnnotations.setEnabled(annotationPanelMenuItem.getState()); hideAllAlAnnotations.setEnabled(annotationPanelMenuItem.getState()); - viewBoxesMenuItem.setSelected(av.showBoxes); - viewTextMenuItem.setSelected(av.showText); + viewBoxesMenuItem.setSelected(av.getShowBoxes()); + viewTextMenuItem.setSelected(av.getShowText()); showNonconservedMenuItem.setSelected(av.getShowUnconserved()); showGroupConsensus.setSelected(av.isShowGroupConsensus()); showGroupConservation.setSelected(av.isShowGroupConservation()); @@ -765,27 +905,35 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, showSequenceLogo.setSelected(av.isShowSequenceLogo()); normaliseSequenceLogo.setSelected(av.isNormaliseSequenceLogo()); - setColourSelected(ColourSchemeProperty.getColourName(av - .getGlobalColourScheme())); + ColourMenuHelper.setColourSelected(colourMenu, + av.getGlobalColourScheme()); showSeqFeatures.setSelected(av.isShowSequenceFeatures()); - hiddenMarkers.setState(av.showHiddenMarkers); + hiddenMarkers.setState(av.getShowHiddenMarkers()); applyToAllGroups.setState(av.getColourAppliesToAllGroups()); - showNpFeatsMenuitem.setSelected(av.isShowNpFeats()); - showDbRefsMenuitem.setSelected(av.isShowDbRefs()); + 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(); + + showProducts.setEnabled(canShowProducts()); + setGroovyEnabled(Desktop.getGroovyConsole() != null); + updateEditMenuBar(); } - // methods for implementing IProgressIndicator - // need to refactor to a reusable stub class - Hashtable progressBars, progressBarHandlers; + /** + * Set the enabled state of the 'Run Groovy' option in the Calculate menu + * + * @param b + */ + public void setGroovyEnabled(boolean b) + { + runGroovy.setEnabled(b); + } + + private IProgressIndicator progressBar; /* * (non-Javadoc) @@ -795,78 +943,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void setProgressBar(String message, long id) { - if (progressBars == null) - { - progressBars = new Hashtable(); - progressBarHandlers = new Hashtable(); - } - - JPanel progressPanel; - Long lId = new Long(id); - GridLayout layout = (GridLayout) statusPanel.getLayout(); - if (progressBars.get(lId) != null) - { - progressPanel = (JPanel) progressBars.get(new Long(id)); - statusPanel.remove(progressPanel); - progressBars.remove(lId); - progressPanel = null; - if (message != null) - { - statusBar.setText(message); - } - if (progressBarHandlers.contains(lId)) - { - progressBarHandlers.remove(lId); - } - layout.setRows(layout.getRows() - 1); - } - else - { - progressPanel = new JPanel(new BorderLayout(10, 5)); - - JProgressBar progressBar = new JProgressBar(); - progressBar.setIndeterminate(true); - - progressPanel.add(new JLabel(message), BorderLayout.WEST); - progressPanel.add(progressBar, BorderLayout.CENTER); - - layout.setRows(layout.getRows() + 1); - statusPanel.add(progressPanel); - - progressBars.put(lId, progressPanel); - } - // update GUI - // setMenusForViewport(); - validate(); + progressBar.setProgressBar(message, id); } @Override public void registerHandler(final long id, final IProgressIndicatorHandler handler) { - if (progressBarHandlers == null || !progressBars.contains(new Long(id))) - { - throw new Error(MessageManager.getString("error.call_setprogressbar_before_registering_handler")); - } - progressBarHandlers.put(new Long(id), handler); - final JPanel progressPanel = (JPanel) progressBars.get(new Long(id)); - if (handler.canCancel()) - { - JButton cancel = new JButton( - MessageManager.getString("action.cancel")); - final IProgressIndicator us = this; - cancel.addActionListener(new ActionListener() - { - - @Override - public void actionPerformed(ActionEvent e) - { - handler.cancelActivity(id); - us.setProgressBar(MessageManager.formatMessage("label.cancelled_params", new String[]{((JLabel) progressPanel.getComponent(0)).getText()}), id); - } - }); - progressPanel.add(cancel, BorderLayout.EAST); - } + progressBar.registerHandler(id, handler); } /** @@ -876,18 +960,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public boolean operationInProgress() { - if (progressBars != null && progressBars.size() > 0) - { - return true; - } - return false; + return progressBar.operationInProgress(); } @Override public void setStatus(String text) { statusBar.setText(text); - }; + } /* * Added so Castor Mapping file can obtain Jalview Version @@ -905,7 +985,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void fetchSequence_actionPerformed(ActionEvent e) { - new SequenceFetcher(this); + new jalview.gui.SequenceFetcher(this); } @Override @@ -923,7 +1003,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // originating file's format // TODO: work out how to recover feature settings for correct view(s) when // file is reloaded. - if (currentFileFormat.equals("Jalview")) + if (FileFormat.Jalview.equals(currentFileFormat)) { JInternalFrame[] frames = Desktop.desktop.getAllFrames(); for (int i = 0; i < frames.length; i++) @@ -945,7 +1025,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, Desktop.instance.closeAssociatedWindows(); FileLoader loader = new FileLoader(); - String protocol = fileName.startsWith("http:") ? "URL" : "File"; + DataSourceType protocol = fileName.startsWith("http:") ? DataSourceType.URL + : DataSourceType.FILE; loader.LoadFile(viewport, fileName, protocol, currentFileFormat); } else @@ -953,7 +1034,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, Rectangle bounds = this.getBounds(); FileLoader loader = new FileLoader(); - String protocol = fileName.startsWith("http:") ? "URL" : "File"; + DataSourceType protocol = fileName.startsWith("http:") ? DataSourceType.URL + : DataSourceType.FILE; AlignFrame newframe = loader.LoadFileWaitTillLoaded(fileName, protocol, currentFileFormat); @@ -984,7 +1066,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void addFromText_actionPerformed(ActionEvent e) { - Desktop.instance.inputTextboxMenuItem_actionPerformed(viewport); + Desktop.instance.inputTextboxMenuItem_actionPerformed(viewport + .getAlignPanel()); } @Override @@ -996,9 +1079,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void save_actionPerformed(ActionEvent e) { - if (fileName == null - || (currentFileFormat == null || !jalview.io.FormatAdapter - .isValidIOFormat(currentFileFormat, true)) + if (fileName == null || (currentFileFormat == null) || fileName.startsWith("http")) { saveAs_actionPerformed(null); @@ -1018,14 +1099,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void saveAs_actionPerformed(ActionEvent e) { - JalviewFileChooser chooser = new JalviewFileChooser( - jalview.bin.Cache.getProperty("LAST_DIRECTORY"), - jalview.io.AppletFormatAdapter.WRITABLE_EXTENSIONS, - jalview.io.AppletFormatAdapter.WRITABLE_FNAMES, - currentFileFormat, false); + String format = currentFileFormat == null ? null : currentFileFormat + .getName(); + JalviewFileChooser chooser = JalviewFileChooser.forWrite( + Cache.getProperty("LAST_DIRECTORY"), format); chooser.setFileView(new JalviewFileView()); - chooser.setDialogTitle(MessageManager.getString("label.save_alignment_to_file")); + chooser.setDialogTitle(MessageManager + .getString("label.save_alignment_to_file")); chooser.setToolTipText(MessageManager.getString("action.save")); int value = chooser.showSaveDialog(this); @@ -1033,40 +1114,38 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (value == JalviewFileChooser.APPROVE_OPTION) { currentFileFormat = chooser.getSelectedFormat(); - if (currentFileFormat == null) + while (currentFileFormat == null) { - JOptionPane + JvOptionPane .showInternalMessageDialog( Desktop.desktop, MessageManager .getString("label.select_file_format_before_saving"), MessageManager .getString("label.file_format_not_specified"), - JOptionPane.WARNING_MESSAGE); + JvOptionPane.WARNING_MESSAGE); + currentFileFormat = chooser.getSelectedFormat(); value = chooser.showSaveDialog(this); - return; + if (value != JalviewFileChooser.APPROVE_OPTION) + { + return; + } } fileName = chooser.getSelectedFile().getPath(); - jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT", - currentFileFormat); + Cache.setProperty("DEFAULT_FILE_FORMAT", currentFileFormat.getName()); - jalview.bin.Cache.setProperty("LAST_DIRECTORY", fileName); - if (currentFileFormat.indexOf(" ") > -1) - { - currentFileFormat = currentFileFormat.substring(0, - currentFileFormat.indexOf(" ")); - } + Cache.setProperty("LAST_DIRECTORY", fileName); saveAlignment(fileName, currentFileFormat); } } - public boolean saveAlignment(String file, String format) + public boolean saveAlignment(String file, FileFormatI format) { boolean success = true; - if (format.equalsIgnoreCase("Jalview")) + if (FileFormat.Jalview.equals(format)) { String shortName = title; @@ -1076,48 +1155,29 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, .lastIndexOf(java.io.File.separatorChar) + 1); } - success = new Jalview2XML().SaveAlignment(this, file, shortName); + success = new Jalview2XML().saveAlignment(this, file, shortName); statusBar.setText(MessageManager.formatMessage( - "label.successfully_saved_to_file_in_format", new String[] - { fileName, format })); + "label.successfully_saved_to_file_in_format", new Object[] { + fileName, format })); } else { - if (!jalview.io.AppletFormatAdapter.isValidFormat(format, true)) + AlignmentExportData exportData = getAlignmentForExport(format, + viewport, null); + if (exportData.getSettings().isCancelled()) { - 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()) - { - int reply = JOptionPane - .showInternalConfirmDialog( - Desktop.desktop, - MessageManager - .getString("label.alignment_contains_hidden_columns"), - MessageManager - .getString("action.save_omit_hidden_columns"), - JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE); - - if (reply == JOptionPane.YES_OPTION) - { - omitHidden = viewport.getViewAsString(false); - } - } - FormatAdapter f = new FormatAdapter(); - String output = f.formatSequences(format, - viewport.getAlignment(), // class cast exceptions will + FormatAdapter f = new FormatAdapter(alignPanel, + exportData.getSettings()); + String output = f.formatSequences( + format, + exportData.getAlignment(), // class cast exceptions will // occur in the distant future - omitHidden, f.getCacheSuffixDefault(format), + exportData.getOmitHidden(), exportData.getStartEndPostions(), + f.getCacheSuffixDefault(format), viewport.getColumnSelection()); if (output == null) @@ -1128,16 +1188,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { try { - java.io.PrintWriter out = new java.io.PrintWriter( - new java.io.FileWriter(file)); + PrintWriter out = new PrintWriter(new FileWriter(file)); out.print(output); out.close(); this.setTitle(file); statusBar.setText(MessageManager.formatMessage( "label.successfully_saved_to_file_in_format", - new String[] - { fileName, format })); + new Object[] { fileName, format.getName() })); } catch (Exception ex) { success = false; @@ -1148,11 +1206,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (!success) { - JOptionPane.showInternalMessageDialog(this, MessageManager - .formatMessage("label.couldnt_save_file", new String[] - { fileName }), MessageManager + JvOptionPane.showInternalMessageDialog(this, MessageManager + .formatMessage("label.couldnt_save_file", + new Object[] { fileName }), MessageManager .getString("label.error_saving_file"), - JOptionPane.WARNING_MESSAGE); + JvOptionPane.WARNING_MESSAGE); } return success; @@ -1167,8 +1225,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } else { - JOptionPane.showInternalMessageDialog(this, warning, title, - JOptionPane.WARNING_MESSAGE); + JvOptionPane.showInternalMessageDialog(this, warning, title, + JvOptionPane.WARNING_MESSAGE); } return; } @@ -1182,37 +1240,27 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override protected void outputText_actionPerformed(ActionEvent e) { - String[] omitHidden = null; - - if (viewport.hasHiddenColumns()) + FileFormatI fileFormat = FileFormats.getInstance().forName( + e.getActionCommand()); + AlignmentExportData exportData = getAlignmentForExport(fileFormat, + viewport, null); + if (exportData.getSettings().isCancelled()) { - int reply = JOptionPane - .showInternalConfirmDialog( - Desktop.desktop, - MessageManager - .getString("label.alignment_contains_hidden_columns"), - MessageManager - .getString("action.save_omit_hidden_columns"), - JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE); - - if (reply == JOptionPane.YES_OPTION) - { - omitHidden = viewport.getViewAsString(false); - } + return; } - CutAndPasteTransfer cap = new CutAndPasteTransfer(); cap.setForInput(null); - try { - cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(), - viewport.getAlignment(), omitHidden, - viewport.getColumnSelection())); + FileFormatI format = fileFormat; + cap.setText(new FormatAdapter(alignPanel, exportData.getSettings()) + .formatSequences(format, exportData.getAlignment(), + exportData.getOmitHidden(), + exportData.getStartEndPostions(), + viewport.getColumnSelection())); Desktop.addInternalFrame(cap, MessageManager.formatMessage( - "label.alignment_output_command", new String[] - { e.getActionCommand() }), 600, 500); + "label.alignment_output_command", + new Object[] { e.getActionCommand() }), 600, 500); } catch (OutOfMemoryError oom) { new OOMWarning("Outputting alignment as " + e.getActionCommand(), oom); @@ -1221,6 +1269,50 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } + public static AlignmentExportData getAlignmentForExport( + FileFormatI format, AlignViewportI viewport, + AlignExportSettingI exportSettings) + { + AlignmentI alignmentToExport = null; + AlignExportSettingI settings = exportSettings; + String[] omitHidden = null; + + HiddenSequences hiddenSeqs = viewport.getAlignment() + .getHiddenSequences(); + + alignmentToExport = viewport.getAlignment(); + + boolean hasHiddenSeqs = hiddenSeqs.getSize() > 0; + if (settings == null) + { + settings = new AlignExportSettings(hasHiddenSeqs, + viewport.hasHiddenColumns(), format); + } + // settings.isExportAnnotations(); + + if (viewport.hasHiddenColumns() && !settings.isExportHiddenColumns()) + { + omitHidden = viewport.getViewAsString(false, + settings.isExportHiddenSequences()); + } + + int[] alignmentStartEnd = new int[2]; + if (hasHiddenSeqs && settings.isExportHiddenSequences()) + { + alignmentToExport = hiddenSeqs.getFullAlignment(); + } + else + { + alignmentToExport = viewport.getAlignment(); + } + alignmentStartEnd = alignmentToExport + .getVisibleStartAndEndIndex(viewport.getColumnSelection() + .getHiddenColumns()); + AlignmentExportData ed = new AlignmentExportData(alignmentToExport, + omitHidden, alignmentStartEnd, settings); + return ed; + } + /** * DOCUMENT ME! * @@ -1230,18 +1322,17 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override protected void htmlMenuItem_actionPerformed(ActionEvent e) { - // new HTMLOutput(alignPanel, - // alignPanel.getSeqPanel().seqCanvas.getSequenceRenderer(), - // alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer()); - new HtmlSvgOutput(null, alignPanel); + HtmlSvgOutput htmlSVG = new HtmlSvgOutput(alignPanel); + htmlSVG.exportHTML(null); } @Override public void bioJSMenuItem_actionPerformed(ActionEvent e) { - new BioJsHTMLOutput(alignPanel, - alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer()); + BioJsHTMLOutput bjs = new BioJsHTMLOutput(alignPanel); + bjs.exportHTML(null); } + public void createImageMap(File file, String image) { alignPanel.makePNGImageMap(file, image); @@ -1271,10 +1362,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, alignPanel.makeEPS(f); } + @Override public void createSVG(File f) { alignPanel.makeSVG(f); } + @Override public void pageSetup_actionPerformed(ActionEvent e) { @@ -1357,7 +1450,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // setClosed(true) is called for (int i = 0; i < alignPanels.size(); i++) { - AlignmentPanel ap = (AlignmentPanel) alignPanels.elementAt(i); + AlignmentPanel ap = alignPanels.get(i); ap.closePanel(); } } @@ -1370,6 +1463,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (closeAllTabs) { + /* + * this will raise an INTERNAL_FRAME_CLOSED event and this method will + * be called recursively, with the frame now in 'closed' state + */ this.setClosed(true); } } catch (Exception ex) @@ -1379,22 +1476,17 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } /** - * close alignPanel2 and shuffle tabs appropriately. + * Close the specified panel and close up tabs appropriately. * - * @param alignPanel2 + * @param panelToClose */ - public void closeView(AlignmentPanel alignPanel2) + public void closeView(AlignmentPanel panelToClose) { int index = tabbedPane.getSelectedIndex(); - int closedindex = tabbedPane.indexOfComponent(alignPanel2); - alignPanels.removeElement(alignPanel2); - // Unnecessary - // if (viewport == alignPanel2.av) - // { - // viewport = null; - // } - alignPanel2.closePanel(); - alignPanel2 = null; + int closedindex = tabbedPane.indexOfComponent(panelToClose); + alignPanels.remove(panelToClose); + panelToClose.closePanel(); + panelToClose = null; tabbedPane.removeTabAt(closedindex); tabbedPane.validate(); @@ -1414,13 +1506,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, void updateEditMenuBar() { - if (viewport.historyList.size() > 0) + if (viewport.getHistoryList().size() > 0) { undoMenuItem.setEnabled(true); - CommandI command = viewport.historyList.peek(); + CommandI command = viewport.getHistoryList().peek(); undoMenuItem.setText(MessageManager.formatMessage( - "label.undo_command", new String[] - { command.getDescription() })); + "label.undo_command", + new Object[] { command.getDescription() })); } else { @@ -1428,14 +1520,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, undoMenuItem.setText(MessageManager.getString("action.undo")); } - if (viewport.redoList.size() > 0) + if (viewport.getRedoList().size() > 0) { redoMenuItem.setEnabled(true); - CommandI command = viewport.redoList.peek(); + CommandI command = viewport.getRedoList().peek(); redoMenuItem.setText(MessageManager.formatMessage( - "label.redo_command", new String[] - { command.getDescription() })); + "label.redo_command", + new Object[] { command.getDescription() })); } else { @@ -1444,12 +1536,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } } + @Override public void addHistoryItem(CommandI command) { if (command.getSize() > 0) { - viewport.historyList.push(command); - viewport.redoList.clear(); + viewport.addToHistoryList(command); + viewport.clearRedoList(); updateEditMenuBar(); viewport.updateHiddenColumns(); // viewport.hasHiddenColumns = (viewport.getColumnSelection() != null @@ -1467,18 +1560,17 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { if (alignPanels != null) { - Enumeration e = alignPanels.elements(); AlignmentI[] als = new AlignmentI[alignPanels.size()]; - for (int i = 0; e.hasMoreElements(); i++) + int i = 0; + for (AlignmentPanel ap : alignPanels) { - als[i] = ((AlignmentPanel) e.nextElement()).av.getAlignment(); + als[i++] = ap.av.getAlignment(); } return als; } if (viewport != null) { - return new AlignmentI[] - { viewport.getAlignment() }; + return new AlignmentI[] { viewport.getAlignment() }; } return null; } @@ -1492,15 +1584,15 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override protected void undoMenuItem_actionPerformed(ActionEvent e) { - if (viewport.historyList.empty()) + if (viewport.getHistoryList().isEmpty()) { return; } - CommandI command = viewport.historyList.pop(); - viewport.redoList.push(command); + CommandI command = viewport.getHistoryList().pop(); + viewport.addToRedoList(command); command.undoCommand(getViewAlignments()); - AlignViewport originalSource = getOriginatingSource(command); + AlignmentViewport originalSource = getOriginatingSource(command); updateEditMenuBar(); if (originalSource != null) @@ -1530,16 +1622,16 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override protected void redoMenuItem_actionPerformed(ActionEvent e) { - if (viewport.redoList.size() < 1) + if (viewport.getRedoList().size() < 1) { return; } - CommandI command = viewport.redoList.pop(); - viewport.historyList.push(command); + CommandI command = viewport.getRedoList().pop(); + viewport.addToHistoryList(command); command.doCommand(getViewAlignments()); - AlignViewport originalSource = getOriginatingSource(command); + AlignmentViewport originalSource = getOriginatingSource(command); updateEditMenuBar(); if (originalSource != null) @@ -1561,9 +1653,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } } - AlignViewport getOriginatingSource(CommandI command) + AlignmentViewport getOriginatingSource(CommandI command) { - AlignViewport originalSource = null; + AlignmentViewport originalSource = null; // For sequence removal and addition, we need to fire // the property change event FROM the viewport where the // original alignment was altered @@ -1572,16 +1664,16 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { EditCommand editCommand = (EditCommand) command; al = editCommand.getAlignment(); - Vector comps = (Vector) PaintRefresher.components.get(viewport + List comps = PaintRefresher.components.get(viewport .getSequenceSetId()); - for (int i = 0; i < comps.size(); i++) + for (Component comp : comps) { - if (comps.elementAt(i) instanceof AlignmentPanel) + if (comp instanceof AlignmentPanel) { - if (al == ((AlignmentPanel) comps.elementAt(i)).av.getAlignment()) + if (al == ((AlignmentPanel) comp).av.getAlignment()) { - originalSource = ((AlignmentPanel) comps.elementAt(i)).av; + originalSource = ((AlignmentPanel) comp).av; break; } } @@ -1624,7 +1716,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, synchronized void slideSequences(boolean right, int size) { - List sg = new Vector(); + List sg = new ArrayList(); if (viewport.cursorMode) { sg.add(viewport.getAlignment().getSequenceAt( @@ -1643,13 +1735,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, return; } - Vector invertGroup = new Vector(); + List invertGroup = new ArrayList(); - for (int i = 0; i < viewport.getAlignment().getHeight(); i++) + for (SequenceI seq : viewport.getAlignment().getSequences()) { - if (!sg.contains(viewport.getAlignment().getSequenceAt(i))) + if (!sg.contains(seq)) { - invertGroup.add(viewport.getAlignment().getSequenceAt(i)); + invertGroup.add(seq); } } @@ -1658,7 +1750,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, SequenceI[] seqs2 = new SequenceI[invertGroup.size()]; for (int i = 0; i < invertGroup.size(); i++) { - seqs2[i] = (SequenceI) invertGroup.elementAt(i); + seqs2[i] = invertGroup.get(i); } SlideSequencesCommand ssc; @@ -1705,12 +1797,18 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, viewport.getSelectionGroup().getEndRes() + groupAdjustment); } + /* + * just extend the last slide command if compatible; but not if in + * SplitFrame mode (to ensure all edits are broadcast - JAL-1802) + */ boolean appendHistoryItem = false; - if (viewport.historyList != null && viewport.historyList.size() > 0 - && viewport.historyList.peek() instanceof SlideSequencesCommand) + Deque historyList = viewport.getHistoryList(); + boolean inSplitFrame = getSplitViewContainer() != null; + if (!inSplitFrame && historyList != null && historyList.size() > 0 + && historyList.peek() instanceof SlideSequencesCommand) { appendHistoryItem = ssc - .appendSlideCommand((SlideSequencesCommand) viewport.historyList + .appendSlideCommand((SlideSequencesCommand) historyList .peek()); } @@ -1746,8 +1844,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, omitHidden = viewport.getViewAsString(true); } - String output = new FormatAdapter().formatSequences("Fasta", seqs, - omitHidden); + String output = new FormatAdapter().formatSequences(FileFormat.Fasta, + seqs, omitHidden, null); StringSelection ss = new StringSelection(output); @@ -1767,30 +1865,27 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, return; } - Vector hiddenColumns = null; + ArrayList hiddenColumns = null; if (viewport.hasHiddenColumns()) { - hiddenColumns = new Vector(); + hiddenColumns = new ArrayList(); int hiddenOffset = viewport.getSelectionGroup().getStartRes(), hiddenCutoff = viewport .getSelectionGroup().getEndRes(); - for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns() - .size(); i++) + for (int[] region : viewport.getColumnSelection().getHiddenColumns()) { - int[] region = (int[]) viewport.getColumnSelection() - .getHiddenColumns().elementAt(i); if (region[0] >= hiddenOffset && region[1] <= hiddenCutoff) { - hiddenColumns.addElement(new int[] - { region[0] - hiddenOffset, region[1] - hiddenOffset }); + hiddenColumns.add(new int[] { region[0] - hiddenOffset, + region[1] - hiddenOffset }); } } } - Desktop.jalviewClipboard = new Object[] - { seqs, viewport.getAlignment().getDataset(), hiddenColumns }; + Desktop.jalviewClipboard = new Object[] { seqs, + viewport.getAlignment().getDataset(), hiddenColumns }; statusBar.setText(MessageManager.formatMessage( - "label.copied_sequences_to_clipboard", new String[] - { Integer.valueOf(seqs.length).toString() })); + "label.copied_sequences_to_clipboard", new Object[] { Integer + .valueOf(seqs.length).toString() })); } /** @@ -1836,7 +1931,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, return; } - String str, format; + String str; + FileFormatI format; try { str = (String) contents.getTransferData(DataFlavor.stringFlavor); @@ -1845,7 +1941,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, return; } - format = new IdentifyFile().Identify(str, "Paste"); + format = new IdentifyFile().identify(str, DataSourceType.PASTE); } catch (OutOfMemoryError er) { @@ -1875,7 +1971,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, else { // parse the clipboard as an alignment. - alignment = new FormatAdapter().readFile(str, "Paste", format); + alignment = new FormatAdapter().readFile(str, DataSourceType.PASTE, + format); sequences = alignment.getSequencesArray(); } @@ -1999,8 +2096,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // addHistoryItem(new EditCommand( MessageManager.getString("label.add_sequences"), - Action.PASTE, - sequences, 0, alignment.getWidth(), alignment)); + Action.PASTE, sequences, 0, alignment.getWidth(), alignment)); } // Add any annotations attached to sequences for (int i = 0; i < sequences.length; i++) @@ -2087,7 +2183,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, alignment.getSequences()); if (alignPanels != null) { - for (AlignmentPanel ap : ((Vector) alignPanels)) + for (AlignmentPanel ap : alignPanels) { ap.validateAnnotationDimensions(false); } @@ -2107,10 +2203,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (Desktop.jalviewClipboard != null && Desktop.jalviewClipboard[2] != null) { - Vector hc = (Vector) Desktop.jalviewClipboard[2]; - for (int i = 0; i < hc.size(); i++) + List hc = (List) Desktop.jalviewClipboard[2]; + for (int[] region : hc) { - int[] region = (int[]) hc.elementAt(i); af.viewport.hideColumns(region[0], region[1]); } } @@ -2119,7 +2214,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // found!!<<< af.alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer() .transferSettings( - alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer()); + alignPanel.getSeqPanel().seqCanvas + .getFeatureRenderer()); // TODO: maintain provenance of an alignment, rather than just make the // title a concatenation of operations. @@ -2167,10 +2263,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (Desktop.jalviewClipboard != null && Desktop.jalviewClipboard[2] != null) { - Vector hc = (Vector) Desktop.jalviewClipboard[2]; - for (int i = 0; i < hc.size(); i++) + List hc = (List) Desktop.jalviewClipboard[2]; + for (int region[] : hc) { - int[] region = (int[]) hc.elementAt(i); af.viewport.hideColumns(region[0], region[1]); } } @@ -2179,7 +2274,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // found!!<<< af.alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer() .transferSettings( - alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer()); + alignPanel.getSeqPanel().seqCanvas + .getFeatureRenderer()); // TODO: maintain provenance of an alignment, rather than just make the // title a concatenation of operations. @@ -2236,40 +2332,32 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, return; } - List seqs = new ArrayList(sg.getSize()); - SequenceI seq; - for (int i = 0; i < sg.getSize(); i++) - { - seq = sg.getSequenceAt(i); - seqs.add(seq); - } - - // If the cut affects all sequences, warn, remove highlighted columns + /* + * If the cut affects all sequences, warn, remove highlighted columns + */ if (sg.getSize() == viewport.getAlignment().getHeight()) { - int confirm = JOptionPane.showConfirmDialog(this, - MessageManager.getString("warn.delete_all"), // $NON-NLS-1$ - MessageManager.getString("label.delete_all"), // $NON-NLS-1$ - JOptionPane.OK_CANCEL_OPTION); - - if (confirm == JOptionPane.CANCEL_OPTION - || confirm == JOptionPane.CLOSED_OPTION) + boolean isEntireAlignWidth = (((sg.getEndRes() - sg.getStartRes()) + 1) == viewport + .getAlignment().getWidth()) ? true : false; + if (isEntireAlignWidth) { - return; + int confirm = JvOptionPane.showConfirmDialog(this, + MessageManager.getString("warn.delete_all"), // $NON-NLS-1$ + MessageManager.getString("label.delete_all"), // $NON-NLS-1$ + JvOptionPane.OK_CANCEL_OPTION); + + if (confirm == JvOptionPane.CANCEL_OPTION + || confirm == JvOptionPane.CLOSED_OPTION) + { + return; + } } viewport.getColumnSelection().removeElements(sg.getStartRes(), sg.getEndRes() + 1); } + SequenceI[] cut = sg.getSequences() + .toArray(new SequenceI[sg.getSize()]); - SequenceI[] cut = new SequenceI[seqs.size()]; - for (int i = 0; i < seqs.size(); i++) - { - cut[i] = seqs.get(i); - } - - /* - * //ADD HISTORY ITEM - */ addHistoryItem(new EditCommand( MessageManager.getString("label.cut_sequences"), Action.CUT, cut, sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1, @@ -2328,7 +2416,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, sg.setEndRes(viewport.getAlignment().getWidth() - 1); viewport.setSelectionGroup(sg); viewport.sendSelection(); - alignPanel.paintAlignment(true); + // JAL-2034 - should delegate to + // alignPanel to decide if overview needs + // updating. + alignPanel.paintAlignment(false); PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId()); } @@ -2351,7 +2442,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, viewport.setSelectionGroup(null); alignPanel.getSeqPanel().seqCanvas.highlightSearchResults(null); alignPanel.getIdPanel().getIdCanvas().searchResults = null; - alignPanel.paintAlignment(true); + // JAL-2034 - should delegate to + // alignPanel to decide if overview needs + // updating. + alignPanel.paintAlignment(false); PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId()); viewport.sendSelection(); } @@ -2378,6 +2472,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false); } + // JAL-2034 - should delegate to + // alignPanel to decide if overview needs + // updating. alignPanel.paintAlignment(true); PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId()); @@ -2421,7 +2518,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, ColumnSelection colSel = viewport.getColumnSelection(); int column; - if (colSel.size() > 0) + if (!colSel.isEmpty()) { if (trimLeft) { @@ -2446,23 +2543,20 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, TrimRegionCommand trimRegion; if (trimLeft) { - trimRegion = new TrimRegionCommand("Remove Left", - TrimRegionCommand.TRIM_LEFT, seqs, column, - viewport.getAlignment(), viewport.getColumnSelection(), - viewport.getSelectionGroup()); + trimRegion = new TrimRegionCommand("Remove Left", true, seqs, + column, viewport.getAlignment()); viewport.setStartRes(0); } else { - trimRegion = new TrimRegionCommand("Remove Right", - TrimRegionCommand.TRIM_RIGHT, seqs, column, - viewport.getAlignment(), viewport.getColumnSelection(), - viewport.getSelectionGroup()); + trimRegion = new TrimRegionCommand("Remove Right", false, seqs, + column, viewport.getAlignment()); } statusBar.setText(MessageManager.formatMessage( - "label.removed_columns", new String[] - { Integer.valueOf(trimRegion.getSize()).toString() })); + "label.removed_columns", + new String[] { Integer.valueOf(trimRegion.getSize()) + .toString() })); addHistoryItem(trimRegion); @@ -2511,8 +2605,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, addHistoryItem(removeGapCols); statusBar.setText(MessageManager.formatMessage( - "label.removed_empty_columns", new String[] - { Integer.valueOf(removeGapCols.getSize()).toString() })); + "label.removed_empty_columns", + new Object[] { Integer.valueOf(removeGapCols.getSize()) + .toString() })); // This is to maintain viewport position on first residue // of first sequence @@ -2582,16 +2677,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, .getSequences()); } - // else - { - // if (justifySeqs>0) - { - // alignment.justify(justifySeqs!=RIGHT_JUSTIFY); - } - } - - // } - /** * DOCUMENT ME! * @@ -2604,74 +2689,85 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, new Finder(); } - @Override - 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. + * Create a new view of the current alignment. */ - public AlignmentPanel newView(String viewTitle) + @Override + public void newView_actionPerformed(ActionEvent e) { - return newView(viewTitle, true); + newView(null, true); } /** + * Creates and shows a new view of the current alignment. * * @param viewTitle - * title of newly created view + * title of newly created view; if null, one will be generated * @param copyAnnotation * if true then duplicate all annnotation, groups and settings * @return new alignment panel, already displayed. */ public AlignmentPanel newView(String viewTitle, boolean copyAnnotation) { + /* + * Create a new AlignmentPanel (with its own, new Viewport) + */ AlignmentPanel newap = new Jalview2XML().copyAlignPanel(alignPanel, true); if (!copyAnnotation) { - // just remove all the current annotation except for the automatic stuff + /* + * remove all groups and 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.getAlignment().deleteAllAnnotations(false); } - newap.av.gatherViewsHere = false; + newap.av.setGatherViewsHere(false); if (viewport.viewName == null) { - viewport.viewName = "Original"; + viewport.viewName = MessageManager + .getString("label.view_name_original"); } - newap.av.historyList = viewport.historyList; - newap.av.redoList = viewport.redoList; + /* + * Views share the same edits undo and redo stacks + */ + newap.av.setHistoryList(viewport.getHistoryList()); + newap.av.setRedoList(viewport.getRedoList()); + + /* + * Views share the same mappings; need to deregister any new mappings + * created by copyAlignPanel, and register the new reference to the shared + * mappings + */ + newap.av.replaceMappings(viewport.getAlignment()); + + newap.av.viewName = getNewViewName(viewTitle); + + addAlignmentPanel(newap, true); + newap.alignmentChanged(); + + if (alignPanels.size() == 2) + { + viewport.setGatherViewsHere(true); + } + tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1); + return newap; + } + /** + * Make a new name for the view, ensuring it is unique within the current + * sequenceSetId. (This used to be essential for Jalview Project archives, but + * these now use viewId. Unique view names are still desirable for usability.) + * + * @param viewTitle + * @return + */ + protected String getNewViewName(String viewTitle) + { int index = Desktop.getViewCount(viewport.getSequenceSetId()); - // 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) { @@ -2683,45 +2779,55 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, index = 1;// we count from 1 if given a specific name } String newViewName = viewTitle + ((addFirstIndex) ? " " + index : ""); - Vector comps = (Vector) PaintRefresher.components.get(viewport + + List comps = PaintRefresher.components.get(viewport .getSequenceSetId()); - Vector existingNames = new Vector(); - for (int i = 0; i < comps.size(); i++) + + List existingNames = getExistingViewNames(comps); + + while (existingNames.contains(newViewName)) + { + newViewName = viewTitle + " " + (++index); + } + return newViewName; + } + + /** + * Returns a list of distinct view names found in the given list of + * components. View names are held on the viewport of an AlignmentPanel. + * + * @param comps + * @return + */ + protected List getExistingViewNames(List comps) + { + List existingNames = new ArrayList(); + for (Component comp : comps) { - if (comps.elementAt(i) instanceof AlignmentPanel) + if (comp instanceof AlignmentPanel) { - AlignmentPanel ap = (AlignmentPanel) comps.elementAt(i); + AlignmentPanel ap = (AlignmentPanel) comp; if (!existingNames.contains(ap.av.viewName)) { - existingNames.addElement(ap.av.viewName); + existingNames.add(ap.av.viewName); } } } + return existingNames; + } - while (existingNames.contains(newViewName)) - { - newViewName = viewTitle + " " + (++index); - } - - newap.av.viewName = newViewName; - - addAlignmentPanel(newap, true); - newap.alignmentChanged(); - - if (alignPanels.size() == 2) - { - viewport.gatherViewsHere = true; - } - tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1); - return newap; - } - + /** + * Explode tabbed views into separate windows. + */ @Override public void expandViews_actionPerformed(ActionEvent e) { - Desktop.instance.explodeViews(this); + Desktop.explodeViews(this); } + /** + * Gather views in separate windows back into a tabbed presentation. + */ @Override public void gatherViews_actionPerformed(ActionEvent e) { @@ -2751,8 +2857,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { viewport.setShowJVSuffix(seqLimits.isSelected()); - alignPanel.getIdPanel().getIdCanvas().setPreferredSize(alignPanel - .calculateIdWidth()); + alignPanel.getIdPanel().getIdCanvas() + .setPreferredSize(alignPanel.calculateIdWidth()); alignPanel.paintAlignment(true); } @@ -2766,7 +2872,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void centreColumnLabels_actionPerformed(ActionEvent e) { - viewport.centreColumnLabels = centreColumnLabelsMenuItem.getState(); + viewport.setCentreColumnLabels(centreColumnLabelsMenuItem.getState()); alignPanel.paintAlignment(true); } @@ -2778,10 +2884,15 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override protected void followHighlight_actionPerformed() { - if (viewport.followHighlight = this.followHighlightMenuItem.getState()) + /* + * Set the 'follow' flag on the Viewport (and scroll to position if now + * true). + */ + final boolean state = this.followHighlightMenuItem.getState(); + viewport.setFollowHighlight(state); + if (state) { - alignPanel.scrollToPosition( - alignPanel.getSeqPanel().seqCanvas.searchResults, false); + alignPanel.scrollToPosition(viewport.getSearchResults(), false); } } @@ -2811,7 +2922,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, scaleLeft.setVisible(wrapMenuItem.isSelected()); scaleRight.setVisible(wrapMenuItem.isSelected()); viewport.setWrapAlignment(wrapMenuItem.isSelected()); - alignPanel.setWrapAlignment(wrapMenuItem.isSelected()); + alignPanel.updateLayout(); } @Override @@ -2825,13 +2936,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { viewport.showAllHiddenColumns(); repaint(); + viewport.sendSelection(); } @Override public void hideSelSequences_actionPerformed(ActionEvent e) { viewport.hideAllSelectedSeqs(); - alignPanel.paintAlignment(true); + // alignPanel.paintAlignment(true); } /** @@ -2850,9 +2962,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // 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) + if (viewport.hasSelectedColumns() || (sg != null && sg.getSize() > 0 && sg.getStartRes() <= sg .getEndRes())) { @@ -2880,8 +2990,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, hideSelSequences_actionPerformed(null); hide = true; } - else if (!(toggleCols && viewport.getColumnSelection().getSelected() - .size() > 0)) + else if (!(toggleCols && viewport.hasSelectedColumns())) { showAllSeqs_actionPerformed(null); } @@ -2889,7 +2998,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (toggleCols) { - if (viewport.getColumnSelection().getSelected().size() > 0) + if (viewport.hasSelectedColumns()) { hideSelColumns_actionPerformed(null); if (!toggleSeqs) @@ -2915,6 +3024,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, public void hideAllButSelection_actionPerformed(ActionEvent e) { toggleHiddenRegions(false, false); + viewport.sendSelection(); } /* @@ -2932,6 +3042,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, viewport.hideAllSelectedSeqs(); viewport.hideSelectedColumns(); alignPanel.paintAlignment(true); + viewport.sendSelection(); } /* @@ -2947,6 +3058,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, viewport.showAllHiddenColumns(); viewport.showAllHiddenSeqs(); alignPanel.paintAlignment(true); + viewport.sendSelection(); } @Override @@ -2954,6 +3066,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { viewport.hideSelectedColumns(); alignPanel.paintAlignment(true); + viewport.sendSelection(); } @Override @@ -3044,6 +3157,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, public FeatureSettings featureSettings; @Override + public FeatureSettingsControllerI getFeatureSettingsUI() + { + return featureSettings; + } + + @Override public void featureSettings_actionPerformed(ActionEvent e) { if (featureSettings != null) @@ -3078,30 +3197,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } /** - * Set or clear 'Show Sequence Features' - * - * @param evt - * DOCUMENT ME! - */ - @Override - public void showSeqFeaturesHeight_actionPerformed(ActionEvent evt) - { - viewport.setShowSequenceFeaturesHeight(showSeqFeaturesHeight - .isSelected()); - if (viewport.isShowSequenceFeaturesHeight()) - { - // ensure we're actually displaying features - viewport.setShowSequenceFeatures(true); - showSeqFeatures.setSelected(true); - } - alignPanel.paintAlignment(true); - if (alignPanel.getOverviewPanel() != null) - { - alignPanel.getOverviewPanel().updateOverviewImage(); - } - } - - /** * Action on toggle of the 'Show annotations' menu item. This shows or hides * the annotations panel as a whole. * @@ -3115,11 +3210,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { final boolean setVisible = annotationPanelMenuItem.isSelected(); viewport.setShowAnnotation(setVisible); - alignPanel.setAnnotationVisible(setVisible); this.showAllSeqAnnotations.setEnabled(setVisible); this.hideAllSeqAnnotations.setEnabled(setVisible); this.showAllAlAnnotations.setEnabled(setVisible); this.hideAllAlAnnotations.setEnabled(setVisible); + alignPanel.updateLayout(); } @Override @@ -3130,14 +3225,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, StringBuffer contents = new AlignmentProperties(viewport.getAlignment()) .formatAsHtml(); editPane.setText(MessageManager.formatMessage("label.html_content", - new String[] - { contents.toString() })); + new Object[] { contents.toString() })); JInternalFrame frame = new JInternalFrame(); frame.getContentPane().add(new JScrollPane(editPane)); - Desktop.instance.addInternalFrame(frame, MessageManager.formatMessage( - "label.alignment_properties", new String[] - { getTitle() }), 500, 400); + Desktop.addInternalFrame(frame, MessageManager.formatMessage( + "label.alignment_properties", new Object[] { getTitle() }), + 500, 400); } /** @@ -3158,8 +3252,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, OverviewPanel overview = new OverviewPanel(alignPanel); frame.setContentPane(overview); Desktop.addInternalFrame(frame, MessageManager.formatMessage( - "label.overview_params", new String[] - { this.getTitle() }), frame.getWidth(), frame.getHeight()); + "label.overview_params", new Object[] { this.getTitle() }), + frame.getWidth(), frame.getHeight()); frame.pack(); frame.setLayer(JLayeredPane.PALETTE_LAYER); frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter() @@ -3176,146 +3270,19 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } @Override - public void textColour_actionPerformed(ActionEvent e) + public void textColour_actionPerformed() { new TextColourChooser().chooseColour(alignPanel, null); } - /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! - */ - @Override - protected void noColourmenuItem_actionPerformed(ActionEvent e) - { - changeColour(null); - } - - /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! - */ - @Override - public void clustalColour_actionPerformed(ActionEvent e) - { - changeColour(new ClustalxColourScheme(viewport.getAlignment(), - viewport.getHiddenRepSequences())); - } - - /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! - */ - @Override - public void zappoColour_actionPerformed(ActionEvent e) - { - changeColour(new ZappoColourScheme()); - } - - /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! - */ - @Override - public void taylorColour_actionPerformed(ActionEvent e) - { - changeColour(new TaylorColourScheme()); - } - - /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! - */ - @Override - public void hydrophobicityColour_actionPerformed(ActionEvent e) - { - changeColour(new HydrophobicColourScheme()); - } - - /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! - */ - @Override - public void helixColour_actionPerformed(ActionEvent e) - { - changeColour(new HelixColourScheme()); - } - - /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! - */ - @Override - public void strandColour_actionPerformed(ActionEvent e) - { - changeColour(new StrandColourScheme()); - } - - /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! - */ - @Override - public void turnColour_actionPerformed(ActionEvent e) - { - changeColour(new TurnColourScheme()); - } - - /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! - */ - @Override - public void buriedColour_actionPerformed(ActionEvent e) - { - changeColour(new BuriedColourScheme()); - } - - /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! - */ - @Override - public void nucleotideColour_actionPerformed(ActionEvent e) - { - changeColour(new NucleotideColourScheme()); - } - - @Override - public void purinePyrimidineColour_actionPerformed(ActionEvent e) - { - changeColour(new PurinePyrimidineColourScheme()); - } - /* - * public void covariationColour_actionPerformed(ActionEvent e) { + * public void covariationColour_actionPerformed() { * changeColour(new * CovariationColourScheme(viewport.getAlignment().getAlignmentAnnotation * ()[0])); } */ @Override - public void annotationColour_actionPerformed(ActionEvent e) + public void annotationColour_actionPerformed() { new AnnotationColourChooser(viewport, alignPanel); } @@ -3326,314 +3293,130 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, new AnnotationColumnChooser(viewport, alignPanel); } + /** + * Action on the user checking or unchecking the option to apply the selected + * colour scheme to all groups. If unchecked, groups may have their own + * independent colour schemes. + * + * @param selected + */ @Override - public void rnahelicesColour_actionPerformed(ActionEvent e) + public void applyToAllGroups_actionPerformed(boolean selected) { - new RNAHelicesColourChooser(viewport, alignPanel); + viewport.setColourAppliesToAllGroups(selected); } /** - * DOCUMENT ME! + * Action on user selecting a colour from the colour menu * - * @param e - * DOCUMENT ME! + * @param name + * the name (not the menu item label!) of the colour scheme */ @Override - protected void applyToAllGroups_actionPerformed(ActionEvent e) + public void changeColour_actionPerformed(String name) { - viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected()); + /* + * 'User Defined' opens a panel to configure or load a + * user-defined colour scheme + */ + if (ResidueColourScheme.USER_DEFINED.equals(name)) + { + new UserDefinedColours(alignPanel, null); + return; + } + + /* + * otherwise set the chosen colour scheme (or null for 'None') + */ + ColourSchemeI cs = ColourSchemes.getInstance().getColourScheme(name, + viewport.getAlignment(), viewport.getHiddenRepSequences()); + changeColour(cs); } /** - * DOCUMENT ME! + * Actions on setting or changing the alignment colour scheme * * @param cs - * DOCUMENT ME! */ + @Override public void changeColour(ColourSchemeI cs) { - // TODO: compare with applet and pull up to model method - int threshold = 0; - + // TODO: pull up to controller method if (cs != null) { - if (viewport.getAbovePIDThreshold()) - { - threshold = SliderPanel.setPIDSliderSource(alignPanel, cs, - "Background"); - cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus()); - } - else - { - cs.setThreshold(0, viewport.getIgnoreGapsConsensus()); - } - - if (viewport.getConservationSelected()) - { - - Alignment al = (Alignment) viewport.getAlignment(); - Conservation c = new Conservation("All", - ResidueProperties.propHash, 3, al.getSequences(), 0, - al.getWidth() - 1); - - c.calculate(); - c.verdict(false, viewport.getConsPercGaps()); - - cs.setConservation(c); - - cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, - cs, "Background")); - } - else - { - cs.setConservation(null); - } - - cs.setConsensus(viewport.getSequenceConsensusHash()); + ColourMenuHelper.setColourSelected(colourMenu, cs.getSchemeName()); } viewport.setGlobalColourScheme(cs); - if (viewport.getColourAppliesToAllGroups()) - { - - for (SequenceGroup sg : viewport.getAlignment().getGroups()) - { - if (cs == null) - { - sg.cs = null; - continue; - } - - if (cs instanceof ClustalxColourScheme) - { - sg.cs = new ClustalxColourScheme(sg, - viewport.getHiddenRepSequences()); - } - else if (cs instanceof UserColourScheme) - { - sg.cs = new UserColourScheme(((UserColourScheme) cs).getColours()); - } - else - { - try - { - sg.cs = cs.getClass().newInstance(); - } catch (Exception ex) - { - } - } - - if (viewport.getAbovePIDThreshold() - || cs instanceof PIDColourScheme - || cs instanceof Blosum62ColourScheme) - { - sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus()); - - sg.cs.setConsensus(AAFrequency.calculate( - sg.getSequences(viewport.getHiddenRepSequences()), - sg.getStartRes(), sg.getEndRes() + 1)); - } - else - { - sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus()); - } - - if (viewport.getConservationSelected()) - { - Conservation c = new Conservation("Group", - ResidueProperties.propHash, 3, sg.getSequences(viewport - .getHiddenRepSequences()), sg.getStartRes(), - sg.getEndRes() + 1); - c.calculate(); - c.verdict(false, viewport.getConsPercGaps()); - sg.cs.setConservation(c); - } - else - { - sg.cs.setConservation(null); - } - } - } - - if (alignPanel.getOverviewPanel() != null) - { - alignPanel.getOverviewPanel().updateOverviewImage(); - } - alignPanel.paintAlignment(true); } /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! - */ - @Override - protected void modifyPID_actionPerformed(ActionEvent e) - { - if (viewport.getAbovePIDThreshold() - && viewport.getGlobalColourScheme() != null) - { - SliderPanel.setPIDSliderSource(alignPanel, - viewport.getGlobalColourScheme(), "Background"); - SliderPanel.showPIDSlider(); - } - } - - /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! + * Show the PID threshold slider panel */ @Override - protected void modifyConservation_actionPerformed(ActionEvent e) + protected void modifyPID_actionPerformed() { - if (viewport.getConservationSelected() - && viewport.getGlobalColourScheme() != null) - { - SliderPanel.setConservationSlider(alignPanel, - viewport.getGlobalColourScheme(), "Background"); - SliderPanel.showConservationSlider(); - } + SliderPanel.setPIDSliderSource(alignPanel, + viewport.getViewportColourScheme(), alignPanel.getViewName()); + SliderPanel.showPIDSlider(); } /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! + * Show the Conservation slider panel */ @Override - protected void conservationMenuItem_actionPerformed(ActionEvent e) + protected void modifyConservation_actionPerformed() { - viewport.setConservationSelected(conservationMenuItem.isSelected()); - - viewport.setAbovePIDThreshold(false); - abovePIDThreshold.setSelected(false); - - changeColour(viewport.getGlobalColourScheme()); - - modifyConservation_actionPerformed(null); + SliderPanel.setConservationSlider(alignPanel, + viewport.getViewportColourScheme(), alignPanel.getViewName()); + SliderPanel.showConservationSlider(); } /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! + * Action on selecting or deselecting (Colour) By Conservation */ @Override - public void abovePIDThreshold_actionPerformed(ActionEvent e) + public void conservationMenuItem_actionPerformed(boolean selected) { - viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected()); - - conservationMenuItem.setSelected(false); - viewport.setConservationSelected(false); + modifyConservation.setEnabled(selected); + viewport.setConservationSelected(selected); + viewport.getViewportColourScheme().setConservationApplied(selected); changeColour(viewport.getGlobalColourScheme()); - - modifyPID_actionPerformed(null); - } - - /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! - */ - @Override - public void userDefinedColour_actionPerformed(ActionEvent e) - { - if (e.getActionCommand().equals( - MessageManager.getString("action.user_defined"))) + if (selected) { - new UserDefinedColours(alignPanel, null); + modifyConservation_actionPerformed(); } else { - UserColourScheme udc = (UserColourScheme) UserDefinedColours - .getUserColourSchemes().get(e.getActionCommand()); - - changeColour(udc); + SliderPanel.hideConservationSlider(); } } - public void updateUserColourMenu() + /** + * Action on selecting or deselecting (Colour) Above PID Threshold + */ + @Override + public void abovePIDThreshold_actionPerformed(boolean selected) { + modifyPID.setEnabled(selected); + viewport.setAbovePIDThreshold(selected); + if (!selected) + { + viewport.getViewportColourScheme().setThreshold(0, + viewport.isIgnoreGapsConsensus()); + } - Component[] menuItems = colourMenu.getMenuComponents(); - int i, iSize = menuItems.length; - for (i = 0; i < iSize; i++) + changeColour(viewport.getGlobalColourScheme()); + if (selected) { - if (menuItems[i].getName() != null - && menuItems[i].getName().equals("USER_DEFINED")) - { - colourMenu.remove(menuItems[i]); - iSize--; - } + modifyPID_actionPerformed(); } - if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null) + else { - java.util.Enumeration userColours = jalview.gui.UserDefinedColours - .getUserColourSchemes().keys(); - - while (userColours.hasMoreElements()) - { - final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem( - userColours.nextElement().toString()); - radioItem.setName("USER_DEFINED"); - radioItem.addMouseListener(new MouseAdapter() - { - @Override - public void mousePressed(MouseEvent evt) - { - if (evt.isControlDown() - || SwingUtilities.isRightMouseButton(evt)) - { - radioItem.removeActionListener(radioItem.getActionListeners()[0]); - - int option = JOptionPane.showInternalConfirmDialog( - jalview.gui.Desktop.desktop, - MessageManager - .getString("label.remove_from_default_list"), - MessageManager - .getString("label.remove_user_defined_colour"), - JOptionPane.YES_NO_OPTION); - if (option == JOptionPane.YES_OPTION) - { - jalview.gui.UserDefinedColours - .removeColourFromDefaults(radioItem.getText()); - colourMenu.remove(radioItem); - } - else - { - radioItem.addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent evt) - { - userDefinedColour_actionPerformed(evt); - } - }); - } - } - } - }); - radioItem.addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent evt) - { - userDefinedColour_actionPerformed(evt); - } - }); - - colourMenu.insert(radioItem, 15); - colours.add(radioItem); - } + SliderPanel.hidePIDSlider(); } } @@ -3644,30 +3427,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! */ @Override - public void PIDColour_actionPerformed(ActionEvent e) - { - changeColour(new PIDColourScheme()); - } - - /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! - */ - @Override - public void BLOSUM62Colour_actionPerformed(ActionEvent e) - { - changeColour(new Blosum62ColourScheme()); - } - - /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! - */ - @Override public void sortPairwiseMenuItem_actionPerformed(ActionEvent e) { SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray(); @@ -3751,10 +3510,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if ((viewport.getSelectionGroup() == null) || (viewport.getSelectionGroup().getSize() < 2)) { - JOptionPane.showInternalMessageDialog(this, MessageManager + JvOptionPane.showInternalMessageDialog(this, MessageManager .getString("label.you_must_select_least_two_sequences"), MessageManager.getString("label.invalid_selection"), - JOptionPane.WARNING_MESSAGE); + JvOptionPane.WARNING_MESSAGE); } else { @@ -3780,14 +3539,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, .getSelectionGroup().getSize() > 0)) || (viewport.getAlignment().getHeight() < 4)) { - JOptionPane + JvOptionPane .showInternalMessageDialog( this, MessageManager .getString("label.principal_component_analysis_must_take_least_four_input_sequences"), MessageManager .getString("label.sequence_selection_insufficient"), - JOptionPane.WARNING_MESSAGE); + JvOptionPane.WARNING_MESSAGE); return; } @@ -3827,7 +3586,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e) { - NewTreePanel("AV", "PID", "Average distance tree using PID"); + newTreePanel("AV", "PID", "Average distance tree using PID"); } /** @@ -3839,7 +3598,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void neighbourTreeMenuItem_actionPerformed(ActionEvent e) { - NewTreePanel("NJ", "PID", "Neighbour joining tree using PID"); + newTreePanel("NJ", "PID", "Neighbour joining tree using PID"); } /** @@ -3851,7 +3610,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e) { - NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62"); + newTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62"); } /** @@ -3863,7 +3622,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e) { - NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62"); + newTreePanel("AV", "BL", "Average distance tree using BLOSUM62"); } /** @@ -3876,7 +3635,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * @param title * DOCUMENT ME! */ - void NewTreePanel(String type, String pwType, String title) + void newTreePanel(String type, String pwType, String title) { TreePanel tp; @@ -3885,14 +3644,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { if (viewport.getSelectionGroup().getSize() < 3) { - JOptionPane + JvOptionPane .showMessageDialog( Desktop.desktop, MessageManager .getString("label.you_need_more_two_sequences_selected_build_tree"), MessageManager .getString("label.not_enough_sequences"), - JOptionPane.WARNING_MESSAGE); + JvOptionPane.WARNING_MESSAGE); return; } @@ -3903,14 +3662,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { if (_s.getLength() < sg.getEndRes()) { - JOptionPane + JvOptionPane .showMessageDialog( Desktop.desktop, MessageManager .getString("label.selected_region_to_tree_may_only_contain_residues_or_gaps"), MessageManager .getString("label.sequences_selection_not_aligned"), - JOptionPane.WARNING_MESSAGE); + JvOptionPane.WARNING_MESSAGE); return; } @@ -3924,14 +3683,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // are the visible sequences aligned? if (!viewport.getAlignment().isAligned(false)) { - JOptionPane + JvOptionPane .showMessageDialog( Desktop.desktop, MessageManager .getString("label.sequences_must_be_aligned_before_creating_tree"), MessageManager .getString("label.sequences_not_aligned"), - JOptionPane.WARNING_MESSAGE); + JvOptionPane.WARNING_MESSAGE); return; } @@ -3967,7 +3726,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, public void addSortByOrderMenuItem(String title, final AlignmentOrder order) { - final JMenuItem item = new JMenuItem(MessageManager.formatMessage("action.by_title_param", new String[]{title})); + final JMenuItem item = new JMenuItem(MessageManager.formatMessage( + "action.by_title_param", new Object[] { title })); sort.add(item); item.addActionListener(new java.awt.event.ActionListener() { @@ -4086,16 +3846,17 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, calculateTree.removeAll(); // build the calculate menu - for (final String type : new String[] - { "NJ", "AV" }) + for (final String type : new String[] { "NJ", "AV" }) { String treecalcnm = MessageManager.getString("label.tree_calc_" + type.toLowerCase()); - for (final Object pwtype : ResidueProperties.scoreMatrices.keySet()) + for (final String pwtype : ResidueProperties.scoreMatrices.keySet()) { JMenuItem tm = new JMenuItem(); ScoreModelI sm = ResidueProperties.scoreMatrices.get(pwtype); - if (sm.isProtein() == !viewport.getAlignment().isNucleotide()) + if (sm.isDNA() == viewport.getAlignment().isNucleotide() + || sm.isProtein() == !viewport.getAlignment() + .isNucleotide()) { String smn = MessageManager.getStringOrReturn( "label.score_model_", sm.getName()); @@ -4107,7 +3868,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void actionPerformed(ActionEvent e) { - NewTreePanel(type, (String) pwtype, title); + newTreePanel(type, pwtype, title); } }); calculateTree.add(tm); @@ -4117,21 +3878,18 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } sortByTreeMenu.removeAll(); - Vector comps = (Vector) PaintRefresher.components.get(viewport + List comps = PaintRefresher.components.get(viewport .getSequenceSetId()); - Vector treePanels = new Vector(); - int i, iSize = comps.size(); - for (i = 0; i < iSize; i++) + List treePanels = new ArrayList(); + for (Component comp : comps) { - if (comps.elementAt(i) instanceof TreePanel) + if (comp instanceof TreePanel) { - treePanels.add(comps.elementAt(i)); + treePanels.add((TreePanel) comp); } } - iSize = treePanels.size(); - - if (iSize < 1) + if (treePanels.size() < 1) { sortByTreeMenu.setVisible(false); return; @@ -4139,17 +3897,15 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, sortByTreeMenu.setVisible(true); - for (i = 0; i < treePanels.size(); i++) + for (final TreePanel tp : treePanels) { - 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() { @Override public void actionPerformed(ActionEvent e) { - tp.sortByTree_actionPerformed(null); + tp.sortByTree_actionPerformed(); addHistoryItem(tp.sortAlignmentIn(alignPanel)); } @@ -4199,11 +3955,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, else if (viewport.getSelectionGroup() != null && viewport.getSelectionGroup().getSize() == 1) { - int option = JOptionPane.showConfirmDialog(this, + int option = JvOptionPane.showConfirmDialog(this, MessageManager.getString("warn.oneseq_msainput_selection"), MessageManager.getString("label.invalid_selection"), - JOptionPane.OK_CANCEL_OPTION); - if (option == JOptionPane.OK_OPTION) + JvOptionPane.OK_CANCEL_OPTION); + if (option == JvOptionPane.OK_OPTION) { msa = viewport.getAlignmentView(false); } @@ -4241,8 +3997,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // selection may well be aligned - we preserve 2.0.8 behaviour for moment. if (!viewport.getAlignment().isAligned(false)) { - seqs.setSequences(new SeqCigar[] - { seqs.getSequences()[0] }); + seqs.setSequences(new SeqCigar[] { seqs.getSequences()[0] }); // TODO: if seqs.getSequences().length>1 then should really have warned // user! @@ -4257,7 +4012,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * DOCUMENT ME! */ @Override - protected void LoadtreeMenuItem_actionPerformed(ActionEvent e) + protected void loadTreeMenuItem_actionPerformed(ActionEvent e) { // Pick the tree file JalviewFileChooser chooser = new JalviewFileChooser( @@ -4276,35 +4031,29 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, jalview.io.NewickFile fin = null; try { - fin = new jalview.io.NewickFile(choice, "File"); + fin = new NewickFile(choice, DataSourceType.FILE); viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree()); } catch (Exception ex) { - JOptionPane + JvOptionPane .showMessageDialog( Desktop.desktop, ex.getMessage(), MessageManager .getString("label.problem_reading_tree_file"), - JOptionPane.WARNING_MESSAGE); + JvOptionPane.WARNING_MESSAGE); ex.printStackTrace(); } if (fin != null && fin.hasWarningMessage()) { - JOptionPane.showMessageDialog(Desktop.desktop, fin + JvOptionPane.showMessageDialog(Desktop.desktop, fin .getWarningMessage(), MessageManager .getString("label.possible_problem_with_tree_file"), - JOptionPane.WARNING_MESSAGE); + JvOptionPane.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); @@ -4389,7 +4138,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } catch (Exception e) { } - ; } final AlignFrame me = this; buildingMenu = true; @@ -4401,8 +4149,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, final List legacyItems = new ArrayList(); try { - System.err.println("Building ws menu again " - + Thread.currentThread()); + // System.err.println("Building ws menu again " + // + Thread.currentThread()); // TODO: add support for context dependent disabling of services based // on // alignment and current selection @@ -4415,22 +4163,18 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // object broker mechanism. final Vector wsmenu = new Vector(); final IProgressIndicator af = me; + + /* + * do not i18n these strings - they are hard-coded in class + * compbio.data.msa.Category, Jws2Discoverer.isRecalculable() and + * SequenceAnnotationWSClient.initSequenceAnnotationWSClient() + */ 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("Protein Disorder"); - // final JMenu msawsmenu = new - // JMenu(MessageManager.getString("label.alignment")); - // final JMenu secstrmenu = new - // JMenu(MessageManager.getString("label.secondary_structure_prediction")); - // final JMenu seqsrchmenu = new - // JMenu(MessageManager.getString("label.sequence_database_search")); - // final JMenu analymenu = new - // JMenu(MessageManager.getString("label.analysis")); - // final JMenu dismenu = new - // JMenu(MessageManager.getString("label.protein_disorder")); // JAL-940 - only show secondary structure prediction services from // the legacy server if (// Cache.getDefault("SHOW_JWS1_SERVICES", true) @@ -4544,14 +4288,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, .debug("Exception during web service menu building process.", e); } - ; } }); } catch (Exception e) { } - ; - buildingMenu = false; } }).start(); @@ -4582,91 +4323,56 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // 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); - } - } - - /* - * public void vamsasStore_actionPerformed(ActionEvent e) { JalviewFileChooser - * chooser = new JalviewFileChooser(jalview.bin.Cache. - * getProperty("LAST_DIRECTORY")); - * - * chooser.setFileView(new JalviewFileView()); chooser.setDialogTitle("Export - * to Vamsas file"); chooser.setToolTipText("Export"); - * - * int value = chooser.showSaveDialog(this); - * - * if (value == JalviewFileChooser.APPROVE_OPTION) { - * jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport); - * //vs.store(chooser.getSelectedFile().getAbsolutePath() ); vs.storeJalview( - * chooser.getSelectedFile().getAbsolutePath(), this); } } - */ - /** - * prototype of an automatically enabled/disabled analysis function - * - */ - protected void setShowProductsEnabled() - { - SequenceI[] selection = viewport.getSequenceSelection(); - if (canShowProducts(selection, viewport.getSelectionGroup() != null, - viewport.getAlignment().getDataset())) - { - showProducts.setEnabled(true); - - } - else + + for (jalview.ws.rest.RestClient client : jalview.ws.rest.RestClient + .getRestClients()) { - showProducts.setEnabled(false); + client.attachWSMenuEntry( + JvSwingUtils.findOrCreateMenu(webService, client.getAction()), + this); } } /** - * search selection for sequence xRef products and build the show products - * menu. + * Searches the alignment sequences for xRefs and builds the Show + * Cross-References menu (formerly called Show Products), with database + * sources for which cross-references are found (protein sources for a + * nucleotide alignment and vice versa) * - * @param selection - * @param dataset - * @return true if showProducts menu should be enabled. + * @return true if Show Cross-references menu should be enabled */ - public boolean canShowProducts(SequenceI[] selection, - boolean isRegionSelection, Alignment dataset) + public boolean canShowProducts() { + SequenceI[] seqs = viewport.getAlignment().getSequencesArray(); + AlignmentI dataset = viewport.getAlignment().getDataset(); + + showProducts.removeAll(); + final boolean dna = viewport.getAlignment().isNucleotide(); + + if (seqs == null || seqs.length == 0) + { + // nothing to see here. + return false; + } + boolean showp = false; try { - 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); - // Object[] prods = - // CrossRef.buildXProductsList(viewport.getAlignment().isNucleotide(), - // selection, dataset, true); - final SequenceI[] sel = selection; - for (int t = 0; ptypes != null && t < ptypes.length; t++) + List ptypes = new CrossRef(seqs, dataset) + .findXrefSourcesForSequences(dna); + + for (final String source : ptypes) { showp = true; - final boolean isRegSel = isRegionSelection; final AlignFrame af = this; - final String source = ptypes[t]; - JMenuItem xtype = new JMenuItem(ptypes[t]); + JMenuItem xtype = new JMenuItem(source); xtype.addActionListener(new ActionListener() { - @Override public void actionPerformed(ActionEvent e) { - // TODO: new thread for this call with vis-delay - af.showProductsFor(af.viewport.getSequenceSelection(), ds, - isRegSel, dna, source); + showProductsFor(af.viewport.getSequenceSelection(), dna, source); } - }); showProducts.add(xtype); } @@ -4674,240 +4380,126 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, showProducts.setEnabled(showp); } catch (Exception e) { - jalview.bin.Cache.log - .warn("canTranslate threw an exception - please report to help@jalview.org", + Cache.log + .warn("canShowProducts threw an exception - please report to help@jalview.org", e); return false; } return showp; } - protected void showProductsFor(SequenceI[] sel, Alignment ds, - boolean isRegSel, boolean dna, String source) - { - final boolean fisRegSel = isRegSel; - final boolean fdna = dna; - final String fsrc = source; - final AlignFrame ths = this; - final SequenceI[] fsel = sel; - Runnable foo = new Runnable() - { - - @Override - public void run() - { - final long sttime = System.currentTimeMillis(); - ths.setProgressBar(MessageManager.formatMessage("status.searching_for_sequences_from", new String[]{fsrc}), sttime); - try - { - Alignment ds = ths.getViewport().getAlignment().getDataset(); // update - // our local - // dataset - // reference - Alignment prods = CrossRef - .findXrefSequences(fsel, fdna, fsrc, ds); - if (prods != null) - { - SequenceI[] sprods = new SequenceI[prods.getHeight()]; - for (int s = 0; s < sprods.length; s++) - { - sprods[s] = (prods.getSequenceAt(s)).deriveSequence(); - if (ds.getSequences() == null - || !ds.getSequences().contains( - sprods[s].getDatasetSequence())) - { - ds.addSequence(sprods[s].getDatasetSequence()); - } - sprods[s].updatePDBIds(); - } - Alignment al = new Alignment(sprods); - AlignedCodonFrame[] cf = prods.getCodonFrames(); - al.setDataset(ds); - for (int s = 0; cf != null && s < cf.length; s++) - { - al.addCodonFrame(cf[s]); - cf[s] = null; - } - AlignFrame naf = new AlignFrame(al, DEFAULT_WIDTH, - DEFAULT_HEIGHT); - String newtitle = "" + ((fdna) ? "Proteins " : "Nucleotides ") - + " for " + ((fisRegSel) ? "selected region of " : "") - + getTitle(); - Desktop.addInternalFrame(naf, newtitle, DEFAULT_WIDTH, - DEFAULT_HEIGHT); - } - else - { - System.err.println("No Sequences generated for xRef type " - + fsrc); - } - } catch (Exception e) - { - jalview.bin.Cache.log.error( - "Exception when finding crossreferences", e); - } catch (OutOfMemoryError e) - { - new OOMWarning("whilst fetching crossreferences", e); - } catch (Error e) - { - jalview.bin.Cache.log.error("Error when finding crossreferences", - e); - } - ths.setProgressBar(MessageManager.formatMessage("status.finished_searching_for_sequences_from", new String[]{fsrc}), - sttime); - } - - }; - Thread frunner = new Thread(foo); - frunner.start(); - } - - public boolean canShowTranslationProducts(SequenceI[] selection, - AlignmentI alignment) - { - // old way - try - { - 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", - e); - return false; - } - } - - @Override - public void showProducts_actionPerformed(ActionEvent e) + /** + * Finds and displays cross-references for the selected sequences (protein + * products for nucleotide sequences, dna coding sequences for peptides). + * + * @param sel + * the sequences to show cross-references for + * @param dna + * true if from a nucleotide alignment (so showing proteins) + * @param source + * the database to show cross-references for + */ + protected void showProductsFor(final SequenceI[] sel, + final boolean _odna, final String source) { - // ///////////////////////////// - // Collect Data to be translated/transferred - - SequenceI[] selection = viewport.getSequenceSelection(); - AlignmentI al = null; - try - { - al = jalview.analysis.Dna.CdnaTranslate(selection, viewport - .getViewAsVisibleContigs(true), viewport.getGapCharacter(), - viewport.getAlignment().getDataset()); - } catch (Exception ex) - { - al = null; - jalview.bin.Cache.log.debug("Exception during translation.", ex); - } - if (al == null) - { - JOptionPane - .showMessageDialog( - Desktop.desktop, - MessageManager - .getString("label.select_at_least_three_bases_in_at_least_one_sequence_to_cDNA_translation"), - MessageManager.getString("label.translation_failed"), - JOptionPane.WARNING_MESSAGE); - } - else - { - AlignFrame af = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT); - Desktop.addInternalFrame(af, MessageManager.formatMessage( - "label.translation_of_params", new String[] - { this.getTitle() }), DEFAULT_WIDTH, DEFAULT_HEIGHT); - } + new Thread(CrossRefAction.showProductsFor(sel, _odna, source, this)) + .start(); } + /** + * Construct and display a new frame containing the translation of this + * frame's DNA sequences to their aligned protein (amino acid) equivalents. + */ @Override public void showTranslation_actionPerformed(ActionEvent e) { - // ///////////////////////////// - // Collect Data to be translated/transferred - - SequenceI[] selection = viewport.getSequenceSelection(); - String[] seqstring = viewport.getViewAsString(true); AlignmentI al = null; try { - al = jalview.analysis.Dna.CdnaTranslate(selection, seqstring, - viewport.getViewAsVisibleContigs(true), viewport - .getGapCharacter(), viewport.getAlignment() - .getAlignmentAnnotation(), viewport.getAlignment() - .getWidth(), viewport.getAlignment().getDataset()); + Dna dna = new Dna(viewport, viewport.getViewAsVisibleContigs(true)); + + al = dna.translateCdna(); } catch (Exception ex) { - al = null; jalview.bin.Cache.log.error( "Exception during translation. Please report this !", ex); - JOptionPane - .showMessageDialog( - Desktop.desktop, - MessageManager - .getString("label.error_when_translating_sequences_submit_bug_report"), - MessageManager - .getString("label.implementation_error") - + MessageManager - .getString("translation_failed"), - JOptionPane.ERROR_MESSAGE); + final String msg = MessageManager + .getString("label.error_when_translating_sequences_submit_bug_report"); + final String errorTitle = MessageManager + .getString("label.implementation_error") + + MessageManager.getString("label.translation_failed"); + JvOptionPane.showMessageDialog(Desktop.desktop, msg, errorTitle, + JvOptionPane.ERROR_MESSAGE); return; } - if (al == null) + if (al == null || al.getHeight() == 0) { - JOptionPane - .showMessageDialog( - Desktop.desktop, - MessageManager - .getString("label.select_at_least_three_bases_in_at_least_one_sequence_to_cDNA_translation"), - MessageManager.getString("label.translation_failed"), - JOptionPane.WARNING_MESSAGE); + final String msg = MessageManager + .getString("label.select_at_least_three_bases_in_at_least_one_sequence_to_cDNA_translation"); + final String errorTitle = MessageManager + .getString("label.translation_failed"); + JvOptionPane.showMessageDialog(Desktop.desktop, msg, errorTitle, + JvOptionPane.WARNING_MESSAGE); } else { AlignFrame af = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT); - Desktop.addInternalFrame(af, MessageManager.formatMessage( - "label.translation_of_params", new String[] - { this.getTitle() }), DEFAULT_WIDTH, DEFAULT_HEIGHT); + af.setFileFormat(this.currentFileFormat); + final String newTitle = MessageManager.formatMessage( + "label.translation_of_params", + new Object[] { this.getTitle() }); + af.setTitle(newTitle); + if (Cache.getDefault(Preferences.ENABLE_SPLIT_FRAME, true)) + { + final SequenceI[] seqs = viewport.getSelectionAsNewSequence(); + viewport.openSplitFrame(af, new Alignment(seqs)); + } + else + { + Desktop.addInternalFrame(af, newTitle, DEFAULT_WIDTH, + DEFAULT_HEIGHT); + } } } /** + * Set the file format + * + * @param format + */ + public void setFileFormat(FileFormatI format) + { + this.currentFileFormat = format; + } + + /** * Try to load a features file onto the alignment. * * @param file * contents or path to retrieve file - * @param type + * @param sourceType * access mode of file (see jalview.io.AlignFile) - * @return true if features file was parsed corectly. + * @return true if features file was parsed correctly. */ - public boolean parseFeaturesFile(String file, String type) + public boolean parseFeaturesFile(String file, DataSourceType sourceType) { - boolean featuresFile = false; - try - { - featuresFile = new FeaturesFile(file, type).parse(viewport - .getAlignment().getDataset(), alignPanel.getSeqPanel().seqCanvas - .getFeatureRenderer().getFeatureColours(), false, - jalview.bin.Cache.getDefault("RELAXEDSEQIDMATCHING", false)); - } catch (Exception ex) - { - ex.printStackTrace(); - } + return avc.parseFeaturesFile(file, sourceType, + Cache.getDefault("RELAXEDSEQIDMATCHING", false)); + + } - if (featuresFile) + @Override + public void refreshFeatureUI(boolean enableIfNecessary) + { + // note - currently this is only still here rather than in the controller + // because of the featureSettings hard reference that is yet to be + // abstracted + if (enableIfNecessary) { viewport.setShowSequenceFeatures(true); showSeqFeatures.setSelected(true); - if (alignPanel.getSeqPanel().seqCanvas.fr != null) - { - // update the min/max ranges where necessary - alignPanel.getSeqPanel().seqCanvas.fr.findAllFeatures(true); - } - if (featureSettings != null) - { - featureSettings.setTableData(); - } - alignPanel.paintAlignment(true); } - return featuresFile; } @Override @@ -4933,50 +4525,16 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void drop(DropTargetDropEvent evt) { + // JAL-1552 - acceptDrop required before getTransferable call for + // Java's Transferable for native dnd + evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); Transferable t = evt.getTransferable(); - java.util.List files = null; + List files = new ArrayList(); + List protocols = new ArrayList(); try { - DataFlavor uriListFlavor = new DataFlavor( - "text/uri-list;class=java.lang.String"); - if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) - { - // Works on Windows and MacOSX - evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); - files = (java.util.List) t - .getTransferData(DataFlavor.javaFileListFlavor); - } - else if (t.isDataFlavorSupported(uriListFlavor)) - { - // This is used by Unix drag system - evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); - String data = (String) t.getTransferData(uriListFlavor); - files = new java.util.ArrayList(1); - for (java.util.StringTokenizer st = new java.util.StringTokenizer( - data, "\r\n"); st.hasMoreTokens();) - { - String s = st.nextToken(); - if (s.startsWith("#")) - { - // the line is a comment (as per the RFC 2483) - continue; - } - - java.net.URI uri = new java.net.URI(s); - // check to see if we can handle this kind of URI - if (uri.getScheme().toLowerCase().startsWith("http")) - { - files.add(uri.toString()); - } - else - { - // otherwise preserve old behaviour: catch all for file objects - java.io.File file = new java.io.File(uri); - files.add(file.toString()); - } - } - } + Desktop.transferFromDropTarget(files, protocols, evt, t); } catch (Exception e) { e.printStackTrace(); @@ -4998,13 +4556,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { String file = files.get(i).toString(); String pdbfn = ""; - String protocol = FormatAdapter.checkProtocol(file); - if (protocol == jalview.io.FormatAdapter.FILE) + DataSourceType protocol = FormatAdapter.checkProtocol(file); + if (protocol == DataSourceType.FILE) { File fl = new File(file); pdbfn = fl.getName(); } - else if (protocol == jalview.io.FormatAdapter.URL) + else if (protocol == DataSourceType.URL) { URL url = new URL(file); pdbfn = url.getFile(); @@ -5028,22 +4586,18 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } if (mtch != null) { - String type = null; + FileFormatI type = null; try { - type = new IdentifyFile().Identify(file, protocol); + type = new IdentifyFile().identify(file, protocol); } catch (Exception ex) { type = null; } - if (type != null) + if (type != null && type.isStructureFile()) { - if (type.equalsIgnoreCase("PDB")) - { - filesmatched.add(new Object[] - { file, protocol, mtch }); - continue; - } + filesmatched.add(new Object[] { file, protocol, mtch }); + continue; } } // File wasn't named like one of the sequences or wasn't a PDB file. @@ -5054,20 +4608,20 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (filesmatched.size() > 0) { if (Cache.getDefault("AUTOASSOCIATE_PDBANDSEQS", false) - || JOptionPane + || JvOptionPane .showConfirmDialog( this, MessageManager .formatMessage( - "label.automatically_associate_pdb_files_with_sequences_same_name", - new String[] - { Integer.valueOf( - filesmatched - .size()) + "label.automatically_associate_structure_files_with_sequences_same_name", + new Object[] { Integer + .valueOf( + filesmatched + .size()) .toString() }), MessageManager - .getString("label.automatically_associate_pdb_files_by_name"), - JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) + .getString("label.automatically_associate_structure_files_by_name"), + JvOptionPane.YES_NO_OPTION) == JvOptionPane.YES_OPTION) { for (Object[] fm : filesmatched) @@ -5079,7 +4633,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { PDBEntry pe = new AssociatePdbFileWithSeq() .associatePdbWithSeq((String) fm[0], - (String) fm[1], toassoc, false, + (DataSourceType) fm[1], toassoc, false, Desktop.instance); if (pe != null) { @@ -5097,20 +4651,22 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { if (assocfiles > 0 && (Cache.getDefault( - "AUTOASSOCIATE_PDBANDSEQS_IGNOREOTHERS", false) || JOptionPane + "AUTOASSOCIATE_PDBANDSEQS_IGNOREOTHERS", false) || JvOptionPane .showConfirmDialog( this, - ""+MessageManager - .formatMessage( - "label.ignore_unmatched_dropped_files_info", - new String[] - { Integer.valueOf( - filesnotmatched - .size()) - .toString() })+"", + "" + + MessageManager + .formatMessage( + "label.ignore_unmatched_dropped_files_info", + new Object[] { Integer + .valueOf( + filesnotmatched + .size()) + .toString() }) + + "", MessageManager .getString("label.ignore_unmatched_dropped_files"), - JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)) + JvOptionPane.YES_NO_OPTION) == JvOptionPane.YES_OPTION)) { return; } @@ -5129,29 +4685,28 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * 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 + * it's an 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. */ - public void loadJalviewDataFile(String file, String protocol, - String format, SequenceI assocSeq) + public void loadJalviewDataFile(String file, DataSourceType sourceType, + FileFormatI format, SequenceI assocSeq) { try { - if (protocol == null) + if (sourceType == null) { - protocol = jalview.io.FormatAdapter.checkProtocol(file); + sourceType = FormatAdapter.checkProtocol(file); } // if the file isn't identified, or not positively identified as some // other filetype (PFAM is default unidentified alignment file type) then // try to parse as annotation. - boolean isAnnotation = (format == null || format - .equalsIgnoreCase("PFAM")) ? new AnnotationFile() - .annotateAlignmentView(viewport, file, protocol) - : false; + boolean isAnnotation = (format == null || FileFormat.Pfam + .equals(format)) ? new AnnotationFile() + .annotateAlignmentView(viewport, file, sourceType) : false; if (!isAnnotation) { @@ -5159,13 +4714,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, TCoffeeScoreFile tcf = null; try { - tcf = new TCoffeeScoreFile(file, protocol); + tcf = new TCoffeeScoreFile(file, sourceType); if (tcf.isValid()) { if (tcf.annotateAlignment(viewport.getAlignment(), true)) { - tcoffeeColour.setEnabled(true); - tcoffeeColour.setSelected(true); + buildColourMenu(); changeColour(new TCoffeeColourScheme(viewport.getAlignment())); isAnnotation = true; statusBar @@ -5176,7 +4730,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { // some problem - if no warning its probable that the ID matching // process didn't work - JOptionPane + JvOptionPane .showMessageDialog( Desktop.desktop, tcf.getWarningMessage() == null ? MessageManager @@ -5184,7 +4738,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, : tcf.getWarningMessage(), MessageManager .getString("label.problem_reading_tcoffee_score_file"), - JOptionPane.WARNING_MESSAGE); + JvOptionPane.WARNING_MESSAGE); } } else @@ -5205,52 +4759,33 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // try to parse it as a features file if (format == null) { - format = new IdentifyFile().Identify(file, protocol); + format = new IdentifyFile().identify(file, sourceType); } - if (format.equalsIgnoreCase("JnetFile")) + if (FileFormat.Jnet.equals(format)) { - jalview.io.JPredFile predictions = new jalview.io.JPredFile( - file, protocol); - new JnetAnnotationMaker().add_annotation(predictions, + JPredFile predictions = new JPredFile(file, sourceType); + new JnetAnnotationMaker(); + JnetAnnotationMaker.add_annotation(predictions, viewport.getAlignment(), 0, false); + SequenceI repseq = viewport.getAlignment().getSequenceAt(0); + viewport.getAlignment().setSeqrep(repseq); + ColumnSelection cs = new ColumnSelection(); + cs.hideInsertionsFor(repseq); + viewport.setColumnSelection(cs); isAnnotation = true; } - else + // else if (IdentifyFile.FeaturesFile.equals(format)) + else if (FileFormat.Features.equals(format)) { - /* - * 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 + if (parseFeaturesFile(file, sourceType)) { alignPanel.paintAlignment(true); } } + else + { + new FileLoader().LoadFile(viewport, file, sourceType, format); + } } } if (isAnnotation) @@ -5272,42 +4807,87 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } catch (Exception x) { } - ; new OOMWarning( "loading data " - + (protocol != null ? (protocol.equals(FormatAdapter.PASTE) ? "from clipboard." - : "using " + protocol + " from " + file) + + (sourceType != null ? (sourceType == DataSourceType.PASTE ? "from clipboard." + : "using " + sourceType + " from " + file) : ".") + (format != null ? "(parsing as '" + format + "' file)" : ""), oom, Desktop.desktop); } } + /** + * Method invoked by the ChangeListener on the tabbed pane, in other words + * when a different tabbed pane is selected by the user or programmatically. + */ @Override public void tabSelectionChanged(int index) { if (index > -1) { - alignPanel = (AlignmentPanel) alignPanels.elementAt(index); + alignPanel = alignPanels.get(index); viewport = alignPanel.av; avc.setViewportAndAlignmentPanel(viewport, alignPanel); setMenusFromViewport(viewport); } + + /* + * 'focus' any colour slider that is open to the selected viewport + */ + if (viewport.getConservationSelected()) + { + SliderPanel.setConservationSlider(alignPanel, + viewport.getViewportColourScheme(), alignPanel.getViewName()); + } + else + { + SliderPanel.hideConservationSlider(); + } + if (viewport.getAbovePIDThreshold()) + { + SliderPanel.setPIDSliderSource(alignPanel, + viewport.getViewportColourScheme(), alignPanel.getViewName()); + } + else + { + SliderPanel.hidePIDSlider(); + } + + /* + * If there is a frame linked to this one in a SplitPane, switch it to the + * same view tab index. No infinite recursion of calls should happen, since + * tabSelectionChanged() should not get invoked on setting the selected + * index to an unchanged value. Guard against setting an invalid index + * before the new view peer tab has been created. + */ + final AlignViewportI peer = viewport.getCodingComplement(); + if (peer != null) + { + AlignFrame linkedAlignFrame = ((AlignViewport) peer).getAlignPanel().alignFrame; + if (linkedAlignFrame.tabbedPane.getTabCount() > index) + { + linkedAlignFrame.tabbedPane.setSelectedIndex(index); + } + } } + /** + * On right mouse click on view tab, prompt for and set new view name. + */ @Override public void tabbedPane_mousePressed(MouseEvent e) { - if (SwingUtilities.isRightMouseButton(e)) + if (e.isPopupTrigger()) { - String reply = JOptionPane.showInternalInputDialog(this, - MessageManager.getString("label.enter_view_name"), - MessageManager.getString("label.enter_view_name"), - JOptionPane.QUESTION_MESSAGE); + String msg = MessageManager.getString("label.enter_view_name"); + String reply = JvOptionPane.showInternalInputDialog(this, msg, msg, + JvOptionPane.QUESTION_MESSAGE); if (reply != null) { viewport.viewName = reply; + // TODO warn if reply is in getExistingViewNames()? tabbedPane.setTitleAt(tabbedPane.getSelectedIndex(), reply); } } @@ -5347,7 +4927,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override protected void showDbRefs_actionPerformed(ActionEvent e) { - viewport.setShowDbRefs(showDbRefsMenuitem.isSelected()); + viewport.setShowDBRefs(showDbRefsMenuitem.isSelected()); } /* @@ -5359,7 +4939,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override protected void showNpFeats_actionPerformed(ActionEvent e) { - viewport.setShowNpFeats(showNpFeatsMenuitem.isSelected()); + viewport.setShowNPFeats(showNpFeatsMenuitem.isSelected()); } /** @@ -5368,7 +4948,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * * @param av */ - public boolean closeView(AlignViewport av) + public boolean closeView(AlignViewportI av) { if (viewport == av) { @@ -5431,13 +5011,23 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { new Thread(new Runnable() { - @Override public void run() { - new jalview.ws.DBRefFetcher(alignPanel.av - .getSequenceSelection(), alignPanel.alignFrame) - .fetchDBRefs(false); + boolean isNucleotide = alignPanel.alignFrame.getViewport() + .getAlignment().isNucleotide(); + DBRefFetcher dbRefFetcher = new DBRefFetcher(alignPanel.av + .getSequenceSelection(), alignPanel.alignFrame, null, + alignPanel.alignFrame.featureSettings, isNucleotide); + dbRefFetcher.addListener(new FetchFinishedListenerI() + { + @Override + public void finished() + { + AlignFrame.this.setMenusForViewport(); + } + }); + dbRefFetcher.fetchDBRefs(false); } }).start(); @@ -5451,7 +5041,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void run() { - final jalview.ws.SequenceFetcher sf = SequenceFetcher + final jalview.ws.SequenceFetcher sf = jalview.gui.SequenceFetcher .getSequenceFetcherSingleton(me); javax.swing.SwingUtilities.invokeLater(new Runnable() { @@ -5505,16 +5095,33 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void run() { - new jalview.ws.DBRefFetcher(alignPanel.av - .getSequenceSelection(), - alignPanel.alignFrame, dassource) - .fetchDBRefs(false); + boolean isNucleotide = alignPanel.alignFrame + .getViewport().getAlignment() + .isNucleotide(); + DBRefFetcher dbRefFetcher = new DBRefFetcher( + alignPanel.av.getSequenceSelection(), + alignPanel.alignFrame, dassource, + alignPanel.alignFrame.featureSettings, + isNucleotide); + dbRefFetcher + .addListener(new FetchFinishedListenerI() + { + @Override + public void finished() + { + AlignFrame.this.setMenusForViewport(); + } + }); + dbRefFetcher.fetchDBRefs(false); } }).start(); } }); - fetchr.setToolTipText(JvSwingUtils.wrapTooltip(true, MessageManager.formatMessage("label.fetch_retrieve_from", new String[]{src.getDbName()}))); + fetchr.setToolTipText(JvSwingUtils.wrapTooltip(true, + MessageManager.formatMessage( + "label.fetch_retrieve_from", + new Object[] { src.getDbName() }))); dfetch.add(fetchr); comp++; } @@ -5525,8 +5132,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // fetch all entry DbSourceProxy src = otherdb.get(0); fetchr = new JMenuItem(MessageManager.formatMessage( - "label.fetch_all_param", new String[] - { src.getDbSource() })); + "label.fetch_all_param", + new Object[] { src.getDbSource() })); fetchr.addActionListener(new ActionListener() { @Override @@ -5538,20 +5145,42 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void run() { - new jalview.ws.DBRefFetcher(alignPanel.av - .getSequenceSelection(), - alignPanel.alignFrame, dassource) - .fetchDBRefs(false); + boolean isNucleotide = alignPanel.alignFrame + .getViewport().getAlignment() + .isNucleotide(); + DBRefFetcher dbRefFetcher = new DBRefFetcher( + alignPanel.av.getSequenceSelection(), + alignPanel.alignFrame, dassource, + alignPanel.alignFrame.featureSettings, + isNucleotide); + dbRefFetcher + .addListener(new FetchFinishedListenerI() + { + @Override + public void finished() + { + AlignFrame.this.setMenusForViewport(); + } + }); + dbRefFetcher.fetchDBRefs(false); } }).start(); } }); - fetchr.setToolTipText(JvSwingUtils.wrapTooltip(true, MessageManager.formatMessage("label.fetch_retrieve_from_all_sources", new String[]{Integer.valueOf(otherdb.size()).toString(), src.getDbSource(), src.getDbName()}))); + fetchr.setToolTipText(JvSwingUtils.wrapTooltip(true, + MessageManager.formatMessage( + "label.fetch_retrieve_from_all_sources", + new Object[] { + Integer.valueOf(otherdb.size()) + .toString(), src.getDbSource(), + src.getDbName() }))); dfetch.add(fetchr); comp++; // and then build the rest of the individual menus - ifetch = new JMenu(MessageManager.formatMessage("label.source_from_db_source", new String[]{src.getDbSource()})); + ifetch = new JMenu(MessageManager.formatMessage( + "label.source_from_db_source", + new Object[] { src.getDbSource() })); icomp = 0; String imname = null; int i = 0; @@ -5564,11 +5193,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, 0, 10) + "..." : dbname; if (imname == null) { - imname = MessageManager.formatMessage("label.from_msname", new String[]{sname}); + imname = MessageManager.formatMessage( + "label.from_msname", new Object[] { sname }); } fetchr = new JMenuItem(msname); - final DbSourceProxy[] dassrc = - { sproxy }; + final DbSourceProxy[] dassrc = { sproxy }; fetchr.addActionListener(new ActionListener() { @@ -5581,17 +5210,33 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void run() { - new jalview.ws.DBRefFetcher(alignPanel.av - .getSequenceSelection(), - alignPanel.alignFrame, dassrc) - .fetchDBRefs(false); + boolean isNucleotide = alignPanel.alignFrame + .getViewport().getAlignment() + .isNucleotide(); + DBRefFetcher dbRefFetcher = new DBRefFetcher( + alignPanel.av.getSequenceSelection(), + alignPanel.alignFrame, dassrc, + alignPanel.alignFrame.featureSettings, + isNucleotide); + dbRefFetcher + .addListener(new FetchFinishedListenerI() + { + @Override + public void finished() + { + AlignFrame.this.setMenusForViewport(); + } + }); + dbRefFetcher.fetchDBRefs(false); } }).start(); } }); fetchr.setToolTipText("" - + MessageManager.formatMessage("label.fetch_retrieve_from", new String[]{dbname})); + + MessageManager.formatMessage( + "label.fetch_retrieve_from", new Object[] + { dbname })); ifetch.add(fetchr); ++i; if (++icomp >= mcomp || i == (otherdb.size())) @@ -5646,10 +5291,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, viewport.firePropertyChange("alignment", null, al); } + @Override public void setShowSeqFeatures(boolean b) { - showSeqFeatures.setSelected(true); - viewport.setShowSequenceFeatures(true); + showSeqFeatures.setSelected(b); + viewport.setShowSequenceFeatures(b); } /* @@ -5755,10 +5401,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, alignPanel.paintAlignment(true); } } + public void clearAlignmentSeqRep() { // TODO refactor alignmentseqrep to controller - if (viewport.getAlignment().hasSeqrep()) { + if (viewport.getAlignment().hasSeqrep()) + { viewport.getAlignment().setSeqrep(null); PaintRefresher.Refresh(this, viewport.getSequenceSetId()); alignPanel.updateAnnotation(); @@ -5794,10 +5442,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (!viewport.getSequenceSetId().equals( alignmentPanel.av.getSequenceSetId())) { - throw new Error(MessageManager.getString("error.implementation_error_cannot_show_view_alignment_frame")); + throw new Error( + MessageManager + .getString("error.implementation_error_cannot_show_view_alignment_frame")); } if (tabbedPane != null - & alignPanels.indexOf(alignmentPanel) != tabbedPane + && tabbedPane.getTabCount() > 0 + && alignPanels.indexOf(alignmentPanel) != tabbedPane .getSelectedIndex()) { tabbedPane.setSelectedIndex(alignPanels.indexOf(alignmentPanel)); @@ -5817,9 +5468,21 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, protected void setAnnotationsVisibility(boolean visible, boolean forSequences, boolean forAlignment) { - for (AlignmentAnnotation aa : alignPanel.getAlignment() - .getAlignmentAnnotation()) + AlignmentAnnotation[] anns = alignPanel.getAlignment() + .getAlignmentAnnotation(); + if (anns == null) + { + return; + } + for (AlignmentAnnotation aa : anns) { + /* + * don't display non-positional annotations on an alignment + */ + if (aa.annotations == null) + { + continue; + } boolean apply = (aa.sequenceRef == null && forAlignment) || (aa.sequenceRef != null && forSequences); if (apply) @@ -5827,7 +5490,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, aa.visible = visible; } } - alignPanel.validateAnnotationDimensions(false); + alignPanel.validateAnnotationDimensions(true); alignPanel.alignmentChanged(); } @@ -5845,12 +5508,197 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * - * @return alignment panels in this alignemnt frame + * @return alignment panels in this alignment frame */ - public List getAlignPanels() + public List getAlignPanels() { return alignPanels == null ? Arrays.asList(alignPanel) : alignPanels; } + + /** + * Open a new alignment window, with the cDNA associated with this (protein) + * alignment, aligned as is the protein. + */ + protected void viewAsCdna_actionPerformed() + { + // TODO no longer a menu action - refactor as required + final AlignmentI alignment = getViewport().getAlignment(); + List mappings = alignment.getCodonFrames(); + if (mappings == null) + { + return; + } + List cdnaSeqs = new ArrayList(); + for (SequenceI aaSeq : alignment.getSequences()) + { + for (AlignedCodonFrame acf : mappings) + { + SequenceI dnaSeq = acf.getDnaForAaSeq(aaSeq.getDatasetSequence()); + if (dnaSeq != null) + { + /* + * There is a cDNA mapping for this protein sequence - add to new + * alignment. It will share the same dataset sequence as other mapped + * cDNA (no new mappings need to be created). + */ + final Sequence newSeq = new Sequence(dnaSeq); + newSeq.setDatasetSequence(dnaSeq); + cdnaSeqs.add(newSeq); + } + } + } + if (cdnaSeqs.size() == 0) + { + // show a warning dialog no mapped cDNA + return; + } + AlignmentI cdna = new Alignment(cdnaSeqs.toArray(new SequenceI[cdnaSeqs + .size()])); + GAlignFrame alignFrame = new AlignFrame(cdna, AlignFrame.DEFAULT_WIDTH, + AlignFrame.DEFAULT_HEIGHT); + cdna.alignAs(alignment); + String newtitle = "cDNA " + MessageManager.getString("label.for") + " " + + this.title; + Desktop.addInternalFrame(alignFrame, newtitle, + AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT); + } + + /** + * Set visibility of dna/protein complement view (available when shown in a + * split frame). + * + * @param show + */ + @Override + protected void showComplement_actionPerformed(boolean show) + { + SplitContainerI sf = getSplitViewContainer(); + if (sf != null) + { + sf.setComplementVisible(this, show); + } + } + + /** + * Generate the reverse (optionally complemented) of the selected sequences, + * and add them to the alignment + */ + @Override + protected void showReverse_actionPerformed(boolean complement) + { + AlignmentI al = null; + try + { + Dna dna = new Dna(viewport, viewport.getViewAsVisibleContigs(true)); + al = dna.reverseCdna(complement); + viewport.addAlignment(al, ""); + addHistoryItem(new EditCommand( + MessageManager.getString("label.add_sequences"), + Action.PASTE, al.getSequencesArray(), 0, al.getWidth(), + viewport.getAlignment())); + } catch (Exception ex) + { + System.err.println(ex.getMessage()); + return; + } + } + + /** + * Try to run a script in the Groovy console, having first ensured that this + * AlignFrame is set as currentAlignFrame in Desktop, to allow the script to + * be targeted at this alignment. + */ + @Override + protected void runGroovy_actionPerformed() + { + Jalview.setCurrentAlignFrame(this); + groovy.ui.Console console = Desktop.getGroovyConsole(); + if (console != null) + { + try + { + console.runScript(); + } catch (Exception ex) + { + System.err.println((ex.toString())); + JvOptionPane + .showInternalMessageDialog(Desktop.desktop, MessageManager + .getString("label.couldnt_run_groovy_script"), + MessageManager + .getString("label.groovy_support_failed"), + JvOptionPane.ERROR_MESSAGE); + } + } + else + { + System.err.println("Can't run Groovy script as console not found"); + } + } + + /** + * Hides columns containing (or not containing) a specified feature, provided + * that would not leave all columns hidden + * + * @param featureType + * @param columnsContaining + * @return + */ + public boolean hideFeatureColumns(String featureType, + boolean columnsContaining) + { + boolean notForHiding = avc.markColumnsContainingFeatures( + columnsContaining, false, false, featureType); + if (notForHiding) + { + if (avc.markColumnsContainingFeatures(!columnsContaining, false, + false, featureType)) + { + getViewport().hideSelectedColumns(); + return true; + } + } + return false; + } + + @Override + protected void selectHighlightedColumns_actionPerformed( + ActionEvent actionEvent) + { + // include key modifier check in case user selects from menu + avc.markHighlightedColumns( + (actionEvent.getModifiers() & ActionEvent.ALT_MASK) != 0, + true, + (actionEvent.getModifiers() & (ActionEvent.META_MASK | ActionEvent.CTRL_MASK)) != 0); + } + + /** + * Rebuilds the Colour menu, including any user-defined colours which have + * been loaded either on startup or during the session + */ + public void buildColourMenu() + { + colourMenu.removeAll(); + + colourMenu.add(applyToAllGroups); + colourMenu.add(textColour); + colourMenu.addSeparator(); + + ColourMenuHelper.addMenuItems(colourMenu, this, + viewport.getAlignment(), false); + + colourMenu.addSeparator(); + colourMenu.add(conservationMenuItem); + colourMenu.add(modifyConservation); + colourMenu.add(abovePIDThreshold); + colourMenu.add(modifyPID); + colourMenu.add(annotationColour); + + ColourSchemeI colourScheme = viewport.getGlobalColourScheme(); + String schemeName = colourScheme == null ? null : colourScheme + .getSchemeName(); + + ColourMenuHelper.setColourSelected(colourMenu, schemeName); + } } class PrintThread extends Thread