2 * Jalview - A Sequence Alignment Editor and Viewer
3 * Copyright (C) 2006 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.event.*;
28 import java.awt.print.*;
31 import jalview.analysis.*;
32 import jalview.datamodel.*;
34 import jalview.jbgui.*;
35 import jalview.schemes.*;
36 import jalview.commands.*;
38 import java.awt.dnd.*;
39 import javax.swing.event.ChangeListener;
40 import javax.swing.event.ChangeEvent;
48 public class AlignFrame extends GAlignFrame implements DropTargetListener
51 public static final int DEFAULT_WIDTH = 700;
54 public static final int DEFAULT_HEIGHT = 500;
55 public AlignmentPanel alignPanel;
57 AlignViewport viewport;
59 Vector alignPanels = new Vector();
63 String currentFileFormat = null;
65 String fileName = null;
69 * Creates a new AlignFrame object.
71 * @param al DOCUMENT ME!
73 public AlignFrame(AlignmentI al, int width, int height)
75 this(al, null, width, height);
80 * new alignment window with hidden columns
81 * @param al AlignmentI
82 * @param hiddenColumns ColumnSelection or null
84 public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns,
85 int width, int height)
87 this.setSize(width, height);
88 viewport = new AlignViewport(al, hiddenColumns);
90 alignPanel = new AlignmentPanel(this, viewport);
92 if(al.getDataset()==null)
97 addAlignmentPanel(alignPanel, true);
102 * Make a new AlignFrame from exisiting alignmentPanels
103 * @param ap AlignmentPanel
104 * @param av AlignViewport
106 public AlignFrame(AlignmentPanel ap)
110 addAlignmentPanel(ap, false);
116 this.setDropTarget(new java.awt.dnd.DropTarget(this, this));
118 if (viewport.conservation == null)
120 BLOSUM62Colour.setEnabled(false);
121 conservationMenuItem.setEnabled(false);
122 modifyConservation.setEnabled(false);
123 // PIDColour.setEnabled(false);
124 // abovePIDThreshold.setEnabled(false);
125 // modifyPID.setEnabled(false);
128 String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT", "No sort");
130 if (sortby.equals("Id"))
131 sortIDMenuItem_actionPerformed(null);
132 else if (sortby.equals("Pairwise Identity"))
133 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);
152 public void setFileName(String file, String format)
155 currentFileFormat = format;
156 reload.setEnabled(true);
159 void addKeyListener()
161 addKeyListener(new KeyAdapter()
163 public void keyPressed(KeyEvent evt)
165 if (viewport.cursorMode
166 && evt.getKeyCode() >= KeyEvent.VK_0
167 && evt.getKeyCode() <= KeyEvent.VK_9)
169 alignPanel.seqPanel.numberPressed(evt.getKeyChar());
172 switch (evt.getKeyCode())
175 case 27: // escape key
176 deselectAllSequenceMenuItem_actionPerformed(null);
180 case KeyEvent.VK_DOWN:
181 if (viewport.cursorMode)
183 alignPanel.seqPanel.moveCursor(0, 1);
186 moveSelectedSequences(false);
190 if (viewport.cursorMode)
192 alignPanel.seqPanel.moveCursor(0, -1);
195 moveSelectedSequences(true);
198 case KeyEvent.VK_LEFT:
199 if (viewport.cursorMode)
201 alignPanel.seqPanel.moveCursor( -1, 0);
205 case KeyEvent.VK_RIGHT:
206 if (viewport.cursorMode)
208 alignPanel.seqPanel.moveCursor(1, 0);
212 case KeyEvent.VK_SPACE:
213 if (viewport.cursorMode)
215 alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown()
221 case KeyEvent.VK_DELETE:
222 case KeyEvent.VK_BACK_SPACE:
223 if (!viewport.cursorMode)
225 cut_actionPerformed(null);
228 alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown()
235 if (viewport.cursorMode)
237 alignPanel.seqPanel.setCursorRow();
241 if (viewport.cursorMode && !evt.isControlDown())
243 alignPanel.seqPanel.setCursorColumn();
247 if (viewport.cursorMode)
249 alignPanel.seqPanel.setCursorPosition();
253 case KeyEvent.VK_ENTER:
254 case KeyEvent.VK_COMMA:
255 if (viewport.cursorMode)
257 alignPanel.seqPanel.setCursorRowAndColumn();
262 if (viewport.cursorMode)
264 alignPanel.seqPanel.setSelectionAreaAtCursor(true);
268 if (viewport.cursorMode)
270 alignPanel.seqPanel.setSelectionAreaAtCursor(false);
275 viewport.cursorMode = !viewport.cursorMode;
276 statusBar.setText("Keyboard editing mode is " +
277 (viewport.cursorMode ? "on" : "off"));
278 if (viewport.cursorMode)
280 alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes;
281 alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq;
283 alignPanel.seqPanel.seqCanvas.repaint();
289 ClassLoader cl = jalview.gui.Desktop.class.getClassLoader();
290 java.net.URL url = javax.help.HelpSet.findHelpSet(cl, "help/help");
291 javax.help.HelpSet hs = new javax.help.HelpSet(cl, url);
293 javax.help.HelpBroker hb = hs.createHelpBroker();
294 hb.setCurrentID("home");
295 hb.setDisplayed(true);
299 ex.printStackTrace();
305 boolean toggleSeqs = !evt.isControlDown();
306 boolean toggleCols = !evt.isShiftDown();
308 boolean hide = false;
310 SequenceGroup sg = viewport.getSelectionGroup();
313 if (sg != null && sg.getSize(false) != viewport.alignment.getHeight())
315 hideSelSequences_actionPerformed(null);
318 else if (! (toggleCols && viewport.colSel.getSelected().size() > 0))
319 showAllSeqs_actionPerformed(null);
324 if (viewport.colSel.getSelected().size() > 0)
326 hideSelColumns_actionPerformed(null);
328 viewport.selectionGroup = sg;
331 showAllColumns_actionPerformed(null);
335 case KeyEvent.VK_PAGE_UP:
336 if (viewport.wrapAlignment)
337 alignPanel.scrollUp(true);
339 alignPanel.setScrollValues(viewport.startRes,
341 - viewport.endSeq + viewport.startSeq);
343 case KeyEvent.VK_PAGE_DOWN:
344 if (viewport.wrapAlignment)
345 alignPanel.scrollUp(false);
347 alignPanel.setScrollValues(viewport.startRes,
349 + viewport.endSeq - viewport.startSeq);
357 public void addAlignmentPanel(final AlignmentPanel ap,
360 ap.alignFrame = this;
362 alignPanels.addElement(ap);
364 PaintRefresher.Register(ap, ap.av.getSequenceSetId());
366 int aSize = alignPanels.size();
368 tabbedPane.setVisible(aSize>1 || ap.av.viewName!=null);
370 if (aSize == 1 && ap.av.viewName==null)
372 this.getContentPane().add(ap, BorderLayout.CENTER);
378 setInitialTabVisible();
381 expandViews.setEnabled(true);
382 gatherViews.setEnabled(true);
383 tabbedPane.addTab(ap.av.viewName, ap);
385 ap.setVisible(false);
391 ap.av.alignment.padGaps();
392 ap.av.updateConservation(ap);
393 ap.av.updateConsensus(ap);
397 public void setInitialTabVisible()
399 expandViews.setEnabled(true);
400 gatherViews.setEnabled(true);
401 tabbedPane.setVisible(true);
402 AlignmentPanel first = (AlignmentPanel) alignPanels.firstElement();
403 tabbedPane.addTab(first.av.viewName,first);
404 this.getContentPane().add(tabbedPane, BorderLayout.CENTER);
408 public AlignViewport getViewport()
413 /* Set up intrinsic listeners for dynamically generated GUI bits. */
414 private void addServiceListeners()
416 final java.beans.PropertyChangeListener thisListener;
417 // Do this once to get current state
418 BuildWebServiceMenu();
419 Desktop.discoverer.addPropertyChangeListener(
420 thisListener = new java.beans.PropertyChangeListener()
422 public void propertyChange(PropertyChangeEvent evt)
424 // System.out.println("Discoverer property change.");
425 if (evt.getPropertyName().equals("services"))
427 // System.out.println("Rebuilding web service menu");
428 BuildWebServiceMenu();
433 addInternalFrameListener(new javax.swing.event.
434 InternalFrameAdapter()
436 public void internalFrameClosed(
437 javax.swing.event.InternalFrameEvent evt)
439 // System.out.println("deregistering discoverer listener");
440 Desktop.discoverer.removePropertyChangeListener(thisListener);
441 closeMenuItem_actionPerformed(true);
447 public void setGUINucleotide(boolean nucleotide)
449 showTranslation.setVisible( nucleotide );
450 conservationMenuItem.setEnabled( !nucleotide );
451 modifyConservation.setEnabled( !nucleotide );
453 //Remember AlignFrame always starts as protein
456 calculateMenu.remove(calculateMenu.getItemCount()-2);
461 * Need to call this method when tabs are selected for multiple views,
462 * or when loading from Jalview2XML.java
463 * @param av AlignViewport
465 void setMenusFromViewport(AlignViewport av)
467 padGapsMenuitem.setSelected(av.padGaps);
468 colourTextMenuItem.setSelected(av.showColourText);
469 abovePIDThreshold.setSelected(av.getAbovePIDThreshold());
470 conservationMenuItem.setSelected(av.getConservationSelected());
471 seqLimits.setSelected(av.getShowJVSuffix());
472 idRightAlign.setSelected(av.rightAlignIds);
473 renderGapsMenuItem.setSelected(av.renderGaps);
474 wrapMenuItem.setSelected(av.wrapAlignment);
475 annotationPanelMenuItem.setState(av.showAnnotation);
476 viewBoxesMenuItem.setSelected(av.showBoxes);
477 viewTextMenuItem.setSelected(av.showText);
479 setColourSelected(ColourSchemeProperty.
480 getColourName(av.getGlobalColourScheme()));
482 showSeqFeatures.setSelected(av.showSequenceFeatures);
483 hiddenMarkers.setState(av.showHiddenMarkers);
484 applyToAllGroups.setState(av.colourAppliesToAllGroups);
490 Hashtable progressBars;
491 public void setProgressBar(String message, long id)
493 if(progressBars == null)
494 progressBars = new Hashtable();
496 JPanel progressPanel;
497 GridLayout layout = (GridLayout) statusPanel.getLayout();
498 if(progressBars.get( new Long(id) )!=null)
500 progressPanel = (JPanel)progressBars.get( new Long(id) );
501 statusPanel.remove(progressPanel);
502 progressBars.remove( progressPanel );
503 progressPanel = null;
505 statusBar.setText(message);
507 layout.setRows(layout.getRows() - 1);
511 progressPanel = new JPanel(new BorderLayout(10, 5));
513 JProgressBar progressBar = new JProgressBar();
514 progressBar.setIndeterminate(true);
516 progressPanel.add(new JLabel(message), BorderLayout.WEST);
517 progressPanel.add(progressBar, BorderLayout.CENTER);
519 layout.setRows(layout.getRows() + 1);
520 statusPanel.add(progressPanel);
522 progressBars.put(new Long(id), progressPanel);
532 Added so Castor Mapping file can obtain Jalview Version
534 public String getVersion()
536 return jalview.bin.Cache.getProperty("VERSION");
539 public FeatureRenderer getFeatureRenderer()
541 return alignPanel.seqPanel.seqCanvas.getFeatureRenderer();
545 public void fetchSequence_actionPerformed(ActionEvent e)
547 new SequenceFetcher(this);
550 public void addFromFile_actionPerformed(ActionEvent e)
552 Desktop.instance.inputLocalFileMenuItem_actionPerformed(viewport);
555 public void reload_actionPerformed(ActionEvent e)
559 if(currentFileFormat.equals("Jalview"))
561 JInternalFrame [] frames = Desktop.desktop.getAllFrames();
562 for(int i=0; i<frames.length; i++)
564 if (frames[i] instanceof AlignFrame
566 && ( (AlignFrame) frames[i]).fileName.equals(fileName))
569 frames[i].setSelected(true);
570 Desktop.instance.closeAssociatedWindows();
571 }catch(java.beans.PropertyVetoException ex){}
575 Desktop.instance.closeAssociatedWindows();
580 viewport.alignment.deleteAllGroups();
581 viewport.sequenceColours=null;
582 while (viewport.alignment.getHeight() > 0)
584 viewport.alignment.deleteSequence(0);
587 viewport.historyList.clear();
588 viewport.redoList.clear();
589 Alignment dset = viewport.alignment.getDataset();
590 while (dset.getHeight() > 0)
592 dset.deleteSequence(0);
595 firePropertyChange("Alignment", null, null);
600 FileLoader loader = new FileLoader();
601 String protocol = fileName.startsWith("http:")? "URL":"File";
602 loader.LoadFile(viewport, fileName, protocol, currentFileFormat);
608 public void addFromText_actionPerformed(ActionEvent e)
610 Desktop.instance.inputTextboxMenuItem_actionPerformed(viewport);
613 public void addFromURL_actionPerformed(ActionEvent e)
615 Desktop.instance.inputURLMenuItem_actionPerformed(viewport);
619 public void save_actionPerformed(ActionEvent e)
622 || currentFileFormat==null
623 || fileName.startsWith("http")
625 saveAs_actionPerformed(null);
627 saveAlignment(fileName, currentFileFormat);
633 * @param e DOCUMENT ME!
635 public void saveAs_actionPerformed(ActionEvent e)
637 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
638 getProperty( "LAST_DIRECTORY"),
640 { "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc","jar" },
642 { "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview" },
647 chooser.setFileView(new JalviewFileView());
648 chooser.setDialogTitle("Save Alignment to file");
649 chooser.setToolTipText("Save");
651 int value = chooser.showSaveDialog(this);
653 if (value == JalviewFileChooser.APPROVE_OPTION)
655 currentFileFormat = chooser.getSelectedFormat();
656 if (currentFileFormat == null)
658 JOptionPane.showInternalMessageDialog(Desktop.desktop,
659 "You must select a file format before saving!",
660 "File format not specified",
661 JOptionPane.WARNING_MESSAGE);
662 value = chooser.showSaveDialog(this);
666 fileName = chooser.getSelectedFile().getPath();
668 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
671 jalview.bin.Cache.setProperty("LAST_DIRECTORY", fileName);
673 saveAlignment(fileName, currentFileFormat);
677 public boolean saveAlignment(String file, String format)
679 if (format.equalsIgnoreCase("Jalview"))
681 String shortName = title;
683 if (shortName.indexOf(java.io.File.separatorChar) > -1)
685 shortName = shortName.substring(shortName.lastIndexOf(
686 java.io.File.separatorChar) + 1);
689 new Jalview2XML().SaveAlignment(this, file, shortName);
691 statusBar.setText("Successfully saved to file: "
693 +format +" format.");
696 // USE Jalview2XML to save this file
702 String[] omitHidden = null;
704 if (viewport.hasHiddenColumns)
706 int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop,
707 "The Alignment contains hidden columns."
708 + "\nDo you want to save only the visible alignment?",
709 "Save / Omit Hidden Columns",
710 JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
712 if (reply == JOptionPane.YES_OPTION)
713 omitHidden = viewport.getViewAsString(false);
716 String output = new FormatAdapter().formatSequences(
718 viewport.alignment.getSequencesArray(),
728 java.io.PrintWriter out = new java.io.PrintWriter(
729 new java.io.FileWriter(file));
734 statusBar.setText("Successfully saved to file: "
736 +format +" format.");
741 ex.printStackTrace();
750 * @param e DOCUMENT ME!
752 protected void outputText_actionPerformed(ActionEvent e)
754 String [] omitHidden = null;
756 if(viewport.hasHiddenColumns)
758 int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop,
759 "The Alignment contains hidden columns."
760 +"\nDo you want to output only the visible alignment?",
761 "Save / Omit Hidden Columns",
762 JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
764 if(reply==JOptionPane.YES_OPTION)
766 omitHidden = viewport.getViewAsString(false);
770 CutAndPasteTransfer cap = new CutAndPasteTransfer();
771 cap.setForInput(null);
772 Desktop.addInternalFrame(cap,
773 "Alignment output - " + e.getActionCommand(), 600,
777 cap.setText(new FormatAdapter().formatSequences(
778 e.getActionCommand(),
779 viewport.alignment.getSequencesArray(),
786 * @param e DOCUMENT ME!
788 protected void htmlMenuItem_actionPerformed(ActionEvent e)
790 new HTMLOutput(viewport,
791 alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
792 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
795 public void createImageMap(File file, String image)
797 alignPanel.makePNGImageMap(file, image);
803 * @param e DOCUMENT ME!
805 public void createPNG(File f)
807 alignPanel.makePNG(f);
813 * @param e DOCUMENT ME!
815 public void createEPS(File f)
817 alignPanel.makeEPS(f);
823 * @param e DOCUMENT ME!
825 public void printMenuItem_actionPerformed(ActionEvent e)
827 //Putting in a thread avoids Swing painting problems
828 PrintThread thread = new PrintThread();
832 public void exportFeatures_actionPerformed(ActionEvent e)
834 new AnnotationExporter().exportFeatures(alignPanel);
838 public void exportAnnotations_actionPerformed(ActionEvent e)
840 new AnnotationExporter().exportAnnotations(
842 viewport.alignment.getAlignmentAnnotation()
847 public void associatedData_actionPerformed(ActionEvent e)
849 // Pick the tree file
850 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
853 chooser.setFileView(new JalviewFileView());
854 chooser.setDialogTitle("Load Jalview Annotations or Features File");
855 chooser.setToolTipText("Load Jalview Annotations / Features file");
857 int value = chooser.showOpenDialog(null);
859 if (value == JalviewFileChooser.APPROVE_OPTION)
861 String choice = chooser.getSelectedFile().getPath();
862 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
863 loadJalviewDataFile(choice);
872 * @param e DOCUMENT ME!
874 public void closeMenuItem_actionPerformed(boolean closeAllTabs)
876 if(alignPanels!=null && alignPanels.size()<2)
881 if(alignPanels!=null)
884 for (int i = 0; i < alignPanels.size(); i++)
886 AlignmentPanel ap = (AlignmentPanel) alignPanels.elementAt(i);
887 PaintRefresher.RemoveComponent(ap.seqPanel.seqCanvas);
888 PaintRefresher.RemoveComponent(ap.idPanel.idCanvas);
889 PaintRefresher.RemoveComponent(ap);
893 int index = tabbedPane.getSelectedIndex();
895 alignPanels.removeElement(alignPanel);
896 PaintRefresher.RemoveComponent(alignPanel.seqPanel.seqCanvas);
897 PaintRefresher.RemoveComponent(alignPanel.idPanel.idCanvas);
898 PaintRefresher.RemoveComponent(alignPanel);
902 tabbedPane.removeTabAt(index);
903 tabbedPane.validate();
905 if(index==tabbedPane.getTabCount())
908 this.tabSelectionChanged(index);
913 this.setClosed(true);
917 ex.printStackTrace();
925 void updateEditMenuBar()
928 if (viewport.historyList.size() > 0)
930 undoMenuItem.setEnabled(true);
931 CommandI command = (CommandI) viewport.historyList.peek();
932 undoMenuItem.setText("Undo " + command.getDescription());
936 undoMenuItem.setEnabled(false);
937 undoMenuItem.setText("Undo");
940 if (viewport.redoList.size() > 0)
942 redoMenuItem.setEnabled(true);
944 CommandI command = (CommandI) viewport.redoList.peek();
945 redoMenuItem.setText("Redo " + command.getDescription());
949 redoMenuItem.setEnabled(false);
950 redoMenuItem.setText("Redo");
955 public void addHistoryItem(CommandI command)
957 if(command.getSize()>0)
959 viewport.historyList.push(command);
960 viewport.redoList.clear();
962 viewport.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;
971 * @param e DOCUMENT ME!
973 protected void undoMenuItem_actionPerformed(ActionEvent e)
975 CommandI command = (CommandI)viewport.historyList.pop();
976 viewport.redoList.push(command);
977 command.undoCommand();
979 AlignViewport originalSource = getOriginatingSource(command);
982 if(originalSource!=null)
984 originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;
985 originalSource.firePropertyChange("alignment", null,null);
992 * @param e DOCUMENT ME!
994 protected void redoMenuItem_actionPerformed(ActionEvent e)
996 if(viewport.redoList.size()<1)
999 CommandI command = (CommandI) viewport.redoList.pop();
1000 viewport.historyList.push(command);
1001 command.doCommand();
1003 AlignViewport originalSource = getOriginatingSource(command);
1004 updateEditMenuBar();
1006 if(originalSource!=null)
1008 originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;
1009 originalSource.firePropertyChange("alignment", null,null);
1013 AlignViewport getOriginatingSource(CommandI command)
1015 AlignViewport originalSource = null;
1016 //For sequence removal and addition, we need to fire
1017 //the property change event FROM the viewport where the
1018 //original alignment was altered
1020 if (command instanceof EditCommand)
1022 EditCommand editCommand = (EditCommand) command;
1023 al = editCommand.getAlignment();
1024 Vector comps = (Vector) PaintRefresher.components
1025 .get(viewport.getSequenceSetId());
1027 for (int i = 0; i < comps.size(); i++)
1029 if (comps.elementAt(i) instanceof AlignmentPanel)
1031 if (al == ( (AlignmentPanel) comps.elementAt(i)).av.alignment)
1033 originalSource = ( (AlignmentPanel) comps.elementAt(i)).av;
1040 if (originalSource == null)
1042 //The original view is closed, we must validate
1043 //the current view against the closed view first
1045 PaintRefresher.validateSequences(al, viewport.alignment);
1047 originalSource = viewport;
1050 return originalSource;
1056 * @param up DOCUMENT ME!
1058 public void moveSelectedSequences(boolean up)
1060 SequenceGroup sg = viewport.getSelectionGroup();
1069 for (int i = 1; i < viewport.alignment.getHeight(); i++)
1071 SequenceI seq = viewport.alignment.getSequenceAt(i);
1073 if (!sg.getSequences(false).contains(seq))
1078 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
1080 if (sg.getSequences(false).contains(temp))
1085 viewport.alignment.getSequences().setElementAt(temp, i);
1086 viewport.alignment.getSequences().setElementAt(seq, i - 1);
1091 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
1093 SequenceI seq = viewport.alignment.getSequenceAt(i);
1095 if (!sg.getSequences(false).contains(seq))
1100 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
1102 if (sg.getSequences(false).contains(temp))
1107 viewport.alignment.getSequences().setElementAt(temp, i);
1108 viewport.alignment.getSequences().setElementAt(seq, i + 1);
1112 alignPanel.repaint();
1120 * @param e DOCUMENT ME!
1122 protected void copy_actionPerformed(ActionEvent e)
1125 if (viewport.getSelectionGroup() == null)
1130 SequenceI [] seqs = viewport.getSelectionAsNewSequence();
1131 String[] omitHidden = null;
1133 if (viewport.hasHiddenColumns)
1135 omitHidden = viewport.getViewAsString(true);
1138 String output = new FormatAdapter().formatSequences(
1143 StringSelection ss = new StringSelection(output);
1147 //Its really worth setting the clipboard contents
1148 //to empty before setting the large StringSelection!!
1149 Toolkit.getDefaultToolkit().getSystemClipboard()
1150 .setContents(new StringSelection(""), null);
1152 Toolkit.getDefaultToolkit().getSystemClipboard()
1153 .setContents(ss, Desktop.instance);
1155 catch (OutOfMemoryError er)
1157 er.printStackTrace();
1158 javax.swing.SwingUtilities.invokeLater(new Runnable()
1162 javax.swing.JOptionPane.showInternalMessageDialog(Desktop.desktop,
1163 "Out of memory copying region!!"
1165 "\nSee help files for increasing Java Virtual Machine memory."
1167 javax.swing.JOptionPane.WARNING_MESSAGE);
1174 Vector hiddenColumns = null;
1175 if(viewport.hasHiddenColumns)
1177 hiddenColumns =new Vector();
1178 int hiddenOffset = viewport.getSelectionGroup().getStartRes();
1179 for(int i=0; i<viewport.getColumnSelection().getHiddenColumns().size(); i++)
1181 int[] region = (int[])
1182 viewport.getColumnSelection().getHiddenColumns().elementAt(i);
1184 hiddenColumns.addElement(new int[]{region[0]-hiddenOffset,
1185 region[1]-hiddenOffset});
1191 Desktop.jalviewClipboard = new Object[]{ seqs,
1192 viewport.alignment.getDataset(),
1194 statusBar.setText("Copied "+seqs.length+" sequences to clipboard.");
1200 * @param e DOCUMENT ME!
1202 protected void pasteNew_actionPerformed(ActionEvent e)
1210 * @param e DOCUMENT ME!
1212 protected void pasteThis_actionPerformed(ActionEvent e)
1220 * @param newAlignment DOCUMENT ME!
1222 void paste(boolean newAlignment)
1226 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
1227 Transferable contents = c.getContents(this);
1229 if (contents == null)
1237 str = (String) contents.getTransferData(DataFlavor.stringFlavor);
1238 if (str.length() < 1)
1241 format = new IdentifyFile().Identify(str, "Paste");
1244 catch (OutOfMemoryError er)
1246 er.printStackTrace();
1247 javax.swing.SwingUtilities.invokeLater(new Runnable()
1251 javax.swing.JOptionPane.showInternalMessageDialog(Desktop.desktop,
1252 "Out of memory pasting sequences!!"
1254 "\nSee help files for increasing Java Virtual Machine memory."
1256 javax.swing.JOptionPane.WARNING_MESSAGE);
1263 SequenceI[] sequences;
1266 if(Desktop.jalviewClipboard!=null)
1268 // The clipboard was filled from within Jalview, we must use the sequences
1269 // And dataset from the copied alignment
1270 sequences = (SequenceI[])Desktop.jalviewClipboard[0];
1274 sequences = new FormatAdapter().readFile(str, "Paste", format);
1277 AlignmentI alignment = null;
1281 alignment = new Alignment(sequences);
1283 if (Desktop.jalviewClipboard != null)
1284 alignment.setDataset( (Alignment) Desktop.jalviewClipboard[1]);
1286 alignment.setDataset(null);
1290 alignment = viewport.getAlignment();
1293 SequenceI [] newseqs = new SequenceI[sequences.length];
1294 for (int i = 0; i < sequences.length; i++)
1296 newseqs[i] = new Sequence(sequences[i].getName(),
1297 sequences[i].getSequence(), sequences[i].getStart(),
1298 sequences[i].getEnd());
1300 alignment.addSequence(newseqs[i]);
1306 addHistoryItem(new EditCommand(
1311 alignment.getWidth(),
1316 viewport.setEndSeq(alignment.getHeight());
1317 alignment.getWidth();
1318 viewport.firePropertyChange("alignment", null, alignment.getSequences());
1323 // Add any annotations attached to sequences
1324 for (int i = 0; i < sequences.length; i++)
1326 if (sequences[i].getAnnotation() != null)
1328 for (int a = 0; a < sequences[i].getAnnotation().length; a++)
1330 AlignmentAnnotation newAnnot =
1331 new AlignmentAnnotation(
1332 sequences[i].getAnnotation()[a].label,
1333 sequences[i].getAnnotation()[a].description,
1334 sequences[i].getAnnotation()[a].annotations,
1335 sequences[i].getAnnotation()[a].graphMin,
1336 sequences[i].getAnnotation()[a].graphMax,
1337 sequences[i].getAnnotation()[a].graph);
1339 sequences[i].getAnnotation()[a] = newAnnot;
1340 newAnnot.sequenceMapping = sequences[i].getAnnotation()[a].
1342 newAnnot.sequenceRef = sequences[i];
1343 newAnnot.adjustForAlignment();
1344 alignment.addAnnotation(newAnnot);
1345 alignment.setAnnotationIndex(newAnnot, a);
1348 alignPanel.annotationPanel.adjustPanelHeight();
1354 AlignFrame af = new AlignFrame(alignment, DEFAULT_WIDTH, DEFAULT_HEIGHT);
1355 String newtitle = new String("Copied sequences");
1357 if(Desktop.jalviewClipboard!=null && Desktop.jalviewClipboard[2]!=null)
1359 Vector hc = (Vector)Desktop.jalviewClipboard[2];
1360 for(int i=0; i<hc.size(); i++)
1362 int [] region = (int[]) hc.elementAt(i);
1363 af.viewport.hideColumns(region[0], region[1]);
1368 //>>>This is a fix for the moment, until a better solution is found!!<<<
1369 af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().transferSettings(
1370 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
1373 if (title.startsWith("Copied sequences"))
1379 newtitle = newtitle.concat("- from " + title);
1382 Desktop.addInternalFrame(af, newtitle, DEFAULT_WIDTH,
1389 catch (Exception ex)
1391 ex.printStackTrace();
1392 System.out.println("Exception whilst pasting: "+ex);
1393 // could be anything being pasted in here
1402 * @param e DOCUMENT ME!
1404 protected void cut_actionPerformed(ActionEvent e)
1406 copy_actionPerformed(null);
1407 delete_actionPerformed(null);
1413 * @param e DOCUMENT ME!
1415 protected void delete_actionPerformed(ActionEvent evt)
1418 SequenceGroup sg = viewport.getSelectionGroup();
1424 Vector seqs = new Vector();
1426 for (int i = 0; i < sg.getSize(false); i++)
1428 seq = sg.getSequenceAt(i);
1429 seqs.addElement(seq);
1433 // If the cut affects all sequences, remove highlighted columns
1434 if (sg.getSize(false) == viewport.alignment.getHeight())
1436 viewport.getColumnSelection().removeElements(sg.getStartRes(),
1437 sg.getEndRes() + 1);
1441 SequenceI [] cut = new SequenceI[seqs.size()];
1442 for(int i=0; i<seqs.size(); i++)
1443 cut[i] = (SequenceI)seqs.elementAt(i);
1449 addHistoryItem(new EditCommand("Cut Sequences",
1453 sg.getEndRes()-sg.getStartRes()+1,
1454 viewport.alignment));
1457 viewport.setSelectionGroup(null);
1458 viewport.alignment.deleteGroup(sg);
1460 viewport.firePropertyChange("alignment", null,
1461 viewport.getAlignment().getSequences());
1463 if (viewport.getAlignment().getHeight() < 1)
1467 this.setClosed(true);
1469 catch (Exception ex)
1478 * @param e DOCUMENT ME!
1480 protected void deleteGroups_actionPerformed(ActionEvent e)
1482 viewport.alignment.deleteAllGroups();
1483 viewport.sequenceColours = null;
1484 viewport.setSelectionGroup(null);
1485 PaintRefresher.Refresh(this, viewport.getSequenceSetId());
1486 alignPanel.repaint();
1492 * @param e DOCUMENT ME!
1494 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
1496 SequenceGroup sg = new SequenceGroup();
1498 for (int i = 0; i < viewport.getAlignment().getSequences().size();
1501 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
1504 sg.setEndRes(viewport.alignment.getWidth() - 1);
1505 viewport.setSelectionGroup(sg);
1506 alignPanel.repaint();
1507 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1513 * @param e DOCUMENT ME!
1515 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
1517 if(viewport.cursorMode)
1519 alignPanel.seqPanel.keyboardNo1 = null;
1520 alignPanel.seqPanel.keyboardNo2 = null;
1522 viewport.setSelectionGroup(null);
1523 viewport.getColumnSelection().clear();
1524 viewport.setSelectionGroup(null);
1525 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
1526 alignPanel.idPanel.idCanvas.searchResults = null;
1527 alignPanel.repaint();
1528 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1534 * @param e DOCUMENT ME!
1536 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
1538 SequenceGroup sg = viewport.getSelectionGroup();
1542 selectAllSequenceMenuItem_actionPerformed(null);
1547 for (int i = 0; i < viewport.getAlignment().getSequences().size();
1550 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
1553 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1556 public void invertColSel_actionPerformed(ActionEvent e)
1558 viewport.invertColumnSelection();
1559 alignPanel.repaint();
1566 * @param e DOCUMENT ME!
1568 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
1570 trimAlignment(true);
1576 * @param e DOCUMENT ME!
1578 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
1580 trimAlignment(false);
1583 void trimAlignment(boolean trimLeft)
1585 ColumnSelection colSel = viewport.getColumnSelection();
1588 if (colSel.size() > 0)
1591 column = colSel.getMin();
1593 column = colSel.getMax();
1596 if(viewport.getSelectionGroup()!=null)
1597 seqs = viewport.getSelectionGroup().getSequencesAsArray(true);
1599 seqs = viewport.alignment.getSequencesArray();
1602 TrimRegionCommand trimRegion;
1605 trimRegion = new TrimRegionCommand("Remove Left",
1606 TrimRegionCommand.TRIM_LEFT,
1611 viewport.selectionGroup);
1612 viewport.setStartRes(0);
1616 trimRegion = new TrimRegionCommand("Remove Right",
1617 TrimRegionCommand.TRIM_RIGHT,
1622 viewport.selectionGroup);
1625 statusBar.setText("Removed "+trimRegion.getSize()+" columns.");
1628 addHistoryItem(trimRegion);
1630 Vector groups = viewport.alignment.getGroups();
1632 for (int i = 0; i < groups.size(); i++)
1634 SequenceGroup sg = (SequenceGroup) groups.get(i);
1636 if ( (trimLeft && !sg.adjustForRemoveLeft(column))
1637 || (!trimLeft && !sg.adjustForRemoveRight(column)))
1639 viewport.alignment.deleteGroup(sg);
1643 viewport.firePropertyChange("alignment", null,
1644 viewport.getAlignment().getSequences());
1651 * @param e DOCUMENT ME!
1653 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
1655 int start = 0, end = viewport.alignment.getWidth()-1;
1658 if (viewport.getSelectionGroup() != null)
1660 seqs = viewport.getSelectionGroup().getSequencesAsArray(true);
1661 start = viewport.getSelectionGroup().getStartRes();
1662 end = viewport.getSelectionGroup().getEndRes();
1665 seqs = viewport.alignment.getSequencesArray();
1668 RemoveGapColCommand removeGapCols =
1669 new RemoveGapColCommand("Remove Gapped Columns",
1672 viewport.getGapCharacter());
1674 addHistoryItem(removeGapCols);
1676 statusBar.setText("Removed "+removeGapCols.getSize()+" empty columns.");
1678 //This is to maintain viewport position on first residue
1680 SequenceI seq = viewport.alignment.getSequenceAt(0);
1681 int startRes = seq.findPosition(viewport.startRes);
1682 // ShiftList shifts;
1683 // viewport.getAlignment().removeGaps(shifts=new ShiftList());
1684 // edit.alColumnChanges=shifts.getInverse();
1685 // if (viewport.hasHiddenColumns)
1686 // viewport.getColumnSelection().compensateForEdits(shifts);
1687 viewport.setStartRes(seq.findIndex(startRes)-1);
1688 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
1695 * @param e DOCUMENT ME!
1697 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
1699 int start = 0, end = viewport.alignment.getWidth()-1;
1702 if (viewport.getSelectionGroup() != null)
1704 seqs = viewport.getSelectionGroup().getSequencesAsArray(true);
1705 start = viewport.getSelectionGroup().getStartRes();
1706 end = viewport.getSelectionGroup().getEndRes();
1709 seqs = viewport.alignment.getSequencesArray();
1711 //This is to maintain viewport position on first residue
1713 SequenceI seq = viewport.alignment.getSequenceAt(0);
1714 int startRes = seq.findPosition(viewport.startRes);
1716 addHistoryItem(new RemoveGapsCommand("Remove Gaps",
1719 viewport.getGapCharacter()));
1721 viewport.setStartRes(seq.findIndex(startRes)-1);
1723 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
1730 * @param e DOCUMENT ME!
1732 public void padGapsMenuitem_actionPerformed(ActionEvent e)
1734 viewport.padGaps = padGapsMenuitem.isSelected();
1736 viewport.firePropertyChange("alignment",
1738 viewport.getAlignment().getSequences());
1744 * @param e DOCUMENT ME!
1746 public void findMenuItem_actionPerformed(ActionEvent e)
1751 public void newView_actionPerformed(ActionEvent e)
1753 AlignmentPanel newap =
1754 new Jalview2XML().copyAlignPanel(alignPanel, true);
1756 if (viewport.viewName == null)
1757 viewport.viewName = "Original";
1759 newap.av.historyList = viewport.historyList;
1760 newap.av.redoList = viewport.redoList;
1762 int index = Desktop.getViewCount(viewport.getSequenceSetId());
1763 String newViewName = "View " +index;
1765 Vector comps = (Vector)PaintRefresher.components.get(viewport.getSequenceSetId());
1766 Vector existingNames = new Vector();
1767 for(int i=0; i<comps.size(); i++)
1769 if(comps.elementAt(i) instanceof AlignmentPanel)
1771 AlignmentPanel ap = (AlignmentPanel)comps.elementAt(i);
1772 if(!existingNames.contains(ap.av.viewName))
1773 existingNames.addElement(ap.av.viewName);
1777 while(existingNames.contains(newViewName))
1779 newViewName = "View "+ (++index);
1782 newap.av.viewName = newViewName;
1784 addAlignmentPanel(newap, false);
1786 if(alignPanels.size()==2)
1788 viewport.gatherViewsHere = true;
1790 tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1);
1793 public void expandViews_actionPerformed(ActionEvent e)
1795 Desktop.instance.explodeViews(this);
1798 public void gatherViews_actionPerformed(ActionEvent e)
1800 Desktop.instance.gatherViews(this);
1808 * @param e DOCUMENT ME!
1810 public void font_actionPerformed(ActionEvent e)
1812 new FontChooser(alignPanel);
1819 * @param e DOCUMENT ME!
1821 protected void seqLimit_actionPerformed(ActionEvent e)
1823 viewport.setShowJVSuffix(seqLimits.isSelected());
1825 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
1826 alignPanel.repaint();
1829 public void idRightAlign_actionPerformed(ActionEvent e)
1831 viewport.rightAlignIds = idRightAlign.isSelected();
1832 alignPanel.repaint();
1840 * @param e DOCUMENT ME!
1842 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
1844 viewport.setColourText(colourTextMenuItem.isSelected());
1845 alignPanel.repaint();
1851 * @param e DOCUMENT ME!
1853 public void wrapMenuItem_actionPerformed(ActionEvent e)
1855 scaleAbove.setVisible(wrapMenuItem.isSelected());
1856 scaleLeft.setVisible(wrapMenuItem.isSelected());
1857 scaleRight.setVisible(wrapMenuItem.isSelected());
1858 viewport.setWrapAlignment(wrapMenuItem.isSelected());
1859 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
1862 public void showAllSeqs_actionPerformed(ActionEvent e)
1864 viewport.showAllHiddenSeqs();
1867 public void showAllColumns_actionPerformed(ActionEvent e)
1869 viewport.showAllHiddenColumns();
1873 public void hideSelSequences_actionPerformed(ActionEvent e)
1875 viewport.hideAllSelectedSeqs();
1876 alignPanel.repaint();
1879 public void hideSelColumns_actionPerformed(ActionEvent e)
1881 viewport.hideSelectedColumns();
1882 alignPanel.repaint();
1885 public void hiddenMarkers_actionPerformed(ActionEvent e)
1887 viewport.setShowHiddenMarkers(hiddenMarkers.isSelected());
1894 * @param e DOCUMENT ME!
1896 protected void scaleAbove_actionPerformed(ActionEvent e)
1898 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
1899 alignPanel.repaint();
1905 * @param e DOCUMENT ME!
1907 protected void scaleLeft_actionPerformed(ActionEvent e)
1909 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
1910 alignPanel.repaint();
1916 * @param e DOCUMENT ME!
1918 protected void scaleRight_actionPerformed(ActionEvent e)
1920 viewport.setScaleRightWrapped(scaleRight.isSelected());
1921 alignPanel.repaint();
1927 * @param e DOCUMENT ME!
1929 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
1931 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
1932 alignPanel.repaint();
1938 * @param e DOCUMENT ME!
1940 public void viewTextMenuItem_actionPerformed(ActionEvent e)
1942 viewport.setShowText(viewTextMenuItem.isSelected());
1943 alignPanel.repaint();
1949 * @param e DOCUMENT ME!
1951 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
1953 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
1954 alignPanel.repaint();
1958 public FeatureSettings featureSettings;
1959 public void featureSettings_actionPerformed(ActionEvent e)
1961 if(featureSettings !=null )
1963 featureSettings.close();
1964 featureSettings = null;
1966 featureSettings = new FeatureSettings(this);
1972 * @param evt DOCUMENT ME!
1974 public void showSeqFeatures_actionPerformed(ActionEvent evt)
1976 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
1977 alignPanel.repaint();
1978 if (alignPanel.getOverviewPanel() != null)
1980 alignPanel.getOverviewPanel().updateOverviewImage();
1987 * @param e DOCUMENT ME!
1989 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
1991 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
1992 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
1998 * @param e DOCUMENT ME!
2000 public void overviewMenuItem_actionPerformed(ActionEvent e)
2002 if (alignPanel.overviewPanel != null)
2007 JInternalFrame frame = new JInternalFrame();
2008 OverviewPanel overview = new OverviewPanel(alignPanel);
2009 frame.setContentPane(overview);
2010 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
2011 frame.getWidth(), frame.getHeight());
2013 frame.setLayer(JLayeredPane.PALETTE_LAYER);
2014 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
2016 public void internalFrameClosed(
2017 javax.swing.event.InternalFrameEvent evt)
2019 alignPanel.setOverviewPanel(null);
2024 alignPanel.setOverviewPanel(overview);
2027 public void textColour_actionPerformed(ActionEvent e)
2029 new TextColourChooser().chooseColour(alignPanel, null);
2035 * @param e DOCUMENT ME!
2037 protected void noColourmenuItem_actionPerformed(ActionEvent e)
2045 * @param e DOCUMENT ME!
2047 public void clustalColour_actionPerformed(ActionEvent e)
2049 changeColour(new ClustalxColourScheme(
2050 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
2056 * @param e DOCUMENT ME!
2058 public void zappoColour_actionPerformed(ActionEvent e)
2060 changeColour(new ZappoColourScheme());
2066 * @param e DOCUMENT ME!
2068 public void taylorColour_actionPerformed(ActionEvent e)
2070 changeColour(new TaylorColourScheme());
2076 * @param e DOCUMENT ME!
2078 public void hydrophobicityColour_actionPerformed(ActionEvent e)
2080 changeColour(new HydrophobicColourScheme());
2086 * @param e DOCUMENT ME!
2088 public void helixColour_actionPerformed(ActionEvent e)
2090 changeColour(new HelixColourScheme());
2096 * @param e DOCUMENT ME!
2098 public void strandColour_actionPerformed(ActionEvent e)
2100 changeColour(new StrandColourScheme());
2106 * @param e DOCUMENT ME!
2108 public void turnColour_actionPerformed(ActionEvent e)
2110 changeColour(new TurnColourScheme());
2116 * @param e DOCUMENT ME!
2118 public void buriedColour_actionPerformed(ActionEvent e)
2120 changeColour(new BuriedColourScheme());
2126 * @param e DOCUMENT ME!
2128 public void nucleotideColour_actionPerformed(ActionEvent e)
2130 changeColour(new NucleotideColourScheme());
2133 public void annotationColour_actionPerformed(ActionEvent e)
2135 new AnnotationColourChooser(viewport, alignPanel);
2142 * @param e DOCUMENT ME!
2144 protected void applyToAllGroups_actionPerformed(ActionEvent e)
2146 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
2152 * @param cs DOCUMENT ME!
2154 public void changeColour(ColourSchemeI cs)
2160 if (viewport.getAbovePIDThreshold())
2162 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
2165 cs.setThreshold(threshold,
2166 viewport.getIgnoreGapsConsensus());
2168 viewport.setGlobalColourScheme(cs);
2172 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2175 if (viewport.getConservationSelected())
2178 Alignment al = (Alignment) viewport.alignment;
2179 Conservation c = new Conservation("All",
2180 ResidueProperties.propHash, 3,
2181 al.getSequences(), 0,
2185 c.verdict(false, viewport.ConsPercGaps);
2187 cs.setConservation(c);
2189 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
2194 cs.setConservation(null);
2197 cs.setConsensus(viewport.hconsensus);
2200 viewport.setGlobalColourScheme(cs);
2202 if (viewport.getColourAppliesToAllGroups())
2204 Vector groups = viewport.alignment.getGroups();
2206 for (int i = 0; i < groups.size(); i++)
2208 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
2216 if (cs instanceof ClustalxColourScheme)
2218 sg.cs = new ClustalxColourScheme(
2219 sg.getSequences(true), sg.getWidth());
2221 else if (cs instanceof UserColourScheme)
2223 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
2229 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
2231 catch (Exception ex)
2236 if (viewport.getAbovePIDThreshold()
2237 || cs instanceof PIDColourScheme
2238 || cs instanceof Blosum62ColourScheme)
2240 sg.cs.setThreshold(threshold,
2241 viewport.getIgnoreGapsConsensus());
2243 sg.cs.setConsensus(AAFrequency.calculate(
2244 sg.getSequences(true), sg.getStartRes(),
2248 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2251 if (viewport.getConservationSelected())
2253 Conservation c = new Conservation("Group",
2254 ResidueProperties.propHash, 3,
2255 sg.getSequences(true),
2259 c.verdict(false, viewport.ConsPercGaps);
2260 sg.cs.setConservation(c);
2263 sg.cs.setConservation(null);
2267 if (alignPanel.getOverviewPanel() != null)
2269 alignPanel.getOverviewPanel().updateOverviewImage();
2272 alignPanel.repaint();
2278 * @param e DOCUMENT ME!
2280 protected void modifyPID_actionPerformed(ActionEvent e)
2282 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
2284 SliderPanel.setPIDSliderSource(alignPanel,
2285 viewport.getGlobalColourScheme(),
2287 SliderPanel.showPIDSlider();
2294 * @param e DOCUMENT ME!
2296 protected void modifyConservation_actionPerformed(ActionEvent e)
2298 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
2300 SliderPanel.setConservationSlider(alignPanel,
2301 viewport.globalColourScheme,
2303 SliderPanel.showConservationSlider();
2310 * @param e DOCUMENT ME!
2312 protected void conservationMenuItem_actionPerformed(ActionEvent e)
2314 viewport.setConservationSelected(conservationMenuItem.isSelected());
2316 viewport.setAbovePIDThreshold(false);
2317 abovePIDThreshold.setSelected(false);
2319 changeColour(viewport.getGlobalColourScheme());
2321 modifyConservation_actionPerformed(null);
2327 * @param e DOCUMENT ME!
2329 public void abovePIDThreshold_actionPerformed(ActionEvent e)
2331 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
2333 conservationMenuItem.setSelected(false);
2334 viewport.setConservationSelected(false);
2336 changeColour(viewport.getGlobalColourScheme());
2338 modifyPID_actionPerformed(null);
2344 * @param e DOCUMENT ME!
2346 public void userDefinedColour_actionPerformed(ActionEvent e)
2348 if (e.getActionCommand().equals("User Defined..."))
2350 new UserDefinedColours(alignPanel, null);
2354 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
2355 getUserColourSchemes().get(e.getActionCommand());
2361 public void updateUserColourMenu()
2364 Component[] menuItems = colourMenu.getMenuComponents();
2365 int i, iSize = menuItems.length;
2366 for (i = 0; i < iSize; i++)
2368 if (menuItems[i].getName() != null &&
2369 menuItems[i].getName().equals("USER_DEFINED"))
2371 colourMenu.remove(menuItems[i]);
2375 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
2377 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
2378 getUserColourSchemes().keys();
2380 while (userColours.hasMoreElements())
2382 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
2383 nextElement().toString());
2384 radioItem.setName("USER_DEFINED");
2385 radioItem.addMouseListener(new MouseAdapter()
2387 public void mousePressed(MouseEvent evt)
2389 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
2391 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
2393 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
2394 "Remove from default list?",
2395 "Remove user defined colour",
2396 JOptionPane.YES_NO_OPTION);
2397 if(option == JOptionPane.YES_OPTION)
2399 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
2400 colourMenu.remove(radioItem);
2403 radioItem.addActionListener(new ActionListener()
2405 public void actionPerformed(ActionEvent evt)
2407 userDefinedColour_actionPerformed(evt);
2413 radioItem.addActionListener(new ActionListener()
2415 public void actionPerformed(ActionEvent evt)
2417 userDefinedColour_actionPerformed(evt);
2421 colourMenu.insert(radioItem, 15);
2422 colours.add(radioItem);
2430 * @param e DOCUMENT ME!
2432 public void PIDColour_actionPerformed(ActionEvent e)
2434 changeColour(new PIDColourScheme());
2440 * @param e DOCUMENT ME!
2442 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
2444 changeColour(new Blosum62ColourScheme());
2450 * @param e DOCUMENT ME!
2452 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
2454 SequenceI [] oldOrder = viewport.getAlignment().getSequencesArray();
2455 AlignmentSorter.sortByPID(viewport.getAlignment(),
2456 viewport.getAlignment().getSequenceAt(0));
2457 addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder, viewport.alignment));
2458 alignPanel.repaint();
2464 * @param e DOCUMENT ME!
2466 public void sortIDMenuItem_actionPerformed(ActionEvent e)
2468 SequenceI [] oldOrder = viewport.getAlignment().getSequencesArray();
2469 AlignmentSorter.sortByID(viewport.getAlignment());
2470 addHistoryItem(new OrderCommand("ID Sort", oldOrder, viewport.alignment));
2471 alignPanel.repaint();
2477 * @param e DOCUMENT ME!
2479 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
2481 SequenceI [] oldOrder = viewport.getAlignment().getSequencesArray();
2482 AlignmentSorter.sortByGroup(viewport.getAlignment());
2483 addHistoryItem(new OrderCommand("Group Sort", oldOrder, viewport.alignment));
2485 alignPanel.repaint();
2491 * @param e DOCUMENT ME!
2493 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
2495 new RedundancyPanel(alignPanel, this);
2502 * @param e DOCUMENT ME!
2504 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
2506 if ( (viewport.getSelectionGroup() == null) ||
2507 (viewport.getSelectionGroup().getSize(false) < 2))
2509 JOptionPane.showInternalMessageDialog(this,
2510 "You must select at least 2 sequences.",
2511 "Invalid Selection",
2512 JOptionPane.WARNING_MESSAGE);
2516 JInternalFrame frame = new JInternalFrame();
2517 frame.setContentPane(new PairwiseAlignPanel(viewport));
2518 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
2525 * @param e DOCUMENT ME!
2527 public void PCAMenuItem_actionPerformed(ActionEvent e)
2529 if ( ( (viewport.getSelectionGroup() != null) &&
2530 (viewport.getSelectionGroup().getSize(false) < 4) &&
2531 (viewport.getSelectionGroup().getSize(false) > 0)) ||
2532 (viewport.getAlignment().getHeight() < 4))
2534 JOptionPane.showInternalMessageDialog(this,
2535 "Principal component analysis must take\n" +
2536 "at least 4 input sequences.",
2537 "Sequence selection insufficient",
2538 JOptionPane.WARNING_MESSAGE);
2543 new PCAPanel(alignPanel);
2547 public void autoCalculate_actionPerformed(ActionEvent e)
2549 viewport.autoCalculateConsensus = autoCalculate.isSelected();
2550 if(viewport.autoCalculateConsensus)
2552 viewport.firePropertyChange("alignment",
2554 viewport.getAlignment().getSequences());
2562 * @param e DOCUMENT ME!
2564 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
2566 NewTreePanel("AV", "PID", "Average distance tree using PID");
2572 * @param e DOCUMENT ME!
2574 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
2576 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
2582 * @param e DOCUMENT ME!
2584 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
2586 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
2592 * @param e DOCUMENT ME!
2594 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
2596 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
2602 * @param type DOCUMENT ME!
2603 * @param pwType DOCUMENT ME!
2604 * @param title DOCUMENT ME!
2606 void NewTreePanel(String type, String pwType, String title)
2610 if (viewport.getSelectionGroup() != null) {
2611 if (viewport.getSelectionGroup().getSize(false) < 3) {
2612 JOptionPane.showMessageDialog(Desktop.desktop,
2613 "You need to have more than two sequences selected to build a tree!",
2614 "Not enough sequences",
2615 JOptionPane.WARNING_MESSAGE);
2620 SequenceGroup sg = viewport.getSelectionGroup();
2622 /* Decide if the selection is a column region */
2623 while (s < sg.getSize(false))
2625 if ( ( (SequenceI) sg.getSequences(false).elementAt(s++)).getLength() <
2628 JOptionPane.showMessageDialog(Desktop.desktop,
2629 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
2630 "Try using the Pad function in the edit menu,\n" +
2631 "or one of the multiple sequence alignment web services.",
2632 "Sequences in selection are not aligned",
2633 JOptionPane.WARNING_MESSAGE);
2639 title = title + " on region";
2640 tp = new TreePanel(alignPanel, type, pwType);
2644 //are the sequences aligned?
2645 if (!viewport.alignment.isAligned())
2647 JOptionPane.showMessageDialog(Desktop.desktop,
2648 "The sequences must be aligned before creating a tree.\n" +
2649 "Try using the Pad function in the edit menu,\n" +
2650 "or one of the multiple sequence alignment web services.",
2651 "Sequences not aligned",
2652 JOptionPane.WARNING_MESSAGE);
2657 if(viewport.alignment.getHeight()<2)
2660 tp = new TreePanel(alignPanel, type, pwType);
2665 if(viewport.viewName!=null)
2666 title+= viewport.viewName+" of ";
2668 title += this.title;
2670 Desktop.addInternalFrame(tp, title, 600, 500);
2676 * @param title DOCUMENT ME!
2677 * @param order DOCUMENT ME!
2679 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
2681 final JMenuItem item = new JMenuItem("by " + title);
2683 item.addActionListener(new java.awt.event.ActionListener()
2685 public void actionPerformed(ActionEvent e)
2687 SequenceI [] oldOrder = viewport.getAlignment().getSequencesArray();
2689 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
2690 AlignmentSorter.sortBy(viewport.getAlignment(), order);
2692 addHistoryItem(new OrderCommand(order.getName(), oldOrder, viewport.alignment));
2694 alignPanel.repaint();
2700 * Maintain the Order by->Displayed Tree menu.
2701 * Creates a new menu item for a TreePanel with an appropriate
2702 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
2703 * to remove the menu item when the treePanel is closed, and adjust
2704 * the tree leaf to sequence mapping when the alignment is modified.
2705 * @param treePanel Displayed tree window.
2706 * @param title SortBy menu item title.
2708 public void buildTreeMenu()
2710 sortByTreeMenu.removeAll();
2712 Vector comps = (Vector)PaintRefresher.components.get(viewport.getSequenceSetId());
2713 Vector treePanels = new Vector();
2714 int i, iSize = comps.size();
2715 for(i=0; i<iSize; i++)
2717 if(comps.elementAt(i) instanceof TreePanel)
2719 treePanels.add(comps.elementAt(i));
2723 iSize = treePanels.size();
2727 sortByTreeMenu.setVisible(false);
2731 sortByTreeMenu.setVisible(true);
2733 for(i=0; i<treePanels.size(); i++)
2735 TreePanel tp = (TreePanel)treePanels.elementAt(i);
2736 final JMenuItem item = new JMenuItem(tp.getTitle());
2737 final NJTree tree = ((TreePanel)treePanels.elementAt(i)).getTree();
2738 item.addActionListener(new java.awt.event.ActionListener()
2740 public void actionPerformed(ActionEvent e)
2742 SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
2743 AlignmentSorter.sortByTree(viewport.getAlignment(), tree);
2745 addHistoryItem(new OrderCommand("Tree Sort",
2747 viewport.alignment));
2749 alignPanel.repaint();
2753 sortByTreeMenu.add(item);
2758 * Work out whether the whole set of sequences
2759 * or just the selected set will be submitted for multiple alignment.
2762 private jalview.datamodel.AlignmentView gatherSequencesForAlignment()
2764 // Now, check we have enough sequences
2765 AlignmentView msa = null;
2767 if ( (viewport.getSelectionGroup() != null) &&
2768 (viewport.getSelectionGroup().getSize(false) > 1))
2770 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
2771 /*SequenceGroup seqs = viewport.getSelectionGroup();
2773 msa = new SequenceI[sz = seqs.getSize(false)];
2775 for (int i = 0; i < sz; i++)
2777 msa[i] = (SequenceI) seqs.getSequenceAt(i);
2779 msa = viewport.getAlignmentView(true);
2783 /*Vector seqs = viewport.getAlignment().getSequences();
2785 if (seqs.size() > 1)
2787 msa = new SequenceI[seqs.size()];
2789 for (int i = 0; i < seqs.size(); i++)
2791 msa[i] = (SequenceI) seqs.elementAt(i);
2794 msa = viewport.getAlignmentView(false);
2800 * Decides what is submitted to a secondary structure prediction service,
2801 * the currently selected sequence, or the currently selected alignment
2802 * (where the first sequence in the set is the one that the prediction
2805 AlignmentView gatherSeqOrMsaForSecStrPrediction()
2807 AlignmentView seqs = null;
2809 if ( (viewport.getSelectionGroup() != null) &&
2810 (viewport.getSelectionGroup().getSize(false) > 0))
2812 seqs = viewport.getAlignmentView(true);
2816 seqs = viewport.getAlignmentView(false);
2818 // limit sequences - JBPNote in future - could spawn multiple prediction jobs
2819 // TODO: viewport.alignment.isAligned is a global state - the local selection may well be aligned - we preserve 2.0.8 behaviour for moment.
2820 if (!viewport.alignment.isAligned())
2822 seqs.setSequences(new SeqCigar[] { seqs.getSequences()[0] } );
2829 * @param e DOCUMENT ME!
2831 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
2833 // Pick the tree file
2834 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
2837 chooser.setFileView(new JalviewFileView());
2838 chooser.setDialogTitle("Select a newick-like tree file");
2839 chooser.setToolTipText("Load a tree file");
2841 int value = chooser.showOpenDialog(null);
2843 if (value == JalviewFileChooser.APPROVE_OPTION)
2845 String choice = chooser.getSelectedFile().getPath();
2846 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
2850 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
2852 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
2854 catch (Exception ex)
2856 JOptionPane.showMessageDialog(Desktop.desktop,
2857 "Problem reading tree file",
2859 JOptionPane.WARNING_MESSAGE);
2860 ex.printStackTrace();
2866 public TreePanel ShowNewickTree(NewickFile nf, String title)
2868 return ShowNewickTree(nf,title,600,500,4,5);
2870 public TreePanel ShowNewickTree(NewickFile nf, String title, AlignmentView input)
2872 return ShowNewickTree(nf,title, input, 600,500,4,5);
2874 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y) {
2875 return ShowNewickTree(nf, title, null, w, h, x, y);
2878 * Add a treeviewer for the tree extracted from a newick file object to the current alignment view
2880 * @param nf the tree
2881 * @param title tree viewer title
2882 * @param input Associated alignment input data (or null)
2887 * @return TreePanel handle
2889 public TreePanel ShowNewickTree(NewickFile nf, String title, AlignmentView input, int w,int h,int x, int y) {
2890 TreePanel tp = null;
2896 if (nf.getTree() != null)
2898 tp = new TreePanel(alignPanel,
2906 tp.setLocation(x,y);
2909 Desktop.addInternalFrame(tp, title, w, h);
2912 catch (Exception ex)
2914 ex.printStackTrace();
2925 PrinterJob printJob = PrinterJob.getPrinterJob();
2926 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
2927 printJob.setPrintable(alignPanel, pf);
2929 if (printJob.printDialog())
2935 catch (Exception PrintException)
2937 PrintException.printStackTrace();
2944 * Generates menu items and listener event actions for web service clients
2947 public void BuildWebServiceMenu()
2949 if ( (Discoverer.services != null)
2950 && (Discoverer.services.size() > 0))
2952 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
2953 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
2954 Vector wsmenu = new Vector();
2955 final AlignFrame af = this;
2958 // Add any Multiple Sequence Alignment Services
2959 final JMenu msawsmenu = new JMenu("Alignment");
2960 for (int i = 0, j = msaws.size(); i < j; i++)
2962 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
2964 final JMenuItem method = new JMenuItem(sh.getName());
2965 method.addActionListener(new ActionListener()
2967 public void actionPerformed(ActionEvent e)
2969 AlignmentView msa = gatherSequencesForAlignment();
2970 new jalview.ws.MsaWSClient(sh, title, msa,
2971 false, true, viewport.getAlignment().getDataset(), af);
2976 msawsmenu.add(method);
2977 // Deal with services that we know accept partial alignments.
2978 if (sh.getName().indexOf("lustal") > -1)
2980 // We know that ClustalWS can accept partial alignments for refinement.
2981 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
2982 methodR.addActionListener(new ActionListener()
2984 public void actionPerformed(ActionEvent e)
2986 AlignmentView msa = gatherSequencesForAlignment();
2987 new jalview.ws.MsaWSClient(sh, title, msa,
2988 true, true, viewport.getAlignment().getDataset(), af);
2993 msawsmenu.add(methodR);
2997 wsmenu.add(msawsmenu);
2999 if (secstrpr != null)
3001 // Add any secondary structure prediction services
3002 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
3003 for (int i = 0, j = secstrpr.size(); i < j; i++)
3005 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
3007 final JMenuItem method = new JMenuItem(sh.getName());
3008 method.addActionListener(new ActionListener()
3010 public void actionPerformed(ActionEvent e)
3012 AlignmentView msa = gatherSeqOrMsaForSecStrPrediction();
3013 if (msa.getSequences().length == 1)
3015 // Single Sequence prediction
3016 new jalview.ws.JPredClient(sh, title, false, msa, af, true);
3020 if (msa.getSequences().length > 1)
3022 // Sequence profile based prediction
3023 new jalview.ws.JPredClient(sh,
3024 title, true, msa, af, true);
3029 secstrmenu.add(method);
3031 wsmenu.add(secstrmenu);
3033 this.webService.removeAll();
3034 for (int i = 0, j = wsmenu.size(); i < j; i++)
3036 webService.add( (JMenu) wsmenu.get(i));
3041 this.webService.removeAll();
3042 this.webService.add(this.webServiceNoServices);
3044 // TODO: add in rediscovery function
3045 // TODO: reduce code redundancy.
3046 // TODO: group services by location as well as function.
3049 /* public void vamsasStore_actionPerformed(ActionEvent e)
3051 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
3052 getProperty("LAST_DIRECTORY"));
3054 chooser.setFileView(new JalviewFileView());
3055 chooser.setDialogTitle("Export to Vamsas file");
3056 chooser.setToolTipText("Export");
3058 int value = chooser.showSaveDialog(this);
3060 if (value == JalviewFileChooser.APPROVE_OPTION)
3062 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
3063 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
3064 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
3071 public void showTranslation_actionPerformed(ActionEvent e)
3073 SequenceI [] selection = viewport.getSelectionAsNewSequence();
3074 String [] seqstring = viewport.getViewAsString(true);
3076 int s, sSize = selection.length;
3077 SequenceI [] newSeq = new SequenceI[sSize];
3080 StringBuffer protein;
3082 for(s=0; s<sSize; s++)
3084 protein = new StringBuffer();
3085 seq = AlignSeq.extractGaps("-. ", seqstring[s]);
3086 resSize = seq.length();
3087 resSize -= resSize%3;
3089 for(res = 0; res < resSize; res+=3)
3091 String codon = seq.substring(res, res+3);
3092 codon = codon.replace('U', 'T');
3093 String aa = ResidueProperties.codonTranslate(codon);
3095 protein.append(viewport.getGapCharacter());
3096 else if(aa.equals("STOP"))
3097 protein.append("X");
3099 protein.append( aa );
3101 newSeq[s] = new Sequence(selection[s].getName(),
3102 protein.toString());
3106 AlignmentI al = new Alignment(newSeq);
3107 al.setDataset(null);
3110 ////////////////////////////////
3111 // Copy annotations across
3112 jalview.datamodel.AlignmentAnnotation[] annotations
3113 = viewport.alignment.getAlignmentAnnotation();
3115 if(annotations!=null)
3117 for (int i = 0; i < annotations.length; i++)
3119 if (annotations[i].label.equals("Quality") ||
3120 annotations[i].label.equals("Conservation") ||
3121 annotations[i].label.equals("Consensus"))
3126 aSize = viewport.alignment.getWidth() / 3;
3127 jalview.datamodel.Annotation[] anots =
3128 new jalview.datamodel.Annotation[aSize];
3130 for (a = 0; a < viewport.alignment.getWidth(); a++)
3132 if (annotations[i].annotations[a] == null
3133 || annotations[i].annotations[a] == null)
3136 anots[a / 3] = new Annotation(
3137 annotations[i].annotations[a].displayCharacter,
3138 annotations[i].annotations[a].description,
3139 annotations[i].annotations[a].secondaryStructure,
3140 annotations[i].annotations[a].value,
3141 annotations[i].annotations[a].colour);
3144 jalview.datamodel.AlignmentAnnotation aa
3145 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
3146 annotations[i].description, anots);
3147 al.addAnnotation(aa);
3151 AlignFrame af = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT);
3152 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
3164 * @param String DOCUMENT ME!
3166 public boolean parseFeaturesFile(String file, String type)
3168 boolean featuresFile = false;
3170 featuresFile = new FeaturesFile(file, type).parse(viewport.alignment.getDataset(),
3171 alignPanel.seqPanel.seqCanvas.
3172 getFeatureRenderer().featureColours,
3177 ex.printStackTrace();
3182 viewport.showSequenceFeatures = true;
3183 showSeqFeatures.setSelected(true);
3184 alignPanel.repaint();
3187 return featuresFile;
3190 public void dragEnter(DropTargetDragEvent evt)
3193 public void dragExit(DropTargetEvent evt)
3196 public void dragOver(DropTargetDragEvent evt)
3199 public void dropActionChanged(DropTargetDragEvent evt)
3202 public void drop(DropTargetDropEvent evt)
3204 Transferable t = evt.getTransferable();
3205 java.util.List files = null;
3209 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
3210 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
3212 //Works on Windows and MacOSX
3213 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
3214 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
3216 else if (t.isDataFlavorSupported(uriListFlavor))
3218 // This is used by Unix drag system
3219 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
3220 String data = (String) t.getTransferData(uriListFlavor);
3221 files = new java.util.ArrayList(1);
3222 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
3225 st.hasMoreTokens(); )
3227 String s = st.nextToken();
3228 if (s.startsWith("#"))
3230 // the line is a comment (as per the RFC 2483)
3234 java.net.URI uri = new java.net.URI(s);
3235 java.io.File file = new java.io.File(uri);
3242 e.printStackTrace();
3249 for (int i = 0; i < files.size(); i++)
3251 loadJalviewDataFile(files.get(i).toString());
3254 catch (Exception ex)
3256 ex.printStackTrace();
3261 // This method will attempt to load a "dropped" file first by testing
3262 // whether its and Annotation file, then features file. If both are
3263 // false then the user may have dropped an alignment file onto this
3265 public void loadJalviewDataFile(String file)
3268 String protocol = "File";
3270 if (file.indexOf("http:") > -1 || file.indexOf("file:") > -1)
3275 boolean isAnnotation = new AnnotationFile().readAnnotationFile(viewport.
3280 boolean isGroupsFile = parseFeaturesFile(file,protocol);
3283 String format = new IdentifyFile().Identify(file, protocol);
3285 if(format.equalsIgnoreCase("JnetFile"))
3287 jalview.io.JPredFile predictions = new jalview.io.JPredFile(
3289 new JnetAnnotationMaker().add_annotation(predictions,
3290 viewport.getAlignment(),
3292 alignPanel.adjustAnnotationHeight();
3293 alignPanel.repaint();
3296 new FileLoader().LoadFile(viewport, file, protocol, format);
3302 alignPanel.adjustAnnotationHeight();
3305 }catch(Exception ex)
3307 ex.printStackTrace();
3311 public void tabSelectionChanged(int index)
3315 alignPanel = (AlignmentPanel) alignPanels.elementAt(index);
3316 viewport = alignPanel.av;
3317 setMenusFromViewport(viewport);
3321 public void tabbedPane_mousePressed(MouseEvent e)
3323 if(SwingUtilities.isRightMouseButton(e))
3325 String reply = JOptionPane.showInternalInputDialog(this,
3328 JOptionPane.QUESTION_MESSAGE);
3332 viewport.viewName = reply;
3333 tabbedPane.setTitleAt( tabbedPane.getSelectedIndex() ,reply);
3339 public AlignViewport getCurrentView()