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()
919 public void associatedData_actionPerformed(ActionEvent e)
921 // Pick the tree file
922 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
925 chooser.setFileView(new JalviewFileView());
926 chooser.setDialogTitle("Load Jalview Annotations or Features File");
927 chooser.setToolTipText("Load Jalview Annotations / Features file");
929 int value = chooser.showOpenDialog(null);
931 if (value == JalviewFileChooser.APPROVE_OPTION)
933 String choice = chooser.getSelectedFile().getPath();
934 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
935 loadJalviewDataFile(choice);
944 * @param e DOCUMENT ME!
946 public void closeMenuItem_actionPerformed(boolean closeAllTabs)
948 if(alignPanels!=null && alignPanels.size()<2)
955 if(alignPanels!=null)
959 for (int i = 0; i < alignPanels.size(); i++)
961 AlignmentPanel ap = (AlignmentPanel) alignPanels.elementAt(i);
962 jalview.structure.StructureSelectionManager.getStructureSelectionManager()
963 .removeStructureViewerListener(ap.seqPanel, null);
964 PaintRefresher.RemoveComponent(ap.seqPanel.seqCanvas);
965 PaintRefresher.RemoveComponent(ap.idPanel.idCanvas);
966 PaintRefresher.RemoveComponent(ap);
967 ap.av.alignment = null;
972 int index = tabbedPane.getSelectedIndex();
974 alignPanels.removeElement(alignPanel);
975 PaintRefresher.RemoveComponent(alignPanel.seqPanel.seqCanvas);
976 PaintRefresher.RemoveComponent(alignPanel.idPanel.idCanvas);
977 PaintRefresher.RemoveComponent(alignPanel);
978 viewport.alignment = null;
982 tabbedPane.removeTabAt(index);
983 tabbedPane.validate();
985 if(index==tabbedPane.getTabCount())
990 this.tabSelectionChanged(index);
996 this.setClosed(true);
1001 ex.printStackTrace();
1009 void updateEditMenuBar()
1012 if (viewport.historyList.size() > 0)
1014 undoMenuItem.setEnabled(true);
1015 CommandI command = (CommandI) viewport.historyList.peek();
1016 undoMenuItem.setText("Undo " + command.getDescription());
1020 undoMenuItem.setEnabled(false);
1021 undoMenuItem.setText("Undo");
1024 if (viewport.redoList.size() > 0)
1026 redoMenuItem.setEnabled(true);
1028 CommandI command = (CommandI) viewport.redoList.peek();
1029 redoMenuItem.setText("Redo " + command.getDescription());
1033 redoMenuItem.setEnabled(false);
1034 redoMenuItem.setText("Redo");
1039 public void addHistoryItem(CommandI command)
1041 if(command.getSize()>0)
1043 viewport.historyList.push(command);
1044 viewport.redoList.clear();
1045 updateEditMenuBar();
1046 viewport.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;
1055 * @param e DOCUMENT ME!
1057 protected void undoMenuItem_actionPerformed(ActionEvent e)
1059 CommandI command = (CommandI)viewport.historyList.pop();
1060 viewport.redoList.push(command);
1061 command.undoCommand();
1063 AlignViewport originalSource = getOriginatingSource(command);
1064 updateEditMenuBar();
1066 if(originalSource!=null)
1068 originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;
1069 originalSource.firePropertyChange("alignment",
1071 originalSource.alignment.getSequences());
1078 * @param e DOCUMENT ME!
1080 protected void redoMenuItem_actionPerformed(ActionEvent e)
1082 if(viewport.redoList.size()<1)
1087 CommandI command = (CommandI) viewport.redoList.pop();
1088 viewport.historyList.push(command);
1089 command.doCommand();
1091 AlignViewport originalSource = getOriginatingSource(command);
1092 updateEditMenuBar();
1094 if(originalSource!=null)
1096 originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;
1097 originalSource.firePropertyChange("alignment",
1099 originalSource.alignment.getSequences());
1103 AlignViewport getOriginatingSource(CommandI command)
1105 AlignViewport originalSource = null;
1106 //For sequence removal and addition, we need to fire
1107 //the property change event FROM the viewport where the
1108 //original alignment was altered
1110 if (command instanceof EditCommand)
1112 EditCommand editCommand = (EditCommand) command;
1113 al = editCommand.getAlignment();
1114 Vector comps = (Vector) PaintRefresher.components
1115 .get(viewport.getSequenceSetId());
1117 for (int i = 0; i < comps.size(); i++)
1119 if (comps.elementAt(i) instanceof AlignmentPanel)
1121 if (al == ( (AlignmentPanel) comps.elementAt(i)).av.alignment)
1123 originalSource = ( (AlignmentPanel) comps.elementAt(i)).av;
1130 if (originalSource == null)
1132 //The original view is closed, we must validate
1133 //the current view against the closed view first
1136 PaintRefresher.validateSequences(al, viewport.alignment);
1139 originalSource = viewport;
1142 return originalSource;
1148 * @param up DOCUMENT ME!
1150 public void moveSelectedSequences(boolean up)
1152 SequenceGroup sg = viewport.getSelectionGroup();
1161 for (int i = 1; i < viewport.alignment.getHeight(); i++)
1163 SequenceI seq = viewport.alignment.getSequenceAt(i);
1165 if (!sg.getSequences(null).contains(seq))
1170 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
1172 if (sg.getSequences(null).contains(temp))
1177 viewport.alignment.getSequences().setElementAt(temp, i);
1178 viewport.alignment.getSequences().setElementAt(seq, i - 1);
1183 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
1185 SequenceI seq = viewport.alignment.getSequenceAt(i);
1187 if (!sg.getSequences(null).contains(seq))
1192 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
1194 if (sg.getSequences(null).contains(temp))
1199 viewport.alignment.getSequences().setElementAt(temp, i);
1200 viewport.alignment.getSequences().setElementAt(seq, i + 1);
1204 alignPanel.paintAlignment(true);
1210 synchronized void slideSequences(boolean right, int size)
1212 Vector sg = new Vector();
1213 if(viewport.cursorMode)
1215 sg.addElement(viewport.alignment.getSequenceAt(
1216 alignPanel.seqPanel.seqCanvas.cursorY));
1218 else if(viewport.getSelectionGroup()!=null
1219 && viewport.getSelectionGroup().getSize()!=viewport.alignment.getHeight())
1221 sg = viewport.getSelectionGroup().getSequences(
1222 viewport.hiddenRepSequences);
1230 Vector invertGroup = new Vector();
1232 for (int i = 0; i < viewport.alignment.getHeight(); i++)
1234 if(!sg.contains(viewport.alignment.getSequenceAt(i)))
1235 invertGroup.add(viewport.alignment.getSequenceAt(i));
1238 SequenceI[] seqs1 = new SequenceI[sg.size()];
1239 for (int i = 0; i < sg.size(); i++)
1240 seqs1[i] = (SequenceI) sg.elementAt(i);
1242 SequenceI[] seqs2 = new SequenceI[invertGroup.size()];
1243 for (int i = 0; i < invertGroup.size(); i++)
1244 seqs2[i] = (SequenceI) invertGroup.elementAt(i);
1246 SlideSequencesCommand ssc;
1248 ssc = new SlideSequencesCommand("Slide Sequences",
1250 viewport.getGapCharacter()
1253 ssc = new SlideSequencesCommand("Slide Sequences",
1255 viewport.getGapCharacter()
1258 int groupAdjustment = 0;
1259 if (ssc.getGapsInsertedBegin() && right)
1261 if (viewport.cursorMode)
1262 alignPanel.seqPanel.moveCursor(size, 0);
1264 groupAdjustment = size;
1266 else if (!ssc.getGapsInsertedBegin() && !right)
1268 if (viewport.cursorMode)
1269 alignPanel.seqPanel.moveCursor( -size, 0);
1271 groupAdjustment = -size;
1274 if (groupAdjustment != 0)
1276 viewport.getSelectionGroup().setStartRes(
1277 viewport.getSelectionGroup().getStartRes() + groupAdjustment);
1278 viewport.getSelectionGroup().setEndRes(
1279 viewport.getSelectionGroup().getEndRes() + groupAdjustment);
1283 boolean appendHistoryItem = false;
1284 if(viewport.historyList!=null
1285 && viewport.historyList.size()>0
1286 && viewport.historyList.peek() instanceof SlideSequencesCommand)
1288 appendHistoryItem = ssc.appendSlideCommand(
1289 (SlideSequencesCommand)viewport.historyList.peek())
1293 if(!appendHistoryItem)
1294 addHistoryItem(ssc);
1303 * @param e DOCUMENT ME!
1305 protected void copy_actionPerformed(ActionEvent e)
1308 if (viewport.getSelectionGroup() == null)
1313 SequenceI [] seqs = viewport.getSelectionAsNewSequence();
1314 String[] omitHidden = null;
1316 if (viewport.hasHiddenColumns)
1318 omitHidden = viewport.getViewAsString(true);
1321 String output = new FormatAdapter().formatSequences(
1326 StringSelection ss = new StringSelection(output);
1330 jalview.gui.Desktop.internalCopy = true;
1331 //Its really worth setting the clipboard contents
1332 //to empty before setting the large StringSelection!!
1333 Toolkit.getDefaultToolkit().getSystemClipboard()
1334 .setContents(new StringSelection(""), null);
1336 Toolkit.getDefaultToolkit().getSystemClipboard()
1337 .setContents(ss, Desktop.instance);
1339 catch (OutOfMemoryError er)
1341 er.printStackTrace();
1342 javax.swing.SwingUtilities.invokeLater(new Runnable()
1346 javax.swing.JOptionPane.showInternalMessageDialog(Desktop.desktop,
1347 "Out of memory copying region!!"
1349 "\nSee help files for increasing Java Virtual Machine memory."
1351 javax.swing.JOptionPane.WARNING_MESSAGE);
1358 Vector hiddenColumns = null;
1359 if(viewport.hasHiddenColumns)
1361 hiddenColumns =new Vector();
1362 int hiddenOffset = viewport.getSelectionGroup().getStartRes();
1363 for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns().size();
1366 int[] region = (int[])
1367 viewport.getColumnSelection().getHiddenColumns().elementAt(i);
1369 hiddenColumns.addElement(new int[]
1370 {region[0] - hiddenOffset,
1371 region[1]-hiddenOffset});
1375 Desktop.jalviewClipboard = new Object[]
1378 viewport.alignment.getDataset(),
1380 statusBar.setText("Copied "+seqs.length+" sequences to clipboard.");
1386 * @param e DOCUMENT ME!
1388 protected void pasteNew_actionPerformed(ActionEvent e)
1396 * @param e DOCUMENT ME!
1398 protected void pasteThis_actionPerformed(ActionEvent e)
1406 * @param newAlignment DOCUMENT ME!
1408 void paste(boolean newAlignment)
1410 boolean externalPaste=true;
1413 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
1414 Transferable contents = c.getContents(this);
1416 if (contents == null)
1424 str = (String) contents.getTransferData(DataFlavor.stringFlavor);
1425 if (str.length() < 1)
1430 format = new IdentifyFile().Identify(str, "Paste");
1433 catch (OutOfMemoryError er)
1435 er.printStackTrace();
1436 javax.swing.SwingUtilities.invokeLater(new Runnable()
1440 javax.swing.JOptionPane.showInternalMessageDialog(Desktop.desktop,
1441 "Out of memory pasting sequences!!"
1443 "\nSee help files for increasing Java Virtual Machine memory."
1445 javax.swing.JOptionPane.WARNING_MESSAGE);
1452 SequenceI[] sequences;
1453 boolean annotationAdded = false;
1454 AlignmentI alignment = null;
1456 if(Desktop.jalviewClipboard!=null)
1458 // The clipboard was filled from within Jalview, we must use the sequences
1459 // And dataset from the copied alignment
1460 SequenceI[] newseq = (SequenceI[])Desktop.jalviewClipboard[0];
1461 // be doubly sure that we create *new* sequence objects.
1462 sequences = new SequenceI[newseq.length];
1463 for (int i=0;i<newseq.length;i++) {
1464 sequences[i] = new Sequence(newseq[i]);
1466 alignment = new Alignment(sequences);
1467 externalPaste = false;
1471 // parse the clipboard as an alignment.
1472 alignment = new FormatAdapter().readFile(str, "Paste", format);
1473 sequences = alignment.getSequencesArray();
1480 if (Desktop.jalviewClipboard != null)
1482 // dataset is inherited
1483 alignment.setDataset( (Alignment) Desktop.jalviewClipboard[1]);
1487 // new dataset is constructed
1488 alignment.setDataset(null);
1493 AlignmentI pastedal = alignment; // preserve pasted alignment object
1494 // Add pasted sequences and dataset into existing alignment.
1495 alignment = viewport.getAlignment();
1496 // decide if we need to import sequences from an existing dataset
1497 boolean importDs = Desktop.jalviewClipboard != null
1498 && Desktop.jalviewClipboard[1] != alignment.getDataset();
1499 // importDs==true instructs us to copy over new dataset sequences from
1500 // an existing alignment
1501 Vector newDs = (importDs) ? new Vector() : null; // used to create
1502 // minimum dataset set
1504 for (int i = 0; i < sequences.length; i++)
1508 newDs.addElement(null);
1510 SequenceI ds = sequences[i].getDatasetSequence(); // null for a simple
1512 if (importDs && ds != null)
1514 if (!newDs.contains(ds))
1516 newDs.setElementAt(ds, i);
1517 ds = new Sequence(ds);
1518 // update with new dataset sequence
1519 sequences[i].setDatasetSequence(ds);
1523 ds = sequences[newDs.indexOf(ds)].getDatasetSequence();
1528 // copy and derive new dataset sequence
1529 sequences[i] = sequences[i].deriveSequence();
1530 alignment.getDataset().addSequence(sequences[i].getDatasetSequence());
1531 // TODO: avoid creation of duplicate dataset sequences with a
1532 // 'contains' method using SequenceI.equals()/SequenceI.contains()
1534 alignment.addSequence(sequences[i]); // merges dataset
1538 newDs.clear(); // tidy up
1540 if (pastedal.getAlignmentAnnotation()!=null) {
1541 // Add any annotation attached to alignment.
1542 AlignmentAnnotation[] alann = pastedal.getAlignmentAnnotation();
1543 for (int i=0; i<alann.length; i++)
1545 annotationAdded=true;
1546 if (alann[i].sequenceRef==null && !alann[i].autoCalculated) {
1547 alignment.addAnnotation(new AlignmentAnnotation(alann[i]));
1552 if (!newAlignment) {
1556 addHistoryItem(new EditCommand(
1561 alignment.getWidth(),
1565 // Add any annotations attached to sequences
1566 for (int i = 0; i < sequences.length; i++)
1568 if (sequences[i].getAnnotation() != null)
1570 for (int a = 0; a < sequences[i].getAnnotation().length; a++)
1572 annotationAdded=true;
1573 sequences[i].getAnnotation()[a].adjustForAlignment();
1574 alignment.addAnnotation(sequences[i].getAnnotation()[a]); // annotation was duplicated earlier
1575 alignment.setAnnotationIndex(sequences[i].getAnnotation()[a], a);
1581 if (!newAlignment) {
1582 // propagate alignment changed.
1583 viewport.setEndSeq(alignment.getHeight());
1584 if (annotationAdded)
1586 alignPanel.annotationPanel.adjustPanelHeight();
1588 viewport.firePropertyChange("alignment", null, alignment.getSequences());
1590 AlignFrame af = new AlignFrame(alignment, DEFAULT_WIDTH, DEFAULT_HEIGHT);
1591 String newtitle = new String("Copied sequences");
1593 if(Desktop.jalviewClipboard!=null && Desktop.jalviewClipboard[2]!=null)
1595 Vector hc = (Vector)Desktop.jalviewClipboard[2];
1596 for(int i=0; i<hc.size(); i++)
1598 int [] region = (int[]) hc.elementAt(i);
1599 af.viewport.hideColumns(region[0], region[1]);
1604 //>>>This is a fix for the moment, until a better solution is found!!<<<
1605 af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().transferSettings(
1606 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
1608 // TODO: maintain provenance of an alignment, rather than just make the title a concatenation of operations.
1609 if (!externalPaste) {
1610 if (title.startsWith("Copied sequences"))
1616 newtitle = newtitle.concat("- from " + title);
1619 newtitle = new String("Pasted sequences");
1622 Desktop.addInternalFrame(af, newtitle, DEFAULT_WIDTH,
1629 catch (Exception ex)
1631 ex.printStackTrace();
1632 System.out.println("Exception whilst pasting: "+ex);
1633 // could be anything being pasted in here
1642 * @param e DOCUMENT ME!
1644 protected void cut_actionPerformed(ActionEvent e)
1646 copy_actionPerformed(null);
1647 delete_actionPerformed(null);
1653 * @param e DOCUMENT ME!
1655 protected void delete_actionPerformed(ActionEvent evt)
1658 SequenceGroup sg = viewport.getSelectionGroup();
1664 Vector seqs = new Vector();
1666 for (int i = 0; i < sg.getSize(); i++)
1668 seq = sg.getSequenceAt(i);
1669 seqs.addElement(seq);
1673 // If the cut affects all sequences, remove highlighted columns
1674 if (sg.getSize() == viewport.alignment.getHeight())
1676 viewport.getColumnSelection().removeElements(sg.getStartRes(),
1677 sg.getEndRes() + 1);
1681 SequenceI [] cut = new SequenceI[seqs.size()];
1682 for(int i=0; i<seqs.size(); i++)
1684 cut[i] = (SequenceI)seqs.elementAt(i);
1691 addHistoryItem(new EditCommand("Cut Sequences",
1695 sg.getEndRes()-sg.getStartRes()+1,
1696 viewport.alignment));
1699 viewport.setSelectionGroup(null);
1700 viewport.alignment.deleteGroup(sg);
1702 viewport.firePropertyChange("alignment", null,
1703 viewport.getAlignment().getSequences());
1705 if (viewport.getAlignment().getHeight() < 1)
1709 this.setClosed(true);
1711 catch (Exception ex)
1720 * @param e DOCUMENT ME!
1722 protected void deleteGroups_actionPerformed(ActionEvent e)
1724 viewport.alignment.deleteAllGroups();
1725 viewport.sequenceColours = null;
1726 viewport.setSelectionGroup(null);
1727 PaintRefresher.Refresh(this, viewport.getSequenceSetId());
1728 alignPanel.paintAlignment(true);
1734 * @param e DOCUMENT ME!
1736 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
1738 SequenceGroup sg = new SequenceGroup();
1740 for (int i = 0; i < viewport.getAlignment().getSequences().size();
1743 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
1746 sg.setEndRes(viewport.alignment.getWidth() - 1);
1747 viewport.setSelectionGroup(sg);
1748 alignPanel.paintAlignment(true);
1749 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1755 * @param e DOCUMENT ME!
1757 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
1759 if(viewport.cursorMode)
1761 alignPanel.seqPanel.keyboardNo1 = null;
1762 alignPanel.seqPanel.keyboardNo2 = null;
1764 viewport.setSelectionGroup(null);
1765 viewport.getColumnSelection().clear();
1766 viewport.setSelectionGroup(null);
1767 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
1768 alignPanel.idPanel.idCanvas.searchResults = null;
1769 alignPanel.paintAlignment(true);
1770 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1776 * @param e DOCUMENT ME!
1778 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
1780 SequenceGroup sg = viewport.getSelectionGroup();
1784 selectAllSequenceMenuItem_actionPerformed(null);
1789 for (int i = 0; i < viewport.getAlignment().getSequences().size();
1792 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
1795 alignPanel.paintAlignment(true);
1797 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1800 public void invertColSel_actionPerformed(ActionEvent e)
1802 viewport.invertColumnSelection();
1803 alignPanel.paintAlignment(true);
1810 * @param e DOCUMENT ME!
1812 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
1814 trimAlignment(true);
1820 * @param e DOCUMENT ME!
1822 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
1824 trimAlignment(false);
1827 void trimAlignment(boolean trimLeft)
1829 ColumnSelection colSel = viewport.getColumnSelection();
1832 if (colSel.size() > 0)
1836 column = colSel.getMin();
1840 column = colSel.getMax();
1844 if(viewport.getSelectionGroup()!=null)
1846 seqs = viewport.getSelectionGroup().getSequencesAsArray(viewport.
1847 hiddenRepSequences);
1851 seqs = viewport.alignment.getSequencesArray();
1855 TrimRegionCommand trimRegion;
1858 trimRegion = new TrimRegionCommand("Remove Left",
1859 TrimRegionCommand.TRIM_LEFT,
1864 viewport.selectionGroup);
1865 viewport.setStartRes(0);
1869 trimRegion = new TrimRegionCommand("Remove Right",
1870 TrimRegionCommand.TRIM_RIGHT,
1875 viewport.selectionGroup);
1878 statusBar.setText("Removed "+trimRegion.getSize()+" columns.");
1881 addHistoryItem(trimRegion);
1883 Vector groups = viewport.alignment.getGroups();
1885 for (int i = 0; i < groups.size(); i++)
1887 SequenceGroup sg = (SequenceGroup) groups.get(i);
1889 if ( (trimLeft && !sg.adjustForRemoveLeft(column))
1890 || (!trimLeft && !sg.adjustForRemoveRight(column)))
1892 viewport.alignment.deleteGroup(sg);
1896 viewport.firePropertyChange("alignment", null,
1897 viewport.getAlignment().getSequences());
1904 * @param e DOCUMENT ME!
1906 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
1908 int start = 0, end = viewport.alignment.getWidth()-1;
1911 if (viewport.getSelectionGroup() != null)
1913 seqs = viewport.getSelectionGroup().getSequencesAsArray(viewport.
1914 hiddenRepSequences);
1915 start = viewport.getSelectionGroup().getStartRes();
1916 end = viewport.getSelectionGroup().getEndRes();
1920 seqs = viewport.alignment.getSequencesArray();
1924 RemoveGapColCommand removeGapCols =
1925 new RemoveGapColCommand("Remove Gapped Columns",
1928 viewport.alignment);
1930 addHistoryItem(removeGapCols);
1932 statusBar.setText("Removed "+removeGapCols.getSize()+" empty columns.");
1934 //This is to maintain viewport position on first residue
1936 SequenceI seq = viewport.alignment.getSequenceAt(0);
1937 int startRes = seq.findPosition(viewport.startRes);
1938 // ShiftList shifts;
1939 // viewport.getAlignment().removeGaps(shifts=new ShiftList());
1940 // edit.alColumnChanges=shifts.getInverse();
1941 // if (viewport.hasHiddenColumns)
1942 // viewport.getColumnSelection().compensateForEdits(shifts);
1943 viewport.setStartRes(seq.findIndex(startRes)-1);
1944 viewport.firePropertyChange("alignment", null,
1945 viewport.getAlignment().getSequences());
1952 * @param e DOCUMENT ME!
1954 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
1956 int start = 0, end = viewport.alignment.getWidth()-1;
1959 if (viewport.getSelectionGroup() != null)
1961 seqs = viewport.getSelectionGroup().getSequencesAsArray(viewport.
1962 hiddenRepSequences);
1963 start = viewport.getSelectionGroup().getStartRes();
1964 end = viewport.getSelectionGroup().getEndRes();
1968 seqs = viewport.alignment.getSequencesArray();
1971 //This is to maintain viewport position on first residue
1973 SequenceI seq = viewport.alignment.getSequenceAt(0);
1974 int startRes = seq.findPosition(viewport.startRes);
1976 addHistoryItem(new RemoveGapsCommand("Remove Gaps",
1979 viewport.alignment));
1981 viewport.setStartRes(seq.findIndex(startRes)-1);
1983 viewport.firePropertyChange("alignment", null,
1984 viewport.getAlignment().getSequences());
1991 * @param e DOCUMENT ME!
1993 public void padGapsMenuitem_actionPerformed(ActionEvent e)
1995 viewport.padGaps = padGapsMenuitem.isSelected();
1997 viewport.firePropertyChange("alignment",
1999 viewport.getAlignment().getSequences());
2005 * @param e DOCUMENT ME!
2007 public void findMenuItem_actionPerformed(ActionEvent e)
2012 public void newView_actionPerformed(ActionEvent e)
2014 AlignmentPanel newap =
2015 new Jalview2XML().copyAlignPanel(alignPanel, true);
2017 newap.av.gatherViewsHere = false;
2019 if (viewport.viewName == null)
2021 viewport.viewName = "Original";
2024 newap.av.historyList = viewport.historyList;
2025 newap.av.redoList = viewport.redoList;
2027 int index = Desktop.getViewCount(viewport.getSequenceSetId());
2028 String newViewName = "View " +index;
2030 Vector comps = (Vector) PaintRefresher.components.get(viewport.
2031 getSequenceSetId());
2032 Vector existingNames = new Vector();
2033 for(int i=0; i<comps.size(); i++)
2035 if(comps.elementAt(i) instanceof AlignmentPanel)
2037 AlignmentPanel ap = (AlignmentPanel)comps.elementAt(i);
2038 if(!existingNames.contains(ap.av.viewName))
2040 existingNames.addElement(ap.av.viewName);
2045 while(existingNames.contains(newViewName))
2047 newViewName = "View "+ (++index);
2050 newap.av.viewName = newViewName;
2052 addAlignmentPanel(newap, false);
2054 if(alignPanels.size()==2)
2056 viewport.gatherViewsHere = true;
2058 tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1);
2061 public void expandViews_actionPerformed(ActionEvent e)
2063 Desktop.instance.explodeViews(this);
2066 public void gatherViews_actionPerformed(ActionEvent e)
2068 Desktop.instance.gatherViews(this);
2076 * @param e DOCUMENT ME!
2078 public void font_actionPerformed(ActionEvent e)
2080 new FontChooser(alignPanel);
2087 * @param e DOCUMENT ME!
2089 protected void seqLimit_actionPerformed(ActionEvent e)
2091 viewport.setShowJVSuffix(seqLimits.isSelected());
2093 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
2094 alignPanel.paintAlignment(true);
2097 public void idRightAlign_actionPerformed(ActionEvent e)
2099 viewport.rightAlignIds = idRightAlign.isSelected();
2100 alignPanel.paintAlignment(true);
2108 * @param e DOCUMENT ME!
2110 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
2112 viewport.setColourText(colourTextMenuItem.isSelected());
2113 alignPanel.paintAlignment(true);
2119 * @param e DOCUMENT ME!
2121 public void wrapMenuItem_actionPerformed(ActionEvent e)
2123 scaleAbove.setVisible(wrapMenuItem.isSelected());
2124 scaleLeft.setVisible(wrapMenuItem.isSelected());
2125 scaleRight.setVisible(wrapMenuItem.isSelected());
2126 viewport.setWrapAlignment(wrapMenuItem.isSelected());
2127 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
2130 public void showAllSeqs_actionPerformed(ActionEvent e)
2132 viewport.showAllHiddenSeqs();
2135 public void showAllColumns_actionPerformed(ActionEvent e)
2137 viewport.showAllHiddenColumns();
2141 public void hideSelSequences_actionPerformed(ActionEvent e)
2143 viewport.hideAllSelectedSeqs();
2144 alignPanel.paintAlignment(true);
2147 public void hideSelColumns_actionPerformed(ActionEvent e)
2149 viewport.hideSelectedColumns();
2150 alignPanel.paintAlignment(true);
2153 public void hiddenMarkers_actionPerformed(ActionEvent e)
2155 viewport.setShowHiddenMarkers(hiddenMarkers.isSelected());
2162 * @param e DOCUMENT ME!
2164 protected void scaleAbove_actionPerformed(ActionEvent e)
2166 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
2167 alignPanel.paintAlignment(true);
2173 * @param e DOCUMENT ME!
2175 protected void scaleLeft_actionPerformed(ActionEvent e)
2177 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
2178 alignPanel.paintAlignment(true);
2184 * @param e DOCUMENT ME!
2186 protected void scaleRight_actionPerformed(ActionEvent e)
2188 viewport.setScaleRightWrapped(scaleRight.isSelected());
2189 alignPanel.paintAlignment(true);
2195 * @param e DOCUMENT ME!
2197 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
2199 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
2200 alignPanel.paintAlignment(true);
2206 * @param e DOCUMENT ME!
2208 public void viewTextMenuItem_actionPerformed(ActionEvent e)
2210 viewport.setShowText(viewTextMenuItem.isSelected());
2211 alignPanel.paintAlignment(true);
2217 * @param e DOCUMENT ME!
2219 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
2221 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
2222 alignPanel.paintAlignment(true);
2226 public FeatureSettings featureSettings;
2227 public void featureSettings_actionPerformed(ActionEvent e)
2229 if(featureSettings !=null )
2231 featureSettings.close();
2232 featureSettings = null;
2234 featureSettings = new FeatureSettings(this);
2240 * @param evt DOCUMENT ME!
2242 public void showSeqFeatures_actionPerformed(ActionEvent evt)
2244 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
2245 alignPanel.paintAlignment(true);
2246 if (alignPanel.getOverviewPanel() != null)
2248 alignPanel.getOverviewPanel().updateOverviewImage();
2255 * @param e DOCUMENT ME!
2257 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
2259 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
2260 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
2266 * @param e DOCUMENT ME!
2268 public void overviewMenuItem_actionPerformed(ActionEvent e)
2270 if (alignPanel.overviewPanel != null)
2275 JInternalFrame frame = new JInternalFrame();
2276 OverviewPanel overview = new OverviewPanel(alignPanel);
2277 frame.setContentPane(overview);
2278 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
2279 frame.getWidth(), frame.getHeight());
2281 frame.setLayer(JLayeredPane.PALETTE_LAYER);
2282 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
2284 public void internalFrameClosed(
2285 javax.swing.event.InternalFrameEvent evt)
2287 alignPanel.setOverviewPanel(null);
2292 alignPanel.setOverviewPanel(overview);
2295 public void textColour_actionPerformed(ActionEvent e)
2297 new TextColourChooser().chooseColour(alignPanel, null);
2303 * @param e DOCUMENT ME!
2305 protected void noColourmenuItem_actionPerformed(ActionEvent e)
2313 * @param e DOCUMENT ME!
2315 public void clustalColour_actionPerformed(ActionEvent e)
2317 changeColour(new ClustalxColourScheme(
2318 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
2324 * @param e DOCUMENT ME!
2326 public void zappoColour_actionPerformed(ActionEvent e)
2328 changeColour(new ZappoColourScheme());
2334 * @param e DOCUMENT ME!
2336 public void taylorColour_actionPerformed(ActionEvent e)
2338 changeColour(new TaylorColourScheme());
2344 * @param e DOCUMENT ME!
2346 public void hydrophobicityColour_actionPerformed(ActionEvent e)
2348 changeColour(new HydrophobicColourScheme());
2354 * @param e DOCUMENT ME!
2356 public void helixColour_actionPerformed(ActionEvent e)
2358 changeColour(new HelixColourScheme());
2364 * @param e DOCUMENT ME!
2366 public void strandColour_actionPerformed(ActionEvent e)
2368 changeColour(new StrandColourScheme());
2374 * @param e DOCUMENT ME!
2376 public void turnColour_actionPerformed(ActionEvent e)
2378 changeColour(new TurnColourScheme());
2384 * @param e DOCUMENT ME!
2386 public void buriedColour_actionPerformed(ActionEvent e)
2388 changeColour(new BuriedColourScheme());
2394 * @param e DOCUMENT ME!
2396 public void nucleotideColour_actionPerformed(ActionEvent e)
2398 changeColour(new NucleotideColourScheme());
2401 public void annotationColour_actionPerformed(ActionEvent e)
2403 new AnnotationColourChooser(viewport, alignPanel);
2410 * @param e DOCUMENT ME!
2412 protected void applyToAllGroups_actionPerformed(ActionEvent e)
2414 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
2420 * @param cs DOCUMENT ME!
2422 public void changeColour(ColourSchemeI cs)
2428 if (viewport.getAbovePIDThreshold())
2430 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
2433 cs.setThreshold(threshold,
2434 viewport.getIgnoreGapsConsensus());
2436 viewport.setGlobalColourScheme(cs);
2440 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2443 if (viewport.getConservationSelected())
2446 Alignment al = (Alignment) viewport.alignment;
2447 Conservation c = new Conservation("All",
2448 ResidueProperties.propHash, 3,
2449 al.getSequences(), 0,
2453 c.verdict(false, viewport.ConsPercGaps);
2455 cs.setConservation(c);
2457 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
2462 cs.setConservation(null);
2465 cs.setConsensus(viewport.hconsensus);
2468 viewport.setGlobalColourScheme(cs);
2470 if (viewport.getColourAppliesToAllGroups())
2472 Vector groups = viewport.alignment.getGroups();
2474 for (int i = 0; i < groups.size(); i++)
2476 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
2484 if (cs instanceof ClustalxColourScheme)
2486 sg.cs = new ClustalxColourScheme(
2487 sg.getSequences(viewport.hiddenRepSequences), sg.getWidth());
2489 else if (cs instanceof UserColourScheme)
2491 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
2497 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
2499 catch (Exception ex)
2504 if (viewport.getAbovePIDThreshold()
2505 || cs instanceof PIDColourScheme
2506 || cs instanceof Blosum62ColourScheme)
2508 sg.cs.setThreshold(threshold,
2509 viewport.getIgnoreGapsConsensus());
2511 sg.cs.setConsensus(AAFrequency.calculate(
2512 sg.getSequences(viewport.hiddenRepSequences), sg.getStartRes(),
2517 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2521 if (viewport.getConservationSelected())
2523 Conservation c = new Conservation("Group",
2524 ResidueProperties.propHash, 3,
2525 sg.getSequences(viewport.
2526 hiddenRepSequences),
2530 c.verdict(false, viewport.ConsPercGaps);
2531 sg.cs.setConservation(c);
2535 sg.cs.setConservation(null);
2540 if (alignPanel.getOverviewPanel() != null)
2542 alignPanel.getOverviewPanel().updateOverviewImage();
2548 alignPanel.paintAlignment(true);
2554 * @param e DOCUMENT ME!
2556 protected void modifyPID_actionPerformed(ActionEvent e)
2558 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
2560 SliderPanel.setPIDSliderSource(alignPanel,
2561 viewport.getGlobalColourScheme(),
2563 SliderPanel.showPIDSlider();
2570 * @param e DOCUMENT ME!
2572 protected void modifyConservation_actionPerformed(ActionEvent e)
2574 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
2576 SliderPanel.setConservationSlider(alignPanel,
2577 viewport.globalColourScheme,
2579 SliderPanel.showConservationSlider();
2586 * @param e DOCUMENT ME!
2588 protected void conservationMenuItem_actionPerformed(ActionEvent e)
2590 viewport.setConservationSelected(conservationMenuItem.isSelected());
2592 viewport.setAbovePIDThreshold(false);
2593 abovePIDThreshold.setSelected(false);
2595 changeColour(viewport.getGlobalColourScheme());
2597 modifyConservation_actionPerformed(null);
2603 * @param e DOCUMENT ME!
2605 public void abovePIDThreshold_actionPerformed(ActionEvent e)
2607 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
2609 conservationMenuItem.setSelected(false);
2610 viewport.setConservationSelected(false);
2612 changeColour(viewport.getGlobalColourScheme());
2614 modifyPID_actionPerformed(null);
2620 * @param e DOCUMENT ME!
2622 public void userDefinedColour_actionPerformed(ActionEvent e)
2624 if (e.getActionCommand().equals("User Defined..."))
2626 new UserDefinedColours(alignPanel, null);
2630 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
2631 getUserColourSchemes().get(e.getActionCommand());
2637 public void updateUserColourMenu()
2640 Component[] menuItems = colourMenu.getMenuComponents();
2641 int i, iSize = menuItems.length;
2642 for (i = 0; i < iSize; i++)
2644 if (menuItems[i].getName() != null &&
2645 menuItems[i].getName().equals("USER_DEFINED"))
2647 colourMenu.remove(menuItems[i]);
2651 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
2653 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
2654 getUserColourSchemes().keys();
2656 while (userColours.hasMoreElements())
2658 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(
2660 nextElement().toString());
2661 radioItem.setName("USER_DEFINED");
2662 radioItem.addMouseListener(new MouseAdapter()
2664 public void mousePressed(MouseEvent evt)
2666 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
2668 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
2670 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.
2672 "Remove from default list?",
2673 "Remove user defined colour",
2674 JOptionPane.YES_NO_OPTION);
2675 if(option == JOptionPane.YES_OPTION)
2677 jalview.gui.UserDefinedColours.removeColourFromDefaults(
2678 radioItem.getText());
2679 colourMenu.remove(radioItem);
2683 radioItem.addActionListener(new ActionListener()
2685 public void actionPerformed(ActionEvent evt)
2687 userDefinedColour_actionPerformed(evt);
2694 radioItem.addActionListener(new ActionListener()
2696 public void actionPerformed(ActionEvent evt)
2698 userDefinedColour_actionPerformed(evt);
2702 colourMenu.insert(radioItem, 15);
2703 colours.add(radioItem);
2711 * @param e DOCUMENT ME!
2713 public void PIDColour_actionPerformed(ActionEvent e)
2715 changeColour(new PIDColourScheme());
2721 * @param e DOCUMENT ME!
2723 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
2725 changeColour(new Blosum62ColourScheme());
2731 * @param e DOCUMENT ME!
2733 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
2735 SequenceI [] oldOrder = viewport.getAlignment().getSequencesArray();
2736 AlignmentSorter.sortByPID(viewport.getAlignment(),
2737 viewport.getAlignment().getSequenceAt(0));
2738 addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder,
2739 viewport.alignment));
2740 alignPanel.paintAlignment(true);
2746 * @param e DOCUMENT ME!
2748 public void sortIDMenuItem_actionPerformed(ActionEvent e)
2750 SequenceI [] oldOrder = viewport.getAlignment().getSequencesArray();
2751 AlignmentSorter.sortByID(viewport.getAlignment());
2752 addHistoryItem(new OrderCommand("ID Sort", oldOrder, viewport.alignment));
2753 alignPanel.paintAlignment(true);
2759 * @param e DOCUMENT ME!
2761 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
2763 SequenceI [] oldOrder = viewport.getAlignment().getSequencesArray();
2764 AlignmentSorter.sortByGroup(viewport.getAlignment());
2765 addHistoryItem(new OrderCommand("Group Sort", oldOrder, viewport.alignment));
2767 alignPanel.paintAlignment(true);
2773 * @param e DOCUMENT ME!
2775 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
2777 new RedundancyPanel(alignPanel, this);
2784 * @param e DOCUMENT ME!
2786 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
2788 if ( (viewport.getSelectionGroup() == null) ||
2789 (viewport.getSelectionGroup().getSize() < 2))
2791 JOptionPane.showInternalMessageDialog(this,
2792 "You must select at least 2 sequences.",
2793 "Invalid Selection",
2794 JOptionPane.WARNING_MESSAGE);
2798 JInternalFrame frame = new JInternalFrame();
2799 frame.setContentPane(new PairwiseAlignPanel(viewport));
2800 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
2807 * @param e DOCUMENT ME!
2809 public void PCAMenuItem_actionPerformed(ActionEvent e)
2811 if ( ( (viewport.getSelectionGroup() != null) &&
2812 (viewport.getSelectionGroup().getSize() < 4) &&
2813 (viewport.getSelectionGroup().getSize() > 0)) ||
2814 (viewport.getAlignment().getHeight() < 4))
2816 JOptionPane.showInternalMessageDialog(this,
2817 "Principal component analysis must take\n" +
2818 "at least 4 input sequences.",
2819 "Sequence selection insufficient",
2820 JOptionPane.WARNING_MESSAGE);
2825 new PCAPanel(alignPanel);
2829 public void autoCalculate_actionPerformed(ActionEvent e)
2831 viewport.autoCalculateConsensus = autoCalculate.isSelected();
2832 if(viewport.autoCalculateConsensus)
2834 viewport.firePropertyChange("alignment",
2836 viewport.getAlignment().getSequences());
2844 * @param e DOCUMENT ME!
2846 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
2848 NewTreePanel("AV", "PID", "Average distance tree using PID");
2854 * @param e DOCUMENT ME!
2856 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
2858 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
2864 * @param e DOCUMENT ME!
2866 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
2868 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
2874 * @param e DOCUMENT ME!
2876 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
2878 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
2884 * @param type DOCUMENT ME!
2885 * @param pwType DOCUMENT ME!
2886 * @param title DOCUMENT ME!
2888 void NewTreePanel(String type, String pwType, String title)
2892 if (viewport.getSelectionGroup() != null)
2894 if (viewport.getSelectionGroup().getSize() < 3)
2896 JOptionPane.showMessageDialog(Desktop.desktop,
2897 "You need to have more than two sequences selected to build a tree!",
2898 "Not enough sequences",
2899 JOptionPane.WARNING_MESSAGE);
2904 SequenceGroup sg = viewport.getSelectionGroup();
2906 /* Decide if the selection is a column region */
2907 while (s < sg.getSize())
2909 if ( ( (SequenceI) sg.getSequences(null).elementAt(s++)).getLength() <
2912 JOptionPane.showMessageDialog(Desktop.desktop,
2913 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
2914 "Try using the Pad function in the edit menu,\n" +
2915 "or one of the multiple sequence alignment web services.",
2916 "Sequences in selection are not aligned",
2917 JOptionPane.WARNING_MESSAGE);
2923 title = title + " on region";
2924 tp = new TreePanel(alignPanel, type, pwType);
2928 //are the sequences aligned?
2929 if (!viewport.alignment.isAligned())
2931 JOptionPane.showMessageDialog(Desktop.desktop,
2932 "The sequences must be aligned before creating a tree.\n" +
2933 "Try using the Pad function in the edit menu,\n" +
2934 "or one of the multiple sequence alignment web services.",
2935 "Sequences not aligned",
2936 JOptionPane.WARNING_MESSAGE);
2941 if(viewport.alignment.getHeight()<2)
2946 tp = new TreePanel(alignPanel, type, pwType);
2951 if(viewport.viewName!=null)
2953 title+= viewport.viewName+" of ";
2956 title += this.title;
2958 Desktop.addInternalFrame(tp, title, 600, 500);
2964 * @param title DOCUMENT ME!
2965 * @param order DOCUMENT ME!
2967 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
2969 final JMenuItem item = new JMenuItem("by " + title);
2971 item.addActionListener(new java.awt.event.ActionListener()
2973 public void actionPerformed(ActionEvent e)
2975 SequenceI [] oldOrder = viewport.getAlignment().getSequencesArray();
2977 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
2978 AlignmentSorter.sortBy(viewport.getAlignment(), order);
2980 addHistoryItem(new OrderCommand(order.getName(), oldOrder,
2981 viewport.alignment));
2983 alignPanel.paintAlignment(true);
2989 * Maintain the Order by->Displayed Tree menu.
2990 * Creates a new menu item for a TreePanel with an appropriate
2991 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
2992 * to remove the menu item when the treePanel is closed, and adjust
2993 * the tree leaf to sequence mapping when the alignment is modified.
2994 * @param treePanel Displayed tree window.
2995 * @param title SortBy menu item title.
2997 public void buildTreeMenu()
2999 sortByTreeMenu.removeAll();
3001 Vector comps = (Vector) PaintRefresher.components.get(viewport.
3002 getSequenceSetId());
3003 Vector treePanels = new Vector();
3004 int i, iSize = comps.size();
3005 for(i=0; i<iSize; i++)
3007 if(comps.elementAt(i) instanceof TreePanel)
3009 treePanels.add(comps.elementAt(i));
3013 iSize = treePanels.size();
3017 sortByTreeMenu.setVisible(false);
3021 sortByTreeMenu.setVisible(true);
3023 for(i=0; i<treePanels.size(); i++)
3025 TreePanel tp = (TreePanel)treePanels.elementAt(i);
3026 final JMenuItem item = new JMenuItem(tp.getTitle());
3027 final NJTree tree = ((TreePanel)treePanels.elementAt(i)).getTree();
3028 item.addActionListener(new java.awt.event.ActionListener()
3030 public void actionPerformed(ActionEvent e)
3032 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
3033 AlignmentSorter.sortByTree(viewport.getAlignment(), tree);
3035 addHistoryItem(new OrderCommand("Tree Sort",
3037 viewport.alignment));
3039 alignPanel.paintAlignment(true);
3043 sortByTreeMenu.add(item);
3048 * Work out whether the whole set of sequences
3049 * or just the selected set will be submitted for multiple alignment.
3052 private jalview.datamodel.AlignmentView gatherSequencesForAlignment()
3054 // Now, check we have enough sequences
3055 AlignmentView msa = null;
3057 if ( (viewport.getSelectionGroup() != null) &&
3058 (viewport.getSelectionGroup().getSize() > 1))
3060 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
3061 /*SequenceGroup seqs = viewport.getSelectionGroup();
3063 msa = new SequenceI[sz = seqs.getSize(false)];
3065 for (int i = 0; i < sz; i++)
3067 msa[i] = (SequenceI) seqs.getSequenceAt(i);
3069 msa = viewport.getAlignmentView(true);
3073 /*Vector seqs = viewport.getAlignment().getSequences();
3075 if (seqs.size() > 1)
3077 msa = new SequenceI[seqs.size()];
3079 for (int i = 0; i < seqs.size(); i++)
3081 msa[i] = (SequenceI) seqs.elementAt(i);
3084 msa = viewport.getAlignmentView(false);
3090 * Decides what is submitted to a secondary structure prediction service,
3091 * the currently selected sequence, or the currently selected alignment
3092 * (where the first sequence in the set is the one that the prediction
3095 AlignmentView gatherSeqOrMsaForSecStrPrediction()
3097 AlignmentView seqs = null;
3099 if ( (viewport.getSelectionGroup() != null) &&
3100 (viewport.getSelectionGroup().getSize() > 0))
3102 seqs = viewport.getAlignmentView(true);
3106 seqs = viewport.getAlignmentView(false);
3108 // limit sequences - JBPNote in future - could spawn multiple prediction jobs
3109 // TODO: viewport.alignment.isAligned is a global state - the local selection may well be aligned - we preserve 2.0.8 behaviour for moment.
3110 if (!viewport.alignment.isAligned())
3112 seqs.setSequences(new SeqCigar[]
3113 {seqs.getSequences()[0]});
3120 * @param e DOCUMENT ME!
3122 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
3124 // Pick the tree file
3125 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
3128 chooser.setFileView(new JalviewFileView());
3129 chooser.setDialogTitle("Select a newick-like tree file");
3130 chooser.setToolTipText("Load a tree file");
3132 int value = chooser.showOpenDialog(null);
3134 if (value == JalviewFileChooser.APPROVE_OPTION)
3136 String choice = chooser.getSelectedFile().getPath();
3137 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
3141 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
3143 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
3145 catch (Exception ex)
3147 JOptionPane.showMessageDialog(Desktop.desktop,
3148 "Problem reading tree file",
3150 JOptionPane.WARNING_MESSAGE);
3151 ex.printStackTrace();
3157 public TreePanel ShowNewickTree(NewickFile nf, String title)
3159 return ShowNewickTree(nf,title,600,500,4,5);
3162 public TreePanel ShowNewickTree(NewickFile nf, String title,
3163 AlignmentView input)
3165 return ShowNewickTree(nf,title, input, 600,500,4,5);
3168 public TreePanel ShowNewickTree(NewickFile nf, String title, int w, int h,
3171 return ShowNewickTree(nf, title, null, w, h, x, y);
3174 * Add a treeviewer for the tree extracted from a newick file object to the current alignment view
3176 * @param nf the tree
3177 * @param title tree viewer title
3178 * @param input Associated alignment input data (or null)
3183 * @return TreePanel handle
3185 public TreePanel ShowNewickTree(NewickFile nf, String title,
3186 AlignmentView input, int w, int h, int x,
3189 TreePanel tp = null;
3195 if (nf.getTree() != null)
3197 tp = new TreePanel(alignPanel,
3206 tp.setLocation(x,y);
3210 Desktop.addInternalFrame(tp, title, w, h);
3213 catch (Exception ex)
3215 ex.printStackTrace();
3223 * Generates menu items and listener event actions for web service clients
3226 public void BuildWebServiceMenu()
3228 if ( (Discoverer.services != null)
3229 && (Discoverer.services.size() > 0))
3231 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
3232 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
3233 Vector wsmenu = new Vector();
3234 final AlignFrame af = this;
3237 // Add any Multiple Sequence Alignment Services
3238 final JMenu msawsmenu = new JMenu("Alignment");
3239 for (int i = 0, j = msaws.size(); i < j; i++)
3241 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
3243 final JMenuItem method = new JMenuItem(sh.getName());
3244 method.addActionListener(new ActionListener()
3246 public void actionPerformed(ActionEvent e)
3248 AlignmentView msa = gatherSequencesForAlignment();
3249 new jalview.ws.MsaWSClient(sh, title, msa,
3251 viewport.getAlignment().getDataset(),
3257 msawsmenu.add(method);
3258 // Deal with services that we know accept partial alignments.
3259 if (sh.getName().indexOf("lustal") > -1)
3261 // We know that ClustalWS can accept partial alignments for refinement.
3262 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
3263 methodR.addActionListener(new ActionListener()
3265 public void actionPerformed(ActionEvent e)
3267 AlignmentView msa = gatherSequencesForAlignment();
3268 new jalview.ws.MsaWSClient(sh, title, msa,
3270 viewport.getAlignment().getDataset(),
3276 msawsmenu.add(methodR);
3280 wsmenu.add(msawsmenu);
3282 if (secstrpr != null)
3284 // Add any secondary structure prediction services
3285 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
3286 for (int i = 0, j = secstrpr.size(); i < j; i++)
3288 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
3290 final JMenuItem method = new JMenuItem(sh.getName());
3291 method.addActionListener(new ActionListener()
3293 public void actionPerformed(ActionEvent e)
3295 AlignmentView msa = gatherSeqOrMsaForSecStrPrediction();
3296 if (msa.getSequences().length == 1)
3298 // Single Sequence prediction
3299 new jalview.ws.JPredClient(sh, title, false, msa, af, true);
3303 if (msa.getSequences().length > 1)
3305 // Sequence profile based prediction
3306 new jalview.ws.JPredClient(sh,
3307 title, true, msa, af, true);
3312 secstrmenu.add(method);
3314 wsmenu.add(secstrmenu);
3316 this.webService.removeAll();
3317 for (int i = 0, j = wsmenu.size(); i < j; i++)
3319 webService.add( (JMenu) wsmenu.get(i));
3324 this.webService.removeAll();
3325 this.webService.add(this.webServiceNoServices);
3327 // TODO: add in rediscovery function
3328 // TODO: reduce code redundancy.
3329 // TODO: group services by location as well as function.
3332 /* public void vamsasStore_actionPerformed(ActionEvent e)
3334 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
3335 getProperty("LAST_DIRECTORY"));
3337 chooser.setFileView(new JalviewFileView());
3338 chooser.setDialogTitle("Export to Vamsas file");
3339 chooser.setToolTipText("Export");
3341 int value = chooser.showSaveDialog(this);
3343 if (value == JalviewFileChooser.APPROVE_OPTION)
3345 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
3346 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
3347 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
3354 public void showTranslation_actionPerformed(ActionEvent e)
3356 ///////////////////////////////
3357 // Collect Data to be translated/transferred
3359 SequenceI [] selection = viewport.getSelectionAsNewSequence();
3360 String [] seqstring = viewport.getViewAsString(true);
3361 AlignmentI al = null;
3363 al = jalview.analysis.Dna.CdnaTranslate(selection, seqstring, viewport.getViewAsVisibleContigs(true),
3364 viewport.getGapCharacter(), viewport.alignment.getAlignmentAnnotation(),
3365 viewport.alignment.getWidth());
3366 } catch (Exception ex) {
3368 jalview.bin.Cache.log.debug("Exception during translation.",ex);
3372 JOptionPane.showMessageDialog(Desktop.desktop,
3373 "Please select at least three bases in at least one sequence in order to perform a cDNA translation.",
3374 "Translation Failed",
3375 JOptionPane.WARNING_MESSAGE);
3377 AlignFrame af = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT);
3378 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
3387 * @param String DOCUMENT ME!
3389 public boolean parseFeaturesFile(String file, String type)
3391 boolean featuresFile = false;
3394 featuresFile = new FeaturesFile(file,
3395 type).parse(viewport.alignment.getDataset(),
3396 alignPanel.seqPanel.seqCanvas.
3397 getFeatureRenderer().featureColours,
3402 ex.printStackTrace();
3407 viewport.showSequenceFeatures = true;
3408 showSeqFeatures.setSelected(true);
3409 alignPanel.paintAlignment(true);
3412 return featuresFile;
3415 public void dragEnter(DropTargetDragEvent evt)
3418 public void dragExit(DropTargetEvent evt)
3421 public void dragOver(DropTargetDragEvent evt)
3424 public void dropActionChanged(DropTargetDragEvent evt)
3427 public void drop(DropTargetDropEvent evt)
3429 Transferable t = evt.getTransferable();
3430 java.util.List files = null;
3434 DataFlavor uriListFlavor = new DataFlavor(
3435 "text/uri-list;class=java.lang.String");
3436 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
3438 //Works on Windows and MacOSX
3439 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
3440 files = (java.util.List) t.getTransferData(DataFlavor.
3441 javaFileListFlavor);
3443 else if (t.isDataFlavorSupported(uriListFlavor))
3445 // This is used by Unix drag system
3446 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
3447 String data = (String) t.getTransferData(uriListFlavor);
3448 files = new java.util.ArrayList(1);
3449 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
3452 st.hasMoreTokens(); )
3454 String s = st.nextToken();
3455 if (s.startsWith("#"))
3457 // the line is a comment (as per the RFC 2483)
3461 java.net.URI uri = new java.net.URI(s);
3462 java.io.File file = new java.io.File(uri);
3469 e.printStackTrace();
3476 for (int i = 0; i < files.size(); i++)
3478 loadJalviewDataFile(files.get(i).toString());
3481 catch (Exception ex)
3483 ex.printStackTrace();
3488 // This method will attempt to load a "dropped" file first by testing
3489 // whether its and Annotation file, then features file. If both are
3490 // false then the user may have dropped an alignment file onto this
3492 public void loadJalviewDataFile(String file)
3496 String protocol = "File";
3498 if (file.indexOf("http:") > -1 || file.indexOf("file:") > -1)
3503 boolean isAnnotation = new AnnotationFile().readAnnotationFile(viewport.
3504 alignment, file, protocol);
3508 boolean isGroupsFile = parseFeaturesFile(file,protocol);
3511 String format = new IdentifyFile().Identify(file, protocol);
3513 if(format.equalsIgnoreCase("JnetFile"))
3515 jalview.io.JPredFile predictions = new jalview.io.JPredFile(
3517 new JnetAnnotationMaker().add_annotation(predictions,
3518 viewport.getAlignment(),
3520 alignPanel.adjustAnnotationHeight();
3521 alignPanel.paintAlignment(true);
3525 new FileLoader().LoadFile(viewport, file, protocol, format);
3532 alignPanel.adjustAnnotationHeight();
3536 catch (Exception ex)
3538 ex.printStackTrace();
3542 public void tabSelectionChanged(int index)
3546 alignPanel = (AlignmentPanel) alignPanels.elementAt(index);
3547 viewport = alignPanel.av;
3548 setMenusFromViewport(viewport);
3552 public void tabbedPane_mousePressed(MouseEvent e)
3554 if(SwingUtilities.isRightMouseButton(e))
3556 String reply = JOptionPane.showInternalInputDialog(this,
3559 JOptionPane.QUESTION_MESSAGE);
3563 viewport.viewName = reply;
3564 tabbedPane.setTitleAt( tabbedPane.getSelectedIndex() ,reply);
3570 public AlignViewport getCurrentView()
3580 public PrintThread(AlignmentPanel ap)
3584 static PageFormat pf;
3587 PrinterJob printJob = PrinterJob.getPrinterJob();
3591 printJob.setPrintable(ap, pf);
3595 printJob.setPrintable(ap);
3598 if (printJob.printDialog())
3604 catch (Exception PrintException)
3606 PrintException.printStackTrace();