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;
422 addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment, HistoryItem.HIDE));
424 if (viewport.getSelectionGroup() == null)
427 SequenceGroup sg = viewport.getSelectionGroup();
428 for (int i=0;i < sg.sequences.size(); i++)
430 SequenceI seq = sg.getSequenceAt(i);
431 int index = viewport.getAlignment().findIndex(seq);
432 seq.deleteChars(sg.getStartRes(),sg.getEndRes()+1);
434 if(seq.getSequence().length()<1) {
436 viewport.getAlignment().deleteSequence(seq);
438 viewport.getAlignment().getSequences().setElementAt(seq, index);
442 viewport.setSelectionGroup(null);
443 viewport.alignment.deleteGroup(sg);
445 viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
446 viewport.resetSeqLimits( alignPanel.seqPanel.seqCanvas.getHeight());
447 if(viewport.getAlignment().getHeight()<1)
450 this.setClosed(true);
451 }catch(Exception ex){}
452 viewport.updateConservation();
453 viewport.updateConsensus();
454 alignPanel.repaint();
458 protected void deleteGroups_actionPerformed(ActionEvent e)
460 viewport.alignment.deleteAllGroups();
461 viewport.setSelectionGroup(null);
462 alignPanel.repaint();
467 public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
469 SequenceGroup sg = new SequenceGroup();
470 for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)
471 sg.addSequence( viewport.getAlignment().getSequenceAt(i));
472 sg.setEndRes(viewport.alignment.getWidth());
473 viewport.setSelectionGroup(sg);
474 PaintRefresher.Refresh(null);
477 public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
479 viewport.setSelectionGroup(null);
480 viewport.getColumnSelection().clear();
481 viewport.setSelectionGroup(null);
482 PaintRefresher.Refresh(null);
485 public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
487 SequenceGroup sg = viewport.getSelectionGroup();
488 for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)
489 sg.addOrRemove (viewport.getAlignment().getSequenceAt(i));
491 PaintRefresher.Refresh(null);
494 public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
496 ColumnSelection colSel = viewport.getColumnSelection();
497 if (colSel.size() > 0)
499 addHistoryItem(new HistoryItem("Remove Left",viewport.alignment,
501 int min = colSel.getMin();
502 viewport.getAlignment().trimLeft(min);
503 colSel.compensateForEdit(0,min);
505 if(viewport.getSelectionGroup()!=null)
506 viewport.getSelectionGroup().adjustForRemoveLeft(min);
508 Vector groups = viewport.alignment.getGroups();
509 for(int i=0; i<groups.size(); i++)
511 SequenceGroup sg = (SequenceGroup) groups.get(i);
512 if(!sg.adjustForRemoveLeft(min))
513 viewport.alignment.deleteGroup(sg);
516 alignPanel.repaint();
520 public void remove2RightMenuItem_actionPerformed(ActionEvent e)
522 ColumnSelection colSel = viewport.getColumnSelection();
523 if (colSel.size() > 0)
525 addHistoryItem(new HistoryItem("Remove Right",viewport.alignment,
528 int max = colSel.getMax();
529 viewport.getAlignment().trimRight(max);
530 if(viewport.getSelectionGroup()!=null)
531 viewport.getSelectionGroup().adjustForRemoveRight(max);
533 Vector groups = viewport.alignment.getGroups();
534 for(int i=0; i<groups.size(); i++)
536 SequenceGroup sg = (SequenceGroup) groups.get(i);
537 if(!sg.adjustForRemoveRight(max))
538 viewport.alignment.deleteGroup(sg);
543 alignPanel.repaint();
548 public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
550 addHistoryItem(new HistoryItem("Remove Gapped Columns",
554 viewport.getAlignment().removeGaps();
555 viewport.updateConservation();
556 viewport.updateConsensus();
557 alignPanel.repaint();
560 public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
562 addHistoryItem(new HistoryItem("Remove Gaps",
567 for (int i=0; i < viewport.getAlignment().getSequences().size();i++)
569 current = viewport.getAlignment().getSequenceAt(i);
570 jSize = current.getLength();
571 for (int j=0; j < jSize; j++)
572 if(jalview.util.Comparison.isGap(current.getCharAt(j)))
574 current.deleteCharAt(j);
579 viewport.updateConservation();
580 viewport.updateConsensus();
581 alignPanel.repaint();
585 public void padGapsMenuitem_actionPerformed(ActionEvent e)
587 addHistoryItem(new HistoryItem("Pad Gaps",
591 int Width = viewport.getAlignment().getWidth()-1;
592 for (int i=0; i < viewport.getAlignment().getSequences().size();i++)
594 current = viewport.getAlignment().getSequenceAt(i);
596 if (current.getLength()<Width)
597 current.insertCharAt(Width, viewport.getGapCharacter());
599 viewport.updateConservation();
600 viewport.updateConsensus();
601 alignPanel.repaint();
605 public void findMenuItem_actionPerformed(ActionEvent e)
607 JInternalFrame frame = new JInternalFrame();
608 Finder finder = new Finder(viewport, alignPanel, frame);
609 frame.setContentPane(finder);
610 Desktop.addInternalFrame(frame, "Find", 340,110);
611 frame.setLayer(JLayeredPane.PALETTE_LAYER);
616 public void font_actionPerformed(ActionEvent e)
618 FontChooser fc = new FontChooser( alignPanel );
621 protected void fullSeqId_actionPerformed(ActionEvent e)
623 viewport.setShowFullId( fullSeqId.isSelected() );
625 alignPanel.idPanel.idCanvas.setPreferredSize( alignPanel.calculateIdWidth() );
626 alignPanel.repaint();
629 protected void colourTextMenuItem_actionPerformed(ActionEvent e)
631 viewport.setColourText( colourTextMenuItem.isSelected() );
632 alignPanel.repaint();
635 protected void wrapMenuItem_actionPerformed(ActionEvent e)
637 viewport.setWrapAlignment( wrapMenuItem.isSelected() );
638 alignPanel.setWrapAlignment( wrapMenuItem.isSelected() );
639 scaleAbove.setVisible( wrapMenuItem.isSelected() );
640 scaleLeft.setVisible( wrapMenuItem.isSelected() );
641 scaleRight.setVisible( wrapMenuItem.isSelected() );
642 alignPanel.repaint();
645 protected void scaleAbove_actionPerformed(ActionEvent e)
647 viewport.setScaleAboveWrapped(scaleAbove.isSelected());
648 alignPanel.repaint();
651 protected void scaleLeft_actionPerformed(ActionEvent e)
653 viewport.setScaleLeftWrapped(scaleLeft.isSelected());
654 alignPanel.repaint();
657 protected void scaleRight_actionPerformed(ActionEvent e)
659 viewport.setScaleRightWrapped(scaleRight.isSelected());
660 alignPanel.repaint();
665 public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
667 viewport.setShowBoxes( viewBoxesMenuItem.isSelected() );
668 alignPanel.repaint();
671 public void viewTextMenuItem_actionPerformed(ActionEvent e)
673 viewport.setShowText( viewTextMenuItem.isSelected() );
674 alignPanel.repaint();
678 protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
680 viewport.setRenderGaps(renderGapsMenuItem.isSelected());
681 alignPanel.repaint();
684 public void sequenceFeatures_actionPerformed(ActionEvent evt)
686 viewport.showSequenceFeatures(sequenceFeatures.isSelected());
687 if(viewport.showSequenceFeatures && !((Alignment)viewport.alignment).featuresAdded)
689 SequenceFeatureFetcher sft = new SequenceFeatureFetcher(viewport.alignment, alignPanel);
690 ((Alignment)viewport.alignment).featuresAdded = true;
692 alignPanel.repaint();
695 public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
697 if(annotationPanelMenuItem.isSelected() && viewport.getWrapAlignment())
699 annotationPanelMenuItem.setSelected(false);
702 viewport.setShowAnnotation( annotationPanelMenuItem.isSelected() );
703 alignPanel.setAnnotationVisible( annotationPanelMenuItem.isSelected() );
706 public void overviewMenuItem_actionPerformed(ActionEvent e)
708 if (alignPanel.overviewPanel != null)
711 JInternalFrame frame = new JInternalFrame();
712 OverviewPanel overview = new OverviewPanel(alignPanel);
713 frame.setContentPane(overview);
714 Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
715 frame.getWidth(), frame.getHeight());
717 frame.setLayer(JLayeredPane.PALETTE_LAYER);
718 frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
719 { public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt)
721 alignPanel.setOverviewPanel(null);
725 alignPanel.setOverviewPanel( overview );
730 protected void noColourmenuItem_actionPerformed(ActionEvent e)
732 changeColour( null );
736 public void clustalColour_actionPerformed(ActionEvent e)
738 changeColour(new ClustalxColourScheme(viewport.alignment.getSequences(), viewport.alignment.getWidth()));
741 public void zappoColour_actionPerformed(ActionEvent e)
743 changeColour(new ZappoColourScheme());
746 public void taylorColour_actionPerformed(ActionEvent e)
748 changeColour(new TaylorColourScheme());
752 public void hydrophobicityColour_actionPerformed(ActionEvent e)
754 changeColour( new HydrophobicColourScheme() );
757 public void helixColour_actionPerformed(ActionEvent e)
759 changeColour(new HelixColourScheme() );
763 public void strandColour_actionPerformed(ActionEvent e)
765 changeColour(new StrandColourScheme());
769 public void turnColour_actionPerformed(ActionEvent e)
771 changeColour(new TurnColourScheme());
775 public void buriedColour_actionPerformed(ActionEvent e)
777 changeColour(new BuriedColourScheme() );
780 public void nucleotideColour_actionPerformed(ActionEvent e)
782 changeColour(new NucleotideColourScheme());
786 protected void applyToAllGroups_actionPerformed(ActionEvent e)
788 viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
793 void changeColour(ColourSchemeI cs)
797 if ( viewport.getAbovePIDThreshold() )
799 threshold = SliderPanel.setPIDSliderSource(alignPanel, cs, "Background");
801 if (cs instanceof ResidueColourScheme)
802 ( (ResidueColourScheme) cs).setThreshold(threshold);
803 else if (cs instanceof ScoreColourScheme)
804 ( (ScoreColourScheme) cs).setThreshold(threshold);
806 viewport.setGlobalColourScheme(cs);
808 else if (cs instanceof ResidueColourScheme)
809 ( (ResidueColourScheme) cs).setThreshold(0);
810 else if (cs instanceof ScoreColourScheme)
811 ( (ScoreColourScheme) cs).setThreshold(0);
815 if (viewport.getConservationSelected())
817 ConservationColourScheme ccs = null;
819 Alignment al = (Alignment) viewport.alignment;
820 Conservation c = new Conservation("All",
821 ResidueProperties.propHash, 3,
822 al.getSequences(), 0,
826 c.verdict(false, viewport.ConsPercGaps);
828 ccs = new ConservationColourScheme(c, cs);
830 // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!
831 ccs.setConsensus( viewport.vconsensus );
832 viewport.setGlobalColourScheme(ccs);
834 ccs.inc = SliderPanel.setConservationSlider(alignPanel, ccs, "Background");
839 // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!
841 cs.setConsensus(viewport.vconsensus);
842 viewport.setGlobalColourScheme(cs);
846 if(viewport.getColourAppliesToAllGroups())
848 Vector groups = viewport.alignment.getGroups();
849 for(int i=0; i<groups.size(); i++)
851 SequenceGroup sg = (SequenceGroup)groups.elementAt(i);
855 else if (cs instanceof ClustalxColourScheme)
856 sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());
857 else if (cs instanceof UserColourScheme)
858 sg.cs = new UserColourScheme( ((UserColourScheme)cs).getColours());
861 sg.cs = (ColourSchemeI) cs.getClass().newInstance();
862 }catch(Exception ex){}
864 if(viewport.getAbovePIDThreshold())
866 if (sg.cs instanceof ResidueColourScheme)
867 ( (ResidueColourScheme) sg.cs).setThreshold(threshold);
868 else if (sg.cs instanceof ScoreColourScheme)
869 ( (ScoreColourScheme) sg.cs).setThreshold(threshold);
871 sg.cs.setConsensus( AAFrequency.calculate(sg.sequences, 0, sg.getWidth()) );
874 if( viewport.getConservationSelected() )
876 Conservation c = new Conservation("Group",
877 ResidueProperties.propHash, 3,
878 sg.sequences, 0, viewport.alignment.getWidth()-1);
880 c.verdict(false, viewport.ConsPercGaps);
881 ConservationColourScheme ccs = new ConservationColourScheme(c, sg.cs);
883 // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!
884 ccs.setConsensus( AAFrequency.calculate(sg.sequences, 0, sg.getWidth()));
889 // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!
890 sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0, sg.getWidth()));
896 if(alignPanel.getOverviewPanel()!=null)
897 alignPanel.getOverviewPanel().updateOverviewImage();
898 alignPanel.repaint();
901 protected void modifyPID_actionPerformed(ActionEvent e)
903 if(viewport.getAbovePIDThreshold())
905 SliderPanel.setPIDSliderSource(alignPanel, viewport.getGlobalColourScheme(),
907 SliderPanel.showPIDSlider();
911 protected void modifyConservation_actionPerformed(ActionEvent e)
913 if(viewport.getConservationSelected())
915 SliderPanel.setConservationSlider(alignPanel, viewport.globalColourScheme,
917 SliderPanel.showConservationSlider();
922 protected void conservationMenuItem_actionPerformed(ActionEvent e)
924 viewport.setConservationSelected(conservationMenuItem.isSelected());
926 viewport.setAbovePIDThreshold(false);
927 abovePIDThreshold.setSelected(false);
929 ColourSchemeI cs = viewport.getGlobalColourScheme();
930 if(cs instanceof ConservationColourScheme )
931 changeColour( ((ConservationColourScheme)cs).cs );
935 modifyConservation_actionPerformed(null);
938 public void abovePIDThreshold_actionPerformed(ActionEvent e)
940 viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
942 conservationMenuItem.setSelected(false);
943 viewport.setConservationSelected(false);
945 ColourSchemeI cs = viewport.getGlobalColourScheme();
947 if(cs instanceof ConservationColourScheme )
948 changeColour( ((ConservationColourScheme)cs).cs );
952 modifyPID_actionPerformed(null);
957 public void userDefinedColour_actionPerformed(ActionEvent e)
959 new UserDefinedColours( alignPanel, null);
962 public void PIDColour_actionPerformed(ActionEvent e)
964 changeColour( new PIDColourScheme() );
968 public void BLOSUM62Colour_actionPerformed(ActionEvent e)
970 changeColour(new Blosum62ColourScheme() );
975 public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
977 addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment, HistoryItem.SORT));
978 AlignmentSorter.sortByPID(viewport.getAlignment(), viewport.getAlignment().getSequenceAt(0));
979 alignPanel.repaint();
982 public void sortIDMenuItem_actionPerformed(ActionEvent e)
984 addHistoryItem(new HistoryItem("ID Sort", viewport.alignment, HistoryItem.SORT));
985 AlignmentSorter.sortByID( viewport.getAlignment() );
986 alignPanel.repaint();
989 public void sortGroupMenuItem_actionPerformed(ActionEvent e)
991 addHistoryItem(new HistoryItem("Group Sort", viewport.alignment, HistoryItem.SORT));
992 AlignmentSorter.sortByGroup(viewport.getAlignment());
993 AlignmentSorter.sortGroups(viewport.getAlignment());
994 alignPanel.repaint();
997 public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
999 RedundancyPanel sp = new RedundancyPanel(alignPanel);
1000 JInternalFrame frame = new JInternalFrame();
1001 frame.setContentPane(sp);
1002 Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400, 100, false);
1006 public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
1008 if(viewport.getSelectionGroup().getSize()<2)
1009 JOptionPane.showInternalMessageDialog(this, "You must select at least 2 sequences.", "Invalid Selection", JOptionPane.WARNING_MESSAGE);
1012 JInternalFrame frame = new JInternalFrame();
1013 frame.setContentPane(new PairwiseAlignPanel(viewport));
1014 Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
1018 public void PCAMenuItem_actionPerformed(ActionEvent e)
1021 if( (viewport.getSelectionGroup()!=null && viewport.getSelectionGroup().getSize()<4 && viewport.getSelectionGroup().getSize()>0)
1022 || viewport.getAlignment().getHeight()<4)
1024 JOptionPane.showInternalMessageDialog(this, "Principal component analysis must take\n"
1025 +"at least 4 input sequences.",
1026 "Sequence selection insufficient",
1027 JOptionPane.WARNING_MESSAGE);
1032 PCAPanel pcaPanel = new PCAPanel(viewport, null);
1033 JInternalFrame frame = new JInternalFrame();
1034 frame.setContentPane(pcaPanel);
1035 Desktop.addInternalFrame(frame, "Principal component analysis", 400, 400);
1036 }catch(java.lang.OutOfMemoryError ex)
1038 JOptionPane.showInternalMessageDialog(this, "Too many sequences selected\nfor Principal Component Analysis!!",
1039 "Out of memory", JOptionPane.WARNING_MESSAGE);
1045 public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
1047 NewTreePanel("AV", "PID", "Average distance tree using PID");
1050 public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
1052 NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
1056 protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
1058 NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
1061 protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
1063 NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
1066 void NewTreePanel(String type, String pwType, String title)
1068 //are the sequences aligned?
1069 if(!viewport.alignment.isAligned())
1071 JOptionPane.showMessageDialog(Desktop.desktop, "The sequences must be aligned before creating a tree.\n"
1072 +"Try using the Pad function in the edit menu.",
1073 "Sequences not aligned", JOptionPane.WARNING_MESSAGE);
1078 if (viewport.getSelectionGroup() != null &&
1079 viewport.getSelectionGroup().getSize() > 3)
1081 tp = new TreePanel(viewport, viewport.getSelectionGroup().sequences, type,
1083 0, viewport.alignment.getWidth());
1087 tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),
1088 type, pwType, 0, viewport.alignment.getWidth());
1091 addTreeMenuItem(tp, title);
1093 Desktop.addInternalFrame(tp, title, 600, 500);
1096 public void addSortByOrderMenuItem(String title, final AlignmentOrder order) {
1097 final JMenuItem item = new JMenuItem("by "+title);
1099 item.addActionListener(new java.awt.event.ActionListener()
1101 public void actionPerformed(ActionEvent e)
1103 addHistoryItem(new HistoryItem("Sort", viewport.alignment,
1105 // TODO: JBPNote - have to map order entries to curent SequenceI pointers
1106 AlignmentSorter.sortBy(viewport.getAlignment(), order);
1107 alignPanel.repaint();
1112 void addTreeMenuItem(final TreePanel treePanel, String title)
1114 final JMenuItem item = new JMenuItem(title);
1119 sort.add(sortByTreeMenu);
1121 sortByTreeMenu.add(item);
1122 item.addActionListener(new java.awt.event.ActionListener()
1124 public void actionPerformed(ActionEvent e)
1126 addHistoryItem(new HistoryItem("Tree Sort", viewport.alignment,
1128 AlignmentSorter.sortByTree(viewport.getAlignment(), treePanel.getTree());
1129 alignPanel.repaint();
1133 treePanel.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
1135 public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt)
1138 sortByTreeMenu.remove(item);
1140 sort.remove(sortByTreeMenu);
1143 viewport.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
1144 public void propertyChange(PropertyChangeEvent evt)
1146 if (evt.getPropertyName().equals("alignment")) {
1147 treePanel.getTree().UpdatePlaceHolders( (Vector) evt.getNewValue());
1148 treePanel.repaint();
1157 public void clustalAlignMenuItem_actionPerformed(ActionEvent e)
1159 // TODO:resolve which menu item was actually selected
1160 // Now, check we have enough sequences
1161 SequenceI[] msa=null;
1162 if (viewport.getSelectionGroup() != null && viewport.getSelectionGroup().getSize()>1)
1164 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
1165 SequenceGroup seqs = viewport.getSelectionGroup();
1167 msa = new SequenceI[sz=seqs.getSize()];
1168 for (int i = 0; i < sz; i++)
1170 msa[i] = (SequenceI) seqs.getSequenceAt(i);
1176 Vector seqs = viewport.getAlignment().getSequences();
1178 if (seqs.size() > 1) {
1179 msa = new SequenceI[seqs.size()];
1180 for (int i = 0; i < seqs.size(); i++)
1182 msa[i] = (SequenceI) seqs.elementAt(i);
1189 jalview.ws.MsaWSClient ct = new jalview.ws.MsaWSClient("ClustalWS", title, msa, true, true);
1193 protected void jpred_actionPerformed(ActionEvent e)
1196 SequenceI[] msa=null;
1198 if (viewport.getSelectionGroup() != null && viewport.getSelectionGroup().getSize()>0)
1200 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
1201 SequenceGroup seqs = viewport.getSelectionGroup();
1202 if (seqs.getSize() == 1 || !viewport.alignment.isAligned())
1204 seq = (SequenceI)seqs.getSequenceAt(0);
1209 msa = new SequenceI[sz=seqs.getSize()];
1210 for (int i = 0; i < sz; i++)
1212 msa[i] = (SequenceI) seqs.getSequenceAt(i);
1218 Vector seqs = viewport.getAlignment().getSequences();
1220 if (seqs.size() == 1 || !viewport.alignment.isAligned())
1222 seq = (SequenceI) seqs.elementAt(0);
1226 msa = new SequenceI[seqs.size()];
1227 for (int i = 0; i < seqs.size(); i++)
1229 msa[i] = (SequenceI) seqs.elementAt(i);
1234 JPredClient ct = new JPredClient(title, msa);
1237 JPredClient ct = new JPredClient(title, seq);
1239 System.err.print("JALVIEW ERROR! - Unexpected JPred selection state!\n");
1242 protected void msaAlignMenuItem_actionPerformed(ActionEvent e)
1244 // TODO:resolve which menu item was actually selected
1245 // Now, check we have enough sequences
1246 SequenceI[] msa=null;
1247 if (viewport.getSelectionGroup() != null && viewport.getSelectionGroup().getSize()>1)
1249 // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
1250 SequenceGroup seqs = viewport.getSelectionGroup();
1252 msa = new SequenceI[sz=seqs.getSize()];
1253 for (int i = 0; i < sz; i++)
1255 msa[i] = (SequenceI) seqs.getSequenceAt(i);
1262 Vector seqs = viewport.getAlignment().getSequences();
1264 if (seqs.size() > 1) {
1265 msa = new SequenceI[seqs.size()];
1266 for (int i = 0; i < seqs.size(); i++)
1268 msa[i] = (SequenceI) seqs.elementAt(i);
1275 MsaWSClient ct = new jalview.ws.MsaWSClient("MuscleWS",title, msa, true, true);
1278 protected void LoadtreeMenuItem_actionPerformed(ActionEvent e) {
1279 // Pick the tree file
1280 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
1281 getProperty("LAST_DIRECTORY"));
1282 chooser.setFileView(new JalviewFileView());
1283 chooser.setDialogTitle("Select a newick-like tree file");
1284 chooser.setToolTipText("Load a tree file");
1285 int value = chooser.showOpenDialog(null);
1286 if (value == JalviewFileChooser.APPROVE_OPTION)
1288 String choice = chooser.getSelectedFile().getPath();
1289 jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
1292 jalview.io.NewickFile fin = new jalview.io.NewickFile(choice, "File");
1293 ShowNewickTree(fin, choice);
1295 catch (Exception ex)
1297 JOptionPane.showMessageDialog(Desktop.desktop,
1298 "Problem reading tree file",
1300 JOptionPane.WARNING_MESSAGE);
1301 ex.printStackTrace();
1306 public void ShowNewickTree(NewickFile nf, String title)
1310 if (nf.getTree() != null)
1312 TreePanel tp = new TreePanel(viewport,
1313 viewport.getAlignment().getSequences(),
1314 nf, "FromFile", title);
1315 Desktop.addInternalFrame(tp, title, 600, 500);
1316 addTreeMenuItem(tp, title);
1317 viewport.setCurrentTree(tp.getTree());
1319 }catch(Exception ex){ex.printStackTrace();}