JAL-969 - refactor colourscheme machinery from GUI code to core alignment view model
[jalview.git] / src / jalview / gui / AlignFrame.java
index e19581f..3a0e3f5 100755 (executable)
@@ -718,7 +718,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
     showSeqFeatures.setSelected(av.showSequenceFeatures);
     hiddenMarkers.setState(av.showHiddenMarkers);
-    applyToAllGroups.setState(av.colourAppliesToAllGroups);
+    applyToAllGroups.setState(av.getColourAppliesToAllGroups());
     showNpFeatsMenuitem.setSelected(av.isShowNpFeats());
     showDbRefsMenuitem.setSelected(av.isShowDbRefs());
     autoCalculate.setSelected(av.autoCalculateConsensus);
@@ -856,6 +856,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   {
     if (fileName != null)
     {
+      // TODO: JAL-1108 - ensure all associated frames are closed regardless of
+      // originating file's format
       // TODO: work out how to recover feature settings for correct view(s) when
       // file is reloaded.
       if (currentFileFormat.equals("Jalview"))
@@ -1557,10 +1559,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
   synchronized void slideSequences(boolean right, int size)
   {
-    Vector sg = new Vector();
+    List<SequenceI> sg = new Vector();
     if (viewport.cursorMode)
     {
-      sg.addElement(viewport.getAlignment().getSequenceAt(
+      sg.add(viewport.getAlignment().getSequenceAt(
               alignPanel.seqPanel.seqCanvas.cursorY));
     }
     else if (viewport.getSelectionGroup() != null
@@ -1584,10 +1586,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         invertGroup.add(viewport.getAlignment().getSequenceAt(i));
     }
 
-    SequenceI[] seqs1 = new SequenceI[sg.size()];
-    for (int i = 0; i < sg.size(); i++)
-      seqs1[i] = (SequenceI) sg.elementAt(i);
-
+    SequenceI[] seqs1 = sg.toArray(new SequenceI[0]);
+            
     SequenceI[] seqs2 = new SequenceI[invertGroup.size()];
     for (int i = 0; i < invertGroup.size(); i++)
       seqs2[i] = (SequenceI) invertGroup.elementAt(i);
@@ -2235,12 +2235,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
       addHistoryItem(trimRegion);
 
-      Vector groups = viewport.getAlignment().getGroups();
-
-      for (int i = 0; i < groups.size(); i++)
+      for (SequenceGroup sg :viewport.getAlignment().getGroups())
       {
-        SequenceGroup sg = (SequenceGroup) groups.get(i);
-
         if ((trimLeft && !sg.adjustForRemoveLeft(column))
                 || (!trimLeft && !sg.adjustForRemoveRight(column)))
         {
@@ -2923,8 +2919,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
    */
   public void clustalColour_actionPerformed(ActionEvent e)
   {
-    changeColour(new ClustalxColourScheme(viewport.getAlignment()
-            .getSequences(), viewport.getAlignment().getWidth()));
+    changeColour(new ClustalxColourScheme(viewport.getAlignment(), viewport.getHiddenRepSequences()));
   }
 
   /**
@@ -3102,12 +3097,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
     if (viewport.getColourAppliesToAllGroups())
     {
-      Vector groups = viewport.getAlignment().getGroups();
 
-      for (int i = 0; i < groups.size(); i++)
-      {
-        SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
 
+      for (SequenceGroup sg:viewport.getAlignment().getGroups())
+      {
         if (cs == null)
         {
           sg.cs = null;
@@ -3116,8 +3109,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
         if (cs instanceof ClustalxColourScheme)
         {
-          sg.cs = new ClustalxColourScheme(sg.getSequences(viewport
-                  .getHiddenRepSequences()), sg.getWidth());
+          sg.cs = new ClustalxColourScheme(sg, viewport
+                  .getHiddenRepSequences());
         }
         else if (cs instanceof UserColourScheme)
         {
@@ -3569,13 +3562,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         return;
       }
 
-      int s = 0;
       SequenceGroup sg = viewport.getSelectionGroup();
 
       /* Decide if the selection is a column region */
-      while (s < sg.getSize())
+      for (SequenceI _s:sg.getSequences())
       {
-        if (((SequenceI) sg.getSequences(null).elementAt(s++)).getLength() < sg
+        if (_s.getLength() < sg
                 .getEndRes())
         {
           JOptionPane
@@ -3925,89 +3917,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       }
     }
   }
-  
-  @Override
-  public void loadScores_actionPerformed(ActionEvent e)
-  {
-           // Pick the tree file
-           JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
-           chooser.setFileView(new JalviewFileView());
-           chooser.setDialogTitle("Select a T-Coffee scores ascii file");
-           chooser.setToolTipText("Load a score file");
-
-           int value = chooser.showOpenDialog(null);
-
-           if (value == JalviewFileChooser.APPROVE_OPTION)
-           {
-             String sFilePath = chooser.getSelectedFile().getPath();
-             jalview.bin.Cache.setProperty("LAST_DIRECTORY", sFilePath);
-           
-             
-             try 
-             {
-                 TCoffeeScoreFile result = new TCoffeeScoreFile(sFilePath, FormatAdapter.FILE);
-                 if (!result.isValid()) { 
-                   JOptionPane.showMessageDialog(Desktop.desktop, result.getWarningMessage(),
-                            "Problem reading T-COFFEE score file", JOptionPane.WARNING_MESSAGE);
-                   return;
-                   }
-
-                 /*
-                  * check that the score matrix matches the alignment dimensions
-                  */
-                 AlignmentI aln; 
-                 if( (aln=viewport.getAlignment()) != null && (aln.getHeight() != result.getHeight() || aln.getWidth() != result.getWidth()) ) {
-                     // TODO: raise a dialog box here rather than bomb out.
-               JOptionPane.showMessageDialog(Desktop.desktop, "The scores matrix does not match the alignment dimensions",
-                        "Problem reading T-COFFEE score file", JOptionPane.WARNING_MESSAGE);
-                 }
-                 if (result.annotateAlignment(alignPanel.getAlignment(), true))
-                 {
-                         tcoffeeColour.setEnabled(true);
-                         tcoffeeColour.setSelected(true);
-                         // switch to this color
-                         changeColour(new TCoffeeColourScheme(alignPanel.getAlignment()));
-                 } else {
-                   tcoffeeColour.setEnabled(false);
-                   tcoffeeColour.setSelected(false);
-                 }
-                 if (result.getWarningMessage()!=null)
-                 {
-                   JOptionPane.showMessageDialog(Desktop.desktop, result.getWarningMessage(),"Problem reading T-COFEEE score file", JOptionPane.WARNING_MESSAGE);
-                 }
-             } 
-             catch (Exception ex) {
-               JOptionPane.showMessageDialog(
-                                       Desktop.desktop, 
-                                       ex.getMessage(), 
-                                       "unexpected problem reading T-COFFEE score file", 
-                                       JOptionPane.WARNING_MESSAGE);
-
-               ex.printStackTrace();
-             }
-           }
-
-  } 
 
-  
   @Override
-  protected void tcoffeeColorScheme_actionPerformed(ActionEvent e) {
-         changeColour( new TCoffeeColourScheme(alignPanel.getAlignment()) );
+  protected void tcoffeeColorScheme_actionPerformed(ActionEvent e)
+  {
+    changeColour(new TCoffeeColourScheme(alignPanel.getAlignment()));
   }
-  
-//  /**
-//   * Load the (T-Coffee) score file from the specified url 
-//   * 
-//   * @param url The absolute path from where download and read the score file
-//   * @throws IOException 
-//   */
-//  public void loadScoreFile(URL url ) throws IOException {
-//       
-//       TCoffeeScoreFile result = new TCoffeeScoreFile();
-//       result.parse( new InputStreamReader( url.openStream() ) );
-//       tcoffeeScoreFile = result;
-//  }  
-  
+
   public TreePanel ShowNewickTree(NewickFile nf, String title)
   {
     return ShowNewickTree(nf, title, 600, 500, 4, 5);
@@ -4824,54 +4740,92 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
       if (!isAnnotation)
       {
-        // try to see if its a JNet 'concise' style annotation file *before* we
-        // try to parse it as a features file
-        if (format == null)
+        // first see if its a T-COFFEE score file
+        TCoffeeScoreFile tcf = null;
+        try
         {
-          format = new IdentifyFile().Identify(file, protocol);
-        }
-        if (format.equalsIgnoreCase("JnetFile"))
+          tcf = new TCoffeeScoreFile(file, protocol);
+          if (tcf.isValid())
+          {
+            if (tcf.annotateAlignment(viewport.getAlignment(), true))
+            {
+              tcoffeeColour.setEnabled(true);
+              tcoffeeColour.setSelected(true);
+              changeColour(new TCoffeeColourScheme(viewport.getAlignment()));
+              isAnnotation = true;
+              statusBar
+                      .setText("Successfully pasted T-Coffee scores to alignment.");
+            }
+            else
+            {
+              // some problem - if no warning its probable that the ID matching process didn't work
+              JOptionPane.showMessageDialog(Desktop.desktop,
+                      tcf.getWarningMessage()==null ? "Check that the file matches sequence IDs in the alignment." : tcf.getWarningMessage(),
+                      "Problem reading T-COFFEE score file",
+                      JOptionPane.WARNING_MESSAGE);
+            }
+          }
+          else
+          {
+            tcf = null;
+          }
+        } catch (Exception x)
         {
-          jalview.io.JPredFile predictions = new jalview.io.JPredFile(file,
-                  protocol);
-          new JnetAnnotationMaker().add_annotation(predictions,
-                  viewport.getAlignment(), 0, false);
-          isAnnotation = true;
+          Cache.log.debug("Exception when processing data source as T-COFFEE score file",x);
+          tcf = null;
         }
-        else
+        if (tcf == null)
         {
-          /*
-           * if (format.equalsIgnoreCase("PDB")) {
-           * 
-           * String pdbfn = ""; // try to match up filename with sequence id try
-           * { if (protocol == jalview.io.FormatAdapter.FILE) { File fl = new
-           * File(file); pdbfn = fl.getName(); } else if (protocol ==
-           * jalview.io.FormatAdapter.URL) { URL url = new URL(file); pdbfn =
-           * url.getFile(); } } catch (Exception e) { } ; if (assocSeq == null)
-           * { SequenceIdMatcher idm = new SequenceIdMatcher(viewport
-           * .getAlignment().getSequencesArray()); if (pdbfn.length() > 0) { //
-           * attempt to find a match in the alignment SequenceI mtch =
-           * idm.findIdMatch(pdbfn); int l = 0, c = pdbfn.indexOf("."); while
-           * (mtch == null && c != -1) { while ((c = pdbfn.indexOf(".", l)) > l)
-           * { l = c; } if (l > -1) { pdbfn = pdbfn.substring(0, l); } mtch =
-           * idm.findIdMatch(pdbfn); } if (mtch != null) { // try and associate
-           * // prompt ? PDBEntry pe = new AssociatePdbFileWithSeq()
-           * .associatePdbWithSeq(file, protocol, mtch, true); if (pe != null) {
-           * System.err.println("Associated file : " + file + " with " +
-           * mtch.getDisplayId(true)); alignPanel.paintAlignment(true); } } //
-           * TODO: maybe need to load as normal otherwise return; } }
-           */
+          // try to see if its a JNet 'concise' style annotation file *before*
+          // we
           // try to parse it as a features file
-          boolean isGroupsFile = parseFeaturesFile(file, protocol);
-          // if it wasn't a features file then we just treat it as a general
-          // alignment file to load into the current view.
-          if (!isGroupsFile)
+          if (format == null)
           {
-            new FileLoader().LoadFile(viewport, file, protocol, format);
+            format = new IdentifyFile().Identify(file, protocol);
+          }
+          if (format.equalsIgnoreCase("JnetFile"))
+          {
+            jalview.io.JPredFile predictions = new jalview.io.JPredFile(
+                    file, protocol);
+            new JnetAnnotationMaker().add_annotation(predictions,
+                    viewport.getAlignment(), 0, false);
+            isAnnotation = true;
           }
           else
           {
-            alignPanel.paintAlignment(true);
+            /*
+             * if (format.equalsIgnoreCase("PDB")) {
+             * 
+             * String pdbfn = ""; // try to match up filename with sequence id
+             * try { if (protocol == jalview.io.FormatAdapter.FILE) { File fl =
+             * new File(file); pdbfn = fl.getName(); } else if (protocol ==
+             * jalview.io.FormatAdapter.URL) { URL url = new URL(file); pdbfn =
+             * url.getFile(); } } catch (Exception e) { } ; if (assocSeq ==
+             * null) { SequenceIdMatcher idm = new SequenceIdMatcher(viewport
+             * .getAlignment().getSequencesArray()); if (pdbfn.length() > 0) {
+             * // attempt to find a match in the alignment SequenceI mtch =
+             * idm.findIdMatch(pdbfn); int l = 0, c = pdbfn.indexOf("."); while
+             * (mtch == null && c != -1) { while ((c = pdbfn.indexOf(".", l)) >
+             * l) { l = c; } if (l > -1) { pdbfn = pdbfn.substring(0, l); } mtch
+             * = idm.findIdMatch(pdbfn); } if (mtch != null) { // try and
+             * associate // prompt ? PDBEntry pe = new AssociatePdbFileWithSeq()
+             * .associatePdbWithSeq(file, protocol, mtch, true); if (pe != null)
+             * { System.err.println("Associated file : " + file + " with " +
+             * mtch.getDisplayId(true)); alignPanel.paintAlignment(true); } } //
+             * TODO: maybe need to load as normal otherwise return; } }
+             */
+            // try to parse it as a features file
+            boolean isGroupsFile = parseFeaturesFile(file, protocol);
+            // if it wasn't a features file then we just treat it as a general
+            // alignment file to load into the current view.
+            if (!isGroupsFile)
+            {
+              new FileLoader().LoadFile(viewport, file, protocol, format);
+            }
+            else
+            {
+              alignPanel.paintAlignment(true);
+            }
           }
         }
       }
@@ -5328,9 +5282,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         Color col = new Color((int) (Math.random() * 255),
                 (int) (Math.random() * 255), (int) (Math.random() * 255));
         col = col.brighter();
-        for (Enumeration sq = gps[g].getSequences(null).elements(); sq
-                .hasMoreElements(); viewport.setSequenceColour(
-                (SequenceI) sq.nextElement(), col))
+        for (SequenceI s:gps[g].getSequences())
+          viewport.setSequenceColour(
+                s, col)
           ;
       }
       PaintRefresher.Refresh(this, viewport.getSequenceSetId());