JAL-1114 - refactor methods handling Vectors and Hashtables to Lists and Maps, and...
[jalview.git] / src / jalview / appletgui / AlignFrame.java
index 276fbda..6ce68c3 100644 (file)
@@ -87,6 +87,7 @@ import java.net.URL;
 import java.net.URLEncoder;\r
 import java.util.Enumeration;\r
 import java.util.Hashtable;\r
+import java.util.List;\r
 import java.util.StringTokenizer;\r
 import java.util.Vector;\r
 \r
@@ -236,9 +237,9 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemLis
    * @param type is protocol for accessing data referred to by file\r
    */\r
 \r
-  public void parseFeaturesFile(String file, String type)\r
+  public boolean parseFeaturesFile(String file, String type)\r
   {\r
-    parseFeaturesFile(file, type, true);\r
+    return parseFeaturesFile(file, type, true);\r
   }\r
   \r
   /**\r
@@ -247,9 +248,12 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemLis
    * @param file file URL, content, or other resolvable path\r
    * @param type is protocol for accessing data referred to by file\r
    * @param autoenabledisplay when true, display features flag will be automatically enabled if features are loaded\r
+   * @return true if data parsed as a features file\r
    */\r
-  public void parseFeaturesFile(String file, String type, boolean autoenabledisplay)\r
+  public boolean parseFeaturesFile(String file, String type, boolean autoenabledisplay)\r
   {    \r
+    // TODO: test if importing a features file onto an alignment which already has features with links overwrites the original links.\r
+    \r
     Hashtable featureLinks = new Hashtable();\r
     boolean featuresFile = false;\r
     try\r
@@ -279,8 +283,9 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemLis
         viewport.featureSettings.refreshTable();\r
       }\r
       alignPanel.paintAlignment(true);\r
+      statusBar.setText("Successfully added features to alignment.");\r
     }\r
-\r
+    return featuresFile;\r
   }\r
 \r
   public void keyPressed(KeyEvent evt)\r
@@ -753,9 +758,6 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemLis
     {\r
       loadAnnotations();\r
     }\r
