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();
109 JInternalFrame frame = new JInternalFrame();
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 new HTMLOutput(viewport);
120 protected void createPNG_actionPerformed(ActionEvent e)
122 alignPanel.makePNG();
125 protected void epsFile_actionPerformed(ActionEvent e)
127 alignPanel.makeEPS();
131 public void printMenuItem_actionPerformed(ActionEvent e)
133 //Putting in a thread avoids Swing painting problems
134 PrintThread thread = new PrintThread();
138 class PrintThread extends Thread
142 PrinterJob printJob = PrinterJob.getPrinterJob();
143 PageFormat pf = printJob.pageDialog(printJob.defaultPage());
144 printJob.setPrintable(alignPanel, pf);
145 if (printJob.printDialog())
151 catch (Exception PrintException)
153 PrintException.printStackTrace();
163 public void closeMenuItem_actionPerformed(ActionEvent e)
166 this.setClosed(true);
167 }catch(Exception ex){}
170 Stack historyList = new Stack();
171 Stack redoList = new Stack();
172 private int treeCount = 0;
174 void updateEditMenuBar()
176 if(historyList.size()>0)
178 undoMenuItem.setEnabled(true);
179 HistoryItem hi = (HistoryItem)historyList.peek();
180 undoMenuItem.setText("Undo "+hi.getDescription());
184 undoMenuItem.setEnabled(false);
185 undoMenuItem.setText("Undo");
188 if(redoList.size()>0)
190 redoMenuItem.setEnabled(true);
191 HistoryItem hi = (HistoryItem)redoList.peek();
192 redoMenuItem.setText("Redo "+hi.getDescription());
196 redoMenuItem.setEnabled(false);
197 redoMenuItem.setText("Redo");
201 public void addHistoryItem(HistoryItem hi)
203 historyList.push(hi);
207 protected void undoMenuItem_actionPerformed(ActionEvent e)
209 HistoryItem hi = (HistoryItem)historyList.pop();
210 redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment, HistoryItem.HIDE));
211 restoreHistoryItem(hi);
215 protected void redoMenuItem_actionPerformed(ActionEvent e)
217 HistoryItem hi = (HistoryItem)redoList.pop();
218 restoreHistoryItem(hi);
220 viewport.updateConsensus();
221 alignPanel.repaint();
222 alignPanel.repaint();
226 // used by undo and redo
227 void restoreHistoryItem(HistoryItem hi)
229 if(hi.getType()== HistoryItem.SORT)
231 for(int i=0; i<hi.getSequences().size(); i++)
232 viewport.alignment.getSequences().setElementAt(hi.getSequences().elementAt(i), i);
236 for (int i = 0; i < hi.getSequences().size(); i++)
238 SequenceI restore = (SequenceI) hi.getSequences().elementAt(i);
239 if(restore.getLength()==0)
241 restore.setSequence(hi.getHidden().elementAt(i).toString());
242 viewport.alignment.getSequences().insertElementAt(
244 hi.getAlignIndex(i));
247 restore.setSequence(hi.getHidden().elementAt(i).toString());
249 if(hi.getType()==HistoryItem.PASTE)
251 for(int i=viewport.alignment.getHeight()-1;i>hi.getSequences().size()-1; i--)
252 viewport.alignment.deleteSequence(i);
255 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
258 viewport.updateConsensus();
259 viewport.updateConservation();
260 alignPanel.repaint();
263 public void moveSelectedSequences(boolean up)
265 SequenceGroup sg = viewport.getSelectionGroup();
271 for (int i = 1; i < viewport.alignment.getHeight(); i++)
273 SequenceI seq = viewport.alignment.getSequenceAt(i);
274 if (!sg.sequences.contains(seq))
277 SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
278 if (sg.sequences.contains(temp))
281 viewport.alignment.getSequences().setElementAt(temp, i);
282 viewport.alignment.getSequences().setElementAt(seq, i - 1);
287 for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
289 SequenceI seq = viewport.alignment.getSequenceAt(i);
290 if (!sg.sequences.contains(seq))
293 SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
294 if (sg.sequences.contains(temp))
297 viewport.alignment.getSequences().setElementAt(temp, i);
298 viewport.alignment.getSequences().setElementAt(seq, i + 1);
302 alignPanel.repaint();
307 protected void copy_actionPerformed(ActionEvent e)
309 if(viewport.getSelectionGroup()==null)
312 SequenceGroup sg = viewport.getSelectionGroup();
314 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
315 StringBuffer buffer= new StringBuffer();
317 Hashtable orderedSeqs = new Hashtable();
318 for(int i=0; i<sg.getSize(); i++)
320 SequenceI seq = sg.getSequenceAt(i);
321 int index = viewport.alignment.findIndex(seq);
322 orderedSeqs.put(index+"", seq);
326 for(int i=0; i<sg.getSize(); i++)
328 SequenceI seq = null;
331 if(orderedSeqs.containsKey(index+""))
333 seq = (SequenceI) orderedSeqs.get(index + "");
341 buffer.append( seq.getName()+"\t"+seq.findPosition( sg.getStartRes() ) +"\t"
342 +seq.findPosition( sg.getEndRes() )+ "\t"
343 +sg.getSequenceAt(i).getSequence(sg.getStartRes(), sg.getEndRes()+1)+"\n");
345 c.setContents( new StringSelection( buffer.toString()) , null ) ;
350 protected void pasteNew_actionPerformed(ActionEvent e)
355 protected void pasteThis_actionPerformed(ActionEvent e)
357 addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment, HistoryItem.PASTE));
361 void paste(boolean newAlignment)
364 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
365 Transferable contents = c.getContents(this);
366 if (contents == null)
369 String str = (String) contents.getTransferData(DataFlavor.stringFlavor);
370 StringTokenizer st = new StringTokenizer(str);
371 ArrayList seqs = new ArrayList();
372 while (st.hasMoreElements())
374 String name = st.nextToken();
375 int start = Integer.parseInt(st.nextToken());
376 int end = Integer.parseInt(st.nextToken());
377 Sequence sequence = new Sequence(name,st.nextToken(), start, end);
380 viewport.alignment.addSequence(sequence);
387 SequenceI[] newSeqs = new SequenceI[seqs.size()];
388 seqs.toArray(newSeqs);
389 AlignFrame af = new AlignFrame(new Alignment(newSeqs));
390 String newtitle = new String("Copied sequences");
391 if( title.startsWith("Copied sequences"))
394 newtitle = newtitle.concat("- from "+title);
396 Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH, NEW_WINDOW_HEIGHT);
400 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
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 boolean seqsdeleted=false;
423 if (viewport.getSelectionGroup() == null)
426 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment, HistoryItem.HIDE));
428 SequenceGroup sg = viewport.getSelectionGroup();
429 for (int i=0;i < sg.sequences.size(); i++)
431 SequenceI seq = sg.getSequenceAt(i);
432 int index = viewport.getAlignment().findIndex(seq);
433 seq.deleteChars(sg.getStartRes(),sg.getEndRes()+1);
435 if(seq.getSequence().length()<1) {
437 viewport.getAlignment().deleteSequence(seq);
439 viewport.getAlignment().getSequences().setElementAt(seq, index);
443 viewport.setSelectionGroup(null);
444 viewport.alignment.deleteGroup(sg);
446 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
447 viewport.resetSeqLimits( alignPanel.seqPanel.seqCanvas.getHeight());
448 if(viewport.getAlignment().getHeight()<1)
451 this.setClosed(true);
452 }catch(Exception ex){}
453 viewport.updateConservation();
454 viewport.updateConsensus();
455 alignPanel.repaint();
459 protected void deleteGroups_actionPerformed(ActionEvent e)
461 viewport.alignment.deleteAllGroups();
462 viewport.setSelectionGroup(null);
463 alignPanel.repaint();
468 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
470 SequenceGroup sg = new SequenceGroup();
471 for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)
472 sg.addSequence( viewport.getAlignment().getSequenceAt(i));
473 sg.setEndRes(viewport.alignment.getWidth());
474 viewport.setSelectionGroup(sg);
475 PaintRefresher.Refresh(null);
478 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
480 viewport.setSelectionGroup(null);
481 viewport.getColumnSelection().clear();
482 viewport.setSelectionGroup(null);
483 PaintRefresher.Refresh(null);
486 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
488 SequenceGroup sg = viewport.getSelectionGroup();
489 for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)
490 sg.addOrRemove (viewport.getAlignment().getSequenceAt(i));
492 PaintRefresher.Refresh(null);
495 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
497 ColumnSelection colSel = viewport.getColumnSelection();
498 if (colSel.size() > 0)
500 addHistoryItem(new HistoryItem("Remove Left",viewport.alignment,
502 int min = colSel.getMin();
503 viewport.getAlignment().trimLeft(min);
504 colSel.compensateForEdit(0,min);
506 if(viewport.getSelectionGroup()!=null)
507 viewport.getSelectionGroup().adjustForRemoveLeft(min);
509 Vector groups = viewport.alignment.getGroups();
510 for(int i=0; i<groups.size(); i++)
512 SequenceGroup sg = (SequenceGroup) groups.get(i);
513 if(!sg.adjustForRemoveLeft(min))
514 viewport.alignment.deleteGroup(sg);
517 alignPanel.repaint();
521 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
523 ColumnSelection colSel = viewport.getColumnSelection();
524 if (colSel.size() > 0)
526 addHistoryItem(new HistoryItem("Remove Right",viewport.alignment,
529 int max = colSel.getMax();
530 viewport.getAlignment().trimRight(max);
531 if(viewport.getSelectionGroup()!=null)
532 viewport.getSelectionGroup().adjustForRemoveRight(max);
534 Vector groups = viewport.alignment.getGroups();
535 for(int i=0; i<groups.size(); i++)
537 SequenceGroup sg = (SequenceGroup) groups.get(i);
538 if(!sg.adjustForRemoveRight(max))
539 viewport.alignment.deleteGroup(sg);
544 alignPanel.repaint();
549 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
551 addHistoryItem(new HistoryItem("Remove Gapped Columns",
555 viewport.getAlignment().removeGaps();
556 viewport.updateConservation();
557 viewport.updateConsensus();
558 alignPanel.repaint();
561 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
563 addHistoryItem(new HistoryItem("Remove Gaps",
568 for (int i=0; i < viewport.getAlignment().getSequences().size();i++)
570 current = viewport.getAlignment().getSequenceAt(i);
571 jSize = current.getLength();
572 for (int j=0; j < jSize; j++)
573 if(jalview.util.Comparison.isGap(current.getCharAt(j)))
575 current.deleteCharAt(j);
580 viewport.updateConservation();
581 viewport.updateConsensus();
582 alignPanel.repaint();
586 public void padGapsMenuitem_actionPerformed(ActionEvent e)
588 addHistoryItem(new HistoryItem("Pad Gaps",
592 int Width = viewport.getAlignment().getWidth()-1;
593 for (int i=0; i < viewport.getAlignment().getSequences().size();i++)
595 current = viewport.getAlignment().getSequenceAt(i);
597 if (current.getLength()<Width)
598 current.insertCharAt(Width, viewport.getGapCharacter());
600 viewport.updateConservation();
601 viewport.updateConsensus();
602 alignPanel.repaint();
606 public void findMenuItem_actionPerformed(ActionEvent e)
608 JInternalFrame frame = new JInternalFrame();
609 Finder finder = new Finder(viewport, alignPanel, frame);
610 frame.setContentPane(finder);
611 Desktop.addInternalFrame(frame, "Find", 340,110);
612 frame.setLayer(JLayeredPane.PALETTE_LAYER);
617 public void font_actionPerformed(ActionEvent e)
619 FontChooser fc = new FontChooser( alignPanel );
622 protected void fullSeqId_actionPerformed(ActionEvent e)
624 viewport.setShowFullId( fullSeqId.isSelected() );
626 alignPanel.idPanel.idCanvas.setPreferredSize( alignPanel.calculateIdWidth() );
627 alignPanel.repaint();
630 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
632 viewport.setColourText( colourTextMenuItem.isSelected() );
633 alignPanel.repaint();
636 protected void wrapMenuItem_actionPerformed(ActionEvent e)
638 viewport.setWrapAlignment( wrapMenuItem.isSelected() );
639 alignPanel.setWrapAlignment( wrapMenuItem.isSelected() );
640 scaleAbove.setVisible( wrapMenuItem.isSelected() );
641 scaleLeft.setVisible( wrapMenuItem.isSelected() );
642 scaleRight.setVisible( wrapMenuItem.isSelected() );
643 alignPanel.repaint();
646 protected void scaleAbove_actionPerformed(ActionEvent e)
648 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
649 alignPanel.repaint();
652 protected void scaleLeft_actionPerformed(ActionEvent e)
654 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
655 alignPanel.repaint();
658 protected void scaleRight_actionPerformed(ActionEvent e)
660 viewport.setScaleRightWrapped(scaleRight.isSelected());
661 alignPanel.repaint();
666 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
668 viewport.setShowBoxes( viewBoxesMenuItem.isSelected() );
669 alignPanel.repaint();
672 public void viewTextMenuItem_actionPerformed(ActionEvent e)
674 viewport.setShowText( viewTextMenuItem.isSelected() );
675 alignPanel.repaint();
679 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
681 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
682 alignPanel.repaint();
685 public void sequenceFeatures_actionPerformed(ActionEvent evt)
687 viewport.showSequenceFeatures(sequenceFeatures.isSelected());
688 if(viewport.showSequenceFeatures && !((Alignment)viewport.alignment).featuresAdded)
690 SequenceFeatureFetcher sft = new SequenceFeatureFetcher(viewport.alignment, alignPanel);
691 ((Alignment)viewport.alignment).featuresAdded = true;
693 alignPanel.repaint();
696 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
698 if(annotationPanelMenuItem.isSelected() && viewport.getWrapAlignment())
700 annotationPanelMenuItem.setSelected(false);
703 viewport.setShowAnnotation( annotationPanelMenuItem.isSelected() );
704 alignPanel.setAnnotationVisible( annotationPanelMenuItem.isSelected() );
707 public void overviewMenuItem_actionPerformed(ActionEvent e)
709 if (alignPanel.overviewPanel != null)
712 JInternalFrame frame = new JInternalFrame();
713 OverviewPanel overview = new OverviewPanel(alignPanel);
714 frame.setContentPane(overview);
715 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
716 frame.getWidth(), frame.getHeight());
718 frame.setLayer(JLayeredPane.PALETTE_LAYER);
719 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
720 { public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt)
722 alignPanel.setOverviewPanel(null);
726 alignPanel.setOverviewPanel( overview );
731 protected void noColourmenuItem_actionPerformed(ActionEvent e)
733 changeColour( null );
737 public void clustalColour_actionPerformed(ActionEvent e)
739 changeColour(new ClustalxColourScheme(viewport.alignment.getSequences(), viewport.alignment.getWidth()));
742 public void zappoColour_actionPerformed(ActionEvent e)
744 changeColour(new ZappoColourScheme());
747 public void taylorColour_actionPerformed(ActionEvent e)
749 changeColour(new TaylorColourScheme());
753 public void hydrophobicityColour_actionPerformed(ActionEvent e)
755 changeColour( new HydrophobicColourScheme() );
758 public void helixColour_actionPerformed(ActionEvent e)
760 changeColour(new HelixColourScheme() );
764 public void strandColour_actionPerformed(ActionEvent e)
766 changeColour(new StrandColourScheme());
770 public void turnColour_actionPerformed(ActionEvent e)
772 changeColour(new TurnColourScheme());
776 public void buriedColour_actionPerformed(ActionEvent e)
778 changeColour(new BuriedColourScheme() );
781 public void nucleotideColour_actionPerformed(ActionEvent e)
783 changeColour(new NucleotideColourScheme());
787 protected void applyToAllGroups_actionPerformed(ActionEvent e)
789 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
794 void changeColour(ColourSchemeI cs)
798 if ( viewport.getAbovePIDThreshold() )
800 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs, "Background");
802 if (cs instanceof ResidueColourScheme)
803 ( (ResidueColourScheme) cs).setThreshold(threshold);
804 else if (cs instanceof ScoreColourScheme)
805 ( (ScoreColourScheme) cs).setThreshold(threshold);
807 viewport.setGlobalColourScheme(cs);
809 else if (cs instanceof ResidueColourScheme)
810 ( (ResidueColourScheme) cs).setThreshold(0);
811 else if (cs instanceof ScoreColourScheme)
812 ( (ScoreColourScheme) cs).setThreshold(0);
816 if (viewport.getConservationSelected())
818 ConservationColourScheme ccs = null;
820 Alignment al = (Alignment) viewport.alignment;
821 Conservation c = new Conservation("All",
822 ResidueProperties.propHash, 3,
823 al.getSequences(), 0,
827 c.verdict(false, viewport.ConsPercGaps);
829 ccs = new ConservationColourScheme(c, cs);
831 // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!
832 ccs.setConsensus( viewport.vconsensus );
833 viewport.setGlobalColourScheme(ccs);
835 ccs.inc = SliderPanel.setConservationSlider(alignPanel, ccs, "Background");
840 // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!
842 cs.setConsensus(viewport.vconsensus);
843 viewport.setGlobalColourScheme(cs);
847 if(viewport.getColourAppliesToAllGroups())
849 Vector groups = viewport.alignment.getGroups();
850 for(int i=0; i<groups.size(); i++)
852 SequenceGroup sg = (SequenceGroup)groups.elementAt(i);
856 else if (cs instanceof ClustalxColourScheme)
857 sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());
858 else if (cs instanceof UserColourScheme)
859 sg.cs = new UserColourScheme( ((UserColourScheme)cs).getColours());
862 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
863 }catch(Exception ex){}
865 if(viewport.getAbovePIDThreshold())
867 if (sg.cs instanceof ResidueColourScheme)
868 ( (ResidueColourScheme) sg.cs).setThreshold(threshold);
869 else if (sg.cs instanceof ScoreColourScheme)
870 ( (ScoreColourScheme) sg.cs).setThreshold(threshold);
872 sg.cs.setConsensus( AAFrequency.calculate(sg.sequences, 0, sg.getWidth()) );
875 if( viewport.getConservationSelected() )
877 Conservation c = new Conservation("Group",
878 ResidueProperties.propHash, 3,
879 sg.sequences, 0, viewport.alignment.getWidth()-1);
881 c.verdict(false, viewport.ConsPercGaps);
882 ConservationColourScheme ccs = new ConservationColourScheme(c, sg.cs);
884 // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!
885 ccs.setConsensus( AAFrequency.calculate(sg.sequences, 0, sg.getWidth()));
890 // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!
891 sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0, sg.getWidth()));
897 if(alignPanel.getOverviewPanel()!=null)
898 alignPanel.getOverviewPanel().updateOverviewImage();
899 alignPanel.repaint();
902 protected void modifyPID_actionPerformed(ActionEvent e)
904 if(viewport.getAbovePIDThreshold())
906 SliderPanel.setPIDSliderSource(alignPanel, viewport.getGlobalColourScheme(),
908 SliderPanel.showPIDSlider();
912 protected void modifyConservation_actionPerformed(ActionEvent e)
914 if(viewport.getConservationSelected())
916 SliderPanel.setConservationSlider(alignPanel, viewport.globalColourScheme,
918 SliderPanel.showConservationSlider();
923 protected void conservationMenuItem_actionPerformed(ActionEvent e)
925 viewport.setConservationSelected(conservationMenuItem.isSelected());
927 viewport.setAbovePIDThreshold(false);
928 abovePIDThreshold.setSelected(false);
930 ColourSchemeI cs = viewport.getGlobalColourScheme();
931 if(cs instanceof ConservationColourScheme )
932 changeColour( ((ConservationColourScheme)cs).cs );
936 modifyConservation_actionPerformed(null);
939 public void abovePIDThreshold_actionPerformed(ActionEvent e)
941 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
943 conservationMenuItem.setSelected(false);
944 viewport.setConservationSelected(false);
946 ColourSchemeI cs = viewport.getGlobalColourScheme();
948 if(cs instanceof ConservationColourScheme )
949 changeColour( ((ConservationColourScheme)cs).cs );
953 modifyPID_actionPerformed(null);
958 public void userDefinedColour_actionPerformed(ActionEvent e)
960 new UserDefinedColours( alignPanel, null);
963 public void PIDColour_actionPerformed(ActionEvent e)
965 changeColour( new PIDColourScheme() );
969 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
971 changeColour(new Blosum62ColourScheme() );
976 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
978 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment, HistoryItem.SORT));
979 AlignmentSorter.sortByPID(viewport.getAlignment(), viewport.getAlignment().getSequenceAt(0));
980 alignPanel.repaint();
983 public void sortIDMenuItem_actionPerformed(ActionEvent e)
985 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment, HistoryItem.SORT));
986 AlignmentSorter.sortByID( viewport.getAlignment() );
987 alignPanel.repaint();
990 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
992 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment, HistoryItem.SORT));
993 AlignmentSorter.sortByGroup(viewport.getAlignment());
994 AlignmentSorter.sortGroups(viewport.getAlignment());
995 alignPanel.repaint();
998 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
1000 RedundancyPanel sp = new RedundancyPanel(alignPanel, this);
1001 JInternalFrame frame = new JInternalFrame();
1002 frame.setContentPane(sp);
1003 Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400, 100, false);
1007 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
1009 if(viewport.getSelectionGroup().getSize()<2)
1010 JOptionPane.showInternalMessageDialog(this, "You must select at least 2 sequences.", "Invalid Selection", JOptionPane.WARNING_MESSAGE);
1013 JInternalFrame frame = new JInternalFrame();
1014 frame.setContentPane(new PairwiseAlignPanel(viewport));
1015 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
1019 public void PCAMenuItem_actionPerformed(ActionEvent e)
1022 if( (viewport.getSelectionGroup()!=null && viewport.getSelectionGroup().getSize()<4 && viewport.getSelectionGroup().getSize()>0)
1023 || viewport.getAlignment().getHeight()<4)
1025 JOptionPane.showInternalMessageDialog(this, "Principal component analysis must take\n"
1026 +"at least 4 input sequences.",
1027 "Sequence selection insufficient",
1028 JOptionPane.WARNING_MESSAGE);
1033 PCAPanel pcaPanel = new PCAPanel(viewport, null);
1034 JInternalFrame frame = new JInternalFrame();
1035 frame.setContentPane(pcaPanel);
1036 Desktop.addInternalFrame(frame, "Principal component analysis", 400, 400);
1037 }catch(java.lang.OutOfMemoryError ex)
1039 JOptionPane.showInternalMessageDialog(this, "Too many sequences selected\nfor Principal Component Analysis!!",
1040 "Out of memory", JOptionPane.WARNING_MESSAGE);
1046 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
1048 NewTreePanel("AV", "PID", "Average distance tree using PID");
1051 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
1053 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
1057 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
1059 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
1062 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
1064 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
1067 void NewTreePanel(String type, String pwType, String title)
1069 //are the sequences aligned?
1070 if(!viewport.alignment.isAligned())
1072 JOptionPane.showMessageDialog(Desktop.desktop, "The sequences must be aligned before creating a tree.\n"
1073 +"Try using the Pad function in the edit menu,\n"
1074 +"or one of the multiple sequence alignment web services.",
1075 "Sequences not aligned", JOptionPane.WARNING_MESSAGE);
1080 if (viewport.getSelectionGroup() != null &&
1081 viewport.getSelectionGroup().getSize() > 3)
1083 tp = new TreePanel(viewport, viewport.getSelectionGroup().sequences, type,
1085 0, viewport.alignment.getWidth());
1089 tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),
1090 type, pwType, 0, viewport.alignment.getWidth());
1093 addTreeMenuItem(tp, title);
1095 Desktop.addInternalFrame(tp, title, 600, 500);
1098 public void addSortByOrderMenuItem(String title, final AlignmentOrder order) {
1099 final JMenuItem item = new JMenuItem("by "+title);
1101 item.addActionListener(new java.awt.event.ActionListener()
1103 public void actionPerformed(ActionEvent e)
1105 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
1107 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
1108 AlignmentSorter.sortBy(viewport.getAlignment(), order);
1109 alignPanel.repaint();
1114 void addTreeMenuItem(final TreePanel treePanel, String title)
1116 final JMenuItem item = new JMenuItem(title);
1121 sort.add(sortByTreeMenu);
1123 sortByTreeMenu.add(item);
1124 item.addActionListener(new java.awt.event.ActionListener()
1126 public void actionPerformed(ActionEvent e)
1128 addHistoryItem(new HistoryItem("Tree Sort", viewport.alignment,
1130 AlignmentSorter.sortByTree(viewport.getAlignment(), treePanel.getTree());
1131 alignPanel.repaint();
1135 treePanel.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
1137 public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt)
1140 sortByTreeMenu.remove(item);
1142 sort.remove(sortByTreeMenu);
1145 viewport.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
1146 public void propertyChange(PropertyChangeEvent evt)
1148 if (evt.getPropertyName().equals("alignment")) {
1149 treePanel.getTree().UpdatePlaceHolders( (Vector) evt.getNewValue());
1150 treePanel.repaint();
1159 public void clustalAlignMenuItem_actionPerformed(ActionEvent e)
1161 // TODO:resolve which menu item was actually selected
1162 // Now, check we have enough sequences
1163 SequenceI[] msa=null;
1164 if (viewport.getSelectionGroup() != null && viewport.getSelectionGroup().getSize()>1)
1166 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
1167 SequenceGroup seqs = viewport.getSelectionGroup();
1169 msa = new SequenceI[sz=seqs.getSize()];
1170 for (int i = 0; i < sz; i++)
1172 msa[i] = (SequenceI) seqs.getSequenceAt(i);
1178 Vector seqs = viewport.getAlignment().getSequences();
1180 if (seqs.size() > 1) {
1181 msa = new SequenceI[seqs.size()];
1182 for (int i = 0; i < seqs.size(); i++)
1184 msa[i] = (SequenceI) seqs.elementAt(i);
1191 jalview.ws.MsaWSClient ct = new jalview.ws.MsaWSClient("ClustalWS", title, msa, true, true);
1195 protected void jpred_actionPerformed(ActionEvent e)
1198 SequenceI[] msa=null;
1200 if (viewport.getSelectionGroup() != null && viewport.getSelectionGroup().getSize()>0)
1202 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
1203 SequenceGroup seqs = viewport.getSelectionGroup();
1204 if (seqs.getSize() == 1 || !viewport.alignment.isAligned())
1206 seq = (SequenceI)seqs.getSequenceAt(0);
1211 msa = new SequenceI[sz=seqs.getSize()];
1212 for (int i = 0; i < sz; i++)
1214 msa[i] = (SequenceI) seqs.getSequenceAt(i);
1220 Vector seqs = viewport.getAlignment().getSequences();
1222 if (seqs.size() == 1 || !viewport.alignment.isAligned())
1224 seq = (SequenceI) seqs.elementAt(0);
1228 msa = new SequenceI[seqs.size()];
1229 for (int i = 0; i < seqs.size(); i++)
1231 msa[i] = (SequenceI) seqs.elementAt(i);
1236 JPredClient ct = new JPredClient(title, msa);
1239 JPredClient ct = new JPredClient(title, seq);
1241 System.err.print("JALVIEW ERROR! - Unexpected JPred selection state!\n");
1244 protected void msaAlignMenuItem_actionPerformed(ActionEvent e)
1246 // TODO:resolve which menu item was actually selected
1247 // Now, check we have enough sequences
1248 SequenceI[] msa=null;
1249 if (viewport.getSelectionGroup() != null && viewport.getSelectionGroup().getSize()>1)
1251 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
1252 SequenceGroup seqs = viewport.getSelectionGroup();
1254 msa = new SequenceI[sz=seqs.getSize()];
1255 for (int i = 0; i < sz; i++)
1257 msa[i] = (SequenceI) seqs.getSequenceAt(i);
1264 Vector seqs = viewport.getAlignment().getSequences();
1266 if (seqs.size() > 1) {
1267 msa = new SequenceI[seqs.size()];
1268 for (int i = 0; i < seqs.size(); i++)
1270 msa[i] = (SequenceI) seqs.elementAt(i);
1277 MsaWSClient ct = new jalview.ws.MsaWSClient("MuscleWS",title, msa, true, true);
1280 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e) {
1281 // Pick the tree file
1282 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
1283 getProperty("LAST_DIRECTORY"));
1284 chooser.setFileView(new JalviewFileView());
1285 chooser.setDialogTitle("Select a newick-like tree file");
1286 chooser.setToolTipText("Load a tree file");
1287 int value = chooser.showOpenDialog(null);
1288 if (value == JalviewFileChooser.APPROVE_OPTION)
1290 String choice = chooser.getSelectedFile().getPath();
1291 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
1294 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice, "File");
1295 ShowNewickTree(fin, choice);
1297 catch (Exception ex)
1299 JOptionPane.showMessageDialog(Desktop.desktop,
1300 "Problem reading tree file",
1302 JOptionPane.WARNING_MESSAGE);
1303 ex.printStackTrace();
1308 public void ShowNewickTree(NewickFile nf, String title)
1312 if (nf.getTree() != null)
1314 TreePanel tp = new TreePanel(viewport,
1315 viewport.getAlignment().getSequences(),
1316 nf, "FromFile", title);
1317 Desktop.addInternalFrame(tp, title, 600, 500);
1318 addTreeMenuItem(tp, title);
1319 viewport.setCurrentTree(tp.getTree());
1321 }catch(Exception ex){ex.printStackTrace();}