Prepare for launchFullApplication
[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.sequences.contains(seq))\r
651         {\r
652           continue;\r
653         }\r
654 \r
655         SequenceI temp = viewport.alignment.getSequenceAt(i - 1);\r
656         if (sg.sequences.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.sequences.contains(seq))\r
671         {\r
672           continue;\r
673         }\r
674 \r
675         SequenceI temp = viewport.alignment.getSequenceAt(i + 1);\r
676         if (sg.sequences.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(); 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(); 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.sequences.size()==viewport.alignment.getHeight())\r
857           allSequences = true;\r
858 \r
859     for (int i = 0; i < sg.sequences.size(); 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().sequences != null\r
1041         && viewport.getSelectionGroup().sequences.size()>0)\r
1042     {\r
1043       seqs = viewport.getSelectionGroup().sequences;\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(sg.sequences, sg.getWidth());\r
1150       }\r
1151       sg.recalcConservation();\r
1152     }\r
1153   }\r
1154 \r
1155 \r
1156 \r
1157   public void findMenuItem_actionPerformed()\r
1158   {\r
1159     new Finder(alignPanel);\r
1160   }\r
1161 \r
1162   public void font_actionPerformed()\r
1163   {\r
1164     new FontChooser(alignPanel);\r
1165   }\r
1166 \r
1167 \r
1168   public void seqLimits_itemStateChanged()\r
1169   {\r
1170     viewport.setShowJVSuffix(seqLimits.getState());\r
1171     alignPanel.fontChanged();\r
1172     alignPanel.repaint();\r
1173   }\r
1174 \r
1175 \r
1176   protected void colourTextMenuItem_actionPerformed()\r
1177   {\r
1178     viewport.setColourText(colourTextMenuItem.getState());\r
1179     alignPanel.repaint();\r
1180   }\r
1181 \r
1182   protected void wrapMenuItem_actionPerformed()\r
1183   {\r
1184     viewport.setWrapAlignment(wrapMenuItem.getState());\r
1185     alignPanel.setWrapAlignment(wrapMenuItem.getState());\r
1186     scaleAbove.setEnabled(wrapMenuItem.getState());\r
1187     scaleLeft.setEnabled(wrapMenuItem.getState());\r
1188     scaleRight.setEnabled(wrapMenuItem.getState());\r
1189     alignPanel.repaint();\r
1190   }\r
1191 \r
1192   protected void scaleAbove_actionPerformed()\r
1193   {\r
1194     viewport.setScaleAboveWrapped(scaleAbove.getState());\r
1195     alignPanel.repaint();\r
1196   }\r
1197 \r
1198   protected void scaleLeft_actionPerformed()\r
1199   {\r
1200     viewport.setScaleLeftWrapped(scaleLeft.getState());\r
1201     alignPanel.repaint();\r
1202   }\r
1203 \r
1204   protected void scaleRight_actionPerformed()\r
1205   {\r
1206     viewport.setScaleRightWrapped(scaleRight.getState());\r
1207     alignPanel.repaint();\r
1208   }\r
1209 \r
1210   public void viewBoxesMenuItem_actionPerformed()\r
1211   {\r
1212     viewport.setShowBoxes(viewBoxesMenuItem.getState());\r
1213     alignPanel.repaint();\r
1214   }\r
1215 \r
1216   public void viewTextMenuItem_actionPerformed()\r
1217   {\r
1218     viewport.setShowText(viewTextMenuItem.getState());\r
1219     alignPanel.repaint();\r
1220   }\r
1221 \r
1222   protected void renderGapsMenuItem_actionPerformed()\r
1223   {\r
1224     viewport.setRenderGaps(renderGapsMenuItem.getState());\r
1225     alignPanel.repaint();\r
1226   }\r
1227 \r
1228   public void annotationPanelMenuItem_actionPerformed()\r
1229   {\r
1230     viewport.setShowAnnotation(annotationPanelMenuItem.getState());\r
1231     alignPanel.setAnnotationVisible(annotationPanelMenuItem.getState());\r
1232   }\r
1233 \r
1234   public void featureSettings_actionPerformed()\r
1235   {\r
1236     new FeatureSettings(viewport, alignPanel);\r
1237   }\r
1238 \r
1239   public void overviewMenuItem_actionPerformed()\r
1240   {\r
1241     if (alignPanel.overviewPanel != null)\r
1242     {\r
1243       return;\r
1244     }\r
1245 \r
1246     Frame frame = new Frame();\r
1247     OverviewPanel overview = new OverviewPanel(alignPanel);\r
1248     frame.add(overview);\r
1249     // +50 must allow for applet frame window\r
1250     jalview.bin.JalviewLite.addFrame(frame, "Overview " + this.getTitle(),\r
1251                                      overview.preferredSize().width,\r
1252                                      overview.preferredSize().height + 50);\r
1253 \r
1254     frame.pack();\r
1255     frame.addWindowListener(new WindowAdapter()\r
1256     {\r
1257       public void windowClosing(WindowEvent e)\r
1258       {\r
1259         alignPanel.setOverviewPanel(null);\r
1260       };\r
1261     });\r
1262 \r
1263     alignPanel.setOverviewPanel(overview);\r
1264 \r
1265   }\r
1266 \r
1267   protected void noColourmenuItem_actionPerformed()\r
1268   {\r
1269     changeColour(null);\r
1270   }\r
1271 \r
1272   public void clustalColour_actionPerformed()\r
1273   {\r
1274     abovePIDThreshold.setState(false);\r
1275     changeColour(new ClustalxColourScheme(viewport.alignment.getSequences(),\r
1276                                           viewport.alignment.getWidth()));\r
1277   }\r
1278 \r
1279   public void zappoColour_actionPerformed()\r
1280   {\r
1281     changeColour(new ZappoColourScheme());\r
1282   }\r
1283 \r
1284   public void taylorColour_actionPerformed()\r
1285   {\r
1286     changeColour(new TaylorColourScheme());\r
1287   }\r
1288 \r
1289   public void hydrophobicityColour_actionPerformed()\r
1290   {\r
1291     changeColour(new HydrophobicColourScheme());\r
1292   }\r
1293 \r
1294   public void helixColour_actionPerformed()\r
1295   {\r
1296     changeColour(new HelixColourScheme());\r
1297   }\r
1298 \r
1299   public void strandColour_actionPerformed()\r
1300   {\r
1301     changeColour(new StrandColourScheme());\r
1302   }\r
1303 \r
1304   public void turnColour_actionPerformed()\r
1305   {\r
1306     changeColour(new TurnColourScheme());\r
1307   }\r
1308 \r
1309   public void buriedColour_actionPerformed()\r
1310   {\r
1311     changeColour(new BuriedColourScheme());\r
1312   }\r
1313 \r
1314   public void nucleotideColour_actionPerformed()\r
1315   {\r
1316     changeColour(new NucleotideColourScheme());\r
1317   }\r
1318 \r
1319   protected void applyToAllGroups_actionPerformed()\r
1320   {\r
1321     viewport.setColourAppliesToAllGroups(applyToAllGroups.getState());\r
1322   }\r
1323 \r
1324   void changeColour(ColourSchemeI cs)\r
1325   {\r
1326     int threshold = 0;\r
1327 \r
1328     if(cs!=null)\r
1329     {\r
1330       if (viewport.getAbovePIDThreshold())\r
1331       {\r
1332         threshold = SliderPanel.setPIDSliderSource(alignPanel, cs, "Background");\r
1333 \r
1334         cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());\r
1335 \r
1336         viewport.setGlobalColourScheme(cs);\r
1337       }\r
1338       else\r
1339       {\r
1340         cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
1341       }\r
1342 \r
1343       if (viewport.getConservationSelected())\r
1344       {\r
1345 \r
1346         Alignment al = (Alignment) viewport.alignment;\r
1347         Conservation c = new Conservation("All",\r
1348                                           ResidueProperties.propHash, 3,\r
1349                                           al.getSequences(), 0,\r
1350                                           al.getWidth() - 1);\r
1351 \r
1352         c.calculate();\r
1353         c.verdict(false, viewport.ConsPercGaps);\r
1354 \r
1355         cs.setConservation(c);\r
1356 \r
1357         cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,\r
1358             "Background"));\r
1359 \r
1360       }\r
1361       else\r
1362       {\r
1363         cs.setConservation(null);\r
1364       }\r
1365 \r
1366       cs.setConsensus(viewport.vconsensus);\r
1367 \r
1368     }\r
1369     viewport.setGlobalColourScheme(cs);\r
1370 \r
1371     if (viewport.getColourAppliesToAllGroups())\r
1372     {\r
1373       Vector groups = viewport.alignment.getGroups();\r
1374       for (int i = 0; i < groups.size(); i++)\r
1375       {\r
1376         SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
1377 \r
1378         if(cs==null)\r
1379         {\r
1380           sg.cs = null;\r
1381           continue;\r
1382         }\r
1383         if (cs instanceof ClustalxColourScheme)\r
1384         {\r
1385           sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());\r
1386         }\r
1387         else\r
1388         {\r
1389           try\r
1390           {\r
1391             sg.cs = (ColourSchemeI) cs.getClass().newInstance();\r
1392           }\r
1393           catch (Exception ex)\r
1394           {\r
1395             ex.printStackTrace();\r
1396             sg.cs = cs;\r
1397           }\r
1398         }\r
1399 \r
1400         if (viewport.getAbovePIDThreshold()\r
1401             || cs instanceof PIDColourScheme\r
1402             || cs instanceof Blosum62ColourScheme)\r
1403         {\r
1404           sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());\r
1405           sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0, sg.getWidth()));\r
1406         }\r
1407         else\r
1408           sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
1409 \r
1410         if (viewport.getConservationSelected())\r
1411         {\r
1412           Conservation c = new Conservation("Group",\r
1413                                             ResidueProperties.propHash, 3,\r
1414                                             sg.sequences, 0,\r
1415                                             viewport.alignment.getWidth() - 1);\r
1416           c.calculate();\r
1417           c.verdict(false, viewport.ConsPercGaps);\r
1418           sg.cs.setConservation(c);\r
1419         }\r
1420         else\r
1421         {\r
1422           sg.cs.setConservation(null);\r
1423           sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
1424         }\r
1425 \r
1426       }\r
1427     }\r
1428 \r
1429 \r
1430     if (alignPanel.getOverviewPanel() != null)\r
1431     {\r
1432       alignPanel.getOverviewPanel().updateOverviewImage();\r
1433     }\r
1434 \r
1435     alignPanel.repaint();\r
1436   }\r
1437 \r
1438 \r
1439 \r
1440   protected void modifyPID_actionPerformed()\r
1441   {\r
1442     if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)\r
1443     {\r
1444       SliderPanel.setPIDSliderSource(alignPanel, viewport.getGlobalColourScheme(),\r
1445                                      "Background");\r
1446       SliderPanel.showPIDSlider();\r
1447     }\r
1448   }\r
1449 \r
1450   protected void modifyConservation_actionPerformed()\r
1451   {\r
1452     if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)\r
1453     {\r
1454       SliderPanel.setConservationSlider(alignPanel, viewport.globalColourScheme,\r
1455                                         "Background");\r
1456       SliderPanel.showConservationSlider();\r
1457     }\r
1458   }\r
1459 \r
1460   protected void conservationMenuItem_actionPerformed()\r
1461   {\r
1462     viewport.setConservationSelected(conservationMenuItem.getState());\r
1463 \r
1464     viewport.setAbovePIDThreshold(false);\r
1465     abovePIDThreshold.setState(false);\r
1466 \r
1467     changeColour(viewport.getGlobalColourScheme());\r
1468 \r
1469     modifyConservation_actionPerformed();\r
1470   }\r
1471 \r
1472   public void abovePIDThreshold_actionPerformed()\r
1473   {\r
1474     viewport.setAbovePIDThreshold(abovePIDThreshold.getState());\r
1475 \r
1476     conservationMenuItem.setState(false);\r
1477     viewport.setConservationSelected(false);\r
1478 \r
1479     changeColour(viewport.getGlobalColourScheme());\r
1480 \r
1481     modifyPID_actionPerformed();\r
1482   }\r
1483 \r
1484   public void userDefinedColour_actionPerformed()\r
1485   {\r
1486     new UserDefinedColours(alignPanel, null);\r
1487   }\r
1488 \r
1489   public void PIDColour_actionPerformed()\r
1490   {\r
1491     changeColour(new PIDColourScheme());\r
1492   }\r
1493 \r
1494   public void BLOSUM62Colour_actionPerformed()\r
1495   {\r
1496     changeColour(new Blosum62ColourScheme());\r
1497   }\r
1498 \r
1499   public void sortPairwiseMenuItem_actionPerformed()\r
1500   {\r
1501     addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,\r
1502                                    HistoryItem.SORT));\r
1503     AlignmentSorter.sortByPID(viewport.getAlignment(),\r
1504                               viewport.getAlignment().getSequenceAt(0));\r
1505     alignPanel.repaint();\r
1506   }\r
1507 \r
1508   public void sortIDMenuItem_actionPerformed()\r
1509   {\r
1510     addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,\r
1511                                    HistoryItem.SORT));\r
1512     AlignmentSorter.sortByID(viewport.getAlignment());\r
1513     alignPanel.repaint();\r
1514   }\r
1515 \r
1516   public void sortGroupMenuItem_actionPerformed()\r
1517   {\r
1518     addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,\r
1519                                    HistoryItem.SORT));\r
1520     AlignmentSorter.sortByGroup(viewport.getAlignment());\r
1521     alignPanel.repaint();\r
1522 \r
1523   }\r
1524 \r
1525   public void removeRedundancyMenuItem_actionPerformed()\r
1526   {\r
1527      new RedundancyPanel(alignPanel);\r
1528   }\r
1529 \r
1530   public void pairwiseAlignmentMenuItem_actionPerformed()\r
1531   {\r
1532     if (viewport.getSelectionGroup().getSize() > 1)\r
1533     {\r
1534       Frame frame = new Frame();\r
1535       frame.add(new PairwiseAlignPanel(alignPanel));\r
1536       jalview.bin.JalviewLite.addFrame(frame, "Pairwise Alignment", 600, 500);\r
1537     }\r
1538   }\r
1539 \r
1540   public void PCAMenuItem_actionPerformed()\r
1541   {\r
1542     //are the sequences aligned?\r
1543     if (!viewport.alignment.isAligned())\r
1544     {\r
1545       SequenceI current;\r
1546       int Width = viewport.getAlignment().getWidth();\r
1547 \r
1548       for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
1549            i++)\r
1550       {\r
1551         current = viewport.getAlignment().getSequenceAt(i);\r
1552 \r
1553         if (current.getLength() < Width)\r
1554         {\r
1555           current.insertCharAt(Width - 1, viewport.getGapCharacter());\r
1556         }\r
1557       }\r
1558       alignPanel.repaint();\r
1559     }\r
1560 \r
1561     if ( (viewport.getSelectionGroup() != null &&\r
1562           viewport.getSelectionGroup().getSize() < 4 &&\r
1563           viewport.getSelectionGroup().getSize() > 0)\r
1564         || viewport.getAlignment().getHeight() < 4)\r
1565     {\r
1566       return;\r
1567     }\r
1568 \r
1569     try\r
1570     {\r
1571       new PCAPanel(viewport);\r
1572     }\r
1573     catch (java.lang.OutOfMemoryError ex)\r
1574     {\r
1575     }\r
1576 \r
1577   }\r
1578 \r
1579   public void averageDistanceTreeMenuItem_actionPerformed()\r
1580   {\r
1581     NewTreePanel("AV", "PID", "Average distance tree using PID");\r
1582   }\r
1583 \r
1584   public void neighbourTreeMenuItem_actionPerformed()\r
1585   {\r
1586     NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");\r
1587   }\r
1588 \r
1589   protected void njTreeBlosumMenuItem_actionPerformed()\r
1590   {\r
1591     NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");\r
1592   }\r
1593 \r
1594   protected void avTreeBlosumMenuItem_actionPerformed()\r
1595   {\r
1596     NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62PID");\r
1597   }\r
1598 \r
1599   void NewTreePanel(String type, String pwType, String title)\r
1600   {\r
1601     //are the sequences aligned?\r
1602     if (!viewport.alignment.isAligned())\r
1603     {\r
1604       SequenceI current;\r
1605       int Width = viewport.getAlignment().getWidth();\r
1606 \r
1607       for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
1608            i++)\r
1609       {\r
1610         current = viewport.getAlignment().getSequenceAt(i);\r
1611 \r
1612         if (current.getLength() < Width)\r
1613         {\r
1614           current.insertCharAt(Width - 1, viewport.getGapCharacter());\r
1615         }\r
1616       }\r
1617       alignPanel.repaint();\r
1618 \r
1619     }\r
1620 \r
1621     final TreePanel tp;\r
1622     if (viewport.getSelectionGroup() != null &&\r
1623         viewport.getSelectionGroup().getSize() > 3)\r
1624     {\r
1625       tp = new TreePanel(viewport, viewport.getSelectionGroup().sequences, type,\r
1626                          pwType,\r
1627                          0, viewport.alignment.getWidth());\r
1628     }\r
1629     else\r
1630     {\r
1631       tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),\r
1632                          type, pwType, 0, viewport.alignment.getWidth());\r
1633     }\r
1634 \r
1635     addTreeMenuItem(tp, title);\r
1636 \r
1637     jalview.bin.JalviewLite.addFrame(tp, title, 600, 500);\r
1638   }\r
1639 \r
1640   void loadTree_actionPerformed()\r
1641   {\r
1642       CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);\r
1643       cap.setText("Paste your Newick tree file here.");\r
1644       cap.treeImport = true;\r
1645       Frame frame = new Frame();\r
1646       frame.add(cap);\r
1647       jalview.bin.JalviewLite.addFrame(frame, "Paste Newick file ", 400, 300);\r
1648   }\r
1649 \r
1650   public void loadTree(jalview.io.NewickFile tree, String treeFile)\r
1651   {\r
1652     TreePanel tp = new TreePanel(viewport,\r
1653                       viewport.getAlignment().getSequences(),\r
1654                       tree, "From File - ", treeFile);\r
1655     jalview.bin.JalviewLite.addFrame(tp, treeFile, 600, 500);\r
1656     addTreeMenuItem(tp, treeFile);\r
1657   }\r
1658 \r
1659   void addTreeMenuItem(final TreePanel treePanel, String title)\r
1660   {\r
1661     final MenuItem item = new MenuItem(title);\r
1662     sortByTreeMenu.add(item);\r
1663     item.addActionListener(new java.awt.event.ActionListener()\r
1664     {\r
1665       public void actionPerformed(ActionEvent evt)\r
1666       {\r
1667         addHistoryItem(new HistoryItem("Sort", viewport.alignment,\r
1668                                        HistoryItem.SORT));\r
1669         AlignmentSorter.sortByTree(viewport.getAlignment(), treePanel.getTree());\r
1670         alignPanel.repaint();\r
1671       }\r
1672     });\r
1673 \r
1674     treePanel.addWindowListener(new WindowAdapter()\r
1675     {\r
1676       public void windowClosing(WindowEvent e)\r
1677       {\r
1678         sortByTreeMenu.remove(item);\r
1679       };\r
1680     });\r
1681   }\r
1682 \r
1683   protected void documentation_actionPerformed()\r
1684   {\r
1685     showURL("http://www.jalview.org/help.html", "HELP");\r
1686   }\r
1687 \r
1688   protected void about_actionPerformed()\r
1689   {\r
1690 \r
1691     class AboutPanel extends Canvas\r
1692     {\r
1693       String version;\r
1694       public AboutPanel(String version)\r
1695       { this.version = version; }\r
1696 \r
1697       public void paint(Graphics g)\r
1698       {\r
1699         g.setColor(Color.white);\r
1700         g.fillRect(0, 0, getSize().width, getSize().height);\r
1701         g.setFont(new Font("Helvetica", Font.PLAIN, 12));\r
1702         FontMetrics fm = g.getFontMetrics();\r
1703         int fh = fm.getHeight();\r
1704         int y = 5, x = 7;\r
1705         g.setColor(Color.black);\r
1706         g.setFont(new Font("Helvetica", Font.BOLD, 14));\r
1707         g.drawString("Jalview - Release "+version, 200, y += fh);\r
1708         g.setFont(new Font("Helvetica", Font.PLAIN, 12));\r
1709         g.drawString("Authors:  Michele Clamp, James Cuff, Steve Searle, Andrew Waterhouse, Jim Procter & Geoff Barton.",\r
1710                      x, y += fh * 2);\r
1711         g.drawString("Current development managed by Andrew Waterhouse; Barton Group, University of Dundee.",\r
1712                      x, y += fh);\r
1713         g.drawString(\r
1714             "For any issues relating to Jalview, email help@jalview.org", x,\r
1715             y += fh);\r
1716         g.drawString("If  you use JalView, please cite:", x, y += fh + 8);\r
1717         g.drawString("\"Clamp, M., Cuff, J., Searle, S. M. and Barton, G. J. (2004), The Jalview Java Alignment Editor\"",\r
1718                      x, y += fh);\r
1719         g.drawString("Bioinformatics,  2004 20;426-7.", x, y += fh);\r
1720       }\r
1721     }\r
1722 \r
1723     String version = "test";\r
1724     java.net.URL url = getClass().getResource("/.build_properties");\r
1725     if (url != null)\r
1726     {\r
1727       try\r
1728       {\r
1729         BufferedReader reader = new BufferedReader(new InputStreamReader(\r
1730             url.openStream()));\r
1731         String line;\r
1732         while ( (line = reader.readLine()) != null)\r
1733         {\r
1734           if (line.indexOf("VERSION") > -1)\r
1735           {\r
1736             version = line.substring(line.indexOf("=") + 1);\r
1737           }\r
1738         }\r
1739       }\r
1740       catch (Exception ex)\r
1741       {\r
1742         ex.printStackTrace();\r
1743       }\r
1744     }\r
1745 \r
1746 \r
1747     Frame frame = new Frame();\r
1748     frame.add(new AboutPanel(version));\r
1749     jalview.bin.JalviewLite.addFrame(frame, "Jalview", 580, 200);\r
1750 \r
1751   }\r
1752 \r
1753   public void showURL(String url, String target)\r
1754   {\r
1755     if (applet == null)\r
1756     {\r
1757       System.out.println("Not running as applet - no browser available.");\r
1758     }\r
1759     else\r
1760     {\r
1761       try\r
1762       {\r
1763         System.out.println("Show url: "+url);\r
1764         applet.getAppletContext().showDocument(new java.net.URL(url),\r
1765                                                target);\r
1766       }\r
1767       catch (Exception ex)\r
1768       {\r
1769         ex.printStackTrace();\r
1770       }\r
1771     }\r
1772   }\r
1773 \r
1774 \r
1775   //////////////////////////////////////////////////////////////////////////////////\r
1776   //JBuilder Graphics here\r
1777 \r
1778     protected MenuBar alignFrameMenuBar = new MenuBar();\r
1779     protected Menu fileMenu = new Menu("File");\r
1780     protected MenuItem loadApplication = new MenuItem("View in Full Application");\r
1781     protected MenuItem loadTree = new MenuItem("Load Associated Tree");\r
1782     protected MenuItem closeMenuItem = new MenuItem("Close");\r
1783     protected Menu editMenu = new Menu("Edit");\r
1784     protected Menu viewMenu = new Menu("View");\r
1785     protected Menu colourMenu = new Menu("Colour");\r
1786     protected Menu calculateMenu = new Menu("Calculate");\r
1787     protected MenuItem selectAllSequenceMenuItem = new MenuItem("Select all");\r
1788     protected MenuItem deselectAllSequenceMenuItem = new MenuItem("Deselect All");\r
1789     protected MenuItem invertSequenceMenuItem = new MenuItem("Invert Selection");\r
1790     protected MenuItem remove2LeftMenuItem = new MenuItem();\r
1791     protected MenuItem remove2RightMenuItem = new MenuItem();\r
1792     protected MenuItem removeGappedColumnMenuItem = new MenuItem();\r
1793     protected MenuItem removeAllGapsMenuItem = new MenuItem();\r
1794     protected CheckboxMenuItem viewBoxesMenuItem = new CheckboxMenuItem();\r
1795     protected CheckboxMenuItem viewTextMenuItem = new CheckboxMenuItem();\r
1796     protected MenuItem sortPairwiseMenuItem = new MenuItem();\r
1797     protected MenuItem sortIDMenuItem = new MenuItem();\r
1798     protected MenuItem sortGroupMenuItem = new MenuItem();\r
1799     protected MenuItem removeRedundancyMenuItem = new MenuItem();\r
1800     protected MenuItem pairwiseAlignmentMenuItem = new MenuItem();\r
1801     protected MenuItem PCAMenuItem = new MenuItem();\r
1802     protected MenuItem averageDistanceTreeMenuItem = new MenuItem();\r
1803     protected MenuItem neighbourTreeMenuItem = new MenuItem();\r
1804     BorderLayout borderLayout1 = new BorderLayout();\r
1805     public Label statusBar = new Label();\r
1806     protected Menu outputTextboxMenu = new Menu();\r
1807     protected MenuItem clustalColour = new MenuItem();\r
1808     protected MenuItem zappoColour = new MenuItem();\r
1809     protected MenuItem taylorColour = new MenuItem();\r
1810     protected MenuItem hydrophobicityColour = new MenuItem();\r
1811     protected MenuItem helixColour = new MenuItem();\r
1812     protected MenuItem strandColour = new MenuItem();\r
1813     protected MenuItem turnColour = new MenuItem();\r
1814     protected MenuItem buriedColour = new MenuItem();\r
1815     protected MenuItem userDefinedColour = new MenuItem();\r
1816     protected MenuItem PIDColour = new MenuItem();\r
1817     protected MenuItem BLOSUM62Colour = new MenuItem();\r
1818     MenuItem njTreeBlosumMenuItem = new MenuItem();\r
1819     MenuItem avDistanceTreeBlosumMenuItem = new MenuItem();\r
1820     protected CheckboxMenuItem annotationPanelMenuItem = new CheckboxMenuItem();\r
1821     protected CheckboxMenuItem colourTextMenuItem = new CheckboxMenuItem();\r
1822     MenuItem overviewMenuItem = new MenuItem();\r
1823     protected MenuItem undoMenuItem = new MenuItem();\r
1824     protected MenuItem redoMenuItem = new MenuItem();\r
1825     protected CheckboxMenuItem conservationMenuItem = new CheckboxMenuItem();\r
1826     MenuItem noColourmenuItem = new MenuItem();\r
1827     protected CheckboxMenuItem wrapMenuItem = new CheckboxMenuItem();\r
1828     protected CheckboxMenuItem renderGapsMenuItem = new CheckboxMenuItem();\r
1829     MenuItem findMenuItem = new MenuItem();\r
1830     Menu searchMenu = new Menu();\r
1831     protected CheckboxMenuItem abovePIDThreshold = new CheckboxMenuItem();\r
1832     protected MenuItem nucleotideColour = new MenuItem();\r
1833     MenuItem deleteGroups = new MenuItem();\r
1834     MenuItem delete = new MenuItem();\r
1835     MenuItem copy = new MenuItem();\r
1836     MenuItem cut = new MenuItem();\r
1837     Menu pasteMenu = new Menu();\r
1838     MenuItem pasteNew = new MenuItem();\r
1839     MenuItem pasteThis = new MenuItem();\r
1840     protected CheckboxMenuItem applyToAllGroups = new CheckboxMenuItem();\r
1841     protected MenuItem font = new MenuItem();\r
1842     protected CheckboxMenuItem scaleAbove = new CheckboxMenuItem();\r
1843     protected CheckboxMenuItem scaleLeft = new CheckboxMenuItem();\r
1844     protected CheckboxMenuItem scaleRight = new CheckboxMenuItem();\r
1845     MenuItem modifyPID = new MenuItem();\r
1846     MenuItem modifyConservation = new MenuItem();\r
1847     protected CheckboxMenuItem autoCalculate\r
1848         = new CheckboxMenuItem("Autocalculate Consensus", true);\r
1849     protected Menu sortByTreeMenu = new Menu();\r
1850     Menu sort = new Menu();\r
1851     Menu calculate = new Menu();\r
1852     MenuItem inputText = new MenuItem();\r
1853     Menu helpMenu = new Menu();\r
1854     MenuItem documentation = new MenuItem();\r
1855     MenuItem about = new MenuItem();\r
1856     protected CheckboxMenuItem seqLimits = new CheckboxMenuItem();\r
1857   Panel embeddedMenu;\r
1858   Label embeddedEdit;\r
1859   Label embeddedSearch;\r
1860   Label embeddedView;\r
1861   Label embeddedColour;\r
1862   Label embeddedFile;\r
1863   Label embeddedHelp;\r
1864   Label embeddedCalculate;\r
1865   FlowLayout flowLayout1;\r
1866 \r
1867   private void jbInit() throws Exception {\r
1868 \r
1869       setMenuBar(alignFrameMenuBar);\r
1870 \r
1871       MenuItem item;\r
1872 \r
1873       // dynamically fill save as menu with available formats\r
1874       for (int i = 0; i < jalview.io.AppletFormatAdapter.formats.size(); i++)\r
1875       {\r
1876 \r
1877         item = new MenuItem( (String) jalview.io.AppletFormatAdapter.formats.\r
1878                             elementAt(\r
1879                                 i));\r
1880         item.addActionListener(new java.awt.event.ActionListener()\r
1881         {\r
1882           public void actionPerformed(ActionEvent e)\r
1883           {\r
1884             outputText_actionPerformed(e);\r
1885           }\r
1886         });\r
1887 \r
1888         outputTextboxMenu.add(item);\r
1889       }\r
1890         closeMenuItem.addActionListener(this);\r
1891         loadApplication.addActionListener(this);\r
1892 \r
1893         loadTree.addActionListener(this);\r
1894         selectAllSequenceMenuItem.addActionListener(this);\r
1895         deselectAllSequenceMenuItem.addActionListener(this);\r
1896         invertSequenceMenuItem.addActionListener(this);\r
1897         remove2LeftMenuItem.setLabel("Remove Left");\r
1898         remove2LeftMenuItem.addActionListener(this);\r
1899         remove2RightMenuItem.setLabel("Remove Right");\r
1900         remove2RightMenuItem.addActionListener(this);\r
1901         removeGappedColumnMenuItem.setLabel("Remove Empty Columns");\r
1902         removeGappedColumnMenuItem.addActionListener(this);\r
1903         removeAllGapsMenuItem.setLabel("Remove All Gaps");\r
1904         removeAllGapsMenuItem.addActionListener(this);\r
1905         viewBoxesMenuItem.setLabel("Boxes");\r
1906         viewBoxesMenuItem.setState(true);\r
1907         viewBoxesMenuItem.addItemListener(this);\r
1908         viewTextMenuItem.setLabel("Text");\r
1909         viewTextMenuItem.setState(true);\r
1910         viewTextMenuItem.addItemListener(this);\r
1911         sortPairwiseMenuItem.setLabel("by Pairwise Identity");\r
1912         sortPairwiseMenuItem.addActionListener(this);\r
1913         sortIDMenuItem.setLabel("by ID");\r
1914         sortIDMenuItem.addActionListener(this);\r
1915         sortGroupMenuItem.setLabel("by Group");\r
1916         sortGroupMenuItem.addActionListener(this);\r
1917         removeRedundancyMenuItem.setLabel("Remove Redundancy...");\r
1918         removeRedundancyMenuItem.addActionListener(this);\r
1919         pairwiseAlignmentMenuItem.setLabel("Pairwise Alignments...");\r
1920         pairwiseAlignmentMenuItem.addActionListener(this);\r
1921         PCAMenuItem.setLabel("Principal Component Analysis");\r
1922         PCAMenuItem.addActionListener(this);\r
1923         averageDistanceTreeMenuItem.setLabel(\r
1924             "Average Distance Using % Identity");\r
1925         averageDistanceTreeMenuItem.addActionListener(this);\r
1926         neighbourTreeMenuItem.setLabel("Neighbour Joining Using % Identity");\r
1927         neighbourTreeMenuItem.addActionListener(this);\r
1928         alignFrameMenuBar.setFont(new java.awt.Font("Verdana", 0, 11));\r
1929         statusBar.setBackground(Color.white);\r
1930         statusBar.setFont(new java.awt.Font("Verdana", 0, 11));\r
1931         statusBar.setText("Status bar");\r
1932         outputTextboxMenu.setLabel("Output to Textbox");\r
1933         clustalColour.setLabel("Clustalx");\r
1934 \r
1935         clustalColour.addActionListener(this);\r
1936         zappoColour.setLabel("Zappo");\r
1937         zappoColour.addActionListener(this);\r
1938         taylorColour.setLabel("Taylor");\r
1939         taylorColour.addActionListener(this);\r
1940         hydrophobicityColour.setLabel("Hydrophobicity");\r
1941         hydrophobicityColour.addActionListener(this);\r
1942         helixColour.setLabel("Helix Propensity");\r
1943         helixColour.addActionListener(this);\r
1944         strandColour.setLabel("Strand Propensity");\r
1945         strandColour.addActionListener(this);\r
1946         turnColour.setLabel("Turn Propensity");\r
1947         turnColour.addActionListener(this);\r
1948         buriedColour.setLabel("Buried Index");\r
1949         buriedColour.addActionListener(this);\r
1950         userDefinedColour.setLabel("User Defined...");\r
1951         userDefinedColour.addActionListener(this);\r
1952         PIDColour.setLabel("Percentage Identity");\r
1953         PIDColour.addActionListener(this);\r
1954         BLOSUM62Colour.setLabel("BLOSUM62 Score");\r
1955         BLOSUM62Colour.addActionListener(this);\r
1956         avDistanceTreeBlosumMenuItem.setLabel(\r
1957             "Average Distance Using BLOSUM62");\r
1958         avDistanceTreeBlosumMenuItem.addActionListener(this);\r
1959         njTreeBlosumMenuItem.setLabel("Neighbour Joining Using BLOSUM62");\r
1960         njTreeBlosumMenuItem.addActionListener(this);\r
1961         annotationPanelMenuItem.setLabel("Show Annotations");\r
1962         annotationPanelMenuItem.addItemListener(this);\r
1963         colourTextMenuItem.setLabel("Colour Text");\r
1964         colourTextMenuItem.addItemListener(this);\r
1965         overviewMenuItem.setLabel("Overview Window");\r
1966         overviewMenuItem.addActionListener(this);\r
1967         undoMenuItem.setEnabled(false);\r
1968         undoMenuItem.setLabel("Undo");\r
1969         undoMenuItem.addActionListener(this);\r
1970         redoMenuItem.setEnabled(false);\r
1971         redoMenuItem.setLabel("Redo");\r
1972         redoMenuItem.addActionListener(this);\r
1973         conservationMenuItem.setLabel("by Conservation");\r
1974         conservationMenuItem.addItemListener(this);\r
1975         noColourmenuItem.setLabel("None");\r
1976         noColourmenuItem.addActionListener(this);\r
1977         wrapMenuItem.setLabel("Wrap");\r
1978         wrapMenuItem.addItemListener(this);\r
1979         renderGapsMenuItem.setLabel("Show Gaps");\r
1980         renderGapsMenuItem.setState(true);\r
1981         renderGapsMenuItem.addItemListener(this);\r
1982         findMenuItem.setLabel("Find...");\r
1983         findMenuItem.addActionListener(this);\r
1984         searchMenu.setLabel("Search");\r
1985 \r
1986         abovePIDThreshold.setLabel("Above Identity Threshold");\r
1987         abovePIDThreshold.addItemListener(this);\r
1988         nucleotideColour.setLabel("Nucleotide");\r
1989         nucleotideColour.addActionListener(this);\r
1990         deleteGroups.setLabel("Undefine Groups");\r
1991         deleteGroups.addActionListener(this);\r
1992         copy.setLabel("Copy");\r
1993         copy.addActionListener(this);\r
1994         cut.setLabel("Cut");\r
1995         cut.addActionListener(this);\r
1996         delete.setLabel("Delete");\r
1997         delete.addActionListener(this);\r
1998         pasteMenu.setLabel("Paste");\r
1999         pasteNew.setLabel("To New Alignment");\r
2000         pasteNew.addActionListener(this);\r
2001         pasteThis.setLabel("Add To This Alignment");\r
2002         pasteThis.addActionListener(this);\r
2003         applyToAllGroups.setLabel("Apply Colour To All Groups");\r
2004         applyToAllGroups.setState(true);\r
2005         applyToAllGroups.addItemListener(this);\r
2006         font.setLabel("Font...");\r
2007         font.addActionListener(this);\r
2008         scaleAbove.setLabel("Scale Above");\r
2009         scaleAbove.setState(true);\r
2010         scaleAbove.setEnabled(false);\r
2011         scaleAbove.addItemListener(this);\r
2012         scaleLeft.setEnabled(false);\r
2013         scaleLeft.setState(true);\r
2014         scaleLeft.setLabel("Scale Left");\r
2015         scaleLeft.addItemListener(this);\r
2016         scaleRight.setEnabled(false);\r
2017         scaleRight.setState(true);\r
2018         scaleRight.setLabel("Scale Right");\r
2019         scaleRight.addItemListener(this);\r
2020         modifyPID.setLabel("Modify Identity Threshold...");\r
2021         modifyPID.addActionListener(this);\r
2022         modifyConservation.setLabel("Modify Conservation Threshold...");\r
2023         modifyConservation.addActionListener(this);\r
2024         sortByTreeMenu.setLabel("By Tree Order");\r
2025         sort.setLabel("Sort");\r
2026         calculate.setLabel("Calculate Tree");\r
2027         autoCalculate.addItemListener(this);\r
2028         inputText.setLabel("Input from textbox");\r
2029         inputText.addActionListener(this);\r
2030 \r
2031         helpMenu.setLabel("Help");\r
2032         documentation.setLabel("Documentation");\r
2033         documentation.addActionListener(this);\r
2034 \r
2035         about.setLabel("About...");\r
2036         about.addActionListener(this);\r
2037           seqLimits.setState(true);\r
2038     seqLimits.setLabel("Show Sequence Limits");\r
2039     seqLimits.addItemListener(this);\r
2040     featureSettings.setLabel("Feature Settings...");\r
2041     featureSettings.addActionListener(this);\r
2042     sequenceFeatures.setLabel("Sequence Features");\r
2043     sequenceFeatures.addItemListener(this);\r
2044     sequenceFeatures.setState(false);\r
2045     annotationColour.setLabel("by Annotation...");\r
2046     annotationColour.addActionListener(this);\r
2047 \r
2048     alignFrameMenuBar.add(fileMenu);\r
2049         alignFrameMenuBar.add(editMenu);\r
2050         alignFrameMenuBar.add(searchMenu);\r
2051         alignFrameMenuBar.add(viewMenu);\r
2052         alignFrameMenuBar.add(colourMenu);\r
2053         alignFrameMenuBar.add(calculateMenu);\r
2054         alignFrameMenuBar.add(helpMenu);\r
2055         fileMenu.add(inputText);\r
2056         fileMenu.add(outputTextboxMenu);\r
2057        // fileMenu.add(loadApplication);\r
2058         fileMenu.addSeparator();\r
2059         fileMenu.add(loadTree);\r
2060         fileMenu.add(closeMenuItem);\r
2061         editMenu.add(undoMenuItem);\r
2062         editMenu.add(redoMenuItem);\r
2063         editMenu.add(cut);\r
2064         editMenu.add(copy);\r
2065         editMenu.add(pasteMenu);\r
2066         editMenu.add(delete);\r
2067         editMenu.addSeparator();\r
2068         editMenu.add(selectAllSequenceMenuItem);\r
2069         editMenu.add(deselectAllSequenceMenuItem);\r
2070         editMenu.add(invertSequenceMenuItem);\r
2071         editMenu.add(deleteGroups);\r
2072         editMenu.addSeparator();\r
2073         editMenu.add(remove2LeftMenuItem);\r
2074         editMenu.add(remove2RightMenuItem);\r
2075         editMenu.add(removeGappedColumnMenuItem);\r
2076         editMenu.add(removeAllGapsMenuItem);\r
2077         editMenu.add(removeRedundancyMenuItem);\r
2078         searchMenu.add(findMenuItem);\r
2079         viewMenu.add(font);\r
2080         viewMenu.addSeparator();\r
2081     viewMenu.add(seqLimits);\r
2082         viewMenu.addSeparator();\r
2083     viewMenu.add(wrapMenuItem);\r
2084         viewMenu.add(scaleAbove);\r
2085         viewMenu.add(scaleLeft);\r
2086         viewMenu.add(scaleRight);\r
2087         viewMenu.addSeparator();\r
2088     viewMenu.add(viewBoxesMenuItem);\r
2089         viewMenu.add(viewTextMenuItem);\r
2090         viewMenu.add(colourTextMenuItem);\r
2091         viewMenu.add(renderGapsMenuItem);\r
2092         viewMenu.add(annotationPanelMenuItem);\r
2093     viewMenu.addSeparator();\r
2094         viewMenu.add(sequenceFeatures);\r
2095         viewMenu.add(featureSettings);\r
2096     viewMenu.addSeparator();\r
2097         viewMenu.add(overviewMenuItem);\r
2098         colourMenu.add(applyToAllGroups);\r
2099         colourMenu.addSeparator();\r
2100         colourMenu.add(noColourmenuItem);\r
2101         colourMenu.add(clustalColour);\r
2102         colourMenu.add(BLOSUM62Colour);\r
2103         colourMenu.add(PIDColour);\r
2104         colourMenu.add(zappoColour);\r
2105         colourMenu.add(taylorColour);\r
2106         colourMenu.add(hydrophobicityColour);\r
2107         colourMenu.add(helixColour);\r
2108         colourMenu.add(strandColour);\r
2109         colourMenu.add(turnColour);\r
2110         colourMenu.add(buriedColour);\r
2111         colourMenu.add(nucleotideColour);\r
2112         colourMenu.add(userDefinedColour);\r
2113         colourMenu.addSeparator();\r
2114         colourMenu.add(conservationMenuItem);\r
2115         colourMenu.add(modifyConservation);\r
2116         colourMenu.add(abovePIDThreshold);\r
2117         colourMenu.add(modifyPID);\r
2118     colourMenu.add(annotationColour);\r
2119     calculateMenu.add(sort);\r
2120         calculateMenu.add(calculate);\r
2121         calculateMenu.addSeparator();\r
2122         calculateMenu.add(pairwiseAlignmentMenuItem);\r
2123         calculateMenu.add(PCAMenuItem);\r
2124         calculateMenu.add(autoCalculate);\r
2125         this.add(statusBar, BorderLayout.SOUTH);\r
2126         pasteMenu.add(pasteNew);\r
2127         pasteMenu.add(pasteThis);\r
2128         sort.add(sortIDMenuItem);\r
2129         sort.add(sortByTreeMenu);\r
2130         sort.add(sortGroupMenuItem);\r
2131         sort.add(sortPairwiseMenuItem);\r
2132         calculate.add(averageDistanceTreeMenuItem);\r
2133         calculate.add(neighbourTreeMenuItem);\r
2134         calculate.add(avDistanceTreeBlosumMenuItem);\r
2135         calculate.add(njTreeBlosumMenuItem);\r
2136         helpMenu.add(documentation);\r
2137         helpMenu.add(about);\r
2138   }\r
2139 \r
2140   public void setEmbedded()\r
2141   {\r
2142 \r
2143     embeddedMenu = new Panel();\r
2144     embeddedEdit = new Label();\r
2145     embeddedSearch = new Label();\r
2146     embeddedView = new Label();\r
2147     embeddedColour = new Label();\r
2148     embeddedFile = new Label();\r
2149     embeddedHelp = new Label();\r
2150     embeddedCalculate = new Label();\r
2151     flowLayout1 = new FlowLayout();\r
2152     embeddedMenu.setBackground(Color.lightGray);\r
2153     embeddedMenu.setLayout(flowLayout1);\r
2154     embeddedEdit.setText("Edit");\r
2155     embeddedEdit.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2156     embeddedSearch.setText("Search");\r
2157     embeddedSearch.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2158     embeddedView.setText("View");\r
2159     embeddedView.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2160     embeddedColour.setText("Colour");\r
2161     embeddedColour.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2162     embeddedFile.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2163     embeddedFile.setText("File");\r
2164     embeddedHelp.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2165     embeddedHelp.setText("Help");\r
2166     embeddedCalculate.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2167     embeddedCalculate.setText("Calculate");\r
2168     embeddedMenu.add(embeddedFile);\r
2169     embeddedMenu.add(embeddedEdit);\r
2170     embeddedMenu.add(embeddedSearch);\r
2171     embeddedMenu.add(embeddedView);\r
2172     embeddedMenu.add(embeddedColour);\r
2173     embeddedMenu.add(embeddedCalculate);\r
2174     embeddedMenu.add(embeddedHelp);\r
2175     flowLayout1.setAlignment(FlowLayout.LEFT);\r
2176     flowLayout1.setHgap(2);\r
2177     flowLayout1.setVgap(0);\r
2178     embeddedFile.addMouseListener(this);\r
2179     embeddedEdit.addMouseListener(this);\r
2180     embeddedSearch.addMouseListener(this);\r
2181     embeddedView.addMouseListener(this);\r
2182     embeddedColour.addMouseListener(this);\r
2183     embeddedCalculate.addMouseListener(this);\r
2184     embeddedHelp.addMouseListener(this);\r
2185 \r
2186    // setVisible(false);\r
2187     fileMenu.remove(closeMenuItem);\r
2188     fileMenu.remove(3); // Seperator\r
2189 \r
2190     applet.setLayout(new BorderLayout());\r
2191     applet.add(embeddedMenu, BorderLayout.NORTH);\r
2192     applet.add(statusBar, BorderLayout.SOUTH);\r
2193    // applet.validate();\r
2194 \r
2195     alignPanel.setSize(applet.size().width, applet.size().height\r
2196                        - embeddedMenu.HEIGHT - statusBar.HEIGHT);\r
2197 \r
2198      applet.add(alignPanel, BorderLayout.CENTER);\r
2199      applet.validate();\r
2200 \r
2201   }\r
2202 \r
2203 \r
2204 \r
2205   PopupMenu filePopup, editPopup, searchPopup,\r
2206       viewPopup, colourPopup, calculatePopup, helpPopup;\r
2207   MenuItem featureSettings = new MenuItem();\r
2208   CheckboxMenuItem sequenceFeatures = new CheckboxMenuItem();\r
2209   MenuItem annotationColour = new MenuItem();\r
2210 \r
2211   public void mousePressed(MouseEvent evt)\r
2212   {\r
2213     PopupMenu popup = null;\r
2214     Label source = (Label)evt.getSource();\r
2215     if(source==embeddedFile)\r
2216     {\r
2217       popup = filePopup = genPopupMenu(filePopup, fileMenu);\r
2218     }\r
2219     else if(source==embeddedEdit)\r
2220     {\r
2221       popup = editPopup = genPopupMenu(editPopup, editMenu);\r
2222     }\r
2223     else if(source==embeddedSearch)\r
2224     {\r
2225       popup = searchPopup = genPopupMenu(searchPopup, searchMenu);\r
2226     }\r
2227     else if(source==embeddedView)\r
2228     {\r
2229       popup = viewPopup = genPopupMenu(viewPopup, viewMenu);\r
2230     }\r
2231     else if(source==embeddedColour)\r
2232     {\r
2233       popup = colourPopup = genPopupMenu(colourPopup, colourMenu);\r
2234     }\r
2235     else if(source==embeddedCalculate)\r
2236     {\r
2237       popup = calculatePopup = genPopupMenu(calculatePopup, calculateMenu);\r
2238     }\r
2239     else if(source==embeddedHelp)\r
2240     {\r
2241       popup = helpPopup = genPopupMenu(helpPopup, helpMenu);\r
2242     }\r
2243 \r
2244     embeddedMenu.add(popup);\r
2245     popup.show(embeddedMenu,\r
2246                source.getBounds().x,\r
2247                source.getBounds().y + source.getBounds().getSize().height);\r
2248   }\r
2249 \r
2250   PopupMenu genPopupMenu(PopupMenu popup, Menu original)\r
2251   {\r
2252     if(popup!=null)\r
2253     {\r
2254       return popup;\r
2255     }\r
2256     popup = new PopupMenu();\r
2257     int m, mSize = original.getItemCount();\r
2258     for(m=0; m<mSize; m++)\r
2259     {\r
2260       popup.add(original.getItem(m));\r
2261       mSize--;\r
2262       m--;\r
2263     }\r
2264 \r
2265     return popup;\r
2266   }\r
2267   public void mouseClicked(MouseEvent evt)\r
2268   {}\r
2269   public void mouseReleased(MouseEvent evt)\r
2270   {}\r
2271   public void mouseEntered(MouseEvent evt)\r
2272   {}\r
2273   public void mouseExited(MouseEvent evt)\r
2274   {}\r
2275 \r
2276 }\r
2277 \r