2 * 2004 Jalview Reengineered
17 import java.awt.datatransfer.*;
18 import java.awt.event.*;
19 import java.awt.print.*;
21 import javax.swing.event.*;
23 import jalview.analysis.*;
24 import jalview.datamodel.*;
26 import jalview.jbgui.*;
27 import jalview.schemes.*;
31 public class AlignFrame extends GAlignFrame
33 final AlignmentPanel alignPanel;
34 final AlignViewport viewport;
35 public static final int NEW_WINDOW_WIDTH = 700;
36 public static final int NEW_WINDOW_HEIGHT = 500;
37 public String currentFileFormat = "Jalview";
39 public AlignFrame(AlignmentI al)
41 viewport = new AlignViewport(al);
43 alignPanel = new AlignmentPanel(this, viewport);
44 alignPanel.annotationPanel.adjustPanelHeight();
45 alignPanel.annotationSpaceFillerHolder.setPreferredSize(alignPanel.annotationPanel.getPreferredSize());
46 alignPanel.annotationScroller.setPreferredSize(alignPanel.annotationPanel.getPreferredSize());
47 alignPanel.setAnnotationVisible( viewport.getShowAnnotation() );
49 getContentPane().add(alignPanel, java.awt.BorderLayout.CENTER);
51 addInternalFrameListener(new InternalFrameAdapter()
53 public void internalFrameActivated(InternalFrameEvent evt)
55 javax.swing.SwingUtilities.invokeLater(new Runnable()
58 { alignPanel.requestFocus(); }
66 public void saveAlignmentMenu_actionPerformed(ActionEvent e)
68 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.getProperty("LAST_DIRECTORY")
69 , new String[]{"fa, fasta, fastq", "aln", "pfam", "msf", "pir","blc","jar"},
70 new String[]{"Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview"},
73 chooser.setAcceptAllFileFilterUsed(false);
74 chooser.setFileView(new JalviewFileView());
75 chooser.setDialogTitle("Save Alignment to file");
76 chooser.setToolTipText("Save");
77 int value = chooser.showSaveDialog(this);
78 if(value == JalviewFileChooser.APPROVE_OPTION)
80 currentFileFormat = chooser.getSelectedFormat();
82 if (currentFileFormat.equals("Jalview"))
84 String shortName = title.replace('/', '_');
85 title = title.replace('\\', '_');
86 String choice = chooser.getSelectedFile().getPath();
87 Jalview2XML.SaveState(this, choice, shortName);
88 // USE Jalview2XML to save this file
92 String choice = chooser.getSelectedFile().getPath();
93 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
94 String output = FormatAdapter.formatSequences(currentFileFormat, viewport.getAlignment().getSequences());
96 java.io.PrintWriter out = new java.io.PrintWriter( new java.io.FileWriter( choice ) );
100 catch(Exception ex){}
105 protected void outputText_actionPerformed(ActionEvent e)
107 CutAndPasteTransfer cap = new CutAndPasteTransfer(false);
108 JInternalFrame frame = new JInternalFrame();
109 cap.formatForOutput();
110 frame.setContentPane(cap);
111 Desktop.addInternalFrame(frame, "Alignment output - "+e.getActionCommand(), 600, 500);
112 cap.setText( FormatAdapter.formatSequences(e.getActionCommand(), viewport.getAlignment().getSequences()));
115 protected void htmlMenuItem_actionPerformed(ActionEvent e)
117 HTMLOutput htmlOutput = new HTMLOutput(viewport);
121 protected void createPNG_actionPerformed(ActionEvent e)
123 alignPanel.makePNG();
126 protected void epsFile_actionPerformed(ActionEvent e)
128 alignPanel.makeEPS();
132 public void printMenuItem_actionPerformed(ActionEvent e)
134 //Putting in a thread avoids Swing painting problems
135 PrintThread thread = new PrintThread();
139 class PrintThread extends Thread
143 PrinterJob printJob = PrinterJob.getPrinterJob();
144 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
145 printJob.setPrintable(alignPanel, pf);
146 if (printJob.printDialog())
152 catch (Exception PrintException)
154 PrintException.printStackTrace();
164 public void closeMenuItem_actionPerformed(ActionEvent e)
167 this.setClosed(true);
168 }catch(Exception ex){}
171 Stack historyList = new Stack();
172 Stack redoList = new Stack();
173 private int treeCount = 0;
175 void updateEditMenuBar()
177 if(historyList.size()>0)
179 undoMenuItem.setEnabled(true);
180 HistoryItem hi = (HistoryItem)historyList.peek();
181 undoMenuItem.setText("Undo "+hi.getDescription());
185 undoMenuItem.setEnabled(false);
186 undoMenuItem.setText("Undo");
189 if(redoList.size()>0)
191 redoMenuItem.setEnabled(true);
192 HistoryItem hi = (HistoryItem)redoList.peek();
193 redoMenuItem.setText("Redo "+hi.getDescription());
197 redoMenuItem.setEnabled(false);
198 redoMenuItem.setText("Redo");
202 public void addHistoryItem(HistoryItem hi)
204 historyList.push(hi);
208 protected void undoMenuItem_actionPerformed(ActionEvent e)
210 HistoryItem hi = (HistoryItem)historyList.pop();
211 redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment, HistoryItem.HIDE));
212 restoreHistoryItem(hi);
216 protected void redoMenuItem_actionPerformed(ActionEvent e)
218 HistoryItem hi = (HistoryItem)redoList.pop();
219 restoreHistoryItem(hi);
221 viewport.updateConsensus();
222 alignPanel.repaint();
223 alignPanel.repaint();
227 // used by undo and redo
228 void restoreHistoryItem(HistoryItem hi)
230 if(hi.getType()== HistoryItem.SORT)
232 for(int i=0; i<hi.getSequences().size(); i++)
233 viewport.alignment.getSequences().setElementAt(hi.getSequences().elementAt(i), i);
237 for (int i = 0; i < hi.getSequences().size(); i++)
239 SequenceI restore = (SequenceI) hi.getSequences().elementAt(i);
240 if(restore.getLength()==0)
242 restore.setSequence(hi.getHidden().elementAt(i).toString());
243 viewport.alignment.getSequences().insertElementAt(
245 hi.getAlignIndex(i));
248 restore.setSequence(hi.getHidden().elementAt(i).toString());
250 if(hi.getType()==HistoryItem.PASTE)
252 for(int i=viewport.alignment.getHeight()-1;i>hi.getSequences().size()-1; i--)
253 viewport.alignment.deleteSequence(i);
259 viewport.updateConsensus();
260 viewport.updateConservation();
261 alignPanel.repaint();
264 public void moveSelectedSequences(boolean up)
266 SequenceGroup sg = viewport.getSelectionGroup();
272 for (int i = 1; i < viewport.alignment.getHeight(); i++)
274 SequenceI seq = viewport.alignment.getSequenceAt(i);
275 if (!sg.sequences.contains(seq))
278 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
279 if (sg.sequences.contains(temp))
282 viewport.alignment.getSequences().setElementAt(temp, i);
283 viewport.alignment.getSequences().setElementAt(seq, i - 1);
288 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
290 SequenceI seq = viewport.alignment.getSequenceAt(i);
291 if (!sg.sequences.contains(seq))
294 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
295 if (sg.sequences.contains(temp))
298 viewport.alignment.getSequences().setElementAt(temp, i);
299 viewport.alignment.getSequences().setElementAt(seq, i + 1);
303 alignPanel.repaint();
308 protected void copy_actionPerformed(ActionEvent e)
310 if(viewport.getSelectionGroup()==null)
313 SequenceGroup sg = viewport.getSelectionGroup();
315 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
316 StringBuffer buffer= new StringBuffer();
318 Hashtable orderedSeqs = new Hashtable();
319 for(int i=0; i<sg.getSize(); i++)
321 SequenceI seq = sg.getSequenceAt(i);
322 int index = viewport.alignment.findIndex(seq);
323 orderedSeqs.put(index+"", seq);
327 for(int i=0; i<sg.getSize(); i++)
329 SequenceI seq = null;
332 if(orderedSeqs.containsKey(index+""))
334 seq = (SequenceI) orderedSeqs.get(index + "");
342 buffer.append( seq.getName()+"\t"+seq.findPosition( sg.getStartRes() ) +"\t"
343 +seq.findPosition( sg.getEndRes() )+ "\t"
344 +sg.getSequenceAt(i).getSequence(sg.getStartRes(), sg.getEndRes()+1)+"\n");
346 c.setContents( new StringSelection( buffer.toString()) , null ) ;
351 protected void pasteNew_actionPerformed(ActionEvent e)
356 protected void pasteThis_actionPerformed(ActionEvent e)
358 addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment, HistoryItem.PASTE));
362 void paste(boolean newAlignment)
365 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
366 Transferable contents = c.getContents(this);
367 if (contents == null)
370 String str = (String) contents.getTransferData(DataFlavor.stringFlavor);
371 StringTokenizer st = new StringTokenizer(str);
372 ArrayList seqs = new ArrayList();
373 while (st.hasMoreElements())
375 String name = st.nextToken();
376 int start = Integer.parseInt(st.nextToken());
377 int end = Integer.parseInt(st.nextToken());
378 Sequence sequence = new Sequence(name,st.nextToken(), start, end);
381 viewport.alignment.addSequence(sequence);
388 SequenceI[] newSeqs = new SequenceI[seqs.size()];
389 seqs.toArray(newSeqs);
390 AlignFrame af = new AlignFrame(new Alignment(newSeqs));
391 String newtitle = new String("Copied sequences");
392 if( title.startsWith("Copied sequences"))
395 newtitle = newtitle.concat("- from "+title);
397 Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH, NEW_WINDOW_HEIGHT);
401 viewport.setEndSeq(viewport.alignment.getHeight());
402 viewport.alignment.getWidth();
403 viewport.updateConservation();
404 viewport.updateConsensus();
405 alignPanel.repaint();
408 }catch(Exception ex){}// could be anything being pasted in here
413 protected void cut_actionPerformed(ActionEvent e)
415 copy_actionPerformed(null);
416 delete_actionPerformed(null);
419 protected void delete_actionPerformed(ActionEvent e)
421 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment, HistoryItem.HIDE));
423 if (viewport.getSelectionGroup() == null)
426 SequenceGroup sg = viewport.getSelectionGroup();
427 for (int i=0;i < sg.sequences.size(); i++)
429 SequenceI seq = sg.getSequenceAt(i);
430 int index = viewport.getAlignment().findIndex(seq);
431 seq.deleteChars(sg.getStartRes(),sg.getEndRes()+1);
433 if(seq.getSequence().length()<1)
434 viewport.getAlignment().deleteSequence(seq);
436 viewport.getAlignment().getSequences().setElementAt(seq, index);
439 viewport.setSelectionGroup(null);
440 viewport.alignment.deleteGroup(sg);
441 viewport.resetSeqLimits( alignPanel.seqPanel.seqCanvas.getHeight());
442 if(viewport.getAlignment().getHeight()<1)
445 this.setClosed(true);
446 }catch(Exception ex){}
447 viewport.updateConservation();
448 viewport.updateConsensus();
449 alignPanel.repaint();
454 protected void deleteGroups_actionPerformed(ActionEvent e)
456 viewport.alignment.deleteAllGroups();
457 viewport.setSelectionGroup(null);
458 alignPanel.repaint();
463 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
465 SequenceGroup sg = new SequenceGroup();
466 for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)
467 sg.addSequence( viewport.getAlignment().getSequenceAt(i));
468 sg.setEndRes(viewport.alignment.getWidth());
469 viewport.setSelectionGroup(sg);
470 PaintRefresher.Refresh(null);
473 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
475 viewport.setSelectionGroup(null);
476 viewport.getColumnSelection().clear();
477 viewport.setSelectionGroup(null);
478 PaintRefresher.Refresh(null);
481 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
483 SequenceGroup sg = viewport.getSelectionGroup();
484 for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)
485 sg.addOrRemove (viewport.getAlignment().getSequenceAt(i));
487 PaintRefresher.Refresh(null);
490 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
492 ColumnSelection colSel = viewport.getColumnSelection();
493 if (colSel.size() > 0)
495 addHistoryItem(new HistoryItem("Remove Left",viewport.alignment,
497 int min = colSel.getMin();
498 viewport.getAlignment().trimLeft(min);
499 colSel.compensateForEdit(0,min);
501 if(viewport.getSelectionGroup()!=null)
502 viewport.getSelectionGroup().adjustForRemoveLeft(min);
504 Vector groups = viewport.alignment.getGroups();
505 for(int i=0; i<groups.size(); i++)
507 SequenceGroup sg = (SequenceGroup) groups.get(i);
508 if(!sg.adjustForRemoveLeft(min))
509 viewport.alignment.deleteGroup(sg);
512 alignPanel.repaint();
516 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
518 ColumnSelection colSel = viewport.getColumnSelection();
519 if (colSel.size() > 0)
521 addHistoryItem(new HistoryItem("Remove Right",viewport.alignment,
524 int max = colSel.getMax();
525 viewport.getAlignment().trimRight(max);
526 if(viewport.getSelectionGroup()!=null)
527 viewport.getSelectionGroup().adjustForRemoveRight(max);
529 Vector groups = viewport.alignment.getGroups();
530 for(int i=0; i<groups.size(); i++)
532 SequenceGroup sg = (SequenceGroup) groups.get(i);
533 if(!sg.adjustForRemoveRight(max))
534 viewport.alignment.deleteGroup(sg);
539 alignPanel.repaint();
544 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
546 addHistoryItem(new HistoryItem("Remove Gapped Columns",
550 viewport.getAlignment().removeGaps();
551 viewport.updateConservation();
552 viewport.updateConsensus();
553 alignPanel.repaint();
556 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
558 addHistoryItem(new HistoryItem("Remove Gaps",
563 for (int i=0; i < viewport.getAlignment().getSequences().size();i++)
565 current = viewport.getAlignment().getSequenceAt(i);
566 jSize = current.getLength();
567 for (int j=0; j < jSize; j++)
568 if(jalview.util.Comparison.isGap(current.getCharAt(j)))
570 current.deleteCharAt(j);
575 viewport.updateConservation();
576 viewport.updateConsensus();
577 alignPanel.repaint();
581 public void padGapsMenuitem_actionPerformed(ActionEvent e)
583 addHistoryItem(new HistoryItem("Pad Gaps",
587 int Width = viewport.getAlignment().getWidth()-1;
588 for (int i=0; i < viewport.getAlignment().getSequences().size();i++)
590 current = viewport.getAlignment().getSequenceAt(i);
592 if (current.getLength()<Width)
593 current.insertCharAt(Width, viewport.getGapCharacter());
595 viewport.updateConservation();
596 viewport.updateConsensus();
597 alignPanel.repaint();
601 public void findMenuItem_actionPerformed(ActionEvent e)
603 JInternalFrame frame = new JInternalFrame();
604 Finder finder = new Finder(viewport, alignPanel, frame);
605 frame.setContentPane(finder);
606 Desktop.addInternalFrame(frame, "Find", 340,110);
607 frame.setLayer(JLayeredPane.PALETTE_LAYER);
612 public void font_actionPerformed(ActionEvent e)
614 FontChooser fc = new FontChooser( alignPanel );
617 protected void fullSeqId_actionPerformed(ActionEvent e)
619 viewport.setShowFullId( fullSeqId.isSelected() );
621 alignPanel.idPanel.idCanvas.setPreferredSize( alignPanel.calculateIdWidth() );
622 alignPanel.repaint();
625 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
627 viewport.setColourText( colourTextMenuItem.isSelected() );
628 alignPanel.repaint();
631 protected void wrapMenuItem_actionPerformed(ActionEvent e)
633 viewport.setWrapAlignment( wrapMenuItem.isSelected() );
634 alignPanel.setWrapAlignment( wrapMenuItem.isSelected() );
635 scaleAbove.setVisible( wrapMenuItem.isSelected() );
636 scaleLeft.setVisible( wrapMenuItem.isSelected() );
637 scaleRight.setVisible( wrapMenuItem.isSelected() );
638 alignPanel.repaint();
641 protected void scaleAbove_actionPerformed(ActionEvent e)
643 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
644 alignPanel.repaint();
647 protected void scaleLeft_actionPerformed(ActionEvent e)
649 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
650 alignPanel.repaint();
653 protected void scaleRight_actionPerformed(ActionEvent e)
655 viewport.setScaleRightWrapped(scaleRight.isSelected());
656 alignPanel.repaint();
661 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
663 viewport.setShowBoxes( viewBoxesMenuItem.isSelected() );
664 alignPanel.repaint();
667 public void viewTextMenuItem_actionPerformed(ActionEvent e)
669 viewport.setShowText( viewTextMenuItem.isSelected() );
670 alignPanel.repaint();
674 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
676 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
677 alignPanel.repaint();
680 public void sequenceFeatures_actionPerformed(ActionEvent evt)
682 viewport.showSequenceFeatures(sequenceFeatures.isSelected());
683 if(viewport.showSequenceFeatures && !((Alignment)viewport.alignment).featuresAdded)
685 SequenceFeatureFetcher sft = new SequenceFeatureFetcher(viewport.alignment, alignPanel);
686 ((Alignment)viewport.alignment).featuresAdded = true;
688 alignPanel.repaint();
691 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
693 if(annotationPanelMenuItem.isSelected() && viewport.getWrapAlignment())
695 annotationPanelMenuItem.setSelected(false);
698 viewport.setShowAnnotation( annotationPanelMenuItem.isSelected() );
699 alignPanel.setAnnotationVisible( annotationPanelMenuItem.isSelected() );
702 public void overviewMenuItem_actionPerformed(ActionEvent e)
704 if (alignPanel.overviewPanel != null)
707 JInternalFrame frame = new JInternalFrame();
708 OverviewPanel overview = new OverviewPanel(alignPanel);
709 frame.setContentPane(overview);
710 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
711 frame.getWidth(), frame.getHeight());
713 frame.setLayer(JLayeredPane.PALETTE_LAYER);
714 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
715 { public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt)
717 alignPanel.setOverviewPanel(null);
721 alignPanel.setOverviewPanel( overview );
726 protected void noColourmenuItem_actionPerformed(ActionEvent e)
728 changeColour( null );
732 public void clustalColour_actionPerformed(ActionEvent e)
734 abovePIDThreshold.setSelected(false);
735 changeColour(new ClustalxColourScheme(viewport.alignment.getSequences(), viewport.alignment.getWidth()));
738 public void zappoColour_actionPerformed(ActionEvent e)
740 changeColour(new ZappoColourScheme());
743 public void taylorColour_actionPerformed(ActionEvent e)
745 changeColour(new TaylorColourScheme());
749 public void hydrophobicityColour_actionPerformed(ActionEvent e)
751 changeColour( new HydrophobicColourScheme() );
754 public void helixColour_actionPerformed(ActionEvent e)
756 changeColour(new HelixColourScheme() );
760 public void strandColour_actionPerformed(ActionEvent e)
762 changeColour(new StrandColourScheme());
766 public void turnColour_actionPerformed(ActionEvent e)
768 changeColour(new TurnColourScheme());
772 public void buriedColour_actionPerformed(ActionEvent e)
774 changeColour(new BuriedColourScheme() );
777 public void nucleotideColour_actionPerformed(ActionEvent e)
779 changeColour(new NucleotideColourScheme());
783 protected void applyToAllGroups_actionPerformed(ActionEvent e)
785 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
790 void changeColour(ColourSchemeI cs)
794 if ( viewport.getAbovePIDThreshold() )
796 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs, "Background");
798 if (cs instanceof ResidueColourScheme)
799 ( (ResidueColourScheme) cs).setThreshold(threshold);
800 else if (cs instanceof ScoreColourScheme)
801 ( (ScoreColourScheme) cs).setThreshold(threshold);
803 viewport.setGlobalColourScheme(cs);
805 else if (cs instanceof ResidueColourScheme)
806 ( (ResidueColourScheme) cs).setThreshold(0);
807 else if (cs instanceof ScoreColourScheme)
808 ( (ScoreColourScheme) cs).setThreshold(0);
812 if (viewport.getConservationSelected())
814 ConservationColourScheme ccs = null;
816 Alignment al = (Alignment) viewport.alignment;
817 Conservation c = new Conservation("All",
818 ResidueProperties.propHash, 3,
819 al.getSequences(), 0,
823 c.verdict(false, viewport.ConsPercGaps);
825 ccs = new ConservationColourScheme(c, cs);
827 // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!
828 ccs.setConsensus( viewport.vconsensus );
829 viewport.setGlobalColourScheme(ccs);
831 SliderPanel.setConservationSlider(alignPanel, ccs, "Background");
836 // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!
838 cs.setConsensus(viewport.vconsensus);
839 viewport.setGlobalColourScheme(cs);
843 if(viewport.getColourAppliesToAllGroups())
845 Vector groups = viewport.alignment.getGroups();
846 for(int i=0; i<groups.size(); i++)
848 SequenceGroup sg = (SequenceGroup)groups.elementAt(i);
850 if (cs instanceof ClustalxColourScheme)
852 sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());
857 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
858 }catch(Exception ex){ex.printStackTrace();}
861 if(viewport.getAbovePIDThreshold())
863 if (sg.cs instanceof ResidueColourScheme)
864 ( (ResidueColourScheme) sg.cs).setThreshold(threshold);
865 else if (sg.cs instanceof ScoreColourScheme)
866 ( (ScoreColourScheme) sg.cs).setThreshold(threshold);
868 sg.cs.setConsensus( AAFrequency.calculate(sg.sequences, 0, sg.getWidth()) );
871 if( viewport.getConservationSelected() )
873 Conservation c = new Conservation("Group",
874 ResidueProperties.propHash, 3,
875 sg.sequences, 0, viewport.alignment.getWidth()-1);
877 c.verdict(false, viewport.ConsPercGaps);
878 ConservationColourScheme ccs = new ConservationColourScheme(c, sg.cs);
880 // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!
881 ccs.setConsensus( AAFrequency.calculate(sg.sequences, 0, sg.getWidth()));
886 // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!
887 sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0, sg.getWidth()));
893 if(alignPanel.getOverviewPanel()!=null)
894 alignPanel.getOverviewPanel().updateOverviewImage();
895 alignPanel.repaint();
898 protected void modifyPID_actionPerformed(ActionEvent e)
900 if(viewport.getAbovePIDThreshold())
902 SliderPanel.setPIDSliderSource(alignPanel, viewport.getGlobalColourScheme(),
904 SliderPanel.showPIDSlider();
908 protected void modifyConservation_actionPerformed(ActionEvent e)
910 if(viewport.getConservationSelected())
912 SliderPanel.setConservationSlider(alignPanel, viewport.globalColourScheme,
914 SliderPanel.showConservationSlider();
919 protected void conservationMenuItem_actionPerformed(ActionEvent e)
921 viewport.setConservationSelected(conservationMenuItem.isSelected());
923 viewport.setAbovePIDThreshold(false);
924 abovePIDThreshold.setSelected(false);
926 ColourSchemeI cs = viewport.getGlobalColourScheme();
927 if(cs instanceof ConservationColourScheme )
928 changeColour( ((ConservationColourScheme)cs).cs );
932 modifyConservation_actionPerformed(null);
935 public void abovePIDThreshold_actionPerformed(ActionEvent e)
937 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
939 conservationMenuItem.setSelected(false);
940 viewport.setConservationSelected(false);
942 ColourSchemeI cs = viewport.getGlobalColourScheme();
944 if(cs instanceof ConservationColourScheme )
945 changeColour( ((ConservationColourScheme)cs).cs );
949 modifyPID_actionPerformed(null);
954 public void userDefinedColour_actionPerformed(ActionEvent e)
956 UserDefinedColours chooser = new UserDefinedColours( alignPanel, null);
959 public void PIDColour_actionPerformed(ActionEvent e)
961 changeColour( new PIDColourScheme() );
965 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
967 changeColour(new Blosum62ColourScheme() );
972 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
974 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment, HistoryItem.SORT));
975 AlignmentSorter.sortByPID(viewport.getAlignment(), viewport.getAlignment().getSequenceAt(0));
976 alignPanel.repaint();
979 public void sortIDMenuItem_actionPerformed(ActionEvent e)
981 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment, HistoryItem.SORT));
982 AlignmentSorter.sortByID( viewport.getAlignment() );
983 alignPanel.repaint();
986 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
988 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment, HistoryItem.SORT));
989 AlignmentSorter.sortByGroup(viewport.getAlignment());
990 AlignmentSorter.sortGroups(viewport.getAlignment());
991 alignPanel.repaint();
994 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
996 RedundancyPanel sp = new RedundancyPanel(alignPanel);
997 JInternalFrame frame = new JInternalFrame();
998 frame.setContentPane(sp);
999 Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400, 100, false);
1003 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
1005 if(viewport.getSelectionGroup().getSize()<2)
1006 JOptionPane.showInternalMessageDialog(this, "You must select at least 2 sequences.", "Invalid Selection", JOptionPane.WARNING_MESSAGE);
1009 JInternalFrame frame = new JInternalFrame();
1010 frame.setContentPane(new PairwiseAlignPanel(viewport));
1011 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
1015 public void PCAMenuItem_actionPerformed(ActionEvent e)
1018 if( (viewport.getSelectionGroup()!=null && viewport.getSelectionGroup().getSize()<4 && viewport.getSelectionGroup().getSize()>0)
1019 || viewport.getAlignment().getHeight()<4)
1021 JOptionPane.showInternalMessageDialog(this, "Principal component analysis must take\n"
1022 +"at least 4 input sequences.",
1023 "Sequence selection insufficient",
1024 JOptionPane.WARNING_MESSAGE);
1029 PCAPanel pcaPanel = new PCAPanel(viewport, null);
1030 JInternalFrame frame = new JInternalFrame();
1031 frame.setContentPane(pcaPanel);
1032 Desktop.addInternalFrame(frame, "Principal component analysis", 400, 400);
1033 }catch(java.lang.OutOfMemoryError ex)
1035 JOptionPane.showInternalMessageDialog(this, "Too many sequences selected\nfor Principal Component Analysis!!",
1036 "Out of memory", JOptionPane.WARNING_MESSAGE);
1042 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
1044 NewTreePanel("AV", "PID", "Average distance tree using PID");
1047 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
1049 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
1053 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
1055 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
1058 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
1060 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62PID");
1063 void NewTreePanel(String type, String pwType, String title)
1065 //are the sequences aligned?
1066 if(!viewport.alignment.isAligned())
1068 JOptionPane.showMessageDialog(Desktop.desktop, "The sequences must be aligned before creating a tree.",
1069 "Sequences not aligned", JOptionPane.WARNING_MESSAGE);
1074 if (viewport.getSelectionGroup() != null &&
1075 viewport.getSelectionGroup().getSize() > 3)
1077 tp = new TreePanel(viewport, viewport.getSelectionGroup().sequences, type,
1079 0, viewport.alignment.getWidth());
1083 tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),
1084 type, pwType, 0, viewport.alignment.getWidth());
1087 addTreeMenuItem(tp, title);
1089 Desktop.addInternalFrame(tp, title, 600, 500);
1092 public void addSortByOrderMenuItem(String title, final AlignmentOrder order) {
1093 final JMenuItem item = new JMenuItem("by "+title);
1095 item.addActionListener(new java.awt.event.ActionListener()
1097 public void actionPerformed(ActionEvent e)
1099 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
1101 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
1102 AlignmentSorter.sortBy(viewport.getAlignment(), order);
1103 alignPanel.repaint();
1108 void addTreeMenuItem(final TreePanel treePanel, String title)
1110 final JMenuItem item = new JMenuItem(title);
1115 sort.add(sortByTreeMenu);
1117 sortByTreeMenu.add(item);
1118 item.addActionListener(new java.awt.event.ActionListener()
1120 public void actionPerformed(ActionEvent e)
1122 addHistoryItem(new HistoryItem("Tree Sort", viewport.alignment,
1124 AlignmentSorter.sortByTree(viewport.getAlignment(), treePanel.getTree());
1125 alignPanel.repaint();
1129 treePanel.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
1131 public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt)
1134 sortByTreeMenu.remove(item);
1136 sort.remove(sortByTreeMenu);
1143 public void clustalAlignMenuItem_actionPerformed(ActionEvent e)
1145 // TODO:resolve which menu item was actually selected
1146 // Now, check we have enough sequences
1147 SequenceI[] msa=null;
1148 if (viewport.getSelectionGroup() != null && viewport.getSelectionGroup().getSize()>1)
1150 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
1151 SequenceGroup seqs = viewport.getSelectionGroup();
1153 msa = new SequenceI[sz=seqs.getSize()];
1154 for (int i = 0; i < sz; i++)
1156 msa[i] = (SequenceI) seqs.getSequenceAt(i);
1162 Vector seqs = viewport.getAlignment().getSequences();
1164 if (seqs.size() > 1) {
1165 msa = new SequenceI[seqs.size()];
1166 for (int i = 0; i < seqs.size(); i++)
1168 msa[i] = (SequenceI) seqs.elementAt(i);
1175 jalview.ws.MsaWSClient ct = new jalview.ws.MsaWSClient("ClustalWS", title, msa, true, true);
1179 protected void jpred_actionPerformed(ActionEvent e)
1182 if (viewport.getSelectionGroup() != null && viewport.getSelectionGroup().getSize()>0)
1184 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
1185 SequenceGroup seqs = viewport.getSelectionGroup();
1186 if (seqs.getSize() == 1 || !viewport.alignment.isAligned())
1188 JPredClient ct = new JPredClient( (SequenceI)seqs.getSequenceAt(0));
1193 SequenceI[] msa = new SequenceI[sz=seqs.getSize()];
1194 for (int i = 0; i < sz; i++)
1196 msa[i] = (SequenceI) seqs.getSequenceAt(i);
1199 JPredClient ct = new JPredClient(title, msa);
1205 Vector seqs = viewport.getAlignment().getSequences();
1207 if (seqs.size() == 1 || !viewport.alignment.isAligned())
1209 JPredClient ct = new JPredClient( (SequenceI)
1214 SequenceI[] msa = new SequenceI[seqs.size()];
1215 for (int i = 0; i < seqs.size(); i++)
1217 msa[i] = (SequenceI) seqs.elementAt(i);
1220 JPredClient ct = new JPredClient(title, msa);
1225 protected void msaAlignMenuItem_actionPerformed(ActionEvent e)
1227 // TODO:resolve which menu item was actually selected
1228 // Now, check we have enough sequences
1229 SequenceI[] msa=null;
1230 if (viewport.getSelectionGroup() != null && viewport.getSelectionGroup().getSize()>1)
1232 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
1233 SequenceGroup seqs = viewport.getSelectionGroup();
1235 msa = new SequenceI[sz=seqs.getSize()];
1236 for (int i = 0; i < sz; i++)
1238 msa[i] = (SequenceI) seqs.getSequenceAt(i);
1245 Vector seqs = viewport.getAlignment().getSequences();
1247 if (seqs.size() > 1) {
1248 msa = new SequenceI[seqs.size()];
1249 for (int i = 0; i < seqs.size(); i++)
1251 msa[i] = (SequenceI) seqs.elementAt(i);
1258 MsaWSClient ct = new jalview.ws.MsaWSClient("MuscleWS",title, msa, true, true);
1261 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e) {
1262 // Pick the tree file
1263 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
1264 getProperty("LAST_DIRECTORY"));
1265 chooser.setFileView(new JalviewFileView());
1266 chooser.setDialogTitle("Select a newick-like tree file");
1267 chooser.setToolTipText("Load a tree file");
1268 int value = chooser.showOpenDialog(null);
1269 if (value == JalviewFileChooser.APPROVE_OPTION)
1271 String choice = chooser.getSelectedFile().getPath();
1272 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
1275 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice, "File");
1276 ShowNewickTree(fin, choice);
1278 catch (Exception ex)
1280 JOptionPane.showMessageDialog(Desktop.desktop,
1281 "Problem reading tree file",
1283 JOptionPane.WARNING_MESSAGE);
1284 ex.printStackTrace();
1289 public void ShowNewickTree(NewickFile nf, String title)
1293 if (nf.getTree() != null)
1295 TreePanel tp = new TreePanel(viewport,
1296 viewport.getAlignment().getSequences(),
1297 nf, "FromFile", title);
1298 Desktop.addInternalFrame(tp, title, 600, 500);
1299 addTreeMenuItem(tp, title);
1300 viewport.setCurrentTree(tp.getTree());
1302 }catch(Exception ex){ex.printStackTrace();}