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