-    else if( source == loadScores ) {\r
-       loadScores();\r
-    }\r
     else if (source == outputAnnotations)\r
     {\r
       outputAnnotations(true);\r
@@ -955,9 +957,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemLis
     else if (source == clustalColour)\r
     {\r
       abovePIDThreshold.setState(false);\r
-      changeColour(new ClustalxColourScheme(\r
-              viewport.getAlignment().getSequences(),\r
-              viewport.getAlignment().getWidth()));\r
+      changeColour(new ClustalxColourScheme(viewport.getAlignment(),null));\r
     }\r
     else if (source == zappoColour)\r
     {\r
@@ -1104,7 +1104,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemLis
   public void loadAnnotations()\r
   {\r
     CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);\r
-    cap.setText("Paste your features / annotations file here.");\r
+    cap.setText("Paste your features / annotations / T-coffee score file here.");\r
     cap.setAnnotationImport();\r
     Frame frame = new Frame();\r
     frame.add(cap);\r
@@ -1112,11 +1112,6 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemLis
 \r
   }\r
   \r
-  public void loadScores() {\r
-         //TODO\r
-         \r
-  }\r
-\r
   public String outputAnnotations(boolean displayTextbox)\r
   {\r
     String annotation = new AnnotationFile().printAnnotations(\r
@@ -1290,8 +1285,13 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemLis
   public void closeMenuItem_actionPerformed()\r
   {\r
     PaintRefresher.RemoveComponent(alignPanel);\r
-    PaintRefresher.RemoveComponent(alignPanel.seqPanel.seqCanvas);\r
-    PaintRefresher.RemoveComponent(alignPanel.idPanel.idCanvas);\r
+    if (alignPanel.seqPanel!=null && alignPanel.seqPanel.seqCanvas!=null)\r
+    {\r
+      PaintRefresher.RemoveComponent(alignPanel.seqPanel.seqCanvas);\r
+    }\r
+    if (alignPanel.idPanel!=null && alignPanel.idPanel.idCanvas!=null) {\r
+      PaintRefresher.RemoveComponent(alignPanel.idPanel.idCanvas);\r
+    }\r
 \r
     if (PaintRefresher.components.size() == 0 && viewport.applet == null)\r
     {\r
@@ -1304,7 +1304,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemLis
   }\r
 \r
   /**\r
-   * DOCUMENT ME!\r
+   * TODO: JAL-1104\r
    */\r
   void updateEditMenuBar()\r
   {\r
@@ -1335,6 +1335,9 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemLis
     }\r
   }\r
 \r
+  /**\r
+   * TODO: JAL-1104\r
+   */\r
   public void addHistoryItem(CommandI command)\r
   {\r
     if (command.getSize() > 0)\r
@@ -1347,6 +1350,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemLis
   }\r
 \r
   /**\r
+   * TODO: JAL-1104\r
    * DOCUMENT ME!\r
    * \r
    * @param e\r
@@ -1375,6 +1379,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemLis
   }\r
 \r
   /**\r
+   * TODO: JAL-1104\r
    * DOCUMENT ME!\r
    * \r
    * @param e\r
@@ -1498,10 +1503,10 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemLis
 \r
   synchronized void slideSequences(boolean right, int size)\r
   {\r
-    Vector sg = new Vector();\r
+    List<SequenceI>sg = new Vector<SequenceI>();\r
     if (viewport.cursorMode)\r
     {\r
-      sg.addElement(viewport.getAlignment()\r
+      sg.add(viewport.getAlignment()\r
               .getSequenceAt(alignPanel.seqPanel.seqCanvas.cursorY));\r
     }\r
     else if (viewport.getSelectionGroup() != null\r
@@ -1517,7 +1522,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemLis
       return;\r
     }\r
 \r
-    Vector invertGroup = new Vector();\r
+    Vector<SequenceI> invertGroup = new Vector();\r
 \r
     for (int i = 0; i < viewport.getAlignment().getHeight(); i++)\r
     {\r
@@ -1525,11 +1530,9 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemLis
         invertGroup.addElement(viewport.getAlignment().getSequenceAt(i));\r
     }\r
 \r
-    SequenceI[] seqs1 = new SequenceI[sg.size()];\r
-    for (int i = 0; i < sg.size(); i++)\r
-      seqs1[i] = (SequenceI) sg.elementAt(i);\r
+    SequenceI[] seqs1 = sg.toArray(new SequenceI[sg.size()]);\r
 \r
-    SequenceI[] seqs2 = new SequenceI[invertGroup.size()];\r
+    SequenceI[] seqs2 = invertGroup.toArray(new SequenceI[invertGroup.size()]);\r
     for (int i = 0; i < invertGroup.size(); i++)\r
       seqs2[i] = (SequenceI) invertGroup.elementAt(i);\r
 \r
@@ -1892,9 +1895,9 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemLis
         Color col = new Color((int) (Math.random() * 255),\r
                 (int) (Math.random() * 255), (int) (Math.random() * 255));\r
         col = col.brighter();\r
-        for (Enumeration sq = gps[g].getSequences(null).elements(); sq\r
-                .hasMoreElements(); viewport.setSequenceColour(\r
-                (SequenceI) sq.nextElement(), col))\r
+        for (SequenceI sq : gps[g].getSequences(null))\r
+          viewport.setSequenceColour(\r
+                sq, col)\r
           ;\r
       }\r
       PaintRefresher.Refresh(this, viewport.getSequenceSetId());\r
@@ -2011,12 +2014,10 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemLis
 \r
       addHistoryItem(trimRegion);\r
 \r
-      Vector groups = viewport.getAlignment().getGroups();\r
 \r
-      for (int i = 0; i < groups.size(); i++)\r
-      {\r
-        SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
 \r
+      for (SequenceGroup sg:viewport.getAlignment().getGroups())\r
+      {\r
         if ((trimLeft && !sg.adjustForRemoveLeft(column))\r
                 || (!trimLeft && !sg.adjustForRemoveRight(column)))\r
         {\r
@@ -2283,11 +2284,14 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemLis
             overview.getPreferredSize().height + 50);\r
 \r
     frame.pack();\r
+    final AlignmentPanel ap=alignPanel;\r
     frame.addWindowListener(new WindowAdapter()\r
     {\r
       public void windowClosing(WindowEvent e)\r
       {\r
-        alignPanel.setOverviewPanel(null);\r
+        if (ap!=null) {\r
+          ap.setOverviewPanel(null);\r
+        }\r
       };\r
     });\r
 \r
@@ -2790,8 +2794,6 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemLis
 \r
   MenuItem loadAnnotations = new MenuItem("Load Features/Annotations ...");\r
   \r
-  MenuItem loadScores = new MenuItem("Load Associated T-Coffee scores ...");\r
-\r
   MenuItem outputFeatures = new MenuItem("Export Features ...");\r
 \r
   MenuItem outputAnnotations = new MenuItem("Export Annotations ...");\r
@@ -2998,7 +3000,6 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemLis
 \r
     loadTree.addActionListener(this);\r
     loadAnnotations.addActionListener(this);\r
-    loadScores.addActionListener(this);\r
     outputFeatures.addActionListener(this);\r
     outputAnnotations.addActionListener(this);\r
     selectAllSequenceMenuItem.addActionListener(this);\r
@@ -3216,7 +3217,6 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemLis
     fileMenu.add(inputText);\r
     fileMenu.add(loadTree);\r
     fileMenu.add(loadAnnotations);\r
-    fileMenu.add(loadScores);\r
     \r
     fileMenu.addSeparator();\r
     fileMenu.add(outputTextboxMenu);\r
@@ -3713,16 +3713,18 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemLis
   /**\r
    * Load the (T-Coffee) score file from the specified url \r
    * \r
-   * @param url The absolute path from where download and read the score file\r
+   * @param source File/URL/T-COFFEE score file contents\r
    * @throws IOException \r
+   * @return true if alignment was annotated with data from source\r
    */\r
-  public void loadScoreFile( URL url ) throws IOException {\r
-         // TODO: refactor to string/standard jalview data importer\r
-         TCoffeeScoreFile file = TCoffeeScoreFile.load( new InputStreamReader( url.openStream() ) );\r
-         if( file == null ) {\r
-        // TODO: raise a dialog box here rather than bomb out.\r
-            \r
-                 throw new RuntimeException("The file provided does not match the T-Coffee scores file format");\r
+  public boolean loadScoreFile( String source ) throws IOException {\r
+\r
+    TCoffeeScoreFile file = new TCoffeeScoreFile(source, AppletFormatAdapter.checkProtocol(source));\r
+         if( !file.isValid()) {\r
+           // TODO: raise dialog for gui\r
+           System.err.println("Problems parsing T-Coffee scores: "+file.getWarningMessage());\r
+           System.err.println("Origin was:\n"+source);\r
+           return false;\r
          }\r
          \r
          /*\r
@@ -3731,17 +3733,25 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemLis
          AlignmentI aln; \r
          if( (aln=viewport.getAlignment()) != null && (aln.getHeight() != file.getHeight() || aln.getWidth() != file.getWidth()) ) {\r
            // TODO: raise a dialog box here rather than bomb out.\r
-           throw new RuntimeException("The scores matrix does not match the alignment dimensions");\r
+           System.err.println("The scores matrix does not match the alignment dimensions");\r
                  \r
          }\r
          \r
           // TODO add parameter to indicate if matching should be done\r
          if (file.annotateAlignment(alignPanel.getAlignment(), false))\r
          {\r
-                 tcoffeeColour.setEnabled(true);\r
+           alignPanel.fontChanged();\r
+           tcoffeeColour.setEnabled(true);\r
                  // switch to this color\r
                  changeColour(new TCoffeeColourScheme(alignPanel.getAlignment()));\r
+                 return true;\r
+          } else {\r
+            System.err.println("Problems resolving T-Coffee scores:");\r
+            if (file.getWarningMessage()!=null) {\r
+              System.err.println(file.getWarningMessage());\r
+            }\r
           }\r
+         return false;\r
   }\r
   \r
   \r