2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
3 * Copyright (C) 2014 The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
23 import jalview.analysis.AAFrequency;
24 import jalview.analysis.AlignmentSorter;
25 import jalview.analysis.AlignmentUtils;
26 import jalview.analysis.Conservation;
27 import jalview.analysis.CrossRef;
28 import jalview.analysis.NJTree;
29 import jalview.analysis.ParseProperties;
30 import jalview.analysis.SequenceIdMatcher;
31 import jalview.api.AlignViewControllerGuiI;
32 import jalview.api.AlignViewControllerI;
33 import jalview.api.analysis.ScoreModelI;
34 import jalview.bin.Cache;
35 import jalview.commands.CommandI;
36 import jalview.commands.EditCommand;
37 import jalview.commands.OrderCommand;
38 import jalview.commands.RemoveGapColCommand;
39 import jalview.commands.RemoveGapsCommand;
40 import jalview.commands.SlideSequencesCommand;
41 import jalview.commands.TrimRegionCommand;
42 import jalview.datamodel.AlignedCodonFrame;
43 import jalview.datamodel.Alignment;
44 import jalview.datamodel.AlignmentAnnotation;
45 import jalview.datamodel.AlignmentI;
46 import jalview.datamodel.AlignmentOrder;
47 import jalview.datamodel.AlignmentView;
48 import jalview.datamodel.ColumnSelection;
49 import jalview.datamodel.PDBEntry;
50 import jalview.datamodel.SeqCigar;
51 import jalview.datamodel.Sequence;
52 import jalview.datamodel.SequenceGroup;
53 import jalview.datamodel.SequenceI;
54 import jalview.io.AlignmentProperties;
55 import jalview.io.AnnotationFile;
56 import jalview.io.FeaturesFile;
57 import jalview.io.FileLoader;
58 import jalview.io.FormatAdapter;
59 import jalview.io.HTMLOutput;
60 import jalview.io.IdentifyFile;
61 import jalview.io.JalviewFileChooser;
62 import jalview.io.JalviewFileView;
63 import jalview.io.JnetAnnotationMaker;
64 import jalview.io.NewickFile;
65 import jalview.io.TCoffeeScoreFile;
66 import jalview.jbgui.GAlignFrame;
67 import jalview.schemes.Blosum62ColourScheme;
68 import jalview.schemes.BuriedColourScheme;
69 import jalview.schemes.ClustalxColourScheme;
70 import jalview.schemes.ColourSchemeI;
71 import jalview.schemes.ColourSchemeProperty;
72 import jalview.schemes.HelixColourScheme;
73 import jalview.schemes.HydrophobicColourScheme;
74 import jalview.schemes.NucleotideColourScheme;
75 import jalview.schemes.PIDColourScheme;
76 import jalview.schemes.PurinePyrimidineColourScheme;
77 import jalview.schemes.RNAHelicesColourChooser;
78 import jalview.schemes.ResidueProperties;
79 import jalview.schemes.StrandColourScheme;
80 import jalview.schemes.TCoffeeColourScheme;
81 import jalview.schemes.TaylorColourScheme;
82 import jalview.schemes.TurnColourScheme;
83 import jalview.schemes.UserColourScheme;
84 import jalview.schemes.ZappoColourScheme;
85 import jalview.util.MessageManager;
86 import jalview.ws.jws1.Discoverer;
87 import jalview.ws.jws2.Jws2Discoverer;
88 import jalview.ws.jws2.jabaws2.Jws2Instance;
89 import jalview.ws.seqfetcher.DbSourceProxy;
91 import java.awt.BorderLayout;
92 import java.awt.Component;
93 import java.awt.GridLayout;
94 import java.awt.Rectangle;
95 import java.awt.Toolkit;
96 import java.awt.datatransfer.Clipboard;
97 import java.awt.datatransfer.DataFlavor;
98 import java.awt.datatransfer.StringSelection;
99 import java.awt.datatransfer.Transferable;
100 import java.awt.dnd.DnDConstants;
101 import java.awt.dnd.DropTargetDragEvent;
102 import java.awt.dnd.DropTargetDropEvent;
103 import java.awt.dnd.DropTargetEvent;
104 import java.awt.dnd.DropTargetListener;
105 import java.awt.event.ActionEvent;
106 import java.awt.event.ActionListener;
107 import java.awt.event.KeyAdapter;
108 import java.awt.event.KeyEvent;
109 import java.awt.event.MouseAdapter;
110 import java.awt.event.MouseEvent;
111 import java.awt.print.PageFormat;
112 import java.awt.print.PrinterJob;
113 import java.beans.PropertyChangeEvent;
116 import java.util.ArrayList;
117 import java.util.Enumeration;
118 import java.util.Hashtable;
119 import java.util.List;
120 import java.util.Vector;
122 import javax.swing.JButton;
123 import javax.swing.JCheckBoxMenuItem;
124 import javax.swing.JEditorPane;
125 import javax.swing.JInternalFrame;
126 import javax.swing.JLabel;
127 import javax.swing.JLayeredPane;
128 import javax.swing.JMenu;
129 import javax.swing.JMenuItem;
130 import javax.swing.JOptionPane;
131 import javax.swing.JPanel;
132 import javax.swing.JProgressBar;
133 import javax.swing.JRadioButtonMenuItem;
134 import javax.swing.JScrollPane;
135 import javax.swing.SwingUtilities;
141 * @version $Revision$
143 public class AlignFrame extends GAlignFrame implements DropTargetListener,
144 IProgressIndicator, AlignViewControllerGuiI
148 public static final int DEFAULT_WIDTH = 700;
151 public static final int DEFAULT_HEIGHT = 500;
153 public AlignmentPanel alignPanel;
155 AlignViewport viewport;
157 public AlignViewControllerI avc;
159 Vector alignPanels = new Vector();
162 * Last format used to load or save alignments in this window
164 String currentFileFormat = null;
167 * Current filename for this alignment
169 String fileName = null;
172 * Creates a new AlignFrame object with specific width and height.
178 public AlignFrame(AlignmentI al, int width, int height)
180 this(al, null, width, height);
184 * Creates a new AlignFrame object with specific width, height and
190 * @param sequenceSetId
192 public AlignFrame(AlignmentI al, int width, int height,
193 String sequenceSetId)
195 this(al, null, width, height, sequenceSetId);
199 * Creates a new AlignFrame object with specific width, height and
205 * @param sequenceSetId
208 public AlignFrame(AlignmentI al, int width, int height,
209 String sequenceSetId, String viewId)
211 this(al, null, width, height, sequenceSetId, viewId);
215 * new alignment window with hidden columns
219 * @param hiddenColumns
220 * ColumnSelection or null
222 * Width of alignment frame
226 public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns,
227 int width, int height)
229 this(al, hiddenColumns, width, height, null);
233 * Create alignment frame for al with hiddenColumns, a specific width and
234 * height, and specific sequenceId
237 * @param hiddenColumns
240 * @param sequenceSetId
243 public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns,
244 int width, int height, String sequenceSetId)
246 this(al, hiddenColumns, width, height, sequenceSetId, null);
250 * Create alignment frame for al with hiddenColumns, a specific width and
251 * height, and specific sequenceId
254 * @param hiddenColumns
257 * @param sequenceSetId
262 public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns,
263 int width, int height, String sequenceSetId, String viewId)
265 setSize(width, height);
267 if (al.getDataset() == null)
272 viewport = new AlignViewport(al, hiddenColumns, sequenceSetId, viewId);
274 alignPanel = new AlignmentPanel(this, viewport);
277 addAlignmentPanel(alignPanel, true);
282 * Make a new AlignFrame from exisiting alignmentPanels
289 public AlignFrame(AlignmentPanel ap)
293 addAlignmentPanel(ap, false);
298 * initalise the alignframe from the underlying viewport data and the
303 avc = new jalview.controller.AlignViewController(this, viewport,
305 if (viewport.getAlignmentConservationAnnotation() == null)
307 BLOSUM62Colour.setEnabled(false);
308 conservationMenuItem.setEnabled(false);
309 modifyConservation.setEnabled(false);
310 // PIDColour.setEnabled(false);
311 // abovePIDThreshold.setEnabled(false);
312 // modifyPID.setEnabled(false);
315 String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT",
318 if (sortby.equals("Id"))
320 sortIDMenuItem_actionPerformed(null);
322 else if (sortby.equals("Pairwise Identity"))
324 sortPairwiseMenuItem_actionPerformed(null);
327 if (Desktop.desktop != null)
329 this.setDropTarget(new java.awt.dnd.DropTarget(this, this));
330 addServiceListeners();
331 setGUINucleotide(viewport.getAlignment().isNucleotide());
334 setMenusFromViewport(viewport);
335 buildSortByAnnotationScoresMenu();
338 if (viewport.wrapAlignment)
340 wrapMenuItem_actionPerformed(null);
343 if (jalview.bin.Cache.getDefault("SHOW_OVERVIEW", false))
345 this.overviewMenuItem_actionPerformed(null);
353 * Change the filename and format for the alignment, and enable the 'reload'
354 * button functionality.
361 public void setFileName(String file, String format)
364 currentFileFormat = format;
365 reload.setEnabled(true);
368 void addKeyListener()
370 addKeyListener(new KeyAdapter()
373 public void keyPressed(KeyEvent evt)
375 if (viewport.cursorMode
376 && ((evt.getKeyCode() >= KeyEvent.VK_0 && evt.getKeyCode() <= KeyEvent.VK_9) || (evt
377 .getKeyCode() >= KeyEvent.VK_NUMPAD0 && evt
378 .getKeyCode() <= KeyEvent.VK_NUMPAD9))
379 && Character.isDigit(evt.getKeyChar()))
380 alignPanel.seqPanel.numberPressed(evt.getKeyChar());
382 switch (evt.getKeyCode())
385 case 27: // escape key
386 deselectAllSequenceMenuItem_actionPerformed(null);
390 case KeyEvent.VK_DOWN:
391 if (evt.isAltDown() || !viewport.cursorMode)
392 moveSelectedSequences(false);
393 if (viewport.cursorMode)
394 alignPanel.seqPanel.moveCursor(0, 1);
398 if (evt.isAltDown() || !viewport.cursorMode)
399 moveSelectedSequences(true);
400 if (viewport.cursorMode)
401 alignPanel.seqPanel.moveCursor(0, -1);
405 case KeyEvent.VK_LEFT:
406 if (evt.isAltDown() || !viewport.cursorMode)
407 slideSequences(false, alignPanel.seqPanel.getKeyboardNo1());
409 alignPanel.seqPanel.moveCursor(-1, 0);
413 case KeyEvent.VK_RIGHT:
414 if (evt.isAltDown() || !viewport.cursorMode)
415 slideSequences(true, alignPanel.seqPanel.getKeyboardNo1());
417 alignPanel.seqPanel.moveCursor(1, 0);
420 case KeyEvent.VK_SPACE:
421 if (viewport.cursorMode)
423 alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown()
424 || evt.isShiftDown() || evt.isAltDown());
428 // case KeyEvent.VK_A:
429 // if (viewport.cursorMode)
431 // alignPanel.seqPanel.insertNucAtCursor(false,"A");
432 // //System.out.println("A");
436 * case KeyEvent.VK_CLOSE_BRACKET: if (viewport.cursorMode) {
437 * System.out.println("closing bracket"); } break;
439 case KeyEvent.VK_DELETE:
440 case KeyEvent.VK_BACK_SPACE:
441 if (!viewport.cursorMode)
443 cut_actionPerformed(null);
447 alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown()
448 || evt.isShiftDown() || evt.isAltDown());
454 if (viewport.cursorMode)
456 alignPanel.seqPanel.setCursorRow();
460 if (viewport.cursorMode && !evt.isControlDown())
462 alignPanel.seqPanel.setCursorColumn();
466 if (viewport.cursorMode)
468 alignPanel.seqPanel.setCursorPosition();
472 case KeyEvent.VK_ENTER:
473 case KeyEvent.VK_COMMA:
474 if (viewport.cursorMode)
476 alignPanel.seqPanel.setCursorRowAndColumn();
481 if (viewport.cursorMode)
483 alignPanel.seqPanel.setSelectionAreaAtCursor(true);
487 if (viewport.cursorMode)
489 alignPanel.seqPanel.setSelectionAreaAtCursor(false);
494 viewport.cursorMode = !viewport.cursorMode;
495 statusBar.setText(MessageManager.formatMessage(
496 "label.keyboard_editing_mode", new String[]
497 { (viewport.cursorMode ? "on" : "off") }));
498 if (viewport.cursorMode)
500 alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes;
501 alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq;
503 alignPanel.seqPanel.seqCanvas.repaint();
509 Help.showHelpWindow();
510 } catch (Exception ex)
512 ex.printStackTrace();
517 boolean toggleSeqs = !evt.isControlDown();
518 boolean toggleCols = !evt.isShiftDown();
519 toggleHiddenRegions(toggleSeqs, toggleCols);
522 case KeyEvent.VK_PAGE_UP:
523 if (viewport.wrapAlignment)
525 alignPanel.scrollUp(true);
529 alignPanel.setScrollValues(viewport.startRes, viewport.startSeq
530 - viewport.endSeq + viewport.startSeq);
533 case KeyEvent.VK_PAGE_DOWN:
534 if (viewport.wrapAlignment)
536 alignPanel.scrollUp(false);
540 alignPanel.setScrollValues(viewport.startRes, viewport.startSeq
541 + viewport.endSeq - viewport.startSeq);
548 public void keyReleased(KeyEvent evt)
550 switch (evt.getKeyCode())
552 case KeyEvent.VK_LEFT:
553 if (evt.isAltDown() || !viewport.cursorMode)
554 viewport.firePropertyChange("alignment", null, viewport
555 .getAlignment().getSequences());
558 case KeyEvent.VK_RIGHT:
559 if (evt.isAltDown() || !viewport.cursorMode)
560 viewport.firePropertyChange("alignment", null, viewport
561 .getAlignment().getSequences());
568 public void addAlignmentPanel(final AlignmentPanel ap, boolean newPanel)
570 ap.alignFrame = this;
571 avc = new jalview.controller.AlignViewController(this, viewport,
574 alignPanels.addElement(ap);
576 PaintRefresher.Register(ap, ap.av.getSequenceSetId());
578 int aSize = alignPanels.size();
580 tabbedPane.setVisible(aSize > 1 || ap.av.viewName != null);
582 if (aSize == 1 && ap.av.viewName == null)
584 this.getContentPane().add(ap, BorderLayout.CENTER);
590 setInitialTabVisible();
593 expandViews.setEnabled(true);
594 gatherViews.setEnabled(true);
595 tabbedPane.addTab(ap.av.viewName, ap);
597 ap.setVisible(false);
602 if (ap.av.isPadGaps())
604 ap.av.getAlignment().padGaps();
606 ap.av.updateConservation(ap);
607 ap.av.updateConsensus(ap);
608 ap.av.updateStrucConsensus(ap);
612 public void setInitialTabVisible()
614 expandViews.setEnabled(true);
615 gatherViews.setEnabled(true);
616 tabbedPane.setVisible(true);
617 AlignmentPanel first = (AlignmentPanel) alignPanels.firstElement();
618 tabbedPane.addTab(first.av.viewName, first);
619 this.getContentPane().add(tabbedPane, BorderLayout.CENTER);
622 public AlignViewport getViewport()
627 /* Set up intrinsic listeners for dynamically generated GUI bits. */
628 private void addServiceListeners()
630 final java.beans.PropertyChangeListener thisListener;
631 Desktop.instance.addJalviewPropertyChangeListener("services",
632 thisListener = new java.beans.PropertyChangeListener()
635 public void propertyChange(PropertyChangeEvent evt)
637 // // System.out.println("Discoverer property change.");
638 // if (evt.getPropertyName().equals("services"))
640 SwingUtilities.invokeLater(new Runnable()
647 .println("Rebuild WS Menu for service change");
648 BuildWebServiceMenu();
655 addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
658 public void internalFrameClosed(
659 javax.swing.event.InternalFrameEvent evt)
661 System.out.println("deregistering discoverer listener");
662 Desktop.instance.removeJalviewPropertyChangeListener("services",
664 closeMenuItem_actionPerformed(true);
667 // Finally, build the menu once to get current service state
668 new Thread(new Runnable()
673 BuildWebServiceMenu();
678 public void setGUINucleotide(boolean nucleotide)
680 showTranslation.setVisible(nucleotide);
681 conservationMenuItem.setEnabled(!nucleotide);
682 modifyConservation.setEnabled(!nucleotide);
683 showGroupConservation.setEnabled(!nucleotide);
684 rnahelicesColour.setEnabled(nucleotide);
685 purinePyrimidineColour.setEnabled(nucleotide);
686 // Remember AlignFrame always starts as protein
690 // calculateMenu.remove(calculateMenu.getItemCount() - 2);
695 * set up menus for the currently viewport. This may be called after any
696 * operation that affects the data in the current view (selection changed,
697 * etc) to update the menus to reflect the new state.
699 public void setMenusForViewport()
701 setMenusFromViewport(viewport);
705 * Need to call this method when tabs are selected for multiple views, or when
706 * loading from Jalview2XML.java
711 void setMenusFromViewport(AlignViewport av)
713 padGapsMenuitem.setSelected(av.isPadGaps());
714 colourTextMenuItem.setSelected(av.showColourText);
715 abovePIDThreshold.setSelected(av.getAbovePIDThreshold());
716 conservationMenuItem.setSelected(av.getConservationSelected());
717 seqLimits.setSelected(av.getShowJVSuffix());
718 idRightAlign.setSelected(av.rightAlignIds);
719 centreColumnLabelsMenuItem.setState(av.centreColumnLabels);
720 renderGapsMenuItem.setSelected(av.renderGaps);
721 wrapMenuItem.setSelected(av.wrapAlignment);
722 scaleAbove.setVisible(av.wrapAlignment);
723 scaleLeft.setVisible(av.wrapAlignment);
724 scaleRight.setVisible(av.wrapAlignment);
725 annotationPanelMenuItem.setState(av.showAnnotation);
727 * Show/hide all annotations only enabled if annotation panel is shown
729 showAllAnnotations.setEnabled(annotationPanelMenuItem.getState());
730 hideAllAnnotations.setEnabled(annotationPanelMenuItem.getState());
731 viewBoxesMenuItem.setSelected(av.showBoxes);
732 viewTextMenuItem.setSelected(av.showText);
733 showNonconservedMenuItem.setSelected(av.getShowUnconserved());
734 showGroupConsensus.setSelected(av.isShowGroupConsensus());
735 showGroupConservation.setSelected(av.isShowGroupConservation());
736 showConsensusHistogram.setSelected(av.isShowConsensusHistogram());
737 showSequenceLogo.setSelected(av.isShowSequenceLogo());
738 normaliseSequenceLogo.setSelected(av.isNormaliseSequenceLogo());
740 setColourSelected(ColourSchemeProperty.getColourName(av
741 .getGlobalColourScheme()));
743 showSeqFeatures.setSelected(av.showSequenceFeatures);
744 hiddenMarkers.setState(av.showHiddenMarkers);
745 applyToAllGroups.setState(av.getColourAppliesToAllGroups());
746 showNpFeatsMenuitem.setSelected(av.isShowNpFeats());
747 showDbRefsMenuitem.setSelected(av.isShowDbRefs());
748 autoCalculate.setSelected(av.autoCalculateConsensus);
749 sortByTree.setSelected(av.sortByTree);
750 listenToViewSelections.setSelected(av.followSelection);
751 rnahelicesColour.setEnabled(av.getAlignment().hasRNAStructure());
753 .setSelected(av.getGlobalColourScheme() instanceof jalview.schemes.RNAHelicesColour);
754 setShowProductsEnabled();
758 // methods for implementing IProgressIndicator
759 // need to refactor to a reusable stub class
760 Hashtable progressBars, progressBarHandlers;
765 * @see jalview.gui.IProgressIndicator#setProgressBar(java.lang.String, long)
768 public void setProgressBar(String message, long id)
770 if (progressBars == null)
772 progressBars = new Hashtable();
773 progressBarHandlers = new Hashtable();
776 JPanel progressPanel;
777 Long lId = new Long(id);
778 GridLayout layout = (GridLayout) statusPanel.getLayout();
779 if (progressBars.get(lId) != null)
781 progressPanel = (JPanel) progressBars.get(new Long(id));
782 statusPanel.remove(progressPanel);
783 progressBars.remove(lId);
784 progressPanel = null;
787 statusBar.setText(message);
789 if (progressBarHandlers.contains(lId))
791 progressBarHandlers.remove(lId);
793 layout.setRows(layout.getRows() - 1);
797 progressPanel = new JPanel(new BorderLayout(10, 5));
799 JProgressBar progressBar = new JProgressBar();
800 progressBar.setIndeterminate(true);
802 progressPanel.add(new JLabel(message), BorderLayout.WEST);
803 progressPanel.add(progressBar, BorderLayout.CENTER);
805 layout.setRows(layout.getRows() + 1);
806 statusPanel.add(progressPanel);
808 progressBars.put(lId, progressPanel);
811 // setMenusForViewport();
816 public void registerHandler(final long id,
817 final IProgressIndicatorHandler handler)
819 if (progressBarHandlers == null || !progressBars.contains(new Long(id)))
821 throw new Error(MessageManager.getString("error.call_setprogressbar_before_registering_handler"));
823 progressBarHandlers.put(new Long(id), handler);
824 final JPanel progressPanel = (JPanel) progressBars.get(new Long(id));
825 if (handler.canCancel())
827 JButton cancel = new JButton(
828 MessageManager.getString("action.cancel"));
829 final IProgressIndicator us = this;
830 cancel.addActionListener(new ActionListener()
834 public void actionPerformed(ActionEvent e)
836 handler.cancelActivity(id);
837 us.setProgressBar(MessageManager.formatMessage("label.cancelled_params", new String[]{((JLabel) progressPanel.getComponent(0)).getText()}), id);
840 progressPanel.add(cancel, BorderLayout.EAST);
846 * @return true if any progress bars are still active
849 public boolean operationInProgress()
851 if (progressBars != null && progressBars.size() > 0)
859 public void setStatus(String text)
861 statusBar.setText(text);
865 * Added so Castor Mapping file can obtain Jalview Version
867 public String getVersion()
869 return jalview.bin.Cache.getProperty("VERSION");
872 public FeatureRenderer getFeatureRenderer()
874 return alignPanel.seqPanel.seqCanvas.getFeatureRenderer();
878 public void fetchSequence_actionPerformed(ActionEvent e)
880 new SequenceFetcher(this);
884 public void addFromFile_actionPerformed(ActionEvent e)
886 Desktop.instance.inputLocalFileMenuItem_actionPerformed(viewport);
890 public void reload_actionPerformed(ActionEvent e)
892 if (fileName != null)
894 // TODO: JAL-1108 - ensure all associated frames are closed regardless of
895 // originating file's format
896 // TODO: work out how to recover feature settings for correct view(s) when
898 if (currentFileFormat.equals("Jalview"))
900 JInternalFrame[] frames = Desktop.desktop.getAllFrames();
901 for (int i = 0; i < frames.length; i++)
903 if (frames[i] instanceof AlignFrame && frames[i] != this
904 && ((AlignFrame) frames[i]).fileName != null
905 && ((AlignFrame) frames[i]).fileName.equals(fileName))
909 frames[i].setSelected(true);
910 Desktop.instance.closeAssociatedWindows();
911 } catch (java.beans.PropertyVetoException ex)
917 Desktop.instance.closeAssociatedWindows();
919 FileLoader loader = new FileLoader();
920 String protocol = fileName.startsWith("http:") ? "URL" : "File";
921 loader.LoadFile(viewport, fileName, protocol, currentFileFormat);
925 Rectangle bounds = this.getBounds();
927 FileLoader loader = new FileLoader();
928 String protocol = fileName.startsWith("http:") ? "URL" : "File";
929 AlignFrame newframe = loader.LoadFileWaitTillLoaded(fileName,
930 protocol, currentFileFormat);
932 newframe.setBounds(bounds);
933 if (featureSettings != null && featureSettings.isShowing())
935 final Rectangle fspos = featureSettings.frame.getBounds();
936 // TODO: need a 'show feature settings' function that takes bounds -
937 // need to refactor Desktop.addFrame
938 newframe.featureSettings_actionPerformed(null);
939 final FeatureSettings nfs = newframe.featureSettings;
940 SwingUtilities.invokeLater(new Runnable()
945 nfs.frame.setBounds(fspos);
948 this.featureSettings.close();
949 this.featureSettings = null;
951 this.closeMenuItem_actionPerformed(true);
957 public void addFromText_actionPerformed(ActionEvent e)
959 Desktop.instance.inputTextboxMenuItem_actionPerformed(viewport);
963 public void addFromURL_actionPerformed(ActionEvent e)
965 Desktop.instance.inputURLMenuItem_actionPerformed(viewport);
969 public void save_actionPerformed(ActionEvent e)
972 || (currentFileFormat == null || !jalview.io.FormatAdapter
973 .isValidIOFormat(currentFileFormat, true))
974 || fileName.startsWith("http"))
976 saveAs_actionPerformed(null);
980 saveAlignment(fileName, currentFileFormat);
991 public void saveAs_actionPerformed(ActionEvent e)
993 JalviewFileChooser chooser = new JalviewFileChooser(
994 jalview.bin.Cache.getProperty("LAST_DIRECTORY"),
995 jalview.io.AppletFormatAdapter.WRITABLE_EXTENSIONS,
996 jalview.io.AppletFormatAdapter.WRITABLE_FNAMES,
997 currentFileFormat, false);
999 chooser.setFileView(new JalviewFileView());
1000 chooser.setDialogTitle(MessageManager.getString("label.save_alignment_to_file"));
1001 chooser.setToolTipText(MessageManager.getString("action.save"));
1003 int value = chooser.showSaveDialog(this);
1005 if (value == JalviewFileChooser.APPROVE_OPTION)
1007 currentFileFormat = chooser.getSelectedFormat();
1008 if (currentFileFormat == null)
1011 .showInternalMessageDialog(
1014 .getString("label.select_file_format_before_saving"),
1016 .getString("label.file_format_not_specified"),
1017 JOptionPane.WARNING_MESSAGE);
1018 value = chooser.showSaveDialog(this);
1022 fileName = chooser.getSelectedFile().getPath();
1024 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
1027 jalview.bin.Cache.setProperty("LAST_DIRECTORY", fileName);
1028 if (currentFileFormat.indexOf(" ") > -1)
1030 currentFileFormat = currentFileFormat.substring(0,
1031 currentFileFormat.indexOf(" "));
1033 saveAlignment(fileName, currentFileFormat);
1037 public boolean saveAlignment(String file, String format)
1039 boolean success = true;
1041 if (format.equalsIgnoreCase("Jalview"))
1043 String shortName = title;
1045 if (shortName.indexOf(java.io.File.separatorChar) > -1)
1047 shortName = shortName.substring(shortName
1048 .lastIndexOf(java.io.File.separatorChar) + 1);
1051 success = new Jalview2XML().SaveAlignment(this, file, shortName);
1053 statusBar.setText(MessageManager.formatMessage(
1054 "label.successfully_saved_to_file_in_format", new String[]
1055 { fileName, format }));
1060 if (!jalview.io.AppletFormatAdapter.isValidFormat(format, true))
1062 warningMessage("Cannot save file " + fileName + " using format "
1063 + format, "Alignment output format not supported");
1064 saveAs_actionPerformed(null);
1065 // JBPNote need to have a raise_gui flag here
1069 String[] omitHidden = null;
1071 if (viewport.hasHiddenColumns())
1073 int reply = JOptionPane
1074 .showInternalConfirmDialog(
1077 .getString("label.alignment_contains_hidden_columns"),
1079 .getString("action.save_omit_hidden_columns"),
1080 JOptionPane.YES_NO_OPTION,
1081 JOptionPane.QUESTION_MESSAGE);
1083 if (reply == JOptionPane.YES_OPTION)
1085 omitHidden = viewport.getViewAsString(false);
1088 FormatAdapter f = new FormatAdapter();
1089 String output = f.formatSequences(format,
1090 viewport.getAlignment(), // class cast exceptions will
1091 // occur in the distant future
1092 omitHidden, f.getCacheSuffixDefault(format),
1093 viewport.getColumnSelection());
1103 java.io.PrintWriter out = new java.io.PrintWriter(
1104 new java.io.FileWriter(file));
1108 this.setTitle(file);
1109 statusBar.setText(MessageManager.formatMessage(
1110 "label.successfully_saved_to_file_in_format",
1112 { fileName, format }));
1113 } catch (Exception ex)
1116 ex.printStackTrace();
1123 JOptionPane.showInternalMessageDialog(this, MessageManager
1124 .formatMessage("label.couldnt_save_file", new String[]
1125 { fileName }), MessageManager
1126 .getString("label.error_saving_file"),
1127 JOptionPane.WARNING_MESSAGE);
1133 private void warningMessage(String warning, String title)
1135 if (new jalview.util.Platform().isHeadless())
1137 System.err.println("Warning: " + title + "\nWarning: " + warning);
1142 JOptionPane.showInternalMessageDialog(this, warning, title,
1143 JOptionPane.WARNING_MESSAGE);
1155 protected void outputText_actionPerformed(ActionEvent e)
1157 String[] omitHidden = null;
1159 if (viewport.hasHiddenColumns())
1161 int reply = JOptionPane
1162 .showInternalConfirmDialog(
1165 .getString("label.alignment_contains_hidden_columns"),
1167 .getString("action.save_omit_hidden_columns"),
1168 JOptionPane.YES_NO_OPTION,
1169 JOptionPane.QUESTION_MESSAGE);
1171 if (reply == JOptionPane.YES_OPTION)
1173 omitHidden = viewport.getViewAsString(false);
1177 CutAndPasteTransfer cap = new CutAndPasteTransfer();
1178 cap.setForInput(null);
1182 cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
1183 viewport.getAlignment(), omitHidden,
1184 viewport.getColumnSelection()));
1185 Desktop.addInternalFrame(cap, MessageManager.formatMessage(
1186 "label.alignment_output_command", new String[]
1187 { e.getActionCommand() }), 600, 500);
1188 } catch (OutOfMemoryError oom)
1190 new OOMWarning("Outputting alignment as " + e.getActionCommand(), oom);
1203 protected void htmlMenuItem_actionPerformed(ActionEvent e)
1205 new HTMLOutput(alignPanel,
1206 alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
1207 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
1210 public void createImageMap(File file, String image)
1212 alignPanel.makePNGImageMap(file, image);
1222 public void createPNG(File f)
1224 alignPanel.makePNG(f);
1234 public void createEPS(File f)
1236 alignPanel.makeEPS(f);
1240 public void pageSetup_actionPerformed(ActionEvent e)
1242 PrinterJob printJob = PrinterJob.getPrinterJob();
1243 PrintThread.pf = printJob.pageDialog(printJob.defaultPage());
1253 public void printMenuItem_actionPerformed(ActionEvent e)
1255 // Putting in a thread avoids Swing painting problems
1256 PrintThread thread = new PrintThread(alignPanel);
1261 public void exportFeatures_actionPerformed(ActionEvent e)
1263 new AnnotationExporter().exportFeatures(alignPanel);
1267 public void exportAnnotations_actionPerformed(ActionEvent e)
1269 new AnnotationExporter().exportAnnotations(alignPanel,
1270 viewport.showAnnotation ? viewport.getAlignment()
1271 .getAlignmentAnnotation() : null, viewport
1272 .getAlignment().getGroups(), ((Alignment) viewport
1273 .getAlignment()).alignmentProperties);
1277 public void associatedData_actionPerformed(ActionEvent e)
1279 // Pick the tree file
1280 JalviewFileChooser chooser = new JalviewFileChooser(
1281 jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
1282 chooser.setFileView(new JalviewFileView());
1283 chooser.setDialogTitle(MessageManager
1284 .getString("label.load_jalview_annotations"));
1285 chooser.setToolTipText(MessageManager
1286 .getString("label.load_jalview_annotations"));
1288 int value = chooser.showOpenDialog(null);
1290 if (value == JalviewFileChooser.APPROVE_OPTION)
1292 String choice = chooser.getSelectedFile().getPath();
1293 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
1294 loadJalviewDataFile(choice, null, null, null);
1300 * Close the current view or all views in the alignment frame. If the frame
1301 * only contains one view then the alignment will be removed from memory.
1303 * @param closeAllTabs
1306 public void closeMenuItem_actionPerformed(boolean closeAllTabs)
1308 if (alignPanels != null && alignPanels.size() < 2)
1310 closeAllTabs = true;
1315 if (alignPanels != null)
1319 if (this.isClosed())
1321 // really close all the windows - otherwise wait till
1322 // setClosed(true) is called
1323 for (int i = 0; i < alignPanels.size(); i++)
1325 AlignmentPanel ap = (AlignmentPanel) alignPanels.elementAt(i);
1332 closeView(alignPanel);
1338 this.setClosed(true);
1340 } catch (Exception ex)
1342 ex.printStackTrace();
1347 * close alignPanel2 and shuffle tabs appropriately.
1349 * @param alignPanel2
1351 public void closeView(AlignmentPanel alignPanel2)
1353 int index = tabbedPane.getSelectedIndex();
1354 int closedindex = tabbedPane.indexOfComponent(alignPanel2);
1355 alignPanels.removeElement(alignPanel2);
1357 // if (viewport == alignPanel2.av)
1361 alignPanel2.closePanel();
1364 tabbedPane.removeTabAt(closedindex);
1365 tabbedPane.validate();
1367 if (index > closedindex || index == tabbedPane.getTabCount())
1369 // modify currently selected tab index if necessary.
1373 this.tabSelectionChanged(index);
1379 void updateEditMenuBar()
1382 if (viewport.historyList.size() > 0)
1384 undoMenuItem.setEnabled(true);
1385 CommandI command = (CommandI) viewport.historyList.peek();
1386 undoMenuItem.setText(MessageManager.formatMessage(
1387 "label.undo_command", new String[]
1388 { command.getDescription() }));
1392 undoMenuItem.setEnabled(false);
1393 undoMenuItem.setText(MessageManager.getString("action.undo"));
1396 if (viewport.redoList.size() > 0)
1398 redoMenuItem.setEnabled(true);
1400 CommandI command = (CommandI) viewport.redoList.peek();
1401 redoMenuItem.setText(MessageManager.formatMessage(
1402 "label.redo_command", new String[]
1403 { command.getDescription() }));
1407 redoMenuItem.setEnabled(false);
1408 redoMenuItem.setText(MessageManager.getString("action.redo"));
1412 public void addHistoryItem(CommandI command)
1414 if (command.getSize() > 0)
1416 viewport.historyList.push(command);
1417 viewport.redoList.clear();
1418 updateEditMenuBar();
1419 viewport.updateHiddenColumns();
1420 // viewport.hasHiddenColumns = (viewport.getColumnSelection() != null
1421 // && viewport.getColumnSelection().getHiddenColumns() != null &&
1422 // viewport.getColumnSelection()
1423 // .getHiddenColumns().size() > 0);
1429 * @return alignment objects for all views
1431 AlignmentI[] getViewAlignments()
1433 if (alignPanels != null)
1435 Enumeration e = alignPanels.elements();
1436 AlignmentI[] als = new AlignmentI[alignPanels.size()];
1437 for (int i = 0; e.hasMoreElements(); i++)
1439 als[i] = ((AlignmentPanel) e.nextElement()).av.getAlignment();
1443 if (viewport != null)
1445 return new AlignmentI[]
1446 { viewport.getAlignment() };
1458 protected void undoMenuItem_actionPerformed(ActionEvent e)
1460 if (viewport.historyList.empty())
1462 CommandI command = (CommandI) viewport.historyList.pop();
1463 viewport.redoList.push(command);
1464 command.undoCommand(getViewAlignments());
1466 AlignViewport originalSource = getOriginatingSource(command);
1467 updateEditMenuBar();
1469 if (originalSource != null)
1471 if (originalSource != viewport)
1474 .warn("Implementation worry: mismatch of viewport origin for undo");
1476 originalSource.updateHiddenColumns();
1477 // originalSource.hasHiddenColumns = (viewport.getColumnSelection() !=
1479 // && viewport.getColumnSelection().getHiddenColumns() != null &&
1480 // viewport.getColumnSelection()
1481 // .getHiddenColumns().size() > 0);
1482 originalSource.firePropertyChange("alignment", null, originalSource
1483 .getAlignment().getSequences());
1494 protected void redoMenuItem_actionPerformed(ActionEvent e)
1496 if (viewport.redoList.size() < 1)
1501 CommandI command = (CommandI) viewport.redoList.pop();
1502 viewport.historyList.push(command);
1503 command.doCommand(getViewAlignments());
1505 AlignViewport originalSource = getOriginatingSource(command);
1506 updateEditMenuBar();
1508 if (originalSource != null)
1511 if (originalSource != viewport)
1514 .warn("Implementation worry: mismatch of viewport origin for redo");
1516 originalSource.updateHiddenColumns();
1517 // originalSource.hasHiddenColumns = (viewport.getColumnSelection() !=
1519 // && viewport.getColumnSelection().getHiddenColumns() != null &&
1520 // viewport.getColumnSelection()
1521 // .getHiddenColumns().size() > 0);
1522 originalSource.firePropertyChange("alignment", null, originalSource
1523 .getAlignment().getSequences());
1527 AlignViewport getOriginatingSource(CommandI command)
1529 AlignViewport originalSource = null;
1530 // For sequence removal and addition, we need to fire
1531 // the property change event FROM the viewport where the
1532 // original alignment was altered
1533 AlignmentI al = null;
1534 if (command instanceof EditCommand)
1536 EditCommand editCommand = (EditCommand) command;
1537 al = editCommand.getAlignment();
1538 Vector comps = (Vector) PaintRefresher.components.get(viewport
1539 .getSequenceSetId());
1541 for (int i = 0; i < comps.size(); i++)
1543 if (comps.elementAt(i) instanceof AlignmentPanel)
1545 if (al == ((AlignmentPanel) comps.elementAt(i)).av.getAlignment())
1547 originalSource = ((AlignmentPanel) comps.elementAt(i)).av;
1554 if (originalSource == null)
1556 // The original view is closed, we must validate
1557 // the current view against the closed view first
1560 PaintRefresher.validateSequences(al, viewport.getAlignment());
1563 originalSource = viewport;
1566 return originalSource;
1575 public void moveSelectedSequences(boolean up)
1577 SequenceGroup sg = viewport.getSelectionGroup();
1583 viewport.getAlignment().moveSelectedSequencesByOne(sg,
1584 viewport.getHiddenRepSequences(), up);
1585 alignPanel.paintAlignment(true);
1588 synchronized void slideSequences(boolean right, int size)
1590 List<SequenceI> sg = new Vector();
1591 if (viewport.cursorMode)
1593 sg.add(viewport.getAlignment().getSequenceAt(
1594 alignPanel.seqPanel.seqCanvas.cursorY));
1596 else if (viewport.getSelectionGroup() != null
1597 && viewport.getSelectionGroup().getSize() != viewport
1598 .getAlignment().getHeight())
1600 sg = viewport.getSelectionGroup().getSequences(
1601 viewport.getHiddenRepSequences());
1609 Vector invertGroup = new Vector();
1611 for (int i = 0; i < viewport.getAlignment().getHeight(); i++)
1613 if (!sg.contains(viewport.getAlignment().getSequenceAt(i)))
1614 invertGroup.add(viewport.getAlignment().getSequenceAt(i));
1617 SequenceI[] seqs1 = sg.toArray(new SequenceI[0]);
1619 SequenceI[] seqs2 = new SequenceI[invertGroup.size()];
1620 for (int i = 0; i < invertGroup.size(); i++)
1621 seqs2[i] = (SequenceI) invertGroup.elementAt(i);
1623 SlideSequencesCommand ssc;
1625 ssc = new SlideSequencesCommand("Slide Sequences", seqs2, seqs1,
1626 size, viewport.getGapCharacter());
1628 ssc = new SlideSequencesCommand("Slide Sequences", seqs1, seqs2,
1629 size, viewport.getGapCharacter());
1631 int groupAdjustment = 0;
1632 if (ssc.getGapsInsertedBegin() && right)
1634 if (viewport.cursorMode)
1635 alignPanel.seqPanel.moveCursor(size, 0);
1637 groupAdjustment = size;
1639 else if (!ssc.getGapsInsertedBegin() && !right)
1641 if (viewport.cursorMode)
1642 alignPanel.seqPanel.moveCursor(-size, 0);
1644 groupAdjustment = -size;
1647 if (groupAdjustment != 0)
1649 viewport.getSelectionGroup().setStartRes(
1650 viewport.getSelectionGroup().getStartRes() + groupAdjustment);
1651 viewport.getSelectionGroup().setEndRes(
1652 viewport.getSelectionGroup().getEndRes() + groupAdjustment);
1655 boolean appendHistoryItem = false;
1656 if (viewport.historyList != null && viewport.historyList.size() > 0
1657 && viewport.historyList.peek() instanceof SlideSequencesCommand)
1659 appendHistoryItem = ssc
1660 .appendSlideCommand((SlideSequencesCommand) viewport.historyList
1664 if (!appendHistoryItem)
1665 addHistoryItem(ssc);
1677 protected void copy_actionPerformed(ActionEvent e)
1680 if (viewport.getSelectionGroup() == null)
1684 // TODO: preserve the ordering of displayed alignment annotation in any
1685 // internal paste (particularly sequence associated annotation)
1686 SequenceI[] seqs = viewport.getSelectionAsNewSequence();
1687 String[] omitHidden = null;
1689 if (viewport.hasHiddenColumns())
1691 omitHidden = viewport.getViewAsString(true);
1694 String output = new FormatAdapter().formatSequences("Fasta", seqs,
1697 StringSelection ss = new StringSelection(output);
1701 jalview.gui.Desktop.internalCopy = true;
1702 // Its really worth setting the clipboard contents
1703 // to empty before setting the large StringSelection!!
1704 Toolkit.getDefaultToolkit().getSystemClipboard()
1705 .setContents(new StringSelection(""), null);
1707 Toolkit.getDefaultToolkit().getSystemClipboard()
1708 .setContents(ss, Desktop.instance);
1709 } catch (OutOfMemoryError er)
1711 new OOMWarning("copying region", er);
1715 Vector hiddenColumns = null;
1716 if (viewport.hasHiddenColumns())
1718 hiddenColumns = new Vector();
1719 int hiddenOffset = viewport.getSelectionGroup().getStartRes(), hiddenCutoff = viewport
1720 .getSelectionGroup().getEndRes();
1721 for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns()
1724 int[] region = (int[]) viewport.getColumnSelection()
1725 .getHiddenColumns().elementAt(i);
1726 if (region[0] >= hiddenOffset && region[1] <= hiddenCutoff)
1728 hiddenColumns.addElement(new int[]
1729 { region[0] - hiddenOffset, region[1] - hiddenOffset });
1734 Desktop.jalviewClipboard = new Object[]
1735 { seqs, viewport.getAlignment().getDataset(), hiddenColumns };
1736 statusBar.setText(MessageManager.formatMessage(
1737 "label.copied_sequences_to_clipboard", new String[]
1738 { Integer.valueOf(seqs.length).toString() }));
1748 protected void pasteNew_actionPerformed(ActionEvent e)
1760 protected void pasteThis_actionPerformed(ActionEvent e)
1766 * Paste contents of Jalview clipboard
1768 * @param newAlignment
1769 * true to paste to a new alignment, otherwise add to this.
1771 void paste(boolean newAlignment)
1773 boolean externalPaste = true;
1776 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
1777 Transferable contents = c.getContents(this);
1779 if (contents == null)
1787 str = (String) contents.getTransferData(DataFlavor.stringFlavor);
1788 if (str.length() < 1)
1793 format = new IdentifyFile().Identify(str, "Paste");
1795 } catch (OutOfMemoryError er)
1797 new OOMWarning("Out of memory pasting sequences!!", er);
1801 SequenceI[] sequences;
1802 boolean annotationAdded = false;
1803 AlignmentI alignment = null;
1805 if (Desktop.jalviewClipboard != null)
1807 // The clipboard was filled from within Jalview, we must use the
1809 // And dataset from the copied alignment
1810 SequenceI[] newseq = (SequenceI[]) Desktop.jalviewClipboard[0];
1811 // be doubly sure that we create *new* sequence objects.
1812 sequences = new SequenceI[newseq.length];
1813 for (int i = 0; i < newseq.length; i++)
1815 sequences[i] = new Sequence(newseq[i]);
1817 alignment = new Alignment(sequences);
1818 externalPaste = false;
1822 // parse the clipboard as an alignment.
1823 alignment = new FormatAdapter().readFile(str, "Paste", format);
1824 sequences = alignment.getSequencesArray();
1828 ArrayList<Integer> newGraphGroups = new ArrayList<Integer>();
1834 if (Desktop.jalviewClipboard != null)
1836 // dataset is inherited
1837 alignment.setDataset((Alignment) Desktop.jalviewClipboard[1]);
1841 // new dataset is constructed
1842 alignment.setDataset(null);
1844 alwidth = alignment.getWidth() + 1;
1848 AlignmentI pastedal = alignment; // preserve pasted alignment object
1849 // Add pasted sequences and dataset into existing alignment.
1850 alignment = viewport.getAlignment();
1851 alwidth = alignment.getWidth() + 1;
1852 // decide if we need to import sequences from an existing dataset
1853 boolean importDs = Desktop.jalviewClipboard != null
1854 && Desktop.jalviewClipboard[1] != alignment.getDataset();
1855 // importDs==true instructs us to copy over new dataset sequences from
1856 // an existing alignment
1857 Vector newDs = (importDs) ? new Vector() : null; // used to create
1858 // minimum dataset set
1860 for (int i = 0; i < sequences.length; i++)
1864 newDs.addElement(null);
1866 SequenceI ds = sequences[i].getDatasetSequence(); // null for a simple
1868 if (importDs && ds != null)
1870 if (!newDs.contains(ds))
1872 newDs.setElementAt(ds, i);
1873 ds = new Sequence(ds);
1874 // update with new dataset sequence
1875 sequences[i].setDatasetSequence(ds);
1879 ds = sequences[newDs.indexOf(ds)].getDatasetSequence();
1884 // copy and derive new dataset sequence
1885 sequences[i] = sequences[i].deriveSequence();
1886 alignment.getDataset().addSequence(
1887 sequences[i].getDatasetSequence());
1888 // TODO: avoid creation of duplicate dataset sequences with a
1889 // 'contains' method using SequenceI.equals()/SequenceI.contains()
1891 alignment.addSequence(sequences[i]); // merges dataset
1895 newDs.clear(); // tidy up
1897 if (alignment.getAlignmentAnnotation() != null)
1899 for (AlignmentAnnotation alan : alignment
1900 .getAlignmentAnnotation())
1902 if (alan.graphGroup > fgroup)
1904 fgroup = alan.graphGroup;
1908 if (pastedal.getAlignmentAnnotation() != null)
1910 // Add any annotation attached to alignment.
1911 AlignmentAnnotation[] alann = pastedal.getAlignmentAnnotation();
1912 for (int i = 0; i < alann.length; i++)
1914 annotationAdded = true;
1915 if (alann[i].sequenceRef == null && !alann[i].autoCalculated)
1917 AlignmentAnnotation newann = new AlignmentAnnotation(alann[i]);
1918 if (newann.graphGroup > -1)
1920 if (newGraphGroups.size() <= newann.graphGroup
1921 || newGraphGroups.get(newann.graphGroup) == null)
1923 for (int q = newGraphGroups.size(); q <= newann.graphGroup; q++)
1925 newGraphGroups.add(q, null);
1927 newGraphGroups.set(newann.graphGroup, new Integer(
1930 newann.graphGroup = newGraphGroups.get(newann.graphGroup)
1934 newann.padAnnotation(alwidth);
1935 alignment.addAnnotation(newann);
1945 addHistoryItem(new EditCommand(MessageManager.getString("label.add_sequences"), EditCommand.PASTE,
1946 sequences, 0, alignment.getWidth(), alignment));
1948 // Add any annotations attached to sequences
1949 for (int i = 0; i < sequences.length; i++)
1951 if (sequences[i].getAnnotation() != null)
1953 AlignmentAnnotation newann;
1954 for (int a = 0; a < sequences[i].getAnnotation().length; a++)
1956 annotationAdded = true;
1957 newann = sequences[i].getAnnotation()[a];
1958 newann.adjustForAlignment();
1959 newann.padAnnotation(alwidth);
1960 if (newann.graphGroup > -1)
1962 if (newann.graphGroup > -1)
1964 if (newGraphGroups.size() <= newann.graphGroup
1965 || newGraphGroups.get(newann.graphGroup) == null)
1967 for (int q = newGraphGroups.size(); q <= newann.graphGroup; q++)
1969 newGraphGroups.add(q, null);
1971 newGraphGroups.set(newann.graphGroup, new Integer(
1974 newann.graphGroup = newGraphGroups.get(newann.graphGroup)
1978 alignment.addAnnotation(sequences[i].getAnnotation()[a]); // annotation
1983 .setAnnotationIndex(sequences[i].getAnnotation()[a], a);
1990 // propagate alignment changed.
1991 viewport.setEndSeq(alignment.getHeight());
1992 if (annotationAdded)
1994 // Duplicate sequence annotation in all views.
1995 AlignmentI[] alview = this.getViewAlignments();
1996 for (int i = 0; i < sequences.length; i++)
1998 AlignmentAnnotation sann[] = sequences[i].getAnnotation();
2001 for (int avnum = 0; avnum < alview.length; avnum++)
2003 if (alview[avnum] != alignment)
2005 // duplicate in a view other than the one with input focus
2006 int avwidth = alview[avnum].getWidth() + 1;
2007 // this relies on sann being preserved after we
2008 // modify the sequence's annotation array for each duplication
2009 for (int a = 0; a < sann.length; a++)
2011 AlignmentAnnotation newann = new AlignmentAnnotation(
2013 sequences[i].addAlignmentAnnotation(newann);
2014 newann.padAnnotation(avwidth);
2015 alview[avnum].addAnnotation(newann); // annotation was
2016 // duplicated earlier
2017 // TODO JAL-1145 graphGroups are not updated for sequence
2018 // annotation added to several views. This may cause
2020 alview[avnum].setAnnotationIndex(newann, a);
2025 buildSortByAnnotationScoresMenu();
2027 viewport.firePropertyChange("alignment", null,
2028 alignment.getSequences());
2029 if (alignPanels != null)
2031 for (AlignmentPanel ap : ((Vector<AlignmentPanel>) alignPanels))
2033 ap.validateAnnotationDimensions(false);
2038 alignPanel.validateAnnotationDimensions(false);
2044 AlignFrame af = new AlignFrame(alignment, DEFAULT_WIDTH,
2046 String newtitle = new String("Copied sequences");
2048 if (Desktop.jalviewClipboard != null
2049 && Desktop.jalviewClipboard[2] != null)
2051 Vector hc = (Vector) Desktop.jalviewClipboard[2];
2052 for (int i = 0; i < hc.size(); i++)
2054 int[] region = (int[]) hc.elementAt(i);
2055 af.viewport.hideColumns(region[0], region[1]);
2059 // >>>This is a fix for the moment, until a better solution is
2061 af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer()
2063 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
2065 // TODO: maintain provenance of an alignment, rather than just make the
2066 // title a concatenation of operations.
2069 if (title.startsWith("Copied sequences"))
2075 newtitle = newtitle.concat("- from " + title);
2080 newtitle = new String("Pasted sequences");
2083 Desktop.addInternalFrame(af, newtitle, DEFAULT_WIDTH,
2088 } catch (Exception ex)
2090 ex.printStackTrace();
2091 System.out.println("Exception whilst pasting: " + ex);
2092 // could be anything being pasted in here
2098 protected void expand_newalign(ActionEvent e)
2102 AlignmentI alignment = AlignmentUtils.expandContext(getViewport()
2103 .getAlignment(), -1);
2104 AlignFrame af = new AlignFrame(alignment, DEFAULT_WIDTH,
2106 String newtitle = new String("Flanking alignment");
2108 if (Desktop.jalviewClipboard != null
2109 && Desktop.jalviewClipboard[2] != null)
2111 Vector hc = (Vector) Desktop.jalviewClipboard[2];
2112 for (int i = 0; i < hc.size(); i++)
2114 int[] region = (int[]) hc.elementAt(i);
2115 af.viewport.hideColumns(region[0], region[1]);
2119 // >>>This is a fix for the moment, until a better solution is
2121 af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer()
2123 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
2125 // TODO: maintain provenance of an alignment, rather than just make the
2126 // title a concatenation of operations.
2128 if (title.startsWith("Copied sequences"))
2134 newtitle = newtitle.concat("- from " + title);
2138 Desktop.addInternalFrame(af, newtitle, DEFAULT_WIDTH, DEFAULT_HEIGHT);
2140 } catch (Exception ex)
2142 ex.printStackTrace();
2143 System.out.println("Exception whilst pasting: " + ex);
2144 // could be anything being pasted in here
2145 } catch (OutOfMemoryError oom)
2147 new OOMWarning("Viewing flanking region of alignment", oom);
2158 protected void cut_actionPerformed(ActionEvent e)
2160 copy_actionPerformed(null);
2161 delete_actionPerformed(null);
2171 protected void delete_actionPerformed(ActionEvent evt)
2174 SequenceGroup sg = viewport.getSelectionGroup();
2180 List<SequenceI> seqs = new ArrayList<SequenceI>(sg.getSize());
2182 for (int i = 0; i < sg.getSize(); i++)
2184 seq = sg.getSequenceAt(i);
2188 // If the cut affects all sequences, warn, remove highlighted columns
2189 if (sg.getSize() == viewport.getAlignment().getHeight())
2191 int confirm = JOptionPane.showConfirmDialog(this,
2192 MessageManager.getString("warn.delete_all"), // $NON-NLS-1$
2193 MessageManager.getString("label.delete_all"), // $NON-NLS-1$
2194 JOptionPane.OK_CANCEL_OPTION);
2196 if (confirm == JOptionPane.CANCEL_OPTION
2197 || confirm == JOptionPane.CLOSED_OPTION)
2201 viewport.getColumnSelection().removeElements(sg.getStartRes(),
2202 sg.getEndRes() + 1);
2205 SequenceI[] cut = new SequenceI[seqs.size()];
2206 for (int i = 0; i < seqs.size(); i++)
2208 cut[i] = seqs.get(i);
2212 * //ADD HISTORY ITEM
2214 addHistoryItem(new EditCommand(MessageManager.getString("label.cut_sequences"), EditCommand.CUT, cut,
2215 sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1,
2216 viewport.getAlignment()));
2218 viewport.setSelectionGroup(null);
2219 viewport.sendSelection();
2220 viewport.getAlignment().deleteGroup(sg);
2222 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
2224 if (viewport.getAlignment().getHeight() < 1)
2228 this.setClosed(true);
2229 } catch (Exception ex)
2242 protected void deleteGroups_actionPerformed(ActionEvent e)
2244 if (avc.deleteGroups())
2246 PaintRefresher.Refresh(this, viewport.getSequenceSetId());
2247 alignPanel.updateAnnotation();
2248 alignPanel.paintAlignment(true);
2259 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
2261 SequenceGroup sg = new SequenceGroup();
2263 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
2265 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
2268 sg.setEndRes(viewport.getAlignment().getWidth() - 1);
2269 viewport.setSelectionGroup(sg);
2270 viewport.sendSelection();
2271 alignPanel.paintAlignment(true);
2272 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
2282 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
2284 if (viewport.cursorMode)
2286 alignPanel.seqPanel.keyboardNo1 = null;
2287 alignPanel.seqPanel.keyboardNo2 = null;
2289 viewport.setSelectionGroup(null);
2290 viewport.getColumnSelection().clear();
2291 viewport.setSelectionGroup(null);
2292 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
2293 alignPanel.idPanel.idCanvas.searchResults = null;
2294 alignPanel.paintAlignment(true);
2295 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
2296 viewport.sendSelection();
2306 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
2308 SequenceGroup sg = viewport.getSelectionGroup();
2312 selectAllSequenceMenuItem_actionPerformed(null);
2317 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
2319 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
2322 alignPanel.paintAlignment(true);
2323 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
2324 viewport.sendSelection();
2328 public void invertColSel_actionPerformed(ActionEvent e)
2330 viewport.invertColumnSelection();
2331 alignPanel.paintAlignment(true);
2332 viewport.sendSelection();
2342 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
2344 trimAlignment(true);
2354 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
2356 trimAlignment(false);
2359 void trimAlignment(boolean trimLeft)
2361 ColumnSelection colSel = viewport.getColumnSelection();
2364 if (colSel.size() > 0)
2368 column = colSel.getMin();
2372 column = colSel.getMax();
2376 if (viewport.getSelectionGroup() != null)
2378 seqs = viewport.getSelectionGroup().getSequencesAsArray(
2379 viewport.getHiddenRepSequences());
2383 seqs = viewport.getAlignment().getSequencesArray();
2386 TrimRegionCommand trimRegion;
2389 trimRegion = new TrimRegionCommand("Remove Left",
2390 TrimRegionCommand.TRIM_LEFT, seqs, column,
2391 viewport.getAlignment(), viewport.getColumnSelection(),
2392 viewport.getSelectionGroup());
2393 viewport.setStartRes(0);
2397 trimRegion = new TrimRegionCommand("Remove Right",
2398 TrimRegionCommand.TRIM_RIGHT, seqs, column,
2399 viewport.getAlignment(), viewport.getColumnSelection(),
2400 viewport.getSelectionGroup());
2403 statusBar.setText(MessageManager.formatMessage(
2404 "label.removed_columns", new String[]
2405 { Integer.valueOf(trimRegion.getSize()).toString() }));
2407 addHistoryItem(trimRegion);
2409 for (SequenceGroup sg : viewport.getAlignment().getGroups())
2411 if ((trimLeft && !sg.adjustForRemoveLeft(column))
2412 || (!trimLeft && !sg.adjustForRemoveRight(column)))
2414 viewport.getAlignment().deleteGroup(sg);
2418 viewport.firePropertyChange("alignment", null, viewport
2419 .getAlignment().getSequences());
2430 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
2432 int start = 0, end = viewport.getAlignment().getWidth() - 1;
2435 if (viewport.getSelectionGroup() != null)
2437 seqs = viewport.getSelectionGroup().getSequencesAsArray(
2438 viewport.getHiddenRepSequences());
2439 start = viewport.getSelectionGroup().getStartRes();
2440 end = viewport.getSelectionGroup().getEndRes();
2444 seqs = viewport.getAlignment().getSequencesArray();
2447 RemoveGapColCommand removeGapCols = new RemoveGapColCommand(
2448 "Remove Gapped Columns", seqs, start, end,
2449 viewport.getAlignment());
2451 addHistoryItem(removeGapCols);
2453 statusBar.setText(MessageManager.formatMessage(
2454 "label.removed_empty_columns", new String[]
2455 { Integer.valueOf(removeGapCols.getSize()).toString() }));
2457 // This is to maintain viewport position on first residue
2458 // of first sequence
2459 SequenceI seq = viewport.getAlignment().getSequenceAt(0);
2460 int startRes = seq.findPosition(viewport.startRes);
2461 // ShiftList shifts;
2462 // viewport.getAlignment().removeGaps(shifts=new ShiftList());
2463 // edit.alColumnChanges=shifts.getInverse();
2464 // if (viewport.hasHiddenColumns)
2465 // viewport.getColumnSelection().compensateForEdits(shifts);
2466 viewport.setStartRes(seq.findIndex(startRes) - 1);
2467 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
2479 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
2481 int start = 0, end = viewport.getAlignment().getWidth() - 1;
2484 if (viewport.getSelectionGroup() != null)
2486 seqs = viewport.getSelectionGroup().getSequencesAsArray(
2487 viewport.getHiddenRepSequences());
2488 start = viewport.getSelectionGroup().getStartRes();
2489 end = viewport.getSelectionGroup().getEndRes();
2493 seqs = viewport.getAlignment().getSequencesArray();
2496 // This is to maintain viewport position on first residue
2497 // of first sequence
2498 SequenceI seq = viewport.getAlignment().getSequenceAt(0);
2499 int startRes = seq.findPosition(viewport.startRes);
2501 addHistoryItem(new RemoveGapsCommand("Remove Gaps", seqs, start, end,
2502 viewport.getAlignment()));
2504 viewport.setStartRes(seq.findIndex(startRes) - 1);
2506 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
2518 public void padGapsMenuitem_actionPerformed(ActionEvent e)
2520 viewport.setPadGaps(padGapsMenuitem.isSelected());
2521 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
2527 // if (justifySeqs>0)
2529 // alignment.justify(justifySeqs!=RIGHT_JUSTIFY);
2542 public void findMenuItem_actionPerformed(ActionEvent e)
2548 public void newView_actionPerformed(ActionEvent e)
2555 * @param copyAnnotation
2556 * if true then duplicate all annnotation, groups and settings
2557 * @return new alignment panel, already displayed.
2559 public AlignmentPanel newView(boolean copyAnnotation)
2561 return newView(null, copyAnnotation);
2567 * title of newly created view
2568 * @return new alignment panel, already displayed.
2570 public AlignmentPanel newView(String viewTitle)
2572 return newView(viewTitle, true);
2578 * title of newly created view
2579 * @param copyAnnotation
2580 * if true then duplicate all annnotation, groups and settings
2581 * @return new alignment panel, already displayed.
2583 public AlignmentPanel newView(String viewTitle, boolean copyAnnotation)
2585 AlignmentPanel newap = new Jalview2XML().copyAlignPanel(alignPanel,
2587 if (!copyAnnotation)
2589 // just remove all the current annotation except for the automatic stuff
2590 newap.av.getAlignment().deleteAllGroups();
2591 for (AlignmentAnnotation alan : newap.av.getAlignment()
2592 .getAlignmentAnnotation())
2594 if (!alan.autoCalculated)
2596 newap.av.getAlignment().deleteAnnotation(alan);
2602 newap.av.gatherViewsHere = false;
2604 if (viewport.viewName == null)
2606 viewport.viewName = "Original";
2609 newap.av.historyList = viewport.historyList;
2610 newap.av.redoList = viewport.redoList;
2612 int index = Desktop.getViewCount(viewport.getSequenceSetId());
2613 // make sure the new view has a unique name - this is essential for Jalview
2615 boolean addFirstIndex = false;
2616 if (viewTitle == null || viewTitle.trim().length() == 0)
2618 viewTitle = MessageManager.getString("action.view");
2619 addFirstIndex = true;
2623 index = 1;// we count from 1 if given a specific name
2625 String newViewName = viewTitle + ((addFirstIndex) ? " " + index : "");
2626 Vector comps = (Vector) PaintRefresher.components.get(viewport
2627 .getSequenceSetId());
2628 Vector existingNames = new Vector();
2629 for (int i = 0; i < comps.size(); i++)
2631 if (comps.elementAt(i) instanceof AlignmentPanel)
2633 AlignmentPanel ap = (AlignmentPanel) comps.elementAt(i);
2634 if (!existingNames.contains(ap.av.viewName))
2636 existingNames.addElement(ap.av.viewName);
2641 while (existingNames.contains(newViewName))
2643 newViewName = viewTitle + " " + (++index);
2646 newap.av.viewName = newViewName;
2648 addAlignmentPanel(newap, true);
2649 newap.alignmentChanged();
2651 if (alignPanels.size() == 2)
2653 viewport.gatherViewsHere = true;
2655 tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1);
2660 public void expandViews_actionPerformed(ActionEvent e)
2662 Desktop.instance.explodeViews(this);
2666 public void gatherViews_actionPerformed(ActionEvent e)
2668 Desktop.instance.gatherViews(this);
2678 public void font_actionPerformed(ActionEvent e)
2680 new FontChooser(alignPanel);
2690 protected void seqLimit_actionPerformed(ActionEvent e)
2692 viewport.setShowJVSuffix(seqLimits.isSelected());
2694 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel
2695 .calculateIdWidth());
2696 alignPanel.paintAlignment(true);
2700 public void idRightAlign_actionPerformed(ActionEvent e)
2702 viewport.rightAlignIds = idRightAlign.isSelected();
2703 alignPanel.paintAlignment(true);
2707 public void centreColumnLabels_actionPerformed(ActionEvent e)
2709 viewport.centreColumnLabels = centreColumnLabelsMenuItem.getState();
2710 alignPanel.paintAlignment(true);
2716 * @see jalview.jbgui.GAlignFrame#followHighlight_actionPerformed()
2719 protected void followHighlight_actionPerformed()
2721 if (viewport.followHighlight = this.followHighlightMenuItem.getState())
2723 alignPanel.scrollToPosition(
2724 alignPanel.seqPanel.seqCanvas.searchResults, false);
2735 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
2737 viewport.setColourText(colourTextMenuItem.isSelected());
2738 alignPanel.paintAlignment(true);
2748 public void wrapMenuItem_actionPerformed(ActionEvent e)
2750 scaleAbove.setVisible(wrapMenuItem.isSelected());
2751 scaleLeft.setVisible(wrapMenuItem.isSelected());
2752 scaleRight.setVisible(wrapMenuItem.isSelected());
2753 viewport.setWrapAlignment(wrapMenuItem.isSelected());
2754 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
2758 public void showAllSeqs_actionPerformed(ActionEvent e)
2760 viewport.showAllHiddenSeqs();
2764 public void showAllColumns_actionPerformed(ActionEvent e)
2766 viewport.showAllHiddenColumns();
2771 public void hideSelSequences_actionPerformed(ActionEvent e)
2773 viewport.hideAllSelectedSeqs();
2774 alignPanel.paintAlignment(true);
2778 * called by key handler and the hide all/show all menu items
2783 private void toggleHiddenRegions(boolean toggleSeqs, boolean toggleCols)
2786 boolean hide = false;
2787 SequenceGroup sg = viewport.getSelectionGroup();
2788 if (!toggleSeqs && !toggleCols)
2790 // Hide everything by the current selection - this is a hack - we do the
2791 // invert and then hide
2792 // first check that there will be visible columns after the invert.
2793 if ((viewport.getColumnSelection() != null
2794 && viewport.getColumnSelection().getSelected() != null && viewport
2795 .getColumnSelection().getSelected().size() > 0)
2796 || (sg != null && sg.getSize() > 0 && sg.getStartRes() <= sg
2799 // now invert the sequence set, if required - empty selection implies
2800 // that no hiding is required.
2803 invertSequenceMenuItem_actionPerformed(null);
2804 sg = viewport.getSelectionGroup();
2808 viewport.expandColSelection(sg, true);
2809 // finally invert the column selection and get the new sequence
2811 invertColSel_actionPerformed(null);
2818 if (sg != null && sg.getSize() != viewport.getAlignment().getHeight())
2820 hideSelSequences_actionPerformed(null);
2823 else if (!(toggleCols && viewport.getColumnSelection().getSelected()
2826 showAllSeqs_actionPerformed(null);
2832 if (viewport.getColumnSelection().getSelected().size() > 0)
2834 hideSelColumns_actionPerformed(null);
2837 viewport.setSelectionGroup(sg);
2842 showAllColumns_actionPerformed(null);
2851 * jalview.jbgui.GAlignFrame#hideAllButSelection_actionPerformed(java.awt.
2852 * event.ActionEvent)
2855 public void hideAllButSelection_actionPerformed(ActionEvent e)
2857 toggleHiddenRegions(false, false);
2864 * jalview.jbgui.GAlignFrame#hideAllSelection_actionPerformed(java.awt.event
2868 public void hideAllSelection_actionPerformed(ActionEvent e)
2870 SequenceGroup sg = viewport.getSelectionGroup();
2871 viewport.expandColSelection(sg, false);
2872 viewport.hideAllSelectedSeqs();
2873 viewport.hideSelectedColumns();
2874 alignPanel.paintAlignment(true);
2881 * jalview.jbgui.GAlignFrame#showAllhidden_actionPerformed(java.awt.event.
2885 public void showAllhidden_actionPerformed(ActionEvent e)
2887 viewport.showAllHiddenColumns();
2888 viewport.showAllHiddenSeqs();
2889 alignPanel.paintAlignment(true);
2893 public void hideSelColumns_actionPerformed(ActionEvent e)
2895 viewport.hideSelectedColumns();
2896 alignPanel.paintAlignment(true);
2900 public void hiddenMarkers_actionPerformed(ActionEvent e)
2902 viewport.setShowHiddenMarkers(hiddenMarkers.isSelected());
2913 protected void scaleAbove_actionPerformed(ActionEvent e)
2915 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
2916 alignPanel.paintAlignment(true);
2926 protected void scaleLeft_actionPerformed(ActionEvent e)
2928 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
2929 alignPanel.paintAlignment(true);
2939 protected void scaleRight_actionPerformed(ActionEvent e)
2941 viewport.setScaleRightWrapped(scaleRight.isSelected());
2942 alignPanel.paintAlignment(true);
2952 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
2954 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
2955 alignPanel.paintAlignment(true);
2965 public void viewTextMenuItem_actionPerformed(ActionEvent e)
2967 viewport.setShowText(viewTextMenuItem.isSelected());
2968 alignPanel.paintAlignment(true);
2978 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
2980 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
2981 alignPanel.paintAlignment(true);
2984 public FeatureSettings featureSettings;
2987 public void featureSettings_actionPerformed(ActionEvent e)
2989 if (featureSettings != null)
2991 featureSettings.close();
2992 featureSettings = null;
2994 if (!showSeqFeatures.isSelected())
2996 // make sure features are actually displayed
2997 showSeqFeatures.setSelected(true);
2998 showSeqFeatures_actionPerformed(null);
3000 featureSettings = new FeatureSettings(this);
3004 * Set or clear 'Show Sequence Features'
3010 public void showSeqFeatures_actionPerformed(ActionEvent evt)
3012 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
3013 alignPanel.paintAlignment(true);
3014 if (alignPanel.getOverviewPanel() != null)
3016 alignPanel.getOverviewPanel().updateOverviewImage();
3021 * Set or clear 'Show Sequence Features'
3027 public void showSeqFeaturesHeight_actionPerformed(ActionEvent evt)
3029 viewport.setShowSequenceFeaturesHeight(showSeqFeaturesHeight
3031 if (viewport.getShowSequenceFeaturesHeight())
3033 // ensure we're actually displaying features
3034 viewport.setShowSequenceFeatures(true);
3035 showSeqFeatures.setSelected(true);
3037 alignPanel.paintAlignment(true);
3038 if (alignPanel.getOverviewPanel() != null)
3040 alignPanel.getOverviewPanel().updateOverviewImage();
3045 * Action on toggle of the 'Show annotations' menu item. This shows or hides
3046 * the annotations panel as a whole.
3048 * The options to show/hide all annotations should be enabled when the panel
3049 * is shown, and disabled when the panel is hidden.
3054 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
3056 final boolean setVisible = annotationPanelMenuItem.isSelected();
3057 viewport.setShowAnnotation(setVisible);
3058 alignPanel.setAnnotationVisible(setVisible);
3059 this.showAllAnnotations.setEnabled(setVisible);
3060 this.hideAllAnnotations.setEnabled(setVisible);
3064 public void alignmentProperties()
3066 JEditorPane editPane = new JEditorPane("text/html", "");
3067 editPane.setEditable(false);
3068 StringBuffer contents = new AlignmentProperties(viewport.getAlignment())
3070 editPane.setText(MessageManager.formatMessage("label.html_content",
3072 { contents.toString() }));
3073 JInternalFrame frame = new JInternalFrame();
3074 frame.getContentPane().add(new JScrollPane(editPane));
3076 Desktop.instance.addInternalFrame(frame, MessageManager.formatMessage(
3077 "label.alignment_properties", new String[]
3078 { getTitle() }), 500, 400);
3088 public void overviewMenuItem_actionPerformed(ActionEvent e)
3090 if (alignPanel.overviewPanel != null)
3095 JInternalFrame frame = new JInternalFrame();
3096 OverviewPanel overview = new OverviewPanel(alignPanel);
3097 frame.setContentPane(overview);
3098 Desktop.addInternalFrame(frame, MessageManager.formatMessage(
3099 "label.overview_params", new String[]
3100 { this.getTitle() }), frame.getWidth(), frame.getHeight());
3102 frame.setLayer(JLayeredPane.PALETTE_LAYER);
3103 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
3106 public void internalFrameClosed(
3107 javax.swing.event.InternalFrameEvent evt)
3109 alignPanel.setOverviewPanel(null);
3113 alignPanel.setOverviewPanel(overview);
3117 public void textColour_actionPerformed(ActionEvent e)
3119 new TextColourChooser().chooseColour(alignPanel, null);
3129 protected void noColourmenuItem_actionPerformed(ActionEvent e)
3141 public void clustalColour_actionPerformed(ActionEvent e)
3143 changeColour(new ClustalxColourScheme(viewport.getAlignment(),
3144 viewport.getHiddenRepSequences()));
3154 public void zappoColour_actionPerformed(ActionEvent e)
3156 changeColour(new ZappoColourScheme());
3166 public void taylorColour_actionPerformed(ActionEvent e)
3168 changeColour(new TaylorColourScheme());
3178 public void hydrophobicityColour_actionPerformed(ActionEvent e)
3180 changeColour(new HydrophobicColourScheme());
3190 public void helixColour_actionPerformed(ActionEvent e)
3192 changeColour(new HelixColourScheme());
3202 public void strandColour_actionPerformed(ActionEvent e)
3204 changeColour(new StrandColourScheme());
3214 public void turnColour_actionPerformed(ActionEvent e)
3216 changeColour(new TurnColourScheme());
3226 public void buriedColour_actionPerformed(ActionEvent e)
3228 changeColour(new BuriedColourScheme());
3238 public void nucleotideColour_actionPerformed(ActionEvent e)
3240 changeColour(new NucleotideColourScheme());
3244 public void purinePyrimidineColour_actionPerformed(ActionEvent e)
3246 changeColour(new PurinePyrimidineColourScheme());
3250 * public void covariationColour_actionPerformed(ActionEvent e) {
3252 * CovariationColourScheme(viewport.getAlignment().getAlignmentAnnotation
3256 public void annotationColour_actionPerformed(ActionEvent e)
3258 new AnnotationColourChooser(viewport, alignPanel);
3262 public void rnahelicesColour_actionPerformed(ActionEvent e)
3264 new RNAHelicesColourChooser(viewport, alignPanel);
3274 protected void applyToAllGroups_actionPerformed(ActionEvent e)
3276 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
3285 public void changeColour(ColourSchemeI cs)
3287 // TODO: compare with applet and pull up to model method
3292 if (viewport.getAbovePIDThreshold())
3294 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
3296 cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
3300 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
3303 if (viewport.getConservationSelected())
3306 Alignment al = (Alignment) viewport.getAlignment();
3307 Conservation c = new Conservation("All",
3308 ResidueProperties.propHash, 3, al.getSequences(), 0,
3312 c.verdict(false, viewport.getConsPercGaps());
3314 cs.setConservation(c);
3316 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel,
3321 cs.setConservation(null);
3324 cs.setConsensus(viewport.getSequenceConsensusHash());
3327 viewport.setGlobalColourScheme(cs);
3329 if (viewport.getColourAppliesToAllGroups())
3332 for (SequenceGroup sg : viewport.getAlignment().getGroups())
3340 if (cs instanceof ClustalxColourScheme)
3342 sg.cs = new ClustalxColourScheme(sg,
3343 viewport.getHiddenRepSequences());
3345 else if (cs instanceof UserColourScheme)
3347 sg.cs = new UserColourScheme(((UserColourScheme) cs).getColours());
3353 sg.cs = cs.getClass().newInstance();
3354 } catch (Exception ex)
3359 if (viewport.getAbovePIDThreshold()
3360 || cs instanceof PIDColourScheme
3361 || cs instanceof Blosum62ColourScheme)
3363 sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
3365 sg.cs.setConsensus(AAFrequency.calculate(
3366 sg.getSequences(viewport.getHiddenRepSequences()),
3367 sg.getStartRes(), sg.getEndRes() + 1));
3371 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
3374 if (viewport.getConservationSelected())
3376 Conservation c = new Conservation("Group",
3377 ResidueProperties.propHash, 3, sg.getSequences(viewport
3378 .getHiddenRepSequences()), sg.getStartRes(),
3379 sg.getEndRes() + 1);
3381 c.verdict(false, viewport.getConsPercGaps());
3382 sg.cs.setConservation(c);
3386 sg.cs.setConservation(null);
3391 if (alignPanel.getOverviewPanel() != null)
3393 alignPanel.getOverviewPanel().updateOverviewImage();
3396 alignPanel.paintAlignment(true);
3406 protected void modifyPID_actionPerformed(ActionEvent e)
3408 if (viewport.getAbovePIDThreshold()
3409 && viewport.getGlobalColourScheme() != null)
3411 SliderPanel.setPIDSliderSource(alignPanel,
3412 viewport.getGlobalColourScheme(), "Background");
3413 SliderPanel.showPIDSlider();
3424 protected void modifyConservation_actionPerformed(ActionEvent e)
3426 if (viewport.getConservationSelected()
3427 && viewport.getGlobalColourScheme() != null)
3429 SliderPanel.setConservationSlider(alignPanel,
3430 viewport.getGlobalColourScheme(), "Background");
3431 SliderPanel.showConservationSlider();
3442 protected void conservationMenuItem_actionPerformed(ActionEvent e)
3444 viewport.setConservationSelected(conservationMenuItem.isSelected());
3446 viewport.setAbovePIDThreshold(false);
3447 abovePIDThreshold.setSelected(false);
3449 changeColour(viewport.getGlobalColourScheme());
3451 modifyConservation_actionPerformed(null);
3461 public void abovePIDThreshold_actionPerformed(ActionEvent e)
3463 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
3465 conservationMenuItem.setSelected(false);
3466 viewport.setConservationSelected(false);
3468 changeColour(viewport.getGlobalColourScheme());
3470 modifyPID_actionPerformed(null);
3480 public void userDefinedColour_actionPerformed(ActionEvent e)
3482 if (e.getActionCommand().equals(
3483 MessageManager.getString("action.user_defined")))
3485 new UserDefinedColours(alignPanel, null);
3489 UserColourScheme udc = (UserColourScheme) UserDefinedColours
3490 .getUserColourSchemes().get(e.getActionCommand());
3496 public void updateUserColourMenu()
3499 Component[] menuItems = colourMenu.getMenuComponents();
3500 int i, iSize = menuItems.length;
3501 for (i = 0; i < iSize; i++)
3503 if (menuItems[i].getName() != null
3504 && menuItems[i].getName().equals("USER_DEFINED"))
3506 colourMenu.remove(menuItems[i]);
3510 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
3512 java.util.Enumeration userColours = jalview.gui.UserDefinedColours
3513 .getUserColourSchemes().keys();
3515 while (userColours.hasMoreElements())
3517 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(
3518 userColours.nextElement().toString());
3519 radioItem.setName("USER_DEFINED");
3520 radioItem.addMouseListener(new MouseAdapter()
3523 public void mousePressed(MouseEvent evt)
3525 if (evt.isControlDown()
3526 || SwingUtilities.isRightMouseButton(evt))
3528 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
3530 int option = JOptionPane.showInternalConfirmDialog(
3531 jalview.gui.Desktop.desktop,
3533 .getString("label.remove_from_default_list"),
3535 .getString("label.remove_user_defined_colour"),
3536 JOptionPane.YES_NO_OPTION);
3537 if (option == JOptionPane.YES_OPTION)
3539 jalview.gui.UserDefinedColours
3540 .removeColourFromDefaults(radioItem.getText());
3541 colourMenu.remove(radioItem);
3545 radioItem.addActionListener(new ActionListener()
3548 public void actionPerformed(ActionEvent evt)
3550 userDefinedColour_actionPerformed(evt);
3557 radioItem.addActionListener(new ActionListener()
3560 public void actionPerformed(ActionEvent evt)
3562 userDefinedColour_actionPerformed(evt);
3566 colourMenu.insert(radioItem, 15);
3567 colours.add(radioItem);
3579 public void PIDColour_actionPerformed(ActionEvent e)
3581 changeColour(new PIDColourScheme());
3591 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
3593 changeColour(new Blosum62ColourScheme());
3603 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
3605 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3606 AlignmentSorter.sortByPID(viewport.getAlignment(), viewport
3607 .getAlignment().getSequenceAt(0), null);
3608 addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder,
3609 viewport.getAlignment()));
3610 alignPanel.paintAlignment(true);
3620 public void sortIDMenuItem_actionPerformed(ActionEvent e)
3622 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3623 AlignmentSorter.sortByID(viewport.getAlignment());
3624 addHistoryItem(new OrderCommand("ID Sort", oldOrder,
3625 viewport.getAlignment()));
3626 alignPanel.paintAlignment(true);
3636 public void sortLengthMenuItem_actionPerformed(ActionEvent e)
3638 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3639 AlignmentSorter.sortByLength(viewport.getAlignment());
3640 addHistoryItem(new OrderCommand("Length Sort", oldOrder,
3641 viewport.getAlignment()));
3642 alignPanel.paintAlignment(true);
3652 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
3654 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3655 AlignmentSorter.sortByGroup(viewport.getAlignment());
3656 addHistoryItem(new OrderCommand("Group Sort", oldOrder,
3657 viewport.getAlignment()));
3659 alignPanel.paintAlignment(true);
3669 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
3671 new RedundancyPanel(alignPanel, this);
3681 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
3683 if ((viewport.getSelectionGroup() == null)
3684 || (viewport.getSelectionGroup().getSize() < 2))
3686 JOptionPane.showInternalMessageDialog(this, MessageManager
3687 .getString("label.you_must_select_least_two_sequences"),
3688 MessageManager.getString("label.invalid_selection"),
3689 JOptionPane.WARNING_MESSAGE);
3693 JInternalFrame frame = new JInternalFrame();
3694 frame.setContentPane(new PairwiseAlignPanel(viewport));
3695 Desktop.addInternalFrame(frame,
3696 MessageManager.getString("action.pairwise_alignment"), 600,
3708 public void PCAMenuItem_actionPerformed(ActionEvent e)
3710 if (((viewport.getSelectionGroup() != null)
3711 && (viewport.getSelectionGroup().getSize() < 4) && (viewport
3712 .getSelectionGroup().getSize() > 0))
3713 || (viewport.getAlignment().getHeight() < 4))
3716 .showInternalMessageDialog(
3719 .getString("label.principal_component_analysis_must_take_least_four_input_sequences"),
3721 .getString("label.sequence_selection_insufficient"),
3722 JOptionPane.WARNING_MESSAGE);
3727 new PCAPanel(alignPanel);
3731 public void autoCalculate_actionPerformed(ActionEvent e)
3733 viewport.autoCalculateConsensus = autoCalculate.isSelected();
3734 if (viewport.autoCalculateConsensus)
3736 viewport.firePropertyChange("alignment", null, viewport
3737 .getAlignment().getSequences());
3742 public void sortByTreeOption_actionPerformed(ActionEvent e)
3744 viewport.sortByTree = sortByTree.isSelected();
3748 protected void listenToViewSelections_actionPerformed(ActionEvent e)
3750 viewport.followSelection = listenToViewSelections.isSelected();
3760 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
3762 NewTreePanel("AV", "PID", "Average distance tree using PID");
3772 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
3774 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
3784 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
3786 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
3796 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
3798 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
3811 void NewTreePanel(String type, String pwType, String title)
3815 if (viewport.getSelectionGroup() != null
3816 && viewport.getSelectionGroup().getSize() > 0)
3818 if (viewport.getSelectionGroup().getSize() < 3)
3824 .getString("label.you_need_more_two_sequences_selected_build_tree"),
3826 .getString("label.not_enough_sequences"),
3827 JOptionPane.WARNING_MESSAGE);
3831 SequenceGroup sg = viewport.getSelectionGroup();
3833 /* Decide if the selection is a column region */
3834 for (SequenceI _s : sg.getSequences())
3836 if (_s.getLength() < sg.getEndRes())
3842 .getString("label.selected_region_to_tree_may_only_contain_residues_or_gaps"),
3844 .getString("label.sequences_selection_not_aligned"),
3845 JOptionPane.WARNING_MESSAGE);
3851 title = title + " on region";
3852 tp = new TreePanel(alignPanel, type, pwType);
3856 // are the visible sequences aligned?
3857 if (!viewport.getAlignment().isAligned(false))
3863 .getString("label.sequences_must_be_aligned_before_creating_tree"),
3865 .getString("label.sequences_not_aligned"),
3866 JOptionPane.WARNING_MESSAGE);
3871 if (viewport.getAlignment().getHeight() < 2)
3876 tp = new TreePanel(alignPanel, type, pwType);
3881 if (viewport.viewName != null)
3883 title += viewport.viewName + " of ";
3886 title += this.title;
3888 Desktop.addInternalFrame(tp, title, 600, 500);
3899 public void addSortByOrderMenuItem(String title,
3900 final AlignmentOrder order)
3902 final JMenuItem item = new JMenuItem(MessageManager.formatMessage("action.by_title_param", new String[]{title}));
3904 item.addActionListener(new java.awt.event.ActionListener()
3907 public void actionPerformed(ActionEvent e)
3909 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3911 // TODO: JBPNote - have to map order entries to curent SequenceI
3913 AlignmentSorter.sortBy(viewport.getAlignment(), order);
3915 addHistoryItem(new OrderCommand(order.getName(), oldOrder, viewport
3918 alignPanel.paintAlignment(true);
3924 * Add a new sort by annotation score menu item
3927 * the menu to add the option to
3929 * the label used to retrieve scores for each sequence on the
3932 public void addSortByAnnotScoreMenuItem(JMenu sort,
3933 final String scoreLabel)
3935 final JMenuItem item = new JMenuItem(scoreLabel);
3937 item.addActionListener(new java.awt.event.ActionListener()
3940 public void actionPerformed(ActionEvent e)
3942 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3943 AlignmentSorter.sortByAnnotationScore(scoreLabel,
3944 viewport.getAlignment());// ,viewport.getSelectionGroup());
3945 addHistoryItem(new OrderCommand("Sort by " + scoreLabel, oldOrder,
3946 viewport.getAlignment()));
3947 alignPanel.paintAlignment(true);
3953 * last hash for alignment's annotation array - used to minimise cost of
3956 protected int _annotationScoreVectorHash;
3959 * search the alignment and rebuild the sort by annotation score submenu the
3960 * last alignment annotation vector hash is stored to minimize cost of
3961 * rebuilding in subsequence calls.
3965 public void buildSortByAnnotationScoresMenu()
3967 if (viewport.getAlignment().getAlignmentAnnotation() == null)
3972 if (viewport.getAlignment().getAlignmentAnnotation().hashCode() != _annotationScoreVectorHash)
3974 sortByAnnotScore.removeAll();
3975 // almost certainly a quicker way to do this - but we keep it simple
3976 Hashtable scoreSorts = new Hashtable();
3977 AlignmentAnnotation aann[];
3978 for (SequenceI sqa : viewport.getAlignment().getSequences())
3980 aann = sqa.getAnnotation();
3981 for (int i = 0; aann != null && i < aann.length; i++)
3983 if (aann[i].hasScore() && aann[i].sequenceRef != null)
3985 scoreSorts.put(aann[i].label, aann[i].label);
3989 Enumeration labels = scoreSorts.keys();
3990 while (labels.hasMoreElements())
3992 addSortByAnnotScoreMenuItem(sortByAnnotScore,
3993 (String) labels.nextElement());
3995 sortByAnnotScore.setVisible(scoreSorts.size() > 0);
3998 _annotationScoreVectorHash = viewport.getAlignment()
3999 .getAlignmentAnnotation().hashCode();
4004 * Maintain the Order by->Displayed Tree menu. Creates a new menu item for a
4005 * TreePanel with an appropriate <code>jalview.analysis.AlignmentSorter</code>
4006 * call. Listeners are added to remove the menu item when the treePanel is
4007 * closed, and adjust the tree leaf to sequence mapping when the alignment is
4011 * Displayed tree window.
4013 * SortBy menu item title.
4016 public void buildTreeMenu()
4018 calculateTree.removeAll();
4019 // build the calculate menu
4021 for (final String type : new String[]
4024 String treecalcnm = MessageManager.getString("label.tree_calc_"
4025 + type.toLowerCase());
4026 for (final Object pwtype : ResidueProperties.scoreMatrices.keySet())
4028 JMenuItem tm = new JMenuItem();
4029 ScoreModelI sm = ResidueProperties.scoreMatrices.get(pwtype);
4030 if (sm.isProtein() == !viewport.getAlignment().isNucleotide())
4032 String smn = MessageManager.getStringOrReturn(
4033 "label.score_model_", sm.getName());
4034 final String title = MessageManager.formatMessage(
4035 "label.treecalc_title", treecalcnm, smn);
4036 tm.setText(title);//
4037 tm.addActionListener(new java.awt.event.ActionListener()
4040 public void actionPerformed(ActionEvent e)
4042 NewTreePanel(type, (String) pwtype, title);
4045 calculateTree.add(tm);
4050 sortByTreeMenu.removeAll();
4052 Vector comps = (Vector) PaintRefresher.components.get(viewport
4053 .getSequenceSetId());
4054 Vector treePanels = new Vector();
4055 int i, iSize = comps.size();
4056 for (i = 0; i < iSize; i++)
4058 if (comps.elementAt(i) instanceof TreePanel)
4060 treePanels.add(comps.elementAt(i));
4064 iSize = treePanels.size();
4068 sortByTreeMenu.setVisible(false);
4072 sortByTreeMenu.setVisible(true);
4074 for (i = 0; i < treePanels.size(); i++)
4076 final TreePanel tp = (TreePanel) treePanels.elementAt(i);
4077 final JMenuItem item = new JMenuItem(tp.getTitle());
4078 final NJTree tree = ((TreePanel) treePanels.elementAt(i)).getTree();
4079 item.addActionListener(new java.awt.event.ActionListener()
4082 public void actionPerformed(ActionEvent e)
4084 tp.sortByTree_actionPerformed(null);
4085 addHistoryItem(tp.sortAlignmentIn(alignPanel));
4090 sortByTreeMenu.add(item);
4094 public boolean sortBy(AlignmentOrder alorder, String undoname)
4096 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
4097 AlignmentSorter.sortBy(viewport.getAlignment(), alorder);
4098 if (undoname != null)
4100 addHistoryItem(new OrderCommand(undoname, oldOrder,
4101 viewport.getAlignment()));
4103 alignPanel.paintAlignment(true);
4108 * Work out whether the whole set of sequences or just the selected set will
4109 * be submitted for multiple alignment.
4112 public jalview.datamodel.AlignmentView gatherSequencesForAlignment()
4114 // Now, check we have enough sequences
4115 AlignmentView msa = null;
4117 if ((viewport.getSelectionGroup() != null)
4118 && (viewport.getSelectionGroup().getSize() > 1))
4120 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to
4121 // some common interface!
4123 * SequenceGroup seqs = viewport.getSelectionGroup(); int sz; msa = new
4124 * SequenceI[sz = seqs.getSize(false)];
4126 * for (int i = 0; i < sz; i++) { msa[i] = (SequenceI)
4127 * seqs.getSequenceAt(i); }
4129 msa = viewport.getAlignmentView(true);
4134 * Vector seqs = viewport.getAlignment().getSequences();
4136 * if (seqs.size() > 1) { msa = new SequenceI[seqs.size()];
4138 * for (int i = 0; i < seqs.size(); i++) { msa[i] = (SequenceI)
4139 * seqs.elementAt(i); } }
4141 msa = viewport.getAlignmentView(false);
4147 * Decides what is submitted to a secondary structure prediction service: the
4148 * first sequence in the alignment, or in the current selection, or, if the
4149 * alignment is 'aligned' (ie padded with gaps), then the currently selected
4150 * region or the whole alignment. (where the first sequence in the set is the
4151 * one that the prediction will be for).
4153 public AlignmentView gatherSeqOrMsaForSecStrPrediction()
4155 AlignmentView seqs = null;
4157 if ((viewport.getSelectionGroup() != null)
4158 && (viewport.getSelectionGroup().getSize() > 0))
4160 seqs = viewport.getAlignmentView(true);
4164 seqs = viewport.getAlignmentView(false);
4166 // limit sequences - JBPNote in future - could spawn multiple prediction
4168 // TODO: viewport.getAlignment().isAligned is a global state - the local
4169 // selection may well be aligned - we preserve 2.0.8 behaviour for moment.
4170 if (!viewport.getAlignment().isAligned(false))
4172 seqs.setSequences(new SeqCigar[]
4173 { seqs.getSequences()[0] });
4174 // TODO: if seqs.getSequences().length>1 then should really have warned
4188 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
4190 // Pick the tree file
4191 JalviewFileChooser chooser = new JalviewFileChooser(
4192 jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
4193 chooser.setFileView(new JalviewFileView());
4194 chooser.setDialogTitle(MessageManager
4195 .getString("label.select_newick_like_tree_file"));
4196 chooser.setToolTipText(MessageManager.getString("label.load_tree_file"));
4198 int value = chooser.showOpenDialog(null);
4200 if (value == JalviewFileChooser.APPROVE_OPTION)
4202 String choice = chooser.getSelectedFile().getPath();
4203 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
4204 jalview.io.NewickFile fin = null;
4207 fin = new jalview.io.NewickFile(choice, "File");
4208 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
4209 } catch (Exception ex)
4216 .getString("label.problem_reading_tree_file"),
4217 JOptionPane.WARNING_MESSAGE);
4218 ex.printStackTrace();
4220 if (fin != null && fin.hasWarningMessage())
4222 JOptionPane.showMessageDialog(Desktop.desktop, fin
4223 .getWarningMessage(), MessageManager
4224 .getString("label.possible_problem_with_tree_file"),
4225 JOptionPane.WARNING_MESSAGE);
4231 protected void tcoffeeColorScheme_actionPerformed(ActionEvent e)
4233 changeColour(new TCoffeeColourScheme(alignPanel.getAlignment()));
4236 public TreePanel ShowNewickTree(NewickFile nf, String title)
4238 return ShowNewickTree(nf, title, 600, 500, 4, 5);
4241 public TreePanel ShowNewickTree(NewickFile nf, String title,
4242 AlignmentView input)
4244 return ShowNewickTree(nf, title, input, 600, 500, 4, 5);
4247 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,
4248 int h, int x, int y)
4250 return ShowNewickTree(nf, title, null, w, h, x, y);
4254 * Add a treeviewer for the tree extracted from a newick file object to the
4255 * current alignment view
4262 * Associated alignment input data (or null)
4271 * @return TreePanel handle
4273 public TreePanel ShowNewickTree(NewickFile nf, String title,
4274 AlignmentView input, int w, int h, int x, int y)
4276 TreePanel tp = null;
4282 if (nf.getTree() != null)
4284 tp = new TreePanel(alignPanel, "FromFile", title, nf, input);
4290 tp.setLocation(x, y);
4293 Desktop.addInternalFrame(tp, title, w, h);
4295 } catch (Exception ex)
4297 ex.printStackTrace();
4303 private boolean buildingMenu = false;
4306 * Generates menu items and listener event actions for web service clients
4309 public void BuildWebServiceMenu()
4311 while (buildingMenu)
4315 System.err.println("Waiting for building menu to finish.");
4317 } catch (Exception e)
4322 final AlignFrame me = this;
4323 buildingMenu = true;
4324 new Thread(new Runnable()
4329 final List<JMenuItem> legacyItems = new ArrayList<JMenuItem>();
4332 System.err.println("Building ws menu again "
4333 + Thread.currentThread());
4334 // TODO: add support for context dependent disabling of services based
4336 // alignment and current selection
4337 // TODO: add additional serviceHandle parameter to specify abstract
4339 // class independently of AbstractName
4340 // TODO: add in rediscovery GUI function to restart discoverer
4341 // TODO: group services by location as well as function and/or
4343 // object broker mechanism.
4344 final Vector<JMenu> wsmenu = new Vector<JMenu>();
4345 final IProgressIndicator af = me;
4346 final JMenu msawsmenu = new JMenu("Alignment");
4347 final JMenu secstrmenu = new JMenu(
4348 "Secondary Structure Prediction");
4349 final JMenu seqsrchmenu = new JMenu("Sequence Database Search");
4350 final JMenu analymenu = new JMenu("Analysis");
4351 final JMenu dismenu = new JMenu("Protein Disorder");
4352 // final JMenu msawsmenu = new
4353 // JMenu(MessageManager.getString("label.alignment"));
4354 // final JMenu secstrmenu = new
4355 // JMenu(MessageManager.getString("label.secondary_structure_prediction"));
4356 // final JMenu seqsrchmenu = new
4357 // JMenu(MessageManager.getString("label.sequence_database_search"));
4358 // final JMenu analymenu = new
4359 // JMenu(MessageManager.getString("label.analysis"));
4360 // final JMenu dismenu = new
4361 // JMenu(MessageManager.getString("label.protein_disorder"));
4362 // JAL-940 - only show secondary structure prediction services from
4363 // the legacy server
4364 if (// Cache.getDefault("SHOW_JWS1_SERVICES", true)
4366 Discoverer.services != null && (Discoverer.services.size() > 0))
4368 // TODO: refactor to allow list of AbstractName/Handler bindings to
4370 // stored or retrieved from elsewhere
4371 // No MSAWS used any more:
4372 // Vector msaws = null; // (Vector)
4373 // Discoverer.services.get("MsaWS");
4374 Vector secstrpr = (Vector) Discoverer.services
4376 if (secstrpr != null)
4378 // Add any secondary structure prediction services
4379 for (int i = 0, j = secstrpr.size(); i < j; i++)
4381 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) secstrpr
4383 jalview.ws.WSMenuEntryProviderI impl = jalview.ws.jws1.Discoverer
4384 .getServiceClient(sh);
4385 int p = secstrmenu.getItemCount();
4386 impl.attachWSMenuEntry(secstrmenu, me);
4387 int q = secstrmenu.getItemCount();
4388 for (int litm = p; litm < q; litm++)
4390 legacyItems.add(secstrmenu.getItem(litm));
4396 // Add all submenus in the order they should appear on the web
4398 wsmenu.add(msawsmenu);
4399 wsmenu.add(secstrmenu);
4400 wsmenu.add(dismenu);
4401 wsmenu.add(analymenu);
4402 // No search services yet
4403 // wsmenu.add(seqsrchmenu);
4405 javax.swing.SwingUtilities.invokeLater(new Runnable()
4412 webService.removeAll();
4413 // first, add discovered services onto the webservices menu
4414 if (wsmenu.size() > 0)
4416 for (int i = 0, j = wsmenu.size(); i < j; i++)
4418 webService.add(wsmenu.get(i));
4423 webService.add(me.webServiceNoServices);
4425 // TODO: move into separate menu builder class.
4426 boolean new_sspred = false;
4427 if (Cache.getDefault("SHOW_JWS2_SERVICES", true))
4429 Jws2Discoverer jws2servs = Jws2Discoverer.getDiscoverer();
4430 if (jws2servs != null)
4432 if (jws2servs.hasServices())
4434 jws2servs.attachWSMenuEntry(webService, me);
4435 for (Jws2Instance sv : jws2servs.getServices())
4437 if (sv.description.toLowerCase().contains("jpred"))
4439 for (JMenuItem jmi : legacyItems)
4441 jmi.setVisible(false);
4447 if (jws2servs.isRunning())
4449 JMenuItem tm = new JMenuItem(
4450 "Still discovering JABA Services");
4451 tm.setEnabled(false);
4456 build_urlServiceMenu(me.webService);
4457 build_fetchdbmenu(webService);
4458 for (JMenu item : wsmenu)
4460 if (item.getItemCount() == 0)
4462 item.setEnabled(false);
4466 item.setEnabled(true);
4469 } catch (Exception e)
4472 .debug("Exception during web service menu building process.",
4478 } catch (Exception e)
4483 buildingMenu = false;
4490 * construct any groupURL type service menu entries.
4494 private void build_urlServiceMenu(JMenu webService)
4496 // TODO: remove this code when 2.7 is released
4497 // DEBUG - alignmentView
4499 * JMenuItem testAlView = new JMenuItem("Test AlignmentView"); final
4500 * AlignFrame af = this; testAlView.addActionListener(new ActionListener() {
4502 * @Override public void actionPerformed(ActionEvent e) {
4503 * jalview.datamodel.AlignmentView
4504 * .testSelectionViews(af.viewport.getAlignment(),
4505 * af.viewport.getColumnSelection(), af.viewport.selectionGroup); }
4507 * }); webService.add(testAlView);
4509 // TODO: refactor to RestClient discoverer and merge menu entries for
4510 // rest-style services with other types of analysis/calculation service
4511 // SHmmr test client - still being implemented.
4512 // DEBUG - alignmentView
4514 for (jalview.ws.rest.RestClient client : jalview.ws.rest.RestClient
4517 client.attachWSMenuEntry(
4518 JvSwingUtils.findOrCreateMenu(webService, client.getAction()),
4524 * public void vamsasStore_actionPerformed(ActionEvent e) { JalviewFileChooser
4525 * chooser = new JalviewFileChooser(jalview.bin.Cache.
4526 * getProperty("LAST_DIRECTORY"));
4528 * chooser.setFileView(new JalviewFileView()); chooser.setDialogTitle("Export
4529 * to Vamsas file"); chooser.setToolTipText("Export");
4531 * int value = chooser.showSaveDialog(this);
4533 * if (value == JalviewFileChooser.APPROVE_OPTION) {
4534 * jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
4535 * //vs.store(chooser.getSelectedFile().getAbsolutePath() ); vs.storeJalview(
4536 * chooser.getSelectedFile().getAbsolutePath(), this); } }
4539 * prototype of an automatically enabled/disabled analysis function
4542 protected void setShowProductsEnabled()
4544 SequenceI[] selection = viewport.getSequenceSelection();
4545 if (canShowProducts(selection, viewport.getSelectionGroup() != null,
4546 viewport.getAlignment().getDataset()))
4548 showProducts.setEnabled(true);
4553 showProducts.setEnabled(false);
4558 * search selection for sequence xRef products and build the show products
4563 * @return true if showProducts menu should be enabled.
4565 public boolean canShowProducts(SequenceI[] selection,
4566 boolean isRegionSelection, Alignment dataset)
4568 boolean showp = false;
4571 showProducts.removeAll();
4572 final boolean dna = viewport.getAlignment().isNucleotide();
4573 final Alignment ds = dataset;
4574 String[] ptypes = (selection == null || selection.length == 0) ? null
4575 : CrossRef.findSequenceXrefTypes(dna, selection, dataset);
4577 // CrossRef.buildXProductsList(viewport.getAlignment().isNucleotide(),
4578 // selection, dataset, true);
4579 final SequenceI[] sel = selection;
4580 for (int t = 0; ptypes != null && t < ptypes.length; t++)
4583 final boolean isRegSel = isRegionSelection;
4584 final AlignFrame af = this;
4585 final String source = ptypes[t];
4586 JMenuItem xtype = new JMenuItem(ptypes[t]);
4587 xtype.addActionListener(new ActionListener()
4591 public void actionPerformed(ActionEvent e)
4593 // TODO: new thread for this call with vis-delay
4594 af.showProductsFor(af.viewport.getSequenceSelection(), ds,
4595 isRegSel, dna, source);
4599 showProducts.add(xtype);
4601 showProducts.setVisible(showp);
4602 showProducts.setEnabled(showp);
4603 } catch (Exception e)
4605 jalview.bin.Cache.log
4606 .warn("canTranslate threw an exception - please report to help@jalview.org",
4613 protected void showProductsFor(SequenceI[] sel, Alignment ds,
4614 boolean isRegSel, boolean dna, String source)
4616 final boolean fisRegSel = isRegSel;
4617 final boolean fdna = dna;
4618 final String fsrc = source;
4619 final AlignFrame ths = this;
4620 final SequenceI[] fsel = sel;
4621 Runnable foo = new Runnable()
4627 final long sttime = System.currentTimeMillis();
4628 ths.setProgressBar(MessageManager.formatMessage("status.searching_for_sequences_from", new String[]{fsrc}), sttime);
4631 Alignment ds = ths.getViewport().getAlignment().getDataset(); // update
4635 Alignment prods = CrossRef
4636 .findXrefSequences(fsel, fdna, fsrc, ds);
4639 SequenceI[] sprods = new SequenceI[prods.getHeight()];
4640 for (int s = 0; s < sprods.length; s++)
4642 sprods[s] = (prods.getSequenceAt(s)).deriveSequence();
4643 if (ds.getSequences() == null
4644 || !ds.getSequences().contains(
4645 sprods[s].getDatasetSequence()))
4646 ds.addSequence(sprods[s].getDatasetSequence());
4647 sprods[s].updatePDBIds();
4649 Alignment al = new Alignment(sprods);
4650 AlignedCodonFrame[] cf = prods.getCodonFrames();
4652 for (int s = 0; cf != null && s < cf.length; s++)
4654 al.addCodonFrame(cf[s]);
4657 AlignFrame naf = new AlignFrame(al, DEFAULT_WIDTH,
4659 String newtitle = "" + ((fdna) ? "Proteins " : "Nucleotides ")
4660 + " for " + ((fisRegSel) ? "selected region of " : "")
4662 Desktop.addInternalFrame(naf, newtitle, DEFAULT_WIDTH,
4667 System.err.println("No Sequences generated for xRef type "
4670 } catch (Exception e)
4672 jalview.bin.Cache.log.error(
4673 "Exception when finding crossreferences", e);
4674 } catch (OutOfMemoryError e)
4676 new OOMWarning("whilst fetching crossreferences", e);
4679 jalview.bin.Cache.log.error("Error when finding crossreferences",
4682 ths.setProgressBar(MessageManager.formatMessage("status.finished_searching_for_sequences_from", new String[]{fsrc}),
4687 Thread frunner = new Thread(foo);
4691 public boolean canShowTranslationProducts(SequenceI[] selection,
4692 AlignmentI alignment)
4697 return (jalview.analysis.Dna.canTranslate(selection,
4698 viewport.getViewAsVisibleContigs(true)));
4699 } catch (Exception e)
4701 jalview.bin.Cache.log
4702 .warn("canTranslate threw an exception - please report to help@jalview.org",
4709 public void showProducts_actionPerformed(ActionEvent e)
4711 // /////////////////////////////
4712 // Collect Data to be translated/transferred
4714 SequenceI[] selection = viewport.getSequenceSelection();
4715 AlignmentI al = null;
4718 al = jalview.analysis.Dna.CdnaTranslate(selection, viewport
4719 .getViewAsVisibleContigs(true), viewport.getGapCharacter(),
4720 viewport.getAlignment().getDataset());
4721 } catch (Exception ex)
4724 jalview.bin.Cache.log.debug("Exception during translation.", ex);
4732 .getString("label.select_at_least_three_bases_in_at_least_one_sequence_to_cDNA_translation"),
4733 MessageManager.getString("label.translation_failed"),
4734 JOptionPane.WARNING_MESSAGE);
4738 AlignFrame af = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT);
4739 Desktop.addInternalFrame(af, MessageManager.formatMessage(
4740 "label.translation_of_params", new String[]
4741 { this.getTitle() }), DEFAULT_WIDTH, DEFAULT_HEIGHT);
4746 public void showTranslation_actionPerformed(ActionEvent e)
4748 // /////////////////////////////
4749 // Collect Data to be translated/transferred
4751 SequenceI[] selection = viewport.getSequenceSelection();
4752 String[] seqstring = viewport.getViewAsString(true);
4753 AlignmentI al = null;
4756 al = jalview.analysis.Dna.CdnaTranslate(selection, seqstring,
4757 viewport.getViewAsVisibleContigs(true), viewport
4758 .getGapCharacter(), viewport.getAlignment()
4759 .getAlignmentAnnotation(), viewport.getAlignment()
4760 .getWidth(), viewport.getAlignment().getDataset());
4761 } catch (Exception ex)
4764 jalview.bin.Cache.log.error(
4765 "Exception during translation. Please report this !", ex);
4770 .getString("label.error_when_translating_sequences_submit_bug_report"),
4772 .getString("label.implementation_error")
4774 .getString("translation_failed"),
4775 JOptionPane.ERROR_MESSAGE);
4784 .getString("label.select_at_least_three_bases_in_at_least_one_sequence_to_cDNA_translation"),
4785 MessageManager.getString("label.translation_failed"),
4786 JOptionPane.WARNING_MESSAGE);
4790 AlignFrame af = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT);
4791 Desktop.addInternalFrame(af, MessageManager.formatMessage(
4792 "label.translation_of_params", new String[]
4793 { this.getTitle() }), DEFAULT_WIDTH, DEFAULT_HEIGHT);
4798 * Try to load a features file onto the alignment.
4801 * contents or path to retrieve file
4803 * access mode of file (see jalview.io.AlignFile)
4804 * @return true if features file was parsed corectly.
4806 public boolean parseFeaturesFile(String file, String type)
4808 boolean featuresFile = false;
4811 featuresFile = new FeaturesFile(file, type).parse(viewport
4812 .getAlignment().getDataset(), alignPanel.seqPanel.seqCanvas
4813 .getFeatureRenderer().featureColours, false,
4814 jalview.bin.Cache.getDefault("RELAXEDSEQIDMATCHING", false));
4815 } catch (Exception ex)
4817 ex.printStackTrace();
4822 viewport.showSequenceFeatures = true;
4823 showSeqFeatures.setSelected(true);
4824 if (alignPanel.seqPanel.seqCanvas.fr != null)
4826 // update the min/max ranges where necessary
4827 alignPanel.seqPanel.seqCanvas.fr.findAllFeatures(true);
4829 if (featureSettings != null)
4831 featureSettings.setTableData();
4833 alignPanel.paintAlignment(true);
4836 return featuresFile;
4840 public void dragEnter(DropTargetDragEvent evt)
4845 public void dragExit(DropTargetEvent evt)
4850 public void dragOver(DropTargetDragEvent evt)
4855 public void dropActionChanged(DropTargetDragEvent evt)
4860 public void drop(DropTargetDropEvent evt)
4862 Transferable t = evt.getTransferable();
4863 java.util.List files = null;
4867 DataFlavor uriListFlavor = new DataFlavor(
4868 "text/uri-list;class=java.lang.String");
4869 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
4871 // Works on Windows and MacOSX
4872 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
4873 files = (java.util.List) t
4874 .getTransferData(DataFlavor.javaFileListFlavor);
4876 else if (t.isDataFlavorSupported(uriListFlavor))
4878 // This is used by Unix drag system
4879 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
4880 String data = (String) t.getTransferData(uriListFlavor);
4881 files = new java.util.ArrayList(1);
4882 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
4883 data, "\r\n"); st.hasMoreTokens();)
4885 String s = st.nextToken();
4886 if (s.startsWith("#"))
4888 // the line is a comment (as per the RFC 2483)
4892 java.net.URI uri = new java.net.URI(s);
4893 // check to see if we can handle this kind of URI
4894 if (uri.getScheme().toLowerCase().startsWith("http"))
4896 files.add(uri.toString());
4900 // otherwise preserve old behaviour: catch all for file objects
4901 java.io.File file = new java.io.File(uri);
4902 files.add(file.toString());
4906 } catch (Exception e)
4908 e.printStackTrace();
4914 // check to see if any of these files have names matching sequences in
4916 SequenceIdMatcher idm = new SequenceIdMatcher(viewport
4917 .getAlignment().getSequencesArray());
4919 * Object[] { String,SequenceI}
4921 ArrayList<Object[]> filesmatched = new ArrayList<Object[]>();
4922 ArrayList<String> filesnotmatched = new ArrayList<String>();
4923 for (int i = 0; i < files.size(); i++)
4925 String file = files.get(i).toString();
4927 String protocol = FormatAdapter.checkProtocol(file);
4928 if (protocol == jalview.io.FormatAdapter.FILE)
4930 File fl = new File(file);
4931 pdbfn = fl.getName();
4933 else if (protocol == jalview.io.FormatAdapter.URL)
4935 URL url = new URL(file);
4936 pdbfn = url.getFile();
4938 if (pdbfn.length() > 0)
4940 // attempt to find a match in the alignment
4941 SequenceI[] mtch = idm.findAllIdMatches(pdbfn);
4942 int l = 0, c = pdbfn.indexOf(".");
4943 while (mtch == null && c != -1)
4948 } while ((c = pdbfn.indexOf(".", l)) > l);
4951 pdbfn = pdbfn.substring(0, l);
4953 mtch = idm.findAllIdMatches(pdbfn);
4960 type = new IdentifyFile().Identify(file, protocol);
4961 } catch (Exception ex)
4967 if (type.equalsIgnoreCase("PDB"))
4969 filesmatched.add(new Object[]
4970 { file, protocol, mtch });
4975 // File wasn't named like one of the sequences or wasn't a PDB file.
4976 filesnotmatched.add(file);
4980 if (filesmatched.size() > 0)
4982 if (Cache.getDefault("AUTOASSOCIATE_PDBANDSEQS", false)
4988 "label.automatically_associate_pdb_files_with_sequences_same_name",
4995 .getString("label.automatically_associate_pdb_files_by_name"),
4996 JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)
4999 for (Object[] fm : filesmatched)
5001 // try and associate
5002 // TODO: may want to set a standard ID naming formalism for
5003 // associating PDB files which have no IDs.
5004 for (SequenceI toassoc : (SequenceI[]) fm[2])
5006 PDBEntry pe = new AssociatePdbFileWithSeq()
5007 .associatePdbWithSeq((String) fm[0],
5008 (String) fm[1], toassoc, false);
5011 System.err.println("Associated file : "
5012 + ((String) fm[0]) + " with "
5013 + toassoc.getDisplayId(true));
5017 alignPanel.paintAlignment(true);
5021 if (filesnotmatched.size() > 0)
5024 && (Cache.getDefault(
5025 "AUTOASSOCIATE_PDBANDSEQS_IGNOREOTHERS", false) || JOptionPane
5030 "label.ignore_unmatched_dropped_files_info",
5037 .getString("label.ignore_unmatched_dropped_files"),
5038 JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION))
5042 for (String fn : filesnotmatched)
5044 loadJalviewDataFile(fn, null, null, null);
5048 } catch (Exception ex)
5050 ex.printStackTrace();
5056 * Attempt to load a "dropped" file or URL string: First by testing whether
5057 * it's and Annotation file, then a JNet file, and finally a features file. If
5058 * all are false then the user may have dropped an alignment file onto this
5062 * either a filename or a URL string.
5064 public void loadJalviewDataFile(String file, String protocol,
5065 String format, SequenceI assocSeq)
5069 if (protocol == null)
5071 protocol = jalview.io.FormatAdapter.checkProtocol(file);
5073 // if the file isn't identified, or not positively identified as some
5074 // other filetype (PFAM is default unidentified alignment file type) then
5075 // try to parse as annotation.
5076 boolean isAnnotation = (format == null || format
5077 .equalsIgnoreCase("PFAM")) ? new AnnotationFile()
5078 .readAnnotationFile(viewport.getAlignment(), file, protocol)
5083 // first see if its a T-COFFEE score file
5084 TCoffeeScoreFile tcf = null;
5087 tcf = new TCoffeeScoreFile(file, protocol);
5090 if (tcf.annotateAlignment(viewport.getAlignment(), true))
5092 tcoffeeColour.setEnabled(true);
5093 tcoffeeColour.setSelected(true);
5094 changeColour(new TCoffeeColourScheme(viewport.getAlignment()));
5095 isAnnotation = true;
5097 .setText(MessageManager
5098 .getString("label.successfully_pasted_tcoffee_scores_to_alignment"));
5102 // some problem - if no warning its probable that the ID matching
5103 // process didn't work
5107 tcf.getWarningMessage() == null ? MessageManager
5108 .getString("label.check_file_matches_sequence_ids_alignment")
5109 : tcf.getWarningMessage(),
5111 .getString("label.problem_reading_tcoffee_score_file"),
5112 JOptionPane.WARNING_MESSAGE);
5119 } catch (Exception x)
5122 .debug("Exception when processing data source as T-COFFEE score file",
5128 // try to see if its a JNet 'concise' style annotation file *before*
5130 // try to parse it as a features file
5133 format = new IdentifyFile().Identify(file, protocol);
5135 if (format.equalsIgnoreCase("JnetFile"))
5137 jalview.io.JPredFile predictions = new jalview.io.JPredFile(
5139 new JnetAnnotationMaker().add_annotation(predictions,
5140 viewport.getAlignment(), 0, false);
5141 isAnnotation = true;
5146 * if (format.equalsIgnoreCase("PDB")) {
5148 * String pdbfn = ""; // try to match up filename with sequence id
5149 * try { if (protocol == jalview.io.FormatAdapter.FILE) { File fl =
5150 * new File(file); pdbfn = fl.getName(); } else if (protocol ==
5151 * jalview.io.FormatAdapter.URL) { URL url = new URL(file); pdbfn =
5152 * url.getFile(); } } catch (Exception e) { } ; if (assocSeq ==
5153 * null) { SequenceIdMatcher idm = new SequenceIdMatcher(viewport
5154 * .getAlignment().getSequencesArray()); if (pdbfn.length() > 0) {
5155 * // attempt to find a match in the alignment SequenceI mtch =
5156 * idm.findIdMatch(pdbfn); int l = 0, c = pdbfn.indexOf("."); while
5157 * (mtch == null && c != -1) { while ((c = pdbfn.indexOf(".", l)) >
5158 * l) { l = c; } if (l > -1) { pdbfn = pdbfn.substring(0, l); } mtch
5159 * = idm.findIdMatch(pdbfn); } if (mtch != null) { // try and
5160 * associate // prompt ? PDBEntry pe = new AssociatePdbFileWithSeq()
5161 * .associatePdbWithSeq(file, protocol, mtch, true); if (pe != null)
5162 * { System.err.println("Associated file : " + file + " with " +
5163 * mtch.getDisplayId(true)); alignPanel.paintAlignment(true); } } //
5164 * TODO: maybe need to load as normal otherwise return; } }
5166 // try to parse it as a features file
5167 boolean isGroupsFile = parseFeaturesFile(file, protocol);
5168 // if it wasn't a features file then we just treat it as a general
5169 // alignment file to load into the current view.
5172 new FileLoader().LoadFile(viewport, file, protocol, format);
5176 alignPanel.paintAlignment(true);
5184 alignPanel.adjustAnnotationHeight();
5185 viewport.updateSequenceIdColours();
5186 buildSortByAnnotationScoresMenu();
5187 alignPanel.paintAlignment(true);
5189 } catch (Exception ex)
5191 ex.printStackTrace();
5192 } catch (OutOfMemoryError oom)
5197 } catch (Exception x)
5203 + (protocol != null ? (protocol.equals(FormatAdapter.PASTE) ? "from clipboard."
5204 : "using " + protocol + " from " + file)
5206 + (format != null ? "(parsing as '" + format
5207 + "' file)" : ""), oom, Desktop.desktop);
5212 public void tabSelectionChanged(int index)
5216 alignPanel = (AlignmentPanel) alignPanels.elementAt(index);
5217 viewport = alignPanel.av;
5218 avc.setViewportAndAlignmentPanel(viewport, alignPanel);
5219 setMenusFromViewport(viewport);
5224 public void tabbedPane_mousePressed(MouseEvent e)
5226 if (SwingUtilities.isRightMouseButton(e))
5228 String reply = JOptionPane.showInternalInputDialog(this,
5229 MessageManager.getString("label.enter_view_name"),
5230 MessageManager.getString("label.enter_view_name"),
5231 JOptionPane.QUESTION_MESSAGE);
5235 viewport.viewName = reply;
5236 tabbedPane.setTitleAt(tabbedPane.getSelectedIndex(), reply);
5241 public AlignViewport getCurrentView()
5247 * Open the dialog for regex description parsing.
5250 protected void extractScores_actionPerformed(ActionEvent e)
5252 ParseProperties pp = new jalview.analysis.ParseProperties(
5253 viewport.getAlignment());
5254 // TODO: verify regex and introduce GUI dialog for version 2.5
5255 // if (pp.getScoresFromDescription("col", "score column ",
5256 // "\\W*([-+]?\\d*\\.?\\d*e?-?\\d*)\\W+([-+]?\\d*\\.?\\d*e?-?\\d*)",
5258 if (pp.getScoresFromDescription("description column",
5259 "score in description column ", "\\W*([-+eE0-9.]+)", true) > 0)
5261 buildSortByAnnotationScoresMenu();
5269 * jalview.jbgui.GAlignFrame#showDbRefs_actionPerformed(java.awt.event.ActionEvent
5273 protected void showDbRefs_actionPerformed(ActionEvent e)
5275 viewport.setShowDbRefs(showDbRefsMenuitem.isSelected());
5281 * @seejalview.jbgui.GAlignFrame#showNpFeats_actionPerformed(java.awt.event.
5285 protected void showNpFeats_actionPerformed(ActionEvent e)
5287 viewport.setShowNpFeats(showNpFeatsMenuitem.isSelected());
5291 * find the viewport amongst the tabs in this alignment frame and close that
5296 public boolean closeView(AlignViewport av)
5300 this.closeMenuItem_actionPerformed(false);
5303 Component[] comp = tabbedPane.getComponents();
5304 for (int i = 0; comp != null && i < comp.length; i++)
5306 if (comp[i] instanceof AlignmentPanel)
5308 if (((AlignmentPanel) comp[i]).av == av)
5311 closeView((AlignmentPanel) comp[i]);
5319 protected void build_fetchdbmenu(JMenu webService)
5321 // Temporary hack - DBRef Fetcher always top level ws entry.
5322 // TODO We probably want to store a sequence database checklist in
5323 // preferences and have checkboxes.. rather than individual sources selected
5325 final JMenu rfetch = new JMenu(
5326 MessageManager.getString("action.fetch_db_references"));
5327 rfetch.setToolTipText(MessageManager
5328 .getString("label.retrieve_parse_sequence_database_records_alignment_or_selected_sequences"));
5329 webService.add(rfetch);
5331 final JCheckBoxMenuItem trimrs = new JCheckBoxMenuItem(
5332 MessageManager.getString("option.trim_retrieved_seqs"));
5333 trimrs.setToolTipText(MessageManager
5334 .getString("label.trim_retrieved_sequences"));
5335 trimrs.setSelected(Cache.getDefault("TRIM_FETCHED_DATASET_SEQS", true));
5336 trimrs.addActionListener(new ActionListener()
5339 public void actionPerformed(ActionEvent e)
5341 trimrs.setSelected(trimrs.isSelected());
5342 Cache.setProperty("TRIM_FETCHED_DATASET_SEQS",
5343 Boolean.valueOf(trimrs.isSelected()).toString());
5347 JMenuItem fetchr = new JMenuItem(
5348 MessageManager.getString("label.standard_databases"));
5349 fetchr.setToolTipText(MessageManager
5350 .getString("label.fetch_embl_uniprot"));
5351 fetchr.addActionListener(new ActionListener()
5355 public void actionPerformed(ActionEvent e)
5357 new Thread(new Runnable()
5363 new jalview.ws.DBRefFetcher(alignPanel.av
5364 .getSequenceSelection(), alignPanel.alignFrame)
5365 .fetchDBRefs(false);
5373 final AlignFrame me = this;
5374 new Thread(new Runnable()
5379 final jalview.ws.SequenceFetcher sf = SequenceFetcher
5380 .getSequenceFetcherSingleton(me);
5381 javax.swing.SwingUtilities.invokeLater(new Runnable()
5386 String[] dbclasses = sf.getOrderedSupportedSources();
5387 // sf.getDbInstances(jalview.ws.dbsources.DasSequenceSource.class);
5388 // jalview.util.QuickSort.sort(otherdb, otherdb);
5389 List<DbSourceProxy> otherdb;
5390 JMenu dfetch = new JMenu();
5391 JMenu ifetch = new JMenu();
5392 JMenuItem fetchr = null;
5393 int comp = 0, icomp = 0, mcomp = 15;
5394 String mname = null;
5396 for (String dbclass : dbclasses)
5398 otherdb = sf.getSourceProxy(dbclass);
5399 // add a single entry for this class, or submenu allowing 'fetch
5401 if (otherdb == null || otherdb.size() < 1)
5405 // List<DbSourceProxy> dbs=otherdb;
5406 // otherdb=new ArrayList<DbSourceProxy>();
5407 // for (DbSourceProxy db:dbs)
5409 // if (!db.isA(DBRefSource.ALIGNMENTDB)
5413 mname = "From " + dbclass;
5415 if (otherdb.size() == 1)
5417 final DbSourceProxy[] dassource = otherdb
5418 .toArray(new DbSourceProxy[0]);
5419 DbSourceProxy src = otherdb.get(0);
5420 fetchr = new JMenuItem(src.getDbSource());
5421 fetchr.addActionListener(new ActionListener()
5425 public void actionPerformed(ActionEvent e)
5427 new Thread(new Runnable()
5433 new jalview.ws.DBRefFetcher(alignPanel.av
5434 .getSequenceSelection(),
5435 alignPanel.alignFrame, dassource)
5436 .fetchDBRefs(false);
5442 fetchr.setToolTipText(JvSwingUtils.wrapTooltip(true, MessageManager.formatMessage("label.fetch_retrieve_from", new String[]{src.getDbName()})));
5448 final DbSourceProxy[] dassource = otherdb
5449 .toArray(new DbSourceProxy[0]);
5451 DbSourceProxy src = otherdb.get(0);
5452 fetchr = new JMenuItem(MessageManager.formatMessage(
5453 "label.fetch_all_param", new String[]
5454 { src.getDbSource() }));
5455 fetchr.addActionListener(new ActionListener()
5458 public void actionPerformed(ActionEvent e)
5460 new Thread(new Runnable()
5466 new jalview.ws.DBRefFetcher(alignPanel.av
5467 .getSequenceSelection(),
5468 alignPanel.alignFrame, dassource)
5469 .fetchDBRefs(false);
5475 fetchr.setToolTipText(JvSwingUtils.wrapTooltip(true, MessageManager.formatMessage("label.fetch_retrieve_from_all_sources", new String[]{Integer.valueOf(otherdb.size()).toString(), src.getDbSource(), src.getDbName()})));
5478 // and then build the rest of the individual menus
5479 ifetch = new JMenu(MessageManager.formatMessage("label.source_from_db_source", new String[]{src.getDbSource()}));
5481 String imname = null;
5483 for (DbSourceProxy sproxy : otherdb)
5485 String dbname = sproxy.getDbName();
5486 String sname = dbname.length() > 5 ? dbname.substring(0,
5487 5) + "..." : dbname;
5488 String msname = dbname.length() > 10 ? dbname.substring(
5489 0, 10) + "..." : dbname;
5492 imname = MessageManager.formatMessage("label.from_msname", new String[]{sname});
5494 fetchr = new JMenuItem(msname);
5495 final DbSourceProxy[] dassrc =
5497 fetchr.addActionListener(new ActionListener()
5501 public void actionPerformed(ActionEvent e)
5503 new Thread(new Runnable()
5509 new jalview.ws.DBRefFetcher(alignPanel.av
5510 .getSequenceSelection(),
5511 alignPanel.alignFrame, dassrc)
5512 .fetchDBRefs(false);
5518 fetchr.setToolTipText("<html>"
5519 + MessageManager.formatMessage("label.fetch_retrieve_from", new String[]{dbname}));
5522 if (++icomp >= mcomp || i == (otherdb.size()))
5524 ifetch.setText(MessageManager.formatMessage(
5525 "label.source_to_target", imname, sname));
5527 ifetch = new JMenu();
5535 if (comp >= mcomp || dbi >= (dbclasses.length))
5537 dfetch.setText(MessageManager.formatMessage(
5538 "label.source_to_target", mname, dbclass));
5540 dfetch = new JMenu();
5553 * Left justify the whole alignment.
5556 protected void justifyLeftMenuItem_actionPerformed(ActionEvent e)
5558 AlignmentI al = viewport.getAlignment();
5560 viewport.firePropertyChange("alignment", null, al);
5564 * Right justify the whole alignment.
5567 protected void justifyRightMenuItem_actionPerformed(ActionEvent e)
5569 AlignmentI al = viewport.getAlignment();
5571 viewport.firePropertyChange("alignment", null, al);
5574 public void setShowSeqFeatures(boolean b)
5576 showSeqFeatures.setSelected(true);
5577 viewport.setShowSequenceFeatures(true);
5584 * jalview.jbgui.GAlignFrame#showUnconservedMenuItem_actionPerformed(java.
5585 * awt.event.ActionEvent)
5588 protected void showUnconservedMenuItem_actionPerformed(ActionEvent e)
5590 viewport.setShowUnconserved(showNonconservedMenuItem.getState());
5591 alignPanel.paintAlignment(true);
5598 * jalview.jbgui.GAlignFrame#showGroupConsensus_actionPerformed(java.awt.event
5602 protected void showGroupConsensus_actionPerformed(ActionEvent e)
5604 viewport.setShowGroupConsensus(showGroupConsensus.getState());
5605 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
5613 * jalview.jbgui.GAlignFrame#showGroupConservation_actionPerformed(java.awt
5614 * .event.ActionEvent)
5617 protected void showGroupConservation_actionPerformed(ActionEvent e)
5619 viewport.setShowGroupConservation(showGroupConservation.getState());
5620 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
5627 * jalview.jbgui.GAlignFrame#showConsensusHistogram_actionPerformed(java.awt
5628 * .event.ActionEvent)
5631 protected void showConsensusHistogram_actionPerformed(ActionEvent e)
5633 viewport.setShowConsensusHistogram(showConsensusHistogram.getState());
5634 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
5641 * jalview.jbgui.GAlignFrame#showConsensusProfile_actionPerformed(java.awt
5642 * .event.ActionEvent)
5645 protected void showSequenceLogo_actionPerformed(ActionEvent e)
5647 viewport.setShowSequenceLogo(showSequenceLogo.getState());
5648 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
5652 protected void normaliseSequenceLogo_actionPerformed(ActionEvent e)
5654 showSequenceLogo.setState(true);
5655 viewport.setShowSequenceLogo(true);
5656 viewport.setNormaliseSequenceLogo(normaliseSequenceLogo.getState());
5657 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
5661 protected void applyAutoAnnotationSettings_actionPerformed(ActionEvent e)
5663 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
5670 * jalview.jbgui.GAlignFrame#makeGrpsFromSelection_actionPerformed(java.awt
5671 * .event.ActionEvent)
5674 protected void makeGrpsFromSelection_actionPerformed(ActionEvent e)
5676 if (avc.makeGroupsFromSelection())
5678 PaintRefresher.Refresh(this, viewport.getSequenceSetId());
5679 alignPanel.updateAnnotation();
5680 alignPanel.paintAlignment(true);
5685 protected void createGroup_actionPerformed(ActionEvent e)
5687 if (avc.createGroup())
5689 alignPanel.alignmentChanged();
5694 protected void unGroup_actionPerformed(ActionEvent e)
5698 alignPanel.alignmentChanged();
5703 * make the given alignmentPanel the currently selected tab
5705 * @param alignmentPanel
5707 public void setDisplayedView(AlignmentPanel alignmentPanel)
5709 if (!viewport.getSequenceSetId().equals(
5710 alignmentPanel.av.getSequenceSetId()))
5712 throw new Error(MessageManager.getString("error.implementation_error_cannot_show_view_alignment_frame"));
5714 if (tabbedPane != null
5715 & alignPanels.indexOf(alignmentPanel) != tabbedPane
5716 .getSelectedIndex())
5718 tabbedPane.setSelectedIndex(alignPanels.indexOf(alignmentPanel));
5723 * Action on selection of menu option to Show or Hide all annotations.
5728 protected void setAllAnnotationsVisibility(boolean visible)
5730 for (AlignmentAnnotation aa : alignPanel.getAlignment()
5731 .getAlignmentAnnotation())
5733 aa.visible = visible;
5735 this.alignPanel.paintAlignment(true);
5739 class PrintThread extends Thread
5743 public PrintThread(AlignmentPanel ap)
5748 static PageFormat pf;
5753 PrinterJob printJob = PrinterJob.getPrinterJob();
5757 printJob.setPrintable(ap, pf);
5761 printJob.setPrintable(ap);
5764 if (printJob.printDialog())
5769 } catch (Exception PrintException)
5771 PrintException.printStackTrace();