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
204 public void addFromFile_actionPerformed(ActionEvent e)
\r
206 Desktop.instance.inputLocalFileMenuItem_actionPerformed(viewport.alignment);
\r
209 public void addFromText_actionPerformed(ActionEvent e)
\r
211 Desktop.instance.inputTextboxMenuItem_actionPerformed(viewport.alignment);
\r
214 public void addFromURL_actionPerformed(ActionEvent e)
\r
216 Desktop.instance.inputURLMenuItem_actionPerformed(viewport.alignment);
\r
222 * @param e DOCUMENT ME!
\r
224 public void saveAlignmentMenu_actionPerformed(ActionEvent e)
\r
226 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
231 "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc",
\r
236 "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview"
\r
237 }, currentFileFormat);
\r
239 chooser.setAcceptAllFileFilterUsed(false);
\r
240 chooser.setFileView(new JalviewFileView());
\r
241 chooser.setDialogTitle("Save Alignment to file");
\r
242 chooser.setToolTipText("Save");
\r
244 int value = chooser.showSaveDialog(this);
\r
246 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
248 currentFileFormat = chooser.getSelectedFormat();
\r
250 if (currentFileFormat == null)
\r
252 JOptionPane.showInternalMessageDialog(Desktop.desktop,
\r
253 "You must select a file format before saving!",
\r
254 "File format not specified",
\r
255 JOptionPane.WARNING_MESSAGE);
\r
256 value = chooser.showSaveDialog(this);
\r
260 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
\r
261 currentFileFormat);
\r
263 String choice = chooser.getSelectedFile().getPath();
\r
264 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
266 saveAlignment(choice, currentFileFormat);
\r
270 public boolean saveAlignment(String file, String format)
\r
272 if (format.equalsIgnoreCase("Jalview"))
\r
274 String shortName = title;
\r
276 if (shortName.indexOf(java.io.File.separatorChar) > -1)
\r
278 shortName = shortName.substring(shortName.lastIndexOf(
\r
279 java.io.File.separatorChar) + 1);
\r
282 new Jalview2XML().SaveAlignment(this, file, shortName);
\r
284 // USE Jalview2XML to save this file
\r
289 String output = new FormatAdapter().formatSequences(format,
\r
290 viewport.getAlignment().
\r
292 if (output == null)
\r
299 java.io.PrintWriter out = new java.io.PrintWriter(
\r
300 new java.io.FileWriter(file));
\r
306 catch (Exception ex)
\r
308 ex.printStackTrace();
\r
317 * @param e DOCUMENT ME!
\r
319 protected void outputText_actionPerformed(ActionEvent e)
\r
321 CutAndPasteTransfer cap = new CutAndPasteTransfer();
\r
322 Desktop.addInternalFrame(cap,
\r
323 "Alignment output - " + e.getActionCommand(), 600,
\r
325 cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
\r
326 viewport.getAlignment().
\r
333 * @param e DOCUMENT ME!
\r
335 protected void htmlMenuItem_actionPerformed(ActionEvent e)
\r
337 new HTMLOutput(viewport,
\r
338 alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
\r
339 alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
\r
342 public void createImageMap(File file, String image)
\r
344 alignPanel.makePNGImageMap(file, image);
\r
350 * @param e DOCUMENT ME!
\r
352 public void createPNG(File f)
\r
354 alignPanel.makePNG(f);
\r
360 * @param e DOCUMENT ME!
\r
362 public void createEPS(File f)
\r
364 alignPanel.makeEPS(f);
\r
370 * @param e DOCUMENT ME!
\r
372 public void printMenuItem_actionPerformed(ActionEvent e)
\r
374 //Putting in a thread avoids Swing painting problems
\r
375 PrintThread thread = new PrintThread();
\r
379 public void associatedData_actionPerformed(ActionEvent e)
\r
381 // Pick the tree file
\r
382 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
\r
384 "LAST_DIRECTORY"));
\r
385 chooser.setFileView(new JalviewFileView());
\r
386 chooser.setDialogTitle("Load Jalview Annotations or Features File");
\r
387 chooser.setToolTipText("Load Jalview Annotations / Features file");
\r
389 int value = chooser.showOpenDialog(null);
\r
391 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
393 String choice = chooser.getSelectedFile().getPath();
\r
394 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
\r
395 loadJalviewDataFile(choice);
\r
403 * @param e DOCUMENT ME!
\r
405 public void closeMenuItem_actionPerformed(ActionEvent e)
\r
409 PaintRefresher.components.remove(viewport.alignment);
\r
410 this.setClosed(true);
\r
412 catch (Exception ex)
\r
420 void updateEditMenuBar()
\r
422 if (historyList.size() > 0)
\r
424 undoMenuItem.setEnabled(true);
\r
426 HistoryItem hi = (HistoryItem) historyList.peek();
\r
427 undoMenuItem.setText("Undo " + hi.getDescription());
\r
431 undoMenuItem.setEnabled(false);
\r
432 undoMenuItem.setText("Undo");
\r
435 if (redoList.size() > 0)
\r
437 redoMenuItem.setEnabled(true);
\r
439 HistoryItem hi = (HistoryItem) redoList.peek();
\r
440 redoMenuItem.setText("Redo " + hi.getDescription());
\r
444 redoMenuItem.setEnabled(false);
\r
445 redoMenuItem.setText("Redo");
\r
452 * @param hi DOCUMENT ME!
\r
454 public void addHistoryItem(HistoryItem hi)
\r
456 historyList.push(hi);
\r
457 updateEditMenuBar();
\r
463 * @param e DOCUMENT ME!
\r
465 protected void undoMenuItem_actionPerformed(ActionEvent e)
\r
467 HistoryItem hi = (HistoryItem) historyList.pop();
\r
468 redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,
\r
469 HistoryItem.HIDE));
\r
470 restoreHistoryItem(hi);
\r
471 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
477 * @param e DOCUMENT ME!
\r
479 protected void redoMenuItem_actionPerformed(ActionEvent e)
\r
481 HistoryItem hi = (HistoryItem) redoList.pop();
\r
482 restoreHistoryItem(hi);
\r
483 updateEditMenuBar();
\r
484 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
\r
487 // used by undo and redo
\r
488 void restoreHistoryItem(HistoryItem hi)
\r
493 updateEditMenuBar();
\r
495 viewport.firePropertyChange("alignment", null,
\r
496 viewport.getAlignment().getSequences());
\r
502 * @param up DOCUMENT ME!
\r
504 public void moveSelectedSequences(boolean up)
\r
506 SequenceGroup sg = viewport.getSelectionGroup();
\r
515 for (int i = 1; i < viewport.alignment.getHeight(); i++)
\r
517 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
519 if (!sg.sequences.contains(seq))
\r
524 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
\r
526 if (sg.sequences.contains(temp))
\r
531 viewport.alignment.getSequences().setElementAt(temp, i);
\r
532 viewport.alignment.getSequences().setElementAt(seq, i - 1);
\r
537 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
\r
539 SequenceI seq = viewport.alignment.getSequenceAt(i);
\r
541 if (!sg.sequences.contains(seq))
\r
546 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
\r
548 if (sg.sequences.contains(temp))
\r
553 viewport.alignment.getSequences().setElementAt(temp, i);
\r
554 viewport.alignment.getSequences().setElementAt(seq, i + 1);
\r
558 alignPanel.repaint();
\r
566 * @param e DOCUMENT ME!
\r
568 protected void copy_actionPerformed(ActionEvent e)
\r
570 if (viewport.getSelectionGroup() == null)
\r
575 SequenceGroup sg = viewport.getSelectionGroup();
\r
577 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
579 Hashtable orderedSeqs = new Hashtable();
\r
580 SequenceI[] seqs = new SequenceI[sg.getSize()];
\r
582 for (int i = 0; i < sg.getSize(); i++)
\r
584 SequenceI seq = sg.getSequenceAt(i);
\r
585 int index = viewport.alignment.findIndex(seq);
\r
586 orderedSeqs.put(index + "", seq);
\r
589 int index = 0, startRes, endRes;
\r
592 for (int i = 0; i < sg.getSize(); i++)
\r
594 SequenceI seq = null;
\r
596 while (seq == null)
\r
598 if (orderedSeqs.containsKey(index + ""))
\r
600 seq = (SequenceI) orderedSeqs.get(index + "");
\r
612 //Returns residue following index if gap
\r
613 startRes = seq.findPosition(sg.getStartRes());
\r
616 //Need to find the residue preceeding index if gap
\r
619 for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)
\r
621 ch = seq.getCharAt(j);
\r
622 if (!jalview.util.Comparison.isGap( (ch)))
\r
630 endRes += seq.getStart() - 1;
\r
633 seqs[i] = new Sequence(seq.getName(),
\r
634 seq.getSequence(sg.getStartRes(), sg.getEndRes() + 1),
\r
637 seqs[i].setDescription(seq.getDescription());
\r
638 seqs[i].setDBRef(seq.getDBRef());
\r
639 seqs[i].setSequenceFeatures(seq.getSequenceFeatures());
\r
640 seqs[i].setDatasetSequence(seq.getDatasetSequence());
\r
641 if(seq.getAnnotation()!=null)
\r
643 for(int a=0; a<seq.getAnnotation().length; a++)
\r
644 seqs[i].addAlignmentAnnotation(seq.getAnnotation()[a]);
\r
648 FastaFile ff = new FastaFile();
\r
649 ff.addJVSuffix( viewport.showJVSuffix );
\r
650 c.setContents(new StringSelection( ff.print(seqs)), Desktop.instance);
\r
651 Desktop.jalviewClipboard = new Object[]{seqs, viewport.alignment.getDataset()};
\r
657 * @param e DOCUMENT ME!
\r
659 protected void pasteNew_actionPerformed(ActionEvent e)
\r
667 * @param e DOCUMENT ME!
\r
669 protected void pasteThis_actionPerformed(ActionEvent e)
\r
671 addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,
\r
672 HistoryItem.PASTE));
\r
679 * @param newAlignment DOCUMENT ME!
\r
681 void paste(boolean newAlignment)
\r
685 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
\r
686 Transferable contents = c.getContents(this);
\r
688 if (contents == null)
\r
693 String str = (String) contents.getTransferData(DataFlavor.stringFlavor);
\r
697 String format = new IdentifyFile().Identify(str, "Paste");
\r
698 SequenceI[] sequences;
\r
700 if(Desktop.jalviewClipboard!=null)
\r
702 // The clipboard was filled from within Jalview, we must use the sequences
\r
703 // And dataset from the copied alignment
\r
704 sequences = (SequenceI[])Desktop.jalviewClipboard[0];
\r
708 sequences = new FormatAdapter().readFile(str, "Paste", format);
\r
711 AlignmentI alignment = null;
\r
715 alignment = new Alignment(sequences);
\r
717 if(Desktop.jalviewClipboard!=null)
\r
718 alignment.setDataset( (Alignment)Desktop.jalviewClipboard[1] );
\r
720 alignment.setDataset( null );
\r
724 alignment = viewport.getAlignment();
\r
727 for (int i = 0; i < sequences.length; i++)
\r
730 Sequence newseq = new Sequence(sequences[i].getName(),
\r
731 sequences[i].getSequence(), sequences[i].getStart(),
\r
732 sequences[i].getEnd());
\r
734 alignment.addSequence(newseq);
\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