sequences are private in SequenceGroup
[jalview.git] / src / jalview / appletgui / AlignFrame.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  *\r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 \r
20 package jalview.appletgui;\r
21 \r
22 import jalview.schemes.*;\r
23 import jalview.datamodel.*;\r
24 import jalview.analysis.*;\r
25 import jalview.io.*;\r
26 import java.awt.*;\r
27 import java.awt.event.*;\r
28 import java.util.*;\r
29 import java.io.InputStreamReader;\r
30 import java.io.BufferedReader;\r
31 import java.net.URL;\r
32 \r
33 \r
34 public class AlignFrame extends Frame implements ActionListener,\r
35     ItemListener, KeyListener, MouseListener\r
36 {\r
37   public AlignmentPanel alignPanel;\r
38   public AlignViewport viewport;\r
39   int NEW_WINDOW_WIDTH = 700;\r
40   int NEW_WINDOW_HEIGHT = 500;\r
41   jalview.bin.JalviewLite applet;\r
42 \r
43 \r
44    public AlignFrame(AlignmentI al,\r
45                      jalview.bin.JalviewLite applet,\r
46                      String title,\r
47                      boolean embedded)\r
48   {\r
49     try{\r
50       jbInit();\r
51     }catch(Exception ex)\r
52     {\r
53       ex.printStackTrace();\r
54     }\r
55 \r
56     this.applet = applet;\r
57     viewport = new AlignViewport(al, applet);\r
58     alignPanel = new AlignmentPanel(this, viewport);\r
59 \r
60     annotationPanelMenuItem.setState(viewport.showAnnotation);\r
61 \r
62     seqLimits.setState(viewport.showJVSuffix);\r
63 \r
64     if(applet!=null)\r
65     {\r
66       String param = applet.getParameter("sortBy");\r
67       if (param != null)\r
68       {\r
69         if (param.equalsIgnoreCase("Id"))\r
70           sortIDMenuItem_actionPerformed();\r
71         else if (param.equalsIgnoreCase("Pairwise Identity"))\r
72           sortPairwiseMenuItem_actionPerformed();\r
73       }\r
74 \r
75       param = applet.getParameter("wrap");\r
76       if (param != null)\r
77       {\r
78         if (param.equalsIgnoreCase("true"))\r
79         {\r
80           wrapMenuItem.setState(true);\r
81           wrapMenuItem_actionPerformed();\r
82         }\r
83       }\r
84 \r
85       try\r
86       {\r
87         param = applet.getParameter("windowWidth");\r
88         if (param != null)\r
89         {\r
90           int width = Integer.parseInt(param);\r
91           NEW_WINDOW_WIDTH = width;\r
92         }\r
93         param = applet.getParameter("windowHeight");\r
94         if (param != null)\r
95         {\r
96           int height = Integer.parseInt(param);\r
97           NEW_WINDOW_HEIGHT = height;\r
98         }\r
99       }\r
100       catch (Exception ex)\r
101       {}\r
102 \r
103     }\r
104 \r
105    //Some JVMS send keyevents to Top frame or lowest panel,\r
106    //Havent worked out why yet. So add to both this frame and seqCanvas for now\r
107    this.addKeyListener(this);\r
108    alignPanel.seqPanel.seqCanvas.addKeyListener(this);\r
109    alignPanel.idPanel.idCanvas.addKeyListener(this);\r
110 \r
111     viewport.addPropertyChangeListener(new java.beans.PropertyChangeListener()\r
112     {\r
113      public void propertyChange(java.beans.PropertyChangeEvent evt)\r
114      {\r
115        if (evt.getPropertyName().equals("alignment"))\r
116        {\r
117          alignmentChanged();\r
118        }\r
119      }\r
120    });\r
121 \r
122 \r
123    if(embedded)\r
124    {\r
125      setEmbedded();\r
126    }\r
127    else\r
128    {\r
129      add(alignPanel, BorderLayout.CENTER);\r
130      jalview.bin.JalviewLite.addFrame(this, title, NEW_WINDOW_WIDTH,\r
131                                       NEW_WINDOW_HEIGHT);\r
132    }\r
133    alignPanel.validate();\r
134    alignPanel.repaint();\r
135   }\r
136   public AlignViewport getAlignViewport()\r
137   {\r
138     return viewport;\r
139   }\r
140 \r
141   public SeqCanvas getSeqcanvas()\r
142   {\r
143     return alignPanel.seqPanel.seqCanvas;\r
144   }\r
145 \r
146 \r
147   /**\r
148    * DOCUMENT ME!\r
149    *\r
150    * @param String DOCUMENT ME!\r
151    */\r
152 \r
153   public void parseFeaturesFile(String file, String type)\r
154   {\r
155     Hashtable featureLinks = new Hashtable();\r
156     boolean featuresFile = false;\r
157     try{\r
158       featuresFile = new jalview.io.FeaturesFile(file, type).parse(viewport.alignment,\r
159                                          alignPanel.seqPanel.seqCanvas.\r
160                                          getFeatureRenderer().featureColours,\r
161                                          featureLinks,\r
162                                          true);\r
163     }\r
164     catch(Exception ex)\r
165     {\r
166       ex.printStackTrace();\r
167     }\r
168 \r
169     if(featuresFile)\r
170     {\r
171       if(featureLinks.size()>0)\r
172         alignPanel.seqPanel.seqCanvas\r
173             .getFeatureRenderer().featureLinks = featureLinks;\r
174       viewport.showSequenceFeatures = true;\r
175       sequenceFeatures.setState(true);\r
176       alignPanel.repaint();\r
177     }\r
178 \r
179   }\r
180 \r
181 \r
182   public void keyPressed(KeyEvent evt)\r
183   {\r
184     if (viewport.cursorMode\r
185         && evt.getKeyCode() >= KeyEvent.VK_0\r
186         && evt.getKeyCode() <= KeyEvent.VK_9)\r
187     {\r
188       alignPanel.seqPanel.numberPressed(evt.getKeyChar());\r
189     }\r
190 \r
191     switch (evt.getKeyCode())\r
192     {\r
193       case 27: // escape key\r
194         deselectAllSequenceMenuItem_actionPerformed();\r
195         break;\r
196       case KeyEvent.VK_X:\r
197         if (evt.isControlDown() || evt.isMetaDown())\r
198         {\r
199           cut_actionPerformed();\r
200         }\r
201         break;\r
202       case KeyEvent.VK_C:\r
203         if (viewport.cursorMode && !evt.isControlDown())\r
204         {\r
205           alignPanel.seqPanel.setCursorColumn();\r
206         }\r
207         if (evt.isControlDown() || evt.isMetaDown())\r
208         {\r
209           copy_actionPerformed();\r
210         }\r
211         break;\r
212       case KeyEvent.VK_V:\r
213         if (evt.isControlDown() || evt.isMetaDown())\r
214         {\r
215           paste(true);\r
216         }\r
217         break;\r
218       case KeyEvent.VK_A:\r
219         if (evt.isControlDown() || evt.isMetaDown())\r
220         {\r
221           selectAllSequenceMenuItem_actionPerformed();\r
222         }\r
223         break;\r
224       case KeyEvent.VK_DOWN:\r
225         if(viewport.cursorMode)\r
226         {\r
227           alignPanel.seqPanel.moveCursor(0,1);\r
228         }\r
229         else\r
230           moveSelectedSequences(false);\r
231         break;\r
232 \r
233       case KeyEvent.VK_UP:\r
234         if (viewport.cursorMode)\r
235         {\r
236           alignPanel.seqPanel.moveCursor(0,-1);\r
237         }\r
238         else\r
239           moveSelectedSequences(true);\r
240         break;\r
241 \r
242       case KeyEvent.VK_LEFT:\r
243         if(viewport.cursorMode)\r
244         {\r
245           alignPanel.seqPanel.moveCursor(-1,0);\r
246         }\r
247         break;\r
248 \r
249       case KeyEvent.VK_RIGHT:\r
250         if (viewport.cursorMode)\r
251         {\r
252           alignPanel.seqPanel.moveCursor(1,0);\r
253         }\r
254         break;\r
255       case KeyEvent.VK_SPACE:\r
256         if(viewport.cursorMode)\r
257         {\r
258           alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown());\r
259         }\r
260         break;\r
261 \r
262       case KeyEvent.VK_DELETE:\r
263       case KeyEvent.VK_BACK_SPACE:\r
264         if(viewport.cursorMode)\r
265         {\r
266           alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown());\r
267         }\r
268        else\r
269         {\r
270           cut_actionPerformed();\r
271           alignPanel.seqPanel.seqCanvas.repaint();\r
272         }\r
273         break;\r
274 \r
275       case KeyEvent.VK_S:\r
276         if(viewport.cursorMode)\r
277         {\r
278           alignPanel.seqPanel.setCursorRow();\r
279         }\r
280         break;\r
281       case KeyEvent.VK_P:\r
282         if(viewport.cursorMode)\r
283         {\r
284           alignPanel.seqPanel.setCursorPosition();\r
285         }\r
286         break;\r
287 \r
288       case KeyEvent.VK_ENTER:\r
289       case KeyEvent.VK_COMMA:\r
290         if(viewport.cursorMode)\r
291         {\r
292           alignPanel.seqPanel.setCursorRowAndColumn();\r
293         }\r
294         break;\r
295 \r
296       case KeyEvent.VK_Q:\r
297         if(viewport.cursorMode)\r
298         {\r
299           alignPanel.seqPanel.setSelectionAreaAtCursor(true);\r
300         }\r
301         break;\r
302       case KeyEvent.VK_M:\r
303         if(viewport.cursorMode)\r
304         {\r
305           alignPanel.seqPanel.setSelectionAreaAtCursor(false);\r
306         }\r
307         break;\r
308 \r
309      case KeyEvent.VK_F2:\r
310        viewport.cursorMode = ! viewport.cursorMode;\r
311        statusBar.setText("Keyboard editing mode is "+\r
312            (viewport.cursorMode ? "on" : "off"));\r
313        if(viewport.cursorMode)\r
314        {\r
315          alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes;\r
316          alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq;\r
317        }\r
318        alignPanel.seqPanel.seqCanvas.repaint();\r
319        break;\r
320 \r
321       case KeyEvent.VK_F:\r
322         if (evt.isControlDown())\r
323         {\r
324           findMenuItem_actionPerformed();\r
325         }\r
326         break;\r
327     }\r
328   }\r
329   public void keyReleased(KeyEvent evt)\r
330   {}\r
331   public void keyTyped(KeyEvent evt)\r
332   {}\r
333 \r
334 public void itemStateChanged(ItemEvent evt)\r
335   {\r
336     if(evt.getSource()==colourTextMenuItem)\r
337             colourTextMenuItem_actionPerformed();\r
338     else if(evt.getSource()==wrapMenuItem)\r
339             wrapMenuItem_actionPerformed();\r
340     else if(evt.getSource()==scaleAbove)\r
341             scaleAbove_actionPerformed();\r
342     else if(evt.getSource()==scaleLeft)\r
343             scaleLeft_actionPerformed();\r
344     else if(evt.getSource()==scaleRight)\r
345             scaleRight_actionPerformed();\r
346      else if(evt.getSource()==seqLimits)\r
347       seqLimits_itemStateChanged();\r
348     else if(evt.getSource()==viewBoxesMenuItem)\r
349             viewBoxesMenuItem_actionPerformed();\r
350     else if(evt.getSource()==viewTextMenuItem)\r
351             viewTextMenuItem_actionPerformed();\r
352     else if(evt.getSource()==renderGapsMenuItem)\r
353             renderGapsMenuItem_actionPerformed();\r
354     else if(evt.getSource()==annotationPanelMenuItem)\r
355             annotationPanelMenuItem_actionPerformed();\r
356       else if(evt.getSource()==sequenceFeatures)\r
357       {\r
358            viewport.showSequenceFeatures(sequenceFeatures.getState());\r
359             alignPanel.seqPanel.seqCanvas.repaint();\r
360       }\r
361       else if(evt.getSource()==conservationMenuItem)\r
362             conservationMenuItem_actionPerformed();\r
363       else if(evt.getSource()==abovePIDThreshold)\r
364             abovePIDThreshold_actionPerformed();\r
365           else if(evt.getSource()==applyToAllGroups)\r
366             applyToAllGroups_actionPerformed();\r
367       else if(evt.getSource()==autoCalculate)\r
368           viewport.autocalculateConsensus = autoCalculate.getState();\r
369   }\r
370  public void actionPerformed(ActionEvent evt)\r
371  {\r
372     if(evt.getSource()==inputText)\r
373       inputText_actionPerformed();\r
374     else if(evt.getSource()==loadTree)\r
375       loadTree_actionPerformed();\r
376     else if(evt.getSource()==loadApplication)\r
377       launchFullApplication();\r
378     else if(evt.getSource()==closeMenuItem)\r
379       closeMenuItem_actionPerformed();\r
380     else if(evt.getSource()==copy)\r
381       copy_actionPerformed();\r
382     else if(evt.getSource()==undoMenuItem)\r
383       undoMenuItem_actionPerformed();\r
384     else if(evt.getSource()==redoMenuItem)\r
385       redoMenuItem_actionPerformed();\r
386     else if(evt.getSource()==inputText)\r
387             inputText_actionPerformed();\r
388     else if(evt.getSource()==closeMenuItem)\r
389             closeMenuItem_actionPerformed();\r
390     else if(evt.getSource()==undoMenuItem)\r
391             undoMenuItem_actionPerformed();\r
392     else if(evt.getSource()==redoMenuItem)\r
393             redoMenuItem_actionPerformed();\r
394     else if(evt.getSource()==copy)\r
395             copy_actionPerformed();\r
396     else if(evt.getSource()==pasteNew)\r
397             pasteNew_actionPerformed();\r
398     else if(evt.getSource()==pasteThis)\r
399             pasteThis_actionPerformed();\r
400     else if(evt.getSource()==cut)\r
401             cut_actionPerformed();\r
402     else if(evt.getSource()==delete)\r
403             delete_actionPerformed();\r
404     else if(evt.getSource()==deleteGroups)\r
405             deleteGroups_actionPerformed();\r
406     else if(evt.getSource()==selectAllSequenceMenuItem)\r
407             selectAllSequenceMenuItem_actionPerformed();\r
408     else if(evt.getSource()==deselectAllSequenceMenuItem)\r
409             deselectAllSequenceMenuItem_actionPerformed();\r
410     else if(evt.getSource()==invertSequenceMenuItem)\r
411             invertSequenceMenuItem_actionPerformed();\r
412     else if(evt.getSource()==remove2LeftMenuItem)\r
413             remove2LeftMenuItem_actionPerformed();\r
414     else if(evt.getSource()==remove2RightMenuItem)\r
415             remove2RightMenuItem_actionPerformed();\r
416     else if(evt.getSource()==removeGappedColumnMenuItem)\r
417             removeGappedColumnMenuItem_actionPerformed();\r
418     else if(evt.getSource()==removeAllGapsMenuItem)\r
419             removeAllGapsMenuItem_actionPerformed();\r
420     else if(evt.getSource()==findMenuItem)\r
421             findMenuItem_actionPerformed();\r
422     else if(evt.getSource()==font)\r
423             font_actionPerformed();\r
424     else if(evt.getSource()==featureSettings)\r
425             featureSettings_actionPerformed();\r
426     else if(evt.getSource()==overviewMenuItem)\r
427             overviewMenuItem_actionPerformed();\r
428     else if(evt.getSource()==noColourmenuItem)\r
429             noColourmenuItem_actionPerformed();\r
430     else if(evt.getSource()==clustalColour)\r
431             clustalColour_actionPerformed();\r
432     else if(evt.getSource()==zappoColour)\r
433             zappoColour_actionPerformed();\r
434     else if(evt.getSource()==taylorColour)\r
435             taylorColour_actionPerformed();\r
436     else if(evt.getSource()==hydrophobicityColour)\r
437             hydrophobicityColour_actionPerformed();\r
438     else if(evt.getSource()==helixColour)\r
439             helixColour_actionPerformed();\r
440     else if(evt.getSource()==strandColour)\r
441             strandColour_actionPerformed();\r
442     else if(evt.getSource()==turnColour)\r
443             turnColour_actionPerformed();\r
444     else if(evt.getSource()==buriedColour)\r
445             buriedColour_actionPerformed();\r
446     else if(evt.getSource()==nucleotideColour)\r
447             nucleotideColour_actionPerformed();\r
448     else if(evt.getSource()==modifyPID)\r
449             modifyPID_actionPerformed();\r
450     else if(evt.getSource()==modifyConservation)\r
451             modifyConservation_actionPerformed();\r
452     else if(evt.getSource()==userDefinedColour)\r
453             userDefinedColour_actionPerformed();\r
454     else if(evt.getSource()==PIDColour)\r
455             PIDColour_actionPerformed();\r
456     else if(evt.getSource()==BLOSUM62Colour)\r
457             BLOSUM62Colour_actionPerformed();\r
458     else if(evt.getSource()==annotationColour)\r
459            new AnnotationColourChooser(viewport, alignPanel);\r
460     else if(evt.getSource()==sortPairwiseMenuItem)\r
461             sortPairwiseMenuItem_actionPerformed();\r
462     else if(evt.getSource()==sortIDMenuItem)\r
463             sortIDMenuItem_actionPerformed();\r
464     else if(evt.getSource()==sortGroupMenuItem)\r
465             sortGroupMenuItem_actionPerformed();\r
466     else if(evt.getSource()==removeRedundancyMenuItem)\r
467             removeRedundancyMenuItem_actionPerformed();\r
468     else if(evt.getSource()==pairwiseAlignmentMenuItem)\r
469             pairwiseAlignmentMenuItem_actionPerformed();\r
470     else if(evt.getSource()==PCAMenuItem)\r
471             PCAMenuItem_actionPerformed();\r
472     else if(evt.getSource()==averageDistanceTreeMenuItem)\r
473             averageDistanceTreeMenuItem_actionPerformed();\r
474     else if(evt.getSource()==neighbourTreeMenuItem)\r
475             neighbourTreeMenuItem_actionPerformed();\r
476     else if(evt.getSource()==njTreeBlosumMenuItem)\r
477             njTreeBlosumMenuItem_actionPerformed();\r
478     else if(evt.getSource()==avDistanceTreeBlosumMenuItem)\r
479             avTreeBlosumMenuItem_actionPerformed();\r
480     else if(evt.getSource()==documentation)\r
481             documentation_actionPerformed();\r
482     else if(evt.getSource()==about)\r
483             about_actionPerformed();\r
484 \r
485  }\r
486 \r
487   public void inputText_actionPerformed()\r
488   {\r
489     CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);\r
490     Frame frame = new Frame();\r
491     frame.add(cap);\r
492     jalview.bin.JalviewLite.addFrame(frame, "Cut & Paste Input", 500, 500);\r
493   }\r
494 \r
495   protected void outputText_actionPerformed(ActionEvent e)\r
496   {\r
497     CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);\r
498     Frame frame = new Frame();\r
499     frame.add(cap);\r
500     jalview.bin.JalviewLite.addFrame(frame,\r
501                                      "Alignment output - " + e.getActionCommand(),\r
502                                      600, 500);\r
503     cap.setText(new AppletFormatAdapter().formatSequences(e.getActionCommand(),\r
504                                               viewport.getAlignment().getSequences(),\r
505                                                       viewport.showJVSuffix));\r
506   }\r
507 \r
508   void launchFullApplication()\r
509   {\r
510     StringBuffer url = new StringBuffer("http://bug.compbio.dundee.ac.uk:8080/Jalview/jalview?");\r
511 \r
512     url.append("open="+\r
513                appendProtocol( applet.getParameter("file") ) );\r
514 \r
515     if(applet.getParameter("features")!=null)\r
516     {\r
517       url.append( "&features=" );\r
518       url.append( appendProtocol( applet.getParameter("features") ) );\r
519     }\r
520 \r
521     if(applet.getParameter("defaultColour")!=null)\r
522     {\r
523       url.append("&colour=" +\r
524                  removeWhiteSpace(applet.getParameter("defaultColour"))\r
525           );\r
526     }\r
527 \r
528     if(applet.getParameter("userDefinedColour")!=null)\r
529     {\r
530       url.append( "&colour=" +\r
531                  removeWhiteSpace( applet.getParameter("userDefinedColour") )\r
532          );\r
533     }\r
534 \r
535     showURL(url.toString(), "FULL_APP");\r
536   }\r
537 \r
538 \r
539   String removeWhiteSpace(String colour)\r
540   {\r
541     StringBuffer sb = new StringBuffer();\r
542     for (int i = 0; i < colour.length(); i++)\r
543     {\r
544       if (Character.isWhitespace(colour.charAt(i)))\r
545         sb.append("%20");\r
546       else\r
547         sb.append(colour.charAt(i));\r
548     }\r
549 \r
550     return sb.toString();\r
551   }\r
552 \r
553 \r
554   String appendProtocol(String url)\r
555   {\r
556     try{\r
557        new URL(url);\r
558     }catch(java.net.MalformedURLException ex)\r
559     {\r
560       url = applet.getCodeBase()+url;\r
561     }\r
562     return url;\r
563   }\r
564 \r
565   public void closeMenuItem_actionPerformed()\r
566   {\r
567     PaintRefresher.components.remove(viewport.alignment);\r
568     if(PaintRefresher.components.size()==0 && applet==null)\r
569       System.exit(0);\r
570 \r
571     this.dispose();\r
572   }\r
573 \r
574   Stack historyList = new Stack();\r
575   Stack redoList = new Stack();\r
576 \r
577   void updateEditMenuBar()\r
578   {\r
579     if (historyList.size() > 0)\r
580     {\r
581       undoMenuItem.setEnabled(true);\r
582       HistoryItem hi = (HistoryItem) historyList.peek();\r
583       undoMenuItem.setLabel("Undo " + hi.getDescription());\r
584     }\r
585     else\r
586     {\r
587       undoMenuItem.setEnabled(false);\r
588       undoMenuItem.setLabel("Undo");\r
589     }\r
590 \r
591     if (redoList.size() > 0)\r
592     {\r
593       redoMenuItem.setEnabled(true);\r
594       HistoryItem hi = (HistoryItem) redoList.peek();\r
595       redoMenuItem.setLabel("Redo " + hi.getDescription());\r
596     }\r
597     else\r
598     {\r
599       redoMenuItem.setEnabled(false);\r
600       redoMenuItem.setLabel("Redo");\r
601     }\r
602   }\r
603 \r
604   public void addHistoryItem(HistoryItem hi)\r
605   {\r
606     historyList.push(hi);\r
607     updateEditMenuBar();\r
608   }\r
609 \r
610   protected void undoMenuItem_actionPerformed()\r
611   {\r
612     HistoryItem hi = (HistoryItem) historyList.pop();\r
613     redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,\r
614                                   HistoryItem.HIDE));\r
615     restoreHistoryItem(hi);\r
616     viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
617   }\r
618 \r
619   protected void redoMenuItem_actionPerformed()\r
620   {\r
621     HistoryItem hi = (HistoryItem) redoList.pop();\r
622     restoreHistoryItem(hi);\r
623     updateEditMenuBar();\r
624     viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
625   }\r
626 \r
627   // used by undo and redo\r
628   void restoreHistoryItem(HistoryItem hi)\r
629   {\r
630     hi.restore();\r
631 \r
632     updateEditMenuBar();\r
633 \r
634     viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
635   }\r
636 \r
637   public void moveSelectedSequences(boolean up)\r
638   {\r
639     SequenceGroup sg = viewport.getSelectionGroup();\r
640     if (sg == null)\r
641     {\r
642       return;\r
643     }\r
644 \r
645     if (up)\r
646     {\r
647       for (int i = 1; i < viewport.alignment.getHeight(); i++)\r
648       {\r
649         SequenceI seq = viewport.alignment.getSequenceAt(i);\r
650         if (!sg.getSequences(false).contains(seq))\r
651         {\r
652           continue;\r
653         }\r
654 \r
655         SequenceI temp = viewport.alignment.getSequenceAt(i - 1);\r
656         if (sg.getSequences(false).contains(temp))\r
657         {\r
658           continue;\r
659         }\r
660 \r
661         viewport.alignment.getSequences().setElementAt(temp, i);\r
662         viewport.alignment.getSequences().setElementAt(seq, i - 1);\r
663       }\r
664     }\r
665     else\r
666     {\r
667       for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)\r
668       {\r
669         SequenceI seq = viewport.alignment.getSequenceAt(i);\r
670         if (!sg.getSequences(true).contains(seq))\r
671         {\r
672           continue;\r
673         }\r
674 \r
675         SequenceI temp = viewport.alignment.getSequenceAt(i + 1);\r
676         if (sg.getSequences(true).contains(temp))\r
677         {\r
678           continue;\r
679         }\r
680 \r
681         viewport.alignment.getSequences().setElementAt(temp, i);\r
682         viewport.alignment.getSequences().setElementAt(seq, i + 1);\r
683       }\r
684     }\r
685 \r
686     alignPanel.repaint();\r
687   }\r
688 \r
689   StringBuffer copiedSequences;\r
690   protected void copy_actionPerformed()\r
691   {\r
692     if (viewport.getSelectionGroup() == null)\r
693     {\r
694       return;\r
695     }\r
696 \r
697     SequenceGroup sg = viewport.getSelectionGroup();\r
698     copiedSequences = new StringBuffer();\r
699     Hashtable orderedSeqs = new Hashtable();\r
700     for (int i = 0; i < sg.getSize(false); i++)\r
701     {\r
702       SequenceI seq = sg.getSequenceAt(i);\r
703       int index = viewport.alignment.findIndex(seq);\r
704       orderedSeqs.put(index + "", seq);\r
705     }\r
706 \r
707     int index = 0, startRes, endRes;\r
708     char ch;\r
709 \r
710     for (int i = 0; i < sg.getSize(false); i++)\r
711     {\r
712         SequenceI seq = null;\r
713 \r
714         while (seq == null)\r
715         {\r
716             if (orderedSeqs.containsKey(index + ""))\r
717             {\r
718                 seq = (SequenceI) orderedSeqs.get(index + "");\r
719                 index++;\r
720 \r
721                 break;\r
722             }\r
723             else\r
724             {\r
725                 index++;\r
726             }\r
727         }\r
728 \r
729         //FIND START RES\r
730         //Returns residue following index if gap\r
731         startRes = seq.findPosition(sg.getStartRes());\r
732 \r
733         //FIND END RES\r
734         //Need to find the residue preceeding index if gap\r
735         endRes = 0;\r
736 \r
737         for (int j = 0; j < sg.getEndRes()+1 && j < seq.getLength(); j++)\r
738         {\r
739           ch = seq.getCharAt(j);\r
740           if (!jalview.util.Comparison.isGap( (ch)))\r
741           {\r
742             endRes++;\r
743           }\r
744         }\r
745 \r
746         if(endRes>0)\r
747         {\r
748           endRes += seq.getStart() -1;\r
749         }\r
750 \r
751         copiedSequences.append(seq.getName() + "\t" +\r
752             startRes + "\t" +\r
753             endRes + "\t" +\r
754             seq.getSequence(sg.getStartRes(),\r
755                 sg.getEndRes() + 1) + "\n");\r
756     }\r
757 \r
758   }\r
759 \r
760   protected void pasteNew_actionPerformed()\r
761   {\r
762     paste(true);\r
763   }\r
764 \r
765   protected void pasteThis_actionPerformed()\r
766   {\r
767     addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,\r
768                                    HistoryItem.PASTE));\r
769     paste(false);\r
770   }\r
771 \r
772   void paste(boolean newAlignment)\r
773   {\r
774     try\r
775     {\r
776       if (copiedSequences == null)\r
777       {\r
778         return;\r
779       }\r
780 \r
781       StringTokenizer st = new StringTokenizer(copiedSequences.toString());\r
782       Vector seqs = new Vector();\r
783       while (st.hasMoreElements())\r
784       {\r
785         String name = st.nextToken();\r
786         int start = Integer.parseInt(st.nextToken());\r
787         int end = Integer.parseInt(st.nextToken());\r
788         Sequence sequence = new Sequence(name, st.nextToken(), start, end);\r
789 \r
790         if (!newAlignment)\r
791         {\r
792           viewport.alignment.addSequence(sequence);\r
793         }\r
794         else\r
795         {\r
796           seqs.addElement(sequence);\r
797         }\r
798       }\r
799 \r
800       if (newAlignment)\r
801       {\r
802         SequenceI[] newSeqs = new SequenceI[seqs.size()];\r
803         for (int i = 0; i < seqs.size(); i++)\r
804         {\r
805           newSeqs[i] = (SequenceI) seqs.elementAt(i);\r
806         }\r
807 \r
808         String newtitle = new String("Copied sequences");\r
809         if (getTitle().startsWith("Copied sequences"))\r
810         {\r
811           newtitle = getTitle();\r
812         }\r
813         else\r
814         {\r
815           newtitle = newtitle.concat("- from " + getTitle());\r
816         }\r
817         AlignFrame af = new AlignFrame(new Alignment(newSeqs),\r
818                                        applet,\r
819                                        newtitle,\r
820                                        false);\r
821 \r
822         jalview.bin.JalviewLite.addFrame(af, newtitle, NEW_WINDOW_WIDTH,\r
823                                          NEW_WINDOW_HEIGHT);\r
824       }\r
825       else\r
826       {\r
827         viewport.setEndSeq(viewport.alignment.getHeight());\r
828         viewport.alignment.getWidth();\r
829         viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
830       }\r
831 \r
832     }\r
833     catch (Exception ex)\r
834     {} // could be anything being pasted in here\r
835 \r
836   }\r
837 \r
838   protected void cut_actionPerformed()\r
839   {\r
840     copy_actionPerformed();\r
841     delete_actionPerformed();\r
842   }\r
843 \r
844   protected void delete_actionPerformed()\r
845   {\r
846     addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,\r
847                                    HistoryItem.HIDE));\r
848     if (viewport.getSelectionGroup() == null)\r
849     {\r
850       return;\r
851     }\r
852 \r
853 \r
854     SequenceGroup sg = viewport.getSelectionGroup();\r
855     boolean allSequences = false;\r
856     if(sg.getSize(false)==viewport.alignment.getHeight())\r
857           allSequences = true;\r
858 \r
859     for (int i = 0; i < sg.getSize(false); i++)\r
860     {\r
861       SequenceI seq = sg.getSequenceAt(i);\r
862       int index = viewport.getAlignment().findIndex(seq);\r
863       seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);\r
864 \r
865       // If the cut affects all sequences, remove highlighted columns\r
866       if (allSequences)\r
867       {\r
868         viewport.getColumnSelection().removeElements(sg.getStartRes(),\r
869                                                      sg.getEndRes() + 1);\r
870       }\r
871 \r
872 \r
873       if (seq.getSequence().length() < 1)\r
874       {\r
875         viewport.getAlignment().deleteSequence(seq);\r
876       }\r
877       else\r
878       {\r
879         viewport.getAlignment().getSequences().setElementAt(seq, index);\r
880       }\r
881     }\r
882 \r
883     viewport.setSelectionGroup(null);\r
884     viewport.alignment.deleteGroup(sg);\r
885     viewport.resetSeqLimits(alignPanel.seqPanel.seqCanvas.getSize().height);\r
886     if (viewport.getAlignment().getHeight() < 1)\r
887     {\r
888       try\r
889       {\r
890         this.setVisible(false);\r
891       }\r
892       catch (Exception ex)\r
893       {}\r
894     }\r
895     viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
896 \r
897   }\r
898 \r
899   protected void deleteGroups_actionPerformed()\r
900   {\r
901     viewport.alignment.deleteAllGroups();\r
902     viewport.setSelectionGroup(null);\r
903 \r
904     alignPanel.repaint();\r
905   }\r
906 \r
907   public void selectAllSequenceMenuItem_actionPerformed()\r
908   {\r
909     SequenceGroup sg = new SequenceGroup();\r
910     for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)\r
911     {\r
912       sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);\r
913     }\r
914     sg.setEndRes(viewport.alignment.getWidth()-1);\r
915     viewport.setSelectionGroup(sg);\r
916     alignPanel.repaint();\r
917     PaintRefresher.Refresh(null, viewport.alignment);\r
918   }\r
919 \r
920   public void deselectAllSequenceMenuItem_actionPerformed()\r
921   {\r
922     if(viewport.cursorMode)\r
923     {\r
924       alignPanel.seqPanel.keyboardNo1=null;\r
925       alignPanel.seqPanel.keyboardNo2=null;\r
926     }\r
927     viewport.setSelectionGroup(null);\r
928     viewport.getColumnSelection().clear();\r
929     viewport.setSelectionGroup(null);\r
930     alignPanel.idPanel.idCanvas.searchResults = null;\r
931     alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);\r
932     alignPanel.repaint();\r
933     PaintRefresher.Refresh(null, viewport.alignment);\r
934   }\r
935 \r
936   public void invertSequenceMenuItem_actionPerformed()\r
937   {\r
938     SequenceGroup sg = viewport.getSelectionGroup();\r
939     for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)\r
940     {\r
941       sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);\r
942     }\r
943 \r
944     PaintRefresher.Refresh(null, viewport.alignment);\r
945   }\r
946 \r
947   public void remove2LeftMenuItem_actionPerformed()\r
948   {\r
949     ColumnSelection colSel = viewport.getColumnSelection();\r
950     if (colSel.size() > 0)\r
951     {\r
952       addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,\r
953                                      HistoryItem.HIDE));\r
954       int min = colSel.getMin();\r
955       viewport.getAlignment().trimLeft(min);\r
956       colSel.compensateForEdit(0, min);\r
957 \r
958       if (viewport.getSelectionGroup() != null)\r
959       {\r
960         viewport.getSelectionGroup().adjustForRemoveLeft(min);\r
961       }\r
962 \r
963       Vector groups = viewport.alignment.getGroups();\r
964       for (int i = 0; i < groups.size(); i++)\r
965       {\r
966         SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
967         if (!sg.adjustForRemoveLeft(min))\r
968         {\r
969           viewport.alignment.deleteGroup(sg);\r
970         }\r
971       }\r
972       viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
973     }\r
974   }\r
975 \r
976   public void remove2RightMenuItem_actionPerformed()\r
977   {\r
978     ColumnSelection colSel = viewport.getColumnSelection();\r
979     if (colSel.size() > 0)\r
980     {\r
981       addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,\r
982                                      HistoryItem.HIDE));\r
983       int max = colSel.getMax();\r
984       viewport.getAlignment().trimRight(max);\r
985       if (viewport.getSelectionGroup() != null)\r
986       {\r
987         viewport.getSelectionGroup().adjustForRemoveRight(max);\r
988       }\r
989 \r
990       Vector groups = viewport.alignment.getGroups();\r
991       for (int i = 0; i < groups.size(); i++)\r
992       {\r
993         SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
994         if (!sg.adjustForRemoveRight(max))\r
995         {\r
996           viewport.alignment.deleteGroup(sg);\r
997         }\r
998       }\r
999       viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
1000     }\r
1001 \r
1002   }\r
1003 \r
1004   public void removeGappedColumnMenuItem_actionPerformed()\r
1005   {\r
1006     addHistoryItem(new HistoryItem("Remove Gapped Columns",\r
1007                                    viewport.alignment,\r
1008                                    HistoryItem.HIDE));\r
1009 \r
1010     //This is to maintain viewport position on first residue\r
1011     //of first sequence\r
1012     SequenceI seq = viewport.alignment.getSequenceAt(0);\r
1013     int startRes = seq.findPosition(viewport.startRes);\r
1014 \r
1015     viewport.getAlignment().removeGaps();\r
1016 \r
1017     viewport.setStartRes(seq.findIndex(startRes)-1);\r
1018 \r
1019     viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
1020   }\r
1021 \r
1022   public void removeAllGapsMenuItem_actionPerformed()\r
1023   {\r
1024     addHistoryItem(new HistoryItem("Remove Gaps", viewport.alignment,\r
1025                                    HistoryItem.HIDE));\r
1026 \r
1027     //This is to maintain viewport position on first residue\r
1028     //of first sequence\r
1029     SequenceI seq = viewport.alignment.getSequenceAt(0);\r
1030     int startRes = seq.findPosition(viewport.startRes);\r
1031 \r
1032     SequenceI current;\r
1033     int jSize;\r
1034 \r
1035     Vector seqs=null;\r
1036 \r
1037     int start=0, end = viewport.alignment.getWidth();\r
1038 \r
1039     if (viewport.getSelectionGroup() != null\r
1040         && viewport.getSelectionGroup().getSequences(false) != null\r
1041         && viewport.getSelectionGroup().getSize(false)>0)\r
1042     {\r
1043       seqs = viewport.getSelectionGroup().getSequences(true);\r
1044       start = viewport.getSelectionGroup().getStartRes();\r
1045       end = viewport.getSelectionGroup().getEndRes()+1;\r
1046     }\r
1047     else\r
1048       seqs = viewport.alignment.getSequences();\r
1049 \r
1050     for (int i = 0; i < seqs.size(); i++)\r
1051     {\r
1052       current = (SequenceI) seqs.elementAt(i);\r
1053       jSize = current.getLength();\r
1054 \r
1055       // Removing a range is much quicker than removing gaps\r
1056       // one by one for long sequences\r
1057       int j = start;\r
1058       int rangeStart=-1, rangeEnd=-1;\r
1059 \r
1060       do\r
1061       {\r
1062         if (jalview.util.Comparison.isGap(current.getCharAt(j)))\r
1063         {\r
1064           if(rangeStart==-1)\r
1065            {\r
1066              rangeStart = j;\r
1067              rangeEnd = j+1;\r
1068            }\r
1069            else\r
1070            {\r
1071              rangeEnd++;\r
1072            }\r
1073            j++;\r
1074         }\r
1075         else\r
1076         {\r
1077           if(rangeStart>-1)\r
1078           {\r
1079             current.deleteChars(rangeStart, rangeEnd);\r
1080             j-=rangeEnd-rangeStart;\r
1081             jSize-=rangeEnd-rangeStart;\r
1082             rangeStart = -1;\r
1083             rangeEnd = -1;\r
1084           }\r
1085           else\r
1086             j++;\r
1087         }\r
1088       }\r
1089       while (j < end && j < jSize);\r
1090       if(rangeStart>-1)\r
1091       {\r
1092        current.deleteChars(rangeStart, rangeEnd);\r
1093       }\r
1094     }\r
1095     viewport.setStartRes(seq.findIndex(startRes)-1);\r
1096     viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
1097   }\r
1098 \r
1099   public void alignmentChanged()\r
1100   {\r
1101     viewport.alignment.padGaps();\r
1102     if(viewport.autocalculateConsensus)\r
1103     {\r
1104       viewport.updateConsensus();\r
1105       viewport.updateConservation();\r
1106     }\r
1107 \r
1108     resetAllColourSchemes();\r
1109     if(alignPanel.overviewPanel!=null)\r
1110       alignPanel.overviewPanel.updateOverviewImage();\r
1111 \r
1112     viewport.alignment.adjustSequenceAnnotations();\r
1113     alignPanel.repaint();\r
1114   }\r
1115 \r
1116   void resetAllColourSchemes()\r
1117   {\r
1118     ColourSchemeI cs = viewport.globalColourScheme;\r
1119     if(cs!=null)\r
1120     {\r
1121       if (cs instanceof ClustalxColourScheme)\r
1122       {\r
1123         ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).\r
1124             resetClustalX(viewport.alignment.getSequences(),\r
1125                           viewport.alignment.getWidth());\r
1126       }\r
1127 \r
1128       cs.setConsensus(viewport.vconsensus);\r
1129       if (cs.conservationApplied())\r
1130       {\r
1131         Alignment al = (Alignment) viewport.alignment;\r
1132         Conservation c = new Conservation("All",\r
1133                                           ResidueProperties.propHash, 3,\r
1134                                           al.getSequences(), 0,\r
1135                                           al.getWidth() - 1);\r
1136         c.calculate();\r
1137         c.verdict(false, viewport.ConsPercGaps);\r
1138 \r
1139         cs.setConservation(c);\r
1140       }\r
1141     }\r
1142 \r
1143     int s, sSize = viewport.alignment.getGroups().size();\r
1144     for(s=0; s<sSize; s++)\r
1145     {\r
1146       SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);\r
1147       if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)\r
1148       {\r
1149         ((ClustalxColourScheme)sg.cs).resetClustalX(\r
1150             sg.getSequences(true), sg.getWidth());\r
1151       }\r
1152       sg.recalcConservation();\r
1153     }\r
1154   }\r
1155 \r
1156 \r
1157 \r
1158   public void findMenuItem_actionPerformed()\r
1159   {\r
1160     new Finder(alignPanel);\r
1161   }\r
1162 \r
1163   public void font_actionPerformed()\r
1164   {\r
1165     new FontChooser(alignPanel);\r
1166   }\r
1167 \r
1168 \r
1169   public void seqLimits_itemStateChanged()\r
1170   {\r
1171     viewport.setShowJVSuffix(seqLimits.getState());\r
1172     alignPanel.fontChanged();\r
1173     alignPanel.repaint();\r
1174   }\r
1175 \r
1176 \r
1177   protected void colourTextMenuItem_actionPerformed()\r
1178   {\r
1179     viewport.setColourText(colourTextMenuItem.getState());\r
1180     alignPanel.repaint();\r
1181   }\r
1182 \r
1183   protected void wrapMenuItem_actionPerformed()\r
1184   {\r
1185     viewport.setWrapAlignment(wrapMenuItem.getState());\r
1186     alignPanel.setWrapAlignment(wrapMenuItem.getState());\r
1187     scaleAbove.setEnabled(wrapMenuItem.getState());\r
1188     scaleLeft.setEnabled(wrapMenuItem.getState());\r
1189     scaleRight.setEnabled(wrapMenuItem.getState());\r
1190     alignPanel.repaint();\r
1191   }\r
1192 \r
1193   protected void scaleAbove_actionPerformed()\r
1194   {\r
1195     viewport.setScaleAboveWrapped(scaleAbove.getState());\r
1196     alignPanel.repaint();\r
1197   }\r
1198 \r
1199   protected void scaleLeft_actionPerformed()\r
1200   {\r
1201     viewport.setScaleLeftWrapped(scaleLeft.getState());\r
1202     alignPanel.repaint();\r
1203   }\r
1204 \r
1205   protected void scaleRight_actionPerformed()\r
1206   {\r
1207     viewport.setScaleRightWrapped(scaleRight.getState());\r
1208     alignPanel.repaint();\r
1209   }\r
1210 \r
1211   public void viewBoxesMenuItem_actionPerformed()\r
1212   {\r
1213     viewport.setShowBoxes(viewBoxesMenuItem.getState());\r
1214     alignPanel.repaint();\r
1215   }\r
1216 \r
1217   public void viewTextMenuItem_actionPerformed()\r
1218   {\r
1219     viewport.setShowText(viewTextMenuItem.getState());\r
1220     alignPanel.repaint();\r
1221   }\r
1222 \r
1223   protected void renderGapsMenuItem_actionPerformed()\r
1224   {\r
1225     viewport.setRenderGaps(renderGapsMenuItem.getState());\r
1226     alignPanel.repaint();\r
1227   }\r
1228 \r
1229   public void annotationPanelMenuItem_actionPerformed()\r
1230   {\r
1231     viewport.setShowAnnotation(annotationPanelMenuItem.getState());\r
1232     alignPanel.setAnnotationVisible(annotationPanelMenuItem.getState());\r
1233   }\r
1234 \r
1235   public void featureSettings_actionPerformed()\r
1236   {\r
1237     new FeatureSettings(viewport, alignPanel);\r
1238   }\r
1239 \r
1240   public void overviewMenuItem_actionPerformed()\r
1241   {\r
1242     if (alignPanel.overviewPanel != null)\r
1243     {\r
1244       return;\r
1245     }\r
1246 \r
1247     Frame frame = new Frame();\r
1248     OverviewPanel overview = new OverviewPanel(alignPanel);\r
1249     frame.add(overview);\r
1250     // +50 must allow for applet frame window\r
1251     jalview.bin.JalviewLite.addFrame(frame, "Overview " + this.getTitle(),\r
1252                                      overview.preferredSize().width,\r
1253                                      overview.preferredSize().height + 50);\r
1254 \r
1255     frame.pack();\r
1256     frame.addWindowListener(new WindowAdapter()\r
1257     {\r
1258       public void windowClosing(WindowEvent e)\r
1259       {\r
1260         alignPanel.setOverviewPanel(null);\r
1261       };\r
1262     });\r
1263 \r
1264     alignPanel.setOverviewPanel(overview);\r
1265 \r
1266   }\r
1267 \r
1268   protected void noColourmenuItem_actionPerformed()\r
1269   {\r
1270     changeColour(null);\r
1271   }\r
1272 \r
1273   public void clustalColour_actionPerformed()\r
1274   {\r
1275     abovePIDThreshold.setState(false);\r
1276     changeColour(new ClustalxColourScheme(viewport.alignment.getSequences(),\r
1277                                           viewport.alignment.getWidth()));\r
1278   }\r
1279 \r
1280   public void zappoColour_actionPerformed()\r
1281   {\r
1282     changeColour(new ZappoColourScheme());\r
1283   }\r
1284 \r
1285   public void taylorColour_actionPerformed()\r
1286   {\r
1287     changeColour(new TaylorColourScheme());\r
1288   }\r
1289 \r
1290   public void hydrophobicityColour_actionPerformed()\r
1291   {\r
1292     changeColour(new HydrophobicColourScheme());\r
1293   }\r
1294 \r
1295   public void helixColour_actionPerformed()\r
1296   {\r
1297     changeColour(new HelixColourScheme());\r
1298   }\r
1299 \r
1300   public void strandColour_actionPerformed()\r
1301   {\r
1302     changeColour(new StrandColourScheme());\r
1303   }\r
1304 \r
1305   public void turnColour_actionPerformed()\r
1306   {\r
1307     changeColour(new TurnColourScheme());\r
1308   }\r
1309 \r
1310   public void buriedColour_actionPerformed()\r
1311   {\r
1312     changeColour(new BuriedColourScheme());\r
1313   }\r
1314 \r
1315   public void nucleotideColour_actionPerformed()\r
1316   {\r
1317     changeColour(new NucleotideColourScheme());\r
1318   }\r
1319 \r
1320   protected void applyToAllGroups_actionPerformed()\r
1321   {\r
1322     viewport.setColourAppliesToAllGroups(applyToAllGroups.getState());\r
1323   }\r
1324 \r
1325   void changeColour(ColourSchemeI cs)\r
1326   {\r
1327     int threshold = 0;\r
1328 \r
1329     if(cs!=null)\r
1330     {\r
1331       if (viewport.getAbovePIDThreshold())\r
1332       {\r
1333         threshold = SliderPanel.setPIDSliderSource(alignPanel, cs, "Background");\r
1334 \r
1335         cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());\r
1336 \r
1337         viewport.setGlobalColourScheme(cs);\r
1338       }\r
1339       else\r
1340       {\r
1341         cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
1342       }\r
1343 \r
1344       if (viewport.getConservationSelected())\r
1345       {\r
1346 \r
1347         Alignment al = (Alignment) viewport.alignment;\r
1348         Conservation c = new Conservation("All",\r
1349                                           ResidueProperties.propHash, 3,\r
1350                                           al.getSequences(), 0,\r
1351                                           al.getWidth() - 1);\r
1352 \r
1353         c.calculate();\r
1354         c.verdict(false, viewport.ConsPercGaps);\r
1355 \r
1356         cs.setConservation(c);\r
1357 \r
1358         cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,\r
1359             "Background"));\r
1360 \r
1361       }\r
1362       else\r
1363       {\r
1364         cs.setConservation(null);\r
1365       }\r
1366 \r
1367       cs.setConsensus(viewport.vconsensus);\r
1368 \r
1369     }\r
1370     viewport.setGlobalColourScheme(cs);\r
1371 \r
1372     if (viewport.getColourAppliesToAllGroups())\r
1373     {\r
1374       Vector groups = viewport.alignment.getGroups();\r
1375       for (int i = 0; i < groups.size(); i++)\r
1376       {\r
1377         SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
1378 \r
1379         if(cs==null)\r
1380         {\r
1381           sg.cs = null;\r
1382           continue;\r
1383         }\r
1384         if (cs instanceof ClustalxColourScheme)\r
1385         {\r
1386           sg.cs = new ClustalxColourScheme(sg.getSequences(true), sg.getWidth());\r
1387         }\r
1388         else\r
1389         {\r
1390           try\r
1391           {\r
1392             sg.cs = (ColourSchemeI) cs.getClass().newInstance();\r
1393           }\r
1394           catch (Exception ex)\r
1395           {\r
1396             ex.printStackTrace();\r
1397             sg.cs = cs;\r
1398           }\r
1399         }\r
1400 \r
1401         if (viewport.getAbovePIDThreshold()\r
1402             || cs instanceof PIDColourScheme\r
1403             || cs instanceof Blosum62ColourScheme)\r
1404         {\r
1405           sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());\r
1406           sg.cs.setConsensus(AAFrequency.calculate(sg.getSequences(true), 0, sg.getWidth()));\r
1407         }\r
1408         else\r
1409           sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
1410 \r
1411         if (viewport.getConservationSelected())\r
1412         {\r
1413           Conservation c = new Conservation("Group",\r
1414                                             ResidueProperties.propHash, 3,\r
1415                                             sg.getSequences(true), 0,\r
1416                                             viewport.alignment.getWidth() - 1);\r
1417           c.calculate();\r
1418           c.verdict(false, viewport.ConsPercGaps);\r
1419           sg.cs.setConservation(c);\r
1420         }\r
1421         else\r
1422         {\r
1423           sg.cs.setConservation(null);\r
1424           sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
1425         }\r
1426 \r
1427       }\r
1428     }\r
1429 \r
1430 \r
1431     if (alignPanel.getOverviewPanel() != null)\r
1432     {\r
1433       alignPanel.getOverviewPanel().updateOverviewImage();\r
1434     }\r
1435 \r
1436     alignPanel.repaint();\r
1437   }\r
1438 \r
1439 \r
1440 \r
1441   protected void modifyPID_actionPerformed()\r
1442   {\r
1443     if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)\r
1444     {\r
1445       SliderPanel.setPIDSliderSource(alignPanel, viewport.getGlobalColourScheme(),\r
1446                                      "Background");\r
1447       SliderPanel.showPIDSlider();\r
1448     }\r
1449   }\r
1450 \r
1451   protected void modifyConservation_actionPerformed()\r
1452   {\r
1453     if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)\r
1454     {\r
1455       SliderPanel.setConservationSlider(alignPanel, viewport.globalColourScheme,\r
1456                                         "Background");\r
1457       SliderPanel.showConservationSlider();\r
1458     }\r
1459   }\r
1460 \r
1461   protected void conservationMenuItem_actionPerformed()\r
1462   {\r
1463     viewport.setConservationSelected(conservationMenuItem.getState());\r
1464 \r
1465     viewport.setAbovePIDThreshold(false);\r
1466     abovePIDThreshold.setState(false);\r
1467 \r
1468     changeColour(viewport.getGlobalColourScheme());\r
1469 \r
1470     modifyConservation_actionPerformed();\r
1471   }\r
1472 \r
1473   public void abovePIDThreshold_actionPerformed()\r
1474   {\r
1475     viewport.setAbovePIDThreshold(abovePIDThreshold.getState());\r
1476 \r
1477     conservationMenuItem.setState(false);\r
1478     viewport.setConservationSelected(false);\r
1479 \r
1480     changeColour(viewport.getGlobalColourScheme());\r
1481 \r
1482     modifyPID_actionPerformed();\r
1483   }\r
1484 \r
1485   public void userDefinedColour_actionPerformed()\r
1486   {\r
1487     new UserDefinedColours(alignPanel, null);\r
1488   }\r
1489 \r
1490   public void PIDColour_actionPerformed()\r
1491   {\r
1492     changeColour(new PIDColourScheme());\r
1493   }\r
1494 \r
1495   public void BLOSUM62Colour_actionPerformed()\r
1496   {\r
1497     changeColour(new Blosum62ColourScheme());\r
1498   }\r
1499 \r
1500   public void sortPairwiseMenuItem_actionPerformed()\r
1501   {\r
1502     addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,\r
1503                                    HistoryItem.SORT));\r
1504     AlignmentSorter.sortByPID(viewport.getAlignment(),\r
1505                               viewport.getAlignment().getSequenceAt(0));\r
1506     alignPanel.repaint();\r
1507   }\r
1508 \r
1509   public void sortIDMenuItem_actionPerformed()\r
1510   {\r
1511     addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,\r
1512                                    HistoryItem.SORT));\r
1513     AlignmentSorter.sortByID(viewport.getAlignment());\r
1514     alignPanel.repaint();\r
1515   }\r
1516 \r
1517   public void sortGroupMenuItem_actionPerformed()\r
1518   {\r
1519     addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,\r
1520                                    HistoryItem.SORT));\r
1521     AlignmentSorter.sortByGroup(viewport.getAlignment());\r
1522     alignPanel.repaint();\r
1523 \r
1524   }\r
1525 \r
1526   public void removeRedundancyMenuItem_actionPerformed()\r
1527   {\r
1528      new RedundancyPanel(alignPanel);\r
1529   }\r
1530 \r
1531   public void pairwiseAlignmentMenuItem_actionPerformed()\r
1532   {\r
1533     if (viewport.getSelectionGroup().getSize(false) > 1)\r
1534     {\r
1535       Frame frame = new Frame();\r
1536       frame.add(new PairwiseAlignPanel(alignPanel));\r
1537       jalview.bin.JalviewLite.addFrame(frame, "Pairwise Alignment", 600, 500);\r
1538     }\r
1539   }\r
1540 \r
1541   public void PCAMenuItem_actionPerformed()\r
1542   {\r
1543     //are the sequences aligned?\r
1544     if (!viewport.alignment.isAligned())\r
1545     {\r
1546       SequenceI current;\r
1547       int Width = viewport.getAlignment().getWidth();\r
1548 \r
1549       for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
1550            i++)\r
1551       {\r
1552         current = viewport.getAlignment().getSequenceAt(i);\r
1553 \r
1554         if (current.getLength() < Width)\r
1555         {\r
1556           current.insertCharAt(Width - 1, viewport.getGapCharacter());\r
1557         }\r
1558       }\r
1559       alignPanel.repaint();\r
1560     }\r
1561 \r
1562     if ( (viewport.getSelectionGroup() != null &&\r
1563           viewport.getSelectionGroup().getSize(false) < 4 &&\r
1564           viewport.getSelectionGroup().getSize(false) > 0)\r
1565         || viewport.getAlignment().getHeight() < 4)\r
1566     {\r
1567       return;\r
1568     }\r
1569 \r
1570     try\r
1571     {\r
1572       new PCAPanel(viewport);\r
1573     }\r
1574     catch (java.lang.OutOfMemoryError ex)\r
1575     {\r
1576     }\r
1577 \r
1578   }\r
1579 \r
1580   public void averageDistanceTreeMenuItem_actionPerformed()\r
1581   {\r
1582     NewTreePanel("AV", "PID", "Average distance tree using PID");\r
1583   }\r
1584 \r
1585   public void neighbourTreeMenuItem_actionPerformed()\r
1586   {\r
1587     NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");\r
1588   }\r
1589 \r
1590   protected void njTreeBlosumMenuItem_actionPerformed()\r
1591   {\r
1592     NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");\r
1593   }\r
1594 \r
1595   protected void avTreeBlosumMenuItem_actionPerformed()\r
1596   {\r
1597     NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62PID");\r
1598   }\r
1599 \r
1600   void NewTreePanel(String type, String pwType, String title)\r
1601   {\r
1602     //are the sequences aligned?\r
1603     if (!viewport.alignment.isAligned())\r
1604     {\r
1605       SequenceI current;\r
1606       int Width = viewport.getAlignment().getWidth();\r
1607 \r
1608       for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
1609            i++)\r
1610       {\r
1611         current = viewport.getAlignment().getSequenceAt(i);\r
1612 \r
1613         if (current.getLength() < Width)\r
1614         {\r
1615           current.insertCharAt(Width - 1, viewport.getGapCharacter());\r
1616         }\r
1617       }\r
1618       alignPanel.repaint();\r
1619 \r
1620     }\r
1621 \r
1622     final TreePanel tp;\r
1623     if (viewport.getSelectionGroup() != null &&\r
1624         viewport.getSelectionGroup().getSize(false) > 3)\r
1625     {\r
1626       tp = new TreePanel(viewport,\r
1627                          viewport.getSelectionGroup().getSequences(false),\r
1628                          type,\r
1629                          pwType,\r
1630                          0, viewport.alignment.getWidth());\r
1631     }\r
1632     else\r
1633     {\r
1634       tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),\r
1635                          type, pwType, 0, viewport.alignment.getWidth());\r
1636     }\r
1637 \r
1638     addTreeMenuItem(tp, title);\r
1639 \r
1640     jalview.bin.JalviewLite.addFrame(tp, title, 600, 500);\r
1641   }\r
1642 \r
1643   void loadTree_actionPerformed()\r
1644   {\r
1645       CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);\r
1646       cap.setText("Paste your Newick tree file here.");\r
1647       cap.treeImport = true;\r
1648       Frame frame = new Frame();\r
1649       frame.add(cap);\r
1650       jalview.bin.JalviewLite.addFrame(frame, "Paste Newick file ", 400, 300);\r
1651   }\r
1652 \r
1653   public void loadTree(jalview.io.NewickFile tree, String treeFile)\r
1654   {\r
1655     TreePanel tp = new TreePanel(viewport,\r
1656                       viewport.getAlignment().getSequences(),\r
1657                       tree, "From File - ", treeFile);\r
1658     jalview.bin.JalviewLite.addFrame(tp, treeFile, 600, 500);\r
1659     addTreeMenuItem(tp, treeFile);\r
1660   }\r
1661 \r
1662   void addTreeMenuItem(final TreePanel treePanel, String title)\r
1663   {\r
1664     final MenuItem item = new MenuItem(title);\r
1665     sortByTreeMenu.add(item);\r
1666     item.addActionListener(new java.awt.event.ActionListener()\r
1667     {\r
1668       public void actionPerformed(ActionEvent evt)\r
1669       {\r
1670         addHistoryItem(new HistoryItem("Sort", viewport.alignment,\r
1671                                        HistoryItem.SORT));\r
1672         AlignmentSorter.sortByTree(viewport.getAlignment(), treePanel.getTree());\r
1673         alignPanel.repaint();\r
1674       }\r
1675     });\r
1676 \r
1677     treePanel.addWindowListener(new WindowAdapter()\r
1678     {\r
1679       public void windowClosing(WindowEvent e)\r
1680       {\r
1681         sortByTreeMenu.remove(item);\r
1682       };\r
1683     });\r
1684   }\r
1685 \r
1686   protected void documentation_actionPerformed()\r
1687   {\r
1688     showURL("http://www.jalview.org/help.html", "HELP");\r
1689   }\r
1690 \r
1691   protected void about_actionPerformed()\r
1692   {\r
1693 \r
1694     class AboutPanel extends Canvas\r
1695     {\r
1696       String version;\r
1697       public AboutPanel(String version)\r
1698       { this.version = version; }\r
1699 \r
1700       public void paint(Graphics g)\r
1701       {\r
1702         g.setColor(Color.white);\r
1703         g.fillRect(0, 0, getSize().width, getSize().height);\r
1704         g.setFont(new Font("Helvetica", Font.PLAIN, 12));\r
1705         FontMetrics fm = g.getFontMetrics();\r
1706         int fh = fm.getHeight();\r
1707         int y = 5, x = 7;\r
1708         g.setColor(Color.black);\r
1709         g.setFont(new Font("Helvetica", Font.BOLD, 14));\r
1710         g.drawString("Jalview - Release "+version, 200, y += fh);\r
1711         g.setFont(new Font("Helvetica", Font.PLAIN, 12));\r
1712         g.drawString("Authors:  Michele Clamp, James Cuff, Steve Searle, Andrew Waterhouse, Jim Procter & Geoff Barton.",\r
1713                      x, y += fh * 2);\r
1714         g.drawString("Current development managed by Andrew Waterhouse; Barton Group, University of Dundee.",\r
1715                      x, y += fh);\r
1716         g.drawString(\r
1717             "For any issues relating to Jalview, email help@jalview.org", x,\r
1718             y += fh);\r
1719         g.drawString("If  you use JalView, please cite:", x, y += fh + 8);\r
1720         g.drawString("\"Clamp, M., Cuff, J., Searle, S. M. and Barton, G. J. (2004), The Jalview Java Alignment Editor\"",\r
1721                      x, y += fh);\r
1722         g.drawString("Bioinformatics,  2004 20;426-7.", x, y += fh);\r
1723       }\r
1724     }\r
1725 \r
1726     String version = "test";\r
1727     java.net.URL url = getClass().getResource("/.build_properties");\r
1728     if (url != null)\r
1729     {\r
1730       try\r
1731       {\r
1732         BufferedReader reader = new BufferedReader(new InputStreamReader(\r
1733             url.openStream()));\r
1734         String line;\r
1735         while ( (line = reader.readLine()) != null)\r
1736         {\r
1737           if (line.indexOf("VERSION") > -1)\r
1738           {\r
1739             version = line.substring(line.indexOf("=") + 1);\r
1740           }\r
1741         }\r
1742       }\r
1743       catch (Exception ex)\r
1744       {\r
1745         ex.printStackTrace();\r
1746       }\r
1747     }\r
1748 \r
1749 \r
1750     Frame frame = new Frame();\r
1751     frame.add(new AboutPanel(version));\r
1752     jalview.bin.JalviewLite.addFrame(frame, "Jalview", 580, 200);\r
1753 \r
1754   }\r
1755 \r
1756   public void showURL(String url, String target)\r
1757   {\r
1758     if (applet == null)\r
1759     {\r
1760       System.out.println("Not running as applet - no browser available.");\r
1761     }\r
1762     else\r
1763     {\r
1764       try\r
1765       {\r
1766         System.out.println("Show url: "+url);\r
1767         applet.getAppletContext().showDocument(new java.net.URL(url),\r
1768                                                target);\r
1769       }\r
1770       catch (Exception ex)\r
1771       {\r
1772         ex.printStackTrace();\r
1773       }\r
1774     }\r
1775   }\r
1776 \r
1777 \r
1778   //////////////////////////////////////////////////////////////////////////////////\r
1779   //JBuilder Graphics here\r
1780 \r
1781     protected MenuBar alignFrameMenuBar = new MenuBar();\r
1782     protected Menu fileMenu = new Menu("File");\r
1783     protected MenuItem loadApplication = new MenuItem("View in Full Application");\r
1784     protected MenuItem loadTree = new MenuItem("Load Associated Tree");\r
1785     protected MenuItem closeMenuItem = new MenuItem("Close");\r
1786     protected Menu editMenu = new Menu("Edit");\r
1787     protected Menu viewMenu = new Menu("View");\r
1788     protected Menu colourMenu = new Menu("Colour");\r
1789     protected Menu calculateMenu = new Menu("Calculate");\r
1790     protected MenuItem selectAllSequenceMenuItem = new MenuItem("Select all");\r
1791     protected MenuItem deselectAllSequenceMenuItem = new MenuItem("Deselect All");\r
1792     protected MenuItem invertSequenceMenuItem = new MenuItem("Invert Selection");\r
1793     protected MenuItem remove2LeftMenuItem = new MenuItem();\r
1794     protected MenuItem remove2RightMenuItem = new MenuItem();\r
1795     protected MenuItem removeGappedColumnMenuItem = new MenuItem();\r
1796     protected MenuItem removeAllGapsMenuItem = new MenuItem();\r
1797     protected CheckboxMenuItem viewBoxesMenuItem = new CheckboxMenuItem();\r
1798     protected CheckboxMenuItem viewTextMenuItem = new CheckboxMenuItem();\r
1799     protected MenuItem sortPairwiseMenuItem = new MenuItem();\r
1800     protected MenuItem sortIDMenuItem = new MenuItem();\r
1801     protected MenuItem sortGroupMenuItem = new MenuItem();\r
1802     protected MenuItem removeRedundancyMenuItem = new MenuItem();\r
1803     protected MenuItem pairwiseAlignmentMenuItem = new MenuItem();\r
1804     protected MenuItem PCAMenuItem = new MenuItem();\r
1805     protected MenuItem averageDistanceTreeMenuItem = new MenuItem();\r
1806     protected MenuItem neighbourTreeMenuItem = new MenuItem();\r
1807     BorderLayout borderLayout1 = new BorderLayout();\r
1808     public Label statusBar = new Label();\r
1809     protected Menu outputTextboxMenu = new Menu();\r
1810     protected MenuItem clustalColour = new MenuItem();\r
1811     protected MenuItem zappoColour = new MenuItem();\r
1812     protected MenuItem taylorColour = new MenuItem();\r
1813     protected MenuItem hydrophobicityColour = new MenuItem();\r
1814     protected MenuItem helixColour = new MenuItem();\r
1815     protected MenuItem strandColour = new MenuItem();\r
1816     protected MenuItem turnColour = new MenuItem();\r
1817     protected MenuItem buriedColour = new MenuItem();\r
1818     protected MenuItem userDefinedColour = new MenuItem();\r
1819     protected MenuItem PIDColour = new MenuItem();\r
1820     protected MenuItem BLOSUM62Colour = new MenuItem();\r
1821     MenuItem njTreeBlosumMenuItem = new MenuItem();\r
1822     MenuItem avDistanceTreeBlosumMenuItem = new MenuItem();\r
1823     protected CheckboxMenuItem annotationPanelMenuItem = new CheckboxMenuItem();\r
1824     protected CheckboxMenuItem colourTextMenuItem = new CheckboxMenuItem();\r
1825     MenuItem overviewMenuItem = new MenuItem();\r
1826     protected MenuItem undoMenuItem = new MenuItem();\r
1827     protected MenuItem redoMenuItem = new MenuItem();\r
1828     protected CheckboxMenuItem conservationMenuItem = new CheckboxMenuItem();\r
1829     MenuItem noColourmenuItem = new MenuItem();\r
1830     protected CheckboxMenuItem wrapMenuItem = new CheckboxMenuItem();\r
1831     protected CheckboxMenuItem renderGapsMenuItem = new CheckboxMenuItem();\r
1832     MenuItem findMenuItem = new MenuItem();\r
1833     Menu searchMenu = new Menu();\r
1834     protected CheckboxMenuItem abovePIDThreshold = new CheckboxMenuItem();\r
1835     protected MenuItem nucleotideColour = new MenuItem();\r
1836     MenuItem deleteGroups = new MenuItem();\r
1837     MenuItem delete = new MenuItem();\r
1838     MenuItem copy = new MenuItem();\r
1839     MenuItem cut = new MenuItem();\r
1840     Menu pasteMenu = new Menu();\r
1841     MenuItem pasteNew = new MenuItem();\r
1842     MenuItem pasteThis = new MenuItem();\r
1843     protected CheckboxMenuItem applyToAllGroups = new CheckboxMenuItem();\r
1844     protected MenuItem font = new MenuItem();\r
1845     protected CheckboxMenuItem scaleAbove = new CheckboxMenuItem();\r
1846     protected CheckboxMenuItem scaleLeft = new CheckboxMenuItem();\r
1847     protected CheckboxMenuItem scaleRight = new CheckboxMenuItem();\r
1848     MenuItem modifyPID = new MenuItem();\r
1849     MenuItem modifyConservation = new MenuItem();\r
1850     protected CheckboxMenuItem autoCalculate\r
1851         = new CheckboxMenuItem("Autocalculate Consensus", true);\r
1852     protected Menu sortByTreeMenu = new Menu();\r
1853     Menu sort = new Menu();\r
1854     Menu calculate = new Menu();\r
1855     MenuItem inputText = new MenuItem();\r
1856     Menu helpMenu = new Menu();\r
1857     MenuItem documentation = new MenuItem();\r
1858     MenuItem about = new MenuItem();\r
1859     protected CheckboxMenuItem seqLimits = new CheckboxMenuItem();\r
1860   Panel embeddedMenu;\r
1861   Label embeddedEdit;\r
1862   Label embeddedSearch;\r
1863   Label embeddedView;\r
1864   Label embeddedColour;\r
1865   Label embeddedFile;\r
1866   Label embeddedHelp;\r
1867   Label embeddedCalculate;\r
1868   FlowLayout flowLayout1;\r
1869 \r
1870   private void jbInit() throws Exception {\r
1871 \r
1872       setMenuBar(alignFrameMenuBar);\r
1873 \r
1874       MenuItem item;\r
1875 \r
1876       // dynamically fill save as menu with available formats\r
1877       for (int i = 0; i < jalview.io.AppletFormatAdapter.formats.size(); i++)\r
1878       {\r
1879 \r
1880         item = new MenuItem( (String) jalview.io.AppletFormatAdapter.formats.\r
1881                             elementAt(\r
1882                                 i));\r
1883         item.addActionListener(new java.awt.event.ActionListener()\r
1884         {\r
1885           public void actionPerformed(ActionEvent e)\r
1886           {\r
1887             outputText_actionPerformed(e);\r
1888           }\r
1889         });\r
1890 \r
1891         outputTextboxMenu.add(item);\r
1892       }\r
1893         closeMenuItem.addActionListener(this);\r
1894         loadApplication.addActionListener(this);\r
1895 \r
1896         loadTree.addActionListener(this);\r
1897         selectAllSequenceMenuItem.addActionListener(this);\r
1898         deselectAllSequenceMenuItem.addActionListener(this);\r
1899         invertSequenceMenuItem.addActionListener(this);\r
1900         remove2LeftMenuItem.setLabel("Remove Left");\r
1901         remove2LeftMenuItem.addActionListener(this);\r
1902         remove2RightMenuItem.setLabel("Remove Right");\r
1903         remove2RightMenuItem.addActionListener(this);\r
1904         removeGappedColumnMenuItem.setLabel("Remove Empty Columns");\r
1905         removeGappedColumnMenuItem.addActionListener(this);\r
1906         removeAllGapsMenuItem.setLabel("Remove All Gaps");\r
1907         removeAllGapsMenuItem.addActionListener(this);\r
1908         viewBoxesMenuItem.setLabel("Boxes");\r
1909         viewBoxesMenuItem.setState(true);\r
1910         viewBoxesMenuItem.addItemListener(this);\r
1911         viewTextMenuItem.setLabel("Text");\r
1912         viewTextMenuItem.setState(true);\r
1913         viewTextMenuItem.addItemListener(this);\r
1914         sortPairwiseMenuItem.setLabel("by Pairwise Identity");\r
1915         sortPairwiseMenuItem.addActionListener(this);\r
1916         sortIDMenuItem.setLabel("by ID");\r
1917         sortIDMenuItem.addActionListener(this);\r
1918         sortGroupMenuItem.setLabel("by Group");\r
1919         sortGroupMenuItem.addActionListener(this);\r
1920         removeRedundancyMenuItem.setLabel("Remove Redundancy...");\r
1921         removeRedundancyMenuItem.addActionListener(this);\r
1922         pairwiseAlignmentMenuItem.setLabel("Pairwise Alignments...");\r
1923         pairwiseAlignmentMenuItem.addActionListener(this);\r
1924         PCAMenuItem.setLabel("Principal Component Analysis");\r
1925         PCAMenuItem.addActionListener(this);\r
1926         averageDistanceTreeMenuItem.setLabel(\r
1927             "Average Distance Using % Identity");\r
1928         averageDistanceTreeMenuItem.addActionListener(this);\r
1929         neighbourTreeMenuItem.setLabel("Neighbour Joining Using % Identity");\r
1930         neighbourTreeMenuItem.addActionListener(this);\r
1931         alignFrameMenuBar.setFont(new java.awt.Font("Verdana", 0, 11));\r
1932         statusBar.setBackground(Color.white);\r
1933         statusBar.setFont(new java.awt.Font("Verdana", 0, 11));\r
1934         statusBar.setText("Status bar");\r
1935         outputTextboxMenu.setLabel("Output to Textbox");\r
1936         clustalColour.setLabel("Clustalx");\r
1937 \r
1938         clustalColour.addActionListener(this);\r
1939         zappoColour.setLabel("Zappo");\r
1940         zappoColour.addActionListener(this);\r
1941         taylorColour.setLabel("Taylor");\r
1942         taylorColour.addActionListener(this);\r
1943         hydrophobicityColour.setLabel("Hydrophobicity");\r
1944         hydrophobicityColour.addActionListener(this);\r
1945         helixColour.setLabel("Helix Propensity");\r
1946         helixColour.addActionListener(this);\r
1947         strandColour.setLabel("Strand Propensity");\r
1948         strandColour.addActionListener(this);\r
1949         turnColour.setLabel("Turn Propensity");\r
1950         turnColour.addActionListener(this);\r
1951         buriedColour.setLabel("Buried Index");\r
1952         buriedColour.addActionListener(this);\r
1953         userDefinedColour.setLabel("User Defined...");\r
1954         userDefinedColour.addActionListener(this);\r
1955         PIDColour.setLabel("Percentage Identity");\r
1956         PIDColour.addActionListener(this);\r
1957         BLOSUM62Colour.setLabel("BLOSUM62 Score");\r
1958         BLOSUM62Colour.addActionListener(this);\r
1959         avDistanceTreeBlosumMenuItem.setLabel(\r
1960             "Average Distance Using BLOSUM62");\r
1961         avDistanceTreeBlosumMenuItem.addActionListener(this);\r
1962         njTreeBlosumMenuItem.setLabel("Neighbour Joining Using BLOSUM62");\r
1963         njTreeBlosumMenuItem.addActionListener(this);\r
1964         annotationPanelMenuItem.setLabel("Show Annotations");\r
1965         annotationPanelMenuItem.addItemListener(this);\r
1966         colourTextMenuItem.setLabel("Colour Text");\r
1967         colourTextMenuItem.addItemListener(this);\r
1968         overviewMenuItem.setLabel("Overview Window");\r
1969         overviewMenuItem.addActionListener(this);\r
1970         undoMenuItem.setEnabled(false);\r
1971         undoMenuItem.setLabel("Undo");\r
1972         undoMenuItem.addActionListener(this);\r
1973         redoMenuItem.setEnabled(false);\r
1974         redoMenuItem.setLabel("Redo");\r
1975         redoMenuItem.addActionListener(this);\r
1976         conservationMenuItem.setLabel("by Conservation");\r
1977         conservationMenuItem.addItemListener(this);\r
1978         noColourmenuItem.setLabel("None");\r
1979         noColourmenuItem.addActionListener(this);\r
1980         wrapMenuItem.setLabel("Wrap");\r
1981         wrapMenuItem.addItemListener(this);\r
1982         renderGapsMenuItem.setLabel("Show Gaps");\r
1983         renderGapsMenuItem.setState(true);\r
1984         renderGapsMenuItem.addItemListener(this);\r
1985         findMenuItem.setLabel("Find...");\r
1986         findMenuItem.addActionListener(this);\r
1987         searchMenu.setLabel("Search");\r
1988 \r
1989         abovePIDThreshold.setLabel("Above Identity Threshold");\r
1990         abovePIDThreshold.addItemListener(this);\r
1991         nucleotideColour.setLabel("Nucleotide");\r
1992         nucleotideColour.addActionListener(this);\r
1993         deleteGroups.setLabel("Undefine Groups");\r
1994         deleteGroups.addActionListener(this);\r
1995         copy.setLabel("Copy");\r
1996         copy.addActionListener(this);\r
1997         cut.setLabel("Cut");\r
1998         cut.addActionListener(this);\r
1999         delete.setLabel("Delete");\r
2000         delete.addActionListener(this);\r
2001         pasteMenu.setLabel("Paste");\r
2002         pasteNew.setLabel("To New Alignment");\r
2003         pasteNew.addActionListener(this);\r
2004         pasteThis.setLabel("Add To This Alignment");\r
2005         pasteThis.addActionListener(this);\r
2006         applyToAllGroups.setLabel("Apply Colour To All Groups");\r
2007         applyToAllGroups.setState(true);\r
2008         applyToAllGroups.addItemListener(this);\r
2009         font.setLabel("Font...");\r
2010         font.addActionListener(this);\r
2011         scaleAbove.setLabel("Scale Above");\r
2012         scaleAbove.setState(true);\r
2013         scaleAbove.setEnabled(false);\r
2014         scaleAbove.addItemListener(this);\r
2015         scaleLeft.setEnabled(false);\r
2016         scaleLeft.setState(true);\r
2017         scaleLeft.setLabel("Scale Left");\r
2018         scaleLeft.addItemListener(this);\r
2019         scaleRight.setEnabled(false);\r
2020         scaleRight.setState(true);\r
2021         scaleRight.setLabel("Scale Right");\r
2022         scaleRight.addItemListener(this);\r
2023         modifyPID.setLabel("Modify Identity Threshold...");\r
2024         modifyPID.addActionListener(this);\r
2025         modifyConservation.setLabel("Modify Conservation Threshold...");\r
2026         modifyConservation.addActionListener(this);\r
2027         sortByTreeMenu.setLabel("By Tree Order");\r
2028         sort.setLabel("Sort");\r
2029         calculate.setLabel("Calculate Tree");\r
2030         autoCalculate.addItemListener(this);\r
2031         inputText.setLabel("Input from textbox");\r
2032         inputText.addActionListener(this);\r
2033 \r
2034         helpMenu.setLabel("Help");\r
2035         documentation.setLabel("Documentation");\r
2036         documentation.addActionListener(this);\r
2037 \r
2038         about.setLabel("About...");\r
2039         about.addActionListener(this);\r
2040           seqLimits.setState(true);\r
2041     seqLimits.setLabel("Show Sequence Limits");\r
2042     seqLimits.addItemListener(this);\r
2043     featureSettings.setLabel("Feature Settings...");\r
2044     featureSettings.addActionListener(this);\r
2045     sequenceFeatures.setLabel("Sequence Features");\r
2046     sequenceFeatures.addItemListener(this);\r
2047     sequenceFeatures.setState(false);\r
2048     annotationColour.setLabel("by Annotation...");\r
2049     annotationColour.addActionListener(this);\r
2050 \r
2051     alignFrameMenuBar.add(fileMenu);\r
2052         alignFrameMenuBar.add(editMenu);\r
2053         alignFrameMenuBar.add(searchMenu);\r
2054         alignFrameMenuBar.add(viewMenu);\r
2055         alignFrameMenuBar.add(colourMenu);\r
2056         alignFrameMenuBar.add(calculateMenu);\r
2057         alignFrameMenuBar.add(helpMenu);\r
2058         fileMenu.add(inputText);\r
2059         fileMenu.add(outputTextboxMenu);\r
2060        // fileMenu.add(loadApplication);\r
2061         fileMenu.addSeparator();\r
2062         fileMenu.add(loadTree);\r
2063         fileMenu.add(closeMenuItem);\r
2064         editMenu.add(undoMenuItem);\r
2065         editMenu.add(redoMenuItem);\r
2066         editMenu.add(cut);\r
2067         editMenu.add(copy);\r
2068         editMenu.add(pasteMenu);\r
2069         editMenu.add(delete);\r
2070         editMenu.addSeparator();\r
2071         editMenu.add(selectAllSequenceMenuItem);\r
2072         editMenu.add(deselectAllSequenceMenuItem);\r
2073         editMenu.add(invertSequenceMenuItem);\r
2074         editMenu.add(deleteGroups);\r
2075         editMenu.addSeparator();\r
2076         editMenu.add(remove2LeftMenuItem);\r
2077         editMenu.add(remove2RightMenuItem);\r
2078         editMenu.add(removeGappedColumnMenuItem);\r
2079         editMenu.add(removeAllGapsMenuItem);\r
2080         editMenu.add(removeRedundancyMenuItem);\r
2081         searchMenu.add(findMenuItem);\r
2082         viewMenu.add(font);\r
2083         viewMenu.addSeparator();\r
2084     viewMenu.add(seqLimits);\r
2085         viewMenu.addSeparator();\r
2086     viewMenu.add(wrapMenuItem);\r
2087         viewMenu.add(scaleAbove);\r
2088         viewMenu.add(scaleLeft);\r
2089         viewMenu.add(scaleRight);\r
2090         viewMenu.addSeparator();\r
2091     viewMenu.add(viewBoxesMenuItem);\r
2092         viewMenu.add(viewTextMenuItem);\r
2093         viewMenu.add(colourTextMenuItem);\r
2094         viewMenu.add(renderGapsMenuItem);\r
2095         viewMenu.add(annotationPanelMenuItem);\r
2096     viewMenu.addSeparator();\r
2097         viewMenu.add(sequenceFeatures);\r
2098         viewMenu.add(featureSettings);\r
2099     viewMenu.addSeparator();\r
2100         viewMenu.add(overviewMenuItem);\r
2101         colourMenu.add(applyToAllGroups);\r
2102         colourMenu.addSeparator();\r
2103         colourMenu.add(noColourmenuItem);\r
2104         colourMenu.add(clustalColour);\r
2105         colourMenu.add(BLOSUM62Colour);\r
2106         colourMenu.add(PIDColour);\r
2107         colourMenu.add(zappoColour);\r
2108         colourMenu.add(taylorColour);\r
2109         colourMenu.add(hydrophobicityColour);\r
2110         colourMenu.add(helixColour);\r
2111         colourMenu.add(strandColour);\r
2112         colourMenu.add(turnColour);\r
2113         colourMenu.add(buriedColour);\r
2114         colourMenu.add(nucleotideColour);\r
2115         colourMenu.add(userDefinedColour);\r
2116         colourMenu.addSeparator();\r
2117         colourMenu.add(conservationMenuItem);\r
2118         colourMenu.add(modifyConservation);\r
2119         colourMenu.add(abovePIDThreshold);\r
2120         colourMenu.add(modifyPID);\r
2121     colourMenu.add(annotationColour);\r
2122     calculateMenu.add(sort);\r
2123         calculateMenu.add(calculate);\r
2124         calculateMenu.addSeparator();\r
2125         calculateMenu.add(pairwiseAlignmentMenuItem);\r
2126         calculateMenu.add(PCAMenuItem);\r
2127         calculateMenu.add(autoCalculate);\r
2128         this.add(statusBar, BorderLayout.SOUTH);\r
2129         pasteMenu.add(pasteNew);\r
2130         pasteMenu.add(pasteThis);\r
2131         sort.add(sortIDMenuItem);\r
2132         sort.add(sortByTreeMenu);\r
2133         sort.add(sortGroupMenuItem);\r
2134         sort.add(sortPairwiseMenuItem);\r
2135         calculate.add(averageDistanceTreeMenuItem);\r
2136         calculate.add(neighbourTreeMenuItem);\r
2137         calculate.add(avDistanceTreeBlosumMenuItem);\r
2138         calculate.add(njTreeBlosumMenuItem);\r
2139         helpMenu.add(documentation);\r
2140         helpMenu.add(about);\r
2141   }\r
2142 \r
2143   public void setEmbedded()\r
2144   {\r
2145 \r
2146     embeddedMenu = new Panel();\r
2147     embeddedEdit = new Label();\r
2148     embeddedSearch = new Label();\r
2149     embeddedView = new Label();\r
2150     embeddedColour = new Label();\r
2151     embeddedFile = new Label();\r
2152     embeddedHelp = new Label();\r
2153     embeddedCalculate = new Label();\r
2154     flowLayout1 = new FlowLayout();\r
2155     embeddedMenu.setBackground(Color.lightGray);\r
2156     embeddedMenu.setLayout(flowLayout1);\r
2157     embeddedEdit.setText("Edit");\r
2158     embeddedEdit.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2159     embeddedSearch.setText("Search");\r
2160     embeddedSearch.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2161     embeddedView.setText("View");\r
2162     embeddedView.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2163     embeddedColour.setText("Colour");\r
2164     embeddedColour.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2165     embeddedFile.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2166     embeddedFile.setText("File");\r
2167     embeddedHelp.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2168     embeddedHelp.setText("Help");\r
2169     embeddedCalculate.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2170     embeddedCalculate.setText("Calculate");\r
2171     embeddedMenu.add(embeddedFile);\r
2172     embeddedMenu.add(embeddedEdit);\r
2173     embeddedMenu.add(embeddedSearch);\r
2174     embeddedMenu.add(embeddedView);\r
2175     embeddedMenu.add(embeddedColour);\r
2176     embeddedMenu.add(embeddedCalculate);\r
2177     embeddedMenu.add(embeddedHelp);\r
2178     flowLayout1.setAlignment(FlowLayout.LEFT);\r
2179     flowLayout1.setHgap(2);\r
2180     flowLayout1.setVgap(0);\r
2181     embeddedFile.addMouseListener(this);\r
2182     embeddedEdit.addMouseListener(this);\r
2183     embeddedSearch.addMouseListener(this);\r
2184     embeddedView.addMouseListener(this);\r
2185     embeddedColour.addMouseListener(this);\r
2186     embeddedCalculate.addMouseListener(this);\r
2187     embeddedHelp.addMouseListener(this);\r
2188 \r
2189    // setVisible(false);\r
2190     fileMenu.remove(closeMenuItem);\r
2191     fileMenu.remove(3); // Seperator\r
2192 \r
2193     applet.setLayout(new BorderLayout());\r
2194     applet.add(embeddedMenu, BorderLayout.NORTH);\r
2195     applet.add(statusBar, BorderLayout.SOUTH);\r
2196    // applet.validate();\r
2197 \r
2198     alignPanel.setSize(applet.size().width, applet.size().height\r
2199                        - embeddedMenu.HEIGHT - statusBar.HEIGHT);\r
2200 \r
2201      applet.add(alignPanel, BorderLayout.CENTER);\r
2202      applet.validate();\r
2203 \r
2204   }\r
2205 \r
2206 \r
2207 \r
2208   PopupMenu filePopup, editPopup, searchPopup,\r
2209       viewPopup, colourPopup, calculatePopup, helpPopup;\r
2210   MenuItem featureSettings = new MenuItem();\r
2211   CheckboxMenuItem sequenceFeatures = new CheckboxMenuItem();\r
2212   MenuItem annotationColour = new MenuItem();\r
2213 \r
2214   public void mousePressed(MouseEvent evt)\r
2215   {\r
2216     PopupMenu popup = null;\r
2217     Label source = (Label)evt.getSource();\r
2218     if(source==embeddedFile)\r
2219     {\r
2220       popup = filePopup = genPopupMenu(filePopup, fileMenu);\r
2221     }\r
2222     else if(source==embeddedEdit)\r
2223     {\r
2224       popup = editPopup = genPopupMenu(editPopup, editMenu);\r
2225     }\r
2226     else if(source==embeddedSearch)\r
2227     {\r
2228       popup = searchPopup = genPopupMenu(searchPopup, searchMenu);\r
2229     }\r
2230     else if(source==embeddedView)\r
2231     {\r
2232       popup = viewPopup = genPopupMenu(viewPopup, viewMenu);\r
2233     }\r
2234     else if(source==embeddedColour)\r
2235     {\r
2236       popup = colourPopup = genPopupMenu(colourPopup, colourMenu);\r
2237     }\r
2238     else if(source==embeddedCalculate)\r
2239     {\r
2240       popup = calculatePopup = genPopupMenu(calculatePopup, calculateMenu);\r
2241     }\r
2242     else if(source==embeddedHelp)\r
2243     {\r
2244       popup = helpPopup = genPopupMenu(helpPopup, helpMenu);\r
2245     }\r
2246 \r
2247     embeddedMenu.add(popup);\r
2248     popup.show(embeddedMenu,\r
2249                source.getBounds().x,\r
2250                source.getBounds().y + source.getBounds().getSize().height);\r
2251   }\r
2252 \r
2253   PopupMenu genPopupMenu(PopupMenu popup, Menu original)\r
2254   {\r
2255     if(popup!=null)\r
2256     {\r
2257       return popup;\r
2258     }\r
2259     popup = new PopupMenu();\r
2260     int m, mSize = original.getItemCount();\r
2261     for(m=0; m<mSize; m++)\r
2262     {\r
2263       popup.add(original.getItem(m));\r
2264       mSize--;\r
2265       m--;\r
2266     }\r
2267 \r
2268     return popup;\r
2269   }\r
2270   public void mouseClicked(MouseEvent evt)\r
2271   {}\r
2272   public void mouseReleased(MouseEvent evt)\r
2273   {}\r
2274   public void mouseEntered(MouseEvent evt)\r
2275   {}\r
2276   public void mouseExited(MouseEvent evt)\r
2277   {}\r
2278 \r
2279 }\r
2280 \r