2 * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1)
3 * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
26 import java.awt.datatransfer.*;
27 import java.awt.dnd.*;
28 import java.awt.event.*;
29 import java.awt.print.*;
31 import javax.swing.event.MenuEvent;
33 import jalview.analysis.*;
34 import jalview.commands.*;
35 import jalview.datamodel.*;
37 import jalview.jbgui.*;
38 import jalview.schemes.*;
47 public class AlignFrame extends GAlignFrame implements DropTargetListener,
52 public static final int DEFAULT_WIDTH = 700;
55 public static final int DEFAULT_HEIGHT = 500;
57 public AlignmentPanel alignPanel;
59 AlignViewport viewport;
61 Vector alignPanels = new Vector();
64 * Last format used to load or save alignments in this window
66 String currentFileFormat = null;
69 * Current filename for this alignment
71 String fileName = null;
74 * Creates a new AlignFrame object with specific width and height.
80 public AlignFrame(AlignmentI al, int width, int height)
82 this(al, null, width, height);
86 * Creates a new AlignFrame object with specific width, height and
92 * @param sequenceSetId
94 public AlignFrame(AlignmentI al, int width, int height,
97 this(al, null, width, height, sequenceSetId);
101 * Creates a new AlignFrame object with specific width, height and
107 * @param sequenceSetId
110 public AlignFrame(AlignmentI al, int width, int height,
111 String sequenceSetId, String viewId)
113 this(al, null, width, height, sequenceSetId, viewId);
117 * new alignment window with hidden columns
121 * @param hiddenColumns
122 * ColumnSelection or null
124 * Width of alignment frame
128 public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns,
129 int width, int height)
131 this(al, hiddenColumns, width, height, null);
135 * Create alignment frame for al with hiddenColumns, a specific width and
136 * height, and specific sequenceId
139 * @param hiddenColumns
142 * @param sequenceSetId
145 public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns,
146 int width, int height, String sequenceSetId)
148 this(al, hiddenColumns, width, height, sequenceSetId, null);
152 * Create alignment frame for al with hiddenColumns, a specific width and
153 * height, and specific sequenceId
156 * @param hiddenColumns
159 * @param sequenceSetId
164 public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns,
165 int width, int height, String sequenceSetId, String viewId)
167 setSize(width, height);
168 viewport = new AlignViewport(al, hiddenColumns, sequenceSetId, viewId);
170 alignPanel = new AlignmentPanel(this, viewport);
172 if (al.getDataset() == null)
177 addAlignmentPanel(alignPanel, true);
182 * Make a new AlignFrame from exisiting alignmentPanels
189 public AlignFrame(AlignmentPanel ap)
193 addAlignmentPanel(ap, false);
198 * initalise the alignframe from the underlying viewport data and the
203 if (viewport.conservation == null)
205 BLOSUM62Colour.setEnabled(false);
206 conservationMenuItem.setEnabled(false);
207 modifyConservation.setEnabled(false);
208 // PIDColour.setEnabled(false);
209 // abovePIDThreshold.setEnabled(false);
210 // modifyPID.setEnabled(false);
213 String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT",
216 if (sortby.equals("Id"))
218 sortIDMenuItem_actionPerformed(null);
220 else if (sortby.equals("Pairwise Identity"))
222 sortPairwiseMenuItem_actionPerformed(null);
225 if (Desktop.desktop != null)
227 this.setDropTarget(new java.awt.dnd.DropTarget(this, this));
228 addServiceListeners();
229 setGUINucleotide(viewport.alignment.isNucleotide());
232 setMenusFromViewport(viewport);
233 buildSortByAnnotationScoresMenu();
234 if (viewport.wrapAlignment)
236 wrapMenuItem_actionPerformed(null);
239 if (jalview.bin.Cache.getDefault("SHOW_OVERVIEW", false))
241 this.overviewMenuItem_actionPerformed(null);
249 * Change the filename and format for the alignment, and enable the 'reload'
250 * button functionality.
257 public void setFileName(String file, String format)
260 currentFileFormat = format;
261 reload.setEnabled(true);
264 void addKeyListener()
266 addKeyListener(new KeyAdapter()
268 public void keyPressed(KeyEvent evt)
270 if (viewport.cursorMode
271 && ((evt.getKeyCode() >= KeyEvent.VK_0 && evt.getKeyCode() <= KeyEvent.VK_9) || (evt
272 .getKeyCode() >= KeyEvent.VK_NUMPAD0 && evt
273 .getKeyCode() <= KeyEvent.VK_NUMPAD9))
274 && Character.isDigit(evt.getKeyChar()))
275 alignPanel.seqPanel.numberPressed(evt.getKeyChar());
277 switch (evt.getKeyCode())
280 case 27: // escape key
281 deselectAllSequenceMenuItem_actionPerformed(null);
285 case KeyEvent.VK_DOWN:
286 if (evt.isAltDown() || !viewport.cursorMode)
287 moveSelectedSequences(false);
288 if (viewport.cursorMode)
289 alignPanel.seqPanel.moveCursor(0, 1);
293 if (evt.isAltDown() || !viewport.cursorMode)
294 moveSelectedSequences(true);
295 if (viewport.cursorMode)
296 alignPanel.seqPanel.moveCursor(0, -1);
300 case KeyEvent.VK_LEFT:
301 if (evt.isAltDown() || !viewport.cursorMode)
302 slideSequences(false, alignPanel.seqPanel.getKeyboardNo1());
304 alignPanel.seqPanel.moveCursor(-1, 0);
308 case KeyEvent.VK_RIGHT:
309 if (evt.isAltDown() || !viewport.cursorMode)
310 slideSequences(true, alignPanel.seqPanel.getKeyboardNo1());
312 alignPanel.seqPanel.moveCursor(1, 0);
315 case KeyEvent.VK_SPACE:
316 if (viewport.cursorMode)
318 alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown()
319 || evt.isShiftDown() || evt.isAltDown());
323 case KeyEvent.VK_DELETE:
324 case KeyEvent.VK_BACK_SPACE:
325 if (!viewport.cursorMode)
327 cut_actionPerformed(null);
331 alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown()
332 || evt.isShiftDown() || evt.isAltDown());
338 if (viewport.cursorMode)
340 alignPanel.seqPanel.setCursorRow();
344 if (viewport.cursorMode && !evt.isControlDown())
346 alignPanel.seqPanel.setCursorColumn();
350 if (viewport.cursorMode)
352 alignPanel.seqPanel.setCursorPosition();
356 case KeyEvent.VK_ENTER:
357 case KeyEvent.VK_COMMA:
358 if (viewport.cursorMode)
360 alignPanel.seqPanel.setCursorRowAndColumn();
365 if (viewport.cursorMode)
367 alignPanel.seqPanel.setSelectionAreaAtCursor(true);
371 if (viewport.cursorMode)
373 alignPanel.seqPanel.setSelectionAreaAtCursor(false);
378 viewport.cursorMode = !viewport.cursorMode;
379 statusBar.setText("Keyboard editing mode is "
380 + (viewport.cursorMode ? "on" : "off"));
381 if (viewport.cursorMode)
383 alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes;
384 alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq;
386 alignPanel.seqPanel.seqCanvas.repaint();
392 ClassLoader cl = jalview.gui.Desktop.class.getClassLoader();
393 java.net.URL url = javax.help.HelpSet.findHelpSet(cl,
395 javax.help.HelpSet hs = new javax.help.HelpSet(cl, url);
397 javax.help.HelpBroker hb = hs.createHelpBroker();
398 hb.setCurrentID("home");
399 hb.setDisplayed(true);
400 } catch (Exception ex)
402 ex.printStackTrace();
407 boolean toggleSeqs = !evt.isControlDown();
408 boolean toggleCols = !evt.isShiftDown();
410 boolean hide = false;
411 SequenceGroup sg = viewport.getSelectionGroup();
412 // TODO: document ctrl-shift-h for show visible selected area and fix hack so columns for the current selected region get transferred.
413 if (!toggleSeqs && !toggleCols)
415 // Hide everything by the current selection - this is a hack - we do the invert and then hide
416 // first check that there will be visible columns after the invert.
417 if ((viewport.colSel!=null && viewport.colSel.getSelected()!=null && viewport.colSel.getSelected().size()>0) || (sg!=null && sg.getSize()>0 && sg.getStartRes()<=sg.getEndRes()))
419 // now invert the sequence set, if required - empty selection implies that no hiding is required.
421 invertSequenceMenuItem_actionPerformed(null);
422 sg = viewport.getSelectionGroup();
427 if (sg!=null && sg.getStartRes()>=0 && sg.getStartRes()<=sg.getEndRes()&& (viewport.colSel==null || viewport.colSel.getSelected()==null || viewport.colSel.getSelected().size()==0))
429 // synthesize a column selection if none exists. this happens if a single region has been selected rather than whole columns.
430 if (viewport.colSel==null)
432 viewport.colSel = new ColumnSelection();
434 for (int cspos = sg.getStartRes(); cspos<=sg.getEndRes(); cspos++) {
435 viewport.colSel.addElement(cspos);
438 // finally invert the column selection and get the new sequence selection.
439 invertColSel_actionPerformed(null);
447 && sg.getSize() != viewport.alignment.getHeight())
449 hideSelSequences_actionPerformed(null);
452 else if (!(toggleCols && viewport.colSel.getSelected().size() > 0))
454 showAllSeqs_actionPerformed(null);
460 if (viewport.colSel.getSelected().size() > 0)
462 hideSelColumns_actionPerformed(null);
465 viewport.selectionGroup = sg;
470 showAllColumns_actionPerformed(null);
475 case KeyEvent.VK_PAGE_UP:
476 if (viewport.wrapAlignment)
478 alignPanel.scrollUp(true);
482 alignPanel.setScrollValues(viewport.startRes, viewport.startSeq
483 - viewport.endSeq + viewport.startSeq);
486 case KeyEvent.VK_PAGE_DOWN:
487 if (viewport.wrapAlignment)
489 alignPanel.scrollUp(false);
493 alignPanel.setScrollValues(viewport.startRes, viewport.startSeq
494 + viewport.endSeq - viewport.startSeq);
500 public void keyReleased(KeyEvent evt)
502 switch (evt.getKeyCode())
504 case KeyEvent.VK_LEFT:
505 if (evt.isAltDown() || !viewport.cursorMode)
506 viewport.firePropertyChange("alignment", null, viewport
507 .getAlignment().getSequences());
510 case KeyEvent.VK_RIGHT:
511 if (evt.isAltDown() || !viewport.cursorMode)
512 viewport.firePropertyChange("alignment", null, viewport
513 .getAlignment().getSequences());
520 public void addAlignmentPanel(final AlignmentPanel ap, boolean newPanel)
522 ap.alignFrame = this;
524 alignPanels.addElement(ap);
526 PaintRefresher.Register(ap, ap.av.getSequenceSetId());
528 int aSize = alignPanels.size();
530 tabbedPane.setVisible(aSize > 1 || ap.av.viewName != null);
532 if (aSize == 1 && ap.av.viewName == null)
534 this.getContentPane().add(ap, BorderLayout.CENTER);
540 setInitialTabVisible();
543 expandViews.setEnabled(true);
544 gatherViews.setEnabled(true);
545 tabbedPane.addTab(ap.av.viewName, ap);
547 ap.setVisible(false);
554 ap.av.alignment.padGaps();
556 ap.av.updateConservation(ap);
557 ap.av.updateConsensus(ap);
561 public void setInitialTabVisible()
563 expandViews.setEnabled(true);
564 gatherViews.setEnabled(true);
565 tabbedPane.setVisible(true);
566 AlignmentPanel first = (AlignmentPanel) alignPanels.firstElement();
567 tabbedPane.addTab(first.av.viewName, first);
568 this.getContentPane().add(tabbedPane, BorderLayout.CENTER);
571 public AlignViewport getViewport()
576 /* Set up intrinsic listeners for dynamically generated GUI bits. */
577 private void addServiceListeners()
579 final java.beans.PropertyChangeListener thisListener;
580 // Do this once to get current state
581 BuildWebServiceMenu();
583 .addPropertyChangeListener(thisListener = new java.beans.PropertyChangeListener()
585 public void propertyChange(PropertyChangeEvent evt)
587 // System.out.println("Discoverer property change.");
588 if (evt.getPropertyName().equals("services"))
590 // System.out.println("Rebuilding web service menu");
591 BuildWebServiceMenu();
596 addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
598 public void internalFrameClosed(
599 javax.swing.event.InternalFrameEvent evt)
601 // System.out.println("deregistering discoverer listener");
602 Desktop.discoverer.removePropertyChangeListener(thisListener);
603 closeMenuItem_actionPerformed(true);
608 public void setGUINucleotide(boolean nucleotide)
610 showTranslation.setVisible(nucleotide);
611 conservationMenuItem.setEnabled(!nucleotide);
612 modifyConservation.setEnabled(!nucleotide);
613 showGroupConservation.setEnabled(!nucleotide);
614 // Remember AlignFrame always starts as protein
617 calculateMenu.remove(calculateMenu.getItemCount() - 2);
622 * set up menus for the currently viewport. This may be called after any
623 * operation that affects the data in the current view (selection changed,
624 * etc) to update the menus to reflect the new state.
626 public void setMenusForViewport()
628 setMenusFromViewport(viewport);
632 * Need to call this method when tabs are selected for multiple views, or when
633 * loading from Jalview2XML.java
638 void setMenusFromViewport(AlignViewport av)
640 padGapsMenuitem.setSelected(av.padGaps);
641 colourTextMenuItem.setSelected(av.showColourText);
642 abovePIDThreshold.setSelected(av.getAbovePIDThreshold());
643 conservationMenuItem.setSelected(av.getConservationSelected());
644 seqLimits.setSelected(av.getShowJVSuffix());
645 idRightAlign.setSelected(av.rightAlignIds);
646 centreColumnLabelsMenuItem.setState(av.centreColumnLabels);
647 renderGapsMenuItem.setSelected(av.renderGaps);
648 wrapMenuItem.setSelected(av.wrapAlignment);
649 scaleAbove.setVisible(av.wrapAlignment);
650 scaleLeft.setVisible(av.wrapAlignment);
651 scaleRight.setVisible(av.wrapAlignment);
652 annotationPanelMenuItem.setState(av.showAnnotation);
653 viewBoxesMenuItem.setSelected(av.showBoxes);
654 viewTextMenuItem.setSelected(av.showText);
655 showUnconservedMenuItem.setSelected(av.showUnconserved);
656 showGroupConsensus.setSelected(av.showGroupConsensus);
657 showGroupConservation.setSelected(av.showGroupConservation);
658 showConsensusHistogram.setSelected(av.showConsensusHistogram);
659 showConsensusProfile.setSelected(av.showConsensusProfile);
660 setColourSelected(ColourSchemeProperty.getColourName(av
661 .getGlobalColourScheme()));
663 showSeqFeatures.setSelected(av.showSequenceFeatures);
664 hiddenMarkers.setState(av.showHiddenMarkers);
665 applyToAllGroups.setState(av.colourAppliesToAllGroups);
666 showNpFeatsMenuitem.setSelected(av.isShowNpFeats());
667 showDbRefsMenuitem.setSelected(av.isShowDbRefs());
669 setShowProductsEnabled();
674 Hashtable progressBars, progressBarHandlers;
679 * @see jalview.gui.IProgressIndicator#setProgressBar(java.lang.String, long)
681 public void setProgressBar(String message, long id)
683 if (progressBars == null)
685 progressBars = new Hashtable();
686 progressBarHandlers = new Hashtable();
689 JPanel progressPanel;
690 Long lId=new Long(id);
691 GridLayout layout = (GridLayout) statusPanel.getLayout();
692 if (progressBars.get(lId) != null)
694 progressPanel = (JPanel) progressBars.get(new Long(id));
695 statusPanel.remove(progressPanel);
696 progressBars.remove(lId);
697 progressPanel = null;
700 statusBar.setText(message);
702 if (progressBarHandlers.contains(lId))
704 progressBarHandlers.remove(lId);
706 layout.setRows(layout.getRows() - 1);
710 progressPanel = new JPanel(new BorderLayout(10, 5));
712 JProgressBar progressBar = new JProgressBar();
713 progressBar.setIndeterminate(true);
715 progressPanel.add(new JLabel(message), BorderLayout.WEST);
716 progressPanel.add(progressBar, BorderLayout.CENTER);
718 layout.setRows(layout.getRows() + 1);
719 statusPanel.add(progressPanel);
721 progressBars.put(lId, progressPanel);
724 setMenusForViewport();
728 public void registerHandler(final long id,
729 final IProgressIndicatorHandler handler)
731 if (progressBarHandlers == null || !progressBars.contains(new Long(id)))
734 "call setProgressBar before registering the progress bar's handler.");
736 progressBarHandlers.put(new Long(id), handler);
737 final JPanel progressPanel = (JPanel) progressBars.get(new Long(id));
738 if (handler.canCancel())
740 JButton cancel = new JButton("Cancel");
741 final IProgressIndicator us = this;
742 cancel.addActionListener(new ActionListener()
745 public void actionPerformed(ActionEvent e)
747 handler.cancelActivity(id);
748 us.setProgressBar("Cancelled "
749 + ((JLabel) progressPanel.getComponent(0)).getText(), id);
752 progressPanel.add(cancel, BorderLayout.EAST);
758 * @return true if any progress bars are still active
760 public boolean operationInProgress()
762 if (progressBars != null && progressBars.size() > 0)
770 * Added so Castor Mapping file can obtain Jalview Version
772 public String getVersion()
774 return jalview.bin.Cache.getProperty("VERSION");
777 public FeatureRenderer getFeatureRenderer()
779 return alignPanel.seqPanel.seqCanvas.getFeatureRenderer();
782 public void fetchSequence_actionPerformed(ActionEvent e)
784 new SequenceFetcher(this);
787 public void addFromFile_actionPerformed(ActionEvent e)
789 Desktop.instance.inputLocalFileMenuItem_actionPerformed(viewport);
792 public void reload_actionPerformed(ActionEvent e)
794 if (fileName != null)
796 if (currentFileFormat.equals("Jalview"))
798 JInternalFrame[] frames = Desktop.desktop.getAllFrames();
799 for (int i = 0; i < frames.length; i++)
801 if (frames[i] instanceof AlignFrame && frames[i] != this
802 && ((AlignFrame) frames[i]).fileName.equals(fileName))
806 frames[i].setSelected(true);
807 Desktop.instance.closeAssociatedWindows();
808 } catch (java.beans.PropertyVetoException ex)
814 Desktop.instance.closeAssociatedWindows();
816 FileLoader loader = new FileLoader();
817 String protocol = fileName.startsWith("http:") ? "URL" : "File";
818 loader.LoadFile(viewport, fileName, protocol, currentFileFormat);
822 Rectangle bounds = this.getBounds();
824 FileLoader loader = new FileLoader();
825 String protocol = fileName.startsWith("http:") ? "URL" : "File";
826 AlignFrame newframe = loader.LoadFileWaitTillLoaded(fileName,
827 protocol, currentFileFormat);
829 newframe.setBounds(bounds);
831 this.closeMenuItem_actionPerformed(true);
836 public void addFromText_actionPerformed(ActionEvent e)
838 Desktop.instance.inputTextboxMenuItem_actionPerformed(viewport);
841 public void addFromURL_actionPerformed(ActionEvent e)
843 Desktop.instance.inputURLMenuItem_actionPerformed(viewport);
846 public void save_actionPerformed(ActionEvent e)
849 || (currentFileFormat == null || !jalview.io.FormatAdapter
850 .isValidIOFormat(currentFileFormat, true))
851 || fileName.startsWith("http"))
853 saveAs_actionPerformed(null);
857 saveAlignment(fileName, currentFileFormat);
867 public void saveAs_actionPerformed(ActionEvent e)
869 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache
870 .getProperty("LAST_DIRECTORY"),
871 jalview.io.AppletFormatAdapter.WRITABLE_EXTENSIONS,
872 jalview.io.AppletFormatAdapter.WRITABLE_FNAMES,
873 currentFileFormat, false);
875 chooser.setFileView(new JalviewFileView());
876 chooser.setDialogTitle("Save Alignment to file");
877 chooser.setToolTipText("Save");
879 int value = chooser.showSaveDialog(this);
881 if (value == JalviewFileChooser.APPROVE_OPTION)
883 currentFileFormat = chooser.getSelectedFormat();
884 if (currentFileFormat == null)
886 JOptionPane.showInternalMessageDialog(Desktop.desktop,
887 "You must select a file format before saving!",
888 "File format not specified", JOptionPane.WARNING_MESSAGE);
889 value = chooser.showSaveDialog(this);
893 fileName = chooser.getSelectedFile().getPath();
895 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
898 jalview.bin.Cache.setProperty("LAST_DIRECTORY", fileName);
899 if (currentFileFormat.indexOf(" ") > -1)
901 currentFileFormat = currentFileFormat.substring(0,
902 currentFileFormat.indexOf(" "));
904 saveAlignment(fileName, currentFileFormat);
908 public boolean saveAlignment(String file, String format)
910 boolean success = true;
912 if (format.equalsIgnoreCase("Jalview"))
914 String shortName = title;
916 if (shortName.indexOf(java.io.File.separatorChar) > -1)
918 shortName = shortName.substring(shortName
919 .lastIndexOf(java.io.File.separatorChar) + 1);
922 success = new Jalview2XML().SaveAlignment(this, file, shortName);
924 statusBar.setText("Successfully saved to file: " + fileName + " in "
925 + format + " format.");
930 if (!jalview.io.AppletFormatAdapter.isValidFormat(format, true))
932 warningMessage("Cannot save file " + fileName + " using format "
933 + format, "Alignment output format not supported");
934 saveAs_actionPerformed(null);
935 // JBPNote need to have a raise_gui flag here
939 String[] omitHidden = null;
941 if (viewport.hasHiddenColumns)
943 int reply = JOptionPane
944 .showInternalConfirmDialog(
946 "The Alignment contains hidden columns."
947 + "\nDo you want to save only the visible alignment?",
948 "Save / Omit Hidden Columns",
949 JOptionPane.YES_NO_OPTION,
950 JOptionPane.QUESTION_MESSAGE);
952 if (reply == JOptionPane.YES_OPTION)
954 omitHidden = viewport.getViewAsString(false);
957 FormatAdapter f = new FormatAdapter();
958 String output = f.formatSequences(format,
959 (Alignment) viewport.alignment, // class cast exceptions will
960 // occur in the distant future
961 omitHidden, f.getCacheSuffixDefault(format), viewport.colSel);
971 java.io.PrintWriter out = new java.io.PrintWriter(
972 new java.io.FileWriter(file));
977 statusBar.setText("Successfully saved to file: " + fileName
978 + " in " + format + " format.");
979 } catch (Exception ex)
982 ex.printStackTrace();
989 JOptionPane.showInternalMessageDialog(this, "Couldn't save file: "
990 + fileName, "Error Saving File", JOptionPane.WARNING_MESSAGE);
996 private void warningMessage(String warning, String title)
998 if (new jalview.util.Platform().isHeadless())
1000 System.err.println("Warning: " + title + "\nWarning: " + warning);
1005 JOptionPane.showInternalMessageDialog(this, warning, title,
1006 JOptionPane.WARNING_MESSAGE);
1017 protected void outputText_actionPerformed(ActionEvent e)
1019 String[] omitHidden = null;
1021 if (viewport.hasHiddenColumns)
1023 int reply = JOptionPane
1024 .showInternalConfirmDialog(
1026 "The Alignment contains hidden columns."
1027 + "\nDo you want to output only the visible alignment?",
1028 "Save / Omit Hidden Columns",
1029 JOptionPane.YES_NO_OPTION,
1030 JOptionPane.QUESTION_MESSAGE);
1032 if (reply == JOptionPane.YES_OPTION)
1034 omitHidden = viewport.getViewAsString(false);
1038 CutAndPasteTransfer cap = new CutAndPasteTransfer();
1039 cap.setForInput(null);
1040 Desktop.addInternalFrame(cap, "Alignment output - "
1041 + e.getActionCommand(), 600, 500);
1043 cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
1044 viewport.alignment, omitHidden, viewport.colSel));
1053 protected void htmlMenuItem_actionPerformed(ActionEvent e)
1055 new HTMLOutput(alignPanel, alignPanel.seqPanel.seqCanvas
1056 .getSequenceRenderer(), alignPanel.seqPanel.seqCanvas
1057 .getFeatureRenderer());
1060 public void createImageMap(File file, String image)
1062 alignPanel.makePNGImageMap(file, image);
1071 public void createPNG(File f)
1073 alignPanel.makePNG(f);
1082 public void createEPS(File f)
1084 alignPanel.makeEPS(f);
1087 public void pageSetup_actionPerformed(ActionEvent e)
1089 PrinterJob printJob = PrinterJob.getPrinterJob();
1090 PrintThread.pf = printJob.pageDialog(printJob.defaultPage());
1099 public void printMenuItem_actionPerformed(ActionEvent e)
1101 // Putting in a thread avoids Swing painting problems
1102 PrintThread thread = new PrintThread(alignPanel);
1106 public void exportFeatures_actionPerformed(ActionEvent e)
1108 new AnnotationExporter().exportFeatures(alignPanel);
1111 public void exportAnnotations_actionPerformed(ActionEvent e)
1113 new AnnotationExporter().exportAnnotations(alignPanel,
1114 viewport.showAnnotation ? viewport.alignment
1115 .getAlignmentAnnotation() : null, viewport.alignment
1117 ((Alignment) viewport.alignment).alignmentProperties);
1120 public void associatedData_actionPerformed(ActionEvent e)
1122 // Pick the tree file
1123 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache
1124 .getProperty("LAST_DIRECTORY"));
1125 chooser.setFileView(new JalviewFileView());
1126 chooser.setDialogTitle("Load Jalview Annotations or Features File");
1127 chooser.setToolTipText("Load Jalview Annotations / Features file");
1129 int value = chooser.showOpenDialog(null);
1131 if (value == JalviewFileChooser.APPROVE_OPTION)
1133 String choice = chooser.getSelectedFile().getPath();
1134 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
1135 loadJalviewDataFile(choice);
1141 * Close the current view or all views in the alignment frame. If the frame
1142 * only contains one view then the alignment will be removed from memory.
1144 * @param closeAllTabs
1146 public void closeMenuItem_actionPerformed(boolean closeAllTabs)
1148 if (alignPanels != null && alignPanels.size() < 2)
1150 closeAllTabs = true;
1155 if (alignPanels != null)
1159 if (this.isClosed())
1161 // really close all the windows - otherwise wait till
1162 // setClosed(true) is called
1163 for (int i = 0; i < alignPanels.size(); i++)
1165 AlignmentPanel ap = (AlignmentPanel) alignPanels.elementAt(i);
1172 closeView(alignPanel);
1178 this.setClosed(true);
1180 } catch (Exception ex)
1182 ex.printStackTrace();
1187 * close alignPanel2 and shuffle tabs appropriately.
1189 * @param alignPanel2
1191 public void closeView(AlignmentPanel alignPanel2)
1193 int index = tabbedPane.getSelectedIndex();
1194 int closedindex = tabbedPane.indexOfComponent(alignPanel2);
1195 alignPanels.removeElement(alignPanel2);
1197 // if (viewport == alignPanel2.av)
1201 alignPanel2.closePanel();
1204 tabbedPane.removeTabAt(closedindex);
1205 tabbedPane.validate();
1207 if (index > closedindex || index == tabbedPane.getTabCount())
1209 // modify currently selected tab index if necessary.
1213 this.tabSelectionChanged(index);
1219 void updateEditMenuBar()
1222 if (viewport.historyList.size() > 0)
1224 undoMenuItem.setEnabled(true);
1225 CommandI command = (CommandI) viewport.historyList.peek();
1226 undoMenuItem.setText("Undo " + command.getDescription());
1230 undoMenuItem.setEnabled(false);
1231 undoMenuItem.setText("Undo");
1234 if (viewport.redoList.size() > 0)
1236 redoMenuItem.setEnabled(true);
1238 CommandI command = (CommandI) viewport.redoList.peek();
1239 redoMenuItem.setText("Redo " + command.getDescription());
1243 redoMenuItem.setEnabled(false);
1244 redoMenuItem.setText("Redo");
1248 public void addHistoryItem(CommandI command)
1250 if (command.getSize() > 0)
1252 viewport.historyList.push(command);
1253 viewport.redoList.clear();
1254 updateEditMenuBar();
1255 viewport.hasHiddenColumns = (viewport.colSel!=null && viewport.colSel.getHiddenColumns() != null && viewport.colSel.getHiddenColumns().size()>0);
1261 * @return alignment objects for all views
1263 AlignmentI[] getViewAlignments()
1265 if (alignPanels != null)
1267 Enumeration e = alignPanels.elements();
1268 AlignmentI[] als = new AlignmentI[alignPanels.size()];
1269 for (int i = 0; e.hasMoreElements(); i++)
1271 als[i] = ((AlignmentPanel) e.nextElement()).av.getAlignment();
1275 if (viewport != null)
1277 return new AlignmentI[]
1278 { viewport.alignment };
1289 protected void undoMenuItem_actionPerformed(ActionEvent e)
1291 if (viewport.historyList.empty())
1293 CommandI command = (CommandI) viewport.historyList.pop();
1294 viewport.redoList.push(command);
1295 command.undoCommand(getViewAlignments());
1297 AlignViewport originalSource = getOriginatingSource(command);
1298 updateEditMenuBar();
1300 if (originalSource != null)
1302 originalSource.hasHiddenColumns = (viewport.colSel!=null && viewport.colSel.getHiddenColumns() != null && viewport.colSel.getHiddenColumns().size()>0);
1303 originalSource.firePropertyChange("alignment", null,
1304 originalSource.alignment.getSequences());
1314 protected void redoMenuItem_actionPerformed(ActionEvent e)
1316 if (viewport.redoList.size() < 1)
1321 CommandI command = (CommandI) viewport.redoList.pop();
1322 viewport.historyList.push(command);
1323 command.doCommand(getViewAlignments());
1325 AlignViewport originalSource = getOriginatingSource(command);
1326 updateEditMenuBar();
1328 if (originalSource != null)
1330 originalSource.hasHiddenColumns = (viewport.colSel!=null && viewport.colSel.getHiddenColumns() != null && viewport.colSel.getHiddenColumns().size()>0);
1331 originalSource.firePropertyChange("alignment", null,
1332 originalSource.alignment.getSequences());
1336 AlignViewport getOriginatingSource(CommandI command)
1338 AlignViewport originalSource = null;
1339 // For sequence removal and addition, we need to fire
1340 // the property change event FROM the viewport where the
1341 // original alignment was altered
1342 AlignmentI al = null;
1343 if (command instanceof EditCommand)
1345 EditCommand editCommand = (EditCommand) command;
1346 al = editCommand.getAlignment();
1347 Vector comps = (Vector) PaintRefresher.components.get(viewport
1348 .getSequenceSetId());
1350 for (int i = 0; i < comps.size(); i++)
1352 if (comps.elementAt(i) instanceof AlignmentPanel)
1354 if (al == ((AlignmentPanel) comps.elementAt(i)).av.alignment)
1356 originalSource = ((AlignmentPanel) comps.elementAt(i)).av;
1363 if (originalSource == null)
1365 // The original view is closed, we must validate
1366 // the current view against the closed view first
1369 PaintRefresher.validateSequences(al, viewport.alignment);
1372 originalSource = viewport;
1375 return originalSource;
1384 public void moveSelectedSequences(boolean up)
1386 SequenceGroup sg = viewport.getSelectionGroup();
1395 for (int i = 1; i < viewport.alignment.getHeight(); i++)
1397 SequenceI seq = viewport.alignment.getSequenceAt(i);
1399 if (!sg.getSequences(null).contains(seq))
1404 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
1406 if (sg.getSequences(null).contains(temp))
1411 viewport.alignment.getSequences().setElementAt(temp, i);
1412 viewport.alignment.getSequences().setElementAt(seq, i - 1);
1417 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
1419 SequenceI seq = viewport.alignment.getSequenceAt(i);
1421 if (!sg.getSequences(null).contains(seq))
1426 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
1428 if (sg.getSequences(null).contains(temp))
1433 viewport.alignment.getSequences().setElementAt(temp, i);
1434 viewport.alignment.getSequences().setElementAt(seq, i + 1);
1438 alignPanel.paintAlignment(true);
1441 synchronized void slideSequences(boolean right, int size)
1443 Vector sg = new Vector();
1444 if (viewport.cursorMode)
1446 sg.addElement(viewport.alignment
1447 .getSequenceAt(alignPanel.seqPanel.seqCanvas.cursorY));
1449 else if (viewport.getSelectionGroup() != null
1450 && viewport.getSelectionGroup().getSize() != viewport.alignment
1453 sg = viewport.getSelectionGroup().getSequences(
1454 viewport.hiddenRepSequences);
1462 Vector invertGroup = new Vector();
1464 for (int i = 0; i < viewport.alignment.getHeight(); i++)
1466 if (!sg.contains(viewport.alignment.getSequenceAt(i)))
1467 invertGroup.add(viewport.alignment.getSequenceAt(i));
1470 SequenceI[] seqs1 = new SequenceI[sg.size()];
1471 for (int i = 0; i < sg.size(); i++)
1472 seqs1[i] = (SequenceI) sg.elementAt(i);
1474 SequenceI[] seqs2 = new SequenceI[invertGroup.size()];
1475 for (int i = 0; i < invertGroup.size(); i++)
1476 seqs2[i] = (SequenceI) invertGroup.elementAt(i);
1478 SlideSequencesCommand ssc;
1480 ssc = new SlideSequencesCommand("Slide Sequences", seqs2, seqs1,
1481 size, viewport.getGapCharacter());
1483 ssc = new SlideSequencesCommand("Slide Sequences", seqs1, seqs2,
1484 size, viewport.getGapCharacter());
1486 int groupAdjustment = 0;
1487 if (ssc.getGapsInsertedBegin() && right)
1489 if (viewport.cursorMode)
1490 alignPanel.seqPanel.moveCursor(size, 0);
1492 groupAdjustment = size;
1494 else if (!ssc.getGapsInsertedBegin() && !right)
1496 if (viewport.cursorMode)
1497 alignPanel.seqPanel.moveCursor(-size, 0);
1499 groupAdjustment = -size;
1502 if (groupAdjustment != 0)
1504 viewport.getSelectionGroup().setStartRes(
1505 viewport.getSelectionGroup().getStartRes() + groupAdjustment);
1506 viewport.getSelectionGroup().setEndRes(
1507 viewport.getSelectionGroup().getEndRes() + groupAdjustment);
1510 boolean appendHistoryItem = false;
1511 if (viewport.historyList != null && viewport.historyList.size() > 0
1512 && viewport.historyList.peek() instanceof SlideSequencesCommand)
1514 appendHistoryItem = ssc
1515 .appendSlideCommand((SlideSequencesCommand) viewport.historyList
1519 if (!appendHistoryItem)
1520 addHistoryItem(ssc);
1531 protected void copy_actionPerformed(ActionEvent e)
1534 if (viewport.getSelectionGroup() == null)
1538 // TODO: preserve the ordering of displayed alignment annotation in any
1539 // internal paste (particularly sequence associated annotation)
1540 SequenceI[] seqs = viewport.getSelectionAsNewSequence();
1541 String[] omitHidden = null;
1543 if (viewport.hasHiddenColumns)
1545 omitHidden = viewport.getViewAsString(true);
1548 String output = new FormatAdapter().formatSequences("Fasta", seqs,
1551 StringSelection ss = new StringSelection(output);
1555 jalview.gui.Desktop.internalCopy = true;
1556 // Its really worth setting the clipboard contents
1557 // to empty before setting the large StringSelection!!
1558 Toolkit.getDefaultToolkit().getSystemClipboard().setContents(
1559 new StringSelection(""), null);
1561 Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss,
1563 } catch (OutOfMemoryError er)
1565 new OOMWarning("copying region", er);
1569 Vector hiddenColumns = null;
1570 if (viewport.hasHiddenColumns)
1572 hiddenColumns = new Vector();
1573 int hiddenOffset = viewport.getSelectionGroup().getStartRes();
1574 for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns()
1577 int[] region = (int[]) viewport.getColumnSelection()
1578 .getHiddenColumns().elementAt(i);
1580 hiddenColumns.addElement(new int[]
1581 { region[0] - hiddenOffset, region[1] - hiddenOffset });
1585 Desktop.jalviewClipboard = new Object[]
1586 { seqs, viewport.alignment.getDataset(), hiddenColumns };
1587 statusBar.setText("Copied " + seqs.length + " sequences to clipboard.");
1596 protected void pasteNew_actionPerformed(ActionEvent e)
1607 protected void pasteThis_actionPerformed(ActionEvent e)
1613 * Paste contents of Jalview clipboard
1615 * @param newAlignment
1616 * true to paste to a new alignment, otherwise add to this.
1618 void paste(boolean newAlignment)
1620 boolean externalPaste = true;
1623 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
1624 Transferable contents = c.getContents(this);
1626 if (contents == null)
1634 str = (String) contents.getTransferData(DataFlavor.stringFlavor);
1635 if (str.length() < 1)
1640 format = new IdentifyFile().Identify(str, "Paste");
1642 } catch (OutOfMemoryError er)
1644 new OOMWarning("Out of memory pasting sequences!!", er);
1648 SequenceI[] sequences;
1649 boolean annotationAdded = false;
1650 AlignmentI alignment = null;
1652 if (Desktop.jalviewClipboard != null)
1654 // The clipboard was filled from within Jalview, we must use the
1656 // And dataset from the copied alignment
1657 SequenceI[] newseq = (SequenceI[]) Desktop.jalviewClipboard[0];
1658 // be doubly sure that we create *new* sequence objects.
1659 sequences = new SequenceI[newseq.length];
1660 for (int i = 0; i < newseq.length; i++)
1662 sequences[i] = new Sequence(newseq[i]);
1664 alignment = new Alignment(sequences);
1665 externalPaste = false;
1669 // parse the clipboard as an alignment.
1670 alignment = new FormatAdapter().readFile(str, "Paste", format);
1671 sequences = alignment.getSequencesArray();
1679 if (Desktop.jalviewClipboard != null)
1681 // dataset is inherited
1682 alignment.setDataset((Alignment) Desktop.jalviewClipboard[1]);
1686 // new dataset is constructed
1687 alignment.setDataset(null);
1689 alwidth = alignment.getWidth() + 1;
1693 AlignmentI pastedal = alignment; // preserve pasted alignment object
1694 // Add pasted sequences and dataset into existing alignment.
1695 alignment = viewport.getAlignment();
1696 alwidth = alignment.getWidth() + 1;
1697 // decide if we need to import sequences from an existing dataset
1698 boolean importDs = Desktop.jalviewClipboard != null
1699 && Desktop.jalviewClipboard[1] != alignment.getDataset();
1700 // importDs==true instructs us to copy over new dataset sequences from
1701 // an existing alignment
1702 Vector newDs = (importDs) ? new Vector() : null; // used to create
1703 // minimum dataset set
1705 for (int i = 0; i < sequences.length; i++)
1709 newDs.addElement(null);
1711 SequenceI ds = sequences[i].getDatasetSequence(); // null for a simple
1713 if (importDs && ds != null)
1715 if (!newDs.contains(ds))
1717 newDs.setElementAt(ds, i);
1718 ds = new Sequence(ds);
1719 // update with new dataset sequence
1720 sequences[i].setDatasetSequence(ds);
1724 ds = sequences[newDs.indexOf(ds)].getDatasetSequence();
1729 // copy and derive new dataset sequence
1730 sequences[i] = sequences[i].deriveSequence();
1731 alignment.getDataset().addSequence(
1732 sequences[i].getDatasetSequence());
1733 // TODO: avoid creation of duplicate dataset sequences with a
1734 // 'contains' method using SequenceI.equals()/SequenceI.contains()
1736 alignment.addSequence(sequences[i]); // merges dataset
1740 newDs.clear(); // tidy up
1742 if (pastedal.getAlignmentAnnotation() != null)
1744 // Add any annotation attached to alignment.
1745 AlignmentAnnotation[] alann = pastedal.getAlignmentAnnotation();
1746 for (int i = 0; i < alann.length; i++)
1748 annotationAdded = true;
1749 if (alann[i].sequenceRef == null && !alann[i].autoCalculated)
1751 AlignmentAnnotation newann = new AlignmentAnnotation(alann[i]);
1752 newann.padAnnotation(alwidth);
1753 alignment.addAnnotation(newann);
1763 addHistoryItem(new EditCommand("Add sequences", EditCommand.PASTE,
1764 sequences, 0, alignment.getWidth(), alignment));
1766 // Add any annotations attached to sequences
1767 for (int i = 0; i < sequences.length; i++)
1769 if (sequences[i].getAnnotation() != null)
1771 for (int a = 0; a < sequences[i].getAnnotation().length; a++)
1773 annotationAdded = true;
1774 sequences[i].getAnnotation()[a].adjustForAlignment();
1775 sequences[i].getAnnotation()[a].padAnnotation(alwidth);
1776 alignment.addAnnotation(sequences[i].getAnnotation()[a]); // annotation
1781 .setAnnotationIndex(sequences[i].getAnnotation()[a], a);
1788 // propagate alignment changed.
1789 viewport.setEndSeq(alignment.getHeight());
1790 if (annotationAdded)
1792 // Duplicate sequence annotation in all views.
1793 AlignmentI[] alview = this.getViewAlignments();
1794 for (int i = 0; i < sequences.length; i++)
1796 AlignmentAnnotation sann[] = sequences[i].getAnnotation();
1799 for (int avnum = 0; avnum < alview.length; avnum++)
1801 if (alview[avnum] != alignment)
1803 // duplicate in a view other than the one with input focus
1804 int avwidth = alview[avnum].getWidth() + 1;
1805 // this relies on sann being preserved after we
1806 // modify the sequence's annotation array for each duplication
1807 for (int a = 0; a < sann.length; a++)
1809 AlignmentAnnotation newann = new AlignmentAnnotation(
1811 sequences[i].addAlignmentAnnotation(newann);
1812 newann.padAnnotation(avwidth);
1813 alview[avnum].addAnnotation(newann); // annotation was
1814 // duplicated earlier
1815 alview[avnum].setAnnotationIndex(newann, a);
1820 buildSortByAnnotationScoresMenu();
1822 viewport.firePropertyChange("alignment", null, alignment
1828 AlignFrame af = new AlignFrame(alignment, DEFAULT_WIDTH,
1830 String newtitle = new String("Copied sequences");
1832 if (Desktop.jalviewClipboard != null
1833 && Desktop.jalviewClipboard[2] != null)
1835 Vector hc = (Vector) Desktop.jalviewClipboard[2];
1836 for (int i = 0; i < hc.size(); i++)
1838 int[] region = (int[]) hc.elementAt(i);
1839 af.viewport.hideColumns(region[0], region[1]);
1843 // >>>This is a fix for the moment, until a better solution is
1845 af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer()
1847 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
1849 // TODO: maintain provenance of an alignment, rather than just make the
1850 // title a concatenation of operations.
1853 if (title.startsWith("Copied sequences"))
1859 newtitle = newtitle.concat("- from " + title);
1864 newtitle = new String("Pasted sequences");
1867 Desktop.addInternalFrame(af, newtitle, DEFAULT_WIDTH,
1872 } catch (Exception ex)
1874 ex.printStackTrace();
1875 System.out.println("Exception whilst pasting: " + ex);
1876 // could be anything being pasted in here
1887 protected void cut_actionPerformed(ActionEvent e)
1889 copy_actionPerformed(null);
1890 delete_actionPerformed(null);
1899 protected void delete_actionPerformed(ActionEvent evt)
1902 SequenceGroup sg = viewport.getSelectionGroup();
1908 Vector seqs = new Vector();
1910 for (int i = 0; i < sg.getSize(); i++)
1912 seq = sg.getSequenceAt(i);
1913 seqs.addElement(seq);
1916 // If the cut affects all sequences, remove highlighted columns
1917 if (sg.getSize() == viewport.alignment.getHeight())
1919 viewport.getColumnSelection().removeElements(sg.getStartRes(),
1920 sg.getEndRes() + 1);
1923 SequenceI[] cut = new SequenceI[seqs.size()];
1924 for (int i = 0; i < seqs.size(); i++)
1926 cut[i] = (SequenceI) seqs.elementAt(i);
1930 * //ADD HISTORY ITEM
1932 addHistoryItem(new EditCommand("Cut Sequences", EditCommand.CUT, cut,
1933 sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1,
1934 viewport.alignment));
1936 viewport.setSelectionGroup(null);
1937 viewport.sendSelection();
1938 viewport.alignment.deleteGroup(sg);
1940 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
1942 if (viewport.getAlignment().getHeight() < 1)
1946 this.setClosed(true);
1947 } catch (Exception ex)
1959 protected void deleteGroups_actionPerformed(ActionEvent e)
1961 viewport.alignment.deleteAllGroups();
1962 viewport.sequenceColours = null;
1963 viewport.setSelectionGroup(null);
1964 PaintRefresher.Refresh(this, viewport.getSequenceSetId());
1965 alignPanel.updateAnnotation();
1966 alignPanel.paintAlignment(true);
1975 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
1977 SequenceGroup sg = new SequenceGroup();
1979 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
1981 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
1984 sg.setEndRes(viewport.alignment.getWidth() - 1);
1985 viewport.setSelectionGroup(sg);
1986 viewport.sendSelection();
1987 alignPanel.paintAlignment(true);
1988 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1997 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
1999 if (viewport.cursorMode)
2001 alignPanel.seqPanel.keyboardNo1 = null;
2002 alignPanel.seqPanel.keyboardNo2 = null;
2004 viewport.setSelectionGroup(null);
2005 viewport.getColumnSelection().clear();
2006 viewport.setSelectionGroup(null);
2007 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
2008 alignPanel.idPanel.idCanvas.searchResults = null;
2009 alignPanel.paintAlignment(true);
2010 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
2019 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
2021 SequenceGroup sg = viewport.getSelectionGroup();
2025 selectAllSequenceMenuItem_actionPerformed(null);
2030 for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
2032 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
2035 alignPanel.paintAlignment(true);
2036 viewport.sendSelection();
2037 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
2040 public void invertColSel_actionPerformed(ActionEvent e)
2042 viewport.invertColumnSelection();
2043 alignPanel.paintAlignment(true);
2052 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
2054 trimAlignment(true);
2063 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
2065 trimAlignment(false);
2068 void trimAlignment(boolean trimLeft)
2070 ColumnSelection colSel = viewport.getColumnSelection();
2073 if (colSel.size() > 0)
2077 column = colSel.getMin();
2081 column = colSel.getMax();
2085 if (viewport.getSelectionGroup() != null)
2087 seqs = viewport.getSelectionGroup().getSequencesAsArray(
2088 viewport.hiddenRepSequences);
2092 seqs = viewport.alignment.getSequencesArray();
2095 TrimRegionCommand trimRegion;
2098 trimRegion = new TrimRegionCommand("Remove Left",
2099 TrimRegionCommand.TRIM_LEFT, seqs, column,
2100 viewport.alignment, viewport.colSel,
2101 viewport.selectionGroup);
2102 viewport.setStartRes(0);
2106 trimRegion = new TrimRegionCommand("Remove Right",
2107 TrimRegionCommand.TRIM_RIGHT, seqs, column,
2108 viewport.alignment, viewport.colSel,
2109 viewport.selectionGroup);
2112 statusBar.setText("Removed " + trimRegion.getSize() + " columns.");
2114 addHistoryItem(trimRegion);
2116 Vector groups = viewport.alignment.getGroups();
2118 for (int i = 0; i < groups.size(); i++)
2120 SequenceGroup sg = (SequenceGroup) groups.get(i);
2122 if ((trimLeft && !sg.adjustForRemoveLeft(column))
2123 || (!trimLeft && !sg.adjustForRemoveRight(column)))
2125 viewport.alignment.deleteGroup(sg);
2129 viewport.firePropertyChange("alignment", null, viewport
2130 .getAlignment().getSequences());
2140 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
2142 int start = 0, end = viewport.alignment.getWidth() - 1;
2145 if (viewport.getSelectionGroup() != null)
2147 seqs = viewport.getSelectionGroup().getSequencesAsArray(
2148 viewport.hiddenRepSequences);
2149 start = viewport.getSelectionGroup().getStartRes();
2150 end = viewport.getSelectionGroup().getEndRes();
2154 seqs = viewport.alignment.getSequencesArray();
2157 RemoveGapColCommand removeGapCols = new RemoveGapColCommand(
2158 "Remove Gapped Columns", seqs, start, end, viewport.alignment);
2160 addHistoryItem(removeGapCols);
2162 statusBar.setText("Removed " + removeGapCols.getSize()
2163 + " empty columns.");
2165 // This is to maintain viewport position on first residue
2166 // of first sequence
2167 SequenceI seq = viewport.alignment.getSequenceAt(0);
2168 int startRes = seq.findPosition(viewport.startRes);
2169 // ShiftList shifts;
2170 // viewport.getAlignment().removeGaps(shifts=new ShiftList());
2171 // edit.alColumnChanges=shifts.getInverse();
2172 // if (viewport.hasHiddenColumns)
2173 // viewport.getColumnSelection().compensateForEdits(shifts);
2174 viewport.setStartRes(seq.findIndex(startRes) - 1);
2175 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
2186 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
2188 int start = 0, end = viewport.alignment.getWidth() - 1;
2191 if (viewport.getSelectionGroup() != null)
2193 seqs = viewport.getSelectionGroup().getSequencesAsArray(
2194 viewport.hiddenRepSequences);
2195 start = viewport.getSelectionGroup().getStartRes();
2196 end = viewport.getSelectionGroup().getEndRes();
2200 seqs = viewport.alignment.getSequencesArray();
2203 // This is to maintain viewport position on first residue
2204 // of first sequence
2205 SequenceI seq = viewport.alignment.getSequenceAt(0);
2206 int startRes = seq.findPosition(viewport.startRes);
2208 addHistoryItem(new RemoveGapsCommand("Remove Gaps", seqs, start, end,
2209 viewport.alignment));
2211 viewport.setStartRes(seq.findIndex(startRes) - 1);
2213 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
2224 public void padGapsMenuitem_actionPerformed(ActionEvent e)
2226 viewport.padGaps = padGapsMenuitem.isSelected();
2227 viewport.firePropertyChange("alignment", null, viewport.getAlignment()
2233 // if (justifySeqs>0)
2235 // alignment.justify(justifySeqs!=RIGHT_JUSTIFY);
2247 public void findMenuItem_actionPerformed(ActionEvent e)
2252 public void newView_actionPerformed(ActionEvent e)
2254 AlignmentPanel newap = new Jalview2XML().copyAlignPanel(alignPanel,
2257 newap.av.gatherViewsHere = false;
2259 if (viewport.viewName == null)
2261 viewport.viewName = "Original";
2264 newap.av.historyList = viewport.historyList;
2265 newap.av.redoList = viewport.redoList;
2267 int index = Desktop.getViewCount(viewport.getSequenceSetId());
2268 String newViewName = "View " + index;
2270 Vector comps = (Vector) PaintRefresher.components.get(viewport
2271 .getSequenceSetId());
2272 Vector existingNames = new Vector();
2273 for (int i = 0; i < comps.size(); i++)
2275 if (comps.elementAt(i) instanceof AlignmentPanel)
2277 AlignmentPanel ap = (AlignmentPanel) comps.elementAt(i);
2278 if (!existingNames.contains(ap.av.viewName))
2280 existingNames.addElement(ap.av.viewName);
2285 while (existingNames.contains(newViewName))
2287 newViewName = "View " + (++index);
2290 newap.av.viewName = newViewName;
2292 addAlignmentPanel(newap, true);
2294 if (alignPanels.size() == 2)
2296 viewport.gatherViewsHere = true;
2298 tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1);
2301 public void expandViews_actionPerformed(ActionEvent e)
2303 Desktop.instance.explodeViews(this);
2306 public void gatherViews_actionPerformed(ActionEvent e)
2308 Desktop.instance.gatherViews(this);
2317 public void font_actionPerformed(ActionEvent e)
2319 new FontChooser(alignPanel);
2328 protected void seqLimit_actionPerformed(ActionEvent e)
2330 viewport.setShowJVSuffix(seqLimits.isSelected());
2332 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel
2333 .calculateIdWidth());
2334 alignPanel.paintAlignment(true);
2337 public void idRightAlign_actionPerformed(ActionEvent e)
2339 viewport.rightAlignIds = idRightAlign.isSelected();
2340 alignPanel.paintAlignment(true);
2343 public void centreColumnLabels_actionPerformed(ActionEvent e)
2345 viewport.centreColumnLabels = centreColumnLabelsMenuItem.getState();
2346 alignPanel.paintAlignment(true);
2352 * @see jalview.jbgui.GAlignFrame#followHighlight_actionPerformed()
2354 protected void followHighlight_actionPerformed()
2356 if (viewport.followHighlight = this.followHighlightMenuItem.getState())
2358 alignPanel.scrollToPosition(
2359 alignPanel.seqPanel.seqCanvas.searchResults, false);
2369 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
2371 viewport.setColourText(colourTextMenuItem.isSelected());
2372 alignPanel.paintAlignment(true);
2381 public void wrapMenuItem_actionPerformed(ActionEvent e)
2383 scaleAbove.setVisible(wrapMenuItem.isSelected());
2384 scaleLeft.setVisible(wrapMenuItem.isSelected());
2385 scaleRight.setVisible(wrapMenuItem.isSelected());
2386 viewport.setWrapAlignment(wrapMenuItem.isSelected());
2387 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
2390 public void showAllSeqs_actionPerformed(ActionEvent e)
2392 viewport.showAllHiddenSeqs();
2395 public void showAllColumns_actionPerformed(ActionEvent e)
2397 viewport.showAllHiddenColumns();
2401 public void hideSelSequences_actionPerformed(ActionEvent e)
2403 viewport.hideAllSelectedSeqs();
2404 alignPanel.paintAlignment(true);
2407 public void hideSelColumns_actionPerformed(ActionEvent e)
2409 viewport.hideSelectedColumns();
2410 alignPanel.paintAlignment(true);
2413 public void hiddenMarkers_actionPerformed(ActionEvent e)
2415 viewport.setShowHiddenMarkers(hiddenMarkers.isSelected());
2425 protected void scaleAbove_actionPerformed(ActionEvent e)
2427 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
2428 alignPanel.paintAlignment(true);
2437 protected void scaleLeft_actionPerformed(ActionEvent e)
2439 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
2440 alignPanel.paintAlignment(true);
2449 protected void scaleRight_actionPerformed(ActionEvent e)
2451 viewport.setScaleRightWrapped(scaleRight.isSelected());
2452 alignPanel.paintAlignment(true);
2461 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
2463 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
2464 alignPanel.paintAlignment(true);
2473 public void viewTextMenuItem_actionPerformed(ActionEvent e)
2475 viewport.setShowText(viewTextMenuItem.isSelected());
2476 alignPanel.paintAlignment(true);
2485 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
2487 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
2488 alignPanel.paintAlignment(true);
2491 public FeatureSettings featureSettings;
2493 public void featureSettings_actionPerformed(ActionEvent e)
2495 if (featureSettings != null)
2497 featureSettings.close();
2498 featureSettings = null;
2500 if (!showSeqFeatures.isSelected())
2502 // make sure features are actually displayed
2503 showSeqFeatures.setSelected(true);
2504 showSeqFeatures_actionPerformed(null);
2506 featureSettings = new FeatureSettings(this);
2510 * Set or clear 'Show Sequence Features'
2515 public void showSeqFeatures_actionPerformed(ActionEvent evt)
2517 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
2518 alignPanel.paintAlignment(true);
2519 if (alignPanel.getOverviewPanel() != null)
2521 alignPanel.getOverviewPanel().updateOverviewImage();
2526 * Set or clear 'Show Sequence Features'
2531 public void showSeqFeaturesHeight_actionPerformed(ActionEvent evt)
2533 viewport.setShowSequenceFeaturesHeight(showSeqFeaturesHeight
2535 if (viewport.getShowSequenceFeaturesHeight())
2537 // ensure we're actually displaying features
2538 viewport.setShowSequenceFeatures(true);
2539 showSeqFeatures.setSelected(true);
2541 alignPanel.paintAlignment(true);
2542 if (alignPanel.getOverviewPanel() != null)
2544 alignPanel.getOverviewPanel().updateOverviewImage();
2554 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
2556 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
2557 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
2560 public void alignmentProperties()
2562 JEditorPane editPane = new JEditorPane("text/html", "");
2563 editPane.setEditable(false);
2564 StringBuffer contents = new StringBuffer("<html>");
2567 int min = Integer.MAX_VALUE, max = 0;
2568 for (int i = 0; i < viewport.alignment.getHeight(); i++)
2570 int size = viewport.alignment.getSequenceAt(i).getEnd()
2571 - viewport.alignment.getSequenceAt(i).getStart();
2578 avg = avg / (float) viewport.alignment.getHeight();
2580 contents.append("<br>Sequences: " + viewport.alignment.getHeight());
2581 contents.append("<br>Minimum Sequence Length: " + min);
2582 contents.append("<br>Maximum Sequence Length: " + max);
2583 contents.append("<br>Average Length: " + (int) avg);
2585 if (((Alignment) viewport.alignment).getProperties() != null)
2587 Hashtable props = ((Alignment) viewport.alignment).getProperties();
2588 Enumeration en = props.keys();
2589 contents.append("<br><br><table border=\"1\">");
2590 while (en.hasMoreElements())
2592 String key = en.nextElement().toString();
2593 StringBuffer val = new StringBuffer();
2594 String vals = props.get(key).toString();
2598 npos = vals.indexOf("\n", pos);
2601 val.append(vals.substring(pos));
2605 val.append(vals.substring(pos, npos));
2609 } while (npos != -1);
2611 .append("<tr><td>" + key + "</td><td>" + val + "</td></tr>");
2613 contents.append("</table>");
2615 editPane.setText(contents.toString() + "</html>");
2616 JInternalFrame frame = new JInternalFrame();
2617 frame.getContentPane().add(new JScrollPane(editPane));
2619 Desktop.instance.addInternalFrame(frame, "Alignment Properties: "
2620 + getTitle(), 500, 400);
2629 public void overviewMenuItem_actionPerformed(ActionEvent e)
2631 if (alignPanel.overviewPanel != null)
2636 JInternalFrame frame = new JInternalFrame();
2637 OverviewPanel overview = new OverviewPanel(alignPanel);
2638 frame.setContentPane(overview);
2639 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(), frame
2640 .getWidth(), frame.getHeight());
2642 frame.setLayer(JLayeredPane.PALETTE_LAYER);
2644 .addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
2646 public void internalFrameClosed(
2647 javax.swing.event.InternalFrameEvent evt)
2649 alignPanel.setOverviewPanel(null);
2653 alignPanel.setOverviewPanel(overview);
2656 public void textColour_actionPerformed(ActionEvent e)
2658 new TextColourChooser().chooseColour(alignPanel, null);
2667 protected void noColourmenuItem_actionPerformed(ActionEvent e)
2678 public void clustalColour_actionPerformed(ActionEvent e)
2680 changeColour(new ClustalxColourScheme(
2681 viewport.alignment.getSequences(), viewport.alignment
2691 public void zappoColour_actionPerformed(ActionEvent e)
2693 changeColour(new ZappoColourScheme());
2702 public void taylorColour_actionPerformed(ActionEvent e)
2704 changeColour(new TaylorColourScheme());
2713 public void hydrophobicityColour_actionPerformed(ActionEvent e)
2715 changeColour(new HydrophobicColourScheme());
2724 public void helixColour_actionPerformed(ActionEvent e)
2726 changeColour(new HelixColourScheme());
2735 public void strandColour_actionPerformed(ActionEvent e)
2737 changeColour(new StrandColourScheme());
2746 public void turnColour_actionPerformed(ActionEvent e)
2748 changeColour(new TurnColourScheme());
2757 public void buriedColour_actionPerformed(ActionEvent e)
2759 changeColour(new BuriedColourScheme());
2768 public void nucleotideColour_actionPerformed(ActionEvent e)
2770 changeColour(new NucleotideColourScheme());
2773 public void annotationColour_actionPerformed(ActionEvent e)
2775 new AnnotationColourChooser(viewport, alignPanel);
2784 protected void applyToAllGroups_actionPerformed(ActionEvent e)
2786 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
2795 public void changeColour(ColourSchemeI cs)
2801 if (viewport.getAbovePIDThreshold())
2803 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
2806 cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
2808 viewport.setGlobalColourScheme(cs);
2812 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2815 if (viewport.getConservationSelected())
2818 Alignment al = (Alignment) viewport.alignment;
2819 Conservation c = new Conservation("All",
2820 ResidueProperties.propHash, 3, al.getSequences(), 0, al
2824 c.verdict(false, viewport.ConsPercGaps);
2826 cs.setConservation(c);
2828 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel,
2833 cs.setConservation(null);
2836 cs.setConsensus(viewport.hconsensus);
2839 viewport.setGlobalColourScheme(cs);
2841 if (viewport.getColourAppliesToAllGroups())
2843 Vector groups = viewport.alignment.getGroups();
2845 for (int i = 0; i < groups.size(); i++)
2847 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
2855 if (cs instanceof ClustalxColourScheme)
2857 sg.cs = new ClustalxColourScheme(sg
2858 .getSequences(viewport.hiddenRepSequences), sg.getWidth());
2860 else if (cs instanceof UserColourScheme)
2862 sg.cs = new UserColourScheme(((UserColourScheme) cs).getColours());
2868 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
2869 } catch (Exception ex)
2874 if (viewport.getAbovePIDThreshold()
2875 || cs instanceof PIDColourScheme
2876 || cs instanceof Blosum62ColourScheme)
2878 sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
2880 sg.cs.setConsensus(AAFrequency.calculate(sg
2881 .getSequences(viewport.hiddenRepSequences), sg
2882 .getStartRes(), sg.getEndRes() + 1));
2886 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2889 if (viewport.getConservationSelected())
2891 Conservation c = new Conservation("Group",
2892 ResidueProperties.propHash, 3, sg
2893 .getSequences(viewport.hiddenRepSequences), sg
2894 .getStartRes(), sg.getEndRes() + 1);
2896 c.verdict(false, viewport.ConsPercGaps);
2897 sg.cs.setConservation(c);
2901 sg.cs.setConservation(null);
2906 if (alignPanel.getOverviewPanel() != null)
2908 alignPanel.getOverviewPanel().updateOverviewImage();
2911 alignPanel.paintAlignment(true);
2920 protected void modifyPID_actionPerformed(ActionEvent e)
2922 if (viewport.getAbovePIDThreshold()
2923 && viewport.globalColourScheme != null)
2925 SliderPanel.setPIDSliderSource(alignPanel, viewport
2926 .getGlobalColourScheme(), "Background");
2927 SliderPanel.showPIDSlider();
2937 protected void modifyConservation_actionPerformed(ActionEvent e)
2939 if (viewport.getConservationSelected()
2940 && viewport.globalColourScheme != null)
2942 SliderPanel.setConservationSlider(alignPanel,
2943 viewport.globalColourScheme, "Background");
2944 SliderPanel.showConservationSlider();
2954 protected void conservationMenuItem_actionPerformed(ActionEvent e)
2956 viewport.setConservationSelected(conservationMenuItem.isSelected());
2958 viewport.setAbovePIDThreshold(false);
2959 abovePIDThreshold.setSelected(false);
2961 changeColour(viewport.getGlobalColourScheme());
2963 modifyConservation_actionPerformed(null);
2972 public void abovePIDThreshold_actionPerformed(ActionEvent e)
2974 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
2976 conservationMenuItem.setSelected(false);
2977 viewport.setConservationSelected(false);
2979 changeColour(viewport.getGlobalColourScheme());
2981 modifyPID_actionPerformed(null);
2990 public void userDefinedColour_actionPerformed(ActionEvent e)
2992 if (e.getActionCommand().equals("User Defined..."))
2994 new UserDefinedColours(alignPanel, null);
2998 UserColourScheme udc = (UserColourScheme) UserDefinedColours
2999 .getUserColourSchemes().get(e.getActionCommand());
3005 public void updateUserColourMenu()
3008 Component[] menuItems = colourMenu.getMenuComponents();
3009 int i, iSize = menuItems.length;
3010 for (i = 0; i < iSize; i++)
3012 if (menuItems[i].getName() != null
3013 && menuItems[i].getName().equals("USER_DEFINED"))
3015 colourMenu.remove(menuItems[i]);
3019 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
3021 java.util.Enumeration userColours = jalview.gui.UserDefinedColours
3022 .getUserColourSchemes().keys();
3024 while (userColours.hasMoreElements())
3026 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(
3027 userColours.nextElement().toString());
3028 radioItem.setName("USER_DEFINED");
3029 radioItem.addMouseListener(new MouseAdapter()
3031 public void mousePressed(MouseEvent evt)
3033 if (evt.isControlDown()
3034 || SwingUtilities.isRightMouseButton(evt))
3037 .removeActionListener(radioItem.getActionListeners()[0]);
3039 int option = JOptionPane.showInternalConfirmDialog(
3040 jalview.gui.Desktop.desktop,
3041 "Remove from default list?",
3042 "Remove user defined colour",
3043 JOptionPane.YES_NO_OPTION);
3044 if (option == JOptionPane.YES_OPTION)
3046 jalview.gui.UserDefinedColours
3047 .removeColourFromDefaults(radioItem.getText());
3048 colourMenu.remove(radioItem);
3052 radioItem.addActionListener(new ActionListener()
3054 public void actionPerformed(ActionEvent evt)
3056 userDefinedColour_actionPerformed(evt);
3063 radioItem.addActionListener(new ActionListener()
3065 public void actionPerformed(ActionEvent evt)
3067 userDefinedColour_actionPerformed(evt);
3071 colourMenu.insert(radioItem, 15);
3072 colours.add(radioItem);
3083 public void PIDColour_actionPerformed(ActionEvent e)
3085 changeColour(new PIDColourScheme());
3094 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
3096 changeColour(new Blosum62ColourScheme());
3105 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
3107 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3108 AlignmentSorter.sortByPID(viewport.getAlignment(), viewport
3109 .getAlignment().getSequenceAt(0), null);
3110 addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder,
3111 viewport.alignment));
3112 alignPanel.paintAlignment(true);
3121 public void sortIDMenuItem_actionPerformed(ActionEvent e)
3123 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3124 AlignmentSorter.sortByID(viewport.getAlignment());
3125 addHistoryItem(new OrderCommand("ID Sort", oldOrder, viewport.alignment));
3126 alignPanel.paintAlignment(true);
3135 public void sortLengthMenuItem_actionPerformed(ActionEvent e)
3137 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3138 AlignmentSorter.sortByLength(viewport.getAlignment());
3139 addHistoryItem(new OrderCommand("Length Sort", oldOrder,
3140 viewport.alignment));
3141 alignPanel.paintAlignment(true);
3150 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
3152 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3153 AlignmentSorter.sortByGroup(viewport.getAlignment());
3154 addHistoryItem(new OrderCommand("Group Sort", oldOrder,
3155 viewport.alignment));
3157 alignPanel.paintAlignment(true);
3166 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
3168 new RedundancyPanel(alignPanel, this);
3177 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
3179 if ((viewport.getSelectionGroup() == null)
3180 || (viewport.getSelectionGroup().getSize() < 2))
3182 JOptionPane.showInternalMessageDialog(this,
3183 "You must select at least 2 sequences.", "Invalid Selection",
3184 JOptionPane.WARNING_MESSAGE);
3188 JInternalFrame frame = new JInternalFrame();
3189 frame.setContentPane(new PairwiseAlignPanel(viewport));
3190 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
3200 public void PCAMenuItem_actionPerformed(ActionEvent e)
3202 if (((viewport.getSelectionGroup() != null)
3203 && (viewport.getSelectionGroup().getSize() < 4) && (viewport
3204 .getSelectionGroup().getSize() > 0))
3205 || (viewport.getAlignment().getHeight() < 4))
3207 JOptionPane.showInternalMessageDialog(this,
3208 "Principal component analysis must take\n"
3209 + "at least 4 input sequences.",
3210 "Sequence selection insufficient",
3211 JOptionPane.WARNING_MESSAGE);
3216 new PCAPanel(alignPanel);
3219 public void autoCalculate_actionPerformed(ActionEvent e)
3221 viewport.autoCalculateConsensus = autoCalculate.isSelected();
3222 if (viewport.autoCalculateConsensus)
3224 viewport.firePropertyChange("alignment", null, viewport
3225 .getAlignment().getSequences());
3235 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
3237 NewTreePanel("AV", "PID", "Average distance tree using PID");
3246 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
3248 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
3257 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
3259 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
3268 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
3270 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
3283 void NewTreePanel(String type, String pwType, String title)
3287 if (viewport.getSelectionGroup() != null)
3289 if (viewport.getSelectionGroup().getSize() < 3)
3294 "You need to have more than two sequences selected to build a tree!",
3295 "Not enough sequences", JOptionPane.WARNING_MESSAGE);
3300 SequenceGroup sg = viewport.getSelectionGroup();
3302 /* Decide if the selection is a column region */
3303 while (s < sg.getSize())
3305 if (((SequenceI) sg.getSequences(null).elementAt(s++)).getLength() < sg
3311 "The selected region to create a tree may\nonly contain residues or gaps.\n"
3312 + "Try using the Pad function in the edit menu,\n"
3313 + "or one of the multiple sequence alignment web services.",
3314 "Sequences in selection are not aligned",
3315 JOptionPane.WARNING_MESSAGE);
3321 title = title + " on region";
3322 tp = new TreePanel(alignPanel, type, pwType);
3326 // are the sequences aligned?
3327 if (!viewport.alignment.isAligned())
3332 "The sequences must be aligned before creating a tree.\n"
3333 + "Try using the Pad function in the edit menu,\n"
3334 + "or one of the multiple sequence alignment web services.",
3335 "Sequences not aligned",
3336 JOptionPane.WARNING_MESSAGE);
3341 if (viewport.alignment.getHeight() < 2)
3346 tp = new TreePanel(alignPanel, type, pwType);
3351 if (viewport.viewName != null)
3353 title += viewport.viewName + " of ";
3356 title += this.title;
3358 Desktop.addInternalFrame(tp, title, 600, 500);
3369 public void addSortByOrderMenuItem(String title,
3370 final AlignmentOrder order)
3372 final JMenuItem item = new JMenuItem("by " + title);
3374 item.addActionListener(new java.awt.event.ActionListener()
3376 public void actionPerformed(ActionEvent e)
3378 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3380 // TODO: JBPNote - have to map order entries to curent SequenceI
3382 AlignmentSorter.sortBy(viewport.getAlignment(), order);
3384 addHistoryItem(new OrderCommand(order.getName(), oldOrder,
3385 viewport.alignment));
3387 alignPanel.paintAlignment(true);
3393 * Add a new sort by annotation score menu item
3396 * the menu to add the option to
3398 * the label used to retrieve scores for each sequence on the
3401 public void addSortByAnnotScoreMenuItem(JMenu sort,
3402 final String scoreLabel)
3404 final JMenuItem item = new JMenuItem(scoreLabel);
3406 item.addActionListener(new java.awt.event.ActionListener()
3408 public void actionPerformed(ActionEvent e)
3410 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3411 AlignmentSorter.sortByAnnotationScore(scoreLabel, viewport
3412 .getAlignment());// ,viewport.getSelectionGroup());
3413 addHistoryItem(new OrderCommand("Sort by " + scoreLabel, oldOrder,
3414 viewport.alignment));
3415 alignPanel.paintAlignment(true);
3421 * last hash for alignment's annotation array - used to minimise cost of
3424 protected int _annotationScoreVectorHash;
3427 * search the alignment and rebuild the sort by annotation score submenu the
3428 * last alignment annotation vector hash is stored to minimize cost of
3429 * rebuilding in subsequence calls.
3432 public void buildSortByAnnotationScoresMenu()
3434 if (viewport.alignment.getAlignmentAnnotation() == null)
3439 if (viewport.alignment.getAlignmentAnnotation().hashCode() != _annotationScoreVectorHash)
3441 sortByAnnotScore.removeAll();
3442 // almost certainly a quicker way to do this - but we keep it simple
3443 Hashtable scoreSorts = new Hashtable();
3444 AlignmentAnnotation aann[];
3445 Enumeration sq = viewport.alignment.getSequences().elements();
3446 while (sq.hasMoreElements())
3448 aann = ((SequenceI) sq.nextElement()).getAnnotation();
3449 for (int i = 0; aann != null && i < aann.length; i++)
3451 if (aann[i].hasScore() && aann[i].sequenceRef != null)
3453 scoreSorts.put(aann[i].label, aann[i].label);
3457 Enumeration labels = scoreSorts.keys();
3458 while (labels.hasMoreElements())
3460 addSortByAnnotScoreMenuItem(sortByAnnotScore, (String) labels
3463 sortByAnnotScore.setVisible(scoreSorts.size() > 0);
3466 _annotationScoreVectorHash = viewport.alignment
3467 .getAlignmentAnnotation().hashCode();
3472 * Maintain the Order by->Displayed Tree menu. Creates a new menu item for a
3473 * TreePanel with an appropriate <code>jalview.analysis.AlignmentSorter</code>
3474 * call. Listeners are added to remove the menu item when the treePanel is
3475 * closed, and adjust the tree leaf to sequence mapping when the alignment is
3479 * Displayed tree window.
3481 * SortBy menu item title.
3483 public void buildTreeMenu()
3485 sortByTreeMenu.removeAll();
3487 Vector comps = (Vector) PaintRefresher.components.get(viewport
3488 .getSequenceSetId());
3489 Vector treePanels = new Vector();
3490 int i, iSize = comps.size();
3491 for (i = 0; i < iSize; i++)
3493 if (comps.elementAt(i) instanceof TreePanel)
3495 treePanels.add(comps.elementAt(i));
3499 iSize = treePanels.size();
3503 sortByTreeMenu.setVisible(false);
3507 sortByTreeMenu.setVisible(true);
3509 for (i = 0; i < treePanels.size(); i++)
3511 TreePanel tp = (TreePanel) treePanels.elementAt(i);
3512 final JMenuItem item = new JMenuItem(tp.getTitle());
3513 final NJTree tree = ((TreePanel) treePanels.elementAt(i)).getTree();
3514 item.addActionListener(new java.awt.event.ActionListener()
3516 public void actionPerformed(ActionEvent e)
3518 SequenceI[] oldOrder = viewport.getAlignment()
3519 .getSequencesArray();
3520 AlignmentSorter.sortByTree(viewport.getAlignment(), tree);
3522 addHistoryItem(new OrderCommand("Tree Sort", oldOrder,
3523 viewport.alignment));
3525 alignPanel.paintAlignment(true);
3529 sortByTreeMenu.add(item);
3534 * Work out whether the whole set of sequences or just the selected set will
3535 * be submitted for multiple alignment.
3538 public jalview.datamodel.AlignmentView gatherSequencesForAlignment()
3540 // Now, check we have enough sequences
3541 AlignmentView msa = null;
3543 if ((viewport.getSelectionGroup() != null)
3544 && (viewport.getSelectionGroup().getSize() > 1))
3546 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to
3547 // some common interface!
3549 * SequenceGroup seqs = viewport.getSelectionGroup(); int sz; msa = new
3550 * SequenceI[sz = seqs.getSize(false)];
3552 * for (int i = 0; i < sz; i++) { msa[i] = (SequenceI)
3553 * seqs.getSequenceAt(i); }
3555 msa = viewport.getAlignmentView(true);
3560 * Vector seqs = viewport.getAlignment().getSequences();
3562 * if (seqs.size() > 1) { msa = new SequenceI[seqs.size()];
3564 * for (int i = 0; i < seqs.size(); i++) { msa[i] = (SequenceI)
3565 * seqs.elementAt(i); } }
3567 msa = viewport.getAlignmentView(false);
3573 * Decides what is submitted to a secondary structure prediction service: the
3574 * first sequence in the alignment, or in the current selection, or, if the
3575 * alignment is 'aligned' (ie padded with gaps), then the currently selected
3576 * region or the whole alignment. (where the first sequence in the set is the
3577 * one that the prediction will be for).
3579 public AlignmentView gatherSeqOrMsaForSecStrPrediction()
3581 AlignmentView seqs = null;
3583 if ((viewport.getSelectionGroup() != null)
3584 && (viewport.getSelectionGroup().getSize() > 0))
3586 seqs = viewport.getAlignmentView(true);
3590 seqs = viewport.getAlignmentView(false);
3592 // limit sequences - JBPNote in future - could spawn multiple prediction
3594 // TODO: viewport.alignment.isAligned is a global state - the local
3595 // selection may well be aligned - we preserve 2.0.8 behaviour for moment.
3596 if (!viewport.alignment.isAligned())
3598 seqs.setSequences(new SeqCigar[]
3599 { seqs.getSequences()[0] });
3600 // TODO: if seqs.getSequences().length>1 then should really have warned user!
3612 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
3614 // Pick the tree file
3615 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache
3616 .getProperty("LAST_DIRECTORY"));
3617 chooser.setFileView(new JalviewFileView());
3618 chooser.setDialogTitle("Select a newick-like tree file");
3619 chooser.setToolTipText("Load a tree file");
3621 int value = chooser.showOpenDialog(null);
3623 if (value == JalviewFileChooser.APPROVE_OPTION)
3625 String choice = chooser.getSelectedFile().getPath();
3626 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
3627 jalview.io.NewickFile fin = null;
3630 fin = new jalview.io.NewickFile(choice, "File");
3631 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
3632 } catch (Exception ex)
3634 JOptionPane.showMessageDialog(Desktop.desktop, ex.getMessage(),
3635 "Problem reading tree file", JOptionPane.WARNING_MESSAGE);
3636 ex.printStackTrace();
3638 if (fin != null && fin.hasWarningMessage())
3640 JOptionPane.showMessageDialog(Desktop.desktop, fin
3641 .getWarningMessage(), "Possible problem with tree file",
3642 JOptionPane.WARNING_MESSAGE);
3647 public TreePanel ShowNewickTree(NewickFile nf, String title)
3649 return ShowNewickTree(nf, title, 600, 500, 4, 5);
3652 public TreePanel ShowNewickTree(NewickFile nf, String title,
3653 AlignmentView input)
3655 return ShowNewickTree(nf, title, input, 600, 500, 4, 5);
3658 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,
3659 int h, int x, int y)
3661 return ShowNewickTree(nf, title, null, w, h, x, y);
3665 * Add a treeviewer for the tree extracted from a newick file object to the
3666 * current alignment view
3673 * Associated alignment input data (or null)
3682 * @return TreePanel handle
3684 public TreePanel ShowNewickTree(NewickFile nf, String title,
3685 AlignmentView input, int w, int h, int x, int y)
3687 TreePanel tp = null;
3693 if (nf.getTree() != null)
3695 tp = new TreePanel(alignPanel, "FromFile", title, nf, input);
3701 tp.setLocation(x, y);
3704 Desktop.addInternalFrame(tp, title, w, h);
3706 } catch (Exception ex)
3708 ex.printStackTrace();
3715 * Generates menu items and listener event actions for web service clients
3718 public void BuildWebServiceMenu()
3720 // TODO: add support for context dependent disabling of services based on
3721 // alignment and current selection
3722 // TODO: add additional serviceHandle parameter to specify abstract handler
3723 // class independently of AbstractName
3724 // TODO: add in rediscovery GUI function to restart discoverer
3725 // TODO: group services by location as well as function and/or introduce
3726 // object broker mechanism.
3727 if ((Discoverer.services != null) && (Discoverer.services.size() > 0))
3729 // TODO: refactor to allow list of AbstractName/Handler bindings to be
3730 // stored or retrieved from elsewhere
3731 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
3732 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
3733 Vector seqsrch = (Vector) Discoverer.services.get("SeqSearch");
3734 // TODO: move GUI generation code onto service implementation - so a
3735 // client instance attaches itself to the GUI with method call like
3736 // jalview.ws.MsaWSClient.bind(servicehandle, Desktop.instance,
3738 Vector wsmenu = new Vector();
3739 final IProgressIndicator af = this;
3742 // Add any Multiple Sequence Alignment Services
3743 final JMenu msawsmenu = new JMenu("Alignment");
3744 for (int i = 0, j = msaws.size(); i < j; i++)
3746 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws
3748 jalview.ws.WSClient impl = jalview.ws.Discoverer
3749 .getServiceClient(sh);
3750 impl.attachWSMenuEntry(msawsmenu, this);
3753 wsmenu.add(msawsmenu);
3755 if (secstrpr != null)
3757 // Add any secondary structure prediction services
3758 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
3759 for (int i = 0, j = secstrpr.size(); i < j; i++)
3761 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) secstrpr
3763 jalview.ws.WSClient impl = jalview.ws.Discoverer
3764 .getServiceClient(sh);
3765 impl.attachWSMenuEntry(secstrmenu, this);
3767 wsmenu.add(secstrmenu);
3769 if (seqsrch != null)
3771 // Add any sequence search services
3772 final JMenu seqsrchmenu = new JMenu("Sequence Database Search");
3773 for (int i = 0, j = seqsrch.size(); i < j; i++)
3775 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) seqsrch
3777 jalview.ws.WSClient impl = jalview.ws.Discoverer
3778 .getServiceClient(sh);
3779 impl.attachWSMenuEntry(seqsrchmenu, this);
3781 wsmenu.add(seqsrchmenu);
3783 // finally, add the whole shebang onto the webservices menu
3784 resetWebServiceMenu();
3785 for (int i = 0, j = wsmenu.size(); i < j; i++)
3787 webService.add((JMenu) wsmenu.get(i));
3792 resetWebServiceMenu();
3793 this.webService.add(this.webServiceNoServices);
3798 * empty the web service menu and add any ad-hoc functions not dynamically
3802 private void resetWebServiceMenu()
3804 webService.removeAll();
3805 build_fetchdbmenu(webService);
3806 build_urlServiceMenu(webService);
3810 * construct any groupURL type service menu entries.
3813 private void build_urlServiceMenu(JMenu webService)
3815 jalview.ws.EnfinEnvision2OneWay.getInstance().attachWSMenuEntry(webService, this);
3819 * public void vamsasStore_actionPerformed(ActionEvent e) { JalviewFileChooser
3820 * chooser = new JalviewFileChooser(jalview.bin.Cache.
3821 * getProperty("LAST_DIRECTORY"));
3823 * chooser.setFileView(new JalviewFileView()); chooser.setDialogTitle("Export
3824 * to Vamsas file"); chooser.setToolTipText("Export");
3826 * int value = chooser.showSaveDialog(this);
3828 * if (value == JalviewFileChooser.APPROVE_OPTION) {
3829 * jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
3830 * //vs.store(chooser.getSelectedFile().getAbsolutePath() ); vs.storeJalview(
3831 * chooser.getSelectedFile().getAbsolutePath(), this); } }
3834 * prototype of an automatically enabled/disabled analysis function
3837 protected void setShowProductsEnabled()
3839 SequenceI[] selection = viewport.getSequenceSelection();
3840 if (canShowProducts(selection, viewport.getSelectionGroup() != null,
3841 viewport.getAlignment().getDataset()))
3843 showProducts.setEnabled(true);
3848 showProducts.setEnabled(false);
3853 * search selection for sequence xRef products and build the show products
3858 * @return true if showProducts menu should be enabled.
3860 public boolean canShowProducts(SequenceI[] selection,
3861 boolean isRegionSelection, Alignment dataset)
3863 boolean showp = false;
3866 showProducts.removeAll();
3867 final boolean dna = viewport.getAlignment().isNucleotide();
3868 final Alignment ds = dataset;
3869 String[] ptypes = (selection == null || selection.length == 0) ? null
3870 : CrossRef.findSequenceXrefTypes(dna, selection, dataset);
3872 // CrossRef.buildXProductsList(viewport.getAlignment().isNucleotide(),
3873 // selection, dataset, true);
3874 final SequenceI[] sel = selection;
3875 for (int t = 0; ptypes != null && t < ptypes.length; t++)
3878 final boolean isRegSel = isRegionSelection;
3879 final AlignFrame af = this;
3880 final String source = ptypes[t];
3881 JMenuItem xtype = new JMenuItem(ptypes[t]);
3882 xtype.addActionListener(new ActionListener()
3885 public void actionPerformed(ActionEvent e)
3887 // TODO: new thread for this call with vis-delay
3888 af.showProductsFor(af.viewport.getSequenceSelection(), ds,
3889 isRegSel, dna, source);
3893 showProducts.add(xtype);
3895 showProducts.setVisible(showp);
3896 showProducts.setEnabled(showp);
3897 } catch (Exception e)
3899 jalview.bin.Cache.log
3901 "canTranslate threw an exception - please report to help@jalview.org",
3908 protected void showProductsFor(SequenceI[] sel, Alignment ds,
3909 boolean isRegSel, boolean dna, String source)
3911 final boolean fisRegSel = isRegSel;
3912 final boolean fdna = dna;
3913 final String fsrc = source;
3914 final AlignFrame ths = this;
3915 final SequenceI[] fsel = sel;
3916 Runnable foo = new Runnable()
3921 final long sttime = System.currentTimeMillis();
3922 ths.setProgressBar("Searching for sequences from " + fsrc, sttime);
3925 Alignment ds = ths.getViewport().alignment.getDataset(); // update
3929 Alignment prods = CrossRef
3930 .findXrefSequences(fsel, fdna, fsrc, ds);
3933 SequenceI[] sprods = new SequenceI[prods.getHeight()];
3934 for (int s = 0; s < sprods.length; s++)
3936 sprods[s] = (prods.getSequenceAt(s)).deriveSequence();
3937 if (ds.getSequences() == null
3938 || !ds.getSequences().contains(
3939 sprods[s].getDatasetSequence()))
3940 ds.addSequence(sprods[s].getDatasetSequence());
3941 sprods[s].updatePDBIds();
3943 Alignment al = new Alignment(sprods);
3944 AlignedCodonFrame[] cf = prods.getCodonFrames();
3946 for (int s = 0; cf != null && s < cf.length; s++)
3948 al.addCodonFrame(cf[s]);
3951 AlignFrame naf = new AlignFrame(al, DEFAULT_WIDTH,
3953 String newtitle = "" + ((fdna) ? "Proteins " : "Nucleotides ")
3954 + " for " + ((fisRegSel) ? "selected region of " : "")
3956 Desktop.addInternalFrame(naf, newtitle, DEFAULT_WIDTH,
3961 System.err.println("No Sequences generated for xRef type "
3964 } catch (Exception e)
3966 jalview.bin.Cache.log.error(
3967 "Exception when finding crossreferences", e);
3968 } catch (OutOfMemoryError e)
3970 new OOMWarning("whilst fetching crossreferences", e);
3973 jalview.bin.Cache.log.error("Error when finding crossreferences",
3976 ths.setProgressBar("Finished searching for sequences from " + fsrc,
3981 Thread frunner = new Thread(foo);
3985 public boolean canShowTranslationProducts(SequenceI[] selection,
3986 AlignmentI alignment)
3991 return (jalview.analysis.Dna.canTranslate(selection, viewport
3992 .getViewAsVisibleContigs(true)));
3993 } catch (Exception e)
3995 jalview.bin.Cache.log
3997 "canTranslate threw an exception - please report to help@jalview.org",
4003 public void showProducts_actionPerformed(ActionEvent e)
4005 // /////////////////////////////
4006 // Collect Data to be translated/transferred
4008 SequenceI[] selection = viewport.getSequenceSelection();
4009 AlignmentI al = null;
4012 al = jalview.analysis.Dna.CdnaTranslate(selection, viewport
4013 .getViewAsVisibleContigs(true), viewport.getGapCharacter(),
4014 viewport.getAlignment().getDataset());
4015 } catch (Exception ex)
4018 jalview.bin.Cache.log.debug("Exception during translation.", ex);
4025 "Please select at least three bases in at least one sequence in order to perform a cDNA translation.",
4026 "Translation Failed", JOptionPane.WARNING_MESSAGE);
4030 AlignFrame af = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT);
4031 Desktop.addInternalFrame(af, "Translation of " + this.getTitle(),
4032 DEFAULT_WIDTH, DEFAULT_HEIGHT);
4036 public void showTranslation_actionPerformed(ActionEvent e)
4038 // /////////////////////////////
4039 // Collect Data to be translated/transferred
4041 SequenceI[] selection = viewport.getSequenceSelection();
4042 String[] seqstring = viewport.getViewAsString(true);
4043 AlignmentI al = null;
4046 al = jalview.analysis.Dna.CdnaTranslate(selection, seqstring,
4047 viewport.getViewAsVisibleContigs(true), viewport
4048 .getGapCharacter(), viewport.alignment
4049 .getAlignmentAnnotation(), viewport.alignment
4050 .getWidth(), viewport.getAlignment().getDataset());
4051 } catch (Exception ex)
4054 jalview.bin.Cache.log.debug("Exception during translation.", ex);
4061 "Please select at least three bases in at least one sequence in order to perform a cDNA translation.",
4062 "Translation Failed", JOptionPane.WARNING_MESSAGE);
4066 AlignFrame af = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT);
4067 Desktop.addInternalFrame(af, "Translation of " + this.getTitle(),
4068 DEFAULT_WIDTH, DEFAULT_HEIGHT);
4073 * Try to load a features file onto the alignment.
4076 * contents or path to retrieve file
4078 * access mode of file (see jalview.io.AlignFile)
4079 * @return true if features file was parsed corectly.
4081 public boolean parseFeaturesFile(String file, String type)
4083 boolean featuresFile = false;
4086 featuresFile = new FeaturesFile(file, type).parse(viewport.alignment
4087 .getDataset(), alignPanel.seqPanel.seqCanvas
4088 .getFeatureRenderer().featureColours, false);
4089 } catch (Exception ex)
4091 ex.printStackTrace();
4096 viewport.showSequenceFeatures = true;
4097 showSeqFeatures.setSelected(true);
4098 if (alignPanel.seqPanel.seqCanvas.fr != null)
4100 // update the min/max ranges where necessary
4101 alignPanel.seqPanel.seqCanvas.fr.findAllFeatures(true);
4103 alignPanel.paintAlignment(true);
4106 return featuresFile;
4109 public void dragEnter(DropTargetDragEvent evt)
4113 public void dragExit(DropTargetEvent evt)
4117 public void dragOver(DropTargetDragEvent evt)
4121 public void dropActionChanged(DropTargetDragEvent evt)
4125 public void drop(DropTargetDropEvent evt)
4127 Transferable t = evt.getTransferable();
4128 java.util.List files = null;
4132 DataFlavor uriListFlavor = new DataFlavor(
4133 "text/uri-list;class=java.lang.String");
4134 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
4136 // Works on Windows and MacOSX
4137 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
4138 files = (java.util.List) t
4139 .getTransferData(DataFlavor.javaFileListFlavor);
4141 else if (t.isDataFlavorSupported(uriListFlavor))
4143 // This is used by Unix drag system
4144 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
4145 String data = (String) t.getTransferData(uriListFlavor);
4146 files = new java.util.ArrayList(1);
4147 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
4148 data, "\r\n"); st.hasMoreTokens();)
4150 String s = st.nextToken();
4151 if (s.startsWith("#"))
4153 // the line is a comment (as per the RFC 2483)
4157 java.net.URI uri = new java.net.URI(s);
4158 // check to see if we can handle this kind of URI
4159 if (uri.getScheme().toLowerCase().startsWith("http"))
4161 files.add(uri.toString());
4165 // otherwise preserve old behaviour: catch all for file objects
4166 java.io.File file = new java.io.File(uri);
4167 files.add(file.toString());
4171 } catch (Exception e)
4173 e.printStackTrace();
4180 for (int i = 0; i < files.size(); i++)
4182 loadJalviewDataFile(files.get(i).toString());
4184 } catch (Exception ex)
4186 ex.printStackTrace();
4192 * Attempt to load a "dropped" file or URL string: First by testing whether
4193 * it's and Annotation file, then a JNet file, and finally a features file. If
4194 * all are false then the user may have dropped an alignment file onto this
4198 * either a filename or a URL string.
4200 public void loadJalviewDataFile(String file)
4204 String protocol = jalview.io.FormatAdapter.FILE;
4205 String f = file.toLowerCase();
4206 if (f.indexOf("http:") == 0 || f.indexOf("https:") == 0
4207 || f.indexOf("file:") == 0)
4209 protocol = jalview.io.FormatAdapter.URL;
4212 boolean isAnnotation = new AnnotationFile().readAnnotationFile(
4213 viewport.alignment, file, protocol);
4217 // try to see if its a JNet 'concise' style annotation file *before* we
4218 // try to parse it as a features file
4219 String format = new IdentifyFile().Identify(file, protocol);
4220 if (format.equalsIgnoreCase("JnetFile"))
4222 jalview.io.JPredFile predictions = new jalview.io.JPredFile(file,
4224 new JnetAnnotationMaker().add_annotation(predictions, viewport
4225 .getAlignment(), 0, false);
4226 isAnnotation = true;
4230 // try to parse it as a features file
4231 boolean isGroupsFile = parseFeaturesFile(file, protocol);
4232 // if it wasn't a features file then we just treat it as a general
4233 // alignment file to load into the current view.
4236 new FileLoader().LoadFile(viewport, file, protocol, format);
4240 alignPanel.paintAlignment(true);
4247 alignPanel.adjustAnnotationHeight();
4248 viewport.updateSequenceIdColours();
4249 buildSortByAnnotationScoresMenu();
4250 alignPanel.paintAlignment(true);
4252 } catch (Exception ex)
4254 ex.printStackTrace();
4258 public void tabSelectionChanged(int index)
4262 alignPanel = (AlignmentPanel) alignPanels.elementAt(index);
4263 viewport = alignPanel.av;
4264 setMenusFromViewport(viewport);
4268 public void tabbedPane_mousePressed(MouseEvent e)
4270 if (SwingUtilities.isRightMouseButton(e))
4272 String reply = JOptionPane.showInternalInputDialog(this,
4273 "Enter View Name", "Edit View Name",
4274 JOptionPane.QUESTION_MESSAGE);
4278 viewport.viewName = reply;
4279 tabbedPane.setTitleAt(tabbedPane.getSelectedIndex(), reply);
4284 public AlignViewport getCurrentView()
4290 * Open the dialog for regex description parsing.
4292 protected void extractScores_actionPerformed(ActionEvent e)
4294 ParseProperties pp = new jalview.analysis.ParseProperties(
4295 viewport.alignment);
4296 // TODO: verify regex and introduce GUI dialog for version 2.5
4297 // if (pp.getScoresFromDescription("col", "score column ",
4298 // "\\W*([-+]?\\d*\\.?\\d*e?-?\\d*)\\W+([-+]?\\d*\\.?\\d*e?-?\\d*)",
4300 if (pp.getScoresFromDescription("description column",
4301 "score in description column ", "\\W*([-+eE0-9.]+)", true) > 0)
4303 buildSortByAnnotationScoresMenu();
4311 * jalview.jbgui.GAlignFrame#showDbRefs_actionPerformed(java.awt.event.ActionEvent
4314 protected void showDbRefs_actionPerformed(ActionEvent e)
4316 viewport.setShowDbRefs(showDbRefsMenuitem.isSelected());
4322 * @seejalview.jbgui.GAlignFrame#showNpFeats_actionPerformed(java.awt.event.
4325 protected void showNpFeats_actionPerformed(ActionEvent e)
4327 viewport.setShowNpFeats(showNpFeatsMenuitem.isSelected());
4331 * find the viewport amongst the tabs in this alignment frame and close that
4336 public boolean closeView(AlignViewport av)
4340 this.closeMenuItem_actionPerformed(false);
4343 Component[] comp = tabbedPane.getComponents();
4344 for (int i = 0; comp != null && i < comp.length; i++)
4346 if (comp[i] instanceof AlignmentPanel)
4348 if (((AlignmentPanel) comp[i]).av == av)
4351 closeView((AlignmentPanel) comp[i]);
4359 protected void build_fetchdbmenu(JMenu webService)
4361 // Temporary hack - DBRef Fetcher always top level ws entry.
4362 // TODO We probably want to store a sequence database checklist in
4363 // preferences and have checkboxes.. rather than individual sources selected
4365 JMenu rfetch = new JMenu("Fetch DB References");
4367 .setToolTipText("Retrieve and parse sequence database records for the alignment or the currently selected sequences");
4368 webService.add(rfetch);
4370 JMenuItem fetchr = new JMenuItem("Standard Databases");
4372 .setToolTipText("Fetch from EMBL/EMBLCDS or Uniprot/PDB and any selected DAS sources");
4373 fetchr.addActionListener(new ActionListener()
4376 public void actionPerformed(ActionEvent e)
4378 new Thread(new Runnable()
4383 new jalview.ws.DBRefFetcher(alignPanel.av
4384 .getSequenceSelection(), alignPanel.alignFrame)
4385 .fetchDBRefs(false);
4393 JMenu dfetch = new JMenu();
4395 jalview.ws.SequenceFetcher sf = SequenceFetcher
4396 .getSequenceFetcherSingleton(this);
4397 String[] otherdb = sf.getOrderedSupportedSources();
4398 // sf.getDbInstances(jalview.ws.dbsources.DasSequenceSource.class);
4399 // jalview.util.QuickSort.sort(otherdb, otherdb);
4400 int comp = 0, mcomp = 15;
4401 String mname = null;
4402 if (otherdb != null && otherdb.length > 0)
4404 for (int i = 0; i < otherdb.length; i++)
4406 String dbname = sf.getSourceProxy(otherdb[i]).getDbName();
4409 mname = "from '" + dbname + "'";
4411 fetchr = new JMenuItem(otherdb[i]);
4412 final String[] dassource = new String[]
4414 fetchr.addActionListener(new ActionListener()
4417 public void actionPerformed(ActionEvent e)
4419 new Thread(new Runnable()
4424 new jalview.ws.DBRefFetcher(alignPanel.av
4425 .getSequenceSelection(), alignPanel.alignFrame,
4426 dassource).fetchDBRefs(false);
4432 fetchr.setToolTipText("Retrieve from " + dbname);
4434 if (comp++ == mcomp || i == (otherdb.length - 1))
4436 dfetch.setText(mname + " to '" + dbname + "'");
4438 dfetch = new JMenu();
4447 * Left justify the whole alignment.
4449 protected void justifyLeftMenuItem_actionPerformed(ActionEvent e)
4451 AlignmentI al = viewport.getAlignment();
4453 viewport.firePropertyChange("alignment", null, al);
4457 * Right justify the whole alignment.
4459 protected void justifyRightMenuItem_actionPerformed(ActionEvent e)
4461 AlignmentI al = viewport.getAlignment();
4463 viewport.firePropertyChange("alignment", null, al);
4466 public void setShowSeqFeatures(boolean b)
4468 showSeqFeatures.setSelected(true);
4469 viewport.setShowSequenceFeatures(true);
4476 * jalview.jbgui.GAlignFrame#showUnconservedMenuItem_actionPerformed(java.
4477 * awt.event.ActionEvent)
4479 protected void showUnconservedMenuItem_actionPerformed(ActionEvent e)
4481 viewport.setShowUnconserved(showUnconservedMenuItem.getState());
4482 alignPanel.paintAlignment(true);
4489 * jalview.jbgui.GAlignFrame#showGroupConsensus_actionPerformed(java.awt.event
4492 protected void showGroupConsensus_actionPerformed(ActionEvent e)
4494 viewport.setShowGroupConsensus(showGroupConsensus.getState());
4495 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
4503 * jalview.jbgui.GAlignFrame#showGroupConservation_actionPerformed(java.awt
4504 * .event.ActionEvent)
4506 protected void showGroupConservation_actionPerformed(ActionEvent e)
4508 viewport.setShowGroupConservation(showGroupConservation.getState());
4509 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
4513 * @see jalview.jbgui.GAlignFrame#showConsensusHistogram_actionPerformed(java.awt.event.ActionEvent)
4515 protected void showConsensusHistogram_actionPerformed(ActionEvent e)
4517 viewport.setShowConsensusHistogram(showConsensusHistogram.getState());
4518 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
4522 * @see jalview.jbgui.GAlignFrame#showConsensusProfile_actionPerformed(java.awt.event.ActionEvent)
4524 protected void showConsensusProfile_actionPerformed(ActionEvent e)
4526 viewport.setShowConsensusProfile(showConsensusProfile.getState());
4527 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
4529 protected void applyAutoAnnotationSettings_actionPerformed(ActionEvent e)
4531 alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
4538 * jalview.jbgui.GAlignFrame#makeGrpsFromSelection_actionPerformed(java.awt
4539 * .event.ActionEvent)
4541 protected void makeGrpsFromSelection_actionPerformed(ActionEvent e)
4543 if (viewport.getSelectionGroup() != null)
4545 SequenceGroup[] gps = jalview.analysis.Grouping.makeGroupsFrom(
4546 viewport.getSequenceSelection(), viewport.getAlignmentView(
4547 true).getSequenceStrings(viewport.getGapCharacter()),
4548 viewport.alignment.getGroups());
4549 viewport.alignment.deleteAllGroups();
4550 viewport.sequenceColours = null;
4551 viewport.setSelectionGroup(null);
4552 // set view properties for each group
4553 for (int g = 0; g < gps.length; g++)
4555 gps[g].setShowunconserved(viewport.getShowUnconserved());
4556 gps[g].setIncludeAllConsSymbols(viewport.isIncludeAllConsensusSymbols());
4557 viewport.alignment.addGroup(gps[g]);
4558 Color col = new Color((int) (Math.random() * 255), (int) (Math
4559 .random() * 255), (int) (Math.random() * 255));
4560 col = col.brighter();
4561 for (Enumeration sq = gps[g].getSequences(null).elements(); sq
4562 .hasMoreElements(); viewport.setSequenceColour(
4563 (SequenceI) sq.nextElement(), col))
4566 PaintRefresher.Refresh(this, viewport.getSequenceSetId());
4567 alignPanel.updateAnnotation();
4568 alignPanel.paintAlignment(true);
4573 class PrintThread extends Thread
4577 public PrintThread(AlignmentPanel ap)
4582 static PageFormat pf;
4586 PrinterJob printJob = PrinterJob.getPrinterJob();
4590 printJob.setPrintable(ap, pf);
4594 printJob.setPrintable(ap);
4597 if (printJob.printDialog())
4602 } catch (Exception PrintException)
4604 PrintException.printStackTrace();