Allow alt button for Mac applet group editing
[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 java.awt.*;\r
27 import java.awt.event.*;\r
28 import java.util.*;\r
29 import java.io.InputStreamReader;\r
30 import java.io.BufferedReader;\r
31 import java.net.URL;\r
32 \r
33 \r
34 public class AlignFrame extends Frame implements ActionListener,\r
35     ItemListener, KeyListener, MouseListener\r
36 {\r
37   public AlignmentPanel alignPanel;\r
38   public AlignViewport viewport;\r
39   int NEW_WINDOW_WIDTH = 700;\r
40   int NEW_WINDOW_HEIGHT = 500;\r
41 \r
42   String jalviewServletURL;\r
43 \r
44 \r
45    public AlignFrame(AlignmentI al,\r
46                      jalview.bin.JalviewLite applet,\r
47                      String title,\r
48                      boolean embedded)\r
49   {\r
50 \r
51     jalviewServletURL = applet.getParameter("APPLICATION_URL");\r
52 \r
53     try{\r
54       jbInit();\r
55     }catch(Exception ex)\r
56     {\r
57       ex.printStackTrace();\r
58     }\r
59 \r
60     viewport = new AlignViewport(al, applet);\r
61     alignPanel = new AlignmentPanel(this, viewport);\r
62 \r
63     annotationPanelMenuItem.setState(viewport.showAnnotation);\r
64 \r
65     seqLimits.setState(viewport.showJVSuffix);\r
66 \r
67     if(applet!=null)\r
68     {\r
69       String param = applet.getParameter("sortBy");\r
70       if (param != null)\r
71       {\r
72         if (param.equalsIgnoreCase("Id"))\r
73           sortIDMenuItem_actionPerformed();\r
74         else if (param.equalsIgnoreCase("Pairwise Identity"))\r
75           sortPairwiseMenuItem_actionPerformed();\r
76       }\r
77 \r
78       param = applet.getParameter("wrap");\r
79       if (param != null)\r
80       {\r
81         if (param.equalsIgnoreCase("true"))\r
82         {\r
83           wrapMenuItem.setState(true);\r
84           wrapMenuItem_actionPerformed();\r
85         }\r
86       }\r
87 \r
88       try\r
89       {\r
90         param = applet.getParameter("windowWidth");\r
91         if (param != null)\r
92         {\r
93           int width = Integer.parseInt(param);\r
94           NEW_WINDOW_WIDTH = width;\r
95         }\r
96         param = applet.getParameter("windowHeight");\r
97         if (param != null)\r
98         {\r
99           int height = Integer.parseInt(param);\r
100           NEW_WINDOW_HEIGHT = height;\r
101         }\r
102       }\r
103       catch (Exception ex)\r
104       {}\r
105 \r
106     }\r
107 \r
108    //Some JVMS send keyevents to Top frame or lowest panel,\r
109    //Havent worked out why yet. So add to both this frame and seqCanvas for now\r
110    this.addKeyListener(this);\r
111    alignPanel.seqPanel.seqCanvas.addKeyListener(this);\r
112    alignPanel.idPanel.idCanvas.addKeyListener(this);\r
113    alignPanel.scalePanel.addKeyListener(this);\r
114    alignPanel.annotationPanel.addKeyListener(this);\r
115 \r
116     viewport.addPropertyChangeListener(new java.beans.PropertyChangeListener()\r
117     {\r
118      public void propertyChange(java.beans.PropertyChangeEvent evt)\r
119      {\r
120        if (evt.getPropertyName().equals("alignment"))\r
121        {\r
122          alignmentChanged();\r
123        }\r
124      }\r
125    });\r
126 \r
127 \r
128    if(embedded)\r
129    {\r
130      setEmbedded();\r
131    }\r
132    else\r
133    {\r
134      add(alignPanel, BorderLayout.CENTER);\r
135      jalview.bin.JalviewLite.addFrame(this, title, NEW_WINDOW_WIDTH,\r
136                                       NEW_WINDOW_HEIGHT);\r
137    }\r
138    alignPanel.validate();\r
139    alignPanel.repaint();\r
140   }\r
141   public AlignViewport getAlignViewport()\r
142   {\r
143     return viewport;\r
144   }\r
145 \r
146   public SeqCanvas getSeqcanvas()\r
147   {\r
148     return alignPanel.seqPanel.seqCanvas;\r
149   }\r
150 \r
151 \r
152   /**\r
153    * DOCUMENT ME!\r
154    *\r
155    * @param String DOCUMENT ME!\r
156    */\r
157 \r
158   public void parseFeaturesFile(String file, String type)\r
159   {\r
160     Hashtable featureLinks = new Hashtable();\r
161     boolean featuresFile = false;\r
162     try{\r
163       featuresFile = new jalview.io.FeaturesFile(file, type).parse(viewport.alignment,\r
164                                          alignPanel.seqPanel.seqCanvas.\r
165                                          getFeatureRenderer().featureColours,\r
166                                          featureLinks,\r
167                                          true);\r
168     }\r
169     catch(Exception ex)\r
170     {\r
171       ex.printStackTrace();\r
172     }\r
173 \r
174     if(featuresFile)\r
175     {\r
176       if(featureLinks.size()>0)\r
177         alignPanel.seqPanel.seqCanvas\r
178             .getFeatureRenderer().featureLinks = featureLinks;\r
179       viewport.showSequenceFeatures = true;\r
180       sequenceFeatures.setState(true);\r
181       alignPanel.repaint();\r
182     }\r
183 \r
184   }\r
185 \r
186 \r
187   public void keyPressed(KeyEvent evt)\r
188   {\r
189     if (viewport.cursorMode\r
190         && evt.getKeyCode() >= KeyEvent.VK_0\r
191         && evt.getKeyCode() <= KeyEvent.VK_9)\r
192     {\r
193       alignPanel.seqPanel.numberPressed(evt.getKeyChar());\r
194     }\r
195 \r
196     switch (evt.getKeyCode())\r
197     {\r
198       case 27: // escape key\r
199         deselectAllSequenceMenuItem_actionPerformed();\r
200         break;\r
201       case KeyEvent.VK_X:\r
202         if (evt.isControlDown() || evt.isMetaDown())\r
203         {\r
204           cut_actionPerformed();\r
205         }\r
206         break;\r
207       case KeyEvent.VK_C:\r
208         if (viewport.cursorMode && !evt.isControlDown())\r
209         {\r
210           alignPanel.seqPanel.setCursorColumn();\r
211         }\r
212         if (evt.isControlDown() || evt.isMetaDown())\r
213         {\r
214           copy_actionPerformed();\r
215         }\r
216         break;\r
217       case KeyEvent.VK_V:\r
218         if (evt.isControlDown() || evt.isMetaDown())\r
219         {\r
220           paste(true);\r
221         }\r
222         break;\r
223       case KeyEvent.VK_A:\r
224         if (evt.isControlDown() || evt.isMetaDown())\r
225         {\r
226           selectAllSequenceMenuItem_actionPerformed();\r
227         }\r
228         break;\r
229       case KeyEvent.VK_DOWN:\r
230         if(viewport.cursorMode)\r
231         {\r
232           alignPanel.seqPanel.moveCursor(0,1);\r
233         }\r
234         else\r
235           moveSelectedSequences(false);\r
236         break;\r
237 \r
238       case KeyEvent.VK_UP:\r
239         if (viewport.cursorMode)\r
240         {\r
241           alignPanel.seqPanel.moveCursor(0,-1);\r
242         }\r
243         else\r
244           moveSelectedSequences(true);\r
245         break;\r
246 \r
247       case KeyEvent.VK_LEFT:\r
248         if(viewport.cursorMode)\r
249         {\r
250           alignPanel.seqPanel.moveCursor(-1,0);\r
251         }\r
252         break;\r
253 \r
254       case KeyEvent.VK_RIGHT:\r
255         if (viewport.cursorMode)\r
256         {\r
257           alignPanel.seqPanel.moveCursor(1,0);\r
258         }\r
259         break;\r
260       case KeyEvent.VK_SPACE:\r
261         if(viewport.cursorMode)\r
262         {\r
263           alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown()\r
264                                                 || evt.isShiftDown()\r
265                                                 || evt.isAltDown()\r
266               );\r
267         }\r
268         break;\r
269 \r
270       case KeyEvent.VK_DELETE:\r
271       case KeyEvent.VK_BACK_SPACE:\r
272         if(viewport.cursorMode)\r
273         {\r
274           alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown()\r
275                                                 || evt.isShiftDown()\r
276                                                 || evt.isAltDown()\r
277               );\r
278         }\r
279        else\r
280         {\r
281           cut_actionPerformed();\r
282           alignPanel.seqPanel.seqCanvas.repaint();\r
283         }\r
284         break;\r
285 \r
286       case KeyEvent.VK_S:\r
287         if(viewport.cursorMode)\r
288         {\r
289           alignPanel.seqPanel.setCursorRow();\r
290         }\r
291         break;\r
292       case KeyEvent.VK_P:\r
293         if(viewport.cursorMode)\r
294         {\r
295           alignPanel.seqPanel.setCursorPosition();\r
296         }\r
297         break;\r
298 \r
299       case KeyEvent.VK_ENTER:\r
300       case KeyEvent.VK_COMMA:\r
301         if(viewport.cursorMode)\r
302         {\r
303           alignPanel.seqPanel.setCursorRowAndColumn();\r
304         }\r
305         break;\r
306 \r
307       case KeyEvent.VK_Q:\r
308         if(viewport.cursorMode)\r
309         {\r
310           alignPanel.seqPanel.setSelectionAreaAtCursor(true);\r
311         }\r
312         break;\r
313       case KeyEvent.VK_M:\r
314         if(viewport.cursorMode)\r
315         {\r
316           alignPanel.seqPanel.setSelectionAreaAtCursor(false);\r
317         }\r
318         break;\r
319 \r
320      case KeyEvent.VK_F2:\r
321        viewport.cursorMode = ! viewport.cursorMode;\r
322        statusBar.setText("Keyboard editing mode is "+\r
323            (viewport.cursorMode ? "on" : "off"));\r
324        if(viewport.cursorMode)\r
325        {\r
326          alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes;\r
327          alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq;\r
328        }\r
329        alignPanel.seqPanel.seqCanvas.repaint();\r
330        break;\r
331 \r
332       case KeyEvent.VK_F:\r
333         if (evt.isControlDown())\r
334         {\r
335           findMenuItem_actionPerformed();\r
336         }\r
337         break;\r
338       case KeyEvent.VK_H:\r
339       {\r
340         boolean toggleSeqs = !evt.isControlDown();\r
341         boolean toggleCols = !evt.isShiftDown();\r
342         boolean hide = false;\r
343         SequenceGroup sg = viewport.getSelectionGroup();\r
344 \r
345         if(toggleSeqs)\r
346         {\r
347           if (sg != null && sg.getSize(false) != viewport.alignment.getHeight())\r
348           {\r
349             hide = true;\r
350             viewport.hideAllSelectedSeqs();\r
351           }\r
352           else if (!(toggleCols && viewport.colSel.getSelected().size() > 0))\r
353             viewport.showAllHiddenSeqs();\r
354         }\r
355 \r
356         if(toggleCols)\r
357         {\r
358           if (viewport.colSel.getSelected().size() > 0)\r
359           {\r
360             viewport.hideSelectedColumns();\r
361             if(!toggleSeqs)\r
362                    viewport.selectionGroup = sg;\r
363           }\r
364           else if (!hide)\r
365             viewport.showAllHiddenColumns();\r
366         }\r
367 \r
368         alignPanel.repaint();\r
369         break;\r
370       }\r
371 \r
372     }\r
373   }\r
374   public void keyReleased(KeyEvent evt)\r
375   {}\r
376   public void keyTyped(KeyEvent evt)\r
377   {}\r
378 \r
379 public void itemStateChanged(ItemEvent evt)\r
380   {\r
381     if(evt.getSource()==colourTextMenuItem)\r
382             colourTextMenuItem_actionPerformed();\r
383     else if(evt.getSource()==wrapMenuItem)\r
384             wrapMenuItem_actionPerformed();\r
385     else if(evt.getSource()==scaleAbove)\r
386             scaleAbove_actionPerformed();\r
387     else if(evt.getSource()==scaleLeft)\r
388             scaleLeft_actionPerformed();\r
389     else if(evt.getSource()==scaleRight)\r
390             scaleRight_actionPerformed();\r
391      else if(evt.getSource()==seqLimits)\r
392       seqLimits_itemStateChanged();\r
393     else if(evt.getSource()==viewBoxesMenuItem)\r
394             viewBoxesMenuItem_actionPerformed();\r
395     else if(evt.getSource()==viewTextMenuItem)\r
396             viewTextMenuItem_actionPerformed();\r
397     else if(evt.getSource()==renderGapsMenuItem)\r
398             renderGapsMenuItem_actionPerformed();\r
399     else if(evt.getSource()==annotationPanelMenuItem)\r
400             annotationPanelMenuItem_actionPerformed();\r
401       else if(evt.getSource()==sequenceFeatures)\r
402       {\r
403            viewport.showSequenceFeatures(sequenceFeatures.getState());\r
404             alignPanel.seqPanel.seqCanvas.repaint();\r
405       }\r
406       else if(evt.getSource()==conservationMenuItem)\r
407             conservationMenuItem_actionPerformed();\r
408       else if(evt.getSource()==abovePIDThreshold)\r
409             abovePIDThreshold_actionPerformed();\r
410           else if(evt.getSource()==applyToAllGroups)\r
411             applyToAllGroups_actionPerformed();\r
412       else if(evt.getSource()==autoCalculate)\r
413           viewport.autocalculateConsensus = autoCalculate.getState();\r
414   }\r
415  public void actionPerformed(ActionEvent evt)\r
416  {\r
417     Object source = evt.getSource();\r
418 \r
419     if(source==inputText)\r
420       inputText_actionPerformed();\r
421     else if(source==loadTree)\r
422       loadTree_actionPerformed();\r
423     else if(source==loadApplication)\r
424       launchFullApplication();\r
425     else if(source==closeMenuItem)\r
426       closeMenuItem_actionPerformed();\r
427     else if(source==copy)\r
428       copy_actionPerformed();\r
429     else if(source==undoMenuItem)\r
430       undoMenuItem_actionPerformed();\r
431     else if(source==redoMenuItem)\r
432       redoMenuItem_actionPerformed();\r
433     else if(source==inputText)\r
434             inputText_actionPerformed();\r
435     else if(source==closeMenuItem)\r
436             closeMenuItem_actionPerformed();\r
437     else if(source==undoMenuItem)\r
438             undoMenuItem_actionPerformed();\r
439     else if(source==redoMenuItem)\r
440             redoMenuItem_actionPerformed();\r
441     else if(source==copy)\r
442             copy_actionPerformed();\r
443     else if(source==pasteNew)\r
444             pasteNew_actionPerformed();\r
445     else if(source==pasteThis)\r
446             pasteThis_actionPerformed();\r
447     else if(source==cut)\r
448             cut_actionPerformed();\r
449     else if(source==delete)\r
450             delete_actionPerformed();\r
451     else if(source==deleteGroups)\r
452             deleteGroups_actionPerformed();\r
453     else if(source==selectAllSequenceMenuItem)\r
454             selectAllSequenceMenuItem_actionPerformed();\r
455     else if(source==deselectAllSequenceMenuItem)\r
456             deselectAllSequenceMenuItem_actionPerformed();\r
457     else if(source==invertSequenceMenuItem)\r
458             invertSequenceMenuItem_actionPerformed();\r
459     else if(source==invertColSel)\r
460     { viewport.invertColumnSelection(); alignPanel.repaint(); }\r
461     else if(source==remove2LeftMenuItem)\r
462             remove2LeftMenuItem_actionPerformed();\r
463     else if(source==remove2RightMenuItem)\r
464             remove2RightMenuItem_actionPerformed();\r
465     else if(source==removeGappedColumnMenuItem)\r
466             removeGappedColumnMenuItem_actionPerformed();\r
467     else if(source==removeAllGapsMenuItem)\r
468             removeAllGapsMenuItem_actionPerformed();\r
469     else if(source==findMenuItem)\r
470             findMenuItem_actionPerformed();\r
471     else if(source==font)\r
472             font_actionPerformed();\r
473     else if(source==showColumns)\r
474     {\r
475       viewport.showAllHiddenColumns(); alignPanel.repaint();\r
476     }\r
477     else if(source==showSeqs)\r
478     {\r
479       viewport.showAllHiddenSeqs();\r
480     }\r
481     else if(source == hideColumns)\r
482     {\r
483       viewport.hideSelectedColumns(); alignPanel.repaint();\r
484     }\r
485     else if(source == hideSequences && viewport.getSelectionGroup()!=null)\r
486     {\r
487       viewport.hideAllSelectedSeqs();\r
488     }\r
489     else if(source==featureSettings)\r
490             featureSettings_actionPerformed();\r
491     else if(source==overviewMenuItem)\r
492             overviewMenuItem_actionPerformed();\r
493     else if(source==noColourmenuItem)\r
494             noColourmenuItem_actionPerformed();\r
495     else if(source==clustalColour)\r
496             clustalColour_actionPerformed();\r
497     else if(source==zappoColour)\r
498             zappoColour_actionPerformed();\r
499     else if(source==taylorColour)\r
500             taylorColour_actionPerformed();\r
501     else if(source==hydrophobicityColour)\r
502             hydrophobicityColour_actionPerformed();\r
503     else if(source==helixColour)\r
504             helixColour_actionPerformed();\r
505     else if(source==strandColour)\r
506             strandColour_actionPerformed();\r
507     else if(source==turnColour)\r
508             turnColour_actionPerformed();\r
509     else if(source==buriedColour)\r
510             buriedColour_actionPerformed();\r
511     else if(source==nucleotideColour)\r
512             nucleotideColour_actionPerformed();\r
513     else if(source==modifyPID)\r
514             modifyPID_actionPerformed();\r
515     else if(source==modifyConservation)\r
516             modifyConservation_actionPerformed();\r
517     else if(source==userDefinedColour)\r
518             userDefinedColour_actionPerformed();\r
519     else if(source==PIDColour)\r
520             PIDColour_actionPerformed();\r
521     else if(source==BLOSUM62Colour)\r
522             BLOSUM62Colour_actionPerformed();\r
523     else if(source==annotationColour)\r
524            new AnnotationColourChooser(viewport, alignPanel);\r
525     else if(source==sortPairwiseMenuItem)\r
526             sortPairwiseMenuItem_actionPerformed();\r
527     else if(source==sortIDMenuItem)\r
528             sortIDMenuItem_actionPerformed();\r
529     else if(source==sortGroupMenuItem)\r
530             sortGroupMenuItem_actionPerformed();\r
531     else if(source==removeRedundancyMenuItem)\r
532             removeRedundancyMenuItem_actionPerformed();\r
533     else if(source==pairwiseAlignmentMenuItem)\r
534             pairwiseAlignmentMenuItem_actionPerformed();\r
535     else if(source==PCAMenuItem)\r
536             PCAMenuItem_actionPerformed();\r
537     else if(source==averageDistanceTreeMenuItem)\r
538             averageDistanceTreeMenuItem_actionPerformed();\r
539     else if(source==neighbourTreeMenuItem)\r
540             neighbourTreeMenuItem_actionPerformed();\r
541     else if(source==njTreeBlosumMenuItem)\r
542             njTreeBlosumMenuItem_actionPerformed();\r
543     else if(source==avDistanceTreeBlosumMenuItem)\r
544             avTreeBlosumMenuItem_actionPerformed();\r
545     else if(source==documentation)\r
546             documentation_actionPerformed();\r
547     else if(source==about)\r
548             about_actionPerformed();\r
549 \r
550  }\r
551 \r
552   public void inputText_actionPerformed()\r
553   {\r
554     CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);\r
555     Frame frame = new Frame();\r
556     frame.add(cap);\r
557     jalview.bin.JalviewLite.addFrame(frame, "Cut & Paste Input", 500, 500);\r
558   }\r
559 \r
560   protected void outputText_actionPerformed(ActionEvent e)\r
561   {\r
562     CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);\r
563     Frame frame = new Frame();\r
564     frame.add(cap);\r
565     jalview.bin.JalviewLite.addFrame(frame,\r
566                                      "Alignment output - " + e.getActionCommand(),\r
567                                      600, 500);\r
568     cap.setText(new AppletFormatAdapter().formatSequences(e.getActionCommand(),\r
569                                               viewport.getAlignment().getSequences(),\r
570                                                       viewport.showJVSuffix));\r
571   }\r
572 \r
573   void launchFullApplication()\r
574   {\r
575     StringBuffer url = new StringBuffer(jalviewServletURL);\r
576 \r
577     url.append("?open="+\r
578                appendProtocol( viewport.applet.getParameter("file") ) );\r
579 \r
580     if(viewport.applet.getParameter("features")!=null)\r
581     {\r
582       url.append( "&features=" );\r
583       url.append( appendProtocol( viewport.applet.getParameter("features") ) );\r
584     }\r
585 \r
586     if(viewport.applet.getParameter("annotations")!=null)\r
587     {\r
588       url.append( "&annotations=" );\r
589       url.append( appendProtocol( viewport.applet.getParameter("annotations") ) );\r
590     }\r
591 \r
592     if(viewport.applet.getParameter("jnetfile")!=null)\r
593     {\r
594       url.append( "&annotations=" );\r
595       url.append( appendProtocol( viewport.applet.getParameter("jnetfile") ) );\r
596     }\r
597 \r
598     if(viewport.applet.getParameter("defaultColour")!=null)\r
599     {\r
600       url.append("&colour=" +\r
601                  removeWhiteSpace(viewport.applet.getParameter("defaultColour"))\r
602           );\r
603     }\r
604 \r
605     if(viewport.applet.getParameter("userDefinedColour")!=null)\r
606     {\r
607       url.append( "&colour=" +\r
608                  removeWhiteSpace( viewport.applet.getParameter("userDefinedColour") )\r
609          );\r
610     }\r
611 \r
612     showURL(url.toString(), "FULL_APP");\r
613   }\r
614 \r
615 \r
616   String removeWhiteSpace(String colour)\r
617   {\r
618     StringBuffer sb = new StringBuffer();\r
619     for (int i = 0; i < colour.length(); i++)\r
620     {\r
621       if (Character.isWhitespace(colour.charAt(i)))\r
622         sb.append("%20");\r
623       else\r
624         sb.append(colour.charAt(i));\r
625     }\r
626 \r
627     return sb.toString();\r
628   }\r
629 \r
630 \r
631   String appendProtocol(String url)\r
632   {\r
633     try{\r
634        new URL(url);\r
635     }catch(java.net.MalformedURLException ex)\r
636     {\r
637       url = viewport.applet.getCodeBase()+url;\r
638     }\r
639     return url;\r
640   }\r
641 \r
642   public void closeMenuItem_actionPerformed()\r
643   {\r
644     PaintRefresher.components.remove(viewport.alignment);\r
645     if(PaintRefresher.components.size()==0 && viewport.applet==null)\r
646       System.exit(0);\r
647 \r
648     this.dispose();\r
649   }\r
650 \r
651   Stack historyList = new Stack();\r
652   Stack redoList = new Stack();\r
653 \r
654   void updateEditMenuBar()\r
655   {\r
656     if (historyList.size() > 0)\r
657     {\r
658       undoMenuItem.setEnabled(true);\r
659       HistoryItem hi = (HistoryItem) historyList.peek();\r
660       undoMenuItem.setLabel("Undo " + hi.getDescription());\r
661     }\r
662     else\r
663     {\r
664       undoMenuItem.setEnabled(false);\r
665       undoMenuItem.setLabel("Undo");\r
666     }\r
667 \r
668     if (redoList.size() > 0)\r
669     {\r
670       redoMenuItem.setEnabled(true);\r
671       HistoryItem hi = (HistoryItem) redoList.peek();\r
672       redoMenuItem.setLabel("Redo " + hi.getDescription());\r
673     }\r
674     else\r
675     {\r
676       redoMenuItem.setEnabled(false);\r
677       redoMenuItem.setLabel("Redo");\r
678     }\r
679   }\r
680 \r
681   public void addHistoryItem(HistoryItem hi)\r
682   {\r
683     historyList.push(hi);\r
684     redoList.removeAllElements();\r
685     updateEditMenuBar();\r
686   }\r
687 \r
688   protected void undoMenuItem_actionPerformed()\r
689   {\r
690     HistoryItem nh,hi = (HistoryItem) historyList.pop();\r
691     redoList.push(nh=new HistoryItem(hi.getDescription(), viewport.alignment,\r
692                                   HistoryItem.HIDE));\r
693     if (hi.alColumnChanges!=null)\r
694       nh.alColumnChanges=hi.alColumnChanges.getInverse();\r
695     restoreHistoryItem(hi);\r
696     viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
697   }\r
698 \r
699   protected void redoMenuItem_actionPerformed()\r
700   {\r
701     HistoryItem nh,hi = (HistoryItem) redoList.pop();\r
702     historyList.push(nh=new HistoryItem(hi.getDescription(), viewport.alignment,\r
703                                   HistoryItem.HIDE));\r
704     if (hi.alColumnChanges!=null)\r
705       nh.alColumnChanges=hi.alColumnChanges.getInverse();\r
706     restoreHistoryItem(hi);\r
707     updateEditMenuBar();\r
708     viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
709   }\r
710 \r
711   // used by undo and redo\r
712   void restoreHistoryItem(HistoryItem hi)\r
713   {\r
714     hi.restore(viewport.getColumnSelection());\r
715     updateEditMenuBar();\r
716 \r
717     viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
718   }\r
719 \r
720   public void moveSelectedSequences(boolean up)\r
721   {\r
722     SequenceGroup sg = viewport.getSelectionGroup();\r
723     if (sg == null)\r
724     {\r
725       return;\r
726     }\r
727 \r
728     if (up)\r
729     {\r
730       for (int i = 1; i < viewport.alignment.getHeight(); i++)\r
731       {\r
732         SequenceI seq = viewport.alignment.getSequenceAt(i);\r
733         if (!sg.getSequences(false).contains(seq))\r
734         {\r
735           continue;\r
736         }\r
737 \r
738         SequenceI temp = viewport.alignment.getSequenceAt(i - 1);\r
739         if (sg.getSequences(false).contains(temp))\r
740         {\r
741           continue;\r
742         }\r
743 \r
744         viewport.alignment.getSequences().setElementAt(temp, i);\r
745         viewport.alignment.getSequences().setElementAt(seq, i - 1);\r
746       }\r
747     }\r
748     else\r
749     {\r
750       for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)\r
751       {\r
752         SequenceI seq = viewport.alignment.getSequenceAt(i);\r
753         if (!sg.getSequences(true).contains(seq))\r
754         {\r
755           continue;\r
756         }\r
757 \r
758         SequenceI temp = viewport.alignment.getSequenceAt(i + 1);\r
759         if (sg.getSequences(true).contains(temp))\r
760         {\r
761           continue;\r
762         }\r
763 \r
764         viewport.alignment.getSequences().setElementAt(temp, i);\r
765         viewport.alignment.getSequences().setElementAt(seq, i + 1);\r
766       }\r
767     }\r
768 \r
769     alignPanel.repaint();\r
770   }\r
771 \r
772   static StringBuffer copiedSequences;\r
773   static Vector copiedHiddenColumns;\r
774   protected void copy_actionPerformed()\r
775   {\r
776     if (viewport.getSelectionGroup() == null)\r
777     {\r
778       return;\r
779     }\r
780 \r
781     SequenceGroup sg = viewport.getSelectionGroup();\r
782     copiedSequences = new StringBuffer();\r
783     Hashtable orderedSeqs = new Hashtable();\r
784     for (int i = 0; i < sg.getSize(false); i++)\r
785     {\r
786       SequenceI seq = sg.getSequenceAt(i);\r
787       int index = viewport.alignment.findIndex(seq);\r
788       orderedSeqs.put(index + "", seq);\r
789     }\r
790 \r
791     int index = 0, startRes, endRes;\r
792     char ch;\r
793 \r
794     if (viewport.hasHiddenColumns && viewport.getSelectionGroup() != null)\r
795     {\r
796       copiedHiddenColumns = new Vector();\r
797       int hiddenOffset = viewport.getSelectionGroup().getStartRes();\r
798       for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns().size();\r
799            i++)\r
800       {\r
801         int[] region = (int[])\r
802             viewport.getColumnSelection().getHiddenColumns().elementAt(i);\r
803 \r
804         copiedHiddenColumns.addElement(new int[]\r
805                                  {region[0] - hiddenOffset,\r
806                                  region[1] - hiddenOffset});\r
807       }\r
808     }\r
809     else\r
810       copiedHiddenColumns = null;\r
811 \r
812 \r
813     for (int i = 0; i < sg.getSize(false); i++)\r
814     {\r
815         SequenceI seq = null;\r
816 \r
817         while (seq == null)\r
818         {\r
819             if (orderedSeqs.containsKey(index + ""))\r
820             {\r
821                 seq = (SequenceI) orderedSeqs.get(index + "");\r
822                 index++;\r
823 \r
824                 break;\r
825             }\r
826             else\r
827             {\r
828                 index++;\r
829             }\r
830         }\r
831 \r
832         //FIND START RES\r
833         //Returns residue following index if gap\r
834         startRes = seq.findPosition(sg.getStartRes());\r
835 \r
836         //FIND END RES\r
837         //Need to find the residue preceeding index if gap\r
838         endRes = 0;\r
839 \r
840         for (int j = 0; j < sg.getEndRes()+1 && j < seq.getLength(); j++)\r
841         {\r
842           ch = seq.getCharAt(j);\r
843           if (!jalview.util.Comparison.isGap( (ch)))\r
844           {\r
845             endRes++;\r
846           }\r
847         }\r
848 \r
849         if(endRes>0)\r
850         {\r
851           endRes += seq.getStart() -1;\r
852         }\r
853 \r
854         copiedSequences.append(seq.getName() + "\t" +\r
855             startRes + "\t" +\r
856             endRes + "\t" +\r
857             seq.getSequence(sg.getStartRes(),\r
858                 sg.getEndRes() + 1) + "\n");\r
859     }\r
860 \r
861   }\r
862 \r
863   protected void pasteNew_actionPerformed()\r
864   {\r
865     paste(true);\r
866   }\r
867 \r
868   protected void pasteThis_actionPerformed()\r
869   {\r
870     addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,\r
871                                    HistoryItem.PASTE));\r
872     paste(false);\r
873   }\r
874 \r
875   void paste(boolean newAlignment)\r
876   {\r
877     try\r
878     {\r
879       if (copiedSequences == null)\r
880       {\r
881         return;\r
882       }\r
883 \r
884       StringTokenizer st = new StringTokenizer(copiedSequences.toString());\r
885       Vector seqs = new Vector();\r
886       while (st.hasMoreElements())\r
887       {\r
888         String name = st.nextToken();\r
889         int start = Integer.parseInt(st.nextToken());\r
890         int end = Integer.parseInt(st.nextToken());\r
891         Sequence sequence = new Sequence(name, st.nextToken(), start, end);\r
892 \r
893         if (!newAlignment)\r
894         {\r
895           viewport.alignment.addSequence(sequence);\r
896         }\r
897         else\r
898         {\r
899           seqs.addElement(sequence);\r
900         }\r
901       }\r
902 \r
903       if (newAlignment)\r
904       {\r
905         SequenceI[] newSeqs = new SequenceI[seqs.size()];\r
906         for (int i = 0; i < seqs.size(); i++)\r
907         {\r
908           newSeqs[i] = (SequenceI) seqs.elementAt(i);\r
909         }\r
910 \r
911         String newtitle = new String("Copied sequences");\r
912         if (getTitle().startsWith("Copied sequences"))\r
913         {\r
914           newtitle = getTitle();\r
915         }\r
916         else\r
917         {\r
918           newtitle = newtitle.concat("- from " + getTitle());\r
919         }\r
920         AlignFrame af = new AlignFrame(new Alignment(newSeqs),\r
921                                        viewport.applet,\r
922                                        newtitle,\r
923                                        false);\r
924         if (copiedHiddenColumns != null)\r
925         {\r
926           for (int i = 0; i < copiedHiddenColumns.size(); i++)\r
927           {\r
928             int[] region = (int[]) copiedHiddenColumns.elementAt(i);\r
929             af.viewport.hideColumns(region[0], region[1]);\r
930           }\r
931         }\r
932 \r
933 \r
934         jalview.bin.JalviewLite.addFrame(af, newtitle, NEW_WINDOW_WIDTH,\r
935                                          NEW_WINDOW_HEIGHT);\r
936       }\r
937       else\r
938       {\r
939         viewport.setEndSeq(viewport.alignment.getHeight());\r
940         viewport.alignment.getWidth();\r
941         viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
942       }\r
943 \r
944     }\r
945     catch (Exception ex)\r
946     {} // could be anything being pasted in here\r
947 \r
948   }\r
949 \r
950   protected void cut_actionPerformed()\r
951   {\r
952     copy_actionPerformed();\r
953     delete_actionPerformed();\r
954   }\r
955 \r
956   protected void delete_actionPerformed()\r
957   {\r
958     addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,\r
959                                    HistoryItem.HIDE));\r
960     if (viewport.getSelectionGroup() == null)\r
961     {\r
962       return;\r
963     }\r
964 \r
965 \r
966     SequenceGroup sg = viewport.getSelectionGroup();\r
967     boolean allSequences = false;\r
968     if(sg.getSize(false)==viewport.alignment.getHeight())\r
969           allSequences = true;\r
970 \r
971     for (int i = 0; i < sg.getSize(false); i++)\r
972     {\r
973       SequenceI seq = sg.getSequenceAt(i);\r
974       int index = viewport.getAlignment().findIndex(seq);\r
975       seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);\r
976 \r
977       // If the cut affects all sequences, remove highlighted columns\r
978       if (allSequences)\r
979       {\r
980         viewport.getColumnSelection().removeElements(sg.getStartRes(),\r
981                                                      sg.getEndRes() + 1);\r
982       }\r
983 \r
984 \r
985       if (seq.getSequence().length() < 1)\r
986       {\r
987         viewport.getAlignment().deleteSequence(seq);\r
988       }\r
989       else\r
990       {\r
991         viewport.getAlignment().getSequences().setElementAt(seq, index);\r
992       }\r
993     }\r
994 \r
995     viewport.setSelectionGroup(null);\r
996     viewport.alignment.deleteGroup(sg);\r
997     viewport.resetSeqLimits(alignPanel.seqPanel.seqCanvas.getSize().height);\r
998     if (viewport.getAlignment().getHeight() < 1)\r
999     {\r
1000       try\r
1001       {\r
1002         this.setVisible(false);\r
1003       }\r
1004       catch (Exception ex)\r
1005       {}\r
1006     }\r
1007     viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
1008 \r
1009   }\r
1010 \r
1011   protected void deleteGroups_actionPerformed()\r
1012   {\r
1013     viewport.alignment.deleteAllGroups();\r
1014     viewport.setSelectionGroup(null);\r
1015 \r
1016     alignPanel.repaint();\r
1017   }\r
1018 \r
1019   public void selectAllSequenceMenuItem_actionPerformed()\r
1020   {\r
1021     SequenceGroup sg = new SequenceGroup();\r
1022     for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)\r
1023     {\r
1024       sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);\r
1025     }\r
1026     sg.setEndRes(viewport.alignment.getWidth()-1);\r
1027     viewport.setSelectionGroup(sg);\r
1028     alignPanel.repaint();\r
1029     PaintRefresher.Refresh(null, viewport.alignment);\r
1030   }\r
1031 \r
1032   public void deselectAllSequenceMenuItem_actionPerformed()\r
1033   {\r
1034     if(viewport.cursorMode)\r
1035     {\r
1036       alignPanel.seqPanel.keyboardNo1=null;\r
1037       alignPanel.seqPanel.keyboardNo2=null;\r
1038     }\r
1039     viewport.setSelectionGroup(null);\r
1040     viewport.getColumnSelection().clear();\r
1041     viewport.setSelectionGroup(null);\r
1042     alignPanel.idPanel.idCanvas.searchResults = null;\r
1043     alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);\r
1044     alignPanel.repaint();\r
1045     PaintRefresher.Refresh(null, viewport.alignment);\r
1046   }\r
1047 \r
1048   public void invertSequenceMenuItem_actionPerformed()\r
1049   {\r
1050     SequenceGroup sg = viewport.getSelectionGroup();\r
1051     for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)\r
1052     {\r
1053       sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);\r
1054     }\r
1055 \r
1056     PaintRefresher.Refresh(null, viewport.alignment);\r
1057   }\r
1058 \r
1059   public void remove2LeftMenuItem_actionPerformed()\r
1060   {\r
1061     ColumnSelection colSel = viewport.getColumnSelection();\r
1062     if (colSel.size() > 0)\r
1063     {\r
1064       HistoryItem edit;\r
1065       addHistoryItem(edit=new HistoryItem("Remove Left", viewport.alignment,\r
1066                                      HistoryItem.HIDE));\r
1067       int min = colSel.getMin();\r
1068       viewport.getAlignment().trimLeft(min);\r
1069       colSel.compensateForEdit(0, min);\r
1070       edit.addShift(0, min);\r
1071       if (viewport.getSelectionGroup() != null)\r
1072       {\r
1073         viewport.getSelectionGroup().adjustForRemoveLeft(min);\r
1074       }\r
1075 \r
1076       Vector groups = viewport.alignment.getGroups();\r
1077       for (int i = 0; i < groups.size(); i++)\r
1078       {\r
1079         SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
1080         if (!sg.adjustForRemoveLeft(min))\r
1081         {\r
1082           viewport.alignment.deleteGroup(sg);\r
1083         }\r
1084       }\r
1085       viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
1086     }\r
1087   }\r
1088 \r
1089   public void remove2RightMenuItem_actionPerformed()\r
1090   {\r
1091     ColumnSelection colSel = viewport.getColumnSelection();\r
1092     if (colSel.size() > 0)\r
1093     {\r
1094       addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,\r
1095                                      HistoryItem.HIDE));\r
1096       int max = colSel.getMax();\r
1097       viewport.getAlignment().trimRight(max);\r
1098 \r
1099       if (viewport.getSelectionGroup() != null)\r
1100       {\r
1101         viewport.getSelectionGroup().adjustForRemoveRight(max);\r
1102       }\r
1103 \r
1104       Vector groups = viewport.alignment.getGroups();\r
1105       for (int i = 0; i < groups.size(); i++)\r
1106       {\r
1107         SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
1108         if (!sg.adjustForRemoveRight(max))\r
1109         {\r
1110           viewport.alignment.deleteGroup(sg);\r
1111         }\r
1112       }\r
1113       viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
1114     }\r
1115 \r
1116   }\r
1117 \r
1118   public void removeGappedColumnMenuItem_actionPerformed()\r
1119   {\r
1120     HistoryItem edit;\r
1121     addHistoryItem(edit=new HistoryItem("Remove Gapped Columns",\r
1122                                    viewport.alignment,\r
1123                                    HistoryItem.HIDE));\r
1124 \r
1125     //This is to maintain viewport position on first residue\r
1126     //of first sequence\r
1127     SequenceI seq = viewport.alignment.getSequenceAt(0);\r
1128     int startRes = seq.findPosition(viewport.startRes);\r
1129 \r
1130     viewport.getAlignment().removeGaps();\r
1131 \r
1132     viewport.setStartRes(seq.findIndex(startRes)-1);\r
1133 \r
1134     viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
1135   }\r
1136 \r
1137   public void removeAllGapsMenuItem_actionPerformed()\r
1138   {\r
1139     // TODO: hidden regions should not be touched by removeAllGaps - a minimal number of gaps will remain in alignment segments containing uneven length subsequences\r
1140     // TODO: columnSelection.compensateforedits should be called (and passed to history item)\r
1141     HistoryItem editgaps;\r
1142     addHistoryItem(editgaps=new HistoryItem("Remove Gaps", viewport.alignment,\r
1143                                    HistoryItem.HIDE));\r
1144 \r
1145     //This is to maintain viewport position on first residue\r
1146     //of first sequence\r
1147     SequenceI seq = viewport.alignment.getSequenceAt(0);\r
1148     int startRes = seq.findPosition(viewport.startRes);\r
1149 \r
1150     SequenceI current;\r
1151     Vector seqs=null;\r
1152 \r
1153     int start=0, end = viewport.alignment.getWidth();\r
1154 \r
1155     if (viewport.getSelectionGroup() != null\r
1156         && viewport.getSelectionGroup().getSequences(false) != null\r
1157         && viewport.getSelectionGroup().getSize(false)>0)\r
1158     {\r
1159       seqs = viewport.getSelectionGroup().getSequences(true);\r
1160       start = viewport.getSelectionGroup().getStartRes();\r
1161       end = viewport.getSelectionGroup().getEndRes()+1;\r
1162     }\r
1163     else\r
1164       seqs = viewport.alignment.getSequences();\r
1165 \r
1166     /* Commented out regions below are partial implementation of todo above.\r
1167      * divide start,end into visible chunks, and for each:\r
1168      int diff=end-start+1;\r
1169      int diffmax=0;\r
1170      int dr[] = new int[seqs.size()];\r
1171      */\r
1172     for (int i = 0; i < seqs.size(); i++)\r
1173     {\r
1174       current = (SequenceI) seqs.elementAt(i);\r
1175       //dr[i]=\r
1176       current.removeGaps(start, end);\r
1177       /*if (d<diff) // can only shift\r
1178         diff=d;\r
1179       if (diffmax<d)\r
1180         diffmax=d;\r
1181         */\r
1182     }\r
1183     /* // after the end of each chunk -\r
1184      * if (diff>0) {\r
1185      // record shift for history.\r
1186       editgaps.addShift(start, diff);\r
1187       if (viewport.hasHiddenColumns && diffmax>diff) {\r
1188       // pad sequence\r
1189        StringBuffer gaps=new StringBuffer(diffmax);\r
1190        for (int i=0,j=diffmax-diff; i<j; i++)\r
1191        gaps.append(viewport.getGapCharacter());\r
1192        for (int i=0, j=seqs.size(); i<j; i++) {\r
1193        current = (SequenceI) seqs.elementAt(i);\r
1194        if (dr[i]-diff>0) {\r
1195        String sq = current.getSequence();\r
1196        current.setSequence(sq.substring(0, hcend-dr[i])+gaps.substring(0, dr[i]-diff)+sq.substring());\r
1197        }\r
1198        }\r
1199       }\r
1200       }*/\r
1201 \r
1202     viewport.setStartRes(seq.findIndex(startRes)-1);\r
1203     viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
1204   }\r
1205 \r
1206   public void alignmentChanged()\r
1207   {\r
1208     viewport.alignment.padGaps();\r
1209     if(viewport.autocalculateConsensus)\r
1210     {\r
1211       viewport.updateConsensus();\r
1212       viewport.updateConservation();\r
1213     }\r
1214 \r
1215     resetAllColourSchemes();\r
1216     if(alignPanel.overviewPanel!=null)\r
1217       alignPanel.overviewPanel.updateOverviewImage();\r
1218 \r
1219     viewport.alignment.adjustSequenceAnnotations();\r
1220     alignPanel.repaint();\r
1221   }\r
1222 \r
1223   void resetAllColourSchemes()\r
1224   {\r
1225     ColourSchemeI cs = viewport.globalColourScheme;\r
1226     if(cs!=null)\r
1227     {\r
1228       if (cs instanceof ClustalxColourScheme)\r
1229       {\r
1230         ( (ClustalxColourScheme) viewport.getGlobalColourScheme()).\r
1231             resetClustalX(viewport.alignment.getSequences(),\r
1232                           viewport.alignment.getWidth());\r
1233       }\r
1234 \r
1235       cs.setConsensus(viewport.vconsensus);\r
1236       if (cs.conservationApplied())\r
1237       {\r
1238         Alignment al = (Alignment) viewport.alignment;\r
1239         Conservation c = new Conservation("All",\r
1240                                           ResidueProperties.propHash, 3,\r
1241                                           al.getSequences(), 0,\r
1242                                           al.getWidth() - 1);\r
1243         c.calculate();\r
1244         c.verdict(false, viewport.ConsPercGaps);\r
1245 \r
1246         cs.setConservation(c);\r
1247       }\r
1248     }\r
1249 \r
1250     int s, sSize = viewport.alignment.getGroups().size();\r
1251     for(s=0; s<sSize; s++)\r
1252     {\r
1253       SequenceGroup sg = (SequenceGroup)viewport.alignment.getGroups().elementAt(s);\r
1254       if(sg.cs!=null && sg.cs instanceof ClustalxColourScheme)\r
1255       {\r
1256         ((ClustalxColourScheme)sg.cs).resetClustalX(\r
1257             sg.getSequences(true), sg.getWidth());\r
1258       }\r
1259       sg.recalcConservation();\r
1260     }\r
1261   }\r
1262 \r
1263 \r
1264 \r
1265   public void findMenuItem_actionPerformed()\r
1266   {\r
1267     new Finder(alignPanel);\r
1268   }\r
1269 \r
1270   public void font_actionPerformed()\r
1271   {\r
1272     new FontChooser(alignPanel);\r
1273   }\r
1274 \r
1275 \r
1276   public void seqLimits_itemStateChanged()\r
1277   {\r
1278     viewport.setShowJVSuffix(seqLimits.getState());\r
1279     alignPanel.fontChanged();\r
1280     alignPanel.repaint();\r
1281   }\r
1282 \r
1283 \r
1284   protected void colourTextMenuItem_actionPerformed()\r
1285   {\r
1286     viewport.setColourText(colourTextMenuItem.getState());\r
1287     alignPanel.repaint();\r
1288   }\r
1289 \r
1290   protected void wrapMenuItem_actionPerformed()\r
1291   {\r
1292     viewport.setWrapAlignment(wrapMenuItem.getState());\r
1293     alignPanel.setWrapAlignment(wrapMenuItem.getState());\r
1294     scaleAbove.setEnabled(wrapMenuItem.getState());\r
1295     scaleLeft.setEnabled(wrapMenuItem.getState());\r
1296     scaleRight.setEnabled(wrapMenuItem.getState());\r
1297     alignPanel.repaint();\r
1298   }\r
1299 \r
1300 \r
1301   protected void scaleAbove_actionPerformed()\r
1302   {\r
1303     viewport.setScaleAboveWrapped(scaleAbove.getState());\r
1304     alignPanel.repaint();\r
1305   }\r
1306 \r
1307   protected void scaleLeft_actionPerformed()\r
1308   {\r
1309     viewport.setScaleLeftWrapped(scaleLeft.getState());\r
1310     alignPanel.repaint();\r
1311   }\r
1312 \r
1313   protected void scaleRight_actionPerformed()\r
1314   {\r
1315     viewport.setScaleRightWrapped(scaleRight.getState());\r
1316     alignPanel.repaint();\r
1317   }\r
1318 \r
1319   public void viewBoxesMenuItem_actionPerformed()\r
1320   {\r
1321     viewport.setShowBoxes(viewBoxesMenuItem.getState());\r
1322     alignPanel.repaint();\r
1323   }\r
1324 \r
1325   public void viewTextMenuItem_actionPerformed()\r
1326   {\r
1327     viewport.setShowText(viewTextMenuItem.getState());\r
1328     alignPanel.repaint();\r
1329   }\r
1330 \r
1331   protected void renderGapsMenuItem_actionPerformed()\r
1332   {\r
1333     viewport.setRenderGaps(renderGapsMenuItem.getState());\r
1334     alignPanel.repaint();\r
1335   }\r
1336 \r
1337   public void annotationPanelMenuItem_actionPerformed()\r
1338   {\r
1339     viewport.setShowAnnotation(annotationPanelMenuItem.getState());\r
1340     alignPanel.setAnnotationVisible(annotationPanelMenuItem.getState());\r
1341   }\r
1342 \r
1343   public void featureSettings_actionPerformed()\r
1344   {\r
1345     new FeatureSettings(viewport, alignPanel);\r
1346   }\r
1347 \r
1348   public void overviewMenuItem_actionPerformed()\r
1349   {\r
1350     if (alignPanel.overviewPanel != null)\r
1351     {\r
1352       return;\r
1353     }\r
1354 \r
1355     Frame frame = new Frame();\r
1356     OverviewPanel overview = new OverviewPanel(alignPanel);\r
1357     frame.add(overview);\r
1358     // +50 must allow for applet frame window\r
1359     jalview.bin.JalviewLite.addFrame(frame, "Overview " + this.getTitle(),\r
1360                                      overview.preferredSize().width,\r
1361                                      overview.preferredSize().height + 50);\r
1362 \r
1363     frame.pack();\r
1364     frame.addWindowListener(new WindowAdapter()\r
1365     {\r
1366       public void windowClosing(WindowEvent e)\r
1367       {\r
1368         alignPanel.setOverviewPanel(null);\r
1369       };\r
1370     });\r
1371 \r
1372     alignPanel.setOverviewPanel(overview);\r
1373 \r
1374   }\r
1375 \r
1376   protected void noColourmenuItem_actionPerformed()\r
1377   {\r
1378     changeColour(null);\r
1379   }\r
1380 \r
1381   public void clustalColour_actionPerformed()\r
1382   {\r
1383     abovePIDThreshold.setState(false);\r
1384     changeColour(new ClustalxColourScheme(viewport.alignment.getSequences(),\r
1385                                           viewport.alignment.getWidth()));\r
1386   }\r
1387 \r
1388   public void zappoColour_actionPerformed()\r
1389   {\r
1390     changeColour(new ZappoColourScheme());\r
1391   }\r
1392 \r
1393   public void taylorColour_actionPerformed()\r
1394   {\r
1395     changeColour(new TaylorColourScheme());\r
1396   }\r
1397 \r
1398   public void hydrophobicityColour_actionPerformed()\r
1399   {\r
1400     changeColour(new HydrophobicColourScheme());\r
1401   }\r
1402 \r
1403   public void helixColour_actionPerformed()\r
1404   {\r
1405     changeColour(new HelixColourScheme());\r
1406   }\r
1407 \r
1408   public void strandColour_actionPerformed()\r
1409   {\r
1410     changeColour(new StrandColourScheme());\r
1411   }\r
1412 \r
1413   public void turnColour_actionPerformed()\r
1414   {\r
1415     changeColour(new TurnColourScheme());\r
1416   }\r
1417 \r
1418   public void buriedColour_actionPerformed()\r
1419   {\r
1420     changeColour(new BuriedColourScheme());\r
1421   }\r
1422 \r
1423   public void nucleotideColour_actionPerformed()\r
1424   {\r
1425     changeColour(new NucleotideColourScheme());\r
1426   }\r
1427 \r
1428   protected void applyToAllGroups_actionPerformed()\r
1429   {\r
1430     viewport.setColourAppliesToAllGroups(applyToAllGroups.getState());\r
1431   }\r
1432 \r
1433   void changeColour(ColourSchemeI cs)\r
1434   {\r
1435     int threshold = 0;\r
1436 \r
1437     if(cs!=null)\r
1438     {\r
1439       if (viewport.getAbovePIDThreshold())\r
1440       {\r
1441         threshold = SliderPanel.setPIDSliderSource(alignPanel, cs, "Background");\r
1442 \r
1443         cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());\r
1444 \r
1445         viewport.setGlobalColourScheme(cs);\r
1446       }\r
1447       else\r
1448       {\r
1449         cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
1450       }\r
1451 \r
1452       if (viewport.getConservationSelected())\r
1453       {\r
1454 \r
1455         Alignment al = (Alignment) viewport.alignment;\r
1456         Conservation c = new Conservation("All",\r
1457                                           ResidueProperties.propHash, 3,\r
1458                                           al.getSequences(), 0,\r
1459                                           al.getWidth() - 1);\r
1460 \r
1461         c.calculate();\r
1462         c.verdict(false, viewport.ConsPercGaps);\r
1463 \r
1464         cs.setConservation(c);\r
1465 \r
1466         cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel, cs,\r
1467             "Background"));\r
1468 \r
1469       }\r
1470       else\r
1471       {\r
1472         cs.setConservation(null);\r
1473       }\r
1474 \r
1475       cs.setConsensus(viewport.vconsensus);\r
1476 \r
1477     }\r
1478     viewport.setGlobalColourScheme(cs);\r
1479 \r
1480     if (viewport.getColourAppliesToAllGroups())\r
1481     {\r
1482       Vector groups = viewport.alignment.getGroups();\r
1483       for (int i = 0; i < groups.size(); i++)\r
1484       {\r
1485         SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
1486 \r
1487         if(cs==null)\r
1488         {\r
1489           sg.cs = null;\r
1490           continue;\r
1491         }\r
1492         if (cs instanceof ClustalxColourScheme)\r
1493         {\r
1494           sg.cs = new ClustalxColourScheme(sg.getSequences(true), sg.getWidth());\r
1495         }\r
1496         else\r
1497         {\r
1498           try\r
1499           {\r
1500             sg.cs = (ColourSchemeI) cs.getClass().newInstance();\r
1501           }\r
1502           catch (Exception ex)\r
1503           {\r
1504             ex.printStackTrace();\r
1505             sg.cs = cs;\r
1506           }\r
1507         }\r
1508 \r
1509         if (viewport.getAbovePIDThreshold()\r
1510             || cs instanceof PIDColourScheme\r
1511             || cs instanceof Blosum62ColourScheme)\r
1512         {\r
1513           sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());\r
1514           sg.cs.setConsensus(AAFrequency.calculate(sg.getSequences(true), 0, sg.getWidth()));\r
1515         }\r
1516         else\r
1517           sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
1518 \r
1519         if (viewport.getConservationSelected())\r
1520         {\r
1521           Conservation c = new Conservation("Group",\r
1522                                             ResidueProperties.propHash, 3,\r
1523                                             sg.getSequences(true), 0,\r
1524                                             viewport.alignment.getWidth() - 1);\r
1525           c.calculate();\r
1526           c.verdict(false, viewport.ConsPercGaps);\r
1527           sg.cs.setConservation(c);\r
1528         }\r
1529         else\r
1530         {\r
1531           sg.cs.setConservation(null);\r
1532           sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
1533         }\r
1534 \r
1535       }\r
1536     }\r
1537 \r
1538 \r
1539     if (alignPanel.getOverviewPanel() != null)\r
1540     {\r
1541       alignPanel.getOverviewPanel().updateOverviewImage();\r
1542     }\r
1543 \r
1544     alignPanel.repaint();\r
1545   }\r
1546 \r
1547 \r
1548 \r
1549   protected void modifyPID_actionPerformed()\r
1550   {\r
1551     if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme!=null)\r
1552     {\r
1553       SliderPanel.setPIDSliderSource(alignPanel, viewport.getGlobalColourScheme(),\r
1554                                      "Background");\r
1555       SliderPanel.showPIDSlider();\r
1556     }\r
1557   }\r
1558 \r
1559   protected void modifyConservation_actionPerformed()\r
1560   {\r
1561     if (viewport.getConservationSelected() && viewport.globalColourScheme!=null)\r
1562     {\r
1563       SliderPanel.setConservationSlider(alignPanel, viewport.globalColourScheme,\r
1564                                         "Background");\r
1565       SliderPanel.showConservationSlider();\r
1566     }\r
1567   }\r
1568 \r
1569   protected void conservationMenuItem_actionPerformed()\r
1570   {\r
1571     viewport.setConservationSelected(conservationMenuItem.getState());\r
1572 \r
1573     viewport.setAbovePIDThreshold(false);\r
1574     abovePIDThreshold.setState(false);\r
1575 \r
1576     changeColour(viewport.getGlobalColourScheme());\r
1577 \r
1578     modifyConservation_actionPerformed();\r
1579   }\r
1580 \r
1581   public void abovePIDThreshold_actionPerformed()\r
1582   {\r
1583     viewport.setAbovePIDThreshold(abovePIDThreshold.getState());\r
1584 \r
1585     conservationMenuItem.setState(false);\r
1586     viewport.setConservationSelected(false);\r
1587 \r
1588     changeColour(viewport.getGlobalColourScheme());\r
1589 \r
1590     modifyPID_actionPerformed();\r
1591   }\r
1592 \r
1593   public void userDefinedColour_actionPerformed()\r
1594   {\r
1595     new UserDefinedColours(alignPanel, null);\r
1596   }\r
1597 \r
1598   public void PIDColour_actionPerformed()\r
1599   {\r
1600     changeColour(new PIDColourScheme());\r
1601   }\r
1602 \r
1603   public void BLOSUM62Colour_actionPerformed()\r
1604   {\r
1605     changeColour(new Blosum62ColourScheme());\r
1606   }\r
1607 \r
1608   public void sortPairwiseMenuItem_actionPerformed()\r
1609   {\r
1610     addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,\r
1611                                    HistoryItem.SORT));\r
1612     AlignmentSorter.sortByPID(viewport.getAlignment(),\r
1613                               viewport.getAlignment().getSequenceAt(0));\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     Menu searchMenu = new Menu();\r
1938     protected CheckboxMenuItem abovePIDThreshold = new CheckboxMenuItem();\r
1939     protected MenuItem nucleotideColour = new MenuItem();\r
1940     MenuItem deleteGroups = new MenuItem();\r
1941     MenuItem delete = new MenuItem();\r
1942     MenuItem copy = new MenuItem();\r
1943     MenuItem cut = new MenuItem();\r
1944     Menu pasteMenu = new Menu();\r
1945     MenuItem pasteNew = new MenuItem();\r
1946     MenuItem pasteThis = new MenuItem();\r
1947     protected CheckboxMenuItem applyToAllGroups = new CheckboxMenuItem();\r
1948     protected MenuItem font = new MenuItem();\r
1949     protected CheckboxMenuItem scaleAbove = new CheckboxMenuItem();\r
1950     protected CheckboxMenuItem scaleLeft = new CheckboxMenuItem();\r
1951     protected CheckboxMenuItem scaleRight = new CheckboxMenuItem();\r
1952     MenuItem modifyPID = new MenuItem();\r
1953     MenuItem modifyConservation = new MenuItem();\r
1954     protected CheckboxMenuItem autoCalculate\r
1955         = new CheckboxMenuItem("Autocalculate Consensus", true);\r
1956     protected Menu sortByTreeMenu = new Menu();\r
1957     Menu sort = new Menu();\r
1958     Menu calculate = new Menu();\r
1959     MenuItem inputText = new MenuItem();\r
1960     Menu helpMenu = new Menu();\r
1961     MenuItem documentation = new MenuItem();\r
1962     MenuItem about = new MenuItem();\r
1963     protected CheckboxMenuItem seqLimits = new CheckboxMenuItem();\r
1964   Panel embeddedMenu;\r
1965   Label embeddedEdit;\r
1966   Label embeddedSearch;\r
1967   Label embeddedView;\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         searchMenu.setLabel("Search");\r
2091 \r
2092         abovePIDThreshold.setLabel("Above Identity Threshold");\r
2093         abovePIDThreshold.addItemListener(this);\r
2094         nucleotideColour.setLabel("Nucleotide");\r
2095         nucleotideColour.addActionListener(this);\r
2096         deleteGroups.setLabel("Undefine Groups");\r
2097         deleteGroups.addActionListener(this);\r
2098         copy.setLabel("Copy");\r
2099         copy.addActionListener(this);\r
2100         cut.setLabel("Cut");\r
2101         cut.addActionListener(this);\r
2102         delete.setLabel("Delete");\r
2103         delete.addActionListener(this);\r
2104         pasteMenu.setLabel("Paste");\r
2105         pasteNew.setLabel("To New Alignment");\r
2106         pasteNew.addActionListener(this);\r
2107         pasteThis.setLabel("Add To This Alignment");\r
2108         pasteThis.addActionListener(this);\r
2109         applyToAllGroups.setLabel("Apply Colour To All Groups");\r
2110         applyToAllGroups.setState(true);\r
2111         applyToAllGroups.addItemListener(this);\r
2112         font.setLabel("Font...");\r
2113         font.addActionListener(this);\r
2114         scaleAbove.setLabel("Scale Above");\r
2115         scaleAbove.setState(true);\r
2116         scaleAbove.setEnabled(false);\r
2117         scaleAbove.addItemListener(this);\r
2118         scaleLeft.setEnabled(false);\r
2119         scaleLeft.setState(true);\r
2120         scaleLeft.setLabel("Scale Left");\r
2121         scaleLeft.addItemListener(this);\r
2122         scaleRight.setEnabled(false);\r
2123         scaleRight.setState(true);\r
2124         scaleRight.setLabel("Scale Right");\r
2125         scaleRight.addItemListener(this);\r
2126         modifyPID.setLabel("Modify Identity Threshold...");\r
2127         modifyPID.addActionListener(this);\r
2128         modifyConservation.setLabel("Modify Conservation Threshold...");\r
2129         modifyConservation.addActionListener(this);\r
2130         sortByTreeMenu.setLabel("By Tree Order");\r
2131         sort.setLabel("Sort");\r
2132         calculate.setLabel("Calculate Tree");\r
2133         autoCalculate.addItemListener(this);\r
2134         inputText.setLabel("Input from textbox");\r
2135         inputText.addActionListener(this);\r
2136 \r
2137         helpMenu.setLabel("Help");\r
2138         documentation.setLabel("Documentation");\r
2139         documentation.addActionListener(this);\r
2140 \r
2141         about.setLabel("About...");\r
2142         about.addActionListener(this);\r
2143           seqLimits.setState(true);\r
2144     seqLimits.setLabel("Show Sequence Limits");\r
2145     seqLimits.addItemListener(this);\r
2146     featureSettings.setLabel("Feature Settings...");\r
2147     featureSettings.addActionListener(this);\r
2148     sequenceFeatures.setLabel("Sequence Features");\r
2149     sequenceFeatures.addItemListener(this);\r
2150     sequenceFeatures.setState(false);\r
2151     annotationColour.setLabel("by Annotation...");\r
2152     annotationColour.addActionListener(this);\r
2153     invertSequenceMenuItem.setLabel("Invert Sequence Selection");\r
2154     invertColSel.setLabel("Invert Column Selection");\r
2155     menu1.setLabel("Show");\r
2156     showColumns.setLabel("All Columns ");\r
2157     showSeqs.setLabel("All Sequences");\r
2158     menu2.setLabel("Hide");\r
2159     hideColumns.setLabel("Selected Columns");\r
2160     hideSequences.setLabel("Selected Sequences");\r
2161     invertColSel.addActionListener(this);\r
2162     showColumns.addActionListener(this);\r
2163     showSeqs.addActionListener(this);\r
2164     hideColumns.addActionListener(this);\r
2165     hideSequences.addActionListener(this);\r
2166 \r
2167 \r
2168     alignFrameMenuBar.add(fileMenu);\r
2169         alignFrameMenuBar.add(editMenu);\r
2170         alignFrameMenuBar.add(searchMenu);\r
2171         alignFrameMenuBar.add(viewMenu);\r
2172         alignFrameMenuBar.add(colourMenu);\r
2173         alignFrameMenuBar.add(calculateMenu);\r
2174         alignFrameMenuBar.add(helpMenu);\r
2175         fileMenu.add(inputText);\r
2176         fileMenu.add(outputTextboxMenu);\r
2177         if(jalviewServletURL!=null)\r
2178           fileMenu.add(loadApplication);\r
2179         fileMenu.addSeparator();\r
2180         fileMenu.add(loadTree);\r
2181         fileMenu.add(closeMenuItem);\r
2182         editMenu.add(undoMenuItem);\r
2183         editMenu.add(redoMenuItem);\r
2184         editMenu.add(cut);\r
2185         editMenu.add(copy);\r
2186         editMenu.add(pasteMenu);\r
2187         editMenu.add(delete);\r
2188         editMenu.addSeparator();\r
2189         editMenu.add(selectAllSequenceMenuItem);\r
2190         editMenu.add(deselectAllSequenceMenuItem);\r
2191         editMenu.add(invertSequenceMenuItem);\r
2192     editMenu.add(invertColSel);\r
2193     editMenu.add(deleteGroups);\r
2194         editMenu.addSeparator();\r
2195         editMenu.add(remove2LeftMenuItem);\r
2196         editMenu.add(remove2RightMenuItem);\r
2197         editMenu.add(removeGappedColumnMenuItem);\r
2198         editMenu.add(removeAllGapsMenuItem);\r
2199         editMenu.add(removeRedundancyMenuItem);\r
2200         searchMenu.add(findMenuItem);\r
2201         viewMenu.add(font);\r
2202         viewMenu.addSeparator();\r
2203     viewMenu.add(menu1);\r
2204     viewMenu.add(menu2);\r
2205     viewMenu.addSeparator();\r
2206     viewMenu.add(wrapMenuItem);\r
2207         viewMenu.add(scaleAbove);\r
2208         viewMenu.add(scaleLeft);\r
2209         viewMenu.add(scaleRight);\r
2210         viewMenu.addSeparator();\r
2211     viewMenu.add(seqLimits);\r
2212     viewMenu.add(viewBoxesMenuItem);\r
2213         viewMenu.add(viewTextMenuItem);\r
2214         viewMenu.add(colourTextMenuItem);\r
2215         viewMenu.add(renderGapsMenuItem);\r
2216         viewMenu.add(annotationPanelMenuItem);\r
2217     viewMenu.addSeparator();\r
2218         viewMenu.add(sequenceFeatures);\r
2219         viewMenu.add(featureSettings);\r
2220     viewMenu.addSeparator();\r
2221         viewMenu.add(overviewMenuItem);\r
2222         colourMenu.add(applyToAllGroups);\r
2223         colourMenu.addSeparator();\r
2224         colourMenu.add(noColourmenuItem);\r
2225         colourMenu.add(clustalColour);\r
2226         colourMenu.add(BLOSUM62Colour);\r
2227         colourMenu.add(PIDColour);\r
2228         colourMenu.add(zappoColour);\r
2229         colourMenu.add(taylorColour);\r
2230         colourMenu.add(hydrophobicityColour);\r
2231         colourMenu.add(helixColour);\r
2232         colourMenu.add(strandColour);\r
2233         colourMenu.add(turnColour);\r
2234         colourMenu.add(buriedColour);\r
2235         colourMenu.add(nucleotideColour);\r
2236         colourMenu.add(userDefinedColour);\r
2237         colourMenu.addSeparator();\r
2238         colourMenu.add(conservationMenuItem);\r
2239         colourMenu.add(modifyConservation);\r
2240         colourMenu.add(abovePIDThreshold);\r
2241         colourMenu.add(modifyPID);\r
2242     colourMenu.add(annotationColour);\r
2243     calculateMenu.add(sort);\r
2244         calculateMenu.add(calculate);\r
2245         calculateMenu.addSeparator();\r
2246         calculateMenu.add(pairwiseAlignmentMenuItem);\r
2247         calculateMenu.add(PCAMenuItem);\r
2248         calculateMenu.add(autoCalculate);\r
2249         this.add(statusBar, BorderLayout.SOUTH);\r
2250         pasteMenu.add(pasteNew);\r
2251         pasteMenu.add(pasteThis);\r
2252         sort.add(sortIDMenuItem);\r
2253         sort.add(sortByTreeMenu);\r
2254         sort.add(sortGroupMenuItem);\r
2255         sort.add(sortPairwiseMenuItem);\r
2256         calculate.add(averageDistanceTreeMenuItem);\r
2257         calculate.add(neighbourTreeMenuItem);\r
2258         calculate.add(avDistanceTreeBlosumMenuItem);\r
2259         calculate.add(njTreeBlosumMenuItem);\r
2260         helpMenu.add(documentation);\r
2261         helpMenu.add(about);\r
2262     menu1.add(showColumns);\r
2263     menu1.add(showSeqs);\r
2264     menu2.add(hideColumns);\r
2265     menu2.add(hideSequences);\r
2266   }\r
2267 \r
2268   public void setEmbedded()\r
2269   {\r
2270 \r
2271     embeddedMenu = new Panel();\r
2272     embeddedEdit = new Label();\r
2273     embeddedSearch = new Label();\r
2274     embeddedView = new Label();\r
2275     embeddedColour = new Label();\r
2276     embeddedFile = new Label();\r
2277     embeddedHelp = new Label();\r
2278     embeddedCalculate = new Label();\r
2279     flowLayout1 = new FlowLayout();\r
2280     embeddedMenu.setBackground(Color.lightGray);\r
2281     embeddedMenu.setLayout(flowLayout1);\r
2282     embeddedEdit.setText("Edit");\r
2283     embeddedEdit.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2284     embeddedSearch.setText("Search");\r
2285     embeddedSearch.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2286     embeddedView.setText("View");\r
2287     embeddedView.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2288     embeddedColour.setText("Colour");\r
2289     embeddedColour.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2290     embeddedFile.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2291     embeddedFile.setText("File");\r
2292     embeddedHelp.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2293     embeddedHelp.setText("Help");\r
2294     embeddedCalculate.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));\r
2295     embeddedCalculate.setText("Calculate");\r
2296     embeddedMenu.add(embeddedFile);\r
2297     embeddedMenu.add(embeddedEdit);\r
2298     embeddedMenu.add(embeddedSearch);\r
2299     embeddedMenu.add(embeddedView);\r
2300     embeddedMenu.add(embeddedColour);\r
2301     embeddedMenu.add(embeddedCalculate);\r
2302     embeddedMenu.add(embeddedHelp);\r
2303     flowLayout1.setAlignment(FlowLayout.LEFT);\r
2304     flowLayout1.setHgap(2);\r
2305     flowLayout1.setVgap(0);\r
2306     embeddedFile.addMouseListener(this);\r
2307     embeddedEdit.addMouseListener(this);\r
2308     embeddedSearch.addMouseListener(this);\r
2309     embeddedView.addMouseListener(this);\r
2310     embeddedColour.addMouseListener(this);\r
2311     embeddedCalculate.addMouseListener(this);\r
2312     embeddedHelp.addMouseListener(this);\r
2313 \r
2314    // setVisible(false);\r
2315     fileMenu.remove(closeMenuItem);\r
2316     fileMenu.remove(3); // Seperator\r
2317 \r
2318     viewport.applet.setLayout(new BorderLayout());\r
2319     viewport.applet.add(embeddedMenu, BorderLayout.NORTH);\r
2320     viewport.applet.add(statusBar, BorderLayout.SOUTH);\r
2321    // viewport.applet.validate();\r
2322 \r
2323     alignPanel.setSize(viewport.applet.size().width, viewport.applet.size().height\r
2324                        - embeddedMenu.HEIGHT - statusBar.HEIGHT);\r
2325 \r
2326      viewport.applet.add(alignPanel, BorderLayout.CENTER);\r
2327      viewport.applet.validate();\r
2328 \r
2329   }\r
2330 \r
2331 \r
2332 \r
2333   PopupMenu filePopup, editPopup, searchPopup,\r
2334       viewPopup, colourPopup, calculatePopup, helpPopup;\r
2335   MenuItem featureSettings = new MenuItem();\r
2336   CheckboxMenuItem sequenceFeatures = new CheckboxMenuItem();\r
2337   MenuItem annotationColour = new MenuItem();\r
2338   MenuItem invertColSel = new MenuItem();\r
2339   Menu menu1 = new Menu();\r
2340   MenuItem showColumns = new MenuItem();\r
2341   MenuItem showSeqs = new MenuItem();\r
2342   Menu menu2 = new Menu();\r
2343   MenuItem hideColumns = new MenuItem();\r
2344   MenuItem hideSequences = new MenuItem();\r
2345 \r
2346   public void mousePressed(MouseEvent evt)\r
2347   {\r
2348     PopupMenu popup = null;\r
2349     Label source = (Label)evt.getSource();\r
2350     if(source==embeddedFile)\r
2351     {\r
2352       popup = filePopup = genPopupMenu(filePopup, fileMenu);\r
2353     }\r
2354     else if(source==embeddedEdit)\r
2355     {\r
2356       popup = editPopup = genPopupMenu(editPopup, editMenu);\r
2357     }\r
2358     else if(source==embeddedSearch)\r
2359     {\r
2360       popup = searchPopup = genPopupMenu(searchPopup, searchMenu);\r
2361     }\r
2362     else if(source==embeddedView)\r
2363     {\r
2364       popup = viewPopup = genPopupMenu(viewPopup, viewMenu);\r
2365     }\r
2366     else if(source==embeddedColour)\r
2367     {\r
2368       popup = colourPopup = genPopupMenu(colourPopup, colourMenu);\r
2369     }\r
2370     else if(source==embeddedCalculate)\r
2371     {\r
2372       popup = calculatePopup = genPopupMenu(calculatePopup, calculateMenu);\r
2373     }\r
2374     else if(source==embeddedHelp)\r
2375     {\r
2376       popup = helpPopup = genPopupMenu(helpPopup, helpMenu);\r
2377     }\r
2378 \r
2379     embeddedMenu.add(popup);\r
2380     popup.show(embeddedMenu,\r
2381                source.getBounds().x,\r
2382                source.getBounds().y + source.getBounds().getSize().height);\r
2383   }\r
2384 \r
2385   PopupMenu genPopupMenu(PopupMenu popup, Menu original)\r
2386   {\r
2387     if(popup!=null)\r
2388     {\r
2389       return popup;\r
2390     }\r
2391     popup = new PopupMenu();\r
2392     int m, mSize = original.getItemCount();\r
2393     for(m=0; m<mSize; m++)\r
2394     {\r
2395       popup.add(original.getItem(m));\r
2396       mSize--;\r
2397       m--;\r
2398     }\r
2399 \r
2400     return popup;\r
2401   }\r
2402   public void mouseClicked(MouseEvent evt)\r
2403   {}\r
2404   public void mouseReleased(MouseEvent evt)\r
2405   {}\r
2406   public void mouseEntered(MouseEvent evt)\r
2407   {}\r
2408   public void mouseExited(MouseEvent evt)\r
2409   {}\r
2410 \r
2411 }\r
2412 \r