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