2 * Jalview - A Sequence Alignment Editor and Viewer
3 * Copyright (C) 2007 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 Softwarechang
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.*;
32 import jalview.analysis.*;
33 import jalview.commands.*;
34 import jalview.datamodel.*;
36 import jalview.jbgui.*;
37 import jalview.schemes.*;
46 public class AlignFrame
47 extends GAlignFrame implements DropTargetListener
50 public static final int DEFAULT_WIDTH = 700;
53 public static final int DEFAULT_HEIGHT = 500;
54 public AlignmentPanel alignPanel;
56 AlignViewport viewport;
58 Vector alignPanels = new Vector();
62 String currentFileFormat = null;
64 String fileName = null;
68 * Creates a new AlignFrame object.
70 * @param al DOCUMENT ME!
72 public AlignFrame(AlignmentI al, int width, int height)
74 this(al, null, width, height);
79 * new alignment window with hidden columns
80 * @param al AlignmentI
81 * @param hiddenColumns ColumnSelection or null
83 public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns,
84 int width, int height)
86 this.setSize(width, height);
87 viewport = new AlignViewport(al, hiddenColumns);
89 alignPanel = new AlignmentPanel(this, viewport);
91 if(al.getDataset()==null)
96 addAlignmentPanel(alignPanel, true);
101 * Make a new AlignFrame from exisiting alignmentPanels
102 * @param ap AlignmentPanel
103 * @param av AlignViewport
105 public AlignFrame(AlignmentPanel ap)
109 addAlignmentPanel(ap, false);
115 if (viewport.conservation == null)
117 BLOSUM62Colour.setEnabled(false);
118 conservationMenuItem.setEnabled(false);
119 modifyConservation.setEnabled(false);
120 // PIDColour.setEnabled(false);
121 // abovePIDThreshold.setEnabled(false);
122 // modifyPID.setEnabled(false);
125 String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT", "No sort");
127 if (sortby.equals("Id"))
129 sortIDMenuItem_actionPerformed(null);
131 else if (sortby.equals("Pairwise Identity"))
133 sortPairwiseMenuItem_actionPerformed(null);
136 if (Desktop.desktop != null)
138 this.setDropTarget(new java.awt.dnd.DropTarget(this, this));
139 addServiceListeners();
140 setGUINucleotide(viewport.alignment.isNucleotide());
143 setMenusFromViewport(viewport);
145 if (viewport.wrapAlignment)
147 wrapMenuItem_actionPerformed(null);
150 if (jalview.bin.Cache.getDefault("SHOW_OVERVIEW",false))
152 this.overviewMenuItem_actionPerformed(null);
159 public void setFileName(String file, String format)
162 currentFileFormat = format;
163 reload.setEnabled(true);
166 void addKeyListener()
168 addKeyListener(new KeyAdapter()
170 public void keyPressed(KeyEvent evt)
172 if (viewport.cursorMode &&
173 ( (evt.getKeyCode() >= KeyEvent.VK_0 &&
174 evt.getKeyCode() <= KeyEvent.VK_9)
176 (evt.getKeyCode() >= KeyEvent.VK_NUMPAD0 &&
177 evt.getKeyCode() <= KeyEvent.VK_NUMPAD9)
179 && Character.isDigit(evt.getKeyChar()))
180 alignPanel.seqPanel.numberPressed(evt.getKeyChar());
182 switch (evt.getKeyCode())
185 case 27: // escape key
186 deselectAllSequenceMenuItem_actionPerformed(null);
190 case KeyEvent.VK_DOWN:
191 if (evt.isAltDown() || !viewport.cursorMode)
192 moveSelectedSequences(false);
193 if (viewport.cursorMode)
194 alignPanel.seqPanel.moveCursor(0, 1);
198 if (evt.isAltDown() || !viewport.cursorMode)
199 moveSelectedSequences(true);
200 if (viewport.cursorMode)
201 alignPanel.seqPanel.moveCursor(0, -1);
205 case KeyEvent.VK_LEFT:
206 if (evt.isAltDown() || !viewport.cursorMode)
207 slideSequences(false,
208 alignPanel.seqPanel.getKeyboardNo1());
210 alignPanel.seqPanel.moveCursor( -1, 0);
215 case KeyEvent.VK_RIGHT:
216 if (evt.isAltDown() || !viewport.cursorMode)
218 alignPanel.seqPanel.getKeyboardNo1());
220 alignPanel.seqPanel.moveCursor(1, 0);
223 case KeyEvent.VK_SPACE:
224 if (viewport.cursorMode)
226 alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown()
232 case KeyEvent.VK_DELETE:
233 case KeyEvent.VK_BACK_SPACE:
234 if (!viewport.cursorMode)
236 cut_actionPerformed(null);
240 alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown()
248 if (viewport.cursorMode)
250 alignPanel.seqPanel.setCursorRow();
254 if (viewport.cursorMode && !evt.isControlDown())
256 alignPanel.seqPanel.setCursorColumn();
260 if (viewport.cursorMode)
262 alignPanel.seqPanel.setCursorPosition();
266 case KeyEvent.VK_ENTER:
267 case KeyEvent.VK_COMMA:
268 if (viewport.cursorMode)
270 alignPanel.seqPanel.setCursorRowAndColumn();
275 if (viewport.cursorMode)
277 alignPanel.seqPanel.setSelectionAreaAtCursor(true);
281 if (viewport.cursorMode)
283 alignPanel.seqPanel.setSelectionAreaAtCursor(false);
288 viewport.cursorMode = !viewport.cursorMode;
289 statusBar.setText("Keyboard editing mode is " +
290 (viewport.cursorMode ? "on" : "off"));
291 if (viewport.cursorMode)
293 alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes;
294 alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq;
296 alignPanel.seqPanel.seqCanvas.repaint();
302 ClassLoader cl = jalview.gui.Desktop.class.getClassLoader();
303 java.net.URL url = javax.help.HelpSet.findHelpSet(cl, "help/help");
304 javax.help.HelpSet hs = new javax.help.HelpSet(cl, url);
306 javax.help.HelpBroker hb = hs.createHelpBroker();
307 hb.setCurrentID("home");
308 hb.setDisplayed(true);
312 ex.printStackTrace();
318 boolean toggleSeqs = !evt.isControlDown();
319 boolean toggleCols = !evt.isShiftDown();
321 boolean hide = false;
323 SequenceGroup sg = viewport.getSelectionGroup();
326 if (sg != null && sg.getSize() != viewport.alignment.getHeight())
328 hideSelSequences_actionPerformed(null);
331 else if (! (toggleCols &&
332 viewport.colSel.getSelected().size() > 0))
334 showAllSeqs_actionPerformed(null);
340 if (viewport.colSel.getSelected().size() > 0)
342 hideSelColumns_actionPerformed(null);
345 viewport.selectionGroup = sg;
350 showAllColumns_actionPerformed(null);
355 case KeyEvent.VK_PAGE_UP:
356 if (viewport.wrapAlignment)
358 alignPanel.scrollUp(true);
362 alignPanel.setScrollValues(viewport.startRes,
364 - viewport.endSeq + viewport.startSeq);
367 case KeyEvent.VK_PAGE_DOWN:
368 if (viewport.wrapAlignment)
370 alignPanel.scrollUp(false);
374 alignPanel.setScrollValues(viewport.startRes,
376 + viewport.endSeq - viewport.startSeq);
382 public void keyReleased(KeyEvent evt)
384 switch(evt.getKeyCode())
386 case KeyEvent.VK_LEFT:
387 if (evt.isAltDown() || !viewport.cursorMode)
388 viewport.firePropertyChange("alignment", null,
389 viewport.getAlignment().getSequences());
392 case KeyEvent.VK_RIGHT:
393 if (evt.isAltDown() || !viewport.cursorMode)
394 viewport.firePropertyChange("alignment", null,
395 viewport.getAlignment().getSequences());
403 public void addAlignmentPanel(final AlignmentPanel ap,
406 ap.alignFrame = this;
408 alignPanels.addElement(ap);
410 PaintRefresher.Register(ap, ap.av.getSequenceSetId());
412 int aSize = alignPanels.size();
414 tabbedPane.setVisible(aSize>1 || ap.av.viewName!=null);
416 if (aSize == 1 && ap.av.viewName==null)
418 this.getContentPane().add(ap, BorderLayout.CENTER);
424 setInitialTabVisible();
427 expandViews.setEnabled(true);
428 gatherViews.setEnabled(true);
429 tabbedPane.addTab(ap.av.viewName, ap);
431 ap.setVisible(false);
438 ap.av.alignment.padGaps();
440 ap.av.updateConservation(ap);
441 ap.av.updateConsensus(ap);
445 public void setInitialTabVisible()
447 expandViews.setEnabled(true);
448 gatherViews.setEnabled(true);
449 tabbedPane.setVisible(true);
450 AlignmentPanel first = (AlignmentPanel) alignPanels.firstElement();
451 tabbedPane.addTab(first.av.viewName,first);
452 this.getContentPane().add(tabbedPane, BorderLayout.CENTER);
456 public AlignViewport getViewport()
461 /* Set up intrinsic listeners for dynamically generated GUI bits. */
462 private void addServiceListeners()
464 final java.beans.PropertyChangeListener thisListener;
465 // Do this once to get current state
466 BuildWebServiceMenu();
467 Desktop.discoverer.addPropertyChangeListener(
468 thisListener = new java.beans.PropertyChangeListener()
470 public void propertyChange(PropertyChangeEvent evt)
472 // System.out.println("Discoverer property change.");
473 if (evt.getPropertyName().equals("services"))
475 // System.out.println("Rebuilding web service menu");
476 BuildWebServiceMenu();
481 addInternalFrameListener(new javax.swing.event.
482 InternalFrameAdapter()
484 public void internalFrameClosed(
485 javax.swing.event.InternalFrameEvent evt)
487 // System.out.println("deregistering discoverer listener");
488 Desktop.discoverer.removePropertyChangeListener(thisListener);
489 closeMenuItem_actionPerformed(true);
495 public void setGUINucleotide(boolean nucleotide)
497 showTranslation.setVisible( nucleotide );
498 conservationMenuItem.setEnabled( !nucleotide );
499 modifyConservation.setEnabled( !nucleotide );
501 //Remember AlignFrame always starts as protein
504 calculateMenu.remove(calculateMenu.getItemCount()-2);
509 * Need to call this method when tabs are selected for multiple views,
510 * or when loading from Jalview2XML.java
511 * @param av AlignViewport
513 void setMenusFromViewport(AlignViewport av)
515 padGapsMenuitem.setSelected(av.padGaps);
516 colourTextMenuItem.setSelected(av.showColourText);
517 abovePIDThreshold.setSelected(av.getAbovePIDThreshold());
518 conservationMenuItem.setSelected(av.getConservationSelected());
519 seqLimits.setSelected(av.getShowJVSuffix());
520 idRightAlign.setSelected(av.rightAlignIds);
521 renderGapsMenuItem.setSelected(av.renderGaps);
522 wrapMenuItem.setSelected(av.wrapAlignment);
523 scaleAbove.setVisible(av.wrapAlignment);
524 scaleLeft.setVisible(av.wrapAlignment);
525 scaleRight.setVisible(av.wrapAlignment);
526 annotationPanelMenuItem.setState(av.showAnnotation);
527 viewBoxesMenuItem.setSelected(av.showBoxes);
528 viewTextMenuItem.setSelected(av.showText);
530 setColourSelected(ColourSchemeProperty.
531 getColourName(av.getGlobalColourScheme()));
533 showSeqFeatures.setSelected(av.showSequenceFeatures);
534 hiddenMarkers.setState(av.showHiddenMarkers);
535 applyToAllGroups.setState(av.colourAppliesToAllGroups);
541 Hashtable progressBars;
542 public void setProgressBar(String message, long id)
544 if(progressBars == null)
546 progressBars = new Hashtable();
549 JPanel progressPanel;
550 GridLayout layout = (GridLayout) statusPanel.getLayout();
551 if(progressBars.get( new Long(id) )!=null)
553 progressPanel = (JPanel)progressBars.get( new Long(id) );
554 statusPanel.remove(progressPanel);
555 progressBars.remove( progressPanel );
556 progressPanel = null;
559 statusBar.setText(message);
562 layout.setRows(layout.getRows() - 1);
566 progressPanel = new JPanel(new BorderLayout(10, 5));
568 JProgressBar progressBar = new JProgressBar();
569 progressBar.setIndeterminate(true);
571 progressPanel.add(new JLabel(message), BorderLayout.WEST);
572 progressPanel.add(progressBar, BorderLayout.CENTER);
574 layout.setRows(layout.getRows() + 1);
575 statusPanel.add(progressPanel);
577 progressBars.put(new Long(id), progressPanel);
587 Added so Castor Mapping file can obtain Jalview Version
589 public String getVersion()
591 return jalview.bin.Cache.getProperty("VERSION");
594 public FeatureRenderer getFeatureRenderer()
596 return alignPanel.seqPanel.seqCanvas.getFeatureRenderer();
600 public void fetchSequence_actionPerformed(ActionEvent e)
602 new SequenceFetcher(this);
605 public void addFromFile_actionPerformed(ActionEvent e)
607 Desktop.instance.inputLocalFileMenuItem_actionPerformed(viewport);
610 public void reload_actionPerformed(ActionEvent e)
614 if(currentFileFormat.equals("Jalview"))
616 JInternalFrame [] frames = Desktop.desktop.getAllFrames();
617 for(int i=0; i<frames.length; i++)
619 if (frames[i] instanceof AlignFrame
621 && ( (AlignFrame) frames[i]).fileName.equals(fileName))
625 frames[i].setSelected(true);
626 Desktop.instance.closeAssociatedWindows();
628 catch (java.beans.PropertyVetoException ex)
633 Desktop.instance.closeAssociatedWindows();
635 FileLoader loader = new FileLoader();
636 String protocol = fileName.startsWith("http:")? "URL":"File";
637 loader.LoadFile(viewport, fileName, protocol, currentFileFormat);
641 Rectangle bounds = this.getBounds();
643 FileLoader loader = new FileLoader();
644 String protocol = fileName.startsWith("http:") ? "URL" : "File";
645 AlignFrame newframe =
646 loader.LoadFileWaitTillLoaded(fileName, protocol, currentFileFormat);
648 newframe.setBounds(bounds);
650 this.closeMenuItem_actionPerformed(true);
656 public void addFromText_actionPerformed(ActionEvent e)
658 Desktop.instance.inputTextboxMenuItem_actionPerformed(viewport);
661 public void addFromURL_actionPerformed(ActionEvent e)
663 Desktop.instance.inputURLMenuItem_actionPerformed(viewport);
667 public void save_actionPerformed(ActionEvent e)
670 || currentFileFormat==null
671 || fileName.startsWith("http")
674 saveAs_actionPerformed(null);
678 saveAlignment(fileName, currentFileFormat);
685 * @param e DOCUMENT ME!
687 public void saveAs_actionPerformed(ActionEvent e)
689 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
690 getProperty( "LAST_DIRECTORY"),
692 { "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc","jar" },
694 { "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview" },
699 chooser.setFileView(new JalviewFileView());
700 chooser.setDialogTitle("Save Alignment to file");
701 chooser.setToolTipText("Save");
703 int value = chooser.showSaveDialog(this);
705 if (value == JalviewFileChooser.APPROVE_OPTION)
707 currentFileFormat = chooser.getSelectedFormat();
708 if (currentFileFormat == null)
710 JOptionPane.showInternalMessageDialog(Desktop.desktop,
711 "You must select a file format before saving!",
712 "File format not specified",
713 JOptionPane.WARNING_MESSAGE);
714 value = chooser.showSaveDialog(this);
718 fileName = chooser.getSelectedFile().getPath();
720 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
723 jalview.bin.Cache.setProperty("LAST_DIRECTORY", fileName);
725 saveAlignment(fileName, currentFileFormat);
729 public boolean saveAlignment(String file, String format)
731 boolean success = true;
733 if (format.equalsIgnoreCase("Jalview"))
735 String shortName = title;
737 if (shortName.indexOf(java.io.File.separatorChar) > -1)
739 shortName = shortName.substring(shortName.lastIndexOf(
740 java.io.File.separatorChar) + 1);
743 success = new Jalview2XML().SaveAlignment(this, file, shortName);
745 statusBar.setText("Successfully saved to file: "
747 +format +" format.");
753 String[] omitHidden = null;
755 if (viewport.hasHiddenColumns)
757 int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop,
758 "The Alignment contains hidden columns."
759 + "\nDo you want to save only the visible alignment?",
760 "Save / Omit Hidden Columns",
761 JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
763 if (reply == JOptionPane.YES_OPTION)
765 omitHidden = viewport.getViewAsString(false);
769 String output = new FormatAdapter().formatSequences(
771 viewport.alignment.getSequencesArray(),
782 java.io.PrintWriter out = new java.io.PrintWriter(
783 new java.io.FileWriter(file));
788 statusBar.setText("Successfully saved to file: "
790 + format + " format.");
795 ex.printStackTrace();
802 JOptionPane.showInternalMessageDialog(
803 this, "Couldn't save file: " + fileName,
805 JOptionPane.WARNING_MESSAGE);
814 * @param e DOCUMENT ME!
816 protected void outputText_actionPerformed(ActionEvent e)
818 String [] omitHidden = null;
820 if(viewport.hasHiddenColumns)
822 int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop,
823 "The Alignment contains hidden columns."
824 +"\nDo you want to output only the visible alignment?",
825 "Save / Omit Hidden Columns",
826 JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
828 if(reply==JOptionPane.YES_OPTION)
830 omitHidden = viewport.getViewAsString(false);
834 CutAndPasteTransfer cap = new CutAndPasteTransfer();
835 cap.setForInput(null);
836 Desktop.addInternalFrame(cap,
837 "Alignment output - " + e.getActionCommand(), 600,
841 cap.setText(new FormatAdapter().formatSequences(
842 e.getActionCommand(),
843 viewport.alignment.getSequencesArray(),
850 * @param e DOCUMENT ME!
852 protected void htmlMenuItem_actionPerformed(ActionEvent e)
854 new HTMLOutput(alignPanel,
855 alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
856 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
859 public void createImageMap(File file, String image)
861 alignPanel.makePNGImageMap(file, image);
867 * @param e DOCUMENT ME!
869 public void createPNG(File f)
871 alignPanel.makePNG(f);
877 * @param e DOCUMENT ME!
879 public void createEPS(File f)
881 alignPanel.makeEPS(f);
885 public void pageSetup_actionPerformed(ActionEvent e)
887 PrinterJob printJob = PrinterJob.getPrinterJob();
888 PrintThread.pf = printJob.pageDialog(printJob.defaultPage());
894 * @param e DOCUMENT ME!
896 public void printMenuItem_actionPerformed(ActionEvent e)
898 //Putting in a thread avoids Swing painting problems
899 PrintThread thread = new PrintThread(alignPanel);
903 public void exportFeatures_actionPerformed(ActionEvent e)
905 new AnnotationExporter().exportFeatures(alignPanel);
909 public void exportAnnotations_actionPerformed(ActionEvent e)
911 new AnnotationExporter().exportAnnotations(
913 viewport.showAnnotation ? viewport.alignment.getAlignmentAnnotation() : null,
914 viewport.alignment.getGroups(),
915 ((Alignment)viewport.alignment).alignmentProperties
920 public void associatedData_actionPerformed(ActionEvent e)
922 // Pick the tree file
923 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
926 chooser.setFileView(new JalviewFileView());
927 chooser.setDialogTitle("Load Jalview Annotations or Features File");
928 chooser.setToolTipText("Load Jalview Annotations / Features file");
930 int value = chooser.showOpenDialog(null);
932 if (value == JalviewFileChooser.APPROVE_OPTION)
934 String choice = chooser.getSelectedFile().getPath();
935 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
936 loadJalviewDataFile(choice);
945 * @param e DOCUMENT ME!
947 public void closeMenuItem_actionPerformed(boolean closeAllTabs)
949 if(alignPanels!=null && alignPanels.size()<2)
956 if(alignPanels!=null)
960 for (int i = 0; i < alignPanels.size(); i++)
962 AlignmentPanel ap = (AlignmentPanel) alignPanels.elementAt(i);
963 jalview.structure.StructureSelectionManager.getStructureSelectionManager()
964 .removeStructureViewerListener(ap.seqPanel, null);
965 PaintRefresher.RemoveComponent(ap.seqPanel.seqCanvas);
966 PaintRefresher.RemoveComponent(ap.idPanel.idCanvas);
967 PaintRefresher.RemoveComponent(ap);
968 ap.av.alignment = null;
973 int index = tabbedPane.getSelectedIndex();
975 alignPanels.removeElement(alignPanel);
976 PaintRefresher.RemoveComponent(alignPanel.seqPanel.seqCanvas);
977 PaintRefresher.RemoveComponent(alignPanel.idPanel.idCanvas);
978 PaintRefresher.RemoveComponent(alignPanel);
979 viewport.alignment = null;
983 tabbedPane.removeTabAt(index);
984 tabbedPane.validate();
986 if(index==tabbedPane.getTabCount())
991 this.tabSelectionChanged(index);
997 this.setClosed(true);
1000 catch (Exception ex)
1002 ex.printStackTrace();
1010 void updateEditMenuBar()
1013 if (viewport.historyList.size() > 0)
1015 undoMenuItem.setEnabled(true);
1016 CommandI command = (CommandI) viewport.historyList.peek();
1017 undoMenuItem.setText("Undo " + command.getDescription());
1021 undoMenuItem.setEnabled(false);
1022 undoMenuItem.setText("Undo");
1025 if (viewport.redoList.size() > 0)
1027 redoMenuItem.setEnabled(true);
1029 CommandI command = (CommandI) viewport.redoList.peek();
1030 redoMenuItem.setText("Redo " + command.getDescription());
1034 redoMenuItem.setEnabled(false);
1035 redoMenuItem.setText("Redo");
1040 public void addHistoryItem(CommandI command)
1042 if(command.getSize()>0)
1044 viewport.historyList.push(command);
1045 viewport.redoList.clear();
1046 updateEditMenuBar();
1047 viewport.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;
1056 * @param e DOCUMENT ME!
1058 protected void undoMenuItem_actionPerformed(ActionEvent e)
1060 CommandI command = (CommandI)viewport.historyList.pop();
1061 viewport.redoList.push(command);
1062 command.undoCommand();
1064 AlignViewport originalSource = getOriginatingSource(command);
1065 updateEditMenuBar();
1067 if(originalSource!=null)
1069 originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;
1070 originalSource.firePropertyChange("alignment",
1072 originalSource.alignment.getSequences());
1079 * @param e DOCUMENT ME!
1081 protected void redoMenuItem_actionPerformed(ActionEvent e)
1083 if(viewport.redoList.size()<1)
1088 CommandI command = (CommandI) viewport.redoList.pop();
1089 viewport.historyList.push(command);
1090 command.doCommand();
1092 AlignViewport originalSource = getOriginatingSource(command);
1093 updateEditMenuBar();
1095 if(originalSource!=null)
1097 originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;
1098 originalSource.firePropertyChange("alignment",
1100 originalSource.alignment.getSequences());
1104 AlignViewport getOriginatingSource(CommandI command)
1106 AlignViewport originalSource = null;
1107 //For sequence removal and addition, we need to fire
1108 //the property change event FROM the viewport where the
1109 //original alignment was altered
1111 if (command instanceof EditCommand)
1113 EditCommand editCommand = (EditCommand) command;
1114 al = editCommand.getAlignment();
1115 Vector comps = (Vector) PaintRefresher.components
1116 .get(viewport.getSequenceSetId());
1118 for (int i = 0; i < comps.size(); i++)
1120 if (comps.elementAt(i) instanceof AlignmentPanel)
1122 if (al == ( (AlignmentPanel) comps.elementAt(i)).av.alignment)
1124 originalSource = ( (AlignmentPanel) comps.elementAt(i)).av;
1131 if (originalSource == null)
1133 //The original view is closed, we must validate
1134 //the current view against the closed view first
1137 PaintRefresher.validateSequences(al, viewport.alignment);
1140 originalSource = viewport;
1143 return originalSource;
1149 * @param up DOCUMENT ME!
1151 public void moveSelectedSequences(boolean up)
1153 SequenceGroup sg = viewport.getSelectionGroup();
1162 for (int i = 1; i < viewport.alignment.getHeight(); i++)
1164 SequenceI seq = viewport.alignment.getSequenceAt(i);
1166 if (!sg.getSequences(null).contains(seq))
1171 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
1173 if (sg.getSequences(null).contains(temp))
1178 viewport.alignment.getSequences().setElementAt(temp, i);
1179 viewport.alignment.getSequences().setElementAt(seq, i - 1);
1184 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
1186 SequenceI seq = viewport.alignment.getSequenceAt(i);
1188 if (!sg.getSequences(null).contains(seq))
1193 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
1195 if (sg.getSequences(null).contains(temp))
1200 viewport.alignment.getSequences().setElementAt(temp, i);
1201 viewport.alignment.getSequences().setElementAt(seq, i + 1);
1205 alignPanel.paintAlignment(true);
1211 synchronized void slideSequences(boolean right, int size)
1213 Vector sg = new Vector();
1214 if(viewport.cursorMode)
1216 sg.addElement(viewport.alignment.getSequenceAt(
1217 alignPanel.seqPanel.seqCanvas.cursorY));
1219 else if(viewport.getSelectionGroup()!=null
1220 && viewport.getSelectionGroup().getSize()!=viewport.alignment.getHeight())
1222 sg = viewport.getSelectionGroup().getSequences(
1223 viewport.hiddenRepSequences);
1231 Vector invertGroup = new Vector();
1233 for (int i = 0; i < viewport.alignment.getHeight(); i++)
1235 if(!sg.contains(viewport.alignment.getSequenceAt(i)))
1236 invertGroup.add(viewport.alignment.getSequenceAt(i));
1239 SequenceI[] seqs1 = new SequenceI[sg.size()];
1240 for (int i = 0; i < sg.size(); i++)
1241 seqs1[i] = (SequenceI) sg.elementAt(i);
1243 SequenceI[] seqs2 = new SequenceI[invertGroup.size()];
1244 for (int i = 0; i < invertGroup.size(); i++)
1245 seqs2[i] = (SequenceI) invertGroup.elementAt(i);
1247 SlideSequencesCommand ssc;
1249 ssc = new SlideSequencesCommand("Slide Sequences",
1251 viewport.getGapCharacter()
1254 ssc = new SlideSequencesCommand("Slide Sequences",
1256 viewport.getGapCharacter()
1259 int groupAdjustment = 0;
1260 if (ssc.getGapsInsertedBegin() && right)
1262 if (viewport.cursorMode)
1263 alignPanel.seqPanel.moveCursor(size, 0);
1265 groupAdjustment = size;
1267 else if (!ssc.getGapsInsertedBegin() && !right)
1269 if (viewport.cursorMode)
1270 alignPanel.seqPanel.moveCursor( -size, 0);
1272 groupAdjustment = -size;
1275 if (groupAdjustment != 0)
1277 viewport.getSelectionGroup().setStartRes(
1278 viewport.getSelectionGroup().getStartRes() + groupAdjustment);
1279 viewport.getSelectionGroup().setEndRes(
1280 viewport.getSelectionGroup().getEndRes() + groupAdjustment);
1284 boolean appendHistoryItem = false;
1285 if(viewport.historyList!=null
1286 && viewport.historyList.size()>0
1287 && viewport.historyList.peek() instanceof SlideSequencesCommand)
1289 appendHistoryItem = ssc.appendSlideCommand(
1290 (SlideSequencesCommand)viewport.historyList.peek())
1294 if(!appendHistoryItem)
1295 addHistoryItem(ssc);
1304 * @param e DOCUMENT ME!
1306 protected void copy_actionPerformed(ActionEvent e)
1309 if (viewport.getSelectionGroup() == null)
1313 // TODO: preserve the ordering of displayed alignment annotation in any internal paste (particularly sequence associated annotation)
1314 SequenceI [] seqs = viewport.getSelectionAsNewSequence();
1315 String[] omitHidden = null;
1317 if (viewport.hasHiddenColumns)
1319 omitHidden = viewport.getViewAsString(true);
1322 String output = new FormatAdapter().formatSequences(
1327 StringSelection ss = new StringSelection(output);
1331 jalview.gui.Desktop.internalCopy = true;
1332 //Its really worth setting the clipboard contents
1333 //to empty before setting the large StringSelection!!
1334 Toolkit.getDefaultToolkit().getSystemClipboard()
1335 .setContents(new StringSelection(""), null);
1337 Toolkit.getDefaultToolkit().getSystemClipboard()
1338 .setContents(ss, Desktop.instance);
1340 catch (OutOfMemoryError er)
1342 er.printStackTrace();
1343 javax.swing.SwingUtilities.invokeLater(new Runnable()
1347 javax.swing.JOptionPane.showInternalMessageDialog(Desktop.desktop,
1348 "Out of memory copying region!!"
1350 "\nSee help files for increasing Java Virtual Machine memory."
1352 javax.swing.JOptionPane.WARNING_MESSAGE);
1359 Vector hiddenColumns = null;
1360 if(viewport.hasHiddenColumns)
1362 hiddenColumns =new Vector();
1363 int hiddenOffset = viewport.getSelectionGroup().getStartRes();
1364 for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns().size();
1367 int[] region = (int[])
1368 viewport.getColumnSelection().getHiddenColumns().elementAt(i);
1370 hiddenColumns.addElement(new int[]
1371 {region[0] - hiddenOffset,
1372 region[1]-hiddenOffset});
1376 Desktop.jalviewClipboard = new Object[]
1379 viewport.alignment.getDataset(),
1381 statusBar.setText("Copied "+seqs.length+" sequences to clipboard.");
1387 * @param e DOCUMENT ME!
1389 protected void pasteNew_actionPerformed(ActionEvent e)
1397 * @param e DOCUMENT ME!
1399 protected void pasteThis_actionPerformed(ActionEvent e)
1407 * @param newAlignment DOCUMENT ME!
1409 void paste(boolean newAlignment)
1411 boolean externalPaste=true;
1414 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
1415 Transferable contents = c.getContents(this);
1417 if (contents == null)
1425 str = (String) contents.getTransferData(DataFlavor.stringFlavor);
1426 if (str.length() < 1)
1431 format = new IdentifyFile().Identify(str, "Paste");
1434 catch (OutOfMemoryError er)
1436 er.printStackTrace();
1437 javax.swing.SwingUtilities.invokeLater(new Runnable()
1441 javax.swing.JOptionPane.showInternalMessageDialog(Desktop.desktop,
1442 "Out of memory pasting sequences!!"
1444 "\nSee help files for increasing Java Virtual Machine memory."
1446 javax.swing.JOptionPane.WARNING_MESSAGE);
1453 SequenceI[] sequences;
1454 boolean annotationAdded = false;
1455 AlignmentI alignment = null;
1457 if(Desktop.jalviewClipboard!=null)
1459 // The clipboard was filled from within Jalview, we must use the sequences
1460 // And dataset from the copied alignment
1461 SequenceI[] newseq = (SequenceI[])Desktop.jalviewClipboard[0];
1462 // be doubly sure that we create *new* sequence objects.
1463 sequences = new SequenceI[newseq.length];
1464 for (int i=0;i<newseq.length;i++) {
1465 sequences[i] = new Sequence(newseq[i]);
1467 alignment = new Alignment(sequences);
1468 externalPaste = false;
1472 // parse the clipboard as an alignment.
1473 alignment = new FormatAdapter().readFile(str, "Paste", format);
1474 sequences = alignment.getSequencesArray();
1482 if (Desktop.jalviewClipboard != null)
1484 // dataset is inherited
1485 alignment.setDataset( (Alignment) Desktop.jalviewClipboard[1]);
1489 // new dataset is constructed
1490 alignment.setDataset(null);
1492 alwidth = alignment.getWidth()+1;
1496 AlignmentI pastedal = alignment; // preserve pasted alignment object
1497 // Add pasted sequences and dataset into existing alignment.
1498 alignment = viewport.getAlignment();
1499 alwidth = alignment.getWidth()+1;
1500 // decide if we need to import sequences from an existing dataset
1501 boolean importDs = Desktop.jalviewClipboard != null
1502 && Desktop.jalviewClipboard[1] != alignment.getDataset();
1503 // importDs==true instructs us to copy over new dataset sequences from
1504 // an existing alignment
1505 Vector newDs = (importDs) ? new Vector() : null; // used to create
1506 // minimum dataset set
1508 for (int i = 0; i < sequences.length; i++)
1512 newDs.addElement(null);
1514 SequenceI ds = sequences[i].getDatasetSequence(); // null for a simple
1516 if (importDs && ds != null)
1518 if (!newDs.contains(ds))
1520 newDs.setElementAt(ds, i);
1521 ds = new Sequence(ds);
1522 // update with new dataset sequence
1523 sequences[i].setDatasetSequence(ds);
1527 ds = sequences[newDs.indexOf(ds)].getDatasetSequence();
1532 // copy and derive new dataset sequence
1533 sequences[i] = sequences[i].deriveSequence();
1534 alignment.getDataset().addSequence(sequences[i].getDatasetSequence());
1535 // TODO: avoid creation of duplicate dataset sequences with a
1536 // 'contains' method using SequenceI.equals()/SequenceI.contains()
1538 alignment.addSequence(sequences[i]); // merges dataset
1542 newDs.clear(); // tidy up
1544 if (pastedal.getAlignmentAnnotation()!=null) {
1545 // Add any annotation attached to alignment.
1546 AlignmentAnnotation[] alann = pastedal.getAlignmentAnnotation();
1547 for (int i=0; i<alann.length; i++)
1549 annotationAdded=true;
1550 if (alann[i].sequenceRef==null && !alann[i].autoCalculated) {
1551 AlignmentAnnotation newann = new AlignmentAnnotation(alann[i]);
1552 newann.padAnnotation(alwidth);
1553 alignment.addAnnotation(newann);
1558 if (!newAlignment) {
1562 addHistoryItem(new EditCommand(
1567 alignment.getWidth(),
1571 // Add any annotations attached to sequences
1572 for (int i = 0; i < sequences.length; i++)
1574 if (sequences[i].getAnnotation() != null)
1576 for (int a = 0; a < sequences[i].getAnnotation().length; a++)
1578 annotationAdded=true;
1579 sequences[i].getAnnotation()[a].adjustForAlignment();
1580 sequences[i].getAnnotation()[a].padAnnotation(alwidth);
1581 alignment.addAnnotation(sequences[i].getAnnotation()[a]); // annotation was duplicated earlier
1582 alignment.setAnnotationIndex(sequences[i].getAnnotation()[a], a);
1588 if (!newAlignment) {
1589 // propagate alignment changed.
1590 viewport.setEndSeq(alignment.getHeight());
1591 if (annotationAdded)
1593 alignPanel.annotationPanel.adjustPanelHeight();
1595 viewport.firePropertyChange("alignment", null, alignment.getSequences());
1597 AlignFrame af = new AlignFrame(alignment, DEFAULT_WIDTH, DEFAULT_HEIGHT);
1598 String newtitle = new String("Copied sequences");
1600 if(Desktop.jalviewClipboard!=null && Desktop.jalviewClipboard[2]!=null)
1602 Vector hc = (Vector)Desktop.jalviewClipboard[2];
1603 for(int i=0; i<hc.size(); i++)
1605 int [] region = (int[]) hc.elementAt(i);
1606 af.viewport.hideColumns(region[0], region[1]);
1611 //>>>This is a fix for the moment, until a better solution is found!!<<<
1612 af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().transferSettings(
1613 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
1615 // TODO: maintain provenance of an alignment, rather than just make the title a concatenation of operations.
1616 if (!externalPaste) {
1617 if (title.startsWith("Copied sequences"))
1623 newtitle = newtitle.concat("- from " + title);
1626 newtitle = new String("Pasted sequences");
1629 Desktop.addInternalFrame(af, newtitle, DEFAULT_WIDTH,
1636 catch (Exception ex)
1638 ex.printStackTrace();
1639 System.out.println("Exception whilst pasting: "+ex);
1640 // could be anything being pasted in here
1649 * @param e DOCUMENT ME!
1651 protected void cut_actionPerformed(ActionEvent e)
1653 copy_actionPerformed(null);
1654 delete_actionPerformed(null);
1660 * @param e DOCUMENT ME!
1662 protected void delete_actionPerformed(ActionEvent evt)
1665 SequenceGroup sg = viewport.getSelectionGroup();
1671 Vector seqs = new Vector();
1673 for (int i = 0; i < sg.getSize(); i++)
1675 seq = sg.getSequenceAt(i);
1676 seqs.addElement(seq);
1680 // If the cut affects all sequences, remove highlighted columns
1681 if (sg.getSize() == viewport.alignment.getHeight())
1683 viewport.getColumnSelection().removeElements(sg.getStartRes(),
1684 sg.getEndRes() + 1);
1688 SequenceI [] cut = new SequenceI[seqs.size()];
1689 for(int i=0; i<seqs.size(); i++)
1691 cut[i] = (SequenceI)seqs.elementAt(i);
1698 addHistoryItem(new EditCommand("Cut Sequences",
1702 sg.getEndRes()-sg.getStartRes()+1,
1703 viewport.alignment));
1706 viewport.setSelectionGroup(null);
1707 viewport.alignment.deleteGroup(sg);
1709 viewport.firePropertyChange("alignment", null,
1710 viewport.getAlignment().getSequences());
1712 if (viewport.getAlignment().getHeight() < 1)
1716 this.setClosed(true);
1718 catch (Exception ex)
1727 * @param e DOCUMENT ME!
1729 protected void deleteGroups_actionPerformed(ActionEvent e)
1731 viewport.alignment.deleteAllGroups();
1732 viewport.sequenceColours = null;
1733 viewport.setSelectionGroup(null);
1734 PaintRefresher.Refresh(this, viewport.getSequenceSetId());
1735 alignPanel.paintAlignment(true);
1741 * @param e DOCUMENT ME!
1743 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
1745 SequenceGroup sg = new SequenceGroup();
1747 for (int i = 0; i < viewport.getAlignment().getSequences().size();
1750 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
1753 sg.setEndRes(viewport.alignment.getWidth() - 1);
1754 viewport.setSelectionGroup(sg);
1755 alignPanel.paintAlignment(true);
1756 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1762 * @param e DOCUMENT ME!
1764 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
1766 if(viewport.cursorMode)
1768 alignPanel.seqPanel.keyboardNo1 = null;
1769 alignPanel.seqPanel.keyboardNo2 = null;
1771 viewport.setSelectionGroup(null);
1772 viewport.getColumnSelection().clear();
1773 viewport.setSelectionGroup(null);
1774 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
1775 alignPanel.idPanel.idCanvas.searchResults = null;
1776 alignPanel.paintAlignment(true);
1777 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1783 * @param e DOCUMENT ME!
1785 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
1787 SequenceGroup sg = viewport.getSelectionGroup();
1791 selectAllSequenceMenuItem_actionPerformed(null);
1796 for (int i = 0; i < viewport.getAlignment().getSequences().size();
1799 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
1802 alignPanel.paintAlignment(true);
1804 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1807 public void invertColSel_actionPerformed(ActionEvent e)
1809 viewport.invertColumnSelection();
1810 alignPanel.paintAlignment(true);
1817 * @param e DOCUMENT ME!
1819 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
1821 trimAlignment(true);
1827 * @param e DOCUMENT ME!
1829 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
1831 trimAlignment(false);
1834 void trimAlignment(boolean trimLeft)
1836 ColumnSelection colSel = viewport.getColumnSelection();
1839 if (colSel.size() > 0)
1843 column = colSel.getMin();
1847 column = colSel.getMax();
1851 if(viewport.getSelectionGroup()!=null)
1853 seqs = viewport.getSelectionGroup().getSequencesAsArray(viewport.
1854 hiddenRepSequences);
1858 seqs = viewport.alignment.getSequencesArray();
1862 TrimRegionCommand trimRegion;
1865 trimRegion = new TrimRegionCommand("Remove Left",
1866 TrimRegionCommand.TRIM_LEFT,
1871 viewport.selectionGroup);
1872 viewport.setStartRes(0);
1876 trimRegion = new TrimRegionCommand("Remove Right",
1877 TrimRegionCommand.TRIM_RIGHT,
1882 viewport.selectionGroup);
1885 statusBar.setText("Removed "+trimRegion.getSize()+" columns.");
1888 addHistoryItem(trimRegion);
1890 Vector groups = viewport.alignment.getGroups();
1892 for (int i = 0; i < groups.size(); i++)
1894 SequenceGroup sg = (SequenceGroup) groups.get(i);
1896 if ( (trimLeft && !sg.adjustForRemoveLeft(column))
1897 || (!trimLeft && !sg.adjustForRemoveRight(column)))
1899 viewport.alignment.deleteGroup(sg);
1903 viewport.firePropertyChange("alignment", null,
1904 viewport.getAlignment().getSequences());
1911 * @param e DOCUMENT ME!
1913 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
1915 int start = 0, end = viewport.alignment.getWidth()-1;
1918 if (viewport.getSelectionGroup() != null)
1920 seqs = viewport.getSelectionGroup().getSequencesAsArray(viewport.
1921 hiddenRepSequences);
1922 start = viewport.getSelectionGroup().getStartRes();
1923 end = viewport.getSelectionGroup().getEndRes();
1927 seqs = viewport.alignment.getSequencesArray();
1931 RemoveGapColCommand removeGapCols =
1932 new RemoveGapColCommand("Remove Gapped Columns",
1935 viewport.alignment);
1937 addHistoryItem(removeGapCols);
1939 statusBar.setText("Removed "+removeGapCols.getSize()+" empty columns.");
1941 //This is to maintain viewport position on first residue
1943 SequenceI seq = viewport.alignment.getSequenceAt(0);
1944 int startRes = seq.findPosition(viewport.startRes);
1945 // ShiftList shifts;
1946 // viewport.getAlignment().removeGaps(shifts=new ShiftList());
1947 // edit.alColumnChanges=shifts.getInverse();
1948 // if (viewport.hasHiddenColumns)
1949 // viewport.getColumnSelection().compensateForEdits(shifts);
1950 viewport.setStartRes(seq.findIndex(startRes)-1);
1951 viewport.firePropertyChange("alignment", null,
1952 viewport.getAlignment().getSequences());
1959 * @param e DOCUMENT ME!
1961 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
1963 int start = 0, end = viewport.alignment.getWidth()-1;
1966 if (viewport.getSelectionGroup() != null)
1968 seqs = viewport.getSelectionGroup().getSequencesAsArray(viewport.
1969 hiddenRepSequences);
1970 start = viewport.getSelectionGroup().getStartRes();
1971 end = viewport.getSelectionGroup().getEndRes();
1975 seqs = viewport.alignment.getSequencesArray();
1978 //This is to maintain viewport position on first residue
1980 SequenceI seq = viewport.alignment.getSequenceAt(0);
1981 int startRes = seq.findPosition(viewport.startRes);
1983 addHistoryItem(new RemoveGapsCommand("Remove Gaps",
1986 viewport.alignment));
1988 viewport.setStartRes(seq.findIndex(startRes)-1);
1990 viewport.firePropertyChange("alignment", null,
1991 viewport.getAlignment().getSequences());
1998 * @param e DOCUMENT ME!
2000 public void padGapsMenuitem_actionPerformed(ActionEvent e)
2002 viewport.padGaps = padGapsMenuitem.isSelected();
2004 viewport.firePropertyChange("alignment",
2006 viewport.getAlignment().getSequences());
2012 * @param e DOCUMENT ME!
2014 public void findMenuItem_actionPerformed(ActionEvent e)
2019 public void newView_actionPerformed(ActionEvent e)
2021 AlignmentPanel newap =
2022 new Jalview2XML().copyAlignPanel(alignPanel, true);
2024 newap.av.gatherViewsHere = false;
2026 if (viewport.viewName == null)
2028 viewport.viewName = "Original";
2031 newap.av.historyList = viewport.historyList;
2032 newap.av.redoList = viewport.redoList;
2034 int index = Desktop.getViewCount(viewport.getSequenceSetId());
2035 String newViewName = "View " +index;
2037 Vector comps = (Vector) PaintRefresher.components.get(viewport.
2038 getSequenceSetId());
2039 Vector existingNames = new Vector();
2040 for(int i=0; i<comps.size(); i++)
2042 if(comps.elementAt(i) instanceof AlignmentPanel)
2044 AlignmentPanel ap = (AlignmentPanel)comps.elementAt(i);
2045 if(!existingNames.contains(ap.av.viewName))
2047 existingNames.addElement(ap.av.viewName);
2052 while(existingNames.contains(newViewName))
2054 newViewName = "View "+ (++index);
2057 newap.av.viewName = newViewName;
2059 addAlignmentPanel(newap, false);
2061 if(alignPanels.size()==2)
2063 viewport.gatherViewsHere = true;
2065 tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1);
2068 public void expandViews_actionPerformed(ActionEvent e)
2070 Desktop.instance.explodeViews(this);
2073 public void gatherViews_actionPerformed(ActionEvent e)
2075 Desktop.instance.gatherViews(this);
2083 * @param e DOCUMENT ME!
2085 public void font_actionPerformed(ActionEvent e)
2087 new FontChooser(alignPanel);
2094 * @param e DOCUMENT ME!
2096 protected void seqLimit_actionPerformed(ActionEvent e)
2098 viewport.setShowJVSuffix(seqLimits.isSelected());
2100 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
2101 alignPanel.paintAlignment(true);
2104 public void idRightAlign_actionPerformed(ActionEvent e)
2106 viewport.rightAlignIds = idRightAlign.isSelected();
2107 alignPanel.paintAlignment(true);
2115 * @param e DOCUMENT ME!
2117 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
2119 viewport.setColourText(colourTextMenuItem.isSelected());
2120 alignPanel.paintAlignment(true);
2126 * @param e DOCUMENT ME!
2128 public void wrapMenuItem_actionPerformed(ActionEvent e)
2130 scaleAbove.setVisible(wrapMenuItem.isSelected());
2131 scaleLeft.setVisible(wrapMenuItem.isSelected());
2132 scaleRight.setVisible(wrapMenuItem.isSelected());
2133 viewport.setWrapAlignment(wrapMenuItem.isSelected());
2134 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
2137 public void showAllSeqs_actionPerformed(ActionEvent e)
2139 viewport.showAllHiddenSeqs();
2142 public void showAllColumns_actionPerformed(ActionEvent e)
2144 viewport.showAllHiddenColumns();
2148 public void hideSelSequences_actionPerformed(ActionEvent e)
2150 viewport.hideAllSelectedSeqs();
2151 alignPanel.paintAlignment(true);
2154 public void hideSelColumns_actionPerformed(ActionEvent e)
2156 viewport.hideSelectedColumns();
2157 alignPanel.paintAlignment(true);
2160 public void hiddenMarkers_actionPerformed(ActionEvent e)
2162 viewport.setShowHiddenMarkers(hiddenMarkers.isSelected());
2169 * @param e DOCUMENT ME!
2171 protected void scaleAbove_actionPerformed(ActionEvent e)
2173 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
2174 alignPanel.paintAlignment(true);
2180 * @param e DOCUMENT ME!
2182 protected void scaleLeft_actionPerformed(ActionEvent e)
2184 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
2185 alignPanel.paintAlignment(true);
2191 * @param e DOCUMENT ME!
2193 protected void scaleRight_actionPerformed(ActionEvent e)
2195 viewport.setScaleRightWrapped(scaleRight.isSelected());
2196 alignPanel.paintAlignment(true);
2202 * @param e DOCUMENT ME!
2204 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
2206 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
2207 alignPanel.paintAlignment(true);
2213 * @param e DOCUMENT ME!
2215 public void viewTextMenuItem_actionPerformed(ActionEvent e)
2217 viewport.setShowText(viewTextMenuItem.isSelected());
2218 alignPanel.paintAlignment(true);
2224 * @param e DOCUMENT ME!
2226 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
2228 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
2229 alignPanel.paintAlignment(true);
2233 public FeatureSettings featureSettings;
2234 public void featureSettings_actionPerformed(ActionEvent e)
2236 if(featureSettings !=null )
2238 featureSettings.close();
2239 featureSettings = null;
2241 featureSettings = new FeatureSettings(this);
2247 * @param evt DOCUMENT ME!
2249 public void showSeqFeatures_actionPerformed(ActionEvent evt)
2251 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
2252 alignPanel.paintAlignment(true);
2253 if (alignPanel.getOverviewPanel() != null)
2255 alignPanel.getOverviewPanel().updateOverviewImage();
2262 * @param e DOCUMENT ME!
2264 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
2266 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
2267 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
2270 public void alignmentProperties()
2272 JEditorPane editPane = new JEditorPane("text/html","");
2273 editPane.setEditable(false);
2274 StringBuffer contents = new StringBuffer("<html>");
2277 int min=Integer.MAX_VALUE, max=0;
2278 for(int i=0; i<viewport.alignment.getHeight(); i++)
2280 int size = viewport.alignment.getSequenceAt(i).getEnd()
2281 -viewport.alignment.getSequenceAt(i).getStart();
2288 avg = avg/(float)viewport.alignment.getHeight();
2290 contents.append("<br>Sequences: "+ viewport.alignment.getHeight());
2291 contents.append("<br>Minimum Sequence Length: "+min);
2292 contents.append("<br>Maximum Sequence Length: "+max);
2293 contents.append("<br>Average Length: "+(int)avg);
2295 if (((Alignment)viewport.alignment).alignmentProperties != null)
2297 Hashtable props = ((Alignment)viewport.alignment).alignmentProperties;
2298 Enumeration en = props.keys();
2299 contents.append("<br><br><table border=\"1\">");
2300 while(en.hasMoreElements())
2302 String key = en.nextElement().toString();
2303 contents.append("<tr><td>"+key+"</td><td>"+props.get(key)+"</td></tr>");
2305 contents.append("</table>");
2307 editPane.setText(contents.toString()+"</html>");
2308 JInternalFrame frame = new JInternalFrame();
2309 frame.getContentPane().add(editPane);
2311 Desktop.instance.addInternalFrame(frame,"Alignment Properties: "+getTitle(),500,400);
2318 * @param e DOCUMENT ME!
2320 public void overviewMenuItem_actionPerformed(ActionEvent e)
2322 if (alignPanel.overviewPanel != null)
2327 JInternalFrame frame = new JInternalFrame();
2328 OverviewPanel overview = new OverviewPanel(alignPanel);
2329 frame.setContentPane(overview);
2330 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
2331 frame.getWidth(), frame.getHeight());
2333 frame.setLayer(JLayeredPane.PALETTE_LAYER);
2334 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
2336 public void internalFrameClosed(
2337 javax.swing.event.InternalFrameEvent evt)
2339 alignPanel.setOverviewPanel(null);
2344 alignPanel.setOverviewPanel(overview);
2347 public void textColour_actionPerformed(ActionEvent e)
2349 new TextColourChooser().chooseColour(alignPanel, null);
2355 * @param e DOCUMENT ME!
2357 protected void noColourmenuItem_actionPerformed(ActionEvent e)
2365 * @param e DOCUMENT ME!
2367 public void clustalColour_actionPerformed(ActionEvent e)
2369 changeColour(new ClustalxColourScheme(
2370 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
2376 * @param e DOCUMENT ME!
2378 public void zappoColour_actionPerformed(ActionEvent e)
2380 changeColour(new ZappoColourScheme());
2386 * @param e DOCUMENT ME!
2388 public void taylorColour_actionPerformed(ActionEvent e)
2390 changeColour(new TaylorColourScheme());
2396 * @param e DOCUMENT ME!
2398 public void hydrophobicityColour_actionPerformed(ActionEvent e)
2400 changeColour(new HydrophobicColourScheme());
2406 * @param e DOCUMENT ME!
2408 public void helixColour_actionPerformed(ActionEvent e)
2410 changeColour(new HelixColourScheme());
2416 * @param e DOCUMENT ME!
2418 public void strandColour_actionPerformed(ActionEvent e)
2420 changeColour(new StrandColourScheme());
2426 * @param e DOCUMENT ME!
2428 public void turnColour_actionPerformed(ActionEvent e)
2430 changeColour(new TurnColourScheme());
2436 * @param e DOCUMENT ME!
2438 public void buriedColour_actionPerformed(ActionEvent e)
2440 changeColour(new BuriedColourScheme());
2446 * @param e DOCUMENT ME!
2448 public void nucleotideColour_actionPerformed(ActionEvent e)
2450 changeColour(new NucleotideColourScheme());
2453 public void annotationColour_actionPerformed(ActionEvent e)
2455 new AnnotationColourChooser(viewport, alignPanel);
2462 * @param e DOCUMENT ME!
2464 protected void applyToAllGroups_actionPerformed(ActionEvent e)
2466 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
2472 * @param cs DOCUMENT ME!
2474 public void changeColour(ColourSchemeI cs)
2480 if (viewport.getAbovePIDThreshold())
2482 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
2485 cs.setThreshold(threshold,
2486 viewport.getIgnoreGapsConsensus());
2488 viewport.setGlobalColourScheme(cs);
2492 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2495 if (viewport.getConservationSelected())
2498 Alignment al = (Alignment) viewport.alignment;
2499 Conservation c = new Conservation("All",
2500 ResidueProperties.propHash, 3,
2501 al.getSequences(), 0,
2505 c.verdict(false, viewport.ConsPercGaps);
2507 cs.setConservation(c);
2509 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
2514 cs.setConservation(null);
2517 cs.setConsensus(viewport.hconsensus);
2520 viewport.setGlobalColourScheme(cs);
2522 if (viewport.getColourAppliesToAllGroups())
2524 Vector groups = viewport.alignment.getGroups();
2526 for (int i = 0; i < groups.size(); i++)
2528 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
2536 if (cs instanceof ClustalxColourScheme)
2538 sg.cs = new ClustalxColourScheme(
2539 sg.getSequences(viewport.hiddenRepSequences), sg.getWidth());
2541 else if (cs instanceof UserColourScheme)
2543 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
2549 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
2551 catch (Exception ex)
2556 if (viewport.getAbovePIDThreshold()
2557 || cs instanceof PIDColourScheme
2558 || cs instanceof Blosum62ColourScheme)
2560 sg.cs.setThreshold(threshold,
2561 viewport.getIgnoreGapsConsensus());
2563 sg.cs.setConsensus(AAFrequency.calculate(
2564 sg.getSequences(viewport.hiddenRepSequences), sg.getStartRes(),
2569 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2573 if (viewport.getConservationSelected())
2575 Conservation c = new Conservation("Group",
2576 ResidueProperties.propHash, 3,
2577 sg.getSequences(viewport.
2578 hiddenRepSequences),
2582 c.verdict(false, viewport.ConsPercGaps);
2583 sg.cs.setConservation(c);
2587 sg.cs.setConservation(null);
2592 if (alignPanel.getOverviewPanel() != null)
2594 alignPanel.getOverviewPanel().updateOverviewImage();
2600 alignPanel.paintAlignment(true);
2606 * @param e DOCUMENT ME!
2608 protected void modifyPID_actionPerformed(ActionEvent e)
2610 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
2612 SliderPanel.setPIDSliderSource(alignPanel,
2613 viewport.getGlobalColourScheme(),
2615 SliderPanel.showPIDSlider();
2622 * @param e DOCUMENT ME!
2624 protected void modifyConservation_actionPerformed(ActionEvent e)
2626 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
2628 SliderPanel.setConservationSlider(alignPanel,
2629 viewport.globalColourScheme,
2631 SliderPanel.showConservationSlider();
2638 * @param e DOCUMENT ME!
2640 protected void conservationMenuItem_actionPerformed(ActionEvent e)
2642 viewport.setConservationSelected(conservationMenuItem.isSelected());
2644 viewport.setAbovePIDThreshold(false);
2645 abovePIDThreshold.setSelected(false);
2647 changeColour(viewport.getGlobalColourScheme());
2649 modifyConservation_actionPerformed(null);
2655 * @param e DOCUMENT ME!
2657 public void abovePIDThreshold_actionPerformed(ActionEvent e)
2659 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
2661 conservationMenuItem.setSelected(false);
2662 viewport.setConservationSelected(false);
2664 changeColour(viewport.getGlobalColourScheme());
2666 modifyPID_actionPerformed(null);
2672 * @param e DOCUMENT ME!
2674 public void userDefinedColour_actionPerformed(ActionEvent e)
2676 if (e.getActionCommand().equals("User Defined..."))
2678 new UserDefinedColours(alignPanel, null);
2682 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
2683 getUserColourSchemes().get(e.getActionCommand());
2689 public void updateUserColourMenu()
2692 Component[] menuItems = colourMenu.getMenuComponents();
2693 int i, iSize = menuItems.length;
2694 for (i = 0; i < iSize; i++)
2696 if (menuItems[i].getName() != null &&
2697 menuItems[i].getName().equals("USER_DEFINED"))
2699 colourMenu.remove(menuItems[i]);
2703 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
2705 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
2706 getUserColourSchemes().keys();
2708 while (userColours.hasMoreElements())
2710 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(
2712 nextElement().toString());
2713 radioItem.setName("USER_DEFINED");
2714 radioItem.addMouseListener(new MouseAdapter()
2716 public void mousePressed(MouseEvent evt)
2718 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
2720 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
2722 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.
2724 "Remove from default list?",
2725 "Remove user defined colour",
2726 JOptionPane.YES_NO_OPTION);
2727 if(option == JOptionPane.YES_OPTION)
2729 jalview.gui.UserDefinedColours.removeColourFromDefaults(
2730 radioItem.getText());
2731 colourMenu.remove(radioItem);
2735 radioItem.addActionListener(new ActionListener()
2737 public void actionPerformed(ActionEvent evt)
2739 userDefinedColour_actionPerformed(evt);
2746 radioItem.addActionListener(new ActionListener()
2748 public void actionPerformed(ActionEvent evt)
2750 userDefinedColour_actionPerformed(evt);
2754 colourMenu.insert(radioItem, 15);
2755 colours.add(radioItem);
2763 * @param e DOCUMENT ME!
2765 public void PIDColour_actionPerformed(ActionEvent e)
2767 changeColour(new PIDColourScheme());
2773 * @param e DOCUMENT ME!
2775 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
2777 changeColour(new Blosum62ColourScheme());
2783 * @param e DOCUMENT ME!
2785 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
2787 SequenceI [] oldOrder = viewport.getAlignment().getSequencesArray();
2788 AlignmentSorter.sortByPID(viewport.getAlignment(),
2789 viewport.getAlignment().getSequenceAt(0));
2790 addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder,
2791 viewport.alignment));
2792 alignPanel.paintAlignment(true);
2798 * @param e DOCUMENT ME!
2800 public void sortIDMenuItem_actionPerformed(ActionEvent e)
2802 SequenceI [] oldOrder = viewport.getAlignment().getSequencesArray();
2803 AlignmentSorter.sortByID(viewport.getAlignment());
2804 addHistoryItem(new OrderCommand("ID Sort", oldOrder, viewport.alignment));
2805 alignPanel.paintAlignment(true);
2811 * @param e DOCUMENT ME!
2813 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
2815 SequenceI [] oldOrder = viewport.getAlignment().getSequencesArray();
2816 AlignmentSorter.sortByGroup(viewport.getAlignment());
2817 addHistoryItem(new OrderCommand("Group Sort", oldOrder, viewport.alignment));
2819 alignPanel.paintAlignment(true);
2825 * @param e DOCUMENT ME!
2827 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
2829 new RedundancyPanel(alignPanel, this);
2836 * @param e DOCUMENT ME!
2838 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
2840 if ( (viewport.getSelectionGroup() == null) ||
2841 (viewport.getSelectionGroup().getSize() < 2))
2843 JOptionPane.showInternalMessageDialog(this,
2844 "You must select at least 2 sequences.",
2845 "Invalid Selection",
2846 JOptionPane.WARNING_MESSAGE);
2850 JInternalFrame frame = new JInternalFrame();
2851 frame.setContentPane(new PairwiseAlignPanel(viewport));
2852 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
2859 * @param e DOCUMENT ME!
2861 public void PCAMenuItem_actionPerformed(ActionEvent e)
2863 if ( ( (viewport.getSelectionGroup() != null) &&
2864 (viewport.getSelectionGroup().getSize() < 4) &&
2865 (viewport.getSelectionGroup().getSize() > 0)) ||
2866 (viewport.getAlignment().getHeight() < 4))
2868 JOptionPane.showInternalMessageDialog(this,
2869 "Principal component analysis must take\n" +
2870 "at least 4 input sequences.",
2871 "Sequence selection insufficient",
2872 JOptionPane.WARNING_MESSAGE);
2877 new PCAPanel(alignPanel);
2881 public void autoCalculate_actionPerformed(ActionEvent e)
2883 viewport.autoCalculateConsensus = autoCalculate.isSelected();
2884 if(viewport.autoCalculateConsensus)
2886 viewport.firePropertyChange("alignment",
2888 viewport.getAlignment().getSequences());
2896 * @param e DOCUMENT ME!
2898 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
2900 NewTreePanel("AV", "PID", "Average distance tree using PID");
2906 * @param e DOCUMENT ME!
2908 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
2910 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
2916 * @param e DOCUMENT ME!
2918 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
2920 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
2926 * @param e DOCUMENT ME!
2928 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
2930 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
2936 * @param type DOCUMENT ME!
2937 * @param pwType DOCUMENT ME!
2938 * @param title DOCUMENT ME!
2940 void NewTreePanel(String type, String pwType, String title)
2944 if (viewport.getSelectionGroup() != null)
2946 if (viewport.getSelectionGroup().getSize() < 3)
2948 JOptionPane.showMessageDialog(Desktop.desktop,
2949 "You need to have more than two sequences selected to build a tree!",
2950 "Not enough sequences",
2951 JOptionPane.WARNING_MESSAGE);
2956 SequenceGroup sg = viewport.getSelectionGroup();
2958 /* Decide if the selection is a column region */
2959 while (s < sg.getSize())
2961 if ( ( (SequenceI) sg.getSequences(null).elementAt(s++)).getLength() <
2964 JOptionPane.showMessageDialog(Desktop.desktop,
2965 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
2966 "Try using the Pad function in the edit menu,\n" +
2967 "or one of the multiple sequence alignment web services.",
2968 "Sequences in selection are not aligned",
2969 JOptionPane.WARNING_MESSAGE);
2975 title = title + " on region";
2976 tp = new TreePanel(alignPanel, type, pwType);
2980 //are the sequences aligned?
2981 if (!viewport.alignment.isAligned())
2983 JOptionPane.showMessageDialog(Desktop.desktop,
2984 "The sequences must be aligned before creating a tree.\n" +
2985 "Try using the Pad function in the edit menu,\n" +
2986 "or one of the multiple sequence alignment web services.",
2987 "Sequences not aligned",
2988 JOptionPane.WARNING_MESSAGE);
2993 if(viewport.alignment.getHeight()<2)
2998 tp = new TreePanel(alignPanel, type, pwType);
3003 if(viewport.viewName!=null)
3005 title+= viewport.viewName+" of ";
3008 title += this.title;
3010 Desktop.addInternalFrame(tp, title, 600, 500);
3016 * @param title DOCUMENT ME!
3017 * @param order DOCUMENT ME!
3019 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
3021 final JMenuItem item = new JMenuItem("by " + title);
3023 item.addActionListener(new java.awt.event.ActionListener()
3025 public void actionPerformed(ActionEvent e)
3027 SequenceI [] oldOrder = viewport.getAlignment().getSequencesArray();
3029 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
3030 AlignmentSorter.sortBy(viewport.getAlignment(), order);
3032 addHistoryItem(new OrderCommand(order.getName(), oldOrder,
3033 viewport.alignment));
3035 alignPanel.paintAlignment(true);
3041 * Maintain the Order by->Displayed Tree menu.
3042 * Creates a new menu item for a TreePanel with an appropriate
3043 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
3044 * to remove the menu item when the treePanel is closed, and adjust
3045 * the tree leaf to sequence mapping when the alignment is modified.
3046 * @param treePanel Displayed tree window.
3047 * @param title SortBy menu item title.
3049 public void buildTreeMenu()
3051 sortByTreeMenu.removeAll();
3053 Vector comps = (Vector) PaintRefresher.components.get(viewport.
3054 getSequenceSetId());
3055 Vector treePanels = new Vector();
3056 int i, iSize = comps.size();
3057 for(i=0; i<iSize; i++)
3059 if(comps.elementAt(i) instanceof TreePanel)
3061 treePanels.add(comps.elementAt(i));
3065 iSize = treePanels.size();
3069 sortByTreeMenu.setVisible(false);
3073 sortByTreeMenu.setVisible(true);
3075 for(i=0; i<treePanels.size(); i++)
3077 TreePanel tp = (TreePanel)treePanels.elementAt(i);
3078 final JMenuItem item = new JMenuItem(tp.getTitle());
3079 final NJTree tree = ((TreePanel)treePanels.elementAt(i)).getTree();
3080 item.addActionListener(new java.awt.event.ActionListener()
3082 public void actionPerformed(ActionEvent e)
3084 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3085 AlignmentSorter.sortByTree(viewport.getAlignment(), tree);
3087 addHistoryItem(new OrderCommand("Tree Sort",
3089 viewport.alignment));
3091 alignPanel.paintAlignment(true);
3095 sortByTreeMenu.add(item);
3100 * Work out whether the whole set of sequences
3101 * or just the selected set will be submitted for multiple alignment.
3104 private jalview.datamodel.AlignmentView gatherSequencesForAlignment()
3106 // Now, check we have enough sequences
3107 AlignmentView msa = null;
3109 if ( (viewport.getSelectionGroup() != null) &&
3110 (viewport.getSelectionGroup().getSize() > 1))
3112 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
3113 /*SequenceGroup seqs = viewport.getSelectionGroup();
3115 msa = new SequenceI[sz = seqs.getSize(false)];
3117 for (int i = 0; i < sz; i++)
3119 msa[i] = (SequenceI) seqs.getSequenceAt(i);
3121 msa = viewport.getAlignmentView(true);
3125 /*Vector seqs = viewport.getAlignment().getSequences();
3127 if (seqs.size() > 1)
3129 msa = new SequenceI[seqs.size()];
3131 for (int i = 0; i < seqs.size(); i++)
3133 msa[i] = (SequenceI) seqs.elementAt(i);
3136 msa = viewport.getAlignmentView(false);
3142 * Decides what is submitted to a secondary structure prediction service,
3143 * the currently selected sequence, or the currently selected alignment
3144 * (where the first sequence in the set is the one that the prediction
3147 AlignmentView gatherSeqOrMsaForSecStrPrediction()
3149 AlignmentView seqs = null;
3151 if ( (viewport.getSelectionGroup() != null) &&
3152 (viewport.getSelectionGroup().getSize() > 0))
3154 seqs = viewport.getAlignmentView(true);
3158 seqs = viewport.getAlignmentView(false);
3160 // limit sequences - JBPNote in future - could spawn multiple prediction jobs
3161 // TODO: viewport.alignment.isAligned is a global state - the local selection may well be aligned - we preserve 2.0.8 behaviour for moment.
3162 if (!viewport.alignment.isAligned())
3164 seqs.setSequences(new SeqCigar[]
3165 {seqs.getSequences()[0]});
3172 * @param e DOCUMENT ME!
3174 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
3176 // Pick the tree file
3177 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
3180 chooser.setFileView(new JalviewFileView());
3181 chooser.setDialogTitle("Select a newick-like tree file");
3182 chooser.setToolTipText("Load a tree file");
3184 int value = chooser.showOpenDialog(null);
3186 if (value == JalviewFileChooser.APPROVE_OPTION)
3188 String choice = chooser.getSelectedFile().getPath();
3189 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
3193 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
3195 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
3197 catch (Exception ex)
3199 JOptionPane.showMessageDialog(Desktop.desktop,
3200 "Problem reading tree file",
3202 JOptionPane.WARNING_MESSAGE);
3203 ex.printStackTrace();
3209 public TreePanel ShowNewickTree(NewickFile nf, String title)
3211 return ShowNewickTree(nf,title,600,500,4,5);
3214 public TreePanel ShowNewickTree(NewickFile nf, String title,
3215 AlignmentView input)
3217 return ShowNewickTree(nf,title, input, 600,500,4,5);
3220 public TreePanel ShowNewickTree(NewickFile nf, String title, int w, int h,
3223 return ShowNewickTree(nf, title, null, w, h, x, y);
3226 * Add a treeviewer for the tree extracted from a newick file object to the current alignment view
3228 * @param nf the tree
3229 * @param title tree viewer title
3230 * @param input Associated alignment input data (or null)
3235 * @return TreePanel handle
3237 public TreePanel ShowNewickTree(NewickFile nf, String title,
3238 AlignmentView input, int w, int h, int x,
3241 TreePanel tp = null;
3247 if (nf.getTree() != null)
3249 tp = new TreePanel(alignPanel,
3258 tp.setLocation(x,y);
3262 Desktop.addInternalFrame(tp, title, w, h);
3265 catch (Exception ex)
3267 ex.printStackTrace();
3275 * Generates menu items and listener event actions for web service clients
3278 public void BuildWebServiceMenu()
3280 if ( (Discoverer.services != null)
3281 && (Discoverer.services.size() > 0))
3283 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
3284 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
3285 Vector wsmenu = new Vector();
3286 final AlignFrame af = this;
3289 // Add any Multiple Sequence Alignment Services
3290 final JMenu msawsmenu = new JMenu("Alignment");
3291 for (int i = 0, j = msaws.size(); i < j; i++)
3293 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
3295 final JMenuItem method = new JMenuItem(sh.getName());
3296 method.addActionListener(new ActionListener()
3298 public void actionPerformed(ActionEvent e)
3300 AlignmentView msa = gatherSequencesForAlignment();
3301 new jalview.ws.MsaWSClient(sh, title, msa,
3303 viewport.getAlignment().getDataset(),
3309 msawsmenu.add(method);
3310 // Deal with services that we know accept partial alignments.
3311 if (sh.getName().indexOf("lustal") > -1)
3313 // We know that ClustalWS can accept partial alignments for refinement.
3314 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
3315 methodR.addActionListener(new ActionListener()
3317 public void actionPerformed(ActionEvent e)
3319 AlignmentView msa = gatherSequencesForAlignment();
3320 new jalview.ws.MsaWSClient(sh, title, msa,
3322 viewport.getAlignment().getDataset(),
3328 msawsmenu.add(methodR);
3332 wsmenu.add(msawsmenu);
3334 if (secstrpr != null)
3336 // Add any secondary structure prediction services
3337 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
3338 for (int i = 0, j = secstrpr.size(); i < j; i++)
3340 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
3342 final JMenuItem method = new JMenuItem(sh.getName());
3343 method.addActionListener(new ActionListener()
3345 public void actionPerformed(ActionEvent e)
3347 AlignmentView msa = gatherSeqOrMsaForSecStrPrediction();
3348 if (msa.getSequences().length == 1)
3350 // Single Sequence prediction
3351 new jalview.ws.JPredClient(sh, title, false, msa, af, true);
3355 if (msa.getSequences().length > 1)
3357 // Sequence profile based prediction
3358 new jalview.ws.JPredClient(sh,
3359 title, true, msa, af, true);
3364 secstrmenu.add(method);
3366 wsmenu.add(secstrmenu);
3368 resetWebServiceMenu();
3369 for (int i = 0, j = wsmenu.size(); i < j; i++)
3371 webService.add( (JMenu) wsmenu.get(i));
3376 resetWebServiceMenu();
3377 this.webService.add(this.webServiceNoServices);
3379 // TODO: add in rediscovery function
3380 // TODO: reduce code redundancy.
3381 // TODO: group services by location as well as function.
3386 * empty the web service menu and add any ad-hoc functions
3387 * not dynamically discovered.
3390 private void resetWebServiceMenu()
3392 webService.removeAll();
3393 // Temporary hack - DBRef Fetcher always top level ws entry.
3394 JMenuItem rfetch = new JMenuItem("Fetch DB References");
3395 rfetch.setToolTipText("Retrieve and parse uniprot records for the alignment or the currently selected sequences");
3396 webService.add(rfetch);
3397 rfetch.addActionListener(new ActionListener() {
3399 public void actionPerformed(ActionEvent e)
3401 new jalview.io.DBRefFetcher(
3402 alignPanel.av.getSequenceSelection(),
3403 alignPanel.alignFrame).fetchDBRefs(false);
3409 /* public void vamsasStore_actionPerformed(ActionEvent e)
3411 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
3412 getProperty("LAST_DIRECTORY"));
3414 chooser.setFileView(new JalviewFileView());
3415 chooser.setDialogTitle("Export to Vamsas file");
3416 chooser.setToolTipText("Export");
3418 int value = chooser.showSaveDialog(this);
3420 if (value == JalviewFileChooser.APPROVE_OPTION)
3422 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
3423 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
3424 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
3430 public void showTranslation_actionPerformed(ActionEvent e)
3432 ///////////////////////////////
3433 // Collect Data to be translated/transferred
3435 SequenceI [] selection = viewport.getSequenceSelection();
3436 String [] seqstring = viewport.getViewAsString(true);
3437 AlignmentI al = null;
3439 al = jalview.analysis.Dna.CdnaTranslate(selection, seqstring, viewport.getViewAsVisibleContigs(true),
3440 viewport.getGapCharacter(), viewport.alignment.getAlignmentAnnotation(),
3441 viewport.alignment.getWidth());
3442 } catch (Exception ex) {
3444 jalview.bin.Cache.log.debug("Exception during translation.",ex);
3448 JOptionPane.showMessageDialog(Desktop.desktop,
3449 "Please select at least three bases in at least one sequence in order to perform a cDNA translation.",
3450 "Translation Failed",
3451 JOptionPane.WARNING_MESSAGE);
3453 AlignFrame af = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT);
3454 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
3463 * @param String DOCUMENT ME!
3465 public boolean parseFeaturesFile(String file, String type)
3467 boolean featuresFile = false;
3470 featuresFile = new FeaturesFile(file,
3471 type).parse(viewport.alignment.getDataset(),
3472 alignPanel.seqPanel.seqCanvas.
3473 getFeatureRenderer().featureColours,
3478 ex.printStackTrace();
3483 viewport.showSequenceFeatures = true;
3484 showSeqFeatures.setSelected(true);
3485 alignPanel.paintAlignment(true);
3488 return featuresFile;
3491 public void dragEnter(DropTargetDragEvent evt)
3494 public void dragExit(DropTargetEvent evt)
3497 public void dragOver(DropTargetDragEvent evt)
3500 public void dropActionChanged(DropTargetDragEvent evt)
3503 public void drop(DropTargetDropEvent evt)
3505 Transferable t = evt.getTransferable();
3506 java.util.List files = null;
3510 DataFlavor uriListFlavor = new DataFlavor(
3511 "text/uri-list;class=java.lang.String");
3512 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
3514 //Works on Windows and MacOSX
3515 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
3516 files = (java.util.List) t.getTransferData(DataFlavor.
3517 javaFileListFlavor);
3519 else if (t.isDataFlavorSupported(uriListFlavor))
3521 // This is used by Unix drag system
3522 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
3523 String data = (String) t.getTransferData(uriListFlavor);
3524 files = new java.util.ArrayList(1);
3525 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
3528 st.hasMoreTokens(); )
3530 String s = st.nextToken();
3531 if (s.startsWith("#"))
3533 // the line is a comment (as per the RFC 2483)
3537 java.net.URI uri = new java.net.URI(s);
3538 java.io.File file = new java.io.File(uri);
3545 e.printStackTrace();
3552 for (int i = 0; i < files.size(); i++)
3554 loadJalviewDataFile(files.get(i).toString());
3557 catch (Exception ex)
3559 ex.printStackTrace();
3564 // This method will attempt to load a "dropped" file first by testing
3565 // whether its and Annotation file, then features file. If both are
3566 // false then the user may have dropped an alignment file onto this
3568 public void loadJalviewDataFile(String file)
3572 String protocol = "File";
3574 if (file.indexOf("http:") > -1 || file.indexOf("file:") > -1)
3579 boolean isAnnotation = new AnnotationFile().readAnnotationFile(viewport.
3580 alignment, file, protocol);
3584 boolean isGroupsFile = parseFeaturesFile(file,protocol);
3587 String format = new IdentifyFile().Identify(file, protocol);
3589 if(format.equalsIgnoreCase("JnetFile"))
3591 jalview.io.JPredFile predictions = new jalview.io.JPredFile(
3593 new JnetAnnotationMaker().add_annotation(predictions,
3594 viewport.getAlignment(),
3596 alignPanel.adjustAnnotationHeight();
3597 alignPanel.paintAlignment(true);
3601 new FileLoader().LoadFile(viewport, file, protocol, format);
3608 alignPanel.adjustAnnotationHeight();
3612 catch (Exception ex)
3614 ex.printStackTrace();
3618 public void tabSelectionChanged(int index)
3622 alignPanel = (AlignmentPanel) alignPanels.elementAt(index);
3623 viewport = alignPanel.av;
3624 setMenusFromViewport(viewport);
3628 public void tabbedPane_mousePressed(MouseEvent e)
3630 if(SwingUtilities.isRightMouseButton(e))
3632 String reply = JOptionPane.showInternalInputDialog(this,
3635 JOptionPane.QUESTION_MESSAGE);
3639 viewport.viewName = reply;
3640 tabbedPane.setTitleAt( tabbedPane.getSelectedIndex() ,reply);
3646 public AlignViewport getCurrentView()
3656 public PrintThread(AlignmentPanel ap)
3660 static PageFormat pf;
3663 PrinterJob printJob = PrinterJob.getPrinterJob();
3667 printJob.setPrintable(ap, pf);
3671 printJob.setPrintable(ap);
3674 if (printJob.printDialog())
3680 catch (Exception PrintException)
3682 PrintException.printStackTrace();