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.util.ShiftList;
38 import java.awt.dnd.*;
39 import org.biojava.dasobert.eventmodel.*;
47 public class AlignFrame
48 extends GAlignFrame implements DropTargetListener, FeatureListener
51 public static final int DEFAULT_WIDTH = 700;
54 public static final int DEFAULT_HEIGHT = 500;
55 public AlignmentPanel alignPanel;
56 AlignViewport viewport;
59 Vector alignPanels = new Vector();
63 public String currentFileFormat = null;
64 Stack historyList = new Stack();
65 Stack redoList = new Stack();
66 private int treeCount = 0;
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);
102 * Make a new AlignFrame from exisiting alignmentPanels
103 * @param ap AlignmentPanel
104 * @param av AlignViewport
106 public AlignFrame(AlignmentPanel ap)
110 addAlignmentPanel(ap);
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 if (jalview.bin.Cache.getDefault("WRAP_ALIGNMENT", false))
143 wrapMenuItem.setSelected(true);
144 wrapMenuItem_actionPerformed(null);
150 void addKeyListener()
152 final AlignFrame af = this;
153 addKeyListener(new KeyAdapter()
155 public void keyPressed(KeyEvent evt)
157 if (viewport.cursorMode
158 && evt.getKeyCode() >= KeyEvent.VK_0
159 && evt.getKeyCode() <= KeyEvent.VK_9)
161 alignPanel.seqPanel.numberPressed(evt.getKeyChar());
164 switch (evt.getKeyCode())
167 if (!evt.isControlDown())
170 if(viewport.hasHiddenRows)
172 al = viewport.alignment.getHiddenSequences().getFullAlignment();
175 al = new Alignment(viewport.alignment.getSequencesArray());
177 AlignViewport newview = new AlignViewport(al);
179 AlignmentPanel copy = new AlignmentPanel(af, newview);
181 if(viewport.viewName==null)
182 viewport.viewName="View 1";
184 copy.av.sequenceSetID = viewport.getSequenceSetId();
185 copy.av.viewName = "View " +
186 (Desktop.getViewCount(viewport.getSequenceSetId())+1);
189 addAlignmentPanel(copy);
190 PaintRefresher.Register(copy, viewport.getSequenceSetId());
191 PaintRefresher.Register(alignPanel,
192 viewport.getSequenceSetId());
197 Desktop.instance.gatherViews(af);
201 if (!evt.isControlDown())
203 Desktop.instance.explodeViews(af);
208 case 27: // escape key
209 deselectAllSequenceMenuItem_actionPerformed(null);
213 case KeyEvent.VK_DOWN:
214 if (viewport.cursorMode)
216 alignPanel.seqPanel.moveCursor(0, 1);
219 moveSelectedSequences(false);
223 if (viewport.cursorMode)
225 alignPanel.seqPanel.moveCursor(0, -1);
228 moveSelectedSequences(true);
231 case KeyEvent.VK_LEFT:
232 if (viewport.cursorMode)
234 alignPanel.seqPanel.moveCursor( -1, 0);
238 case KeyEvent.VK_RIGHT:
239 if (viewport.cursorMode)
241 alignPanel.seqPanel.moveCursor(1, 0);
245 case KeyEvent.VK_SPACE:
246 if (viewport.cursorMode)
248 alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown()
254 case KeyEvent.VK_DELETE:
255 case KeyEvent.VK_BACK_SPACE:
256 if (!viewport.cursorMode)
258 cut_actionPerformed(null);
261 alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown()
268 if (viewport.cursorMode)
270 alignPanel.seqPanel.setCursorRow();
274 if (viewport.cursorMode && !evt.isControlDown())
276 alignPanel.seqPanel.setCursorColumn();
280 if (viewport.cursorMode)
282 alignPanel.seqPanel.setCursorPosition();
286 case KeyEvent.VK_ENTER:
287 case KeyEvent.VK_COMMA:
288 if (viewport.cursorMode)
290 alignPanel.seqPanel.setCursorRowAndColumn();
295 if (viewport.cursorMode)
297 alignPanel.seqPanel.setSelectionAreaAtCursor(true);
301 if (viewport.cursorMode)
303 alignPanel.seqPanel.setSelectionAreaAtCursor(false);
308 viewport.cursorMode = !viewport.cursorMode;
309 statusBar.setText("Keyboard editing mode is " +
310 (viewport.cursorMode ? "on" : "off"));
311 if (viewport.cursorMode)
313 alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes;
314 alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq;
316 alignPanel.seqPanel.seqCanvas.repaint();
322 ClassLoader cl = jalview.gui.Desktop.class.getClassLoader();
323 java.net.URL url = javax.help.HelpSet.findHelpSet(cl, "help/help");
324 javax.help.HelpSet hs = new javax.help.HelpSet(cl, url);
326 javax.help.HelpBroker hb = hs.createHelpBroker();
327 hb.setCurrentID("home");
328 hb.setDisplayed(true);
332 ex.printStackTrace();
338 boolean toggleSeqs = !evt.isControlDown();
339 boolean toggleCols = !evt.isShiftDown();
341 boolean hide = false;
343 SequenceGroup sg = viewport.getSelectionGroup();
346 if (sg != null && sg.getSize(false) != viewport.alignment.getHeight())
348 hideSelSequences_actionPerformed(null);
351 else if (! (toggleCols && viewport.colSel.getSelected().size() > 0))
352 showAllSeqs_actionPerformed(null);
357 if (viewport.colSel.getSelected().size() > 0)
359 hideSelColumns_actionPerformed(null);
361 viewport.selectionGroup = sg;
364 showAllColumns_actionPerformed(null);
368 case KeyEvent.VK_PAGE_UP:
369 if (viewport.wrapAlignment)
370 alignPanel.scrollUp(true);
372 alignPanel.setScrollValues(viewport.startRes,
374 - viewport.endSeq + viewport.startSeq);
376 case KeyEvent.VK_PAGE_DOWN:
377 if (viewport.wrapAlignment)
378 alignPanel.scrollUp(false);
380 alignPanel.setScrollValues(viewport.startRes,
382 + viewport.endSeq - viewport.startSeq);
392 public void addAlignmentPanel(final AlignmentPanel ap)
394 alignPanels.addElement(ap);
396 int aSize = alignPanels.size();
398 tabbedPane.setVisible(aSize>1 || ap.av.viewName!=null);
400 if (aSize == 1 && ap.av.viewName==null)
402 this.getContentPane().add(ap, BorderLayout.CENTER);
408 AlignmentPanel first = (AlignmentPanel) alignPanels.firstElement();
409 tabbedPane.addTab(first.av.viewName==null?"Original":first.av.viewName,first);
411 this.getContentPane().add(tabbedPane, BorderLayout.CENTER);
414 tabbedPane.addTab(ap.av.viewName==null?"Original":ap.av.viewName, ap);
417 ap.av.updateConsensus(ap);
418 ap.av.updateConservation(ap);
421 ap.av.addPropertyChangeListener(new PropertyChangeListener()
423 public void propertyChange(PropertyChangeEvent evt)
425 if (evt.getPropertyName().equals("alignment"))
427 PaintRefresher.Refresh(ap, ap.av.getSequenceSetId());
438 public AlignViewport getViewport()
443 /* Set up intrinsic listeners for dynamically generated GUI bits. */
444 private void addServiceListeners()
446 final java.beans.PropertyChangeListener thisListener;
447 // Do this once to get current state
448 BuildWebServiceMenu();
449 Desktop.discoverer.addPropertyChangeListener(
450 thisListener = new java.beans.PropertyChangeListener()
452 public void propertyChange(PropertyChangeEvent evt)
454 // System.out.println("Discoverer property change.");
455 if (evt.getPropertyName().equals("services"))
457 // System.out.println("Rebuilding web service menu");
458 BuildWebServiceMenu();
463 addInternalFrameListener(new javax.swing.event.
464 InternalFrameAdapter()
466 public void internalFrameClosed(
467 javax.swing.event.InternalFrameEvent evt)
469 // System.out.println("deregistering discoverer listener");
470 Desktop.discoverer.removePropertyChangeListener(thisListener);
471 closeMenuItem_actionPerformed(null);
477 public void setGUINucleotide(boolean nucleotide)
479 showTranslation.setVisible( nucleotide );
480 //sequenceFeatures.setVisible(!nucleotide );
481 //featureSettings.setVisible( !nucleotide );
482 conservationMenuItem.setVisible( !nucleotide );
483 modifyConservation.setVisible( !nucleotide );
485 //Remember AlignFrame always starts as protein
488 calculateMenu.remove(calculateMenu.getItemCount()-2);
492 public void comeBackLater(FeatureEvent evt)
495 public void newFeatures(FeatureEvent evt)
497 if (evt.getFeatures().length > 0)
499 alignPanel.seqPanel.seqCanvas.fr.featuresAdded();
500 alignPanel.repaint();
504 Hashtable progressBars;
505 public void setProgressBar(String message, long id)
507 if(progressBars == null)
508 progressBars = new Hashtable();
510 JPanel progressPanel;
511 GridLayout layout = (GridLayout) statusPanel.getLayout();
512 if(progressBars.get( new Long(id) )!=null)
514 progressPanel = (JPanel)progressBars.get( new Long(id) );
515 statusPanel.remove(progressPanel);
516 progressBars.remove( progressPanel );
517 progressPanel = null;
519 statusBar.setText(message);
521 layout.setRows(layout.getRows() - 1);
525 progressPanel = new JPanel(new BorderLayout(10, 5));
527 JProgressBar progressBar = new JProgressBar();
528 progressBar.setIndeterminate(true);
530 progressPanel.add(new JLabel(message), BorderLayout.WEST);
531 progressPanel.add(progressBar, BorderLayout.CENTER);
533 layout.setRows(layout.getRows() + 1);
534 statusPanel.add(progressPanel);
536 progressBars.put(new Long(id), progressPanel);
544 Added so Castor Mapping file can obtain Jalview Version
546 public String getVersion()
548 return jalview.bin.Cache.getProperty("VERSION");
551 public FeatureRenderer getFeatureRenderer()
553 return alignPanel.seqPanel.seqCanvas.getFeatureRenderer();
557 public void fetchSequence_actionPerformed(ActionEvent e)
559 new SequenceFetcher(this);
562 public void addFromFile_actionPerformed(ActionEvent e)
564 Desktop.instance.inputLocalFileMenuItem_actionPerformed(viewport);
567 public void addFromText_actionPerformed(ActionEvent e)
569 Desktop.instance.inputTextboxMenuItem_actionPerformed(viewport);
572 public void addFromURL_actionPerformed(ActionEvent e)
574 Desktop.instance.inputURLMenuItem_actionPerformed(viewport);
580 * @param e DOCUMENT ME!
582 public void saveAlignmentMenu_actionPerformed(ActionEvent e)
584 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
585 getProperty( "LAST_DIRECTORY"),
587 { "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc","jar" },
589 { "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview" },
594 chooser.setFileView(new JalviewFileView());
595 chooser.setDialogTitle("Save Alignment to file");
596 chooser.setToolTipText("Save");
598 int value = chooser.showSaveDialog(this);
600 if (value == JalviewFileChooser.APPROVE_OPTION)
602 currentFileFormat = chooser.getSelectedFormat();
604 if (currentFileFormat == null)
606 JOptionPane.showInternalMessageDialog(Desktop.desktop,
607 "You must select a file format before saving!",
608 "File format not specified",
609 JOptionPane.WARNING_MESSAGE);
610 value = chooser.showSaveDialog(this);
614 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
617 String choice = chooser.getSelectedFile().getPath();
618 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
620 saveAlignment(choice, currentFileFormat);
624 public boolean saveAlignment(String file, String format)
626 if (format.equalsIgnoreCase("Jalview"))
628 String shortName = title;
630 if (shortName.indexOf(java.io.File.separatorChar) > -1)
632 shortName = shortName.substring(shortName.lastIndexOf(
633 java.io.File.separatorChar) + 1);
636 new Jalview2XML().SaveAlignment(this, file, shortName);
638 // USE Jalview2XML to save this file
644 String[] omitHidden = null;
646 if (viewport.hasHiddenColumns)
648 int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop,
649 "The Alignment contains hidden columns."
650 + "\nDo you want to save only the visible alignment?",
651 "Save / Omit Hidden Columns",
652 JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
654 if (reply == JOptionPane.YES_OPTION)
655 omitHidden = viewport.getViewAsString(false);
658 String output = new FormatAdapter().formatSequences(
660 viewport.alignment.getSequencesArray(),
670 java.io.PrintWriter out = new java.io.PrintWriter(
671 new java.io.FileWriter(file));
680 ex.printStackTrace();
689 * @param e DOCUMENT ME!
691 protected void outputText_actionPerformed(ActionEvent e)
693 String [] omitHidden = null;
695 if(viewport.hasHiddenColumns)
697 int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop,
698 "The Alignment contains hidden columns."
699 +"\nDo you want to output only the visible alignment?",
700 "Save / Omit Hidden Columns",
701 JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
703 if(reply==JOptionPane.YES_OPTION)
705 omitHidden = viewport.getViewAsString(false);
709 CutAndPasteTransfer cap = new CutAndPasteTransfer();
710 Desktop.addInternalFrame(cap,
711 "Alignment output - " + e.getActionCommand(), 600,
715 cap.setText(new FormatAdapter().formatSequences(
716 e.getActionCommand(),
717 viewport.alignment.getSequencesArray(),
724 * @param e DOCUMENT ME!
726 protected void htmlMenuItem_actionPerformed(ActionEvent e)
728 new HTMLOutput(viewport,
729 alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
730 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
733 public void createImageMap(File file, String image)
735 alignPanel.makePNGImageMap(file, image);
741 * @param e DOCUMENT ME!
743 public void createPNG(File f)
745 alignPanel.makePNG(f);
751 * @param e DOCUMENT ME!
753 public void createEPS(File f)
755 alignPanel.makeEPS(f);
761 * @param e DOCUMENT ME!
763 public void printMenuItem_actionPerformed(ActionEvent e)
765 //Putting in a thread avoids Swing painting problems
766 PrintThread thread = new PrintThread();
770 public void exportFeatures_actionPerformed(ActionEvent e)
772 new AnnotationExporter().exportFeatures(alignPanel);
776 public void exportAnnotations_actionPerformed(ActionEvent e)
778 new AnnotationExporter().exportAnnotations(
780 viewport.alignment.getAlignmentAnnotation()
785 public void associatedData_actionPerformed(ActionEvent e)
787 // Pick the tree file
788 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
791 chooser.setFileView(new JalviewFileView());
792 chooser.setDialogTitle("Load Jalview Annotations or Features File");
793 chooser.setToolTipText("Load Jalview Annotations / Features file");
795 int value = chooser.showOpenDialog(null);
797 if (value == JalviewFileChooser.APPROVE_OPTION)
799 String choice = chooser.getSelectedFile().getPath();
800 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
801 loadJalviewDataFile(choice);
810 * @param e DOCUMENT ME!
812 public void closeMenuItem_actionPerformed(ActionEvent e)
816 for(int i=0; i<alignPanels.size(); i++)
818 AlignmentPanel ap = (AlignmentPanel)alignPanels.elementAt(i);
819 PaintRefresher.RemoveComponent(ap.seqPanel.seqCanvas);
820 PaintRefresher.RemoveComponent(ap.idPanel.idCanvas);
821 PaintRefresher.RemoveComponent(ap);
824 this.setClosed(true);
835 void updateEditMenuBar()
837 /* if (historyList.size() > 0)
839 undoMenuItem.setEnabled(true);
841 HistoryItem hi = (HistoryItem) historyList.peek();
842 undoMenuItem.setText("Undo " + hi.getDescription());
846 undoMenuItem.setEnabled(false);
847 undoMenuItem.setText("Undo");
850 if (redoList.size() > 0)
852 redoMenuItem.setEnabled(true);
854 HistoryItem hi = (HistoryItem) redoList.peek();
855 redoMenuItem.setText("Redo " + hi.getDescription());
859 redoMenuItem.setEnabled(false);
860 redoMenuItem.setText("Redo");
867 * @param hi DOCUMENT ME!
869 public void addHistoryItem(HistoryItem hi)
871 historyList.push(hi);
879 * @param e DOCUMENT ME!
881 protected void undoMenuItem_actionPerformed(ActionEvent e)
883 HistoryItem nh,hi = (HistoryItem) historyList.pop();
884 redoList.push(nh=new HistoryItem(hi.getDescription(), viewport.alignment,
886 if (hi.alColumnChanges!=null)
887 nh.alColumnChanges = hi.alColumnChanges.getInverse();
888 restoreHistoryItem(hi);
889 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
895 * @param e DOCUMENT ME!
897 protected void redoMenuItem_actionPerformed(ActionEvent e)
899 HistoryItem nh,hi = (HistoryItem) redoList.pop();
900 historyList.push(nh=new HistoryItem(hi.getDescription(), viewport.alignment,
902 if (hi.alColumnChanges!=null)
903 nh.alColumnChanges=hi.alColumnChanges.getInverse();
904 restoreHistoryItem(hi);
906 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
909 // used by undo and redo
910 void restoreHistoryItem(HistoryItem hi)
913 hi.restore(viewport.getColumnSelection());
917 viewport.firePropertyChange("alignment", null,
918 viewport.getAlignment().getSequences());
924 * @param up DOCUMENT ME!
926 public void moveSelectedSequences(boolean up)
928 SequenceGroup sg = viewport.getSelectionGroup();
937 for (int i = 1; i < viewport.alignment.getHeight(); i++)
939 SequenceI seq = viewport.alignment.getSequenceAt(i);
941 if (!sg.getSequences(false).contains(seq))
946 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
948 if (sg.getSequences(false).contains(temp))
953 viewport.alignment.getSequences().setElementAt(temp, i);
954 viewport.alignment.getSequences().setElementAt(seq, i - 1);
959 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
961 SequenceI seq = viewport.alignment.getSequenceAt(i);
963 if (!sg.getSequences(false).contains(seq))
968 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
970 if (sg.getSequences(false).contains(temp))
975 viewport.alignment.getSequences().setElementAt(temp, i);
976 viewport.alignment.getSequences().setElementAt(seq, i + 1);
980 alignPanel.repaint();
988 * @param e DOCUMENT ME!
990 protected void copy_actionPerformed(ActionEvent e)
993 if (viewport.getSelectionGroup() == null)
998 SequenceI [] seqs = viewport.getSelectionAsNewSequence();
999 String[] omitHidden = null;
1001 if (viewport.hasHiddenColumns)
1003 omitHidden = viewport.getViewAsString(true);
1006 String output = new FormatAdapter().formatSequences(
1011 StringSelection ss = new StringSelection(output);
1015 //Its really worth setting the clipboard contents
1016 //to empty before setting the large StringSelection!!
1017 Toolkit.getDefaultToolkit().getSystemClipboard()
1018 .setContents(new StringSelection(""), null);
1020 Toolkit.getDefaultToolkit().getSystemClipboard()
1021 .setContents(ss, Desktop.instance);
1023 catch (OutOfMemoryError er)
1025 er.printStackTrace();
1026 javax.swing.SwingUtilities.invokeLater(new Runnable()
1030 javax.swing.JOptionPane.showInternalMessageDialog(Desktop.desktop,
1031 "Out of memory copying region!!"
1033 "\nSee help files for increasing Java Virtual Machine memory."
1035 javax.swing.JOptionPane.WARNING_MESSAGE);
1042 Vector hiddenColumns = null;
1043 if(viewport.hasHiddenColumns)
1045 hiddenColumns =new Vector();
1046 int hiddenOffset = viewport.getSelectionGroup().getStartRes();
1047 for(int i=0; i<viewport.getColumnSelection().getHiddenColumns().size(); i++)
1049 int[] region = (int[])
1050 viewport.getColumnSelection().getHiddenColumns().elementAt(i);
1052 hiddenColumns.addElement(new int[]{region[0]-hiddenOffset,
1053 region[1]-hiddenOffset});
1059 Desktop.jalviewClipboard = new Object[]{ seqs,
1060 viewport.alignment.getDataset(),
1062 statusBar.setText("Copied "+seqs.length+" sequences to clipboard.");
1068 * @param e DOCUMENT ME!
1070 protected void pasteNew_actionPerformed(ActionEvent e)
1078 * @param e DOCUMENT ME!
1080 protected void pasteThis_actionPerformed(ActionEvent e)
1082 addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,
1083 HistoryItem.PASTE));
1090 * @param newAlignment DOCUMENT ME!
1092 void paste(boolean newAlignment)
1096 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
1097 Transferable contents = c.getContents(this);
1099 if (contents == null)
1107 str = (String) contents.getTransferData(DataFlavor.stringFlavor);
1108 if (str.length() < 1)
1111 format = new IdentifyFile().Identify(str, "Paste");
1114 catch (OutOfMemoryError er)
1116 er.printStackTrace();
1117 javax.swing.SwingUtilities.invokeLater(new Runnable()
1121 javax.swing.JOptionPane.showInternalMessageDialog(Desktop.desktop,
1122 "Out of memory pasting sequences!!"
1124 "\nSee help files for increasing Java Virtual Machine memory."
1126 javax.swing.JOptionPane.WARNING_MESSAGE);
1133 SequenceI[] sequences;
1136 if(Desktop.jalviewClipboard!=null)
1138 // The clipboard was filled from within Jalview, we must use the sequences
1139 // And dataset from the copied alignment
1140 sequences = (SequenceI[])Desktop.jalviewClipboard[0];
1144 sequences = new FormatAdapter().readFile(str, "Paste", format);
1147 AlignmentI alignment = null;
1151 alignment = new Alignment(sequences);
1153 if (Desktop.jalviewClipboard != null)
1154 alignment.setDataset( (Alignment) Desktop.jalviewClipboard[1]);
1156 alignment.setDataset(null);
1160 alignment = viewport.getAlignment();
1163 for (int i = 0; i < sequences.length; i++)
1165 Sequence newseq = new Sequence(sequences[i].getName(),
1166 sequences[i].getSequence(), sequences[i].getStart(),
1167 sequences[i].getEnd());
1169 alignment.addSequence(newseq);
1170 PaintRefresher.Refresh(alignPanel,
1171 alignPanel.av.getSequenceSetId(),
1176 viewport.setEndSeq(alignment.getHeight());
1177 alignment.getWidth();
1178 viewport.firePropertyChange("alignment", null, alignment.getSequences());
1183 // Add any annotations attached to sequences
1184 for (int i = 0; i < sequences.length; i++)
1186 if (sequences[i].getAnnotation() != null)
1188 for (int a = 0; a < sequences[i].getAnnotation().length; a++)
1190 AlignmentAnnotation newAnnot =
1191 new AlignmentAnnotation(
1192 sequences[i].getAnnotation()[a].label,
1193 sequences[i].getAnnotation()[a].description,
1194 sequences[i].getAnnotation()[a].annotations,
1195 sequences[i].getAnnotation()[a].graphMin,
1196 sequences[i].getAnnotation()[a].graphMax,
1197 sequences[i].getAnnotation()[a].graph);
1199 sequences[i].getAnnotation()[a] = newAnnot;
1200 newAnnot.sequenceMapping = sequences[i].getAnnotation()[a].
1202 newAnnot.sequenceRef = sequences[i];
1203 newAnnot.adjustForAlignment();
1204 alignment.addAnnotation(newAnnot);
1205 alignment.setAnnotationIndex(newAnnot, a);
1208 alignPanel.annotationPanel.adjustPanelHeight();
1214 AlignFrame af = new AlignFrame(alignment, DEFAULT_WIDTH, DEFAULT_HEIGHT);
1215 String newtitle = new String("Copied sequences");
1217 if(Desktop.jalviewClipboard!=null && Desktop.jalviewClipboard[2]!=null)
1219 Vector hc = (Vector)Desktop.jalviewClipboard[2];
1220 for(int i=0; i<hc.size(); i++)
1222 int [] region = (int[]) hc.elementAt(i);
1223 af.viewport.hideColumns(region[0], region[1]);
1228 //>>>This is a fix for the moment, until a better solution is found!!<<<
1229 af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().transferSettings(
1230 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
1233 if (title.startsWith("Copied sequences"))
1239 newtitle = newtitle.concat("- from " + title);
1242 Desktop.addInternalFrame(af, newtitle, DEFAULT_WIDTH,
1249 catch (Exception ex)
1251 ex.printStackTrace();
1252 System.out.println("Exception whilst pasting: "+ex);
1253 // could be anything being pasted in here
1262 * @param e DOCUMENT ME!
1264 protected void cut_actionPerformed(ActionEvent e)
1266 copy_actionPerformed(null);
1267 delete_actionPerformed(null);
1273 * @param e DOCUMENT ME!
1275 protected void delete_actionPerformed(ActionEvent e)
1278 if (viewport.getSelectionGroup() == null)
1284 SequenceGroup sg = viewport.getSelectionGroup();
1287 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
1291 for (int i = 0; i < sg.getSize(false); i++)
1293 SequenceI seq = sg.getSequenceAt(i);
1294 seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);
1296 // If the cut affects all sequences, remove highlighted columns
1297 if (sg.getSize(false) == viewport.alignment.getHeight())
1299 viewport.getColumnSelection().removeElements(sg.getStartRes(),
1300 sg.getEndRes() + 1);
1303 if (seq.getSequence().length() < 1)
1305 viewport.getAlignment().deleteSequence(seq);
1306 PaintRefresher.Refresh(alignPanel,alignPanel.av.getSequenceSetId(),seq,null);
1310 viewport.setSelectionGroup(null);
1311 viewport.alignment.deleteGroup(sg);
1313 viewport.firePropertyChange("alignment", null,
1314 viewport.getAlignment().getSequences());
1318 if (viewport.getAlignment().getHeight() < 1)
1322 this.setClosed(true);
1324 catch (Exception ex)
1333 * @param e DOCUMENT ME!
1335 protected void deleteGroups_actionPerformed(ActionEvent e)
1337 viewport.alignment.deleteAllGroups();
1338 viewport.setSelectionGroup(null);
1339 PaintRefresher.Refresh(this, viewport.getSequenceSetId());
1340 alignPanel.repaint();
1346 * @param e DOCUMENT ME!
1348 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
1350 SequenceGroup sg = new SequenceGroup();
1352 for (int i = 0; i < viewport.getAlignment().getSequences().size();
1355 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
1358 sg.setEndRes(viewport.alignment.getWidth() - 1);
1359 viewport.setSelectionGroup(sg);
1360 alignPanel.repaint();
1361 PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
1367 * @param e DOCUMENT ME!
1369 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
1371 if(viewport.cursorMode)
1373 alignPanel.seqPanel.keyboardNo1 = null;
1374 alignPanel.seqPanel.keyboardNo2 = null;
1376 viewport.setSelectionGroup(null);
1377 viewport.getColumnSelection().clear();
1378 viewport.setSelectionGroup(null);
1379 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
1380 alignPanel.idPanel.idCanvas.searchResults = null;
1381 alignPanel.repaint();
1382 PaintRefresher.Refresh(this, viewport.getSequenceSetId());
1388 * @param e DOCUMENT ME!
1390 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
1392 SequenceGroup sg = viewport.getSelectionGroup();
1396 selectAllSequenceMenuItem_actionPerformed(null);
1401 for (int i = 0; i < viewport.getAlignment().getSequences().size();
1404 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
1407 PaintRefresher.Refresh(this, viewport.getSequenceSetId());
1410 public void invertColSel_actionPerformed(ActionEvent e)
1412 viewport.invertColumnSelection();
1413 alignPanel.repaint();
1420 * @param e DOCUMENT ME!
1422 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
1424 ColumnSelection colSel = viewport.getColumnSelection();
1426 if (colSel.size() > 0)
1429 addHistoryItem(edit=new HistoryItem("Remove Left", viewport.alignment,
1432 int min = colSel.getMin();
1433 viewport.getAlignment().trimLeft(min);
1434 colSel.compensateForEdit(0, min);
1435 edit.addShift(0,min);
1436 if (viewport.getSelectionGroup() != null)
1438 viewport.getSelectionGroup().adjustForRemoveLeft(min);
1441 Vector groups = viewport.alignment.getGroups();
1443 for (int i = 0; i < groups.size(); i++)
1445 SequenceGroup sg = (SequenceGroup) groups.get(i);
1447 if (!sg.adjustForRemoveLeft(min))
1449 viewport.alignment.deleteGroup(sg);
1453 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
1460 * @param e DOCUMENT ME!
1462 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
1464 ColumnSelection colSel = viewport.getColumnSelection();
1466 if (colSel.size() > 0)
1468 addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
1471 int max = colSel.getMax();
1472 viewport.getAlignment().trimRight(max);
1473 // TODO: delete hidden column entries in colSel to right of max
1474 // TODO: record hidden columns in history for undo.
1475 if (viewport.getSelectionGroup() != null)
1477 viewport.getSelectionGroup().adjustForRemoveRight(max);
1480 Vector groups = viewport.alignment.getGroups();
1482 for (int i = 0; i < groups.size(); i++)
1484 SequenceGroup sg = (SequenceGroup) groups.get(i);
1486 if (!sg.adjustForRemoveRight(max))
1488 viewport.alignment.deleteGroup(sg);
1492 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
1499 * @param e DOCUMENT ME!
1501 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
1504 addHistoryItem(edit=new HistoryItem("Remove Gapped Columns",
1505 viewport.alignment, HistoryItem.HIDE));
1507 //This is to maintain viewport position on first residue
1509 SequenceI seq = viewport.alignment.getSequenceAt(0);
1510 int startRes = seq.findPosition(viewport.startRes);
1512 viewport.getAlignment().removeGaps(shifts=new ShiftList());
1513 edit.alColumnChanges=shifts.getInverse();
1514 if (viewport.hasHiddenColumns)
1515 viewport.getColumnSelection().compensateForEdits(shifts);
1516 viewport.setStartRes(seq.findIndex(startRes)-1);
1517 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
1524 * @param e DOCUMENT ME!
1526 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
1528 // TODO: hidden regions should not be touched by removeAllGaps - a minimal number of gaps will remain in alignment segments containing uneven length subsequences
1529 // TODO: columnSelection.compensateforedits should be called (and passed to history item)
1530 addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
1533 //This is to maintain viewport position on first residue
1535 SequenceI seq = viewport.alignment.getSequenceAt(0);
1536 int startRes = seq.findPosition(viewport.startRes);
1544 int end = viewport.alignment.getWidth();
1546 if (viewport.getSelectionGroup() != null
1547 && viewport.getSelectionGroup().getSequences(true) != null
1548 && viewport.getSelectionGroup().getSize(true) > 0)
1550 seqs = viewport.getSelectionGroup().getSequences(true);
1551 start = viewport.getSelectionGroup().getStartRes();
1552 end = viewport.getSelectionGroup().getEndRes()+1;
1556 seqs = viewport.alignment.getSequences();
1558 /* Commented out regions below are partial implementation of todo above.
1559 * divide start,end into visible chunks, and for each:
1560 int diff=end-start+1;
1562 int dr[] = new int[seqs.size()];
1564 for (int i = 0; i < seqs.size(); i++)
1566 current = (SequenceI) seqs.elementAt(i);
1568 current.removeGaps(start, end);
1569 /*if (d<diff) // can only shift
1575 /* // after the end of each chunk -
1577 // record shift for history.
1578 editgaps.addShift(start, diff);
1579 if (viewport.hasHiddenColumns && diffmax>diff) {
1581 StringBuffer gaps=new StringBuffer(diffmax);
1582 for (int i=0,j=diffmax-diff; i<j; i++)
1583 gaps.append(viewport.getGapCharacter());
1584 for (int i=0, j=seqs.size(); i<j; i++) {
1585 current = (SequenceI) seqs.elementAt(i);
1587 String sq = current.getSequence();
1588 current.setSequence(sq.substring(0, hcend-dr[i])+gaps.substring(0, dr[i]-diff)+sq.substring());
1594 viewport.setStartRes(seq.findIndex(startRes)-1);
1596 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
1600 public void alignmentChanged()
1605 for(int i=0; i<alignPanels.size(); i++)
1607 ap = (AlignmentPanel) alignPanels.elementAt(i);
1611 av.getAlignment().padGaps();
1613 if (av.hconsensus != null && av.autoCalculateConsensus)
1615 av.updateConsensus(ap);
1616 av.updateConservation(ap);
1617 ap.annotationPanel.repaint();
1620 resetAllColourSchemes();
1622 av.alignment.adjustSequenceAnnotations();
1624 if (ap.overviewPanel != null)
1625 ap.overviewPanel.updateOverviewImage();
1631 void resetAllColourSchemes()
1633 ColourSchemeI cs = viewport.globalColourScheme;
1636 if (cs instanceof ClustalxColourScheme)
1638 ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).
1639 resetClustalX(viewport.alignment.getSequences(),
1640 viewport.alignment.getWidth());
1643 cs.setConsensus(viewport.hconsensus);
1644 if (cs.conservationApplied())
1646 Alignment al = (Alignment) viewport.alignment;
1647 Conservation c = new Conservation("All",
1648 ResidueProperties.propHash, 3,
1649 al.getSequences(), 0,
1652 c.verdict(false, viewport.ConsPercGaps);
1654 cs.setConservation(c);
1658 int s, sSize = viewport.alignment.getGroups().size();
1659 for(s=0; s<sSize; s++)
1661 SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);
1662 if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)
1664 ((ClustalxColourScheme)sg.cs).resetClustalX(
1665 sg.getSequences(true), sg.getWidth());
1667 sg.recalcConservation();
1674 * @param e DOCUMENT ME!
1676 public void padGapsMenuitem_actionPerformed(ActionEvent e)
1678 addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
1681 viewport.padGaps = padGapsMenuitem.isSelected();
1683 viewport.firePropertyChange("alignment",
1685 viewport.getAlignment().getSequences());
1691 * @param e DOCUMENT ME!
1693 public void findMenuItem_actionPerformed(ActionEvent e)
1695 JInternalFrame frame = new JInternalFrame();
1696 Finder finder = new Finder(viewport, alignPanel, frame);
1697 frame.setContentPane(finder);
1698 frame.setLayer(JLayeredPane.PALETTE_LAYER);
1699 Desktop.addInternalFrame(frame, "Find", 340, 110);
1705 * @param e DOCUMENT ME!
1707 public void font_actionPerformed(ActionEvent e)
1709 new FontChooser(alignPanel);
1712 public void smoothFont_actionPerformed(ActionEvent e)
1714 viewport.antiAlias = smoothFont.isSelected();
1715 alignPanel.annotationPanel.image = null;
1716 alignPanel.repaint();
1723 * @param e DOCUMENT ME!
1725 protected void seqLimit_actionPerformed(ActionEvent e)
1727 viewport.setShowJVSuffix(seqLimits.isSelected());
1729 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
1730 alignPanel.repaint();
1737 * @param e DOCUMENT ME!
1739 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
1741 viewport.setColourText(colourTextMenuItem.isSelected());
1742 alignPanel.repaint();
1748 * @param e DOCUMENT ME!
1750 public void wrapMenuItem_actionPerformed(ActionEvent e)
1752 scaleAbove.setVisible(wrapMenuItem.isSelected());
1753 scaleLeft.setVisible(wrapMenuItem.isSelected());
1754 scaleRight.setVisible(wrapMenuItem.isSelected());
1755 viewport.setWrapAlignment(wrapMenuItem.isSelected());
1756 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
1759 public void showAllSeqs_actionPerformed(ActionEvent e)
1761 viewport.showAllHiddenSeqs();
1764 public void showAllColumns_actionPerformed(ActionEvent e)
1766 viewport.showAllHiddenColumns();
1770 public void hideSelSequences_actionPerformed(ActionEvent e)
1772 viewport.hideAllSelectedSeqs();
1773 alignPanel.repaint();
1776 public void hideSelColumns_actionPerformed(ActionEvent e)
1778 viewport.hideSelectedColumns();
1779 alignPanel.repaint();
1782 public void hiddenMarkers_actionPerformed(ActionEvent e)
1784 viewport.setShowHiddenMarkers(hiddenMarkers.isSelected());
1791 * @param e DOCUMENT ME!
1793 protected void scaleAbove_actionPerformed(ActionEvent e)
1795 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
1796 alignPanel.repaint();
1802 * @param e DOCUMENT ME!
1804 protected void scaleLeft_actionPerformed(ActionEvent e)
1806 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
1807 alignPanel.repaint();
1813 * @param e DOCUMENT ME!
1815 protected void scaleRight_actionPerformed(ActionEvent e)
1817 viewport.setScaleRightWrapped(scaleRight.isSelected());
1818 alignPanel.repaint();
1824 * @param e DOCUMENT ME!
1826 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
1828 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
1829 alignPanel.repaint();
1835 * @param e DOCUMENT ME!
1837 public void viewTextMenuItem_actionPerformed(ActionEvent e)
1839 viewport.setShowText(viewTextMenuItem.isSelected());
1840 alignPanel.repaint();
1846 * @param e DOCUMENT ME!
1848 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
1850 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
1851 alignPanel.repaint();
1855 public FeatureSettings featureSettings;
1856 public void featureSettings_actionPerformed(ActionEvent e)
1858 if(featureSettings !=null )
1860 featureSettings.close();
1861 featureSettings = null;
1863 featureSettings = new FeatureSettings(this);
1869 * @param evt DOCUMENT ME!
1871 public void showSeqFeatures_actionPerformed(ActionEvent evt)
1873 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
1874 alignPanel.repaint();
1875 if (alignPanel.getOverviewPanel() != null)
1877 alignPanel.getOverviewPanel().updateOverviewImage();
1884 * @param e DOCUMENT ME!
1886 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
1888 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
1889 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
1895 * @param e DOCUMENT ME!
1897 public void overviewMenuItem_actionPerformed(ActionEvent e)
1899 if (alignPanel.overviewPanel != null)
1904 JInternalFrame frame = new JInternalFrame();
1905 OverviewPanel overview = new OverviewPanel(alignPanel);
1906 frame.setContentPane(overview);
1907 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
1908 frame.getWidth(), frame.getHeight());
1910 frame.setLayer(JLayeredPane.PALETTE_LAYER);
1911 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
1913 public void internalFrameClosed(
1914 javax.swing.event.InternalFrameEvent evt)
1916 alignPanel.setOverviewPanel(null);
1921 alignPanel.setOverviewPanel(overview);
1927 * @param e DOCUMENT ME!
1929 protected void noColourmenuItem_actionPerformed(ActionEvent e)
1937 * @param e DOCUMENT ME!
1939 public void clustalColour_actionPerformed(ActionEvent e)
1941 changeColour(new ClustalxColourScheme(
1942 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
1948 * @param e DOCUMENT ME!
1950 public void zappoColour_actionPerformed(ActionEvent e)
1952 changeColour(new ZappoColourScheme());
1958 * @param e DOCUMENT ME!
1960 public void taylorColour_actionPerformed(ActionEvent e)
1962 changeColour(new TaylorColourScheme());
1968 * @param e DOCUMENT ME!
1970 public void hydrophobicityColour_actionPerformed(ActionEvent e)
1972 changeColour(new HydrophobicColourScheme());
1978 * @param e DOCUMENT ME!
1980 public void helixColour_actionPerformed(ActionEvent e)
1982 changeColour(new HelixColourScheme());
1988 * @param e DOCUMENT ME!
1990 public void strandColour_actionPerformed(ActionEvent e)
1992 changeColour(new StrandColourScheme());
1998 * @param e DOCUMENT ME!
2000 public void turnColour_actionPerformed(ActionEvent e)
2002 changeColour(new TurnColourScheme());
2008 * @param e DOCUMENT ME!
2010 public void buriedColour_actionPerformed(ActionEvent e)
2012 changeColour(new BuriedColourScheme());
2018 * @param e DOCUMENT ME!
2020 public void nucleotideColour_actionPerformed(ActionEvent e)
2022 changeColour(new NucleotideColourScheme());
2025 public void annotationColour_actionPerformed(ActionEvent e)
2027 new AnnotationColourChooser(viewport, alignPanel);
2034 * @param e DOCUMENT ME!
2036 protected void applyToAllGroups_actionPerformed(ActionEvent e)
2038 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
2044 * @param cs DOCUMENT ME!
2046 public void changeColour(ColourSchemeI cs)
2052 if (viewport.getAbovePIDThreshold())
2054 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
2057 cs.setThreshold(threshold,
2058 viewport.getIgnoreGapsConsensus());
2060 viewport.setGlobalColourScheme(cs);
2064 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2067 if (viewport.getConservationSelected())
2070 Alignment al = (Alignment) viewport.alignment;
2071 Conservation c = new Conservation("All",
2072 ResidueProperties.propHash, 3,
2073 al.getSequences(), 0,
2077 c.verdict(false, viewport.ConsPercGaps);
2079 cs.setConservation(c);
2081 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
2086 cs.setConservation(null);
2089 cs.setConsensus(viewport.hconsensus);
2092 viewport.setGlobalColourScheme(cs);
2094 if (viewport.getColourAppliesToAllGroups())
2096 Vector groups = viewport.alignment.getGroups();
2098 for (int i = 0; i < groups.size(); i++)
2100 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
2108 if (cs instanceof ClustalxColourScheme)
2110 sg.cs = new ClustalxColourScheme(
2111 sg.getSequences(true), sg.getWidth());
2113 else if (cs instanceof UserColourScheme)
2115 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
2121 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
2123 catch (Exception ex)
2128 if (viewport.getAbovePIDThreshold()
2129 || cs instanceof PIDColourScheme
2130 || cs instanceof Blosum62ColourScheme)
2132 sg.cs.setThreshold(threshold,
2133 viewport.getIgnoreGapsConsensus());
2135 sg.cs.setConsensus(AAFrequency.calculate(
2136 sg.getSequences(true), 0,
2140 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
2143 if (viewport.getConservationSelected())
2145 Conservation c = new Conservation("Group",
2146 ResidueProperties.propHash, 3,
2147 sg.getSequences(true), 0,
2148 viewport.alignment.getWidth() - 1);
2150 c.verdict(false, viewport.ConsPercGaps);
2151 sg.cs.setConservation(c);
2154 sg.cs.setConservation(null);
2158 if (alignPanel.getOverviewPanel() != null)
2160 alignPanel.getOverviewPanel().updateOverviewImage();
2163 alignPanel.repaint();
2169 * @param e DOCUMENT ME!
2171 protected void modifyPID_actionPerformed(ActionEvent e)
2173 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
2175 SliderPanel.setPIDSliderSource(alignPanel,
2176 viewport.getGlobalColourScheme(),
2178 SliderPanel.showPIDSlider();
2185 * @param e DOCUMENT ME!
2187 protected void modifyConservation_actionPerformed(ActionEvent e)
2189 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
2191 SliderPanel.setConservationSlider(alignPanel,
2192 viewport.globalColourScheme,
2194 SliderPanel.showConservationSlider();
2201 * @param e DOCUMENT ME!
2203 protected void conservationMenuItem_actionPerformed(ActionEvent e)
2205 viewport.setConservationSelected(conservationMenuItem.isSelected());
2207 viewport.setAbovePIDThreshold(false);
2208 abovePIDThreshold.setSelected(false);
2210 changeColour(viewport.getGlobalColourScheme());
2212 modifyConservation_actionPerformed(null);
2218 * @param e DOCUMENT ME!
2220 public void abovePIDThreshold_actionPerformed(ActionEvent e)
2222 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
2224 conservationMenuItem.setSelected(false);
2225 viewport.setConservationSelected(false);
2227 changeColour(viewport.getGlobalColourScheme());
2229 modifyPID_actionPerformed(null);
2235 * @param e DOCUMENT ME!
2237 public void userDefinedColour_actionPerformed(ActionEvent e)
2239 if (e.getActionCommand().equals("User Defined..."))
2241 new UserDefinedColours(alignPanel, null);
2245 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
2246 getUserColourSchemes().get(e.getActionCommand());
2252 public void updateUserColourMenu()
2255 Component[] menuItems = colourMenu.getMenuComponents();
2256 int i, iSize = menuItems.length;
2257 for (i = 0; i < iSize; i++)
2259 if (menuItems[i].getName() != null &&
2260 menuItems[i].getName().equals("USER_DEFINED"))
2262 colourMenu.remove(menuItems[i]);
2266 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
2268 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
2269 getUserColourSchemes().keys();
2271 while (userColours.hasMoreElements())
2273 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
2274 nextElement().toString());
2275 radioItem.setName("USER_DEFINED");
2276 radioItem.addMouseListener(new MouseAdapter()
2278 public void mousePressed(MouseEvent evt)
2280 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
2282 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
2284 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
2285 "Remove from default list?",
2286 "Remove user defined colour",
2287 JOptionPane.YES_NO_OPTION);
2288 if(option == JOptionPane.YES_OPTION)
2290 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
2291 colourMenu.remove(radioItem);
2294 radioItem.addActionListener(new ActionListener()
2296 public void actionPerformed(ActionEvent evt)
2298 userDefinedColour_actionPerformed(evt);
2304 radioItem.addActionListener(new ActionListener()
2306 public void actionPerformed(ActionEvent evt)
2308 userDefinedColour_actionPerformed(evt);
2312 colourMenu.insert(radioItem, 15);
2313 colours.add(radioItem);
2321 * @param e DOCUMENT ME!
2323 public void PIDColour_actionPerformed(ActionEvent e)
2325 changeColour(new PIDColourScheme());
2331 * @param e DOCUMENT ME!
2333 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
2335 changeColour(new Blosum62ColourScheme());
2341 * @param e DOCUMENT ME!
2343 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
2345 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
2347 AlignmentSorter.sortByPID(viewport.getAlignment(),
2348 viewport.getAlignment().getSequenceAt(0));
2349 alignPanel.repaint();
2355 * @param e DOCUMENT ME!
2357 public void sortIDMenuItem_actionPerformed(ActionEvent e)
2359 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
2361 AlignmentSorter.sortByID(viewport.getAlignment());
2362 alignPanel.repaint();
2368 * @param e DOCUMENT ME!
2370 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
2372 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
2375 AlignmentSorter.sortByGroup(viewport.getAlignment());
2376 alignPanel.repaint();
2382 * @param e DOCUMENT ME!
2384 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
2386 new RedundancyPanel(alignPanel, this);
2393 * @param e DOCUMENT ME!
2395 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
2397 if ( (viewport.getSelectionGroup() == null) ||
2398 (viewport.getSelectionGroup().getSize(false) < 2))
2400 JOptionPane.showInternalMessageDialog(this,
2401 "You must select at least 2 sequences.",
2402 "Invalid Selection",
2403 JOptionPane.WARNING_MESSAGE);
2407 JInternalFrame frame = new JInternalFrame();
2408 frame.setContentPane(new PairwiseAlignPanel(viewport));
2409 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
2416 * @param e DOCUMENT ME!
2418 public void PCAMenuItem_actionPerformed(ActionEvent e)
2420 if ( ( (viewport.getSelectionGroup() != null) &&
2421 (viewport.getSelectionGroup().getSize(false) < 4) &&
2422 (viewport.getSelectionGroup().getSize(false) > 0)) ||
2423 (viewport.getAlignment().getHeight() < 4))
2425 JOptionPane.showInternalMessageDialog(this,
2426 "Principal component analysis must take\n" +
2427 "at least 4 input sequences.",
2428 "Sequence selection insufficient",
2429 JOptionPane.WARNING_MESSAGE);
2434 new PCAPanel(viewport);
2438 public void autoCalculate_actionPerformed(ActionEvent e)
2440 viewport.autoCalculateConsensus = autoCalculate.isSelected();
2441 if(viewport.autoCalculateConsensus)
2443 viewport.firePropertyChange("alignment",
2445 viewport.getAlignment().getSequences());
2453 * @param e DOCUMENT ME!
2455 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
2457 NewTreePanel("AV", "PID", "Average distance tree using PID");
2463 * @param e DOCUMENT ME!
2465 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
2467 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
2473 * @param e DOCUMENT ME!
2475 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
2477 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
2483 * @param e DOCUMENT ME!
2485 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
2487 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
2493 * @param type DOCUMENT ME!
2494 * @param pwType DOCUMENT ME!
2495 * @param title DOCUMENT ME!
2497 void NewTreePanel(String type, String pwType, String title)
2501 if (viewport.getSelectionGroup() != null) {
2502 if (viewport.getSelectionGroup().getSize(false) < 3) {
2503 JOptionPane.showMessageDialog(Desktop.desktop,
2504 "You need to have more than two sequences selected to build a tree!",
2505 "Not enough sequences",
2506 JOptionPane.WARNING_MESSAGE);
2511 SequenceGroup sg = viewport.getSelectionGroup();
2513 /* Decide if the selection is a column region */
2514 while (s < sg.getSize(false))
2516 if ( ( (SequenceI) sg.getSequences(false).elementAt(s++)).getLength() <
2519 JOptionPane.showMessageDialog(Desktop.desktop,
2520 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
2521 "Try using the Pad function in the edit menu,\n" +
2522 "or one of the multiple sequence alignment web services.",
2523 "Sequences in selection are not aligned",
2524 JOptionPane.WARNING_MESSAGE);
2530 title = title + " on region";
2531 tp = new TreePanel(alignPanel, type, pwType);
2535 //are the sequences aligned?
2536 if (!viewport.alignment.isAligned())
2538 JOptionPane.showMessageDialog(Desktop.desktop,
2539 "The sequences must be aligned before creating a tree.\n" +
2540 "Try using the Pad function in the edit menu,\n" +
2541 "or one of the multiple sequence alignment web services.",
2542 "Sequences not aligned",
2543 JOptionPane.WARNING_MESSAGE);
2548 if(viewport.alignment.getHeight()<2)
2551 tp = new TreePanel(alignPanel, type, pwType);
2554 addTreeMenuItem(tp, title);
2556 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
2562 * @param title DOCUMENT ME!
2563 * @param order DOCUMENT ME!
2565 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
2567 final JMenuItem item = new JMenuItem("by " + title);
2569 item.addActionListener(new java.awt.event.ActionListener()
2571 public void actionPerformed(ActionEvent e)
2573 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
2576 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
2577 AlignmentSorter.sortBy(viewport.getAlignment(), order);
2578 alignPanel.repaint();
2584 * Maintain the Order by->Displayed Tree menu.
2585 * Creates a new menu item for a TreePanel with an appropriate
2586 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
2587 * to remove the menu item when the treePanel is closed, and adjust
2588 * the tree leaf to sequence mapping when the alignment is modified.
2589 * @param treePanel Displayed tree window.
2590 * @param title SortBy menu item title.
2592 void addTreeMenuItem(final TreePanel treePanel, String title)
2594 final JMenuItem item = new JMenuItem(title);
2600 sort.add(sortByTreeMenu);
2603 sortByTreeMenu.add(item);
2604 item.addActionListener(new java.awt.event.ActionListener()
2606 public void actionPerformed(ActionEvent e)
2608 addHistoryItem(new HistoryItem("Tree Sort",
2609 viewport.alignment, HistoryItem.SORT));
2610 AlignmentSorter.sortByTree(viewport.getAlignment(),
2611 treePanel.getTree());
2612 alignPanel.repaint();
2616 treePanel.addInternalFrameListener(new javax.swing.event.
2617 InternalFrameAdapter()
2619 public void internalFrameClosed(
2620 javax.swing.event.InternalFrameEvent evt)
2623 sortByTreeMenu.remove(item);
2627 sort.remove(sortByTreeMenu);
2635 * Work out whether the whole set of sequences
2636 * or just the selected set will be submitted for multiple alignment.
2639 private jalview.datamodel.AlignmentView gatherSequencesForAlignment()
2641 // Now, check we have enough sequences
2642 AlignmentView msa = null;
2644 if ( (viewport.getSelectionGroup() != null) &&
2645 (viewport.getSelectionGroup().getSize(false) > 1))
2647 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
2648 /*SequenceGroup seqs = viewport.getSelectionGroup();
2650 msa = new SequenceI[sz = seqs.getSize(false)];
2652 for (int i = 0; i < sz; i++)
2654 msa[i] = (SequenceI) seqs.getSequenceAt(i);
2656 msa = viewport.getAlignmentView(true);
2660 /*Vector seqs = viewport.getAlignment().getSequences();
2662 if (seqs.size() > 1)
2664 msa = new SequenceI[seqs.size()];
2666 for (int i = 0; i < seqs.size(); i++)
2668 msa[i] = (SequenceI) seqs.elementAt(i);
2671 msa = viewport.getAlignmentView(false);
2677 * Decides what is submitted to a secondary structure prediction service,
2678 * the currently selected sequence, or the currently selected alignment
2679 * (where the first sequence in the set is the one that the prediction
2682 AlignmentView gatherSeqOrMsaForSecStrPrediction()
2684 AlignmentView seqs = null;
2686 if ( (viewport.getSelectionGroup() != null) &&
2687 (viewport.getSelectionGroup().getSize(false) > 0))
2689 seqs = viewport.getAlignmentView(true);
2693 seqs = viewport.getAlignmentView(false);
2695 // limit sequences - JBPNote in future - could spawn multiple prediction jobs
2696 // TODO: viewport.alignment.isAligned is a global state - the local selection may well be aligned - we preserve 2.0.8 behaviour for moment.
2697 if (!viewport.alignment.isAligned())
2699 seqs.setSequences(new SeqCigar[] { seqs.getSequences()[0] } );
2706 * @param e DOCUMENT ME!
2708 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
2710 // Pick the tree file
2711 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
2714 chooser.setFileView(new JalviewFileView());
2715 chooser.setDialogTitle("Select a newick-like tree file");
2716 chooser.setToolTipText("Load a tree file");
2718 int value = chooser.showOpenDialog(null);
2720 if (value == JalviewFileChooser.APPROVE_OPTION)
2722 String choice = chooser.getSelectedFile().getPath();
2723 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
2727 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
2729 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
2731 catch (Exception ex)
2733 JOptionPane.showMessageDialog(Desktop.desktop,
2734 "Problem reading tree file",
2736 JOptionPane.WARNING_MESSAGE);
2737 ex.printStackTrace();
2743 public TreePanel ShowNewickTree(NewickFile nf, String title)
2745 return ShowNewickTree(nf,title,600,500,4,5);
2747 public TreePanel ShowNewickTree(NewickFile nf, String title, AlignmentView input)
2749 return ShowNewickTree(nf,title, input, 600,500,4,5);
2751 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y) {
2752 return ShowNewickTree(nf, title, null, w, h, x, y);
2755 * Add a treeviewer for the tree extracted from a newick file object to the current alignment view
2757 * @param nf the tree
2758 * @param title tree viewer title
2759 * @param input Associated alignment input data (or null)
2764 * @return TreePanel handle
2766 public TreePanel ShowNewickTree(NewickFile nf, String title, AlignmentView input, int w,int h,int x, int y) {
2767 TreePanel tp = null;
2773 if (nf.getTree() != null)
2775 tp = new TreePanel(alignPanel,
2783 tp.setLocation(x,y);
2786 Desktop.addInternalFrame(tp, title, w, h);
2787 addTreeMenuItem(tp, title);
2790 catch (Exception ex)
2792 ex.printStackTrace();
2803 PrinterJob printJob = PrinterJob.getPrinterJob();
2804 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
2805 printJob.setPrintable(alignPanel, pf);
2807 if (printJob.printDialog())
2813 catch (Exception PrintException)
2815 PrintException.printStackTrace();
2822 * Generates menu items and listener event actions for web service clients
2825 public void BuildWebServiceMenu()
2827 if ( (Discoverer.services != null)
2828 && (Discoverer.services.size() > 0))
2830 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
2831 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
2832 Vector wsmenu = new Vector();
2833 final AlignFrame af = this;
2836 // Add any Multiple Sequence Alignment Services
2837 final JMenu msawsmenu = new JMenu("Alignment");
2838 for (int i = 0, j = msaws.size(); i < j; i++)
2840 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
2842 final JMenuItem method = new JMenuItem(sh.getName());
2843 method.addActionListener(new ActionListener()
2845 public void actionPerformed(ActionEvent e)
2847 AlignmentView msa = gatherSequencesForAlignment();
2848 new jalview.ws.MsaWSClient(sh, title, msa,
2849 false, true, viewport.getAlignment().getDataset(), af);
2854 msawsmenu.add(method);
2855 // Deal with services that we know accept partial alignments.
2856 if (sh.getName().indexOf("lustal") > -1)
2858 // We know that ClustalWS can accept partial alignments for refinement.
2859 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
2860 methodR.addActionListener(new ActionListener()
2862 public void actionPerformed(ActionEvent e)
2864 AlignmentView msa = gatherSequencesForAlignment();
2865 new jalview.ws.MsaWSClient(sh, title, msa,
2866 true, true, viewport.getAlignment().getDataset(), af);
2871 msawsmenu.add(methodR);
2875 wsmenu.add(msawsmenu);
2877 if (secstrpr != null)
2879 // Add any secondary structure prediction services
2880 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
2881 for (int i = 0, j = secstrpr.size(); i < j; i++)
2883 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
2885 final JMenuItem method = new JMenuItem(sh.getName());
2886 method.addActionListener(new ActionListener()
2888 public void actionPerformed(ActionEvent e)
2890 AlignmentView msa = gatherSeqOrMsaForSecStrPrediction();
2891 if (msa.getSequences().length == 1)
2893 // Single Sequence prediction
2894 new jalview.ws.JPredClient(sh, title, false, msa, af, true);
2898 if (msa.getSequences().length > 1)
2900 // Sequence profile based prediction
2901 new jalview.ws.JPredClient(sh,
2902 title, true, msa, af, true);
2907 secstrmenu.add(method);
2909 wsmenu.add(secstrmenu);
2911 this.webService.removeAll();
2912 for (int i = 0, j = wsmenu.size(); i < j; i++)
2914 webService.add( (JMenu) wsmenu.get(i));
2919 this.webService.removeAll();
2920 this.webService.add(this.webServiceNoServices);
2922 // TODO: add in rediscovery function
2923 // TODO: reduce code redundancy.
2924 // TODO: group services by location as well as function.
2927 /* public void vamsasStore_actionPerformed(ActionEvent e)
2929 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
2930 getProperty("LAST_DIRECTORY"));
2932 chooser.setFileView(new JalviewFileView());
2933 chooser.setDialogTitle("Export to Vamsas file");
2934 chooser.setToolTipText("Export");
2936 int value = chooser.showSaveDialog(this);
2938 if (value == JalviewFileChooser.APPROVE_OPTION)
2940 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
2941 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
2942 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
2949 public void showTranslation_actionPerformed(ActionEvent e)
2951 SequenceI [] selection = viewport.getSelectionAsNewSequence();
2952 String [] seqstring = viewport.getViewAsString(true);
2954 int s, sSize = selection.length;
2955 SequenceI [] newSeq = new SequenceI[sSize];
2958 StringBuffer protein;
2960 for(s=0; s<sSize; s++)
2962 protein = new StringBuffer();
2963 seq = AlignSeq.extractGaps("-. ", seqstring[s]);
2964 resSize = seq.length();
2965 resSize -= resSize%3;
2967 for(res = 0; res < resSize; res+=3)
2969 String codon = seq.substring(res, res+3);
2970 codon = codon.replace('U', 'T');
2971 String aa = ResidueProperties.codonTranslate(codon);
2973 protein.append(viewport.getGapCharacter());
2974 else if(aa.equals("STOP"))
2975 protein.append("X");
2977 protein.append( aa );
2979 newSeq[s] = new Sequence(selection[s].getName(),
2980 protein.toString());
2984 AlignmentI al = new Alignment(newSeq);
2985 al.setDataset(null);
2988 ////////////////////////////////
2989 // Copy annotations across
2990 jalview.datamodel.AlignmentAnnotation[] annotations
2991 = viewport.alignment.getAlignmentAnnotation();
2993 if(annotations!=null)
2995 for (int i = 0; i < annotations.length; i++)
2997 if (annotations[i].label.equals("Quality") ||
2998 annotations[i].label.equals("Conservation") ||
2999 annotations[i].label.equals("Consensus"))
3004 aSize = viewport.alignment.getWidth() / 3;
3005 jalview.datamodel.Annotation[] anots =
3006 new jalview.datamodel.Annotation[aSize];
3008 for (a = 0; a < viewport.alignment.getWidth(); a++)
3010 if (annotations[i].annotations[a] == null
3011 || annotations[i].annotations[a] == null)
3014 anots[a / 3] = new Annotation(
3015 annotations[i].annotations[a].displayCharacter,
3016 annotations[i].annotations[a].description,
3017 annotations[i].annotations[a].secondaryStructure,
3018 annotations[i].annotations[a].value,
3019 annotations[i].annotations[a].colour);
3022 jalview.datamodel.AlignmentAnnotation aa
3023 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
3024 annotations[i].description, anots);
3025 al.addAnnotation(aa);
3029 AlignFrame af = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT);
3030 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
3042 * @param String DOCUMENT ME!
3044 public boolean parseFeaturesFile(String file, String type)
3046 boolean featuresFile = false;
3048 featuresFile = new FeaturesFile(file, type).parse(viewport.alignment.getDataset(),
3049 alignPanel.seqPanel.seqCanvas.
3050 getFeatureRenderer().featureColours,
3055 ex.printStackTrace();
3060 viewport.showSequenceFeatures = true;
3061 showSeqFeatures.setSelected(true);
3062 alignPanel.repaint();
3065 return featuresFile;
3068 public void dragEnter(DropTargetDragEvent evt)
3071 public void dragExit(DropTargetEvent evt)
3074 public void dragOver(DropTargetDragEvent evt)
3077 public void dropActionChanged(DropTargetDragEvent evt)
3080 public void drop(DropTargetDropEvent evt)
3082 Transferable t = evt.getTransferable();
3083 java.util.List files = null;
3087 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
3088 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
3090 //Works on Windows and MacOSX
3091 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
3092 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
3094 else if (t.isDataFlavorSupported(uriListFlavor))
3096 // This is used by Unix drag system
3097 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
3098 String data = (String) t.getTransferData(uriListFlavor);
3099 files = new java.util.ArrayList(1);
3100 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
3103 st.hasMoreTokens(); )
3105 String s = st.nextToken();
3106 if (s.startsWith("#"))
3108 // the line is a comment (as per the RFC 2483)
3112 java.net.URI uri = new java.net.URI(s);
3113 java.io.File file = new java.io.File(uri);
3120 e.printStackTrace();
3127 for (int i = 0; i < files.size(); i++)
3129 loadJalviewDataFile(files.get(i).toString());
3132 catch (Exception ex)
3134 ex.printStackTrace();
3139 // This method will attempt to load a "dropped" file first by testing
3140 // whether its and Annotation file, then features file. If both are
3141 // false then the user may have dropped an alignment file onto this
3143 public void loadJalviewDataFile(String file)
3146 String protocol = "File";
3148 if (file.indexOf("http:") > -1 || file.indexOf("file:") > -1)
3153 boolean isAnnotation = new AnnotationFile().readAnnotationFile(viewport.
3158 boolean isGroupsFile = parseFeaturesFile(file,protocol);
3161 String format = new IdentifyFile().Identify(file, protocol);
3163 if(format.equalsIgnoreCase("JnetFile"))
3165 jalview.io.JPredFile predictions = new jalview.io.JPredFile(
3167 new JnetAnnotationMaker().add_annotation(predictions,
3168 viewport.getAlignment(),
3170 alignPanel.adjustAnnotationHeight();
3171 alignPanel.repaint();
3174 new FileLoader().LoadFile(viewport, file, protocol, format);
3180 alignPanel.adjustAnnotationHeight();
3183 }catch(Exception ex)
3185 ex.printStackTrace();
3189 public void tabSelectionChanged(int index)
3193 alignPanel = (AlignmentPanel) alignPanels.elementAt(index);
3194 viewport = alignPanel.av;
3198 public void tabbedPane_mousePressed(MouseEvent e)
3200 if(SwingUtilities.isRightMouseButton(e))
3202 String reply = JOptionPane.showInternalInputDialog(this,
3205 JOptionPane.QUESTION_MESSAGE);
3209 viewport.viewName = reply;
3210 tabbedPane.setTitleAt( tabbedPane.getSelectedIndex() ,reply);
3216 public AlignViewport getCurrentView()