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