+ if (menuItems[i].getName() != null &&\r
+ menuItems[i].getName().equals("USER_DEFINED"))\r
+ {\r
+ colourMenu.remove(menuItems[i]);\r
+ iSize--;\r
+ }\r
+ }\r
+ if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)\r
+ {\r
+ java.util.Enumeration userColours = jalview.gui.UserDefinedColours.\r
+ getUserColourSchemes().keys();\r
+\r
+ while (userColours.hasMoreElements())\r
+ {\r
+ final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(userColours.\r
+ nextElement().toString());\r
+ radioItem.setName("USER_DEFINED");\r
+ radioItem.addMouseListener(new MouseAdapter()\r
+ {\r
+ public void mousePressed(MouseEvent evt)\r
+ {\r
+ if(evt.isControlDown() || SwingUtilities.isRightMouseButton(evt))\r
+ {\r
+ radioItem.removeActionListener(radioItem.getActionListeners()[0]);\r
+\r
+ int option = JOptionPane.showInternalConfirmDialog(jalview.gui.Desktop.desktop,\r
+ "Remove from default list?",\r
+ "Remove user defined colour",\r
+ JOptionPane.YES_NO_OPTION);\r
+ if(option == JOptionPane.YES_OPTION)\r
+ {\r
+ jalview.gui.UserDefinedColours.removeColourFromDefaults(radioItem.getText());\r
+ colourMenu.remove(radioItem);\r
+ }\r
+ else\r
+ radioItem.addActionListener(new ActionListener()\r
+ {\r
+ public void actionPerformed(ActionEvent evt)\r
+ {\r
+ userDefinedColour_actionPerformed(evt);\r
+ }\r
+ });\r
+ }\r
+ }\r
+ });\r
+ radioItem.addActionListener(new ActionListener()\r
+ {\r
+ public void actionPerformed(ActionEvent evt)\r
+ {\r
+ userDefinedColour_actionPerformed(evt);\r
+ }\r
+ });\r
+\r
+ colourMenu.insert(radioItem, 15);\r
+ colours.add(radioItem);\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ public void PIDColour_actionPerformed(ActionEvent e)\r
+ {\r
+ changeColour(new PIDColourScheme());\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ public void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
+ {\r
+ changeColour(new Blosum62ColourScheme());\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)\r
+ {\r
+ addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment,\r
+ HistoryItem.SORT));\r
+ AlignmentSorter.sortByPID(viewport.getAlignment(),\r
+ viewport.getAlignment().getSequenceAt(0));\r
+ alignPanel.repaint();\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ public void sortIDMenuItem_actionPerformed(ActionEvent e)\r
+ {\r
+ addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,\r
+ HistoryItem.SORT));\r
+ AlignmentSorter.sortByID(viewport.getAlignment());\r
+ alignPanel.repaint();\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ public void sortGroupMenuItem_actionPerformed(ActionEvent e)\r
+ {\r
+ addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,\r
+ HistoryItem.SORT));\r
+\r
+ AlignmentSorter.sortByGroup(viewport.getAlignment());\r
+ alignPanel.repaint();\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)\r
+ {\r
+ RedundancyPanel sp = new RedundancyPanel(alignPanel, this);\r
+ JInternalFrame frame = new JInternalFrame();\r
+ frame.setContentPane(sp);\r
+ Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400,\r
+ 100, false);\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)\r
+ {\r
+ if ( (viewport.getSelectionGroup() == null) ||\r
+ (viewport.getSelectionGroup().getSize() < 2))\r
+ {\r
+ JOptionPane.showInternalMessageDialog(this,\r
+ "You must select at least 2 sequences.",\r
+ "Invalid Selection",\r
+ JOptionPane.WARNING_MESSAGE);\r
+ }\r
+ else\r
+ {\r
+ JInternalFrame frame = new JInternalFrame();\r
+ frame.setContentPane(new PairwiseAlignPanel(viewport));\r
+ Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ public void PCAMenuItem_actionPerformed(ActionEvent e)\r
+ {\r
+ if ( ( (viewport.getSelectionGroup() != null) &&\r
+ (viewport.getSelectionGroup().getSize() < 4) &&\r
+ (viewport.getSelectionGroup().getSize() > 0)) ||\r
+ (viewport.getAlignment().getHeight() < 4))\r
+ {\r
+ JOptionPane.showInternalMessageDialog(this,\r
+ "Principal component analysis must take\n" +\r
+ "at least 4 input sequences.",\r
+ "Sequence selection insufficient",\r
+ JOptionPane.WARNING_MESSAGE);\r
+\r
+ return;\r
+ }\r
+\r
+ new PCAPanel(viewport);\r
+ }\r
+\r
+\r
+ public void autoCalculate_actionPerformed(ActionEvent e)\r
+ {\r
+ viewport.autoCalculateConsensus = autoCalculate.isSelected();\r
+ }\r
+\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)\r
+ {\r
+ NewTreePanel("AV", "PID", "Average distance tree using PID");\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)\r
+ {\r
+ NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
+ {\r
+ NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
+ {\r
+ NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param type DOCUMENT ME!\r
+ * @param pwType DOCUMENT ME!\r
+ * @param title DOCUMENT ME!\r
+ */\r
+ void NewTreePanel(String type, String pwType, String title)\r
+ {\r
+ TreePanel tp;\r
+\r
+ if ( (viewport.getSelectionGroup() != null) &&\r
+ (viewport.getSelectionGroup().getSize() > 3))\r
+ {\r
+ int s = 0;\r
+ SequenceGroup sg = viewport.getSelectionGroup();\r
+\r
+ /* Decide if the selection is a column region */\r
+ while (s < sg.sequences.size())\r
+ {\r
+ if ( ( (SequenceI) sg.sequences.elementAt(s++)).getLength() <\r
+ sg.getEndRes())\r
+ {\r
+ JOptionPane.showMessageDialog(Desktop.desktop,\r
+ "The selected region to create a tree may\nonly contain residues or gaps.\n" +\r
+ "Try using the Pad function in the edit menu,\n" +\r
+ "or one of the multiple sequence alignment web services.",\r
+ "Sequences in selection are not aligned",\r
+ JOptionPane.WARNING_MESSAGE);\r
+\r
+ return;\r
+ }\r
+ }\r
+\r
+ title = title + " on region";\r
+ tp = new TreePanel(viewport,\r
+ viewport.getSelectionGroup().sequences, type, pwType,\r
+ sg.getStartRes(), sg.getEndRes());\r
+ }\r
+ else\r
+ {\r
+ //are the sequences aligned?\r
+ if (!viewport.alignment.isAligned())\r
+ {\r
+ JOptionPane.showMessageDialog(Desktop.desktop,\r
+ "The sequences must be aligned before creating a tree.\n" +\r
+ "Try using the Pad function in the edit menu,\n" +\r
+ "or one of the multiple sequence alignment web services.",\r
+ "Sequences not aligned",\r
+ JOptionPane.WARNING_MESSAGE);\r
+\r
+ return;\r
+ }\r
+\r
+ tp = new TreePanel(viewport,\r
+ viewport.getAlignment().getSequences(), type, pwType,\r
+ 0,\r
+ viewport.alignment.getWidth());\r