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();
61 String currentFileFormat = null;
63 String fileName = null;
66 * Creates a new AlignFrame object.
68 * @param al DOCUMENT ME!
70 public AlignFrame(AlignmentI al, int width, int height)
72 this(al, null, width, height);
76 * new alignment window with hidden columns
77 * @param al AlignmentI
78 * @param hiddenColumns ColumnSelection or null
80 public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns,
81 int width, int height)
83 this.setSize(width, height);
84 viewport = new AlignViewport(al, hiddenColumns);
86 alignPanel = new AlignmentPanel(this, viewport);
88 if (al.getDataset() == null)
93 addAlignmentPanel(alignPanel, true);
98 * Make a new AlignFrame from exisiting alignmentPanels
99 * @param ap AlignmentPanel
100 * @param av AlignViewport
102 public AlignFrame(AlignmentPanel ap)
106 addAlignmentPanel(ap, false);
112 this.setDropTarget(new java.awt.dnd.DropTarget(this, this));
114 if (viewport.conservation == null)
116 BLOSUM62Colour.setEnabled(false);
117 conservationMenuItem.setEnabled(false);
118 modifyConservation.setEnabled(false);
119 // PIDColour.setEnabled(false);
120 // abovePIDThreshold.setEnabled(false);
121 // modifyPID.setEnabled(false);
124 String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT", "No sort");
126 if (sortby.equals("Id"))
128 sortIDMenuItem_actionPerformed(null);
130 else if (sortby.equals("Pairwise Identity"))
132 sortPairwiseMenuItem_actionPerformed(null);
135 if (Desktop.desktop != null)
137 addServiceListeners();
138 setGUINucleotide(viewport.alignment.isNucleotide());
141 setMenusFromViewport(viewport);
143 if (viewport.wrapAlignment)
145 wrapMenuItem_actionPerformed(null);
148 if (jalview.bin.Cache.getDefault("SHOW_OVERVIEW",false))
150 this.overviewMenuItem_actionPerformed(null);
157 public void setFileName(String file, String format)
160 currentFileFormat = format;
161 reload.setEnabled(true);
164 void addKeyListener()
166 addKeyListener(new KeyAdapter()
168 public void keyPressed(KeyEvent evt)
170 if (viewport.cursorMode
171 && evt.getKeyCode() >= KeyEvent.VK_0
172 && evt.getKeyCode() <= KeyEvent.VK_9)
174 alignPanel.seqPanel.numberPressed(evt.getKeyChar());
177 switch (evt.getKeyCode())
180 case 27: // escape key
181 deselectAllSequenceMenuItem_actionPerformed(null);
185 case KeyEvent.VK_DOWN:
186 if (evt.isAltDown() || !viewport.cursorMode)
187 moveSelectedSequences(false);
188 if(viewport.cursorMode)
189 alignPanel.seqPanel.moveCursor(0, 1);
193 if (evt.isAltDown() || !viewport.cursorMode)
194 moveSelectedSequences(true);
195 if(viewport.cursorMode)
196 alignPanel.seqPanel.moveCursor(0, -1);
200 case KeyEvent.VK_LEFT:
201 if (evt.isAltDown() || !viewport.cursorMode)
202 slideSequences(false,
203 alignPanel.seqPanel.getKeyboardNo1());
205 alignPanel.seqPanel.moveCursor( -1, 0);
210 case KeyEvent.VK_RIGHT:
211 if (evt.isAltDown() || !viewport.cursorMode)
213 alignPanel.seqPanel.getKeyboardNo1());
215 alignPanel.seqPanel.moveCursor( 1, 0);
218 case KeyEvent.VK_SPACE:
219 if (viewport.cursorMode)
221 alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown()
227 case KeyEvent.VK_DELETE:
228 case KeyEvent.VK_BACK_SPACE:
229 if (!viewport.cursorMode)
231 cut_actionPerformed(null);
235 alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown()
243 if (viewport.cursorMode)
245 alignPanel.seqPanel.setCursorRow();
249 if (viewport.cursorMode && !evt.isControlDown())
251 alignPanel.seqPanel.setCursorColumn();
255 if (viewport.cursorMode)
257 alignPanel.seqPanel.setCursorPosition();
261 case KeyEvent.VK_ENTER:
262 case KeyEvent.VK_COMMA:
263 if (viewport.cursorMode)
265 alignPanel.seqPanel.setCursorRowAndColumn();
270 if (viewport.cursorMode)
272 alignPanel.seqPanel.setSelectionAreaAtCursor(true);
276 if (viewport.cursorMode)
278 alignPanel.seqPanel.setSelectionAreaAtCursor(false);
283 viewport.cursorMode = !viewport.cursorMode;
284 statusBar.setText("Keyboard editing mode is " +
285 (viewport.cursorMode ? "on" : "off"));
286 if (viewport.cursorMode)
288 alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes;
289 alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq;
291 alignPanel.seqPanel.seqCanvas.repaint();
297 ClassLoader cl = jalview.gui.Desktop.class.getClassLoader();
298 java.net.URL url = javax.help.HelpSet.findHelpSet(cl, "help/help");
299 javax.help.HelpSet hs = new javax.help.HelpSet(cl, url);
301 javax.help.HelpBroker hb = hs.createHelpBroker();
302 hb.setCurrentID("home");
303 hb.setDisplayed(true);
307 ex.printStackTrace();
313 boolean toggleSeqs = !evt.isControlDown();
314 boolean toggleCols = !evt.isShiftDown();
316 boolean hide = false;
318 SequenceGroup sg = viewport.getSelectionGroup();
321 if (sg != null && sg.getSize() != viewport.alignment.getHeight())
323 hideSelSequences_actionPerformed(null);
326 else if (! (toggleCols &&
327 viewport.colSel.getSelected().size() > 0))
329 showAllSeqs_actionPerformed(null);
335 if (viewport.colSel.getSelected().size() > 0)
337 hideSelColumns_actionPerformed(null);
340 viewport.selectionGroup = sg;
345 showAllColumns_actionPerformed(null);
350 case KeyEvent.VK_PAGE_UP:
351 if (viewport.wrapAlignment)
353 alignPanel.scrollUp(true);
357 alignPanel.setScrollValues(viewport.startRes,
359 - viewport.endSeq + viewport.startSeq);
362 case KeyEvent.VK_PAGE_DOWN:
363 if (viewport.wrapAlignment)
365 alignPanel.scrollUp(false);
369 alignPanel.setScrollValues(viewport.startRes,
371 + viewport.endSeq - viewport.startSeq);
377 public void keyReleased(KeyEvent evt)
379 switch(evt.getKeyCode())
381 case KeyEvent.VK_LEFT:
382 if (evt.isAltDown() || !viewport.cursorMode)
383 viewport.firePropertyChange("alignment", null,
384 viewport.getAlignment().getSequences());
387 case KeyEvent.VK_RIGHT:
388 if (evt.isAltDown() || !viewport.cursorMode)
389 viewport.firePropertyChange("alignment", null,
390 viewport.getAlignment().getSequences());
397 public void addAlignmentPanel(final AlignmentPanel ap,
400 ap.alignFrame = this;
402 alignPanels.addElement(ap);
404 PaintRefresher.Register(ap, ap.av.getSequenceSetId());
406 int aSize = alignPanels.size();
408 tabbedPane.setVisible(aSize > 1 || ap.av.viewName != null);
410 if (aSize == 1 && ap.av.viewName == null)
412 this.getContentPane().add(ap, BorderLayout.CENTER);
418 setInitialTabVisible();
421 expandViews.setEnabled(true);
422 gatherViews.setEnabled(true);
423 tabbedPane.addTab(ap.av.viewName, ap);
425 ap.setVisible(false);
432 ap.av.alignment.padGaps();
434 ap.av.updateConservation(ap);
435 ap.av.updateConsensus(ap);
439 public void setInitialTabVisible()
441 expandViews.setEnabled(true);
442 gatherViews.setEnabled(true);
443 tabbedPane.setVisible(true);
444 AlignmentPanel first = (AlignmentPanel) alignPanels.firstElement();
445 tabbedPane.addTab(first.av.viewName, first);
446 this.getContentPane().add(tabbedPane, BorderLayout.CENTER);
449 public AlignViewport getViewport()
454 /* Set up intrinsic listeners for dynamically generated GUI bits. */
455 private void addServiceListeners()
457 final java.beans.PropertyChangeListener thisListener;
458 // Do this once to get current state
459 BuildWebServiceMenu();
460 Desktop.discoverer.addPropertyChangeListener(
461 thisListener = new java.beans.PropertyChangeListener()
463 public void propertyChange(PropertyChangeEvent evt)
465 // System.out.println("Discoverer property change.");
466 if (evt.getPropertyName().equals("services"))
468 // System.out.println("Rebuilding web service menu");
469 BuildWebServiceMenu();
474 addInternalFrameListener(new javax.swing.event.
475 InternalFrameAdapter()
477 public void internalFrameClosed(
478 javax.swing.event.InternalFrameEvent evt)
480 // System.out.println("deregistering discoverer listener");
481 Desktop.discoverer.removePropertyChangeListener(thisListener);
482 closeMenuItem_actionPerformed(true);
488 public void setGUINucleotide(boolean nucleotide)
490 showTranslation.setVisible(nucleotide);
491 conservationMenuItem.setEnabled(!nucleotide);
492 modifyConservation.setEnabled(!nucleotide);
494 //Remember AlignFrame always starts as protein
497 calculateMenu.remove(calculateMenu.getItemCount() - 2);
502 * Need to call this method when tabs are selected for multiple views,
503 * or when loading from Jalview2XML.java
504 * @param av AlignViewport
506 void setMenusFromViewport(AlignViewport av)
508 padGapsMenuitem.setSelected(av.padGaps);
509 colourTextMenuItem.setSelected(av.showColourText);
510 abovePIDThreshold.setSelected(av.getAbovePIDThreshold());
511 conservationMenuItem.setSelected(av.getConservationSelected());
512 seqLimits.setSelected(av.getShowJVSuffix());
513 idRightAlign.setSelected(av.rightAlignIds);
514 renderGapsMenuItem.setSelected(av.renderGaps);
515 wrapMenuItem.setSelected(av.wrapAlignment);
516 scaleAbove.setVisible(av.wrapAlignment);
517 scaleLeft.setVisible(av.wrapAlignment);
518 scaleRight.setVisible(av.wrapAlignment);
519 annotationPanelMenuItem.setState(av.showAnnotation);
520 viewBoxesMenuItem.setSelected(av.showBoxes);
521 viewTextMenuItem.setSelected(av.showText);
523 setColourSelected(ColourSchemeProperty.
524 getColourName(av.getGlobalColourScheme()));
526 showSeqFeatures.setSelected(av.showSequenceFeatures);
527 hiddenMarkers.setState(av.showHiddenMarkers);
528 applyToAllGroups.setState(av.colourAppliesToAllGroups);
533 Hashtable progressBars;
534 public void setProgressBar(String message, long id)
536 if (progressBars == null)
538 progressBars = new Hashtable();
541 JPanel progressPanel;
542 GridLayout layout = (GridLayout) statusPanel.getLayout();
543 if (progressBars.get(new Long(id)) != null)
545 progressPanel = (JPanel) progressBars.get(new Long(id));
546 statusPanel.remove(progressPanel);
547 progressBars.remove(progressPanel);
548 progressPanel = null;
551 statusBar.setText(message);
554 layout.setRows(layout.getRows() - 1);
558 progressPanel = new JPanel(new BorderLayout(10, 5));
560 JProgressBar progressBar = new JProgressBar();
561 progressBar.setIndeterminate(true);
563 progressPanel.add(new JLabel(message), BorderLayout.WEST);
564 progressPanel.add(progressBar, BorderLayout.CENTER);
566 layout.setRows(layout.getRows() + 1);
567 statusPanel.add(progressPanel);
569 progressBars.put(new Long(id), progressPanel);
576 Added so Castor Mapping file can obtain Jalview Version
578 public String getVersion()
580 return jalview.bin.Cache.getProperty("VERSION");
583 public FeatureRenderer getFeatureRenderer()
585 return alignPanel.seqPanel.seqCanvas.getFeatureRenderer();
588 public void fetchSequence_actionPerformed(ActionEvent e)
590 new SequenceFetcher(this);
593 public void addFromFile_actionPerformed(ActionEvent e)
595 Desktop.instance.inputLocalFileMenuItem_actionPerformed(viewport);
598 public void reload_actionPerformed(ActionEvent e)
600 if (fileName != null)
602 if (currentFileFormat.equals("Jalview"))
604 JInternalFrame[] frames = Desktop.desktop.getAllFrames();
605 for (int i = 0; i < frames.length; i++)
607 if (frames[i] instanceof AlignFrame
609 && ( (AlignFrame) frames[i]).fileName.equals(fileName))
613 frames[i].setSelected(true);
614 Desktop.instance.closeAssociatedWindows();
616 catch (java.beans.PropertyVetoException ex)
621 Desktop.instance.closeAssociatedWindows();
623 FileLoader loader = new FileLoader();
624 String protocol = fileName.startsWith("http:")? "URL":"File";
625 loader.LoadFile(viewport, fileName, protocol, currentFileFormat);
629 Rectangle bounds = this.getBounds();
631 FileLoader loader = new FileLoader();
632 String protocol = fileName.startsWith("http:") ? "URL" : "File";
633 AlignFrame newframe =
634 loader.LoadFileWaitTillLoaded(fileName, protocol, currentFileFormat);
636 newframe.setBounds(bounds);
638 this.closeMenuItem_actionPerformed(true);
643 public void addFromText_actionPerformed(ActionEvent e)
645 Desktop.instance.inputTextboxMenuItem_actionPerformed(viewport);
648 public void addFromURL_actionPerformed(ActionEvent e)
650 Desktop.instance.inputURLMenuItem_actionPerformed(viewport);
653 public void save_actionPerformed(ActionEvent e)
656 || currentFileFormat == null
657 || fileName.startsWith("http")
660 saveAs_actionPerformed(null);
664 saveAlignment(fileName, currentFileFormat);
671 * @param e DOCUMENT ME!
673 public void saveAs_actionPerformed(ActionEvent e)
675 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
676 getProperty("LAST_DIRECTORY"),
678 {"fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc", "jar"},
680 {"Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview"},
684 chooser.setFileView(new JalviewFileView());
685 chooser.setDialogTitle("Save Alignment to file");
686 chooser.setToolTipText("Save");
688 int value = chooser.showSaveDialog(this);
690 if (value == JalviewFileChooser.APPROVE_OPTION)
692 currentFileFormat = chooser.getSelectedFormat();
693 if (currentFileFormat == null)
695 JOptionPane.showInternalMessageDialog(Desktop.desktop,
696 "You must select a file format before saving!",
697 "File format not specified",
698 JOptionPane.WARNING_MESSAGE);
699 value = chooser.showSaveDialog(this);
703 fileName = chooser.getSelectedFile().getPath();
705 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
708 jalview.bin.Cache.setProperty("LAST_DIRECTORY", fileName);
710 saveAlignment(fileName, currentFileFormat);
714 public boolean saveAlignment(String file, String format)
716 boolean success = true;
718 if (format.equalsIgnoreCase("Jalview"))
720 String shortName = title;
722 if (shortName.indexOf(java.io.File.separatorChar) > -1)
724 shortName = shortName.substring(shortName.lastIndexOf(
725 java.io.File.separatorChar) + 1);
728 success = new Jalview2XML().SaveAlignment(this, file, shortName);
730 statusBar.setText("Successfully saved to file: "
732 + format + " format.");
738 String[] omitHidden = null;
740 if (viewport.hasHiddenColumns)
742 int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop,
743 "The Alignment contains hidden columns."
744 + "\nDo you want to save only the visible alignment?",
745 "Save / Omit Hidden Columns",
746 JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
748 if (reply == JOptionPane.YES_OPTION)
750 omitHidden = viewport.getViewAsString(false);
754 String output = new FormatAdapter().formatSequences(
756 viewport.alignment.getSequencesArray(),
767 java.io.PrintWriter out = new java.io.PrintWriter(
768 new java.io.FileWriter(file));
773 statusBar.setText("Successfully saved to file: "
775 + format + " format.");
780 ex.printStackTrace();
787 JOptionPane.showInternalMessageDialog(
788 this, "Couldn't save file: " + fileName,
790 JOptionPane.WARNING_MESSAGE);
799 * @param e DOCUMENT ME!
801 protected void outputText_actionPerformed(ActionEvent e)
803 String[] omitHidden = null;
805 if (viewport.hasHiddenColumns)
807 int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop,
808 "The Alignment contains hidden columns."
809 + "\nDo you want to output only the visible alignment?",
810 "Save / Omit Hidden Columns",
811 JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
813 if (reply == JOptionPane.YES_OPTION)
815 omitHidden = viewport.getViewAsString(false);
819 CutAndPasteTransfer cap = new CutAndPasteTransfer();
820 cap.setForInput(null);
821 Desktop.addInternalFrame(cap,
822 "Alignment output - " + e.getActionCommand(), 600,
825 cap.setText(new FormatAdapter().formatSequences(
826 e.getActionCommand(),
827 viewport.alignment.getSequencesArray(),
834 * @param e DOCUMENT ME!
836 protected void htmlMenuItem_actionPerformed(ActionEvent e)
838 new HTMLOutput(viewport,
839 alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
840 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
843 public void createImageMap(File file, String image)
845 alignPanel.makePNGImageMap(file, image);
851 * @param e DOCUMENT ME!
853 public void createPNG(File f)
855 alignPanel.makePNG(f);
861 * @param e DOCUMENT ME!
863 public void createEPS(File f)
865 alignPanel.makeEPS(f);
868 public void pageSetup_actionPerformed(ActionEvent e)
870 PrinterJob printJob = PrinterJob.getPrinterJob();
871 PrintThread.pf = printJob.pageDialog(printJob.defaultPage());
877 * @param e DOCUMENT ME!
879 public void printMenuItem_actionPerformed(ActionEvent e)
881 //Putting in a thread avoids Swing painting problems
882 PrintThread thread = new PrintThread(alignPanel);
886 public void exportFeatures_actionPerformed(ActionEvent e)
888 new AnnotationExporter().exportFeatures(alignPanel);
891 public void exportAnnotations_actionPerformed(ActionEvent e)
893 new AnnotationExporter().exportAnnotations(
895 viewport.showAnnotation ? viewport.alignment.getAlignmentAnnotation() : null,
896 viewport.alignment.getGroups()
900 public void associatedData_actionPerformed(ActionEvent e)
902 // Pick the tree file
903 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
906 chooser.setFileView(new JalviewFileView());
907 chooser.setDialogTitle("Load Jalview Annotations or Features File");
908 chooser.setToolTipText("Load Jalview Annotations / Features file");
910 int value = chooser.showOpenDialog(null);
912 if (value == JalviewFileChooser.APPROVE_OPTION)
914 String choice = chooser.getSelectedFile().getPath();
915 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
916 loadJalviewDataFile(choice);
924 * @param e DOCUMENT ME!
926 public void closeMenuItem_actionPerformed(boolean closeAllTabs)
928 if (alignPanels != null && alignPanels.size() < 2)
935 if (alignPanels != null)
939 for (int i = 0; i < alignPanels.size(); i++)
941 AlignmentPanel ap = (AlignmentPanel) alignPanels.elementAt(i);
942 PaintRefresher.RemoveComponent(ap.seqPanel.seqCanvas);
943 PaintRefresher.RemoveComponent(ap.idPanel.idCanvas);
944 PaintRefresher.RemoveComponent(ap);
949 int index = tabbedPane.getSelectedIndex();
951 alignPanels.removeElement(alignPanel);
952 PaintRefresher.RemoveComponent(alignPanel.seqPanel.seqCanvas);
953 PaintRefresher.RemoveComponent(alignPanel.idPanel.idCanvas);
954 PaintRefresher.RemoveComponent(alignPanel);
958 tabbedPane.removeTabAt(index);
959 tabbedPane.validate();
961 if (index == tabbedPane.getTabCount())
966 this.tabSelectionChanged(index);
972 this.setClosed(true);
977 ex.printStackTrace();
984 void updateEditMenuBar()
987 if (viewport.historyList.size() > 0)
989 undoMenuItem.setEnabled(true);
990 CommandI command = (CommandI) viewport.historyList.peek();
991 undoMenuItem.setText("Undo " + command.getDescription());
995 undoMenuItem.setEnabled(false);
996 undoMenuItem.setText("Undo");
999 if (viewport.redoList.size() > 0)
1001 redoMenuItem.setEnabled(true);
1003 CommandI command = (CommandI) viewport.redoList.peek();
1004 redoMenuItem.setText("Redo " + command.getDescription());
1008 redoMenuItem.setEnabled(false);
1009 redoMenuItem.setText("Redo");
1013 public void addHistoryItem(CommandI command)
1015 if (command.getSize() > 0)
1017 viewport.historyList.push(command);
1018 viewport.redoList.clear();
1019 updateEditMenuBar();
1020 viewport.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;
1027 * @param e DOCUMENT ME!
1029 protected void undoMenuItem_actionPerformed(ActionEvent e)
1031 CommandI command = (CommandI) viewport.historyList.pop();
1032 viewport.redoList.push(command);
1033 command.undoCommand();
1035 AlignViewport originalSource = getOriginatingSource(command);
1036 updateEditMenuBar();
1038 if (originalSource != null)
1040 originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;
1041 originalSource.firePropertyChange("alignment",
1043 originalSource.alignment.getSequences());
1050 * @param e DOCUMENT ME!
1052 protected void redoMenuItem_actionPerformed(ActionEvent e)
1054 if (viewport.redoList.size() < 1)
1059 CommandI command = (CommandI) viewport.redoList.pop();
1060 viewport.historyList.push(command);
1061 command.doCommand();
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());
1075 AlignViewport getOriginatingSource(CommandI command)
1077 AlignViewport originalSource = null;
1078 //For sequence removal and addition, we need to fire
1079 //the property change event FROM the viewport where the
1080 //original alignment was altered
1081 AlignmentI al = null;
1082 if (command instanceof EditCommand)
1084 EditCommand editCommand = (EditCommand) command;
1085 al = editCommand.getAlignment();
1086 Vector comps = (Vector) PaintRefresher.components
1087 .get(viewport.getSequenceSetId());
1089 for (int i = 0; i < comps.size(); i++)
1091 if (comps.elementAt(i) instanceof AlignmentPanel)
1093 if (al == ( (AlignmentPanel) comps.elementAt(i)).av.alignment)
1095 originalSource = ( (AlignmentPanel) comps.elementAt(i)).av;
1102 if (originalSource == null)
1104 //The original view is closed, we must validate
1105 //the current view against the closed view first
1108 PaintRefresher.validateSequences(al, viewport.alignment);
1111 originalSource = viewport;
1114 return originalSource;
1120 * @param up DOCUMENT ME!
1122 public void moveSelectedSequences(boolean up)
1124 SequenceGroup sg = viewport.getSelectionGroup();
1133 for (int i = 1; i < viewport.alignment.getHeight(); i++)
1135 SequenceI seq = viewport.alignment.getSequenceAt(i);
1137 if (!sg.getSequences(null).contains(seq))
1142 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
1144 if (sg.getSequences(null).contains(temp))
1149 viewport.alignment.getSequences().setElementAt(temp, i);
1150 viewport.alignment.getSequences().setElementAt(seq, i - 1);
1155 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
1157 SequenceI seq = viewport.alignment.getSequenceAt(i);
1159 if (!sg.getSequences(null).contains(seq))
1164 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
1166 if (sg.getSequences(null).contains(temp))
1171 viewport.alignment.getSequences().setElementAt(temp, i);
1172 viewport.alignment.getSequences().setElementAt(seq, i + 1);
1176 alignPanel.paintAlignment(true);
1180 synchronized void slideSequences(boolean right, int size)
1182 if(viewport.hasHiddenColumns)
1184 JOptionPane.showInternalMessageDialog(Desktop.desktop,
1185 "Slide Sequences not available with hidden columns",
1186 "Slide Sequence not Available",
1187 JOptionPane.WARNING_MESSAGE);
1190 Vector sg = new Vector();
1191 if(viewport.cursorMode)
1193 sg.addElement(viewport.alignment.getSequenceAt(
1194 alignPanel.seqPanel.seqCanvas.cursorY));
1196 else if(viewport.getSelectionGroup()!=null
1197 && viewport.getSelectionGroup().getSize()!=viewport.alignment.getHeight())
1199 sg = viewport.getSelectionGroup().getSequences(
1200 viewport.hiddenRepSequences);
1208 Vector invertGroup = new Vector();
1210 for (int i = 0; i < viewport.alignment.getHeight(); i++)
1212 if(!sg.contains(viewport.alignment.getSequenceAt(i)))
1213 invertGroup.add(viewport.alignment.getSequenceAt(i));
1216 SequenceI[] seqs1 = new SequenceI[sg.size()];
1217 for (int i = 0; i < sg.size(); i++)
1218 seqs1[i] = (SequenceI) sg.elementAt(i);
1220 SequenceI[] seqs2 = new SequenceI[invertGroup.size()];
1221 for (int i = 0; i < invertGroup.size(); i++)
1222 seqs2[i] = (SequenceI) invertGroup.elementAt(i);
1224 SlideSequencesCommand ssc;
1226 ssc = new SlideSequencesCommand("Slide Sequences",
1228 viewport.getGapCharacter()
1231 ssc = new SlideSequencesCommand("Slide Sequences",
1233 viewport.getGapCharacter()
1236 int groupAdjustment = 0;
1237 if (ssc.getGapsInsertedBegin() && right)
1239 if (viewport.cursorMode)
1240 alignPanel.seqPanel.moveCursor(size, 0);
1242 groupAdjustment = size;
1244 else if (!ssc.getGapsInsertedBegin() && !right)
1246 if (viewport.cursorMode)
1247 alignPanel.seqPanel.moveCursor( -size, 0);
1249 groupAdjustment = -size;
1252 if (groupAdjustment != 0)
1254 viewport.getSelectionGroup().setStartRes(
1255 viewport.getSelectionGroup().getStartRes() + groupAdjustment);
1256 viewport.getSelectionGroup().setEndRes(
1257 viewport.getSelectionGroup().getEndRes() + groupAdjustment);
1261 boolean appendHistoryItem = false;
1262 if(viewport.historyList!=null
1263 && viewport.historyList.size()>0
1264 && viewport.historyList.peek() instanceof SlideSequencesCommand)
1266 appendHistoryItem = ssc.appendSlideCommand(
1267 (SlideSequencesCommand)viewport.historyList.peek())
1271 if(!appendHistoryItem)
1272 addHistoryItem(ssc);
1281 * @param e DOCUMENT ME!
1283 protected void copy_actionPerformed(ActionEvent e)
1286 if (viewport.getSelectionGroup() == null)
1291 SequenceI[] seqs = viewport.getSelectionAsNewSequence();
1292 String[] omitHidden = null;
1294 if (viewport.hasHiddenColumns)
1296 omitHidden = viewport.getViewAsString(true);
1299 String output = new FormatAdapter().formatSequences(
1304 StringSelection ss = new StringSelection(output);
1308 jalview.gui.Desktop.internalCopy = true;
1309 //Its really worth setting the clipboard contents
1310 //to empty before setting the large StringSelection!!
1311 Toolkit.getDefaultToolkit().getSystemClipboard()
1312 .setContents(new StringSelection(""), null);
1314 Toolkit.getDefaultToolkit().getSystemClipboard()
1315 .setContents(ss, Desktop.instance);
1317 catch (OutOfMemoryError er)
1319 er.printStackTrace();
1320 javax.swing.SwingUtilities.invokeLater(new Runnable()
1324 javax.swing.JOptionPane.showInternalMessageDialog(Desktop.desktop,
1325 "Out of memory copying region!!"
1327 "\nSee help files for increasing Java Virtual Machine memory."
1329 javax.swing.JOptionPane.WARNING_MESSAGE);
1336 Vector hiddenColumns = null;
1337 if (viewport.hasHiddenColumns)
1339 hiddenColumns = new Vector();
1340 int hiddenOffset = viewport.getSelectionGroup().getStartRes();
1341 for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns().size();
1344 int[] region = (int[])
1345 viewport.getColumnSelection().getHiddenColumns().elementAt(i);
1347 hiddenColumns.addElement(new int[]
1348 {region[0] - hiddenOffset,
1349 region[1] - hiddenOffset});
1353 Desktop.jalviewClipboard = new Object[]
1356 viewport.alignment.getDataset(),
1358 statusBar.setText("Copied " + seqs.length + " sequences to clipboard.");
1364 * @param e DOCUMENT ME!
1366 protected void pasteNew_actionPerformed(ActionEvent e)
1374 * @param e DOCUMENT ME!
1376 protected void pasteThis_actionPerformed(ActionEvent e)
1384 * @param newAlignment DOCUMENT ME!
1386 void paste(boolean newAlignment)
1390 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
1391 Transferable contents = c.getContents(this);
1393 if (contents == null)
1401 str = (String) contents.getTransferData(DataFlavor.stringFlavor);
1402 if (str.length() < 1)
1407 format = new IdentifyFile().Identify(str, "Paste");
1410 catch (OutOfMemoryError er)
1412 er.printStackTrace();
1413 javax.swing.SwingUtilities.invokeLater(new Runnable()
1417 javax.swing.JOptionPane.showInternalMessageDialog(Desktop.desktop,
1418 "Out of memory pasting sequences!!"
1420 "\nSee help files for increasing Java Virtual Machine memory."
1422 javax.swing.JOptionPane.WARNING_MESSAGE);
1429 SequenceI[] sequences;
1431 if (Desktop.jalviewClipboard != null)
1433 // The clipboard was filled from within Jalview, we must use the sequences
1434 // And dataset from the copied alignment
1435 sequences = (SequenceI[]) Desktop.jalviewClipboard[0];
1439 sequences = new FormatAdapter().readFile(str, "Paste", format).
1440 getSequencesArray();
1443 AlignmentI alignment = null;
1447 alignment = new Alignment(sequences);
1449 if (Desktop.jalviewClipboard != null)
1451 alignment.setDataset( (Alignment) Desktop.jalviewClipboard[1]);
1455 alignment.setDataset(null);
1460 alignment = viewport.getAlignment();
1463 SequenceI[] newseqs = new SequenceI[sequences.length];
1464 for (int i = 0; i < sequences.length; i++)
1466 newseqs[i] = new Sequence(sequences[i].getName(),
1467 sequences[i].getSequence(),
1468 sequences[i].getStart(),
1469 sequences[i].getEnd());
1471 alignment.addSequence(newseqs[i]);
1477 addHistoryItem(new EditCommand(
1482 alignment.getWidth(),
1486 viewport.setEndSeq(alignment.getHeight());
1487 alignment.getWidth();
1488 viewport.firePropertyChange("alignment", null, alignment.getSequences());
1491 // Add any annotations attached to sequences
1492 for (int i = 0; i < sequences.length; i++)
1494 if (sequences[i].getAnnotation() != null)
1496 for (int a = 0; a < sequences[i].getAnnotation().length; a++)
1498 AlignmentAnnotation newAnnot =
1499 new AlignmentAnnotation(
1500 sequences[i].getAnnotation()[a].label,
1501 sequences[i].getAnnotation()[a].description,
1502 sequences[i].getAnnotation()[a].annotations,
1503 sequences[i].getAnnotation()[a].graphMin,
1504 sequences[i].getAnnotation()[a].graphMax,
1505 sequences[i].getAnnotation()[a].graph);
1507 sequences[i].getAnnotation()[a] = newAnnot;
1508 newAnnot.sequenceMapping = sequences[i].getAnnotation()[a].
1510 newAnnot.sequenceRef = sequences[i];
1511 newAnnot.adjustForAlignment();
1512 alignment.addAnnotation(newAnnot);
1513 alignment.setAnnotationIndex(newAnnot, a);
1516 alignPanel.annotationPanel.adjustPanelHeight();
1522 AlignFrame af = new AlignFrame(alignment, DEFAULT_WIDTH, DEFAULT_HEIGHT);
1523 String newtitle = new String("Copied sequences");
1525 if (Desktop.jalviewClipboard != null && Desktop.jalviewClipboard[2] != null)
1527 Vector hc = (Vector) Desktop.jalviewClipboard[2];
1528 for (int i = 0; i < hc.size(); i++)
1530 int[] region = (int[]) hc.elementAt(i);
1531 af.viewport.hideColumns(region[0], region[1]);
1535 //>>>This is a fix for the moment, until a better solution is found!!<<<
1536 af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().transferSettings(
1537 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
1539 if (title.startsWith("Copied sequences"))
1545 newtitle = newtitle.concat("- from " + title);
1548 Desktop.addInternalFrame(af, newtitle, DEFAULT_WIDTH,
1554 catch (Exception ex)
1556 ex.printStackTrace();
1557 System.out.println("Exception whilst pasting: " + ex);
1558 // could be anything being pasted in here
1566 * @param e DOCUMENT ME!
1568 protected void cut_actionPerformed(ActionEvent e)
1570 copy_actionPerformed(null);
1571 delete_actionPerformed(null);
1577 * @param e DOCUMENT ME!
1579 protected void delete_actionPerformed(ActionEvent evt)
1582 SequenceGroup sg = viewport.getSelectionGroup();
1588 Vector seqs = new Vector();
1590 for (int i = 0; i < sg.getSize(); i++)
1592 seq = sg.getSequenceAt(i);
1593 seqs.addElement(seq);
1596 // If the cut affects all sequences, remove highlighted columns
1597 if (sg.getSize() == viewport.alignment.getHeight())
1599 viewport.getColumnSelection().removeElements(sg.getStartRes(),
1600 sg.getEndRes() + 1);
1603 SequenceI[] cut = new SequenceI[seqs.size()];
1604 for (int i = 0; i < seqs.size(); i++)
1606 cut[i] = (SequenceI) seqs.elementAt(i);
1612 addHistoryItem(new EditCommand("Cut Sequences",
1616 sg.getEndRes() - sg.getStartRes() + 1,
1617 viewport.alignment));
1619 viewport.setSelectionGroup(null);
1620 viewport.alignment.deleteGroup(sg);
1622 viewport.firePropertyChange("alignment", null,
1623 viewport.getAlignment().getSequences());
1625 if (viewport.getAlignment().getHeight() < 1)
1629 this.setClosed(true);
1631 catch (Exception ex)
1640 * @param e DOCUMENT ME!
1642 protected void deleteGroups_actionPerformed(ActionEvent e)
1644 viewport.alignment.deleteAllGroups();
1645 viewport.sequenceColours = null;
1646 viewport.setSelectionGroup(null);
1647 PaintRefresher.Refresh(this, viewport.getSequenceSetId());
1648 alignPanel.paintAlignment(true);
1654 * @param e DOCUMENT ME!
1656 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
1658 SequenceGroup sg = new SequenceGroup();
1660 for (int i = 0; i < viewport.getAlignment().getSequences().size();
1663 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
1666 sg.setEndRes(viewport.alignment.getWidth() - 1);
1667 viewport.setSelectionGroup(sg);
1668 alignPanel.paintAlignment(true);
1669 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1675 * @param e DOCUMENT ME!
1677 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
1679 if (viewport.cursorMode)
1681 alignPanel.seqPanel.keyboardNo1 = null;
1682 alignPanel.seqPanel.keyboardNo2 = null;
1684 viewport.setSelectionGroup(null);
1685 viewport.getColumnSelection().clear();
1686 viewport.setSelectionGroup(null);
1687 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
1688 alignPanel.idPanel.idCanvas.searchResults = null;
1689 alignPanel.paintAlignment(true);
1690 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1696 * @param e DOCUMENT ME!
1698 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
1700 SequenceGroup sg = viewport.getSelectionGroup();
1704 selectAllSequenceMenuItem_actionPerformed(null);
1709 for (int i = 0; i < viewport.getAlignment().getSequences().size();
1712 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
1715 alignPanel.paintAlignment(true);
1717 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1720 public void invertColSel_actionPerformed(ActionEvent e)
1722 viewport.invertColumnSelection();
1723 alignPanel.paintAlignment(true);
1729 * @param e DOCUMENT ME!
1731 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
1733 trimAlignment(true);
1739 * @param e DOCUMENT ME!
1741 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
1743 trimAlignment(false);
1746 void trimAlignment(boolean trimLeft)
1748 ColumnSelection colSel = viewport.getColumnSelection();
1751 if (colSel.size() > 0)
1755 column = colSel.getMin();
1759 column = colSel.getMax();
1763 if (viewport.getSelectionGroup() != null)
1765 seqs = viewport.getSelectionGroup().getSequencesAsArray(viewport.
1766 hiddenRepSequences);
1770 seqs = viewport.alignment.getSequencesArray();
1773 TrimRegionCommand trimRegion;
1776 trimRegion = new TrimRegionCommand("Remove Left",
1777 TrimRegionCommand.TRIM_LEFT,
1782 viewport.selectionGroup);
1783 viewport.setStartRes(0);
1787 trimRegion = new TrimRegionCommand("Remove Right",
1788 TrimRegionCommand.TRIM_RIGHT,
1793 viewport.selectionGroup);
1796 statusBar.setText("Removed " + trimRegion.getSize() + " columns.");
1798 addHistoryItem(trimRegion);
1800 Vector groups = viewport.alignment.getGroups();
1802 for (int i = 0; i < groups.size(); i++)
1804 SequenceGroup sg = (SequenceGroup) groups.get(i);
1806 if ( (trimLeft && !sg.adjustForRemoveLeft(column))
1807 || (!trimLeft && !sg.adjustForRemoveRight(column)))
1809 viewport.alignment.deleteGroup(sg);
1813 viewport.firePropertyChange("alignment", null,
1814 viewport.getAlignment().getSequences());
1821 * @param e DOCUMENT ME!
1823 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
1825 int start = 0, end = viewport.alignment.getWidth() - 1;
1828 if (viewport.getSelectionGroup() != null)
1830 seqs = viewport.getSelectionGroup().getSequencesAsArray(viewport.
1831 hiddenRepSequences);
1832 start = viewport.getSelectionGroup().getStartRes();
1833 end = viewport.getSelectionGroup().getEndRes();
1837 seqs = viewport.alignment.getSequencesArray();
1840 RemoveGapColCommand removeGapCols =
1841 new RemoveGapColCommand("Remove Gapped Columns",
1844 viewport.alignment);
1846 addHistoryItem(removeGapCols);
1848 statusBar.setText("Removed " + removeGapCols.getSize() + " empty columns.");
1850 //This is to maintain viewport position on first residue
1852 SequenceI seq = viewport.alignment.getSequenceAt(0);
1853 int startRes = seq.findPosition(viewport.startRes);
1854 // ShiftList shifts;
1855 // viewport.getAlignment().removeGaps(shifts=new ShiftList());
1856 // edit.alColumnChanges=shifts.getInverse();
1857 // if (viewport.hasHiddenColumns)
1858 // viewport.getColumnSelection().compensateForEdits(shifts);
1859 viewport.setStartRes(seq.findIndex(startRes) - 1);
1860 viewport.firePropertyChange("alignment", null,
1861 viewport.getAlignment().getSequences());
1868 * @param e DOCUMENT ME!
1870 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
1872 int start = 0, end = viewport.alignment.getWidth() - 1;
1875 if (viewport.getSelectionGroup() != null)
1877 seqs = viewport.getSelectionGroup().getSequencesAsArray(viewport.
1878 hiddenRepSequences);
1879 start = viewport.getSelectionGroup().getStartRes();
1880 end = viewport.getSelectionGroup().getEndRes();
1884 seqs = viewport.alignment.getSequencesArray();
1887 //This is to maintain viewport position on first residue
1889 SequenceI seq = viewport.alignment.getSequenceAt(0);
1890 int startRes = seq.findPosition(viewport.startRes);
1892 addHistoryItem(new RemoveGapsCommand("Remove Gaps",
1895 viewport.alignment));
1897 viewport.setStartRes(seq.findIndex(startRes) - 1);
1899 viewport.firePropertyChange("alignment", null,
1900 viewport.getAlignment().getSequences());
1907 * @param e DOCUMENT ME!
1909 public void padGapsMenuitem_actionPerformed(ActionEvent e)
1911 viewport.padGaps = padGapsMenuitem.isSelected();
1913 viewport.firePropertyChange("alignment",
1915 viewport.getAlignment().getSequences());
1921 * @param e DOCUMENT ME!
1923 public void findMenuItem_actionPerformed(ActionEvent e)
1928 public void newView_actionPerformed(ActionEvent e)
1930 AlignmentPanel newap =
1931 new Jalview2XML().copyAlignPanel(alignPanel, true);
1933 if (viewport.viewName == null)
1935 viewport.viewName = "Original";
1938 newap.av.historyList = viewport.historyList;
1939 newap.av.redoList = viewport.redoList;
1941 int index = Desktop.getViewCount(viewport.getSequenceSetId());
1942 String newViewName = "View " + index;
1944 Vector comps = (Vector) PaintRefresher.components.get(viewport.
1945 getSequenceSetId());
1946 Vector existingNames = new Vector();
1947 for (int i = 0; i < comps.size(); i++)
1949 if (comps.elementAt(i) instanceof AlignmentPanel)
1951 AlignmentPanel ap = (AlignmentPanel) comps.elementAt(i);
1952 if (!existingNames.contains(ap.av.viewName))
1954 existingNames.addElement(ap.av.viewName);
1959 while (existingNames.contains(newViewName))
1961 newViewName = "View " + (++index);
1964 newap.av.viewName = newViewName;
1966 addAlignmentPanel(newap, false);
1968 if (alignPanels.size() == 2)
1970 viewport.gatherViewsHere = true;
1972 tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1);
1975 public void expandViews_actionPerformed(ActionEvent e)
1977 Desktop.instance.explodeViews(this);
1980 public void gatherViews_actionPerformed(ActionEvent e)
1982 Desktop.instance.gatherViews(this);
1988 * @param e DOCUMENT ME!
1990 public void font_actionPerformed(ActionEvent e)
1992 new FontChooser(alignPanel);
1998 * @param e DOCUMENT ME!
2000 protected void seqLimit_actionPerformed(ActionEvent e)
2002 viewport.setShowJVSuffix(seqLimits.isSelected());
2004 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
2005 alignPanel.paintAlignment(true);
2008 public void idRightAlign_actionPerformed(ActionEvent e)
2010 viewport.rightAlignIds = idRightAlign.isSelected();
2011 alignPanel.paintAlignment(true);
2017 * @param e DOCUMENT ME!
2019 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
2021 viewport.setColourText(colourTextMenuItem.isSelected());
2022 alignPanel.paintAlignment(true);
2028 * @param e DOCUMENT ME!
2030 public void wrapMenuItem_actionPerformed(ActionEvent e)
2032 scaleAbove.setVisible(wrapMenuItem.isSelected());
2033 scaleLeft.setVisible(wrapMenuItem.isSelected());
2034 scaleRight.setVisible(wrapMenuItem.isSelected());
2035 viewport.setWrapAlignment(wrapMenuItem.isSelected());
2036 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
2039 public void showAllSeqs_actionPerformed(ActionEvent e)
2041 viewport.showAllHiddenSeqs();
2044 public void showAllColumns_actionPerformed(ActionEvent e)
2046 viewport.showAllHiddenColumns();
2050 public void hideSelSequences_actionPerformed(ActionEvent e)
2052 viewport.hideAllSelectedSeqs();
2053 alignPanel.paintAlignment(true);
2056 public void hideSelColumns_actionPerformed(ActionEvent e)
2058 viewport.hideSelectedColumns();
2059 alignPanel.paintAlignment(true);
2062 public void hiddenMarkers_actionPerformed(ActionEvent e)
2064 viewport.setShowHiddenMarkers(hiddenMarkers.isSelected());
2071 * @param e DOCUMENT ME!
2073 protected void scaleAbove_actionPerformed(ActionEvent e)
2075 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
2076 alignPanel.paintAlignment(true);
2082 * @param e DOCUMENT ME!
2084 protected void scaleLeft_actionPerformed(ActionEvent e)
2086 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
2087 alignPanel.paintAlignment(true);
2093 * @param e DOCUMENT ME!
2095 protected void scaleRight_actionPerformed(ActionEvent e)
2097 viewport.setScaleRightWrapped(scaleRight.isSelected());
2098 alignPanel.paintAlignment(true);
2104 * @param e DOCUMENT ME!
2106 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
2108 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
2109 alignPanel.paintAlignment(true);
2115 * @param e DOCUMENT ME!
2117 public void viewTextMenuItem_actionPerformed(ActionEvent e)
2119 viewport.setShowText(viewTextMenuItem.isSelected());
2120 alignPanel.paintAlignment(true);
2126 * @param e DOCUMENT ME!
2128 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
2130 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
2131 alignPanel.paintAlignment(true);
2134 public FeatureSettings featureSettings;
2135 public void featureSettings_actionPerformed(ActionEvent e)
2137 if (featureSettings != null)
2139 featureSettings.close();
2140 featureSettings = null;
2142 featureSettings = new FeatureSettings(this);
2148 * @param evt DOCUMENT ME!
2150 public void showSeqFeatures_actionPerformed(ActionEvent evt)
2152 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
2153 alignPanel.paintAlignment(true);
2154 if (alignPanel.getOverviewPanel() != null)
2156 alignPanel.getOverviewPanel().updateOverviewImage();
2163 * @param e DOCUMENT ME!
2165 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
2167 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
2168 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
2174 * @param e DOCUMENT ME!
2176 public void overviewMenuItem_actionPerformed(ActionEvent e)
2178 if (alignPanel.overviewPanel != null)
2183 JInternalFrame frame = new JInternalFrame();
2184 OverviewPanel overview = new OverviewPanel(alignPanel);
2185 frame.setContentPane(overview);
2186 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
2187 frame.getWidth(), frame.getHeight());
2189 frame.setLayer(JLayeredPane.PALETTE_LAYER);
2190 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
2192 public void internalFrameClosed(
2193 javax.swing.event.InternalFrameEvent evt)
2195 alignPanel.setOverviewPanel(null);
2200 alignPanel.setOverviewPanel(overview);
2203 public void textColour_actionPerformed(ActionEvent e)
2205 new TextColourChooser().chooseColour(alignPanel, null);
2211 * @param e DOCUMENT ME!
2213 protected void noColourmenuItem_actionPerformed(ActionEvent e)
2221 * @param e DOCUMENT ME!
2223 public void clustalColour_actionPerformed(ActionEvent e)
2225 changeColour(new ClustalxColourScheme(
2226 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
2232 * @param e DOCUMENT ME!
2234 public void zappoColour_actionPerformed(ActionEvent e)
2236 changeColour(new ZappoColourScheme());
2242 * @param e DOCUMENT ME!
2244 public void taylorColour_actionPerformed(ActionEvent e)
2246 changeColour(new TaylorColourScheme());
2252 * @param e DOCUMENT ME!
2254 public void hydrophobicityColour_actionPerformed(ActionEvent e)
2256 changeColour(new HydrophobicColourScheme());
2262 * @param e DOCUMENT ME!
2264 public void helixColour_actionPerformed(ActionEvent e)
2266 changeColour(new HelixColourScheme());
2272 * @param e DOCUMENT ME!
2274 public void strandColour_actionPerformed(ActionEvent e)
2276 changeColour(new StrandColourScheme());
2282 * @param e DOCUMENT ME!
2284 public void turnColour_actionPerformed(ActionEvent e)
2286 changeColour(new TurnColourScheme());
2292 * @param e DOCUMENT ME!
2294 public void buriedColour_actionPerformed(ActionEvent e)
2296 changeColour(new BuriedColourScheme());
2302 * @param e DOCUMENT ME!
2304 public void nucleotideColour_actionPerformed(ActionEvent e)
2306 changeColour(new NucleotideColourScheme());
2309 public void annotationColour_actionPerformed(ActionEvent e)
2311 new AnnotationColourChooser(viewport, alignPanel);
2317 * @param e DOCUMENT ME!
2319 protected void applyToAllGroups_actionPerformed(ActionEvent e)
2321 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
2327 * @param cs DOCUMENT ME!
2329 public void changeColour(ColourSchemeI cs)
2335 if (viewport.getAbovePIDThreshold())
2337 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
2340 cs.setThreshold(threshold,
2341 viewport.getIgnoreGapsConsensus());
2343 viewport.setGlobalColourScheme(cs);
2347 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2350 if (viewport.getConservationSelected())
2353 Alignment al = (Alignment) viewport.alignment;
2354 Conservation c = new Conservation("All",
2355 ResidueProperties.propHash, 3,
2356 al.getSequences(), 0,
2360 c.verdict(false, viewport.ConsPercGaps);
2362 cs.setConservation(c);
2364 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
2369 cs.setConservation(null);
2372 cs.setConsensus(viewport.hconsensus);
2375 viewport.setGlobalColourScheme(cs);
2377 if (viewport.getColourAppliesToAllGroups())
2379 Vector groups = viewport.alignment.getGroups();
2381 for (int i = 0; i < groups.size(); i++)
2383 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
2391 if (cs instanceof ClustalxColourScheme)
2393 sg.cs = new ClustalxColourScheme(
2394 sg.getSequences(viewport.hiddenRepSequences), sg.getWidth());
2396 else if (cs instanceof UserColourScheme)
2398 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
2404 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
2406 catch (Exception ex)
2411 if (viewport.getAbovePIDThreshold()
2412 || cs instanceof PIDColourScheme
2413 || cs instanceof Blosum62ColourScheme)
2415 sg.cs.setThreshold(threshold,
2416 viewport.getIgnoreGapsConsensus());
2418 sg.cs.setConsensus(AAFrequency.calculate(
2419 sg.getSequences(viewport.hiddenRepSequences), sg.getStartRes(),
2420 sg.getEndRes() + 1));
2424 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2427 if (viewport.getConservationSelected())
2429 Conservation c = new Conservation("Group",
2430 ResidueProperties.propHash, 3,
2431 sg.getSequences(viewport.
2432 hiddenRepSequences),
2434 sg.getEndRes() + 1);
2436 c.verdict(false, viewport.ConsPercGaps);
2437 sg.cs.setConservation(c);
2441 sg.cs.setConservation(null);
2446 if (alignPanel.getOverviewPanel() != null)
2448 alignPanel.getOverviewPanel().updateOverviewImage();
2454 alignPanel.paintAlignment(true);
2460 * @param e DOCUMENT ME!
2462 protected void modifyPID_actionPerformed(ActionEvent e)
2464 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme != null)
2466 SliderPanel.setPIDSliderSource(alignPanel,
2467 viewport.getGlobalColourScheme(),
2469 SliderPanel.showPIDSlider();
2476 * @param e DOCUMENT ME!
2478 protected void modifyConservation_actionPerformed(ActionEvent e)
2480 if (viewport.getConservationSelected() && viewport.globalColourScheme != null)
2482 SliderPanel.setConservationSlider(alignPanel,
2483 viewport.globalColourScheme,
2485 SliderPanel.showConservationSlider();
2492 * @param e DOCUMENT ME!
2494 protected void conservationMenuItem_actionPerformed(ActionEvent e)
2496 viewport.setConservationSelected(conservationMenuItem.isSelected());
2498 viewport.setAbovePIDThreshold(false);
2499 abovePIDThreshold.setSelected(false);
2501 changeColour(viewport.getGlobalColourScheme());
2503 modifyConservation_actionPerformed(null);
2509 * @param e DOCUMENT ME!
2511 public void abovePIDThreshold_actionPerformed(ActionEvent e)
2513 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
2515 conservationMenuItem.setSelected(false);
2516 viewport.setConservationSelected(false);
2518 changeColour(viewport.getGlobalColourScheme());
2520 modifyPID_actionPerformed(null);
2526 * @param e DOCUMENT ME!
2528 public void userDefinedColour_actionPerformed(ActionEvent e)
2530 if (e.getActionCommand().equals("User Defined..."))
2532 new UserDefinedColours(alignPanel, null);
2536 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
2537 getUserColourSchemes().get(e.getActionCommand());
2543 public void updateUserColourMenu()
2546 Component[] menuItems = colourMenu.getMenuComponents();
2547 int i, iSize = menuItems.length;
2548 for (i = 0; i < iSize; i++)
2550 if (menuItems[i].getName() != null &&
2551 menuItems[i].getName().equals("USER_DEFINED"))
2553 colourMenu.remove(menuItems[i]);
2557 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
2559 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
2560 getUserColourSchemes().keys();
2562 while (userColours.hasMoreElements())
2564 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(
2566 nextElement().toString());
2567 radioItem.setName("USER_DEFINED");
2568 radioItem.addMouseListener(new MouseAdapter()
2570 public void mousePressed(MouseEvent evt)
2572 if (evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
2574 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
2576 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.
2578 "Remove from default list?",
2579 "Remove user defined colour",
2580 JOptionPane.YES_NO_OPTION);
2581 if (option == JOptionPane.YES_OPTION)
2583 jalview.gui.UserDefinedColours.removeColourFromDefaults(
2584 radioItem.getText());
2585 colourMenu.remove(radioItem);
2589 radioItem.addActionListener(new ActionListener()
2591 public void actionPerformed(ActionEvent evt)
2593 userDefinedColour_actionPerformed(evt);
2600 radioItem.addActionListener(new ActionListener()
2602 public void actionPerformed(ActionEvent evt)
2604 userDefinedColour_actionPerformed(evt);
2608 colourMenu.insert(radioItem, 15);
2609 colours.add(radioItem);
2617 * @param e DOCUMENT ME!
2619 public void PIDColour_actionPerformed(ActionEvent e)
2621 changeColour(new PIDColourScheme());
2627 * @param e DOCUMENT ME!
2629 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
2631 changeColour(new Blosum62ColourScheme());
2637 * @param e DOCUMENT ME!
2639 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
2641 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2642 AlignmentSorter.sortByPID(viewport.getAlignment(),
2643 viewport.getAlignment().getSequenceAt(0));
2644 addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder,
2645 viewport.alignment));
2646 alignPanel.paintAlignment(true);
2652 * @param e DOCUMENT ME!
2654 public void sortIDMenuItem_actionPerformed(ActionEvent e)
2656 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2657 AlignmentSorter.sortByID(viewport.getAlignment());
2658 addHistoryItem(new OrderCommand("ID Sort", oldOrder, viewport.alignment));
2659 alignPanel.paintAlignment(true);
2665 * @param e DOCUMENT ME!
2667 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
2669 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2670 AlignmentSorter.sortByGroup(viewport.getAlignment());
2671 addHistoryItem(new OrderCommand("Group Sort", oldOrder, viewport.alignment));
2673 alignPanel.paintAlignment(true);
2679 * @param e DOCUMENT ME!
2681 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
2683 new RedundancyPanel(alignPanel, this);
2689 * @param e DOCUMENT ME!
2691 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
2693 if ( (viewport.getSelectionGroup() == null) ||
2694 (viewport.getSelectionGroup().getSize() < 2))
2696 JOptionPane.showInternalMessageDialog(this,
2697 "You must select at least 2 sequences.",
2698 "Invalid Selection",
2699 JOptionPane.WARNING_MESSAGE);
2703 JInternalFrame frame = new JInternalFrame();
2704 frame.setContentPane(new PairwiseAlignPanel(viewport));
2705 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
2712 * @param e DOCUMENT ME!
2714 public void PCAMenuItem_actionPerformed(ActionEvent e)
2716 if ( ( (viewport.getSelectionGroup() != null) &&
2717 (viewport.getSelectionGroup().getSize() < 4) &&
2718 (viewport.getSelectionGroup().getSize() > 0)) ||
2719 (viewport.getAlignment().getHeight() < 4))
2721 JOptionPane.showInternalMessageDialog(this,
2722 "Principal component analysis must take\n" +
2723 "at least 4 input sequences.",
2724 "Sequence selection insufficient",
2725 JOptionPane.WARNING_MESSAGE);
2730 new PCAPanel(alignPanel);
2733 public void autoCalculate_actionPerformed(ActionEvent e)
2735 viewport.autoCalculateConsensus = autoCalculate.isSelected();
2736 if (viewport.autoCalculateConsensus)
2738 viewport.firePropertyChange("alignment",
2740 viewport.getAlignment().getSequences());
2747 * @param e DOCUMENT ME!
2749 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
2751 NewTreePanel("AV", "PID", "Average distance tree using PID");
2757 * @param e DOCUMENT ME!
2759 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
2761 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
2767 * @param e DOCUMENT ME!
2769 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
2771 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
2777 * @param e DOCUMENT ME!
2779 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
2781 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
2787 * @param type DOCUMENT ME!
2788 * @param pwType DOCUMENT ME!
2789 * @param title DOCUMENT ME!
2791 void NewTreePanel(String type, String pwType, String title)
2795 if (viewport.getSelectionGroup() != null)
2797 if (viewport.getSelectionGroup().getSize() < 3)
2799 JOptionPane.showMessageDialog(Desktop.desktop,
2800 "You need to have more than two sequences selected to build a tree!",
2801 "Not enough sequences",
2802 JOptionPane.WARNING_MESSAGE);
2807 SequenceGroup sg = viewport.getSelectionGroup();
2809 /* Decide if the selection is a column region */
2810 while (s < sg.getSize())
2812 if ( ( (SequenceI) sg.getSequences(null).elementAt(s++)).getLength() <
2815 JOptionPane.showMessageDialog(Desktop.desktop,
2816 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
2817 "Try using the Pad function in the edit menu,\n" +
2818 "or one of the multiple sequence alignment web services.",
2819 "Sequences in selection are not aligned",
2820 JOptionPane.WARNING_MESSAGE);
2826 title = title + " on region";
2827 tp = new TreePanel(alignPanel, type, pwType);
2831 //are the sequences aligned?
2832 if (!viewport.alignment.isAligned())
2834 JOptionPane.showMessageDialog(Desktop.desktop,
2835 "The sequences must be aligned before creating a tree.\n" +
2836 "Try using the Pad function in the edit menu,\n" +
2837 "or one of the multiple sequence alignment web services.",
2838 "Sequences not aligned",
2839 JOptionPane.WARNING_MESSAGE);
2844 if (viewport.alignment.getHeight() < 2)
2849 tp = new TreePanel(alignPanel, type, pwType);
2854 if (viewport.viewName != null)
2856 title += viewport.viewName + " of ";
2859 title += this.title;
2861 Desktop.addInternalFrame(tp, title, 600, 500);
2867 * @param title DOCUMENT ME!
2868 * @param order DOCUMENT ME!
2870 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
2872 final JMenuItem item = new JMenuItem("by " + title);
2874 item.addActionListener(new java.awt.event.ActionListener()
2876 public void actionPerformed(ActionEvent e)
2878 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2880 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
2881 AlignmentSorter.sortBy(viewport.getAlignment(), order);
2883 addHistoryItem(new OrderCommand(order.getName(), oldOrder,
2884 viewport.alignment));
2886 alignPanel.paintAlignment(true);
2892 * Maintain the Order by->Displayed Tree menu.
2893 * Creates a new menu item for a TreePanel with an appropriate
2894 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
2895 * to remove the menu item when the treePanel is closed, and adjust
2896 * the tree leaf to sequence mapping when the alignment is modified.
2897 * @param treePanel Displayed tree window.
2898 * @param title SortBy menu item title.
2900 public void buildTreeMenu()
2902 sortByTreeMenu.removeAll();
2904 Vector comps = (Vector) PaintRefresher.components.get(viewport.
2905 getSequenceSetId());
2906 Vector treePanels = new Vector();
2907 int i, iSize = comps.size();
2908 for (i = 0; i < iSize; i++)
2910 if (comps.elementAt(i) instanceof TreePanel)
2912 treePanels.add(comps.elementAt(i));
2916 iSize = treePanels.size();
2920 sortByTreeMenu.setVisible(false);
2924 sortByTreeMenu.setVisible(true);
2926 for (i = 0; i < treePanels.size(); i++)
2928 TreePanel tp = (TreePanel) treePanels.elementAt(i);
2929 final JMenuItem item = new JMenuItem(tp.getTitle());
2930 final NJTree tree = ( (TreePanel) treePanels.elementAt(i)).getTree();
2931 item.addActionListener(new java.awt.event.ActionListener()
2933 public void actionPerformed(ActionEvent e)
2935 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2936 AlignmentSorter.sortByTree(viewport.getAlignment(), tree);
2938 addHistoryItem(new OrderCommand("Tree Sort",
2940 viewport.alignment));
2942 alignPanel.paintAlignment(true);
2946 sortByTreeMenu.add(item);
2951 * Work out whether the whole set of sequences
2952 * or just the selected set will be submitted for multiple alignment.
2955 private jalview.datamodel.AlignmentView gatherSequencesForAlignment()
2957 // Now, check we have enough sequences
2958 AlignmentView msa = null;
2960 if ( (viewport.getSelectionGroup() != null) &&
2961 (viewport.getSelectionGroup().getSize() > 1))
2963 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
2964 /*SequenceGroup seqs = viewport.getSelectionGroup();
2966 msa = new SequenceI[sz = seqs.getSize(false)];
2968 for (int i = 0; i < sz; i++)
2970 msa[i] = (SequenceI) seqs.getSequenceAt(i);
2972 msa = viewport.getAlignmentView(true);
2976 /*Vector seqs = viewport.getAlignment().getSequences();
2977 if (seqs.size() > 1)
2979 msa = new SequenceI[seqs.size()];
2981 for (int i = 0; i < seqs.size(); i++)
2983 msa[i] = (SequenceI) seqs.elementAt(i);
2986 msa = viewport.getAlignmentView(false);
2992 * Decides what is submitted to a secondary structure prediction service,
2993 * the currently selected sequence, or the currently selected alignment
2994 * (where the first sequence in the set is the one that the prediction
2997 AlignmentView gatherSeqOrMsaForSecStrPrediction()
2999 AlignmentView seqs = null;
3001 if ( (viewport.getSelectionGroup() != null) &&
3002 (viewport.getSelectionGroup().getSize() > 0))
3004 seqs = viewport.getAlignmentView(true);
3008 seqs = viewport.getAlignmentView(false);
3010 // limit sequences - JBPNote in future - could spawn multiple prediction jobs
3011 // TODO: viewport.alignment.isAligned is a global state - the local selection may well be aligned - we preserve 2.0.8 behaviour for moment.
3012 if (!viewport.alignment.isAligned())
3014 seqs.setSequences(new SeqCigar[]
3015 {seqs.getSequences()[0]});
3023 * @param e DOCUMENT ME!
3025 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
3027 // Pick the tree file
3028 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
3031 chooser.setFileView(new JalviewFileView());
3032 chooser.setDialogTitle("Select a newick-like tree file");
3033 chooser.setToolTipText("Load a tree file");
3035 int value = chooser.showOpenDialog(null);
3037 if (value == JalviewFileChooser.APPROVE_OPTION)
3039 String choice = chooser.getSelectedFile().getPath();
3040 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
3044 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
3046 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
3048 catch (Exception ex)
3050 JOptionPane.showMessageDialog(Desktop.desktop,
3051 "Problem reading tree file",
3053 JOptionPane.WARNING_MESSAGE);
3054 ex.printStackTrace();
3059 public TreePanel ShowNewickTree(NewickFile nf, String title)
3061 return ShowNewickTree(nf, title, 600, 500, 4, 5);
3064 public TreePanel ShowNewickTree(NewickFile nf, String title,
3065 AlignmentView input)
3067 return ShowNewickTree(nf, title, input, 600, 500, 4, 5);
3070 public TreePanel ShowNewickTree(NewickFile nf, String title, int w, int h,
3073 return ShowNewickTree(nf, title, null, w, h, x, y);
3077 * Add a treeviewer for the tree extracted from a newick file object to the current alignment view
3079 * @param nf the tree
3080 * @param title tree viewer title
3081 * @param input Associated alignment input data (or null)
3086 * @return TreePanel handle
3088 public TreePanel ShowNewickTree(NewickFile nf, String title,
3089 AlignmentView input, int w, int h, int x,
3092 TreePanel tp = null;
3098 if (nf.getTree() != null)
3100 tp = new TreePanel(alignPanel,
3109 tp.setLocation(x, y);
3112 Desktop.addInternalFrame(tp, title, w, h);
3115 catch (Exception ex)
3117 ex.printStackTrace();
3124 * Generates menu items and listener event actions for web service clients
3127 public void BuildWebServiceMenu()
3129 if ( (Discoverer.services != null)
3130 && (Discoverer.services.size() > 0))
3132 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
3133 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
3134 Vector wsmenu = new Vector();
3135 final AlignFrame af = this;
3138 // Add any Multiple Sequence Alignment Services
3139 final JMenu msawsmenu = new JMenu("Alignment");
3140 for (int i = 0, j = msaws.size(); i < j; i++)
3142 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
3144 final JMenuItem method = new JMenuItem(sh.getName());
3145 method.addActionListener(new ActionListener()
3147 public void actionPerformed(ActionEvent e)
3149 AlignmentView msa = gatherSequencesForAlignment();
3150 new jalview.ws.MsaWSClient(sh, title, msa,
3152 viewport.getAlignment().getDataset(),
3158 msawsmenu.add(method);
3159 // Deal with services that we know accept partial alignments.
3160 if (sh.getName().indexOf("lustal") > -1)
3162 // We know that ClustalWS can accept partial alignments for refinement.
3163 final JMenuItem methodR = new JMenuItem(sh.getName() + " Realign");
3164 methodR.addActionListener(new ActionListener()
3166 public void actionPerformed(ActionEvent e)
3168 AlignmentView msa = gatherSequencesForAlignment();
3169 new jalview.ws.MsaWSClient(sh, title, msa,
3171 viewport.getAlignment().getDataset(),
3177 msawsmenu.add(methodR);
3181 wsmenu.add(msawsmenu);
3183 if (secstrpr != null)
3185 // Add any secondary structure prediction services
3186 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
3187 for (int i = 0, j = secstrpr.size(); i < j; i++)
3189 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
3191 final JMenuItem method = new JMenuItem(sh.getName());
3192 method.addActionListener(new ActionListener()
3194 public void actionPerformed(ActionEvent e)
3196 AlignmentView msa = gatherSeqOrMsaForSecStrPrediction();
3197 if (msa.getSequences().length == 1)
3199 // Single Sequence prediction
3200 new jalview.ws.JPredClient(sh, title, false, msa, af, true);
3204 if (msa.getSequences().length > 1)
3206 // Sequence profile based prediction
3207 new jalview.ws.JPredClient(sh,
3208 title, true, msa, af, true);
3213 secstrmenu.add(method);
3215 wsmenu.add(secstrmenu);
3217 this.webService.removeAll();
3218 for (int i = 0, j = wsmenu.size(); i < j; i++)
3220 webService.add( (JMenu) wsmenu.get(i));
3225 this.webService.removeAll();
3226 this.webService.add(this.webServiceNoServices);
3228 // TODO: add in rediscovery function
3229 // TODO: reduce code redundancy.
3230 // TODO: group services by location as well as function.
3233 /* public void vamsasStore_actionPerformed(ActionEvent e)
3235 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
3236 getProperty("LAST_DIRECTORY"));
3238 chooser.setFileView(new JalviewFileView());
3239 chooser.setDialogTitle("Export to Vamsas file");
3240 chooser.setToolTipText("Export");
3242 int value = chooser.showSaveDialog(this);
3244 if (value == JalviewFileChooser.APPROVE_OPTION)
3246 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
3247 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
3248 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
3255 public void showTranslation_actionPerformed(ActionEvent e)
3257 SequenceI[] selection = viewport.getSelectionAsNewSequence();
3258 String[] seqstring = viewport.getViewAsString(true);
3260 int s, sSize = selection.length;
3261 SequenceI[] newSeq = new SequenceI[sSize];
3264 StringBuffer protein;
3266 for (s = 0; s < sSize; s++)
3268 protein = new StringBuffer();
3269 seq = AlignSeq.extractGaps("-. ", seqstring[s]);
3270 resSize = seq.length();
3271 resSize -= resSize % 3;
3273 for (res = 0; res < resSize; res += 3)
3275 String codon = seq.substring(res, res + 3);
3276 codon = codon.replace('U', 'T');
3277 String aa = ResidueProperties.codonTranslate(codon);
3280 protein.append(viewport.getGapCharacter());
3282 else if (aa.equals("STOP"))
3284 protein.append("X");
3291 newSeq[s] = new Sequence(selection[s].getName(),
3292 protein.toString());
3295 AlignmentI al = new Alignment(newSeq);
3296 al.setDataset(null);
3298 ////////////////////////////////
3299 // Copy annotations across
3300 jalview.datamodel.AlignmentAnnotation[] annotations
3301 = viewport.alignment.getAlignmentAnnotation();
3303 if (annotations != null)
3305 for (int i = 0; i < annotations.length; i++)
3307 if (annotations[i] == viewport.quality ||
3308 annotations[i] == viewport.conservation ||
3309 annotations[i] == viewport.consensus)
3311 System.out.println("COPT HERE");
3315 aSize = viewport.alignment.getWidth() / 3;
3316 jalview.datamodel.Annotation[] anots =
3317 new jalview.datamodel.Annotation[aSize];
3319 for (a = 0; a < viewport.alignment.getWidth(); a++)
3321 if (annotations[i].annotations[a] == null
3322 || annotations[i].annotations[a] == null)
3327 anots[a / 3] = new Annotation(
3328 annotations[i].annotations[a].displayCharacter,
3329 annotations[i].annotations[a].description,
3330 annotations[i].annotations[a].secondaryStructure,
3331 annotations[i].annotations[a].value,
3332 annotations[i].annotations[a].colour);
3335 jalview.datamodel.AlignmentAnnotation aa
3336 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
3337 annotations[i].description, anots);
3338 al.addAnnotation(aa);
3342 AlignFrame af = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT);
3343 Desktop.addInternalFrame(af, "Translation of " + this.getTitle(),
3352 * @param String DOCUMENT ME!
3354 public boolean parseFeaturesFile(String file, String type)
3356 boolean featuresFile = false;
3359 featuresFile = new FeaturesFile(file,
3360 type).parse(viewport.alignment.getDataset(),
3361 alignPanel.seqPanel.seqCanvas.
3362 getFeatureRenderer().featureColours,
3365 catch (Exception ex)
3367 ex.printStackTrace();
3372 viewport.showSequenceFeatures = true;
3373 showSeqFeatures.setSelected(true);
3374 alignPanel.paintAlignment(true);
3377 return featuresFile;
3380 public void dragEnter(DropTargetDragEvent evt)
3383 public void dragExit(DropTargetEvent evt)
3386 public void dragOver(DropTargetDragEvent evt)
3389 public void dropActionChanged(DropTargetDragEvent evt)
3392 public void drop(DropTargetDropEvent evt)
3394 Transferable t = evt.getTransferable();
3395 java.util.List files = null;
3399 DataFlavor uriListFlavor = new DataFlavor(
3400 "text/uri-list;class=java.lang.String");
3401 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
3403 //Works on Windows and MacOSX
3404 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
3405 files = (java.util.List) t.getTransferData(DataFlavor.
3406 javaFileListFlavor);
3408 else if (t.isDataFlavorSupported(uriListFlavor))
3410 // This is used by Unix drag system
3411 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
3412 String data = (String) t.getTransferData(uriListFlavor);
3413 files = new java.util.ArrayList(1);
3414 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
3417 st.hasMoreTokens(); )
3419 String s = st.nextToken();
3420 if (s.startsWith("#"))
3422 // the line is a comment (as per the RFC 2483)
3426 java.net.URI uri = new java.net.URI(s);
3427 java.io.File file = new java.io.File(uri);
3434 e.printStackTrace();
3441 for (int i = 0; i < files.size(); i++)
3443 loadJalviewDataFile(files.get(i).toString());
3446 catch (Exception ex)
3448 ex.printStackTrace();
3453 // This method will attempt to load a "dropped" file first by testing
3454 // whether its and Annotation file, then features file. If both are
3455 // false then the user may have dropped an alignment file onto this
3457 public void loadJalviewDataFile(String file)
3461 String protocol = "File";
3463 if (file.indexOf("http:") > -1 || file.indexOf("file:") > -1)
3468 boolean isAnnotation = new AnnotationFile().readAnnotationFile(viewport.
3469 alignment, file, protocol);
3473 boolean isGroupsFile = parseFeaturesFile(file, protocol);
3476 String format = new IdentifyFile().Identify(file, protocol);
3478 if (format.equalsIgnoreCase("JnetFile"))
3480 jalview.io.JPredFile predictions = new jalview.io.JPredFile(
3482 new JnetAnnotationMaker().add_annotation(predictions,
3483 viewport.getAlignment(),
3485 alignPanel.adjustAnnotationHeight();
3486 alignPanel.paintAlignment(true);
3490 new FileLoader().LoadFile(viewport, file, protocol, format);
3497 alignPanel.adjustAnnotationHeight();
3501 catch (Exception ex)
3503 ex.printStackTrace();
3507 public void tabSelectionChanged(int index)
3511 alignPanel = (AlignmentPanel) alignPanels.elementAt(index);
3512 viewport = alignPanel.av;
3513 setMenusFromViewport(viewport);
3517 public void tabbedPane_mousePressed(MouseEvent e)
3519 if (SwingUtilities.isRightMouseButton(e))
3521 String reply = JOptionPane.showInternalInputDialog(this,
3524 JOptionPane.QUESTION_MESSAGE);
3528 viewport.viewName = reply;
3529 tabbedPane.setTitleAt(tabbedPane.getSelectedIndex(), reply);
3534 public AlignViewport getCurrentView()
3544 public PrintThread(AlignmentPanel ap)
3549 static PageFormat pf;
3552 PrinterJob printJob = PrinterJob.getPrinterJob();
3556 printJob.setPrintable(ap, pf);
3560 printJob.setPrintable(ap);
3563 if (printJob.printDialog())
3569 catch (Exception PrintException)
3571 PrintException.printStackTrace();