X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAlignFrame.java;h=11d4e7ab152f4ae30614d8a280863bc77796e412;hb=c70d42a1afc972ddb3757b9ec4cece3458d396a1;hp=6c080d1a7aafbc0f09d2dae11090b370ecd10332;hpb=afd09522be547c0fe9a3c1869e647dc616bc923c;p=jalview.git diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java old mode 100755 new mode 100644 index 6c080d1..a616dc0 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -1,32 +1,45 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7) - * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle - * + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors + * * This file is part of Jalview. - * + * * Jalview is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * Jalview is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with Jalview. If not, see . + * + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. */ package jalview.gui; -import jalview.analysis.AAFrequency; import jalview.analysis.AlignmentSorter; -import jalview.analysis.Conservation; +import jalview.analysis.AlignmentUtils; 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; import jalview.commands.OrderCommand; import jalview.commands.RemoveGapColCommand; import jalview.commands.RemoveGapsCommand; @@ -35,21 +48,24 @@ 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.ViewSelectionMenu.ViewSetProvider; import jalview.io.AlignmentProperties; import jalview.io.AnnotationFile; -import jalview.io.FeaturesFile; +import jalview.io.BioJsHTMLOutput; import jalview.io.FileLoader; import jalview.io.FormatAdapter; -import jalview.io.HTMLOutput; +import jalview.io.HtmlSvgOutput; import jalview.io.IdentifyFile; import jalview.io.JalviewFileChooser; import jalview.io.JalviewFileView; @@ -75,14 +91,16 @@ import jalview.schemes.TaylorColourScheme; import jalview.schemes.TurnColourScheme; import jalview.schemes.UserColourScheme; import jalview.schemes.ZappoColourScheme; +import jalview.structure.StructureSelectionManager; +import jalview.util.MessageManager; +import jalview.viewmodel.AlignmentViewport; import jalview.ws.jws1.Discoverer; import jalview.ws.jws2.Jws2Discoverer; +import jalview.ws.jws2.jabaws2.Jws2Instance; import jalview.ws.seqfetcher.DbSourceProxy; import java.awt.BorderLayout; -import java.awt.Color; import java.awt.Component; -import java.awt.GridLayout; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; @@ -96,6 +114,8 @@ import java.awt.dnd.DropTargetEvent; import java.awt.dnd.DropTargetListener; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +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; @@ -106,46 +126,49 @@ import java.beans.PropertyChangeEvent; import java.io.File; 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.Set; 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; /** * DOCUMENT ME! - * + * * @author $author$ * @version $Revision$ */ public class AlignFrame extends GAlignFrame implements DropTargetListener, - IProgressIndicator + IProgressIndicator, AlignViewControllerGuiI { - /** 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; - Vector alignPanels = new Vector(); + public AlignViewControllerI avc; + + List alignPanels = new ArrayList(); /** * Last format used to load or save alignments in this window @@ -159,7 +182,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * Creates a new AlignFrame object with specific width and height. - * + * * @param al * @param width * @param height @@ -172,7 +195,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * Creates a new AlignFrame object with specific width, height and * sequenceSetId - * + * * @param al * @param width * @param height @@ -187,7 +210,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * Creates a new AlignFrame object with specific width, height and * sequenceSetId - * + * * @param al * @param width * @param height @@ -202,7 +225,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * new alignment window with hidden columns - * + * * @param al * AlignmentI * @param hiddenColumns @@ -221,7 +244,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * Create alignment frame for al with hiddenColumns, a specific width and * height, and specific sequenceId - * + * * @param al * @param hiddenColumns * @param width @@ -238,7 +261,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * Create alignment frame for al with hiddenColumns, a specific width and * height, and specific sequenceId - * + * * @param al * @param hiddenColumns * @param width @@ -252,22 +275,44 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, int width, int height, String sequenceSetId, String viewId) { setSize(width, height); + + if (al.getDataset() == null) + { + al.setDataset(null); + } + viewport = new AlignViewport(al, hiddenColumns, sequenceSetId, viewId); 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(); } /** - * Make a new AlignFrame from exisiting alignmentPanels - * + * Make a new AlignFrame from existing alignmentPanels + * * @param ap * AlignmentPanel * @param av @@ -287,6 +332,13 @@ 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); @@ -316,9 +368,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, setGUINucleotide(viewport.getAlignment().isNucleotide()); } + this.alignPanel.av + .setShowAutocalculatedAbove(isShowAutoCalculatedAbove()); + setMenusFromViewport(viewport); buildSortByAnnotationScoresMenu(); - if (viewport.wrapAlignment) + buildTreeMenu(); + + if (viewport.getWrapAlignment()) { wrapMenuItem_actionPerformed(null); } @@ -330,12 +387,88 @@ 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); + } + } /** * Change the filename and format for the alignment, and enable the 'reload' * button functionality. - * + * * @param file * valid filename * @param format @@ -344,10 +477,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, public void setFileName(String file, String 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() @@ -360,7 +497,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, .getKeyCode() >= KeyEvent.VK_NUMPAD0 && evt .getKeyCode() <= KeyEvent.VK_NUMPAD9)) && Character.isDigit(evt.getKeyChar())) - alignPanel.seqPanel.numberPressed(evt.getKeyChar()); + { + alignPanel.getSeqPanel().numberPressed(evt.getKeyChar()); + } switch (evt.getKeyCode()) { @@ -372,39 +511,56 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, case KeyEvent.VK_DOWN: if (evt.isAltDown() || !viewport.cursorMode) + { moveSelectedSequences(false); + } if (viewport.cursorMode) - alignPanel.seqPanel.moveCursor(0, 1); + { + alignPanel.getSeqPanel().moveCursor(0, 1); + } break; case KeyEvent.VK_UP: if (evt.isAltDown() || !viewport.cursorMode) + { moveSelectedSequences(true); + } if (viewport.cursorMode) - alignPanel.seqPanel.moveCursor(0, -1); + { + alignPanel.getSeqPanel().moveCursor(0, -1); + } break; case KeyEvent.VK_LEFT: if (evt.isAltDown() || !viewport.cursorMode) - slideSequences(false, alignPanel.seqPanel.getKeyboardNo1()); + { + slideSequences(false, alignPanel.getSeqPanel().getKeyboardNo1()); + } else - alignPanel.seqPanel.moveCursor(-1, 0); + { + alignPanel.getSeqPanel().moveCursor(-1, 0); + } break; case KeyEvent.VK_RIGHT: if (evt.isAltDown() || !viewport.cursorMode) - slideSequences(true, alignPanel.seqPanel.getKeyboardNo1()); + { + slideSequences(true, alignPanel.getSeqPanel().getKeyboardNo1()); + } else - alignPanel.seqPanel.moveCursor(1, 0); + { + alignPanel.getSeqPanel().moveCursor(1, 0); + } break; case KeyEvent.VK_SPACE: if (viewport.cursorMode) { - alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown() - || evt.isShiftDown() || evt.isAltDown()); + alignPanel.getSeqPanel().insertGapAtCursor( + evt.isControlDown() || evt.isShiftDown() + || evt.isAltDown()); } break; @@ -427,8 +583,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } else { - alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown() - || evt.isShiftDown() || evt.isAltDown()); + alignPanel.getSeqPanel().deleteGapAtCursor( + evt.isControlDown() || evt.isShiftDown() + || evt.isAltDown()); } break; @@ -436,19 +593,19 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, case KeyEvent.VK_S: if (viewport.cursorMode) { - alignPanel.seqPanel.setCursorRow(); + alignPanel.getSeqPanel().setCursorRow(); } break; case KeyEvent.VK_C: if (viewport.cursorMode && !evt.isControlDown()) { - alignPanel.seqPanel.setCursorColumn(); + alignPanel.getSeqPanel().setCursorColumn(); } break; case KeyEvent.VK_P: if (viewport.cursorMode) { - alignPanel.seqPanel.setCursorPosition(); + alignPanel.getSeqPanel().setCursorPosition(); } break; @@ -456,46 +613,40 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, case KeyEvent.VK_COMMA: if (viewport.cursorMode) { - alignPanel.seqPanel.setCursorRowAndColumn(); + alignPanel.getSeqPanel().setCursorRowAndColumn(); } break; case KeyEvent.VK_Q: if (viewport.cursorMode) { - alignPanel.seqPanel.setSelectionAreaAtCursor(true); + alignPanel.getSeqPanel().setSelectionAreaAtCursor(true); } break; case KeyEvent.VK_M: if (viewport.cursorMode) { - alignPanel.seqPanel.setSelectionAreaAtCursor(false); + alignPanel.getSeqPanel().setSelectionAreaAtCursor(false); } break; case KeyEvent.VK_F2: viewport.cursorMode = !viewport.cursorMode; - statusBar.setText("Keyboard editing mode is " - + (viewport.cursorMode ? "on" : "off")); + statusBar.setText(MessageManager.formatMessage( + "label.keyboard_editing_mode", + new String[] { (viewport.cursorMode ? "on" : "off") })); if (viewport.cursorMode) { - alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes; - alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq; + alignPanel.getSeqPanel().seqCanvas.cursorX = viewport.startRes; + alignPanel.getSeqPanel().seqCanvas.cursorY = viewport.startSeq; } - alignPanel.seqPanel.seqCanvas.repaint(); + alignPanel.getSeqPanel().seqCanvas.repaint(); break; case KeyEvent.VK_F1: try { - ClassLoader cl = jalview.gui.Desktop.class.getClassLoader(); - java.net.URL url = javax.help.HelpSet.findHelpSet(cl, - "help/help"); - javax.help.HelpSet hs = new javax.help.HelpSet(cl, url); - - javax.help.HelpBroker hb = hs.createHelpBroker(); - hb.setCurrentID("home"); - hb.setDisplayed(true); + Help.showHelpWindow(); } catch (Exception ex) { ex.printStackTrace(); @@ -509,7 +660,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, break; } case KeyEvent.VK_PAGE_UP: - if (viewport.wrapAlignment) + if (viewport.getWrapAlignment()) { alignPanel.scrollUp(true); } @@ -520,7 +671,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } break; case KeyEvent.VK_PAGE_DOWN: - if (viewport.wrapAlignment) + if (viewport.getWrapAlignment()) { alignPanel.scrollUp(false); } @@ -540,14 +691,18 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { case KeyEvent.VK_LEFT: if (evt.isAltDown() || !viewport.cursorMode) + { viewport.firePropertyChange("alignment", null, viewport .getAlignment().getSequences()); + } break; case KeyEvent.VK_RIGHT: if (evt.isAltDown() || !viewport.cursorMode) + { viewport.firePropertyChange("alignment", null, viewport .getAlignment().getSequences()); + } break; } } @@ -557,8 +712,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, public void addAlignmentPanel(final AlignmentPanel ap, boolean newPanel) { ap.alignFrame = this; + avc = new jalview.controller.AlignViewController(this, viewport, + alignPanel); - alignPanels.addElement(ap); + alignPanels.add(ap); PaintRefresher.Register(ap, ap.av.getSequenceSetId()); @@ -601,7 +758,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); } @@ -645,7 +802,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); @@ -662,6 +819,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, }).start(); } + /** + * Configure menu items that vary according to whether the alignment is + * nucleotide or protein + * + * @param nucleotide + */ public void setGUINucleotide(boolean nucleotide) { showTranslation.setVisible(nucleotide); @@ -670,19 +833,19 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, 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(MessageManager + .getString(nucleotide ? "label.protein" : "label.nucleotide")); + setColourSelected(jalview.bin.Cache.getDefault( + nucleotide ? Preferences.DEFAULT_COLOUR_NUC + : Preferences.DEFAULT_COLOUR_PROT, "None")); } /** - * 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); @@ -691,27 +854,34 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * Need to call this method when tabs are selected for multiple views, or when * loading from Jalview2XML.java - * + * * @param av * AlignViewport */ void setMenusFromViewport(AlignViewport av) { padGapsMenuitem.setSelected(av.isPadGaps()); - colourTextMenuItem.setSelected(av.showColourText); + colourTextMenuItem.setSelected(av.isShowColourText()); abovePIDThreshold.setSelected(av.getAbovePIDThreshold()); conservationMenuItem.setSelected(av.getConservationSelected()); seqLimits.setSelected(av.getShowJVSuffix()); - idRightAlign.setSelected(av.rightAlignIds); - centreColumnLabelsMenuItem.setState(av.centreColumnLabels); - renderGapsMenuItem.setSelected(av.renderGaps); - wrapMenuItem.setSelected(av.wrapAlignment); - scaleAbove.setVisible(av.wrapAlignment); - scaleLeft.setVisible(av.wrapAlignment); - scaleRight.setVisible(av.wrapAlignment); - annotationPanelMenuItem.setState(av.showAnnotation); - viewBoxesMenuItem.setSelected(av.showBoxes); - viewTextMenuItem.setSelected(av.showText); + idRightAlign.setSelected(av.isRightAlignIds()); + 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 + */ + showAllSeqAnnotations.setEnabled(annotationPanelMenuItem.getState()); + hideAllSeqAnnotations.setEnabled(annotationPanelMenuItem.getState()); + showAllAlAnnotations.setEnabled(annotationPanelMenuItem.getState()); + hideAllAlAnnotations.setEnabled(annotationPanelMenuItem.getState()); + viewBoxesMenuItem.setSelected(av.getShowBoxes()); + viewTextMenuItem.setSelected(av.getShowText()); showNonconservedMenuItem.setSelected(av.getShowUnconserved()); showGroupConsensus.setSelected(av.isShowGroupConsensus()); showGroupConservation.setSelected(av.isShowGroupConservation()); @@ -722,11 +892,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, setColourSelected(ColourSchemeProperty.getColourName(av .getGlobalColourScheme())); - showSeqFeatures.setSelected(av.showSequenceFeatures); - hiddenMarkers.setState(av.showHiddenMarkers); + showSeqFeatures.setSelected(av.isShowSequenceFeatures()); + 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); @@ -734,110 +904,43 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, rnahelicesColour .setSelected(av.getGlobalColourScheme() instanceof jalview.schemes.RNAHelicesColour); setShowProductsEnabled(); - updateEditMenuBar(); } - // methods for implementing IProgressIndicator - // need to refactor to a reusable stub class - Hashtable progressBars, progressBarHandlers; + + private IProgressIndicator progressBar; /* * (non-Javadoc) - * + * * @see jalview.gui.IProgressIndicator#setProgressBar(java.lang.String, long) */ @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( - "call setProgressBar before registering the progress bar's handler."); - } - progressBarHandlers.put(new Long(id), handler); - final JPanel progressPanel = (JPanel) progressBars.get(new Long(id)); - if (handler.canCancel()) - { - JButton cancel = new JButton("Cancel"); - final IProgressIndicator us = this; - cancel.addActionListener(new ActionListener() - { - - @Override - public void actionPerformed(ActionEvent e) - { - handler.cancelActivity(id); - us.setProgressBar( - "Cancelled " - + ((JLabel) progressPanel.getComponent(0)) - .getText(), id); - } - }); - progressPanel.add(cancel, BorderLayout.EAST); - } + progressBar.registerHandler(id, handler); } /** - * + * * @return true if any progress bars are still active */ @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); } /* @@ -850,7 +953,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, public FeatureRenderer getFeatureRenderer() { - return alignPanel.seqPanel.seqCanvas.getFeatureRenderer(); + return alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer(); } @Override @@ -880,6 +983,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, for (int i = 0; i < frames.length; i++) { if (frames[i] instanceof AlignFrame && frames[i] != this + && ((AlignFrame) frames[i]).fileName != null && ((AlignFrame) frames[i]).fileName.equals(fileName)) { try @@ -934,7 +1038,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 @@ -961,7 +1066,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -975,21 +1080,31 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, currentFileFormat, false); chooser.setFileView(new JalviewFileView()); - chooser.setDialogTitle("Save Alignment to file"); - chooser.setToolTipText("Save"); + chooser.setDialogTitle(MessageManager + .getString("label.save_alignment_to_file")); + chooser.setToolTipText(MessageManager.getString("action.save")); int value = chooser.showSaveDialog(this); if (value == JalviewFileChooser.APPROVE_OPTION) { currentFileFormat = chooser.getSelectedFormat(); - if (currentFileFormat == null) + while (currentFileFormat == null) { - JOptionPane.showInternalMessageDialog(Desktop.desktop, - "You must select a file format before saving!", - "File format not specified", JOptionPane.WARNING_MESSAGE); + JOptionPane + .showInternalMessageDialog( + Desktop.desktop, + MessageManager + .getString("label.select_file_format_before_saving"), + MessageManager + .getString("label.file_format_not_specified"), + JOptionPane.WARNING_MESSAGE); + currentFileFormat = chooser.getSelectedFormat(); value = chooser.showSaveDialog(this); - return; + if (value != JalviewFileChooser.APPROVE_OPTION) + { + return; + } } fileName = chooser.getSelectedFile().getPath(); @@ -1021,10 +1136,11 @@ 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("Successfully saved to file: " + fileName + " in " - + format + " format."); + statusBar.setText(MessageManager.formatMessage( + "label.successfully_saved_to_file_in_format", new Object[] { + fileName, format })); } else @@ -1033,35 +1149,27 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { 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 + if (!Jalview.isHeadlessMode()) + { + saveAs_actionPerformed(null); + } return false; } - String[] omitHidden = null; - - if (viewport.hasHiddenColumns()) + AlignmentExportData exportData = getAlignmentForExport(format, + viewport, null); + if (exportData.getSettings().isCancelled()) { - int reply = JOptionPane - .showInternalConfirmDialog( - Desktop.desktop, - "The Alignment contains hidden columns." - + "\nDo you want to save only the visible alignment?", - "Save / Omit Hidden Columns", - JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE); - - if (reply == JOptionPane.YES_OPTION) - { - omitHidden = viewport.getViewAsString(false); - } + return false; } - FormatAdapter f = new FormatAdapter(); + FormatAdapter f = new FormatAdapter(alignPanel, + exportData.getSettings()); String output = f.formatSequences( format, - viewport.getAlignment(), // class cast exceptions will + 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) @@ -1078,8 +1186,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, out.print(output); out.close(); this.setTitle(file); - statusBar.setText("Successfully saved to file: " + fileName - + " in " + format + " format."); + statusBar.setText(MessageManager.formatMessage( + "label.successfully_saved_to_file_in_format", + new Object[] { fileName, format })); } catch (Exception ex) { success = false; @@ -1090,8 +1199,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (!success) { - JOptionPane.showInternalMessageDialog(this, "Couldn't save file: " - + fileName, "Error Saving File", JOptionPane.WARNING_MESSAGE); + JOptionPane.showInternalMessageDialog(this, MessageManager + .formatMessage("label.couldnt_save_file", + new Object[] { fileName }), MessageManager + .getString("label.error_saving_file"), + JOptionPane.WARNING_MESSAGE); } return success; @@ -1114,42 +1226,33 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @Override protected void outputText_actionPerformed(ActionEvent e) { - String[] omitHidden = null; - if (viewport.hasHiddenColumns()) + AlignmentExportData exportData = getAlignmentForExport( + e.getActionCommand(), viewport, null); + if (exportData.getSettings().isCancelled()) { - int reply = JOptionPane - .showInternalConfirmDialog( - Desktop.desktop, - "The Alignment contains hidden columns." - + "\nDo you want to output only the visible alignment?", - "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())); - Desktop.addInternalFrame(cap, - "Alignment output - " + e.getActionCommand(), 600, 500); + cap.setText(new FormatAdapter(alignPanel, exportData.getSettings()) + .formatSequences(e.getActionCommand(), + exportData.getAlignment(), + exportData.getOmitHidden(), + exportData.getStartEndPostions(), + viewport.getColumnSelection())); + Desktop.addInternalFrame(cap, MessageManager.formatMessage( + "label.alignment_output_command", + new Object[] { e.getActionCommand() }), 600, 500); } catch (OutOfMemoryError oom) { new OOMWarning("Outputting alignment as " + e.getActionCommand(), oom); @@ -1158,18 +1261,116 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } + public static AlignmentExportData getAlignmentForExport( + String exportFormat, AlignViewportI viewport, + AlignExportSettingI exportSettings) + { + AlignmentI alignmentToExport = null; + AlignExportSettingI settings = exportSettings; + String[] omitHidden = null; + int[] alignmentStartEnd = new int[2]; + + HiddenSequences hiddenSeqs = viewport.getAlignment() + .getHiddenSequences(); + + alignmentToExport = viewport.getAlignment(); + alignmentStartEnd = new int[] { 0, alignmentToExport.getWidth() - 1 }; + + boolean hasHiddenSeqs = hiddenSeqs.getSize() > 0; + if (settings == null) + { + settings = new AlignExportSettings(hasHiddenSeqs, + viewport.hasHiddenColumns(), exportFormat); + } + // settings.isExportAnnotations(); + + if (viewport.hasHiddenColumns() && !settings.isExportHiddenColumns()) + { + omitHidden = viewport.getViewAsString(false); + } + + if (hasHiddenSeqs && settings.isExportHiddenSequences()) + { + alignmentToExport = hiddenSeqs.getFullAlignment(); + } + else + { + alignmentToExport = viewport.getAlignment(); + alignmentStartEnd = getStartEnd(alignmentStartEnd, viewport + .getColumnSelection().getHiddenColumns()); + } + AlignmentExportData ed = new AlignmentExportData(alignmentToExport, + omitHidden, alignmentStartEnd, settings); + return ed; + } + + public static int[] getStartEnd(int[] aligmentStartEnd, + List hiddenCols) + { + int startPos = aligmentStartEnd[0]; + int endPos = aligmentStartEnd[1]; + + int[] lowestRange = new int[] { -1, -1 }; + int[] higestRange = new int[] { -1, -1 }; + + for (int[] hiddenCol : hiddenCols) + { + lowestRange = (hiddenCol[0] <= startPos) ? hiddenCol : lowestRange; + higestRange = (hiddenCol[1] >= endPos) ? hiddenCol : higestRange; + } + + if (lowestRange[0] == -1 && lowestRange[1] == -1) + { + startPos = aligmentStartEnd[0]; + } + else + { + startPos = lowestRange[1] + 1; + } + + if (higestRange[0] == -1 && higestRange[1] == -1) + { + endPos = aligmentStartEnd[1]; + } + else + { + endPos = higestRange[0] - 1; + } + + // System.out.println("Export range : " + startPos + " - " + endPos); + return new int[] { startPos, endPos }; + } + + public static void main(String[] args) + { + ArrayList hiddenCols = new ArrayList(); + hiddenCols.add(new int[] { 0, 0 }); + hiddenCols.add(new int[] { 6, 9 }); + hiddenCols.add(new int[] { 11, 12 }); + hiddenCols.add(new int[] { 33, 33 }); + hiddenCols.add(new int[] { 50, 50 }); + + int[] x = getStartEnd(new int[] { 0, 50 }, hiddenCols); + // System.out.println("Export range : " + x[0] + " - " + x[1]); + } + /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @Override protected void htmlMenuItem_actionPerformed(ActionEvent e) { - new HTMLOutput(alignPanel, - alignPanel.seqPanel.seqCanvas.getSequenceRenderer(), - alignPanel.seqPanel.seqCanvas.getFeatureRenderer()); + new HtmlSvgOutput(null, alignPanel); + } + + @Override + public void bioJSMenuItem_actionPerformed(ActionEvent e) + { + BioJsHTMLOutput bjs = new BioJsHTMLOutput(alignPanel, this); + bjs.exportJalviewAlignmentAsBioJsHtmlFile(); } public void createImageMap(File file, String image) @@ -1179,7 +1380,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -1191,7 +1392,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -1202,6 +1403,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } @Override + public void createSVG(File f) + { + alignPanel.makeSVG(f); + } + + @Override public void pageSetup_actionPerformed(ActionEvent e) { PrinterJob printJob = PrinterJob.getPrinterJob(); @@ -1210,7 +1417,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -1231,11 +1438,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void exportAnnotations_actionPerformed(ActionEvent e) { - new AnnotationExporter().exportAnnotations(alignPanel, - viewport.showAnnotation ? viewport.getAlignment() - .getAlignmentAnnotation() : null, viewport - .getAlignment().getGroups(), ((Alignment) viewport - .getAlignment()).alignmentProperties); + new AnnotationExporter().exportAnnotations(alignPanel); } @Override @@ -1245,8 +1448,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, JalviewFileChooser chooser = new JalviewFileChooser( jalview.bin.Cache.getProperty("LAST_DIRECTORY")); chooser.setFileView(new JalviewFileView()); - chooser.setDialogTitle("Load Jalview Annotations or Features File"); - chooser.setToolTipText("Load Jalview Annotations / Features file"); + chooser.setDialogTitle(MessageManager + .getString("label.load_jalview_annotations")); + chooser.setToolTipText(MessageManager + .getString("label.load_jalview_annotations")); int value = chooser.showOpenDialog(null); @@ -1262,7 +1467,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * Close the current view or all views in the alignment frame. If the frame * only contains one view then the alignment will be removed from memory. - * + * * @param closeAllTabs */ @Override @@ -1285,7 +1490,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(); } } @@ -1298,6 +1503,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) @@ -1307,22 +1516,17 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } /** - * close alignPanel2 and shuffle tabs appropriately. - * - * @param alignPanel2 + * Close the specified panel and close up tabs appropriately. + * + * @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(); @@ -1342,38 +1546,43 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, void updateEditMenuBar() { - if (viewport.historyList.size() > 0) + if (viewport.getHistoryList().size() > 0) { undoMenuItem.setEnabled(true); - CommandI command = (CommandI) viewport.historyList.peek(); - undoMenuItem.setText("Undo " + command.getDescription()); + CommandI command = viewport.getHistoryList().peek(); + undoMenuItem.setText(MessageManager.formatMessage( + "label.undo_command", + new Object[] { command.getDescription() })); } else { undoMenuItem.setEnabled(false); - undoMenuItem.setText("Undo"); + undoMenuItem.setText(MessageManager.getString("action.undo")); } - if (viewport.redoList.size() > 0) + if (viewport.getRedoList().size() > 0) { redoMenuItem.setEnabled(true); - CommandI command = (CommandI) viewport.redoList.peek(); - redoMenuItem.setText("Redo " + command.getDescription()); + CommandI command = viewport.getRedoList().peek(); + redoMenuItem.setText(MessageManager.formatMessage( + "label.redo_command", + new Object[] { command.getDescription() })); } else { redoMenuItem.setEnabled(false); - redoMenuItem.setText("Redo"); + redoMenuItem.setText(MessageManager.getString("action.redo")); } } + @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 @@ -1384,45 +1593,46 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } /** - * + * * @return alignment objects for all views */ AlignmentI[] getViewAlignments() { 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; } /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @Override protected void undoMenuItem_actionPerformed(ActionEvent e) { - if (viewport.historyList.empty()) + if (viewport.getHistoryList().isEmpty()) + { return; - CommandI command = (CommandI) 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) @@ -1445,23 +1655,23 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @Override protected void redoMenuItem_actionPerformed(ActionEvent e) { - if (viewport.redoList.size() < 1) + if (viewport.getRedoList().size() < 1) { return; } - CommandI command = (CommandI) 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) @@ -1483,9 +1693,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 @@ -1494,16 +1704,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; } } @@ -1527,7 +1737,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param up * DOCUMENT ME! */ @@ -1539,17 +1749,18 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { return; } - viewport.getAlignment().moveSelectedSequencesByOne(sg, viewport.getHiddenRepSequences(), up); + viewport.getAlignment().moveSelectedSequencesByOne(sg, + viewport.getHiddenRepSequences(), up); alignPanel.paintAlignment(true); } synchronized void slideSequences(boolean right, int size) { - List sg = new Vector(); + List sg = new ArrayList(); if (viewport.cursorMode) { sg.add(viewport.getAlignment().getSequenceAt( - alignPanel.seqPanel.seqCanvas.cursorY)); + alignPanel.getSeqPanel().seqCanvas.cursorY)); } else if (viewport.getSelectionGroup() != null && viewport.getSelectionGroup().getSize() != viewport @@ -1564,42 +1775,58 @@ 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))) - invertGroup.add(viewport.getAlignment().getSequenceAt(i)); + if (!sg.contains(seq)) + { + invertGroup.add(seq); + } } SequenceI[] seqs1 = sg.toArray(new SequenceI[0]); SequenceI[] seqs2 = new SequenceI[invertGroup.size()]; for (int i = 0; i < invertGroup.size(); i++) - seqs2[i] = (SequenceI) invertGroup.elementAt(i); + { + seqs2[i] = invertGroup.get(i); + } SlideSequencesCommand ssc; if (right) + { ssc = new SlideSequencesCommand("Slide Sequences", seqs2, seqs1, size, viewport.getGapCharacter()); + } else + { ssc = new SlideSequencesCommand("Slide Sequences", seqs1, seqs2, size, viewport.getGapCharacter()); + } int groupAdjustment = 0; if (ssc.getGapsInsertedBegin() && right) { if (viewport.cursorMode) - alignPanel.seqPanel.moveCursor(size, 0); + { + alignPanel.getSeqPanel().moveCursor(size, 0); + } else + { groupAdjustment = size; + } } else if (!ssc.getGapsInsertedBegin() && !right) { if (viewport.cursorMode) - alignPanel.seqPanel.moveCursor(-size, 0); + { + alignPanel.getSeqPanel().moveCursor(-size, 0); + } else + { groupAdjustment = -size; + } } if (groupAdjustment != 0) @@ -1610,24 +1837,32 @@ 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()); } if (!appendHistoryItem) + { addHistoryItem(ssc); + } repaint(); } /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -1650,7 +1885,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } String output = new FormatAdapter().formatSequences("Fasta", seqs, - omitHidden); + omitHidden, null); StringSelection ss = new StringSelection(output); @@ -1670,33 +1905,32 @@ 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 }; - statusBar.setText("Copied " + seqs.length + " sequences to clipboard."); + Desktop.jalviewClipboard = new Object[] { seqs, + viewport.getAlignment().getDataset(), hiddenColumns }; + statusBar.setText(MessageManager.formatMessage( + "label.copied_sequences_to_clipboard", new Object[] { Integer + .valueOf(seqs.length).toString() })); } /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -1708,7 +1942,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -1720,7 +1954,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * Paste contents of Jalview clipboard - * + * * @param newAlignment * true to paste to a new alignment, otherwise add to this. */ @@ -1781,6 +2015,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } int alwidth = 0; + ArrayList newGraphGroups = new ArrayList(); + int fgroup = -1; if (newAlignment) { @@ -1848,6 +2084,17 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { newDs.clear(); // tidy up } + if (alignment.getAlignmentAnnotation() != null) + { + for (AlignmentAnnotation alan : alignment + .getAlignmentAnnotation()) + { + if (alan.graphGroup > fgroup) + { + fgroup = alan.graphGroup; + } + } + } if (pastedal.getAlignmentAnnotation() != null) { // Add any annotation attached to alignment. @@ -1858,6 +2105,22 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (alann[i].sequenceRef == null && !alann[i].autoCalculated) { AlignmentAnnotation newann = new AlignmentAnnotation(alann[i]); + if (newann.graphGroup > -1) + { + if (newGraphGroups.size() <= newann.graphGroup + || newGraphGroups.get(newann.graphGroup) == null) + { + for (int q = newGraphGroups.size(); q <= newann.graphGroup; q++) + { + newGraphGroups.add(q, null); + } + newGraphGroups.set(newann.graphGroup, new Integer( + ++fgroup)); + } + newann.graphGroup = newGraphGroups.get(newann.graphGroup) + .intValue(); + } + newann.padAnnotation(alwidth); alignment.addAnnotation(newann); } @@ -1869,19 +2132,40 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // ///// // ADD HISTORY ITEM // - addHistoryItem(new EditCommand("Add sequences", EditCommand.PASTE, - sequences, 0, alignment.getWidth(), alignment)); + addHistoryItem(new EditCommand( + MessageManager.getString("label.add_sequences"), + Action.PASTE, sequences, 0, alignment.getWidth(), alignment)); } // Add any annotations attached to sequences for (int i = 0; i < sequences.length; i++) { if (sequences[i].getAnnotation() != null) { + AlignmentAnnotation newann; for (int a = 0; a < sequences[i].getAnnotation().length; a++) { annotationAdded = true; - sequences[i].getAnnotation()[a].adjustForAlignment(); - sequences[i].getAnnotation()[a].padAnnotation(alwidth); + newann = sequences[i].getAnnotation()[a]; + newann.adjustForAlignment(); + newann.padAnnotation(alwidth); + if (newann.graphGroup > -1) + { + if (newann.graphGroup > -1) + { + if (newGraphGroups.size() <= newann.graphGroup + || newGraphGroups.get(newann.graphGroup) == null) + { + for (int q = newGraphGroups.size(); q <= newann.graphGroup; q++) + { + newGraphGroups.add(q, null); + } + newGraphGroups.set(newann.graphGroup, new Integer( + ++fgroup)); + } + newann.graphGroup = newGraphGroups.get(newann.graphGroup) + .intValue(); + } + } alignment.addAnnotation(sequences[i].getAnnotation()[a]); // annotation // was // duplicated @@ -1904,7 +2188,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { AlignmentAnnotation sann[] = sequences[i].getAnnotation(); if (sann == null) + { continue; + } for (int avnum = 0; avnum < alview.length; avnum++) { if (alview[avnum] != alignment) @@ -1921,6 +2207,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, newann.padAnnotation(avwidth); alview[avnum].addAnnotation(newann); // annotation was // duplicated earlier + // TODO JAL-1145 graphGroups are not updated for sequence + // annotation added to several views. This may cause + // strangeness alview[avnum].setAnnotationIndex(newann, a); } } @@ -1930,6 +2219,17 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } viewport.firePropertyChange("alignment", null, alignment.getSequences()); + if (alignPanels != null) + { + for (AlignmentPanel ap : alignPanels) + { + ap.validateAnnotationDimensions(false); + } + } + else + { + alignPanel.validateAnnotationDimensions(false); + } } else @@ -1941,19 +2241,19 @@ 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]); } } // >>>This is a fix for the moment, until a better solution is // found!!<<< - af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer() + af.alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer() .transferSettings( - alignPanel.seqPanel.seqCanvas.getFeatureRenderer()); + alignPanel.getSeqPanel().seqCanvas + .getFeatureRenderer()); // TODO: maintain provenance of an alignment, rather than just make the // title a concatenation of operations. @@ -1987,9 +2287,63 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } + @Override + protected void expand_newalign(ActionEvent e) + { + try + { + AlignmentI alignment = AlignmentUtils.expandContext(getViewport() + .getAlignment(), -1); + AlignFrame af = new AlignFrame(alignment, DEFAULT_WIDTH, + DEFAULT_HEIGHT); + String newtitle = new String("Flanking alignment"); + + if (Desktop.jalviewClipboard != null + && Desktop.jalviewClipboard[2] != null) + { + List hc = (List) Desktop.jalviewClipboard[2]; + for (int region[] : hc) + { + af.viewport.hideColumns(region[0], region[1]); + } + } + + // >>>This is a fix for the moment, until a better solution is + // found!!<<< + af.alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer() + .transferSettings( + alignPanel.getSeqPanel().seqCanvas + .getFeatureRenderer()); + + // TODO: maintain provenance of an alignment, rather than just make the + // title a concatenation of operations. + { + if (title.startsWith("Copied sequences")) + { + newtitle = title; + } + else + { + newtitle = newtitle.concat("- from " + title); + } + } + + Desktop.addInternalFrame(af, newtitle, DEFAULT_WIDTH, DEFAULT_HEIGHT); + + } catch (Exception ex) + { + ex.printStackTrace(); + System.out.println("Exception whilst pasting: " + ex); + // could be anything being pasted in here + } catch (OutOfMemoryError oom) + { + new OOMWarning("Viewing flanking region of alignment", oom); + } + } + /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -2002,7 +2356,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -2016,32 +2370,35 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, return; } - Vector seqs = new Vector(); - SequenceI seq; - for (int i = 0; i < sg.getSize(); i++) - { - seq = sg.getSequenceAt(i); - seqs.addElement(seq); - } - - // If the cut affects all sequences, remove highlighted columns + /* + * If the cut affects all sequences, warn, remove highlighted columns + */ if (sg.getSize() == viewport.getAlignment().getHeight()) { + boolean isEntireAlignWidth = (((sg.getEndRes() - sg.getStartRes()) + 1) == viewport + .getAlignment().getWidth()) ? true : false; + if (isEntireAlignWidth) + { + 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) + { + 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] = (SequenceI) seqs.elementAt(i); - } - - /* - * //ADD HISTORY ITEM - */ - addHistoryItem(new EditCommand("Cut Sequences", EditCommand.CUT, cut, - sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1, + addHistoryItem(new EditCommand( + MessageManager.getString("label.cut_sequences"), Action.CUT, + cut, sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1, viewport.getAlignment())); viewport.setSelectionGroup(null); @@ -2063,24 +2420,24 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @Override protected void deleteGroups_actionPerformed(ActionEvent e) { - viewport.getAlignment().deleteAllGroups(); - viewport.sequenceColours = null; - viewport.setSelectionGroup(null); - PaintRefresher.Refresh(this, viewport.getSequenceSetId()); - alignPanel.updateAnnotation(); - alignPanel.paintAlignment(true); + if (avc.deleteGroups()) + { + PaintRefresher.Refresh(this, viewport.getSequenceSetId()); + alignPanel.updateAnnotation(); + alignPanel.paintAlignment(true); + } } /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -2103,7 +2460,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -2112,14 +2469,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { if (viewport.cursorMode) { - alignPanel.seqPanel.keyboardNo1 = null; - alignPanel.seqPanel.keyboardNo2 = null; + alignPanel.getSeqPanel().keyboardNo1 = null; + alignPanel.getSeqPanel().keyboardNo2 = null; } viewport.setSelectionGroup(null); viewport.getColumnSelection().clear(); viewport.setSelectionGroup(null); - alignPanel.seqPanel.seqCanvas.highlightSearchResults(null); - alignPanel.idPanel.idCanvas.searchResults = null; + alignPanel.getSeqPanel().seqCanvas.highlightSearchResults(null); + alignPanel.getIdPanel().getIdCanvas().searchResults = null; alignPanel.paintAlignment(true); PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId()); viewport.sendSelection(); @@ -2127,7 +2484,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -2163,7 +2520,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -2175,7 +2532,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -2190,7 +2547,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, ColumnSelection colSel = viewport.getColumnSelection(); int column; - if (colSel.size() > 0) + if (!colSel.isEmpty()) { if (trimLeft) { @@ -2215,25 +2572,24 @@ 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("Removed " + trimRegion.getSize() + " columns."); + statusBar.setText(MessageManager.formatMessage( + "label.removed_columns", + new String[] { Integer.valueOf(trimRegion.getSize()) + .toString() })); addHistoryItem(trimRegion); - for (SequenceGroup sg :viewport.getAlignment().getGroups()) + for (SequenceGroup sg : viewport.getAlignment().getGroups()) { if ((trimLeft && !sg.adjustForRemoveLeft(column)) || (!trimLeft && !sg.adjustForRemoveRight(column))) @@ -2249,7 +2605,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -2277,8 +2633,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, addHistoryItem(removeGapCols); - statusBar.setText("Removed " + removeGapCols.getSize() - + " empty columns."); + statusBar.setText(MessageManager.formatMessage( + "label.removed_empty_columns", + new Object[] { Integer.valueOf(removeGapCols.getSize()) + .toString() })); // This is to maintain viewport position on first residue // of first sequence @@ -2297,7 +2655,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -2336,7 +2694,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -2348,19 +2706,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, .getSequences()); } - // else - { - // if (justifySeqs>0) - { - // alignment.justify(justifySeqs!=RIGHT_JUSTIFY); - } - } - - // } - /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -2370,78 +2718,89 @@ 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) { - viewTitle = "View"; + viewTitle = MessageManager.getString("action.view"); addFirstIndex = true; } else @@ -2449,44 +2808,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++) - { - if (comps.elementAt(i) instanceof AlignmentPanel) - { - AlignmentPanel ap = (AlignmentPanel) comps.elementAt(i); - if (!existingNames.contains(ap.av.viewName)) - { - existingNames.addElement(ap.av.viewName); - } - } - } + + List existingNames = getExistingViewNames(comps); while (existingNames.contains(newViewName)) { newViewName = viewTitle + " " + (++index); } + return newViewName; + } - newap.av.viewName = newViewName; - - addAlignmentPanel(newap, true); - - if (alignPanels.size() == 2) + /** + * 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) { - viewport.gatherViewsHere = true; + if (comp instanceof AlignmentPanel) + { + AlignmentPanel ap = (AlignmentPanel) comp; + if (!existingNames.contains(ap.av.viewName)) + { + existingNames.add(ap.av.viewName); + } + } } - tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1); - return newap; + return existingNames; } + /** + * Explode tabbed views into separate windows. + */ @Override public void expandViews_actionPerformed(ActionEvent e) { Desktop.instance.explodeViews(this); } + /** + * Gather views in separate windows back into a tabbed presentation. + */ @Override public void gatherViews_actionPerformed(ActionEvent e) { @@ -2495,7 +2865,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -2507,7 +2877,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -2516,43 +2886,49 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { viewport.setShowJVSuffix(seqLimits.isSelected()); - alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel - .calculateIdWidth()); + alignPanel.getIdPanel().getIdCanvas() + .setPreferredSize(alignPanel.calculateIdWidth()); alignPanel.paintAlignment(true); } @Override public void idRightAlign_actionPerformed(ActionEvent e) { - viewport.rightAlignIds = idRightAlign.isSelected(); + viewport.setRightAlignIds(idRightAlign.isSelected()); alignPanel.paintAlignment(true); } @Override public void centreColumnLabels_actionPerformed(ActionEvent e) { - viewport.centreColumnLabels = centreColumnLabelsMenuItem.getState(); + viewport.setCentreColumnLabels(centreColumnLabelsMenuItem.getState()); alignPanel.paintAlignment(true); } /* * (non-Javadoc) - * + * * @see jalview.jbgui.GAlignFrame#followHighlight_actionPerformed() */ @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.seqPanel.seqCanvas.searchResults, false); + alignPanel.getSeqPanel().seqCanvas.searchResults, false); } } /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -2565,7 +2941,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -2576,7 +2952,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 @@ -2590,18 +2966,19 @@ 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); } /** * called by key handler and the hide all/show all menu items - * + * * @param toggleSeqs * @param toggleCols */ @@ -2671,7 +3048,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /* * (non-Javadoc) - * + * * @see * jalview.jbgui.GAlignFrame#hideAllButSelection_actionPerformed(java.awt. * event.ActionEvent) @@ -2680,11 +3057,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, public void hideAllButSelection_actionPerformed(ActionEvent e) { toggleHiddenRegions(false, false); + viewport.sendSelection(); } /* * (non-Javadoc) - * + * * @see * jalview.jbgui.GAlignFrame#hideAllSelection_actionPerformed(java.awt.event * .ActionEvent) @@ -2697,11 +3075,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, viewport.hideAllSelectedSeqs(); viewport.hideSelectedColumns(); alignPanel.paintAlignment(true); + viewport.sendSelection(); } /* * (non-Javadoc) - * + * * @see * jalview.jbgui.GAlignFrame#showAllhidden_actionPerformed(java.awt.event. * ActionEvent) @@ -2712,6 +3091,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, viewport.showAllHiddenColumns(); viewport.showAllHiddenSeqs(); alignPanel.paintAlignment(true); + viewport.sendSelection(); } @Override @@ -2719,6 +3099,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { viewport.hideSelectedColumns(); alignPanel.paintAlignment(true); + viewport.sendSelection(); } @Override @@ -2730,7 +3111,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -2743,7 +3124,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -2756,7 +3137,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -2769,7 +3150,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -2782,7 +3163,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -2795,7 +3176,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -2809,6 +3190,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) @@ -2827,7 +3214,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * Set or clear 'Show Sequence Features' - * + * * @param evt * DOCUMENT ME! */ @@ -2844,7 +3231,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * Set or clear 'Show Sequence Features' - * + * * @param evt * DOCUMENT ME! */ @@ -2853,7 +3240,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { viewport.setShowSequenceFeaturesHeight(showSeqFeaturesHeight .isSelected()); - if (viewport.getShowSequenceFeaturesHeight()) + if (viewport.isShowSequenceFeaturesHeight()) { // ensure we're actually displaying features viewport.setShowSequenceFeatures(true); @@ -2867,16 +3254,24 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } /** - * DOCUMENT ME! - * + * Action on toggle of the 'Show annotations' menu item. This shows or hides + * the annotations panel as a whole. + * + * The options to show/hide all annotations should be enabled when the panel + * is shown, and disabled when the panel is hidden. + * * @param e - * DOCUMENT ME! */ @Override public void annotationPanelMenuItem_actionPerformed(ActionEvent e) { - viewport.setShowAnnotation(annotationPanelMenuItem.isSelected()); - alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected()); + final boolean setVisible = annotationPanelMenuItem.isSelected(); + viewport.setShowAnnotation(setVisible); + this.showAllSeqAnnotations.setEnabled(setVisible); + this.hideAllSeqAnnotations.setEnabled(setVisible); + this.showAllAlAnnotations.setEnabled(setVisible); + this.hideAllAlAnnotations.setEnabled(setVisible); + alignPanel.updateLayout(); } @Override @@ -2886,17 +3281,19 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, editPane.setEditable(false); StringBuffer contents = new AlignmentProperties(viewport.getAlignment()) .formatAsHtml(); - editPane.setText("" + contents.toString() + ""); + editPane.setText(MessageManager.formatMessage("label.html_content", + new Object[] { contents.toString() })); JInternalFrame frame = new JInternalFrame(); frame.getContentPane().add(new JScrollPane(editPane)); - Desktop.instance.addInternalFrame(frame, "Alignment Properties: " - + getTitle(), 500, 400); + Desktop.addInternalFrame(frame, MessageManager.formatMessage( + "label.alignment_properties", new Object[] { getTitle() }), + 500, 400); } /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -2911,7 +3308,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, JInternalFrame frame = new JInternalFrame(); OverviewPanel overview = new OverviewPanel(alignPanel); frame.setContentPane(overview); - Desktop.addInternalFrame(frame, "Overview " + this.getTitle(), + Desktop.addInternalFrame(frame, MessageManager.formatMessage( + "label.overview_params", new Object[] { this.getTitle() }), frame.getWidth(), frame.getHeight()); frame.pack(); frame.setLayer(JLayeredPane.PALETTE_LAYER); @@ -2936,7 +3334,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -2948,19 +3346,20 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @Override public void clustalColour_actionPerformed(ActionEvent e) { - changeColour(new ClustalxColourScheme(viewport.getAlignment(), viewport.getHiddenRepSequences())); + changeColour(new ClustalxColourScheme(viewport.getAlignment(), + viewport.getHiddenRepSequences())); } /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -2972,7 +3371,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -2984,7 +3383,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -2996,7 +3395,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -3008,7 +3407,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -3020,7 +3419,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -3032,7 +3431,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -3044,7 +3443,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -3073,6 +3472,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } @Override + public void annotationColumn_actionPerformed(ActionEvent e) + { + new AnnotationColumnChooser(viewport, alignPanel); + } + + @Override public void rnahelicesColour_actionPerformed(ActionEvent e) { new RNAHelicesColourChooser(viewport, alignPanel); @@ -3080,7 +3485,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -3092,131 +3497,45 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param cs - * DOCUMENT ME! - */ - public void changeColour(ColourSchemeI cs) - { - // TODO: compare with applet and pull up to model method - int threshold = 0; - - if (cs != null) - { - if (viewport.getAbovePIDThreshold()) - { - threshold = SliderPanel.setPIDSliderSource(alignPanel, cs, - "Background"); - - cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus()); - - viewport.setGlobalColourScheme(cs); - } - 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()); - } - - 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()); + * DOCUMENT ME! + */ + @Override + public void changeColour(ColourSchemeI cs) + { + // TODO: pull up to controller method - sg.cs.setConsensus(AAFrequency.calculate( - sg.getSequences(viewport.getHiddenRepSequences()), - sg.getStartRes(), sg.getEndRes() + 1)); - } - else - { - sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus()); - } + if (cs != null) + { + // Make sure viewport is up to date w.r.t. any sliders + if (viewport.getAbovePIDThreshold()) + { + int threshold = SliderPanel.setPIDSliderSource(alignPanel, cs, + "Background"); + viewport.setThreshold(threshold); + } - 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 (viewport.getConservationSelected()) + { + cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, + cs, "Background")); + } + if (cs instanceof TCoffeeColourScheme) + { + tcoffeeColour.setEnabled(true); + tcoffeeColour.setSelected(true); } } - if (alignPanel.getOverviewPanel() != null) - { - alignPanel.getOverviewPanel().updateOverviewImage(); - } + viewport.setGlobalColourScheme(cs); alignPanel.paintAlignment(true); } /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -3234,7 +3553,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -3252,7 +3571,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -3271,7 +3590,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -3290,14 +3609,15 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @Override public void userDefinedColour_actionPerformed(ActionEvent e) { - if (e.getActionCommand().equals("User Defined...")) + if (e.getActionCommand().equals( + MessageManager.getString("action.user_defined"))) { new UserDefinedColours(alignPanel, null); } @@ -3314,8 +3634,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { Component[] menuItems = colourMenu.getMenuComponents(); - int i, iSize = menuItems.length; - for (i = 0; i < iSize; i++) + int iSize = menuItems.length; + for (int i = 0; i < iSize; i++) { if (menuItems[i].getName() != null && menuItems[i].getName().equals("USER_DEFINED")) @@ -3346,8 +3666,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, int option = JOptionPane.showInternalConfirmDialog( jalview.gui.Desktop.desktop, - "Remove from default list?", - "Remove user defined colour", + MessageManager + .getString("label.remove_from_default_list"), + MessageManager + .getString("label.remove_user_defined_colour"), JOptionPane.YES_NO_OPTION); if (option == JOptionPane.YES_OPTION) { @@ -3386,7 +3708,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -3398,7 +3720,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -3410,7 +3732,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -3427,7 +3749,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -3443,7 +3765,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -3459,7 +3781,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -3476,7 +3798,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -3488,7 +3810,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -3498,21 +3820,24 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if ((viewport.getSelectionGroup() == null) || (viewport.getSelectionGroup().getSize() < 2)) { - JOptionPane.showInternalMessageDialog(this, - "You must select at least 2 sequences.", "Invalid Selection", + JOptionPane.showInternalMessageDialog(this, MessageManager + .getString("label.you_must_select_least_two_sequences"), + MessageManager.getString("label.invalid_selection"), JOptionPane.WARNING_MESSAGE); } else { JInternalFrame frame = new JInternalFrame(); frame.setContentPane(new PairwiseAlignPanel(viewport)); - Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500); + Desktop.addInternalFrame(frame, + MessageManager.getString("action.pairwise_alignment"), 600, + 500); } } /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @@ -3524,11 +3849,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, .getSelectionGroup().getSize() > 0)) || (viewport.getAlignment().getHeight() < 4)) { - JOptionPane.showInternalMessageDialog(this, - "Principal component analysis must take\n" - + "at least 4 input sequences.", - "Sequence selection insufficient", - JOptionPane.WARNING_MESSAGE); + JOptionPane + .showInternalMessageDialog( + this, + MessageManager + .getString("label.principal_component_analysis_must_take_least_four_input_sequences"), + MessageManager + .getString("label.sequence_selection_insufficient"), + JOptionPane.WARNING_MESSAGE); return; } @@ -3561,55 +3889,55 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @Override public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e) { - NewTreePanel("AV", "PID", "Average distance tree using PID"); + newTreePanel("AV", "PID", "Average distance tree using PID"); } /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @Override public void neighbourTreeMenuItem_actionPerformed(ActionEvent e) { - NewTreePanel("NJ", "PID", "Neighbour joining tree using PID"); + newTreePanel("NJ", "PID", "Neighbour joining tree using PID"); } /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @Override protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e) { - NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62"); + newTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62"); } /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @Override protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e) { - NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62"); + newTreePanel("AV", "BL", "Average distance tree using BLOSUM62"); } /** * DOCUMENT ME! - * + * * @param type * DOCUMENT ME! * @param pwType @@ -3617,37 +3945,40 @@ 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; - if (viewport.getSelectionGroup() != null) + if (viewport.getSelectionGroup() != null + && viewport.getSelectionGroup().getSize() > 0) { if (viewport.getSelectionGroup().getSize() < 3) { JOptionPane .showMessageDialog( Desktop.desktop, - "You need to have more than two sequences selected to build a tree!", - "Not enough sequences", JOptionPane.WARNING_MESSAGE); + MessageManager + .getString("label.you_need_more_two_sequences_selected_build_tree"), + MessageManager + .getString("label.not_enough_sequences"), + JOptionPane.WARNING_MESSAGE); return; } SequenceGroup sg = viewport.getSelectionGroup(); /* Decide if the selection is a column region */ - for (SequenceI _s:sg.getSequences()) + for (SequenceI _s : sg.getSequences()) { - if (_s.getLength() < sg - .getEndRes()) + if (_s.getLength() < sg.getEndRes()) { JOptionPane .showMessageDialog( Desktop.desktop, - "The selected region to create a tree may\nonly contain residues or gaps.\n" - + "Try using the Pad function in the edit menu,\n" - + "or one of the multiple sequence alignment web services.", - "Sequences in selection are not aligned", + MessageManager + .getString("label.selected_region_to_tree_may_only_contain_residues_or_gaps"), + MessageManager + .getString("label.sequences_selection_not_aligned"), JOptionPane.WARNING_MESSAGE); return; @@ -3665,10 +3996,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, JOptionPane .showMessageDialog( Desktop.desktop, - "The sequences must be aligned before creating a tree.\n" - + "Try using the Pad function in the edit menu,\n" - + "or one of the multiple sequence alignment web services.", - "Sequences not aligned", + MessageManager + .getString("label.sequences_must_be_aligned_before_creating_tree"), + MessageManager + .getString("label.sequences_not_aligned"), JOptionPane.WARNING_MESSAGE); return; @@ -3696,7 +4027,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param title * DOCUMENT ME! * @param order @@ -3705,7 +4036,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, public void addSortByOrderMenuItem(String title, final AlignmentOrder order) { - final JMenuItem item = new JMenuItem("by " + 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() { @@ -3728,7 +4060,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * Add a new sort by annotation score menu item - * + * * @param sort * the menu to add the option to * @param scoreLabel @@ -3765,7 +4097,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * search the alignment and rebuild the sort by annotation score submenu the * last alignment annotation vector hash is stored to minimize cost of * rebuilding in subsequence calls. - * + * */ @Override public void buildSortByAnnotationScoresMenu() @@ -3781,7 +4113,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // almost certainly a quicker way to do this - but we keep it simple Hashtable scoreSorts = new Hashtable(); AlignmentAnnotation aann[]; - for (SequenceI sqa:viewport.getAlignment().getSequences()) + for (SequenceI sqa : viewport.getAlignment().getSequences()) { aann = sqa.getAnnotation(); for (int i = 0; aann != null && i < aann.length; i++) @@ -3812,7 +4144,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * call. Listeners are added to remove the menu item when the treePanel is * closed, and adjust the tree leaf to sequence mapping when the alignment is * modified. - * + * * @param treePanel * Displayed tree window. * @param title @@ -3821,23 +4153,51 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void buildTreeMenu() { + calculateTree.removeAll(); + // build the calculate menu + + for (final String type : new String[] { "NJ", "AV" }) + { + String treecalcnm = MessageManager.getString("label.tree_calc_" + + type.toLowerCase()); + for (final String pwtype : ResidueProperties.scoreMatrices.keySet()) + { + JMenuItem tm = new JMenuItem(); + ScoreModelI sm = ResidueProperties.scoreMatrices.get(pwtype); + if (sm.isProtein() == !viewport.getAlignment().isNucleotide()) + { + String smn = MessageManager.getStringOrReturn( + "label.score_model_", sm.getName()); + final String title = MessageManager.formatMessage( + "label.treecalc_title", treecalcnm, smn); + tm.setText(title);// + tm.addActionListener(new java.awt.event.ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + newTreePanel(type, pwtype, title); + } + }); + calculateTree.add(tm); + } + + } + } 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; @@ -3845,17 +4205,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)); } @@ -3881,7 +4239,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * Work out whether the whole set of sequences or just the selected set will * be submitted for multiple alignment. - * + * */ public jalview.datamodel.AlignmentView gatherSequencesForAlignment() { @@ -3896,22 +4254,26 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /* * SequenceGroup seqs = viewport.getSelectionGroup(); int sz; msa = new * SequenceI[sz = seqs.getSize(false)]; - * + * * for (int i = 0; i < sz; i++) { msa[i] = (SequenceI) * seqs.getSequenceAt(i); } */ msa = viewport.getAlignmentView(true); } + else if (viewport.getSelectionGroup() != null + && viewport.getSelectionGroup().getSize() == 1) + { + int option = JOptionPane.showConfirmDialog(this, + MessageManager.getString("warn.oneseq_msainput_selection"), + MessageManager.getString("label.invalid_selection"), + JOptionPane.OK_CANCEL_OPTION); + if (option == JOptionPane.OK_OPTION) + { + msa = viewport.getAlignmentView(false); + } + } else { - /* - * Vector seqs = viewport.getAlignment().getSequences(); - * - * if (seqs.size() > 1) { msa = new SequenceI[seqs.size()]; - * - * for (int i = 0; i < seqs.size(); i++) { msa[i] = (SequenceI) - * seqs.elementAt(i); } } - */ msa = viewport.getAlignmentView(false); } return msa; @@ -3943,8 +4305,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! @@ -3954,19 +4315,20 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! - * + * * @param e * DOCUMENT ME! */ @Override - protected void LoadtreeMenuItem_actionPerformed(ActionEvent e) + protected void loadTreeMenuItem_actionPerformed(ActionEvent e) { // Pick the tree file JalviewFileChooser chooser = new JalviewFileChooser( jalview.bin.Cache.getProperty("LAST_DIRECTORY")); chooser.setFileView(new JalviewFileView()); - chooser.setDialogTitle("Select a newick-like tree file"); - chooser.setToolTipText("Load a tree file"); + chooser.setDialogTitle(MessageManager + .getString("label.select_newick_like_tree_file")); + chooser.setToolTipText(MessageManager.getString("label.load_tree_file")); int value = chooser.showOpenDialog(null); @@ -3981,14 +4343,20 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree()); } catch (Exception ex) { - JOptionPane.showMessageDialog(Desktop.desktop, ex.getMessage(), - "Problem reading tree file", JOptionPane.WARNING_MESSAGE); + JOptionPane + .showMessageDialog( + Desktop.desktop, + ex.getMessage(), + MessageManager + .getString("label.problem_reading_tree_file"), + JOptionPane.WARNING_MESSAGE); ex.printStackTrace(); } if (fin != null && fin.hasWarningMessage()) { - JOptionPane.showMessageDialog(Desktop.desktop, - fin.getWarningMessage(), "Possible problem with tree file", + JOptionPane.showMessageDialog(Desktop.desktop, fin + .getWarningMessage(), MessageManager + .getString("label.possible_problem_with_tree_file"), JOptionPane.WARNING_MESSAGE); } } @@ -4020,7 +4388,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * Add a treeviewer for the tree extracted from a newick file object to the * current alignment view - * + * * @param nf * the tree * @param title @@ -4071,7 +4439,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * Generates menu items and listener event actions for web service clients - * + * */ public void BuildWebServiceMenu() { @@ -4084,7 +4452,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } catch (Exception e) { } - ; } final AlignFrame me = this; buildingMenu = true; @@ -4093,10 +4460,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void run() { + 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 @@ -4115,6 +4483,16 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, 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) @@ -4124,28 +4502,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // TODO: refactor to allow list of AbstractName/Handler bindings to // be // stored or retrieved from elsewhere - Vector msaws = null; // (Vector) Discoverer.services.get("MsaWS"); + // No MSAWS used any more: + // Vector msaws = null; // (Vector) + // Discoverer.services.get("MsaWS"); Vector secstrpr = (Vector) Discoverer.services .get("SecStrPred"); - Vector seqsrch = null; // (Vector) - // Discoverer.services.get("SeqSearch"); - // TODO: move GUI generation code onto service implementation - so a - // client instance attaches itself to the GUI with method call like - // jalview.ws.MsaWSClient.bind(servicehandle, Desktop.instance, - // alignframe) - if (msaws != null) - { - // Add any Multiple Sequence Alignment Services - for (int i = 0, j = msaws.size(); i < j; i++) - { - final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws - .get(i); - jalview.ws.WSMenuEntryProviderI impl = jalview.ws.jws1.Discoverer - .getServiceClient(sh); - impl.attachWSMenuEntry(msawsmenu, me); - - } - } if (secstrpr != null) { // Add any secondary structure prediction services @@ -4155,19 +4516,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, .get(i); jalview.ws.WSMenuEntryProviderI impl = jalview.ws.jws1.Discoverer .getServiceClient(sh); + int p = secstrmenu.getItemCount(); impl.attachWSMenuEntry(secstrmenu, me); - } - } - if (seqsrch != null) - { - // Add any sequence search services - for (int i = 0, j = seqsrch.size(); i < j; i++) - { - final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) seqsrch - .elementAt(i); - jalview.ws.WSMenuEntryProviderI impl = jalview.ws.jws1.Discoverer - .getServiceClient(sh); - impl.attachWSMenuEntry(seqsrchmenu, me); + int q = secstrmenu.getItemCount(); + for (int litm = p; litm < q; litm++) + { + legacyItems.add(secstrmenu.getItem(litm)); + } } } } @@ -4178,12 +4533,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, wsmenu.add(secstrmenu); wsmenu.add(dismenu); wsmenu.add(analymenu); - // final ArrayList submens=new ArrayList(); - // submens.add(msawsmenu); - // submens.add(secstrmenu); - // submens.add(dismenu); - // submens.add(analymenu); - // No search services yet // wsmenu.add(seqsrchmenu); @@ -4208,6 +4557,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, webService.add(me.webServiceNoServices); } // TODO: move into separate menu builder class. + boolean new_sspred = false; if (Cache.getDefault("SHOW_JWS2_SERVICES", true)) { Jws2Discoverer jws2servs = Jws2Discoverer.getDiscoverer(); @@ -4216,6 +4566,17 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (jws2servs.hasServices()) { jws2servs.attachWSMenuEntry(webService, me); + for (Jws2Instance sv : jws2servs.getServices()) + { + if (sv.description.toLowerCase().contains("jpred")) + { + for (JMenuItem jmi : legacyItems) + { + jmi.setVisible(false); + } + } + } + } if (jws2servs.isRunning()) { @@ -4226,7 +4587,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } } } - build_urlServiceMenu(me.webService); build_fetchdbmenu(webService); for (JMenu item : wsmenu) @@ -4242,15 +4602,15 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } } catch (Exception e) { + Cache.log + .debug("Exception during web service menu building process.", + e); } - ; } }); } catch (Exception e) { } - ; - buildingMenu = false; } }).start(); @@ -4259,7 +4619,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * construct any groupURL type service menu entries. - * + * * @param webService */ private void build_urlServiceMenu(JMenu webService) @@ -4269,12 +4629,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /* * JMenuItem testAlView = new JMenuItem("Test AlignmentView"); final * AlignFrame af = this; testAlView.addActionListener(new ActionListener() { - * + * * @Override public void actionPerformed(ActionEvent e) { * jalview.datamodel.AlignmentView * .testSelectionViews(af.viewport.getAlignment(), * af.viewport.getColumnSelection(), af.viewport.selectionGroup); } - * + * * }); webService.add(testAlView); */ // TODO: refactor to RestClient discoverer and merge menu entries for @@ -4289,24 +4649,18 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, JvSwingUtils.findOrCreateMenu(webService, client.getAction()), this); } - - if (Cache.getDefault("SHOW_ENFIN_SERVICES", true)) - { - jalview.ws.EnfinEnvision2OneWay.getInstance().attachWSMenuEntry( - webService, 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( @@ -4314,7 +4668,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, */ /** * prototype of an automatically enabled/disabled analysis function - * + * */ protected void setShowProductsEnabled() { @@ -4334,7 +4688,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * search selection for sequence xRef products and build the show products * menu. - * + * * @param selection * @param dataset * @return true if showProducts menu should be enabled. @@ -4368,7 +4722,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, public void actionPerformed(ActionEvent e) { // TODO: new thread for this call with vis-delay - af.showProductsFor(af.viewport.getSequenceSelection(), ds, + af.showProductsFor(af.viewport.getSequenceSelection(), isRegSel, dna, source); } @@ -4387,14 +4741,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, return showp; } - protected void showProductsFor(SequenceI[] sel, Alignment ds, - boolean isRegSel, boolean dna, String source) + protected void showProductsFor(final SequenceI[] sel, + final boolean isRegSel, final boolean dna, final 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() { @@ -4402,15 +4751,16 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, public void run() { final long sttime = System.currentTimeMillis(); - ths.setProgressBar("Searching for sequences from " + fsrc, sttime); + AlignFrame.this.setProgressBar(MessageManager.formatMessage( + "status.searching_for_sequences_from", + new Object[] { source }), sttime); try { - Alignment ds = ths.getViewport().getAlignment().getDataset(); // update - // our local - // dataset - // reference + // update our local dataset reference + Alignment ds = AlignFrame.this.getViewport().getAlignment() + .getDataset(); Alignment prods = CrossRef - .findXrefSequences(fsel, fdna, fsrc, ds); + .findXrefSequences(sel, dna, source, ds); if (prods != null) { SequenceI[] sprods = new SequenceI[prods.getHeight()]; @@ -4420,29 +4770,81 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, 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++) + + /* + * Copy dna-to-protein mappings to new alignment + */ + // TODO 1: no mappings are set up for EMBL product + // TODO 2: if they were, should add them to protein alignment, not + // dna + Set cf = prods.getCodonFrames(); + for (AlignedCodonFrame acf : cf) { - al.addCodonFrame(cf[s]); - cf[s] = null; + al.addCodonFrame(acf); } AlignFrame naf = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT); - String newtitle = "" + ((fdna) ? "Proteins " : "Nucleotides ") - + " for " + ((fisRegSel) ? "selected region of " : "") + String newtitle = "" + ((dna) ? "Proteins" : "Nucleotides") + + " for " + ((isRegSel) ? "selected region of " : "") + getTitle(); - Desktop.addInternalFrame(naf, newtitle, DEFAULT_WIDTH, - DEFAULT_HEIGHT); + naf.setTitle(newtitle); + + // temporary flag until SplitFrame is released + boolean asSplitFrame = Cache.getDefault( + Preferences.ENABLE_SPLIT_FRAME, true); + if (asSplitFrame) + { + /* + * Make a copy of this alignment (sharing the same dataset + * sequences). If we are DNA, drop introns and update mappings + */ + AlignmentI copyAlignment = null; + final SequenceI[] sequenceSelection = AlignFrame.this.viewport + .getSequenceSelection(); + if (dna) + { + copyAlignment = AlignmentUtils.makeExonAlignment( + sequenceSelection, cf); + al.getCodonFrames().clear(); + al.getCodonFrames().addAll(cf); + final StructureSelectionManager ssm = StructureSelectionManager + .getStructureSelectionManager(Desktop.instance); + ssm.registerMappings(cf); + } + else + { + copyAlignment = new Alignment(new Alignment( + sequenceSelection)); + } + AlignFrame copyThis = new AlignFrame(copyAlignment, + AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT); + copyThis.setTitle(AlignFrame.this.getTitle()); + // SplitFrame with dna above, protein below + SplitFrame sf = new SplitFrame(dna ? copyThis : naf, + dna ? naf : copyThis); + naf.setVisible(true); + copyThis.setVisible(true); + String linkedTitle = MessageManager + .getString("label.linked_view_title"); + Desktop.addInternalFrame(sf, linkedTitle, -1, -1); + } + else + { + Desktop.addInternalFrame(naf, newtitle, DEFAULT_WIDTH, + DEFAULT_HEIGHT); + } } else { System.err.println("No Sequences generated for xRef type " - + fsrc); + + source); } } catch (Exception e) { @@ -4456,8 +4858,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, jalview.bin.Cache.log.error("Error when finding crossreferences", e); } - ths.setProgressBar("Finished searching for sequences from " + fsrc, - sttime); + AlignFrame.this.setProgressBar(MessageManager.formatMessage( + "status.finished_searching_for_sequences_from", + new Object[] { source }), sttime); } }; @@ -4482,117 +4885,100 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } } + /** + * 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 showProducts_actionPerformed(ActionEvent e) + public void showTranslation_actionPerformed(ActionEvent e) { - // ///////////////////////////// - // 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()); + Dna dna = new Dna(viewport, viewport.getViewAsVisibleContigs(true)); + + al = dna.translateCdna(); } catch (Exception ex) { - al = null; - jalview.bin.Cache.log.debug("Exception during translation.", ex); + jalview.bin.Cache.log.error( + "Exception during translation. Please report this !", ex); + final String msg = MessageManager + .getString("label.error_when_translating_sequences_submit_bug_report"); + final String errorTitle = MessageManager + .getString("label.implementation_error") + + MessageManager.getString("translation_failed"); + JOptionPane.showMessageDialog(Desktop.desktop, msg, errorTitle, + JOptionPane.ERROR_MESSAGE); + return; } - if (al == null) + if (al == null || al.getHeight() == 0) { - JOptionPane - .showMessageDialog( - Desktop.desktop, - "Please select at least three bases in at least one sequence in order to perform a cDNA translation.", - "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"); + JOptionPane.showMessageDialog(Desktop.desktop, msg, errorTitle, + JOptionPane.WARNING_MESSAGE); } else { AlignFrame af = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT); - Desktop.addInternalFrame(af, "Translation of " + 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); + } } } - @Override - public void showTranslation_actionPerformed(ActionEvent e) + /** + * Set the file format + * + * @param fileFormat + */ + public void setFileFormat(String fileFormat) { - // ///////////////////////////// - // 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()); - } catch (Exception ex) - { - al = null; - jalview.bin.Cache.log.debug("Exception during translation.", ex); - } - if (al == null) - { - JOptionPane - .showMessageDialog( - Desktop.desktop, - "Please select at least three bases in at least one sequence in order to perform a cDNA translation.", - "Translation Failed", JOptionPane.WARNING_MESSAGE); - } - else - { - AlignFrame af = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT); - Desktop.addInternalFrame(af, "Translation of " + this.getTitle(), - DEFAULT_WIDTH, DEFAULT_HEIGHT); - } + this.currentFileFormat = fileFormat; } /** * Try to load a features file onto the alignment. - * + * * @param file * contents or path to retrieve file * @param type * 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) { - boolean featuresFile = false; - try - { - featuresFile = new FeaturesFile(file, type).parse(viewport - .getAlignment().getDataset(), alignPanel.seqPanel.seqCanvas - .getFeatureRenderer().featureColours, false, - jalview.bin.Cache.getDefault("RELAXEDSEQIDMATCHING", false)); - } catch (Exception ex) - { - ex.printStackTrace(); - } + return avc.parseFeaturesFile(file, type, + jalview.bin.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.showSequenceFeatures = true; + viewport.setShowSequenceFeatures(true); showSeqFeatures.setSelected(true); - if (alignPanel.seqPanel.seqCanvas.fr != null) - { - // update the min/max ranges where necessary - alignPanel.seqPanel.seqCanvas.fr.findAllFeatures(true); - } - if (featureSettings != null) - { - featureSettings.setTableData(); - } - alignPanel.paintAlignment(true); } - return featuresFile; } @Override @@ -4725,8 +5111,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { if (type.equalsIgnoreCase("PDB")) { - filesmatched.add(new Object[] - { file, protocol, mtch }); + filesmatched.add(new Object[] { file, protocol, mtch }); continue; } } @@ -4742,10 +5127,16 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, || JOptionPane .showConfirmDialog( this, - "Do you want to automatically associate the " - + filesmatched.size() - + " PDB files with sequences in the alignment that have the same name ?", - "Automatically Associate PDB files by name", + MessageManager + .formatMessage( + "label.automatically_associate_pdb_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) { @@ -4758,7 +5149,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { PDBEntry pe = new AssociatePdbFileWithSeq() .associatePdbWithSeq((String) fm[0], - (String) fm[1], toassoc, false); + (String) fm[1], toassoc, false, + Desktop.instance); if (pe != null) { System.err.println("Associated file : " @@ -4778,10 +5170,18 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, "AUTOASSOCIATE_PDBANDSEQS_IGNOREOTHERS", false) || JOptionPane .showConfirmDialog( this, - "Do you want to ignore the " - + filesnotmatched.size() - + " files whose names did not match any sequence IDs ?", - "Ignore unmatched dropped files ?", + "" + + 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)) { return; @@ -4804,7 +5204,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * it's and Annotation file, then a JNet file, and finally a features file. If * all are false then the user may have dropped an alignment file onto this * AlignFrame. - * + * * @param file * either a filename or a URL string. */ @@ -4822,8 +5222,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // try to parse as annotation. boolean isAnnotation = (format == null || format .equalsIgnoreCase("PFAM")) ? new AnnotationFile() - .readAnnotationFile(viewport.getAlignment(), file, protocol) - : false; + .annotateAlignmentView(viewport, file, protocol) : false; if (!isAnnotation) { @@ -4841,15 +5240,22 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, changeColour(new TCoffeeColourScheme(viewport.getAlignment())); isAnnotation = true; statusBar - .setText("Successfully pasted T-Coffee scores to alignment."); + .setText(MessageManager + .getString("label.successfully_pasted_tcoffee_scores_to_alignment")); } else { - // some problem - if no warning its probable that the ID matching process didn't work - JOptionPane.showMessageDialog(Desktop.desktop, - tcf.getWarningMessage()==null ? "Check that the file matches sequence IDs in the alignment." : tcf.getWarningMessage(), - "Problem reading T-COFFEE score file", - JOptionPane.WARNING_MESSAGE); + // some problem - if no warning its probable that the ID matching + // process didn't work + JOptionPane + .showMessageDialog( + Desktop.desktop, + tcf.getWarningMessage() == null ? MessageManager + .getString("label.check_file_matches_sequence_ids_alignment") + : tcf.getWarningMessage(), + MessageManager + .getString("label.problem_reading_tcoffee_score_file"), + JOptionPane.WARNING_MESSAGE); } } else @@ -4858,7 +5264,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } } catch (Exception x) { - Cache.log.debug("Exception when processing data source as T-COFFEE score file",x); + Cache.log + .debug("Exception when processing data source as T-COFFEE score file", + x); tcf = null; } if (tcf == null) @@ -4874,15 +5282,21 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { jalview.io.JPredFile predictions = new jalview.io.JPredFile( file, protocol); - new JnetAnnotationMaker().add_annotation(predictions, + 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 { /* * 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 == @@ -4927,32 +5341,74 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } catch (Exception ex) { ex.printStackTrace(); + } catch (OutOfMemoryError oom) + { + try + { + System.gc(); + } catch (Exception x) + { + } + ; + new OOMWarning( + "loading data " + + (protocol != null ? (protocol.equals(FormatAdapter.PASTE) ? "from clipboard." + : "using " + protocol + " 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); } + + /* + * 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)) { - String reply = JOptionPane.showInternalInputDialog(this, - "Enter View Name", "Edit View Name", + String msg = MessageManager.getString("label.enter_view_name"); + String reply = JOptionPane.showInternalInputDialog(this, msg, msg, JOptionPane.QUESTION_MESSAGE); if (reply != null) { viewport.viewName = reply; + // TODO warn if reply is in getExistingViewNames()? tabbedPane.setTitleAt(tabbedPane.getSelectedIndex(), reply); } } @@ -4984,7 +5440,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /* * (non-Javadoc) - * + * * @see * jalview.jbgui.GAlignFrame#showDbRefs_actionPerformed(java.awt.event.ActionEvent * ) @@ -4992,28 +5448,28 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override protected void showDbRefs_actionPerformed(ActionEvent e) { - viewport.setShowDbRefs(showDbRefsMenuitem.isSelected()); + viewport.setShowDBRefs(showDbRefsMenuitem.isSelected()); } /* * (non-Javadoc) - * + * * @seejalview.jbgui.GAlignFrame#showNpFeats_actionPerformed(java.awt.event. * ActionEvent) */ @Override protected void showNpFeats_actionPerformed(ActionEvent e) { - viewport.setShowNpFeats(showNpFeatsMenuitem.isSelected()); + viewport.setShowNPFeats(showNpFeatsMenuitem.isSelected()); } /** * find the viewport amongst the tabs in this alignment frame and close that * tab - * + * * @param av */ - public boolean closeView(AlignViewport av) + public boolean closeView(AlignViewportI av) { if (viewport == av) { @@ -5042,12 +5498,32 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // TODO We probably want to store a sequence database checklist in // preferences and have checkboxes.. rather than individual sources selected // here - final JMenu rfetch = new JMenu("Fetch DB References"); - rfetch.setToolTipText("Retrieve and parse sequence database records for the alignment or the currently selected sequences"); + final JMenu rfetch = new JMenu( + MessageManager.getString("action.fetch_db_references")); + rfetch.setToolTipText(MessageManager + .getString("label.retrieve_parse_sequence_database_records_alignment_or_selected_sequences")); webService.add(rfetch); - JMenuItem fetchr = new JMenuItem("Standard Databases"); - fetchr.setToolTipText("Fetch from EMBL/EMBLCDS or Uniprot/PDB and any selected DAS sources"); + final JCheckBoxMenuItem trimrs = new JCheckBoxMenuItem( + MessageManager.getString("option.trim_retrieved_seqs")); + trimrs.setToolTipText(MessageManager + .getString("label.trim_retrieved_sequences")); + trimrs.setSelected(Cache.getDefault("TRIM_FETCHED_DATASET_SEQS", true)); + trimrs.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + trimrs.setSelected(trimrs.isSelected()); + Cache.setProperty("TRIM_FETCHED_DATASET_SEQS", + Boolean.valueOf(trimrs.isSelected()).toString()); + }; + }); + rfetch.add(trimrs); + JMenuItem fetchr = new JMenuItem( + MessageManager.getString("label.standard_databases")); + fetchr.setToolTipText(MessageManager + .getString("label.fetch_embl_uniprot")); fetchr.addActionListener(new ActionListener() { @@ -5060,8 +5536,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void run() { + boolean isNuclueotide = alignPanel.alignFrame + .getViewport().getAlignment() + .isNucleotide(); new jalview.ws.DBRefFetcher(alignPanel.av - .getSequenceSelection(), alignPanel.alignFrame) + .getSequenceSelection(), + alignPanel.alignFrame, null, + alignPanel.alignFrame.featureSettings, + isNuclueotide) .fetchDBRefs(false); } }).start(); @@ -5130,18 +5612,24 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void run() { + boolean isNuclueotide = alignPanel.alignFrame + .getViewport().getAlignment() + .isNucleotide(); new jalview.ws.DBRefFetcher(alignPanel.av .getSequenceSelection(), - alignPanel.alignFrame, dassource) + alignPanel.alignFrame, dassource, + alignPanel.alignFrame.featureSettings, + isNuclueotide) .fetchDBRefs(false); } }).start(); } }); - fetchr.setToolTipText("" - + JvSwingUtils.wrapTooltip("Retrieve from " - + src.getDbName()) + ""); + fetchr.setToolTipText(JvSwingUtils.wrapTooltip(true, + MessageManager.formatMessage( + "label.fetch_retrieve_from", + new Object[] { src.getDbName() }))); dfetch.add(fetchr); comp++; } @@ -5151,8 +5639,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, .toArray(new DbSourceProxy[0]); // fetch all entry DbSourceProxy src = otherdb.get(0); - fetchr = new JMenuItem("Fetch All '" + src.getDbSource() - + "'"); + fetchr = new JMenuItem(MessageManager.formatMessage( + "label.fetch_all_param", + new Object[] { src.getDbSource() })); fetchr.addActionListener(new ActionListener() { @Override @@ -5164,24 +5653,33 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void run() { + boolean isNuclueotide = alignPanel.alignFrame + .getViewport().getAlignment() + .isNucleotide(); new jalview.ws.DBRefFetcher(alignPanel.av .getSequenceSelection(), - alignPanel.alignFrame, dassource) + alignPanel.alignFrame, dassource, + alignPanel.alignFrame.featureSettings, + isNuclueotide) .fetchDBRefs(false); } }).start(); } }); - fetchr.setToolTipText("" - + JvSwingUtils.wrapTooltip("Retrieve from all " - + otherdb.size() + " sources in " - + src.getDbSource() + "
First is :" - + 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("Sources from " + src.getDbSource()); + ifetch = new JMenu(MessageManager.formatMessage( + "label.source_from_db_source", + new Object[] { src.getDbSource() })); icomp = 0; String imname = null; int i = 0; @@ -5194,11 +5692,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, 0, 10) + "..." : dbname; if (imname == null) { - imname = "from '" + 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() { @@ -5211,9 +5709,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void run() { + boolean isNuclueotide = alignPanel.alignFrame + .getViewport().getAlignment() + .isNucleotide(); new jalview.ws.DBRefFetcher(alignPanel.av .getSequenceSelection(), - alignPanel.alignFrame, dassrc) + alignPanel.alignFrame, dassrc, + alignPanel.alignFrame.featureSettings, + isNuclueotide) .fetchDBRefs(false); } }).start(); @@ -5221,13 +5724,15 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, }); fetchr.setToolTipText("" - + JvSwingUtils.wrapTooltip("Retrieve from " - + dbname) + ""); + + MessageManager.formatMessage( + "label.fetch_retrieve_from", new Object[] + { dbname })); ifetch.add(fetchr); ++i; if (++icomp >= mcomp || i == (otherdb.size())) { - ifetch.setText(imname + " to '" + sname + "'"); + ifetch.setText(MessageManager.formatMessage( + "label.source_to_target", imname, sname)); dfetch.add(ifetch); ifetch = new JMenu(); imname = null; @@ -5239,7 +5744,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, ++dbi; if (comp >= mcomp || dbi >= (dbclasses.length)) { - dfetch.setText(mname + " to '" + dbclass + "'"); + dfetch.setText(MessageManager.formatMessage( + "label.source_to_target", mname, dbclass)); rfetch.add(dfetch); dfetch = new JMenu(); mname = null; @@ -5275,15 +5781,16 @@ 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); } /* * (non-Javadoc) - * + * * @see * jalview.jbgui.GAlignFrame#showUnconservedMenuItem_actionPerformed(java. * awt.event.ActionEvent) @@ -5297,7 +5804,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /* * (non-Javadoc) - * + * * @see * jalview.jbgui.GAlignFrame#showGroupConsensus_actionPerformed(java.awt.event * .ActionEvent) @@ -5312,7 +5819,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /* * (non-Javadoc) - * + * * @see * jalview.jbgui.GAlignFrame#showGroupConservation_actionPerformed(java.awt * .event.ActionEvent) @@ -5326,7 +5833,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /* * (non-Javadoc) - * + * * @see * jalview.jbgui.GAlignFrame#showConsensusHistogram_actionPerformed(java.awt * .event.ActionEvent) @@ -5340,7 +5847,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /* * (non-Javadoc) - * + * * @see * jalview.jbgui.GAlignFrame#showConsensusProfile_actionPerformed(java.awt * .event.ActionEvent) @@ -5355,6 +5862,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override protected void normaliseSequenceLogo_actionPerformed(ActionEvent e) { + showSequenceLogo.setState(true); + viewport.setShowSequenceLogo(true); viewport.setNormaliseSequenceLogo(normaliseSequenceLogo.getState()); alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState()); } @@ -5367,7 +5876,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /* * (non-Javadoc) - * + * * @see * jalview.jbgui.GAlignFrame#makeGrpsFromSelection_actionPerformed(java.awt * .event.ActionEvent) @@ -5375,39 +5884,47 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override protected void makeGrpsFromSelection_actionPerformed(ActionEvent e) { - if (viewport.getSelectionGroup() != null) + if (avc.makeGroupsFromSelection()) { - SequenceGroup[] gps = jalview.analysis.Grouping.makeGroupsFrom( - viewport.getSequenceSelection(), - viewport.getAlignmentView(true).getSequenceStrings( - viewport.getGapCharacter()), viewport.getAlignment() - .getGroups()); - viewport.getAlignment().deleteAllGroups(); - viewport.sequenceColours = null; - viewport.setSelectionGroup(null); - // set view properties for each group - for (int g = 0; g < gps.length; g++) - { - gps[g].setShowNonconserved(viewport.getShowUnconserved()); - gps[g].setshowSequenceLogo(viewport.isShowSequenceLogo()); - viewport.getAlignment().addGroup(gps[g]); - Color col = new Color((int) (Math.random() * 255), - (int) (Math.random() * 255), (int) (Math.random() * 255)); - col = col.brighter(); - for (SequenceI s:gps[g].getSequences()) - viewport.setSequenceColour( - s, col) - ; - } PaintRefresher.Refresh(this, viewport.getSequenceSetId()); alignPanel.updateAnnotation(); alignPanel.paintAlignment(true); } } + public void clearAlignmentSeqRep() + { + // TODO refactor alignmentseqrep to controller + if (viewport.getAlignment().hasSeqrep()) + { + viewport.getAlignment().setSeqrep(null); + PaintRefresher.Refresh(this, viewport.getSequenceSetId()); + alignPanel.updateAnnotation(); + alignPanel.paintAlignment(true); + } + } + + @Override + protected void createGroup_actionPerformed(ActionEvent e) + { + if (avc.createGroup()) + { + alignPanel.alignmentChanged(); + } + } + + @Override + protected void unGroup_actionPerformed(ActionEvent e) + { + if (avc.unGroup()) + { + alignPanel.alignmentChanged(); + } + } + /** * make the given alignmentPanel the currently selected tab - * + * * @param alignmentPanel */ public void setDisplayedView(AlignmentPanel alignmentPanel) @@ -5416,15 +5933,136 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, alignmentPanel.av.getSequenceSetId())) { throw new Error( - "Implementation error: cannot show a view from another alignment in an AlignFrame."); + 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)); } } + + /** + * Action on selection of menu options to Show or Hide annotations. + * + * @param visible + * @param forSequences + * update sequence-related annotations + * @param forAlignment + * update non-sequence-related annotations + */ + @Override + protected void setAnnotationsVisibility(boolean visible, + boolean forSequences, boolean forAlignment) + { + for (AlignmentAnnotation aa : alignPanel.getAlignment() + .getAlignmentAnnotation()) + { + /* + * 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) + { + aa.visible = visible; + } + } + alignPanel.validateAnnotationDimensions(true); + alignPanel.alignmentChanged(); + } + + /** + * Store selected annotation sort order for the view and repaint. + */ + @Override + protected void sortAnnotations_actionPerformed() + { + this.alignPanel.av.setSortAnnotationsBy(getAnnotationSortOrder()); + this.alignPanel.av + .setShowAutocalculatedAbove(isShowAutoCalculatedAbove()); + alignPanel.paintAlignment(true); + } + + /** + * + * @return alignment panels in this alignment frame + */ + 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(); + Set 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()])); + AlignFrame 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); + } + } } class PrintThread extends Thread