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