2 * Jalview - A Sequence Alignment Editor and Viewer
\r
3 * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
\r
5 * This program is free software; you can redistribute it and/or
\r
6 * modify it under the terms of the GNU General Public License
\r
7 * as published by the Free Software Foundation; either version 2
\r
8 * of the License, or (at your option) any later version.
\r
10 * This program is distributed in the hope that it will be useful,
\r
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
13 * GNU General Public License for more details.
\r
15 * You should have received a copy of the GNU General Public License
\r
16 * along with this program; if not, write to the Free Softwarechang
\r
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
\r
19 package jalview.gui;
\r
21 import java.beans.*;
\r
26 import java.awt.datatransfer.*;
\r
27 import java.awt.event.*;
\r
28 import java.awt.print.*;
\r
29 import javax.swing.*;
\r
31 import jalview.analysis.*;
\r
32 import jalview.datamodel.*;
\r
33 import jalview.io.*;
\r
34 import jalview.jbgui.*;
\r
35 import jalview.schemes.*;
\r
36 import jalview.ws.*;
\r
37 import java.awt.dnd.*;
\r
44 * @version $Revision$
\r
46 public class AlignFrame
\r
47 extends GAlignFrame implements DropTargetListener
\r
49 /** DOCUMENT ME!! */
\r
50 public static final int NEW_WINDOW_WIDTH = 700;
\r
52 /** DOCUMENT ME!! */
\r
53 public static final int NEW_WINDOW_HEIGHT = 500;
\r
54 AlignmentPanel alignPanel;
\r
55 AlignViewport viewport;
\r
57 /** DOCUMENT ME!! */
\r
58 public String currentFileFormat = null;
\r
59 Stack historyList = new Stack();
\r
60 Stack redoList = new Stack();
\r
61 private int treeCount = 0;
\r
65 * Creates a new AlignFrame object.
\r
67 * @param al DOCUMENT ME!
\r
69 public AlignFrame(AlignmentI al)
\r
71 viewport = new AlignViewport(al);
\r
73 this.setDropTarget(new java.awt.dnd.DropTarget(this, this));
\r
75 if(viewport.vconsensus==null)
\r
77 //Out of memory calculating consensus.
\r
78 BLOSUM62Colour.setEnabled(false);
\r
79 PIDColour.setEnabled(false);
\r
80 conservationMenuItem.setEnabled(false);
\r
81 modifyConservation.setEnabled(false);
\r
82 abovePIDThreshold.setEnabled(false);
\r
83 modifyPID.setEnabled(false);
\r
86 alignPanel = new AlignmentPanel(this, viewport);
\r
88 String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT", "No sort");
\r
90 if(sortby.equals("Id"))
\r
91 sortIDMenuItem_actionPerformed(null);
\r
92 else if(sortby.equals("Pairwise Identity"))
\r
93 sortPairwiseMenuItem_actionPerformed(null);
\r
95 // remove(tabbedPane);
\r
96 getContentPane().add(alignPanel, BorderLayout.CENTER);
\r
100 // tabbedPane.add(al.isNucleotide() ? "DNA":"Protein", alignPanel);
\r
103 /////////////////////////
\r
104 if(al.getDataset()==null)
\r
106 al.setDataset(null);
\r
108 // AlignViewport ds = new AlignViewport(al.getDataset(), true);
\r
109 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
110 // tabbedPane.add("Dataset", dap);
\r
111 // viewports.add(ds);
\r
112 // alignPanels.add(dap);
\r
113 /////////////////////////
\r
116 viewport.addPropertyChangeListener(new PropertyChangeListener()
\r
118 public void propertyChange(PropertyChangeEvent evt)
\r
120 if (evt.getPropertyName().equals("alignment"))
\r
122 alignmentChanged();
\r
128 if (Desktop.desktop != null)
\r
130 addServiceListeners();
\r
131 setGUINucleotide(al.isNucleotide());
\r
135 /* Set up intrinsic listeners for dynamically generated GUI bits. */
\r
136 private void addServiceListeners()
\r
138 final java.beans.PropertyChangeListener thisListener;
\r
139 // Do this once to get current state
\r
140 BuildWebServiceMenu();
\r
141 Desktop.discoverer.addPropertyChangeListener(
\r
142 thisListener = new java.beans.PropertyChangeListener()
\r
144 public void propertyChange(PropertyChangeEvent evt)
\r
146 // System.out.println("Discoverer property change.");
\r
147 if (evt.getPropertyName().equals("services"))
\r
149 // System.out.println("Rebuilding web service menu");
\r
150 BuildWebServiceMenu();
\r
154 addInternalFrameListener(new javax.swing.event.
\r
155 InternalFrameAdapter()
\r
157 public void internalFrameClosed(
\r
158 javax.swing.event.InternalFrameEvent evt)
\r
160 // System.out.println("deregistering discoverer listener");
\r
161 Desktop.discoverer.removePropertyChangeListener(thisListener);
\r
162 closeMenuItem_actionPerformed(null);
\r
169 public void setGUINucleotide(boolean nucleotide)
\r
171 showTranslation.setVisible( nucleotide );
\r
172 //sequenceFeatures.setVisible(!nucleotide );
\r
173 //featureSettings.setVisible( !nucleotide );
\r
174 conservationMenuItem.setVisible( !nucleotide );
\r
175 modifyConservation.setVisible( !nucleotide );
\r
177 //Remember AlignFrame always starts as protein
\r
180 calculateMenu.remove(calculateMenu.getItemCount()-2);
\r
186 Added so Castor Mapping file can obtain Jalview Version
\r
188 public String getVersion()
\r
190 return jalview.bin.Cache.getProperty("VERSION");
\r
193 public FeatureRenderer getFeatureRenderer()
\r
195 return alignPanel.seqPanel.seqCanvas.getFeatureRenderer();
\r
199 public void fetchSequence_actionPerformed(ActionEvent e)
\r
201 new SequenceFetcher(this);
\r
206 * @param e DOCUMENT ME!
\r
208 public void saveAlignmentMenu_actionPerformed(ActionEvent e)
\r
210 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
215 "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc",
\r
220 "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview"
\r
221 }, currentFileFormat);
\r
223 chooser.setAcceptAllFileFilterUsed(false);
\r
224 chooser.setFileView(new JalviewFileView());
\r
225 chooser.setDialogTitle("Save Alignment to file");
\r
226 chooser.setToolTipText("Save");
\r
228 int value = chooser.showSaveDialog(this);
\r
230 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
232 currentFileFormat = chooser.getSelectedFormat();
\r
234 if (currentFileFormat == null)
\r
236 JOptionPane.showInternalMessageDialog(Desktop.desktop,
\r
237 "You must select a file format before saving!",
\r
238 "File format not specified",
\r
239 JOptionPane.WARNING_MESSAGE);
\r
240 value = chooser.showSaveDialog(this);
\r
244 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
\r
245 currentFileFormat);
\r
247 String choice = chooser.getSelectedFile().getPath();
\r
248 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
250 saveAlignment(choice, currentFileFormat);
\r
254 public boolean saveAlignment(String file, String format)
\r
256 if (format.equalsIgnoreCase("Jalview"))
\r
258 String shortName = title;
\r
260 if (shortName.indexOf(java.io.File.separatorChar) > -1)
\r
262 shortName = shortName.substring(shortName.lastIndexOf(
\r
263 java.io.File.separatorChar) + 1);
\r
266 new Jalview2XML().SaveAlignment(this, file, shortName);
\r
268 // USE Jalview2XML to save this file
\r
273 String output = new FormatAdapter().formatSequences(format,
\r
274 viewport.getAlignment().
\r
276 if (output == null)
\r
283 java.io.PrintWriter out = new java.io.PrintWriter(
\r
284 new java.io.FileWriter(file));
\r
290 catch (Exception ex)
\r
292 ex.printStackTrace();
\r
301 * @param e DOCUMENT ME!
\r
303 protected void outputText_actionPerformed(ActionEvent e)
\r
305 CutAndPasteTransfer cap = new CutAndPasteTransfer();
\r
306 Desktop.addInternalFrame(cap,
\r
307 "Alignment output - " + e.getActionCommand(), 600,
\r
309 cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
\r
310 viewport.getAlignment().
\r
317 * @param e DOCUMENT ME!
\r
319 protected void htmlMenuItem_actionPerformed(ActionEvent e)
\r
321 new HTMLOutput(viewport,
\r
322 alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
\r
323 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
326 public void createImageMap(File file, String image)
\r
328 alignPanel.makePNGImageMap(file, image);
\r
334 * @param e DOCUMENT ME!
\r
336 public void createPNG(File f)
\r
338 alignPanel.makePNG(f);
\r
344 * @param e DOCUMENT ME!
\r
346 public void createEPS(File f)
\r
348 alignPanel.makeEPS(f);
\r
354 * @param e DOCUMENT ME!
\r
356 public void printMenuItem_actionPerformed(ActionEvent e)
\r
358 //Putting in a thread avoids Swing painting problems
\r
359 PrintThread thread = new PrintThread();
\r
363 public void associatedData_actionPerformed(ActionEvent e)
\r
365 // Pick the tree file
\r
366 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
368 "LAST_DIRECTORY"));
\r
369 chooser.setFileView(new JalviewFileView());
\r
370 chooser.setDialogTitle("Load Jalview Annotations or Features File");
\r
371 chooser.setToolTipText("Load Jalview Annotations / Features file");
\r
373 int value = chooser.showOpenDialog(null);
\r
375 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
377 String choice = chooser.getSelectedFile().getPath();
\r
378 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
379 loadJalviewDataFile(choice);
\r
387 * @param e DOCUMENT ME!
\r
389 public void closeMenuItem_actionPerformed(ActionEvent e)
\r
393 PaintRefresher.components.remove(viewport.alignment);
\r
394 this.setClosed(true);
\r
396 catch (Exception ex)
\r
404 void updateEditMenuBar()
\r
406 if (historyList.size() > 0)
\r
408 undoMenuItem.setEnabled(true);
\r
410 HistoryItem hi = (HistoryItem) historyList.peek();
\r
411 undoMenuItem.setText("Undo " + hi.getDescription());
\r
415 undoMenuItem.setEnabled(false);
\r
416 undoMenuItem.setText("Undo");
\r
419 if (redoList.size() > 0)
\r
421 redoMenuItem.setEnabled(true);
\r
423 HistoryItem hi = (HistoryItem) redoList.peek();
\r
424 redoMenuItem.setText("Redo " + hi.getDescription());
\r
428 redoMenuItem.setEnabled(false);
\r
429 redoMenuItem.setText("Redo");
\r
436 * @param hi DOCUMENT ME!
\r
438 public void addHistoryItem(HistoryItem hi)
\r
440 historyList.push(hi);
\r
441 updateEditMenuBar();
\r
447 * @param e DOCUMENT ME!
\r
449 protected void undoMenuItem_actionPerformed(ActionEvent e)
\r
451 HistoryItem hi = (HistoryItem) historyList.pop();
\r
452 redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,
\r
453 HistoryItem.HIDE));
\r
454 restoreHistoryItem(hi);
\r
455 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
461 * @param e DOCUMENT ME!
\r
463 protected void redoMenuItem_actionPerformed(ActionEvent e)
\r
465 HistoryItem hi = (HistoryItem) redoList.pop();
\r
466 restoreHistoryItem(hi);
\r
467 updateEditMenuBar();
\r
468 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
471 // used by undo and redo
\r
472 void restoreHistoryItem(HistoryItem hi)
\r
477 updateEditMenuBar();
\r
479 viewport.firePropertyChange("alignment", null,
\r
480 viewport.getAlignment().getSequences());
\r
486 * @param up DOCUMENT ME!
\r
488 public void moveSelectedSequences(boolean up)
\r
490 SequenceGroup sg = viewport.getSelectionGroup();
\r
499 for (int i = 1; i < viewport.alignment.getHeight(); i++)
\r
501 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
503 if (!sg.sequences.contains(seq))
\r
508 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
\r
510 if (sg.sequences.contains(temp))
\r
515 viewport.alignment.getSequences().setElementAt(temp, i);
\r
516 viewport.alignment.getSequences().setElementAt(seq, i - 1);
\r
521 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
\r
523 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
525 if (!sg.sequences.contains(seq))
\r
530 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
\r
532 if (sg.sequences.contains(temp))
\r
537 viewport.alignment.getSequences().setElementAt(temp, i);
\r
538 viewport.alignment.getSequences().setElementAt(seq, i + 1);
\r
542 alignPanel.repaint();
\r
550 * @param e DOCUMENT ME!
\r
552 protected void copy_actionPerformed(ActionEvent e)
\r
554 if (viewport.getSelectionGroup() == null)
\r
559 SequenceGroup sg = viewport.getSelectionGroup();
\r
561 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
563 Hashtable orderedSeqs = new Hashtable();
\r
564 SequenceI[] seqs = new SequenceI[sg.getSize()];
\r
566 for (int i = 0; i < sg.getSize(); i++)
\r
568 SequenceI seq = sg.getSequenceAt(i);
\r
569 int index = viewport.alignment.findIndex(seq);
\r
570 orderedSeqs.put(index + "", seq);
\r
573 int index = 0, startRes, endRes;
\r
576 for (int i = 0; i < sg.getSize(); i++)
\r
578 SequenceI seq = null;
\r
580 while (seq == null)
\r
582 if (orderedSeqs.containsKey(index + ""))
\r
584 seq = (SequenceI) orderedSeqs.get(index + "");
\r
596 //Returns residue following index if gap
\r
597 startRes = seq.findPosition(sg.getStartRes());
\r
600 //Need to find the residue preceeding index if gap
\r
603 for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)
\r
605 ch = seq.getCharAt(j);
\r
606 if (!jalview.util.Comparison.isGap( (ch)))
\r
614 endRes += seq.getStart() - 1;
\r
617 seqs[i] = new Sequence(seq.getName(),
\r
618 seq.getSequence(sg.getStartRes(), sg.getEndRes() + 1),
\r
621 seqs[i].setDescription(seq.getDescription());
\r
622 seqs[i].setDBRef(seq.getDBRef());
\r
623 seqs[i].setSequenceFeatures(seq.getSequenceFeatures());
\r
624 seqs[i].setDatasetSequence(seq.getDatasetSequence());
\r
625 if(seq.getAnnotation()!=null)
\r
627 for(int a=0; a<seq.getAnnotation().length; a++)
\r
628 seqs[i].addAlignmentAnnotation(seq.getAnnotation()[a]);
\r
632 FastaFile ff = new FastaFile();
\r
633 ff.addJVSuffix( viewport.showJVSuffix );
\r
634 c.setContents(new StringSelection( ff.print(seqs)), Desktop.instance);
\r
635 Desktop.jalviewClipboard = new Object[]{seqs, viewport.alignment.getDataset()};
\r
641 * @param e DOCUMENT ME!
\r
643 protected void pasteNew_actionPerformed(ActionEvent e)
\r
651 * @param e DOCUMENT ME!
\r
653 protected void pasteThis_actionPerformed(ActionEvent e)
\r
655 addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,
\r
656 HistoryItem.PASTE));
\r
663 * @param newAlignment DOCUMENT ME!
\r
665 void paste(boolean newAlignment)
\r
669 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
670 Transferable contents = c.getContents(this);
\r
672 if (contents == null)
\r
677 String str = (String) contents.getTransferData(DataFlavor.stringFlavor);
\r
681 String format = new IdentifyFile().Identify(str, "Paste");
\r
682 SequenceI[] sequences;
\r
684 if(Desktop.jalviewClipboard!=null)
\r
686 // The clipboard was filled from within Jalview, we must use the sequences
\r
687 // And dataset from the copied alignment
\r
688 sequences = (SequenceI[])Desktop.jalviewClipboard[0];
\r
692 sequences = new FormatAdapter().readFile(str, "Paste", format);
\r
695 AlignmentI alignment = null;
\r
699 alignment = new Alignment(sequences);
\r
701 if(Desktop.jalviewClipboard!=null)
\r
702 alignment.setDataset( (Alignment)Desktop.jalviewClipboard[1] );
\r
704 alignment.setDataset( null );
\r
708 alignment = viewport.getAlignment();
\r
711 for (int i = 0; i < sequences.length; i++)
\r
714 Sequence newseq = new Sequence(sequences[i].getName(),
\r
715 sequences[i].getSequence(), sequences[i].getStart(),
\r
716 sequences[i].getEnd());
\r
718 alignment.addSequence(newseq);
\r
719 if(sequences[i].getDatasetSequence()==null)
\r
721 ////////////////////////////
\r
722 //Datset needs extension;
\r
723 /////////////////////////////
\r
724 Sequence ds = new Sequence(sequences[i].getName(),
\r
725 AlignSeq.extractGaps("-. ", sequences[i].getSequence()),
\r
726 sequences[i].getStart(),
\r
727 sequences[i].getEnd());
\r
728 newseq.setDatasetSequence(ds);
\r
729 alignment.getDataset().addSequence(ds);
\r
733 newseq.setDatasetSequence(sequences[i].getDatasetSequence());
\r
736 viewport.setEndSeq(alignment.getHeight());
\r
737 alignment.getWidth();
\r
738 viewport.firePropertyChange("alignment", null, alignment.getSequences());
\r
741 // Add any annotations attached to sequences
\r
742 for (int i = 0; i < sequences.length; i++)
\r
744 if (sequences[i].getAnnotation() != null)
\r
746 for (int a = 0; a < sequences[i].getAnnotation().length; a++)
\r
748 AlignmentAnnotation newAnnot =
\r
749 new AlignmentAnnotation(
\r
750 sequences[i].getAnnotation()[a].label,
\r
751 sequences[i].getAnnotation()[a].description,
\r
752 sequences[i].getAnnotation()[a].annotations,
\r
753 sequences[i].getAnnotation()[a].graphMin,
\r
754 sequences[i].getAnnotation()[a].graphMax,
\r
755 sequences[i].getAnnotation()[a].graph);
\r
757 sequences[i].getAnnotation()[a] = newAnnot;
\r
758 newAnnot.sequenceMapping = sequences[i].getAnnotation()[a].
\r
760 newAnnot.sequenceRef = sequences[i];
\r
761 newAnnot.adjustForAlignment();
\r
762 alignment.addAnnotation(newAnnot);
\r
763 alignment.setAnnotationIndex(newAnnot, a);
\r
766 alignPanel.annotationPanel.adjustPanelHeight();
\r
772 AlignFrame af = new AlignFrame(alignment);
\r
773 String newtitle = new String("Copied sequences");
\r
776 //>>>This is a fix for the moment, until a better solution is found!!<<<
\r
777 af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().transferSettings(
\r
778 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
781 if (title.startsWith("Copied sequences"))
\r
787 newtitle = newtitle.concat("- from " + title);
\r
790 Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,
\r
791 NEW_WINDOW_HEIGHT);
\r
797 catch (Exception ex)
\r
799 ex.printStackTrace();
\r
800 System.out.println("Exception whilst pasting: "+ex);
\r
801 // could be anything being pasted in here
\r
810 * @param e DOCUMENT ME!
\r
812 protected void cut_actionPerformed(ActionEvent e)
\r
814 copy_actionPerformed(null);
\r
815 delete_actionPerformed(null);
\r
821 * @param e DOCUMENT ME!
\r
823 protected void delete_actionPerformed(ActionEvent e)
\r
826 if (viewport.getSelectionGroup() == null)
\r
832 SequenceGroup sg = viewport.getSelectionGroup();
\r
836 //Jalview no longer allows deletion of residues.
\r
837 //Check here whether any residues are in selection area
\r
838 /* if( sg.getEndRes()-sg.getStartRes() < viewport.alignment.getWidth()-1)
\r
840 for (int i = 0; i < sg.sequences.size(); i++)
\r
842 SequenceI seq = sg.getSequenceAt(i);
\r
843 int j = sg.getStartRes();
\r
846 if (!jalview.util.Comparison.isGap(seq.getCharAt(j)))
\r
848 JOptionPane.showInternalMessageDialog(
\r
849 Desktop.desktop, "Cannot delete residues from alignment!\n"
\r
850 + "Try hiding columns instead.",
\r
851 "Deletion of residues not permitted",
\r
852 JOptionPane.WARNING_MESSAGE);
\r
857 }while(j<=sg.getEndRes());
\r
862 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
\r
863 HistoryItem.HIDE));
\r
866 for (int i = 0; i < sg.sequences.size(); i++)
\r
868 SequenceI seq = sg.getSequenceAt(i);
\r
869 int index = viewport.getAlignment().findIndex(seq);
\r
871 seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);
\r
873 // If the cut affects all sequences, remove highlighted columns
\r
874 if (sg.sequences.size() == viewport.alignment.getHeight())
\r
876 viewport.getColumnSelection().removeElements(sg.getStartRes(),
\r
877 sg.getEndRes() + 1);
\r
880 if (seq.getSequence().length() < 1)
\r
882 viewport.getAlignment().deleteSequence(seq);
\r
886 viewport.getAlignment().getSequences().setElementAt(seq, index);
\r
890 viewport.setSelectionGroup(null);
\r
891 viewport.alignment.deleteGroup(sg);
\r
893 viewport.firePropertyChange("alignment", null,
\r
894 viewport.getAlignment().getSequences());
\r
898 if (viewport.getAlignment().getHeight() < 1)
\r
902 this.setClosed(true);
\r
904 catch (Exception ex)
\r
913 * @param e DOCUMENT ME!
\r
915 protected void deleteGroups_actionPerformed(ActionEvent e)
\r
917 viewport.alignment.deleteAllGroups();
\r
918 viewport.setSelectionGroup(null);
\r
919 alignPanel.repaint();
\r
925 * @param e DOCUMENT ME!
\r
927 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
929 SequenceGroup sg = new SequenceGroup();
\r
931 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
934 sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
\r
937 sg.setEndRes(viewport.alignment.getWidth() - 1);
\r
938 viewport.setSelectionGroup(sg);
\r
939 PaintRefresher.Refresh(null, viewport.alignment);
\r
945 * @param e DOCUMENT ME!
\r
947 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
\r
949 if(viewport.cursorMode)
\r
951 alignPanel.seqPanel.keyboardNo1 = null;
\r
952 alignPanel.seqPanel.keyboardNo2 = null;
\r
954 viewport.setSelectionGroup(null);
\r
955 viewport.getColumnSelection().clear();
\r
956 viewport.setSelectionGroup(null);
\r
957 alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
\r
958 alignPanel.idPanel.idCanvas.searchResults = null;
\r
959 PaintRefresher.Refresh(null, viewport.alignment);
\r
965 * @param e DOCUMENT ME!
\r
967 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
\r
969 SequenceGroup sg = viewport.getSelectionGroup();
\r
973 selectAllSequenceMenuItem_actionPerformed(null);
\r
978 for (int i = 0; i < viewport.getAlignment().getSequences().size();
\r
981 sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
\r
984 PaintRefresher.Refresh(null, viewport.alignment);
\r
990 * @param e DOCUMENT ME!
\r
992 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
\r
994 ColumnSelection colSel = viewport.getColumnSelection();
\r
996 if (colSel.size() > 0)
\r
998 addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,
\r
999 HistoryItem.HIDE));
\r
1001 int min = colSel.getMin();
\r
1002 viewport.getAlignment().trimLeft(min);
\r
1003 colSel.compensateForEdit(0, min);
\r
1005 if (viewport.getSelectionGroup() != null)
\r
1007 viewport.getSelectionGroup().adjustForRemoveLeft(min);
\r
1010 Vector groups = viewport.alignment.getGroups();
\r
1012 for (int i = 0; i < groups.size(); i++)
\r
1014 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1016 if (!sg.adjustForRemoveLeft(min))
\r
1018 viewport.alignment.deleteGroup(sg);
\r
1022 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1029 * @param e DOCUMENT ME!
\r
1031 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
\r
1033 ColumnSelection colSel = viewport.getColumnSelection();
\r
1035 if (colSel.size() > 0)
\r
1037 addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,
\r
1038 HistoryItem.HIDE));
\r
1040 int max = colSel.getMax();
\r
1041 viewport.getAlignment().trimRight(max);
\r
1043 if (viewport.getSelectionGroup() != null)
\r
1045 viewport.getSelectionGroup().adjustForRemoveRight(max);
\r
1048 Vector groups = viewport.alignment.getGroups();
\r
1050 for (int i = 0; i < groups.size(); i++)
\r
1052 SequenceGroup sg = (SequenceGroup) groups.get(i);
\r
1054 if (!sg.adjustForRemoveRight(max))
\r
1056 viewport.alignment.deleteGroup(sg);
\r
1060 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1067 * @param e DOCUMENT ME!
\r
1069 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
\r
1071 addHistoryItem(new HistoryItem("Remove Gapped Columns",
\r
1072 viewport.alignment, HistoryItem.HIDE));
\r
1074 //This is to maintain viewport position on first residue
\r
1075 //of first sequence
\r
1076 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1077 int startRes = seq.findPosition(viewport.startRes);
\r
1079 viewport.getAlignment().removeGaps();
\r
1081 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1083 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1089 * @param e DOCUMENT ME!
\r
1091 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
\r
1093 addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,
\r
1094 HistoryItem.HIDE));
\r
1096 //This is to maintain viewport position on first residue
\r
1097 //of first sequence
\r
1098 SequenceI seq = viewport.alignment.getSequenceAt(0);
\r
1099 int startRes = seq.findPosition(viewport.startRes);
\r
1102 SequenceI current;
\r
1105 Vector seqs = null;
\r
1108 int end = viewport.alignment.getWidth();
\r
1110 if (viewport.getSelectionGroup() != null
\r
1111 && viewport.getSelectionGroup().sequences != null
\r
1112 && viewport.getSelectionGroup().sequences.size() > 0)
\r
1114 seqs = viewport.getSelectionGroup().sequences;
\r
1115 start = viewport.getSelectionGroup().getStartRes();
\r
1116 end = viewport.getSelectionGroup().getEndRes()+1;
\r
1120 seqs = viewport.alignment.getSequences();
\r
1123 for (int i = 0; i < seqs.size(); i++)
\r
1125 current = (SequenceI) seqs.elementAt(i);
\r
1126 jSize = current.getLength();
\r
1128 // Removing a range is much quicker than removing gaps
\r
1129 // one by one for long sequences
\r
1131 int rangeStart=-1, rangeEnd=-1;
\r
1135 if (jalview.util.Comparison.isGap(current.getCharAt(j)))
\r
1137 if(rangeStart==-1)
\r
1152 current.deleteChars(rangeStart, rangeEnd);
\r
1153 j-=rangeEnd-rangeStart;
\r
1154 jSize-=rangeEnd-rangeStart;
\r
1162 while (j < end && j < jSize);
\r
1165 current.deleteChars(rangeStart, rangeEnd);
\r
1169 viewport.setStartRes(seq.findIndex(startRes)-1);
\r
1171 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
1174 public void alignmentChanged()
\r
1176 if(viewport.padGaps)
\r
1177 viewport.getAlignment().padGaps();
\r
1179 if(viewport.vconsensus!=null && viewport.autoCalculateConsensus)
\r
1181 viewport.updateConsensus();
\r
1182 viewport.updateConservation();
\r
1184 resetAllColourSchemes();
\r
1185 if(alignPanel.overviewPanel!=null)
\r
1186 alignPanel.overviewPanel.updateOverviewImage();
\r
1188 viewport.alignment.adjustSequenceAnnotations();
\r
1190 alignPanel.repaint();
\r
1193 void resetAllColourSchemes()
\r
1195 ColourSchemeI cs = viewport.globalColourScheme;
\r
1198 if (cs instanceof ClustalxColourScheme)
\r
1200 ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).
\r
1201 resetClustalX(viewport.alignment.getSequences(),
\r
1202 viewport.alignment.getWidth());
\r
1205 cs.setConsensus(viewport.vconsensus);
\r
1206 if (cs.conservationApplied())
\r
1208 Alignment al = (Alignment) viewport.alignment;
\r
1209 Conservation c = new Conservation("All",
\r
1210 ResidueProperties.propHash, 3,
\r
1211 al.getSequences(), 0,
\r
1212 al.getWidth() - 1);
\r
1214 c.verdict(false, viewport.ConsPercGaps);
\r
1216 cs.setConservation(c);
\r
1220 int s, sSize = viewport.alignment.getGroups().size();
\r
1221 for(s=0; s<sSize; s++)
\r
1223 SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);
\r
1224 if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)
\r
1226 ((ClustalxColourScheme)sg.cs).resetClustalX(sg.sequences, sg.getWidth());
\r
1228 sg.recalcConservation();
\r
1235 * @param e DOCUMENT ME!
\r
1237 public void padGapsMenuitem_actionPerformed(ActionEvent e)
\r
1239 addHistoryItem(new HistoryItem("Pad Gaps", viewport.alignment,
\r
1240 HistoryItem.HIDE));
\r
1242 viewport.padGaps = padGapsMenuitem.isSelected();
\r
1244 // if (viewport.padGaps)
\r
1245 alignmentChanged();
\r
1251 * @param e DOCUMENT ME!
\r
1253 public void findMenuItem_actionPerformed(ActionEvent e)
\r
1255 JInternalFrame frame = new JInternalFrame();
\r
1256 Finder finder = new Finder(viewport, alignPanel, frame);
\r
1257 frame.setContentPane(finder);
\r
1258 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1259 Desktop.addInternalFrame(frame, "Find", 340, 110);
\r
1265 * @param e DOCUMENT ME!
\r
1267 public void font_actionPerformed(ActionEvent e)
\r
1269 new FontChooser(alignPanel);
\r
1272 public void smoothFont_actionPerformed(ActionEvent e)
\r
1274 viewport.antiAlias = smoothFont.isSelected();
\r
1275 alignPanel.annotationPanel.image = null;
\r
1276 alignPanel.repaint();
\r
1283 * @param e DOCUMENT ME!
\r
1285 protected void seqLimit_actionPerformed(ActionEvent e)
\r
1287 viewport.setShowJVSuffix(seqLimits.isSelected());
\r
1289 alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel.calculateIdWidth());
\r
1290 alignPanel.repaint();
\r
1297 * @param e DOCUMENT ME!
\r
1299 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
\r
1301 viewport.setColourText(colourTextMenuItem.isSelected());
\r
1302 alignPanel.repaint();
\r
1308 * @param e DOCUMENT ME!
\r
1310 protected void wrapMenuItem_actionPerformed(ActionEvent e)
\r
1312 viewport.setWrapAlignment(wrapMenuItem.isSelected());
\r
1313 alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
\r
1314 scaleAbove.setVisible(wrapMenuItem.isSelected());
\r
1315 scaleLeft.setVisible(wrapMenuItem.isSelected());
\r
1316 scaleRight.setVisible(wrapMenuItem.isSelected());
\r
1317 alignPanel.repaint();
\r
1323 * @param e DOCUMENT ME!
\r
1325 protected void scaleAbove_actionPerformed(ActionEvent e)
\r
1327 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
\r
1328 alignPanel.repaint();
\r
1334 * @param e DOCUMENT ME!
\r
1336 protected void scaleLeft_actionPerformed(ActionEvent e)
\r
1338 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
\r
1339 alignPanel.repaint();
\r
1345 * @param e DOCUMENT ME!
\r
1347 protected void scaleRight_actionPerformed(ActionEvent e)
\r
1349 viewport.setScaleRightWrapped(scaleRight.isSelected());
\r
1350 alignPanel.repaint();
\r
1356 * @param e DOCUMENT ME!
\r
1358 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
\r
1360 viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
\r
1361 alignPanel.repaint();
\r
1367 * @param e DOCUMENT ME!
\r
1369 public void viewTextMenuItem_actionPerformed(ActionEvent e)
\r
1371 viewport.setShowText(viewTextMenuItem.isSelected());
\r
1372 alignPanel.repaint();
\r
1378 * @param e DOCUMENT ME!
\r
1380 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
\r
1382 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
\r
1383 alignPanel.repaint();
\r
1386 public void fetchSeqFeatures_actionPerformed(ActionEvent e)
\r
1388 if (!viewport.alignment.isNucleotide())
\r
1390 new SequenceFeatureFetcher(viewport.
\r
1393 viewport.setShowSequenceFeatures(true);
\r
1394 showSeqFeatures.setSelected(true);
\r
1399 public void featureSettings_actionPerformed(ActionEvent e)
\r
1401 new FeatureSettings(viewport, alignPanel);
\r
1407 * @param evt DOCUMENT ME!
\r
1409 public void showSeqFeatures_actionPerformed(ActionEvent evt)
\r
1411 viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
\r
1412 alignPanel.repaint();
\r
1413 if (alignPanel.getOverviewPanel() != null)
\r
1415 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1422 * @param e DOCUMENT ME!
\r
1424 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
\r
1426 viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
\r
1427 alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
\r
1433 * @param e DOCUMENT ME!
\r
1435 public void overviewMenuItem_actionPerformed(ActionEvent e)
\r
1437 if (alignPanel.overviewPanel != null)
\r
1442 JInternalFrame frame = new JInternalFrame();
\r
1443 OverviewPanel overview = new OverviewPanel(alignPanel);
\r
1444 frame.setContentPane(overview);
\r
1445 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
\r
1446 frame.getWidth(), frame.getHeight());
\r
1448 frame.setLayer(JLayeredPane.PALETTE_LAYER);
\r
1449 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
\r
1451 public void internalFrameClosed(
\r
1452 javax.swing.event.InternalFrameEvent evt)
\r
1454 alignPanel.setOverviewPanel(null);
\r
1459 alignPanel.setOverviewPanel(overview);
\r
1465 * @param e DOCUMENT ME!
\r
1467 protected void noColourmenuItem_actionPerformed(ActionEvent e)
\r
1469 changeColour(null);
\r
1475 * @param e DOCUMENT ME!
\r
1477 public void clustalColour_actionPerformed(ActionEvent e)
\r
1479 changeColour(new ClustalxColourScheme(
\r
1480 viewport.alignment.getSequences(), viewport.alignment.getWidth()));
\r
1486 * @param e DOCUMENT ME!
\r
1488 public void zappoColour_actionPerformed(ActionEvent e)
\r
1490 changeColour(new ZappoColourScheme());
\r
1496 * @param e DOCUMENT ME!
\r
1498 public void taylorColour_actionPerformed(ActionEvent e)
\r
1500 changeColour(new TaylorColourScheme());
\r
1506 * @param e DOCUMENT ME!
\r
1508 public void hydrophobicityColour_actionPerformed(ActionEvent e)
\r
1510 changeColour(new HydrophobicColourScheme());
\r
1516 * @param e DOCUMENT ME!
\r
1518 public void helixColour_actionPerformed(ActionEvent e)
\r
1520 changeColour(new HelixColourScheme());
\r
1526 * @param e DOCUMENT ME!
\r
1528 public void strandColour_actionPerformed(ActionEvent e)
\r
1530 changeColour(new StrandColourScheme());
\r
1536 * @param e DOCUMENT ME!
\r
1538 public void turnColour_actionPerformed(ActionEvent e)
\r
1540 changeColour(new TurnColourScheme());
\r
1546 * @param e DOCUMENT ME!
\r
1548 public void buriedColour_actionPerformed(ActionEvent e)
\r
1550 changeColour(new BuriedColourScheme());
\r
1556 * @param e DOCUMENT ME!
\r
1558 public void nucleotideColour_actionPerformed(ActionEvent e)
\r
1560 changeColour(new NucleotideColourScheme());
\r
1563 public void annotationColour_actionPerformed(ActionEvent e)
\r
1565 new AnnotationColourChooser(viewport, alignPanel);
\r
1572 * @param e DOCUMENT ME!
\r
1574 protected void applyToAllGroups_actionPerformed(ActionEvent e)
\r
1576 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
\r
1582 * @param cs DOCUMENT ME!
\r
1584 void changeColour(ColourSchemeI cs)
\r
1586 int threshold = 0;
\r
1590 if (viewport.getAbovePIDThreshold())
\r
1592 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
\r
1595 cs.setThreshold(threshold,
\r
1596 viewport.getIgnoreGapsConsensus());
\r
1598 viewport.setGlobalColourScheme(cs);
\r
1602 cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1605 if (viewport.getConservationSelected())
\r
1608 Alignment al = (Alignment) viewport.alignment;
\r
1609 Conservation c = new Conservation("All",
\r
1610 ResidueProperties.propHash, 3,
\r
1611 al.getSequences(), 0,
\r
1612 al.getWidth() - 1);
\r
1615 c.verdict(false, viewport.ConsPercGaps);
\r
1617 cs.setConservation(c);
\r
1619 cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,
\r
1624 cs.setConservation(null);
\r
1627 cs.setConsensus(viewport.vconsensus);
\r
1630 viewport.setGlobalColourScheme(cs);
\r
1632 if (viewport.getColourAppliesToAllGroups())
\r
1634 Vector groups = viewport.alignment.getGroups();
\r
1636 for (int i = 0; i < groups.size(); i++)
\r
1638 SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
\r
1646 if (cs instanceof ClustalxColourScheme)
\r
1648 sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());
\r
1650 else if (cs instanceof UserColourScheme)
\r
1652 sg.cs = new UserColourScheme( ( (UserColourScheme) cs).getColours());
\r
1658 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
\r
1660 catch (Exception ex)
\r
1665 if (viewport.getAbovePIDThreshold()
\r
1666 || cs instanceof PIDColourScheme
\r
1667 || cs instanceof Blosum62ColourScheme)
\r
1669 sg.cs.setThreshold(threshold,
\r
1670 viewport.getIgnoreGapsConsensus());
\r
1672 sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,
\r
1676 sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
\r
1679 if (viewport.getConservationSelected())
\r
1681 Conservation c = new Conservation("Group",
\r
1682 ResidueProperties.propHash, 3,
\r
1684 viewport.alignment.getWidth() - 1);
\r
1686 c.verdict(false, viewport.ConsPercGaps);
\r
1687 sg.cs.setConservation(c);
\r
1690 sg.cs.setConservation(null);
\r
1694 if (alignPanel.getOverviewPanel() != null)
\r
1696 alignPanel.getOverviewPanel().updateOverviewImage();
\r
1699 alignPanel.repaint();
\r
1705 * @param e DOCUMENT ME!
\r
1707 protected void modifyPID_actionPerformed(ActionEvent e)
\r
1709 if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)
\r
1711 SliderPanel.setPIDSliderSource(alignPanel,
\r
1712 viewport.getGlobalColourScheme(),
\r
1714 SliderPanel.showPIDSlider();
\r
1721 * @param e DOCUMENT ME!
\r
1723 protected void modifyConservation_actionPerformed(ActionEvent e)
\r
1725 if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)
\r
1727 SliderPanel.setConservationSlider(alignPanel,
\r
1728 viewport.globalColourScheme,
\r
1730 SliderPanel.showConservationSlider();
\r
1737 * @param e DOCUMENT ME!
\r
1739 protected void conservationMenuItem_actionPerformed(ActionEvent e)
\r
1741 viewport.setConservationSelected(conservationMenuItem.isSelected());
\r
1743 viewport.setAbovePIDThreshold(false);
\r
1744 abovePIDThreshold.setSelected(false);
\r
1746 changeColour(viewport.getGlobalColourScheme());
\r
1748 modifyConservation_actionPerformed(null);
\r
1754 * @param e DOCUMENT ME!
\r
1756 public void abovePIDThreshold_actionPerformed(ActionEvent e)
\r
1758 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
\r
1760 conservationMenuItem.setSelected(false);
\r
1761 viewport.setConservationSelected(false);
\r
1763 changeColour(viewport.getGlobalColourScheme());
\r
1765 modifyPID_actionPerformed(null);
\r
1771 * @param e DOCUMENT ME!
\r
1773 public void userDefinedColour_actionPerformed(ActionEvent e)
\r
1775 if (e.getActionCommand().equals("User Defined..."))
\r
1777 new UserDefinedColours(alignPanel, null);
\r
1781 UserColourScheme udc = (UserColourScheme) UserDefinedColours.
\r
1782 getUserColourSchemes().get(e.getActionCommand());
\r
1784 changeColour(udc);
\r
1788 public void updateUserColourMenu()
\r
1791 Component[] menuItems = colourMenu.getMenuComponents();
\r
1792 int i, iSize = menuItems.length;
\r
1793 for (i = 0; i < iSize; i++)
\r
1795 if (menuItems[i].getName() != null &&
\r
1796 menuItems[i].getName().equals("USER_DEFINED"))
\r
1798 colourMenu.remove(menuItems[i]);
\r
1802 if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
\r
1804 java.util.Enumeration userColours = jalview.gui.UserDefinedColours.
\r
1805 getUserColourSchemes().keys();
\r
1807 while (userColours.hasMoreElements())
\r
1809 final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.
\r
1810 nextElement().toString());
\r
1811 radioItem.setName("USER_DEFINED");
\r
1812 radioItem.addMouseListener(new MouseAdapter()
\r
1814 public void mousePressed(MouseEvent evt)
\r
1816 if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))
\r
1818 radioItem.removeActionListener(radioItem.getActionListeners()[0]);
\r
1820 int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,
\r
1821 "Remove from default list?",
\r
1822 "Remove user defined colour",
\r
1823 JOptionPane.YES_NO_OPTION);
\r
1824 if(option == JOptionPane.YES_OPTION)
\r
1826 jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());
\r
1827 colourMenu.remove(radioItem);
\r
1830 radioItem.addActionListener(new ActionListener()
\r
1832 public void actionPerformed(ActionEvent evt)
\r
1834 userDefinedColour_actionPerformed(evt);
\r
1840 radioItem.addActionListener(new ActionListener()
\r
1842 public void actionPerformed(ActionEvent evt)
\r
1844 userDefinedColour_actionPerformed(evt);
\r
1848 colourMenu.insert(radioItem, 15);
\r
1849 colours.add(radioItem);
\r
1857 * @param e DOCUMENT ME!
\r
1859 public void PIDColour_actionPerformed(ActionEvent e)
\r
1861 changeColour(new PIDColourScheme());
\r
1867 * @param e DOCUMENT ME!
\r
1869 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
\r
1871 changeColour(new Blosum62ColourScheme());
\r
1877 * @param e DOCUMENT ME!
\r
1879 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
\r
1881 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,
\r
1882 HistoryItem.SORT));
\r
1883 AlignmentSorter.sortByPID(viewport.getAlignment(),
\r
1884 viewport.getAlignment().getSequenceAt(0));
\r
1885 alignPanel.repaint();
\r
1891 * @param e DOCUMENT ME!
\r
1893 public void sortIDMenuItem_actionPerformed(ActionEvent e)
\r
1895 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
\r
1896 HistoryItem.SORT));
\r
1897 AlignmentSorter.sortByID(viewport.getAlignment());
\r
1898 alignPanel.repaint();
\r
1904 * @param e DOCUMENT ME!
\r
1906 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
\r
1908 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
\r
1909 HistoryItem.SORT));
\r
1911 AlignmentSorter.sortByGroup(viewport.getAlignment());
\r
1912 alignPanel.repaint();
\r
1918 * @param e DOCUMENT ME!
\r
1920 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
\r
1922 RedundancyPanel sp = new RedundancyPanel(alignPanel, this);
\r
1923 JInternalFrame frame = new JInternalFrame();
\r
1924 frame.setContentPane(sp);
\r
1925 Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400,
\r
1932 * @param e DOCUMENT ME!
\r
1934 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
\r
1936 if ( (viewport.getSelectionGroup() == null) ||
\r
1937 (viewport.getSelectionGroup().getSize() < 2))
\r
1939 JOptionPane.showInternalMessageDialog(this,
\r
1940 "You must select at least 2 sequences.",
\r
1941 "Invalid Selection",
\r
1942 JOptionPane.WARNING_MESSAGE);
\r
1946 JInternalFrame frame = new JInternalFrame();
\r
1947 frame.setContentPane(new PairwiseAlignPanel(viewport));
\r
1948 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
\r
1955 * @param e DOCUMENT ME!
\r
1957 public void PCAMenuItem_actionPerformed(ActionEvent e)
\r
1959 if ( ( (viewport.getSelectionGroup() != null) &&
\r
1960 (viewport.getSelectionGroup().getSize() < 4) &&
\r
1961 (viewport.getSelectionGroup().getSize() > 0)) ||
\r
1962 (viewport.getAlignment().getHeight() < 4))
\r
1964 JOptionPane.showInternalMessageDialog(this,
\r
1965 "Principal component analysis must take\n" +
\r
1966 "at least 4 input sequences.",
\r
1967 "Sequence selection insufficient",
\r
1968 JOptionPane.WARNING_MESSAGE);
\r
1973 new PCAPanel(viewport);
\r
1977 public void autoCalculate_actionPerformed(ActionEvent e)
\r
1979 viewport.autoCalculateConsensus = autoCalculate.isSelected();
\r
1980 if(viewport.autoCalculateConsensus)
\r
1982 alignmentChanged();
\r
1990 * @param e DOCUMENT ME!
\r
1992 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
\r
1994 NewTreePanel("AV", "PID", "Average distance tree using PID");
\r
2000 * @param e DOCUMENT ME!
\r
2002 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
\r
2004 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
\r
2010 * @param e DOCUMENT ME!
\r
2012 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2014 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
\r
2020 * @param e DOCUMENT ME!
\r
2022 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
\r
2024 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
\r
2030 * @param type DOCUMENT ME!
\r
2031 * @param pwType DOCUMENT ME!
\r
2032 * @param title DOCUMENT ME!
\r
2034 void NewTreePanel(String type, String pwType, String title)
\r
2038 if ( (viewport.getSelectionGroup() != null) &&
\r
2039 (viewport.getSelectionGroup().getSize() > 3))
\r
2042 SequenceGroup sg = viewport.getSelectionGroup();
\r
2044 /* Decide if the selection is a column region */
\r
2045 while (s < sg.sequences.size())
\r
2047 if ( ( (SequenceI) sg.sequences.elementAt(s++)).getLength() <
\r
2050 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2051 "The selected region to create a tree may\nonly contain residues or gaps.\n" +
\r
2052 "Try using the Pad function in the edit menu,\n" +
\r
2053 "or one of the multiple sequence alignment web services.",
\r
2054 "Sequences in selection are not aligned",
\r
2055 JOptionPane.WARNING_MESSAGE);
\r
2061 title = title + " on region";
\r
2062 tp = new TreePanel(viewport,
\r
2063 viewport.getSelectionGroup().sequences, type, pwType,
\r
2064 sg.getStartRes(), sg.getEndRes());
\r
2068 //are the sequences aligned?
\r
2069 if (!viewport.alignment.isAligned())
\r
2071 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2072 "The sequences must be aligned before creating a tree.\n" +
\r
2073 "Try using the Pad function in the edit menu,\n" +
\r
2074 "or one of the multiple sequence alignment web services.",
\r
2075 "Sequences not aligned",
\r
2076 JOptionPane.WARNING_MESSAGE);
\r
2081 tp = new TreePanel(viewport,
\r
2082 viewport.getAlignment().getSequences(), type, pwType,
\r
2084 viewport.alignment.getWidth());
\r
2087 addTreeMenuItem(tp, title);
\r
2089 Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);
\r
2095 * @param title DOCUMENT ME!
\r
2096 * @param order DOCUMENT ME!
\r
2098 public void addSortByOrderMenuItem(String title, final AlignmentOrder order)
\r
2100 final JMenuItem item = new JMenuItem("by " + title);
\r
2102 item.addActionListener(new java.awt.event.ActionListener()
\r
2104 public void actionPerformed(ActionEvent e)
\r
2106 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
\r
2107 HistoryItem.SORT));
\r
2109 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
\r
2110 AlignmentSorter.sortBy(viewport.getAlignment(), order);
\r
2111 alignPanel.repaint();
\r
2117 * Maintain the Order by->Displayed Tree menu.
\r
2118 * Creates a new menu item for a TreePanel with an appropriate
\r
2119 * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added
\r
2120 * to remove the menu item when the treePanel is closed, and adjust
\r
2121 * the tree leaf to sequence mapping when the alignment is modified.
\r
2122 * @param treePanel Displayed tree window.
\r
2123 * @param title SortBy menu item title.
\r
2125 void addTreeMenuItem(final TreePanel treePanel, String title)
\r
2127 final JMenuItem item = new JMenuItem(title);
\r
2131 if (treeCount == 1)
\r
2133 sort.add(sortByTreeMenu);
\r
2136 sortByTreeMenu.add(item);
\r
2137 item.addActionListener(new java.awt.event.ActionListener()
\r
2139 public void actionPerformed(ActionEvent e)
\r
2141 addHistoryItem(new HistoryItem("Tree Sort",
\r
2142 viewport.alignment, HistoryItem.SORT));
\r
2143 AlignmentSorter.sortByTree(viewport.getAlignment(),
\r
2144 treePanel.getTree());
\r
2145 alignPanel.repaint();
\r
2149 treePanel.addInternalFrameListener(new javax.swing.event.
\r
2150 InternalFrameAdapter()
\r
2152 public void internalFrameClosed(
\r
2153 javax.swing.event.InternalFrameEvent evt)
\r
2156 sortByTreeMenu.remove(item);
\r
2158 if (treeCount == 0)
\r
2160 sort.remove(sortByTreeMenu);
\r
2168 * Work out whether the whole set of sequences
\r
2169 * or just the selected set will be submitted for multiple alignment.
\r
2172 private SequenceI[] gatherSequencesForAlignment()
\r
2174 // Now, check we have enough sequences
\r
2175 SequenceI[] msa = null;
\r
2177 if ( (viewport.getSelectionGroup() != null) &&
\r
2178 (viewport.getSelectionGroup().getSize() > 1))
\r
2180 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2181 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2183 msa = new SequenceI[sz = seqs.getSize()];
\r
2185 for (int i = 0; i < sz; i++)
\r
2187 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2192 Vector seqs = viewport.getAlignment().getSequences();
\r
2194 if (seqs.size() > 1)
\r
2196 msa = new SequenceI[seqs.size()];
\r
2198 for (int i = 0; i < seqs.size(); i++)
\r
2200 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2208 * Decides what is submitted to a secondary structure prediction service,
\r
2209 * the currently selected sequence, or the currently selected alignment
\r
2210 * (where the first sequence in the set is the one that the prediction
\r
2213 SequenceI[] gatherSeqOrMsaForSecStrPrediction()
\r
2215 SequenceI seq = null;
\r
2216 SequenceI[] msa = null;
\r
2218 if ( (viewport.getSelectionGroup() != null) &&
\r
2219 (viewport.getSelectionGroup().getSize() > 0))
\r
2221 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
\r
2222 SequenceGroup seqs = viewport.getSelectionGroup();
\r
2224 if ( (seqs.getSize() == 1) || !viewport.alignment.isAligned())
\r
2226 seq = (SequenceI) seqs.getSequenceAt(0);
\r
2231 msa = new SequenceI[sz = seqs.getSize()];
\r
2233 for (int i = 0; i < sz; i++)
\r
2235 msa[i] = (SequenceI) seqs.getSequenceAt(i);
\r
2241 Vector seqs = viewport.getAlignment().getSequences();
\r
2243 if ( (seqs.size() == 1) || !viewport.alignment.isAligned())
\r
2245 seq = (SequenceI) seqs.elementAt(0);
\r
2249 msa = new SequenceI[seqs.size()];
\r
2251 for (int i = 0; i < seqs.size(); i++)
\r
2253 msa[i] = (SequenceI) seqs.elementAt(i);
\r
2265 return new SequenceI[]
\r
2275 * @param e DOCUMENT ME!
\r
2277 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
\r
2279 // Pick the tree file
\r
2280 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2282 "LAST_DIRECTORY"));
\r
2283 chooser.setFileView(new JalviewFileView());
\r
2284 chooser.setDialogTitle("Select a newick-like tree file");
\r
2285 chooser.setToolTipText("Load a tree file");
\r
2287 int value = chooser.showOpenDialog(null);
\r
2289 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2291 String choice = chooser.getSelectedFile().getPath();
\r
2292 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
2296 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,
\r
2298 viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
\r
2300 catch (Exception ex)
\r
2302 JOptionPane.showMessageDialog(Desktop.desktop,
\r
2303 "Problem reading tree file",
\r
2305 JOptionPane.WARNING_MESSAGE);
\r
2306 ex.printStackTrace();
\r
2312 public TreePanel ShowNewickTree(NewickFile nf, String title)
\r
2314 return ShowNewickTree(nf,title,600,500,4,5);
\r
2319 * @param nf DOCUMENT ME!
\r
2320 * @param title DOCUMENT ME!
\r
2322 * @return DOCUMENT ME!
\r
2324 public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)
\r
2326 TreePanel tp = null;
\r
2332 if (nf.getTree() != null)
\r
2334 tp = new TreePanel(viewport,
\r
2335 viewport.getAlignment().getSequences(), nf,
\r
2342 tp.setLocation(x,y);
\r
2345 Desktop.addInternalFrame(tp, title, w, h);
\r
2346 addTreeMenuItem(tp, title);
\r
2349 catch (Exception ex)
\r
2351 ex.printStackTrace();
\r
2362 PrinterJob printJob = PrinterJob.getPrinterJob();
\r
2363 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
\r
2364 printJob.setPrintable(alignPanel, pf);
\r
2366 if (printJob.printDialog())
\r
2372 catch (Exception PrintException)
\r
2374 PrintException.printStackTrace();
\r
2381 * Generates menu items and listener event actions for web service clients
\r
2384 public void BuildWebServiceMenu()
\r
2386 if ( (Discoverer.services != null)
\r
2387 && (Discoverer.services.size() > 0))
\r
2389 Vector msaws = (Vector) Discoverer.services.get("MsaWS");
\r
2390 Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");
\r
2391 Vector wsmenu = new Vector();
\r
2392 if (msaws != null)
\r
2394 // Add any Multiple Sequence Alignment Services
\r
2395 final JMenu msawsmenu = new JMenu("Alignment");
\r
2396 final AlignFrame af = this;
\r
2397 for (int i = 0, j = msaws.size(); i < j; i++)
\r
2399 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.
\r
2401 final JMenuItem method = new JMenuItem(sh.getName());
\r
2402 method.addActionListener(new ActionListener()
\r
2404 public void actionPerformed(ActionEvent e)
\r
2406 SequenceI[] msa = gatherSequencesForAlignment();
\r
2407 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2408 false, true, viewport.getAlignment().getDataset(), af);
\r
2413 msawsmenu.add(method);
\r
2414 // Deal with services that we know accept partial alignments.
\r
2415 if (sh.getName().indexOf("lustal") > -1)
\r
2417 // We know that ClustalWS can accept partial alignments for refinement.
\r
2418 final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");
\r
2419 methodR.addActionListener(new ActionListener()
\r
2421 public void actionPerformed(ActionEvent e)
\r
2423 SequenceI[] msa = gatherSequencesForAlignment();
\r
2424 new jalview.ws.MsaWSClient(sh, title, msa,
\r
2425 true, true, viewport.getAlignment().getDataset(), af);
\r
2430 msawsmenu.add(methodR);
\r
2434 wsmenu.add(msawsmenu);
\r
2436 if (secstrpr != null)
\r
2438 // Add any secondary structure prediction services
\r
2439 final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");
\r
2440 for (int i = 0, j = secstrpr.size(); i < j; i++)
\r
2442 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)
\r
2444 final JMenuItem method = new JMenuItem(sh.getName());
\r
2445 method.addActionListener(new ActionListener()
\r
2447 public void actionPerformed(ActionEvent e)
\r
2449 SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();
\r
2450 if (msa.length == 1)
\r
2452 // Single Sequence prediction
\r
2453 new jalview.ws.JPredClient(sh,title, msa[0]);
\r
2457 if (msa.length > 1)
\r
2459 // Single Sequence prediction
\r
2460 jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,
\r
2466 secstrmenu.add(method);
\r
2468 wsmenu.add(secstrmenu);
\r
2470 this.webService.removeAll();
\r
2471 for (int i = 0, j = wsmenu.size(); i < j; i++)
\r
2473 webService.add( (JMenu) wsmenu.get(i));
\r
2478 this.webService.removeAll();
\r
2479 this.webService.add(this.webServiceNoServices);
\r
2481 // TODO: add in rediscovery function
\r
2482 // TODO: reduce code redundancy.
\r
2483 // TODO: group services by location as well as function.
\r
2486 /* public void vamsasStore_actionPerformed(ActionEvent e)
\r
2488 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
2489 getProperty("LAST_DIRECTORY"));
\r
2491 chooser.setFileView(new JalviewFileView());
\r
2492 chooser.setDialogTitle("Export to Vamsas file");
\r
2493 chooser.setToolTipText("Export");
\r
2495 int value = chooser.showSaveDialog(this);
\r
2497 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
2499 jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
\r
2500 //vs.store(chooser.getSelectedFile().getAbsolutePath() );
\r
2501 vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);
\r
2509 public void showTranslation_actionPerformed(ActionEvent e)
\r
2511 int s, sSize = viewport.alignment.getHeight();
\r
2512 SequenceI [] newSeq = new SequenceI[sSize];
\r
2515 StringBuffer protein;
\r
2517 for(s=0; s<sSize; s++)
\r
2519 protein = new StringBuffer();
\r
2520 seq = AlignSeq.extractGaps("-. ", viewport.alignment.getSequenceAt(s).getSequence());
\r
2521 resSize = seq.length();
\r
2522 resSize -= resSize%3;
\r
2524 for(res = 0; res < resSize; res+=3)
\r
2526 String codon = seq.substring(res, res+3);
\r
2527 codon = codon.replace('U', 'T');
\r
2528 String aa = ResidueProperties.codonTranslate(codon);
\r
2530 protein.append(viewport.getGapCharacter());
\r
2531 else if(aa.equals("STOP"))
\r
2532 protein.append("X");
\r
2534 protein.append( aa );
\r
2536 newSeq[s] = new Sequence(viewport.alignment.getSequenceAt(s).getName(), protein.toString());
\r
2540 AlignmentI al = new Alignment(newSeq);
\r
2541 al.setDataset(null);
\r
2544 ////////////////////////////////
\r
2545 // Copy annotations across
\r
2546 jalview.datamodel.AlignmentAnnotation[] annotations
\r
2547 = viewport.alignment.getAlignmentAnnotation();
\r
2549 if(annotations!=null)
\r
2551 for (int i = 0; i < annotations.length; i++)
\r
2553 if (annotations[i].label.equals("Quality") ||
\r
2554 annotations[i].label.equals("Conservation") ||
\r
2555 annotations[i].label.equals("Consensus"))
\r
2560 aSize = viewport.alignment.getWidth() / 3;
\r
2561 jalview.datamodel.Annotation[] anots =
\r
2562 new jalview.datamodel.Annotation[aSize];
\r
2564 for (a = 0; a < viewport.alignment.getWidth(); a++)
\r
2566 if (annotations[i].annotations[a] == null
\r
2567 || annotations[i].annotations[a] == null)
\r
2570 anots[a / 3] = new Annotation(
\r
2571 annotations[i].annotations[a].displayCharacter,
\r
2572 annotations[i].annotations[a].description,
\r
2573 annotations[i].annotations[a].secondaryStructure,
\r
2574 annotations[i].annotations[a].value,
\r
2575 annotations[i].annotations[a].colour);
\r
2578 jalview.datamodel.AlignmentAnnotation aa
\r
2579 = new jalview.datamodel.AlignmentAnnotation(annotations[i].label,
\r
2580 annotations[i].description, anots);
\r
2581 al.addAnnotation(aa);
\r
2585 AlignFrame af = new AlignFrame(al);
\r
2586 Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
\r
2588 NEW_WINDOW_HEIGHT);
\r
2591 // AlignViewport newViewport = new AlignViewport(al);
\r
2592 // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
\r
2593 // tabbedPane.add("Protein", ap);
\r
2594 // viewports.add(newViewport);
\r
2595 // alignPanels.add(ap);
\r
2598 /////////////////////////
\r
2600 // AlignViewport ds = new AlignViewport(al.getDataset());
\r
2601 // ds.setDataset(true);
\r
2602 // AlignmentPanel dap = new AlignmentPanel(this, ds);
\r
2603 // tabbedPane.add("Dataset", dap);
\r
2604 // viewports.add(ds);
\r
2605 // alignPanels.add(dap);
\r
2606 /////////////////////////
\r
2611 /*public void tabSelected()
\r
2613 int index = tabbedPane.getSelectedIndex();
\r
2614 viewport = (AlignViewport)viewports.elementAt(index);
\r
2615 alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
\r
2621 * @param String DOCUMENT ME!
\r
2623 public boolean parseGroupsFile(String file)
\r
2625 String line = null;
\r
2628 BufferedReader in = new BufferedReader(new FileReader(file));
\r
2629 SequenceI seq = null;
\r
2630 String type, desc, token;
\r
2632 int index, start, end;
\r
2633 StringTokenizer st;
\r
2634 SequenceFeature sf;
\r
2636 String featureGroup = null;
\r
2637 while ( (line = in.readLine()) != null)
\r
2640 st = new StringTokenizer(line, "\t");
\r
2641 if (st.countTokens() == 2)
\r
2643 type = st.nextToken();
\r
2644 if (type.equalsIgnoreCase("startgroup"))
\r
2646 featureGroup = st.nextToken();
\r
2648 else if (type.equalsIgnoreCase("endgroup"))
\r
2650 //We should check whether this is the current group,
\r
2651 //but at present theres no way of showing more than 1 group
\r
2653 featureGroup = null;
\r
2657 UserColourScheme ucs = new UserColourScheme(st.nextToken());
\r
2658 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type,
\r
2659 ucs.findColour("A"));
\r
2664 while (st.hasMoreElements())
\r
2666 desc = st.nextToken();
\r
2667 token = st.nextToken();
\r
2668 if (!token.equals("ID_NOT_SPECIFIED"))
\r
2670 index = viewport.alignment.findIndex(viewport.alignment.findName(token));
\r
2675 index = Integer.parseInt(st.nextToken());
\r
2678 start = Integer.parseInt(st.nextToken());
\r
2679 end = Integer.parseInt(st.nextToken());
\r
2681 seq = viewport.alignment.getSequenceAt(index);
\r
2683 type = st.nextToken();
\r
2685 if (alignPanel.seqPanel.seqCanvas.getFeatureRenderer().getColour(type) == null)
\r
2687 // Probably the old style groups file
\r
2688 UserColourScheme ucs = new UserColourScheme(type);
\r
2689 alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(type, ucs.findColour("A"));
\r
2692 sf = new SequenceFeature(type, desc, "", start, end, featureGroup);
\r
2694 seq.getDatasetSequence().addSequenceFeature(sf);
\r
2698 catch (Exception ex)
\r
2700 System.out.println(line);
\r
2701 ex.printStackTrace();
\r
2702 System.out.println("Error parsing groups file: " + ex +"\n"+line);
\r
2706 viewport.showSequenceFeatures = true;
\r
2707 showSeqFeatures.setSelected(true);
\r
2708 alignPanel.repaint();
\r
2712 public void dragEnter(DropTargetDragEvent evt)
\r
2715 public void dragExit(DropTargetEvent evt)
\r
2718 public void dragOver(DropTargetDragEvent evt)
\r
2721 public void dropActionChanged(DropTargetDragEvent evt)
\r
2724 public void drop(DropTargetDropEvent evt)
\r
2726 Transferable t = evt.getTransferable();
\r
2727 java.util.List files = null;
\r
2731 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
\r
2732 if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
\r
2734 //Works on Windows and MacOSX
\r
2735 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2736 files = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
\r
2738 else if (t.isDataFlavorSupported(uriListFlavor))
\r
2740 // This is used by Unix drag system
\r
2741 evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
\r
2742 String data = (String) t.getTransferData(uriListFlavor);
\r
2743 files = new java.util.ArrayList(1);
\r
2744 for (java.util.StringTokenizer st = new java.util.StringTokenizer(
\r
2747 st.hasMoreTokens(); )
\r
2749 String s = st.nextToken();
\r
2750 if (s.startsWith("#"))
\r
2752 // the line is a comment (as per the RFC 2483)
\r
2756 java.net.URI uri = new java.net.URI(s);
\r
2757 java.io.File file = new java.io.File(uri);
\r
2762 catch (Exception e)
\r
2764 e.printStackTrace();
\r
2766 if (files != null)
\r
2771 for (int i = 0; i < files.size(); i++)
\r
2773 loadJalviewDataFile(files.get(i).toString());
\r
2776 catch (Exception ex)
\r
2778 ex.printStackTrace();
\r
2783 // This method will attempt to load a "dropped" file first by testing
\r
2784 // whether its and Annotation file, then features file. If both are
\r
2785 // false then the user may have dropped an alignment file onto this
\r
2787 public void loadJalviewDataFile(String file)
\r
2790 boolean isAnnotation = new AnnotationReader().readAnnotationFile(viewport.
\r
2793 if (!isAnnotation)
\r
2795 boolean isGroupsFile = parseGroupsFile(file);
\r
2796 if (!isGroupsFile)
\r
2798 String protocol = "File";
\r
2799 String format = new IdentifyFile().Identify(file, protocol);
\r
2800 SequenceI[] sequences = new FormatAdapter().readFile(file, protocol,
\r
2803 FastaFile ff = new FastaFile();
\r
2804 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
2805 c.setContents(new StringSelection(ff.print(sequences)), Desktop.instance);
\r
2807 this.paste(false);
\r
2813 int height = alignPanel.annotationPanel.adjustPanelHeight();
\r
2814 alignPanel.annotationScroller.setPreferredSize(
\r
2815 new Dimension(alignPanel.annotationScroller.getWidth(),
\r
2818 alignPanel.annotationSpaceFillerHolder.setPreferredSize(new Dimension(
\r
2819 alignPanel.annotationSpaceFillerHolder.getWidth(),
\r
2822 alignPanel.addNotify();
\r
2825 }catch(Exception ex)
\r
2827 ex.printStackTrace();
\r