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.*;
29 import java.beans.PropertyChangeEvent;
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();
81 jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT", currentFileFormat);
83 if (currentFileFormat.equals("Jalview"))
85 String shortName = title.replace('/', '_');
86 title = title.replace('\\', '_');
87 String choice = chooser.getSelectedFile().getPath();
88 Jalview2XML.SaveState(this, choice, shortName);
89 // USE Jalview2XML to save this file
93 String choice = chooser.getSelectedFile().getPath();
94 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
95 String output = FormatAdapter.formatSequences(currentFileFormat, viewport.getAlignment().getSequences());
97 java.io.PrintWriter out = new java.io.PrintWriter( new java.io.FileWriter( choice ) );
101 catch(Exception ex){}
106 protected void outputText_actionPerformed(ActionEvent e)
108 CutAndPasteTransfer cap = new CutAndPasteTransfer(false);
109 JInternalFrame frame = new JInternalFrame();
110 cap.formatForOutput();
111 frame.setContentPane(cap);
112 Desktop.addInternalFrame(frame, "Alignment output - "+e.getActionCommand(), 600, 500);
113 cap.setText( FormatAdapter.formatSequences(e.getActionCommand(), viewport.getAlignment().getSequences()));
116 protected void htmlMenuItem_actionPerformed(ActionEvent e)
118 HTMLOutput htmlOutput = new HTMLOutput(viewport);
122 protected void createPNG_actionPerformed(ActionEvent e)
124 alignPanel.makePNG();
127 protected void epsFile_actionPerformed(ActionEvent e)
129 alignPanel.makeEPS();
133 public void printMenuItem_actionPerformed(ActionEvent e)
135 //Putting in a thread avoids Swing painting problems
136 PrintThread thread = new PrintThread();
140 class PrintThread extends Thread
144 PrinterJob printJob = PrinterJob.getPrinterJob();
145 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
146 printJob.setPrintable(alignPanel, pf);
147 if (printJob.printDialog())
153 catch (Exception PrintException)
155 PrintException.printStackTrace();
165 public void closeMenuItem_actionPerformed(ActionEvent e)
168 this.setClosed(true);
169 }catch(Exception ex){}
172 Stack historyList = new Stack();
173 Stack redoList = new Stack();
174 private int treeCount = 0;
176 void updateEditMenuBar()
178 if(historyList.size()>0)
180 undoMenuItem.setEnabled(true);
181 HistoryItem hi = (HistoryItem)historyList.peek();
182 undoMenuItem.setText("Undo "+hi.getDescription());
186 undoMenuItem.setEnabled(false);
187 undoMenuItem.setText("Undo");
190 if(redoList.size()>0)
192 redoMenuItem.setEnabled(true);
193 HistoryItem hi = (HistoryItem)redoList.peek();
194 redoMenuItem.setText("Redo "+hi.getDescription());
198 redoMenuItem.setEnabled(false);
199 redoMenuItem.setText("Redo");
203 public void addHistoryItem(HistoryItem hi)
205 historyList.push(hi);
209 protected void undoMenuItem_actionPerformed(ActionEvent e)
211 HistoryItem hi = (HistoryItem)historyList.pop();
212 redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment, HistoryItem.HIDE));
213 restoreHistoryItem(hi);
217 protected void redoMenuItem_actionPerformed(ActionEvent e)
219 HistoryItem hi = (HistoryItem)redoList.pop();
220 restoreHistoryItem(hi);
222 viewport.updateConsensus();
223 alignPanel.repaint();
224 alignPanel.repaint();
228 // used by undo and redo
229 void restoreHistoryItem(HistoryItem hi)
231 if(hi.getType()== HistoryItem.SORT)
233 for(int i=0; i<hi.getSequences().size(); i++)
234 viewport.alignment.getSequences().setElementAt(hi.getSequences().elementAt(i), i);
238 for (int i = 0; i < hi.getSequences().size(); i++)
240 SequenceI restore = (SequenceI) hi.getSequences().elementAt(i);
241 if(restore.getLength()==0)
243 restore.setSequence(hi.getHidden().elementAt(i).toString());
244 viewport.alignment.getSequences().insertElementAt(
246 hi.getAlignIndex(i));
249 restore.setSequence(hi.getHidden().elementAt(i).toString());
251 if(hi.getType()==HistoryItem.PASTE)
253 for(int i=viewport.alignment.getHeight()-1;i>hi.getSequences().size()-1; i--)
254 viewport.alignment.deleteSequence(i);
257 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
260 viewport.updateConsensus();
261 viewport.updateConservation();
262 alignPanel.repaint();
265 public void moveSelectedSequences(boolean up)
267 SequenceGroup sg = viewport.getSelectionGroup();
273 for (int i = 1; i < viewport.alignment.getHeight(); i++)
275 SequenceI seq = viewport.alignment.getSequenceAt(i);
276 if (!sg.sequences.contains(seq))
279 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
280 if (sg.sequences.contains(temp))
283 viewport.alignment.getSequences().setElementAt(temp, i);
284 viewport.alignment.getSequences().setElementAt(seq, i - 1);
289 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
291 SequenceI seq = viewport.alignment.getSequenceAt(i);
292 if (!sg.sequences.contains(seq))
295 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
296 if (sg.sequences.contains(temp))
299 viewport.alignment.getSequences().setElementAt(temp, i);
300 viewport.alignment.getSequences().setElementAt(seq, i + 1);
304 alignPanel.repaint();
309 protected void copy_actionPerformed(ActionEvent e)
311 if(viewport.getSelectionGroup()==null)
314 SequenceGroup sg = viewport.getSelectionGroup();
316 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
317 StringBuffer buffer= new StringBuffer();
319 Hashtable orderedSeqs = new Hashtable();
320 for(int i=0; i<sg.getSize(); i++)
322 SequenceI seq = sg.getSequenceAt(i);
323 int index = viewport.alignment.findIndex(seq);
324 orderedSeqs.put(index+"", seq);
328 for(int i=0; i<sg.getSize(); i++)
330 SequenceI seq = null;
333 if(orderedSeqs.containsKey(index+""))
335 seq = (SequenceI) orderedSeqs.get(index + "");
343 buffer.append( seq.getName()+"\t"+seq.findPosition( sg.getStartRes() ) +"\t"
344 +seq.findPosition( sg.getEndRes() )+ "\t"
345 +sg.getSequenceAt(i).getSequence(sg.getStartRes(), sg.getEndRes()+1)+"\n");
347 c.setContents( new StringSelection( buffer.toString()) , null ) ;
352 protected void pasteNew_actionPerformed(ActionEvent e)
357 protected void pasteThis_actionPerformed(ActionEvent e)
359 addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment, HistoryItem.PASTE));
363 void paste(boolean newAlignment)
366 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
367 Transferable contents = c.getContents(this);
368 if (contents == null)
371 String str = (String) contents.getTransferData(DataFlavor.stringFlavor);
372 StringTokenizer st = new StringTokenizer(str);
373 ArrayList seqs = new ArrayList();
374 while (st.hasMoreElements())
376 String name = st.nextToken();
377 int start = Integer.parseInt(st.nextToken());
378 int end = Integer.parseInt(st.nextToken());
379 Sequence sequence = new Sequence(name,st.nextToken(), start, end);
382 viewport.alignment.addSequence(sequence);
389 SequenceI[] newSeqs = new SequenceI[seqs.size()];
390 seqs.toArray(newSeqs);
391 AlignFrame af = new AlignFrame(new Alignment(newSeqs));
392 String newtitle = new String("Copied sequences");
393 if( title.startsWith("Copied sequences"))
396 newtitle = newtitle.concat("- from "+title);
398 Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH, NEW_WINDOW_HEIGHT);
402 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
403 viewport.setEndSeq(viewport.alignment.getHeight());
404 viewport.alignment.getWidth();
405 viewport.updateConservation();
406 viewport.updateConsensus();
407 alignPanel.repaint();
410 }catch(Exception ex){}// could be anything being pasted in here
415 protected void cut_actionPerformed(ActionEvent e)
417 copy_actionPerformed(null);
418 delete_actionPerformed(null);
421 protected void delete_actionPerformed(ActionEvent e)
423 boolean seqsdeleted=false;
424 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment, HistoryItem.HIDE));
426 if (viewport.getSelectionGroup() == null)
429 SequenceGroup sg = viewport.getSelectionGroup();
430 for (int i=0;i < sg.sequences.size(); i++)
432 SequenceI seq = sg.getSequenceAt(i);
433 int index = viewport.getAlignment().findIndex(seq);
434 seq.deleteChars(sg.getStartRes(),sg.getEndRes()+1);
436 if(seq.getSequence().length()<1) {
438 viewport.getAlignment().deleteSequence(seq);
440 viewport.getAlignment().getSequences().setElementAt(seq, index);
444 viewport.setSelectionGroup(null);
445 viewport.alignment.deleteGroup(sg);
447 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
448 viewport.resetSeqLimits( alignPanel.seqPanel.seqCanvas.getHeight());
449 if(viewport.getAlignment().getHeight()<1)
452 this.setClosed(true);
453 }catch(Exception ex){}
454 viewport.updateConservation();
455 viewport.updateConsensus();
456 alignPanel.repaint();
460 protected void deleteGroups_actionPerformed(ActionEvent e)
462 viewport.alignment.deleteAllGroups();
463 viewport.setSelectionGroup(null);
464 alignPanel.repaint();
469 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
471 SequenceGroup sg = new SequenceGroup();
472 for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)
473 sg.addSequence( viewport.getAlignment().getSequenceAt(i));
474 sg.setEndRes(viewport.alignment.getWidth());
475 viewport.setSelectionGroup(sg);
476 PaintRefresher.Refresh(null);
479 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
481 viewport.setSelectionGroup(null);
482 viewport.getColumnSelection().clear();
483 viewport.setSelectionGroup(null);
484 PaintRefresher.Refresh(null);
487 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
489 SequenceGroup sg = viewport.getSelectionGroup();
490 for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)
491 sg.addOrRemove (viewport.getAlignment().getSequenceAt(i));
493 PaintRefresher.Refresh(null);
496 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
498 ColumnSelection colSel = viewport.getColumnSelection();
499 if (colSel.size() > 0)
501 addHistoryItem(new HistoryItem("Remove Left",viewport.alignment,
503 int min = colSel.getMin();
504 viewport.getAlignment().trimLeft(min);
505 colSel.compensateForEdit(0,min);
507 if(viewport.getSelectionGroup()!=null)
508 viewport.getSelectionGroup().adjustForRemoveLeft(min);
510 Vector groups = viewport.alignment.getGroups();
511 for(int i=0; i<groups.size(); i++)
513 SequenceGroup sg = (SequenceGroup) groups.get(i);
514 if(!sg.adjustForRemoveLeft(min))
515 viewport.alignment.deleteGroup(sg);
518 alignPanel.repaint();
522 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
524 ColumnSelection colSel = viewport.getColumnSelection();
525 if (colSel.size() > 0)
527 addHistoryItem(new HistoryItem("Remove Right",viewport.alignment,
530 int max = colSel.getMax();
531 viewport.getAlignment().trimRight(max);
532 if(viewport.getSelectionGroup()!=null)
533 viewport.getSelectionGroup().adjustForRemoveRight(max);
535 Vector groups = viewport.alignment.getGroups();
536 for(int i=0; i<groups.size(); i++)
538 SequenceGroup sg = (SequenceGroup) groups.get(i);
539 if(!sg.adjustForRemoveRight(max))
540 viewport.alignment.deleteGroup(sg);
545 alignPanel.repaint();
550 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
552 addHistoryItem(new HistoryItem("Remove Gapped Columns",
556 viewport.getAlignment().removeGaps();
557 viewport.updateConservation();
558 viewport.updateConsensus();
559 alignPanel.repaint();
562 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
564 addHistoryItem(new HistoryItem("Remove Gaps",
569 for (int i=0; i < viewport.getAlignment().getSequences().size();i++)
571 current = viewport.getAlignment().getSequenceAt(i);
572 jSize = current.getLength();
573 for (int j=0; j < jSize; j++)
574 if(jalview.util.Comparison.isGap(current.getCharAt(j)))
576 current.deleteCharAt(j);
581 viewport.updateConservation();
582 viewport.updateConsensus();
583 alignPanel.repaint();
587 public void padGapsMenuitem_actionPerformed(ActionEvent e)
589 addHistoryItem(new HistoryItem("Pad Gaps",
593 int Width = viewport.getAlignment().getWidth()-1;
594 for (int i=0; i < viewport.getAlignment().getSequences().size();i++)
596 current = viewport.getAlignment().getSequenceAt(i);
598 if (current.getLength()<Width)
599 current.insertCharAt(Width, viewport.getGapCharacter());
601 viewport.updateConservation();
602 viewport.updateConsensus();
603 alignPanel.repaint();
607 public void findMenuItem_actionPerformed(ActionEvent e)
609 JInternalFrame frame = new JInternalFrame();
610 Finder finder = new Finder(viewport, alignPanel, frame);
611 frame.setContentPane(finder);
612 Desktop.addInternalFrame(frame, "Find", 340,110);
613 frame.setLayer(JLayeredPane.PALETTE_LAYER);
618 public void font_actionPerformed(ActionEvent e)
620 FontChooser fc = new FontChooser( alignPanel );
623 protected void fullSeqId_actionPerformed(ActionEvent e)
625 viewport.setShowFullId( fullSeqId.isSelected() );
627 alignPanel.idPanel.idCanvas.setPreferredSize( alignPanel.calculateIdWidth() );
628 alignPanel.repaint();
631 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
633 viewport.setColourText( colourTextMenuItem.isSelected() );
634 alignPanel.repaint();
637 protected void wrapMenuItem_actionPerformed(ActionEvent e)
639 viewport.setWrapAlignment( wrapMenuItem.isSelected() );
640 alignPanel.setWrapAlignment( wrapMenuItem.isSelected() );
641 scaleAbove.setVisible( wrapMenuItem.isSelected() );
642 scaleLeft.setVisible( wrapMenuItem.isSelected() );
643 scaleRight.setVisible( wrapMenuItem.isSelected() );
644 alignPanel.repaint();
647 protected void scaleAbove_actionPerformed(ActionEvent e)
649 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
650 alignPanel.repaint();
653 protected void scaleLeft_actionPerformed(ActionEvent e)
655 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
656 alignPanel.repaint();
659 protected void scaleRight_actionPerformed(ActionEvent e)
661 viewport.setScaleRightWrapped(scaleRight.isSelected());
662 alignPanel.repaint();
667 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
669 viewport.setShowBoxes( viewBoxesMenuItem.isSelected() );
670 alignPanel.repaint();
673 public void viewTextMenuItem_actionPerformed(ActionEvent e)
675 viewport.setShowText( viewTextMenuItem.isSelected() );
676 alignPanel.repaint();
680 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
682 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
683 alignPanel.repaint();
686 public void sequenceFeatures_actionPerformed(ActionEvent evt)
688 viewport.showSequenceFeatures(sequenceFeatures.isSelected());
689 if(viewport.showSequenceFeatures && !((Alignment)viewport.alignment).featuresAdded)
691 SequenceFeatureFetcher sft = new SequenceFeatureFetcher(viewport.alignment, alignPanel);
692 ((Alignment)viewport.alignment).featuresAdded = true;
694 alignPanel.repaint();
697 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
699 if(annotationPanelMenuItem.isSelected() && viewport.getWrapAlignment())
701 annotationPanelMenuItem.setSelected(false);
704 viewport.setShowAnnotation( annotationPanelMenuItem.isSelected() );
705 alignPanel.setAnnotationVisible( annotationPanelMenuItem.isSelected() );
708 public void overviewMenuItem_actionPerformed(ActionEvent e)
710 if (alignPanel.overviewPanel != null)
713 JInternalFrame frame = new JInternalFrame();
714 OverviewPanel overview = new OverviewPanel(alignPanel);
715 frame.setContentPane(overview);
716 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
717 frame.getWidth(), frame.getHeight());
719 frame.setLayer(JLayeredPane.PALETTE_LAYER);
720 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
721 { public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt)
723 alignPanel.setOverviewPanel(null);
727 alignPanel.setOverviewPanel( overview );
732 protected void noColourmenuItem_actionPerformed(ActionEvent e)
734 changeColour( null );
738 public void clustalColour_actionPerformed(ActionEvent e)
740 abovePIDThreshold.setSelected(false);
741 changeColour(new ClustalxColourScheme(viewport.alignment.getSequences(), viewport.alignment.getWidth()));
744 public void zappoColour_actionPerformed(ActionEvent e)
746 changeColour(new ZappoColourScheme());
749 public void taylorColour_actionPerformed(ActionEvent e)
751 changeColour(new TaylorColourScheme());
755 public void hydrophobicityColour_actionPerformed(ActionEvent e)
757 changeColour( new HydrophobicColourScheme() );
760 public void helixColour_actionPerformed(ActionEvent e)
762 changeColour(new HelixColourScheme() );
766 public void strandColour_actionPerformed(ActionEvent e)
768 changeColour(new StrandColourScheme());
772 public void turnColour_actionPerformed(ActionEvent e)
774 changeColour(new TurnColourScheme());
778 public void buriedColour_actionPerformed(ActionEvent e)
780 changeColour(new BuriedColourScheme() );
783 public void nucleotideColour_actionPerformed(ActionEvent e)
785 changeColour(new NucleotideColourScheme());
789 protected void applyToAllGroups_actionPerformed(ActionEvent e)
791 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
796 void changeColour(ColourSchemeI cs)
800 if ( viewport.getAbovePIDThreshold() )
802 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs, "Background");
804 if (cs instanceof ResidueColourScheme)
805 ( (ResidueColourScheme) cs).setThreshold(threshold);
806 else if (cs instanceof ScoreColourScheme)
807 ( (ScoreColourScheme) cs).setThreshold(threshold);
809 viewport.setGlobalColourScheme(cs);
811 else if (cs instanceof ResidueColourScheme)
812 ( (ResidueColourScheme) cs).setThreshold(0);
813 else if (cs instanceof ScoreColourScheme)
814 ( (ScoreColourScheme) cs).setThreshold(0);
818 if (viewport.getConservationSelected())
820 ConservationColourScheme ccs = null;
822 Alignment al = (Alignment) viewport.alignment;
823 Conservation c = new Conservation("All",
824 ResidueProperties.propHash, 3,
825 al.getSequences(), 0,
829 c.verdict(false, viewport.ConsPercGaps);
831 ccs = new ConservationColourScheme(c, cs);
833 // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!
834 ccs.setConsensus( viewport.vconsensus );
835 viewport.setGlobalColourScheme(ccs);
837 SliderPanel.setConservationSlider(alignPanel, ccs, "Background");
842 // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!
844 cs.setConsensus(viewport.vconsensus);
845 viewport.setGlobalColourScheme(cs);
849 if(viewport.getColourAppliesToAllGroups())
851 Vector groups = viewport.alignment.getGroups();
852 for(int i=0; i<groups.size(); i++)
854 SequenceGroup sg = (SequenceGroup)groups.elementAt(i);
856 if (cs instanceof ClustalxColourScheme)
858 sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());
863 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
864 }catch(Exception ex){ex.printStackTrace();}
867 if(viewport.getAbovePIDThreshold())
869 if (sg.cs instanceof ResidueColourScheme)
870 ( (ResidueColourScheme) sg.cs).setThreshold(threshold);
871 else if (sg.cs instanceof ScoreColourScheme)
872 ( (ScoreColourScheme) sg.cs).setThreshold(threshold);
874 sg.cs.setConsensus( AAFrequency.calculate(sg.sequences, 0, sg.getWidth()) );
877 if( viewport.getConservationSelected() )
879 Conservation c = new Conservation("Group",
880 ResidueProperties.propHash, 3,
881 sg.sequences, 0, viewport.alignment.getWidth()-1);
883 c.verdict(false, viewport.ConsPercGaps);
884 ConservationColourScheme ccs = new ConservationColourScheme(c, sg.cs);
886 // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!
887 ccs.setConsensus( AAFrequency.calculate(sg.sequences, 0, sg.getWidth()));
892 // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!
893 sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0, sg.getWidth()));
899 if(alignPanel.getOverviewPanel()!=null)
900 alignPanel.getOverviewPanel().updateOverviewImage();
901 alignPanel.repaint();
904 protected void modifyPID_actionPerformed(ActionEvent e)
906 if(viewport.getAbovePIDThreshold())
908 SliderPanel.setPIDSliderSource(alignPanel, viewport.getGlobalColourScheme(),
910 SliderPanel.showPIDSlider();
914 protected void modifyConservation_actionPerformed(ActionEvent e)
916 if(viewport.getConservationSelected())
918 SliderPanel.setConservationSlider(alignPanel, viewport.globalColourScheme,
920 SliderPanel.showConservationSlider();
925 protected void conservationMenuItem_actionPerformed(ActionEvent e)
927 viewport.setConservationSelected(conservationMenuItem.isSelected());
929 viewport.setAbovePIDThreshold(false);
930 abovePIDThreshold.setSelected(false);
932 ColourSchemeI cs = viewport.getGlobalColourScheme();
933 if(cs instanceof ConservationColourScheme )
934 changeColour( ((ConservationColourScheme)cs).cs );
938 modifyConservation_actionPerformed(null);
941 public void abovePIDThreshold_actionPerformed(ActionEvent e)
943 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
945 conservationMenuItem.setSelected(false);
946 viewport.setConservationSelected(false);
948 ColourSchemeI cs = viewport.getGlobalColourScheme();
950 if(cs instanceof ConservationColourScheme )
951 changeColour( ((ConservationColourScheme)cs).cs );
955 modifyPID_actionPerformed(null);
960 public void userDefinedColour_actionPerformed(ActionEvent e)
962 UserDefinedColours chooser = new UserDefinedColours( alignPanel, null);
965 public void PIDColour_actionPerformed(ActionEvent e)
967 changeColour( new PIDColourScheme() );
971 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
973 changeColour(new Blosum62ColourScheme() );
978 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
980 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment, HistoryItem.SORT));
981 AlignmentSorter.sortByPID(viewport.getAlignment(), viewport.getAlignment().getSequenceAt(0));
982 alignPanel.repaint();
985 public void sortIDMenuItem_actionPerformed(ActionEvent e)
987 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment, HistoryItem.SORT));
988 AlignmentSorter.sortByID( viewport.getAlignment() );
989 alignPanel.repaint();
992 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
994 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment, HistoryItem.SORT));
995 AlignmentSorter.sortByGroup(viewport.getAlignment());
996 AlignmentSorter.sortGroups(viewport.getAlignment());
997 alignPanel.repaint();
1000 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
1002 RedundancyPanel sp = new RedundancyPanel(alignPanel);
1003 JInternalFrame frame = new JInternalFrame();
1004 frame.setContentPane(sp);
1005 Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400, 100, false);
1009 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
1011 if(viewport.getSelectionGroup().getSize()<2)
1012 JOptionPane.showInternalMessageDialog(this, "You must select at least 2 sequences.", "Invalid Selection", JOptionPane.WARNING_MESSAGE);
1015 JInternalFrame frame = new JInternalFrame();
1016 frame.setContentPane(new PairwiseAlignPanel(viewport));
1017 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
1021 public void PCAMenuItem_actionPerformed(ActionEvent e)
1024 if( (viewport.getSelectionGroup()!=null && viewport.getSelectionGroup().getSize()<4 && viewport.getSelectionGroup().getSize()>0)
1025 || viewport.getAlignment().getHeight()<4)
1027 JOptionPane.showInternalMessageDialog(this, "Principal component analysis must take\n"
1028 +"at least 4 input sequences.",
1029 "Sequence selection insufficient",
1030 JOptionPane.WARNING_MESSAGE);
1035 PCAPanel pcaPanel = new PCAPanel(viewport, null);
1036 JInternalFrame frame = new JInternalFrame();
1037 frame.setContentPane(pcaPanel);
1038 Desktop.addInternalFrame(frame, "Principal component analysis", 400, 400);
1039 }catch(java.lang.OutOfMemoryError ex)
1041 JOptionPane.showInternalMessageDialog(this, "Too many sequences selected\nfor Principal Component Analysis!!",
1042 "Out of memory", JOptionPane.WARNING_MESSAGE);
1048 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
1050 NewTreePanel("AV", "PID", "Average distance tree using PID");
1053 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
1055 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
1059 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
1061 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
1064 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
1066 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62PID");
1069 void NewTreePanel(String type, String pwType, String title)
1071 //are the sequences aligned?
1072 if(!viewport.alignment.isAligned())
1074 JOptionPane.showMessageDialog(Desktop.desktop, "The sequences must be aligned before creating a tree.\n"
1075 +"Try using the Pad function in the edit menu.",
1076 "Sequences not aligned", JOptionPane.WARNING_MESSAGE);
1081 if (viewport.getSelectionGroup() != null &&
1082 viewport.getSelectionGroup().getSize() > 3)
1084 tp = new TreePanel(viewport, viewport.getSelectionGroup().sequences, type,
1086 0, viewport.alignment.getWidth());
1090 tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),
1091 type, pwType, 0, viewport.alignment.getWidth());
1094 addTreeMenuItem(tp, title);
1096 Desktop.addInternalFrame(tp, title, 600, 500);
1099 public void addSortByOrderMenuItem(String title, final AlignmentOrder order) {
1100 final JMenuItem item = new JMenuItem("by "+title);
1102 item.addActionListener(new java.awt.event.ActionListener()
1104 public void actionPerformed(ActionEvent e)
1106 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
1108 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
1109 AlignmentSorter.sortBy(viewport.getAlignment(), order);
1110 alignPanel.repaint();
1115 void addTreeMenuItem(final TreePanel treePanel, String title)
1117 final JMenuItem item = new JMenuItem(title);
1122 sort.add(sortByTreeMenu);
1124 sortByTreeMenu.add(item);
1125 item.addActionListener(new java.awt.event.ActionListener()
1127 public void actionPerformed(ActionEvent e)
1129 addHistoryItem(new HistoryItem("Tree Sort", viewport.alignment,
1131 AlignmentSorter.sortByTree(viewport.getAlignment(), treePanel.getTree());
1132 alignPanel.repaint();
1136 treePanel.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
1138 public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt)
1141 sortByTreeMenu.remove(item);
1143 sort.remove(sortByTreeMenu);
1146 viewport.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
1147 public void propertyChange(PropertyChangeEvent evt)
1149 if (evt.getPropertyName().equals("alignment")) {
1150 treePanel.getTree().UpdatePlaceHolders( (Vector) evt.getNewValue());
1151 treePanel.repaint();
1160 public void clustalAlignMenuItem_actionPerformed(ActionEvent e)
1162 // TODO:resolve which menu item was actually selected
1163 // Now, check we have enough sequences
1164 SequenceI[] msa=null;
1165 if (viewport.getSelectionGroup() != null && viewport.getSelectionGroup().getSize()>1)
1167 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
1168 SequenceGroup seqs = viewport.getSelectionGroup();
1170 msa = new SequenceI[sz=seqs.getSize()];
1171 for (int i = 0; i < sz; i++)
1173 msa[i] = (SequenceI) seqs.getSequenceAt(i);
1179 Vector seqs = viewport.getAlignment().getSequences();
1181 if (seqs.size() > 1) {
1182 msa = new SequenceI[seqs.size()];
1183 for (int i = 0; i < seqs.size(); i++)
1185 msa[i] = (SequenceI) seqs.elementAt(i);
1192 jalview.ws.MsaWSClient ct = new jalview.ws.MsaWSClient("ClustalWS", title, msa, true, true);
1196 protected void jpred_actionPerformed(ActionEvent e)
1199 SequenceI[] msa=null;
1201 if (viewport.getSelectionGroup() != null && viewport.getSelectionGroup().getSize()>0)
1203 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
1204 SequenceGroup seqs = viewport.getSelectionGroup();
1205 if (seqs.getSize() == 1 || !viewport.alignment.isAligned())
1207 seq = (SequenceI)seqs.getSequenceAt(0);
1212 msa = new SequenceI[sz=seqs.getSize()];
1213 for (int i = 0; i < sz; i++)
1215 msa[i] = (SequenceI) seqs.getSequenceAt(i);
1221 Vector seqs = viewport.getAlignment().getSequences();
1223 if (seqs.size() == 1 || !viewport.alignment.isAligned())
1225 seq = (SequenceI) seqs.elementAt(0);
1229 msa = new SequenceI[seqs.size()];
1230 for (int i = 0; i < seqs.size(); i++)
1232 msa[i] = (SequenceI) seqs.elementAt(i);
1237 JPredClient ct = new JPredClient(title, msa);
1240 JPredClient ct = new JPredClient(title, seq);
1242 System.out.print("JALVIEW ERROR! - Unexpected JPred selection state!\n");
1245 protected void msaAlignMenuItem_actionPerformed(ActionEvent e)
1247 // TODO:resolve which menu item was actually selected
1248 // Now, check we have enough sequences
1249 SequenceI[] msa=null;
1250 if (viewport.getSelectionGroup() != null && viewport.getSelectionGroup().getSize()>1)
1252 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
1253 SequenceGroup seqs = viewport.getSelectionGroup();
1255 msa = new SequenceI[sz=seqs.getSize()];
1256 for (int i = 0; i < sz; i++)
1258 msa[i] = (SequenceI) seqs.getSequenceAt(i);
1265 Vector seqs = viewport.getAlignment().getSequences();
1267 if (seqs.size() > 1) {
1268 msa = new SequenceI[seqs.size()];
1269 for (int i = 0; i < seqs.size(); i++)
1271 msa[i] = (SequenceI) seqs.elementAt(i);
1278 MsaWSClient ct = new jalview.ws.MsaWSClient("MuscleWS",title, msa, true, true);
1281 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e) {
1282 // Pick the tree file
1283 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
1284 getProperty("LAST_DIRECTORY"));
1285 chooser.setFileView(new JalviewFileView());
1286 chooser.setDialogTitle("Select a newick-like tree file");
1287 chooser.setToolTipText("Load a tree file");
1288 int value = chooser.showOpenDialog(null);
1289 if (value == JalviewFileChooser.APPROVE_OPTION)
1291 String choice = chooser.getSelectedFile().getPath();
1292 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
1295 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice, "File");
1296 ShowNewickTree(fin, choice);
1298 catch (Exception ex)
1300 JOptionPane.showMessageDialog(Desktop.desktop,
1301 "Problem reading tree file",
1303 JOptionPane.WARNING_MESSAGE);
1304 ex.printStackTrace();
1309 public void ShowNewickTree(NewickFile nf, String title)
1313 if (nf.getTree() != null)
1315 TreePanel tp = new TreePanel(viewport,
1316 viewport.getAlignment().getSequences(),
1317 nf, "FromFile", title);
1318 Desktop.addInternalFrame(tp, title, 600, 500);
1319 addTreeMenuItem(tp, title);
1320 viewport.setCurrentTree(tp.getTree());
1322 }catch(Exception ex){ex.printStackTrace();}